@koda-sl/baker-cli 0.442.0 → 0.443.0-dev.043c1d4ac
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 +38 -23
- package/canvas/tiktok-captions-composition/index.html +5 -6
- package/canvas/tiktok-captions-composition/meta.json +5 -0
- package/dist/account-4H7QVBRK.js +80 -0
- package/dist/account-4H7QVBRK.js.map +1 -0
- package/dist/account-IEVEOFIK.js +49 -0
- package/dist/account-IEVEOFIK.js.map +1 -0
- package/dist/account-RDRK7NOE.js +79 -0
- package/dist/account-RDRK7NOE.js.map +1 -0
- package/dist/account-writes-AK42HGRM.js +66 -0
- package/dist/account-writes-AK42HGRM.js.map +1 -0
- package/dist/accounts-4CDRK4S4.js +75 -0
- package/dist/accounts-4CDRK4S4.js.map +1 -0
- package/dist/accounts-4TYIUVWY.js +77 -0
- package/dist/accounts-4TYIUVWY.js.map +1 -0
- package/dist/accounts-5QDKBZMH.js +115 -0
- package/dist/accounts-5QDKBZMH.js.map +1 -0
- package/dist/accounts-6COLJJHM.js +611 -0
- package/dist/accounts-6COLJJHM.js.map +1 -0
- package/dist/accounts-KYJO3JC6.js +114 -0
- package/dist/accounts-KYJO3JC6.js.map +1 -0
- package/dist/actions-PEI6ZQAG.js +55 -0
- package/dist/active-entities-YUSOUR5M.js +103 -0
- package/dist/active-entities-YUSOUR5M.js.map +1 -0
- package/dist/activities-ZVQOBHZH.js +74 -0
- package/dist/activities-ZVQOBHZH.js.map +1 -0
- package/dist/ad-group-writes-QQS4223F.js +170 -0
- package/dist/ad-group-writes-QQS4223F.js.map +1 -0
- package/dist/ad-groups-WGPDPUI2.js +68 -0
- package/dist/ad-groups-WGPDPUI2.js.map +1 -0
- package/dist/ad-writes-XE2IE4DS.js +174 -0
- package/dist/ad-writes-XE2IE4DS.js.map +1 -0
- package/dist/add-577QWMCF.js +97 -0
- package/dist/add-577QWMCF.js.map +1 -0
- package/dist/add-CUWAW7KG.js +105 -0
- package/dist/add-CUWAW7KG.js.map +1 -0
- package/dist/add-XDOQQCHS.js +104 -0
- package/dist/add-XDOQQCHS.js.map +1 -0
- package/dist/add-XEDSBYLM.js +280 -0
- package/dist/add-XEDSBYLM.js.map +1 -0
- package/dist/ads-BCOSQALY.js +77 -0
- package/dist/ads-BCOSQALY.js.map +1 -0
- package/dist/ads-H7GH7A26.js +113 -0
- package/dist/ads-H7GH7A26.js.map +1 -0
- package/dist/ads-TJ7ACFHG.js +40 -0
- package/dist/adsets-H7QT42U6.js +176 -0
- package/dist/adsets-H7QT42U6.js.map +1 -0
- package/dist/advertisers-WSNHNCBQ.js +116 -0
- package/dist/advertisers-WSNHNCBQ.js.map +1 -0
- package/dist/advertisers-YMHPZYNF.js +111 -0
- package/dist/advertisers-YMHPZYNF.js.map +1 -0
- package/dist/analytics-PT2GKCFU.js +1958 -0
- package/dist/analytics-PT2GKCFU.js.map +1 -0
- package/dist/analytics-ZVWUY66X.js +433 -0
- package/dist/analytics-ZVWUY66X.js.map +1 -0
- package/dist/animate-3Z7HXOLE.js +480 -0
- package/dist/animate-3Z7HXOLE.js.map +1 -0
- package/dist/assign-B26AJLGN.js +77 -0
- package/dist/assign-B26AJLGN.js.map +1 -0
- package/dist/audience-size-ZX565D5P.js +94 -0
- package/dist/audience-size-ZX565D5P.js.map +1 -0
- package/dist/audiences-HFRVIE2X.js +85 -0
- package/dist/audiences-HFRVIE2X.js.map +1 -0
- package/dist/audiences-JACGRBNN.js +78 -0
- package/dist/audiences-JACGRBNN.js.map +1 -0
- package/dist/audiences-TGD5US2M.js +268 -0
- package/dist/audiences-TGD5US2M.js.map +1 -0
- package/dist/audit-AD4ZZNJN.js +88 -0
- package/dist/audit-AD4ZZNJN.js.map +1 -0
- package/dist/audit-SAXVPGWS.js +151 -0
- package/dist/audit-SAXVPGWS.js.map +1 -0
- package/dist/autocomplete-6PYFCOMX.js +107 -0
- package/dist/autocomplete-6PYFCOMX.js.map +1 -0
- package/dist/avatars-2UQJXHPV.js +38 -0
- package/dist/bid-pricing-WSHACGX4.js +99 -0
- package/dist/bid-pricing-WSHACGX4.js.map +1 -0
- package/dist/brand-XBABUT52.js +22 -0
- package/dist/brief-KKNC32TA.js +478 -0
- package/dist/brief-KKNC32TA.js.map +1 -0
- package/dist/businesses-JBDQZZIG.js +53 -0
- package/dist/businesses-JBDQZZIG.js.map +1 -0
- package/dist/campaign-groups-G35366AW.js +95 -0
- package/dist/campaign-groups-G35366AW.js.map +1 -0
- package/dist/campaign-writes-SXLZFYF6.js +170 -0
- package/dist/campaign-writes-SXLZFYF6.js.map +1 -0
- package/dist/campaign-writes-ZQGN7FQ3.js +165 -0
- package/dist/campaign-writes-ZQGN7FQ3.js.map +1 -0
- package/dist/campaigns-GXUCHQ2S.js +109 -0
- package/dist/campaigns-GXUCHQ2S.js.map +1 -0
- package/dist/campaigns-WBEG5QA4.js +110 -0
- package/dist/campaigns-WBEG5QA4.js.map +1 -0
- package/dist/campaigns-WECN54WV.js +107 -0
- package/dist/campaigns-WECN54WV.js.map +1 -0
- package/dist/campaigns-YS3OGQXO.js +76 -0
- package/dist/campaigns-YS3OGQXO.js.map +1 -0
- package/dist/canvas-KEXE5P6S.js +46 -0
- package/dist/capabilities-74I5AQ36.js +144 -0
- package/dist/capabilities-74I5AQ36.js.map +1 -0
- package/dist/cards-4477BFEV.js +85 -0
- package/dist/cards-4477BFEV.js.map +1 -0
- package/dist/catalog-IQEQ5TGQ.js +66 -0
- package/dist/catalog-IQEQ5TGQ.js.map +1 -0
- package/dist/catalogs-BRXEDE56.js +128 -0
- package/dist/catalogs-BRXEDE56.js.map +1 -0
- package/dist/changes-6QBJMGJC.js +135 -0
- package/dist/changes-6QBJMGJC.js.map +1 -0
- package/dist/chatgpt-7W75X3ER.js +47 -0
- package/dist/chats-DWHF64IU.js +262 -0
- package/dist/chats-DWHF64IU.js.map +1 -0
- package/dist/chunk-27NMXSC3.js +486 -0
- package/dist/chunk-27NMXSC3.js.map +1 -0
- package/dist/chunk-2CD5ZP7M.js +6659 -0
- package/dist/chunk-2CD5ZP7M.js.map +1 -0
- package/dist/chunk-2TK4DEOE.js +74 -0
- package/dist/chunk-3RJ3VGJP.js +197 -0
- package/dist/chunk-3RJ3VGJP.js.map +1 -0
- package/dist/chunk-4NDCTLI5.js +191 -0
- package/dist/chunk-4NZ47VXO.js +137 -0
- package/dist/chunk-4NZ47VXO.js.map +1 -0
- package/dist/chunk-4SJDDGPV.js +1411 -0
- package/dist/chunk-4SJDDGPV.js.map +1 -0
- package/dist/chunk-5ARG3CQG.js +141 -0
- package/dist/chunk-5HYSKH77.js +315 -0
- package/dist/chunk-5HYSKH77.js.map +1 -0
- package/dist/chunk-5Z2KSVIV.js +67 -0
- package/dist/chunk-654U6NU6.js +534 -0
- package/dist/chunk-654U6NU6.js.map +1 -0
- package/dist/chunk-6B7VKFS4.js +172 -0
- package/dist/chunk-6G5K6ZC6.js +46 -0
- package/dist/chunk-73QKIIIR.js +23 -0
- package/dist/chunk-75FDTDLH.js +96 -0
- package/dist/chunk-75VNSKS3.js +455 -0
- package/dist/chunk-75VNSKS3.js.map +1 -0
- package/dist/chunk-7GPDUS3P.js +494 -0
- package/dist/chunk-7GPDUS3P.js.map +1 -0
- package/dist/chunk-7J6EHOH6.js +274 -0
- package/dist/chunk-7OFNN4CT.js +58 -0
- package/dist/chunk-7QJVPMVB.js +592 -0
- package/dist/chunk-7QJVPMVB.js.map +1 -0
- package/dist/chunk-AN447DQB.js +159 -0
- package/dist/chunk-AN447DQB.js.map +1 -0
- package/dist/chunk-BYDF22T4.js +346 -0
- package/dist/chunk-BYDF22T4.js.map +1 -0
- package/dist/chunk-C6U6UDHJ.js +106 -0
- package/dist/chunk-CLMM6P6B.js +1751 -0
- package/dist/chunk-CLMM6P6B.js.map +1 -0
- package/dist/chunk-DIY6QR3E.js +96 -0
- package/dist/chunk-EFSYTROP.js +94 -0
- package/dist/chunk-EIP4PYCL.js +496 -0
- package/dist/chunk-EIP4PYCL.js.map +1 -0
- package/dist/chunk-EZUG6WE2.js +60 -0
- package/dist/chunk-EZUG6WE2.js.map +1 -0
- package/dist/chunk-F2S5BLPE.js +97 -0
- package/dist/chunk-F2S5BLPE.js.map +1 -0
- package/dist/chunk-FEXDI4NM.js +103 -0
- package/dist/chunk-FHXIEMCG.js +382 -0
- package/dist/chunk-FTWJFDIN.js +23992 -0
- package/dist/chunk-FTWJFDIN.js.map +1 -0
- package/dist/chunk-FXED3VZK.js +174 -0
- package/dist/chunk-FXED3VZK.js.map +1 -0
- package/dist/chunk-GIJT3A5U.js +166 -0
- package/dist/chunk-GIJT3A5U.js.map +1 -0
- package/dist/chunk-H26L3OQY.js +42 -0
- package/dist/chunk-HIPDMQZ6.js +136 -0
- package/dist/chunk-HMEFD2CG.js +5163 -0
- package/dist/chunk-HMEFD2CG.js.map +1 -0
- package/dist/chunk-HO3IUJ4K.js +70 -0
- package/dist/chunk-HO3IUJ4K.js.map +1 -0
- package/dist/chunk-HXTGYOQC.js +813 -0
- package/dist/chunk-HXTGYOQC.js.map +1 -0
- package/dist/chunk-HYCIBVDW.js +98 -0
- package/dist/chunk-ICM2OXZV.js +304 -0
- package/dist/chunk-ICM2OXZV.js.map +1 -0
- package/dist/chunk-IFWP3ZDO.js +215 -0
- package/dist/chunk-IKGWQBKJ.js +422 -0
- package/dist/chunk-IKGWQBKJ.js.map +1 -0
- package/dist/chunk-IXKEWS7X.js +433 -0
- package/dist/chunk-JERXV5A3.js +26 -0
- package/dist/chunk-JM73NDCM.js +163 -0
- package/dist/chunk-JM73NDCM.js.map +1 -0
- package/dist/chunk-K3PN7TN5.js +84 -0
- package/dist/chunk-K3PN7TN5.js.map +1 -0
- package/dist/chunk-KLNKEVIY.js +136 -0
- package/dist/chunk-KNY76UGC.js +84 -0
- package/dist/chunk-KWAOTV7F.js +830 -0
- package/dist/chunk-L3OLEAJN.js +92 -0
- package/dist/chunk-L3OLEAJN.js.map +1 -0
- package/dist/chunk-LERTEZST.js +28 -0
- package/dist/chunk-LL2CD5WU.js +310 -0
- package/dist/chunk-LO6GEJ4Z.js +51 -0
- package/dist/chunk-LS5MTRFI.js +106 -0
- package/dist/chunk-LZ73CZGP.js +188 -0
- package/dist/chunk-MELOSESI.js +20 -0
- package/dist/chunk-MLU6STIN.js +66 -0
- package/dist/chunk-MLU6STIN.js.map +1 -0
- package/dist/chunk-MZL4H5PY.js +225 -0
- package/dist/chunk-MZL4H5PY.js.map +1 -0
- package/dist/chunk-NAWWC5I3.js +454 -0
- package/dist/chunk-NFSLRRIE.js +77 -0
- package/dist/chunk-NFSLRRIE.js.map +1 -0
- package/dist/chunk-NPE7EWBE.js +297 -0
- package/dist/chunk-NU7JSWVA.js +946 -0
- package/dist/chunk-NU7JSWVA.js.map +1 -0
- package/dist/chunk-OBDAYP2P.js +3155 -0
- package/dist/chunk-OBDAYP2P.js.map +1 -0
- package/dist/chunk-OC5IJSIW.js +420 -0
- package/dist/chunk-OC5IJSIW.js.map +1 -0
- package/dist/chunk-OKG6GX2F.js +169 -0
- package/dist/chunk-OTFHEHIU.js +1706 -0
- package/dist/chunk-OTFHEHIU.js.map +1 -0
- package/dist/chunk-PBA3YCZA.js +76 -0
- package/dist/chunk-PWGWMIIJ.js +25 -0
- package/dist/chunk-QHLB5V7J.js +19 -0
- package/dist/chunk-QJE6ZYGI.js +131 -0
- package/dist/chunk-QSN5MZGS.js +74 -0
- package/dist/chunk-QXZYAIWS.js +390 -0
- package/dist/chunk-QXZYAIWS.js.map +1 -0
- package/dist/chunk-RRUJQVWA.js +4372 -0
- package/dist/chunk-RRUJQVWA.js.map +1 -0
- package/dist/chunk-RSW6QJPH.js +217 -0
- package/dist/chunk-RX6F3GEA.js +610 -0
- package/dist/chunk-RX6F3GEA.js.map +1 -0
- package/dist/chunk-SBMIQDCX.js +175 -0
- package/dist/chunk-SJDPHVGE.js +363 -0
- package/dist/chunk-SJDPHVGE.js.map +1 -0
- package/dist/chunk-STIB5DR5.js +56 -0
- package/dist/chunk-TBEUMOEL.js +95 -0
- package/dist/chunk-TCNNOLVZ.js +207 -0
- package/dist/chunk-TCNNOLVZ.js.map +1 -0
- package/dist/chunk-TD2P4HBP.js +55 -0
- package/dist/chunk-URIYUZIN.js +111 -0
- package/dist/chunk-URIYUZIN.js.map +1 -0
- package/dist/chunk-VAJBWA2U.js +75 -0
- package/dist/chunk-VAJBWA2U.js.map +1 -0
- package/dist/chunk-VBHDZSI5.js +57 -0
- package/dist/chunk-VFIOJD5M.js +309 -0
- package/dist/chunk-VVZBBKRC.js +296 -0
- package/dist/chunk-VWCELTQE.js +1079 -0
- package/dist/chunk-VWCELTQE.js.map +1 -0
- package/dist/chunk-W3B4BHQU.js +31 -0
- package/dist/chunk-W3ZHJJVT.js +139 -0
- package/dist/chunk-W3ZHJJVT.js.map +1 -0
- package/dist/chunk-WS2GMOSG.js +74 -0
- package/dist/chunk-XBOK23HI.js +214 -0
- package/dist/chunk-XG3XCHN6.js +26 -0
- package/dist/chunk-XL3BMSYG.js +125 -0
- package/dist/chunk-XWH7CCBL.js +6065 -0
- package/dist/chunk-XWH7CCBL.js.map +1 -0
- package/dist/chunk-XYMPS526.js +622 -0
- package/dist/chunk-Y5ZGWLWP.js +2882 -0
- package/dist/chunk-Y5ZGWLWP.js.map +1 -0
- package/dist/chunk-YBMVHGY3.js +333 -0
- package/dist/chunk-ZJ47BR6X.js +337 -0
- package/dist/chunk-ZJ47BR6X.js.map +1 -0
- package/dist/chunk-ZNBDKK4Y.js +76 -0
- package/dist/chunk-ZNBDKK4Y.js.map +1 -0
- package/dist/chunk-ZXTW3TXY.js +133 -0
- package/dist/chunk-ZXTW3TXY.js.map +1 -0
- package/dist/claim-EIL4ZBSN.js +197 -0
- package/dist/claim-EIL4ZBSN.js.map +1 -0
- package/dist/cli.js +36 -37
- package/dist/cli.js.map +1 -1
- package/dist/client-VHN32ZRE.js +19 -0
- package/dist/code-YS6ZMGX3.js +76 -0
- package/dist/code-YS6ZMGX3.js.map +1 -0
- package/dist/companies-2UG7RDYN.js +195 -0
- package/dist/companies-2UG7RDYN.js.map +1 -0
- package/dist/complete-I4KRFYMD.js +81 -0
- package/dist/complete-I4KRFYMD.js.map +1 -0
- package/dist/config-CQN5FHMZ.js +88 -0
- package/dist/config-CQN5FHMZ.js.map +1 -0
- package/dist/connect-TA5W6YGW.js +36 -0
- package/dist/content-3ZPP4SW2.js +81 -0
- package/dist/content-3ZPP4SW2.js.map +1 -0
- package/dist/conversation-BJI54MI6.js +93 -0
- package/dist/conversation-BJI54MI6.js.map +1 -0
- package/dist/conversion-report-XQBJ6LG4.js +125 -0
- package/dist/conversion-report-XQBJ6LG4.js.map +1 -0
- package/dist/conversion-upload-command-JULHGVIR.js +438 -0
- package/dist/conversion-upload-command-JULHGVIR.js.map +1 -0
- package/dist/conversion-writes-UBCVXP2E.js +120 -0
- package/dist/conversion-writes-UBCVXP2E.js.map +1 -0
- package/dist/conversions-D236RTUK.js +76 -0
- package/dist/conversions-D236RTUK.js.map +1 -0
- package/dist/conversions-VJOJ5S4U.js +135 -0
- package/dist/conversions-VJOJ5S4U.js.map +1 -0
- package/dist/countries-FYHM3IMJ.js +82 -0
- package/dist/countries-FYHM3IMJ.js.map +1 -0
- package/dist/create-E7BIZNUC.js +130 -0
- package/dist/create-E7BIZNUC.js.map +1 -0
- package/dist/create-HKOO7O5L.js +59 -0
- package/dist/create-HKOO7O5L.js.map +1 -0
- package/dist/create-JLQCXAT2.js +207 -0
- package/dist/create-JLQCXAT2.js.map +1 -0
- package/dist/create-VY3RQXOY.js +235 -0
- package/dist/create-VY3RQXOY.js.map +1 -0
- package/dist/creatives-PSWCNY7U.js +87 -0
- package/dist/creatives-PSWCNY7U.js.map +1 -0
- package/dist/creatives-QXMBEA2V.js +51 -0
- package/dist/creatives-QXMBEA2V.js.map +1 -0
- package/dist/creatives-VXQQUH2F.js +182 -0
- package/dist/creatives-VXQQUH2F.js.map +1 -0
- package/dist/credentials-G5BJK7OR.js +1055 -0
- package/dist/credentials-G5BJK7OR.js.map +1 -0
- package/dist/critique-CMLAPVUB.js +1449 -0
- package/dist/critique-CMLAPVUB.js.map +1 -0
- package/dist/critique-O5VNNBPB.js +214 -0
- package/dist/critique-O5VNNBPB.js.map +1 -0
- package/dist/crm-CL7R67FT.js +224 -0
- package/dist/crm-CL7R67FT.js.map +1 -0
- package/dist/crm-GJCAM3DI.js +318 -0
- package/dist/crm-GJCAM3DI.js.map +1 -0
- package/dist/crop-2J4RKJ6B.js +113 -0
- package/dist/crop-2J4RKJ6B.js.map +1 -0
- package/dist/currency-DJDVIR3C.js +88 -0
- package/dist/currency-DJDVIR3C.js.map +1 -0
- package/dist/custom-conversions-6P555U2K.js +125 -0
- package/dist/custom-conversions-6P555U2K.js.map +1 -0
- package/dist/customers-4RJGRR2Y.js +56 -0
- package/dist/delete-3AV3ARMX.js +71 -0
- package/dist/delete-3AV3ARMX.js.map +1 -0
- package/dist/delete-4QXLTL24.js +63 -0
- package/dist/delete-4QXLTL24.js.map +1 -0
- package/dist/delete-A5XD52K4.js +69 -0
- package/dist/delete-A5XD52K4.js.map +1 -0
- package/dist/delete-IJNJTAGW.js +54 -0
- package/dist/delete-IJNJTAGW.js.map +1 -0
- package/dist/delete-MRM2S4Z5.js +71 -0
- package/dist/delete-MRM2S4Z5.js.map +1 -0
- package/dist/delete-R57JFJ3A.js +66 -0
- package/dist/delete-R57JFJ3A.js.map +1 -0
- package/dist/demographics-VMARSTTE.js +138 -0
- package/dist/demographics-VMARSTTE.js.map +1 -0
- package/dist/describe-6NVOWIBE.js +97 -0
- package/dist/describe-6NVOWIBE.js.map +1 -0
- package/dist/describe-P3PPIQME.js +97 -0
- package/dist/describe-P3PPIQME.js.map +1 -0
- package/dist/dimensions-EYAYO27I.js +101 -0
- package/dist/dimensions-EYAYO27I.js.map +1 -0
- package/dist/discard-Y2BKPW4Z.js +66 -0
- package/dist/discard-Y2BKPW4Z.js.map +1 -0
- package/dist/discover-M3ZKKFEL.js +172 -0
- package/dist/discover-M3ZKKFEL.js.map +1 -0
- package/dist/domain-YTHDTRWN.js +98 -0
- package/dist/domain-YTHDTRWN.js.map +1 -0
- package/dist/download-7T6HIJKD.js +299 -0
- package/dist/download-7T6HIJKD.js.map +1 -0
- package/dist/draft-ABGQYDHP.js +328 -0
- package/dist/draft-ABGQYDHP.js.map +1 -0
- package/dist/draft-BGUJDHXR.js +103 -0
- package/dist/draft-BGUJDHXR.js.map +1 -0
- package/dist/draft-KIBMVKSR.js +100 -0
- package/dist/draft-KIBMVKSR.js.map +1 -0
- package/dist/draft-KOLU5BRR.js +217 -0
- package/dist/draft-KOLU5BRR.js.map +1 -0
- package/dist/draft-MNFJ4G3C.js +281 -0
- package/dist/draft-MNFJ4G3C.js.map +1 -0
- package/dist/draft-U6CT6LCC.js +107 -0
- package/dist/draft-U6CT6LCC.js.map +1 -0
- package/dist/draft-YDY2Q2K6.js +233 -0
- package/dist/draft-YDY2Q2K6.js.map +1 -0
- package/dist/draft-ZVVUAMMQ.js +306 -0
- package/dist/draft-ZVVUAMMQ.js.map +1 -0
- package/dist/engine/index.d.ts +10 -0
- package/dist/engine/index.js +16 -17
- package/dist/env-KIP2J2UB.js +43 -0
- package/dist/experiment-LKK77YAN.js +1377 -0
- package/dist/experiment-LKK77YAN.js.map +1 -0
- package/dist/export-JQRMBJ7D.js +168 -0
- package/dist/export-JQRMBJ7D.js.map +1 -0
- package/dist/extract-7QKLME7Z.js +113 -0
- package/dist/extract-7QKLME7Z.js.map +1 -0
- package/dist/facets-UXN4MYPO.js +114 -0
- package/dist/facets-UXN4MYPO.js.map +1 -0
- package/dist/favorites-NSGF4OV5.js +178 -0
- package/dist/favorites-NSGF4OV5.js.map +1 -0
- package/dist/feed-RV4KPPXM.js +157 -0
- package/dist/feed-RV4KPPXM.js.map +1 -0
- package/dist/feedback-3FQYLADC.js +66 -0
- package/dist/feedback-3FQYLADC.js.map +1 -0
- package/dist/feedback-record-DTRZC73R.js +176 -0
- package/dist/feedback-record-DTRZC73R.js.map +1 -0
- package/dist/fetch-UTTJAOLC.js +171 -0
- package/dist/fetch-UTTJAOLC.js.map +1 -0
- package/dist/fetch-XF76JABV.js +139 -0
- package/dist/fetch-XF76JABV.js.map +1 -0
- package/dist/find-OTDIX6V4.js +134 -0
- package/dist/find-OTDIX6V4.js.map +1 -0
- package/dist/fit-KXHYKIA4.js +43 -0
- package/dist/flows-PB4K66NJ.js +244 -0
- package/dist/flows-PB4K66NJ.js.map +1 -0
- package/dist/follow-DUIEGDVK.js +82 -0
- package/dist/follow-DUIEGDVK.js.map +1 -0
- package/dist/follow-competitors-IT5ZVJPE.js +131 -0
- package/dist/follow-competitors-IT5ZVJPE.js.map +1 -0
- package/dist/following-RKC2FLHI.js +109 -0
- package/dist/following-RKC2FLHI.js.map +1 -0
- package/dist/fonts-NTOQS2KU.js +34 -0
- package/dist/forecast-RWDIDDWP.js +104 -0
- package/dist/forecast-RWDIDDWP.js.map +1 -0
- package/dist/funding-NYO65IMT.js +85 -0
- package/dist/funding-NYO65IMT.js.map +1 -0
- package/dist/funnel-XCKPRYTV.js +837 -0
- package/dist/funnel-XCKPRYTV.js.map +1 -0
- package/dist/ga4-UDQ2HA2J.js +55 -0
- package/dist/generate-DMQUS665.js +262 -0
- package/dist/generate-DMQUS665.js.map +1 -0
- package/dist/get-3L6W3E3T.js +59 -0
- package/dist/get-3L6W3E3T.js.map +1 -0
- package/dist/get-67IG7SZI.js +78 -0
- package/dist/get-67IG7SZI.js.map +1 -0
- package/dist/get-6WEYKOY6.js +63 -0
- package/dist/get-6WEYKOY6.js.map +1 -0
- package/dist/get-P743RPSI.js +63 -0
- package/dist/get-P743RPSI.js.map +1 -0
- package/dist/get-WO22OCMZ.js +54 -0
- package/dist/get-WO22OCMZ.js.map +1 -0
- package/dist/get-XN5ZGDIK.js +61 -0
- package/dist/get-XN5ZGDIK.js.map +1 -0
- package/dist/get-YIHTAMRT.js +92 -0
- package/dist/get-YIHTAMRT.js.map +1 -0
- package/dist/gif-53ULFVLR.js +94 -0
- package/dist/gif-53ULFVLR.js.map +1 -0
- package/dist/google-KIBLORXX.js +1872 -0
- package/dist/google-KIBLORXX.js.map +1 -0
- package/dist/google-KTO3PLEU.js +136 -0
- package/dist/google-KTO3PLEU.js.map +1 -0
- package/dist/group-EFZ3AJIE.js +43 -0
- package/dist/group-EFZ3AJIE.js.map +1 -0
- package/dist/group-GKWCCX66.js +43 -0
- package/dist/group-GKWCCX66.js.map +1 -0
- package/dist/gsc-P3QYGDV2.js +30 -0
- package/dist/history-PBFRKLU6.js +133 -0
- package/dist/history-PBFRKLU6.js.map +1 -0
- package/dist/history-Q3QCT64S.js +67 -0
- package/dist/history-Q3QCT64S.js.map +1 -0
- package/dist/hubspot-PMOZST7W.js +779 -0
- package/dist/hubspot-PMOZST7W.js.map +1 -0
- package/dist/icon-I43F77FV.js +137 -0
- package/dist/icon-I43F77FV.js.map +1 -0
- package/dist/ideas-PU7IAX6F.js +32 -0
- package/dist/images-QI2HTX6B.js +90 -0
- package/dist/improve-BCCU5AS6.js +86 -0
- package/dist/improve-BCCU5AS6.js.map +1 -0
- package/dist/ingest-BYJNFOOT.js +23 -0
- package/dist/ingest-ZQM47NVZ.js +107 -0
- package/dist/ingest-ZQM47NVZ.js.map +1 -0
- package/dist/insights-LNAXV2CG.js +122 -0
- package/dist/insights-LNAXV2CG.js.map +1 -0
- package/dist/insights-NZWSJKU4.js +423 -0
- package/dist/insights-NZWSJKU4.js.map +1 -0
- package/dist/inspect-CQH55Q6G.js +189 -0
- package/dist/inspect-CQH55Q6G.js.map +1 -0
- package/dist/inspiration-I4MMKAWA.js +53 -0
- package/dist/intent-ICKFJRT2.js +95 -0
- package/dist/intent-ICKFJRT2.js.map +1 -0
- package/dist/job-L7RJZMSG.js +202 -0
- package/dist/job-L7RJZMSG.js.map +1 -0
- package/dist/job-create-JUDAN52O.js +109 -0
- package/dist/job-create-JUDAN52O.js.map +1 -0
- package/dist/job-status-U43WE3RJ.js +74 -0
- package/dist/job-status-U43WE3RJ.js.map +1 -0
- package/dist/keep-55CPC7DG.js +78 -0
- package/dist/keep-55CPC7DG.js.map +1 -0
- package/dist/keyword-gap-NGPH32FN.js +130 -0
- package/dist/keyword-gap-NGPH32FN.js.map +1 -0
- package/dist/keyword-metrics-E3NJUSEQ.js +197 -0
- package/dist/keyword-metrics-E3NJUSEQ.js.map +1 -0
- package/dist/keywords-for-site-RH47P4GJ.js +124 -0
- package/dist/keywords-for-site-RH47P4GJ.js.map +1 -0
- package/dist/landing-4PA7GCPM.js +28 -0
- package/dist/landing-4PA7GCPM.js.map +1 -0
- package/dist/languages-JDYL2N5F.js +40 -0
- package/dist/languages-JDYL2N5F.js.map +1 -0
- package/dist/languages-JMVNOHMG.js +55 -0
- package/dist/languages-JMVNOHMG.js.map +1 -0
- package/dist/layerize-RPD6SNP6.js +190 -0
- package/dist/layerize-RPD6SNP6.js.map +1 -0
- package/dist/leads-7EVHMNUF.js +293 -0
- package/dist/leads-7EVHMNUF.js.map +1 -0
- package/dist/leads-I7BO5V7P.js +90 -0
- package/dist/leads-I7BO5V7P.js.map +1 -0
- package/dist/learn-HZU3QWNN.js +204 -0
- package/dist/library-ARKRLCNJ.js +109 -0
- package/dist/library-ARKRLCNJ.js.map +1 -0
- package/dist/lighthouse-NQBUCHTW.js +75 -0
- package/dist/lighthouse-NQBUCHTW.js.map +1 -0
- package/dist/line-item-writes-JSR53MID.js +208 -0
- package/dist/line-item-writes-JSR53MID.js.map +1 -0
- package/dist/line-items-2WFLKOOR.js +103 -0
- package/dist/line-items-2WFLKOOR.js.map +1 -0
- package/dist/link-AYXOJQDV.js +64 -0
- package/dist/link-AYXOJQDV.js.map +1 -0
- package/dist/linkedin-M2PVZYLV.js +1008 -0
- package/dist/linkedin-M2PVZYLV.js.map +1 -0
- package/dist/list-3OKEMUFD.js +151 -0
- package/dist/list-3OKEMUFD.js.map +1 -0
- package/dist/list-4MQC23JH.js +63 -0
- package/dist/list-4MQC23JH.js.map +1 -0
- package/dist/list-7MVBXOJT.js +51 -0
- package/dist/list-7MVBXOJT.js.map +1 -0
- package/dist/list-A5UCIR2J.js +65 -0
- package/dist/list-A5UCIR2J.js.map +1 -0
- package/dist/list-AL7N6X2P.js +50 -0
- package/dist/list-AL7N6X2P.js.map +1 -0
- package/dist/list-LI4OGQFW.js +57 -0
- package/dist/list-LI4OGQFW.js.map +1 -0
- package/dist/list-P7NAFN6J.js +76 -0
- package/dist/list-P7NAFN6J.js.map +1 -0
- package/dist/list-QGLIL7J6.js +303 -0
- package/dist/list-QGLIL7J6.js.map +1 -0
- package/dist/locations-2NKBJKBT.js +67 -0
- package/dist/locations-2NKBJKBT.js.map +1 -0
- package/dist/locations-S4U6IJIS.js +40 -0
- package/dist/locations-S4U6IJIS.js.map +1 -0
- package/dist/log-QHR2JNKW.js +92 -0
- package/dist/log-QHR2JNKW.js.map +1 -0
- package/dist/logo-2IP663QO.js +18 -0
- package/dist/lookup-XK45W2SH.js +22 -0
- package/dist/make-ANPR2D2L.js +516 -0
- package/dist/make-ANPR2D2L.js.map +1 -0
- package/dist/map-3BVFAP33.js +404 -0
- package/dist/map-3BVFAP33.js.map +1 -0
- package/dist/mcp-LH5KR6RO.js +476 -0
- package/dist/mcp-LH5KR6RO.js.map +1 -0
- package/dist/media-6CQYG4UY.js +89 -0
- package/dist/media-6CQYG4UY.js.map +1 -0
- package/dist/media-M7E6V2XU.js +15 -0
- package/dist/media-sources-3D246I3O.js +32 -0
- package/dist/members-4DUQHLZH.js +44 -0
- package/dist/members-4DUQHLZH.js.map +1 -0
- package/dist/meta-EZ4SY25M.js +69 -0
- package/dist/metrics-AY4RP54F.js +152 -0
- package/dist/metrics-AY4RP54F.js.map +1 -0
- package/dist/models-5NTC7A5G.js +155 -0
- package/dist/models-5NTC7A5G.js.map +1 -0
- package/dist/normalize-CD4PQRYY.js +138 -0
- package/dist/normalize-CD4PQRYY.js.map +1 -0
- package/dist/normalize-ICQF2AST.js +806 -0
- package/dist/normalize-ICQF2AST.js.map +1 -0
- package/dist/options-6TE5E34Z.js +121 -0
- package/dist/options-6TE5E34Z.js.map +1 -0
- package/dist/output-RAH3TSIL.js +24 -0
- package/dist/page-GS3WLT2C.js +105 -0
- package/dist/page-GS3WLT2C.js.map +1 -0
- package/dist/pages-FXYQLHSJ.js +66 -0
- package/dist/pages-FXYQLHSJ.js.map +1 -0
- package/dist/performance-7LQQCEAW.js +24 -0
- package/dist/pinterest-AUH7WBA7.js +96 -0
- package/dist/pinterest-AUH7WBA7.js.map +1 -0
- package/dist/pixels-TZPF746S.js +60 -0
- package/dist/pixels-TZPF746S.js.map +1 -0
- package/dist/pixels-ZFF4BGUH.js +108 -0
- package/dist/pixels-ZFF4BGUH.js.map +1 -0
- package/dist/preview-AD4GKYIA.js +169 -0
- package/dist/preview-AD4GKYIA.js.map +1 -0
- package/dist/promoted-tweet-writes-F76YIMB6.js +180 -0
- package/dist/promoted-tweet-writes-F76YIMB6.js.map +1 -0
- package/dist/promoted-tweets-EJL37P7K.js +119 -0
- package/dist/promoted-tweets-EJL37P7K.js.map +1 -0
- package/dist/properties-L2XIYQDS.js +101 -0
- package/dist/properties-L2XIYQDS.js.map +1 -0
- package/dist/publish-H5S2IKZP.js +322 -0
- package/dist/publish-H5S2IKZP.js.map +1 -0
- package/dist/query-CPZZNMDY.js +1341 -0
- package/dist/query-CPZZNMDY.js.map +1 -0
- package/dist/query-SGGBCHTF.js +236 -0
- package/dist/query-SGGBCHTF.js.map +1 -0
- package/dist/query-VTGVZQIO.js +247 -0
- package/dist/query-VTGVZQIO.js.map +1 -0
- package/dist/read-LSF7DYTG.js +140 -0
- package/dist/read-LSF7DYTG.js.map +1 -0
- package/dist/reddit-INGPFGP4.js +26 -0
- package/dist/refresh-MKSKISPX.js +94 -0
- package/dist/refresh-MKSKISPX.js.map +1 -0
- package/dist/release-J5LIAIZT.js +60 -0
- package/dist/release-J5LIAIZT.js.map +1 -0
- package/dist/relevant-pages-MTMFMBPD.js +99 -0
- package/dist/relevant-pages-MTMFMBPD.js.map +1 -0
- package/dist/remove-6LGGKMLJ.js +48 -0
- package/dist/remove-6LGGKMLJ.js.map +1 -0
- package/dist/remove-LYEK7VFV.js +50 -0
- package/dist/remove-LYEK7VFV.js.map +1 -0
- package/dist/reopen-FR4UBOG7.js +63 -0
- package/dist/reopen-FR4UBOG7.js.map +1 -0
- package/dist/rerun-3FEOYNG2.js +86 -0
- package/dist/rerun-3FEOYNG2.js.map +1 -0
- package/dist/research-PA53M335.js +59 -0
- package/dist/research-RPJSOWPT.js +226 -0
- package/dist/research-RPJSOWPT.js.map +1 -0
- package/dist/reset-H3ES4WV5.js +54 -0
- package/dist/reset-H3ES4WV5.js.map +1 -0
- package/dist/reset-RCYRE5WO.js +54 -0
- package/dist/reset-RCYRE5WO.js.map +1 -0
- package/dist/resolve-QIDQJCE6.js +121 -0
- package/dist/resolve-QIDQJCE6.js.map +1 -0
- package/dist/retry-PLLCFOJW.js +60 -0
- package/dist/retry-PLLCFOJW.js.map +1 -0
- package/dist/retry-WLVMR7XP.js +62 -0
- package/dist/retry-WLVMR7XP.js.map +1 -0
- package/dist/retry-failed-6HXPUVXJ.js +45 -0
- package/dist/retry-failed-6HXPUVXJ.js.map +1 -0
- package/dist/run-2IM2QOCI.js +61 -0
- package/dist/run-4D7ZCLMF.js +65 -0
- package/dist/run-4D7ZCLMF.js.map +1 -0
- package/dist/scaffold-ad-YYUVL4IP.js +1550 -0
- package/dist/scaffold-ad-YYUVL4IP.js.map +1 -0
- package/dist/scaffold-static-ad-SUEYXLOR.js +948 -0
- package/dist/scaffold-static-ad-SUEYXLOR.js.map +1 -0
- package/dist/scaffold-video-IBH2YJZD.js +874 -0
- package/dist/scaffold-video-IBH2YJZD.js.map +1 -0
- package/dist/schedule-O2K6M43V.js +66 -0
- package/dist/schedule-O2K6M43V.js.map +1 -0
- package/dist/schedule-RXUUCNNI.js +61 -0
- package/dist/schedule-RXUUCNNI.js.map +1 -0
- package/dist/scheduled-agents-2NCGSD76.js +49 -0
- package/dist/schema-6GR77VJG.js +63 -0
- package/dist/schema-6GR77VJG.js.map +1 -0
- package/dist/schema-SFODURN7.js +129 -0
- package/dist/schema-SFODURN7.js.map +1 -0
- package/dist/scrape-ETAMW43A.js +2241 -0
- package/dist/scrape-ETAMW43A.js.map +1 -0
- package/dist/screenshot-YCQF25ZB.js +102 -0
- package/dist/screenshot-YCQF25ZB.js.map +1 -0
- package/dist/search-742XSULP.js +224 -0
- package/dist/search-742XSULP.js.map +1 -0
- package/dist/search-7QVZOWSI.js +174 -0
- package/dist/search-7QVZOWSI.js.map +1 -0
- package/dist/search-MEEM4D3W.js +92 -0
- package/dist/search-MEEM4D3W.js.map +1 -0
- package/dist/search-OQNGSMUH.js +91 -0
- package/dist/search-OQNGSMUH.js.map +1 -0
- package/dist/search-XUIVHGAY.js +26 -0
- package/dist/seeds-N6FF5S4T.js +101 -0
- package/dist/seeds-N6FF5S4T.js.map +1 -0
- package/dist/select-ZWDEVAH2.js +95 -0
- package/dist/sends-WGJVQUMF.js +309 -0
- package/dist/sends-WGJVQUMF.js.map +1 -0
- package/dist/sequences-OIPVR7JL.js +146 -0
- package/dist/sequences-OIPVR7JL.js.map +1 -0
- package/dist/set-prompt-SBEOQGCF.js +187 -0
- package/dist/set-prompt-SBEOQGCF.js.map +1 -0
- package/dist/setup-links-XW4A6L2I.js +141 -0
- package/dist/setup-links-XW4A6L2I.js.map +1 -0
- package/dist/shared-HJDFNID4.js +31 -0
- package/dist/site-6UTQSYIK.js +177 -0
- package/dist/site-6UTQSYIK.js.map +1 -0
- package/dist/sitemaps-POPZJTAX.js +87 -0
- package/dist/sitemaps-POPZJTAX.js.map +1 -0
- package/dist/sites-262H6LM4.js +101 -0
- package/dist/sites-262H6LM4.js.map +1 -0
- package/dist/skills-6TQZLIMP.js +47 -0
- package/dist/skills-6TQZLIMP.js.map +1 -0
- package/dist/sources-QQNWQLUM.js +421 -0
- package/dist/sources-QQNWQLUM.js.map +1 -0
- package/dist/sources-UGMZFZ2E.js +30 -0
- package/dist/stale-QRO3M5R2.js +64 -0
- package/dist/stale-QRO3M5R2.js.map +1 -0
- package/dist/stats-NNXZMPZR.js +34 -0
- package/dist/status-NXGKJGH7.js +62 -0
- package/dist/status-NXGKJGH7.js.map +1 -0
- package/dist/sticker-4KMBSMP5.js +94 -0
- package/dist/sticker-4KMBSMP5.js.map +1 -0
- package/dist/stock-2YCDN3N6.js +179 -0
- package/dist/stock-2YCDN3N6.js.map +1 -0
- package/dist/studio-HUEBE6DS.js +49 -0
- package/dist/sync-CF7FVUQJ.js +54 -0
- package/dist/sync-CF7FVUQJ.js.map +1 -0
- package/dist/sync-RXS6BPLM.js +54 -0
- package/dist/sync-RXS6BPLM.js.map +1 -0
- package/dist/sync-ZSNUBYPM.js +265 -0
- package/dist/sync-ZSNUBYPM.js.map +1 -0
- package/dist/sync-definition-YBDM7D4M.js +54 -0
- package/dist/tag-manager-HREEYGVM.js +43 -0
- package/dist/tags-C65JB762.js +224 -0
- package/dist/tags-C65JB762.js.map +1 -0
- package/dist/tags-CMBKEXIZ.js +20 -0
- package/dist/tags-CMBKEXIZ.js.map +1 -0
- package/dist/tags-GFFQLLG2.js +20 -0
- package/dist/tags-GFFQLLG2.js.map +1 -0
- package/dist/tags-IJN2SPSM.js +20 -0
- package/dist/tags-IJN2SPSM.js.map +1 -0
- package/dist/tags-R3K35KTL.js +26 -0
- package/dist/targeting-constants-XJ2VOW7K.js +118 -0
- package/dist/targeting-constants-XJ2VOW7K.js.map +1 -0
- package/dist/targeting-criteria-IHBPLHSX.js +113 -0
- package/dist/targeting-criteria-IHBPLHSX.js.map +1 -0
- package/dist/targets-JH37NVJF.js +102 -0
- package/dist/targets-JH37NVJF.js.map +1 -0
- package/dist/templates-HXSHQ23T.js +178 -0
- package/dist/templates-HXSHQ23T.js.map +1 -0
- package/dist/testimonials-5QGCPZ6K.js +32 -0
- package/dist/top-companies-FJEFKVI7.js +108 -0
- package/dist/top-companies-FJEFKVI7.js.map +1 -0
- package/dist/translate-H7O5K3RC.js +457 -0
- package/dist/translate-H7O5K3RC.js.map +1 -0
- package/dist/triggers-SEOAAJSS.js +141 -0
- package/dist/triggers-SEOAAJSS.js.map +1 -0
- package/dist/tweets-ATP3FQAC.js +123 -0
- package/dist/tweets-ATP3FQAC.js.map +1 -0
- package/dist/unfollow-CBVPGPF7.js +46 -0
- package/dist/unfollow-CBVPGPF7.js.map +1 -0
- package/dist/unlink-UZDVSHBO.js +67 -0
- package/dist/unlink-UZDVSHBO.js.map +1 -0
- package/dist/unstage-4ZEULXEQ.js +95 -0
- package/dist/unstage-4ZEULXEQ.js.map +1 -0
- package/dist/unstage-CE5RRGM5.js +84 -0
- package/dist/unstage-CE5RRGM5.js.map +1 -0
- package/dist/update-DGZKEP6T.js +63 -0
- package/dist/update-DGZKEP6T.js.map +1 -0
- package/dist/update-JOS4ITAV.js +142 -0
- package/dist/update-JOS4ITAV.js.map +1 -0
- package/dist/update-JZ4I6WW7.js +98 -0
- package/dist/update-JZ4I6WW7.js.map +1 -0
- package/dist/update-ZXOG2V34.js +155 -0
- package/dist/update-ZXOG2V34.js.map +1 -0
- package/dist/upload-L5SYZB3X.js +150 -0
- package/dist/upload-L5SYZB3X.js.map +1 -0
- package/dist/upload-SSOPA7ZT.js +126 -0
- package/dist/upload-SSOPA7ZT.js.map +1 -0
- package/dist/upscale-YWRLFU22.js +109 -0
- package/dist/upscale-YWRLFU22.js.map +1 -0
- package/dist/url-options-QEWKRKZ3.js +127 -0
- package/dist/url-options-QEWKRKZ3.js.map +1 -0
- package/dist/url-params-OR5N5EWT.js +98 -0
- package/dist/url-params-OR5N5EWT.js.map +1 -0
- package/dist/use-UT2DIZOG.js +95 -0
- package/dist/use-UT2DIZOG.js.map +1 -0
- package/dist/validate-2PLHIP6I.js +90 -0
- package/dist/validate-2PLHIP6I.js.map +1 -0
- package/dist/variant-FLZJYGYL.js +338 -0
- package/dist/variant-FLZJYGYL.js.map +1 -0
- package/dist/videos-GIYDCCKR.js +39 -0
- package/dist/view-NPAG66QK.js +121 -0
- package/dist/view-NPAG66QK.js.map +1 -0
- package/dist/viewer-check-VN2JK2LW.js +70 -0
- package/dist/web-WUGLSULO.js +135 -0
- package/dist/web-WUGLSULO.js.map +1 -0
- package/dist/winners-I5BMATJZ.js +79 -0
- package/dist/winners-I5BMATJZ.js.map +1 -0
- package/dist/winning-ads-7QWEIMRU.js +62 -0
- package/dist/write-commands-ERKVRHTC.js +206 -0
- package/dist/write-commands-ERKVRHTC.js.map +1 -0
- package/dist/write-commands-SVJ43D7G.js +1015 -0
- package/dist/write-commands-SVJ43D7G.js.map +1 -0
- package/dist/write-commands-TAYGTJEZ.js +737 -0
- package/dist/write-commands-TAYGTJEZ.js.map +1 -0
- package/dist/write-commands-WTRSOSO3.js +713 -0
- package/dist/write-commands-WTRSOSO3.js.map +1 -0
- package/dist/x-OEAKQBB7.js +47 -0
- package/package.json +1 -1
- package/dist/account-5GT2BEST.js +0 -80
- package/dist/account-5GT2BEST.js.map +0 -1
- package/dist/account-S2RDGMMM.js +0 -81
- package/dist/account-S2RDGMMM.js.map +0 -1
- package/dist/account-YLZAL6W7.js +0 -50
- package/dist/account-YLZAL6W7.js.map +0 -1
- package/dist/account-writes-VBY7FJ7C.js +0 -67
- package/dist/account-writes-VBY7FJ7C.js.map +0 -1
- package/dist/accounts-4IIHAQGS.js +0 -116
- package/dist/accounts-4IIHAQGS.js.map +0 -1
- package/dist/accounts-E7TRNPFA.js +0 -115
- package/dist/accounts-E7TRNPFA.js.map +0 -1
- package/dist/accounts-GFJOGX7J.js +0 -613
- package/dist/accounts-GFJOGX7J.js.map +0 -1
- package/dist/accounts-INB4Z4LZ.js +0 -76
- package/dist/accounts-INB4Z4LZ.js.map +0 -1
- package/dist/accounts-NLL4QWKY.js +0 -78
- package/dist/accounts-NLL4QWKY.js.map +0 -1
- package/dist/actions-7XF5L4U3.js +0 -55
- package/dist/active-entities-IGQG5EZO.js +0 -104
- package/dist/active-entities-IGQG5EZO.js.map +0 -1
- package/dist/activities-MH4C4IVV.js +0 -75
- package/dist/activities-MH4C4IVV.js.map +0 -1
- package/dist/ad-group-writes-B64OBHQ4.js +0 -171
- package/dist/ad-group-writes-B64OBHQ4.js.map +0 -1
- package/dist/ad-groups-APCFB6SI.js +0 -69
- package/dist/ad-groups-APCFB6SI.js.map +0 -1
- package/dist/ad-writes-A7P772KD.js +0 -175
- package/dist/ad-writes-A7P772KD.js.map +0 -1
- package/dist/add-33WQDKGF.js +0 -106
- package/dist/add-33WQDKGF.js.map +0 -1
- package/dist/add-65OIGMD7.js +0 -99
- package/dist/add-65OIGMD7.js.map +0 -1
- package/dist/add-EW276CKL.js +0 -282
- package/dist/add-EW276CKL.js.map +0 -1
- package/dist/add-EXKVB5KR.js +0 -107
- package/dist/add-EXKVB5KR.js.map +0 -1
- package/dist/ads-A2HP6UVG.js +0 -114
- package/dist/ads-A2HP6UVG.js.map +0 -1
- package/dist/ads-H6NPLMNX.js +0 -78
- package/dist/ads-H6NPLMNX.js.map +0 -1
- package/dist/ads-IRE5RZCS.js +0 -40
- package/dist/adsets-UZJTGQQM.js +0 -153
- package/dist/adsets-UZJTGQQM.js.map +0 -1
- package/dist/advertisers-CFS2JAYJ.js +0 -113
- package/dist/advertisers-CFS2JAYJ.js.map +0 -1
- package/dist/advertisers-WQBPBK4D.js +0 -117
- package/dist/advertisers-WQBPBK4D.js.map +0 -1
- package/dist/analytics-L46XME7Y.js +0 -434
- package/dist/analytics-L46XME7Y.js.map +0 -1
- package/dist/analytics-UT7FQ6XA.js +0 -1959
- package/dist/analytics-UT7FQ6XA.js.map +0 -1
- package/dist/animate-S6ZU3723.js +0 -482
- package/dist/animate-S6ZU3723.js.map +0 -1
- package/dist/assign-XHHVXXOL.js +0 -79
- package/dist/assign-XHHVXXOL.js.map +0 -1
- package/dist/audience-size-6FR7WFVU.js +0 -95
- package/dist/audience-size-6FR7WFVU.js.map +0 -1
- package/dist/audiences-BN2LT7E6.js +0 -86
- package/dist/audiences-BN2LT7E6.js.map +0 -1
- package/dist/audiences-HQS6V7EV.js +0 -269
- package/dist/audiences-HQS6V7EV.js.map +0 -1
- package/dist/audiences-JVEXHN67.js +0 -79
- package/dist/audiences-JVEXHN67.js.map +0 -1
- package/dist/audit-7UDFEGZV.js +0 -152
- package/dist/audit-7UDFEGZV.js.map +0 -1
- package/dist/audit-YTRTNTAK.js +0 -89
- package/dist/audit-YTRTNTAK.js.map +0 -1
- package/dist/autocomplete-LAZ6FFG6.js +0 -108
- package/dist/autocomplete-LAZ6FFG6.js.map +0 -1
- package/dist/avatars-G54K55J3.js +0 -38
- package/dist/bid-pricing-EQKORHAA.js +0 -100
- package/dist/bid-pricing-EQKORHAA.js.map +0 -1
- package/dist/brand-ODTHWWFL.js +0 -22
- package/dist/brief-EA4DWOJW.js +0 -479
- package/dist/brief-EA4DWOJW.js.map +0 -1
- package/dist/businesses-QHNI7MSK.js +0 -54
- package/dist/businesses-QHNI7MSK.js.map +0 -1
- package/dist/campaign-groups-EJEGKHQD.js +0 -96
- package/dist/campaign-groups-EJEGKHQD.js.map +0 -1
- package/dist/campaign-writes-DZE43ZOC.js +0 -166
- package/dist/campaign-writes-DZE43ZOC.js.map +0 -1
- package/dist/campaign-writes-OX62FCEH.js +0 -171
- package/dist/campaign-writes-OX62FCEH.js.map +0 -1
- package/dist/campaigns-APRWHCGF.js +0 -111
- package/dist/campaigns-APRWHCGF.js.map +0 -1
- package/dist/campaigns-D2LYKUO2.js +0 -108
- package/dist/campaigns-D2LYKUO2.js.map +0 -1
- package/dist/campaigns-E3H4POUU.js +0 -77
- package/dist/campaigns-E3H4POUU.js.map +0 -1
- package/dist/campaigns-OPLRDMJW.js +0 -110
- package/dist/campaigns-OPLRDMJW.js.map +0 -1
- package/dist/canvas-M5HAG7VA.js +0 -46
- package/dist/capabilities-4Q4CMVIE.js +0 -146
- package/dist/capabilities-4Q4CMVIE.js.map +0 -1
- package/dist/cards-L37M7Q3L.js +0 -86
- package/dist/cards-L37M7Q3L.js.map +0 -1
- package/dist/catalog-HOWAUW2V.js +0 -67
- package/dist/catalog-HOWAUW2V.js.map +0 -1
- package/dist/catalogs-XBIQ4PNK.js +0 -129
- package/dist/catalogs-XBIQ4PNK.js.map +0 -1
- package/dist/changes-HCOPS4FF.js +0 -136
- package/dist/changes-HCOPS4FF.js.map +0 -1
- package/dist/chatgpt-PLKNBNVL.js +0 -47
- package/dist/chats-HELZHJO4.js +0 -264
- package/dist/chats-HELZHJO4.js.map +0 -1
- package/dist/chunk-3KQ5R3H7.js +0 -45
- package/dist/chunk-3KQ5R3H7.js.map +0 -1
- package/dist/chunk-4MU3U3SO.js +0 -103
- package/dist/chunk-4VKV3DNC.js +0 -23992
- package/dist/chunk-4VKV3DNC.js.map +0 -1
- package/dist/chunk-5HH4RGC4.js +0 -136
- package/dist/chunk-5HH4RGC4.js.map +0 -1
- package/dist/chunk-5NQIFCNX.js +0 -141
- package/dist/chunk-6CCDQO2F.js +0 -225
- package/dist/chunk-6CCDQO2F.js.map +0 -1
- package/dist/chunk-6FBZ5E6L.js +0 -96
- package/dist/chunk-6YWRJMGR.js +0 -309
- package/dist/chunk-73MCYA5Z.js +0 -310
- package/dist/chunk-7DQAVVUA.js +0 -130
- package/dist/chunk-7DQAVVUA.js.map +0 -1
- package/dist/chunk-A3PEJ3V3.js +0 -95
- package/dist/chunk-A57AHUNA.js +0 -28
- package/dist/chunk-ABELDLY3.js +0 -594
- package/dist/chunk-ABELDLY3.js.map +0 -1
- package/dist/chunk-AWICKT2B.js +0 -25
- package/dist/chunk-AYC2WM4P.js +0 -106
- package/dist/chunk-AYC2WM4P.js.map +0 -1
- package/dist/chunk-BDD2ILIT.js +0 -56
- package/dist/chunk-BSFTG66P.js +0 -2743
- package/dist/chunk-BSFTG66P.js.map +0 -1
- package/dist/chunk-BSUN6JMU.js +0 -215
- package/dist/chunk-CBEL3P22.js +0 -57
- package/dist/chunk-CSADPKPC.js +0 -161
- package/dist/chunk-CSADPKPC.js.map +0 -1
- package/dist/chunk-DPEQVHTX.js +0 -26
- package/dist/chunk-DQLBKU7G.js +0 -469
- package/dist/chunk-DQLBKU7G.js.map +0 -1
- package/dist/chunk-ECXNE6RJ.js +0 -622
- package/dist/chunk-EDFVATFW.js +0 -211
- package/dist/chunk-EDFVATFW.js.map +0 -1
- package/dist/chunk-EPK2GYLV.js +0 -214
- package/dist/chunk-EYO62URT.js +0 -172
- package/dist/chunk-F3WFP75M.js +0 -94
- package/dist/chunk-F6NJAHAZ.js +0 -19
- package/dist/chunk-F7HBCFUA.js +0 -188
- package/dist/chunk-FCTWXNRC.js +0 -365
- package/dist/chunk-FCTWXNRC.js.map +0 -1
- package/dist/chunk-FFZBW4CC.js +0 -297
- package/dist/chunk-FR345TDN.js +0 -577
- package/dist/chunk-FR345TDN.js.map +0 -1
- package/dist/chunk-FRVROFI6.js +0 -98
- package/dist/chunk-G32FXVQ6.js +0 -31
- package/dist/chunk-HA5D6US2.js +0 -26
- package/dist/chunk-HWWPDUZM.js +0 -217
- package/dist/chunk-IEULFYA2.js +0 -174
- package/dist/chunk-IEULFYA2.js.map +0 -1
- package/dist/chunk-IMZIECST.js +0 -830
- package/dist/chunk-IPF4P6ZQ.js +0 -392
- package/dist/chunk-IPF4P6ZQ.js.map +0 -1
- package/dist/chunk-IRHNWYDT.js +0 -106
- package/dist/chunk-JH7NHC5W.js +0 -169
- package/dist/chunk-JIHG6K7N.js +0 -30
- package/dist/chunk-JIHG6K7N.js.map +0 -1
- package/dist/chunk-JKDITP62.js +0 -1380
- package/dist/chunk-JKDITP62.js.map +0 -1
- package/dist/chunk-JMXBUIVI.js +0 -84
- package/dist/chunk-KHCN2QXV.js +0 -346
- package/dist/chunk-KHCN2QXV.js.map +0 -1
- package/dist/chunk-KY4MPR6R.js +0 -3155
- package/dist/chunk-KY4MPR6R.js.map +0 -1
- package/dist/chunk-L4DOL7L7.js +0 -125
- package/dist/chunk-L6PDFIND.js +0 -496
- package/dist/chunk-L6PDFIND.js.map +0 -1
- package/dist/chunk-L7HPNEKW.js +0 -304
- package/dist/chunk-L7HPNEKW.js.map +0 -1
- package/dist/chunk-LB3VYIS2.js +0 -141
- package/dist/chunk-LB3VYIS2.js.map +0 -1
- package/dist/chunk-LDVMMLRA.js +0 -106
- package/dist/chunk-LQ4HBQ2B.js +0 -433
- package/dist/chunk-LXUEWTHJ.js +0 -788
- package/dist/chunk-LXUEWTHJ.js.map +0 -1
- package/dist/chunk-LYZVLKRA.js +0 -175
- package/dist/chunk-MBKCUSMR.js +0 -6078
- package/dist/chunk-MBKCUSMR.js.map +0 -1
- package/dist/chunk-MPI3SWIT.js +0 -536
- package/dist/chunk-MPI3SWIT.js.map +0 -1
- package/dist/chunk-MXPFUDFR.js +0 -1024
- package/dist/chunk-MXPFUDFR.js.map +0 -1
- package/dist/chunk-N5SQSMMR.js +0 -229
- package/dist/chunk-N5SQSMMR.js.map +0 -1
- package/dist/chunk-NEONVKMJ.js +0 -455
- package/dist/chunk-NEONVKMJ.js.map +0 -1
- package/dist/chunk-NFSV3CDO.js +0 -6198
- package/dist/chunk-NFSV3CDO.js.map +0 -1
- package/dist/chunk-NGT6MARJ.js +0 -274
- package/dist/chunk-NGYKF4T6.js +0 -20
- package/dist/chunk-NMMKTPGI.js +0 -136
- package/dist/chunk-O4AXPEOE.js +0 -923
- package/dist/chunk-O4AXPEOE.js.map +0 -1
- package/dist/chunk-OPEMWO6C.js +0 -5096
- package/dist/chunk-OPEMWO6C.js.map +0 -1
- package/dist/chunk-OZLBLXTK.js +0 -74
- package/dist/chunk-PB4LQHL2.js +0 -4341
- package/dist/chunk-PB4LQHL2.js.map +0 -1
- package/dist/chunk-PDJZMQ7F.js +0 -316
- package/dist/chunk-PDJZMQ7F.js.map +0 -1
- package/dist/chunk-PNHDM76R.js +0 -74
- package/dist/chunk-PNHDM76R.js.map +0 -1
- package/dist/chunk-Q7UF4ERB.js +0 -74
- package/dist/chunk-QRXTDXMX.js +0 -129
- package/dist/chunk-QRXTDXMX.js.map +0 -1
- package/dist/chunk-QTERC4PG.js +0 -1700
- package/dist/chunk-QTERC4PG.js.map +0 -1
- package/dist/chunk-QYOPQRLI.js +0 -296
- package/dist/chunk-R34LJSPM.js +0 -42
- package/dist/chunk-R4ODZS43.js +0 -492
- package/dist/chunk-R4ODZS43.js.map +0 -1
- package/dist/chunk-RJAQEZVD.js +0 -23
- package/dist/chunk-RPFBZHHE.js +0 -55
- package/dist/chunk-SXRSLUW7.js +0 -454
- package/dist/chunk-T5RKIWPQ.js +0 -352
- package/dist/chunk-T5RKIWPQ.js.map +0 -1
- package/dist/chunk-TCSPJQ2X.js +0 -136
- package/dist/chunk-TD44SXQX.js +0 -58
- package/dist/chunk-TQAXOBKJ.js +0 -364
- package/dist/chunk-TQAXOBKJ.js.map +0 -1
- package/dist/chunk-TTFTS2SO.js +0 -131
- package/dist/chunk-UA5EUJXV.js +0 -51
- package/dist/chunk-W7OFLOZB.js +0 -46
- package/dist/chunk-WAQYXH2U.js +0 -76
- package/dist/chunk-WWD4PITU.js +0 -333
- package/dist/chunk-WZ5YRUQU.js +0 -12
- package/dist/chunk-WZ5YRUQU.js.map +0 -1
- package/dist/chunk-XEVVAGAG.js +0 -422
- package/dist/chunk-XEVVAGAG.js.map +0 -1
- package/dist/chunk-Y4JR4RDM.js +0 -74
- package/dist/chunk-YMOVI3WT.js +0 -382
- package/dist/chunk-YS6PCTPS.js +0 -96
- package/dist/chunk-YUP46PWY.js +0 -199
- package/dist/chunk-YUP46PWY.js.map +0 -1
- package/dist/chunk-Z4NYXXTP.js +0 -42
- package/dist/chunk-Z4NYXXTP.js.map +0 -1
- package/dist/chunk-Z5AUNK6P.js +0 -1709
- package/dist/chunk-Z5AUNK6P.js.map +0 -1
- package/dist/chunk-ZAFR46HG.js +0 -67
- package/dist/chunk-ZHW3O25C.js +0 -191
- package/dist/claim-CG2IMTHK.js +0 -199
- package/dist/claim-CG2IMTHK.js.map +0 -1
- package/dist/client-XKDFFS7O.js +0 -20
- package/dist/code-JWIOO2AJ.js +0 -78
- package/dist/code-JWIOO2AJ.js.map +0 -1
- package/dist/companies-LQN4HUUH.js +0 -196
- package/dist/companies-LQN4HUUH.js.map +0 -1
- package/dist/complete-MKB27QP7.js +0 -82
- package/dist/complete-MKB27QP7.js.map +0 -1
- package/dist/config-LJOEAYFZ.js +0 -89
- package/dist/config-LJOEAYFZ.js.map +0 -1
- package/dist/connect-ATGYJNG4.js +0 -37
- package/dist/content-Y2BJSXG6.js +0 -83
- package/dist/content-Y2BJSXG6.js.map +0 -1
- package/dist/conversation-EFNQM435.js +0 -94
- package/dist/conversation-EFNQM435.js.map +0 -1
- package/dist/conversion-report-EUSTSHPV.js +0 -126
- package/dist/conversion-report-EUSTSHPV.js.map +0 -1
- package/dist/conversion-upload-command-677OT5NZ.js +0 -432
- package/dist/conversion-upload-command-677OT5NZ.js.map +0 -1
- package/dist/conversion-writes-E7M6VHGB.js +0 -121
- package/dist/conversion-writes-E7M6VHGB.js.map +0 -1
- package/dist/conversions-BXZLEXHU.js +0 -136
- package/dist/conversions-BXZLEXHU.js.map +0 -1
- package/dist/conversions-FERAOXWG.js +0 -77
- package/dist/conversions-FERAOXWG.js.map +0 -1
- package/dist/countries-TKPX2GDH.js +0 -83
- package/dist/countries-TKPX2GDH.js.map +0 -1
- package/dist/create-HGMIWFVX.js +0 -132
- package/dist/create-HGMIWFVX.js.map +0 -1
- package/dist/create-LBJV3NPD.js +0 -209
- package/dist/create-LBJV3NPD.js.map +0 -1
- package/dist/create-QTPZ7PP7.js +0 -117
- package/dist/create-QTPZ7PP7.js.map +0 -1
- package/dist/create-SBIHEG25.js +0 -60
- package/dist/create-SBIHEG25.js.map +0 -1
- package/dist/creatives-CIOOFE3T.js +0 -88
- package/dist/creatives-CIOOFE3T.js.map +0 -1
- package/dist/creatives-MIUJAK4E.js +0 -49
- package/dist/creatives-MIUJAK4E.js.map +0 -1
- package/dist/creatives-QXR7QDXM.js +0 -183
- package/dist/creatives-QXR7QDXM.js.map +0 -1
- package/dist/credentials-CMVAKAUL.js +0 -1057
- package/dist/credentials-CMVAKAUL.js.map +0 -1
- package/dist/critique-LUB35ORK.js +0 -213
- package/dist/critique-LUB35ORK.js.map +0 -1
- package/dist/critique-XXCM7YAV.js +0 -1477
- package/dist/critique-XXCM7YAV.js.map +0 -1
- package/dist/crm-EGNVKQHB.js +0 -279
- package/dist/crm-EGNVKQHB.js.map +0 -1
- package/dist/crm-I6IQ5M55.js +0 -226
- package/dist/crm-I6IQ5M55.js.map +0 -1
- package/dist/crop-ES2IDPUL.js +0 -115
- package/dist/crop-ES2IDPUL.js.map +0 -1
- package/dist/currency-VFKYXFBM.js +0 -89
- package/dist/currency-VFKYXFBM.js.map +0 -1
- package/dist/custom-conversions-WPTEXOWR.js +0 -126
- package/dist/custom-conversions-WPTEXOWR.js.map +0 -1
- package/dist/customers-ACRYXALZ.js +0 -58
- package/dist/delete-3AHBFPQJ.js +0 -68
- package/dist/delete-3AHBFPQJ.js.map +0 -1
- package/dist/delete-E7WYQN2L.js +0 -73
- package/dist/delete-E7WYQN2L.js.map +0 -1
- package/dist/delete-EJCB5MHV.js +0 -71
- package/dist/delete-EJCB5MHV.js.map +0 -1
- package/dist/delete-J677F4BG.js +0 -64
- package/dist/delete-J677F4BG.js.map +0 -1
- package/dist/delete-LVQ7R6DI.js +0 -73
- package/dist/delete-LVQ7R6DI.js.map +0 -1
- package/dist/delete-U4K6NIOE.js +0 -55
- package/dist/delete-U4K6NIOE.js.map +0 -1
- package/dist/demographics-RY6R6VWA.js +0 -139
- package/dist/demographics-RY6R6VWA.js.map +0 -1
- package/dist/describe-N36XDO4P.js +0 -99
- package/dist/describe-N36XDO4P.js.map +0 -1
- package/dist/describe-Q5OAJDYH.js +0 -99
- package/dist/describe-Q5OAJDYH.js.map +0 -1
- package/dist/dimensions-YIWQVFTO.js +0 -103
- package/dist/dimensions-YIWQVFTO.js.map +0 -1
- package/dist/discard-UO4DJNP3.js +0 -67
- package/dist/discard-UO4DJNP3.js.map +0 -1
- package/dist/discover-IASOLBUQ.js +0 -173
- package/dist/discover-IASOLBUQ.js.map +0 -1
- package/dist/domain-QBF4TBGL.js +0 -100
- package/dist/domain-QBF4TBGL.js.map +0 -1
- package/dist/download-DKFYGXEH.js +0 -301
- package/dist/download-DKFYGXEH.js.map +0 -1
- package/dist/draft-5ZZOTJZR.js +0 -282
- package/dist/draft-5ZZOTJZR.js.map +0 -1
- package/dist/draft-DKMUTG4F.js +0 -104
- package/dist/draft-DKMUTG4F.js.map +0 -1
- package/dist/draft-FMOQUVPP.js +0 -219
- package/dist/draft-FMOQUVPP.js.map +0 -1
- package/dist/draft-KFXJCKCH.js +0 -234
- package/dist/draft-KFXJCKCH.js.map +0 -1
- package/dist/draft-KJ6SH67P.js +0 -101
- package/dist/draft-KJ6SH67P.js.map +0 -1
- package/dist/draft-QW7EYFFU.js +0 -329
- package/dist/draft-QW7EYFFU.js.map +0 -1
- package/dist/draft-URMXE4U4.js +0 -101
- package/dist/draft-URMXE4U4.js.map +0 -1
- package/dist/draft-ZU7MZLIT.js +0 -300
- package/dist/draft-ZU7MZLIT.js.map +0 -1
- package/dist/env-ODWJOKNV.js +0 -44
- package/dist/experiment-TUKKH6UJ.js +0 -1378
- package/dist/experiment-TUKKH6UJ.js.map +0 -1
- package/dist/export-WXFUVX6F.js +0 -170
- package/dist/export-WXFUVX6F.js.map +0 -1
- package/dist/extract-PY3J3WVF.js +0 -115
- package/dist/extract-PY3J3WVF.js.map +0 -1
- package/dist/facets-NUEIHCKA.js +0 -115
- package/dist/facets-NUEIHCKA.js.map +0 -1
- package/dist/favorites-JDFIYSV2.js +0 -180
- package/dist/favorites-JDFIYSV2.js.map +0 -1
- package/dist/feed-CYFNDBJS.js +0 -159
- package/dist/feed-CYFNDBJS.js.map +0 -1
- package/dist/feedback-E2P3NB7H.js +0 -68
- package/dist/feedback-E2P3NB7H.js.map +0 -1
- package/dist/feedback-record-IMCTEDOX.js +0 -137
- package/dist/feedback-record-IMCTEDOX.js.map +0 -1
- package/dist/fetch-ELSDT3NZ.js +0 -141
- package/dist/fetch-ELSDT3NZ.js.map +0 -1
- package/dist/fetch-NM7MD3CN.js +0 -172
- package/dist/fetch-NM7MD3CN.js.map +0 -1
- package/dist/find-HYMLZCKA.js +0 -136
- package/dist/find-HYMLZCKA.js.map +0 -1
- package/dist/fit-5WZ6NVSF.js +0 -44
- package/dist/flows-ZEUUIXCS.js +0 -246
- package/dist/flows-ZEUUIXCS.js.map +0 -1
- package/dist/follow-RGJ76HHD.js +0 -84
- package/dist/follow-RGJ76HHD.js.map +0 -1
- package/dist/follow-competitors-JMNOP2ZT.js +0 -133
- package/dist/follow-competitors-JMNOP2ZT.js.map +0 -1
- package/dist/following-5GINRDTL.js +0 -111
- package/dist/following-5GINRDTL.js.map +0 -1
- package/dist/fonts-7U7I2TWV.js +0 -27
- package/dist/forecast-PGDYFFKQ.js +0 -105
- package/dist/forecast-PGDYFFKQ.js.map +0 -1
- package/dist/funding-ED6PDKJF.js +0 -86
- package/dist/funding-ED6PDKJF.js.map +0 -1
- package/dist/funnel-IML4F5ZP.js +0 -838
- package/dist/funnel-IML4F5ZP.js.map +0 -1
- package/dist/ga4-QPEXE6YG.js +0 -55
- package/dist/generate-VVTQCJRI.js +0 -264
- package/dist/generate-VVTQCJRI.js.map +0 -1
- package/dist/get-CZSESEHU.js +0 -61
- package/dist/get-CZSESEHU.js.map +0 -1
- package/dist/get-DEGOS3R6.js +0 -63
- package/dist/get-DEGOS3R6.js.map +0 -1
- package/dist/get-L3ZGUJJB.js +0 -65
- package/dist/get-L3ZGUJJB.js.map +0 -1
- package/dist/get-NX5DGSRP.js +0 -65
- package/dist/get-NX5DGSRP.js.map +0 -1
- package/dist/get-TL6UET23.js +0 -56
- package/dist/get-TL6UET23.js.map +0 -1
- package/dist/get-UNZMYRB6.js +0 -80
- package/dist/get-UNZMYRB6.js.map +0 -1
- package/dist/get-ZVRRZDUU.js +0 -94
- package/dist/get-ZVRRZDUU.js.map +0 -1
- package/dist/gif-MNBSPA64.js +0 -96
- package/dist/gif-MNBSPA64.js.map +0 -1
- package/dist/google-C2Z4XWRL.js +0 -1866
- package/dist/google-C2Z4XWRL.js.map +0 -1
- package/dist/google-LJSSLBP3.js +0 -138
- package/dist/google-LJSSLBP3.js.map +0 -1
- package/dist/group-7BGYA6LK.js +0 -44
- package/dist/group-7BGYA6LK.js.map +0 -1
- package/dist/group-MPYAKBH5.js +0 -44
- package/dist/group-MPYAKBH5.js.map +0 -1
- package/dist/gsc-LC5ADBA3.js +0 -30
- package/dist/history-GPQE2ZYR.js +0 -68
- package/dist/history-GPQE2ZYR.js.map +0 -1
- package/dist/history-XTSLGMK6.js +0 -135
- package/dist/history-XTSLGMK6.js.map +0 -1
- package/dist/hubspot-GPTEZD3A.js +0 -781
- package/dist/hubspot-GPTEZD3A.js.map +0 -1
- package/dist/icon-YKMRIU7A.js +0 -139
- package/dist/icon-YKMRIU7A.js.map +0 -1
- package/dist/ideas-NEBJBIBM.js +0 -31
- package/dist/images-ASWWS5TH.js +0 -90
- package/dist/improve-VXDJGXTG.js +0 -88
- package/dist/improve-VXDJGXTG.js.map +0 -1
- package/dist/ingest-AW37RWJN.js +0 -109
- package/dist/ingest-AW37RWJN.js.map +0 -1
- package/dist/ingest-X7UPOCKP.js +0 -24
- package/dist/insights-MHUV75RQ.js +0 -424
- package/dist/insights-MHUV75RQ.js.map +0 -1
- package/dist/insights-NLQXAW3F.js +0 -123
- package/dist/insights-NLQXAW3F.js.map +0 -1
- package/dist/inspect-TXVKPBAR.js +0 -191
- package/dist/inspect-TXVKPBAR.js.map +0 -1
- package/dist/inspiration-64DY3QWN.js +0 -53
- package/dist/intent-3HY6DRHW.js +0 -96
- package/dist/intent-3HY6DRHW.js.map +0 -1
- package/dist/job-L73KC4TC.js +0 -203
- package/dist/job-L73KC4TC.js.map +0 -1
- package/dist/job-create-LR3EHWKO.js +0 -110
- package/dist/job-create-LR3EHWKO.js.map +0 -1
- package/dist/job-status-MSL4EAJT.js +0 -75
- package/dist/job-status-MSL4EAJT.js.map +0 -1
- package/dist/keep-XUATLR5B.js +0 -80
- package/dist/keep-XUATLR5B.js.map +0 -1
- package/dist/keyword-gap-DJAYVD4U.js +0 -131
- package/dist/keyword-gap-DJAYVD4U.js.map +0 -1
- package/dist/keyword-metrics-4FEFFTQO.js +0 -198
- package/dist/keyword-metrics-4FEFFTQO.js.map +0 -1
- package/dist/keywords-for-site-HIMEQY63.js +0 -125
- package/dist/keywords-for-site-HIMEQY63.js.map +0 -1
- package/dist/landing-KU3ILVB3.js +0 -28
- package/dist/landing-KU3ILVB3.js.map +0 -1
- package/dist/languages-4QYK5DMW.js +0 -56
- package/dist/languages-4QYK5DMW.js.map +0 -1
- package/dist/languages-L5E7WS77.js +0 -41
- package/dist/languages-L5E7WS77.js.map +0 -1
- package/dist/layerize-YAVLAXYM.js +0 -192
- package/dist/layerize-YAVLAXYM.js.map +0 -1
- package/dist/leads-DR3EK77T.js +0 -91
- package/dist/leads-DR3EK77T.js.map +0 -1
- package/dist/leads-PFPQOCBR.js +0 -286
- package/dist/leads-PFPQOCBR.js.map +0 -1
- package/dist/learn-D4D75X2Y.js +0 -204
- package/dist/library-E2SJS7PT.js +0 -111
- package/dist/library-E2SJS7PT.js.map +0 -1
- package/dist/lighthouse-QMECKX4R.js +0 -76
- package/dist/lighthouse-QMECKX4R.js.map +0 -1
- package/dist/line-item-writes-XMDA7AZQ.js +0 -209
- package/dist/line-item-writes-XMDA7AZQ.js.map +0 -1
- package/dist/line-items-YGKTYKVE.js +0 -104
- package/dist/line-items-YGKTYKVE.js.map +0 -1
- package/dist/link-AOB3WGGN.js +0 -65
- package/dist/link-AOB3WGGN.js.map +0 -1
- package/dist/linkedin-WRJNY6NY.js +0 -1002
- package/dist/linkedin-WRJNY6NY.js.map +0 -1
- package/dist/list-66VKYGKM.js +0 -52
- package/dist/list-66VKYGKM.js.map +0 -1
- package/dist/list-6DZWRLDN.js +0 -59
- package/dist/list-6DZWRLDN.js.map +0 -1
- package/dist/list-6KJWGPPS.js +0 -67
- package/dist/list-6KJWGPPS.js.map +0 -1
- package/dist/list-GXCKA2AN.js +0 -153
- package/dist/list-GXCKA2AN.js.map +0 -1
- package/dist/list-KNHZPT7L.js +0 -65
- package/dist/list-KNHZPT7L.js.map +0 -1
- package/dist/list-LPETG6A6.js +0 -78
- package/dist/list-LPETG6A6.js.map +0 -1
- package/dist/list-WHJNWHSZ.js +0 -53
- package/dist/list-WHJNWHSZ.js.map +0 -1
- package/dist/list-YV5Z2J6U.js +0 -305
- package/dist/list-YV5Z2J6U.js.map +0 -1
- package/dist/locations-4FZYKG2A.js +0 -68
- package/dist/locations-4FZYKG2A.js.map +0 -1
- package/dist/locations-W32YE2KS.js +0 -41
- package/dist/locations-W32YE2KS.js.map +0 -1
- package/dist/log-YVW46HL7.js +0 -94
- package/dist/log-YVW46HL7.js.map +0 -1
- package/dist/logo-7O7VW5R3.js +0 -19
- package/dist/lookup-Z2X5WAO6.js +0 -23
- package/dist/make-Q6BQ7LNT.js +0 -505
- package/dist/make-Q6BQ7LNT.js.map +0 -1
- package/dist/map-VZM5C6DA.js +0 -406
- package/dist/map-VZM5C6DA.js.map +0 -1
- package/dist/mcp-KSJDALG6.js +0 -478
- package/dist/mcp-KSJDALG6.js.map +0 -1
- package/dist/media-7P66TUIR.js +0 -15
- package/dist/media-JBQKYSRQ.js +0 -90
- package/dist/media-JBQKYSRQ.js.map +0 -1
- package/dist/media-sources-427U333M.js +0 -32
- package/dist/members-ABGEFALK.js +0 -46
- package/dist/members-ABGEFALK.js.map +0 -1
- package/dist/meta-JH4FHVNX.js +0 -69
- package/dist/metrics-ALSPX6EQ.js +0 -153
- package/dist/metrics-ALSPX6EQ.js.map +0 -1
- package/dist/models-7BM5BKXX.js +0 -157
- package/dist/models-7BM5BKXX.js.map +0 -1
- package/dist/normalize-DFK3DGGZ.js +0 -808
- package/dist/normalize-DFK3DGGZ.js.map +0 -1
- package/dist/normalize-NDR7YEQE.js +0 -140
- package/dist/normalize-NDR7YEQE.js.map +0 -1
- package/dist/options-G5VGH22X.js +0 -123
- package/dist/options-G5VGH22X.js.map +0 -1
- package/dist/output-ZLXBAA4O.js +0 -25
- package/dist/page-L7BBMINT.js +0 -107
- package/dist/page-L7BBMINT.js.map +0 -1
- package/dist/pages-NBV35ECG.js +0 -67
- package/dist/pages-NBV35ECG.js.map +0 -1
- package/dist/performance-SOMZNPIG.js +0 -25
- package/dist/pinterest-KXAZTRDP.js +0 -98
- package/dist/pinterest-KXAZTRDP.js.map +0 -1
- package/dist/pixels-DYWHXAJT.js +0 -109
- package/dist/pixels-DYWHXAJT.js.map +0 -1
- package/dist/pixels-UMS2QBUG.js +0 -61
- package/dist/pixels-UMS2QBUG.js.map +0 -1
- package/dist/preview-C5FER5SU.js +0 -170
- package/dist/preview-C5FER5SU.js.map +0 -1
- package/dist/promoted-tweet-writes-3PECZLQA.js +0 -181
- package/dist/promoted-tweet-writes-3PECZLQA.js.map +0 -1
- package/dist/promoted-tweets-GMV6WIWV.js +0 -120
- package/dist/promoted-tweets-GMV6WIWV.js.map +0 -1
- package/dist/properties-YAJQF577.js +0 -102
- package/dist/properties-YAJQF577.js.map +0 -1
- package/dist/publish-5WDUTTG5.js +0 -355
- package/dist/publish-5WDUTTG5.js.map +0 -1
- package/dist/query-TBWL52JI.js +0 -1342
- package/dist/query-TBWL52JI.js.map +0 -1
- package/dist/query-VESQSTQI.js +0 -237
- package/dist/query-VESQSTQI.js.map +0 -1
- package/dist/query-XZQSY62P.js +0 -248
- package/dist/query-XZQSY62P.js.map +0 -1
- package/dist/read-UMAWDVKX.js +0 -141
- package/dist/read-UMAWDVKX.js.map +0 -1
- package/dist/reddit-OPHQFRRC.js +0 -27
- package/dist/refresh-U56RE7DI.js +0 -96
- package/dist/refresh-U56RE7DI.js.map +0 -1
- package/dist/release-P66DYNKQ.js +0 -61
- package/dist/release-P66DYNKQ.js.map +0 -1
- package/dist/relevant-pages-DSQQU6F7.js +0 -100
- package/dist/relevant-pages-DSQQU6F7.js.map +0 -1
- package/dist/remove-GRLXSDZC.js +0 -50
- package/dist/remove-GRLXSDZC.js.map +0 -1
- package/dist/remove-IRIP4OKM.js +0 -52
- package/dist/remove-IRIP4OKM.js.map +0 -1
- package/dist/reopen-PMIO7NJJ.js +0 -65
- package/dist/reopen-PMIO7NJJ.js.map +0 -1
- package/dist/rerun-V4O6TKBY.js +0 -84
- package/dist/rerun-V4O6TKBY.js.map +0 -1
- package/dist/research-MG3MESKH.js +0 -59
- package/dist/research-RFPBKIVP.js +0 -228
- package/dist/research-RFPBKIVP.js.map +0 -1
- package/dist/reset-3HKXFAV7.js +0 -56
- package/dist/reset-3HKXFAV7.js.map +0 -1
- package/dist/reset-LQZA3CIB.js +0 -56
- package/dist/reset-LQZA3CIB.js.map +0 -1
- package/dist/resolve-H33CQAY4.js +0 -122
- package/dist/resolve-H33CQAY4.js.map +0 -1
- package/dist/retry-6F3YAVYQ.js +0 -64
- package/dist/retry-6F3YAVYQ.js.map +0 -1
- package/dist/retry-QWD3HWFP.js +0 -62
- package/dist/retry-QWD3HWFP.js.map +0 -1
- package/dist/retry-failed-7OAJ5TMD.js +0 -47
- package/dist/retry-failed-7OAJ5TMD.js.map +0 -1
- package/dist/run-CGZIVYLV.js +0 -67
- package/dist/run-CGZIVYLV.js.map +0 -1
- package/dist/run-PZF26R6H.js +0 -59
- package/dist/scaffold-ad-AI6R4GDU.js +0 -1458
- package/dist/scaffold-ad-AI6R4GDU.js.map +0 -1
- package/dist/scaffold-static-ad-T7ZDHRB3.js +0 -944
- package/dist/scaffold-static-ad-T7ZDHRB3.js.map +0 -1
- package/dist/scaffold-video-R24U2WC7.js +0 -840
- package/dist/scaffold-video-R24U2WC7.js.map +0 -1
- package/dist/schedule-BK44B77G.js +0 -68
- package/dist/schedule-BK44B77G.js.map +0 -1
- package/dist/schedule-F2EEY4UK.js +0 -63
- package/dist/schedule-F2EEY4UK.js.map +0 -1
- package/dist/scheduled-agents-CIEAOWM6.js +0 -49
- package/dist/schema-3B6FDPBF.js +0 -131
- package/dist/schema-3B6FDPBF.js.map +0 -1
- package/dist/schema-4FOZ5W35.js +0 -65
- package/dist/schema-4FOZ5W35.js.map +0 -1
- package/dist/scrape-P46M2J43.js +0 -2243
- package/dist/scrape-P46M2J43.js.map +0 -1
- package/dist/screenshot-6F7G3LN5.js +0 -104
- package/dist/screenshot-6F7G3LN5.js.map +0 -1
- package/dist/search-23LREBOG.js +0 -94
- package/dist/search-23LREBOG.js.map +0 -1
- package/dist/search-DNYAA6TT.js +0 -176
- package/dist/search-DNYAA6TT.js.map +0 -1
- package/dist/search-FORHMB7P.js +0 -27
- package/dist/search-KQMPPO3X.js +0 -226
- package/dist/search-KQMPPO3X.js.map +0 -1
- package/dist/search-X4AKUB2K.js +0 -93
- package/dist/search-X4AKUB2K.js.map +0 -1
- package/dist/seeds-K4CHZ2HU.js +0 -103
- package/dist/seeds-K4CHZ2HU.js.map +0 -1
- package/dist/select-52K6KZGY.js +0 -95
- package/dist/sends-UH2MZGCD.js +0 -310
- package/dist/sends-UH2MZGCD.js.map +0 -1
- package/dist/sequences-BXGO3NPA.js +0 -148
- package/dist/sequences-BXGO3NPA.js.map +0 -1
- package/dist/set-prompt-3IXP42AK.js +0 -186
- package/dist/set-prompt-3IXP42AK.js.map +0 -1
- package/dist/setup-links-OV6ALAUU.js +0 -143
- package/dist/setup-links-OV6ALAUU.js.map +0 -1
- package/dist/shared-VMV44VPB.js +0 -32
- package/dist/site-MQ5ORTKV.js +0 -179
- package/dist/site-MQ5ORTKV.js.map +0 -1
- package/dist/sitemaps-LKCTG2WM.js +0 -88
- package/dist/sitemaps-LKCTG2WM.js.map +0 -1
- package/dist/sites-YHUF7G4Z.js +0 -102
- package/dist/sites-YHUF7G4Z.js.map +0 -1
- package/dist/skills-CG674XHN.js +0 -49
- package/dist/skills-CG674XHN.js.map +0 -1
- package/dist/sources-44THTN2Y.js +0 -422
- package/dist/sources-44THTN2Y.js.map +0 -1
- package/dist/sources-BQNCLGWT.js +0 -30
- package/dist/stale-JGLP7BAC.js +0 -63
- package/dist/stale-JGLP7BAC.js.map +0 -1
- package/dist/stats-TO3J2FU6.js +0 -34
- package/dist/status-NJ3SMBGS.js +0 -64
- package/dist/status-NJ3SMBGS.js.map +0 -1
- package/dist/sticker-YBOWSWMR.js +0 -96
- package/dist/sticker-YBOWSWMR.js.map +0 -1
- package/dist/stock-E6NMDSVI.js +0 -181
- package/dist/stock-E6NMDSVI.js.map +0 -1
- package/dist/studio-LHH62SZC.js +0 -49
- package/dist/sync-2R5UKTHN.js +0 -56
- package/dist/sync-2R5UKTHN.js.map +0 -1
- package/dist/sync-AZRR5JNS.js +0 -266
- package/dist/sync-AZRR5JNS.js.map +0 -1
- package/dist/sync-ML7E5J22.js +0 -56
- package/dist/sync-ML7E5J22.js.map +0 -1
- package/dist/sync-definition-LBPI7P5F.js +0 -48
- package/dist/tag-manager-D3YNI7JG.js +0 -43
- package/dist/tags-BYGKXDDS.js +0 -21
- package/dist/tags-BYGKXDDS.js.map +0 -1
- package/dist/tags-OOQV4G2Y.js +0 -26
- package/dist/tags-TKYXWGN4.js +0 -21
- package/dist/tags-TKYXWGN4.js.map +0 -1
- package/dist/tags-V732MEES.js +0 -226
- package/dist/tags-V732MEES.js.map +0 -1
- package/dist/tags-YLC46IXM.js +0 -21
- package/dist/tags-YLC46IXM.js.map +0 -1
- package/dist/targeting-constants-XT56MOGP.js +0 -119
- package/dist/targeting-constants-XT56MOGP.js.map +0 -1
- package/dist/targeting-criteria-24X3IIJS.js +0 -114
- package/dist/targeting-criteria-24X3IIJS.js.map +0 -1
- package/dist/targets-AKAN2HFY.js +0 -104
- package/dist/targets-AKAN2HFY.js.map +0 -1
- package/dist/templates-7MRVQTB2.js +0 -180
- package/dist/templates-7MRVQTB2.js.map +0 -1
- package/dist/testimonials-OIZMXEYZ.js +0 -32
- package/dist/top-companies-3IG5FRQ2.js +0 -109
- package/dist/top-companies-3IG5FRQ2.js.map +0 -1
- package/dist/triggers-ZHNWHJG4.js +0 -143
- package/dist/triggers-ZHNWHJG4.js.map +0 -1
- package/dist/tweets-V5R5DUA2.js +0 -124
- package/dist/tweets-V5R5DUA2.js.map +0 -1
- package/dist/unfollow-RYDJDDAV.js +0 -48
- package/dist/unfollow-RYDJDDAV.js.map +0 -1
- package/dist/unlink-CS7QNOU2.js +0 -68
- package/dist/unlink-CS7QNOU2.js.map +0 -1
- package/dist/unstage-DDZ5F2Z6.js +0 -86
- package/dist/unstage-DDZ5F2Z6.js.map +0 -1
- package/dist/unstage-KPLOFKU5.js +0 -96
- package/dist/unstage-KPLOFKU5.js.map +0 -1
- package/dist/update-ASY63WIK.js +0 -157
- package/dist/update-ASY63WIK.js.map +0 -1
- package/dist/update-HA5IQCJ2.js +0 -99
- package/dist/update-HA5IQCJ2.js.map +0 -1
- package/dist/update-R3VD5DC3.js +0 -143
- package/dist/update-R3VD5DC3.js.map +0 -1
- package/dist/update-WMCBSNSD.js +0 -64
- package/dist/update-WMCBSNSD.js.map +0 -1
- package/dist/upload-ADEYBWTV.js +0 -152
- package/dist/upload-ADEYBWTV.js.map +0 -1
- package/dist/upload-WBNPIOVR.js +0 -128
- package/dist/upload-WBNPIOVR.js.map +0 -1
- package/dist/upscale-WYTZPUIA.js +0 -111
- package/dist/upscale-WYTZPUIA.js.map +0 -1
- package/dist/url-options-DOCH5AWX.js +0 -128
- package/dist/url-options-DOCH5AWX.js.map +0 -1
- package/dist/url-params-IYTU3MVV.js +0 -99
- package/dist/url-params-IYTU3MVV.js.map +0 -1
- package/dist/use-RGJMULXG.js +0 -97
- package/dist/use-RGJMULXG.js.map +0 -1
- package/dist/validate-T22BKIFK.js +0 -89
- package/dist/validate-T22BKIFK.js.map +0 -1
- package/dist/variant-3DBL2RDV.js +0 -339
- package/dist/variant-3DBL2RDV.js.map +0 -1
- package/dist/videos-7SB2CLZW.js +0 -39
- package/dist/view-5QDCP7HF.js +0 -123
- package/dist/view-5QDCP7HF.js.map +0 -1
- package/dist/viewer-check-NGIMC2BR.js +0 -66
- package/dist/web-IRWXTGE2.js +0 -136
- package/dist/web-IRWXTGE2.js.map +0 -1
- package/dist/winners-JSI4N26Y.js +0 -81
- package/dist/winners-JSI4N26Y.js.map +0 -1
- package/dist/winning-ads-XQZ6HEX5.js +0 -62
- package/dist/write-commands-3C3TV2YC.js +0 -714
- package/dist/write-commands-3C3TV2YC.js.map +0 -1
- package/dist/write-commands-7WIG5UDU.js +0 -731
- package/dist/write-commands-7WIG5UDU.js.map +0 -1
- package/dist/write-commands-G7HHGAEE.js +0 -1009
- package/dist/write-commands-G7HHGAEE.js.map +0 -1
- package/dist/write-commands-ROQSZFXR.js +0 -207
- package/dist/write-commands-ROQSZFXR.js.map +0 -1
- package/dist/x-BLTCL6L3.js +0 -47
- /package/dist/{actions-7XF5L4U3.js.map → actions-PEI6ZQAG.js.map} +0 -0
- /package/dist/{ads-IRE5RZCS.js.map → ads-TJ7ACFHG.js.map} +0 -0
- /package/dist/{avatars-G54K55J3.js.map → avatars-2UQJXHPV.js.map} +0 -0
- /package/dist/{brand-ODTHWWFL.js.map → brand-XBABUT52.js.map} +0 -0
- /package/dist/{canvas-M5HAG7VA.js.map → canvas-KEXE5P6S.js.map} +0 -0
- /package/dist/{chatgpt-PLKNBNVL.js.map → chatgpt-7W75X3ER.js.map} +0 -0
- /package/dist/{chunk-OZLBLXTK.js.map → chunk-2TK4DEOE.js.map} +0 -0
- /package/dist/{chunk-ZHW3O25C.js.map → chunk-4NDCTLI5.js.map} +0 -0
- /package/dist/{chunk-5NQIFCNX.js.map → chunk-5ARG3CQG.js.map} +0 -0
- /package/dist/{chunk-ZAFR46HG.js.map → chunk-5Z2KSVIV.js.map} +0 -0
- /package/dist/{chunk-EYO62URT.js.map → chunk-6B7VKFS4.js.map} +0 -0
- /package/dist/{chunk-W7OFLOZB.js.map → chunk-6G5K6ZC6.js.map} +0 -0
- /package/dist/{chunk-RJAQEZVD.js.map → chunk-73QKIIIR.js.map} +0 -0
- /package/dist/{chunk-YS6PCTPS.js.map → chunk-75FDTDLH.js.map} +0 -0
- /package/dist/{chunk-NGT6MARJ.js.map → chunk-7J6EHOH6.js.map} +0 -0
- /package/dist/{chunk-TD44SXQX.js.map → chunk-7OFNN4CT.js.map} +0 -0
- /package/dist/{chunk-LDVMMLRA.js.map → chunk-C6U6UDHJ.js.map} +0 -0
- /package/dist/{chunk-6FBZ5E6L.js.map → chunk-DIY6QR3E.js.map} +0 -0
- /package/dist/{chunk-F3WFP75M.js.map → chunk-EFSYTROP.js.map} +0 -0
- /package/dist/{chunk-4MU3U3SO.js.map → chunk-FEXDI4NM.js.map} +0 -0
- /package/dist/{chunk-YMOVI3WT.js.map → chunk-FHXIEMCG.js.map} +0 -0
- /package/dist/{chunk-R34LJSPM.js.map → chunk-H26L3OQY.js.map} +0 -0
- /package/dist/{chunk-NMMKTPGI.js.map → chunk-HIPDMQZ6.js.map} +0 -0
- /package/dist/{chunk-FRVROFI6.js.map → chunk-HYCIBVDW.js.map} +0 -0
- /package/dist/{chunk-BSUN6JMU.js.map → chunk-IFWP3ZDO.js.map} +0 -0
- /package/dist/{chunk-LQ4HBQ2B.js.map → chunk-IXKEWS7X.js.map} +0 -0
- /package/dist/{chunk-DPEQVHTX.js.map → chunk-JERXV5A3.js.map} +0 -0
- /package/dist/{chunk-TCSPJQ2X.js.map → chunk-KLNKEVIY.js.map} +0 -0
- /package/dist/{chunk-JMXBUIVI.js.map → chunk-KNY76UGC.js.map} +0 -0
- /package/dist/{chunk-IMZIECST.js.map → chunk-KWAOTV7F.js.map} +0 -0
- /package/dist/{chunk-A57AHUNA.js.map → chunk-LERTEZST.js.map} +0 -0
- /package/dist/{chunk-73MCYA5Z.js.map → chunk-LL2CD5WU.js.map} +0 -0
- /package/dist/{chunk-UA5EUJXV.js.map → chunk-LO6GEJ4Z.js.map} +0 -0
- /package/dist/{chunk-IRHNWYDT.js.map → chunk-LS5MTRFI.js.map} +0 -0
- /package/dist/{chunk-F7HBCFUA.js.map → chunk-LZ73CZGP.js.map} +0 -0
- /package/dist/{chunk-NGYKF4T6.js.map → chunk-MELOSESI.js.map} +0 -0
- /package/dist/{chunk-SXRSLUW7.js.map → chunk-NAWWC5I3.js.map} +0 -0
- /package/dist/{chunk-FFZBW4CC.js.map → chunk-NPE7EWBE.js.map} +0 -0
- /package/dist/{chunk-JH7NHC5W.js.map → chunk-OKG6GX2F.js.map} +0 -0
- /package/dist/{chunk-WAQYXH2U.js.map → chunk-PBA3YCZA.js.map} +0 -0
- /package/dist/{chunk-AWICKT2B.js.map → chunk-PWGWMIIJ.js.map} +0 -0
- /package/dist/{chunk-F6NJAHAZ.js.map → chunk-QHLB5V7J.js.map} +0 -0
- /package/dist/{chunk-TTFTS2SO.js.map → chunk-QJE6ZYGI.js.map} +0 -0
- /package/dist/{chunk-Y4JR4RDM.js.map → chunk-QSN5MZGS.js.map} +0 -0
- /package/dist/{chunk-HWWPDUZM.js.map → chunk-RSW6QJPH.js.map} +0 -0
- /package/dist/{chunk-LYZVLKRA.js.map → chunk-SBMIQDCX.js.map} +0 -0
- /package/dist/{chunk-BDD2ILIT.js.map → chunk-STIB5DR5.js.map} +0 -0
- /package/dist/{chunk-A3PEJ3V3.js.map → chunk-TBEUMOEL.js.map} +0 -0
- /package/dist/{chunk-RPFBZHHE.js.map → chunk-TD2P4HBP.js.map} +0 -0
- /package/dist/{chunk-CBEL3P22.js.map → chunk-VBHDZSI5.js.map} +0 -0
- /package/dist/{chunk-6YWRJMGR.js.map → chunk-VFIOJD5M.js.map} +0 -0
- /package/dist/{chunk-QYOPQRLI.js.map → chunk-VVZBBKRC.js.map} +0 -0
- /package/dist/{chunk-G32FXVQ6.js.map → chunk-W3B4BHQU.js.map} +0 -0
- /package/dist/{chunk-Q7UF4ERB.js.map → chunk-WS2GMOSG.js.map} +0 -0
- /package/dist/{chunk-EPK2GYLV.js.map → chunk-XBOK23HI.js.map} +0 -0
- /package/dist/{chunk-HA5D6US2.js.map → chunk-XG3XCHN6.js.map} +0 -0
- /package/dist/{chunk-L4DOL7L7.js.map → chunk-XL3BMSYG.js.map} +0 -0
- /package/dist/{chunk-ECXNE6RJ.js.map → chunk-XYMPS526.js.map} +0 -0
- /package/dist/{chunk-WWD4PITU.js.map → chunk-YBMVHGY3.js.map} +0 -0
- /package/dist/{client-XKDFFS7O.js.map → client-VHN32ZRE.js.map} +0 -0
- /package/dist/{connect-ATGYJNG4.js.map → connect-TA5W6YGW.js.map} +0 -0
- /package/dist/{customers-ACRYXALZ.js.map → customers-4RJGRR2Y.js.map} +0 -0
- /package/dist/{env-ODWJOKNV.js.map → env-KIP2J2UB.js.map} +0 -0
- /package/dist/{fit-5WZ6NVSF.js.map → fit-KXHYKIA4.js.map} +0 -0
- /package/dist/{fonts-7U7I2TWV.js.map → fonts-NTOQS2KU.js.map} +0 -0
- /package/dist/{ga4-QPEXE6YG.js.map → ga4-UDQ2HA2J.js.map} +0 -0
- /package/dist/{gsc-LC5ADBA3.js.map → gsc-P3QYGDV2.js.map} +0 -0
- /package/dist/{ideas-NEBJBIBM.js.map → ideas-PU7IAX6F.js.map} +0 -0
- /package/dist/{images-ASWWS5TH.js.map → images-QI2HTX6B.js.map} +0 -0
- /package/dist/{ingest-X7UPOCKP.js.map → ingest-BYJNFOOT.js.map} +0 -0
- /package/dist/{inspiration-64DY3QWN.js.map → inspiration-I4MMKAWA.js.map} +0 -0
- /package/dist/{learn-D4D75X2Y.js.map → learn-HZU3QWNN.js.map} +0 -0
- /package/dist/{logo-7O7VW5R3.js.map → logo-2IP663QO.js.map} +0 -0
- /package/dist/{lookup-Z2X5WAO6.js.map → lookup-XK45W2SH.js.map} +0 -0
- /package/dist/{media-7P66TUIR.js.map → media-M7E6V2XU.js.map} +0 -0
- /package/dist/{media-sources-427U333M.js.map → media-sources-3D246I3O.js.map} +0 -0
- /package/dist/{meta-JH4FHVNX.js.map → meta-EZ4SY25M.js.map} +0 -0
- /package/dist/{output-ZLXBAA4O.js.map → output-RAH3TSIL.js.map} +0 -0
- /package/dist/{performance-SOMZNPIG.js.map → performance-7LQQCEAW.js.map} +0 -0
- /package/dist/{reddit-OPHQFRRC.js.map → reddit-INGPFGP4.js.map} +0 -0
- /package/dist/{research-MG3MESKH.js.map → research-PA53M335.js.map} +0 -0
- /package/dist/{run-PZF26R6H.js.map → run-2IM2QOCI.js.map} +0 -0
- /package/dist/{scheduled-agents-CIEAOWM6.js.map → scheduled-agents-2NCGSD76.js.map} +0 -0
- /package/dist/{search-FORHMB7P.js.map → search-XUIVHGAY.js.map} +0 -0
- /package/dist/{select-52K6KZGY.js.map → select-ZWDEVAH2.js.map} +0 -0
- /package/dist/{shared-VMV44VPB.js.map → shared-HJDFNID4.js.map} +0 -0
- /package/dist/{sources-BQNCLGWT.js.map → sources-UGMZFZ2E.js.map} +0 -0
- /package/dist/{stats-TO3J2FU6.js.map → stats-NNXZMPZR.js.map} +0 -0
- /package/dist/{studio-LHH62SZC.js.map → studio-HUEBE6DS.js.map} +0 -0
- /package/dist/{sync-definition-LBPI7P5F.js.map → sync-definition-YBDM7D4M.js.map} +0 -0
- /package/dist/{tag-manager-D3YNI7JG.js.map → tag-manager-HREEYGVM.js.map} +0 -0
- /package/dist/{tags-OOQV4G2Y.js.map → tags-R3K35KTL.js.map} +0 -0
- /package/dist/{testimonials-OIZMXEYZ.js.map → testimonials-5QGCPZ6K.js.map} +0 -0
- /package/dist/{videos-7SB2CLZW.js.map → videos-GIYDCCKR.js.map} +0 -0
- /package/dist/{viewer-check-NGIMC2BR.js.map → viewer-check-VN2JK2LW.js.map} +0 -0
- /package/dist/{winning-ads-XQZ6HEX5.js.map → winning-ads-7QWEIMRU.js.map} +0 -0
- /package/dist/{x-BLTCL6L3.js.map → x-OEAKQBB7.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/landing/critique.ts","../src/engine/landing/lib/constants.ts","../src/engine/landing/lib/rules.ts","../src/engine/landing/lib/critique.ts","../src/commands/landing/snapshot.ts","../src/commands/landing/source-version.ts"],"sourcesContent":["import { readdir, readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { loadBrandTokens } from \"../../engine/landing/lib/brand-tokens.ts\";\nimport { critiqueLanding, type LandingFinding } from \"../../engine/landing/lib/critique.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { CRITIC_VERSION, writeCritiqueSnapshot } from \"./snapshot.ts\";\nimport { computeLandingSourceSha, computeLegacyLandingSourceSha, readLandingSources } from \"./source-version.ts\";\n\nregisterSchema({\n command: \"landing.critique\",\n description:\n \"Start here: `baker landing critique my-landing` after building or editing a landing. Deterministic design-quality critic (ADVISORY — findings never fail it). Flags the known AI 'slop' tells (gradient text, overused fonts, side-tab borders, cream palettes, buzzword copy, broken images…) plus positioning integrity (copy that ranks a competitor above the client, a rival named in a comparison) tiered block/warn/advisory, and records the critique the publish quality gate requires.\",\n args: {\n slug: {\n type: \"string\",\n description:\n \"Landing slug (folder under src/pages/). Pass several, space-separated, to critique them in one call.\",\n required: true,\n },\n full: {\n type: \"boolean\",\n description: \"Also print advisory-tier findings (default: block + warn only)\",\n required: false,\n },\n },\n});\n\n/** One path segment, no traversal, not a `_`-private folder — the slug is the\n * snapshot's filename, so it is parsed here at the boundary. */\nconst SLUG_RE = /^[a-z0-9][a-z0-9._-]*$/i;\n\n/**\n * Every slug the caller asked for, first-seen order, deduped.\n *\n * citty copies EVERY positional onto `_` (not just the ones past the first) and\n * additionally binds the first to `slug`, so `critique a b c` arrives as\n * `slug: \"a\"`, `_: [\"a\", \"b\", \"c\"]`. Deduping is therefore load-bearing, not a\n * nicety — without it the first landing would be critiqued twice.\n *\n * Batching matters because the critic is local and takes milliseconds: the cost\n * of critiquing three landings was three agent round-trips, not three analyses.\n */\nexport function parseCritiqueSlugs(args: { slug?: unknown; _?: unknown }): string[] {\n const rest = Array.isArray(args._) ? args._ : [];\n const all = [args.slug, ...rest].filter((s): s is string => typeof s === \"string\" && s.length > 0);\n return [...new Set(all.map(String))];\n}\n\nfunction fail(code: string, message: string, fix?: Record<string, unknown>): never {\n process.stderr.write(\n `${JSON.stringify({ ok: false, error: { code, message, ...(fix ? { fix } : {}) } }, null, 2)}\\n`,\n );\n process.exit(2);\n}\n\nexport const critiqueCommand = defineCommand({\n meta: {\n name: \"critique\",\n description:\n \"Start here: `baker landing critique <slug>` after building or editing a landing. Deterministic design-quality critic (ADVISORY — findings never fail it). Flags the known AI design tells (gradient text, overused fonts, side-tab borders, cream palettes, buzzword copy, broken images) and positioning integrity (a concession ranking a competitor above the client, a rival named in a comparison) tiered block/warn/advisory, respecting the client's BRAND.md as the allowlist. Also records the critique that publishing requires — run it before finishing a landing.\",\n },\n args: {\n slug: {\n type: \"positional\",\n required: true,\n description: \"Landing slug (folder under src/pages/). Space-separate several to critique them in one call.\",\n },\n full: { type: \"boolean\", description: \"Also print advisory-tier findings\", default: false },\n },\n async run({ args }) {\n const slugs = parseCritiqueSlugs(args);\n const projectRoot = process.cwd();\n\n for (const slug of slugs) {\n if (!SLUG_RE.test(slug) || slug.includes(\"..\")) {\n fail(\n \"INVALID_SLUG\",\n `\"${slug}\" is not a landing slug — use the folder name directly under src/pages/ (letters, digits, dashes; not a path, not a _-private folder).`,\n { availableSlugs: await listLandingSlugs(projectRoot) },\n );\n }\n if (!(await isDir(path.resolve(projectRoot, \"src\", \"pages\", slug)))) {\n fail(\"NOT_FOUND\", `No landing at src/pages/${slug}/`, {\n availableSlugs: await listLandingSlugs(projectRoot),\n });\n }\n }\n\n // Brand tokens are the same for every landing in the call — read once.\n const brand = await loadBrandTokens(projectRoot);\n const competitors = await readCompetitorNames(projectRoot);\n const results = await Promise.all(slugs.map((slug) => critiqueOne(projectRoot, slug, brand, competitors)));\n\n const landings = results.map(({ slug, report }) => ({\n slug,\n overall: report.overall,\n counts: report.counts,\n dimensions: report.dimensions,\n findings: report.findings.filter((f) => (args.full ? true : f.severity !== \"advisory\")).map(present),\n }));\n\n const blocked = results.filter((r) => r.report.counts.block > 0).map((r) => r.slug);\n const snapshotFailures = results.filter((r) => r.snapshotFailed).map((r) => r.slug);\n const hints = [\n blocked.length > 0\n ? `Block-tier tells are held at publish — fix them (${blocked.join(\", \")}). Warn/advisory are guidance. Scores are 0–1 (higher is better).`\n : \"No block-tier tells. Warn/advisory findings are guidance, not gates. Re-run after edits so the publish gate stays fresh.\",\n ...(snapshotFailures.length > 0\n ? [\n `Could not record the critique snapshot for ${snapshotFailures.join(\", \")} (.cache/ not writable?) — the publish quality gate will still report ${snapshotFailures.length === 1 ? \"this landing\" : \"these landings\"} as un-critiqued.`,\n ]\n : []),\n ];\n\n // One landing keeps the original top-level shape so existing readers (docs,\n // skills, the agent's own habits) are unaffected; `landings` is always there.\n const single = landings.length === 1 ? landings[0] : null;\n\n process.stdout.write(\n `${JSON.stringify(\n {\n ok: true,\n data: { advisory: true, ...(single ?? {}), landings },\n hints,\n },\n null,\n 2,\n )}\\n`,\n );\n // Advisory: findings never fail the command. Blocking is the verify/publish\n // gate's job (it reads the snapshot, not this output).\n },\n});\n\n/** Critique one landing and record its freshness snapshot. */\nasync function critiqueOne(\n projectRoot: string,\n slug: string,\n brand: Awaited<ReturnType<typeof loadBrandTokens>>,\n competitors: string[],\n) {\n // `projectRoot` + slug rather than the page's own directory: both of these\n // follow the import graph now, so a landing that renders a section from\n // another page's folder is critiqued on what it actually renders.\n //\n // The legacy sha is recorded alongside for a gate that predates the\n // composition one — see `CritiqueSnapshot`. It reads the landing's own folder\n // and nothing else, so it costs one small walk.\n const [sources, compositionSha, sourceSha] = await Promise.all([\n readLandingSources(projectRoot, slug),\n computeLandingSourceSha(projectRoot, slug),\n computeLegacyLandingSourceSha(path.resolve(projectRoot, \"src\", \"pages\", slug)),\n ]);\n\n const report = critiqueLanding({ slug, sources, brand, competitors });\n\n // Record the freshness snapshot the publish gate reads. Best-effort — but a\n // failed write is SAID (as a hint), never swallowed: silence here would send\n // the agent into a loop where critique \"succeeds\" yet the gate keeps failing.\n let snapshotFailed = false;\n try {\n await writeCritiqueSnapshot(projectRoot, {\n slug,\n compositionSha,\n sourceSha,\n criticVersion: CRITIC_VERSION,\n at: new Date().toISOString(),\n blockCount: report.counts.block,\n warnCount: report.counts.warn,\n });\n } catch {\n snapshotFailed = true;\n }\n\n return { slug, report, snapshotFailed };\n}\n\n/**\n * Competitor names from the vault, for the \"named in a comparison\" rule.\n *\n * The entry's `title:`/`name:` frontmatter is the brand as it would be written\n * on the page; the slug is the fallback. Best-effort by design — a client with\n * no `competitors/` collection yet simply gets an empty list and one fewer\n * rule, never an error.\n */\nasync function readCompetitorNames(projectRoot: string): Promise<string[]> {\n const dir = path.join(projectRoot, \"src\", \"content\", \"competitors\");\n let entries: string[];\n try {\n entries = (await readdir(dir)).filter((f) => f.endsWith(\".md\"));\n } catch {\n return [];\n }\n const names: string[] = [];\n for (const entry of entries) {\n names.push(path.basename(entry, \".md\").replace(/[-_]+/g, \" \"));\n try {\n const head = (await readFile(path.join(dir, entry), \"utf8\")).slice(0, 2000);\n const titled = /^\\s*(?:title|name)\\s*:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/im.exec(head);\n if (titled?.[1]) names.push(titled[1].trim());\n } catch {\n // Unreadable entry — the slug already covers it.\n }\n }\n return names;\n}\n\n/** Landing folders under src/pages/ (for error.fix on a wrong slug). */\nasync function listLandingSlugs(projectRoot: string): Promise<string[]> {\n try {\n const entries = await readdir(path.join(projectRoot, \"src\", \"pages\"), { withFileTypes: true });\n return entries\n .filter((e) => e.isDirectory() && !e.name.startsWith(\"_\") && !e.name.startsWith(\".\"))\n .map((e) => e.name)\n .sort();\n } catch {\n return [];\n }\n}\n\nfunction present(f: LandingFinding) {\n return {\n id: f.id,\n severity: f.severity,\n family: f.family,\n where: f.line ? `${f.file}:${f.line}` : f.file,\n snippet: f.snippet,\n note: f.note,\n ...(f.brandDrift ? { brandDrift: true } : {}),\n };\n}\n\nasync function isDir(p: string): Promise<boolean> {\n try {\n return (await stat(p)).isDirectory();\n } catch {\n return false;\n }\n}\n","/**\n * Landing anti-slop detector — constants.\n *\n * Reimplemented (with sense) from impeccable's deterministic detector\n * (Apache-2.0, github.com/pbakaus/impeccable — `cli/engine/shared/constants.mjs`\n * + `cli/engine/engines/regex/detect-text.mjs`). The thresholds and word lists\n * are the load-bearing facts; the code is Baker-native TypeScript and folds into\n * our landing/brand model (BRAND.md is the allowlist — see `brand-tokens.ts`).\n *\n * Everything here is a plain constant so the rules stay pure and testable.\n */\n\n/** Rendered severity of a finding. `block` fails the verify gate; `warn` prints\n * a non-blocking WARNING; `advisory` is taste-level (and where brand-matched\n * values land after the allowlist downgrades them). */\nexport type Severity = \"block\" | \"warn\" | \"advisory\";\n\n/** The design family a rule belongs to — rolled up into the report's dimensions\n * so the score reads like the canvas critic (one 0–1 score per family). */\nexport type Family = \"typography\" | \"color\" | \"borders_depth\" | \"motion\" | \"spacing\" | \"copy\" | \"integrity\";\n\n/**\n * Faces that signal \"a model made this\" — the training-data monoculture. Naming\n * one requires a reason no other face could satisfy; a subject association\n * (books→serif, tech→mono) is never that reason. Suppressed when the client's\n * BRAND.md commits the face (then it's a decision, not a tell).\n *\n * Entries match a declared family exactly OR as a word-boundary prefix (via\n * `isOverusedFont`), so \"crimson\" covers Crimson Text/Pro and \"ibm plex\" covers\n * every IBM Plex cut.\n */\nexport const OVERUSED_FONTS = new Set<string>([\n // Older monoculture (still ubiquitous):\n \"inter\",\n \"roboto\",\n \"open sans\",\n \"lato\",\n \"montserrat\",\n \"arial\",\n \"helvetica\",\n // Newer monoculture (the Anthropic-skill / Vercel / GitHub default wave):\n \"fraunces\",\n \"instrument sans\",\n \"instrument serif\",\n \"geist\",\n \"geist sans\",\n \"geist mono\",\n \"mona sans\",\n \"plus jakarta sans\",\n \"space grotesk\",\n \"space mono\",\n \"recoleta\",\n \"dm sans\",\n \"dm serif display\",\n \"dm serif text\",\n \"outfit\",\n \"syne\",\n \"cormorant\",\n \"playfair display\",\n \"lora\",\n \"crimson\",\n \"newsreader\",\n \"ibm plex\",\n \"ibm plex sans\",\n \"ibm plex serif\",\n]);\n\n/** Exact or word-boundary-prefix match against `OVERUSED_FONTS` (\"crimson\" hits\n * \"crimson text\"; \"inter\" does NOT hit \"interstate\"). */\nexport function isOverusedFont(family: string): boolean {\n if (OVERUSED_FONTS.has(family)) return true;\n for (const entry of OVERUSED_FONTS) if (family.startsWith(`${entry} `)) return true;\n return false;\n}\n\n/** Generic / system tokens that never count as a \"font choice\". */\nexport const GENERIC_FONTS = new Set<string>([\n \"serif\",\n \"sans-serif\",\n \"monospace\",\n \"cursive\",\n \"fantasy\",\n \"system-ui\",\n \"ui-serif\",\n \"ui-sans-serif\",\n \"ui-monospace\",\n \"ui-rounded\",\n \"-apple-system\",\n \"blinkmacsystemfont\",\n \"segoe ui\",\n \"inherit\",\n \"initial\",\n \"unset\",\n \"revert\",\n]);\n\n/** Em-dash overuse: two gates — an absolute floor AND a density (one dash per\n * N chars of body text). A long article with a few dashes never fires. */\nexport const EM_DASH_FLOOR = 8;\nexport const EM_DASH_CHARS_PER_DASH = 500;\n\n/** Tailwind text-size → px, so the flat-hierarchy analyzer sees utility sizing. */\nexport const TAILWIND_TEXT_PX: Record<string, number> = {\n \"text-xs\": 12,\n \"text-sm\": 14,\n \"text-base\": 16,\n \"text-lg\": 18,\n \"text-xl\": 20,\n \"text-2xl\": 24,\n \"text-3xl\": 30,\n \"text-4xl\": 36,\n \"text-5xl\": 48,\n \"text-6xl\": 60,\n \"text-7xl\": 72,\n \"text-8xl\": 96,\n \"text-9xl\": 128,\n};\n\n/** SaaS marketing filler — the \"hollow confidence\" copy tell. */\nexport const BUZZWORDS: string[] = [\n \"streamline your\",\n \"empower your\",\n \"supercharge your\",\n \"unleash your\",\n \"unleash the power\",\n \"leverage the power\",\n \"built for the modern\",\n \"trusted by leading\",\n \"trusted by the world\",\n \"best-in-class\",\n \"industry-leading\",\n \"world-class\",\n \"enterprise-grade\",\n \"next-generation\",\n \"cutting-edge\",\n \"transform your business\",\n \"revolutionize\",\n \"game-changer\",\n \"game changing\",\n \"mission-critical\",\n \"best of breed\",\n \"future-proof\",\n \"future proof\",\n \"seamless experience\",\n \"seamlessly integrate\",\n \"drive engagement\",\n \"drive growth\",\n \"drive results\",\n \"harness the power\",\n];\n\n/**\n * AI copy tells (see `engine/copy-tells/`) promoted into landing findings, with\n * the count each needs before it fires and the severity it carries.\n *\n * The gates are the load-bearing part. Wikipedia's guide — and the `humanizer`\n * skill built on it — is explicit that isolated tells prove nothing and only\n * CLUSTERS are evidence, so almost everything here needs ≥2 occurrences on the\n * page. Two exceptions, in opposite directions:\n * - `chat-artifact` fires at 1. \"Here is an overview… let me know if\" is never\n * legitimate shipped copy; it means the agent pasted its own conversational\n * frame into the page.\n * - `curly-quote` is absent on purpose. macOS, Word, Google Docs and most\n * CMSes auto-curl by default, so it carries no signal on its own and would\n * fire on almost every page a human touched.\n *\n * Nothing here is `block`: these are strong-but-fallible prose tells, and the\n * pre-commit gate only fails on block-tier findings. Copy judgment stays with\n * the agent and the finish reviewer; this layer just makes the tell visible.\n */\nexport const COPY_TELL_GATES: Record<string, { minCount: number; severity: Severity }> = {\n \"chat-artifact\": { minCount: 1, severity: \"warn\" },\n \"rhetorical-opener\": { minCount: 2, severity: \"warn\" },\n \"negation-pivot\": { minCount: 2, severity: \"warn\" },\n \"vague-attribution\": { minCount: 2, severity: \"warn\" },\n \"participle-tail\": { minCount: 2, severity: \"advisory\" },\n \"copula-avoidance\": { minCount: 2, severity: \"advisory\" },\n \"authority-trope\": { minCount: 2, severity: \"advisory\" },\n signposting: { minCount: 2, severity: \"advisory\" },\n \"hollow-conclusion\": { minCount: 2, severity: \"advisory\" },\n \"filler-phrase\": { minCount: 2, severity: \"advisory\" },\n \"aphorism-formula\": { minCount: 2, severity: \"advisory\" },\n \"false-range\": { minCount: 2, severity: \"advisory\" },\n \"staccato-drama\": { minCount: 2, severity: \"advisory\" },\n \"title-case-heading\": { minCount: 2, severity: \"advisory\" },\n \"inline-header-list\": { minCount: 3, severity: \"advisory\" },\n emoji: { minCount: 3, severity: \"advisory\" },\n};\n\n/**\n * Positioning concessions — copy that ranks somebody else above the client, or\n * denies the client leads at all.\n *\n * These are matched against text that has been lowercased and stripped of\n * diacritics, so the entries carry no accents and no capitals.\n *\n * This exists because a paid landing shipped, on four pages, an FAQ answer\n * conceding that a named competitor's builder beat the client's own — and\n * nothing objected. Every truth guardrail in the landing skill points one way,\n * at overclaiming (`agent-washing`, invented stats, aspirational badges), and a\n * page that talks the client DOWN passes all of them: the claim is true,\n * specific, and survives the swap test with room to spare.\n *\n * Two families, both narrow on purpose, because this fires at one occurrence\n * and holds the publish:\n * - CEDES: superiority handed to somebody else (\"better than ours\").\n * - DENIES: the client denying it leads (\"we're not the best\").\n * A disqualifier (\"we are not an agency\", \"we're not the cheapest\") is good\n * positioning and must never fire — hence PRICE_CONCESSION_CONTEXT, which\n * exempts the premium-positioning move that reads identically.\n */\nexport const CONCESSION_PATTERNS: RegExp[] = [\n // Cedes superiority to somebody else.\n /\\b(?:mejor|peor)(?:es)? que (?:el |la |lo |los |las )?nuestr[oa]s?\\b/g,\n /\\bmas [a-z]+ que (?:el |la |lo |los |las )?nuestr[oa]s?\\b/g,\n /\\b(?:melhor|pior)(?:es)? que (?:o |a |os |as )?noss[oa]s?\\b/g,\n /\\bmais [a-z]+ que (?:o |a |os |as )?noss[oa]s?\\b/g,\n /\\bbetter than (?:ours|our own)\\b/g,\n /\\b(?:ellos|ellas) lo hacen mejor\\b/g,\n /\\beles fazem melhor\\b/g,\n /\\bthey do it better\\b/g,\n /\\bnos (?:ganan|superan|adelantan) en\\b/g,\n /\\bnos (?:ganham|superam) em\\b/g,\n // Denies the client leads.\n /\\b(?:hoy |actualmente )?no somos nosotros\\b/g,\n /\\b(?:hoje |atualmente )?nao somos nos\\b/g,\n /\\bno somos (?:el|la|los|las) (?:mejor|mas) [a-z]+/g,\n /\\bno somos (?:el|la|los|las) (?:mejores|mejor)\\b/g,\n /\\bnao somos (?:o|a|os|as) (?:melhor|melhores|mais) ?[a-z]*/g,\n /\\bwe(?:'re| are) not the (?:best|most|leading|strongest)\\b/g,\n /\\b(?:it|that)(?:'s| is) not us\\b/g,\n];\n\n/** A concession about PRICE is premium positioning, not a defeat. \"We are not\n * the cheapest, and here is why\" is a move the landing skill teaches; this\n * window exempts it. Both directions count: \"we are not the most expensive\"\n * is the same move, and `car[oa]` needs word boundaries or it fires on\n * \"carácter\". */\nexport const PRICE_CONCESSION_CONTEXT =\n /barat|econom|precio|preco|cheap|price|low ?cost|coste|custo|\\bcar[oa]s?\\b|\\bexpensive\\b/;\n\n/**\n * A superlative flipped by a negation — \"ningún equipo trabaja más rápido que\n * el nuestro\", \"nothing is better than ours\" — is the strongest claim FOR the\n * client, and the shape a Spanish landing brags in. Read as a concession it\n * blocks the publish on the best copy on the page, so the negator exempts it.\n *\n * Only quantifier negators, never a bare \"no\": \"no somos los mejores\" is the\n * defect itself. And it is matched over the comparative CLAUSE alone (see\n * `clauseBefore`), so \"nada que hacer: su constructor es mejor que el nuestro\"\n * still fires — the negation has to govern the comparison, not merely precede\n * it somewhere in the sentence.\n */\nexport const CONCESSION_NEGATION_CONTEXT =\n /\\b(?:ningun[oa]?s?|nadie|nada|no hay|no existe|nenhum[oa]?s?|ninguem|nao ha|nao existe|nothing|nobody|no one|none|there is no)\\b/;\n\n/**\n * Autonomy claims — copy asserting the product acts without the user. Harmless\n * on their own; the tell is making them and never saying where the human stays\n * in control (see `AI_CONTROL_SIGNALS`).\n */\nexport const AUTONOMY_CLAIMS: string[] = [\n \"fully autonomous\",\n \"completely autonomous\",\n \"autonomous agent\",\n \"autonomously\",\n \"while you sleep\",\n \"set it and forget it\",\n \"set-it-and-forget-it\",\n \"zero human input\",\n \"no human intervention\",\n \"without human intervention\",\n \"hands-free\",\n \"hands free\",\n \"self-driving\",\n \"runs itself\",\n \"on autopilot\",\n \"end-to-end automation\",\n \"no manual work\",\n \"eliminates manual\",\n \"does the work for you\",\n \"thinks for you\",\n \"handles everything for you\",\n];\n\n/**\n * Vocabulary describing oversight of the *agent's own actions* — what the buyer\n * approves, reverses, or can inspect after the fact. One of these anywhere on the\n * page is enough to show an autonomy claim is scaffolded rather than hype.\n *\n * Deliberately excludes generic privacy/security boilerplate (\"gdpr\",\n * \"encrypted\", \"your data\", \"opt out\"). Those ride along in almost every footer,\n * so counting them let a standard privacy notice clear an agent-washed hero for\n * free — and `references/proof.md` §1c calls \"bank-level encryption\" a\n * meaningless claim, so treating it as evidence of control contradicted the\n * doctrine this rule enforces. Data handling is a real question\n * (`references/ai-trust.md` §1 Q5) but it is a different axis from control, and\n * answering it says nothing about who is in charge of the agent.\n *\n * Also excludes \"accuracy\": a bare accuracy number with no denominator or method\n * is the defect `references/ai-trust.md` §3 names, not the remedy for it.\n */\nexport const AI_CONTROL_SIGNALS: string[] = [\n \"human in the loop\",\n \"human-in-the-loop\",\n \"human review\",\n \"human oversight\",\n \"approve\",\n \"approval\",\n \"you review\",\n \"review before\",\n \"review queue\",\n \"confirm before\",\n \"in control\",\n \"you decide\",\n \"override\",\n \"audit log\",\n \"audit trail\",\n \"guardrail\",\n \"dry run\",\n \"rollback\",\n \"roll back\",\n \"undo\",\n \"escalate\",\n \"escalation\",\n];\n\n/** The banned purple/indigo hero hex literals from the \"AI palette\" cluster. */\nexport const AI_PURPLE_HEXES = new Set<string>([\n \"#7c3aed\",\n \"#8b5cf6\",\n \"#a855f7\",\n \"#9333ea\",\n \"#7e22ce\",\n \"#6d28d9\",\n \"#6366f1\",\n \"#764ba2\",\n \"#667eea\",\n]);\n\n/** Tailwind background utilities that render the cream/parchment AI ground. */\nexport const CREAM_TAILWIND_BG = new Set<string>([\n \"bg-amber-50\",\n \"bg-amber-100\",\n \"bg-orange-50\",\n \"bg-orange-100\",\n \"bg-yellow-50\",\n \"bg-stone-50\",\n \"bg-stone-100\",\n \"bg-stone-200\",\n]);\n\n/**\n * Per-rule metadata: the family it rolls up into, its default severity, and the\n * one-line fix nudge shown to the agent. Severity is per the plan's placement\n * matrix — unambiguous tells `block`, strong-but-fallible tells `warn`, taste\n * `advisory`. Brand-matched values are downgraded to `advisory` in critique.ts.\n */\nexport const RULE_META: Record<\n string,\n { family: Family; severity: Severity; note: string; brandAware?: \"font\" | \"color\" }\n> = {\n \"gradient-text\": {\n family: \"color\",\n severity: \"block\",\n note: \"Gradient text is a top AI tell. Emphasis comes from weight or size, not a clipped gradient fill.\",\n },\n \"broken-image\": {\n family: \"integrity\",\n severity: \"block\",\n note: \"An <img> with an empty or placeholder src ships a broken image. Source a real asset via `baker images`.\",\n },\n \"competitor-concession\": {\n family: \"integrity\",\n severity: \"block\",\n note: \"This page ranks somebody else above the client, or says the client does not lead. A paid landing answers an objection by changing the axis, never by conceding it. Rewrite the claim around what this product does that the alternative structurally cannot (`references/sections/faq.md`).\",\n },\n \"competitor-named-in-comparison\": {\n family: \"integrity\",\n severity: \"warn\",\n note: \"A competitor from the vault is named in a comparative sentence outside a comparison table. Naming a rival on paid traffic sells their brand and is the client's decision, not yours — cite the capability, not the company.\",\n },\n \"side-tab\": {\n family: \"borders_depth\",\n severity: \"warn\",\n note: \"A thick colored border on one edge is the 'side-tab' AI tell. Use full borders, a background, or spacing instead.\",\n },\n \"border-accent-on-rounded\": {\n family: \"borders_depth\",\n severity: \"warn\",\n note: \"A colored top/bottom accent bar on a rounded card is an AI tell. Let the card's own surface carry the accent.\",\n },\n \"overused-font\": {\n family: \"typography\",\n severity: \"warn\",\n brandAware: \"font\",\n note: \"This face is a training-data default. Pick a face with a point of view — unless BRAND.md commits it.\",\n },\n \"single-font\": {\n family: \"typography\",\n severity: \"advisory\",\n note: \"Only one face across the page flattens hierarchy. A display/body pair usually reads richer.\",\n },\n \"flat-type-hierarchy\": {\n family: \"typography\",\n severity: \"warn\",\n note: \"Type steps are too close (<2× span). Widen the scale so the primary, secondary, and body are obvious at a glance.\",\n },\n \"ai-color-palette\": {\n family: \"color\",\n severity: \"warn\",\n brandAware: \"color\",\n note: \"Purple/indigo-on-heading or purple→cyan gradients are the AI palette cluster. Commit to the brand's own hues.\",\n },\n \"cream-palette\": {\n family: \"color\",\n severity: \"warn\",\n brandAware: \"color\",\n note: \"Cream/parchment ground is the 'measured rendition' AI default. Rework from the brand's saturated materials.\",\n },\n \"gray-on-color\": {\n family: \"color\",\n severity: \"warn\",\n note: \"Gray text on a colored surface reads muddy. Tint secondary text from the surface hue, never neutral gray.\",\n },\n \"bounce-easing\": {\n family: \"motion\",\n severity: \"warn\",\n note: \"Bounce/elastic easing feels dated. Use natural deceleration (e.g. cubic-bezier(0.16, 1, 0.3, 1)).\",\n },\n \"layout-transition\": {\n family: \"motion\",\n severity: \"advisory\",\n note: \"Transitioning width/height/padding/margin janks. Animate transform/opacity, or clip-path/max-height with care.\",\n },\n \"monotonous-spacing\": {\n family: \"spacing\",\n severity: \"warn\",\n note: \"One spacing value dominates. Create rhythm — tight groups, generous separation, more space above a heading than below.\",\n },\n \"marketing-buzzword\": {\n family: \"copy\",\n severity: \"warn\",\n note: \"SaaS filler ('supercharge your…') is generic. Name names, use numbers, say the specific thing only this product proves.\",\n },\n \"agent-washing\": {\n family: \"copy\",\n severity: \"warn\",\n note: \"The page claims autonomy but never says what the buyer controls. Name what it does on its own, what waits for approval, and what happens when it's wrong.\",\n },\n \"aphoristic-cadence\": {\n family: \"copy\",\n severity: \"warn\",\n note: \"Manufactured-contrast cadence ('Not an X. A Y.') is an AI copy tell. Vary sentence shape; make a real claim.\",\n },\n \"em-dash-overuse\": {\n family: \"copy\",\n severity: \"warn\",\n note: \"Dense em-dashes are an AI cadence tell (and brand copy bans them). Recast with commas, colons, or full stops.\",\n },\n \"chat-artifact\": {\n family: \"copy\",\n severity: \"warn\",\n note: \"Chatbot framing ('Here is an overview…', 'avísame si') leaked into the page. Delete it and state the claim directly.\",\n },\n \"rhetorical-opener\": {\n family: \"copy\",\n severity: \"warn\",\n note: \"Fake-candid openers ('Honestly?', 'La verdad es que') manufacture intimacy before an ordinary claim. Just say the thing.\",\n },\n \"negation-pivot\": {\n family: \"copy\",\n severity: \"warn\",\n note: \"'It's not just X, it's Y' / 'no se trata solo de' is now a louder AI tell than any single word. Cut the setup, keep the claim.\",\n },\n \"vague-attribution\": {\n family: \"copy\",\n severity: \"warn\",\n note: \"'Experts agree' / 'los estudios demuestran' attributes to nobody. Name the source and the year, or drop the claim.\",\n },\n \"participle-tail\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"Participles hung off a comma (', ensuring…', ', permitiendo…') fake depth. End the sentence, or make it a real clause.\",\n },\n \"copula-avoidance\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"'serves as' / 'cuenta con' dodges plain 'is' and 'has'. Use the simple verb — it reads as confidence, not flatness.\",\n },\n \"authority-trope\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"'At its core' / 'en el fondo' pretends to reach a deeper truth before restating an ordinary point. Make the point once.\",\n },\n signposting: {\n family: \"copy\",\n severity: \"advisory\",\n note: \"Announcing the writing ('Let's dive in', 'vamos a ver') instead of doing it. Delete the announcement, keep the content.\",\n },\n \"hollow-conclusion\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"'The future looks bright' / 'las posibilidades son infinitas' asserts nothing. End on a concrete next step or a number.\",\n },\n \"filler-phrase\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"Filler ('in order to', 'cabe destacar que') costs words and says nothing. Cut to the verb.\",\n },\n \"aphorism-formula\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"'X is the currency of Y' sounds profound without adding precision. Replace it with the concrete claim it gestures at.\",\n },\n \"false-range\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"'From onboarding to retention' pairs ends that aren't on a scale. List what you actually cover.\",\n },\n \"staccato-drama\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"A run of very short sentences manufactures drama. One clipped line lands; three in a row read as engineered.\",\n },\n \"title-case-heading\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"Title Case headings are an AI tell — and in Spanish the convention doesn't exist at all. Use sentence case.\",\n },\n \"inline-header-list\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"'**Speed:** it is fast' bullets are AI list shape. Write the sentence, or let the bullet carry the content directly.\",\n },\n emoji: {\n family: \"copy\",\n severity: \"advisory\",\n note: \"Emoji-decorated copy is a chatbot habit. Let the words and the layout carry the emphasis.\",\n },\n \"dark-glow\": {\n family: \"borders_depth\",\n severity: \"warn\",\n note: \"A zero-offset colored glow is decoration, not depth. Shadows carry an offset and a soft blur.\",\n },\n marquee: {\n family: \"motion\",\n severity: \"warn\",\n note: \"Auto-scrolling marquees are a dated tell. Let the visitor control the pace, or drop the motion.\",\n },\n};\n\n/** Weight subtracted from a family's 1.0 score per finding, by severity. */\nexport const SEVERITY_WEIGHT: Record<Severity, number> = {\n block: 0.5,\n warn: 0.2,\n advisory: 0.05,\n};\n","/**\n * Landing anti-slop detector — pure detection rules.\n *\n * Reimplemented (with sense) from impeccable's `cli/engine/engines/regex/\n * detect-text.mjs` (Apache-2.0). Two kinds of rule:\n * - line matchers: per-line regex tells (side-tab, gradient-text, fonts…)\n * - analyzers: aggregate tells, each `scope`d \"file\" or \"page\" (see below).\n *\n * SCOPE matters for Baker specifically. A landing here is always componentized —\n * `index.astro` + several small `_components/*.astro` — so a count-threshold tell\n * (a single font, a flat type scale, monotonous spacing, em-dash density) would\n * slip through if measured per small file. Those analyzers are `scope: \"page\"`\n * and run on the concatenated page. The `scope: \"file\"` analyzers are the ones\n * that fire at ≥1 or carry a line number (overused-font, buzzwords, glow), so\n * they stay per file for accurate `file:line` attribution.\n *\n * Every rule is pure and total — it takes source text and returns findings, and\n * never throws. Severity/notes come from `RULE_META`; the caller (critique.ts)\n * assembles them and applies the BRAND.md allowlist.\n */\n\nimport { detectCopyTells } from \"../../copy-tells/detect.ts\";\nimport { hasChroma, isCreamColor, isNeutralAuthoredColor, parseColor } from \"./color.ts\";\nimport {\n AI_CONTROL_SIGNALS,\n AI_PURPLE_HEXES,\n AUTONOMY_CLAIMS,\n BUZZWORDS,\n CONCESSION_NEGATION_CONTEXT,\n CONCESSION_PATTERNS,\n COPY_TELL_GATES,\n CREAM_TAILWIND_BG,\n EM_DASH_CHARS_PER_DASH,\n EM_DASH_FLOOR,\n GENERIC_FONTS,\n isOverusedFont,\n PRICE_CONCESSION_CONTEXT,\n TAILWIND_TEXT_PX,\n} from \"./constants.ts\";\n\nexport type RawFinding = { id: string; snippet: string; file: string; line?: number };\n\n/** Regex capture-group accessors that satisfy `noUncheckedIndexedAccess`. */\nconst cap = (m: RegExpMatchArray, i: number): string => m[i] ?? \"\";\nconst num = (m: RegExpMatchArray, i: number): number => Number(m[i] ?? 0);\n\nconst hasRounded = (line: string): boolean => /\\brounded(?:-\\w+)?\\b/.test(line) || /border-radius/i.test(line);\nconst isSafeElement = (line: string): boolean =>\n /<(?:blockquote|nav[\\s>]|pre[\\s>]|code[\\s>]|a\\s|input[\\s>]|span[\\s>])/i.test(line);\n/** A Tailwind border colored with a neutral scale is a hairline, not an accent. */\nconst hasNeutralTailwindBorder = (line: string): boolean =>\n /\\bborder-(?:gray|slate|zinc|neutral|stone|white|black|transparent|current|inherit)\\b|\\bborder-(?:gray|slate|zinc|neutral|stone)-\\d+\\b/.test(\n line,\n );\n\nfunction isNeutralBorderColor(str: string): boolean {\n const m = str.match(/solid\\s+((?:rgba?|hsla?|oklch|oklab|lab|lch|hwb|color)\\([^)]*\\)|#[0-9a-f]{3,8}\\b|[a-z]+)/i);\n if (!m) return false;\n return isNeutralAuthoredColor(m[1] ?? \"\");\n}\n\ntype LineMatcher = {\n id: string;\n regex: RegExp;\n test: (m: RegExpMatchArray, line: string) => boolean;\n fmt: (m: RegExpMatchArray, line: string) => string;\n};\n\nconst LINE_MATCHERS: LineMatcher[] = [\n // ── Side-tab: a thick colored border on one edge ──────────────────────────\n {\n id: \"side-tab\",\n regex: /\\bborder-[lrse]-(\\d+)\\b/g,\n test: (m, line) => {\n if (isSafeElement(line) || hasNeutralTailwindBorder(line)) return false;\n return hasRounded(line) ? num(m, 1) >= 2 : num(m, 1) >= 4;\n },\n fmt: (m) => cap(m, 0),\n },\n {\n id: \"side-tab\",\n regex: /border-(?:left|right)\\s*:\\s*(\\d+)px\\s+solid[^;]*/gi,\n test: (m, line) => {\n if (isSafeElement(line)) return false;\n if (isNeutralBorderColor(cap(m, 0))) return false;\n return hasRounded(line) ? num(m, 1) >= 2 : num(m, 1) >= 3;\n },\n fmt: (m) => cap(m, 0).replace(/\\s*;?\\s*$/, \"\"),\n },\n {\n id: \"side-tab\",\n regex: /border-(?:left|right)-width\\s*:\\s*(\\d+)px/gi,\n test: (m, line) => !isSafeElement(line) && num(m, 1) >= 3,\n fmt: (m) => cap(m, 0),\n },\n {\n id: \"side-tab\",\n regex: /border-inline-(?:start|end)(?:-width)?\\s*:\\s*(\\d+)px/gi,\n test: (m, line) => !isSafeElement(line) && num(m, 1) >= 3,\n fmt: (m) => cap(m, 0),\n },\n // ── Border accent on a rounded card (top/bottom colored bar) ──────────────\n {\n id: \"border-accent-on-rounded\",\n regex: /\\bborder-[tb]-(\\d+)\\b/g,\n test: (m, line) => hasRounded(line) && num(m, 1) >= 1 && !hasNeutralTailwindBorder(line),\n fmt: (m) => cap(m, 0),\n },\n {\n id: \"border-accent-on-rounded\",\n regex: /border-(?:top|bottom)\\s*:\\s*(\\d+)px\\s+solid/gi,\n test: (m, line) => num(m, 1) >= 3 && hasRounded(line),\n fmt: (m) => cap(m, 0),\n },\n // ── Gradient text (Tailwind class form; authored-CSS form is the window\n // analyzer below, so a multi-line rule block is still caught) ──────────────\n {\n id: \"gradient-text\",\n regex: /\\bbg-clip-text\\b/g,\n test: (_m, line) =>\n // v3 `bg-gradient-to-*`, v4 `bg-linear-to-*` / `bg-radial*` / `bg-conic*`,\n // and arbitrary-value `bg-[linear-gradient(…)]` spellings.\n /\\bbg-gradient-to-|\\bbg-linear-to-|\\bbg-(?:radial|conic)\\b|\\bbg-\\[(?:linear|radial|conic)-gradient/i.test(line),\n fmt: () => \"bg-clip-text + gradient\",\n },\n // ── Gray text on a colored background (Tailwind). Shade ≥ 300 only: a pale\n // tint panel (bg-blue-50 info box) is a normal light ground, not \"on color\". ──\n {\n id: \"gray-on-color\",\n regex: /\\btext-(?:gray|slate|zinc|neutral|stone)-(\\d+)\\b/g,\n test: (_m, line) => {\n const bg = line.match(\n /\\bbg-(?:red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(\\d+)\\b/,\n );\n return bg !== null && Number(bg[1] ?? 0) >= 300;\n },\n fmt: (m, line) => {\n const bg = line.match(\n /\\bbg-(?:red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-\\d+\\b/,\n );\n return `${cap(m, 0)} on ${bg?.[0] || \"?\"}`;\n },\n },\n // ── AI color palette (Tailwind purple/indigo + banned hero hexes) ─────────\n {\n id: \"ai-color-palette\",\n regex: /\\btext-(?:purple|violet|indigo)-(\\d+)\\b/g,\n test: (_m, line) => /\\btext-(?:[2-9]xl)\\b|<h[1-3]/i.test(line),\n fmt: (m) => `${cap(m, 0)} on heading`,\n },\n {\n id: \"ai-color-palette\",\n regex: /\\bfrom-(?:purple|violet|indigo)-(\\d+)\\b/g,\n test: (_m, line) => /\\bto-(?:purple|violet|indigo|blue|cyan|pink|fuchsia)-\\d+\\b/.test(line),\n fmt: (m) => `${cap(m, 0)} gradient`,\n },\n {\n id: \"ai-color-palette\",\n regex: /#[0-9a-f]{6}\\b/gi,\n test: (m) => AI_PURPLE_HEXES.has(cap(m, 0).toLowerCase()),\n fmt: (m) => `${cap(m, 0)} (AI-cluster purple)`,\n },\n // ── Cream/parchment ground (Tailwind + authored background hex) ───────────\n {\n id: \"cream-palette\",\n regex: /\\bbg-(?:amber|orange|yellow|stone)-(?:50|100|200)\\b/g,\n test: (m) => CREAM_TAILWIND_BG.has(cap(m, 0)),\n fmt: (m) => `${cap(m, 0)} (cream ground)`,\n },\n {\n id: \"cream-palette\",\n regex: /background(?:-color)?\\s*:\\s*(#[0-9a-f]{6}\\b|rgba?\\([^)]+\\))/gi,\n test: (m) => {\n const c = parseColor(cap(m, 1));\n return c !== null && isCreamColor(c);\n },\n fmt: (m) => `${cap(m, 1)} (cream ground)`,\n },\n // ── Bounce / elastic easing ───────────────────────────────────────────────\n {\n id: \"bounce-easing\",\n regex: /\\banimate-bounce\\b/g,\n test: () => true,\n fmt: () => \"animate-bounce (Tailwind)\",\n },\n {\n id: \"bounce-easing\",\n regex: /animation(?:-name)?\\s*:\\s*([^;{}]*(?:bounce|elastic|wobble|jiggle|spring)[^;{}]*)/gi,\n test: () => true,\n fmt: (m) => `animation: ${cap(m, 1).trim()}`,\n },\n {\n id: \"bounce-easing\",\n regex: /cubic-bezier\\(\\s*([\\d.-]+)\\s*,\\s*([\\d.-]+)\\s*,\\s*([\\d.-]+)\\s*,\\s*([\\d.-]+)\\s*\\)/g,\n test: (m) => {\n const y1 = Number.parseFloat(cap(m, 2));\n const y2 = Number.parseFloat(cap(m, 4));\n return y1 < -0.1 || y1 > 1.1 || y2 < -0.1 || y2 > 1.1;\n },\n fmt: (m) => `cubic-bezier(${cap(m, 1)}, ${cap(m, 2)}, ${cap(m, 3)}, ${cap(m, 4)})`,\n },\n // ── Transitioning layout properties (jank) ────────────────────────────────\n {\n id: \"layout-transition\",\n // The lookahead skips Astro's view-transition directives (transition:name=,\n // transition:animate=, transition:persist) — markup idiom, not CSS.\n regex: /transition(?:-property)?\\s*:\\s*(?!name\\s*=|animate\\s*=|persist\\b)([^;{}]+)/gi,\n test: (m) => {\n const val = cap(m, 1).toLowerCase();\n if (/\\ball\\b/.test(val)) return false;\n return /\\b(?:(?:max|min)-)?(?:width|height)\\b|\\bpadding\\b|\\bmargin\\b/.test(val);\n },\n fmt: (m) => {\n const found = cap(m, 1).match(\n /\\b(?:(?:max|min)-)?(?:width|height)\\b|\\bpadding(?:-(?:top|right|bottom|left))?\\b|\\bmargin(?:-(?:top|right|bottom|left))?\\b/gi,\n );\n return `transition: ${found ? found.join(\", \") : cap(m, 1).trim()}`;\n },\n },\n // ── Broken image ──────────────────────────────────────────────────────────\n {\n id: \"broken-image\",\n regex: /<img\\b[^>]*?\\bsrc\\s*=\\s*(?:\"\"|''|\"\\s+\"|'\\s+'|\"#\"|'#')/gi,\n test: () => true,\n fmt: (m) => cap(m, 0).slice(0, 100),\n },\n {\n id: \"broken-image\",\n regex: /<img\\b(?:(?!\\bsrc\\s*=)[^>])*>/gi,\n test: (m) => !/\\bsrc\\s*=/i.test(cap(m, 0)),\n fmt: (m) => cap(m, 0).slice(0, 100),\n },\n];\n\n/**\n * Phrase match anchored at a word start, so \"sources\" cannot be satisfied by\n * \"resources\" or \"outsources\". Only the leading edge is anchored — trailing\n * suffixes stay matchable on purpose, so \"autonomous agent\" still catches\n * \"autonomous agents\" and \"approve\" still catches \"approved\". Expects `haystack`\n * to already be lowercased.\n */\nfunction includesPhraseAtWordStart(haystack: string, phrase: string): boolean {\n return new RegExp(`\\\\b${phrase.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}`).test(haystack);\n}\n\n/**\n * Lowercase and strip diacritics, so one pattern covers \"más\" and \"mas\",\n * \"não\" and \"nao\". Length is preserved (NFD marks are dropped, not the letters\n * they sit on), which keeps match offsets usable for line attribution.\n */\nfunction foldForCopy(text: string): string {\n return text\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\");\n}\n\n/**\n * Copy that ranks somebody else above the client, or denies the client leads.\n *\n * Fires at ONE occurrence, unlike every count-gated copy tell: a cluster is\n * evidence that prose was machine-written, but a single sentence conceding a\n * competitor is better is the whole defect, and it is worth holding a publish\n * for. Two exemptions, both scoped to the sentence the match sits in: a price\n * concession (`PRICE_CONCESSION_CONTEXT`) and a negated superlative\n * (`CONCESSION_NEGATION_CONTEXT`), which is a brag, not a defeat.\n */\nexport function detectConcessions(text: string): Array<{ index: number; sample: string }> {\n const folded = foldForCopy(text);\n const out: Array<{ index: number; sample: string }> = [];\n for (const pattern of CONCESSION_PATTERNS) {\n for (const m of folded.matchAll(pattern)) {\n const index = m.index ?? 0;\n if (PRICE_CONCESSION_CONTEXT.test(sentenceAround(folded, index))) continue;\n if (CONCESSION_NEGATION_CONTEXT.test(clauseBefore(folded, index))) continue;\n out.push({\n index,\n sample: text\n .slice(index, index + 70)\n .replace(/\\s+/g, \" \")\n .trim(),\n });\n }\n }\n return out;\n}\n\n/**\n * The sentence `index` falls in. The price exemption is scoped to it rather\n * than to a character window: a window reaches across sentence and string\n * boundaries, and a pricing FAQ answer sitting next to a real concession then\n * exempts the concession too.\n */\nfunction sentenceAround(text: string, index: number): string {\n const rest = text.slice(index).search(/[.!?\\n]/);\n return text.slice(sentenceStart(text, index), rest === -1 ? text.length : index + rest);\n}\n\n/**\n * The run of text leading up to `index` within its own clause — sentence start,\n * then forward past the last `,;:` before the match.\n *\n * A negation exempts a comparison only when it governs it. Taking the whole\n * sentence prefix instead would let \"nada que hacer: su constructor es mejor\n * que el nuestro\" read as a brag and ship the concession the rule exists for.\n */\nfunction clauseBefore(text: string, index: number): string {\n const prefix = text.slice(sentenceStart(text, index), index);\n const lastBreak = Math.max(prefix.lastIndexOf(\",\"), prefix.lastIndexOf(\";\"), prefix.lastIndexOf(\":\"));\n return prefix.slice(lastBreak + 1);\n}\n\nfunction sentenceStart(text: string, index: number): number {\n for (let i = index; i > 0; i--) {\n if (/[.!?\\n]/.test(text[i - 1] ?? \"\")) return i;\n }\n return 0;\n}\n\n/** Strip tags/script/style/comments so copy analyzers don't read code. */\nfunction stripHtmlToText(html: string): string {\n return html\n .replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, \" \")\n .replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, \" \")\n .replace(/<!--[\\s\\S]*?-->/g, \" \")\n .replace(/<[^>]+>/g, \" \")\n .replace(/\\s+/g, \" \");\n}\n\n/**\n * Like `stripHtmlToText`, but rewrites `<h1>…<h6>` as markdown headings and\n * keeps block boundaries as newlines. The shared copy-tell detector reads\n * headings in markdown shape (it also serves markdown surfaces), and heading\n * *form* carries two tells — Title Case and, in Spanish, capitalization that\n * the language has no convention for. Flattening the page to one line the way\n * `stripHtmlToText` does would erase both, and would also let a run of short\n * sentences across three sections read as one staccato passage.\n */\nfunction stripHtmlPreservingHeadings(html: string): string {\n return html\n .replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, \" \")\n .replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, \" \")\n .replace(/<!--[\\s\\S]*?-->/g, \" \")\n .replace(\n /<h([1-6])\\b[^>]*>([\\s\\S]*?)<\\/h\\1>/gi,\n (_all, _lvl, inner) =>\n `\\n## ${String(inner)\n .replace(/<[^>]+>/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()}\\n`,\n )\n .replace(/<\\/(?:p|div|section|li|tr|br)>|<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<[^>]+>/g, \" \")\n .replace(/[ \\t]+/g, \" \")\n .replace(/\\n{3,}/g, \"\\n\\n\");\n}\n\n/**\n * Does this string literal read as copy a visitor will see, rather than code?\n *\n * The bar is deliberately high. A false negative costs one missed tell; a false\n * positive puts an import path or a Tailwind class list in front of every copy\n * rule on the page, and those rules are what the publish gate reads.\n */\nfunction isProseLiteral(value: string): boolean {\n const text = value.trim();\n if (text.length < 12) return false;\n if (/^(?:https?:\\/\\/|\\/|\\.{1,2}\\/|#|@|[a-z]+:)/i.test(text)) return false;\n if (!/\\p{L}/u.test(text)) return false;\n const words = text.split(/\\s+/).filter(Boolean);\n if (words.length < 4) return false;\n // A utility-class list is 4+ \"words\" of pure lowercase tokens carrying dashes\n // or variant colons — the one non-prose shape that reliably clears the word\n // count (\"flex items-center gap-4 rounded-lg border border-slate-200 px-6\").\n const classy = words.filter((w) => /^-?[a-z][a-z0-9]*(?:[-.:/][a-z0-9.[\\]%-]+)+$/.test(w)).length;\n if (classy >= 3 && classy / words.length > 0.5) return false;\n return true;\n}\n\n/**\n * Blank an Astro frontmatter block (leading `---` … `---`) so rules never read\n * component JS — imports, props, config — while KEEPING the string literals\n * that hold visible copy. Every character is replaced by a space rather than\n * removed, so `file:line` attribution and `indexOf` offsets stay exact against\n * the original source. The `---` fences are blanked too: they'd otherwise count\n * as em-dashes.\n *\n * The rewrite walks CODE UNITS (`split(\"\")`), not code points: `stringLiterals`\n * indexes with `source[i]`, so a spread by code point would collapse each emoji\n * to one slot and slide every offset past it — silently shifting the line of\n * every finding in the file, this rule's and the others'. Feature-card icons\n * are exactly where that emoji lives.\n *\n * Keeping the prose is not a refinement, it is the point. Astro components hold\n * FAQ pairs, testimonial quotes, feature cards and pricing rows as a\n * `const items = [{ q, a }]` array in the frontmatter and render them in a\n * `.map()`, so blanking the block wholesale hid a large share of every\n * landing's actual copy from the critic. It shipped an FAQ answer conceding a\n * competitor was better, dense with em-dashes, past a clean run.\n */\nfunction blankAstroFrontmatter(text: string): string {\n const cut = frontmatterLength(text);\n if (cut === 0) return text;\n const head = text.slice(0, cut);\n const kept: string[] = head.split(\"\").map((ch) => (ch === \"\\n\" ? \"\\n\" : \" \"));\n for (const literal of stringLiterals(head)) {\n if (!isProseLiteral(literal.value)) continue;\n for (let i = 0; i < literal.value.length; i++) {\n const at = literal.start + i;\n if (head[at] !== \"\\n\") kept[at] = head[at] ?? \" \";\n }\n }\n return kept.join(\"\") + text.slice(cut);\n}\n\n/**\n * An `.astro` source with everything a visitor never sees blanked out — the\n * frontmatter's component JS (minus its prose literals) and every template\n * comment. Every character is replaced by a space rather than removed, so\n * `file:line` attribution stays exact. This is what every rule reads.\n */\nfunction blankUnrenderedSource(text: string): string {\n return blankTemplateComments(blankAstroFrontmatter(text));\n}\n\n/**\n * Blank Astro expression comments (`{/* … *\\/}`) and HTML comments\n * (`<!-- … -->`), preserving length and newlines.\n *\n * A comment is commentary about the markup, not markup, and no rule may read\n * one. The cost of that being false was a fleet-wide publish block: the shared\n * `Video.astro` wrapper explains its `preconnect` in prose that spells `<img>`\n * twice, the block-tier `broken-image` rule matched the prose, and every landing\n * rendering a video failed the publish gate — on a scaffold-protected file the\n * client's agent is forbidden to edit, so there was no fix from inside the\n * sandbox. Comment prose is also where a component's reasoning lives, em-dashes\n * and buzzwords and hexes included, so leaving it readable inflates every\n * count-threshold tell on top of that.\n *\n * The `{…}` fences are blanked with the comment: a bare `{` left behind would\n * read as an expression opening, and the `*\\/` would count as punctuation copy.\n * Walks CODE UNITS, like `blankAstroFrontmatter`, for the same reason — a spread\n * by code point collapses an emoji to one slot and slides every later offset.\n */\nfunction blankTemplateComments(text: string): string {\n const out = text.split(\"\");\n const pattern = /\\{\\s*\\/\\*[\\s\\S]*?\\*\\/\\s*\\}|<!--[\\s\\S]*?-->/g;\n for (const m of text.matchAll(pattern)) {\n const start = m.index ?? 0;\n for (let i = start; i < start + m[0].length && i < out.length; i++) {\n if (out[i] !== \"\\n\") out[i] = \" \";\n }\n }\n return out.join(\"\");\n}\n\n/** Characters covered by a leading `---` … `---` block, or 0 when there is none. */\nfunction frontmatterLength(text: string): number {\n if (!text.startsWith(\"---\")) return 0;\n const lines = text.split(\"\\n\");\n if (!/^---\\s*$/.test(lines[0] ?? \"\")) return 0;\n const end = lines.findIndex((line, i) => i > 0 && /^---\\s*$/.test(line));\n return end === -1 ? 0 : lines.slice(0, end + 1).join(\"\\n\").length;\n}\n\n/**\n * String literals in a block of component JS, skipping comments so a `//` line\n * mentioning a quote cannot open one. Returns the literal body and where it\n * starts in the input, which is what keeps offsets exact.\n */\nfunction stringLiterals(source: string): Array<{ start: number; value: string }> {\n const out: Array<{ start: number; value: string }> = [];\n for (let i = 0; i < source.length; i++) {\n const commentEnd = skipComment(source, i);\n if (commentEnd !== -1) {\n i = commentEnd;\n continue;\n }\n const quote = source[i];\n if (quote !== '\"' && quote !== \"'\" && quote !== \"`\") continue;\n const close = closingQuote(source, i + 1, quote);\n if (close === -1) break;\n out.push({ start: i + 1, value: source.slice(i + 1, close) });\n i = close;\n }\n return out;\n}\n\n/** Index of the last character of a comment opening at `i`, or -1 if none does.\n * An unterminated block comment consumes the rest of the source. */\nfunction skipComment(source: string, i: number): number {\n if (source[i] !== \"/\") return -1;\n if (source[i + 1] === \"/\") {\n const nl = source.indexOf(\"\\n\", i);\n return nl === -1 ? source.length : nl;\n }\n if (source[i + 1] === \"*\") {\n const close = source.indexOf(\"*/\", i + 2);\n return close === -1 ? source.length : close + 1;\n }\n return -1;\n}\n\n/** Index of the quote closing a literal that opened at `from`, honoring\n * backslash escapes; -1 when the literal never closes. */\nfunction closingQuote(source: string, from: number, quote: string): number {\n for (let j = from; j < source.length; j++) {\n if (source[j] === \"\\\\\") {\n j++;\n continue;\n }\n if (source[j] === quote) return j;\n }\n return -1;\n}\n\ntype Analyzer = {\n /** \"file\" → run per source file (line-attributed / ≥1-count tells). \"page\" →\n * run once on the concatenated page (count-threshold tells a componentized\n * landing would otherwise dodge). */\n scope: \"file\" | \"page\";\n run: (text: string, file: string) => RawFinding[];\n};\n\nconst ANALYZERS: Analyzer[] = [\n // Overused primary font (font-family declarations + Google Fonts URLs). Fires\n // at ≥1 and carries a line number → per file.\n {\n scope: \"file\",\n run: (text, file) => {\n const out: RawFinding[] = [];\n const seen = new Set<string>();\n for (const m of text.matchAll(/font-family\\s*:\\s*([^;}{]+)/gi)) {\n const first = firstFamily(cap(m, 1));\n if (first && !GENERIC_FONTS.has(first) && isOverusedFont(first) && !seen.has(first)) {\n seen.add(first);\n out.push({ id: \"overused-font\", snippet: `font-family: ${first}`, file, line: lineOf(text, m.index ?? 0) });\n }\n }\n for (const m of text.matchAll(/fonts\\.googleapis\\.com\\/css2?\\?[^\"'\\s)<>]*/gi)) {\n for (const fam of googleFontFamilies(cap(m, 0))) {\n if (isOverusedFont(fam) && !seen.has(fam)) {\n seen.add(fam);\n out.push({ id: \"overused-font\", snippet: `Google Fonts: ${fam}`, file, line: lineOf(text, m.index ?? 0) });\n }\n }\n }\n return out;\n },\n },\n // Single font across a substantial page — needs the whole page's font set.\n // Counts only the FIRST family of each stack (like overused-font): fallbacks\n // aren't choices, so `'Inter', 'Helvetica Neue'` everywhere is still one font.\n {\n scope: \"page\",\n run: (text, file) => {\n const fonts = new Set<string>();\n for (const m of text.matchAll(/font-family\\s*:\\s*([^;}{]+)/gi)) {\n const first = firstFamily(cap(m, 1));\n if (first && !GENERIC_FONTS.has(first)) fonts.add(first);\n }\n for (const f of allGoogleFontFamilies(text)) fonts.add(f);\n if (fonts.size !== 1 || text.split(\"\\n\").length < 20) return [];\n const only = [...fonts][0] ?? \"\";\n return [{ id: \"single-font\", snippet: `only font used across the page is ${only}`, file }];\n },\n },\n // Flat type hierarchy (all sizes span <2×) — needs every size on the page.\n {\n scope: \"page\",\n run: (text, file) => {\n const sizes = new Set<number>();\n const REM = 16;\n for (const m of text.matchAll(/font-size\\s*:\\s*([\\d.]+)(px|rem|em)\\b/gi)) {\n const px = cap(m, 2) === \"px\" ? num(m, 1) : num(m, 1) * REM;\n if (px > 0 && px < 200) sizes.add(Math.round(px * 10) / 10);\n }\n for (const [cls, px] of Object.entries(TAILWIND_TEXT_PX)) {\n if (new RegExp(`\\\\b${cls}\\\\b`).test(text)) sizes.add(px);\n }\n if (sizes.size < 3) return [];\n const sorted = [...sizes].sort((a, b) => a - b);\n const min = sorted[0] ?? 1;\n const max = sorted[sorted.length - 1] ?? 1;\n const ratio = max / min;\n if (ratio >= 2.0) return [];\n return [\n {\n id: \"flat-type-hierarchy\",\n snippet: `sizes ${sorted.map((s) => `${s}px`).join(\", \")} (ratio ${ratio.toFixed(1)}:1)`,\n file,\n },\n ];\n },\n },\n // Monotonous spacing (one value dominates) — needs every spacing value.\n {\n scope: \"page\",\n run: (text, file) => {\n const rounded = collectSpacingPx(text).map((v) => Math.round(v / 4) * 4);\n if (rounded.length < 10) return [];\n const counts: Record<number, number> = {};\n for (const v of rounded) counts[v] = (counts[v] || 0) + 1;\n const maxCount = Math.max(...Object.values(counts));\n const pct = maxCount / rounded.length;\n const unique = [...new Set(rounded)].filter((v) => v > 0);\n if (pct <= 0.6 || unique.length > 3) return [];\n const dominant = Object.entries(counts).sort((a, b) => b[1] - a[1])[0]?.[0] ?? \"?\";\n return [\n {\n id: \"monotonous-spacing\",\n snippet: `~${dominant}px used ${maxCount}/${rounded.length} times (${Math.round(pct * 100)}%)`,\n file,\n },\n ];\n },\n },\n // Em-dash overuse (density-gated) — density is measured over the page's copy.\n {\n scope: \"page\",\n run: (text, file) => {\n const body = stripHtmlToText(text).replace(/—|�*8212;|�*2014;/gi, \"—\");\n // `(?<!-)--(?!-)` refuses `---` runs (frontmatter fences, hr markers) so\n // only a writer's double-hyphen counts as an em-dash stand-in.\n const count = (body.match(/[—]|(?<!-)--(?!-)(?=\\S)/g) ?? []).length;\n if (count < EM_DASH_FLOOR) return [];\n if (body.length > count * EM_DASH_CHARS_PER_DASH) return [];\n return [{ id: \"em-dash-overuse\", snippet: `${count} em-dashes in body copy`, file }];\n },\n },\n // Agent washing: an autonomy claim the page never scaffolds with a signal about\n // who oversees the agent. Page-scope — the claim and the answer routinely live\n // in different components, so a per-file check would fire on any hero that\n // defers the trust story to a section below it.\n //\n // Both lists match at a word start (see `includesPhraseAtWordStart`). Matching\n // bare substrings let \"resources\" satisfy \"sources\" and silently clear the\n // finding, which is the failure mode this rule exists to catch.\n {\n scope: \"page\",\n run: (text, file) => {\n const lower = stripHtmlToText(text).toLowerCase();\n const claim = AUTONOMY_CLAIMS.find((phrase) => includesPhraseAtWordStart(lower, phrase));\n if (!claim) return [];\n if (AI_CONTROL_SIGNALS.some((phrase) => includesPhraseAtWordStart(lower, phrase))) return [];\n return [{ id: \"agent-washing\", snippet: `\"${claim}\" with no control or oversight signal on the page`, file }];\n },\n },\n // Marketing buzzwords. Fires at ≥1 → per file (keeps the offending file named).\n {\n scope: \"file\",\n run: (text, file) => {\n const body = stripHtmlToText(text);\n const lower = body.toLowerCase();\n let count = 0;\n let firstSample = \"\";\n for (const phrase of BUZZWORDS) {\n let from = 0;\n for (;;) {\n const idx = lower.indexOf(phrase, from);\n if (idx === -1) break;\n count++;\n if (!firstSample) {\n firstSample = body.slice(Math.max(0, idx - 12), Math.min(body.length, idx + phrase.length + 12)).trim();\n }\n from = idx + phrase.length;\n }\n }\n if (count === 0) return [];\n return [\n {\n id: \"marketing-buzzword\",\n snippet: `${count} buzzword phrase${count === 1 ? \"\" : \"s\"}: \"${firstSample}\"`,\n file,\n },\n ];\n },\n },\n // Aphoristic cadence (manufactured contrast + short rebuttal) — the ≥3 gate\n // needs the whole page's copy, else it's diluted across components.\n {\n scope: \"page\",\n run: (text, file) => {\n const body = stripHtmlToText(text);\n let count = 0;\n let firstSample = \"\";\n for (const m of body.matchAll(/\\bNot an? [a-z][^.!?]{1,40}[.!]\\s+[A-Z][^.!?]{1,60}[.!]/g)) {\n count++;\n if (!firstSample) firstSample = cap(m, 0).trim().slice(0, 80);\n }\n for (const m of body.matchAll(/\\b[A-Z][^.!?]{4,80}[.!]\\s+(No|Just)\\s+[a-z][^.!?]{2,60}[.!]/g)) {\n count++;\n if (!firstSample) firstSample = cap(m, 0).trim().slice(0, 80);\n }\n if (count < 3) return [];\n return [{ id: \"aphoristic-cadence\", snippet: `${count} aphoristic constructions: \"${firstSample}\"`, file }];\n },\n },\n // Shared AI copy tells (engine/copy-tells) — the Wikipedia \"Signs of AI\n // writing\" set, English and Spanish. Page-scope: every gate here is a count\n // threshold, and a landing is always split across small components, so\n // measuring per file would dilute a page-wide habit into nothing.\n {\n scope: \"page\",\n run: (text, file) => {\n const body = stripHtmlPreservingHeadings(text);\n const out: RawFinding[] = [];\n for (const tell of detectCopyTells(body)) {\n const gate = COPY_TELL_GATES[tell.id];\n if (!gate || tell.count < gate.minCount) continue;\n out.push({ id: tell.id, snippet: `${tell.count}× — \"${tell.sample}\"`, file });\n }\n return out;\n },\n },\n // Positioning concessions. File-scope (fires at 1, and the line is what the\n // agent needs to fix it) and read from the visible copy only.\n {\n scope: \"file\",\n run: (text, file) => {\n const visible = stripHtmlPreservingHeadings(text);\n return detectConcessions(visible).map(({ sample }) => {\n const at = text.indexOf(sample.slice(0, 24));\n return {\n id: \"competitor-concession\",\n snippet: `\"${sample}\"`,\n file,\n ...(at >= 0 ? { line: lineOf(text, at) } : {}),\n };\n });\n },\n },\n // Gradient text in authored CSS. A rule block spans lines, so this scans a\n // ±6-line window around each `background-clip: text` instead of one line\n // (the Tailwind class form stays a line matcher above).\n {\n scope: \"file\",\n run: (text, file) => {\n const out: RawFinding[] = [];\n const lines = text.split(\"\\n\");\n for (const m of text.matchAll(/(?:-webkit-)?background-clip\\s*:\\s*text/gi)) {\n const line = lineOf(text, m.index ?? 0);\n const window = lines.slice(Math.max(0, line - 7), Math.min(lines.length, line + 6)).join(\"\\n\");\n if (/gradient\\(/i.test(window)) {\n out.push({ id: \"gradient-text\", snippet: \"background-clip: text + gradient\", file, line });\n }\n }\n return out;\n },\n },\n // Dark glow: a zero-offset chromatic shadow used as decoration. Line-attributed\n // → per file.\n {\n scope: \"file\",\n run: (text, file) => {\n const out: RawFinding[] = [];\n for (const m of text.matchAll(/(?:box|text)-shadow\\s*:\\s*([^;{}]+)/gi)) {\n if (shadowIsGlow(cap(m, 1))) {\n out.push({\n id: \"dark-glow\",\n snippet: `shadow: ${cap(m, 1).trim().slice(0, 60)}`,\n file,\n line: lineOf(text, m.index ?? 0),\n });\n }\n }\n return out;\n },\n },\n // Marquee (<marquee> element). Fires at ≥1 → per file.\n {\n scope: \"file\",\n run: (text, file) => (/<marquee\\b/i.test(text) ? [{ id: \"marquee\", snippet: \"<marquee> element\", file }] : []),\n },\n];\n\n/** Authored spacing values in px — CSS px/rem declarations plus Tailwind\n * utilities (incl. gap-x/y, space-x/y, and decimals like p-1.5). Zero values\n * are resets, not spacing choices, so they never count. */\nfunction collectSpacingPx(text: string): number[] {\n const vals: number[] = [];\n const push = (v: number) => {\n if (v > 0 && v < 200) vals.push(v);\n };\n for (const m of text.matchAll(/(?:padding|margin)(?:-(?:top|right|bottom|left))?\\s*:\\s*(\\d+)px/gi)) push(num(m, 1));\n for (const m of text.matchAll(/(?:padding|margin)(?:-(?:top|right|bottom|left))?\\s*:\\s*([\\d.]+)rem/gi))\n push(Math.round(Number.parseFloat(cap(m, 1)) * 16));\n for (const m of text.matchAll(/\\b(?:p|px|py|pt|pb|pl|pr|m|mx|my|mt|mb|ml|mr|gap(?:-[xy])?|space-[xy])-([\\d.]+)\\b/g))\n push(Number.parseFloat(cap(m, 1)) * 4);\n return vals;\n}\n\n/** Zero-offset chromatic blur = a decorative halo, not depth. */\nfunction shadowIsGlow(value: string): boolean {\n const first = (value.split(/,(?![^(]*\\))/)[0] ?? \"\").trim();\n const colorMatch = first.match(/#[0-9a-f]{3,8}\\b|rgba?\\([^)]+\\)|hsla?\\([^)]+\\)/i);\n if (!colorMatch) return false;\n // Strip the color before reading offsets so its digits aren't parsed as lengths.\n const lengthsPart = first.replace(colorMatch[0], \" \").replace(/\\binset\\b/gi, \" \");\n const offsets = lengthsPart.match(/-?\\d*\\.?\\d+(?:px|rem|em)?/g);\n if (!offsets || offsets.length < 3) return false;\n const x = Number.parseFloat(offsets[0] ?? \"0\");\n const y = Number.parseFloat(offsets[1] ?? \"0\");\n const blur = Number.parseFloat(offsets[2] ?? \"0\");\n if (!(x === 0 && y === 0 && blur > 4)) return false;\n const c = parseColor(colorMatch[0]);\n return c !== null && hasChroma(c, 30);\n}\n\nfunction firstFamily(decl: string): string {\n return (decl.split(\",\")[0] ?? \"\")\n .trim()\n .replace(/^['\"]|['\"]$/g, \"\")\n .toLowerCase();\n}\n\nfunction googleFontFamilies(url: string): string[] {\n const q = url.indexOf(\"?\");\n if (q === -1) return [];\n const params = new URLSearchParams(url.slice(q + 1).replace(/&/g, \"&\"));\n const out: string[] = [];\n for (const value of params.getAll(\"family\")) {\n for (const part of value.split(\"|\")) out.push((part.split(\":\")[0] ?? \"\").trim().toLowerCase());\n }\n return out.filter(Boolean);\n}\n\nfunction allGoogleFontFamilies(text: string): string[] {\n const out: string[] = [];\n for (const m of text.matchAll(/fonts\\.googleapis\\.com\\/css2?\\?[^\"'\\s)<>]*/gi))\n out.push(...googleFontFamilies(cap(m, 0)));\n return out;\n}\n\nfunction lineOf(text: string, index: number): number {\n let line = 1;\n for (let i = 0; i < index && i < text.length; i++) if (text[i] === \"\\n\") line++;\n return line;\n}\n\n/**\n * Comparative markers — the context that turns naming a rival into a positioning\n * claim rather than a mention. \"Se conecta con Zoppy\" is an integration; \"mejor\n * que Zoppy\" is a comparison, and on paid traffic that is the client's call.\n */\nconst COMPARISON_MARKERS =\n /\\b(?:vs|versus|frente a|comparad|compara|mejor|mejores|peor|peores|alternativa|melhor|melhores|pior|piores|compared|better|worse|alternative|than)\\b/;\n\n/** Character ranges covered by a `<table>` — where a comparison belongs, and\n * where naming a competitor is the section doing its job. */\nfunction tableRanges(text: string): Array<[number, number]> {\n const out: Array<[number, number]> = [];\n for (const m of text.matchAll(/<table\\b[\\s\\S]*?<\\/table>/gi)) {\n const start = m.index ?? 0;\n out.push([start, start + m[0].length]);\n }\n return out;\n}\n\n/**\n * A competitor from `src/content/competitors/` named in a comparative sentence,\n * outside a comparison table.\n *\n * Not an analyzer: it needs the vault, which the pure engine never reads. The\n * command loads the names and passes them in, and an empty list is the normal\n * case for a client with no competitor entries yet.\n */\nexport function detectCompetitorMentions(\n sources: Array<{ path: string; text: string }>,\n competitors: string[],\n): RawFinding[] {\n const names = distinctCompetitorNames(competitors);\n if (names.length === 0) return [];\n const out: RawFinding[] = [];\n for (const source of sources) out.push(...mentionsInSource(source, names));\n return dedupe(out);\n}\n\n/**\n * One entry per competitor, however many spellings the vault yields — it gives\n * both the file slug and the entry's `title:`, and a single mention reporting\n * twice reads as two defects. The capitalized spelling wins, being the one that\n * would appear on a page. Names under 4 characters are dropped: too short to\n * match a brand without catching ordinary words.\n */\nfunction distinctCompetitorNames(competitors: string[]): string[] {\n const byFold = new Map<string, string>();\n for (const raw of competitors) {\n if (typeof raw !== \"string\") continue;\n const name = raw.trim();\n if (name.length < 4) continue;\n const key = foldForCopy(name);\n if (!byFold.has(key) || /\\p{Lu}/u.test(name)) byFold.set(key, name);\n }\n return [...byFold.values()];\n}\n\n/**\n * Driven by each OCCURRENCE of the name, not by each sentence.\n *\n * The table exemption has to be decided by the mention the sentence actually\n * made. Resolving a name to its first occurrence anywhere in the file let the\n * legitimate comparison table at the top of `Compare.astro` silence every prose\n * comparison below it — the one file where that commentary lives — and made two\n * comparisons in one file both report the first one's line.\n */\nfunction mentionsInSource(source: { path: string; text: string }, names: string[]): RawFinding[] {\n const text = blankUnrenderedSource(source.text);\n const visible = blankHtmlKeepingOffsets(text);\n const tables = tableRanges(text);\n const out: RawFinding[] = [];\n for (const name of names) {\n const seen = new Set<number>();\n for (const m of visible.matchAll(new RegExp(`\\\\b${escapeRegExp(name)}\\\\b`, \"gi\"))) {\n const at = m.index ?? 0;\n if (tables.some(([from, to]) => at >= from && at < to)) continue;\n const start = sentenceStart(visible, at);\n if (seen.has(start)) continue;\n const sentence = sentenceAround(visible, at).replace(/\\s+/g, \" \").trim();\n if (!COMPARISON_MARKERS.test(foldForCopy(sentence))) continue;\n seen.add(start);\n out.push({\n id: \"competitor-named-in-comparison\",\n snippet: `\"${sentence.slice(0, 70)}\" names ${name}`,\n file: source.path,\n line: lineOf(text, at),\n });\n }\n }\n return out;\n}\n\n/**\n * Blank tags, scripts, styles and comments with spaces, PRESERVING length and\n * newlines. Unlike `stripHtmlToText` this keeps every offset identical to the\n * source, which is what lets a mention be located, line-attributed and tested\n * against the table ranges in one coordinate system.\n */\nfunction blankHtmlKeepingOffsets(text: string): string {\n const out = text.split(\"\");\n const pattern = /<script\\b[^>]*>[\\s\\S]*?<\\/script>|<style\\b[^>]*>[\\s\\S]*?<\\/style>|<!--[\\s\\S]*?-->|<[^>]+>/gi;\n for (const m of text.matchAll(pattern)) {\n const start = m.index ?? 0;\n for (let i = start; i < start + m[0].length && i < out.length; i++) {\n if (out[i] !== \"\\n\") out[i] = \" \";\n }\n }\n return out.join(\"\");\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/** Run the per-file rules over one source file (line matchers + file-scope\n * analyzers). Pure; never throws. Page-scope tells are handled by `detectPage`. */\nexport function detectSource(source: { path: string; text: string }): RawFinding[] {\n const file = source.path;\n // Frontmatter is component JS (imports, props) and a comment is commentary —\n // neither is design source. Blanked line-preservingly so no rule reads them\n // and attribution stays exact.\n const text = blankUnrenderedSource(source.text);\n const findings: RawFinding[] = [];\n const lines = text.split(\"\\n\");\n for (const matcher of LINE_MATCHERS) {\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n for (const m of line.matchAll(matcher.regex)) {\n if (matcher.test(m, line)) findings.push({ id: matcher.id, snippet: matcher.fmt(m, line), file, line: i + 1 });\n }\n }\n }\n for (const analyzer of ANALYZERS) {\n if (analyzer.scope === \"file\") findings.push(...analyzer.run(text, file));\n }\n return dedupe(findings);\n}\n\n/** Run the page-scope analyzers over the ASSEMBLED page (all sources joined),\n * so count-threshold tells aren't diluted across small components. Page-level\n * findings have no single line; they attribute to the page's `index.astro`. */\nexport function detectPage(sources: Array<{ path: string; text: string }>): RawFinding[] {\n if (sources.length === 0) return [];\n const combined = sources.map((s) => blankUnrenderedSource(s.text)).join(\"\\n\");\n const pageFile =\n sources.find((s) => s.path === \"index.astro\" || s.path.endsWith(\"/index.astro\"))?.path ??\n sources[0]?.path ??\n \"index.astro\";\n const findings: RawFinding[] = [];\n for (const analyzer of ANALYZERS) {\n if (analyzer.scope === \"page\") findings.push(...analyzer.run(combined, pageFile));\n }\n return dedupe(findings);\n}\n\nfunction dedupe(findings: RawFinding[]): RawFinding[] {\n const out: RawFinding[] = [];\n for (const f of findings) {\n const dupe = out.some(\n (d) => d.id === f.id && d.snippet === f.snippet && Math.abs((d.line ?? 0) - (f.line ?? 0)) <= 2,\n );\n if (!dupe) out.push(f);\n }\n return out;\n}\n","/**\n * Landing anti-slop critic — the engine entry (pure + offline).\n *\n * Our answer for landing pages to the \"every model ships the same AI tells\"\n * problem, grounded in the doctrine the `landing` skill already teaches. It\n * scans a landing's `.astro` source, scores it on design families, and returns\n * findings tiered block/warn/advisory — BEFORE publish, so tells get fixed.\n *\n * ADVISORY as a value object: it returns scores + findings and never throws.\n * The CLI that wraps it always exits 0; blocking is the verify gate's job (it\n * reads the block-tier count from the freshness snapshot). Brand-matched values\n * are downgraded to advisory `brandDrift` so we never fight a committed brand.\n *\n * Pure: it takes the already-read source text + parsed brand tokens, so it has\n * no fs/network surface and is trivially unit-testable (tier-1).\n */\n\nimport type { BrandTokens } from \"./brand-tokens.ts\";\nimport { brandCommitsAiHue, brandCommitsCream, brandCommitsFont } from \"./brand-tokens.ts\";\nimport { type Family, RULE_META, SEVERITY_WEIGHT, type Severity } from \"./constants.ts\";\nimport { detectCompetitorMentions, detectPage, detectSource, type RawFinding } from \"./rules.ts\";\n\nexport type LandingFinding = {\n id: string;\n severity: Severity;\n family: Family;\n snippet: string;\n file?: string;\n line?: number;\n note: string;\n brandDrift?: boolean;\n};\n\nexport type LandingDimension = {\n dimension: Family;\n /** 0–1, higher is better. */\n score: number;\n note: string;\n};\n\nexport type LandingSource = { path: string; text: string };\n\nexport type CritiqueLandingInput = {\n slug: string;\n sources: LandingSource[];\n brand: BrandTokens;\n /** Competitor names from `src/content/competitors/`. Absent for a client with\n * no competitor entries yet, which is normal and simply skips that rule. */\n competitors?: string[];\n};\n\nexport type CritiqueLandingReport = {\n advisory: true;\n overall: number;\n dimensions: LandingDimension[];\n findings: LandingFinding[];\n counts: { block: number; warn: number; advisory: number };\n};\n\nconst FAMILIES: Family[] = [\"typography\", \"color\", \"borders_depth\", \"motion\", \"spacing\", \"copy\", \"integrity\"];\n\nfunction round(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nfunction clamp01(n: number): number {\n return Math.max(0, Math.min(1, n));\n}\n\n/**\n * Apply the BRAND.md allowlist: a font/color tell whose value the brand commits\n * is a decision, not slop — downgrade it to advisory and mark it `brandDrift`.\n */\nfunction applyBrand(\n id: string,\n snippet: string,\n severity: Severity,\n brand: BrandTokens,\n): { severity: Severity; brandDrift: boolean } {\n const meta = RULE_META[id];\n if (!meta?.brandAware || !brand.hasTokens) return { severity, brandDrift: false };\n const matched =\n (meta.brandAware === \"font\" && brandCommitsFont(brand, snippet)) ||\n (meta.brandAware === \"color\" && id === \"ai-color-palette\" && brandCommitsAiHue(brand)) ||\n (meta.brandAware === \"color\" && id === \"cream-palette\" && brandCommitsCream(brand));\n return matched ? { severity: \"advisory\", brandDrift: true } : { severity, brandDrift: false };\n}\n\n/** Score a landing. Branches nowhere — every family is always reported so the\n * output reads like a stable scorecard. Every heuristic degrades gracefully. */\nexport function critiqueLanding(input: CritiqueLandingInput): CritiqueLandingReport {\n const sources = Array.isArray(input.sources) ? input.sources : [];\n const findings: LandingFinding[] = [];\n\n // Per-file tells (line-attributed) plus page-scope tells over the assembled\n // page (count-threshold tells a componentized landing would otherwise dodge).\n const raws: RawFinding[] = [];\n for (const source of sources) raws.push(...detectSource(source));\n raws.push(...detectPage(sources));\n raws.push(...detectCompetitorMentions(sources, input.competitors ?? []));\n\n for (const raw of raws) {\n const meta = RULE_META[raw.id];\n if (!meta) continue;\n const { severity, brandDrift } = applyBrand(raw.id, raw.snippet, meta.severity, input.brand);\n findings.push({\n id: raw.id,\n severity,\n family: meta.family,\n snippet: raw.snippet,\n file: raw.file,\n line: raw.line,\n note: meta.note,\n ...(brandDrift ? { brandDrift: true } : {}),\n });\n }\n\n const dimensions: LandingDimension[] = FAMILIES.map((family) => {\n const fam = findings.filter((f) => f.family === family);\n const penalty = fam.reduce((s, f) => s + SEVERITY_WEIGHT[f.severity], 0);\n const score = round(clamp01(1 - penalty));\n const note = fam.length === 0 ? \"clean\" : `${fam.length} finding(s): ${describeCounts(fam)}`;\n return { dimension: family, score, note };\n });\n\n const overall = round(dimensions.reduce((s, d) => s + d.score, 0) / dimensions.length);\n const counts = {\n block: findings.filter((f) => f.severity === \"block\").length,\n warn: findings.filter((f) => f.severity === \"warn\").length,\n advisory: findings.filter((f) => f.severity === \"advisory\").length,\n };\n\n return { advisory: true, overall, dimensions, findings, counts };\n}\n\nfunction describeCounts(findings: LandingFinding[]): string {\n const b = findings.filter((f) => f.severity === \"block\").length;\n const w = findings.filter((f) => f.severity === \"warn\").length;\n const a = findings.filter((f) => f.severity === \"advisory\").length;\n return [b ? `${b} block` : \"\", w ? `${w} warn` : \"\", a ? `${a} advisory` : \"\"].filter(Boolean).join(\", \");\n}\n","import { mkdir, rename, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\n/**\n * The freshness snapshot the critique CLI writes and the verify gate reads.\n * Lives under the gitignored `.cache/` so it never creates a diff. The gate\n * proves \"the critiqued source == the shipping source\" by recomputing the\n * landing's source hash and comparing it to the one recorded here.\n *\n * TWO fingerprints, for one release. `compositionSha` is the current one — every\n * `.astro` in the landing's import graph, so a section the page borrows counts.\n * `sourceSha` is the older, folder-shaped one, and it is written for a gate that\n * predates the composition fingerprint: this CLI and the gate reach a workspace\n * on different tracks (the E2B image vs the per-repo scaffold sync), so for a\n * while after the change each half meets the other's. A gate that cannot read\n * the fingerprint it is given calls every landing stale forever and blocks the\n * commit. Both fields, and both readers, go away together — see\n * `computeLegacyLandingSourceSha`.\n */\n\n/** Bump when a rule change should invalidate old snapshots (informational; the\n * gate keys off the source hash, this just lets the agent know it's re-scored). */\nexport const CRITIC_VERSION = \"4\";\n\nexport type CritiqueSnapshot = {\n slug: string;\n /** The composition fingerprint — what the current gate compares. */\n compositionSha: string;\n /** The folder-shaped fingerprint, for a gate older than the one above. */\n sourceSha: string;\n criticVersion: string;\n at: string;\n blockCount: number;\n warnCount: number;\n};\n\nfunction critiqueCacheDir(projectRoot: string): string {\n return path.join(projectRoot, \".cache\", \"landing-critique\");\n}\n\nfunction snapshotPath(projectRoot: string, slug: string): string {\n return path.join(critiqueCacheDir(projectRoot), `${slug}.json`);\n}\n\nexport async function writeCritiqueSnapshot(projectRoot: string, snapshot: CritiqueSnapshot): Promise<void> {\n await mkdir(critiqueCacheDir(projectRoot), { recursive: true });\n // Write-then-rename so a concurrent gate read never parses a half-written file.\n const dest = snapshotPath(projectRoot, snapshot.slug);\n const tmp = `${dest}.tmp`;\n await writeFile(tmp, `${JSON.stringify(snapshot, null, 2)}\\n`, \"utf8\");\n await rename(tmp, dest);\n}\n","import type { Dirent } from \"node:fs\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { sha256Hex } from \"../../engine/storage/sha256.ts\";\nimport { landingGraphFiles } from \"./import-graph.ts\";\n\n/**\n * A content fingerprint of a landing's editable source — the files an agent\n * edits. It is the bridge the quality gate uses to tell \"this critique is\n * current\" from \"the source was edited since the last critique\":\n *\n * - `baker landing critique <slug>` records the fingerprint it SCORED, and\n * - the `validate-landing-critique` verify gate recompares against the CURRENT\n * source. Equal → the critique is fresh; different (or missing) → the landing\n * changed and must be re-critiqued before it can publish.\n *\n * ## The file set follows the imports, not the folder\n *\n * It used to be `index.astro` plus this landing's own `_components/**\\/*.astro`.\n * Pages share components since A/B tests shipped — a variant borrows the\n * control's sections and forks only the one under test — so that set stopped\n * describing the page. Two things broke at once: an edit to a shared section\n * left the borrowing page's sha unchanged, so the gate passed a page it had\n * never scored in the shape it ships; and the critic was handed a page whose\n * sections it could not read, then asked to judge its composition.\n *\n * So the set is every `.astro` file in the landing's import graph, with\n * repo-relative paths because a shared section does not live under the landing.\n * Bounded to `src/pages/**` and `src/components/**` — the composition the critic\n * judges. The layout and the flow engine are reached by every page and are not\n * compositional; hashing them would restate \"the scaffold changed\" as \"every\n * landing is stale\".\n *\n * Content-addressed (not mtime), so a clone at a different path or clock skew\n * never produces a false \"edited\". The gate's `.mjs`\n * (`apps/scaffold-template/__tooling__/checks/sdk/landing-critique-freshness.mjs`)\n * reimplements this exact ordering + length-prefixed concat — it can't import the\n * CLI — so keep the two in lockstep: repo-relative POSIX paths, ascending\n * codepoint sort, `${len}\\0` prefix. `scripts/__tests__/landing-source-version-parity.test.ts`\n * runs both over one fixture tree and fails when they disagree.\n */\n\n/** Roots whose `.astro` files count as this landing's composition. */\nconst CRITIQUED_ROOTS = [\"src/pages/\", \"src/components/\"];\n\n/** Ordered repo-relative POSIX paths of a landing's source files (sorted, stable). */\nasync function landingSourceRelPaths(root: string, slug: string): Promise<string[]> {\n const files = await landingGraphFiles(root, slug);\n return [...files]\n .filter((rel) => rel.endsWith(\".astro\") && CRITIQUED_ROOTS.some((r) => rel.startsWith(r)))\n .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n}\n\n/** Read the landing's source files as {path, text} for the critic. */\nexport async function readLandingSources(root: string, slug: string): Promise<Array<{ path: string; text: string }>> {\n const rel = await landingSourceRelPaths(root, slug);\n const out: Array<{ path: string; text: string }> = [];\n for (const r of rel) out.push({ path: r, text: await readFile(path.join(root, r), \"utf8\") });\n return out;\n}\n\n/** Length-prefixed concat SHA over the landing's source files, in sorted order. */\nexport async function computeLandingSourceSha(root: string, slug: string): Promise<string> {\n const rel = await landingSourceRelPaths(root, slug);\n const parts: Buffer[] = [];\n for (const r of rel) {\n let bytes: Buffer;\n try {\n bytes = await readFile(path.join(root, r));\n } catch {\n bytes = Buffer.alloc(0);\n }\n // Length-prefix by both the path and the bytes so moving content across\n // files can't collide, mirroring canvas source-version.ts.\n parts.push(Buffer.from(`${r}\\0${bytes.length}\\0`), bytes);\n }\n return sha256Hex(Buffer.concat(parts));\n}\n\n/**\n * The fingerprint as it was BEFORE the composition one above: `index.astro`\n * plus this landing's own `_components/**\\/*.astro`, paths relative to the\n * landing folder.\n *\n * Written into every snapshot beside the composition sha, and read by nothing\n * here. It is there for a gate that predates the composition fingerprint: this\n * CLI reaches a workspace through the E2B image (`@koda-sl/baker-cli@latest`,\n * baked at build) and the gate reaches the same workspace through the per-repo\n * scaffold sync — two tracks with no ordering between them, and a repo whose\n * sync is frozen keeps the old gate indefinitely. An old gate handed only a\n * composition sha recomputes its own, calls every landing stale, re-runs this\n * command, gets the same snapshot back, and blocks the commit citing an\n * unwritable `.cache/`.\n *\n * Delete together with the scaffold's `computeLegacySourceSha` once the fleet\n * and the template both carry the composition fingerprint.\n */\nexport async function computeLegacyLandingSourceSha(landingDir: string): Promise<string> {\n const rel: string[] = [];\n if (await isFile(path.join(landingDir, \"index.astro\"))) rel.push(\"index.astro\");\n for (const abs of await walkAstro(path.join(landingDir, \"_components\"))) {\n rel.push(path.relative(landingDir, abs).split(path.sep).join(\"/\"));\n }\n rel.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n\n const parts: Buffer[] = [];\n for (const r of rel) {\n let bytes: Buffer;\n try {\n bytes = await readFile(path.join(landingDir, r));\n } catch {\n bytes = Buffer.alloc(0);\n }\n parts.push(Buffer.from(`${r}\\0${bytes.length}\\0`), bytes);\n }\n return sha256Hex(Buffer.concat(parts));\n}\n\nasync function isFile(p: string): Promise<boolean> {\n try {\n return (await stat(p)).isFile();\n } catch {\n return false;\n }\n}\n\nasync function walkAstro(dir: string): Promise<string[]> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return [];\n }\n const out: string[] = [];\n for (const entry of entries) {\n const abs = path.join(dir, entry.name);\n if (entry.isDirectory()) out.push(...(await walkAstro(abs)));\n else if (entry.isFile() && entry.name.endsWith(\".astro\")) out.push(abs);\n }\n return out;\n}\n"],"mappings":"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","names":["readdir","readFile","stat","path","path","path","path","readdir","readFile","stat"]}
|
package/dist/crm-EGNVKQHB.js
DELETED
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
crmBatchFromSheet,
|
|
3
|
-
crmPushBrief,
|
|
4
|
-
crmPushRequestSchema,
|
|
5
|
-
crmPushUrl,
|
|
6
|
-
judgeCrmBatch,
|
|
7
|
-
sheetDelimiter
|
|
8
|
-
} from "./chunk-MXPFUDFR.js";
|
|
9
|
-
import "./chunk-GRQ2AXDX.js";
|
|
10
|
-
import {
|
|
11
|
-
failApi
|
|
12
|
-
} from "./chunk-TQAXOBKJ.js";
|
|
13
|
-
import "./chunk-MBKCUSMR.js";
|
|
14
|
-
import "./chunk-GXDLWBOY.js";
|
|
15
|
-
import "./chunk-WYCVJIHD.js";
|
|
16
|
-
import "./chunk-ZJWUBJYQ.js";
|
|
17
|
-
import "./chunk-XML7AJM3.js";
|
|
18
|
-
import {
|
|
19
|
-
ApiError,
|
|
20
|
-
apiGet,
|
|
21
|
-
apiPost
|
|
22
|
-
} from "./chunk-EPK2GYLV.js";
|
|
23
|
-
import "./chunk-BSUN6JMU.js";
|
|
24
|
-
import {
|
|
25
|
-
getEnv
|
|
26
|
-
} from "./chunk-SXRSLUW7.js";
|
|
27
|
-
import {
|
|
28
|
-
writeJson
|
|
29
|
-
} from "./chunk-O4AXPEOE.js";
|
|
30
|
-
import {
|
|
31
|
-
registerSchema
|
|
32
|
-
} from "./chunk-JIHG6K7N.js";
|
|
33
|
-
import "./chunk-YQSBHWOI.js";
|
|
34
|
-
|
|
35
|
-
// src/commands/accounts/crm.ts
|
|
36
|
-
import { readFileSync } from "fs";
|
|
37
|
-
import { defineCommand } from "citty";
|
|
38
|
-
import { parse } from "csv-parse/sync";
|
|
39
|
-
var MAX_REJECTIONS_SHOWN = 20;
|
|
40
|
-
function jsonKind(batch) {
|
|
41
|
-
const body = batch;
|
|
42
|
-
const companies = (body?.companies?.length ?? 0) > 0;
|
|
43
|
-
const deals = (body?.deals?.length ?? 0) > 0;
|
|
44
|
-
if (companies && deals) return "both";
|
|
45
|
-
return companies ? "companies" : "deals";
|
|
46
|
-
}
|
|
47
|
-
function readBatch(name, text) {
|
|
48
|
-
if (name.toLowerCase().endsWith(".json")) {
|
|
49
|
-
const batch = JSON.parse(text);
|
|
50
|
-
return { format: "json", kind: jsonKind(batch), batch, ignoredColumns: [] };
|
|
51
|
-
}
|
|
52
|
-
const rows = parse(text, {
|
|
53
|
-
bom: true,
|
|
54
|
-
columns: true,
|
|
55
|
-
delimiter: sheetDelimiter(text),
|
|
56
|
-
skip_empty_lines: true,
|
|
57
|
-
relax_column_count: true,
|
|
58
|
-
trim: true
|
|
59
|
-
});
|
|
60
|
-
const sheet = crmBatchFromSheet(rows);
|
|
61
|
-
return { format: "csv", kind: sheet.kind, batch: sheet.batch, ignoredColumns: sheet.ignoredColumns };
|
|
62
|
-
}
|
|
63
|
-
function checkCrmFile(name, text) {
|
|
64
|
-
const { format, kind, batch, ignoredColumns } = readBatch(name, text);
|
|
65
|
-
const body = crmPushRequestSchema.safeParse(batch);
|
|
66
|
-
if (!body.success) throw new Error(body.error.issues[0]?.message ?? "not a batch of companies and deals");
|
|
67
|
-
const judged = judgeCrmBatch(body.data);
|
|
68
|
-
const kept = (items) => items.filter((item) => !item.deleted).length;
|
|
69
|
-
const rejectedOf = (kind2) => judged.rejected.filter((r) => r.kind === kind2).length;
|
|
70
|
-
const data = {
|
|
71
|
-
file: name,
|
|
72
|
-
format,
|
|
73
|
-
kind,
|
|
74
|
-
received: {
|
|
75
|
-
companies: judged.companies.length + rejectedOf("company"),
|
|
76
|
-
deals: judged.deals.length + rejectedOf("deal")
|
|
77
|
-
},
|
|
78
|
-
accepted: { companies: kept(judged.companies), deals: kept(judged.deals) },
|
|
79
|
-
rejected: judged.rejected.slice(0, MAX_REJECTIONS_SHOWN),
|
|
80
|
-
rejectedCount: judged.rejected.length,
|
|
81
|
-
ignoredColumns
|
|
82
|
-
};
|
|
83
|
-
const hints = [];
|
|
84
|
-
if (judged.rejected.length > 0) {
|
|
85
|
-
hints.push(
|
|
86
|
-
`${judged.rejected.length} record(s) would be refused \u2014 fix them in the file (each message names the field) and check again. The rest would still be accepted.`
|
|
87
|
-
);
|
|
88
|
-
}
|
|
89
|
-
if (kind === "companies") {
|
|
90
|
-
hints.push(
|
|
91
|
-
"Read as a company list (one row per company). A website or LinkedIn page is enough to know a company by; deals sent later with the same website land on it."
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
if (ignoredColumns.length > 0) {
|
|
95
|
-
hints.push(`These columns are left behind and never sent: ${ignoredColumns.join(", ")}.`);
|
|
96
|
-
}
|
|
97
|
-
hints.push(
|
|
98
|
-
format === "csv" ? "Nothing was sent. The user uploads this file themselves in Measure \u2192 Sources \u2192 Deals \u2192 Send your deals \u2192 Upload a file \u2014 or keeps it in a Google Sheet and links it there (Google Sheets), which Baker then reads every night." : "Nothing was sent. This is the body their system posts to the address in `baker accounts crm contract`, with their CRM sending key."
|
|
99
|
-
);
|
|
100
|
-
return { data, hints };
|
|
101
|
-
}
|
|
102
|
-
registerSchema({
|
|
103
|
-
command: "accounts.crm.status",
|
|
104
|
-
description: "Start here when a client's deals are not in HubSpot. Where Account insights reads deals from (source: hubspot | api \u2014 api means the client sends them), the address their system sends to, the last live send and the last test send (when, via upload | sheet | api, how many companies and deals, the first refusals and why), the Google Sheets Baker reads every night (each with its last read, or why it failed), and what Baker holds now (companies, deals, deals per pipeline and stage, and how many were sent as won or lost).",
|
|
105
|
-
args: {}
|
|
106
|
-
});
|
|
107
|
-
var statusCommand = defineCommand({
|
|
108
|
-
meta: {
|
|
109
|
-
name: "status",
|
|
110
|
-
description: "Where the client's deals come from and what has arrived. Example: baker accounts crm status"
|
|
111
|
-
},
|
|
112
|
-
args: {},
|
|
113
|
-
run: async () => {
|
|
114
|
-
try {
|
|
115
|
-
const response = await apiGet("/api/accounts/crm/status");
|
|
116
|
-
writeJson({ ...response, hints: statusHints(response.data) });
|
|
117
|
-
} catch (err) {
|
|
118
|
-
failApi(err);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
function sheetHints(sheets) {
|
|
123
|
-
return sheets.filter((sheet) => sheet.lastRead !== null && !sheet.lastRead.ok).map(
|
|
124
|
-
(sheet) => `Baker could not read the linked Google Sheet "${sheet.spreadsheetName} \xB7 ${sheet.tab}": ${sheet.lastRead?.message ?? "no reason given"} Tell the user; they fix it in Measure \u2192 Sources \u2192 Deals \u2192 Google Sheets (Read now, or link it again). What it brought stays in Baker until then.`
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
function refusedHints(lastLive) {
|
|
128
|
-
if (lastLive === null || lastLive.rejected === 0) return [];
|
|
129
|
-
const reasons = [...new Set(lastLive.samples.map((sample) => sample.message))].join("; ");
|
|
130
|
-
return [
|
|
131
|
-
`${lastLive.rejected} record(s) in the last send were refused and are not in Baker (${reasons}). The rest arrived. Tell the user what to fix in their file, sheet or system; the next send takes the corrected rows.`
|
|
132
|
-
];
|
|
133
|
-
}
|
|
134
|
-
function statusHints(data) {
|
|
135
|
-
if (data.source === null) {
|
|
136
|
-
return [
|
|
137
|
-
"Nobody has said where the deals are yet. The user chooses in Measure \u2192 Accounts: HubSpot, or Another CRM (they send the deals)."
|
|
138
|
-
];
|
|
139
|
-
}
|
|
140
|
-
if (data.source === "hubspot") return ["Deals are read from HubSpot; nothing needs sending."];
|
|
141
|
-
const failing = [...sheetHints(data.sheets), ...refusedHints(data.lastLive)];
|
|
142
|
-
if (data.lastLive === null && data.sheets.length === 0) {
|
|
143
|
-
return [
|
|
144
|
-
"Another CRM is chosen and nothing has arrived. Offer the three ways in, all in Measure \u2192 Sources \u2192 Deals: a CSV of deals or of companies uploaded there (check it first with `baker accounts crm check --file`), a Google Sheet they link there and Baker reads every night, or their developer sending from their system (`baker accounts crm contract`)."
|
|
145
|
-
];
|
|
146
|
-
}
|
|
147
|
-
if ((data.contents?.companies ?? 0) > 0 && (data.contents?.deals ?? 0) === 0) {
|
|
148
|
-
return [
|
|
149
|
-
...failing,
|
|
150
|
-
"Only companies have arrived, no deals. Baker matches them to the companies the LinkedIn ads reach, but no pipeline or revenue counts as influenced until deals arrive: offer the same ways in for a deals export (a deal names its company by the same website)."
|
|
151
|
-
];
|
|
152
|
-
}
|
|
153
|
-
const sentStatus = (data.contents?.stages ?? []).some((stage) => stage.won > 0 || stage.lost > 0);
|
|
154
|
-
if (sentStatus || (data.contents?.deals ?? 0) === 0) return failing;
|
|
155
|
-
return [
|
|
156
|
-
...failing,
|
|
157
|
-
"The deals arrived without a status (open, won, lost). Unless the user has picked which stages mean won and lost in Measure \u2192 Sources \u2192 Deals, no deal counts as won: send status with each deal, or ask them to pick."
|
|
158
|
-
];
|
|
159
|
-
}
|
|
160
|
-
var CHECK_ARGS = {
|
|
161
|
-
file: {
|
|
162
|
-
type: "string",
|
|
163
|
-
description: "A CSV of deals or of companies (one row each), or a JSON body { companies, deals }",
|
|
164
|
-
required: true
|
|
165
|
-
}
|
|
166
|
-
};
|
|
167
|
-
registerSchema({
|
|
168
|
-
command: "accounts.crm.check",
|
|
169
|
-
description: "Check a client's CRM file before they send it: judged offline by exactly the rules the upload, a linked Google Sheet and the endpoint use, nothing stored. A CSV is a deals export (Deal ID/Opportunity ID, Deal name, Company/Account Name, Website, Company LinkedIn, Amount, Currency, Pipeline, Stage, Status, Created, Closed) or a company list (Company ID/Account ID, Company name, Website, LinkedIn page \u2014 a website alone is enough), told apart by its columns; other columns are left behind. Dates may be YYYY-MM-DD or 15/03/2026. Returns {kind, received, accepted, rejected (each with the field and why), ignoredColumns}. Records naming a person (contact, owner, email, phone) are refused.",
|
|
170
|
-
args: CHECK_ARGS
|
|
171
|
-
});
|
|
172
|
-
var checkCommand = defineCommand({
|
|
173
|
-
meta: {
|
|
174
|
-
name: "check",
|
|
175
|
-
description: "Check a CRM export will be accepted, without sending it. Example: baker accounts crm check --file deals.csv"
|
|
176
|
-
},
|
|
177
|
-
args: CHECK_ARGS,
|
|
178
|
-
run: ({ args }) => {
|
|
179
|
-
try {
|
|
180
|
-
const { data, hints } = checkCrmFile(args.file, readFileSync(args.file, "utf8"));
|
|
181
|
-
writeJson({ ok: true, data, hints });
|
|
182
|
-
} catch (error) {
|
|
183
|
-
writeJson({
|
|
184
|
-
ok: false,
|
|
185
|
-
error: {
|
|
186
|
-
code: "INVALID_FILE",
|
|
187
|
-
message: `${args.file} could not be read as CSV or JSON: ${error instanceof Error ? error.message : String(error)}`
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
process.exit(1);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
registerSchema({
|
|
195
|
-
command: "accounts.crm.contract",
|
|
196
|
-
description: "The whole contract for a client's developer (or their coding assistant) as Markdown: the address, the key to use, test mode, every company and deal field, the answer and an example. Hand it over as it is; never put a key in it.",
|
|
197
|
-
args: {}
|
|
198
|
-
});
|
|
199
|
-
var contractCommand = defineCommand({
|
|
200
|
-
meta: {
|
|
201
|
-
name: "contract",
|
|
202
|
-
description: "What a client's system sends, for their developer. Example: baker accounts crm contract"
|
|
203
|
-
},
|
|
204
|
-
args: {},
|
|
205
|
-
run: () => {
|
|
206
|
-
const env = getEnv();
|
|
207
|
-
process.stdout.write(crmPushBrief(crmPushUrl(env.BAKER_PUBLIC_API_URL, env.BAKER_API_URL)));
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
var SHEET_ARGS = {
|
|
211
|
-
account: {
|
|
212
|
-
type: "string",
|
|
213
|
-
description: "The Google Drive connection to create it with, when the company has more than one",
|
|
214
|
-
required: false
|
|
215
|
-
}
|
|
216
|
-
};
|
|
217
|
-
registerSchema({
|
|
218
|
-
command: "accounts.crm.sheet",
|
|
219
|
-
description: `Create the deals sheet LinkedIn's Account insights reads, for a company running LinkedIn campaigns whose CRM Baker cannot read (anything but HubSpot). Makes "Deals and companies for Baker" in the client's Google Drive \u2014 a Deals tab and a Companies tab headed by the columns Baker reads \u2014 and links both, so Baker reads it every night; chooses Another CRM first when nobody has said where the deals are. Applies at once (it is a real file) and goes on the chat's change list. Empty: nothing counts until the client fills it or pastes their CRM export into it. Asking again returns the sheet already linked. Needs a Google Drive connection and a chat owned by an admin of the company; refused when HubSpot is where the deals come from. Returns {created, spreadsheetName, url, tabs}.`,
|
|
220
|
-
args: SHEET_ARGS
|
|
221
|
-
});
|
|
222
|
-
function sheetFailureFix(code, message) {
|
|
223
|
-
if (code === "NOT_FOUND" && message.startsWith("No Google Drive account is connected")) {
|
|
224
|
-
return {
|
|
225
|
-
action: "request_connection",
|
|
226
|
-
explanation: 'Google Drive is not connected, and the sheet is made in it. Don\'t send the user to Settings or end the turn \u2014 call the `request_connection` tool with { platform: "google-drive", reason: "so I can create the sheet of your deals that LinkedIn Account insights reads" }; once they connect, run `baker accounts crm sheet` again. If they decline or the call fails, carry on with the rest of the work and leave a Task saying the deals sheet is still to create.'
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
if (message.startsWith("Only an admin")) {
|
|
230
|
-
return {
|
|
231
|
-
action: "continue_without",
|
|
232
|
-
explanation: "Carry on with the rest of the work and leave a Task for an admin: create the deals sheet for LinkedIn Account insights."
|
|
233
|
-
};
|
|
234
|
-
}
|
|
235
|
-
return null;
|
|
236
|
-
}
|
|
237
|
-
var sheetCommand = defineCommand({
|
|
238
|
-
meta: {
|
|
239
|
-
name: "sheet",
|
|
240
|
-
description: "Start here when the client runs LinkedIn ads and their deals are not in HubSpot: create and link the Google Sheet of deals Account insights reads. Example: baker accounts crm sheet"
|
|
241
|
-
},
|
|
242
|
-
args: SHEET_ARGS,
|
|
243
|
-
run: async ({ args }) => {
|
|
244
|
-
try {
|
|
245
|
-
const account = typeof args.account === "string" && args.account.trim() !== "" ? args.account.trim() : void 0;
|
|
246
|
-
const response = await apiPost("/api/accounts/crm/sheet", account ? { account } : {});
|
|
247
|
-
writeJson({
|
|
248
|
-
...response,
|
|
249
|
-
hints: [
|
|
250
|
-
`Give the user the link (${response.data.url}). The client fills the Deals tab \u2014 or pastes their CRM's deals export into it \u2014 and keeps it up to date; Baker reads it every night, and "Read now" in Measure \u2192 Sources \u2192 Deals reads it at once. A website on each deal is enough to match it to the companies the LinkedIn ads reach.`,
|
|
251
|
-
"Check what arrived later with `baker accounts crm status`."
|
|
252
|
-
]
|
|
253
|
-
});
|
|
254
|
-
} catch (err) {
|
|
255
|
-
if (err instanceof ApiError) {
|
|
256
|
-
const fix = sheetFailureFix(err.code, err.message);
|
|
257
|
-
if (fix) {
|
|
258
|
-
writeJson({ ok: false, error: { code: err.code, message: err.message, fix } });
|
|
259
|
-
process.exit(1);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
failApi(err);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
});
|
|
266
|
-
var crmCommand = defineCommand({
|
|
267
|
-
meta: {
|
|
268
|
-
name: "crm",
|
|
269
|
-
description: "A CRM Baker cannot read (Salesforce, Pipedrive, a Google Sheet, their own): where the deals and companies stand, create the deals sheet Baker reads, check a file before it is sent, and the contract a developer sends to. Nothing here sends a deal."
|
|
270
|
-
},
|
|
271
|
-
subCommands: { status: statusCommand, sheet: sheetCommand, check: checkCommand, contract: contractCommand }
|
|
272
|
-
});
|
|
273
|
-
export {
|
|
274
|
-
checkCrmFile,
|
|
275
|
-
crmCommand,
|
|
276
|
-
sheetFailureFix,
|
|
277
|
-
statusHints
|
|
278
|
-
};
|
|
279
|
-
//# sourceMappingURL=crm-EGNVKQHB.js.map
|