@koda-sl/baker-cli 0.477.0 → 0.479.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -22
- package/dist/account-7LUQWY6Q.js +49 -0
- package/dist/account-VH2AATWI.js +79 -0
- package/dist/account-Z65CPOWE.js +80 -0
- package/dist/account-reads-GYI2SS6T.js +218 -0
- package/dist/account-writes-4N2MA2ZR.js +66 -0
- package/dist/accounts-E4TVYTUR.js +115 -0
- package/dist/accounts-SMB3TNXX.js +114 -0
- package/dist/accounts-SPLE7URQ.js +611 -0
- package/dist/accounts-UA2ZWRN4.js +75 -0
- package/dist/accounts-XG472YLB.js +77 -0
- package/dist/actions-KQTXBNJU.js +55 -0
- package/dist/active-entities-MCL7UEGV.js +103 -0
- package/dist/activecampaign-42JXANUA.js +935 -0
- package/dist/activities-IQPJPP4B.js +74 -0
- package/dist/ad-group-writes-EUTMPBMK.js +170 -0
- package/dist/ad-groups-OVPAI5RM.js +68 -0
- package/dist/ad-writes-DACTYFEO.js +174 -0
- package/dist/add-5IGUQHVZ.js +105 -0
- package/dist/add-BK5AQI5A.js +97 -0
- package/dist/add-C3FQ5D62.js +104 -0
- package/dist/add-KTEJCE4L.js +302 -0
- package/dist/add-accounts-CJSV5NPL.js +91 -0
- package/dist/ads-HXX2IAFF.js +113 -0
- package/dist/ads-L65JIKCD.js +77 -0
- package/dist/ads-RAUM6ISF.js +128 -0
- package/dist/ads-WPI3AMSR.js +40 -0
- package/dist/adsets-LPN6WFGF.js +176 -0
- package/dist/advertisers-36HP3AOE.js +120 -0
- package/dist/advertisers-DS2NRWKI.js +125 -0
- package/dist/analytics-I4LZCRG2.js +433 -0
- package/dist/analytics-IFNBT7IM.js +1976 -0
- package/dist/animate-3LV3LHXQ.js +480 -0
- package/dist/assign-WBLSZNCO.js +77 -0
- package/dist/audience-size-LOX5BNXI.js +73 -0
- package/dist/audience-size-LOX5BNXI.js.map +1 -0
- package/dist/audiences-3LRCLHTQ.js +85 -0
- package/dist/audiences-RPLVMO4H.js +268 -0
- package/dist/audiences-XEZHACKH.js +78 -0
- package/dist/audit-6AG6BPXQ.js +151 -0
- package/dist/audit-YEGQU474.js +88 -0
- package/dist/autocomplete-2QRU7ARD.js +111 -0
- package/dist/avatars-EIETXCF3.js +38 -0
- package/dist/bid-pricing-5LZFHQTS.js +100 -0
- package/dist/bid-pricing-5LZFHQTS.js.map +1 -0
- package/dist/brand-CINQG3JG.js +22 -0
- package/dist/brief-WAQ2V6Q4.js +538 -0
- package/dist/brief-WAQ2V6Q4.js.map +1 -0
- package/dist/businesses-PRRYPR7H.js +53 -0
- package/dist/campaign-groups-5CMTEJZZ.js +95 -0
- package/dist/campaign-writes-4RMPHQCT.js +165 -0
- package/dist/campaign-writes-U5LTDTYK.js +170 -0
- package/dist/campaigns-4SOLY7OR.js +110 -0
- package/dist/campaigns-NFRLFNXI.js +107 -0
- package/dist/campaigns-PC7UAVXR.js +109 -0
- package/dist/campaigns-TFEQTSO3.js +76 -0
- package/dist/canvas-BPACZHNU.js +46 -0
- package/dist/capabilities-FNVTPCDT.js +144 -0
- package/dist/cards-WHMCSRZX.js +85 -0
- package/dist/catalog-RMMECI4Z.js +65 -0
- package/dist/catalog-RMMECI4Z.js.map +1 -0
- package/dist/catalogs-A7XMEEEP.js +128 -0
- package/dist/changes-J67WATHX.js +135 -0
- package/dist/chatgpt-4PEWDJKP.js +47 -0
- package/dist/chats-S5FCV7YO.js +262 -0
- package/dist/check-GCZ2ZBKH.js +104 -0
- package/dist/check-GCZ2ZBKH.js.map +1 -0
- package/dist/chunk-232YUPUI.js +125 -0
- package/dist/chunk-23H4ZJRP.js +136 -0
- package/dist/chunk-2DHHL4PU.js +156 -0
- package/dist/chunk-2DHHL4PU.js.map +1 -0
- package/dist/chunk-2FSEESJU.js +1744 -0
- package/dist/chunk-2FSEESJU.js.map +1 -0
- package/dist/chunk-3OCSWUHV.js +67 -0
- package/dist/chunk-3S5YZWB7.js +601 -0
- package/dist/chunk-3S5YZWB7.js.map +1 -0
- package/dist/chunk-3UXMQ3K2.js +274 -0
- package/dist/chunk-5NS4CNF6.js +1518 -0
- package/dist/chunk-5NS4CNF6.js.map +1 -0
- package/dist/chunk-5WMTPYKT.js +84 -0
- package/dist/chunk-65N4ZPQD.js +26 -0
- package/dist/chunk-65PUXMWE.js +167 -0
- package/dist/chunk-65PUXMWE.js.map +1 -0
- package/dist/chunk-6JWEGFM5.js +174 -0
- package/dist/chunk-6KK26F2T.js +46 -0
- package/dist/chunk-6KK26F2T.js.map +1 -0
- package/dist/chunk-7HJR5M4R.js +8843 -0
- package/dist/chunk-7HJR5M4R.js.map +1 -0
- package/dist/chunk-7LU7KARN.js +64 -0
- package/dist/chunk-7LU7KARN.js.map +1 -0
- package/dist/chunk-7RBJ2Z7Z.js +172 -0
- package/dist/chunk-7U3V64YT.js +344 -0
- package/dist/chunk-7U3V64YT.js.map +1 -0
- package/dist/chunk-ABXTGAG7.js +23 -0
- package/dist/chunk-ADSNY4KZ.js +399 -0
- package/dist/chunk-AHF6TQWB.js +392 -0
- package/dist/chunk-AIJBZSZV.js +224 -0
- package/dist/chunk-AIJBZSZV.js.map +1 -0
- package/dist/chunk-AQ5WISEG.js +98 -0
- package/dist/chunk-AS5VL32C.js +131 -0
- package/dist/chunk-AS5VL32C.js.map +1 -0
- package/dist/chunk-BFRIRZRZ.js +98 -0
- package/dist/chunk-BFZS3WHS.js +84 -0
- package/dist/chunk-BITS62MF.js +77 -0
- package/dist/chunk-BLAHHMPF.js +333 -0
- package/dist/chunk-BSEB55E6.js +148 -0
- package/dist/chunk-BSEB55E6.js.map +1 -0
- package/dist/chunk-C3TTE7GS.js +66 -0
- package/dist/chunk-C3TTE7GS.js.map +1 -0
- package/dist/chunk-CCIDHU6M.js +169 -0
- package/dist/chunk-CM6FCSWN.js +644 -0
- package/dist/chunk-CVBKW75S.js +296 -0
- package/dist/chunk-CXQRTLSQ.js +159 -0
- package/dist/chunk-D4I3KULJ.js +5367 -0
- package/dist/chunk-D4I3KULJ.js.map +1 -0
- package/dist/chunk-D4LKZJYJ.js +76 -0
- package/dist/chunk-D7KR6KXR.js +66 -0
- package/dist/chunk-DCTEL4KG.js +592 -0
- package/dist/chunk-DF22CTXE.js +225 -0
- package/dist/chunk-DF22CTXE.js.map +1 -0
- package/dist/chunk-DH5CKOYK.js +103 -0
- package/dist/chunk-DMVDVZJK.js +97 -0
- package/dist/chunk-DMVDVZJK.js.map +1 -0
- package/dist/chunk-DQC4NIJE.js +51 -0
- package/dist/chunk-DWX44QL6.js +75 -0
- package/dist/chunk-EE72SSB2.js +472 -0
- package/dist/chunk-FNA277HP.js +97 -0
- package/dist/chunk-FRK7SSEH.js +6306 -0
- package/dist/chunk-FRK7SSEH.js.map +1 -0
- package/dist/chunk-FU7HJWGM.js +26 -0
- package/dist/chunk-GDLQ6SGW.js +46 -0
- package/dist/chunk-GEKXIXMG.js +106 -0
- package/dist/chunk-GLW7UJLB.js +58 -0
- package/dist/chunk-GMSKPGLI.js +3846 -0
- package/dist/chunk-GMSKPGLI.js.map +1 -0
- package/dist/chunk-H5HDZ7IC.js +139 -0
- package/dist/chunk-HJQ7N7FC.js +8661 -0
- package/dist/chunk-HJQ7N7FC.js.map +1 -0
- package/dist/chunk-I5VZVQBZ.js +35 -0
- package/dist/chunk-IC6SDOED.js +45 -0
- package/dist/chunk-IDN4FOOP.js +97 -0
- package/dist/chunk-IDN4FOOP.js.map +1 -0
- package/dist/chunk-IG627WWY.js +23992 -0
- package/dist/chunk-IN4G7X6W.js +94 -0
- package/dist/chunk-IPLE5K5E.js +188 -0
- package/dist/chunk-IWWOGBGA.js +665 -0
- package/dist/chunk-JD4SABZC.js +942 -0
- package/dist/chunk-JD4SABZC.js.map +1 -0
- package/dist/chunk-JFA4R3KS.js +172 -0
- package/dist/chunk-JYBLCIRN.js +106 -0
- package/dist/chunk-K3TNTBZJ.js +52 -0
- package/dist/chunk-KCKC637S.js +122 -0
- package/dist/chunk-KCKC637S.js.map +1 -0
- package/dist/chunk-KPYDTIAI.js +317 -0
- package/dist/chunk-KPYDTIAI.js.map +1 -0
- package/dist/chunk-LCW3U4EA.js +25 -0
- package/dist/chunk-LD4CHA7U.js +89 -0
- package/dist/chunk-LD4CHA7U.js.map +1 -0
- package/dist/chunk-LS3A753J.js +225 -0
- package/dist/chunk-LS3A753J.js.map +1 -0
- package/dist/chunk-MI3JB5KB.js +76 -0
- package/dist/chunk-MIOOPOG2.js +547 -0
- package/dist/chunk-MJQBXFW6.js +74 -0
- package/dist/chunk-MMVLRUMK.js +612 -0
- package/dist/chunk-MMVLRUMK.js.map +1 -0
- package/dist/chunk-MPACDBH5.js +74 -0
- package/dist/chunk-MXWOYFI2.js +544 -0
- package/dist/chunk-N5O67GK5.js +215 -0
- package/dist/chunk-NCP6RD6A.js +433 -0
- package/dist/chunk-NNF4RARY.js +297 -0
- package/dist/chunk-NR2OVOTD.js +363 -0
- package/dist/chunk-NVGXYF6K.js +846 -0
- package/dist/chunk-OP7DNHD2.js +137 -0
- package/dist/chunk-ORQKMXHA.js +76 -0
- package/dist/chunk-P3TNRS56.js +149 -0
- package/dist/chunk-PQTY22FR.js +159 -0
- package/dist/chunk-PQTY22FR.js.map +1 -0
- package/dist/chunk-Q7YZL7PG.js +494 -0
- package/dist/chunk-QABSQADZ.js +56 -0
- package/dist/chunk-QVNSVFSD.js +91 -0
- package/dist/chunk-QVNSVFSD.js.map +1 -0
- package/dist/chunk-QVQKCVP7.js +85 -0
- package/dist/chunk-QVQKCVP7.js.map +1 -0
- package/dist/chunk-R2TAVQGZ.js +455 -0
- package/dist/chunk-R5WNYLG4.js +197 -0
- package/dist/chunk-RCSOG2DV.js +142 -0
- package/dist/chunk-RCSOG2DV.js.map +1 -0
- package/dist/chunk-RD2XXQW3.js +1599 -0
- package/dist/chunk-RLS5OPPZ.js +207 -0
- package/dist/chunk-RLS5OPPZ.js.map +1 -0
- package/dist/chunk-RMLJNHCU.js +346 -0
- package/dist/chunk-RTWRNG3E.js +821 -0
- package/dist/chunk-RTWRNG3E.js.map +1 -0
- package/dist/chunk-S7A34DOA.js +111 -0
- package/dist/chunk-SFJW2KED.js +166 -0
- package/dist/chunk-SOKVXKRM.js +74 -0
- package/dist/chunk-STNCMKL6.js +191 -0
- package/dist/chunk-SWL4AAPP.js +320 -0
- package/dist/chunk-T6ATGN7Y.js +3187 -0
- package/dist/chunk-T6ATGN7Y.js.map +1 -0
- package/dist/chunk-TF4PGUO5.js +191 -0
- package/dist/chunk-TF4PGUO5.js.map +1 -0
- package/dist/chunk-TNOJ6O6B.js +61 -0
- package/dist/chunk-TNOJ6O6B.js.map +1 -0
- package/dist/chunk-U2452GLO.js +1914 -0
- package/dist/chunk-U2452GLO.js.map +1 -0
- package/dist/chunk-ULPO72IQ.js +225 -0
- package/dist/chunk-UMZIQIWN.js +1079 -0
- package/dist/chunk-V7N666PJ.js +19 -0
- package/dist/chunk-WL6FWK2Q.js +249 -0
- package/dist/chunk-WL6FWK2Q.js.map +1 -0
- package/dist/chunk-WNJ5SYAG.js +275 -0
- package/dist/chunk-WNSE7N75.js +2123 -0
- package/dist/chunk-XDZVBX6L.js +220 -0
- package/dist/chunk-XGOEX2VJ.js +55 -0
- package/dist/chunk-XUB2EK65.js +57 -0
- package/dist/chunk-XUR4QWCS.js +206 -0
- package/dist/chunk-XZ4YMCZK.js +66 -0
- package/dist/chunk-Y3VRMFGF.js +42 -0
- package/dist/chunk-YD7BQDJ6.js +903 -0
- package/dist/chunk-ZBV5IV5T.js +843 -0
- package/dist/chunk-ZBV5IV5T.js.map +1 -0
- package/dist/claim-6MPQD43X.js +197 -0
- package/dist/cli.js +41 -41
- package/dist/client-WL2FKW4T.js +19 -0
- package/dist/code-NXN7QYKU.js +76 -0
- package/dist/companies-KRF2K4CA.js +195 -0
- package/dist/complete-V433ON5C.js +81 -0
- package/dist/config-VOF57KBL.js +88 -0
- package/dist/connect-QVIAM3GX.js +42 -0
- package/dist/content-KA25YYO3.js +85 -0
- package/dist/conversation-VZKBZZGG.js +93 -0
- package/dist/conversion-report-REOHVLCI.js +125 -0
- package/dist/conversion-upload-command-ASHA6T6H.js +438 -0
- package/dist/conversion-writes-JU7Q2MUO.js +120 -0
- package/dist/conversions-3ISBR3TS.js +76 -0
- package/dist/conversions-ZLC6YTJ5.js +135 -0
- package/dist/countries-XGMZWUGP.js +82 -0
- package/dist/create-B3QMYSIX.js +132 -0
- package/dist/create-IFCCMKFT.js +207 -0
- package/dist/create-R5P6JU5A.js +235 -0
- package/dist/create-SF6DOGDJ.js +59 -0
- package/dist/creatives-KD7MOCR3.js +182 -0
- package/dist/creatives-YJ3CXZQC.js +87 -0
- package/dist/creatives-YOMFW2UP.js +58 -0
- package/dist/creatives-YOMFW2UP.js.map +1 -0
- package/dist/credentials-2KJUKBMF.js +287 -0
- package/dist/critique-A2OEMGZS.js +227 -0
- package/dist/critique-A2OEMGZS.js.map +1 -0
- package/dist/critique-JVKJEBAC.js +1451 -0
- package/dist/critique-JVKJEBAC.js.map +1 -0
- package/dist/crm-GX72E2LT.js +224 -0
- package/dist/crm-ZYDNEME5.js +318 -0
- package/dist/crop-7UTYG7GS.js +113 -0
- package/dist/currency-CGDI2NXI.js +88 -0
- package/dist/custom-conversions-YRYE65PU.js +125 -0
- package/dist/customers-P4N4NXLJ.js +56 -0
- package/dist/decide-TWKH5QQU.js +199 -0
- package/dist/delete-2GIIUPA3.js +69 -0
- package/dist/delete-AK5IV44E.js +66 -0
- package/dist/delete-GLLYPNNB.js +71 -0
- package/dist/delete-J7DXPGKD.js +71 -0
- package/dist/delete-RS7RQDUX.js +54 -0
- package/dist/delete-S4VKH7IS.js +64 -0
- package/dist/demographics-IKWN2H3V.js +138 -0
- package/dist/describe-5QCPRSIG.js +97 -0
- package/dist/describe-L3UC6MIL.js +97 -0
- package/dist/dimensions-POH4JXEM.js +101 -0
- package/dist/discard-H6DOHJRG.js +66 -0
- package/dist/discover-L4TPEKGY.js +172 -0
- package/dist/discover-XAJKZCMM.js +93 -0
- package/dist/domain-US4KKAXC.js +98 -0
- package/dist/download-N4J5WFHD.js +299 -0
- package/dist/draft-BIQ3ZAYW.js +306 -0
- package/dist/draft-EWDOIXSH.js +233 -0
- package/dist/draft-IL37WDST.js +103 -0
- package/dist/draft-IZ4YLQRD.js +307 -0
- package/dist/draft-KDMYGLWN.js +100 -0
- package/dist/draft-OLFQZBWL.js +217 -0
- package/dist/draft-R32RFDCI.js +328 -0
- package/dist/draft-Y2QJE2NM.js +281 -0
- package/dist/engine/index.d.ts +31 -1
- package/dist/engine/index.js +15 -14
- package/dist/env-5MUVYE2L.js +51 -0
- package/dist/experiment-G3FQVAJU.js +1397 -0
- package/dist/export-OLDI32HM.js +168 -0
- package/dist/extract-PPS6ONQN.js +113 -0
- package/dist/facets-JBZQHN3D.js +114 -0
- package/dist/favorites-4ELADD3R.js +178 -0
- package/dist/feed-XIY5TVDL.js +177 -0
- package/dist/feedback-CCU6ECMQ.js +106 -0
- package/dist/feedback-CCU6ECMQ.js.map +1 -0
- package/dist/feedback-record-JCE3JWG6.js +260 -0
- package/dist/feedback-record-JCE3JWG6.js.map +1 -0
- package/dist/fetch-GOY6DQRL.js +176 -0
- package/dist/fetch-YWUVDMUH.js +139 -0
- package/dist/find-EVY4XEIQ.js +134 -0
- package/dist/fit-TVQ7RK52.js +62 -0
- package/dist/flows-274YPU6I.js +247 -0
- package/dist/follow-ZTPZKIMZ.js +94 -0
- package/dist/follow-competitors-6QDVQ4VJ.js +112 -0
- package/dist/following-PBZLZFGQ.js +113 -0
- package/dist/fonts-BMUNDGOZ.js +36 -0
- package/dist/forecast-F2CZSIMP.js +168 -0
- package/dist/forecast-W5F2MNOV.js +118 -0
- package/dist/forecast-W5F2MNOV.js.map +1 -0
- package/dist/funding-ULBMKUMW.js +85 -0
- package/dist/funnel-LEUXICXU.js +394 -0
- package/dist/ga4-2BL5YAYN.js +55 -0
- package/dist/generate-4HWNFAH3.js +263 -0
- package/dist/get-6RZU4M6W.js +63 -0
- package/dist/get-7GCEJ6KG.js +92 -0
- package/dist/get-MGDY5JYZ.js +79 -0
- package/dist/get-MZWUMHEF.js +61 -0
- package/dist/get-OAZZHUZP.js +59 -0
- package/dist/get-OHU2N7B7.js +63 -0
- package/dist/get-TY6AMFI4.js +56 -0
- package/dist/gif-NYZYV5RY.js +102 -0
- package/dist/gif-NYZYV5RY.js.map +1 -0
- package/dist/google-7STODZQR.js +136 -0
- package/dist/google-ZTTE34A4.js +3190 -0
- package/dist/google-ads-5ARKO757.js +195 -0
- package/dist/group-D5WXNFCP.js +43 -0
- package/dist/group-Y5PLETFT.js +43 -0
- package/dist/gsc-UU3T2C6B.js +30 -0
- package/dist/history-IQ33J5PB.js +67 -0
- package/dist/history-SU7VQCDJ.js +133 -0
- package/dist/hubspot-TJED44GO.js +779 -0
- package/dist/icon-GB7UH5RF.js +137 -0
- package/dist/ideas-UTSCGCT6.js +40 -0
- package/dist/images-ZMZ4WLYH.js +92 -0
- package/dist/images-ZMZ4WLYH.js.map +1 -0
- package/dist/improve-U5USRH4G.js +86 -0
- package/dist/ingest-DGDNZWEM.js +23 -0
- package/dist/ingest-SGBJ3NXX.js +107 -0
- package/dist/insights-4HT2NAYP.js +423 -0
- package/dist/insights-SQLE5NOJ.js +122 -0
- package/dist/inspect-BMQTTKMW.js +189 -0
- package/dist/inspiration-XQYHBJY2.js +53 -0
- package/dist/intent-LM36WK45.js +95 -0
- package/dist/job-CGQHEANB.js +202 -0
- package/dist/job-create-SZYJT2NC.js +109 -0
- package/dist/job-status-6LAKLCKH.js +74 -0
- package/dist/keep-3MJSHWU3.js +78 -0
- package/dist/keyword-gap-P652ODHN.js +130 -0
- package/dist/keyword-metrics-MQLGGJBT.js +197 -0
- package/dist/keywords-for-site-JL6H2YGU.js +128 -0
- package/dist/landing-AJO2BPC2.js +28 -0
- package/dist/landings-ZLKUP66P.js +151 -0
- package/dist/languages-3IJVDS5Z.js +55 -0
- package/dist/languages-HL42MI7H.js +40 -0
- package/dist/launches-RG2SWEXM.js +19 -0
- package/dist/layerize-SJYK6HPD.js +190 -0
- package/dist/leads-2XOSAYP4.js +293 -0
- package/dist/leads-H6JIWVI6.js +90 -0
- package/dist/learn-NJOV2DHD.js +204 -0
- package/dist/learn-NJOV2DHD.js.map +1 -0
- package/dist/library-Q4OU7VR7.js +109 -0
- package/dist/lighthouse-FALRSVQH.js +75 -0
- package/dist/line-item-writes-V7AKAHFC.js +208 -0
- package/dist/line-items-GAMKVVIQ.js +103 -0
- package/dist/link-Z5AQP6JN.js +64 -0
- package/dist/linkedin-7F6YVXQL.js +1045 -0
- package/dist/linkedin-7F6YVXQL.js.map +1 -0
- package/dist/list-2ZTOMTES.js +65 -0
- package/dist/list-GK6LNWIW.js +76 -0
- package/dist/list-NLGM3QDP.js +303 -0
- package/dist/list-RR53EF3O.js +57 -0
- package/dist/list-SZH6TH74.js +64 -0
- package/dist/list-TB677Q2F.js +50 -0
- package/dist/list-VTVRZIYL.js +51 -0
- package/dist/list-XZVQWIJN.js +151 -0
- package/dist/locations-AEGZ36JH.js +40 -0
- package/dist/locations-YA7NZY44.js +67 -0
- package/dist/log-JM4VLJE4.js +92 -0
- package/dist/logo-YSNUUT33.js +18 -0
- package/dist/lookup-RH5N3OWJ.js +22 -0
- package/dist/make-IZJ47YZY.js +1310 -0
- package/dist/make-IZJ47YZY.js.map +1 -0
- package/dist/map-HRLUMCR2.js +433 -0
- package/dist/mcp-T6SAG4XB.js +463 -0
- package/dist/media-ES2UBGYW.js +15 -0
- package/dist/media-MPXEXN4O.js +89 -0
- package/dist/media-sources-7AS3274L.js +32 -0
- package/dist/members-J5KWXTXY.js +44 -0
- package/dist/meme-FMHHKWVU.js +100 -0
- package/dist/meme-FMHHKWVU.js.map +1 -0
- package/dist/meta-AOIPEDV5.js +69 -0
- package/dist/metrics-VDBJ6KL7.js +152 -0
- package/dist/models-2DQ5NBMT.js +155 -0
- package/dist/normalize-CHZB4QDD.js +141 -0
- package/dist/normalize-NR5RS3WR.js +806 -0
- package/dist/options-QLXFLESP.js +122 -0
- package/dist/organization-KEGKAP4P.js +328 -0
- package/dist/output-GWIP6ROX.js +24 -0
- package/dist/page-YWGBCN65.js +105 -0
- package/dist/pages-FTI44OSH.js +66 -0
- package/dist/performance-SPGPGXE5.js +24 -0
- package/dist/pinterest-J442QLQS.js +96 -0
- package/dist/pixels-6IUB3Y3H.js +60 -0
- package/dist/pixels-MBKR4XPX.js +108 -0
- package/dist/plan-YPE77T4R.js +207 -0
- package/dist/preview-V4YBD45S.js +169 -0
- package/dist/profile-S3MXS2VO.js +159 -0
- package/dist/promoted-tweet-writes-TRR3KPRJ.js +180 -0
- package/dist/promoted-tweets-XRYZNJI2.js +119 -0
- package/dist/properties-G3L2OAOL.js +101 -0
- package/dist/publish-V5YGMK53.js +341 -0
- package/dist/publish-V5YGMK53.js.map +1 -0
- package/dist/query-M3IO54U2.js +61 -0
- package/dist/query-WCB5W4NW.js +236 -0
- package/dist/query-YBS6ZQ75.js +247 -0
- package/dist/questionnaire-PAK4DALP.js +93 -0
- package/dist/read-LUTB3UOR.js +141 -0
- package/dist/reddit-STSECKMZ.js +26 -0
- package/dist/refresh-RQ3C2MHI.js +94 -0
- package/dist/release-UHGU5WBY.js +60 -0
- package/dist/relevant-pages-G6SNC73K.js +99 -0
- package/dist/remove-LTKICIIF.js +50 -0
- package/dist/remove-X6DNVS67.js +48 -0
- package/dist/reopen-BP5ERELB.js +63 -0
- package/dist/rerun-NR54OG3M.js +90 -0
- package/dist/rerun-NR54OG3M.js.map +1 -0
- package/dist/research-GOYMTKZM.js +262 -0
- package/dist/research-MBAPL35Y.js +62 -0
- package/dist/reset-Q62PEGOU.js +54 -0
- package/dist/reset-SJPGSQ7I.js +54 -0
- package/dist/resolve-R45W7QEQ.js +121 -0
- package/dist/retry-CD2Q2AJN.js +60 -0
- package/dist/retry-NBZ7Q6HK.js +62 -0
- package/dist/retry-failed-EJBP4236.js +45 -0
- package/dist/rules-SZIY67QF.js +96 -0
- package/dist/rules-SZIY67QF.js.map +1 -0
- package/dist/rules-add-KTLHU3YD.js +462 -0
- package/dist/rules-add-KTLHU3YD.js.map +1 -0
- package/dist/run-HCJKCEOL.js +66 -0
- package/dist/run-IIU2UVQU.js +65 -0
- package/dist/scaffold-ad-3VMAP5BF.js +1511 -0
- package/dist/scaffold-ad-3VMAP5BF.js.map +1 -0
- package/dist/scaffold-static-ad-Z7LO7PKI.js +1005 -0
- package/dist/scaffold-static-ad-Z7LO7PKI.js.map +1 -0
- package/dist/scaffold-video-SBSSR7TZ.js +883 -0
- package/dist/scaffold-video-SBSSR7TZ.js.map +1 -0
- package/dist/schedule-BSQHXJ5V.js +61 -0
- package/dist/schedule-IDZC6M32.js +66 -0
- package/dist/scheduled-agents-MFLMG34I.js +50 -0
- package/dist/schema-EFR7NGJG.js +69 -0
- package/dist/schema-IWPG3YSN.js +132 -0
- package/dist/scrape-J2Y7YZ4Z.js +2241 -0
- package/dist/screenshot-K7ZGTVTE.js +102 -0
- package/dist/search-CI7LEOOK.js +92 -0
- package/dist/search-EGI5K77S.js +174 -0
- package/dist/search-I6DRUXBX.js +224 -0
- package/dist/search-TTL7VQET.js +26 -0
- package/dist/search-VT2KUAH6.js +91 -0
- package/dist/search-copy-N2AIJNUH.js +168 -0
- package/dist/seeds-EYYQCMGF.js +101 -0
- package/dist/select-ON3KZEEK.js +101 -0
- package/dist/select-ON3KZEEK.js.map +1 -0
- package/dist/sends-RHVFV2XM.js +309 -0
- package/dist/sequences-5DUWNSWQ.js +146 -0
- package/dist/set-prompt-RHMZ7SFC.js +193 -0
- package/dist/set-prompt-RHMZ7SFC.js.map +1 -0
- package/dist/setup-links-5ILQNMFZ.js +141 -0
- package/dist/shared-NDRFKAH7.js +31 -0
- package/dist/site-LBXNVRPE.js +177 -0
- package/dist/sitemaps-QKKXMXMV.js +87 -0
- package/dist/sites-GRC6CCCK.js +101 -0
- package/dist/skills-UML6GSW6.js +47 -0
- package/dist/sources-GP4PUTX2.js +454 -0
- package/dist/sources-N4UANUHJ.js +30 -0
- package/dist/stale-OIOOAP2S.js +71 -0
- package/dist/stale-OIOOAP2S.js.map +1 -0
- package/dist/stats-RCLQE4HJ.js +34 -0
- package/dist/status-GSFMLC6W.js +62 -0
- package/dist/sticker-SINY47WT.js +94 -0
- package/dist/stock-ECRBD7RP.js +179 -0
- package/dist/studio-YB5WXQYC.js +49 -0
- package/dist/sync-2MFUI3ME.js +54 -0
- package/dist/sync-IE4AAVGY.js +265 -0
- package/dist/sync-LIV7FU4N.js +54 -0
- package/dist/sync-definition-5JO7QXX3.js +64 -0
- package/dist/tag-manager-G3LBQZUL.js +43 -0
- package/dist/tags-4JQX7HMT.js +26 -0
- package/dist/tags-6RQVXS47.js +224 -0
- package/dist/tags-AAIFQ6LS.js +20 -0
- package/dist/tags-F355NMIR.js +20 -0
- package/dist/tags-ZHCGHGYC.js +20 -0
- package/dist/targeting-constants-KEKYU5JQ.js +118 -0
- package/dist/targeting-criteria-6FY2JB3V.js +113 -0
- package/dist/targets-NI7TR4GV.js +103 -0
- package/dist/testimonials-G7CCH7VN.js +32 -0
- package/dist/themes-PXDXIKYR.js +94 -0
- package/dist/top-companies-YH2ZJEH5.js +108 -0
- package/dist/translate-AEOQJ5JN.js +604 -0
- package/dist/translate-AEOQJ5JN.js.map +1 -0
- package/dist/triggers-WYFM7PAH.js +142 -0
- package/dist/tweets-C3QUKS3I.js +123 -0
- package/dist/unfollow-ZI5QU7RD.js +46 -0
- package/dist/unlink-PTWUSM5B.js +67 -0
- package/dist/unstage-7F7JI6HY.js +95 -0
- package/dist/unstage-MCM6EZWK.js +85 -0
- package/dist/update-2BDIJDHN.js +188 -0
- package/dist/update-2BDIJDHN.js.map +1 -0
- package/dist/update-643S2MUW.js +63 -0
- package/dist/update-GUIP6G3N.js +152 -0
- package/dist/update-V6E3CIFD.js +98 -0
- package/dist/upload-3YJJ5VID.js +126 -0
- package/dist/upload-KO46L76G.js +150 -0
- package/dist/upscale-SJ7SCSRS.js +109 -0
- package/dist/url-options-LHS4SWWB.js +130 -0
- package/dist/url-params-2DKIXKHH.js +98 -0
- package/dist/use-6ULEM3WE.js +95 -0
- package/dist/validate-PEWGXGCR.js +117 -0
- package/dist/validate-PEWGXGCR.js.map +1 -0
- package/dist/variant-5TRRSYBB.js +338 -0
- package/dist/videos-KEDR4GG3.js +39 -0
- package/dist/view-ABSWZMXW.js +121 -0
- package/dist/viewer-check-TSH3SAYJ.js +80 -0
- package/dist/web-UOGBNAHR.js +140 -0
- package/dist/winners-KRISBKOR.js +113 -0
- package/dist/winning-ads-SGBI3WHK.js +84 -0
- package/dist/write-commands-E7JOB4HX.js +1015 -0
- package/dist/write-commands-HCQI4Y27.js +737 -0
- package/dist/write-commands-QCI6XBM7.js +206 -0
- package/dist/write-commands-RHCCPMAE.js +713 -0
- package/dist/x-UNSN57YP.js +47 -0
- package/package.json +2 -1
- package/dist/account-63NUWSXK.js +0 -49
- package/dist/account-IFB6V6GL.js +0 -80
- package/dist/account-NCX3VHZT.js +0 -79
- package/dist/account-reads-Y3T65EI4.js +0 -218
- package/dist/account-writes-7YZ7PTHF.js +0 -66
- package/dist/accounts-2MQVGI4I.js +0 -77
- package/dist/accounts-66KZC7QI.js +0 -114
- package/dist/accounts-MQIYTIAX.js +0 -611
- package/dist/accounts-MVEZ2TRL.js +0 -75
- package/dist/accounts-T5DCHHZK.js +0 -115
- package/dist/actions-LRSHHDV2.js +0 -55
- package/dist/active-entities-QWPGPNGE.js +0 -103
- package/dist/activecampaign-G4XARU6N.js +0 -935
- package/dist/activities-FN7DOE5S.js +0 -74
- package/dist/ad-group-writes-JSOCSYYV.js +0 -170
- package/dist/ad-groups-UN52WNJN.js +0 -68
- package/dist/ad-writes-X23H4HLZ.js +0 -174
- package/dist/add-2MVZQJYG.js +0 -302
- package/dist/add-7EKI6ZA4.js +0 -97
- package/dist/add-ZP47HVHW.js +0 -104
- package/dist/add-ZTXN775K.js +0 -105
- package/dist/add-accounts-PEJLMYWR.js +0 -91
- package/dist/ads-7YYCWZIR.js +0 -40
- package/dist/ads-FOJ6P4OA.js +0 -128
- package/dist/ads-MKMWS36P.js +0 -113
- package/dist/ads-NEJKXB4L.js +0 -77
- package/dist/adsets-TIHFYWOU.js +0 -176
- package/dist/advertisers-246ZLRFZ.js +0 -120
- package/dist/advertisers-E77XAYCQ.js +0 -125
- package/dist/analytics-SL56NTIV.js +0 -433
- package/dist/analytics-WPYPKM6L.js +0 -1976
- package/dist/animate-3H3TL3N6.js +0 -480
- package/dist/assign-WGQVY3DW.js +0 -77
- package/dist/audience-size-C37XJ6GS.js +0 -94
- package/dist/audience-size-C37XJ6GS.js.map +0 -1
- package/dist/audiences-BWDG2R2U.js +0 -268
- package/dist/audiences-GHMNXDPR.js +0 -85
- package/dist/audiences-Q7OCAMAQ.js +0 -78
- package/dist/audit-HG53XQJK.js +0 -88
- package/dist/audit-LGD4PMAI.js +0 -151
- package/dist/autocomplete-PD2EMWRU.js +0 -111
- package/dist/avatars-U5KAMVNV.js +0 -38
- package/dist/bid-pricing-PP6PV6S4.js +0 -99
- package/dist/bid-pricing-PP6PV6S4.js.map +0 -1
- package/dist/brand-2JJ45TBO.js +0 -22
- package/dist/brief-IMTLJQN2.js +0 -490
- package/dist/brief-IMTLJQN2.js.map +0 -1
- package/dist/businesses-24QYU6BL.js +0 -53
- package/dist/campaign-groups-ZXRHEEGS.js +0 -95
- package/dist/campaign-writes-7UHMSPJ3.js +0 -170
- package/dist/campaign-writes-WIBYW73K.js +0 -165
- package/dist/campaigns-CRRLTN74.js +0 -107
- package/dist/campaigns-DJV4W6UP.js +0 -76
- package/dist/campaigns-EY3AR4N7.js +0 -109
- package/dist/campaigns-WTZBLGVX.js +0 -110
- package/dist/canvas-WFYKZYZD.js +0 -46
- package/dist/capabilities-IGKT7D4H.js +0 -144
- package/dist/cards-IO2Q423H.js +0 -85
- package/dist/catalog-X3VJFC74.js +0 -64
- package/dist/catalog-X3VJFC74.js.map +0 -1
- package/dist/catalogs-2HT3VRRI.js +0 -128
- package/dist/changes-AZ6EUVFN.js +0 -135
- package/dist/chatgpt-M27OEM7J.js +0 -47
- package/dist/chats-OXIYXI4U.js +0 -262
- package/dist/chunk-26HCUIW2.js +0 -166
- package/dist/chunk-2SDC7WNS.js +0 -817
- package/dist/chunk-2SDC7WNS.js.map +0 -1
- package/dist/chunk-2SQ6ISRI.js +0 -392
- package/dist/chunk-2VRD3HSQ.js +0 -60
- package/dist/chunk-2VRD3HSQ.js.map +0 -1
- package/dist/chunk-2XQ5HU6D.js +0 -3088
- package/dist/chunk-2XQ5HU6D.js.map +0 -1
- package/dist/chunk-37P6DTDJ.js +0 -455
- package/dist/chunk-3IGY2FWK.js +0 -6667
- package/dist/chunk-3IGY2FWK.js.map +0 -1
- package/dist/chunk-3UA4THEF.js +0 -76
- package/dist/chunk-4EPGI6I2.js +0 -76
- package/dist/chunk-4LODOBIN.js +0 -433
- package/dist/chunk-5ADTL2LR.js +0 -188
- package/dist/chunk-5HABWBQX.js +0 -139
- package/dist/chunk-5HYSKH77.js +0 -315
- package/dist/chunk-5HYSKH77.js.map +0 -1
- package/dist/chunk-5TV4GYP2.js +0 -1830
- package/dist/chunk-5TV4GYP2.js.map +0 -1
- package/dist/chunk-6M6HUJ55.js +0 -474
- package/dist/chunk-6M6HUJ55.js.map +0 -1
- package/dist/chunk-6YZNHMPJ.js +0 -74
- package/dist/chunk-7ANWFQEA.js +0 -220
- package/dist/chunk-7FKRKMGL.js +0 -133
- package/dist/chunk-7FKRKMGL.js.map +0 -1
- package/dist/chunk-7MADMR5U.js +0 -399
- package/dist/chunk-7WZHO6W3.js +0 -225
- package/dist/chunk-AAF7HL4I.js +0 -320
- package/dist/chunk-ANWV2VTO.js +0 -136
- package/dist/chunk-ANYMWCST.js +0 -2122
- package/dist/chunk-AQADZOTG.js +0 -137
- package/dist/chunk-AQYH6C32.js +0 -544
- package/dist/chunk-BODRDUYQ.js +0 -111
- package/dist/chunk-BPPT7YVK.js +0 -274
- package/dist/chunk-BWAFZSZ4.js +0 -94
- package/dist/chunk-CIWI7LHO.js +0 -191
- package/dist/chunk-CLST7PLN.js +0 -26
- package/dist/chunk-CMNVR6DX.js +0 -486
- package/dist/chunk-CMNVR6DX.js.map +0 -1
- package/dist/chunk-CPTOHQSJ.js +0 -296
- package/dist/chunk-CU2DEMQB.js +0 -1079
- package/dist/chunk-D5GVSJBK.js +0 -66
- package/dist/chunk-D5Z34AYL.js +0 -297
- package/dist/chunk-EBC64WAG.js +0 -74
- package/dist/chunk-EMPXRKIM.js +0 -644
- package/dist/chunk-EQ74MEJN.js +0 -98
- package/dist/chunk-ETFAIX4L.js +0 -74
- package/dist/chunk-F3VR6CTH.js +0 -903
- package/dist/chunk-FDPBTKXZ.js +0 -25
- package/dist/chunk-GAD2NYL4.js +0 -1442
- package/dist/chunk-GAD2NYL4.js.map +0 -1
- package/dist/chunk-GAJQPQWS.js +0 -6239
- package/dist/chunk-GAJQPQWS.js.map +0 -1
- package/dist/chunk-GRL25RKS.js +0 -4408
- package/dist/chunk-GRL25RKS.js.map +0 -1
- package/dist/chunk-GRYP7Y5V.js +0 -103
- package/dist/chunk-H4DAEWJQ.js +0 -51
- package/dist/chunk-H5CGVMQW.js +0 -472
- package/dist/chunk-HDQBILJR.js +0 -45
- package/dist/chunk-HH5PFZ7U.js +0 -84
- package/dist/chunk-HKR7VCFK.js +0 -42
- package/dist/chunk-JQ4PQ2H6.js +0 -197
- package/dist/chunk-JRLGQA2T.js +0 -333
- package/dist/chunk-JU6X4XFU.js +0 -23
- package/dist/chunk-KODTY7PB.js +0 -215
- package/dist/chunk-LEGVJCL4.js +0 -56
- package/dist/chunk-LKM3FMYC.js +0 -363
- package/dist/chunk-LOTQBFUP.js +0 -106
- package/dist/chunk-LPBLKGH7.js +0 -106
- package/dist/chunk-MICLDQES.js +0 -346
- package/dist/chunk-MUHPBWE5.js +0 -35
- package/dist/chunk-NFSLRRIE.js +0 -77
- package/dist/chunk-NHQTEQPR.js +0 -169
- package/dist/chunk-NKXH3I65.js +0 -1743
- package/dist/chunk-NKXH3I65.js.map +0 -1
- package/dist/chunk-NRRNY3TZ.js +0 -55
- package/dist/chunk-O5J5T4ZL.js +0 -111
- package/dist/chunk-O5J5T4ZL.js.map +0 -1
- package/dist/chunk-O6TGA5HT.js +0 -337
- package/dist/chunk-O6TGA5HT.js.map +0 -1
- package/dist/chunk-O6VUX3O5.js +0 -52
- package/dist/chunk-OST3RA6Q.js +0 -610
- package/dist/chunk-OST3RA6Q.js.map +0 -1
- package/dist/chunk-PCSBF6GN.js +0 -3151
- package/dist/chunk-PCSBF6GN.js.map +0 -1
- package/dist/chunk-PLK7V2SJ.js +0 -509
- package/dist/chunk-PLK7V2SJ.js.map +0 -1
- package/dist/chunk-PWABS2DB.js +0 -172
- package/dist/chunk-PXTFT35U.js +0 -547
- package/dist/chunk-QBCPZFAV.js +0 -23992
- package/dist/chunk-QEZEXMRB.js +0 -96
- package/dist/chunk-QEZEXMRB.js.map +0 -1
- package/dist/chunk-QGSV3IWT.js +0 -304
- package/dist/chunk-QGSV3IWT.js.map +0 -1
- package/dist/chunk-QGWCBGEC.js +0 -1599
- package/dist/chunk-QKUBK3AD.js +0 -97
- package/dist/chunk-QNH5NCLM.js +0 -67
- package/dist/chunk-QNLWBJUR.js +0 -58
- package/dist/chunk-R4CDO5YH.js +0 -172
- package/dist/chunk-RCMK4FM2.js +0 -19
- package/dist/chunk-RJFM6TJC.js +0 -76
- package/dist/chunk-RKPSE27R.js +0 -98
- package/dist/chunk-S6ODQYTC.js +0 -96
- package/dist/chunk-S6ODQYTC.js.map +0 -1
- package/dist/chunk-SBN5UIQY.js +0 -665
- package/dist/chunk-SOK7U4NT.js +0 -592
- package/dist/chunk-TLQQV5AY.js +0 -159
- package/dist/chunk-TOIFDXCW.js +0 -57
- package/dist/chunk-TWXM7HVR.js +0 -149
- package/dist/chunk-U6RTBCU7.js +0 -26
- package/dist/chunk-UARL36OD.js +0 -846
- package/dist/chunk-UDG37PC2.js +0 -174
- package/dist/chunk-UMFKMS4U.js +0 -275
- package/dist/chunk-UW7PZFWZ.js +0 -75
- package/dist/chunk-UWTAQM4W.js +0 -160
- package/dist/chunk-UWTAQM4W.js.map +0 -1
- package/dist/chunk-VDAYKWVH.js +0 -125
- package/dist/chunk-VY5CTURR.js +0 -46
- package/dist/chunk-WE6K2VVZ.js +0 -494
- package/dist/chunk-WOTX7TNV.js +0 -84
- package/dist/chunk-XKA4ZHGX.js +0 -206
- package/dist/chunk-XO3GZLWQ.js +0 -5181
- package/dist/chunk-XO3GZLWQ.js.map +0 -1
- package/dist/chunk-XWB2L3HS.js +0 -66
- package/dist/chunk-XYOU3ROP.js +0 -175
- package/dist/chunk-XYOU3ROP.js.map +0 -1
- package/dist/chunk-YDSF4PXO.js +0 -216
- package/dist/chunk-YDSF4PXO.js.map +0 -1
- package/dist/chunk-YDWQVAFI.js +0 -92
- package/dist/chunk-YDWQVAFI.js.map +0 -1
- package/dist/claim-DEQYWQZ4.js +0 -197
- package/dist/client-TL7BITWM.js +0 -19
- package/dist/code-ORY2WROG.js +0 -76
- package/dist/companies-QM5MOLIZ.js +0 -195
- package/dist/complete-FM6VSFCT.js +0 -81
- package/dist/config-FMDQ323H.js +0 -88
- package/dist/connect-YTIE5PRU.js +0 -42
- package/dist/content-ZQB6PXGX.js +0 -85
- package/dist/conversation-VKWYWPB6.js +0 -93
- package/dist/conversion-report-U4UFXSD2.js +0 -125
- package/dist/conversion-upload-command-INQX73AK.js +0 -438
- package/dist/conversion-writes-MCKROLRA.js +0 -120
- package/dist/conversions-OPNDVQ56.js +0 -76
- package/dist/conversions-QILFJ34A.js +0 -135
- package/dist/countries-AZ3XSZVM.js +0 -82
- package/dist/create-A7O5CBUS.js +0 -207
- package/dist/create-BEH3DUUP.js +0 -59
- package/dist/create-C4LTWKD7.js +0 -132
- package/dist/create-LRVA4MSV.js +0 -235
- package/dist/creatives-43I65CHD.js +0 -87
- package/dist/creatives-DRRWFFOH.js +0 -51
- package/dist/creatives-DRRWFFOH.js.map +0 -1
- package/dist/creatives-XEKEYLNV.js +0 -182
- package/dist/credentials-GJMH4XRU.js +0 -287
- package/dist/critique-EJJQVV4D.js +0 -213
- package/dist/critique-EJJQVV4D.js.map +0 -1
- package/dist/critique-GIJUTKIM.js +0 -1449
- package/dist/critique-GIJUTKIM.js.map +0 -1
- package/dist/crm-ECMEYPQT.js +0 -318
- package/dist/crm-WHK3PL6S.js +0 -224
- package/dist/crop-Q2GJLOHE.js +0 -113
- package/dist/currency-SVDR5N7L.js +0 -88
- package/dist/custom-conversions-5NJNPZKM.js +0 -125
- package/dist/customers-XKE3DQR7.js +0 -56
- package/dist/decide-PCJTFCWC.js +0 -199
- package/dist/delete-7K4KFPUT.js +0 -69
- package/dist/delete-APRR2OYC.js +0 -66
- package/dist/delete-DTTEHY6E.js +0 -64
- package/dist/delete-GOA4Y562.js +0 -71
- package/dist/delete-I2SIRTMZ.js +0 -71
- package/dist/delete-QCZUGDIJ.js +0 -54
- package/dist/demographics-HG7NWA5U.js +0 -138
- package/dist/describe-CRTFAH6Y.js +0 -97
- package/dist/describe-OAB2FJYK.js +0 -97
- package/dist/dimensions-PFGHRZ5T.js +0 -101
- package/dist/discard-U3DW6WV3.js +0 -66
- package/dist/discover-IOJZYJ6B.js +0 -172
- package/dist/discover-R3EUUGRZ.js +0 -93
- package/dist/domain-HTF3ARBJ.js +0 -98
- package/dist/download-2HGDCPR7.js +0 -299
- package/dist/draft-3KLT2YHI.js +0 -233
- package/dist/draft-5RL6HZ6A.js +0 -306
- package/dist/draft-7O4ABIKK.js +0 -100
- package/dist/draft-DK4NZ6PW.js +0 -281
- package/dist/draft-GPL2TZXA.js +0 -328
- package/dist/draft-KTOZ2AT7.js +0 -217
- package/dist/draft-PQGTIABK.js +0 -103
- package/dist/draft-SRMHEIRG.js +0 -307
- package/dist/env-NPSYSFXD.js +0 -51
- package/dist/experiment-V57PLATO.js +0 -1397
- package/dist/export-UN2PTCNO.js +0 -168
- package/dist/extract-5JOFQZVU.js +0 -113
- package/dist/facets-2XQEJNZZ.js +0 -114
- package/dist/favorites-4AWW5F5B.js +0 -178
- package/dist/feed-AK3IFTAL.js +0 -177
- package/dist/feedback-34M4VJ5S.js +0 -66
- package/dist/feedback-34M4VJ5S.js.map +0 -1
- package/dist/feedback-record-ZINYAVHA.js +0 -175
- package/dist/feedback-record-ZINYAVHA.js.map +0 -1
- package/dist/fetch-6ALLGDRN.js +0 -139
- package/dist/fetch-VYIMA5BI.js +0 -176
- package/dist/find-22HWPRFY.js +0 -134
- package/dist/fit-S4RO2DMX.js +0 -45
- package/dist/flows-ITS573ST.js +0 -247
- package/dist/follow-IUW3P6KH.js +0 -94
- package/dist/follow-competitors-YDF5WM4K.js +0 -112
- package/dist/following-PNOYUSHX.js +0 -113
- package/dist/fonts-U4YXUNNZ.js +0 -34
- package/dist/forecast-AFBIS6WT.js +0 -104
- package/dist/forecast-AFBIS6WT.js.map +0 -1
- package/dist/forecast-NHG3UHOP.js +0 -168
- package/dist/funding-WSJI56OH.js +0 -85
- package/dist/funnel-46QWG5DN.js +0 -394
- package/dist/ga4-4W3KJIS5.js +0 -55
- package/dist/generate-3MC7WDL2.js +0 -263
- package/dist/get-4DJXDO42.js +0 -61
- package/dist/get-BK4MBGQF.js +0 -59
- package/dist/get-IAJ57JLM.js +0 -79
- package/dist/get-MVWVS3YT.js +0 -56
- package/dist/get-P5ZTH7RQ.js +0 -63
- package/dist/get-PTOW6PVF.js +0 -63
- package/dist/get-SR2NWOPT.js +0 -92
- package/dist/gif-L6RYCB6L.js +0 -94
- package/dist/gif-L6RYCB6L.js.map +0 -1
- package/dist/google-EMSAXPVB.js +0 -136
- package/dist/google-XE35SF3Z.js +0 -3190
- package/dist/google-ads-DYNDLOBO.js +0 -195
- package/dist/group-EUYJJ4LI.js +0 -43
- package/dist/group-MBRA2QID.js +0 -43
- package/dist/gsc-B3NPUNI6.js +0 -30
- package/dist/history-4S3YEIPK.js +0 -67
- package/dist/history-7HFGP7UI.js +0 -133
- package/dist/hubspot-3LWMILTD.js +0 -779
- package/dist/icon-4DAXBICB.js +0 -137
- package/dist/ideas-RHOV2ZJ6.js +0 -32
- package/dist/images-KXEPMLOC.js +0 -90
- package/dist/images-KXEPMLOC.js.map +0 -1
- package/dist/improve-U2RA5DPI.js +0 -86
- package/dist/ingest-H4F5TJC3.js +0 -23
- package/dist/ingest-URYQ7BTL.js +0 -107
- package/dist/insights-HQGBM6VA.js +0 -423
- package/dist/insights-K2CMI3K5.js +0 -122
- package/dist/inspect-IPQTTZK3.js +0 -189
- package/dist/inspiration-TRMFE64K.js +0 -53
- package/dist/intent-2EWV4KXW.js +0 -95
- package/dist/job-7GDSDRM4.js +0 -202
- package/dist/job-create-PE7G64WC.js +0 -109
- package/dist/job-status-LUSCFLZ2.js +0 -74
- package/dist/keep-5NFHEILH.js +0 -78
- package/dist/keyword-gap-T22T7RN6.js +0 -130
- package/dist/keyword-metrics-SLCXHPZS.js +0 -197
- package/dist/keywords-for-site-HBQSJKNN.js +0 -128
- package/dist/landing-PJJGQM3M.js +0 -28
- package/dist/landings-ZR4YMEPV.js +0 -151
- package/dist/languages-HXAZNLNU.js +0 -55
- package/dist/languages-VLMJOAJN.js +0 -40
- package/dist/launches-T5LAIOYS.js +0 -19
- package/dist/layerize-24PQKKPB.js +0 -190
- package/dist/leads-EDKSVSWP.js +0 -293
- package/dist/leads-HXYLSNMB.js +0 -90
- package/dist/learn-ZUZ7MEY5.js +0 -203
- package/dist/learn-ZUZ7MEY5.js.map +0 -1
- package/dist/library-ZHREUZMU.js +0 -109
- package/dist/lighthouse-E2NTHAO4.js +0 -75
- package/dist/line-item-writes-JNHZFCRM.js +0 -208
- package/dist/line-items-WGLNILMH.js +0 -103
- package/dist/link-KLFRRU24.js +0 -64
- package/dist/linkedin-LPWIZ3SS.js +0 -1009
- package/dist/linkedin-LPWIZ3SS.js.map +0 -1
- package/dist/list-37F6C6P5.js +0 -57
- package/dist/list-7EEDCI3T.js +0 -51
- package/dist/list-E3MCY43O.js +0 -303
- package/dist/list-E7CJMIGC.js +0 -76
- package/dist/list-HA2NITR3.js +0 -50
- package/dist/list-MIGWTOQU.js +0 -64
- package/dist/list-SW3DF473.js +0 -151
- package/dist/list-TG6LBHCV.js +0 -65
- package/dist/locations-VYIDAVD4.js +0 -67
- package/dist/locations-ZWTDUUGL.js +0 -40
- package/dist/log-Y4NIMHFD.js +0 -92
- package/dist/logo-SHQJHJK7.js +0 -18
- package/dist/lookup-TWSJ7KRT.js +0 -22
- package/dist/make-IJN6E4Q7.js +0 -633
- package/dist/make-IJN6E4Q7.js.map +0 -1
- package/dist/map-DHQTEDUH.js +0 -433
- package/dist/mcp-ZHASO273.js +0 -463
- package/dist/media-LDVWXWWZ.js +0 -15
- package/dist/media-TNB4DLTJ.js +0 -89
- package/dist/media-sources-MFBQDZNS.js +0 -32
- package/dist/members-HTHOAHPO.js +0 -44
- package/dist/meta-RAVCXVZA.js +0 -69
- package/dist/metrics-2VB46SDT.js +0 -152
- package/dist/models-TYRVCPS2.js +0 -155
- package/dist/normalize-PVOL256M.js +0 -141
- package/dist/normalize-Q7EN7JIF.js +0 -806
- package/dist/options-VDTCTJHY.js +0 -122
- package/dist/organization-VC5RO4FS.js +0 -328
- package/dist/output-NHMCVVUU.js +0 -24
- package/dist/page-5PCVZ7HS.js +0 -105
- package/dist/pages-DDXB4NQ4.js +0 -66
- package/dist/performance-QOQTL4XM.js +0 -24
- package/dist/pinterest-KQYSCTVQ.js +0 -96
- package/dist/pixels-GH522EYV.js +0 -108
- package/dist/pixels-HJYPX6RR.js +0 -60
- package/dist/plan-ZS7SOXL6.js +0 -207
- package/dist/preview-W4VKXOCT.js +0 -169
- package/dist/profile-FSB4RT55.js +0 -159
- package/dist/promoted-tweet-writes-6PI2KR65.js +0 -180
- package/dist/promoted-tweets-UJRNHKKO.js +0 -119
- package/dist/properties-V74I56UK.js +0 -101
- package/dist/publish-R6RINQCF.js +0 -322
- package/dist/publish-R6RINQCF.js.map +0 -1
- package/dist/query-5F5MBR7H.js +0 -247
- package/dist/query-KBXZD4SW.js +0 -61
- package/dist/query-SFNCXH4H.js +0 -236
- package/dist/questionnaire-JK5JLQXK.js +0 -93
- package/dist/read-LGRFU7XB.js +0 -141
- package/dist/reddit-QWM5ZQ6P.js +0 -26
- package/dist/refresh-ZPF7UH3S.js +0 -94
- package/dist/release-BZPK2P3R.js +0 -60
- package/dist/relevant-pages-VMNEEEJK.js +0 -99
- package/dist/remove-C7ZJYFCG.js +0 -50
- package/dist/remove-PIHTPIHM.js +0 -48
- package/dist/reopen-6Q7NQX2C.js +0 -63
- package/dist/rerun-VRZVJDYS.js +0 -84
- package/dist/rerun-VRZVJDYS.js.map +0 -1
- package/dist/research-FXQ6X7BY.js +0 -62
- package/dist/research-X6O7IID6.js +0 -262
- package/dist/reset-FRNQUCL5.js +0 -54
- package/dist/reset-NXK6NCOO.js +0 -54
- package/dist/resolve-WHI4UP4V.js +0 -121
- package/dist/retry-VSFPEXLE.js +0 -62
- package/dist/retry-XMTYWCFA.js +0 -60
- package/dist/retry-failed-XTYV3QJS.js +0 -45
- package/dist/run-HBNAA56X.js +0 -59
- package/dist/run-TAASFDQ7.js +0 -66
- package/dist/scaffold-ad-BV5WK4IA.js +0 -1548
- package/dist/scaffold-ad-BV5WK4IA.js.map +0 -1
- package/dist/scaffold-static-ad-IWNJ6GM7.js +0 -971
- package/dist/scaffold-static-ad-IWNJ6GM7.js.map +0 -1
- package/dist/scaffold-video-JBG7Q45T.js +0 -872
- package/dist/scaffold-video-JBG7Q45T.js.map +0 -1
- package/dist/schedule-P6GVRZ4E.js +0 -61
- package/dist/schedule-WSO7ETS6.js +0 -66
- package/dist/scheduled-agents-TYT5BIBQ.js +0 -50
- package/dist/schema-DL34A626.js +0 -69
- package/dist/schema-O4CMQQGD.js +0 -132
- package/dist/scrape-ZG2OWZL4.js +0 -2241
- package/dist/screenshot-GJUY7FCW.js +0 -102
- package/dist/search-2BJ4OLMX.js +0 -224
- package/dist/search-52CSDYJS.js +0 -91
- package/dist/search-FHSQYZOC.js +0 -92
- package/dist/search-HBFAHH4W.js +0 -174
- package/dist/search-ZAY2QV3Y.js +0 -26
- package/dist/search-copy-O5AOEBXC.js +0 -168
- package/dist/seeds-XY3EZ33U.js +0 -101
- package/dist/select-ISR6YEIE.js +0 -94
- package/dist/select-ISR6YEIE.js.map +0 -1
- package/dist/sends-GECHL3NK.js +0 -309
- package/dist/sequences-5BB4S63A.js +0 -146
- package/dist/set-prompt-DF7Q6WOF.js +0 -185
- package/dist/set-prompt-DF7Q6WOF.js.map +0 -1
- package/dist/setup-links-GF2IP4TH.js +0 -141
- package/dist/shared-JDIL3BNQ.js +0 -31
- package/dist/site-T6V5S5DJ.js +0 -177
- package/dist/sitemaps-UQJFRA2W.js +0 -87
- package/dist/sites-ZNNEPEGI.js +0 -101
- package/dist/skills-WRKEF2Q4.js +0 -47
- package/dist/sources-5YUE7KUI.js +0 -30
- package/dist/sources-UR3SLKVK.js +0 -454
- package/dist/stale-6LZAROBI.js +0 -63
- package/dist/stale-6LZAROBI.js.map +0 -1
- package/dist/stats-QFBTSDVV.js +0 -34
- package/dist/status-FDKP65DR.js +0 -62
- package/dist/sticker-2JQUC7XO.js +0 -94
- package/dist/stock-W3SNJCBV.js +0 -179
- package/dist/studio-2GAZ6QOH.js +0 -49
- package/dist/sync-4LHVBFMZ.js +0 -265
- package/dist/sync-NAJQQ6NQ.js +0 -54
- package/dist/sync-OGFGTKUK.js +0 -54
- package/dist/sync-definition-MSQFCXRK.js +0 -54
- package/dist/tag-manager-MNGOJ3GC.js +0 -43
- package/dist/tags-67KLYTJF.js +0 -224
- package/dist/tags-GLHFHQW2.js +0 -20
- package/dist/tags-PYLVQEVS.js +0 -20
- package/dist/tags-SL4F3LLY.js +0 -20
- package/dist/tags-XMRO4WF6.js +0 -26
- package/dist/targeting-constants-RQT4GLUA.js +0 -118
- package/dist/targeting-criteria-VK3IR6N2.js +0 -113
- package/dist/targets-RCM2ZXSU.js +0 -103
- package/dist/testimonials-KTHDZ3R5.js +0 -32
- package/dist/themes-VVID6Y73.js +0 -94
- package/dist/top-companies-MBTTJTRK.js +0 -108
- package/dist/translate-I6LZ3UZU.js +0 -598
- package/dist/translate-I6LZ3UZU.js.map +0 -1
- package/dist/triggers-PDIVJDLP.js +0 -142
- package/dist/tweets-L4CXZLKQ.js +0 -123
- package/dist/unfollow-5T2CT3EF.js +0 -46
- package/dist/unlink-IHEFAFG6.js +0 -67
- package/dist/unstage-NEX3EIJX.js +0 -95
- package/dist/unstage-NJQAIIPT.js +0 -85
- package/dist/update-CYQIGHT4.js +0 -98
- package/dist/update-K5MMOE5N.js +0 -155
- package/dist/update-K5MMOE5N.js.map +0 -1
- package/dist/update-LR7UW5LL.js +0 -63
- package/dist/update-P5BTLCGG.js +0 -152
- package/dist/upload-C2K66PR3.js +0 -150
- package/dist/upload-VVB2LTD2.js +0 -126
- package/dist/upscale-SGBB4GWF.js +0 -109
- package/dist/url-options-LUKI4Y46.js +0 -130
- package/dist/url-params-MSRUZOGT.js +0 -98
- package/dist/use-XGTUHBUL.js +0 -95
- package/dist/validate-XMEHRCAG.js +0 -88
- package/dist/validate-XMEHRCAG.js.map +0 -1
- package/dist/variant-DQRDW6IZ.js +0 -338
- package/dist/videos-EQG7AAXT.js +0 -39
- package/dist/view-KJ6YNRXB.js +0 -121
- package/dist/viewer-check-7DZQDGD3.js +0 -68
- package/dist/web-MSYXLOFV.js +0 -140
- package/dist/winners-LD6PFXAS.js +0 -113
- package/dist/winning-ads-VWBU3BNQ.js +0 -84
- package/dist/write-commands-CKMHQ4YY.js +0 -737
- package/dist/write-commands-NW5CC3DP.js +0 -206
- package/dist/write-commands-PK23JVW3.js +0 -1015
- package/dist/write-commands-RLEYECTB.js +0 -713
- package/dist/x-ZSTQLK6Q.js +0 -47
- /package/dist/{account-63NUWSXK.js.map → account-7LUQWY6Q.js.map} +0 -0
- /package/dist/{account-NCX3VHZT.js.map → account-VH2AATWI.js.map} +0 -0
- /package/dist/{account-IFB6V6GL.js.map → account-Z65CPOWE.js.map} +0 -0
- /package/dist/{account-reads-Y3T65EI4.js.map → account-reads-GYI2SS6T.js.map} +0 -0
- /package/dist/{account-writes-7YZ7PTHF.js.map → account-writes-4N2MA2ZR.js.map} +0 -0
- /package/dist/{accounts-T5DCHHZK.js.map → accounts-E4TVYTUR.js.map} +0 -0
- /package/dist/{accounts-66KZC7QI.js.map → accounts-SMB3TNXX.js.map} +0 -0
- /package/dist/{accounts-MQIYTIAX.js.map → accounts-SPLE7URQ.js.map} +0 -0
- /package/dist/{accounts-MVEZ2TRL.js.map → accounts-UA2ZWRN4.js.map} +0 -0
- /package/dist/{accounts-2MQVGI4I.js.map → accounts-XG472YLB.js.map} +0 -0
- /package/dist/{actions-LRSHHDV2.js.map → actions-KQTXBNJU.js.map} +0 -0
- /package/dist/{active-entities-QWPGPNGE.js.map → active-entities-MCL7UEGV.js.map} +0 -0
- /package/dist/{activecampaign-G4XARU6N.js.map → activecampaign-42JXANUA.js.map} +0 -0
- /package/dist/{activities-FN7DOE5S.js.map → activities-IQPJPP4B.js.map} +0 -0
- /package/dist/{ad-group-writes-JSOCSYYV.js.map → ad-group-writes-EUTMPBMK.js.map} +0 -0
- /package/dist/{ad-groups-UN52WNJN.js.map → ad-groups-OVPAI5RM.js.map} +0 -0
- /package/dist/{ad-writes-X23H4HLZ.js.map → ad-writes-DACTYFEO.js.map} +0 -0
- /package/dist/{add-ZTXN775K.js.map → add-5IGUQHVZ.js.map} +0 -0
- /package/dist/{add-7EKI6ZA4.js.map → add-BK5AQI5A.js.map} +0 -0
- /package/dist/{add-ZP47HVHW.js.map → add-C3FQ5D62.js.map} +0 -0
- /package/dist/{add-2MVZQJYG.js.map → add-KTEJCE4L.js.map} +0 -0
- /package/dist/{add-accounts-PEJLMYWR.js.map → add-accounts-CJSV5NPL.js.map} +0 -0
- /package/dist/{ads-MKMWS36P.js.map → ads-HXX2IAFF.js.map} +0 -0
- /package/dist/{ads-NEJKXB4L.js.map → ads-L65JIKCD.js.map} +0 -0
- /package/dist/{ads-FOJ6P4OA.js.map → ads-RAUM6ISF.js.map} +0 -0
- /package/dist/{ads-7YYCWZIR.js.map → ads-WPI3AMSR.js.map} +0 -0
- /package/dist/{adsets-TIHFYWOU.js.map → adsets-LPN6WFGF.js.map} +0 -0
- /package/dist/{advertisers-246ZLRFZ.js.map → advertisers-36HP3AOE.js.map} +0 -0
- /package/dist/{advertisers-E77XAYCQ.js.map → advertisers-DS2NRWKI.js.map} +0 -0
- /package/dist/{analytics-SL56NTIV.js.map → analytics-I4LZCRG2.js.map} +0 -0
- /package/dist/{analytics-WPYPKM6L.js.map → analytics-IFNBT7IM.js.map} +0 -0
- /package/dist/{animate-3H3TL3N6.js.map → animate-3LV3LHXQ.js.map} +0 -0
- /package/dist/{assign-WGQVY3DW.js.map → assign-WBLSZNCO.js.map} +0 -0
- /package/dist/{audiences-GHMNXDPR.js.map → audiences-3LRCLHTQ.js.map} +0 -0
- /package/dist/{audiences-BWDG2R2U.js.map → audiences-RPLVMO4H.js.map} +0 -0
- /package/dist/{audiences-Q7OCAMAQ.js.map → audiences-XEZHACKH.js.map} +0 -0
- /package/dist/{audit-LGD4PMAI.js.map → audit-6AG6BPXQ.js.map} +0 -0
- /package/dist/{audit-HG53XQJK.js.map → audit-YEGQU474.js.map} +0 -0
- /package/dist/{autocomplete-PD2EMWRU.js.map → autocomplete-2QRU7ARD.js.map} +0 -0
- /package/dist/{avatars-U5KAMVNV.js.map → avatars-EIETXCF3.js.map} +0 -0
- /package/dist/{brand-2JJ45TBO.js.map → brand-CINQG3JG.js.map} +0 -0
- /package/dist/{businesses-24QYU6BL.js.map → businesses-PRRYPR7H.js.map} +0 -0
- /package/dist/{campaign-groups-ZXRHEEGS.js.map → campaign-groups-5CMTEJZZ.js.map} +0 -0
- /package/dist/{campaign-writes-WIBYW73K.js.map → campaign-writes-4RMPHQCT.js.map} +0 -0
- /package/dist/{campaign-writes-7UHMSPJ3.js.map → campaign-writes-U5LTDTYK.js.map} +0 -0
- /package/dist/{campaigns-WTZBLGVX.js.map → campaigns-4SOLY7OR.js.map} +0 -0
- /package/dist/{campaigns-CRRLTN74.js.map → campaigns-NFRLFNXI.js.map} +0 -0
- /package/dist/{campaigns-EY3AR4N7.js.map → campaigns-PC7UAVXR.js.map} +0 -0
- /package/dist/{campaigns-DJV4W6UP.js.map → campaigns-TFEQTSO3.js.map} +0 -0
- /package/dist/{canvas-WFYKZYZD.js.map → canvas-BPACZHNU.js.map} +0 -0
- /package/dist/{capabilities-IGKT7D4H.js.map → capabilities-FNVTPCDT.js.map} +0 -0
- /package/dist/{cards-IO2Q423H.js.map → cards-WHMCSRZX.js.map} +0 -0
- /package/dist/{catalogs-2HT3VRRI.js.map → catalogs-A7XMEEEP.js.map} +0 -0
- /package/dist/{changes-AZ6EUVFN.js.map → changes-J67WATHX.js.map} +0 -0
- /package/dist/{chatgpt-M27OEM7J.js.map → chatgpt-4PEWDJKP.js.map} +0 -0
- /package/dist/{chats-OXIYXI4U.js.map → chats-S5FCV7YO.js.map} +0 -0
- /package/dist/{chunk-VDAYKWVH.js.map → chunk-232YUPUI.js.map} +0 -0
- /package/dist/{chunk-ANWV2VTO.js.map → chunk-23H4ZJRP.js.map} +0 -0
- /package/dist/{chunk-QNH5NCLM.js.map → chunk-3OCSWUHV.js.map} +0 -0
- /package/dist/{chunk-BPPT7YVK.js.map → chunk-3UXMQ3K2.js.map} +0 -0
- /package/dist/{chunk-HH5PFZ7U.js.map → chunk-5WMTPYKT.js.map} +0 -0
- /package/dist/{chunk-U6RTBCU7.js.map → chunk-65N4ZPQD.js.map} +0 -0
- /package/dist/{chunk-UDG37PC2.js.map → chunk-6JWEGFM5.js.map} +0 -0
- /package/dist/{chunk-PWABS2DB.js.map → chunk-7RBJ2Z7Z.js.map} +0 -0
- /package/dist/{chunk-JU6X4XFU.js.map → chunk-ABXTGAG7.js.map} +0 -0
- /package/dist/{chunk-7MADMR5U.js.map → chunk-ADSNY4KZ.js.map} +0 -0
- /package/dist/{chunk-2SQ6ISRI.js.map → chunk-AHF6TQWB.js.map} +0 -0
- /package/dist/{chunk-RKPSE27R.js.map → chunk-AQ5WISEG.js.map} +0 -0
- /package/dist/{chunk-EQ74MEJN.js.map → chunk-BFRIRZRZ.js.map} +0 -0
- /package/dist/{chunk-WOTX7TNV.js.map → chunk-BFZS3WHS.js.map} +0 -0
- /package/dist/{chunk-NFSLRRIE.js.map → chunk-BITS62MF.js.map} +0 -0
- /package/dist/{chunk-JRLGQA2T.js.map → chunk-BLAHHMPF.js.map} +0 -0
- /package/dist/{chunk-NHQTEQPR.js.map → chunk-CCIDHU6M.js.map} +0 -0
- /package/dist/{chunk-EMPXRKIM.js.map → chunk-CM6FCSWN.js.map} +0 -0
- /package/dist/{chunk-CPTOHQSJ.js.map → chunk-CVBKW75S.js.map} +0 -0
- /package/dist/{chunk-TLQQV5AY.js.map → chunk-CXQRTLSQ.js.map} +0 -0
- /package/dist/{chunk-4EPGI6I2.js.map → chunk-D4LKZJYJ.js.map} +0 -0
- /package/dist/{chunk-D5GVSJBK.js.map → chunk-D7KR6KXR.js.map} +0 -0
- /package/dist/{chunk-SOK7U4NT.js.map → chunk-DCTEL4KG.js.map} +0 -0
- /package/dist/{chunk-GRYP7Y5V.js.map → chunk-DH5CKOYK.js.map} +0 -0
- /package/dist/{chunk-H4DAEWJQ.js.map → chunk-DQC4NIJE.js.map} +0 -0
- /package/dist/{chunk-UW7PZFWZ.js.map → chunk-DWX44QL6.js.map} +0 -0
- /package/dist/{chunk-H5CGVMQW.js.map → chunk-EE72SSB2.js.map} +0 -0
- /package/dist/{chunk-QKUBK3AD.js.map → chunk-FNA277HP.js.map} +0 -0
- /package/dist/{chunk-CLST7PLN.js.map → chunk-FU7HJWGM.js.map} +0 -0
- /package/dist/{chunk-VY5CTURR.js.map → chunk-GDLQ6SGW.js.map} +0 -0
- /package/dist/{chunk-LPBLKGH7.js.map → chunk-GEKXIXMG.js.map} +0 -0
- /package/dist/{chunk-QNLWBJUR.js.map → chunk-GLW7UJLB.js.map} +0 -0
- /package/dist/{chunk-5HABWBQX.js.map → chunk-H5HDZ7IC.js.map} +0 -0
- /package/dist/{chunk-MUHPBWE5.js.map → chunk-I5VZVQBZ.js.map} +0 -0
- /package/dist/{chunk-HDQBILJR.js.map → chunk-IC6SDOED.js.map} +0 -0
- /package/dist/{chunk-QBCPZFAV.js.map → chunk-IG627WWY.js.map} +0 -0
- /package/dist/{chunk-BWAFZSZ4.js.map → chunk-IN4G7X6W.js.map} +0 -0
- /package/dist/{chunk-5ADTL2LR.js.map → chunk-IPLE5K5E.js.map} +0 -0
- /package/dist/{chunk-SBN5UIQY.js.map → chunk-IWWOGBGA.js.map} +0 -0
- /package/dist/{chunk-R4CDO5YH.js.map → chunk-JFA4R3KS.js.map} +0 -0
- /package/dist/{chunk-LOTQBFUP.js.map → chunk-JYBLCIRN.js.map} +0 -0
- /package/dist/{chunk-O6VUX3O5.js.map → chunk-K3TNTBZJ.js.map} +0 -0
- /package/dist/{chunk-FDPBTKXZ.js.map → chunk-LCW3U4EA.js.map} +0 -0
- /package/dist/{chunk-RJFM6TJC.js.map → chunk-MI3JB5KB.js.map} +0 -0
- /package/dist/{chunk-PXTFT35U.js.map → chunk-MIOOPOG2.js.map} +0 -0
- /package/dist/{chunk-EBC64WAG.js.map → chunk-MJQBXFW6.js.map} +0 -0
- /package/dist/{chunk-ETFAIX4L.js.map → chunk-MPACDBH5.js.map} +0 -0
- /package/dist/{chunk-AQYH6C32.js.map → chunk-MXWOYFI2.js.map} +0 -0
- /package/dist/{chunk-KODTY7PB.js.map → chunk-N5O67GK5.js.map} +0 -0
- /package/dist/{chunk-4LODOBIN.js.map → chunk-NCP6RD6A.js.map} +0 -0
- /package/dist/{chunk-D5Z34AYL.js.map → chunk-NNF4RARY.js.map} +0 -0
- /package/dist/{chunk-LKM3FMYC.js.map → chunk-NR2OVOTD.js.map} +0 -0
- /package/dist/{chunk-UARL36OD.js.map → chunk-NVGXYF6K.js.map} +0 -0
- /package/dist/{chunk-AQADZOTG.js.map → chunk-OP7DNHD2.js.map} +0 -0
- /package/dist/{chunk-3UA4THEF.js.map → chunk-ORQKMXHA.js.map} +0 -0
- /package/dist/{chunk-TWXM7HVR.js.map → chunk-P3TNRS56.js.map} +0 -0
- /package/dist/{chunk-WE6K2VVZ.js.map → chunk-Q7YZL7PG.js.map} +0 -0
- /package/dist/{chunk-LEGVJCL4.js.map → chunk-QABSQADZ.js.map} +0 -0
- /package/dist/{chunk-37P6DTDJ.js.map → chunk-R2TAVQGZ.js.map} +0 -0
- /package/dist/{chunk-JQ4PQ2H6.js.map → chunk-R5WNYLG4.js.map} +0 -0
- /package/dist/{chunk-QGWCBGEC.js.map → chunk-RD2XXQW3.js.map} +0 -0
- /package/dist/{chunk-MICLDQES.js.map → chunk-RMLJNHCU.js.map} +0 -0
- /package/dist/{chunk-BODRDUYQ.js.map → chunk-S7A34DOA.js.map} +0 -0
- /package/dist/{chunk-26HCUIW2.js.map → chunk-SFJW2KED.js.map} +0 -0
- /package/dist/{chunk-6YZNHMPJ.js.map → chunk-SOKVXKRM.js.map} +0 -0
- /package/dist/{chunk-CIWI7LHO.js.map → chunk-STNCMKL6.js.map} +0 -0
- /package/dist/{chunk-AAF7HL4I.js.map → chunk-SWL4AAPP.js.map} +0 -0
- /package/dist/{chunk-7WZHO6W3.js.map → chunk-ULPO72IQ.js.map} +0 -0
- /package/dist/{chunk-CU2DEMQB.js.map → chunk-UMZIQIWN.js.map} +0 -0
- /package/dist/{chunk-RCMK4FM2.js.map → chunk-V7N666PJ.js.map} +0 -0
- /package/dist/{chunk-UMFKMS4U.js.map → chunk-WNJ5SYAG.js.map} +0 -0
- /package/dist/{chunk-ANYMWCST.js.map → chunk-WNSE7N75.js.map} +0 -0
- /package/dist/{chunk-7ANWFQEA.js.map → chunk-XDZVBX6L.js.map} +0 -0
- /package/dist/{chunk-NRRNY3TZ.js.map → chunk-XGOEX2VJ.js.map} +0 -0
- /package/dist/{chunk-TOIFDXCW.js.map → chunk-XUB2EK65.js.map} +0 -0
- /package/dist/{chunk-XKA4ZHGX.js.map → chunk-XUR4QWCS.js.map} +0 -0
- /package/dist/{chunk-XWB2L3HS.js.map → chunk-XZ4YMCZK.js.map} +0 -0
- /package/dist/{chunk-HKR7VCFK.js.map → chunk-Y3VRMFGF.js.map} +0 -0
- /package/dist/{chunk-F3VR6CTH.js.map → chunk-YD7BQDJ6.js.map} +0 -0
- /package/dist/{claim-DEQYWQZ4.js.map → claim-6MPQD43X.js.map} +0 -0
- /package/dist/{client-TL7BITWM.js.map → client-WL2FKW4T.js.map} +0 -0
- /package/dist/{code-ORY2WROG.js.map → code-NXN7QYKU.js.map} +0 -0
- /package/dist/{companies-QM5MOLIZ.js.map → companies-KRF2K4CA.js.map} +0 -0
- /package/dist/{complete-FM6VSFCT.js.map → complete-V433ON5C.js.map} +0 -0
- /package/dist/{config-FMDQ323H.js.map → config-VOF57KBL.js.map} +0 -0
- /package/dist/{connect-YTIE5PRU.js.map → connect-QVIAM3GX.js.map} +0 -0
- /package/dist/{content-ZQB6PXGX.js.map → content-KA25YYO3.js.map} +0 -0
- /package/dist/{conversation-VKWYWPB6.js.map → conversation-VZKBZZGG.js.map} +0 -0
- /package/dist/{conversion-report-U4UFXSD2.js.map → conversion-report-REOHVLCI.js.map} +0 -0
- /package/dist/{conversion-upload-command-INQX73AK.js.map → conversion-upload-command-ASHA6T6H.js.map} +0 -0
- /package/dist/{conversion-writes-MCKROLRA.js.map → conversion-writes-JU7Q2MUO.js.map} +0 -0
- /package/dist/{conversions-OPNDVQ56.js.map → conversions-3ISBR3TS.js.map} +0 -0
- /package/dist/{conversions-QILFJ34A.js.map → conversions-ZLC6YTJ5.js.map} +0 -0
- /package/dist/{countries-AZ3XSZVM.js.map → countries-XGMZWUGP.js.map} +0 -0
- /package/dist/{create-C4LTWKD7.js.map → create-B3QMYSIX.js.map} +0 -0
- /package/dist/{create-A7O5CBUS.js.map → create-IFCCMKFT.js.map} +0 -0
- /package/dist/{create-LRVA4MSV.js.map → create-R5P6JU5A.js.map} +0 -0
- /package/dist/{create-BEH3DUUP.js.map → create-SF6DOGDJ.js.map} +0 -0
- /package/dist/{creatives-XEKEYLNV.js.map → creatives-KD7MOCR3.js.map} +0 -0
- /package/dist/{creatives-43I65CHD.js.map → creatives-YJ3CXZQC.js.map} +0 -0
- /package/dist/{credentials-GJMH4XRU.js.map → credentials-2KJUKBMF.js.map} +0 -0
- /package/dist/{crm-WHK3PL6S.js.map → crm-GX72E2LT.js.map} +0 -0
- /package/dist/{crm-ECMEYPQT.js.map → crm-ZYDNEME5.js.map} +0 -0
- /package/dist/{crop-Q2GJLOHE.js.map → crop-7UTYG7GS.js.map} +0 -0
- /package/dist/{currency-SVDR5N7L.js.map → currency-CGDI2NXI.js.map} +0 -0
- /package/dist/{custom-conversions-5NJNPZKM.js.map → custom-conversions-YRYE65PU.js.map} +0 -0
- /package/dist/{customers-XKE3DQR7.js.map → customers-P4N4NXLJ.js.map} +0 -0
- /package/dist/{decide-PCJTFCWC.js.map → decide-TWKH5QQU.js.map} +0 -0
- /package/dist/{delete-7K4KFPUT.js.map → delete-2GIIUPA3.js.map} +0 -0
- /package/dist/{delete-APRR2OYC.js.map → delete-AK5IV44E.js.map} +0 -0
- /package/dist/{delete-GOA4Y562.js.map → delete-GLLYPNNB.js.map} +0 -0
- /package/dist/{delete-I2SIRTMZ.js.map → delete-J7DXPGKD.js.map} +0 -0
- /package/dist/{delete-QCZUGDIJ.js.map → delete-RS7RQDUX.js.map} +0 -0
- /package/dist/{delete-DTTEHY6E.js.map → delete-S4VKH7IS.js.map} +0 -0
- /package/dist/{demographics-HG7NWA5U.js.map → demographics-IKWN2H3V.js.map} +0 -0
- /package/dist/{describe-CRTFAH6Y.js.map → describe-5QCPRSIG.js.map} +0 -0
- /package/dist/{describe-OAB2FJYK.js.map → describe-L3UC6MIL.js.map} +0 -0
- /package/dist/{dimensions-PFGHRZ5T.js.map → dimensions-POH4JXEM.js.map} +0 -0
- /package/dist/{discard-U3DW6WV3.js.map → discard-H6DOHJRG.js.map} +0 -0
- /package/dist/{discover-IOJZYJ6B.js.map → discover-L4TPEKGY.js.map} +0 -0
- /package/dist/{discover-R3EUUGRZ.js.map → discover-XAJKZCMM.js.map} +0 -0
- /package/dist/{domain-HTF3ARBJ.js.map → domain-US4KKAXC.js.map} +0 -0
- /package/dist/{download-2HGDCPR7.js.map → download-N4J5WFHD.js.map} +0 -0
- /package/dist/{draft-5RL6HZ6A.js.map → draft-BIQ3ZAYW.js.map} +0 -0
- /package/dist/{draft-3KLT2YHI.js.map → draft-EWDOIXSH.js.map} +0 -0
- /package/dist/{draft-PQGTIABK.js.map → draft-IL37WDST.js.map} +0 -0
- /package/dist/{draft-SRMHEIRG.js.map → draft-IZ4YLQRD.js.map} +0 -0
- /package/dist/{draft-7O4ABIKK.js.map → draft-KDMYGLWN.js.map} +0 -0
- /package/dist/{draft-KTOZ2AT7.js.map → draft-OLFQZBWL.js.map} +0 -0
- /package/dist/{draft-GPL2TZXA.js.map → draft-R32RFDCI.js.map} +0 -0
- /package/dist/{draft-DK4NZ6PW.js.map → draft-Y2QJE2NM.js.map} +0 -0
- /package/dist/{env-NPSYSFXD.js.map → env-5MUVYE2L.js.map} +0 -0
- /package/dist/{experiment-V57PLATO.js.map → experiment-G3FQVAJU.js.map} +0 -0
- /package/dist/{export-UN2PTCNO.js.map → export-OLDI32HM.js.map} +0 -0
- /package/dist/{extract-5JOFQZVU.js.map → extract-PPS6ONQN.js.map} +0 -0
- /package/dist/{facets-2XQEJNZZ.js.map → facets-JBZQHN3D.js.map} +0 -0
- /package/dist/{favorites-4AWW5F5B.js.map → favorites-4ELADD3R.js.map} +0 -0
- /package/dist/{feed-AK3IFTAL.js.map → feed-XIY5TVDL.js.map} +0 -0
- /package/dist/{fetch-VYIMA5BI.js.map → fetch-GOY6DQRL.js.map} +0 -0
- /package/dist/{fetch-6ALLGDRN.js.map → fetch-YWUVDMUH.js.map} +0 -0
- /package/dist/{find-22HWPRFY.js.map → find-EVY4XEIQ.js.map} +0 -0
- /package/dist/{fit-S4RO2DMX.js.map → fit-TVQ7RK52.js.map} +0 -0
- /package/dist/{flows-ITS573ST.js.map → flows-274YPU6I.js.map} +0 -0
- /package/dist/{follow-IUW3P6KH.js.map → follow-ZTPZKIMZ.js.map} +0 -0
- /package/dist/{follow-competitors-YDF5WM4K.js.map → follow-competitors-6QDVQ4VJ.js.map} +0 -0
- /package/dist/{following-PNOYUSHX.js.map → following-PBZLZFGQ.js.map} +0 -0
- /package/dist/{fonts-U4YXUNNZ.js.map → fonts-BMUNDGOZ.js.map} +0 -0
- /package/dist/{forecast-NHG3UHOP.js.map → forecast-F2CZSIMP.js.map} +0 -0
- /package/dist/{funding-WSJI56OH.js.map → funding-ULBMKUMW.js.map} +0 -0
- /package/dist/{funnel-46QWG5DN.js.map → funnel-LEUXICXU.js.map} +0 -0
- /package/dist/{ga4-4W3KJIS5.js.map → ga4-2BL5YAYN.js.map} +0 -0
- /package/dist/{generate-3MC7WDL2.js.map → generate-4HWNFAH3.js.map} +0 -0
- /package/dist/{get-P5ZTH7RQ.js.map → get-6RZU4M6W.js.map} +0 -0
- /package/dist/{get-SR2NWOPT.js.map → get-7GCEJ6KG.js.map} +0 -0
- /package/dist/{get-IAJ57JLM.js.map → get-MGDY5JYZ.js.map} +0 -0
- /package/dist/{get-4DJXDO42.js.map → get-MZWUMHEF.js.map} +0 -0
- /package/dist/{get-BK4MBGQF.js.map → get-OAZZHUZP.js.map} +0 -0
- /package/dist/{get-PTOW6PVF.js.map → get-OHU2N7B7.js.map} +0 -0
- /package/dist/{get-MVWVS3YT.js.map → get-TY6AMFI4.js.map} +0 -0
- /package/dist/{google-EMSAXPVB.js.map → google-7STODZQR.js.map} +0 -0
- /package/dist/{google-XE35SF3Z.js.map → google-ZTTE34A4.js.map} +0 -0
- /package/dist/{google-ads-DYNDLOBO.js.map → google-ads-5ARKO757.js.map} +0 -0
- /package/dist/{group-MBRA2QID.js.map → group-D5WXNFCP.js.map} +0 -0
- /package/dist/{group-EUYJJ4LI.js.map → group-Y5PLETFT.js.map} +0 -0
- /package/dist/{gsc-B3NPUNI6.js.map → gsc-UU3T2C6B.js.map} +0 -0
- /package/dist/{history-4S3YEIPK.js.map → history-IQ33J5PB.js.map} +0 -0
- /package/dist/{history-7HFGP7UI.js.map → history-SU7VQCDJ.js.map} +0 -0
- /package/dist/{hubspot-3LWMILTD.js.map → hubspot-TJED44GO.js.map} +0 -0
- /package/dist/{icon-4DAXBICB.js.map → icon-GB7UH5RF.js.map} +0 -0
- /package/dist/{ideas-RHOV2ZJ6.js.map → ideas-UTSCGCT6.js.map} +0 -0
- /package/dist/{improve-U2RA5DPI.js.map → improve-U5USRH4G.js.map} +0 -0
- /package/dist/{ingest-H4F5TJC3.js.map → ingest-DGDNZWEM.js.map} +0 -0
- /package/dist/{ingest-URYQ7BTL.js.map → ingest-SGBJ3NXX.js.map} +0 -0
- /package/dist/{insights-HQGBM6VA.js.map → insights-4HT2NAYP.js.map} +0 -0
- /package/dist/{insights-K2CMI3K5.js.map → insights-SQLE5NOJ.js.map} +0 -0
- /package/dist/{inspect-IPQTTZK3.js.map → inspect-BMQTTKMW.js.map} +0 -0
- /package/dist/{inspiration-TRMFE64K.js.map → inspiration-XQYHBJY2.js.map} +0 -0
- /package/dist/{intent-2EWV4KXW.js.map → intent-LM36WK45.js.map} +0 -0
- /package/dist/{job-7GDSDRM4.js.map → job-CGQHEANB.js.map} +0 -0
- /package/dist/{job-create-PE7G64WC.js.map → job-create-SZYJT2NC.js.map} +0 -0
- /package/dist/{job-status-LUSCFLZ2.js.map → job-status-6LAKLCKH.js.map} +0 -0
- /package/dist/{keep-5NFHEILH.js.map → keep-3MJSHWU3.js.map} +0 -0
- /package/dist/{keyword-gap-T22T7RN6.js.map → keyword-gap-P652ODHN.js.map} +0 -0
- /package/dist/{keyword-metrics-SLCXHPZS.js.map → keyword-metrics-MQLGGJBT.js.map} +0 -0
- /package/dist/{keywords-for-site-HBQSJKNN.js.map → keywords-for-site-JL6H2YGU.js.map} +0 -0
- /package/dist/{landing-PJJGQM3M.js.map → landing-AJO2BPC2.js.map} +0 -0
- /package/dist/{landings-ZR4YMEPV.js.map → landings-ZLKUP66P.js.map} +0 -0
- /package/dist/{languages-HXAZNLNU.js.map → languages-3IJVDS5Z.js.map} +0 -0
- /package/dist/{languages-VLMJOAJN.js.map → languages-HL42MI7H.js.map} +0 -0
- /package/dist/{launches-T5LAIOYS.js.map → launches-RG2SWEXM.js.map} +0 -0
- /package/dist/{layerize-24PQKKPB.js.map → layerize-SJYK6HPD.js.map} +0 -0
- /package/dist/{leads-EDKSVSWP.js.map → leads-2XOSAYP4.js.map} +0 -0
- /package/dist/{leads-HXYLSNMB.js.map → leads-H6JIWVI6.js.map} +0 -0
- /package/dist/{library-ZHREUZMU.js.map → library-Q4OU7VR7.js.map} +0 -0
- /package/dist/{lighthouse-E2NTHAO4.js.map → lighthouse-FALRSVQH.js.map} +0 -0
- /package/dist/{line-item-writes-JNHZFCRM.js.map → line-item-writes-V7AKAHFC.js.map} +0 -0
- /package/dist/{line-items-WGLNILMH.js.map → line-items-GAMKVVIQ.js.map} +0 -0
- /package/dist/{link-KLFRRU24.js.map → link-Z5AQP6JN.js.map} +0 -0
- /package/dist/{list-TG6LBHCV.js.map → list-2ZTOMTES.js.map} +0 -0
- /package/dist/{list-E7CJMIGC.js.map → list-GK6LNWIW.js.map} +0 -0
- /package/dist/{list-E3MCY43O.js.map → list-NLGM3QDP.js.map} +0 -0
- /package/dist/{list-37F6C6P5.js.map → list-RR53EF3O.js.map} +0 -0
- /package/dist/{list-MIGWTOQU.js.map → list-SZH6TH74.js.map} +0 -0
- /package/dist/{list-HA2NITR3.js.map → list-TB677Q2F.js.map} +0 -0
- /package/dist/{list-7EEDCI3T.js.map → list-VTVRZIYL.js.map} +0 -0
- /package/dist/{list-SW3DF473.js.map → list-XZVQWIJN.js.map} +0 -0
- /package/dist/{locations-ZWTDUUGL.js.map → locations-AEGZ36JH.js.map} +0 -0
- /package/dist/{locations-VYIDAVD4.js.map → locations-YA7NZY44.js.map} +0 -0
- /package/dist/{log-Y4NIMHFD.js.map → log-JM4VLJE4.js.map} +0 -0
- /package/dist/{logo-SHQJHJK7.js.map → logo-YSNUUT33.js.map} +0 -0
- /package/dist/{lookup-TWSJ7KRT.js.map → lookup-RH5N3OWJ.js.map} +0 -0
- /package/dist/{map-DHQTEDUH.js.map → map-HRLUMCR2.js.map} +0 -0
- /package/dist/{mcp-ZHASO273.js.map → mcp-T6SAG4XB.js.map} +0 -0
- /package/dist/{media-LDVWXWWZ.js.map → media-ES2UBGYW.js.map} +0 -0
- /package/dist/{media-TNB4DLTJ.js.map → media-MPXEXN4O.js.map} +0 -0
- /package/dist/{media-sources-MFBQDZNS.js.map → media-sources-7AS3274L.js.map} +0 -0
- /package/dist/{members-HTHOAHPO.js.map → members-J5KWXTXY.js.map} +0 -0
- /package/dist/{meta-RAVCXVZA.js.map → meta-AOIPEDV5.js.map} +0 -0
- /package/dist/{metrics-2VB46SDT.js.map → metrics-VDBJ6KL7.js.map} +0 -0
- /package/dist/{models-TYRVCPS2.js.map → models-2DQ5NBMT.js.map} +0 -0
- /package/dist/{normalize-PVOL256M.js.map → normalize-CHZB4QDD.js.map} +0 -0
- /package/dist/{normalize-Q7EN7JIF.js.map → normalize-NR5RS3WR.js.map} +0 -0
- /package/dist/{options-VDTCTJHY.js.map → options-QLXFLESP.js.map} +0 -0
- /package/dist/{organization-VC5RO4FS.js.map → organization-KEGKAP4P.js.map} +0 -0
- /package/dist/{output-NHMCVVUU.js.map → output-GWIP6ROX.js.map} +0 -0
- /package/dist/{page-5PCVZ7HS.js.map → page-YWGBCN65.js.map} +0 -0
- /package/dist/{pages-DDXB4NQ4.js.map → pages-FTI44OSH.js.map} +0 -0
- /package/dist/{performance-QOQTL4XM.js.map → performance-SPGPGXE5.js.map} +0 -0
- /package/dist/{pinterest-KQYSCTVQ.js.map → pinterest-J442QLQS.js.map} +0 -0
- /package/dist/{pixels-HJYPX6RR.js.map → pixels-6IUB3Y3H.js.map} +0 -0
- /package/dist/{pixels-GH522EYV.js.map → pixels-MBKR4XPX.js.map} +0 -0
- /package/dist/{plan-ZS7SOXL6.js.map → plan-YPE77T4R.js.map} +0 -0
- /package/dist/{preview-W4VKXOCT.js.map → preview-V4YBD45S.js.map} +0 -0
- /package/dist/{profile-FSB4RT55.js.map → profile-S3MXS2VO.js.map} +0 -0
- /package/dist/{promoted-tweet-writes-6PI2KR65.js.map → promoted-tweet-writes-TRR3KPRJ.js.map} +0 -0
- /package/dist/{promoted-tweets-UJRNHKKO.js.map → promoted-tweets-XRYZNJI2.js.map} +0 -0
- /package/dist/{properties-V74I56UK.js.map → properties-G3L2OAOL.js.map} +0 -0
- /package/dist/{query-KBXZD4SW.js.map → query-M3IO54U2.js.map} +0 -0
- /package/dist/{query-SFNCXH4H.js.map → query-WCB5W4NW.js.map} +0 -0
- /package/dist/{query-5F5MBR7H.js.map → query-YBS6ZQ75.js.map} +0 -0
- /package/dist/{questionnaire-JK5JLQXK.js.map → questionnaire-PAK4DALP.js.map} +0 -0
- /package/dist/{read-LGRFU7XB.js.map → read-LUTB3UOR.js.map} +0 -0
- /package/dist/{reddit-QWM5ZQ6P.js.map → reddit-STSECKMZ.js.map} +0 -0
- /package/dist/{refresh-ZPF7UH3S.js.map → refresh-RQ3C2MHI.js.map} +0 -0
- /package/dist/{release-BZPK2P3R.js.map → release-UHGU5WBY.js.map} +0 -0
- /package/dist/{relevant-pages-VMNEEEJK.js.map → relevant-pages-G6SNC73K.js.map} +0 -0
- /package/dist/{remove-C7ZJYFCG.js.map → remove-LTKICIIF.js.map} +0 -0
- /package/dist/{remove-PIHTPIHM.js.map → remove-X6DNVS67.js.map} +0 -0
- /package/dist/{reopen-6Q7NQX2C.js.map → reopen-BP5ERELB.js.map} +0 -0
- /package/dist/{research-X6O7IID6.js.map → research-GOYMTKZM.js.map} +0 -0
- /package/dist/{research-FXQ6X7BY.js.map → research-MBAPL35Y.js.map} +0 -0
- /package/dist/{reset-NXK6NCOO.js.map → reset-Q62PEGOU.js.map} +0 -0
- /package/dist/{reset-FRNQUCL5.js.map → reset-SJPGSQ7I.js.map} +0 -0
- /package/dist/{resolve-WHI4UP4V.js.map → resolve-R45W7QEQ.js.map} +0 -0
- /package/dist/{retry-XMTYWCFA.js.map → retry-CD2Q2AJN.js.map} +0 -0
- /package/dist/{retry-VSFPEXLE.js.map → retry-NBZ7Q6HK.js.map} +0 -0
- /package/dist/{retry-failed-XTYV3QJS.js.map → retry-failed-EJBP4236.js.map} +0 -0
- /package/dist/{run-TAASFDQ7.js.map → run-HCJKCEOL.js.map} +0 -0
- /package/dist/{run-HBNAA56X.js.map → run-IIU2UVQU.js.map} +0 -0
- /package/dist/{schedule-P6GVRZ4E.js.map → schedule-BSQHXJ5V.js.map} +0 -0
- /package/dist/{schedule-WSO7ETS6.js.map → schedule-IDZC6M32.js.map} +0 -0
- /package/dist/{scheduled-agents-TYT5BIBQ.js.map → scheduled-agents-MFLMG34I.js.map} +0 -0
- /package/dist/{schema-DL34A626.js.map → schema-EFR7NGJG.js.map} +0 -0
- /package/dist/{schema-O4CMQQGD.js.map → schema-IWPG3YSN.js.map} +0 -0
- /package/dist/{scrape-ZG2OWZL4.js.map → scrape-J2Y7YZ4Z.js.map} +0 -0
- /package/dist/{screenshot-GJUY7FCW.js.map → screenshot-K7ZGTVTE.js.map} +0 -0
- /package/dist/{search-FHSQYZOC.js.map → search-CI7LEOOK.js.map} +0 -0
- /package/dist/{search-HBFAHH4W.js.map → search-EGI5K77S.js.map} +0 -0
- /package/dist/{search-2BJ4OLMX.js.map → search-I6DRUXBX.js.map} +0 -0
- /package/dist/{search-ZAY2QV3Y.js.map → search-TTL7VQET.js.map} +0 -0
- /package/dist/{search-52CSDYJS.js.map → search-VT2KUAH6.js.map} +0 -0
- /package/dist/{search-copy-O5AOEBXC.js.map → search-copy-N2AIJNUH.js.map} +0 -0
- /package/dist/{seeds-XY3EZ33U.js.map → seeds-EYYQCMGF.js.map} +0 -0
- /package/dist/{sends-GECHL3NK.js.map → sends-RHVFV2XM.js.map} +0 -0
- /package/dist/{sequences-5BB4S63A.js.map → sequences-5DUWNSWQ.js.map} +0 -0
- /package/dist/{setup-links-GF2IP4TH.js.map → setup-links-5ILQNMFZ.js.map} +0 -0
- /package/dist/{shared-JDIL3BNQ.js.map → shared-NDRFKAH7.js.map} +0 -0
- /package/dist/{site-T6V5S5DJ.js.map → site-LBXNVRPE.js.map} +0 -0
- /package/dist/{sitemaps-UQJFRA2W.js.map → sitemaps-QKKXMXMV.js.map} +0 -0
- /package/dist/{sites-ZNNEPEGI.js.map → sites-GRC6CCCK.js.map} +0 -0
- /package/dist/{skills-WRKEF2Q4.js.map → skills-UML6GSW6.js.map} +0 -0
- /package/dist/{sources-UR3SLKVK.js.map → sources-GP4PUTX2.js.map} +0 -0
- /package/dist/{sources-5YUE7KUI.js.map → sources-N4UANUHJ.js.map} +0 -0
- /package/dist/{stats-QFBTSDVV.js.map → stats-RCLQE4HJ.js.map} +0 -0
- /package/dist/{status-FDKP65DR.js.map → status-GSFMLC6W.js.map} +0 -0
- /package/dist/{sticker-2JQUC7XO.js.map → sticker-SINY47WT.js.map} +0 -0
- /package/dist/{stock-W3SNJCBV.js.map → stock-ECRBD7RP.js.map} +0 -0
- /package/dist/{studio-2GAZ6QOH.js.map → studio-YB5WXQYC.js.map} +0 -0
- /package/dist/{sync-NAJQQ6NQ.js.map → sync-2MFUI3ME.js.map} +0 -0
- /package/dist/{sync-4LHVBFMZ.js.map → sync-IE4AAVGY.js.map} +0 -0
- /package/dist/{sync-OGFGTKUK.js.map → sync-LIV7FU4N.js.map} +0 -0
- /package/dist/{sync-definition-MSQFCXRK.js.map → sync-definition-5JO7QXX3.js.map} +0 -0
- /package/dist/{tag-manager-MNGOJ3GC.js.map → tag-manager-G3LBQZUL.js.map} +0 -0
- /package/dist/{tags-XMRO4WF6.js.map → tags-4JQX7HMT.js.map} +0 -0
- /package/dist/{tags-67KLYTJF.js.map → tags-6RQVXS47.js.map} +0 -0
- /package/dist/{tags-GLHFHQW2.js.map → tags-AAIFQ6LS.js.map} +0 -0
- /package/dist/{tags-SL4F3LLY.js.map → tags-F355NMIR.js.map} +0 -0
- /package/dist/{tags-PYLVQEVS.js.map → tags-ZHCGHGYC.js.map} +0 -0
- /package/dist/{targeting-constants-RQT4GLUA.js.map → targeting-constants-KEKYU5JQ.js.map} +0 -0
- /package/dist/{targeting-criteria-VK3IR6N2.js.map → targeting-criteria-6FY2JB3V.js.map} +0 -0
- /package/dist/{targets-RCM2ZXSU.js.map → targets-NI7TR4GV.js.map} +0 -0
- /package/dist/{testimonials-KTHDZ3R5.js.map → testimonials-G7CCH7VN.js.map} +0 -0
- /package/dist/{themes-VVID6Y73.js.map → themes-PXDXIKYR.js.map} +0 -0
- /package/dist/{top-companies-MBTTJTRK.js.map → top-companies-YH2ZJEH5.js.map} +0 -0
- /package/dist/{triggers-PDIVJDLP.js.map → triggers-WYFM7PAH.js.map} +0 -0
- /package/dist/{tweets-L4CXZLKQ.js.map → tweets-C3QUKS3I.js.map} +0 -0
- /package/dist/{unfollow-5T2CT3EF.js.map → unfollow-ZI5QU7RD.js.map} +0 -0
- /package/dist/{unlink-IHEFAFG6.js.map → unlink-PTWUSM5B.js.map} +0 -0
- /package/dist/{unstage-NEX3EIJX.js.map → unstage-7F7JI6HY.js.map} +0 -0
- /package/dist/{unstage-NJQAIIPT.js.map → unstage-MCM6EZWK.js.map} +0 -0
- /package/dist/{update-LR7UW5LL.js.map → update-643S2MUW.js.map} +0 -0
- /package/dist/{update-P5BTLCGG.js.map → update-GUIP6G3N.js.map} +0 -0
- /package/dist/{update-CYQIGHT4.js.map → update-V6E3CIFD.js.map} +0 -0
- /package/dist/{upload-VVB2LTD2.js.map → upload-3YJJ5VID.js.map} +0 -0
- /package/dist/{upload-C2K66PR3.js.map → upload-KO46L76G.js.map} +0 -0
- /package/dist/{upscale-SGBB4GWF.js.map → upscale-SJ7SCSRS.js.map} +0 -0
- /package/dist/{url-options-LUKI4Y46.js.map → url-options-LHS4SWWB.js.map} +0 -0
- /package/dist/{url-params-MSRUZOGT.js.map → url-params-2DKIXKHH.js.map} +0 -0
- /package/dist/{use-XGTUHBUL.js.map → use-6ULEM3WE.js.map} +0 -0
- /package/dist/{variant-DQRDW6IZ.js.map → variant-5TRRSYBB.js.map} +0 -0
- /package/dist/{videos-EQG7AAXT.js.map → videos-KEDR4GG3.js.map} +0 -0
- /package/dist/{view-KJ6YNRXB.js.map → view-ABSWZMXW.js.map} +0 -0
- /package/dist/{viewer-check-7DZQDGD3.js.map → viewer-check-TSH3SAYJ.js.map} +0 -0
- /package/dist/{web-MSYXLOFV.js.map → web-UOGBNAHR.js.map} +0 -0
- /package/dist/{winners-LD6PFXAS.js.map → winners-KRISBKOR.js.map} +0 -0
- /package/dist/{winning-ads-VWBU3BNQ.js.map → winning-ads-SGBI3WHK.js.map} +0 -0
- /package/dist/{write-commands-PK23JVW3.js.map → write-commands-E7JOB4HX.js.map} +0 -0
- /package/dist/{write-commands-CKMHQ4YY.js.map → write-commands-HCQI4Y27.js.map} +0 -0
- /package/dist/{write-commands-NW5CC3DP.js.map → write-commands-QCI6XBM7.js.map} +0 -0
- /package/dist/{write-commands-RLEYECTB.js.map → write-commands-RHCCPMAE.js.map} +0 -0
- /package/dist/{x-ZSTQLK6Q.js.map → x-UNSN57YP.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/nodes/local/lib/static-review.ts","../src/engine/scaffold/platform-safe-area.ts","../src/engine/nodes/local/lib/band-check.ts","../src/engine/nodes/local/lib/brand-colour.ts","../src/engine/nodes/local/lib/copy-match.ts","../src/engine/nodes/local/lib/must-show.ts","../src/engine/nodes/local/lib/text-boxes.ts"],"sourcesContent":["/**\n * Look at a finished static ad before anyone is told it is done.\n *\n * Nothing in a static run ever opened the picture it made: a run whose copy came back\n * garbled, whose logo was drawn twice, or whose 9:16 was really a 3:4 reported\n * `completed` the same as a good one. This reads the delivered images back: their pixel\n * shape against the format they are labelled (free, exact), and one vision pass that reads\n * every word against the copy and checks the logo, clipping, legibility and the Stories\n * safe zones. Findings travel on the run record's `review`; a blocking one means the run\n * is not ready to show, whatever the node statuses say.\n *\n * The words are the gate that matters: text mistakes are the first reason marketers\n * reject a version (creativeFeedback, Sept 2026), and 10 of 14 rejected versions had\n * passed a review that only asked \"anything wrong?\". So the model transcribes each\n * expected string per format, and the code compares the transcription to the copy,\n * character for character; a difference is blocking whatever the model thought of it.\n */\nimport { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport sharp from \"sharp\";\nimport { z } from \"zod\";\nimport { perceptualHash } from \"../../../landing-library/visualHash.ts\";\nimport {\n blockingPlacements,\n type SafeArea,\n type SafeAreaPlacement,\n staticSafeArea,\n} from \"../../../scaffold/platform-safe-area.ts\";\nimport {\n type CitationJudge,\n type Citations,\n citedBy,\n citedPlatforms,\n jevCitationJudge,\n namedPlatform,\n} from \"../../../scaffold/review-platforms.ts\";\nimport { type BandEdge, type BandViolation, bandViolations, FRAME_CUT } from \"./band-check.ts\";\nimport { inkOf, type OffBrandInk, offBrandInks } from \"./brand-colour.ts\";\nimport {\n continuesColumn,\n copySimilarity,\n type ExpectedLine,\n type LineMismatch,\n normalizeCopy,\n readingOrder,\n textMismatch,\n} from \"./copy-match.ts\";\nimport { askJev } from \"./jev.ts\";\nimport { BUTTON_PAD, boxesOfLine, roleKey, shownBoxes, withWordmark } from \"./must-show.ts\";\nimport {\n askAboutStills,\n FINDING_DEFECTS,\n FINDING_ELEMENTS,\n type FindingKind,\n FRAME_EDGES,\n type RenderFinding,\n type ReviewUsage,\n STATIC_REVIEW_ITEMS,\n} from \"./render-review.ts\";\nimport { readTextBoxes, type TextBox, type TextBoxReading } from \"./text-boxes.ts\";\n\n/** A delivered image whose ratio is further than this from its label is the wrong shape. */\nconst RATIO_TOLERANCE = 0.02;\n\nfunction ratioOf(format: string): number | null {\n const [w, h] = format.split(\":\").map(Number);\n return w && h ? w / h : null;\n}\n\n/** Each delivered image, measured against the format it is labelled. Pure. */\nexport function ratioFindings(images: Array<{ format: string; width: number; height: number }>): RenderFinding[] {\n return images.flatMap(({ format, width, height }) => {\n const want = ratioOf(format);\n if (want === null || width <= 0 || height <= 0) return [];\n if (Math.abs(width / height / want - 1) <= RATIO_TOLERANCE) return [];\n return [\n {\n severity: \"blocking\" as const,\n what: `The ${format} version came out ${width}x${height}, which is not ${format}. It cannot be delivered as ${format}.`,\n },\n ];\n });\n}\n\n/**\n * One candidate's standing with the judge. `scores` per criterion; `of` is the most a\n * criterion can score (the candidates it can beat on a ranking; 5 on an older score line).\n */\nexport type JudgeScore = { image: number; total: number; of?: number; scores: Record<string, number> };\n\nconst RANKING_LINE =\n /^[\\s*#>-]*(?:\\d+[.)]\\s*)?\\**\\s*([a-z][a-z ]*?)\\s*\\**\\s*:\\s*\\**\\s*(image\\s+\\d+(?:\\s*[>=]\\s*image\\s+\\d+)+)/i;\n\n/**\n * The judge's ranking lines (`judgeBrief`): \"<criterion>: Image X > Image Y > …\", best first,\n * `=` for a tie. Each candidate scores, per criterion, the number of candidates ranked below it.\n */\nfunction parseJudgeRanking(reasoning: string): JudgeScore[] {\n const byImage = new Map<number, Record<string, number>>();\n let candidates = 0;\n for (const line of reasoning.split(\"\\n\")) {\n const match = line.match(RANKING_LINE);\n if (!match) continue;\n const criterion = (match[1] ?? \"\").trim().toLowerCase().replace(/\\s+/g, \"_\");\n // Tiers, best first: \"Image 2 = Image 1 > Image 3\" is [[2, 1], [3]].\n const tiers = (match[2] ?? \"\")\n .split(\">\")\n .map((tier) => [...tier.matchAll(/image\\s+(\\d+)/gi)].map((m) => Number(m[1])));\n const ranked = tiers.flat();\n candidates = Math.max(candidates, ranked.length, ...ranked);\n let below = ranked.length;\n for (const tier of tiers) {\n below -= tier.length;\n for (const image of tier) {\n const scores = byImage.get(image) ?? {};\n scores[criterion] = below;\n byImage.set(image, scores);\n }\n }\n }\n return [...byImage.entries()]\n .sort(([a], [b]) => a - b)\n .map(([image, scores]) => ({\n image,\n total: Object.values(scores).reduce((a, b) => a + b, 0),\n of: candidates - 1,\n scores,\n }));\n}\n\n/**\n * The judge's per-candidate standing, read off the lines its brief asks it to start\n * `reasoning` with: the ranking lines `judgeBrief` asks for, or an older judge's score lines\n * (\"Image 1: idea=4 … total=28\"). Lines that follow neither format are skipped: a missing\n * score is reported as missing, never guessed.\n */\nexport function parseJudgeScores(reasoning: string): JudgeScore[] {\n const out: JudgeScore[] = [];\n for (const line of reasoning.split(\"\\n\")) {\n const head = line.match(/^\\s*Image\\s+(\\d+)\\s*:(.*)$/i);\n if (!head) continue;\n const scores: Record<string, number> = {};\n let total: number | undefined;\n for (const pair of (head[2] ?? \"\").matchAll(/([a-z_]+)\\s*=\\s*(\\d+(?:\\.\\d+)?)/gi)) {\n const key = (pair[1] ?? \"\").toLowerCase();\n const value = Number(pair[2]);\n if (key === \"total\") total = value;\n else scores[key] = value;\n }\n if (Object.keys(scores).length === 0) continue;\n out.push({ image: Number(head[1]), total: total ?? Object.values(scores).reduce((a, b) => a + b, 0), scores });\n }\n return out.length > 0 ? out : parseJudgeRanking(reasoning);\n}\n\n/**\n * The candidate the judge's standing puts first. On ranking lines the criteria gate in the\n * order `judgeBrief` lists them, so the first criterion that separates two candidates\n * decides; on older score lines, the highest total. Null with no standing. Pure.\n */\nexport function judgeWinner(judge: readonly JudgeScore[]): JudgeScore | null {\n const byGate = (a: JudgeScore, b: JudgeScore): number => {\n if (a.of === undefined) return b.total - a.total;\n for (const criterion of Object.keys(a.scores)) {\n const gap = (b.scores[criterion] ?? 0) - (a.scores[criterion] ?? 0);\n if (gap !== 0) return gap;\n }\n return b.total - a.total;\n };\n return [...judge].sort(byGate)[0] ?? null;\n}\n\nconst StaticFinding = z.object({\n severity: z.enum([\"blocking\", \"warning\"]),\n format: z.string().optional(),\n what: z.string().trim().min(1),\n item: z.enum(STATIC_REVIEW_ITEMS).catch(\"other\"),\n element: z.enum(FINDING_ELEMENTS).catch(\"other\"),\n defect: z.enum(FINDING_DEFECTS).catch(\"other\"),\n edges: z.array(z.enum(FRAME_EDGES)).catch([]),\n});\n\n/** Items the prompt marks blocking that the model tends to soften: one subject drawn as two, a stranger shown as a named person. */\nconst ALWAYS_BLOCKING: ReadonlySet<FindingKind[\"item\"]> = new Set([\"subject\", \"person\"]);\n\n/**\n * The review model's answer, reduced to findings the agent can act on, graded on the typed fields\n * it fills beside its words (`FindingKind`), never on the words: a call to action left out is no\n * finding (the prompt says so); one subject drawn as two is blocking whatever the model said; words\n * or figures blurred on a screen or a document in the scene are a note, since every render is asked\n * for no readable prices beyond the copy and a correction blurs them (dev, Oct 2026: blocked after\n * that correction, the ad could never be ready). Pure.\n */\nexport function classifyStaticFindings(json: unknown): RenderFinding[] {\n const findings = (json as { findings?: unknown } | null)?.findings;\n if (!Array.isArray(findings)) return [];\n return findings.flatMap((raw) => {\n const parsed = StaticFinding.safeParse(raw);\n if (!parsed.success) return [];\n const { severity, format, what, ...fields } = parsed.data;\n const kind: FindingKind = {\n item: fields.item,\n element: fields.element,\n defect: fields.defect,\n edges: [...new Set(fields.edges)],\n };\n if (kind.element === \"button\" && kind.defect === \"missing\") return [];\n const graded = ALWAYS_BLOCKING.has(kind.item)\n ? \"blocking\"\n : kind.element === \"scene_text\" && kind.defect === \"unreadable\"\n ? \"warning\"\n : severity;\n return [{ severity: graded, what: format?.trim() ? `${format.trim()}: ${what}` : what, kind }];\n });\n}\n\nconst CopyRead = z.object({\n format: z.string().trim().min(1),\n string: z.string(),\n /** What the model read where the string should be; null when it found nothing like it. */\n seen: z.string().nullable(),\n});\n\n/**\n * A string as two readings of it compare: whitespace collapsed (and dropped before a sign or a\n * colon, where French sets it), separator dots dropped, the typographic quotes,\n * dashes and ellipsis a transcription may straighten folded to one form, and case folded\n * too, because case is a typographic treatment the blueprint sets (`font_characteristics`\n * says \"uppercase\" and the model sets the line in caps, as it should). Accents are kept:\n * \"Más\" set as \"Mas\" is a text mistake.\n */\nexport function comparableCopy(text: string): string {\n return (\n text\n .replace(/[‘’‚′]/g, \"'\")\n .replace(/[“”„″]/g, '\"')\n .replace(/[‐-―−]/g, \"-\")\n .replace(/…/g, \"...\")\n .replace(/[«»]/g, '\"')\n // A separator between a line's parts (\"12 meses · 100 % online\") is often left out.\n .replace(/\\s*[·•]\\s*/g, \" \")\n .replace(/\\s+/g, \" \")\n // The space French sets before a sign or a colon, and around a currency, is often left out.\n .replace(/ (?=[%€$£:;!?])/g, \"\")\n .replace(/(?<=[€$£]) (?=\\d)/g, \"\")\n .trim()\n // A quotation set inside quote marks says the same words.\n .replace(/^\"([^\"]*)\"$/, \"$1\")\n .trim()\n .toLowerCase()\n );\n}\n\n/**\n * The copy gate: every expected string, on every format, transcribed by the model and\n * compared here. A string read differently, or not found, blocks; a format the model\n * transcribed nothing for is reported as unread rather than passed; a line a size scrolled off\n * (`scrolled`, a chat on a 9:16) is expected nowhere on it. Pure.\n */\nexport function copyFindings(\n json: unknown,\n copy: string[],\n formats: string[],\n scrolled: Readonly<Record<string, readonly string[]>> = {},\n): RenderFinding[] {\n if (copy.length === 0) return [];\n const raw = (json as { copy?: unknown } | null)?.copy;\n const reads = Array.isArray(raw)\n ? raw.flatMap((entry) => {\n const parsed = CopyRead.safeParse(entry);\n return parsed.success ? [parsed.data] : [];\n })\n : [];\n return formats.flatMap((format) => {\n const forFormat = reads.filter((r) => r.format === format);\n if (forFormat.length === 0) {\n return [\n {\n severity: \"blocking\" as const,\n what: `${format}: the copy could not be read back; look at every word yourself.`,\n },\n ];\n }\n const gone = scrolled[format] ?? [];\n return copy.flatMap((expected) => {\n if (gone.includes(expected)) return [];\n const read = forFormat.find((r) => comparableCopy(r.string) === comparableCopy(expected));\n const seen = read?.seen ?? null;\n if (seen === null) {\n return [{ severity: \"blocking\" as const, what: `${format}: Text: \"${expected}\" is missing.` }];\n }\n if (comparableCopy(seen) === comparableCopy(expected)) return [];\n return [{ severity: \"blocking\" as const, what: `${format}: Text: \"${expected}\" reads \"${seen}\".` }];\n });\n });\n}\n\nconst EDGE_WORDS: Record<BandEdge, string> = {\n top: \"the top of the screen\",\n bottom: \"the bottom of the screen\",\n left: \"the left edge\",\n right: \"the right edge\",\n};\n\n/**\n * Lines past the band that read as one block: the first, how many lines run under it, and whether\n * every line of it supports the ad rather than carries it (`SUPPORTING_ROLES`).\n */\ntype Misplaced = { violation: BandViolation; under: number; supporting?: boolean };\n\n/** A block as the person names it: the logo, or its first line and how many run under it. */\nfunction blockName(v: BandViolation, under: number): string {\n if (v.kind === \"logo\") return \"the logo\";\n return under > 0 ? `\"${v.text}\" and the ${under === 1 ? \"line\" : `${under} lines`} under it` : `\"${v.text}\"`;\n}\n\n/**\n * Where a block sits past the band, said as the person would see it happen. `storiesToo`: the ad\n * set runs in Stories as well as Reels (`blockingPlacements`).\n */\nfunction outsideBand(\n { violation: v, under }: Misplaced,\n placement: SafeAreaPlacement | \"master\",\n surface: string,\n storiesToo: boolean,\n): string {\n const what = blockName(v, under);\n const sits = under > 0 ? \"sit\" : \"sits\";\n const it = under > 0 ? \"them\" : \"it\";\n const edges = v.edges.map((e) => EDGE_WORDS[e]).join(\" and \");\n if (placement === \"reels\" || placement === \"stories\" || placement === \"vertical\") {\n if (v.reelsOnly) return `in Reels, the caption and buttons cover ${what} (${edges}); Stories shows ${it}.`;\n // A 9:16 that runs in Reels and Stories: what blocks it there is covered in both.\n const names = placement === \"reels\" && storiesToo ? [\"Stories\", ...surface.split(\" and \")] : surface.split(\" and \");\n const apps = names.length > 1 ? `${names.slice(0, -1).join(\", \")} and ${names.at(-1)}` : surface;\n return `${what} ${sits} where ${apps} ${names.length > 1 ? \"cover\" : \"covers\"} ${it} (${edges}).`;\n }\n if (placement === \"master\") return `${what} ${sits} outside the space every size keeps clear (${edges}).`;\n return `${what} ${under > 0 ? \"run\" : \"runs\"} off the edge of the picture (${edges}).`;\n}\n\n/**\n * Past the band is blocking where the interface really draws (`covered`), where the frame cuts\n * it, or where it leaves the space every size of a master keeps clear; only close to where\n * Reels or Stories draws is a note. The feed covers nothing: only words the frame cuts are\n * lost, and words merely close to its edge are no finding at all (audited Sept 2026, every\n * one of them was seen). Null: not worth saying.\n */\nfunction bandSeverity(v: BandViolation, placement: SafeAreaPlacement | \"master\"): RenderFinding[\"severity\"] | null {\n if (placement === \"master\" || v.clearance <= FRAME_CUT) return \"blocking\";\n if (placement === \"feed\") return null;\n // Close to where an app draws is drawn on by nothing (Oct 2026 bench: 19 notes, none seen).\n if (!v.covered) return null;\n return v.reelsOnly ? \"warning\" : \"blocking\";\n}\n\nconst EDGE_ORDER: readonly BandEdge[] = [\"top\", \"bottom\", \"left\", \"right\"];\n\n/** The logo's pieces (its mark, its wordmark) as one violation, reaching every edge any piece does. */\nfunction oneLogo(violations: readonly BandViolation[]): BandViolation[] {\n const logo = violations.filter((v) => v.kind === \"logo\");\n if (logo.length <= 1) return [...violations];\n const edges = EDGE_ORDER.filter((e) => logo.some((v) => v.edges.includes(e)));\n const merged: BandViolation = {\n text: \"\",\n kind: \"logo\",\n edges,\n overshoot: Math.max(...logo.map((v) => v.overshoot)),\n clearance: Math.min(...logo.map((v) => v.clearance)),\n covered: logo.some((v) => v.covered),\n // `every` holds on no pieces at all: only a covered logo can be covered by Reels alone.\n reelsOnly: logo.some((v) => v.covered) && logo.filter((v) => v.covered).every((v) => v.reelsOnly),\n };\n const first = violations.indexOf(logo[0] as BandViolation);\n const rest = violations.filter((v) => v.kind !== \"logo\");\n return [...rest.slice(0, first), merged, ...rest.slice(first)];\n}\n\n/**\n * Each box past the band with its violation, the lines of one column that cross the same\n * edges the same way gathered into one block (reported by its first line), and the logo's\n * pieces as one logo. Pure.\n */\n/** Two boxes with more than a tenth of the frame between them: two things, never pieces of one. */\nconst SEPARATE = 0.1;\nfunction apart(a: TextBox, b: TextBox): boolean {\n const across = Math.max(0, b.x0 - a.x1, a.x0 - b.x1);\n const down = Math.max(0, b.y0 - a.y1, a.y0 - b.y1);\n return Math.max(across, down) > SEPARATE;\n}\n\nfunction misplacedBlocks(\n boxes: readonly TextBox[],\n check: (box: TextBox) => BandViolation | undefined,\n supports: (box: TextBox) => boolean = () => false,\n): Misplaced[] {\n const checked = readingOrder(boxes).map((box) => ({ box, violation: check(box) }));\n // The logo sits where nothing covers it: a separate mark elsewhere is printed on something in the\n // scene (a bag, a van), never the ad's logo (Oct 2026 bench).\n const clearLogos = checked.filter((c) => c.box.kind === \"logo\" && !c.violation).map((c) => c.box);\n const past = checked.flatMap(({ box, violation }) =>\n violation && !(box.kind === \"logo\" && clearLogos.length > 0 && clearLogos.every((l) => apart(l, box)))\n ? [{ box, violation }]\n : [],\n );\n const logos = oneLogo(past.filter((p) => p.violation.kind === \"logo\").map((p) => p.violation));\n const blocks: Array<{\n last: TextBox;\n first: BandViolation;\n under: number;\n worst: BandViolation;\n supporting: boolean;\n }> = [];\n for (const { box, violation } of past.filter((p) => p.violation.kind !== \"logo\")) {\n const open = blocks[blocks.length - 1];\n const same =\n open &&\n continuesColumn(open.last, box) !== null &&\n open.first.covered === violation.covered &&\n Boolean(open.first.reelsOnly) === Boolean(violation.reelsOnly) &&\n open.first.edges.join() === violation.edges.join();\n if (open && same) {\n open.last = box;\n open.under++;\n open.supporting = open.supporting && supports(box);\n if (violation.clearance < open.worst.clearance) open.worst = violation;\n continue;\n }\n blocks.push({ last: box, first: violation, under: 0, worst: violation, supporting: supports(box) });\n }\n return [\n ...blocks.map((b) => ({\n violation: { ...b.first, clearance: b.worst.clearance },\n under: b.under,\n supporting: b.supporting,\n })),\n ...logos.map((violation) => ({ violation, under: 0 })),\n ];\n}\n\n/**\n * What the reader measured on one image, as findings the person can read: each line not\n * printed as written, words nobody asked for, anything the placement's interface covers or\n * the frame cuts (blocking), words close to a feed image's edge and designed type in a\n * colour that is not the brand's (warnings). `band`\n * replaces the format's safe area for a variant, which is checked against the band every\n * size of its master keeps clear. Pure.\n */\nexport function measuredFindings(input: {\n format: string;\n boxes: readonly TextBox[];\n lines: readonly ExpectedLine[];\n /** Strings that may appear without being copy: the brand's name, its wordmark, what the scene prints. */\n allowed?: readonly string[];\n /** The words that are the brand's logo (its name, its wordmark); `allowed` unless given. */\n logoWords?: readonly string[];\n /** A size re-laid out from the chosen picture: its supporting lines are held to their meaning (`loadBearing`). */\n adapted?: boolean;\n /** The ad keeps the brand's logo: a size without it, or with it twice, is noted. */\n expectLogo?: boolean;\n placements?: readonly string[];\n band?: SafeArea;\n offBrand?: readonly OffBrandInk[];\n /** A native screen: the words its own interface prints (a status bar, a keyboard) are the app's, wherever they sit. */\n native?: boolean;\n /** Extra words the decision model says make an offer (\"gratis hoy\", \"送料無料\"): a claim at any size. */\n offers?: ReadonlySet<string>;\n /** The review platform each line cites for its reviews (`citedPlatforms`); what each line shows alone unless given. */\n cited?: Citations;\n}): RenderFinding[] {\n const { format } = input;\n const text = textMismatch(input.lines, input.boxes, { allowed: input.allowed });\n const area = staticSafeArea(format, input.placements);\n const placement = input.band ? \"master\" : area.placement;\n // The brand's name set beside its mark is its wordmark: part of the logo, where it sits.\n const names = (input.logoWords ?? input.allowed ?? []).filter((n) => normalizeCopy(n).length > 0);\n const placed = withWordmark(input.boxes, names);\n const bandOpts = {\n ...(input.placements ? { placements: input.placements } : {}),\n ...(input.band ? { band: input.band } : {}),\n };\n const copyBoxes = new Set(input.lines.flatMap((line) => boxesOfLine(line, input.boxes)));\n // Only the ad's own words and its logo are measured against the interface (`must-show.ts`).\n const shown = shownBoxes(placed, input.lines, (box) => bandViolations([box], format, bandOpts).length === 0).filter(\n (s) => !(input.native && s.box.kind === \"text\" && interfaceWord(s.box.text, input.allowed)),\n );\n const supporting = new Set(shown.filter((s) => s.supporting).map((s) => s.box));\n const storiesToo = blockingPlacements(input.placements).includes(\"stories\");\n const misplaced = misplacedBlocks(\n shown.map((s) => s.box),\n (box) => {\n const v = bandViolations([box], format, bandOpts)[0];\n // A 9:16 runs in Stories as well: under Reels' footer alone it is still seen there (`blockingArea`).\n if (!v?.covered || placement !== \"reels\") return v;\n const blocked = bandViolations([box], format, { placements: blockingPlacements(input.placements) })[0];\n // Said at the edges Stories covers it at: Reels' buttons down the right are Reels' alone.\n return blocked?.covered ? { ...v, edges: blocked.edges } : { ...v, reelsOnly: true };\n },\n (box) => supporting.has(box),\n );\n const lead = leadLine(input.lines);\n const isLead = (v: BandViolation) =>\n v.kind !== \"logo\" && lead !== undefined && ` ${normalizeCopy(lead.text)} `.includes(` ${normalizeCopy(v.text)} `);\n const blocking = (what: string): RenderFinding => ({ severity: \"blocking\", what: `${format}: ${what}` });\n const small = leadTooSmall(format, input.lines, input.boxes);\n // The brand's wordmark is the logo, never a word of a line that starts with the brand's name (Oct 2026 bench).\n const scale = typeScaleFindings(format, input.lines, placed);\n const logos = input.expectLogo ? logoCountFinding(placed) : null;\n const said = (l: LineMismatch) =>\n l.read === null ? `Text: \"${l.text}\" is missing.` : `Text: \"${l.text}\" reads \"${l.read}\".`;\n const misspelt = misspeltNames([...placed.filter((b) => b.kind === \"logo\").map((b) => b.text), ...text.extra], names);\n const unasked = text.extra.filter(\n (chunk) =>\n // A symbol with no word or number (\"€\", \"%\") is a mark beside one, never copy (Oct 2026 bench).\n /[\\p{L}\\p{N}]/u.test(chunk) &&\n !misspelt.some((m) => m.chunk === chunk) &&\n // The logo read in pieces (\"EALDE\", then \"Business School\" under it) is the logo.\n !fragmentOf(chunk, names, { share: 1, cut: input.native === true }) &&\n !(input.native && (fragmentOf(chunk, input.allowed ?? [], { cut: true }) || crumb(chunk))),\n );\n // A line of the copy printed again (a headline repeated on a screen in the scene) is said twice, not invented.\n const copyTexts = input.lines.map((l) => l.text);\n const echoes = unasked.filter((chunk) => fragmentOf(chunk, copyTexts, { share: 0.8, cut: input.native === true }));\n // Only most of a line said again is worth saying; a word or two of it on a screen or a label in\n // the scene is the scene (Oct 2026 bench: 8 of 9 \"printed twice\" were a prop echoing the copy).\n const twice = echoes.filter((chunk) => mostOfALine(chunk, copyTexts));\n const extra = unasked.filter((chunk) => !echoes.includes(chunk));\n return [\n ...text.lines.flatMap((l): RenderFinding[] => {\n // A native screen's words are typeset from the spec: one read otherwise is the reader running a\n // line into the card behind it (Oct 2026 bench), never the screen. A line it lost still counts.\n if (input.native && l.read !== null) return [];\n if (!input.adapted || loadBearing(l)) return [blocking(said(l))];\n // A re-laid-out size may reword a supporting line: it passes on its meaning, and a note says what changed.\n return l.similarity >= MEANING_MATCH ? [] : [{ severity: \"warning\", what: `${format}: ${said(l)}` }];\n }),\n ...extraWordFindings(format, extra, input.boxes, [...copyBoxes], input.offers ?? new Set()),\n ...twice.map(\n (t): RenderFinding => ({ severity: \"warning\", what: `${format}: \"${t}\" is on the ad twice; keep it once.` }),\n ),\n ...misspelt.map((m) => blocking(`the brand's name reads \"${m.read}\", not \"${m.name}\".`)),\n ...unbadgedClaims(input.lines, input.boxes, input.cited).map((c) =>\n blocking(\n `\"${c.line}\" names ${c.platform}, but ${c.platform}'s logo is not on the ad: show its real badge, or drop the claim.`,\n ),\n ),\n // A native screen is laid out as its app lays it out: only what the interface really covers is a defect.\n ...(input.native ? misplaced.filter((m) => m.violation.covered) : misplaced).flatMap((m): RenderFinding[] => {\n // A 9:16 is laid out in Stories' band: under Reels' caption alone, only the lead line is worth saying.\n if (m.violation.reelsOnly && !isLead(m.violation)) return [];\n const severity = bandSeverity(m.violation, placement);\n if (!severity) return [];\n const what = `${format}: ${outsideBand(m, placement, area.surface, storiesToo)}`;\n // A supporting line under an interface is the ad's choice; one the frame cuts, or a master's band, is not.\n const optional =\n severity === \"blocking\" && m.supporting && placement !== \"master\" && m.violation.clearance > FRAME_CUT;\n return optional\n ? [{ severity: \"warning\", what: `${what} Fine for a supporting line nobody has to read.` }]\n : [{ severity, what }];\n }),\n ...(small ? [blocking(`the lead line \"${small}\" is too small to read at the size the feed shows the ad.`)] : []),\n ...scale.map((what): RenderFinding => ({ severity: \"warning\", what: `${format}: ${what}` })),\n ...(logos ? [{ severity: \"warning\" as const, what: `${format}: ${logos}` }] : []),\n ...(input.offBrand ?? []).map(\n (ink): RenderFinding => ({\n severity: \"warning\",\n what: `${format}: \"${ink.text}\" is set in a colour that is not one of the brand's.`,\n }),\n ),\n ];\n}\n\n/** The line the ad leads with: its key figure, else its headline. */\nfunction leadLine(lines: readonly ExpectedLine[]): ExpectedLine | undefined {\n return lines.find((l) => FIGURE_ROLES.has(roleKey(l.role))) ?? lines.find((l) => HEADLINE_ROLES.has(roleKey(l.role)));\n}\n\n/** Roles whose line leads the ad: the key figure first, else the headline (`static-brief.ts` ranks them so). */\nconst FIGURE_ROLES = new Set([\"price\", \"stat\", \"figure\", \"number\", \"discount\"]);\nconst HEADLINE_ROLES = new Set([\"headline\", \"title\"]);\n\n/**\n * The fewest pixels a lead line's letters may stand at the width a feed shows the ad\n * (`THUMBNAIL_WIDTH`): below it the line cannot be read in passing.\n */\nconst LEAD_MIN_PX = 9;\n\n/**\n * The lead line, when it is printed too small to read at the size the feed shows the ad: its\n * tallest box under `LEAD_MIN_PX` at `THUMBNAIL_WIDTH`. Measured, never asked: the review model\n * called the largest words on screen \"too small\" (audited Sept 2026). Null when the ad names no\n * lead, or it was not found (the copy check reports that).\n */\nfunction leadTooSmall(format: string, lines: readonly ExpectedLine[], boxes: readonly TextBox[]): string | null {\n const ratio = ratioOf(format);\n if (ratio === null) return null;\n const lead =\n lines.find((l) => FIGURE_ROLES.has(roleKey(l.role))) ?? lines.find((l) => HEADLINE_ROLES.has(roleKey(l.role)));\n if (!lead) return null;\n const found = boxesOfLine(lead, boxes);\n if (found.length === 0) return null;\n const tallest = Math.max(...found.map((b) => b.y1 - b.y0));\n const thumbnailHeight = THUMBNAIL_WIDTH / ratio;\n return tallest * thumbnailHeight < LEAD_MIN_PX ? lead.text : null;\n}\n\n/**\n * Roles whose words must print exactly on every size: what is offered and what it costs, the\n * button, a promise or a rating, who said a quote and what they said, the small print.\n */\nconst LOAD_BEARING_ROLES = new Set([\n ...FIGURE_ROLES,\n ...HEADLINE_ROLES,\n \"cta\",\n \"button\",\n \"call_to_action\",\n \"offer\",\n \"claim\",\n \"rating\",\n \"quote\",\n \"testimonial\",\n \"attribution\",\n \"badge\",\n \"fine_print\",\n \"legal\",\n \"disclaimer\",\n \"footnote\",\n]);\n\n/** How close a supporting line on a re-laid-out size must read to pass on its meaning. */\nconst MEANING_MATCH = 0.8;\n\n/** Whether a line must print to the letter on every size: a load-bearing role, or any figure (a claim). */\nfunction loadBearing(line: ExpectedLine): boolean {\n return LOAD_BEARING_ROLES.has(roleKey(line.role)) || /[\\d%€$£]/.test(line.text);\n}\n\n/** A string with its accents off, to tell a misspelling from a name set without its accent (\"Kampe\" for \"Kämpe\"). */\nconst folded = (text: string): string => normalizeCopy(text).normalize(\"NFD\").replace(/\\p{M}/gu, \"\");\n\n/** How close a read must be to the brand's name to be that name misspelt rather than another word. */\nconst MISSPELT_NAME = 0.7;\n\n/**\n * The brand's name printed misspelt: a run of words in the logo or among the words nobody asked\n * for, as long as the name, that reads close to it and is not it (audited Sept 2026: the logo\n * read \"zenio\" and was reported only as an extra word). A name set without its accent is the\n * name. Pure.\n */\nfunction misspeltNames(\n texts: readonly string[],\n names: readonly string[],\n): Array<{ chunk: string; read: string; name: string }> {\n const out: Array<{ chunk: string; read: string; name: string }> = [];\n // The brand and its wordmark often give one name twice (\"Permut\", \"permut\"): it is said once.\n const distinct = names.filter((name, i) => names.findIndex((n) => folded(n) === folded(name)) === i);\n for (const chunk of texts) {\n const words = folded(chunk).split(\" \").filter(Boolean);\n for (const name of distinct) {\n const want = folded(name);\n const size = want.split(\" \").length;\n if (want.length < 4) continue;\n for (let i = 0; i + size <= words.length; i++) {\n const read = words.slice(i, i + size).join(\" \");\n if (read === want || copySimilarity(read, want) < MISSPELT_NAME) continue;\n out.push({ chunk, read, name });\n break;\n }\n }\n }\n return out;\n}\n\n/**\n * Copy lines that name a review platform as the source of a rating or reviews while nothing on\n * the ad is that platform's badge: a logo box, or a box that is only its name, never the claim's\n * own words. Pure.\n */\nfunction unbadgedClaims(\n lines: readonly ExpectedLine[],\n boxes: readonly TextBox[],\n cited?: Citations,\n): Array<{ line: string; platform: string }> {\n return lines.flatMap((line) => {\n const platform = citedBy(line.text, cited);\n if (!platform) return [];\n // The copy's own mentions of the name are read once each, whole or split off: a box that is\n // only the name and read more often than every line together says it is a badge the reader took for text.\n const naming = boxes.filter((b) => b.kind === \"text\" && namedPlatform(b.text) === platform);\n const mentions = new RegExp(platform.pattern.source, `${platform.pattern.flags}g`);\n const said = lines.reduce((n, l) => n + (l.text.match(mentions) ?? []).length, 0);\n const badge =\n boxes.some((b) => b.kind === \"logo\" && namedPlatform(b.text) === platform) ||\n (naming.length > said && naming.some((b) => normalizeCopy(b.text).split(\" \").length <= 3));\n return badge ? [] : [{ line: line.text, platform: platform.name }];\n });\n}\n\nconst BUTTON_ROLES = new Set([\"cta\", \"button\", \"call_to_action\"]);\nconst FINE_PRINT_ROLES = new Set([\"fine_print\", \"legal\", \"disclaimer\", \"footnote\"]);\n\n/** The width a phone shows a static ad at, in CSS pixels (`glance-check.ts` `GLANCE_WIDTH`). */\nconst PHONE_WIDTH = 400;\n/**\n * A supporting line's box under this many pixels at `PHONE_WIDTH` cannot be read in passing. Oct\n * 2026 bench: at 7, a city's name with no descender (\"Cali\") failed beside ones set the same.\n */\nconst LINE_MIN_PX = 6;\n/** How much taller a supporting line must be than the lead to read as the lead itself. */\nconst INVERTED = 1.15;\n\nconst tallest = (line: ExpectedLine, boxes: readonly TextBox[]): number | null => {\n const found = boxesOfLine(line, boxes);\n return found.length > 0 ? Math.max(...found.map((b) => b.y1 - b.y0)) : null;\n};\n\n/**\n * The type scale as measured: the lead line set smaller than a supporting line (the hierarchy\n * upside down: audited Sept 2026), and supporting lines too small to read on a phone (the fine\n * print is meant to be small). Notes, never blocking. Pure.\n */\nfunction typeScaleFindings(format: string, lines: readonly ExpectedLine[], boxes: readonly TextBox[]): string[] {\n const ratio = ratioOf(format);\n if (ratio === null) return [];\n const lead = leadLine(lines);\n // A headline set over two lines is two headline lines: one headline, never its own support.\n const leadsWithHeadline = lead !== undefined && HEADLINE_ROLES.has(roleKey(lead.role));\n const supporting = lines.filter(\n (l) =>\n l !== lead &&\n !(leadsWithHeadline && HEADLINE_ROLES.has(roleKey(l.role))) &&\n l.lettering === \"designed\" &&\n !BUTTON_ROLES.has(roleKey(l.role)) &&\n !FINE_PRINT_ROLES.has(roleKey(l.role)),\n );\n const out: string[] = [];\n const leadHeight = lead ? tallest(lead, boxes) : null;\n if (lead && leadHeight !== null) {\n const bigger = supporting\n .map((l) => ({ l, h: tallest(l, boxes) }))\n .filter((x): x is { l: ExpectedLine; h: number } => x.h !== null && x.h > leadHeight * INVERTED)\n .sort((a, b) => b.h - a.h)[0];\n if (bigger)\n out.push(`the main line \"${lead.text}\" is smaller than \"${bigger.l.text}\", so people read the wrong line first.`);\n }\n const phoneHeight = PHONE_WIDTH / ratio;\n const small = supporting.filter((line) => {\n const h = tallest(line, boxes);\n return h !== null && h * phoneHeight < LINE_MIN_PX;\n });\n // Once per size: a small phone mock-up's chat came back as one note per message (Oct 2026 bench).\n const [only] = small;\n if (small.length === 1 && only) out.push(`\"${only.text}\" is hard to read on a phone; make it bigger.`);\n if (small.length > 1) {\n out.push(\n `${small.length} lines are hard to read on a phone (${small.map((l) => `\"${l.text}\"`).join(\", \")}); make them bigger.`,\n );\n }\n return out;\n}\n\n/** A mark under this share of the logo's area is printed on something in the scene, not the logo again. */\nconst SCENE_MARK_SHARE = 0.25;\n\n/** Two logo boxes this close (share of the frame) are one logo: a mark and its wordmark. */\nconst LOGO_GAP = 0.05;\n\n/**\n * The brand's logo on one size, counted: none (the ad keeps it, and this size lost it) or more\n * than one place (audited Sept 2026: the name twice, the logo in the header and the body). Pure.\n */\nfunction logoCountFinding(boxes: readonly TextBox[]): string | null {\n const logos = boxes.filter((b) => b.kind === \"logo\");\n const near = (a: TextBox, b: TextBox) =>\n Math.max(a.x0 - b.x1, b.x0 - a.x1, 0) <= LOGO_GAP && Math.max(a.y0 - b.y1, b.y0 - a.y1, 0) <= LOGO_GAP;\n const clusters: TextBox[][] = [];\n for (const box of logos) {\n const joined = clusters.filter((c) => c.some((b) => near(b, box)));\n const merged = [box, ...joined.flat()];\n for (const c of joined) clusters.splice(clusters.indexOf(c), 1);\n clusters.push(merged);\n }\n if (clusters.length === 0) return \"the brand's logo is not on it.\";\n // A mark far smaller than the logo is printed on something in the scene (a hoodie, a courier's\n // bag: Oct 2026 bench), never the logo set twice.\n const area = (c: TextBox[]) =>\n (Math.max(...c.map((b) => b.x1)) - Math.min(...c.map((b) => b.x0))) *\n (Math.max(...c.map((b) => b.y1)) - Math.min(...c.map((b) => b.y0)));\n const largest = Math.max(...clusters.map(area));\n const set = clusters.filter((c) => area(c) >= largest * SCENE_MARK_SHARE).length;\n return set > 1 ? `the logo is on the ad ${set} times; keep it once.` : null;\n}\n\nexport type StaticVerdict = \"ready\" | \"ready_with_notes\" | \"needs_fixes\" | \"not_reviewed\";\n\n/** What the run may say about itself once the review is in. */\nexport function staticVerdict(findings: RenderFinding[] | null): StaticVerdict {\n if (findings === null) return \"not_reviewed\";\n if (findings.some((f) => f.severity === \"blocking\")) return \"needs_fixes\";\n return findings.length > 0 ? \"ready_with_notes\" : \"ready\";\n}\n\n/** What the review model is asked about the words: transcribe them, or (measured) only their glyphs. */\nfunction textInstructions(copy: readonly string[], measured: boolean): string[] {\n const wordless =\n \"This ad has no words on purpose: the picture is the ad. Do not report missing copy, a missing headline or a missing call to action.\";\n if (measured) {\n return [\n ...(copy.length === 0 ? [wordless] : []),\n \"The words were already read back and measured by another check: do not transcribe them or report their spelling, extra words or position.\",\n \"1. TEXT: garbled or malformed letters, or letters that do not read as words (a brand name inside a drawn logo is fine).\",\n ];\n }\n if (copy.length > 0) {\n return [\n \"First, transcribe the copy. On every full-size image, find each of these strings and copy out EXACTLY what is printed there, character for character (accents, case, punctuation), or null when nothing like it is there:\",\n copy.map((c) => `- \"${c}\"`).join(\"\\n\"),\n \"1. TEXT: extra words that are not in the list, a string shown twice, or garbled letters (a brand name inside a drawn logo is fine).\",\n ];\n }\n return [wordless, \"1. TEXT: any letters or words that appear anyway (invented or garbled text is blocking).\"];\n}\n\n/** What the review prompt is told about the ad. */\nexport type StaticReviewPromptOpts = {\n copy: string[];\n formats: string[];\n brand?: string;\n /** The concept carries a logo and the real file was given to the model. Without one no logo is expected. */\n logo?: boolean;\n /** Each format is also shown at phone-feed thumbnail size, after the full-size images. */\n thumbnails?: boolean;\n /** The devices the concept rests on (its winning mechanisms), to check they survived. */\n mechanisms?: string[];\n /** Who the ad reaches, in one phrase (`describeViewer`): the finished ad is read as them. */\n viewer?: string;\n /**\n * What the ad keeps of the reference it is built on (C7): its load-bearing elements with what of\n * ours carries each, and the trick, checked against the reference shown as the last image.\n */\n concept?: { mustKeep: readonly string[]; idea?: string };\n /**\n * The ad is a native screen drawn exactly from HTML (`native-surface.ts`), named as a viewer\n * would (\"a post on X\"): its interface is meant, and only its photos were painted.\n */\n native?: string;\n /**\n * The box reader already read every word and measured where it sits on every image\n * (`measuredFindings`): the model is not asked to transcribe or to measure the safe\n * zones, which it did by eye.\n */\n measured?: boolean;\n /** Real people the copy names whom the ad was given no photo of: any face shown as them is a stranger. */\n uncastPeople?: readonly string[];\n};\n\n/** The safe-zone item, asked of the model only when nothing measured the boxes. */\nfunction storiesItem(opts: StaticReviewPromptOpts): string[] {\n if (opts.measured || !opts.formats.includes(\"9:16\")) return [];\n const vertical = staticSafeArea(\"9:16\");\n const name = vertical.placement === \"reels\" ? \"REELS AND STORIES\" : vertical.surface.toUpperCase();\n return [\n `4. ${name}: on the 9:16 image, text, a logo or a button that exists clearly inside the top ${Math.round(vertical.top * 100)}% or the bottom ${Math.round(vertical.bottom * 100)}% of the frame (measure it; an element that starts below the top line is fine).`,\n ];\n}\n\n/** What the ad keeps of its reference (C7), else the devices it is built on, as a warning. */\nfunction conceptItem(opts: StaticReviewPromptOpts): string[] {\n const concept = opts.concept && opts.concept.mustKeep.length > 0 ? opts.concept : undefined;\n if (concept) {\n return [\n `8. CONCEPT: the last image is the ad this one is built on, shown only to compare (never judge its words, brand or people, which are another advertiser's). On every size, check the finished ad still carries each of these: ${concept.mustKeep.join(\"; \")}${concept.idea ? `, and still works by the same trick: ${concept.idea}` : \"\"}. Judge each by the role it plays, never by the form the reference gave it (a newspaper on a desk carries a newspaper held in hands; other words carry the same pain): an element is carried when the ad does its job, and what people are doing, how many there are, the setting or the visual style is never a finding. The trick is how the ad persuades, never a look it must have. One element missing is blocking: name it, in a sentence a marketer reads (what the ad no longer does), never a list of details.`,\n ];\n }\n return opts.mechanisms && opts.mechanisms.length > 0\n ? [`8. CONCEPT: the ad no longer carries these devices it is built on (warning): ${opts.mechanisms.join(\"; \")}.`]\n : [];\n}\n\n/** The viewer, the lead line at thumbnail size and the sizes, each only when it applies. */\nfunction contextItems(opts: StaticReviewPromptOpts): {\n viewer: string[];\n thumbnail: string[];\n sizes: string[];\n} {\n return {\n // The pre-render viewer check read the copy and a description of the picture; this reads\n // the picture. A warning: the render is paid for, and the copy already passed that viewer.\n viewer: opts.viewer\n ? [\n `9. VIEWER: seen by ${opts.viewer}, the finished ad does not show what is offered, to whom, and what to do next (warning).`,\n ]\n : [],\n // Measured, the lead's size is checked on its boxes (`leadTooSmall`): the model's call was wrong on most flags.\n thumbnail: opts.measured\n ? []\n : [\n opts.thumbnails\n ? \"7. THUMBNAIL: at thumbnail size the lead line (the largest words) cannot be read. Judge only whether those words can be read, nothing else. That is blocking: most people only ever see the ad that small.\"\n : \"7. THUMBNAIL: the lead line (the largest words) would be unreadable on a phone feed. That is blocking.\",\n ],\n sizes:\n opts.formats.length > 1\n ? [\n \"12. SIZES: one size loses what the others are built on: the letter sheet, the email or chat window, the post card, the comic's panels and their order, the product the ad is about (blocking; report it on the size that differs). A size that shows more of the scene (words on a prop now readable, more of the room), or is arranged, sized or decorated differently for its shape (a title without its frame, an extra brand shape filling the height), is never a finding.\",\n ]\n : [],\n };\n}\n\n/** How the model types each finding (`FindingKind`): the code grades and corrects on these, never on its words. */\nconst FINDING_FIELDS =\n 'For each finding also give: \"item\", the item above it answers, in lower case (TEXT → \"text\", ONE IDEA → \"one_idea\", the 9:16 safe-zone item → \"safe_zone\"); \"element\", what on the ad it is about (\"copy\" the ad\\'s own words, \"button\", \"logo\", \"scene_text\" words or figures printed on something in the picture that are not the copy, \"picture\" anything else drawn, else \"other\"); \"defect\" (\"cut\" when the frame\\'s edge cuts it, \"missing\" when it is not there, \"unreadable\" when it is too blurred or small to read, else \"other\"); \"edges\", the frame edges that cut it, [] unless \"cut\". Write \"what\" without a label.';\n\n/**\n * The review prompt, built on what makes a static win rather than on a checklist of\n * elements: one idea read at a glance on a phone, the words spelled right, the brand known\n * with the logo covered, nothing clipped, no artifacts. An ad with no logo, no call to\n * action or no copy at all is not missing anything; only what the concept holds is checked.\n */\nexport function buildStaticReviewPrompt(opts: StaticReviewPromptOpts): string {\n const brand = opts.brand ? ` for ${opts.brand}` : \"\";\n const order = opts.formats.join(\", \");\n const shown = opts.thumbnails\n ? `These are the finished versions of ONE static advertisement${brand}, in this order: ${order}. After them come the same versions again, in the same order, shrunk to phone-feed thumbnail size (about 240px wide).`\n : `These are the finished versions of ONE static advertisement${brand}, in this order: ${order}.`;\n const text = textInstructions(opts.copy, opts.measured === true);\n const logo = opts.native\n ? `2. LOGO: the brand's logo appears where ${opts.native} shows it (an avatar, a sender's picture, a summary card), possibly more than once: report it only when distorted or cut.`\n : opts.logo\n ? \"2. LOGO: the brand logo distorted, redrawn in another style, cut off, or set twice as the ad's logo. The brand's mark printed on something in the scene (clothing, a bag, a van, packaging) is the scene, never a second logo; call it mirrored only when its letters read backwards.\"\n : \"2. LOGO: this ad carries no logo on purpose (the platform shows the brand's name and picture); never report a missing logo. A made-up logo or wordmark in the picture is blocking.\";\n const { viewer, thumbnail, sizes } = contextItems(opts);\n const copyShape =\n opts.copy.length > 0 && !opts.measured\n ? ',\"copy\":[{\"format\":\"4:5\",\"string\":\"<a listed string>\",\"seen\":\"<what is printed>|null\"}]'\n : \"\";\n return [\n shown,\n ...text,\n \"\",\n \"Then report, per format, only what is actually wrong:\",\n logo,\n \"3. LAYOUT: anything the ad shows clipped by the frame edge (part of a word, the logo, a button, the product or a face cut away; an element whole but near the edge is not clipped, and scenery the frame crops as any photo does is the picture), overlapping, or unreadable against what is behind it.\",\n ...storiesItem(opts),\n // Tier 0, Oct 2026: the real defects were where a size was extended; 8 of 8 hand claims checked were wrong.\n \"5. PICTURE: a ghost, a smear, a seam, a blurred strip, a duplicated or mirrored object, or garbled pseudo-text in focus where a viewer reads it, typically where the picture was extended to fill a size (blocking). Text out of focus in the background (a screen, a shelf of books) is the scene; an ordinary object a viewer would not stop at on a phone is not malformed.\",\n \"5a. SUBJECT: the ad's subject (its pet, person or product) shown more than once as visibly different ones where the ad means one, or a second, different subject beside it that leaves a viewer asking whose story it is (blocking).\",\n ...(opts.uncastPeople && opts.uncastPeople.length > 0\n ? [\n `5c. PERSON: the copy names ${opts.uncastPeople.join(\" and \")}, real, and this ad was given no photo of them: a face shown as them or beside their name is a stranger wearing that name (blocking).`,\n ]\n : []),\n \"5b. PEOPLE: a person's hands, face or body drawn so wrong a viewer would notice at a glance on a phone (warning). Never a detail you have to zoom in to see.\",\n \"6. ONE IDEA: two or more elements compete equally for the eye, so no single promise leads (warning).\",\n ...thumbnail,\n ...conceptItem(opts),\n ...viewer,\n \"11. PROOF: stars, a rating or reviews shown while the ad names no source for them anywhere (a review platform, a survey such as CSAT or NPS, a study), so the rating has no source (blocking).\",\n ...sizes,\n ...(opts.native\n ? [\n `13. NATIVE: this ad is ${opts.native}, drawn exactly as the platform shows it: its interface, names, handles, times and counts are meant to be there, and whatever of them it leaves out is left out on purpose (never report the interface as wrong, incomplete or clipped); on a 9:16 the app fills the screen as a phone shows it, its bars and the card with the brand's headline included, and a chat's earliest messages scrolled up under the header are meant; on a wall of reviews the cards piled behind and cut by the frame's edges are the pile, never cut-off copy; the platform prints its own button under the ad, so never report a missing call to action. Report a photo in it that looks AI-made or staged rather than a real person's (blocking when a face is plainly AI-made), or that does not show what the words say (warning).`,\n ]\n : []),\n \"Blocking = it cannot ship as is (a broken logo, clipped content, a ghost or smear in the picture). Warning = it can ship but should improve.\",\n \"Never report an element as missing because ads usually have one: judge only what this concept holds. An empty findings list is the right answer for a clean ad. Keep each item under twenty words.\",\n FINDING_FIELDS,\n `Reply with only this JSON: {\"findings\":[{\"severity\":\"blocking|warning\",\"format\":\"4:5\",\"item\":\"${STATIC_REVIEW_ITEMS.join(\"|\")}\",\"element\":\"${FINDING_ELEMENTS.join(\"|\")}\",\"defect\":\"${FINDING_DEFECTS.join(\"|\")}\",\"edges\":[\"${FRAME_EDGES.join(\"|\")}\"],\"what\":\"...\"}]${copyShape}}`,\n ].join(\"\\n\");\n}\n\n/**\n * How much smaller than the copy an extra word must be set to read as something in the scene (a\n * mug's print, a notebook's scribble) rather than copy: a note, never a block. Tier 1, Oct 2026: a\n * mug's \"Good code, better days\" blocked a newspaper ad.\n */\nconst SCENE_PRINT_SCALE = 0.45;\n/**\n * This many extra lines, each set smaller than every line of copy, are a screen or a document in\n * the scene (code on a laptop, a quote's items), never copy. Oct 2026 bench: a laptop's code, set\n * at 0.45-0.8 of the smallest copy line, blocked a quote ad twice and its erasing left a blank screen.\n */\nconst SCENE_BLOCK_LINES = 3;\n\n/** The share of a copy line's words a repeat must say again to be the line printed twice. */\nconst LINE_REPEAT_SHARE = 0.6;\n\n/** `chunk` says most of one copy line's words again. Pure. */\nfunction mostOfALine(chunk: string, copy: readonly string[]): boolean {\n const wordsOf = (text: string) =>\n normalizeCopy(text)\n .split(\" \")\n .filter((w) => /[\\p{L}\\p{N}]/u.test(w));\n const said = new Set(wordsOf(chunk));\n return copy.some((line) => {\n // Only words count: \"7.300 €\" shares a sign and \"300\" with \"85.300 €\", and is another price.\n const words = wordsOf(line);\n return words.length > 0 && words.filter((w) => said.has(w)).length / words.length >= LINE_REPEAT_SHARE;\n });\n}\n\n/** Words that make a claim of their own: a currency or percent sign, or an offer the decision model named (`offers`). A bare digit is a calculator key or a date. */\nconst SIGN_CLAIM = /[%\\p{Sc}]/u;\n\n/**\n * A price: a currency sign beside a figure. Drawn anywhere the copy does not hold it, it is a price\n * nobody wrote, however small (Dev, Oct 2026: a quote's \"£12,480\", above every price the company\n * records, and a bill's invented \"£423.17\" shipped as notes on documents in the scene).\n */\nconst PRICE = /[€$£]\\s?\\d|\\d\\s?[€$£]/;\n\n/** How close to the copy's usual size extra words must be set to read as copy, for a claim. */\nconst COPY_SIZE_SHARE = 0.8;\n\n/**\n * How close to the copy's tallest line extra words must be set to read as a headline nobody wrote.\n * Prod, Oct 2026: against the copy's usual size, a phone's chat bubbles and a notebook's note sat on\n * the line, and two reads of one picture blocked different bubbles.\n */\nconst HEADLINE_SIZE_SHARE = 0.8;\n\n/**\n * Extra words: blocking when set at headline size, when they make a claim (a figure, an offer) and\n * are not tiny, or when they show a price at any size; a note otherwise, as words on a screen, a\n * chat, a poster or a mug in the scene (Oct 2026 bench: a poster, a phone's bubbles and a laptop's\n * code blocked 4 ads). Words the reader gave no box are a note. Pure.\n */\nfunction extraWordFindings(\n format: string,\n extra: readonly string[],\n boxes: readonly TextBox[],\n copyBoxes: readonly TextBox[],\n offers: ReadonlySet<string>,\n): RenderFinding[] {\n if (extra.length === 0) return [];\n const heights = copyBoxes.map((b) => b.y1 - b.y0).filter((h) => h > 0);\n const smallest = heights.length > 0 ? Math.min(...heights) : 0;\n const boxOf = (chunk: string) =>\n boxes.find((b) => b.kind === \"text\" && normalizeCopy(b.text).includes(normalizeCopy(chunk)));\n const height = (chunk: string) => {\n const box = boxOf(chunk);\n return box === undefined ? null : box.y1 - box.y0;\n };\n const sorted = [...heights].sort((a, b) => a - b);\n const usual = sorted[Math.floor(sorted.length / 2)] ?? 0;\n const tallest = sorted.at(-1) ?? 0;\n const underCopy = extra.filter((chunk) => (height(chunk) ?? 0) < usual * COPY_SIZE_SHARE);\n const scenery = (chunk: string) => {\n const h = height(chunk);\n return (\n (h !== null && h < smallest * SCENE_PRINT_SCALE) ||\n (underCopy.length >= SCENE_BLOCK_LINES && underCopy.includes(chunk))\n );\n };\n const belowHeadline = (chunk: string) => (height(chunk) ?? 0) < tallest * HEADLINE_SIZE_SHARE;\n const offered = new Set([...offers].map(normalizeCopy));\n const claims = (chunk: string) => SIGN_CLAIM.test(chunk) || offered.has(normalizeCopy(chunk));\n const printed = (chunk: string) =>\n usual > 0 && belowHeadline(chunk) && (!claims(chunk) || (underCopy.includes(chunk) && scenery(chunk)));\n const quote = (chunks: readonly string[]) => chunks.map((e) => `\"${e}\"`).join(\", \");\n const asCopy = extra.filter((chunk) => !printed(chunk));\n const prices = extra.filter((chunk) => printed(chunk) && PRICE.test(chunk));\n const inScene = extra.filter((chunk) => printed(chunk) && !prices.includes(chunk));\n return [\n ...(asCopy.length > 0\n ? [\n {\n severity: \"blocking\" as const,\n // `static-autofix.ts` EXTRA_WORDS reads this sentence to erase them.\n what: `${format}: the picture adds words that aren't in the copy: ${quote(asCopy)}. Remove them, or add them to the copy.`,\n },\n ]\n : []),\n ...(prices.length > 0\n ? [\n {\n severity: \"blocking\" as const,\n // `static-autofix.ts` SCENE_PRICES reads this sentence to blur them.\n what: `${format}: the picture shows prices the copy does not hold: ${quote(prices)}. Make them unreadable.`,\n },\n ]\n : []),\n ...(inScene.length > 0\n ? [\n {\n severity: \"warning\" as const,\n what: `${format}: words drawn in the scene, not in the copy: ${quote(inScene)}. Fine if they belong there.`,\n },\n ]\n : []),\n ];\n}\n\n/** Bits of 64 two dHashes may differ by and still be one picture: a re-encode, not a change. */\nconst SAME_PICTURE_BITS = 4;\n\nfunction hammingHex(a: string, b: string): number {\n let bits = 0;\n for (let i = 0; i < Math.min(a.length, b.length); i++) {\n let x = Number.parseInt(a[i] ?? \"0\", 16) ^ Number.parseInt(b[i] ?? \"0\", 16);\n while (x) {\n bits += x & 1;\n x >>= 1;\n }\n }\n return bits;\n}\n\n/**\n * Each size whose picture is the previous attempt's again (dHash within `SAME_PICTURE_BITS`):\n * a retry that changed nothing, said so the next one changes the spec or the remedy rather\n * than paying for the same picture a third time. A note, never blocking.\n */\nexport async function nearIdenticalFindings(\n current: ReadonlyArray<{ path: string; format: string }>,\n previous: ReadonlyArray<{ path: string; format: string }>,\n): Promise<RenderFinding[]> {\n const hash = async (source: string) => perceptualHash(await bytesOf(source).catch(() => Buffer.alloc(0)));\n const out: RenderFinding[] = [];\n for (const image of current) {\n const before = previous.find((p) => p.format === image.format);\n if (!before) continue;\n const [a, b] = await Promise.all([hash(image.path), hash(before.path)]);\n if (a === null || b === null || hammingHex(a, b) > SAME_PICTURE_BITS) continue;\n out.push({\n severity: \"warning\",\n what: `${image.format}: near-identical to the previous attempt: this retry changed nothing. Change what prompt.json asks for, or use a different fix, rather than running it again.`,\n });\n }\n return out;\n}\n\n/**\n * The sizes whose delivered file is `previous`'s byte for byte: the ones a round did not touch\n * (their nodes came from the cache). Bytes, never a perceptual hash: four words erased move a\n * dHash by less than a re-encode does, and a fixed size must never be read as the old one.\n */\nexport async function samePictureSizes(\n current: ReadonlyArray<{ path: string; format: string }>,\n previous: ReadonlyArray<{ path: string; format: string }>,\n): Promise<string[]> {\n const digest = async (source: string) =>\n createHash(\"sha256\")\n .update(await bytesOf(source).catch(() => Buffer.from(source)))\n .digest(\"hex\");\n const same: string[] = [];\n for (const image of current) {\n const before = previous.find((p) => p.format === image.format);\n if (before && (await digest(image.path)) === (await digest(before.path))) same.push(image.format);\n }\n return same;\n}\n\n/** A box this close to an edge (share of the frame) is at it: a claim it is clipped there is believed. */\nconst AT_EDGE = 0.025;\n\n/** How far a box sits from each edge it may be claimed to be clipped at. */\nconst clearanceTo = (b: TextBox, edge: BandEdge): number =>\n edge === \"top\" ? b.y0 : edge === \"bottom\" ? 1 - b.y1 : edge === \"left\" ? b.x0 : 1 - b.x1;\n\n/** The boxes of the element a clipping claim is about; none for the picture (a cropped head): nothing measured it. */\nfunction measuredBoxes(\n element: FindingKind[\"element\"],\n boxes: readonly TextBox[],\n buttons: readonly ExpectedLine[],\n): readonly TextBox[] {\n if (element === \"logo\") return boxes.filter((b) => b.kind === \"logo\");\n if (element === \"button\") return buttons.flatMap((l) => boxesOfLine(l, boxes));\n return element === \"copy\" ? boxes.filter((b) => b.kind === \"text\") : [];\n}\n\n/** The review model said the frame cuts something (`FindingKind`). */\nconst cutByFrame = (f: RenderFinding): boolean => f.kind?.defect === \"cut\";\n\n/**\n * The review model's claims that the button, the logo or a line is clipped by the frame, checked\n * against the boxes the reader measured on that format: a claim stays blocking when a box of that\n * element reaches an edge it names (every edge when it names none), and becomes a note when every\n * one sits clear (Tier 0, Oct 2026: 5 of 9 such claims were wrong). What a claim is about and where\n * are the model's typed fields, never its words. Claims about anything else, or a format nobody\n * measured, stand. Pure.\n */\nexport function corroborateEdgeClaims(\n findings: readonly RenderFinding[],\n boxesByFormat: Readonly<Record<string, readonly TextBox[]>>,\n lines: readonly ExpectedLine[],\n): RenderFinding[] {\n const buttons = lines.filter((l) => /^(cta|button|call_to_action)$/.test(roleKey(l.role)));\n return findings.map((f) => {\n if (f.severity !== \"blocking\" || !f.kind || !cutByFrame(f)) return f;\n const format = f.what.match(/^([\\d.]+:[\\d.]+):/)?.[1];\n const boxes = format ? boxesByFormat[format] : undefined;\n if (!boxes) return f;\n const { element } = f.kind;\n const measured = measuredBoxes(element, boxes, buttons);\n if (measured.length === 0) return f;\n const named: readonly BandEdge[] = f.kind.edges.length > 0 ? f.kind.edges : [\"top\", \"bottom\", \"left\", \"right\"];\n // A button is measured by its words, and its shape reaches past them.\n const pad = element === \"button\" ? BUTTON_PAD : 0;\n const atEdge = measured.some((b) => named.some((edge) => clearanceTo(b, edge) - pad * (b.y1 - b.y0) <= AT_EDGE));\n return atEdge ? f : { ...f, severity: \"warning\" };\n });\n}\n\n/** A delivered image's bytes, from its local file or its URL. */\nexport async function bytesOf(source: string): Promise<Buffer> {\n if (!/^https?:\\/\\//i.test(source)) return await readFile(source);\n const res = await fetch(source);\n if (!res.ok) throw new Error(`fetch ${res.status}`);\n return Buffer.from(await res.arrayBuffer());\n}\n\n/** How wide a static ad shows in a phone feed at a glance: the size the thumbnail test reads it at. */\nconst THUMBNAIL_WIDTH = 240;\n\n/** A delivered image, downscaled to JPEG for the review model: to fit 1024px, or to a thumbnail width. */\nasync function jpegFor(bytes: Buffer, width?: number): Promise<string> {\n const resized = width\n ? sharp(bytes).resize({ width, withoutEnlargement: true })\n : sharp(bytes).resize(1024, 1024, { fit: \"inside\", withoutEnlargement: true });\n const jpeg = await resized.jpeg({ quality: 85 }).toBuffer();\n return jpeg.toString(\"base64\");\n}\n\n/** A picture as the review model is shown it, or null when it cannot be read. */\nasync function stillOf(source: string): Promise<string | null> {\n try {\n return await jpegFor(await bytesOf(source));\n } catch {\n return null;\n }\n}\n\n/** The colour each designed line is set in, read where the reader found it. */\nasync function designedInks(\n image: Buffer,\n lines: readonly ExpectedLine[],\n boxes: readonly TextBox[],\n): Promise<Array<{ text: string; hex: string }>> {\n const inks: Array<{ text: string; hex: string }> = [];\n for (const line of lines.filter((l) => l.lettering === \"designed\")) {\n const [box] = boxesOfLine(line, boxes);\n const hex = box ? await inkOf(image, box) : null;\n if (hex) inks.push({ text: line.text, hex });\n }\n return inks;\n}\n\nexport type StaticImageCheck =\n | { status: \"checked\"; findings: RenderFinding[]; boxes: TextBox[] }\n | { status: \"not_checked\" };\n\n/**\n * A box a native screen's own interface prints, which a copy line sharing the word must not claim:\n * a single key or letter, or exactly one of the screen's own strings (\"Post\", \"espacio\").\n */\nfunction interfaceWord(text: string, own: readonly string[] = []): boolean {\n const read = normalizeCopy(text);\n return crumb(text) || own.some((o) => normalizeCopy(o) === read);\n}\n\n/** Words of two letters at most: what a reader keeps of a card or a key the frame cut, never a line of copy. */\nfunction crumb(text: string): boolean {\n return normalizeCopy(text)\n .split(\" \")\n .every((w) => w.length <= 2);\n}\n\n/**\n * Whether words read off the ad are a piece of one of `own` strings: most of its words are that\n * string's. `cut`: a native screen, whose frame or a card over it cuts words (\"nente me\n * consiguieron el trabajo\" of a review), so a piece of a word counts, and so does a crumb with no\n * word left in it. Pure.\n */\nfunction fragmentOf(chunk: string, own: readonly string[], opts: { share?: number; cut?: boolean } = {}): boolean {\n const share = opts.share ?? 0.5;\n const words = normalizeCopy(chunk)\n .split(\" \")\n .filter((w) => w.length > 1);\n if (words.length === 0) return opts.cut === true;\n return own.some((text) => {\n const theirs = new Set(normalizeCopy(text).split(\" \"));\n // A word the frame or a card cut keeps one end: \"verif\" of \"verificada\", \"mpe\" of \"kampe\".\n const shared = words.filter(\n (w) => theirs.has(w) || (opts.cut === true && [...theirs].some((t) => t.length > w.length && t.includes(w))),\n ).length;\n return shared / words.length >= share;\n });\n}\n\n/** At or above this, Jev says words make an offer. Measured in 9 languages: offers 0.53–0.87, signs and labels 0.11 or less. */\nconst OFFER_MADE = 0.35;\nconst OFFER_QUESTION =\n \"Does `words` make an offer of its own: something free, a discount, a sale, a promotion, a deal or a price, in whatever language it is written? A sign, a label, a name or a screen's words are not an offer.\";\nconst offerQuestion = (words: string) => ({ instructions: { words, question: OFFER_QUESTION } });\n\n/** The runs of words that make an offer, by the decision model's judgment; none when it cannot answer. */\nasync function offersAmong(\n chunks: readonly string[],\n judge: (chunks: readonly string[]) => Promise<number[] | null>,\n): Promise<Set<string>> {\n const worded = chunks.filter((c) => /\\p{L}/u.test(c));\n if (worded.length === 0) return new Set();\n const judged = await judge(worded);\n return new Set(worded.filter((_, i) => (judged?.[i] ?? 0) >= OFFER_MADE));\n}\n\n/**\n * The deterministic checks on one image: its words and logo read with their boxes\n * (`readTextBoxes`), the copy compared line by line, every box measured against the safe\n * area (or `band`), and the ink of each designed line against the brand `palette`.\n * `not_checked` when the reader could not answer: the caller falls back to the review model.\n */\nexport async function checkStaticImage(\n image: Buffer,\n opts: {\n format: string;\n lines: readonly ExpectedLine[];\n allowed?: readonly string[];\n logoWords?: readonly string[];\n placements?: readonly string[];\n band?: SafeArea;\n palette?: readonly string[];\n /** A size re-laid out from the chosen picture (`measuredFindings`). */\n adapted?: boolean;\n /** The ad keeps the brand's logo (`measuredFindings`). */\n expectLogo?: boolean;\n /** A native screen, whose own interface words are never misplaced (`measuredFindings`). */\n native?: boolean;\n /** Maps boxes read on this image to the frame the band is in (a variant rendered at another shape than its master). */\n toFrame?: (boxes: TextBox[]) => TextBox[];\n onSpend?: (usage: ReviewUsage) => void;\n /** The box reader (the vision model behind the gateway); `readTextBoxes` unless given. */\n read?: (image: Buffer) => Promise<TextBoxReading>;\n /** For each run of words, the probability it makes an offer; the decision model (`askJev`) unless given. */\n judgeOffers?: (chunks: readonly string[]) => Promise<number[] | null>;\n /** The review platform each line cites (`citedPlatforms`); read here, by the decision model, unless given. */\n cited?: Citations;\n /** Reads the citations when `cited` is not given; the decision model unless given. */\n judgeCitations?: CitationJudge;\n },\n): Promise<StaticImageCheck> {\n const reading = await (opts.read ?? ((bytes: Buffer) => readTextBoxes(bytes, { onSpend: opts.onSpend })))(image);\n if (reading.status === \"not_checked\") return reading;\n const palette = opts.palette ?? [];\n const inks = palette.length > 0 ? await designedInks(image, opts.lines, reading.boxes) : [];\n const boxes = opts.toFrame ? opts.toFrame(reading.boxes) : reading.boxes;\n const offers = await offersAmong(\n textMismatch(opts.lines, boxes, { allowed: opts.allowed }).extra,\n opts.judgeOffers ?? ((chunks) => askJev(chunks.map(offerQuestion), opts.onSpend)),\n );\n const findings = measuredFindings({\n format: opts.format,\n boxes,\n lines: opts.lines,\n ...(opts.allowed ? { allowed: opts.allowed } : {}),\n ...(opts.logoWords ? { logoWords: opts.logoWords } : {}),\n ...(opts.adapted ? { adapted: true } : {}),\n ...(opts.expectLogo ? { expectLogo: true } : {}),\n ...(opts.native ? { native: true } : {}),\n ...(opts.placements ? { placements: opts.placements } : {}),\n ...(opts.band ? { band: opts.band } : {}),\n offBrand: offBrandInks(inks, palette),\n offers,\n cited:\n opts.cited ??\n (await citedPlatforms(\n opts.lines.map((l) => l.text),\n opts.judgeCitations ?? jevCitationJudge(opts.onSpend),\n )),\n });\n return { status: \"checked\", findings, boxes };\n}\n\n/** The delivered images that could be read, in lockstep: their pixels, shape, review still and thumbnail. */\nasync function loadDelivered(images: ReadonlyArray<{ path: string; format: string }>) {\n const measured: Array<{ format: string; width: number; height: number }> = [];\n const originals: Buffer[] = [];\n const stills: string[] = [];\n const thumbs: string[] = [];\n for (const image of images) {\n try {\n const bytes = await bytesOf(image.path);\n const meta = await sharp(bytes).metadata();\n const still = await jpegFor(bytes);\n const thumb = await jpegFor(bytes, THUMBNAIL_WIDTH);\n measured.push({ format: image.format, width: meta.width ?? 0, height: meta.height ?? 0 });\n originals.push(bytes);\n stills.push(still);\n thumbs.push(thumb);\n } catch {\n // An image that cannot be read is reported by the vision pass, or not at all.\n }\n }\n return { measured, originals, stills, thumbs };\n}\n\n/** Nobody looked at the picture: a measured defect still blocks, but a clean measure is not a review. */\nfunction unreviewed(shape: RenderFinding[], measured: RenderFinding[]): RenderFinding[] | null {\n const known = [...shape, ...measured];\n if (known.some((f) => f.severity === \"blocking\")) return known;\n return shape.length > 0 ? shape : null;\n}\n\n/** What the review prompt is told, from what the run review was given. */\nfunction reviewPromptOpts(\n opts: Parameters<typeof reviewRenderedStatic>[0],\n formats: string[],\n read: boolean,\n referenceShown: boolean,\n): StaticReviewPromptOpts {\n return {\n copy: opts.copy,\n formats,\n brand: opts.brand,\n logo: opts.logo,\n thumbnails: !read,\n mechanisms: opts.mechanisms,\n viewer: opts.viewer,\n ...(referenceShown && opts.concept\n ? { concept: { mustKeep: opts.concept.mustKeep, ...(opts.concept.idea ? { idea: opts.concept.idea } : {}) } }\n : {}),\n ...(opts.native ? { native: opts.native } : {}),\n measured: read,\n ...(opts.uncastPeople && opts.uncastPeople.length > 0 ? { uncastPeople: opts.uncastPeople } : {}),\n };\n}\n\n/**\n * A size's lines and allowed words once a chat scrolled `gone` off it (`static_native`'s `scrolled`):\n * those lines are expected nowhere on it, and what still shows of them is the screen's own. Pure.\n */\nexport function scrolledOff<T extends { lines: readonly ExpectedLine[]; allowed?: readonly string[] }>(\n checks: T,\n gone: readonly string[],\n): T & { lines: ExpectedLine[]; allowed: string[] } {\n return {\n ...checks,\n lines: checks.lines.filter((l) => !gone.includes(l.text)),\n allowed: [...(checks.allowed ?? []), ...gone],\n };\n}\n\n/** What every size's measured check is told, whatever its format (`checkStaticImage`). */\nfunction everySizeChecks(opts: Parameters<typeof reviewRenderedStatic>[0]) {\n const logoWords = [...(opts.brand ? [opts.brand] : []), ...(opts.lockup ?? [])];\n return {\n allowed: [...logoWords, ...(opts.sceneText ?? [])],\n logoWords,\n ...(opts.expectLogo ? { expectLogo: true } : {}),\n ...(opts.native ? { native: true } : {}),\n ...(opts.placements ? { placements: opts.placements } : {}),\n ...(opts.palette ? { palette: opts.palette } : {}),\n onSpend: opts.onSpend,\n };\n}\n\n/** One model question about the delivered stills, as `askAboutStills` asks it. */\nexport type AskStills = (images: string[], prompt: string) => Promise<unknown>;\n\n/**\n * A second, direct look at each blocking defect the review judged by eye: one question, each claim\n * answered true only when plainly visible on the size it names. An unconfirmed one stays as a note.\n * The review's own judgement is the first look; a correction round is ~2 minutes, the look a few\n * seconds (Dev, Oct 2026: a neighbour's roof read as \"duplicated\", a card both sizes show read as\n * \"missing from the 9:16\"). No answer leaves the findings as they were.\n */\nexport async function confirmBlocking(\n findings: readonly RenderFinding[],\n stills: readonly string[],\n formats: readonly string[],\n ask: AskStills,\n): Promise<RenderFinding[]> {\n // A cut or clipped element is corroborated by the measured boxes (`corroborateEdgeClaims`), and a\n // second look answers its edges one by one: one wrong edge of three read a cut button as fine.\n const claims = findings.filter((f) => f.severity === \"blocking\" && !cutByFrame(f));\n if (claims.length === 0 || stills.length === 0) return [...findings];\n const prompt = [\n `These are the finished sizes of one ad, in order: ${formats.map((f, i) => `Image ${i + 1} is the ${f}`).join(\"; \")}.`,\n \"A reviewer reported each claim below. Look again at the size each one names (and, for a claim comparing sizes, at the others) and answer true only when the defect is plainly there for someone looking at it on a phone.\",\n \"Answer false when the thing is not there, when it is an ordinary part of the scene (a second house, a neighbour's roof, a reflection), or when the sizes it compares show the same thing.\",\n ...claims.map((c, i) => `${i + 1}. ${c.what}`),\n `Reply with only this JSON: {\"answers\":[true|false, ...]}, one answer per claim, in order.`,\n ].join(\"\\n\");\n const answer = await ask([...stills], prompt).catch(() => null);\n const answers = (answer as { answers?: unknown } | null)?.answers;\n if (!Array.isArray(answers) || answers.length !== claims.length) return [...findings];\n const unconfirmed = new Set(claims.filter((_, i) => answers[i] === false));\n return findings.map((f) => (unconfirmed.has(f) ? { ...f, severity: \"warning\" as const } : f));\n}\n\n/**\n * Review the delivered images. The ratio check always runs. The box reader then reads every\n * word and measures where it sits (`checkStaticImage`); where it answered for every image,\n * its findings replace the review model's transcription and its eye for the safe zones. The\n * vision pass runs when a gateway key is present. Returns null only when nothing could look.\n */\nexport async function reviewRenderedStatic(opts: {\n images: Array<{ path: string; format: string }>;\n copy: string[];\n /** By format, the lines a chat scrolled off that size (`scrolledOff`). */\n scrolled?: Readonly<Record<string, readonly string[]>>;\n /** The copy as the ad spec holds it, in-scene or designed; defaults to `copy`, all designed. */\n lines?: ExpectedLine[];\n brand?: string;\n /** The words the brand's logo prints (its wordmark), which are the logo and never extra words. */\n lockup?: readonly string[];\n /** Words the scene prints by itself and other brands' names (`allowedSceneWords`): never extra words. */\n sceneText?: readonly string[];\n /** The brand's colours (the ad spec's), for the ink of designed lines. */\n palette?: string[];\n /** The ad set's placements, for the safe areas (`staticSafeArea`). */\n placements?: string[];\n /** The format the chosen picture was delivered at; every other size was re-laid out from it. */\n masterFormat?: string;\n /** The concept carries a logo and the real file was given to the model. */\n logo?: boolean;\n /** The ad spec keeps the brand's logo: a size without it, or with it twice, is noted. */\n expectLogo?: boolean;\n /** The devices the concept rests on, to check they survived. */\n mechanisms?: string[];\n /** Who the ad reaches, in one phrase (`describeViewer`). */\n viewer?: string;\n /** What the ad keeps of its reference, and the reference's picture (a path or URL), for the concept check (C7). */\n concept?: { mustKeep: readonly string[]; idea?: string; reference: string };\n /** The ad is a native screen, named as a viewer would (\"a post on X\"). */\n native?: string;\n /** Real people the copy names whom the ad was given no photo of (`uncastPeople`). */\n uncastPeople?: readonly string[];\n onSpend?: (usage: ReviewUsage) => void;\n}): Promise<RenderFinding[] | null> {\n const { measured, originals, stills, thumbs } = await loadDelivered(opts.images);\n if (measured.length === 0) return null;\n // The reference the concept check compares with, last among the pictures; skipped if unreadable.\n const reference = opts.concept ? await stillOf(opts.concept.reference) : null;\n const shape = ratioFindings(measured);\n // `measured` grows in lockstep with `stills`, so an unreadable image drops out of both\n // and the model is never told a format it was not shown.\n const formats = measured.map((m) => m.format);\n const lines = opts.lines ?? opts.copy.map((text): ExpectedLine => ({ text, lettering: \"designed\" }));\n const every = { lines, ...everySizeChecks(opts) };\n // Unmeasured, the thumbnails ride in the same call, after the full-size images: the feed test\n // costs one small image per format, not a second review. Measured, the lead's size is read off\n // its boxes and the thumbnails are not sent.\n const ask = (measuredRead: boolean) => {\n const prompt = buildStaticReviewPrompt(reviewPromptOpts(opts, formats, measuredRead, reference !== null));\n const shown = [...(measuredRead ? stills : [...stills, ...thumbs]), ...(reference ? [reference] : [])];\n return askAboutStills(shown, prompt, opts.onSpend);\n };\n // The review is asked as if the words were read while they are being read (they almost always\n // are); a read that fails asks again unmeasured, the one case that pays a second review.\n const asking = ask(true);\n // Which review platform each line cites, read once for every size.\n const cited = await citedPlatforms(\n lines.map((l) => l.text),\n jevCitationJudge(opts.onSpend),\n );\n const checks = await Promise.all(\n originals.map((bytes, i) =>\n checkStaticImage(bytes, {\n ...scrolledOff(every, opts.scrolled?.[formats[i] ?? \"\"] ?? []),\n format: formats[i] ?? \"\",\n adapted: opts.masterFormat !== undefined && formats[i] !== opts.masterFormat,\n cited,\n }),\n ),\n );\n // All or nothing: a review model told the words were read would skip a format nobody read.\n const read = checks.every((c) => c.status === \"checked\");\n const measuredText = read ? checks.flatMap((c) => (c.status === \"checked\" ? c.findings : [])) : [];\n // The gateway answers null on any refusal (a rate limit, a 5xx, a timeout) and a run that\n // ends unreviewed cannot become `rendered`; one more ask is cheap next to the render.\n if (!read) void asking.catch(() => null);\n const first = read ? await asking : null;\n const answer = first ?? (await ask(read));\n if (answer === null) return unreviewed(shape, measuredText);\n const text = read ? measuredText : copyFindings(answer, opts.copy, formats, opts.scrolled);\n const boxesByFormat = read\n ? Object.fromEntries(checks.flatMap((c, i) => (c.status === \"checked\" ? [[formats[i] ?? \"\", c.boxes]] : [])))\n : {};\n const judged = corroborateEdgeClaims(classifyStaticFindings(answer), boxesByFormat, lines);\n const confirmed = await confirmBlocking(judged, stills, formats, (images, prompt) =>\n askAboutStills(images, prompt, opts.onSpend),\n );\n return [...shape, ...text, ...confirmed];\n}\n","/**\n * The part of a delivered frame that platform chrome leaves clear, as fractions of it.\n *\n * One owner for statics and video, because the chrome is the same: a caption, a logo or a\n * call to action set under the profile row or the reply bar is not seen, whichever\n * scaffolder drew it.\n *\n * Each field is the fraction lost at that edge, so the clear band runs from `top` to\n * `1 - bottom` of the height (16%–63% on a Reels 9:16). Prompts, crops and review checks read\n * these numbers from here (`staticSafeArea`, `videoSafeArea`, `safeRectPx`) and never restate them.\n */\nimport { AD_PLACEMENTS, type AdPlacement, verticalCover } from \"@baker/canvas-contract\";\n\nexport type SafeArea = { top: number; bottom: number; left: number; right: number };\n\n/**\n * Stories cover the top ~14% (profile, progress bar) and the bottom ~20% (reply bar, CTA\n * sticker), Reels the bottom ~35% (caption, audio line, buttons). Two points of margin past\n * each: a logo set exactly on the 14% line read to the review (and would read to a viewer) as\n * sitting under the profile bar. The sides carry no interface, only the design's margin: 56 of\n * 57 side-edge flags on audited 9:16s (Sept 2026) were lines the viewer sees.\n *\n * The part each interface really draws over (`cover`) is calibrated on 256 hand-labelled 9:16\n * flags (Oct 2026, `check-audit.mjs`): a box ending past 69% of the height, or starting above\n * 8%, was under the interface in 79% / 77% of the audit's calls; the 16% / 63% lines agreed on\n * 52% / 61%. Reels draws its buttons in the outer 8% from 60% of the height down (a line ending\n * 3% from the right edge at half height was seen). The numbers live in the placement registry\n * (`@baker/canvas-contract` `AD_PLACEMENTS`), with every other platform's.\n */\nconst STORIES = placementOf(\"meta_stories\");\nconst REELS = placementOf(\"meta_reels\");\n\nfunction placementOf(id: string): AdPlacement {\n const found = AD_PLACEMENTS.find((p) => p.id === id);\n if (!found) throw new Error(`no placement ${id} in the registry`);\n return found;\n}\n\n/** Reels' like, comment and share buttons: a column down the right side, `width` wide, from `from` of the height down. */\nexport type RightRail = { width: number; from: number };\n\nexport type CoveredArea = { top: number; bottom: number; rail?: RightRail };\n\n/** Reels covers more of the bottom than Stories: its safe area ends this far up. */\nexport const REELS_SAFE_BOTTOM = REELS.safe.bottom;\n\n/** A feed video has no chrome over its frame, only a modest margin from its edges. */\nconst FEED: SafeArea = { top: 0.06, bottom: 0.06, left: 0.07, right: 0.07 };\n\n/**\n * A feed image has no chrome over it either: Meta's Facebook Feed and Instagram Feed image\n * specs (ads guide) give a ratio and a tolerance and no safe zone, and the picture shows\n * whole. So the margin is the design's, not the app's: 4% (43px on a 1080-wide 4:5) keeps\n * words off the edge without crowding the layout. The video feed's 6%/7% flagged 61% of\n * the bench's cached 4:5 reads, when 10% had a word actually at the edge.\n */\nconst FEED_IMAGE: SafeArea = { ...placementOf(\"meta_feed\").safe };\n\n/**\n * The placement whose interface decides a static's safe area: Meta's Reels or Stories, another\n * app's full-screen vertical feed (TikTok, Snapchat, YouTube Shorts), or a feed nothing covers.\n */\nexport type SafeAreaPlacement = \"reels\" | \"stories\" | \"vertical\" | \"feed\";\n\n/**\n * A static's safe area, and the placement it is kept clear of: `covered`, the part that\n * placement's interface really draws over; `rail`, the margin kept around the buttons down the\n * lower right; `surface`, the interface in the viewer's words (\"Reels\", \"Reels and TikTok\").\n */\nexport type StaticSafeArea = SafeArea & {\n placement: SafeAreaPlacement;\n surface: string;\n covered?: CoveredArea;\n rail?: RightRail;\n};\n\n/**\n * Placements that run the ad on every surface of Facebook or Instagram, Reels included:\n * Advantage+ (`automatic`, as the viewer read off an ad set names it) and a platform whose\n * positions the ad set left open (a bare `facebook` or `instagram`, or `meta`).\n */\nconst EVERY_SURFACE: ReadonlySet<string> = new Set([\"automatic\", \"facebook\", \"instagram\", \"meta\"]);\n\n/** The full-screen vertical placements of other apps, by any name they are given, and their name to a viewer. */\nconst OTHER_VERTICAL: ReadonlyArray<{ id: string; names: readonly string[]; surface: string }> = [\n { id: \"tiktok_feed\", names: [\"tiktok\", \"tiktok_feed\"], surface: \"TikTok\" },\n { id: \"snapchat_snap_ads\", names: [\"snapchat\", \"snapchat_snap_ads\", \"snap\"], surface: \"Snapchat\" },\n { id: \"youtube_shorts\", names: [\"youtube\", \"youtube_shorts\", \"shorts\"], surface: \"YouTube Shorts\" },\n];\n\n/** Which of Meta's vertical placements the names reach: Reels (and so Stories) under Advantage+, Stories alone, or none. */\nfunction metaVertical(\n named: readonly string[],\n): { id: string; placement: \"reels\" | \"stories\"; surface: string } | null {\n if (named.length === 0 || named.some((p) => p.includes(\"reels\") || EVERY_SURFACE.has(p))) {\n return { id: REELS.id, placement: \"reels\", surface: \"Reels\" };\n }\n return named.some((p) => p.includes(\"stor\")) ? { id: STORIES.id, placement: \"stories\", surface: \"Stories\" } : null;\n}\n\n/**\n * A static ad's safe area: the one owner of the numbers the render prompt, the crops and the\n * review all state.\n *\n * A 9:16 runs in Reels as well as Stories under Advantage+ placements, so by default it keeps\n * clear of the Stories header and the Reels footer. `placements` are where the ad runs: Meta\n * positions in any of Meta's spellings (targeting `reels`/`story`, insights\n * `instagram_reels`/`facebook_stories`, effective `REELS`/`STORY`), and the other apps' vertical\n * feeds by platform or placement id (`tiktok`, `snapchat`, `youtube_shorts`). None, or an empty\n * list, means Advantage+, and so do `automatic` and a bare `facebook`/`instagram`/`meta`. Meta\n * names only ever narrow the band: Stories without Reels gives the Reels footer back, and\n * neither leaves only the feed margin. Several apps together keep clear of all of them.\n */\nexport function staticSafeArea(format: string, placements?: readonly string[]): StaticSafeArea {\n const feed: StaticSafeArea = { ...FEED_IMAGE, placement: \"feed\", surface: \"the feed\" };\n if (format !== \"9:16\") return feed;\n const named = (placements ?? []).map((p) => p.toLowerCase());\n const meta = metaVertical(named);\n const others = OTHER_VERTICAL.filter((o) => named.some((p) => o.names.includes(p)));\n const cover = verticalCover([...(meta ? [meta.id] : []), ...others.map((o) => o.id)]);\n if (!cover) return feed;\n return {\n ...cover.safe,\n placement: meta?.placement ?? \"vertical\",\n surface: [...(meta ? [meta.surface] : []), ...others.map((o) => o.surface)].join(\" and \"),\n covered: { top: cover.top, bottom: cover.bottom, ...(cover.rail ? { rail: cover.rail } : {}) },\n ...(cover.railMargin ? { rail: cover.railMargin } : {}),\n };\n}\n\n/** A 9:16 video's captions and lower thirds keep 6% off each side, clear of Reels' right-side buttons. */\nconst VIDEO_VERTICAL_SIDE = 0.06;\n\n/**\n * A video ad's safe area. A 9:16 video runs in Reels as well as Stories, so it keeps clear\n * of the Stories header and the Reels footer, the larger of each. Its sides keep the video's\n * own margin: the statics' narrower one was measured on statics.\n */\nexport function videoSafeArea(format: string): SafeArea {\n return format === \"9:16\"\n ? { ...STORIES.safe, bottom: REELS_SAFE_BOTTOM, left: VIDEO_VERTICAL_SIDE, right: VIDEO_VERTICAL_SIDE }\n : FEED;\n}\n\n/** A rectangle in pixels, from the frame's top-left corner. */\nexport type PixelRect = { x: number; y: number; width: number; height: number };\n\n/**\n * The clear part of a `width`×`height` frame, in pixels: where every word, logo and button\n * sits. Rounded inward, so a box inside it is inside the safe area at any size, which is\n * what a crop, a layout and an OCR band check each need to be able to rely on.\n */\nexport function safeRectPx(area: SafeArea, width: number, height: number): PixelRect {\n const x = Math.ceil(atPx(area.left * width));\n const y = Math.ceil(atPx(area.top * height));\n const right = Math.floor(atPx((1 - area.right) * width));\n const bottom = Math.floor(atPx((1 - area.bottom) * height));\n return { x, y, width: right - x, height: bottom - y };\n}\n\n/** Drops floating-point noise (0.93 × 1000 = 929.9999…) before an edge is rounded inward. */\nfunction atPx(value: number): number {\n return Number(value.toFixed(6));\n}\n\n/**\n * The area a 9:16 is held to where it blocks: where it runs in Stories as well as Reels (Advantage+,\n * or both named) that is Stories' header and reply bar (and any other app's interface named), since\n * what only Reels' taller footer covers is still seen in Stories and the review only notes it. A\n * Reels-only ad set has no Stories to be seen in, so Reels' footer blocks. Pure.\n */\nexport function blockingArea(format: string, placements?: readonly string[]): StaticSafeArea {\n return staticSafeArea(format, blockingPlacements(placements));\n}\n\n/**\n * The placements whose interface blocks a line: where the ad runs in Reels and Stories, Stories and\n * the other apps named; otherwise the placements as given.\n */\nexport function blockingPlacements(placements?: readonly string[]): string[] {\n const named = (placements ?? []).map((p) => p.toLowerCase());\n const storiesToo =\n named.length === 0 ||\n named.some((p) => EVERY_SURFACE.has(p)) ||\n (named.some((p) => p.includes(\"reels\")) && named.some((p) => p.includes(\"stor\")));\n if (!storiesToo) return [...(placements ?? [])];\n const others = (placements ?? []).filter((p) => OTHER_VERTICAL.some((o) => o.names.includes(p.toLowerCase())));\n return [...others, \"stories\"];\n}\n\n/** The share of each edge kept clear around the screen, beyond what an interface covers. */\nconst MARGIN = 0.035;\n\n/**\n * Where the screen may sit on one size, as fractions of each edge. A feed size keeps a margin; a\n * 9:16 keeps clear of what its placements really draw where the review blocks (`blockingArea`:\n * Stories' header and reply bar under Advantage+) plus a margin, so a screen is as large as it can be and\n * still never under the interface. Pure.\n */\nexport function nativeLayoutInsets(\n format: string,\n placements?: readonly string[],\n): { top: number; bottom: number; left: number; right: number } {\n const area = blockingArea(format, placements);\n if (!area.covered) {\n return {\n top: Math.max(area.top, MARGIN),\n bottom: Math.max(area.bottom, MARGIN),\n left: Math.max(area.left, MARGIN),\n right: Math.max(area.right, MARGIN),\n };\n }\n const rail = area.covered.rail;\n // A rail covers the right edge only below `from`: a screen whose bottom clears it keeps the edge.\n const bottom = area.covered.bottom + MARGIN;\n const railReached = rail ? 1 - bottom > rail.from : false;\n return {\n top: area.covered.top + MARGIN,\n bottom,\n left: Math.max(area.left, MARGIN),\n right: Math.max(area.right, railReached && rail ? rail.width + MARGIN / 2 : 0, MARGIN),\n };\n}\n","/**\n * Whether every word and the logo of a static ad sit where the viewer can see them: inside\n * the safe band a placement's interface leaves clear. The band is never restated here; its\n * one owner is `staticSafeArea(format, placements)`. A variant is checked against its\n * master's planned band instead (`static-sizes.ts` `planStaticFormats`). Boxes are\n * `text-boxes.ts` boxes (frame fractions). Pure.\n */\nimport { type CoveredArea, type SafeArea, staticSafeArea } from \"../../../scaffold/platform-safe-area.ts\";\nimport type { TextBox } from \"./text-boxes.ts\";\n\n/** A reader's box is drawn a little loose around its glyphs: a reach up to this share of the frame is forgiven. */\nexport const BOX_TOLERANCE = 0.01;\n\nexport type BandEdge = \"top\" | \"bottom\" | \"left\" | \"right\";\n\n/**\n * A box at most this far from the frame's edge has letters at it or past it: the reader\n * clamps what runs off the frame to the edge, and draws its box a little loose.\n */\nexport const FRAME_CUT = 0.005;\n\n/**\n * `clearance`: how far the box stays from the frame's own edge, on the nearest edge it crosses\n * the band at. `covered`: it reaches where the placement's interface really draws (its\n * `covered` area or Reels' buttons), not only into the margin kept around it.\n */\nexport type BandViolation = {\n text: string;\n kind: TextBox[\"kind\"];\n edges: BandEdge[];\n overshoot: number;\n clearance: number;\n covered: boolean;\n /** Covered only by Reels' tall footer or its buttons: Stories, where the same 9:16 also runs, shows it. */\n reelsOnly?: boolean;\n};\n\n/** Whether a box reaches where the interface draws, past the tolerance. */\nfunction underInterface(box: TextBox, covered: CoveredArea | undefined, tolerance: number): boolean {\n if (!covered) return false;\n if (covered.top - box.y0 > tolerance || box.y1 - (1 - covered.bottom) > tolerance) return true;\n const rail = covered.rail;\n return Boolean(rail && box.y1 > rail.from && box.x1 - (1 - rail.width) > tolerance);\n}\n\n/**\n * Every box that reaches past the band into the interface, with the edges it crosses and\n * its deepest reach. The band is `format`'s safe area for `placements` unless `band` is given.\n */\nexport function bandViolations(\n boxes: readonly TextBox[],\n format: string,\n opts: { placements?: readonly string[]; band?: SafeArea; tolerance?: number } = {},\n): BandViolation[] {\n const own = staticSafeArea(format, opts.placements);\n // A master's planned band is all margin: whatever reaches past it is lost to some size's cut.\n const band = opts.band ?? own;\n const covered = opts.band ? undefined : own.covered;\n const rail = opts.band ? undefined : own.rail;\n const tolerance = opts.tolerance ?? BOX_TOLERANCE;\n return boxes.flatMap((box) => {\n const right = rail && box.y1 > rail.from ? Math.max(band.right, rail.width) : band.right;\n const reach: Record<BandEdge, number> = {\n top: band.top - box.y0,\n bottom: box.y1 - (1 - band.bottom),\n left: band.left - box.x0,\n right: box.x1 - (1 - right),\n };\n const edges = (Object.keys(reach) as BandEdge[]).filter((edge) => reach[edge] > tolerance);\n if (edges.length === 0) return [];\n const toFrame: Record<BandEdge, number> = { top: box.y0, bottom: 1 - box.y1, left: box.x0, right: 1 - box.x1 };\n return [\n {\n text: box.text,\n kind: box.kind,\n edges,\n overshoot: Math.max(...edges.map((edge) => reach[edge])),\n clearance: Math.max(0, Math.min(...edges.map((edge) => toFrame[edge]))),\n covered: opts.band !== undefined || underInterface(box, covered, tolerance),\n },\n ];\n });\n}\n","/**\n * Whether the designed type of a static ad is set in the brand's colours.\n *\n * Distance is CIEDE2000 (chroma-js `deltaE`, the difference a designer means by \"that is\n * not our red\"), the measure the bench's palette score uses (`scripts/creative-evals/\n * palette.mjs`). A warning, never blocking: a model that sets a line in a near-brand colour\n * made a choice, not a mistake a person could not ship. White, black and greys never count:\n * every brand sets type in them.\n */\nimport chroma from \"chroma-js\";\nimport sharp from \"sharp\";\nimport type { TextBox } from \"./text-boxes.ts\";\n\n/** Further than this from every brand colour is another colour, not a shade of one. */\nexport const OFF_BRAND_DELTA_E = 20;\n/** Colours a line's box is split into: its ground, its ink, and the blends of their edges. */\nconst INK_CLUSTERS = 4;\n/** A colour covering less of the box than this is an edge blend or a speck, not the ink. */\nconst MIN_INK_SHARE = 0.05;\n/** Below this LCh chroma an ink is a neutral (white, grey, black), which any brand may use. */\nconst NEUTRAL_CHROMA = 12;\n\nexport type OffBrandInk = { text: string; hex: string; nearest: string; deltaE: number };\n\n/**\n * The colour a line is set in: the pixels of its box quantised to a few colours\n * (libimagequant through sharp, the bench's quantiser). The most common is the ground the\n * letters sit on; the ink is the colour furthest from it, which skips the blends of\n * anti-aliased edges that sit between the two. Null when the box holds one colour or\n * cannot be read.\n */\nexport async function inkOf(image: Buffer, box: TextBox): Promise<string | null> {\n try {\n const { width = 0, height = 0 } = await sharp(image).metadata();\n const left = Math.max(0, Math.floor(box.x0 * width));\n const top = Math.max(0, Math.floor(box.y0 * height));\n const region = {\n left,\n top,\n width: Math.min(width - left, Math.ceil((box.x1 - box.x0) * width)),\n height: Math.min(height - top, Math.ceil((box.y1 - box.y0) * height)),\n };\n if (region.width < 2 || region.height < 2) return null;\n const quantized = await sharp(image)\n .extract(region)\n .removeAlpha()\n .resize({ width: 96, withoutEnlargement: true })\n .png({ palette: true, colours: INK_CLUSTERS, dither: 0 })\n .toBuffer();\n const { data, info } = await sharp(quantized).removeAlpha().raw().toBuffer({ resolveWithObject: true });\n const counts = new Map<string, number>();\n for (let i = 0; i + 2 < data.length; i += info.channels) {\n const hex = chroma(data[i] ?? 0, data[i + 1] ?? 0, data[i + 2] ?? 0).hex();\n counts.set(hex, (counts.get(hex) ?? 0) + 1);\n }\n const total = info.width * info.height;\n const [ground, ...rest] = [...counts.entries()].sort((a, b) => b[1] - a[1]).map(([hex]) => hex);\n const inks = rest.filter((hex) => (counts.get(hex) ?? 0) / total >= MIN_INK_SHARE);\n if (!ground || inks.length === 0) return null;\n return inks.sort((a, b) => chroma.deltaE(ground, b) - chroma.deltaE(ground, a))[0] ?? null;\n } catch {\n return null;\n }\n}\n\n/** Hues this close (degrees) are one colour in another shade: thin type blends its brand navy toward the card it sits on. */\nconst SHADE_HUE = 30;\n/** An ink this dark or this light reads as black or white, however it is tinted. */\nconst NEAR_BLACK_L = 20;\nconst NEAR_WHITE_L = 92;\n\nconst hueGap = (a: number, b: number): number => {\n const d = Math.abs(a - b) % 360;\n return d > 180 ? 360 - d : d;\n};\n\n/** Whether an ink is a lighter or darker shade of one of the palette's colours (same hue, any lightness). */\nfunction shadeOfBrand(hex: string, palette: readonly string[]): boolean {\n const [, , hue] = chroma(hex).lch();\n return palette.some((p) => {\n const [, c, h] = chroma(p).lch();\n return c >= NEUTRAL_CHROMA && !Number.isNaN(h) && !Number.isNaN(hue) && hueGap(h, hue) <= SHADE_HUE;\n });\n}\n\n/**\n * Each saturated ink further than `OFF_BRAND_DELTA_E` from every colour of `palette`, and no\n * shade of one: audited Sept 2026, thin navy body copy on a white card measured as a grey-blue\n * blend and gold on a yellow brand were called off-brand on every version. Near-black and\n * near-white inks never count. Pure.\n */\nexport function offBrandInks(\n inks: ReadonlyArray<{ text: string; hex: string }>,\n palette: readonly string[],\n): OffBrandInk[] {\n if (palette.length === 0) return [];\n return inks.flatMap((ink) => {\n const [lightness, inkChroma] = chroma(ink.hex).lch();\n if (inkChroma < NEUTRAL_CHROMA || lightness < NEAR_BLACK_L || lightness > NEAR_WHITE_L) return [];\n if (shadeOfBrand(ink.hex, palette)) return [];\n const [nearest] = palette\n .map((hex) => ({ hex, deltaE: chroma.deltaE(ink.hex, hex) }))\n .sort((a, b) => a.deltaE - b.deltaE);\n if (!nearest || nearest.deltaE <= OFF_BRAND_DELTA_E) return [];\n return [{ text: ink.text, hex: ink.hex, nearest: nearest.hex, deltaE: nearest.deltaE }];\n });\n}\n","/**\n * Whether a finished static ad prints its copy: every line of the ad spec, in-scene\n * lettering and designed type alike, read back from the picture and compared here.\n *\n * Reader boxes are not the copy's lines: a headline often wraps into two boxes, and a\n * sticker's two lines often come back as one. So the boxes are flattened into one word\n * stream and each line is matched to the run of words it reads best against, scored as\n * 1 - normalised edit distance. A line passes at 98% or better (the bench's \"shippable\"\n * line, `scripts/creative-evals/shippable.mjs`), which on a short line means exact. Words\n * no line claimed are extra words the model invented, except the brand's name and the\n * logo's own wordmark.\n *\n * Case and punctuation are typographic treatments and fold away; accents do not (\"Más\"\n * printed \"Mas\" is a text mistake). Pure.\n */\nimport { distance } from \"fastest-levenshtein\";\nimport type { TextBox } from \"./text-boxes.ts\";\n\n/** The share of a line that may differ (normalised edit distance) and still pass. */\nexport const MAX_LINE_DISTANCE = 0.02;\n\n/** Runs of words this many shorter or longer than the line are tried, so a dropped or added word still finds its line. */\nconst SPAN_SLACK = 2;\n/** Below this, a \"match\" is other text that happens to share letters: the line counts as missing. */\nconst MIN_MATCH = 0.5;\n/** An allowed string (the brand's name) claims words only when it clearly reads as itself. */\nconst ALLOWED_MATCH = 0.8;\n\n/** One line the ad must print; `role` (headline, cta, price…) as the ad spec gives it. */\nexport type ExpectedLine = { text: string; lettering: \"in_scene\" | \"designed\"; role?: string };\n\n/** A line that did not print as written: `read` is the closest run of words, null when nothing came close. */\nexport type LineMismatch = ExpectedLine & { read: string | null; similarity: number };\n\nexport type TextMismatch = { ok: boolean; lines: LineMismatch[]; extra: string[] };\n\n/**\n * A string as the comparison sees it: case, punctuation and spacing folded, letters (accents\n * included), digits and currency kept, a sign always a word apart from its figure. An apostrophe\n * joins its word (\"It's\" and \"Its\" read alike), \"&\" reads \"and\", and the trademark signs, being no\n * letters, drop out.\n */\nexport function normalizeCopy(text: string): string {\n return (\n text\n .replace(/[™®℠©]/g, \"\")\n .normalize(\"NFKC\")\n .toLowerCase()\n .replace(/[’'`´ʼ‘]/g, \"\")\n .replace(/\\s*&\\s*/g, \" and \")\n .replace(/[^\\p{L}\\p{N}%€$£]+/gu, \" \")\n // \"80 %\" and \"80%\" are one figure, and a sign the reader boxed apart from it still reads beside it.\n .replace(/(\\p{N})([%€$£])/gu, \"$1 $2\")\n .replace(/([€$£])(\\p{N})/gu, \"$1 $2\")\n .trim()\n );\n}\n\n/** A status-bar clock (\"9:41\", \"9:14 AM\"): the one piece of interface that reads into a line of copy. */\nconst CLOCK = /^\\d{1,2}:\\d{2}(?:\\s?[ap]\\.?\\s?m\\.?)?$/i;\n\n/**\n * A box an interface the scene draws prints by itself, as the reader read it: a status-bar clock\n * (\"9:41\", \"9:14 AM\"), an avatar's initial, a code editor's line number. Never copy, never extra\n * words; a rating (\"4.8\") or a price (\"29.99\") is neither. Pure.\n */\nexport function isInterfaceChrome(raw: string): boolean {\n const text = raw.trim();\n if (CLOCK.test(text)) return true;\n if (/^\\d{1,3}$/.test(text)) return true;\n return /^\\p{L}$/u.test(text);\n}\n\n/** The vertical extent a box's line takes, never zero. */\nconst lineHeight = (b: TextBox): number => Math.max(b.y1 - b.y0, 0.005);\n\n/** Whether `next` is the line under `last` in one column (below it, close, overlapping it across): the gap between them, else null. */\nexport function continuesColumn(last: TextBox, next: TextBox): number | null {\n if (next.y0 < last.y0 + 0.3 * lineHeight(last)) return null;\n const gap = next.y0 - last.y1;\n if (gap > 1.2 * Math.max(lineHeight(last), lineHeight(next))) return null;\n const overlap = Math.min(last.x1, next.x1) - Math.max(last.x0, next.x0);\n const narrower = Math.min(last.x1 - last.x0, next.x1 - next.x0);\n return narrower > 0 && overlap >= 0.3 * narrower ? gap : null;\n}\n\n/**\n * Whether `next` carries on `last`'s line to its right: the same row, and a gap under a line's\n * height (a colour change splits one line into boxes; a second column sits further off).\n */\nfunction continuesRow(last: TextBox, next: TextBox): boolean {\n const shared = Math.min(last.y1, next.y1) - Math.max(last.y0, next.y0);\n const height = Math.min(lineHeight(last), lineHeight(next));\n const gap = next.x0 - last.x1;\n return shared >= 0.5 * height && gap > -0.5 * height && gap <= Math.max(lineHeight(last), lineHeight(next));\n}\n\ntype Placed<T> = { box: T; index: number };\n/** One printed line: its boxes left to right, and the box they span. */\ntype Row<T> = { items: Array<Placed<T>>; span: TextBox };\n\n/** The boxes as printed lines: boxes side by side on one row join it, left to right. */\nfunction rowsOf<T extends TextBox>(boxes: readonly T[]): Array<Row<T>> {\n const rows: Array<Row<T>> = [];\n const byLeft = boxes.map((box, index) => ({ box, index })).sort((a, b) => a.box.x0 - b.box.x0 || a.index - b.index);\n for (const item of byLeft) {\n const row = rows.find((r) => {\n const last = r.items[r.items.length - 1];\n return last !== undefined && continuesRow(last.box, item.box);\n });\n if (!row) {\n rows.push({ items: [item], span: item.box });\n continue;\n }\n row.items.push(item);\n const { span } = row;\n row.span = {\n text: \"\",\n kind: span.kind,\n x0: Math.min(span.x0, item.box.x0),\n y0: Math.min(span.y0, item.box.y0),\n x1: Math.max(span.x1, item.box.x1),\n y1: Math.max(span.y1, item.box.y1),\n };\n }\n return rows;\n}\n\n/**\n * The boxes as blocks of text read top to bottom, each column on its own: a reader may return\n * a two-column row line by line across both columns, and a line wrapped in one column must still\n * read as one run of words. Boxes side by side on one row are one line, read left to right. Blocks\n * keep the order the reader first met them in. Pure.\n */\nexport function readingOrder<T extends TextBox>(boxes: readonly T[]): T[] {\n const first = (row: Row<T>) => Math.min(...row.items.map((i) => i.index));\n const byTop = rowsOf(boxes).sort((a, b) => a.span.y0 - b.span.y0 || first(a) - first(b));\n const blocks: Array<Array<Row<T>>> = [];\n for (const row of byTop) {\n let best: { block: Array<Row<T>>; gap: number } | null = null;\n for (const block of blocks) {\n const last = block[block.length - 1];\n const gap = last ? continuesColumn(last.span, row.span) : null;\n if (gap !== null && (best === null || gap < best.gap)) best = { block, gap };\n }\n if (best) best.block.push(row);\n else blocks.push([row]);\n }\n return blocks\n .sort((a, b) => Math.min(...a.map(first)) - Math.min(...b.map(first)))\n .flatMap((block) => block.flatMap((row) => row.items.map((i) => i.box)));\n}\n\n/** 1 - normalised edit distance between two normalised strings. */\nexport function copySimilarity(a: string, b: string): number {\n return similarity(a, b);\n}\n\n/**\n * Normalized copy with the letters a sans-serif draws as one stroke made one: a capital I and a\n * lowercase l (normalized, \"i\" and \"l\"). Bench, Oct 2026: \"AI business platform\" read back as\n * \"Al business platform\" blocked an ad whose viewer reads it exactly as written.\n */\nconst sameStroke = (text: string): string => text.replace(/l/g, \"i\");\n\nfunction similarity(a: string, b: string): number {\n const longest = Math.max(a.length, b.length);\n return longest === 0 ? 1 : 1 - distance(sameStroke(a), sameStroke(b)) / longest;\n}\n\ntype Word = { word: string; box: number };\ntype Span = { indexes: number[]; text: string };\ntype Match = { span: Span; similarity: number };\n\n/** Every contiguous run of `words` whose length is within the slack of `size`. */\nfunction spans(words: Word[], size: number): Span[] {\n const out: Span[] = [];\n for (let length = Math.max(1, size - SPAN_SLACK); length <= size + SPAN_SLACK; length++) {\n for (let start = 0; start + length <= words.length; start++) {\n const indexes = Array.from({ length }, (_, i) => start + i);\n out.push({ indexes, text: indexes.map((i) => words[i]?.word ?? \"\").join(\" \") });\n }\n }\n return out;\n}\n\n/** Best pairs first, one to one: a word printed once satisfies one line. */\nfunction assign(targets: string[], words: Word[], claimed: Set<number>, threshold: number): Map<number, Match> {\n const pairs = targets.flatMap((target, index) =>\n target.length === 0\n ? []\n : spans(words, target.split(\" \").length).map((span) => ({\n index,\n span,\n similarity: similarity(target, span.text),\n })),\n );\n pairs.sort((a, b) => b.similarity - a.similarity);\n const matches = new Map<number, Match>();\n for (const pair of pairs) {\n if (pair.similarity < threshold) break;\n if (matches.has(pair.index)) continue;\n if (pair.span.indexes.some((i) => claimed.has(i))) continue;\n matches.set(pair.index, { span: pair.span, similarity: pair.similarity });\n for (const i of pair.span.indexes) claimed.add(i);\n }\n return matches;\n}\n\n/** Every hyphenated compound the copy spells (\"all-natural\"), as the break below compares it. */\nfunction hyphenatedCompounds(texts: readonly string[]): Set<string> {\n const out = new Set<string>();\n for (const text of texts) {\n for (const [compound] of text\n .normalize(\"NFKC\")\n .toLowerCase()\n .matchAll(/\\p{L}+(?:[-‐‑]\\p{L}+)+/gu)) {\n const words = compound.split(/[-‐‑]/u);\n for (let i = 1; i < words.length; i++) out.add(`${words[i - 1]}-${words[i]}`);\n }\n }\n return out;\n}\n\n/** A numbered step's number (\"1.\" in \"1. Make a free profile\"), or null. */\nconst LIST_MARKER = /^\\s*(\\d{1,2})[.)]\\s+(?=\\S)/u;\nconst listMarker = (text: string): string | null => text.match(LIST_MARKER)?.[1] ?? null;\nconst withoutListMarker = (text: string): string => text.replace(LIST_MARKER, \"\");\n\n/** The words the copy sets a trademark sign after (\"Club®\"), as the comparison sees them. */\nfunction trademarked(texts: readonly string[]): Set<string> {\n const out = new Set<string>();\n for (const text of texts) {\n for (const [, word = \"\"] of text.matchAll(/([\\p{L}\\p{N}]+)\\s?[®™]/gu)) out.add(word.toLowerCase());\n }\n return out;\n}\n\n/**\n * A trademark sign the reader spelt out as letters (\"ClubR\", \"ya(TM)\") read as the sign, after a\n * word the copy marks with one. Prod, Oct 2026: \"Join the Club®\" read \"clubr\" blocked a right ad.\n */\nfunction withoutTrademarkLetters(text: string, marked: ReadonlySet<string>): string {\n if (marked.size === 0) return text;\n return text.replace(/([\\p{L}\\p{N}]+)\\s?(?:\\((?:r|tm)\\)|r|tm)(?![\\p{L}\\p{N}])/giu, (whole, word: string) =>\n marked.has(word.toLowerCase()) ? word : whole,\n );\n}\n\n/**\n * A line ending in a hyphen continues on the next: a long word broken at the line end is one\n * word (\"adver-\" / \"tising\"), unless the copy itself spells that hyphen (\"All-\" / \"natural\"\n * for \"All-natural\"), where the hyphen is the word's own and stays.\n */\nfunction joinHyphenBreaks(texts: readonly string[], compounds: ReadonlySet<string>): string[] {\n const out: string[] = [];\n let carry = \"\";\n for (const text of texts) {\n const next = text.trim();\n const before = carry.match(/\\p{L}+$/u)?.[0] ?? \"\";\n const after = next.match(/^\\p{L}+/u)?.[0] ?? \"\";\n const own = carry !== \"\" && compounds.has(`${before}-${after}`.normalize(\"NFKC\").toLowerCase());\n const line = carry + (own ? \"-\" : \"\") + next;\n const broken = line.match(/^(.*\\p{L})[-‐‑]$/u);\n if (broken) carry = broken[1] ?? \"\";\n else {\n out.push(line);\n carry = \"\";\n }\n }\n if (carry) out.push(`${carry}-`);\n return out;\n}\n\n/**\n * A line the copy breaks on purpose (\"15%\\noff\" on a badge) is printed as separate lines,\n * which the reader may return in any order with other text between them: each part is\n * matched on its own, and the line passes when every part does.\n */\nfunction lineParts(text: string): string[] {\n const parts = text.split(/\\r?\\n/).filter((part) => part.trim().length > 0);\n return parts.length > 0 ? parts : [text];\n}\n\n/**\n * The lines of `expected` that did not print as written, and the extra words printed that\n * no line asked for. `allowed` strings (the brand's name) may appear without being extra;\n * logo boxes never count as copy.\n */\nexport function textMismatch(\n expected: readonly ExpectedLine[],\n boxes: readonly TextBox[],\n opts: { allowed?: readonly string[] } = {},\n): TextMismatch {\n const compounds = hyphenatedCompounds(expected.map((line) => line.text));\n // A status-bar clock read between a line's boxes would read into the line, unless the copy is one.\n // Only the clock: a figure or a one-letter word boxed on its own is still a word of its line.\n const clockAsked = expected.some((line) => CLOCK.test(line.text.trim()));\n const read = boxes.filter((b) => b.kind === \"text\" && (clockAsked || !CLOCK.test(b.text.trim())));\n const texts = readingOrder(read).map((b) => b.text);\n const joined = joinHyphenBreaks(texts, compounds);\n const marked = trademarked(expected.map((line) => line.text));\n const words: Word[] = joined.flatMap((text, box) =>\n normalizeCopy(withoutTrademarkLetters(text, marked))\n .split(\" \")\n .filter((word) => word.length > 0)\n .map((word) => ({ word, box })),\n );\n const claimed = new Set<number>();\n const parts = expected.flatMap((line, lineIndex) =>\n lineParts(line.text).map((text) => ({ lineIndex, text: normalizeCopy(withoutListMarker(text)) })),\n );\n const matches = assign(\n parts.map((part) => part.text),\n words,\n claimed,\n MIN_MATCH,\n );\n // A step's number may print with its words, apart in a badge, or as a mark: never a word of the line.\n const markers = expected.flatMap((line) => lineParts(line.text).flatMap((text) => listMarker(text) ?? []));\n const allowed = [...(opts.allowed ?? []), ...markers].map(normalizeCopy).filter((a) => a.length > 0);\n // The brand's name (or a word the scene prints) may show more than once: every occurrence is claimed.\n for (let before = -1; claimed.size !== before; ) {\n before = claimed.size;\n assign(allowed, words, claimed, ALLOWED_MATCH);\n }\n // A line that is the brand's name is printed when the logo carries it (the sender of an email mock-up).\n const logos = boxes.filter((b) => b.kind === \"logo\").map((b) => normalizeCopy(b.text));\n const inLogo = (text: string): boolean => {\n const t = normalizeCopy(text);\n return (\n allowed.some((a) => similarity(a, t) >= ALLOWED_MATCH) && logos.some((l) => similarity(l, t) >= ALLOWED_MATCH)\n );\n };\n\n const lines = expected.flatMap((line, index): LineMismatch[] => {\n if (inLogo(line.text)) return [];\n // A part with nothing to read (\"★★★★★\", \"→\") folds to \"\" and is never matched: it cannot be checked, so it never fails.\n const lineMatches = parts.flatMap((part, partIndex) =>\n part.lineIndex === index && part.text.length > 0 ? [matches.get(partIndex)] : [],\n );\n if (lineMatches.length === 0) return [];\n const score = Math.min(...lineMatches.map((match) => match?.similarity ?? 0));\n if (score >= 1 - MAX_LINE_DISTANCE) return [];\n const read = lineMatches.flatMap((match) => (match ? [match.span.text] : [])).join(\" \");\n return [{ ...line, read: read.length > 0 ? read : null, similarity: score }];\n });\n\n const extra: Array<{ text: string; box: number }> = [];\n words.forEach(({ word, box }, index) => {\n if (claimed.has(index)) return;\n const previous = words[index - 1];\n const last = extra.at(-1);\n if (previous && !claimed.has(index - 1) && previous.box === box && last) {\n last.text += ` ${word}`;\n } else {\n extra.push({ text: word, box });\n }\n });\n const unasked = extra\n .filter((chunk) => !isInterfaceChrome(joined[chunk.box] ?? \"\"))\n // Said back as printed: a figure and its sign together (\"£423 17\").\n .map((chunk) => chunk.text.replace(/(\\p{N}) ([%€$£])/gu, \"$1$2\").replace(/([€$£]) (\\p{N})/gu, \"$1$2\"));\n return { ok: lines.length === 0 && unasked.length === 0, lines, extra: unasked };\n}\n","/**\n * What of a static ad an interface must not cover: its logo and its own copy. What the scene\n * prints (a poster, a quote on a desk, a screen) may sit under any interface, and so may a copy\n * line printed again in the scene while the line itself sits clear. Among the copy, a supporting\n * line (`SUPPORTING_ROLES`) may sit partly under one; the logo, the button, the headline, the\n * figure and the offer may not. The brand's name read as words beside its mark is its wordmark,\n * and so the logo (`withWordmark`). The review measures these boxes and the placer moves the ad for\n * them, so the two never disagree. Pure.\n */\nimport { copySimilarity, type ExpectedLine, normalizeCopy } from \"./copy-match.ts\";\nimport type { TextBox } from \"./text-boxes.ts\";\n\n/** A copy line as these checks need it: its words, and the role it plays. */\nexport type CopyLine = Pick<ExpectedLine, \"text\" | \"role\">;\n\n/** A role as the role sets spell it: \"Call to action\" → \"call_to_action\". */\nexport const roleKey = (role: string | undefined): string =>\n (role ?? \"\")\n .trim()\n .toLowerCase()\n .replace(/[\\s-]+/g, \"_\");\n\n/**\n * Roles of lines that support the ad rather than carry it: one partly under an interface is a note.\n * An unnamed role counts as one that must be seen.\n */\nexport const SUPPORTING_ROLES: ReadonlySet<string> = new Set([\n \"body\",\n \"caption\",\n \"subheadline\",\n \"subhead\",\n \"subtitle\",\n \"supporting\",\n \"support\",\n \"label\",\n \"tagline\",\n \"eyebrow\",\n \"kicker\",\n \"description\",\n \"detail\",\n \"details\",\n \"note\",\n \"fine_print\",\n \"legal\",\n \"disclaimer\",\n \"footnote\",\n \"attribution\",\n]);\n\n/** How close a read must be to the brand's name to be its wordmark (\"Kampe\" for \"Kämpe\", \"KAMPE\"). */\nconst WORDMARK_MATCH = 0.8;\n\n/** The boxes, a text box read close to one of the logo's words (its wordmark) marked as the logo. */\nexport function withWordmark(boxes: readonly TextBox[], logoWords: readonly string[]): TextBox[] {\n const names = logoWords.map(normalizeCopy).filter((n) => n.length > 0);\n const isName = (text: string) => {\n const read = normalizeCopy(text);\n return read.length > 0 && names.some((n) => copySimilarity(n, read) >= WORDMARK_MATCH);\n };\n return boxes.map((b) => (b.kind === \"text\" && isName(b.text) ? { ...b, kind: \"logo\" as const } : b));\n}\n\n/** The boxes a line was read in: every text box whose words are a run of the line's words. */\nexport function boxesOfLine(line: CopyLine, boxes: readonly TextBox[]): TextBox[] {\n const words = ` ${normalizeCopy(line.text)} `;\n return boxes.filter((b) => {\n const read = normalizeCopy(b.text);\n return b.kind === \"text\" && read.length > 0 && words.includes(` ${read} `);\n });\n}\n\n/** One box an interface must not cover, and whether every line it belongs to only supports the ad. */\n/** How far a button reaches past its words on each side, as a share of their height (Dev, Oct 2026: ~0.7). */\nexport const BUTTON_PAD = 0.7;\n\n/** A copy line set as a button: its shape reaches past the words the reader measures. */\nexport const isButtonLine = (line: CopyLine): boolean => /^(cta|button|call_to_action)$/.test(roleKey(line.role));\n\n/** The button around words measured at `box`, kept inside the frame. Pure. */\nexport function buttonShape(box: TextBox): TextBox {\n const pad = BUTTON_PAD * (box.y1 - box.y0);\n return {\n ...box,\n x0: Math.max(0, box.x0 - pad),\n y0: Math.max(0, box.y0 - pad),\n x1: Math.min(1, box.x1 + pad),\n y1: Math.min(1, box.y1 + pad),\n };\n}\n\nexport type ShownBox = { box: TextBox; supporting: boolean };\n\n/**\n * The logo's boxes and the copy's, in the order given, each copy box with whether it only\n * supports the ad. `clear` says whether a box sits clear of the interface: a copy box with the\n * same words in another clear box of the same line is that line printed again, and left out.\n */\nexport function shownBoxes(\n boxes: readonly TextBox[],\n lines: readonly CopyLine[],\n clear: (box: TextBox) => boolean,\n): ShownBox[] {\n const linesOfBox = new Map<TextBox, Array<{ line: CopyLine; found: TextBox[] }>>();\n for (const line of lines) {\n const found = boxesOfLine(line, boxes);\n for (const box of found) linesOfBox.set(box, [...(linesOfBox.get(box) ?? []), { line, found }]);\n }\n const echo = (box: TextBox, of: Array<{ found: TextBox[] }>) =>\n of.every(({ found }) =>\n found.some((other) => other !== box && normalizeCopy(other.text) === normalizeCopy(box.text) && clear(other)),\n );\n return boxes.flatMap((box): ShownBox[] => {\n if (box.kind === \"logo\") return [{ box, supporting: false }];\n const of = linesOfBox.get(box);\n if (!of || echo(box, of)) return [];\n return [{ box, supporting: of.every(({ line }) => SUPPORTING_ROLES.has(roleKey(line.role))) }];\n });\n}\n","/**\n * Where every word and the logo sit in a finished static ad, read by a vision model that\n * answers with boxes.\n *\n * Bench E10 (`.context/static-review/BENCH.md`) compared the Gemini box reader with\n * tesseract and PaddleOCR on renders and on synthetic images with the copy at known places:\n * Gemini read word F1 0.994 / 1.000 with box IoU 0.937 in 4.3 s (about $0.005 an image);\n * Paddle reached F1 0.83 and tesseract 0.49, so no free reader passed the 0.95 gate.\n *\n * One box shape leaves this module, whatever the reader: the text as printed and its\n * rectangle as fractions of the frame, origin top-left. The copy check and the band check\n * never learn how a box was read.\n */\nimport { TEXT_BOX_READER_MODEL } from \"@baker/canvas-contract\";\nimport sharp from \"sharp\";\nimport { z } from \"zod\";\nimport { askAboutImages, type ReviewUsage } from \"./render-review.ts\";\n\nexport type TextBox = { text: string; kind: \"text\" | \"logo\"; x0: number; y0: number; x1: number; y1: number };\n\n/** Gemini's `box_2d` is [ymin, xmin, ymax, xmax] on a 0-1000 grid over the whole image. */\nconst GRID = 1000;\n\nconst ReaderItem = z.object({\n text: z.string(),\n kind: z.enum([\"text\", \"logo\"]),\n box_2d: z.array(z.number()).length(4),\n});\nconst ReaderAnswer = z.object({ items: z.array(ReaderItem) });\n\nconst fraction = (value: number) => Math.min(1, Math.max(0, value / GRID));\n\n/**\n * The reader's answer as boxes; null when the answer is not the shape asked for, which the\n * caller reports as \"not checked\", never as \"no text\". Pure.\n */\nexport function textBoxesFromReader(answer: unknown): TextBox[] | null {\n const parsed = ReaderAnswer.safeParse(answer);\n if (!parsed.success) return null;\n return parsed.data.items.map(({ text, kind, box_2d }) => {\n const [ymin = 0, xmin = 0, ymax = 0, xmax = 0] = box_2d;\n return {\n text,\n kind,\n x0: fraction(Math.min(xmin, xmax)),\n y0: fraction(Math.min(ymin, ymax)),\n x1: fraction(Math.max(xmin, xmax)),\n y1: fraction(Math.max(ymin, ymax)),\n };\n });\n}\n\n/**\n * The reader's instruction: the one bench E10 measured (`scripts/creative-evals/ocr.mjs`),\n * with the JSON shape spelled out because the gateway call asks for no schema. Misspellings\n * are kept as printed: a reader that corrects them would pass the very mistakes it is for.\n * Columns are read apart (audited Sept 2026: a two-column icon row read row by row made every\n * line read the other column's words); `readingOrder` regroups whatever order comes back.\n */\nexport const TEXT_BOX_PROMPT = [\n \"Find every line of visible text in this image and every logo mark.\",\n \"For each, return: `text` exactly as rendered, character for character (keep misspellings, doubled or missing letters and garbled glyphs as they appear; never correct or complete them; for a logo, its wordmark text or an empty string); `kind` text or logo; `box_2d` the tight box around it as [ymin, xmin, ymax, xmax] on a 0-1000 grid over the whole image.\",\n \"One entry per line of each column: a headline wrapped over two lines is two entries, and where text sits in columns, cards or bubbles side by side, each one's lines are their own entries. Never join text from two columns into one entry. List the text block by block in reading order, each block's lines top to bottom. Pseudo-text that is not readable as letters is left out. No text: an empty list.\",\n 'Reply with only this JSON: {\"items\":[{\"text\":\"...\",\"kind\":\"text|logo\",\"box_2d\":[ymin,xmin,ymax,xmax]}]}',\n].join(\"\\n\");\n\n/** Longest edge the reader is sent: the size E10 was measured at. Boxes are fractions, so any size reads the same frame. */\nconst READ_EDGE = 1536;\n\nexport type TextBoxReading = { status: \"read\"; boxes: TextBox[] } | { status: \"not_checked\" };\n\n/**\n * Every line of text and every logo mark in `image`, with its box. `not_checked` when no\n * reader could answer (no gateway key, an outage, an answer out of shape, twice): the\n * checks built on it then say they did not run, and the review falls back to the model\n * that looks at the ad. It never reads as \"no text\".\n */\nexport async function readTextBoxes(\n image: Buffer,\n opts: { onSpend?: (usage: ReviewUsage) => void } = {},\n): Promise<TextBoxReading> {\n let jpeg: string;\n try {\n const resized = await sharp(image)\n .resize(READ_EDGE, READ_EDGE, { fit: \"inside\", withoutEnlargement: true })\n .jpeg({ quality: 90 })\n .toBuffer();\n jpeg = resized.toString(\"base64\");\n } catch {\n return { status: \"not_checked\" };\n }\n for (let attempt = 0; attempt < 2; attempt++) {\n // A transcription, not a judgment: left to think, a read took up to 125 s and pieced together a\n // line the frame cuts (dev, Oct 2026); minimal reasoning read the same lines in 13-17 s.\n const answer = await askAboutImages(TEXT_BOX_READER_MODEL, [jpeg], TEXT_BOX_PROMPT, opts.onSpend, 60_000, {\n effort: \"minimal\",\n });\n const boxes = textBoxesFromReader(answer);\n if (boxes) return { status: \"read\", boxes };\n }\n return { status: \"not_checked\" };\n}\n"],"mappings":"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","names":["sharp","z","read","sharp","sharp","z","tallest","sharp","text"]}
|