@koda-sl/baker-cli 0.567.0 → 0.569.0-dev.1b455b3fe
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 +10 -9
- package/dist/account-JREYXYNE.js +82 -0
- package/dist/account-OUKPRB7C.js +139 -0
- package/dist/account-WN5MJ5QN.js +82 -0
- package/dist/account-assets-IWJWYNQ3.js +290 -0
- package/dist/account-level-SHZBOMVV.js +612 -0
- package/dist/account-level-SHZBOMVV.js.map +1 -0
- package/dist/account-reads-GF3T25HX.js +220 -0
- package/dist/account-reads-GF3T25HX.js.map +1 -0
- package/dist/account-users-7NKBUVYA.js +65 -0
- package/dist/account-users-7NKBUVYA.js.map +1 -0
- package/dist/account-writes-IUIXIVRC.js +68 -0
- package/dist/accounts-4YRDRLHX.js +80 -0
- package/dist/accounts-HEGADQ6E.js +119 -0
- package/dist/accounts-OSVXKNSI.js +76 -0
- package/dist/accounts-SJOO4MQX.js +115 -0
- package/dist/accounts-V7EOUTNL.js +713 -0
- package/dist/actions-5LYJ3U6G.js +55 -0
- package/dist/active-entities-4KQQSMRZ.js +103 -0
- package/dist/activecampaign-CZHLHGT4.js +938 -0
- package/dist/activities-FRA33VZZ.js +75 -0
- package/dist/ad-group-writes-YQXBUA3Q.js +172 -0
- package/dist/ad-groups-NJR4ILEN.js +70 -0
- package/dist/ad-writes-TZV64CC2.js +176 -0
- package/dist/add-MZUSKY2L.js +305 -0
- package/dist/add-NAUSQKRS.js +107 -0
- package/dist/ads-A2FXTQES.js +120 -0
- package/dist/ads-PYTK3LJE.js +48 -0
- package/dist/ads-Q7DD5VXU.js +79 -0
- package/dist/adsets-ZHEVFOK4.js +182 -0
- package/dist/advertisers-HSTND4HE.js +123 -0
- package/dist/analytics-63Q3FJN4.js +447 -0
- package/dist/analytics-GLJODEIM.js +2437 -0
- package/dist/animate-EI6AYBDI.js +480 -0
- package/dist/asset-writes-MS45UKJ3.js +51 -0
- package/dist/assign-7HT3XSSN.js +80 -0
- package/dist/audience-size-DG7544D2.js +76 -0
- package/dist/audience-writes-IL64HQBS.js +328 -0
- package/dist/audience-writes-IL64HQBS.js.map +1 -0
- package/dist/audiences-2IVVS3SJ.js +280 -0
- package/dist/audiences-RN745R53.js +85 -0
- package/dist/audiences-Z2TQT35L.js +106 -0
- package/dist/audit-BIHMDO5K.js +88 -0
- package/dist/audit-ZYST7KCO.js +154 -0
- package/dist/autocomplete-5BKEMOQ3.js +114 -0
- package/dist/avatars-FQOCDWLW.js +38 -0
- package/dist/bid-pricing-JEW7T2VR.js +103 -0
- package/dist/brand-FR6BKWXN.js +22 -0
- package/dist/brief-32IXDJ4J.js +543 -0
- package/dist/businesses-HECSW3EL.js +54 -0
- package/dist/campaign-groups-LYPVIZT5.js +99 -0
- package/dist/campaign-writes-D5MM5LUH.js +168 -0
- package/dist/campaign-writes-S7A6W5V3.js +176 -0
- package/dist/campaigns-CMDF3P7Y.js +111 -0
- package/dist/campaigns-LIICP5JU.js +113 -0
- package/dist/campaigns-N72TOUQX.js +130 -0
- package/dist/campaigns-ZWJKBF3L.js +78 -0
- package/dist/canvas-3SNC3UUV.js +46 -0
- package/dist/capabilities-GL7P3SWY.js +147 -0
- package/dist/cards-RYQN5JLR.js +85 -0
- package/dist/catalog-PWAWDK42.js +66 -0
- package/dist/catalogs-2R5RV4L7.js +783 -0
- package/dist/catalogs-2R5RV4L7.js.map +1 -0
- package/dist/catalogs-SLPYHA7D.js +130 -0
- package/dist/changes-WOD4EOSN.js +167 -0
- package/dist/chatgpt-3GX4I6NH.js +47 -0
- package/dist/chats-K2WUFVCG.js +584 -0
- package/dist/chats-K2WUFVCG.js.map +1 -0
- package/dist/check-ZSQ4EIFB.js +154 -0
- package/dist/check-ZSQ4EIFB.js.map +1 -0
- package/dist/chunk-34ARMQNL.js +197 -0
- package/dist/chunk-34MZGC2Y.js +207 -0
- package/dist/chunk-3JOGDGGP.js +24026 -0
- package/dist/chunk-3JOGDGGP.js.map +1 -0
- package/dist/chunk-46DHUWMV.js +642 -0
- package/dist/chunk-46DHUWMV.js.map +1 -0
- package/dist/chunk-4KBTW5NE.js +494 -0
- package/dist/chunk-4PAGS7QH.js +76 -0
- package/dist/chunk-53KV66ZZ.js +163 -0
- package/dist/chunk-55AX6DOP.js +86 -0
- package/dist/chunk-55AX6DOP.js.map +1 -0
- package/dist/chunk-5C4RRCKM.js +69 -0
- package/dist/chunk-5I6XOSNI.js +709 -0
- package/dist/chunk-5OE4Z7TP.js +287 -0
- package/dist/chunk-6OIKNJ7G.js +26 -0
- package/dist/chunk-6S4B67KP.js +962 -0
- package/dist/chunk-77LXZAX2.js +930 -0
- package/dist/chunk-7TVVYP7K.js +217 -0
- package/dist/chunk-7URHRPC7.js +3510 -0
- package/dist/chunk-7YMQEAGA.js +399 -0
- package/dist/chunk-A4O3JL6D.js +26 -0
- package/dist/chunk-ANRTDNPQ.js +115 -0
- package/dist/chunk-AQNTVM6S.js +1518 -0
- package/dist/chunk-BPDIY5CF.js +274 -0
- package/dist/chunk-CKHF7UXS.js +831 -0
- package/dist/chunk-CUTTTFAU.js +783 -0
- package/dist/chunk-D32EWSMB.js +150 -0
- package/dist/chunk-D55MN5IH.js +547 -0
- package/dist/chunk-DRQI2CJJ.js +138 -0
- package/dist/chunk-ESSA3AWR.js +133 -0
- package/dist/chunk-ESSA3AWR.js.map +1 -0
- package/dist/chunk-ETI6DGR2.js +312 -0
- package/dist/chunk-F3CZFUXZ.js +3187 -0
- package/dist/chunk-F3CZFUXZ.js.map +1 -0
- package/dist/chunk-FFTD7XDA.js +91 -0
- package/dist/chunk-FTKUHGTC.js +224 -0
- package/dist/chunk-GFYGVIT3.js +392 -0
- package/dist/chunk-GGXPO4NQ.js +225 -0
- package/dist/chunk-H56UJRLV.js +170 -0
- package/dist/chunk-HDMD6LXS.js +142 -0
- package/dist/chunk-HFZZKYUX.js +1320 -0
- package/dist/chunk-IAYJKH4R.js +5471 -0
- package/dist/chunk-IEPCI2EB.js +479 -0
- package/dist/chunk-IKADYUXK.js +344 -0
- package/dist/chunk-IMS53EQU.js +4277 -0
- package/dist/chunk-IMS53EQU.js.map +1 -0
- package/dist/chunk-IUX2LBW4.js +86 -0
- package/dist/chunk-IUX2LBW4.js.map +1 -0
- package/dist/chunk-J32CYEIH.js +74 -0
- package/dist/chunk-J5I3GYSJ.js +156 -0
- package/dist/chunk-JCVXKHVB.js +285 -0
- package/dist/chunk-JESSFI7R.js +468 -0
- package/dist/chunk-K4QPBXV7.js +61 -0
- package/dist/chunk-KJ3J2DYM.js +1919 -0
- package/dist/chunk-L43B2YGZ.js +2209 -0
- package/dist/chunk-L7UD57TV.js +219 -0
- package/dist/chunk-LJYXGUQ3.js +430 -0
- package/dist/chunk-LNYM4PQS.js +203 -0
- package/dist/chunk-LZR7LSYO.js +180 -0
- package/dist/chunk-LZR7LSYO.js.map +1 -0
- package/dist/chunk-MIXUMGJE.js +66 -0
- package/dist/chunk-MK4HCMEA.js +325 -0
- package/dist/chunk-MK4HCMEA.js.map +1 -0
- package/dist/chunk-MTFAG6E3.js +853 -0
- package/dist/chunk-MTFAG6E3.js.map +1 -0
- package/dist/chunk-MWJ6BCZJ.js +455 -0
- package/dist/chunk-MX5NQAK6.js +54 -0
- package/dist/chunk-MX5NQAK6.js.map +1 -0
- package/dist/chunk-O7WRA3JU.js +1902 -0
- package/dist/chunk-OADMSHME.js +334 -0
- package/dist/chunk-OLPABGH3.js +152 -0
- package/dist/chunk-ONGZKI5J.js +57 -0
- package/dist/chunk-OSZOUSK5.js +23 -0
- package/dist/chunk-PK7YNQ2T.js +454 -0
- package/dist/chunk-PN3CHL5W.js +98 -0
- package/dist/chunk-QMQSI4WA.js +89 -0
- package/dist/chunk-QUSDGZFS.js +188 -0
- package/dist/chunk-QXRSFH6M.js +604 -0
- package/dist/chunk-QZ4YHQLW.js +63 -0
- package/dist/chunk-RF3TP643.js +288 -0
- package/dist/chunk-RIRSFFWA.js +191 -0
- package/dist/chunk-ROHICQPK.js +8954 -0
- package/dist/chunk-RP3PC54R.js +169 -0
- package/dist/chunk-SIKCVWM3.js +76 -0
- package/dist/chunk-SOM4OTR5.js +167 -0
- package/dist/chunk-SYDPUGF5.js +126 -0
- package/dist/chunk-SYDPUGF5.js.map +1 -0
- package/dist/chunk-SZZ7BBED.js +148 -0
- package/dist/chunk-TAGJYHVI.js +191 -0
- package/dist/chunk-TB5JZTLN.js +19 -0
- package/dist/chunk-TQJLEVLA.js +131 -0
- package/dist/chunk-TW57RTKN.js +5368 -0
- package/dist/chunk-TXJOYQE2.js +1065 -0
- package/dist/chunk-TXJOYQE2.js.map +1 -0
- package/dist/chunk-UGIF56NZ.js +1254 -0
- package/dist/chunk-UGIF56NZ.js.map +1 -0
- package/dist/chunk-V3ANSXCB.js +51 -0
- package/dist/chunk-WSG4K2TR.js +103 -0
- package/dist/chunk-WXSRSMY3.js +64 -0
- package/dist/chunk-WZXMZFVB.js +238 -0
- package/dist/chunk-X3L5HYQM.js +91 -0
- package/dist/chunk-Y2TOB4N5.js +46 -0
- package/dist/chunk-YOHGEF2N.js +7899 -0
- package/dist/chunk-YOHGEF2N.js.map +1 -0
- package/dist/chunk-Z2LPYAN4.js +297 -0
- package/dist/chunk-ZICB4OI5.js +106 -0
- package/dist/chunk-ZOCAGPS5.js +225 -0
- package/dist/chunk-ZZWZUTEP.js +685 -0
- package/dist/claim-QHYA5UTF.js +200 -0
- package/dist/cli.js +36 -36
- package/dist/companies-BNMAOQUQ.js +198 -0
- package/dist/company-YANP3G62.js +308 -0
- package/dist/complete-ICZCBO6M.js +84 -0
- package/dist/config-GIETKZGS.js +88 -0
- package/dist/connect-ZXGEFS53.js +45 -0
- package/dist/conversation-YIWZIUIK.js +96 -0
- package/dist/conversion-report-E35RCZU7.js +127 -0
- package/dist/conversion-upload-command-QN33HEVV.js +440 -0
- package/dist/conversion-upload-command-QN33HEVV.js.map +1 -0
- package/dist/conversion-writes-MUD7WJDH.js +122 -0
- package/dist/conversions-B7HR6JMC.js +140 -0
- package/dist/conversions-WU7DNFF7.js +78 -0
- package/dist/copy-writes-R7VYSZXC.js +171 -0
- package/dist/copy-writes-R7VYSZXC.js.map +1 -0
- package/dist/create-EL47XN73.js +135 -0
- package/dist/create-GU5MUZ7U.js +62 -0
- package/dist/create-IKQ7A47F.js +239 -0
- package/dist/create-TKQDLX7M.js +218 -0
- package/dist/creatives-PW6HB4JB.js +58 -0
- package/dist/creatives-S4EGN44U.js +118 -0
- package/dist/creatives-VBD4T6C7.js +229 -0
- package/dist/credentials-57U2UQ7G.js +290 -0
- package/dist/critique-JTHSIXUF.js +233 -0
- package/dist/critique-JTHSIXUF.js.map +1 -0
- package/dist/critique-KAOJTSPQ.js +420 -0
- package/dist/critique-KAOJTSPQ.js.map +1 -0
- package/dist/crm-JCYLJQ7K.js +323 -0
- package/dist/crm-LQTYPDMZ.js +229 -0
- package/dist/currency-5NYTOLEL.js +88 -0
- package/dist/custom-conversions-NT7ONTEX.js +128 -0
- package/dist/customers-LP6I7POL.js +65 -0
- package/dist/delete-PZ6GP7J6.js +57 -0
- package/dist/delete-WW4JYQMX.js +69 -0
- package/dist/delete-XZNY426Q.js +67 -0
- package/dist/demographics-HZY2JEYQ.js +141 -0
- package/dist/discard-NRTGRVXR.js +69 -0
- package/dist/discover-5ZFAAPNG.js +172 -0
- package/dist/domain-YGKFTN6D.js +101 -0
- package/dist/download-XERSDEN3.js +172 -0
- package/dist/draft-2EVXU5XB.js +134 -0
- package/dist/draft-CQWYTMSS.js +138 -0
- package/dist/draft-EL74RDAG.js +374 -0
- package/dist/draft-EWB4A3FG.js +579 -0
- package/dist/draft-EWB4A3FG.js.map +1 -0
- package/dist/draft-GFZ3KMRX.js +315 -0
- package/dist/draft-JYZA3BFD.js +260 -0
- package/dist/draft-RBLMOZIL.js +333 -0
- package/dist/draft-RBLMOZIL.js.map +1 -0
- package/dist/draft-UNPTTHP4.js +220 -0
- package/dist/engine/index.js +8 -8
- package/dist/experiment-YAX26BOO.js +1397 -0
- package/dist/experiments-ERXZYY5E.js +237 -0
- package/dist/experiments-ERXZYY5E.js.map +1 -0
- package/dist/extract-QMY6WPTV.js +143 -0
- package/dist/facets-QHM2IQ3E.js +117 -0
- package/dist/feedback-NLPTKWOH.js +114 -0
- package/dist/feedback-X5FNVHKU.js +116 -0
- package/dist/feedback-X5FNVHKU.js.map +1 -0
- package/dist/feedback-record-7QCQTF26.js +270 -0
- package/dist/feedback-record-7QCQTF26.js.map +1 -0
- package/dist/fetch-72ZILZHO.js +204 -0
- package/dist/fit-AURKFPAY.js +65 -0
- package/dist/flows-CZPXHOZW.js +340 -0
- package/dist/fonts-NA26RQ4C.js +40 -0
- package/dist/forecast-ARIHRQAX.js +121 -0
- package/dist/forecast-BU22ZMOW.js +170 -0
- package/dist/forecast-BU22ZMOW.js.map +1 -0
- package/dist/funding-QDKFNQI2.js +85 -0
- package/dist/funnel-4VQB3T3M.js +397 -0
- package/dist/ga4-N6EBLN2W.js +55 -0
- package/dist/generate-IJLMJC4S.js +263 -0
- package/dist/get-LOEUOTG3.js +82 -0
- package/dist/get-W3VJIQBN.js +62 -0
- package/dist/google-5RKO3DND.js +3301 -0
- package/dist/google-5RKO3DND.js.map +1 -0
- package/dist/google-7VEPEBFV.js +163 -0
- package/dist/google-ads-YBOJ3XXK.js +198 -0
- package/dist/gsc-FILOUFCG.js +30 -0
- package/dist/history-6LLGAK7B.js +69 -0
- package/dist/history-H2SHADAM.js +153 -0
- package/dist/history-LJG64M6P.js +102 -0
- package/dist/hubspot-6JDARLIU.js +814 -0
- package/dist/ideas-MTWJDRRK.js +45 -0
- package/dist/images-RIFC6D3H.js +92 -0
- package/dist/ingest-K45T4OLM.js +131 -0
- package/dist/ingest-MSS52UO5.js +28 -0
- package/dist/insights-AVNMRFQ4.js +658 -0
- package/dist/insights-TBIT6DTF.js +132 -0
- package/dist/inspect-EBGYJOZ3.js +192 -0
- package/dist/instant-experiences-EEMQJ7H5.js +265 -0
- package/dist/instant-experiences-EEMQJ7H5.js.map +1 -0
- package/dist/intent-URHTU4AK.js +95 -0
- package/dist/job-OJB6KIDV.js +202 -0
- package/dist/job-create-C6FGCDW4.js +109 -0
- package/dist/job-status-4RJHESID.js +74 -0
- package/dist/keyword-gap-WXM6SN6A.js +130 -0
- package/dist/keyword-metrics-57MUTYMH.js +200 -0
- package/dist/keywords-for-site-ABZS7O5B.js +131 -0
- package/dist/landing-AXCYLUQZ.js +28 -0
- package/dist/languages-6XTVTFZC.js +40 -0
- package/dist/leads-C5BUBBLZ.js +115 -0
- package/dist/leads-IXF647ZC.js +542 -0
- package/dist/leads-IXF647ZC.js.map +1 -0
- package/dist/learn-M64GVGPX.js +207 -0
- package/dist/line-item-writes-HYLWBQTM.js +211 -0
- package/dist/line-items-Y4THDHSE.js +107 -0
- package/dist/link-BU7YCL2M.js +67 -0
- package/dist/linkedin-2SUTGGII.js +1345 -0
- package/dist/linkedin-2SUTGGII.js.map +1 -0
- package/dist/linkedin-person-FEIY7FYQ.js +139 -0
- package/dist/list-BKIL7O4G.js +306 -0
- package/dist/list-H3C345WG.js +154 -0
- package/dist/list-UGTDZ7YI.js +67 -0
- package/dist/locations-F4365X4S.js +40 -0
- package/dist/locations-HOI7AUZ2.js +69 -0
- package/dist/log-54SJV6MW.js +95 -0
- package/dist/lookup-QNLX2535.js +23 -0
- package/dist/make-AQ43J5LH.js +1368 -0
- package/dist/make-AQ43J5LH.js.map +1 -0
- package/dist/map-BPPGQGDV.js +445 -0
- package/dist/mcp-EXOMBMYL.js +729 -0
- package/dist/media-MITWBYVZ.js +18 -0
- package/dist/media-WGIEUEZW.js +89 -0
- package/dist/media-sources-XEC72K7X.js +35 -0
- package/dist/members-VDON57BE.js +47 -0
- package/dist/meta-NUBBKE2V.js +124 -0
- package/dist/metrics-V6FAZO5A.js +152 -0
- package/dist/models-TSMFIOZU.js +155 -0
- package/dist/normalize-632DD2HJ.js +144 -0
- package/dist/options-TZYZQZ3M.js +125 -0
- package/dist/organization-FYRXSGB4.js +949 -0
- package/dist/output-HZW7LNUL.js +24 -0
- package/dist/page-photos-4DNBQZUL.js +119 -0
- package/dist/page-photos-4DNBQZUL.js.map +1 -0
- package/dist/pages-UH6XEZBO.js +67 -0
- package/dist/performance-JKXHQIAV.js +27 -0
- package/dist/performance-OF3N43OP.js +5565 -0
- package/dist/pixels-KXA6R3G3.js +62 -0
- package/dist/pixels-PYNK73UG.js +109 -0
- package/dist/plan-4OYUV2EF.js +208 -0
- package/dist/preview-7E4E3QPT.js +245 -0
- package/dist/preview-FPBM75L2.js +101 -0
- package/dist/promoted-tweet-writes-IJRBFK7W.js +183 -0
- package/dist/promoted-tweets-7PYH3RPV.js +119 -0
- package/dist/properties-RDOGNY2O.js +101 -0
- package/dist/publish-MNSDFPEQ.js +350 -0
- package/dist/query-GMGWJW3X.js +62 -0
- package/dist/query-K7R5GQ4E.js +236 -0
- package/dist/query-PO3RT7BR.js +231 -0
- package/dist/questionnaire-4OH6K2BF.js +94 -0
- package/dist/read-MU5XGWMK.js +141 -0
- package/dist/reddit-JFFMZLJS.js +29 -0
- package/dist/refresh-EJ7WKW3H.js +97 -0
- package/dist/release-AFRLCZWB.js +63 -0
- package/dist/relevant-pages-4YGN3I2U.js +99 -0
- package/dist/remove-QD4PITBL.js +53 -0
- package/dist/reopen-JSC6AVJC.js +66 -0
- package/dist/rerun-QIAUVJX6.js +98 -0
- package/dist/rerun-QIAUVJX6.js.map +1 -0
- package/dist/research-MMFUFZGS.js +265 -0
- package/dist/research-SRISCVBM.js +75 -0
- package/dist/reset-752CNET3.js +57 -0
- package/dist/reset-R3TQAHRU.js +57 -0
- package/dist/resolve-EWHSJNBX.js +124 -0
- package/dist/retry-DVHDVHVP.js +65 -0
- package/dist/retry-PVULTONO.js +63 -0
- package/dist/revenue-B4N6QJM3.js +92 -0
- package/dist/revenue-B4N6QJM3.js.map +1 -0
- package/dist/rule-writes-YXK7HNLR.js +531 -0
- package/dist/rule-writes-YXK7HNLR.js.map +1 -0
- package/dist/rules-4YTY57FM.js +217 -0
- package/dist/rules-LRFDZFF6.js +108 -0
- package/dist/rules-LRFDZFF6.js.map +1 -0
- package/dist/rules-add-XVOGYHQO.js +497 -0
- package/dist/rules-add-XVOGYHQO.js.map +1 -0
- package/dist/run-PCZRYL42.js +69 -0
- package/dist/run-PRSAUWAJ.js +73 -0
- package/dist/scaffold-ad-A6SROV4X.js +1514 -0
- package/dist/scaffold-ad-A6SROV4X.js.map +1 -0
- package/dist/scaffold-static-ad-CRN5XZIZ.js +1013 -0
- package/dist/scaffold-static-ad-CRN5XZIZ.js.map +1 -0
- package/dist/scaffold-video-3F5JVFFR.js +886 -0
- package/dist/scaffold-video-3F5JVFFR.js.map +1 -0
- package/dist/schedule-6YTZBCZA.js +64 -0
- package/dist/scheduled-agents-XCPU57LU.js +55 -0
- package/dist/schema-4PS5BDG3.js +135 -0
- package/dist/search-IMZD5RGD.js +177 -0
- package/dist/select-GSO4BEIL.js +111 -0
- package/dist/select-GSO4BEIL.js.map +1 -0
- package/dist/sends-I2B6F5NW.js +349 -0
- package/dist/set-prompt-D32XJNWM.js +200 -0
- package/dist/set-prompt-D32XJNWM.js.map +1 -0
- package/dist/setup-links-PTL6RF2J.js +144 -0
- package/dist/shared-Z7INVKCZ.js +32 -0
- package/dist/shopify-SDZZ5HTA.js +4009 -0
- package/dist/site-NGQ7K6UD.js +180 -0
- package/dist/sitemaps-EOMSRKOD.js +77 -0
- package/dist/sites-6M73AONG.js +97 -0
- package/dist/sources-NKFSCI6M.js +30 -0
- package/dist/sources-O4CQ5KSX.js +457 -0
- package/dist/stale-CEZJ53RO.js +91 -0
- package/dist/stale-CEZJ53RO.js.map +1 -0
- package/dist/stats-MFEH2TSW.js +34 -0
- package/dist/status-DLYRPGFS.js +65 -0
- package/dist/stock-RDCDVBHX.js +212 -0
- package/dist/studies-SSA3SR2L.js +250 -0
- package/dist/studio-MBHPDGMN.js +49 -0
- package/dist/study-writes-EDV6OH7I.js +472 -0
- package/dist/study-writes-EDV6OH7I.js.map +1 -0
- package/dist/sync-BEW3TZP7.js +57 -0
- package/dist/sync-SI25TKY5.js +279 -0
- package/dist/sync-definition-RECCA3QH.js +71 -0
- package/dist/tag-manager-JFC6YYVP.js +43 -0
- package/dist/tags-IJIGZYR3.js +23 -0
- package/dist/tags-K4HIKHNU.js +26 -0
- package/dist/tags-OTA55BQ6.js +23 -0
- package/dist/tags-QF2V4B3M.js +23 -0
- package/dist/tags-SK7WXMBS.js +227 -0
- package/dist/targeting-NPNBPEHW.js +763 -0
- package/dist/targeting-NPNBPEHW.js.map +1 -0
- package/dist/targeting-constants-RF2732EW.js +118 -0
- package/dist/targeting-criteria-7BUUYDYC.js +113 -0
- package/dist/targets-7V3NCQSD.js +106 -0
- package/dist/terms-XFL6QO7A.js +102 -0
- package/dist/testimonials-XYD5DLBJ.js +32 -0
- package/dist/themes-HYDGH4GM.js +96 -0
- package/dist/themes-HYDGH4GM.js.map +1 -0
- package/dist/top-companies-LI26TONY.js +111 -0
- package/dist/transcript-FTHDWMGU.js +165 -0
- package/dist/translate-YATYKOEX.js +604 -0
- package/dist/translate-YATYKOEX.js.map +1 -0
- package/dist/triggers-3LHJVK5P.js +144 -0
- package/dist/tweets-6PQHJXJC.js +123 -0
- package/dist/unlink-BMOUBGWO.js +70 -0
- package/dist/unstage-O23ILHCY.js +96 -0
- package/dist/unstage-YEW5KXJL.js +88 -0
- package/dist/update-2IWZA5UU.js +101 -0
- package/dist/update-G7YZICSU.js +155 -0
- package/dist/update-T5INCQJZ.js +192 -0
- package/dist/update-UTQVTG45.js +66 -0
- package/dist/upload-UXYJDA2U.js +137 -0
- package/dist/url-options-Y7I5EL55.js +131 -0
- package/dist/url-params-PE4XAQNH.js +101 -0
- package/dist/validate-MMHBTNWU.js +126 -0
- package/dist/validate-MMHBTNWU.js.map +1 -0
- package/dist/videos-AHOLXU42.js +146 -0
- package/dist/videos-EVPJHY3B.js +41 -0
- package/dist/viewer-check-NA4TMNY4.js +83 -0
- package/dist/web-7EODEH25.js +173 -0
- package/dist/winning-ads-5UKX6QV7.js +86 -0
- package/dist/write-commands-HFP5KLYZ.js +1525 -0
- package/dist/write-commands-HFP5KLYZ.js.map +1 -0
- package/dist/write-commands-KVOMOYME.js +1170 -0
- package/dist/write-commands-KVOMOYME.js.map +1 -0
- package/dist/write-commands-LHEJESKL.js +206 -0
- package/dist/write-commands-SD6DXVNK.js +721 -0
- package/dist/x-R72UTFQT.js +47 -0
- package/package.json +1 -1
- package/dist/account-OCFXNHG7.js +0 -139
- package/dist/account-U6DFMD2V.js +0 -82
- package/dist/account-UE6DOQXK.js +0 -82
- package/dist/account-assets-W7K2PUYB.js +0 -290
- package/dist/account-level-Z2JEIJ3X.js +0 -611
- package/dist/account-level-Z2JEIJ3X.js.map +0 -1
- package/dist/account-reads-WPKD2LPB.js +0 -219
- package/dist/account-reads-WPKD2LPB.js.map +0 -1
- package/dist/account-users-USGCCE6I.js +0 -64
- package/dist/account-users-USGCCE6I.js.map +0 -1
- package/dist/account-writes-QSJ74QFR.js +0 -68
- package/dist/accounts-3DS67RX7.js +0 -119
- package/dist/accounts-55PDBEDN.js +0 -76
- package/dist/accounts-AK4QIG24.js +0 -115
- package/dist/accounts-FZCQNX3B.js +0 -713
- package/dist/accounts-PVMTLDJU.js +0 -80
- package/dist/actions-EG23YFYB.js +0 -55
- package/dist/active-entities-HR7NJJLU.js +0 -103
- package/dist/activecampaign-GPT5R647.js +0 -938
- package/dist/activities-DEWHKBID.js +0 -75
- package/dist/ad-group-writes-QBHOPTT5.js +0 -172
- package/dist/ad-groups-JZDUFT6J.js +0 -70
- package/dist/ad-writes-QYJO4IB3.js +0 -176
- package/dist/add-IH6GAMK4.js +0 -107
- package/dist/add-UWTWG4VO.js +0 -305
- package/dist/ads-F3VUMSEV.js +0 -48
- package/dist/ads-QKVNPHBH.js +0 -120
- package/dist/ads-UMSWEI5X.js +0 -79
- package/dist/adsets-FEVYHKAQ.js +0 -182
- package/dist/advertisers-AJNDC3AX.js +0 -123
- package/dist/analytics-PEGA46W5.js +0 -447
- package/dist/analytics-XCQ3G5PM.js +0 -2437
- package/dist/animate-WS63CZ3Y.js +0 -480
- package/dist/asset-writes-7RFZZYU7.js +0 -50
- package/dist/assign-2CZ5C43W.js +0 -80
- package/dist/audience-size-FUHDVYLN.js +0 -76
- package/dist/audience-writes-RUGU6KEC.js +0 -327
- package/dist/audience-writes-RUGU6KEC.js.map +0 -1
- package/dist/audiences-6GVUZUCN.js +0 -106
- package/dist/audiences-7OS2ZJYO.js +0 -85
- package/dist/audiences-RSAUXKHR.js +0 -280
- package/dist/audit-4L7IKIRY.js +0 -88
- package/dist/audit-DECB5PP5.js +0 -154
- package/dist/autocomplete-6XSIFXDA.js +0 -114
- package/dist/avatars-LTV2TSO2.js +0 -38
- package/dist/bid-pricing-GC6YU3LW.js +0 -103
- package/dist/brand-B4QKPCEC.js +0 -22
- package/dist/brief-RYNGM4GX.js +0 -543
- package/dist/businesses-42NZP6FP.js +0 -54
- package/dist/campaign-groups-FHV5A3EC.js +0 -99
- package/dist/campaign-writes-4B7DCAP2.js +0 -168
- package/dist/campaign-writes-GKNH2EHV.js +0 -176
- package/dist/campaigns-7RV65SXR.js +0 -78
- package/dist/campaigns-TL37AY5Y.js +0 -113
- package/dist/campaigns-TO74Z7UH.js +0 -130
- package/dist/campaigns-VNBJV5QD.js +0 -111
- package/dist/canvas-6XSA3VZE.js +0 -46
- package/dist/capabilities-6MOMJZFW.js +0 -147
- package/dist/cards-CAOGPPG4.js +0 -85
- package/dist/catalog-URTZYAPU.js +0 -66
- package/dist/catalogs-5LWEXG5X.js +0 -130
- package/dist/catalogs-7IEXGLSR.js +0 -782
- package/dist/catalogs-7IEXGLSR.js.map +0 -1
- package/dist/changes-WWZYTLC6.js +0 -167
- package/dist/chatgpt-ZI4GWP6S.js +0 -47
- package/dist/chats-GRS6RCDL.js +0 -449
- package/dist/chats-GRS6RCDL.js.map +0 -1
- package/dist/check-VIRAMFKC.js +0 -107
- package/dist/check-VIRAMFKC.js.map +0 -1
- package/dist/chunk-22RM3UOO.js +0 -63
- package/dist/chunk-2DAWUWA4.js +0 -115
- package/dist/chunk-2GFJN2TR.js +0 -163
- package/dist/chunk-2LBQNTTH.js +0 -76
- package/dist/chunk-3D5ABNNW.js +0 -156
- package/dist/chunk-3E74OM2E.js +0 -288
- package/dist/chunk-3GKAVXR3.js +0 -23
- package/dist/chunk-4NZ47VXO.js +0 -137
- package/dist/chunk-4NZ47VXO.js.map +0 -1
- package/dist/chunk-5H6N36LS.js +0 -217
- package/dist/chunk-5T6DUP7V.js +0 -207
- package/dist/chunk-6IR7IQPV.js +0 -69
- package/dist/chunk-6IRB3MHG.js +0 -430
- package/dist/chunk-6MX37ZQZ.js +0 -454
- package/dist/chunk-6QINKM6T.js +0 -46
- package/dist/chunk-7M6GZI5B.js +0 -479
- package/dist/chunk-AE5S5B2S.js +0 -249
- package/dist/chunk-AE5S5B2S.js.map +0 -1
- package/dist/chunk-ARPT74DG.js +0 -312
- package/dist/chunk-B42CHCXX.js +0 -962
- package/dist/chunk-B47TRSMB.js +0 -8954
- package/dist/chunk-BHEOF2MF.js +0 -2209
- package/dist/chunk-BMMXYR7A.js +0 -238
- package/dist/chunk-BRPSY35A.js +0 -468
- package/dist/chunk-C3EX5OKN.js +0 -188
- package/dist/chunk-CDPM6OE6.js +0 -61
- package/dist/chunk-CDTAKCJR.js +0 -178
- package/dist/chunk-CDTAKCJR.js.map +0 -1
- package/dist/chunk-D6YLVDVN.js +0 -103
- package/dist/chunk-DLM5OSHM.js +0 -843
- package/dist/chunk-DLM5OSHM.js.map +0 -1
- package/dist/chunk-DWPOAU4Z.js +0 -5471
- package/dist/chunk-EJBLF2LI.js +0 -167
- package/dist/chunk-FHWYQSMY.js +0 -930
- package/dist/chunk-FWHEAR7F.js +0 -138
- package/dist/chunk-GNTI4KST.js +0 -494
- package/dist/chunk-GR2BPVLX.js +0 -142
- package/dist/chunk-GWLP45WQ.js +0 -1518
- package/dist/chunk-GXAI3EII.js +0 -399
- package/dist/chunk-H3HA22Z3.js +0 -1919
- package/dist/chunk-H3PD2KOF.js +0 -203
- package/dist/chunk-HBRXFQQV.js +0 -3510
- package/dist/chunk-IGCS3X4F.js +0 -150
- package/dist/chunk-ILGRC7LJ.js +0 -287
- package/dist/chunk-IXVVTPG6.js +0 -831
- package/dist/chunk-JAC6JVCI.js +0 -26
- package/dist/chunk-JBABLH5C.js +0 -547
- package/dist/chunk-JHS5PE5Y.js +0 -1246
- package/dist/chunk-JHS5PE5Y.js.map +0 -1
- package/dist/chunk-JTIWQLY5.js +0 -98
- package/dist/chunk-KDAINT54.js +0 -131
- package/dist/chunk-KICGV4JB.js +0 -170
- package/dist/chunk-LDYI7BIQ.js +0 -334
- package/dist/chunk-LXOTNL65.js +0 -7888
- package/dist/chunk-LXOTNL65.js.map +0 -1
- package/dist/chunk-M45SOKI5.js +0 -91
- package/dist/chunk-MCJ5I5LR.js +0 -3187
- package/dist/chunk-MCJ5I5LR.js.map +0 -1
- package/dist/chunk-ME3K6XIS.js +0 -685
- package/dist/chunk-MKG57P2E.js +0 -783
- package/dist/chunk-MU2TTM6Z.js +0 -197
- package/dist/chunk-MZPS46OR.js +0 -76
- package/dist/chunk-N2MGR7HT.js +0 -1902
- package/dist/chunk-N2TXADL7.js +0 -1320
- package/dist/chunk-NTFNLVZG.js +0 -26
- package/dist/chunk-O43QFUOG.js +0 -51
- package/dist/chunk-OASXBRXQ.js +0 -24026
- package/dist/chunk-OASXBRXQ.js.map +0 -1
- package/dist/chunk-ORQ3WBM6.js +0 -225
- package/dist/chunk-OSQTSS27.js +0 -74
- package/dist/chunk-OTRKBCUB.js +0 -219
- package/dist/chunk-P6KTCPJG.js +0 -604
- package/dist/chunk-Q5DFEVLE.js +0 -148
- package/dist/chunk-QVQKCVP7.js +0 -85
- package/dist/chunk-QVQKCVP7.js.map +0 -1
- package/dist/chunk-R4RWQ6YX.js +0 -152
- package/dist/chunk-RBB3UUYP.js +0 -297
- package/dist/chunk-RBCO3C3Q.js +0 -324
- package/dist/chunk-RBCO3C3Q.js.map +0 -1
- package/dist/chunk-RJIFEHEG.js +0 -392
- package/dist/chunk-RYYRGQMM.js +0 -191
- package/dist/chunk-S3ZW3KTX.js +0 -89
- package/dist/chunk-SZET6NTF.js +0 -57
- package/dist/chunk-T4YD5W33.js +0 -66
- package/dist/chunk-TPGFX47R.js +0 -709
- package/dist/chunk-U5LSGCT3.js +0 -455
- package/dist/chunk-UKZKLXTE.js +0 -638
- package/dist/chunk-UKZKLXTE.js.map +0 -1
- package/dist/chunk-ULIQNJ5J.js +0 -274
- package/dist/chunk-URKOGN5B.js +0 -19
- package/dist/chunk-UYZ4FUC7.js +0 -225
- package/dist/chunk-V6TZRCAS.js +0 -169
- package/dist/chunk-WBWEKZQ2.js +0 -191
- package/dist/chunk-X3GWGFZP.js +0 -5368
- package/dist/chunk-X3YYZLBH.js +0 -285
- package/dist/chunk-XHWHBGKX.js +0 -4277
- package/dist/chunk-XHWHBGKX.js.map +0 -1
- package/dist/chunk-XRR5NN2V.js +0 -91
- package/dist/chunk-XZAVBONI.js +0 -64
- package/dist/chunk-YD6OZSSY.js +0 -106
- package/dist/chunk-YXZV6YKH.js +0 -224
- package/dist/chunk-ZREKNWIE.js +0 -344
- package/dist/claim-YCK2XQUL.js +0 -200
- package/dist/companies-SWGL3MQT.js +0 -198
- package/dist/company-XKEQKWPO.js +0 -308
- package/dist/complete-CHEZWF5R.js +0 -84
- package/dist/config-NDL2YP37.js +0 -88
- package/dist/connect-GWLVOOU7.js +0 -45
- package/dist/conversation-QD4UJZ7S.js +0 -96
- package/dist/conversion-report-76S5JOVT.js +0 -127
- package/dist/conversion-upload-command-5OILW65U.js +0 -439
- package/dist/conversion-upload-command-5OILW65U.js.map +0 -1
- package/dist/conversion-writes-6HX665JT.js +0 -122
- package/dist/conversions-BECU3XD2.js +0 -140
- package/dist/conversions-QZJRF4WN.js +0 -78
- package/dist/copy-writes-X2LM5I4Z.js +0 -170
- package/dist/copy-writes-X2LM5I4Z.js.map +0 -1
- package/dist/create-4OA5DOSO.js +0 -239
- package/dist/create-5QPEESSZ.js +0 -135
- package/dist/create-ET3VCGQT.js +0 -62
- package/dist/create-IJSH2LHP.js +0 -218
- package/dist/creatives-AIRQ3FGH.js +0 -229
- package/dist/creatives-L3XSN34M.js +0 -58
- package/dist/creatives-SFPNXJ6Z.js +0 -118
- package/dist/credentials-Q2FM4DP3.js +0 -290
- package/dist/critique-A5FVPC5K.js +0 -1451
- package/dist/critique-A5FVPC5K.js.map +0 -1
- package/dist/critique-RSU7N2NV.js +0 -232
- package/dist/critique-RSU7N2NV.js.map +0 -1
- package/dist/crm-7GTTSEHH.js +0 -229
- package/dist/crm-PQREUPOU.js +0 -323
- package/dist/currency-BZUNQ4XJ.js +0 -88
- package/dist/custom-conversions-UHRBVUD2.js +0 -128
- package/dist/customers-BYNADWKU.js +0 -65
- package/dist/delete-2RAKL577.js +0 -69
- package/dist/delete-EZ525EJV.js +0 -57
- package/dist/delete-ZBYPC5AL.js +0 -67
- package/dist/demographics-5XMZ2TBB.js +0 -141
- package/dist/discard-Q7R5VJ7I.js +0 -69
- package/dist/discover-PDSEJR2P.js +0 -172
- package/dist/domain-MS3BKUYW.js +0 -101
- package/dist/download-F56SAC2G.js +0 -172
- package/dist/draft-44KTLX4P.js +0 -134
- package/dist/draft-4EM4TL25.js +0 -332
- package/dist/draft-4EM4TL25.js.map +0 -1
- package/dist/draft-CKFSZDVI.js +0 -260
- package/dist/draft-JBLWUO3J.js +0 -220
- package/dist/draft-L6XXU2I6.js +0 -374
- package/dist/draft-RSKZSUOS.js +0 -138
- package/dist/draft-WOE7KQ7T.js +0 -315
- package/dist/draft-XOPS4EZW.js +0 -569
- package/dist/draft-XOPS4EZW.js.map +0 -1
- package/dist/experiment-AZUKJ7ZO.js +0 -1397
- package/dist/experiments-34NEL75V.js +0 -236
- package/dist/experiments-34NEL75V.js.map +0 -1
- package/dist/extract-2PG5JB2C.js +0 -143
- package/dist/facets-5CGKHFDQ.js +0 -117
- package/dist/feedback-C7THFXTE.js +0 -114
- package/dist/feedback-SWNIEXMA.js +0 -115
- package/dist/feedback-SWNIEXMA.js.map +0 -1
- package/dist/feedback-record-BNDFZRYJ.js +0 -269
- package/dist/feedback-record-BNDFZRYJ.js.map +0 -1
- package/dist/fetch-LMEYFSM5.js +0 -204
- package/dist/fit-DBA7FD3M.js +0 -65
- package/dist/flows-TQASOYQP.js +0 -340
- package/dist/fonts-MPDK2DXR.js +0 -39
- package/dist/forecast-3KMAJJWJ.js +0 -169
- package/dist/forecast-3KMAJJWJ.js.map +0 -1
- package/dist/forecast-OP2ECNM2.js +0 -121
- package/dist/funding-BSAHWU35.js +0 -85
- package/dist/funnel-BLRQAZ65.js +0 -397
- package/dist/ga4-YVKA3V4V.js +0 -55
- package/dist/generate-VGGXTZBP.js +0 -263
- package/dist/get-DEELBPMG.js +0 -82
- package/dist/get-YATZI6GN.js +0 -62
- package/dist/google-REFD3W2R.js +0 -3300
- package/dist/google-REFD3W2R.js.map +0 -1
- package/dist/google-ULLPGAXN.js +0 -163
- package/dist/google-ads-IEQJEICD.js +0 -198
- package/dist/gsc-OJDMSP6H.js +0 -30
- package/dist/history-2LE4ELLB.js +0 -102
- package/dist/history-FPXZOUHT.js +0 -153
- package/dist/history-LXRFZNW7.js +0 -69
- package/dist/hubspot-MNREQEVI.js +0 -814
- package/dist/ideas-4N7WMX3P.js +0 -45
- package/dist/images-KVMFKQX5.js +0 -92
- package/dist/ingest-GUJNPD6S.js +0 -28
- package/dist/ingest-VG4YGXB2.js +0 -131
- package/dist/insights-H6M6VI43.js +0 -132
- package/dist/insights-LZJZGNJZ.js +0 -658
- package/dist/inspect-VODWKUQY.js +0 -192
- package/dist/instant-experiences-J4GSS3Y6.js +0 -264
- package/dist/instant-experiences-J4GSS3Y6.js.map +0 -1
- package/dist/intent-HXRSLFIO.js +0 -95
- package/dist/job-UFGGBDG7.js +0 -202
- package/dist/job-create-XM4NH322.js +0 -109
- package/dist/job-status-47L5Z57J.js +0 -74
- package/dist/keyword-gap-WUHMSTNR.js +0 -130
- package/dist/keyword-metrics-LOLNR24U.js +0 -200
- package/dist/keywords-for-site-PLTJBXVN.js +0 -131
- package/dist/landing-JMH3WIK2.js +0 -28
- package/dist/languages-SVTYYYOC.js +0 -40
- package/dist/leads-SEEJ3KRR.js +0 -541
- package/dist/leads-SEEJ3KRR.js.map +0 -1
- package/dist/leads-XPIBMZI7.js +0 -115
- package/dist/learn-MOHK6DHI.js +0 -207
- package/dist/line-item-writes-5RVCYHHH.js +0 -211
- package/dist/line-items-OESD2IJ6.js +0 -107
- package/dist/link-PURCDO7A.js +0 -67
- package/dist/linkedin-YWLXEPLB.js +0 -1344
- package/dist/linkedin-YWLXEPLB.js.map +0 -1
- package/dist/linkedin-person-L22XA5LG.js +0 -139
- package/dist/list-KE6PQV2U.js +0 -154
- package/dist/list-L5VZ35AO.js +0 -306
- package/dist/list-T5ZVVC4L.js +0 -67
- package/dist/locations-5SLLGWZO.js +0 -69
- package/dist/locations-7EBZ6KRH.js +0 -40
- package/dist/log-D3WU36FX.js +0 -95
- package/dist/lookup-OU6CLATK.js +0 -23
- package/dist/make-QPE6H3NT.js +0 -1367
- package/dist/make-QPE6H3NT.js.map +0 -1
- package/dist/map-PT7JJYQR.js +0 -445
- package/dist/mcp-62MSONPH.js +0 -729
- package/dist/media-DGV2AMZI.js +0 -89
- package/dist/media-YKCCMLXL.js +0 -18
- package/dist/media-sources-DGVR3YPL.js +0 -35
- package/dist/members-DAHPS3MB.js +0 -47
- package/dist/meta-5TRG7RTQ.js +0 -124
- package/dist/metrics-WRERNMRK.js +0 -152
- package/dist/models-SITHUNAA.js +0 -155
- package/dist/normalize-ZOJ4YROH.js +0 -144
- package/dist/options-DTB2NYBL.js +0 -125
- package/dist/organization-5JHFNUOD.js +0 -949
- package/dist/output-7X5WPPCA.js +0 -24
- package/dist/page-photos-VYJU4RNQ.js +0 -118
- package/dist/page-photos-VYJU4RNQ.js.map +0 -1
- package/dist/pages-6YMPZDEY.js +0 -67
- package/dist/performance-VFDK5PHT.js +0 -5565
- package/dist/performance-W6CJEUHR.js +0 -27
- package/dist/pixels-DZDVNIVL.js +0 -109
- package/dist/pixels-WTTLC4O5.js +0 -62
- package/dist/plan-JAWESWJN.js +0 -208
- package/dist/preview-JZXGR4KN.js +0 -245
- package/dist/preview-PUF62HJU.js +0 -101
- package/dist/promoted-tweet-writes-FW4BAA5O.js +0 -183
- package/dist/promoted-tweets-LYHKCVNV.js +0 -119
- package/dist/properties-Z5S3LRJ5.js +0 -101
- package/dist/publish-S2KD5PCN.js +0 -350
- package/dist/query-3QFT42PG.js +0 -62
- package/dist/query-KKXCMH3Q.js +0 -236
- package/dist/query-QXKGVHZL.js +0 -231
- package/dist/questionnaire-U7UYICEA.js +0 -94
- package/dist/read-ENUS7P3L.js +0 -141
- package/dist/reddit-AF2PPR3K.js +0 -29
- package/dist/refresh-UC7OTPXS.js +0 -97
- package/dist/release-FQOJ2FJ5.js +0 -63
- package/dist/relevant-pages-OFKZYWR3.js +0 -99
- package/dist/remove-H3SU4GJK.js +0 -53
- package/dist/reopen-M2PZEHKF.js +0 -66
- package/dist/rerun-M63ZAYAV.js +0 -97
- package/dist/rerun-M63ZAYAV.js.map +0 -1
- package/dist/research-2N5HAFSB.js +0 -75
- package/dist/research-ILZZTO6Q.js +0 -265
- package/dist/reset-JN437DOZ.js +0 -57
- package/dist/reset-XAKAEDPH.js +0 -57
- package/dist/resolve-WVE6D7CP.js +0 -124
- package/dist/retry-ILL2ZATG.js +0 -63
- package/dist/retry-PMJ22IN4.js +0 -65
- package/dist/revenue-UWU3ACGP.js +0 -91
- package/dist/revenue-UWU3ACGP.js.map +0 -1
- package/dist/rule-writes-WT6DQZZE.js +0 -530
- package/dist/rule-writes-WT6DQZZE.js.map +0 -1
- package/dist/rules-BOOFGKJA.js +0 -99
- package/dist/rules-BOOFGKJA.js.map +0 -1
- package/dist/rules-Y75KR2PC.js +0 -217
- package/dist/rules-add-7K5ESEZQ.js +0 -465
- package/dist/rules-add-7K5ESEZQ.js.map +0 -1
- package/dist/run-2AIXS3KE.js +0 -72
- package/dist/run-OCCY7JHY.js +0 -69
- package/dist/scaffold-ad-JQIOCLDU.js +0 -1513
- package/dist/scaffold-ad-JQIOCLDU.js.map +0 -1
- package/dist/scaffold-static-ad-BW56MVIV.js +0 -1012
- package/dist/scaffold-static-ad-BW56MVIV.js.map +0 -1
- package/dist/scaffold-video-OGPMQO5D.js +0 -885
- package/dist/scaffold-video-OGPMQO5D.js.map +0 -1
- package/dist/schedule-WV6NZ4CK.js +0 -64
- package/dist/scheduled-agents-MZZMHN3T.js +0 -55
- package/dist/schema-ADRFE3AV.js +0 -135
- package/dist/search-GGWTLVG7.js +0 -177
- package/dist/select-HYZ5JYO7.js +0 -110
- package/dist/select-HYZ5JYO7.js.map +0 -1
- package/dist/sends-4ZO6BNZ4.js +0 -349
- package/dist/set-prompt-FMJ32YNG.js +0 -199
- package/dist/set-prompt-FMJ32YNG.js.map +0 -1
- package/dist/setup-links-76AJJR5Z.js +0 -144
- package/dist/shared-UPMEBTVP.js +0 -32
- package/dist/shopify-Q3XMCPHI.js +0 -4009
- package/dist/site-I4HFMTE5.js +0 -180
- package/dist/sitemaps-P3K5Z4TW.js +0 -77
- package/dist/sites-TURWC53D.js +0 -97
- package/dist/sources-GGLP5NQU.js +0 -30
- package/dist/sources-ORL5AEH5.js +0 -457
- package/dist/stale-GVPIUPBX.js +0 -90
- package/dist/stale-GVPIUPBX.js.map +0 -1
- package/dist/stats-XNKAJD2Z.js +0 -34
- package/dist/status-LSHCACMZ.js +0 -65
- package/dist/stock-RZH4SEGS.js +0 -212
- package/dist/studies-5G67ODR2.js +0 -250
- package/dist/studio-D2OMFCZZ.js +0 -49
- package/dist/study-writes-34BJFZAZ.js +0 -471
- package/dist/study-writes-34BJFZAZ.js.map +0 -1
- package/dist/sync-MK7JTH3U.js +0 -57
- package/dist/sync-QVEUQKU5.js +0 -279
- package/dist/sync-definition-EFAJ744M.js +0 -70
- package/dist/tag-manager-3GIW6BPB.js +0 -43
- package/dist/tags-5HX7TDJN.js +0 -23
- package/dist/tags-BE6L5NLG.js +0 -23
- package/dist/tags-EOIC4EQK.js +0 -26
- package/dist/tags-G4HMOLZF.js +0 -23
- package/dist/tags-PF6UJWCF.js +0 -227
- package/dist/targeting-TVZPIUUI.js +0 -762
- package/dist/targeting-TVZPIUUI.js.map +0 -1
- package/dist/targeting-constants-RJS2STR5.js +0 -118
- package/dist/targeting-criteria-DOHSND62.js +0 -113
- package/dist/targets-7AL4HPAW.js +0 -106
- package/dist/terms-AATAGKPT.js +0 -102
- package/dist/testimonials-BNYHKXD2.js +0 -32
- package/dist/themes-5HKRO5RR.js +0 -95
- package/dist/themes-5HKRO5RR.js.map +0 -1
- package/dist/top-companies-ASSEFHI3.js +0 -111
- package/dist/transcript-OTAKTTSA.js +0 -165
- package/dist/translate-ATGQD733.js +0 -603
- package/dist/translate-ATGQD733.js.map +0 -1
- package/dist/triggers-JQYC4JLT.js +0 -144
- package/dist/tweets-MLDLLLDB.js +0 -123
- package/dist/unlink-FVHHULLC.js +0 -70
- package/dist/unstage-65DUBYNZ.js +0 -96
- package/dist/unstage-FIRVPNRC.js +0 -88
- package/dist/update-EO5LVV34.js +0 -101
- package/dist/update-G7RMT4OC.js +0 -192
- package/dist/update-OD75FSPH.js +0 -66
- package/dist/update-RA6TX5NV.js +0 -155
- package/dist/upload-X33VIDOB.js +0 -137
- package/dist/url-options-4J3FRXHO.js +0 -131
- package/dist/url-params-IBE4HUKK.js +0 -101
- package/dist/validate-ZKQN55FV.js +0 -125
- package/dist/validate-ZKQN55FV.js.map +0 -1
- package/dist/videos-NITQKILV.js +0 -146
- package/dist/videos-RGCF3EAE.js +0 -41
- package/dist/viewer-check-AKVX3XFW.js +0 -83
- package/dist/web-QVR2EQ7X.js +0 -173
- package/dist/winning-ads-3R4RU3FL.js +0 -86
- package/dist/write-commands-OBQPQUIE.js +0 -721
- package/dist/write-commands-QQFBJBYD.js +0 -1524
- package/dist/write-commands-QQFBJBYD.js.map +0 -1
- package/dist/write-commands-SIOVTRHH.js +0 -1169
- package/dist/write-commands-SIOVTRHH.js.map +0 -1
- package/dist/write-commands-XLZCRVTU.js +0 -206
- package/dist/x-747NTJKH.js +0 -47
- /package/dist/{account-U6DFMD2V.js.map → account-JREYXYNE.js.map} +0 -0
- /package/dist/{account-OCFXNHG7.js.map → account-OUKPRB7C.js.map} +0 -0
- /package/dist/{account-UE6DOQXK.js.map → account-WN5MJ5QN.js.map} +0 -0
- /package/dist/{account-assets-W7K2PUYB.js.map → account-assets-IWJWYNQ3.js.map} +0 -0
- /package/dist/{account-writes-QSJ74QFR.js.map → account-writes-IUIXIVRC.js.map} +0 -0
- /package/dist/{accounts-PVMTLDJU.js.map → accounts-4YRDRLHX.js.map} +0 -0
- /package/dist/{accounts-3DS67RX7.js.map → accounts-HEGADQ6E.js.map} +0 -0
- /package/dist/{accounts-55PDBEDN.js.map → accounts-OSVXKNSI.js.map} +0 -0
- /package/dist/{accounts-AK4QIG24.js.map → accounts-SJOO4MQX.js.map} +0 -0
- /package/dist/{accounts-FZCQNX3B.js.map → accounts-V7EOUTNL.js.map} +0 -0
- /package/dist/{actions-EG23YFYB.js.map → actions-5LYJ3U6G.js.map} +0 -0
- /package/dist/{active-entities-HR7NJJLU.js.map → active-entities-4KQQSMRZ.js.map} +0 -0
- /package/dist/{activecampaign-GPT5R647.js.map → activecampaign-CZHLHGT4.js.map} +0 -0
- /package/dist/{activities-DEWHKBID.js.map → activities-FRA33VZZ.js.map} +0 -0
- /package/dist/{ad-group-writes-QBHOPTT5.js.map → ad-group-writes-YQXBUA3Q.js.map} +0 -0
- /package/dist/{ad-groups-JZDUFT6J.js.map → ad-groups-NJR4ILEN.js.map} +0 -0
- /package/dist/{ad-writes-QYJO4IB3.js.map → ad-writes-TZV64CC2.js.map} +0 -0
- /package/dist/{add-UWTWG4VO.js.map → add-MZUSKY2L.js.map} +0 -0
- /package/dist/{add-IH6GAMK4.js.map → add-NAUSQKRS.js.map} +0 -0
- /package/dist/{ads-QKVNPHBH.js.map → ads-A2FXTQES.js.map} +0 -0
- /package/dist/{ads-F3VUMSEV.js.map → ads-PYTK3LJE.js.map} +0 -0
- /package/dist/{ads-UMSWEI5X.js.map → ads-Q7DD5VXU.js.map} +0 -0
- /package/dist/{adsets-FEVYHKAQ.js.map → adsets-ZHEVFOK4.js.map} +0 -0
- /package/dist/{advertisers-AJNDC3AX.js.map → advertisers-HSTND4HE.js.map} +0 -0
- /package/dist/{analytics-PEGA46W5.js.map → analytics-63Q3FJN4.js.map} +0 -0
- /package/dist/{analytics-XCQ3G5PM.js.map → analytics-GLJODEIM.js.map} +0 -0
- /package/dist/{animate-WS63CZ3Y.js.map → animate-EI6AYBDI.js.map} +0 -0
- /package/dist/{asset-writes-7RFZZYU7.js.map → asset-writes-MS45UKJ3.js.map} +0 -0
- /package/dist/{assign-2CZ5C43W.js.map → assign-7HT3XSSN.js.map} +0 -0
- /package/dist/{audience-size-FUHDVYLN.js.map → audience-size-DG7544D2.js.map} +0 -0
- /package/dist/{audiences-RSAUXKHR.js.map → audiences-2IVVS3SJ.js.map} +0 -0
- /package/dist/{audiences-7OS2ZJYO.js.map → audiences-RN745R53.js.map} +0 -0
- /package/dist/{audiences-6GVUZUCN.js.map → audiences-Z2TQT35L.js.map} +0 -0
- /package/dist/{audit-4L7IKIRY.js.map → audit-BIHMDO5K.js.map} +0 -0
- /package/dist/{audit-DECB5PP5.js.map → audit-ZYST7KCO.js.map} +0 -0
- /package/dist/{autocomplete-6XSIFXDA.js.map → autocomplete-5BKEMOQ3.js.map} +0 -0
- /package/dist/{avatars-LTV2TSO2.js.map → avatars-FQOCDWLW.js.map} +0 -0
- /package/dist/{bid-pricing-GC6YU3LW.js.map → bid-pricing-JEW7T2VR.js.map} +0 -0
- /package/dist/{brand-B4QKPCEC.js.map → brand-FR6BKWXN.js.map} +0 -0
- /package/dist/{brief-RYNGM4GX.js.map → brief-32IXDJ4J.js.map} +0 -0
- /package/dist/{businesses-42NZP6FP.js.map → businesses-HECSW3EL.js.map} +0 -0
- /package/dist/{campaign-groups-FHV5A3EC.js.map → campaign-groups-LYPVIZT5.js.map} +0 -0
- /package/dist/{campaign-writes-4B7DCAP2.js.map → campaign-writes-D5MM5LUH.js.map} +0 -0
- /package/dist/{campaign-writes-GKNH2EHV.js.map → campaign-writes-S7A6W5V3.js.map} +0 -0
- /package/dist/{campaigns-VNBJV5QD.js.map → campaigns-CMDF3P7Y.js.map} +0 -0
- /package/dist/{campaigns-TL37AY5Y.js.map → campaigns-LIICP5JU.js.map} +0 -0
- /package/dist/{campaigns-TO74Z7UH.js.map → campaigns-N72TOUQX.js.map} +0 -0
- /package/dist/{campaigns-7RV65SXR.js.map → campaigns-ZWJKBF3L.js.map} +0 -0
- /package/dist/{canvas-6XSA3VZE.js.map → canvas-3SNC3UUV.js.map} +0 -0
- /package/dist/{capabilities-6MOMJZFW.js.map → capabilities-GL7P3SWY.js.map} +0 -0
- /package/dist/{cards-CAOGPPG4.js.map → cards-RYQN5JLR.js.map} +0 -0
- /package/dist/{catalog-URTZYAPU.js.map → catalog-PWAWDK42.js.map} +0 -0
- /package/dist/{catalogs-5LWEXG5X.js.map → catalogs-SLPYHA7D.js.map} +0 -0
- /package/dist/{changes-WWZYTLC6.js.map → changes-WOD4EOSN.js.map} +0 -0
- /package/dist/{chatgpt-ZI4GWP6S.js.map → chatgpt-3GX4I6NH.js.map} +0 -0
- /package/dist/{chunk-MU2TTM6Z.js.map → chunk-34ARMQNL.js.map} +0 -0
- /package/dist/{chunk-5T6DUP7V.js.map → chunk-34MZGC2Y.js.map} +0 -0
- /package/dist/{chunk-GNTI4KST.js.map → chunk-4KBTW5NE.js.map} +0 -0
- /package/dist/{chunk-2LBQNTTH.js.map → chunk-4PAGS7QH.js.map} +0 -0
- /package/dist/{chunk-2GFJN2TR.js.map → chunk-53KV66ZZ.js.map} +0 -0
- /package/dist/{chunk-6IR7IQPV.js.map → chunk-5C4RRCKM.js.map} +0 -0
- /package/dist/{chunk-TPGFX47R.js.map → chunk-5I6XOSNI.js.map} +0 -0
- /package/dist/{chunk-ILGRC7LJ.js.map → chunk-5OE4Z7TP.js.map} +0 -0
- /package/dist/{chunk-JAC6JVCI.js.map → chunk-6OIKNJ7G.js.map} +0 -0
- /package/dist/{chunk-B42CHCXX.js.map → chunk-6S4B67KP.js.map} +0 -0
- /package/dist/{chunk-FHWYQSMY.js.map → chunk-77LXZAX2.js.map} +0 -0
- /package/dist/{chunk-5H6N36LS.js.map → chunk-7TVVYP7K.js.map} +0 -0
- /package/dist/{chunk-HBRXFQQV.js.map → chunk-7URHRPC7.js.map} +0 -0
- /package/dist/{chunk-GXAI3EII.js.map → chunk-7YMQEAGA.js.map} +0 -0
- /package/dist/{chunk-NTFNLVZG.js.map → chunk-A4O3JL6D.js.map} +0 -0
- /package/dist/{chunk-2DAWUWA4.js.map → chunk-ANRTDNPQ.js.map} +0 -0
- /package/dist/{chunk-GWLP45WQ.js.map → chunk-AQNTVM6S.js.map} +0 -0
- /package/dist/{chunk-ULIQNJ5J.js.map → chunk-BPDIY5CF.js.map} +0 -0
- /package/dist/{chunk-IXVVTPG6.js.map → chunk-CKHF7UXS.js.map} +0 -0
- /package/dist/{chunk-MKG57P2E.js.map → chunk-CUTTTFAU.js.map} +0 -0
- /package/dist/{chunk-IGCS3X4F.js.map → chunk-D32EWSMB.js.map} +0 -0
- /package/dist/{chunk-JBABLH5C.js.map → chunk-D55MN5IH.js.map} +0 -0
- /package/dist/{chunk-FWHEAR7F.js.map → chunk-DRQI2CJJ.js.map} +0 -0
- /package/dist/{chunk-ARPT74DG.js.map → chunk-ETI6DGR2.js.map} +0 -0
- /package/dist/{chunk-XRR5NN2V.js.map → chunk-FFTD7XDA.js.map} +0 -0
- /package/dist/{chunk-YXZV6YKH.js.map → chunk-FTKUHGTC.js.map} +0 -0
- /package/dist/{chunk-RJIFEHEG.js.map → chunk-GFYGVIT3.js.map} +0 -0
- /package/dist/{chunk-ORQ3WBM6.js.map → chunk-GGXPO4NQ.js.map} +0 -0
- /package/dist/{chunk-KICGV4JB.js.map → chunk-H56UJRLV.js.map} +0 -0
- /package/dist/{chunk-GR2BPVLX.js.map → chunk-HDMD6LXS.js.map} +0 -0
- /package/dist/{chunk-N2TXADL7.js.map → chunk-HFZZKYUX.js.map} +0 -0
- /package/dist/{chunk-DWPOAU4Z.js.map → chunk-IAYJKH4R.js.map} +0 -0
- /package/dist/{chunk-7M6GZI5B.js.map → chunk-IEPCI2EB.js.map} +0 -0
- /package/dist/{chunk-ZREKNWIE.js.map → chunk-IKADYUXK.js.map} +0 -0
- /package/dist/{chunk-OSQTSS27.js.map → chunk-J32CYEIH.js.map} +0 -0
- /package/dist/{chunk-3D5ABNNW.js.map → chunk-J5I3GYSJ.js.map} +0 -0
- /package/dist/{chunk-X3YYZLBH.js.map → chunk-JCVXKHVB.js.map} +0 -0
- /package/dist/{chunk-BRPSY35A.js.map → chunk-JESSFI7R.js.map} +0 -0
- /package/dist/{chunk-CDPM6OE6.js.map → chunk-K4QPBXV7.js.map} +0 -0
- /package/dist/{chunk-H3HA22Z3.js.map → chunk-KJ3J2DYM.js.map} +0 -0
- /package/dist/{chunk-BHEOF2MF.js.map → chunk-L43B2YGZ.js.map} +0 -0
- /package/dist/{chunk-OTRKBCUB.js.map → chunk-L7UD57TV.js.map} +0 -0
- /package/dist/{chunk-6IRB3MHG.js.map → chunk-LJYXGUQ3.js.map} +0 -0
- /package/dist/{chunk-H3PD2KOF.js.map → chunk-LNYM4PQS.js.map} +0 -0
- /package/dist/{chunk-T4YD5W33.js.map → chunk-MIXUMGJE.js.map} +0 -0
- /package/dist/{chunk-U5LSGCT3.js.map → chunk-MWJ6BCZJ.js.map} +0 -0
- /package/dist/{chunk-N2MGR7HT.js.map → chunk-O7WRA3JU.js.map} +0 -0
- /package/dist/{chunk-LDYI7BIQ.js.map → chunk-OADMSHME.js.map} +0 -0
- /package/dist/{chunk-R4RWQ6YX.js.map → chunk-OLPABGH3.js.map} +0 -0
- /package/dist/{chunk-SZET6NTF.js.map → chunk-ONGZKI5J.js.map} +0 -0
- /package/dist/{chunk-3GKAVXR3.js.map → chunk-OSZOUSK5.js.map} +0 -0
- /package/dist/{chunk-6MX37ZQZ.js.map → chunk-PK7YNQ2T.js.map} +0 -0
- /package/dist/{chunk-JTIWQLY5.js.map → chunk-PN3CHL5W.js.map} +0 -0
- /package/dist/{chunk-S3ZW3KTX.js.map → chunk-QMQSI4WA.js.map} +0 -0
- /package/dist/{chunk-C3EX5OKN.js.map → chunk-QUSDGZFS.js.map} +0 -0
- /package/dist/{chunk-P6KTCPJG.js.map → chunk-QXRSFH6M.js.map} +0 -0
- /package/dist/{chunk-22RM3UOO.js.map → chunk-QZ4YHQLW.js.map} +0 -0
- /package/dist/{chunk-3E74OM2E.js.map → chunk-RF3TP643.js.map} +0 -0
- /package/dist/{chunk-WBWEKZQ2.js.map → chunk-RIRSFFWA.js.map} +0 -0
- /package/dist/{chunk-B47TRSMB.js.map → chunk-ROHICQPK.js.map} +0 -0
- /package/dist/{chunk-V6TZRCAS.js.map → chunk-RP3PC54R.js.map} +0 -0
- /package/dist/{chunk-MZPS46OR.js.map → chunk-SIKCVWM3.js.map} +0 -0
- /package/dist/{chunk-EJBLF2LI.js.map → chunk-SOM4OTR5.js.map} +0 -0
- /package/dist/{chunk-Q5DFEVLE.js.map → chunk-SZZ7BBED.js.map} +0 -0
- /package/dist/{chunk-RYYRGQMM.js.map → chunk-TAGJYHVI.js.map} +0 -0
- /package/dist/{chunk-URKOGN5B.js.map → chunk-TB5JZTLN.js.map} +0 -0
- /package/dist/{chunk-KDAINT54.js.map → chunk-TQJLEVLA.js.map} +0 -0
- /package/dist/{chunk-X3GWGFZP.js.map → chunk-TW57RTKN.js.map} +0 -0
- /package/dist/{chunk-O43QFUOG.js.map → chunk-V3ANSXCB.js.map} +0 -0
- /package/dist/{chunk-D6YLVDVN.js.map → chunk-WSG4K2TR.js.map} +0 -0
- /package/dist/{chunk-XZAVBONI.js.map → chunk-WXSRSMY3.js.map} +0 -0
- /package/dist/{chunk-BMMXYR7A.js.map → chunk-WZXMZFVB.js.map} +0 -0
- /package/dist/{chunk-M45SOKI5.js.map → chunk-X3L5HYQM.js.map} +0 -0
- /package/dist/{chunk-6QINKM6T.js.map → chunk-Y2TOB4N5.js.map} +0 -0
- /package/dist/{chunk-RBB3UUYP.js.map → chunk-Z2LPYAN4.js.map} +0 -0
- /package/dist/{chunk-YD6OZSSY.js.map → chunk-ZICB4OI5.js.map} +0 -0
- /package/dist/{chunk-UYZ4FUC7.js.map → chunk-ZOCAGPS5.js.map} +0 -0
- /package/dist/{chunk-ME3K6XIS.js.map → chunk-ZZWZUTEP.js.map} +0 -0
- /package/dist/{claim-YCK2XQUL.js.map → claim-QHYA5UTF.js.map} +0 -0
- /package/dist/{companies-SWGL3MQT.js.map → companies-BNMAOQUQ.js.map} +0 -0
- /package/dist/{company-XKEQKWPO.js.map → company-YANP3G62.js.map} +0 -0
- /package/dist/{complete-CHEZWF5R.js.map → complete-ICZCBO6M.js.map} +0 -0
- /package/dist/{config-NDL2YP37.js.map → config-GIETKZGS.js.map} +0 -0
- /package/dist/{connect-GWLVOOU7.js.map → connect-ZXGEFS53.js.map} +0 -0
- /package/dist/{conversation-QD4UJZ7S.js.map → conversation-YIWZIUIK.js.map} +0 -0
- /package/dist/{conversion-report-76S5JOVT.js.map → conversion-report-E35RCZU7.js.map} +0 -0
- /package/dist/{conversion-writes-6HX665JT.js.map → conversion-writes-MUD7WJDH.js.map} +0 -0
- /package/dist/{conversions-BECU3XD2.js.map → conversions-B7HR6JMC.js.map} +0 -0
- /package/dist/{conversions-QZJRF4WN.js.map → conversions-WU7DNFF7.js.map} +0 -0
- /package/dist/{create-5QPEESSZ.js.map → create-EL47XN73.js.map} +0 -0
- /package/dist/{create-ET3VCGQT.js.map → create-GU5MUZ7U.js.map} +0 -0
- /package/dist/{create-4OA5DOSO.js.map → create-IKQ7A47F.js.map} +0 -0
- /package/dist/{create-IJSH2LHP.js.map → create-TKQDLX7M.js.map} +0 -0
- /package/dist/{creatives-L3XSN34M.js.map → creatives-PW6HB4JB.js.map} +0 -0
- /package/dist/{creatives-SFPNXJ6Z.js.map → creatives-S4EGN44U.js.map} +0 -0
- /package/dist/{creatives-AIRQ3FGH.js.map → creatives-VBD4T6C7.js.map} +0 -0
- /package/dist/{credentials-Q2FM4DP3.js.map → credentials-57U2UQ7G.js.map} +0 -0
- /package/dist/{crm-PQREUPOU.js.map → crm-JCYLJQ7K.js.map} +0 -0
- /package/dist/{crm-7GTTSEHH.js.map → crm-LQTYPDMZ.js.map} +0 -0
- /package/dist/{currency-BZUNQ4XJ.js.map → currency-5NYTOLEL.js.map} +0 -0
- /package/dist/{custom-conversions-UHRBVUD2.js.map → custom-conversions-NT7ONTEX.js.map} +0 -0
- /package/dist/{customers-BYNADWKU.js.map → customers-LP6I7POL.js.map} +0 -0
- /package/dist/{delete-EZ525EJV.js.map → delete-PZ6GP7J6.js.map} +0 -0
- /package/dist/{delete-2RAKL577.js.map → delete-WW4JYQMX.js.map} +0 -0
- /package/dist/{delete-ZBYPC5AL.js.map → delete-XZNY426Q.js.map} +0 -0
- /package/dist/{demographics-5XMZ2TBB.js.map → demographics-HZY2JEYQ.js.map} +0 -0
- /package/dist/{discard-Q7R5VJ7I.js.map → discard-NRTGRVXR.js.map} +0 -0
- /package/dist/{discover-PDSEJR2P.js.map → discover-5ZFAAPNG.js.map} +0 -0
- /package/dist/{domain-MS3BKUYW.js.map → domain-YGKFTN6D.js.map} +0 -0
- /package/dist/{download-F56SAC2G.js.map → download-XERSDEN3.js.map} +0 -0
- /package/dist/{draft-44KTLX4P.js.map → draft-2EVXU5XB.js.map} +0 -0
- /package/dist/{draft-RSKZSUOS.js.map → draft-CQWYTMSS.js.map} +0 -0
- /package/dist/{draft-L6XXU2I6.js.map → draft-EL74RDAG.js.map} +0 -0
- /package/dist/{draft-WOE7KQ7T.js.map → draft-GFZ3KMRX.js.map} +0 -0
- /package/dist/{draft-CKFSZDVI.js.map → draft-JYZA3BFD.js.map} +0 -0
- /package/dist/{draft-JBLWUO3J.js.map → draft-UNPTTHP4.js.map} +0 -0
- /package/dist/{experiment-AZUKJ7ZO.js.map → experiment-YAX26BOO.js.map} +0 -0
- /package/dist/{extract-2PG5JB2C.js.map → extract-QMY6WPTV.js.map} +0 -0
- /package/dist/{facets-5CGKHFDQ.js.map → facets-QHM2IQ3E.js.map} +0 -0
- /package/dist/{feedback-C7THFXTE.js.map → feedback-NLPTKWOH.js.map} +0 -0
- /package/dist/{fetch-LMEYFSM5.js.map → fetch-72ZILZHO.js.map} +0 -0
- /package/dist/{fit-DBA7FD3M.js.map → fit-AURKFPAY.js.map} +0 -0
- /package/dist/{flows-TQASOYQP.js.map → flows-CZPXHOZW.js.map} +0 -0
- /package/dist/{fonts-MPDK2DXR.js.map → fonts-NA26RQ4C.js.map} +0 -0
- /package/dist/{forecast-OP2ECNM2.js.map → forecast-ARIHRQAX.js.map} +0 -0
- /package/dist/{funding-BSAHWU35.js.map → funding-QDKFNQI2.js.map} +0 -0
- /package/dist/{funnel-BLRQAZ65.js.map → funnel-4VQB3T3M.js.map} +0 -0
- /package/dist/{ga4-YVKA3V4V.js.map → ga4-N6EBLN2W.js.map} +0 -0
- /package/dist/{generate-VGGXTZBP.js.map → generate-IJLMJC4S.js.map} +0 -0
- /package/dist/{get-DEELBPMG.js.map → get-LOEUOTG3.js.map} +0 -0
- /package/dist/{get-YATZI6GN.js.map → get-W3VJIQBN.js.map} +0 -0
- /package/dist/{google-ULLPGAXN.js.map → google-7VEPEBFV.js.map} +0 -0
- /package/dist/{google-ads-IEQJEICD.js.map → google-ads-YBOJ3XXK.js.map} +0 -0
- /package/dist/{gsc-OJDMSP6H.js.map → gsc-FILOUFCG.js.map} +0 -0
- /package/dist/{history-LXRFZNW7.js.map → history-6LLGAK7B.js.map} +0 -0
- /package/dist/{history-FPXZOUHT.js.map → history-H2SHADAM.js.map} +0 -0
- /package/dist/{history-2LE4ELLB.js.map → history-LJG64M6P.js.map} +0 -0
- /package/dist/{hubspot-MNREQEVI.js.map → hubspot-6JDARLIU.js.map} +0 -0
- /package/dist/{ideas-4N7WMX3P.js.map → ideas-MTWJDRRK.js.map} +0 -0
- /package/dist/{images-KVMFKQX5.js.map → images-RIFC6D3H.js.map} +0 -0
- /package/dist/{ingest-VG4YGXB2.js.map → ingest-K45T4OLM.js.map} +0 -0
- /package/dist/{ingest-GUJNPD6S.js.map → ingest-MSS52UO5.js.map} +0 -0
- /package/dist/{insights-LZJZGNJZ.js.map → insights-AVNMRFQ4.js.map} +0 -0
- /package/dist/{insights-H6M6VI43.js.map → insights-TBIT6DTF.js.map} +0 -0
- /package/dist/{inspect-VODWKUQY.js.map → inspect-EBGYJOZ3.js.map} +0 -0
- /package/dist/{intent-HXRSLFIO.js.map → intent-URHTU4AK.js.map} +0 -0
- /package/dist/{job-UFGGBDG7.js.map → job-OJB6KIDV.js.map} +0 -0
- /package/dist/{job-create-XM4NH322.js.map → job-create-C6FGCDW4.js.map} +0 -0
- /package/dist/{job-status-47L5Z57J.js.map → job-status-4RJHESID.js.map} +0 -0
- /package/dist/{keyword-gap-WUHMSTNR.js.map → keyword-gap-WXM6SN6A.js.map} +0 -0
- /package/dist/{keyword-metrics-LOLNR24U.js.map → keyword-metrics-57MUTYMH.js.map} +0 -0
- /package/dist/{keywords-for-site-PLTJBXVN.js.map → keywords-for-site-ABZS7O5B.js.map} +0 -0
- /package/dist/{landing-JMH3WIK2.js.map → landing-AXCYLUQZ.js.map} +0 -0
- /package/dist/{languages-SVTYYYOC.js.map → languages-6XTVTFZC.js.map} +0 -0
- /package/dist/{leads-XPIBMZI7.js.map → leads-C5BUBBLZ.js.map} +0 -0
- /package/dist/{learn-MOHK6DHI.js.map → learn-M64GVGPX.js.map} +0 -0
- /package/dist/{line-item-writes-5RVCYHHH.js.map → line-item-writes-HYLWBQTM.js.map} +0 -0
- /package/dist/{line-items-OESD2IJ6.js.map → line-items-Y4THDHSE.js.map} +0 -0
- /package/dist/{link-PURCDO7A.js.map → link-BU7YCL2M.js.map} +0 -0
- /package/dist/{linkedin-person-L22XA5LG.js.map → linkedin-person-FEIY7FYQ.js.map} +0 -0
- /package/dist/{list-L5VZ35AO.js.map → list-BKIL7O4G.js.map} +0 -0
- /package/dist/{list-KE6PQV2U.js.map → list-H3C345WG.js.map} +0 -0
- /package/dist/{list-T5ZVVC4L.js.map → list-UGTDZ7YI.js.map} +0 -0
- /package/dist/{locations-7EBZ6KRH.js.map → locations-F4365X4S.js.map} +0 -0
- /package/dist/{locations-5SLLGWZO.js.map → locations-HOI7AUZ2.js.map} +0 -0
- /package/dist/{log-D3WU36FX.js.map → log-54SJV6MW.js.map} +0 -0
- /package/dist/{lookup-OU6CLATK.js.map → lookup-QNLX2535.js.map} +0 -0
- /package/dist/{map-PT7JJYQR.js.map → map-BPPGQGDV.js.map} +0 -0
- /package/dist/{mcp-62MSONPH.js.map → mcp-EXOMBMYL.js.map} +0 -0
- /package/dist/{media-YKCCMLXL.js.map → media-MITWBYVZ.js.map} +0 -0
- /package/dist/{media-DGV2AMZI.js.map → media-WGIEUEZW.js.map} +0 -0
- /package/dist/{media-sources-DGVR3YPL.js.map → media-sources-XEC72K7X.js.map} +0 -0
- /package/dist/{members-DAHPS3MB.js.map → members-VDON57BE.js.map} +0 -0
- /package/dist/{meta-5TRG7RTQ.js.map → meta-NUBBKE2V.js.map} +0 -0
- /package/dist/{metrics-WRERNMRK.js.map → metrics-V6FAZO5A.js.map} +0 -0
- /package/dist/{models-SITHUNAA.js.map → models-TSMFIOZU.js.map} +0 -0
- /package/dist/{normalize-ZOJ4YROH.js.map → normalize-632DD2HJ.js.map} +0 -0
- /package/dist/{options-DTB2NYBL.js.map → options-TZYZQZ3M.js.map} +0 -0
- /package/dist/{organization-5JHFNUOD.js.map → organization-FYRXSGB4.js.map} +0 -0
- /package/dist/{output-7X5WPPCA.js.map → output-HZW7LNUL.js.map} +0 -0
- /package/dist/{pages-6YMPZDEY.js.map → pages-UH6XEZBO.js.map} +0 -0
- /package/dist/{performance-W6CJEUHR.js.map → performance-JKXHQIAV.js.map} +0 -0
- /package/dist/{performance-VFDK5PHT.js.map → performance-OF3N43OP.js.map} +0 -0
- /package/dist/{pixels-WTTLC4O5.js.map → pixels-KXA6R3G3.js.map} +0 -0
- /package/dist/{pixels-DZDVNIVL.js.map → pixels-PYNK73UG.js.map} +0 -0
- /package/dist/{plan-JAWESWJN.js.map → plan-4OYUV2EF.js.map} +0 -0
- /package/dist/{preview-JZXGR4KN.js.map → preview-7E4E3QPT.js.map} +0 -0
- /package/dist/{preview-PUF62HJU.js.map → preview-FPBM75L2.js.map} +0 -0
- /package/dist/{promoted-tweet-writes-FW4BAA5O.js.map → promoted-tweet-writes-IJRBFK7W.js.map} +0 -0
- /package/dist/{promoted-tweets-LYHKCVNV.js.map → promoted-tweets-7PYH3RPV.js.map} +0 -0
- /package/dist/{properties-Z5S3LRJ5.js.map → properties-RDOGNY2O.js.map} +0 -0
- /package/dist/{publish-S2KD5PCN.js.map → publish-MNSDFPEQ.js.map} +0 -0
- /package/dist/{query-3QFT42PG.js.map → query-GMGWJW3X.js.map} +0 -0
- /package/dist/{query-KKXCMH3Q.js.map → query-K7R5GQ4E.js.map} +0 -0
- /package/dist/{query-QXKGVHZL.js.map → query-PO3RT7BR.js.map} +0 -0
- /package/dist/{questionnaire-U7UYICEA.js.map → questionnaire-4OH6K2BF.js.map} +0 -0
- /package/dist/{read-ENUS7P3L.js.map → read-MU5XGWMK.js.map} +0 -0
- /package/dist/{reddit-AF2PPR3K.js.map → reddit-JFFMZLJS.js.map} +0 -0
- /package/dist/{refresh-UC7OTPXS.js.map → refresh-EJ7WKW3H.js.map} +0 -0
- /package/dist/{release-FQOJ2FJ5.js.map → release-AFRLCZWB.js.map} +0 -0
- /package/dist/{relevant-pages-OFKZYWR3.js.map → relevant-pages-4YGN3I2U.js.map} +0 -0
- /package/dist/{remove-H3SU4GJK.js.map → remove-QD4PITBL.js.map} +0 -0
- /package/dist/{reopen-M2PZEHKF.js.map → reopen-JSC6AVJC.js.map} +0 -0
- /package/dist/{research-ILZZTO6Q.js.map → research-MMFUFZGS.js.map} +0 -0
- /package/dist/{research-2N5HAFSB.js.map → research-SRISCVBM.js.map} +0 -0
- /package/dist/{reset-XAKAEDPH.js.map → reset-752CNET3.js.map} +0 -0
- /package/dist/{reset-JN437DOZ.js.map → reset-R3TQAHRU.js.map} +0 -0
- /package/dist/{resolve-WVE6D7CP.js.map → resolve-EWHSJNBX.js.map} +0 -0
- /package/dist/{retry-PMJ22IN4.js.map → retry-DVHDVHVP.js.map} +0 -0
- /package/dist/{retry-ILL2ZATG.js.map → retry-PVULTONO.js.map} +0 -0
- /package/dist/{rules-Y75KR2PC.js.map → rules-4YTY57FM.js.map} +0 -0
- /package/dist/{run-OCCY7JHY.js.map → run-PCZRYL42.js.map} +0 -0
- /package/dist/{run-2AIXS3KE.js.map → run-PRSAUWAJ.js.map} +0 -0
- /package/dist/{schedule-WV6NZ4CK.js.map → schedule-6YTZBCZA.js.map} +0 -0
- /package/dist/{scheduled-agents-MZZMHN3T.js.map → scheduled-agents-XCPU57LU.js.map} +0 -0
- /package/dist/{schema-ADRFE3AV.js.map → schema-4PS5BDG3.js.map} +0 -0
- /package/dist/{search-GGWTLVG7.js.map → search-IMZD5RGD.js.map} +0 -0
- /package/dist/{sends-4ZO6BNZ4.js.map → sends-I2B6F5NW.js.map} +0 -0
- /package/dist/{setup-links-76AJJR5Z.js.map → setup-links-PTL6RF2J.js.map} +0 -0
- /package/dist/{shared-UPMEBTVP.js.map → shared-Z7INVKCZ.js.map} +0 -0
- /package/dist/{shopify-Q3XMCPHI.js.map → shopify-SDZZ5HTA.js.map} +0 -0
- /package/dist/{site-I4HFMTE5.js.map → site-NGQ7K6UD.js.map} +0 -0
- /package/dist/{sitemaps-P3K5Z4TW.js.map → sitemaps-EOMSRKOD.js.map} +0 -0
- /package/dist/{sites-TURWC53D.js.map → sites-6M73AONG.js.map} +0 -0
- /package/dist/{sources-GGLP5NQU.js.map → sources-NKFSCI6M.js.map} +0 -0
- /package/dist/{sources-ORL5AEH5.js.map → sources-O4CQ5KSX.js.map} +0 -0
- /package/dist/{stats-XNKAJD2Z.js.map → stats-MFEH2TSW.js.map} +0 -0
- /package/dist/{status-LSHCACMZ.js.map → status-DLYRPGFS.js.map} +0 -0
- /package/dist/{stock-RZH4SEGS.js.map → stock-RDCDVBHX.js.map} +0 -0
- /package/dist/{studies-5G67ODR2.js.map → studies-SSA3SR2L.js.map} +0 -0
- /package/dist/{studio-D2OMFCZZ.js.map → studio-MBHPDGMN.js.map} +0 -0
- /package/dist/{sync-MK7JTH3U.js.map → sync-BEW3TZP7.js.map} +0 -0
- /package/dist/{sync-QVEUQKU5.js.map → sync-SI25TKY5.js.map} +0 -0
- /package/dist/{sync-definition-EFAJ744M.js.map → sync-definition-RECCA3QH.js.map} +0 -0
- /package/dist/{tag-manager-3GIW6BPB.js.map → tag-manager-JFC6YYVP.js.map} +0 -0
- /package/dist/{tags-5HX7TDJN.js.map → tags-IJIGZYR3.js.map} +0 -0
- /package/dist/{tags-EOIC4EQK.js.map → tags-K4HIKHNU.js.map} +0 -0
- /package/dist/{tags-G4HMOLZF.js.map → tags-OTA55BQ6.js.map} +0 -0
- /package/dist/{tags-BE6L5NLG.js.map → tags-QF2V4B3M.js.map} +0 -0
- /package/dist/{tags-PF6UJWCF.js.map → tags-SK7WXMBS.js.map} +0 -0
- /package/dist/{targeting-constants-RJS2STR5.js.map → targeting-constants-RF2732EW.js.map} +0 -0
- /package/dist/{targeting-criteria-DOHSND62.js.map → targeting-criteria-7BUUYDYC.js.map} +0 -0
- /package/dist/{targets-7AL4HPAW.js.map → targets-7V3NCQSD.js.map} +0 -0
- /package/dist/{terms-AATAGKPT.js.map → terms-XFL6QO7A.js.map} +0 -0
- /package/dist/{testimonials-BNYHKXD2.js.map → testimonials-XYD5DLBJ.js.map} +0 -0
- /package/dist/{top-companies-ASSEFHI3.js.map → top-companies-LI26TONY.js.map} +0 -0
- /package/dist/{transcript-OTAKTTSA.js.map → transcript-FTHDWMGU.js.map} +0 -0
- /package/dist/{triggers-JQYC4JLT.js.map → triggers-3LHJVK5P.js.map} +0 -0
- /package/dist/{tweets-MLDLLLDB.js.map → tweets-6PQHJXJC.js.map} +0 -0
- /package/dist/{unlink-FVHHULLC.js.map → unlink-BMOUBGWO.js.map} +0 -0
- /package/dist/{unstage-65DUBYNZ.js.map → unstage-O23ILHCY.js.map} +0 -0
- /package/dist/{unstage-FIRVPNRC.js.map → unstage-YEW5KXJL.js.map} +0 -0
- /package/dist/{update-EO5LVV34.js.map → update-2IWZA5UU.js.map} +0 -0
- /package/dist/{update-RA6TX5NV.js.map → update-G7YZICSU.js.map} +0 -0
- /package/dist/{update-G7RMT4OC.js.map → update-T5INCQJZ.js.map} +0 -0
- /package/dist/{update-OD75FSPH.js.map → update-UTQVTG45.js.map} +0 -0
- /package/dist/{upload-X33VIDOB.js.map → upload-UXYJDA2U.js.map} +0 -0
- /package/dist/{url-options-4J3FRXHO.js.map → url-options-Y7I5EL55.js.map} +0 -0
- /package/dist/{url-params-IBE4HUKK.js.map → url-params-PE4XAQNH.js.map} +0 -0
- /package/dist/{videos-NITQKILV.js.map → videos-AHOLXU42.js.map} +0 -0
- /package/dist/{videos-RGCF3EAE.js.map → videos-EVPJHY3B.js.map} +0 -0
- /package/dist/{viewer-check-AKVX3XFW.js.map → viewer-check-NA4TMNY4.js.map} +0 -0
- /package/dist/{web-QVR2EQ7X.js.map → web-7EODEH25.js.map} +0 -0
- /package/dist/{winning-ads-3R4RU3FL.js.map → winning-ads-5UKX6QV7.js.map} +0 -0
- /package/dist/{write-commands-XLZCRVTU.js.map → write-commands-LHEJESKL.js.map} +0 -0
- /package/dist/{write-commands-OBQPQUIE.js.map → write-commands-SD6DXVNK.js.map} +0 -0
- /package/dist/{x-747NTJKH.js.map → x-R72UTFQT.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/engine/creative-rules/schema.ts","../src/engine/copy-tells/rule-tells.ts","../src/commands/creatives/ideas-model.ts","../src/engine/creative-rules/read.ts"],"sourcesContent":["/**\n * A creative rule: a standing must, never or prefer about every ad a company makes, or every landing. Declared ones\n * are the brand's own (BRAND.md, read by `brand-doc.ts`); learned ones are what a person taught in a\n * chat, one file each in `src/content/creative-rules/<slug>.md`, saved only after they said yes.\n * Read when a call runs, never copied into an ad's own files.\n */\nimport { z } from \"zod\";\n\nexport const RULE_STRENGTHS = [\"never\", \"must\", \"prefer\"] as const;\nexport type RuleStrength = (typeof RULE_STRENGTHS)[number];\n\n/** What of the ad a rule is about, and so which check holds it. */\nexport const RULE_APPLIES = [\"copy\", \"picture\", \"cast\", \"logo\", \"voice\", \"sound\", \"subtitles\", \"any\"] as const;\nexport type RuleApplies = (typeof RULE_APPLIES)[number];\n\nexport const RULE_KINDS = [\"static\", \"video\"] as const;\n\n/** What a rule is for: ads (when it says nothing), landings, or all of them. */\nexport const RULE_FOR = [\"ads\", \"landings\", \"all\"] as const;\nexport type RuleFor = (typeof RULE_FOR)[number];\n\n/** Where a rule holds; absent parts hold everywhere. */\nexport type RuleScope = {\n kinds?: Array<(typeof RULE_KINDS)[number]>;\n /** Product slugs (`src/content/products/<slug>.md`) a business unit's rule is about. */\n products?: string[];\n platforms?: string[];\n /** The language its phrases are in (\"es\"): its wording checks hold only in ads in that language. */\n language?: string;\n};\n\n/**\n * The part of a rule code can decide on the ad's words: phrases it bans (`forbid`, except where they\n * sit inside an `allow`), phrases every ad must say (`require`), and that only real people may appear.\n */\nexport type RuleCheck = {\n forbid?: string[];\n require?: string[];\n allow?: string[];\n people?: \"real\";\n};\n\nexport const RULE_SOURCE_KINDS = [\"feedback\", \"user\", \"brand-import\", \"brand\"] as const;\n\nexport type RuleSource = {\n kind: (typeof RULE_SOURCE_KINDS)[number];\n feedbackId?: string;\n runId?: string;\n slug?: string;\n /** The person's own words the rule came from. */\n quote?: string;\n /** When it was taught (YYYY-MM-DD). */\n date?: string;\n};\n\nexport type CreativeRule = {\n /** The file's slug for a learned rule; `brand-<hash>` for one BRAND.md states. */\n id: string;\n origin: \"learned\" | \"declared\";\n strength: RuleStrength;\n /** Absent: the rule is for ads. */\n for?: Exclude<RuleFor, \"ads\">;\n applies: RuleApplies;\n scope: RuleScope;\n check?: RuleCheck;\n /** The rule, in the words it was given in. */\n text: string;\n why?: string;\n source: RuleSource;\n status: \"active\" | \"retired\";\n retiredBy?: string;\n};\n\nconst phrase = z.string().trim().min(1).max(120);\n\n/** A list of phrases, each trimmed, the empty and malformed ones dropped. */\nexport const Phrases = z\n .array(z.unknown())\n .transform((list) => list.flatMap((p) => (phrase.safeParse(p).success ? [String(p).trim()] : [])));\n","/**\n * The company's wording rules, checked on an ad's words without a model: a phrase a rule bans\n * (except inside a phrase it allows) and a phrase every ad must say. Whole phrases only, read the\n * way a person reads them: accents, case and spacing folded (\"100 % online\" is \"100% Online\"), ß as\n * ss. A rule whose phrases differ only in case is about spelling, and keeps case (\"ZentIA\", never\n * \"Zentia\"). A rule in one language holds only in ads in that language. Never and must rules only:\n * a prefer is the reviewers' to weigh. Pure and total.\n */\nimport type { CreativeRule } from \"../creative-rules/schema.ts\";\n\nexport type RuleTell = {\n rule: string;\n strength: CreativeRule[\"strength\"];\n /** A phrase the rule bans was found, or none of the lines says one it requires. */\n kind: \"forbidden\" | \"missing\";\n phrase: string;\n /** The line it was found in (a forbidden phrase only). */\n line?: string;\n /** The rule's words. */\n text: string;\n /** The person's own words, when they taught it. */\n quote?: string;\n};\n\n/** Marks that separate words rather than say anything: never part of a phrase unless it is only marks. */\nconst SOFT = new Set([\n \".\",\n \",\",\n \";\",\n \":\",\n \"!\",\n \"?\",\n \"¡\",\n \"¿\",\n '\"',\n \"'\",\n \"“\",\n \"”\",\n \"‘\",\n \"’\",\n \"«\",\n \"»\",\n \"(\",\n \")\",\n \"[\",\n \"]\",\n \"{\",\n \"}\",\n \"…\",\n \"-\",\n \"/\",\n \"*\",\n \"_\",\n]);\n\n/** Accents off, ß as ss, and case folded unless the rule is about case. Pure. */\nfunction fold(text: string, keepCase: boolean): string {\n const plain = text.normalize(\"NFKD\").replace(/\\p{M}/gu, \"\").replace(/ß/g, \"ss\").replace(/ẞ/g, \"SS\");\n return keepCase ? plain : plain.toLowerCase();\n}\n\n/** The words and marks of a text, as phrases are matched on; the separating marks only when `marks`. Pure. */\nfunction tokens(text: string, keepCase: boolean, marks = false): string[] {\n const all = fold(text, keepCase).match(/[\\p{L}\\p{N}]+|[^\\s\\p{L}\\p{N}]/gu) ?? [];\n return marks ? all : all.filter((t) => !SOFT.has(t));\n}\n\n/** Whether a phrase is only separating marks (\"!\", \"¿\"): then it is matched among the marks of a line. Pure. */\nfunction onlyMarks(phrase: string, keepCase: boolean): boolean {\n return tokens(phrase, keepCase).length === 0 && tokens(phrase, keepCase, true).length > 0;\n}\n\n/** Where `phrase` starts in `words`, every place. Pure. */\nfunction positions(words: readonly string[], phrase: readonly string[]): number[] {\n if (phrase.length === 0) return [];\n const at: number[] = [];\n for (let i = 0; i + phrase.length <= words.length; i++) {\n if (phrase.every((w, j) => words[i + j] === w)) at.push(i);\n }\n return at;\n}\n\n/** A rule is about case when two of its phrases are the same word but for case. Pure. */\nfunction aboutCase(check: NonNullable<CreativeRule[\"check\"]>): boolean {\n const phrases = [...(check.forbid ?? []), ...(check.allow ?? []), ...(check.require ?? [])];\n return phrases.some((a, i) =>\n phrases.some((b, j) => i !== j && a !== b && fold(a, false) === fold(b, false) && fold(a, true) !== fold(b, true)),\n );\n}\n\n/** Whether a rule in one language holds for an ad in `language`: the same primary tag, or a rule in none. Pure. */\nfunction sameLanguage(rule: CreativeRule, language: string | undefined): boolean {\n const ruleLanguage = rule.scope.language;\n if (!ruleLanguage) return true;\n if (!language) return false;\n const primary = (tag: string) => tag.toLowerCase().split(/[-_]/)[0];\n return primary(ruleLanguage) === primary(language);\n}\n\n/** The first phrase of `forbid` a line says outside every `allow`, or null. Pure. */\nfunction forbiddenIn(line: string, check: NonNullable<CreativeRule[\"check\"]>, keepCase: boolean): string | null {\n for (const banned of check.forbid ?? []) {\n const marks = onlyMarks(banned, keepCase);\n const words = tokens(line, keepCase, marks);\n const allowed = (check.allow ?? []).flatMap((a) => {\n const allow = tokens(a, keepCase, marks);\n return positions(words, allow).map((start) => [start, start + allow.length] as const);\n });\n const phrase = tokens(banned, keepCase, marks);\n const free = positions(words, phrase).some(\n (start) => !allowed.some(([from, to]) => start >= from && start + phrase.length <= to),\n );\n if (free) return banned;\n }\n return null;\n}\n\n/** What one rule finds in the lines: each line saying a phrase it bans, each phrase it requires none says. Pure. */\nfunction tellsOf(rule: CreativeRule, lines: readonly string[]): RuleTell[] {\n const check = rule.check;\n if (!check) return [];\n const keepCase = aboutCase(check);\n const base = {\n rule: rule.id,\n strength: rule.strength,\n text: rule.text,\n ...(rule.source.quote ? { quote: rule.source.quote } : {}),\n };\n const forbidden = lines.flatMap((line) => {\n const phrase = forbiddenIn(line, check, keepCase);\n return phrase ? [{ ...base, kind: \"forbidden\" as const, phrase, line }] : [];\n });\n const missing = (check.require ?? []).flatMap((required) => {\n const marks = onlyMarks(required, keepCase);\n const phrase = tokens(required, keepCase, marks);\n const said = lines.some((line) => positions(tokens(line, keepCase, marks), phrase).length > 0);\n return said ? [] : [{ ...base, kind: \"missing\" as const, phrase: required }];\n });\n return [...forbidden, ...missing];\n}\n\n/** Every wording rule the lines break, the line it is broken in first. Pure. */\nexport function ruleTells(\n lines: readonly string[],\n rules: readonly CreativeRule[],\n language: string | undefined,\n): RuleTell[] {\n return rules\n .filter((rule) => rule.strength !== \"prefer\" && sameLanguage(rule, language))\n .flatMap((rule) => tellsOf(rule, lines));\n}\n","/**\n * Ideas and the customer truths they stand on.\n *\n * An idea (src/creatives/_ideas/<id>.md) is one bet: who it is for, the one thing it says, the\n * customer evidence behind it and how it says it. An insight (src/content/insights/<id>.md) is\n * one customer truth, a quote with its source. `checkIdeas` is the judgment the agent used to\n * carry in prose: is each idea backed by something a customer said, does it claim only what the\n * Knowledge holds, is it a different ad from the others, does it fill a gap. Pure.\n */\nimport { staticFormatPatternSchema } from \"@baker/api\";\nimport { AD_PLATFORMS } from \"@baker/canvas-contract\";\nimport { parse as parseYaml, YAMLParseError } from \"yaml\";\nimport { ruleTells } from \"../../engine/copy-tells/rule-tells.ts\";\nimport type { CreativeRule } from \"../../engine/creative-rules/schema.ts\";\n\n/** How an idea persuades, in the ads library's own angle vocabulary, so ours and theirs compare. */\nexport const IDEA_ANGLES = [\n \"pain_relief\",\n \"aspiration\",\n \"status\",\n \"fear\",\n \"FOMO\",\n \"identity\",\n \"contrarian\",\n \"education\",\n \"novelty\",\n \"authority\",\n \"community\",\n \"transformation\",\n \"convenience\",\n \"save_money\",\n \"save_time\",\n \"save_effort\",\n \"named_enemy\",\n \"objection_crusher\",\n \"villain_democratization\",\n \"commiseration\",\n \"recognition_mirror\",\n \"flipped_idiom\",\n] as const;\n\n/** Video formats an idea may take; every other format is a static container from the library. */\nexport const IDEA_VIDEO_FORMATS = [\n \"video_ugc\",\n \"video_founder\",\n \"video_testimonial\",\n \"video_demo\",\n \"video_screen_recording\",\n \"video_explainer\",\n \"video_motion_graphics\",\n] as const;\n\nexport const IDEA_FORMATS: readonly string[] = [...staticFormatPatternSchema.options, ...IDEA_VIDEO_FORMATS];\n\nexport const AWARENESS_STAGES = [\"unaware\", \"problem_aware\", \"solution_aware\", \"product_aware\", \"most_aware\"] as const;\nexport type AwarenessStage = (typeof AWARENESS_STAGES)[number];\n\nexport const EVIDENCE_LEVELS = [\"observed\", \"interpreted\", \"hypothesized\", \"generated\"] as const;\nexport type EvidenceLevel = (typeof EVIDENCE_LEVELS)[number];\n\nexport const IDEA_STATUSES = [\"idea\", \"built\", \"testing\", \"winner\", \"failed\", \"inconclusive\", \"retired\"] as const;\nexport type IdeaStatus = (typeof IDEA_STATUSES)[number];\n\nexport type Insight = {\n id: string;\n type: string;\n quote: string;\n source: string;\n status: EvidenceLevel;\n sourceKind?: string;\n force?: string;\n persona?: string;\n /** Who said it, as the research wrote it (\"A 5★ Trustpilot review by Lena Fischer.\"). */\n author?: string;\n};\n\nexport type Idea = {\n id: string;\n who: string;\n message: string;\n evidence: string[];\n awareness: AwarenessStage;\n angle: string;\n /**\n * What the scroller sees in the first second that makes the message land (\"before/after split:\n * a tangle of 16 platform logos, then one API key\"). The proven ad is searched by it, in any category.\n */\n shows?: string;\n /** The container: a video style (built from beats), or a static one the idea insists on. Absent: the proven ad's. */\n format?: string;\n job: \"opener\" | \"closer\";\n why: string;\n status: IdeaStatus;\n /** The store product the ad sells (its handle or id): the store's own prices for it are a source. */\n product?: string;\n /** Where its ads run, main platform first (`AD_PLATFORMS`): the sizes they are made in. Absent: not said yet. */\n platforms?: string[];\n};\n\n/** A store product as the claim check reads it: what the store says about it, or why it could not be read. */\nexport type StoreProductRead = { record: string } | { error: string };\n\nconst FRONTMATTER = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/;\n\n/** A markdown file's frontmatter as an object, or null when it has none or it does not parse. */\nexport function frontmatterOf(markdown: string): Record<string, unknown> | null {\n const block = FRONTMATTER.exec(markdown)?.[1];\n if (block === undefined) return null;\n try {\n const parsed: unknown = parseYaml(block);\n return parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Why a file's frontmatter does not parse, naming the line, or null when it parses (or has none).\n * Dev, Oct 2026: an unquoted `why: \"a minefield\" with quotes` read as every field missing. Pure.\n */\nexport function frontmatterError(markdown: string): string | null {\n const block = FRONTMATTER.exec(markdown)?.[1];\n if (block === undefined) return null;\n try {\n parseYaml(block);\n return null;\n } catch (e) {\n const line = e instanceof YAMLParseError ? e.linePos?.[0]?.line : undefined;\n const at = line ? ` at line ${line} (\\`${block.split(/\\r?\\n/)[line - 1]?.trim() ?? \"\"}\\`)` : \"\";\n return `the frontmatter is not valid YAML${at}: put each text value wholly in double quotes, with any quote inside it as \\\\\" or as single quotes`;\n }\n}\n\nfunction text(value: unknown): string | undefined {\n if (typeof value === \"string\") return value.trim() || undefined;\n if (typeof value === \"number\") return String(value);\n return undefined;\n}\n\nfunction oneOf<T extends string>(values: readonly T[], value: unknown): T | undefined {\n return typeof value === \"string\" && (values as readonly string[]).includes(value) ? (value as T) : undefined;\n}\n\n/** A source a reader can open: a link, or a library entry (`testimonials:t1`). */\nconst CHECKABLE_SOURCE = /^(?:https?:\\/\\/\\S+|[a-z_]+:[\\w-]+)$/i;\n\n/**\n * How strong an insight really is: one filed as observed is read as interpreted when its source\n * cannot be checked. Audited live Oct 2026: article lines, sourced \"an article (referenced in …)\",\n * filed as what customers said. A quote that is a statistic about people rather than someone's\n * words is the other half of that audit, and a reading of the words: `ideas-judgments.ts`.\n */\nfunction evidenceStatus(stated: EvidenceLevel, source: string): EvidenceLevel {\n if (stated !== \"observed\") return stated;\n return CHECKABLE_SOURCE.test(source) ? \"observed\" : \"interpreted\";\n}\n\n/** One customer truth, or null when it carries no quote or source to stand on. */\nexport function parseInsight(id: string, markdown: string): Insight | null {\n const fm = frontmatterOf(markdown);\n const quote = text(fm?.quote);\n const source = text(fm?.source);\n if (!fm || !quote || !source) return null;\n const force = text(fm.force);\n const persona = text(fm.persona);\n const sourceKind = text(fm.sourceKind);\n const author = markdown\n .replace(/^---[\\s\\S]*?\\n---/, \"\")\n .match(/\\bby ([\\p{Lu}][\\p{L}'’-]*\\.?(?: [\\p{Lu}][\\p{L}'’-]*\\.?)?)/u)?.[1]\n // The sentence's full stop, never an initial's (\"Marta G.\").\n ?.replace(/(\\p{L}{2,})\\.$/u, \"$1\");\n return {\n id,\n type: text(fm.type) ?? \"other\",\n quote,\n source,\n status: evidenceStatus(oneOf(EVIDENCE_LEVELS, fm.status) ?? \"observed\", source),\n ...(sourceKind ? { sourceKind } : {}),\n ...(force ? { force } : {}),\n ...(persona ? { persona } : {}),\n ...(author ? { author } : {}),\n };\n}\n\nfunction evidenceList(value: unknown): string[] {\n if (Array.isArray(value)) return value.flatMap((e) => (text(e) ? [String(text(e))] : []));\n const single = text(value);\n return single ? [single] : [];\n}\n\ntype IdeaFields = {\n who?: string;\n message?: string;\n why?: string;\n angle?: string;\n shows?: string;\n format?: string;\n awareness?: AwarenessStage;\n /** The awareness as written, to quote back when it is not a stage. */\n awarenessWritten?: string;\n /** The platforms as written; absent when the idea names none (never a problem). */\n platforms?: string[];\n};\n\nfunction fieldProblems(f: IdeaFields): string[] {\n const problems: string[] = [];\n if (!f.who) problems.push(\"who is missing: the persona it is for\");\n if (!f.message)\n problems.push(\n \"message is missing: the one promise a stranger should get, what is offered and what changes for them\",\n );\n if (!f.why) problems.push(\"why is missing: the brief finding it answers\");\n if (!f.awareness) {\n const written = f.awarenessWritten ? `\"${f.awarenessWritten}\" ` : \"\";\n problems.push(`awareness ${written}must be one of ${AWARENESS_STAGES.join(\", \")}`);\n }\n if (!(f.angle && (IDEA_ANGLES as readonly string[]).includes(f.angle)))\n problems.push(`angle ${f.angle ? `\"${f.angle}\" ` : \"\"}must be one of ${IDEA_ANGLES.join(\", \")}`);\n if (f.format && !IDEA_FORMATS.includes(f.format))\n problems.push(`format \"${f.format}\" must be one of ${IDEA_FORMATS.join(\", \")}`);\n if (!f.format && !f.shows)\n problems.push(\n \"shows is missing: what the scroller sees in the first second that makes the message land (a before/after, a reaction, the product doing it, a real review, the pain itself); the proven ad is searched by it\",\n );\n return [...problems, ...platformProblems(f.platforms)];\n}\n\n/** A platform the catalog does not know, named with the ones it does; none named is no problem. */\nfunction platformProblems(platforms: readonly string[] | undefined): string[] {\n const unknown = (platforms ?? []).filter((p) => !(AD_PLATFORMS as readonly string[]).includes(p));\n return unknown.length > 0\n ? [`platforms ${unknown.map((p) => `\"${p}\"`).join(\", \")} must be among ${AD_PLATFORMS.join(\", \")}`]\n : [];\n}\n\n/** The platforms an idea names, as written (a single name read as a list of one). */\nfunction platformList(value: unknown): string[] | undefined {\n const list = (Array.isArray(value) ? value : value === undefined || value === null ? [] : [value])\n .map((v) => text(v))\n .filter((v): v is string => v !== undefined);\n return list.length > 0 ? list : undefined;\n}\n\n/** One idea file, or every problem that keeps it from being one. */\nexport function parseIdea(id: string, markdown: string): { idea?: Idea; problems: string[] } {\n const unparsable = frontmatterError(markdown);\n if (unparsable) return { problems: [unparsable] };\n const fm = frontmatterOf(markdown) ?? {};\n const f: IdeaFields = {\n who: text(fm.who),\n message: text(fm.message),\n why: text(fm.why),\n angle: text(fm.angle),\n shows: text(fm.shows),\n format: text(fm.format),\n awareness: oneOf(AWARENESS_STAGES, fm.awareness),\n awarenessWritten: text(fm.awareness),\n platforms: platformList(fm.platforms),\n };\n const problems = fieldProblems(f);\n const { who, message, why, angle, shows, format, awareness } = f;\n if (problems.length > 0 || !who || !message || !why || !awareness || !angle) return { problems };\n const product = text(fm.product);\n return {\n idea: {\n id,\n who,\n message,\n evidence: evidenceList(fm.evidence),\n awareness,\n angle,\n ...(shows ? { shows } : {}),\n ...(format ? { format } : {}),\n job: fm.job === \"closer\" ? \"closer\" : \"opener\",\n why,\n status: oneOf(IDEA_STATUSES, fm.status) ?? \"idea\",\n ...(product ? { product } : {}),\n ...(f.platforms ? { platforms: f.platforms } : {}),\n },\n problems,\n };\n}\n\nexport type IdeaCheck = {\n id: string;\n status: IdeaStatus;\n message: string;\n /** The strongest evidence behind it; `explore` when no insight backs it. */\n evidence: EvidenceLevel | \"explore\";\n /** The customer's own words it stands on, when it has some. */\n quote?: string;\n awareness: AwarenessStage;\n angle: string;\n /** What the scroller sees first, when the idea says. */\n shows?: string;\n /** The container, when the idea names one; absent: the proven ad's. */\n format?: string;\n /** Where its ads run, main platform first; absent when the idea names nowhere. */\n platforms?: string[];\n /** Blocks building it until fixed. */\n problems: string[];\n /** Worth fixing; never blocks. */\n warnings: string[];\n /** What it adds that the live ads do not have. */\n gaps: string[];\n score: number;\n};\n\nexport type CheckIdeasInput = {\n ideas: readonly Idea[];\n insights: readonly Insight[];\n /** Everything the company's documents say (COMPANY.md, the Knowledge): the claims an ad may make. */\n knowledge: string;\n /** Persona entry ids in the Knowledge; empty when there are none to check against. */\n personas: readonly string[];\n /** Awareness stages the company's live or built ads already speak to. */\n coveredAwareness: readonly string[];\n /** How many live or built ideas close (`job: closer`). */\n closersLive: number;\n /** Whether two messages say the same thing (`ideas-judgments.ts`); the same words, without it. */\n sameMessage?: SameMessage;\n /** The store products the ideas name, by the reference each idea wrote (`storeProductReads`). */\n products?: ReadonlyMap<string, StoreProductRead>;\n /** The company's rules for its ads: a message that breaks a wording rule is not an idea to build. */\n rules?: readonly CreativeRule[];\n /** The language the ideas' messages are in (the company's market's), for the wording rules. */\n language?: string;\n};\n\nconst EVIDENCE_WEIGHT: Record<EvidenceLevel | \"explore\", number> = {\n observed: 3,\n interpreted: 2,\n hypothesized: 1,\n generated: 0,\n explore: 0,\n};\n\nconst LIVE_STATUSES: readonly IdeaStatus[] = [\"built\", \"testing\", \"winner\"];\n\n/** Numbers, percentages and prices a message states: each must be found in what the company wrote. */\nfunction claimsOf(message: string): string[] {\n return [...message.matchAll(/\\d[\\d.,]*\\s?(?:%|€|\\$|£|x\\b|k\\b)?/gi)].map((m) => m[0].trim());\n}\n\n/** A figure as written anywhere, separators dropped: \"4.990 €\", \"4990€\" and \"4,990\" are one number. */\nfunction figureOf(claim: string): string {\n return claim.replace(/[^\\d]/g, \"\");\n}\n\n/** Every whole number a text states, so \"4\" is never found inside \"4.990\". Pure. */\nexport function figuresIn(text: string): Set<string> {\n return new Set([...text.matchAll(/\\d(?:[\\d.,]*\\d)?/g)].map((m) => figureOf(m[0])));\n}\n\nfunction normalize(value: string): string {\n return value.toLowerCase().replace(/\\s+/g, \" \").trim();\n}\n\n/** What an idea's picture is: the container it insists on, else what it shows. */\nfunction pictureOf(idea: Idea): string {\n return idea.format ?? normalize(idea.shows ?? \"\");\n}\n\nfunction sentencesOf(message: string): number {\n return message.split(/[.!?]+(?:\\s|$)/).filter((s) => s.trim().length > 0).length;\n}\n\ntype CheckContext = {\n insights: ReadonlyMap<string, Insight>;\n corpusFigures: ReadonlySet<string>;\n covered: ReadonlySet<string>;\n duplicateOf: ReadonlyMap<string, string>;\n personas: readonly string[];\n closersLive: number;\n failed: readonly Idea[];\n sameMessage: SameMessage;\n products: ReadonlyMap<string, StoreProductRead>;\n rules: readonly CreativeRule[];\n language: string | undefined;\n};\n\n/** Whether two ad messages say the same thing, however reworded. */\nexport type SameMessage = (a: string, b: string) => boolean;\n\n/** Without a reading of the words, only the same message written the same way is one. Pure. */\nexport const SAME_WORDS: SameMessage = (a, b) => normalize(a) === normalize(b);\n\n/** A failed idea this one repeats: the same message (reworded or not), or the same angle in the same picture. */\nfunction repeatedFailure(idea: Idea, failed: readonly Idea[], sameMessage: SameMessage): string[] {\n const lost = failed.find(\n (f) =>\n f.id !== idea.id &&\n (sameMessage(f.message, idea.message) || (f.angle === idea.angle && pictureOf(f) === pictureOf(idea))),\n );\n return lost\n ? [`says what \"${lost.id}\" said, and that idea failed in the account: change the message, not just the picture`]\n : [];\n}\n\n/** The insight on file whose id and quote share the most words with `id`, an id written from memory. */\nfunction likelyMeant(id: string, insights: ReadonlyMap<string, Insight>): string | undefined {\n const words = (text: string) =>\n new Set(\n text\n .toLowerCase()\n .split(/[^\\p{L}\\p{N}]+/u)\n .filter((w) => w.length >= 3),\n );\n const wanted = words(id);\n let best: { id: string; shared: number } | undefined;\n for (const insight of insights.values()) {\n const said = words(`${insight.id} ${insight.quote}`);\n const shared = [...wanted].filter((w) => said.has(w)).length;\n if (shared > 0 && shared > (best?.shared ?? 0)) best = { id: insight.id, shared };\n }\n return best?.id;\n}\n\nfunction backingOf(idea: Idea, insights: ReadonlyMap<string, Insight>, problems: string[]) {\n const backing = idea.evidence.flatMap((id) => {\n const insight = insights.get(id);\n if (!insight) {\n const meant = likelyMeant(id, insights);\n problems.push(\n `evidence \"${id}\" is not in src/content/insights/: ${meant ? `did you mean \"${meant}\"? ` : \"\"}name an insight on file by its id, or leave it out`,\n );\n }\n return insight ? [insight] : [];\n });\n return [...backing].sort((a, b) => EVIDENCE_WEIGHT[b.status] - EVIDENCE_WEIGHT[a.status])[0];\n}\n\n/** The figures a text claims that nothing the company wrote holds. Pure. */\nexport function unsourcedClaims(text: string, corpusFigures: ReadonlySet<string>): string[] {\n return claimsOf(text).filter((claim) => {\n const figure = figureOf(claim);\n return figure !== \"\" && !corpusFigures.has(figure);\n });\n}\n\n/**\n * The idea's figures nothing holds, its store product's own prices counted as a source. A product\n * that could not be read is reported beside the figures, so one rewrite fixes both.\n */\nfunction productProblems(idea: Idea, ctx: CheckContext): string[] {\n const read = idea.product ? ctx.products.get(idea.product) : undefined;\n const unread =\n idea.product && (!read || \"error\" in read)\n ? [\n `product \"${idea.product}\" is not a product of the connected store${read && \"error\" in read ? ` (${read.error})` : \"\"}: name it by the handle \\`baker shopify products --search\\` gives, or remove product`,\n ]\n : [];\n const figures =\n read && \"record\" in read ? new Set([...ctx.corpusFigures, ...figuresIn(read.record)]) : ctx.corpusFigures;\n return [...unread, ...claimProblems(idea.message, { ...ctx, corpusFigures: figures })];\n}\n\n/**\n * Why an insight that states a figure cannot stand behind it as our claim, in words the agent can act\n * on. Review, Oct 2026: a figure held by an insight read as interpreted only for its unlinked source\n * was said to be in no quote at all, and the agent searched for what it already had. Pure.\n */\nfunction whyNotBacking(insight: Insight): string {\n const named = `the insight \"${insight.id}\"`;\n if (fromMarket(insight))\n return `${named}, what someone in the market said, not our customer: it is never our claim; drop it`;\n if (insight.status === \"hypothesized\" || insight.status === \"generated\")\n return `${named}, a ${insight.status} reading, not a customer's words: source it or drop it`;\n if (!CHECKABLE_SOURCE.test(insight.source))\n return `${named}, which cites no link a reader can open (its source: \"${insight.source}\"): give it its link, or drop the figure`;\n return `${named}, a statistic about people rather than a customer's words: it cannot stand behind our claim; drop it`;\n}\n\nfunction claimProblems(message: string, ctx: Pick<CheckContext, \"corpusFigures\" | \"insights\">): string[] {\n return unsourcedClaims(message, ctx.corpusFigures).map((claim) => {\n const figure = figureOf(claim);\n const holder = [...ctx.insights.values()].find((insight) => figuresIn(insight.quote).has(figure));\n return holder\n ? `\"${claim}\" is in ${whyNotBacking(holder)}`\n : `\"${claim}\" is in no customer quote, COMPANY.md, Knowledge entry or store product the idea names: if it is a store product's price, name the product in the idea's \\`product\\` (its handle); otherwise drop it, or ask the user and record it in the Knowledge once they confirm it, citing them; never write it into the Knowledge or COMPANY.md yourself to pass this check`;\n });\n}\n\n/** Where people in the market speak, as opposed to our own customers (reviews, testimonials, calls…). */\nexport const MARKET_SOURCES: readonly string[] = [\"reddit\", \"forum\", \"web\"];\nconst TESTIMONIAL_FORMATS = [\"review_screenshot\", \"testimonial_quote\", \"video_testimonial\"];\n\nfunction fromMarket(insight: Insight | undefined): boolean {\n return insight?.sourceKind !== undefined && MARKET_SOURCES.includes(insight.sourceKind);\n}\n\n/** An insight whose figures may stand behind our claim: our own customer's words, as written. */\nexport function sourcesClaims(insight: Insight): boolean {\n return insight.status === \"observed\" && !fromMarket(insight);\n}\n\n/** A cited result someone in the market reported, which an ad could pass off as ours. */\nfunction borrowedProof(idea: Idea, insights: ReadonlyMap<string, Insight>): string | undefined {\n return idea.evidence.find((id) => {\n const insight = insights.get(id);\n return fromMarket(insight) && insight?.type === \"proof\";\n });\n}\n\n/** A review or testimonial format with no quote from our own customers: it could only be a fake review. */\nfunction fakeReviewProblem(idea: Idea, insights: ReadonlyMap<string, Insight>): string[] {\n if (!idea.format || !TESTIMONIAL_FORMATS.includes(idea.format)) return [];\n const cited = idea.evidence.flatMap((id) => insights.get(id) ?? []);\n if (cited.length === 0 || !cited.every(fromMarket)) return [];\n return [\n `${idea.format} needs a quote from our own customer (a review, testimonial, call or survey); every one cited was said by someone in the market. Pick another format, or cite our own customer`,\n ];\n}\n\nfunction warningsOf(\n idea: Idea,\n evidence: EvidenceLevel | \"explore\",\n personas: readonly string[],\n insights: ReadonlyMap<string, Insight>,\n): string[] {\n const warnings: string[] = [];\n const video = (IDEA_VIDEO_FORMATS as readonly string[]).includes(idea.format ?? \"\");\n if (idea.status === \"idea\" && !video && !idea.shows)\n warnings.push(\n \"say what it shows (`shows`): what the scroller sees in the first second that lands the message; the proven ad is searched by it, and without it by what the company sells\",\n );\n const borrowed = borrowedProof(idea, insights);\n if (borrowed) {\n warnings.push(\n `\"${borrowed}\" was said by someone in the market, not a customer of ours: use their words for the problem, never show it as our review, testimonial or result`,\n );\n }\n if (sentencesOf(idea.message) > 1 || idea.message.split(/\\s+/).length > 25) {\n warnings.push(\n 'the message says more than one thing: keep one promise that still names what is offered (\"a free roof survey that shows your real saving\", never a slogan like \"the numbers, explained\"), the rest goes to the ad text',\n );\n }\n if (personas.length > 0 && !personas.includes(idea.who)) {\n warnings.push(`who \"${idea.who}\" is not a persona in the Knowledge (${personas.join(\", \")})`);\n }\n if (evidence === \"explore\") {\n warnings.push(\"no customer evidence: an explore bet. `baker research customers` may find some\");\n }\n return warnings;\n}\n\nfunction checkOne(idea: Idea, ctx: CheckContext): IdeaCheck {\n const problems: string[] = [];\n const best = backingOf(idea, ctx.insights, problems);\n const evidence = best?.status ?? \"explore\";\n problems.push(\n ...productProblems(idea, ctx),\n ...fakeReviewProblem(idea, ctx.insights),\n // The message is one line of the ad: a phrase a rule requires may sit in another.\n ...ruleTells([idea.message], ctx.rules, ctx.language)\n .filter((t) => t.kind === \"forbidden\")\n .map((t) => `The message says \"${t.phrase}\": ${t.rule} (${t.strength}) — ${t.text}`),\n );\n const duplicate = ctx.duplicateOf.get(idea.id);\n if (duplicate) {\n problems.push(\n `same angle and the same picture (format or what it shows), or the same message, as \"${duplicate}\": to the platform it is the same ad. Change the angle or what it shows`,\n );\n }\n const gaps: string[] = [];\n if (!ctx.covered.has(idea.awareness)) gaps.push(`no live ad speaks to ${idea.awareness} people`);\n if (idea.job === \"closer\" && ctx.closersLive === 0) gaps.push(\"no live ad closes warm people\");\n return {\n id: idea.id,\n status: idea.status,\n message: idea.message,\n evidence,\n ...(best ? { quote: best.quote } : {}),\n awareness: idea.awareness,\n angle: idea.angle,\n ...(idea.shows ? { shows: idea.shows } : {}),\n ...(idea.format ? { format: idea.format } : {}),\n ...(idea.platforms ? { platforms: idea.platforms } : {}),\n problems,\n warnings: [\n ...warningsOf(idea, evidence, ctx.personas, ctx.insights),\n ...repeatedFailure(idea, ctx.failed, ctx.sameMessage),\n ],\n gaps,\n score: EVIDENCE_WEIGHT[evidence] + gaps.length - (problems.length > 0 ? 10 : 0),\n };\n}\n\n/** Which idea repeats an earlier one: a built idea, then the better-evidenced, then the first written keeps it. */\nfunction duplicatesOf(ideas: readonly Idea[], insights: ReadonlyMap<string, Insight>): Map<string, string> {\n const active = ideas.filter((i) => i.status !== \"retired\" && i.status !== \"failed\");\n const strength = (idea: Idea) =>\n Math.max(0, ...idea.evidence.map((id) => EVIDENCE_WEIGHT[insights.get(id)?.status ?? \"explore\"]));\n const position = new Map(ideas.map((idea, index) => [idea.id, index]));\n const order = [...active].sort(\n (a, b) =>\n Number(LIVE_STATUSES.includes(b.status)) - Number(LIVE_STATUSES.includes(a.status)) ||\n strength(b) - strength(a) ||\n (position.get(a.id) ?? 0) - (position.get(b.id) ?? 0),\n );\n const seenPairs = new Map<string, string>();\n const seenMessages = new Map<string, string>();\n const duplicateOf = new Map<string, string>();\n for (const idea of order) {\n const pair = `${idea.angle}×${pictureOf(idea)}`;\n const message = normalize(idea.message);\n const earlier = seenPairs.get(pair) ?? seenMessages.get(message);\n if (earlier) duplicateOf.set(idea.id, earlier);\n if (!seenPairs.has(pair)) seenPairs.set(pair, idea.id);\n if (!seenMessages.has(message)) seenMessages.set(message, idea.id);\n }\n return duplicateOf;\n}\n\n/**\n * Check and rank every idea. Ideas still to build come first, best first: the strongest customer\n * evidence, then a gap the live ads leave; anything with a problem sinks. Built ideas follow.\n */\nexport function checkIdeas(input: CheckIdeasInput): IdeaCheck[] {\n const insights = new Map(input.insights.map((insight) => [insight.id, insight]));\n // What our own customers said, word for word, can source a claim; a stranger's number or a reading never can.\n const ownQuotes = input.insights.filter(sourcesClaims).map((i) => i.quote);\n const corpusFigures = figuresIn(`${input.knowledge}\\n${ownQuotes.join(\"\\n\")}`);\n const covered = new Set(input.coveredAwareness);\n const duplicateOf = duplicatesOf(input.ideas, insights);\n const checks = input.ideas.map((idea) =>\n checkOne(idea, {\n insights,\n corpusFigures,\n covered,\n duplicateOf,\n personas: input.personas,\n closersLive: input.closersLive,\n failed: input.ideas.filter((i) => i.status === \"failed\"),\n sameMessage: input.sameMessage ?? SAME_WORDS,\n products: input.products ?? new Map(),\n rules: input.rules ?? [],\n language: input.language,\n }),\n );\n\n const toBuild = (c: IdeaCheck) => c.status === \"idea\";\n return checks.sort(\n (a, b) => Number(toBuild(b)) - Number(toBuild(a)) || b.score - a.score || a.id.localeCompare(b.id),\n );\n}\n","/**\n * Where a company's creative rules come from: the brand's own (BRAND.md, through its reading) and\n * the ones a person taught in a chat (`src/content/creative-rules/<slug>.md`, one per file). Each is\n * read as it stands when a call runs; nothing is copied into an ad's files.\n */\nimport { createHash } from \"node:crypto\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport { frontmatterOf } from \"../../commands/creatives/ideas-model.ts\";\nimport type { BrandRule } from \"../brand/brand-rules.ts\";\nimport {\n type CreativeRule,\n Phrases,\n RULE_APPLIES,\n RULE_FOR,\n RULE_KINDS,\n RULE_SOURCE_KINDS,\n RULE_STRENGTHS,\n type RuleCheck,\n} from \"./schema.ts\";\n\n/** Where the learned rules live in a workspace. */\nexport const RULES_DIR = path.join(\"src\", \"content\", \"creative-rules\");\n\nconst optionalText = z.string().trim().min(1).max(2000).optional().catch(undefined);\nconst optionalPhrases = Phrases.optional().catch(undefined);\nconst dateText = z\n .union([z.string(), z.date().transform((d) => d.toISOString().slice(0, 10))])\n .pipe(z.string().trim().min(1))\n .optional()\n .catch(undefined);\n\nconst Frontmatter = z.object({\n strength: z.enum(RULE_STRENGTHS).catch(\"must\"),\n for: z.enum(RULE_FOR).catch(\"ads\"),\n applies: z.enum(RULE_APPLIES).catch(\"any\"),\n scope: z\n .object({\n kinds: z.array(z.enum(RULE_KINDS)).optional().catch(undefined),\n products: optionalPhrases,\n platforms: optionalPhrases,\n language: z.string().trim().min(2).max(10).optional().catch(undefined),\n })\n .catch({}),\n check: z\n .object({\n forbid: optionalPhrases,\n require: optionalPhrases,\n allow: optionalPhrases,\n people: z.literal(\"real\").optional().catch(undefined),\n })\n .optional()\n .catch(undefined),\n source: z\n .object({\n kind: z.enum(RULE_SOURCE_KINDS).catch(\"user\"),\n feedbackId: optionalText,\n runId: optionalText,\n slug: optionalText,\n quote: optionalText,\n date: dateText,\n })\n .catch({ kind: \"user\" }),\n status: z.enum([\"active\", \"retired\"]).catch(\"active\"),\n retiredBy: optionalText,\n});\n\n/** An object with its undefined and empty-list entries left out. Pure. */\nfunction defined<T extends object>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, v]) => v !== undefined && !(Array.isArray(v) && v.length === 0)),\n ) as T;\n}\n\n/** The rule's words (the body's first paragraph) and its why (a `Why:` paragraph). Pure. */\nfunction bodyOf(markdown: string): { text?: string; why?: string } {\n const body = markdown.replace(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/, \"\").trim();\n const paragraphs = body\n .split(/\\r?\\n\\s*\\r?\\n/)\n .map((p) => p.trim())\n .filter(Boolean);\n const why = paragraphs.find((p) => /^(?:why|por qué|porque)\\s*:/i.test(p));\n const text = paragraphs.find((p) => p !== why && !p.startsWith(\"#\"));\n return { ...(text ? { text } : {}), ...(why ? { why: why.replace(/^[^:]+:\\s*/, \"\") } : {}) };\n}\n\n/** A rule file as a rule, read leniently (a hand edit still teaches it); null without words. Pure. */\nexport function parseRuleFile(id: string, markdown: string): CreativeRule | null {\n const { text, why } = bodyOf(markdown);\n if (!text) return null;\n const fm = Frontmatter.parse(frontmatterOf(markdown) ?? {});\n const check = fm.check ? defined<RuleCheck>(fm.check) : undefined;\n return {\n id,\n origin: \"learned\",\n strength: fm.strength,\n ...(fm.for !== \"ads\" ? { for: fm.for } : {}),\n applies: fm.applies,\n scope: defined(fm.scope),\n ...(check && Object.keys(check).length > 0 ? { check } : {}),\n text,\n ...(why ? { why } : {}),\n source: defined(fm.source),\n status: fm.status,\n ...(fm.retiredBy ? { retiredBy: fm.retiredBy } : {}),\n };\n}\n\n/** Every rule file in the workspace, by its slug; none when there is no folder. */\nexport async function readLearnedRules(root: string): Promise<CreativeRule[]> {\n const dir = path.join(root, RULES_DIR);\n const files = (await readdir(dir).catch(() => [] as string[])).filter((f) => f.endsWith(\".md\")).sort();\n const rules = await Promise.all(\n files.map(async (file) =>\n parseRuleFile(file.replace(/\\.md$/, \"\"), await readFile(path.join(dir, file), \"utf8\").catch(() => \"\")),\n ),\n );\n return rules.filter((r): r is CreativeRule => r !== null);\n}\n\n/** A declared rule's id: its words decide it, so the same rule keeps it across readings. Pure. */\nconst declaredId = (text: string) => `brand-${createHash(\"sha256\").update(text.trim()).digest(\"hex\").slice(0, 8)}`;\n\n/**\n * A ban the rule's own words show as both right and wrong, no allowed phrase telling them apart:\n * \"'£640 a year, at 24p a unit', never '£640 a year'\" bans a bare figure, not the words, so code\n * cannot check it (live, Oct 2026: read as banning \"£640 a year\", which the right form says too).\n */\nfunction shownBothWays(text: string, phrase: string, allow: readonly string[] | undefined): boolean {\n const fold = (s: string) => s.normalize(\"NFKD\").replace(/\\p{M}/gu, \"\").toLowerCase();\n const said = fold(text).split(fold(phrase)).length - 1;\n return said > 1 && !(allow ?? []).some((a) => fold(a).includes(fold(phrase)));\n}\n\n/** A bare word of one or two letters (\"IA\", \"DS\"): an acronym a brand bans reads as an ordinary word too. */\nconst BARE_SHORT_WORD = /^\\p{L}{1,2}$/u;\n\n/**\n * The rules the brand's documents state, as creative rules. Code holds only the words a brand bans,\n * never the ones it says to use: a brand document's \"must\" depends on the piece (prod, Oct 2026: its\n * taglines and CTAs fired on 28 of 66 approved ads), and the reviewers weigh those. Pure.\n */\nexport function declaredRules(rules: readonly BrandRule[]): CreativeRule[] {\n return rules.map(({ text, strength, applies, forbid, allow }) => {\n const checked = forbid?.filter((p) => !BARE_SHORT_WORD.test(p.trim()) && !shownBothWays(text, p, allow));\n const check = defined<RuleCheck>({ forbid: checked, ...(checked?.length ? { allow } : {}) });\n return {\n id: declaredId(text),\n origin: \"declared\",\n strength,\n applies,\n scope: {},\n ...(Object.keys(check).length > 0 ? { check } : {}),\n text,\n source: { kind: \"brand\" },\n status: \"active\",\n };\n });\n}\n"],"mappings":";;;;;;;;AAMA,SAAS,SAAS;AAEX,IAAM,iBAAiB,CAAC,SAAS,QAAQ,QAAQ;AAIjD,IAAM,eAAe,CAAC,QAAQ,WAAW,QAAQ,QAAQ,SAAS,SAAS,aAAa,KAAK;AAG7F,IAAM,aAAa,CAAC,UAAU,OAAO;AAGrC,IAAM,WAAW,CAAC,OAAO,YAAY,KAAK;AAwB1C,IAAM,oBAAoB,CAAC,YAAY,QAAQ,gBAAgB,OAAO;AA+B7E,IAAM,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAGxC,IAAM,UAAU,EACpB,MAAM,EAAE,QAAQ,CAAC,EACjB,UAAU,CAAC,SAAS,KAAK,QAAQ,CAAC,MAAO,OAAO,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAE,CAAC;;;ACrDnG,IAAM,OAAO,oBAAI,IAAI;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,SAAS,KAAKA,OAAc,UAA2B;AACrD,QAAM,QAAQA,MAAK,UAAU,MAAM,EAAE,QAAQ,WAAC,UAAM,IAAE,GAAE,EAAE,EAAE,QAAQ,MAAM,IAAI,EAAE,QAAQ,MAAM,IAAI;AAClG,SAAO,WAAW,QAAQ,MAAM,YAAY;AAC9C;AAGA,SAAS,OAAOA,OAAc,UAAmB,QAAQ,OAAiB;AACxE,QAAM,MAAM,KAAKA,OAAM,QAAQ,EAAE,MAAM,iCAAiC,KAAK,CAAC;AAC9E,SAAO,QAAQ,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;AACrD;AAGA,SAAS,UAAUC,SAAgB,UAA4B;AAC7D,SAAO,OAAOA,SAAQ,QAAQ,EAAE,WAAW,KAAK,OAAOA,SAAQ,UAAU,IAAI,EAAE,SAAS;AAC1F;AAGA,SAAS,UAAU,OAA0BA,SAAqC;AAChF,MAAIA,QAAO,WAAW,EAAG,QAAO,CAAC;AACjC,QAAM,KAAe,CAAC;AACtB,WAAS,IAAI,GAAG,IAAIA,QAAO,UAAU,MAAM,QAAQ,KAAK;AACtD,QAAIA,QAAO,MAAM,CAAC,GAAG,MAAM,MAAM,IAAI,CAAC,MAAM,CAAC,EAAG,IAAG,KAAK,CAAC;AAAA,EAC3D;AACA,SAAO;AACT;AAGA,SAAS,UAAU,OAAoD;AACrE,QAAM,UAAU,CAAC,GAAI,MAAM,UAAU,CAAC,GAAI,GAAI,MAAM,SAAS,CAAC,GAAI,GAAI,MAAM,WAAW,CAAC,CAAE;AAC1F,SAAO,QAAQ;AAAA,IAAK,CAAC,GAAG,MACtB,QAAQ,KAAK,CAAC,GAAG,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,KAAK,MAAM,KAAK,GAAG,KAAK,KAAK,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC;AAAA,EACnH;AACF;AAGA,SAAS,aAAa,MAAoB,UAAuC;AAC/E,QAAM,eAAe,KAAK,MAAM;AAChC,MAAI,CAAC,aAAc,QAAO;AAC1B,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,UAAU,CAAC,QAAgB,IAAI,YAAY,EAAE,MAAM,MAAM,EAAE,CAAC;AAClE,SAAO,QAAQ,YAAY,MAAM,QAAQ,QAAQ;AACnD;AAGA,SAAS,YAAY,MAAc,OAA2C,UAAkC;AAC9G,aAAW,UAAU,MAAM,UAAU,CAAC,GAAG;AACvC,UAAM,QAAQ,UAAU,QAAQ,QAAQ;AACxC,UAAM,QAAQ,OAAO,MAAM,UAAU,KAAK;AAC1C,UAAM,WAAW,MAAM,SAAS,CAAC,GAAG,QAAQ,CAAC,MAAM;AACjD,YAAM,QAAQ,OAAO,GAAG,UAAU,KAAK;AACvC,aAAO,UAAU,OAAO,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,QAAQ,MAAM,MAAM,CAAU;AAAA,IACtF,CAAC;AACD,UAAMA,UAAS,OAAO,QAAQ,UAAU,KAAK;AAC7C,UAAM,OAAO,UAAU,OAAOA,OAAM,EAAE;AAAA,MACpC,CAAC,UAAU,CAAC,QAAQ,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,SAAS,QAAQ,QAAQA,QAAO,UAAU,EAAE;AAAA,IACvF;AACA,QAAI,KAAM,QAAO;AAAA,EACnB;AACA,SAAO;AACT;AAGA,SAAS,QAAQ,MAAoB,OAAsC;AACzE,QAAM,QAAQ,KAAK;AACnB,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,WAAW,UAAU,KAAK;AAChC,QAAM,OAAO;AAAA,IACX,MAAM,KAAK;AAAA,IACX,UAAU,KAAK;AAAA,IACf,MAAM,KAAK;AAAA,IACX,GAAI,KAAK,OAAO,QAAQ,EAAE,OAAO,KAAK,OAAO,MAAM,IAAI,CAAC;AAAA,EAC1D;AACA,QAAM,YAAY,MAAM,QAAQ,CAAC,SAAS;AACxC,UAAMA,UAAS,YAAY,MAAM,OAAO,QAAQ;AAChD,WAAOA,UAAS,CAAC,EAAE,GAAG,MAAM,MAAM,aAAsB,QAAAA,SAAQ,KAAK,CAAC,IAAI,CAAC;AAAA,EAC7E,CAAC;AACD,QAAM,WAAW,MAAM,WAAW,CAAC,GAAG,QAAQ,CAAC,aAAa;AAC1D,UAAM,QAAQ,UAAU,UAAU,QAAQ;AAC1C,UAAMA,UAAS,OAAO,UAAU,UAAU,KAAK;AAC/C,UAAM,OAAO,MAAM,KAAK,CAAC,SAAS,UAAU,OAAO,MAAM,UAAU,KAAK,GAAGA,OAAM,EAAE,SAAS,CAAC;AAC7F,WAAO,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,MAAM,WAAoB,QAAQ,SAAS,CAAC;AAAA,EAC7E,CAAC;AACD,SAAO,CAAC,GAAG,WAAW,GAAG,OAAO;AAClC;AAGO,SAAS,UACd,OACA,OACA,UACY;AACZ,SAAO,MACJ,OAAO,CAAC,SAAS,KAAK,aAAa,YAAY,aAAa,MAAM,QAAQ,CAAC,EAC3E,QAAQ,CAAC,SAAS,QAAQ,MAAM,KAAK,CAAC;AAC3C;;;AC3IA,SAAS,SAAS,WAAW,sBAAsB;AAK5C,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,eAAkC,CAAC,GAAG,0BAA0B,SAAS,GAAG,kBAAkB;AAEpG,IAAM,mBAAmB,CAAC,WAAW,iBAAiB,kBAAkB,iBAAiB,YAAY;AAGrG,IAAM,kBAAkB,CAAC,YAAY,eAAe,gBAAgB,WAAW;AAG/E,IAAM,gBAAgB,CAAC,QAAQ,SAAS,WAAW,UAAU,UAAU,gBAAgB,SAAS;AA0CvG,IAAM,cAAc;AAGb,SAAS,cAAc,UAAkD;AAC9E,QAAM,QAAQ,YAAY,KAAK,QAAQ,IAAI,CAAC;AAC5C,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI;AACF,UAAM,SAAkB,UAAU,KAAK;AACvC,WAAO,WAAW,QAAQ,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,IACxE,SACD;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMO,SAAS,iBAAiB,UAAiC;AAChE,QAAM,QAAQ,YAAY,KAAK,QAAQ,IAAI,CAAC;AAC5C,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI;AACF,cAAU,KAAK;AACf,WAAO;AAAA,EACT,SAAS,GAAG;AACV,UAAM,OAAO,aAAa,iBAAiB,EAAE,UAAU,CAAC,GAAG,OAAO;AAClE,UAAM,KAAK,OAAO,YAAY,IAAI,OAAO,MAAM,MAAM,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,KAAK,EAAE,QAAQ;AAC7F,WAAO,oCAAoC,EAAE;AAAA,EAC/C;AACF;AAEA,SAAS,KAAK,OAAoC;AAChD,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,KAAK,KAAK;AACtD,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK;AAClD,SAAO;AACT;AAEA,SAAS,MAAwB,QAAsB,OAA+B;AACpF,SAAO,OAAO,UAAU,YAAa,OAA6B,SAAS,KAAK,IAAK,QAAc;AACrG;AAGA,IAAM,mBAAmB;AAQzB,SAAS,eAAe,QAAuB,QAA+B;AAC5E,MAAI,WAAW,WAAY,QAAO;AAClC,SAAO,iBAAiB,KAAK,MAAM,IAAI,aAAa;AACtD;AAGO,SAAS,aAAa,IAAY,UAAkC;AACzE,QAAM,KAAK,cAAc,QAAQ;AACjC,QAAM,QAAQ,KAAK,IAAI,KAAK;AAC5B,QAAM,SAAS,KAAK,IAAI,MAAM;AAC9B,MAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAQ,QAAO;AACrC,QAAM,QAAQ,KAAK,GAAG,KAAK;AAC3B,QAAM,UAAU,KAAK,GAAG,OAAO;AAC/B,QAAM,aAAa,KAAK,GAAG,UAAU;AACrC,QAAM,SAAS,SACZ,QAAQ,qBAAqB,EAAE,EAC/B,MAAM,4DAA4D,IAAI,CAAC,GAEtE,QAAQ,WAAC,oBAAe,GAAC,GAAE,IAAI;AACnC,SAAO;AAAA,IACL;AAAA,IACA,MAAM,KAAK,GAAG,IAAI,KAAK;AAAA,IACvB;AAAA,IACA;AAAA,IACA,QAAQ,eAAe,MAAM,iBAAiB,GAAG,MAAM,KAAK,YAAY,MAAM;AAAA,IAC9E,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,IACnC,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC7B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EAC7B;AACF;AAEA,SAAS,aAAa,OAA0B;AAC9C,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,QAAQ,CAAC,MAAO,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAE;AACxF,QAAM,SAAS,KAAK,KAAK;AACzB,SAAO,SAAS,CAAC,MAAM,IAAI,CAAC;AAC9B;AAgBA,SAAS,cAAc,GAAyB;AAC9C,QAAM,WAAqB,CAAC;AAC5B,MAAI,CAAC,EAAE,IAAK,UAAS,KAAK,uCAAuC;AACjE,MAAI,CAAC,EAAE;AACL,aAAS;AAAA,MACP;AAAA,IACF;AACF,MAAI,CAAC,EAAE,IAAK,UAAS,KAAK,8CAA8C;AACxE,MAAI,CAAC,EAAE,WAAW;AAChB,UAAM,UAAU,EAAE,mBAAmB,IAAI,EAAE,gBAAgB,OAAO;AAClE,aAAS,KAAK,aAAa,OAAO,kBAAkB,iBAAiB,KAAK,IAAI,CAAC,EAAE;AAAA,EACnF;AACA,MAAI,EAAE,EAAE,SAAU,YAAkC,SAAS,EAAE,KAAK;AAClE,aAAS,KAAK,SAAS,EAAE,QAAQ,IAAI,EAAE,KAAK,OAAO,EAAE,kBAAkB,YAAY,KAAK,IAAI,CAAC,EAAE;AACjG,MAAI,EAAE,UAAU,CAAC,aAAa,SAAS,EAAE,MAAM;AAC7C,aAAS,KAAK,WAAW,EAAE,MAAM,oBAAoB,aAAa,KAAK,IAAI,CAAC,EAAE;AAChF,MAAI,CAAC,EAAE,UAAU,CAAC,EAAE;AAClB,aAAS;AAAA,MACP;AAAA,IACF;AACF,SAAO,CAAC,GAAG,UAAU,GAAG,iBAAiB,EAAE,SAAS,CAAC;AACvD;AAGA,SAAS,iBAAiB,WAAoD;AAC5E,QAAM,WAAW,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,CAAE,aAAmC,SAAS,CAAC,CAAC;AAChG,SAAO,QAAQ,SAAS,IACpB,CAAC,aAAa,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,kBAAkB,aAAa,KAAK,IAAI,CAAC,EAAE,IAChG,CAAC;AACP;AAGA,SAAS,aAAa,OAAsC;AAC1D,QAAM,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,UAAU,UAAa,UAAU,OAAO,CAAC,IAAI,CAAC,KAAK,GAC7F,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAClB,OAAO,CAAC,MAAmB,MAAM,MAAS;AAC7C,SAAO,KAAK,SAAS,IAAI,OAAO;AAClC;AAGO,SAAS,UAAU,IAAY,UAAuD;AAC3F,QAAM,aAAa,iBAAiB,QAAQ;AAC5C,MAAI,WAAY,QAAO,EAAE,UAAU,CAAC,UAAU,EAAE;AAChD,QAAM,KAAK,cAAc,QAAQ,KAAK,CAAC;AACvC,QAAM,IAAgB;AAAA,IACpB,KAAK,KAAK,GAAG,GAAG;AAAA,IAChB,SAAS,KAAK,GAAG,OAAO;AAAA,IACxB,KAAK,KAAK,GAAG,GAAG;AAAA,IAChB,OAAO,KAAK,GAAG,KAAK;AAAA,IACpB,OAAO,KAAK,GAAG,KAAK;AAAA,IACpB,QAAQ,KAAK,GAAG,MAAM;AAAA,IACtB,WAAW,MAAM,kBAAkB,GAAG,SAAS;AAAA,IAC/C,kBAAkB,KAAK,GAAG,SAAS;AAAA,IACnC,WAAW,aAAa,GAAG,SAAS;AAAA,EACtC;AACA,QAAM,WAAW,cAAc,CAAC;AAChC,QAAM,EAAE,KAAK,SAAS,KAAK,OAAO,OAAO,QAAQ,UAAU,IAAI;AAC/D,MAAI,SAAS,SAAS,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,MAAO,QAAO,EAAE,SAAS;AAC/F,QAAM,UAAU,KAAK,GAAG,OAAO;AAC/B,SAAO;AAAA,IACL,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,aAAa,GAAG,QAAQ;AAAA,MAClC;AAAA,MACA;AAAA,MACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MACzB,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MAC3B,KAAK,GAAG,QAAQ,WAAW,WAAW;AAAA,MACtC;AAAA,MACA,QAAQ,MAAM,eAAe,GAAG,MAAM,KAAK;AAAA,MAC3C,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC7B,GAAI,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC;AAAA,IAClD;AAAA,IACA;AAAA,EACF;AACF;AAgDA,IAAM,kBAA6D;AAAA,EACjE,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAAA,EACd,WAAW;AAAA,EACX,SAAS;AACX;AAEA,IAAM,gBAAuC,CAAC,SAAS,WAAW,QAAQ;AAG1E,SAAS,SAAS,SAA2B;AAC3C,SAAO,CAAC,GAAG,QAAQ,SAAS,qCAAqC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC;AAC5F;AAGA,SAAS,SAAS,OAAuB;AACvC,SAAO,MAAM,QAAQ,UAAU,EAAE;AACnC;AAGO,SAAS,UAAUC,OAA2B;AACnD,SAAO,IAAI,IAAI,CAAC,GAAGA,MAAK,SAAS,mBAAmB,CAAC,EAAE,IAAI,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;AACnF;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO,MAAM,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACvD;AAGA,SAAS,UAAU,MAAoB;AACrC,SAAO,KAAK,UAAU,UAAU,KAAK,SAAS,EAAE;AAClD;AAEA,SAAS,YAAY,SAAyB;AAC5C,SAAO,QAAQ,MAAM,gBAAgB,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE;AAC5E;AAoBO,IAAM,aAA0B,CAAC,GAAG,MAAM,UAAU,CAAC,MAAM,UAAU,CAAC;AAG7E,SAAS,gBAAgB,MAAY,QAAyB,aAAoC;AAChG,QAAM,OAAO,OAAO;AAAA,IAClB,CAAC,MACC,EAAE,OAAO,KAAK,OACb,YAAY,EAAE,SAAS,KAAK,OAAO,KAAM,EAAE,UAAU,KAAK,SAAS,UAAU,CAAC,MAAM,UAAU,IAAI;AAAA,EACvG;AACA,SAAO,OACH,CAAC,cAAc,KAAK,EAAE,uFAAuF,IAC7G,CAAC;AACP;AAGA,SAAS,YAAY,IAAY,UAA4D;AAC3F,QAAM,QAAQ,CAACA,UACb,IAAI;AAAA,IACFA,MACG,YAAY,EACZ,MAAM,iBAAiB,EACvB,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC;AAAA,EAChC;AACF,QAAM,SAAS,MAAM,EAAE;AACvB,MAAI;AACJ,aAAW,WAAW,SAAS,OAAO,GAAG;AACvC,UAAM,OAAO,MAAM,GAAG,QAAQ,EAAE,IAAI,QAAQ,KAAK,EAAE;AACnD,UAAM,SAAS,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,EAAE;AACtD,QAAI,SAAS,KAAK,UAAU,MAAM,UAAU,GAAI,QAAO,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,EAClF;AACA,SAAO,MAAM;AACf;AAEA,SAAS,UAAU,MAAY,UAAwC,UAAoB;AACzF,QAAM,UAAU,KAAK,SAAS,QAAQ,CAAC,OAAO;AAC5C,UAAM,UAAU,SAAS,IAAI,EAAE;AAC/B,QAAI,CAAC,SAAS;AACZ,YAAM,QAAQ,YAAY,IAAI,QAAQ;AACtC,eAAS;AAAA,QACP,aAAa,EAAE,sCAAsC,QAAQ,iBAAiB,KAAK,QAAQ,EAAE;AAAA,MAC/F;AAAA,IACF;AACA,WAAO,UAAU,CAAC,OAAO,IAAI,CAAC;AAAA,EAChC,CAAC;AACD,SAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,gBAAgB,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM,CAAC,EAAE,CAAC;AAC7F;AAGO,SAAS,gBAAgBA,OAAc,eAA8C;AAC1F,SAAO,SAASA,KAAI,EAAE,OAAO,CAAC,UAAU;AACtC,UAAM,SAAS,SAAS,KAAK;AAC7B,WAAO,WAAW,MAAM,CAAC,cAAc,IAAI,MAAM;AAAA,EACnD,CAAC;AACH;AAMA,SAAS,gBAAgB,MAAY,KAA6B;AAChE,QAAM,OAAO,KAAK,UAAU,IAAI,SAAS,IAAI,KAAK,OAAO,IAAI;AAC7D,QAAM,SACJ,KAAK,YAAY,CAAC,QAAQ,WAAW,QACjC;AAAA,IACE,YAAY,KAAK,OAAO,4CAA4C,QAAQ,WAAW,OAAO,KAAK,KAAK,KAAK,MAAM,EAAE;AAAA,EACvH,IACA,CAAC;AACP,QAAM,UACJ,QAAQ,YAAY,OAAO,oBAAI,IAAI,CAAC,GAAG,IAAI,eAAe,GAAG,UAAU,KAAK,MAAM,CAAC,CAAC,IAAI,IAAI;AAC9F,SAAO,CAAC,GAAG,QAAQ,GAAG,cAAc,KAAK,SAAS,EAAE,GAAG,KAAK,eAAe,QAAQ,CAAC,CAAC;AACvF;AAOA,SAAS,cAAc,SAA0B;AAC/C,QAAM,QAAQ,gBAAgB,QAAQ,EAAE;AACxC,MAAI,WAAW,OAAO;AACpB,WAAO,GAAG,KAAK;AACjB,MAAI,QAAQ,WAAW,kBAAkB,QAAQ,WAAW;AAC1D,WAAO,GAAG,KAAK,OAAO,QAAQ,MAAM;AACtC,MAAI,CAAC,iBAAiB,KAAK,QAAQ,MAAM;AACvC,WAAO,GAAG,KAAK,yDAAyD,QAAQ,MAAM;AACxF,SAAO,GAAG,KAAK;AACjB;AAEA,SAAS,cAAc,SAAiB,KAAiE;AACvG,SAAO,gBAAgB,SAAS,IAAI,aAAa,EAAE,IAAI,CAAC,UAAU;AAChE,UAAM,SAAS,SAAS,KAAK;AAC7B,UAAM,SAAS,CAAC,GAAG,IAAI,SAAS,OAAO,CAAC,EAAE,KAAK,CAAC,YAAY,UAAU,QAAQ,KAAK,EAAE,IAAI,MAAM,CAAC;AAChG,WAAO,SACH,IAAI,KAAK,WAAW,cAAc,MAAM,CAAC,KACzC,IAAI,KAAK;AAAA,EACf,CAAC;AACH;AAGO,IAAM,iBAAoC,CAAC,UAAU,SAAS,KAAK;AAC1E,IAAM,sBAAsB,CAAC,qBAAqB,qBAAqB,mBAAmB;AAE1F,SAAS,WAAW,SAAuC;AACzD,SAAO,SAAS,eAAe,UAAa,eAAe,SAAS,QAAQ,UAAU;AACxF;AAGO,SAAS,cAAc,SAA2B;AACvD,SAAO,QAAQ,WAAW,cAAc,CAAC,WAAW,OAAO;AAC7D;AAGA,SAAS,cAAc,MAAY,UAA4D;AAC7F,SAAO,KAAK,SAAS,KAAK,CAAC,OAAO;AAChC,UAAM,UAAU,SAAS,IAAI,EAAE;AAC/B,WAAO,WAAW,OAAO,KAAK,SAAS,SAAS;AAAA,EAClD,CAAC;AACH;AAGA,SAAS,kBAAkB,MAAY,UAAkD;AACvF,MAAI,CAAC,KAAK,UAAU,CAAC,oBAAoB,SAAS,KAAK,MAAM,EAAG,QAAO,CAAC;AACxE,QAAM,QAAQ,KAAK,SAAS,QAAQ,CAAC,OAAO,SAAS,IAAI,EAAE,KAAK,CAAC,CAAC;AAClE,MAAI,MAAM,WAAW,KAAK,CAAC,MAAM,MAAM,UAAU,EAAG,QAAO,CAAC;AAC5D,SAAO;AAAA,IACL,GAAG,KAAK,MAAM;AAAA,EAChB;AACF;AAEA,SAAS,WACP,MACA,UACA,UACA,UACU;AACV,QAAM,WAAqB,CAAC;AAC5B,QAAM,QAAS,mBAAyC,SAAS,KAAK,UAAU,EAAE;AAClF,MAAI,KAAK,WAAW,UAAU,CAAC,SAAS,CAAC,KAAK;AAC5C,aAAS;AAAA,MACP;AAAA,IACF;AACF,QAAM,WAAW,cAAc,MAAM,QAAQ;AAC7C,MAAI,UAAU;AACZ,aAAS;AAAA,MACP,IAAI,QAAQ;AAAA,IACd;AAAA,EACF;AACA,MAAI,YAAY,KAAK,OAAO,IAAI,KAAK,KAAK,QAAQ,MAAM,KAAK,EAAE,SAAS,IAAI;AAC1E,aAAS;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,SAAS,KAAK,CAAC,SAAS,SAAS,KAAK,GAAG,GAAG;AACvD,aAAS,KAAK,QAAQ,KAAK,GAAG,wCAAwC,SAAS,KAAK,IAAI,CAAC,GAAG;AAAA,EAC9F;AACA,MAAI,aAAa,WAAW;AAC1B,aAAS,KAAK,gFAAgF;AAAA,EAChG;AACA,SAAO;AACT;AAEA,SAAS,SAAS,MAAY,KAA8B;AAC1D,QAAM,WAAqB,CAAC;AAC5B,QAAM,OAAO,UAAU,MAAM,IAAI,UAAU,QAAQ;AACnD,QAAM,WAAW,MAAM,UAAU;AACjC,WAAS;AAAA,IACP,GAAG,gBAAgB,MAAM,GAAG;AAAA,IAC5B,GAAG,kBAAkB,MAAM,IAAI,QAAQ;AAAA,IAEvC,GAAG,UAAU,CAAC,KAAK,OAAO,GAAG,IAAI,OAAO,IAAI,QAAQ,EACjD,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW,EACpC,IAAI,CAAC,MAAM,qBAAqB,EAAE,MAAM,MAAM,EAAE,IAAI,KAAK,EAAE,QAAQ,YAAO,EAAE,IAAI,EAAE;AAAA,EACvF;AACA,QAAM,YAAY,IAAI,YAAY,IAAI,KAAK,EAAE;AAC7C,MAAI,WAAW;AACb,aAAS;AAAA,MACP,uFAAuF,SAAS;AAAA,IAClG;AAAA,EACF;AACA,QAAM,OAAiB,CAAC;AACxB,MAAI,CAAC,IAAI,QAAQ,IAAI,KAAK,SAAS,EAAG,MAAK,KAAK,wBAAwB,KAAK,SAAS,SAAS;AAC/F,MAAI,KAAK,QAAQ,YAAY,IAAI,gBAAgB,EAAG,MAAK,KAAK,+BAA+B;AAC7F,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,IACd;AAAA,IACA,GAAI,OAAO,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,IACpC,WAAW,KAAK;AAAA,IAChB,OAAO,KAAK;AAAA,IACZ,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,IAC1C,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,IAC7C,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,IACtD;AAAA,IACA,UAAU;AAAA,MACR,GAAG,WAAW,MAAM,UAAU,IAAI,UAAU,IAAI,QAAQ;AAAA,MACxD,GAAG,gBAAgB,MAAM,IAAI,QAAQ,IAAI,WAAW;AAAA,IACtD;AAAA,IACA;AAAA,IACA,OAAO,gBAAgB,QAAQ,IAAI,KAAK,UAAU,SAAS,SAAS,IAAI,KAAK;AAAA,EAC/E;AACF;AAGA,SAAS,aAAa,OAAwB,UAA6D;AACzG,QAAM,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,WAAW,QAAQ;AAClF,QAAM,WAAW,CAAC,SAChB,KAAK,IAAI,GAAG,GAAG,KAAK,SAAS,IAAI,CAAC,OAAO,gBAAgB,SAAS,IAAI,EAAE,GAAG,UAAU,SAAS,CAAC,CAAC;AAClG,QAAM,WAAW,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,UAAU,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;AACrE,QAAM,QAAQ,CAAC,GAAG,MAAM,EAAE;AAAA,IACxB,CAAC,GAAG,MACF,OAAO,cAAc,SAAS,EAAE,MAAM,CAAC,IAAI,OAAO,cAAc,SAAS,EAAE,MAAM,CAAC,KAClF,SAAS,CAAC,IAAI,SAAS,CAAC,MACvB,SAAS,IAAI,EAAE,EAAE,KAAK,MAAM,SAAS,IAAI,EAAE,EAAE,KAAK;AAAA,EACvD;AACA,QAAM,YAAY,oBAAI,IAAoB;AAC1C,QAAM,eAAe,oBAAI,IAAoB;AAC7C,QAAM,cAAc,oBAAI,IAAoB;AAC5C,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,GAAG,KAAK,KAAK,OAAI,UAAU,IAAI,CAAC;AAC7C,UAAM,UAAU,UAAU,KAAK,OAAO;AACtC,UAAM,UAAU,UAAU,IAAI,IAAI,KAAK,aAAa,IAAI,OAAO;AAC/D,QAAI,QAAS,aAAY,IAAI,KAAK,IAAI,OAAO;AAC7C,QAAI,CAAC,UAAU,IAAI,IAAI,EAAG,WAAU,IAAI,MAAM,KAAK,EAAE;AACrD,QAAI,CAAC,aAAa,IAAI,OAAO,EAAG,cAAa,IAAI,SAAS,KAAK,EAAE;AAAA,EACnE;AACA,SAAO;AACT;AAMO,SAAS,WAAW,OAAqC;AAC9D,QAAM,WAAW,IAAI,IAAI,MAAM,SAAS,IAAI,CAAC,YAAY,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC;AAE/E,QAAM,YAAY,MAAM,SAAS,OAAO,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK;AACzE,QAAM,gBAAgB,UAAU,GAAG,MAAM,SAAS;AAAA,EAAK,UAAU,KAAK,IAAI,CAAC,EAAE;AAC7E,QAAM,UAAU,IAAI,IAAI,MAAM,gBAAgB;AAC9C,QAAM,cAAc,aAAa,MAAM,OAAO,QAAQ;AACtD,QAAM,SAAS,MAAM,MAAM;AAAA,IAAI,CAAC,SAC9B,SAAS,MAAM;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,aAAa,MAAM;AAAA,MACnB,QAAQ,MAAM,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AAAA,MACvD,aAAa,MAAM,eAAe;AAAA,MAClC,UAAU,MAAM,YAAY,oBAAI,IAAI;AAAA,MACpC,OAAO,MAAM,SAAS,CAAC;AAAA,MACvB,UAAU,MAAM;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,CAAC,MAAiB,EAAE,WAAW;AAC/C,SAAO,OAAO;AAAA,IACZ,CAAC,GAAG,MAAM,OAAO,QAAQ,CAAC,CAAC,IAAI,OAAO,QAAQ,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,cAAc,EAAE,EAAE;AAAA,EACnG;AACF;;;ACloBA,SAAS,kBAAkB;AAC3B,SAAS,SAAS,gBAAgB;AAClC,OAAO,UAAU;AACjB,SAAS,KAAAC,UAAS;AAeX,IAAM,YAAY,KAAK,KAAK,OAAO,WAAW,gBAAgB;AAErE,IAAM,eAAeC,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,SAAS,EAAE,MAAM,MAAS;AAClF,IAAM,kBAAkB,QAAQ,SAAS,EAAE,MAAM,MAAS;AAC1D,IAAM,WAAWA,GACd,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,EAC3E,KAAKA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAC7B,SAAS,EACT,MAAM,MAAS;AAElB,IAAM,cAAcA,GAAE,OAAO;AAAA,EAC3B,UAAUA,GAAE,KAAK,cAAc,EAAE,MAAM,MAAM;AAAA,EAC7C,KAAKA,GAAE,KAAK,QAAQ,EAAE,MAAM,KAAK;AAAA,EACjC,SAASA,GAAE,KAAK,YAAY,EAAE,MAAM,KAAK;AAAA,EACzC,OAAOA,GACJ,OAAO;AAAA,IACN,OAAOA,GAAE,MAAMA,GAAE,KAAK,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,MAAS;AAAA,IAC7D,UAAU;AAAA,IACV,WAAW;AAAA,IACX,UAAUA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,MAAS;AAAA,EACvE,CAAC,EACA,MAAM,CAAC,CAAC;AAAA,EACX,OAAOA,GACJ,OAAO;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQA,GAAE,QAAQ,MAAM,EAAE,SAAS,EAAE,MAAM,MAAS;AAAA,EACtD,CAAC,EACA,SAAS,EACT,MAAM,MAAS;AAAA,EAClB,QAAQA,GACL,OAAO;AAAA,IACN,MAAMA,GAAE,KAAK,iBAAiB,EAAE,MAAM,MAAM;AAAA,IAC5C,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,EACR,CAAC,EACA,MAAM,EAAE,MAAM,OAAO,CAAC;AAAA,EACzB,QAAQA,GAAE,KAAK,CAAC,UAAU,SAAS,CAAC,EAAE,MAAM,QAAQ;AAAA,EACpD,WAAW;AACb,CAAC;AAGD,SAAS,QAA0B,OAAa;AAC9C,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,UAAa,EAAE,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE;AAAA,EAClG;AACF;AAGA,SAAS,OAAO,UAAmD;AACjE,QAAM,OAAO,SAAS,QAAQ,mCAAmC,EAAE,EAAE,KAAK;AAC1E,QAAM,aAAa,KAChB,MAAM,eAAe,EACrB,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,QAAM,MAAM,WAAW,KAAK,CAAC,MAAM,+BAA+B,KAAK,CAAC,CAAC;AACzE,QAAMC,QAAO,WAAW,KAAK,CAAC,MAAM,MAAM,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC;AACnE,SAAO,EAAE,GAAIA,QAAO,EAAE,MAAAA,MAAK,IAAI,CAAC,GAAI,GAAI,MAAM,EAAE,KAAK,IAAI,QAAQ,cAAc,EAAE,EAAE,IAAI,CAAC,EAAG;AAC7F;AAGO,SAAS,cAAc,IAAY,UAAuC;AAC/E,QAAM,EAAE,MAAAA,OAAM,IAAI,IAAI,OAAO,QAAQ;AACrC,MAAI,CAACA,MAAM,QAAO;AAClB,QAAM,KAAK,YAAY,MAAM,cAAc,QAAQ,KAAK,CAAC,CAAC;AAC1D,QAAM,QAAQ,GAAG,QAAQ,QAAmB,GAAG,KAAK,IAAI;AACxD,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,UAAU,GAAG;AAAA,IACb,GAAI,GAAG,QAAQ,QAAQ,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC;AAAA,IAC1C,SAAS,GAAG;AAAA,IACZ,OAAO,QAAQ,GAAG,KAAK;AAAA,IACvB,GAAI,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,IAC1D,MAAAA;AAAA,IACA,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC;AAAA,IACrB,QAAQ,QAAQ,GAAG,MAAM;AAAA,IACzB,QAAQ,GAAG;AAAA,IACX,GAAI,GAAG,YAAY,EAAE,WAAW,GAAG,UAAU,IAAI,CAAC;AAAA,EACpD;AACF;AAGA,eAAsB,iBAAiB,MAAuC;AAC5E,QAAM,MAAM,KAAK,KAAK,MAAM,SAAS;AACrC,QAAM,SAAS,MAAM,QAAQ,GAAG,EAAE,MAAM,MAAM,CAAC,CAAa,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,EAAE,KAAK;AACrG,QAAM,QAAQ,MAAM,QAAQ;AAAA,IAC1B,MAAM;AAAA,MAAI,OAAO,SACf,cAAc,KAAK,QAAQ,SAAS,EAAE,GAAG,MAAM,SAAS,KAAK,KAAK,KAAK,IAAI,GAAG,MAAM,EAAE,MAAM,MAAM,EAAE,CAAC;AAAA,IACvG;AAAA,EACF;AACA,SAAO,MAAM,OAAO,CAAC,MAAyB,MAAM,IAAI;AAC1D;AAGA,IAAM,aAAa,CAACA,UAAiB,SAAS,WAAW,QAAQ,EAAE,OAAOA,MAAK,KAAK,CAAC,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;AAOhH,SAAS,cAAcA,OAAcC,SAAgB,OAA+C;AAClG,QAAMC,QAAO,CAAC,MAAc,EAAE,UAAU,MAAM,EAAE,QAAQ,WAAC,UAAM,IAAE,GAAE,EAAE,EAAE,YAAY;AACnF,QAAM,OAAOA,MAAKF,KAAI,EAAE,MAAME,MAAKD,OAAM,CAAC,EAAE,SAAS;AACrD,SAAO,OAAO,KAAK,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,MAAMC,MAAK,CAAC,EAAE,SAASA,MAAKD,OAAM,CAAC,CAAC;AAC9E;AAGA,IAAM,kBAAkB,WAAC,iBAAa,GAAC;AAOhC,SAAS,cAAc,OAA6C;AACzE,SAAO,MAAM,IAAI,CAAC,EAAE,MAAAD,OAAM,UAAU,SAAS,QAAQ,MAAM,MAAM;AAC/D,UAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,CAAC,gBAAgB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,cAAcA,OAAM,GAAG,KAAK,CAAC;AACvG,UAAM,QAAQ,QAAmB,EAAE,QAAQ,SAAS,GAAI,SAAS,SAAS,EAAE,MAAM,IAAI,CAAC,EAAG,CAAC;AAC3F,WAAO;AAAA,MACL,IAAI,WAAWA,KAAI;AAAA,MACnB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,OAAO,CAAC;AAAA,MACR,GAAI,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,MACjD,MAAAA;AAAA,MACA,QAAQ,EAAE,MAAM,QAAQ;AAAA,MACxB,QAAQ;AAAA,IACV;AAAA,EACF,CAAC;AACH;","names":["text","phrase","text","z","z","text","phrase","fold"]}
|
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_SUBSETS,
|
|
3
|
+
FONT_PROVIDERS,
|
|
4
|
+
checkFontRequests,
|
|
5
|
+
fontFileName,
|
|
6
|
+
fontsourceCatalogue,
|
|
7
|
+
fontsourceFamilies,
|
|
8
|
+
googleFontRequests,
|
|
9
|
+
missingFontFiles,
|
|
10
|
+
planFontAdoption,
|
|
11
|
+
renderFontFaceCss,
|
|
12
|
+
resolveBrandFaces,
|
|
13
|
+
resolveFetchStyles,
|
|
14
|
+
resolveFetchSubsets,
|
|
15
|
+
resolveFetchWeights,
|
|
16
|
+
selfHostedStyles,
|
|
17
|
+
selfHostedSubsets,
|
|
18
|
+
selfHostedWeights,
|
|
19
|
+
stripFontFaceBlocks,
|
|
20
|
+
suggestFamilies,
|
|
21
|
+
unresolvedBrandFamilies,
|
|
22
|
+
upsertFontFaceCss
|
|
23
|
+
} from "./chunk-MWJ6BCZJ.js";
|
|
24
|
+
import {
|
|
25
|
+
registerSchema,
|
|
26
|
+
writeJson
|
|
27
|
+
} from "./chunk-CCYZJMZ7.js";
|
|
28
|
+
|
|
29
|
+
// src/commands/brand/fonts.ts
|
|
30
|
+
import { mkdir, readdir, readFile, writeFile } from "fs/promises";
|
|
31
|
+
import path from "path";
|
|
32
|
+
import { defineCommand } from "citty";
|
|
33
|
+
var GLOBAL_CSS = path.join("src", "styles", "global.css");
|
|
34
|
+
var FONTS_DIR = path.join("src", "brand", "fonts");
|
|
35
|
+
var DEFAULT_SUBSETS_LABEL = DEFAULT_SUBSETS.join(",");
|
|
36
|
+
var BROWSER_UA = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/120.0 Safari/537.36";
|
|
37
|
+
registerSchema({
|
|
38
|
+
command: "brand.fonts.check",
|
|
39
|
+
description: "Start here when a brand's fonts are 'confirmed' but nobody verified it. Fails if any --font-* family in src/styles/global.css has nothing loading it (no @font-face, no Google import) \u2014 the silent fallback that also fails the client's verify \u2014 then asks Google Fonts what it ACTUALLY serves for every family/weight the stylesheet requests.",
|
|
40
|
+
args: {}
|
|
41
|
+
});
|
|
42
|
+
registerSchema({
|
|
43
|
+
command: "brand.fonts.adopt",
|
|
44
|
+
description: "Move brand faces a page already self-hosts into src/styles/global.css, so every page loads them rather than only the page that declared them. Use when `check` reports a family as not loaded but its files are already in src/brand/fonts/. Never downloads: re-fetching would hand that page a different build of the same face.",
|
|
45
|
+
args: {}
|
|
46
|
+
});
|
|
47
|
+
registerSchema({
|
|
48
|
+
command: "brand.fonts.fetch",
|
|
49
|
+
description: "Download a font into src/brand/fonts/ so the brand stops depending on a third party at page load, and write its @font-face into src/styles/global.css above @theme. Resolves against Google Fonts first, then Fontsource \u2014 which carries ~2000 open-licence families Google does not, so a name Google 400s is often still fetchable. Idempotent: re-running replaces that family's faces rather than stacking duplicates.",
|
|
50
|
+
args: {
|
|
51
|
+
family: { type: "string", description: 'Font family, e.g. "DM Sans"', required: true },
|
|
52
|
+
weights: {
|
|
53
|
+
type: "string",
|
|
54
|
+
description: "Comma-separated weights (default: the weights global.css already requests or self-hosts, else 400)",
|
|
55
|
+
required: false
|
|
56
|
+
},
|
|
57
|
+
subsets: {
|
|
58
|
+
type: "string",
|
|
59
|
+
description: `Comma-separated unicode subsets (default: the subsets global.css already self-hosts, else ${DEFAULT_SUBSETS_LABEL})`,
|
|
60
|
+
required: false
|
|
61
|
+
},
|
|
62
|
+
italic: {
|
|
63
|
+
type: "boolean",
|
|
64
|
+
description: "Also self-host the family's italic faces. On automatically when global.css already loads one, so a re-fetch never strands it.",
|
|
65
|
+
required: false
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
function fail(code, message, fix) {
|
|
70
|
+
writeJson({ ok: false, error: { code, message, ...fix ? { fix } : {} } });
|
|
71
|
+
process.exit(2);
|
|
72
|
+
}
|
|
73
|
+
var REQUEST_TIMEOUT_MS = 15e3;
|
|
74
|
+
async function fetchJson(url) {
|
|
75
|
+
const res = await fetch(url, {
|
|
76
|
+
headers: { "User-Agent": BROWSER_UA },
|
|
77
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
|
|
78
|
+
});
|
|
79
|
+
if (res.status === 404) return null;
|
|
80
|
+
if (!res.ok) throw new Error(`Fontsource answered ${res.status}`);
|
|
81
|
+
return await res.json();
|
|
82
|
+
}
|
|
83
|
+
async function lookupGoogleCss(url) {
|
|
84
|
+
try {
|
|
85
|
+
const res = await fetch(url, {
|
|
86
|
+
headers: { "User-Agent": BROWSER_UA },
|
|
87
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
|
|
88
|
+
});
|
|
89
|
+
if (res.ok) return { status: "served", css: await res.text() };
|
|
90
|
+
return { status: res.status === 400 ? "absent" : "unreachable" };
|
|
91
|
+
} catch {
|
|
92
|
+
return { status: "unreachable" };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
var fetchGoogleCss = async (url) => {
|
|
96
|
+
const got = await lookupGoogleCss(url);
|
|
97
|
+
return got.status === "served" ? got.css : null;
|
|
98
|
+
};
|
|
99
|
+
var WIRING_HINT = {
|
|
100
|
+
written: (family) => `Wrote the @font-face for "${family}" into ${GLOBAL_CSS}, above @theme. Remove "${family}" from the Google @import if one is still there, so the page stops fetching it at load.`,
|
|
101
|
+
// Told apart from "no stylesheet" on purpose: they used to share one hint, so
|
|
102
|
+
// an idempotent re-run instructed the agent to paste a block that was already
|
|
103
|
+
// in the file, and doing as it was told duplicated the face.
|
|
104
|
+
"already-wired": (family) => `${GLOBAL_CSS} already loads exactly these faces for "${family}" \u2014 nothing to change.`,
|
|
105
|
+
"no-stylesheet": () => `No ${GLOBAL_CSS} to write to \u2014 paste the \`fontFace\` block above the @theme block once the stylesheet exists, or the files just downloaded will never load.`
|
|
106
|
+
};
|
|
107
|
+
var PROVIDER_DEPS = { lookupGoogleCss, fetchJson };
|
|
108
|
+
var PROVIDER_LABEL = { google: "Google Fonts", fontsource: "Fontsource" };
|
|
109
|
+
function italicHints(family, wantedStyles, availableStyles, downloadedStyles, provider) {
|
|
110
|
+
const wanted = wantedStyles.includes("italic");
|
|
111
|
+
const available = availableStyles.includes("italic");
|
|
112
|
+
if (wanted && !downloadedStyles.includes("italic")) {
|
|
113
|
+
return [
|
|
114
|
+
`NO ITALIC: ${PROVIDER_LABEL[provider]} does not ship an italic for "${family}", so none was written. Drop italic from src/brand/BRAND.md, or the browser will slant the upright face instead.`
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
if (!wanted && available) {
|
|
118
|
+
return [
|
|
119
|
+
`${PROVIDER_LABEL[provider]} also ships an italic for "${family}", which was NOT downloaded. If the brand uses italic anywhere, re-run with \`--italic\` \u2014 otherwise the browser slants the upright face, which is not the same shapes.`
|
|
120
|
+
];
|
|
121
|
+
}
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
function fetchHints({
|
|
125
|
+
family,
|
|
126
|
+
downloadedWeights,
|
|
127
|
+
downloadedStyles,
|
|
128
|
+
incomplete,
|
|
129
|
+
wiring,
|
|
130
|
+
provider,
|
|
131
|
+
wantedStyles,
|
|
132
|
+
availableStyles
|
|
133
|
+
}) {
|
|
134
|
+
return [
|
|
135
|
+
WIRING_HINT[wiring](family),
|
|
136
|
+
...italicHints(family, wantedStyles, availableStyles, downloadedStyles, provider),
|
|
137
|
+
`Record the exact weights (${downloadedWeights.join(", ")}) in src/brand/tokens.json and BRAND.md \u2014 a weight tokens.json lists but nothing loads renders as a synthesized fallback, and verify warns about it.`,
|
|
138
|
+
...incomplete.length > 0 ? [
|
|
139
|
+
// The remedy is provider-specific: only a Google family has an @import
|
|
140
|
+
// to fall back on, and telling an agent to keep one for a Fontsource
|
|
141
|
+
// family sends it to write an import Google will 400.
|
|
142
|
+
provider === "google" ? `PARTIAL: ${incomplete.join(", ")} did not download and is NOT in the \`fontFace\` block. Re-run \`baker brand fonts fetch "${family}" --weights ${incomplete.join(",")}\` \u2014 a Google @import cannot cover those weights, because the build drops it before the page loads.` : `PARTIAL: ${incomplete.join(", ")} did not download and is NOT in the \`fontFace\` block. ${PROVIDER_LABEL[provider]} does not serve them, so re-run \`baker brand fonts fetch "${family}" --weights ${downloadedWeights.join(",")}\` and record only those weights in src/brand/BRAND.md.`
|
|
143
|
+
] : [],
|
|
144
|
+
`Licensing: ${PROVIDER_LABEL[provider]} carries open-licensed families. A client's own typeface is licensed for its landings and ads too \u2014 self-host it without asking about rights.`
|
|
145
|
+
];
|
|
146
|
+
}
|
|
147
|
+
async function wireFontFaceIntoStylesheet(css, family, fontFace) {
|
|
148
|
+
if (!css) return "no-stylesheet";
|
|
149
|
+
const wired = upsertFontFaceCss(css, family, fontFace);
|
|
150
|
+
if (wired === css) return "already-wired";
|
|
151
|
+
await writeFile(path.resolve(process.cwd(), GLOBAL_CSS), wired);
|
|
152
|
+
return "written";
|
|
153
|
+
}
|
|
154
|
+
function failResolution(family, weights, outcome) {
|
|
155
|
+
if (outcome.reason === "unreachable") {
|
|
156
|
+
return fail(
|
|
157
|
+
"CATALOGUE_UNREACHABLE",
|
|
158
|
+
`Could not reach ${PROVIDER_LABEL[outcome.provider]} to ask about "${family}".`,
|
|
159
|
+
{
|
|
160
|
+
action: "Run the same command again.",
|
|
161
|
+
explanation: `${PROVIDER_LABEL[outcome.provider]} did not answer, which is not the same as not having the family \u2014 so nothing was concluded from it. Guessing either way would self-host the wrong build, or report a real family as missing.`,
|
|
162
|
+
provider: outcome.provider
|
|
163
|
+
}
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
if (outcome.reason === "ambiguous-subsets") {
|
|
167
|
+
return fail(
|
|
168
|
+
"SUBSET_AMBIGUOUS",
|
|
169
|
+
`${PROVIDER_LABEL[outcome.provider]} serves "${family}" in several subsets but reports no unicode-range to tell them apart.`,
|
|
170
|
+
{
|
|
171
|
+
action: `Retry with a single --subsets value, e.g. --subsets ${outcome.available[0] ?? "latin"}.`,
|
|
172
|
+
explanation: "Two @font-face rules with the same family, style and weight and no unicode-range both claim every character, so the last one silently wins and the other file is downloaded and never read.",
|
|
173
|
+
available: outcome.available
|
|
174
|
+
}
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
if (outcome.reason === "subset") {
|
|
178
|
+
return fail("SUBSET_NOT_SERVED", `${PROVIDER_LABEL[outcome.provider]} has "${family}", but not in that subset.`, {
|
|
179
|
+
action: `Retry with --subsets set to one it serves: ${outcome.available.join(",")}.`,
|
|
180
|
+
explanation: "A family is split into unicode subsets and not every family ships every one. The weights you asked for are fine \u2014 only the subset is wrong.",
|
|
181
|
+
available: outcome.available
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
if (outcome.reason === "weight") {
|
|
185
|
+
return fail(
|
|
186
|
+
"FONT_NOT_SERVED",
|
|
187
|
+
`${PROVIDER_LABEL[outcome.provider]} has "${family}", but not at weight ${weights.join("/")}.`,
|
|
188
|
+
{
|
|
189
|
+
action: `Retry with --weights set to one of these: ${outcome.available.join(",")}.`,
|
|
190
|
+
explanation: "The family exists; the weight you asked for is not one it ships.",
|
|
191
|
+
served: outcome.available
|
|
192
|
+
}
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
return failUnknownFamily(family);
|
|
196
|
+
}
|
|
197
|
+
async function failUnknownFamily(family) {
|
|
198
|
+
const didYouMean = suggestFamilies(family, await fontsourceCatalogue(PROVIDER_DEPS));
|
|
199
|
+
return fail("FONT_NOT_SERVED", `No font catalogue carries a family called "${family}".`, {
|
|
200
|
+
action: didYouMean.length ? `Did you mean one of these? ${didYouMean.join(", ")}. Retry with the exact name, and update the --font-* token in ${GLOBAL_CSS} to match whichever you pick.` : `Check the exact spelling, then retry. If it is a commercial typeface, add the file to ${FONTS_DIR} and write the @font-face by hand \u2014 it cannot be downloaded.`,
|
|
201
|
+
explanation: `Tried ${FONT_PROVIDERS.join(" then ")}. Family names are case- and space-sensitive in every catalogue.`,
|
|
202
|
+
tried: [...FONT_PROVIDERS],
|
|
203
|
+
...didYouMean.length ? { didYouMean } : {}
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
async function listFontFiles() {
|
|
207
|
+
try {
|
|
208
|
+
const entries = await readdir(path.resolve(process.cwd(), FONTS_DIR), { withFileTypes: true });
|
|
209
|
+
return entries.filter((e) => e.isFile()).map((e) => e.name);
|
|
210
|
+
} catch {
|
|
211
|
+
return [];
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async function readGlobalCss() {
|
|
215
|
+
try {
|
|
216
|
+
return await readFile(path.resolve(process.cwd(), GLOBAL_CSS), "utf8");
|
|
217
|
+
} catch {
|
|
218
|
+
return "";
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async function unresolvedAction(css, unresolved) {
|
|
222
|
+
const { plans } = planFontAdoption(await astroSources(), unresolved);
|
|
223
|
+
if (plans.length > 0) {
|
|
224
|
+
const names = plans.map((p) => `"${p.family}"`).join(", ");
|
|
225
|
+
return `Run \`baker brand fonts adopt\` \u2014 ${names} is already self-hosted by ${plans[0]?.files.join(", ")}, so it only needs moving into ${GLOBAL_CSS} to load on every page. Don't fetch it: that downloads a different build of the same face.`;
|
|
226
|
+
}
|
|
227
|
+
const viaFontsource = [...fontsourceFamilies(css)];
|
|
228
|
+
const stranded = unresolved.filter((family) => viaFontsource.includes(family.toLowerCase()));
|
|
229
|
+
if (stranded.length > 0) {
|
|
230
|
+
return `Run \`baker brand fonts fetch "${stranded[0]}"\` to self-host it. Its only provider is an @fontsource import, and that package does not survive a workspace sync \u2014 the import is left pointing at nothing, which fails the build before the font check even runs.`;
|
|
231
|
+
}
|
|
232
|
+
return `Run \`baker brand fonts fetch "${unresolved[0]}"\` to self-host it, which writes the @font-face for you. For a face no catalogue carries, add an @font-face pointing at a file in ${FONTS_DIR}.`;
|
|
233
|
+
}
|
|
234
|
+
var fontsCheckCommand = defineCommand({
|
|
235
|
+
meta: {
|
|
236
|
+
name: "check",
|
|
237
|
+
description: "Verify the brand's fonts really exist. First: every --font-* family in src/styles/global.css must be provided by a local @font-face, or it renders as a fallback on every page \u2014 a Google @import does not provide one here, the build drops it before the page loads. Then, for families still requested from Google, ask Google what it actually serves \u2014 a weight nobody serves is silently synthesized."
|
|
238
|
+
},
|
|
239
|
+
async run() {
|
|
240
|
+
const css = await readGlobalCss();
|
|
241
|
+
const requests = googleFontRequests(css);
|
|
242
|
+
const unresolved = unresolvedBrandFamilies(css);
|
|
243
|
+
if (unresolved.length > 0) {
|
|
244
|
+
fail("FONT_NOT_LOADED", `Nothing loads ${unresolved.map((f) => `"${f}"`).join(", ")} in ${GLOBAL_CSS}.`, {
|
|
245
|
+
action: await unresolvedAction(css, unresolved),
|
|
246
|
+
explanation: "The family is declared as a brand font but no @font-face provides it, so every page silently renders a fallback. A Google @import does not count: Astro merges component CSS ahead of global.css into one inlined <style>, so the import lands after rules and the browser drops it \u2014 measured on a live client site. The client's verify fails on this too.",
|
|
247
|
+
unresolved
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
if (requests.length === 0) {
|
|
251
|
+
writeJson({
|
|
252
|
+
ok: true,
|
|
253
|
+
data: { families: [], selfHosted: true },
|
|
254
|
+
hints: [
|
|
255
|
+
`No Google Fonts requested in ${GLOBAL_CSS}, and every brand face is provided by an @font-face \u2014 nothing to verify against Google.`
|
|
256
|
+
]
|
|
257
|
+
});
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const families = await checkFontRequests(requests, fetchGoogleCss);
|
|
261
|
+
const broken = families.filter((f) => f.missing.length > 0);
|
|
262
|
+
if (broken.length > 0) {
|
|
263
|
+
const summary = broken.map(
|
|
264
|
+
(f) => f.cause === "unknown-family" ? `${f.family} (no such family on Google Fonts \u2014 check the exact spelling)` : `${f.family} ${f.missing.join("/")} (served: ${f.served.join("/") || "none"})`
|
|
265
|
+
).join("; ");
|
|
266
|
+
fail("FONT_NOT_SERVED", `Google Fonts does not serve: ${summary}`, {
|
|
267
|
+
action: `Correct the family name or weight in ${GLOBAL_CSS} and src/brand/BRAND.md, picking from the \`served\` weights below.`,
|
|
268
|
+
explanation: "A requested weight Google does not serve is silently synthesized by the browser, so the page looks subtly wrong with nothing failing.",
|
|
269
|
+
// The per-family breakdown is the point of the command, so it ships on
|
|
270
|
+
// the failure path too — otherwise the only remedy is re-running the
|
|
271
|
+
// command that just failed. Healthy families are included so a
|
|
272
|
+
// multi-family brand shows what NOT to touch.
|
|
273
|
+
families
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
writeJson({
|
|
277
|
+
ok: true,
|
|
278
|
+
data: { families },
|
|
279
|
+
hints: [
|
|
280
|
+
"Every requested family and weight is really served by Google.",
|
|
281
|
+
`To stop depending on Google at page load, run \`baker brand fonts fetch "<family>"\` to self-host into ${FONTS_DIR}.`
|
|
282
|
+
]
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
var fontsFetchCommand = defineCommand({
|
|
287
|
+
meta: {
|
|
288
|
+
name: "fetch",
|
|
289
|
+
description: "Download a font from Google Fonts or Fontsource into src/brand/fonts/ and write its @font-face into src/styles/global.css above @theme, so the family actually loads. Use when a brand font should be self-hosted rather than requested from a third party on every page load."
|
|
290
|
+
},
|
|
291
|
+
args: {
|
|
292
|
+
family: { type: "positional", required: true, description: 'Font family, e.g. "DM Sans"' },
|
|
293
|
+
weights: {
|
|
294
|
+
type: "string",
|
|
295
|
+
description: "Comma-separated weights (default: the weights global.css already requests or self-hosts, else 400)"
|
|
296
|
+
},
|
|
297
|
+
subsets: {
|
|
298
|
+
type: "string",
|
|
299
|
+
description: `Comma-separated unicode subsets (default: the subsets global.css already self-hosts, else ${DEFAULT_SUBSETS_LABEL})`
|
|
300
|
+
},
|
|
301
|
+
italic: {
|
|
302
|
+
type: "boolean",
|
|
303
|
+
description: "Also self-host the family's italic faces (default: on when global.css already loads one, off otherwise)"
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
async run({ args }) {
|
|
307
|
+
const family = String(args.family).trim();
|
|
308
|
+
if (!family) fail("INVALID_FAMILY", 'Pass a font family, e.g. `baker brand fonts fetch "DM Sans"`.');
|
|
309
|
+
const css = await readGlobalCss();
|
|
310
|
+
const declared = googleFontRequests(css).find((r) => r.family.toLowerCase() === family.toLowerCase());
|
|
311
|
+
const provided = declared?.weights.length ? declared.weights : selfHostedWeights(css, family);
|
|
312
|
+
const weights = resolveFetchWeights(args.weights, provided);
|
|
313
|
+
if (weights.length === 0) {
|
|
314
|
+
fail("INVALID_WEIGHTS", `"${args.weights}" has no usable weight \u2014 pass whole hundreds, e.g. --weights 400,700.`);
|
|
315
|
+
}
|
|
316
|
+
const wanted = new Set(resolveFetchSubsets(args.subsets, selfHostedSubsets(css, family)));
|
|
317
|
+
const styles = resolveFetchStyles(args.italic, selfHostedStyles(css, family));
|
|
318
|
+
const resolved = await resolveBrandFaces(family, weights, [...wanted], PROVIDER_DEPS, styles);
|
|
319
|
+
if (!resolved.ok) return failResolution(family, weights, resolved);
|
|
320
|
+
const faces = resolved.faces;
|
|
321
|
+
const fontsDir = path.resolve(process.cwd(), FONTS_DIR);
|
|
322
|
+
await mkdir(fontsDir, { recursive: true });
|
|
323
|
+
const downloaded = [];
|
|
324
|
+
for (const face of faces) {
|
|
325
|
+
const res = await fetch(face.url, {
|
|
326
|
+
headers: { "User-Agent": BROWSER_UA },
|
|
327
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
|
|
328
|
+
});
|
|
329
|
+
if (!res.ok) continue;
|
|
330
|
+
await writeFile(path.join(fontsDir, fontFileName(face)), Buffer.from(await res.arrayBuffer()));
|
|
331
|
+
downloaded.push(face);
|
|
332
|
+
}
|
|
333
|
+
const written = downloaded.map(fontFileName);
|
|
334
|
+
if (written.length === 0) {
|
|
335
|
+
fail("DOWNLOAD_FAILED", `Could not download any file for "${family}".`, {
|
|
336
|
+
action: "Retry; if it keeps failing, keep the Google @import and note it in BRAND.md.",
|
|
337
|
+
explanation: "The font stylesheet resolved but the font files themselves did not download."
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
const fontFace = renderFontFaceCss(downloaded);
|
|
341
|
+
const downloadedWeights = [...new Set(downloaded.map((f) => f.weight))].sort((a, b) => a - b);
|
|
342
|
+
const downloadedStyles = [...new Set(downloaded.map((f) => f.style))].sort();
|
|
343
|
+
const incomplete = weights.filter((w) => !downloadedWeights.includes(w));
|
|
344
|
+
const wiring = await wireFontFaceIntoStylesheet(css, family, fontFace);
|
|
345
|
+
writeJson({
|
|
346
|
+
ok: true,
|
|
347
|
+
data: {
|
|
348
|
+
family,
|
|
349
|
+
provider: resolved.provider,
|
|
350
|
+
weights: downloadedWeights,
|
|
351
|
+
styles: downloadedStyles,
|
|
352
|
+
files: written,
|
|
353
|
+
fontFace,
|
|
354
|
+
stylesheet: wiring
|
|
355
|
+
},
|
|
356
|
+
hints: fetchHints({
|
|
357
|
+
family,
|
|
358
|
+
downloadedWeights,
|
|
359
|
+
downloadedStyles,
|
|
360
|
+
incomplete,
|
|
361
|
+
wiring,
|
|
362
|
+
provider: resolved.provider,
|
|
363
|
+
wantedStyles: styles,
|
|
364
|
+
availableStyles: resolved.availableStyles
|
|
365
|
+
})
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
async function astroSources() {
|
|
370
|
+
const out = [];
|
|
371
|
+
let entries;
|
|
372
|
+
try {
|
|
373
|
+
entries = await readdir("src", { recursive: true, withFileTypes: true });
|
|
374
|
+
} catch {
|
|
375
|
+
return out;
|
|
376
|
+
}
|
|
377
|
+
for (const entry of entries) {
|
|
378
|
+
if (!entry.isFile() || !entry.name.endsWith(".astro")) continue;
|
|
379
|
+
const file = path.posix.join(entry.parentPath ?? "src", entry.name);
|
|
380
|
+
try {
|
|
381
|
+
out.push({ path: file, source: await readFile(file, "utf8") });
|
|
382
|
+
} catch {
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
return out;
|
|
386
|
+
}
|
|
387
|
+
var fontsAdoptCommand = defineCommand({
|
|
388
|
+
meta: {
|
|
389
|
+
name: "adopt",
|
|
390
|
+
description: "Move brand faces a page already self-hosts into src/styles/global.css, so every page loads them instead of just that one. Use when `check` reports a family as not loaded but the font files are already in src/brand/fonts/ \u2014 downloading it again would hand that page a different build of the same face."
|
|
391
|
+
},
|
|
392
|
+
async run() {
|
|
393
|
+
const css = await readGlobalCss();
|
|
394
|
+
if (!css) fail("NO_STYLESHEET", `There is no ${GLOBAL_CSS} to adopt faces into.`);
|
|
395
|
+
const unresolved = unresolvedBrandFamilies(css);
|
|
396
|
+
if (unresolved.length === 0) {
|
|
397
|
+
writeJson({
|
|
398
|
+
ok: true,
|
|
399
|
+
data: { adopted: [], conflicts: [] },
|
|
400
|
+
hints: [`Every --font-* family in ${GLOBAL_CSS} is already loaded by it \u2014 nothing to adopt.`]
|
|
401
|
+
});
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
const { plans, conflicts } = planFontAdoption(await astroSources(), unresolved);
|
|
405
|
+
const available = new Set(await listFontFiles());
|
|
406
|
+
const adopted = [];
|
|
407
|
+
const skipped = [];
|
|
408
|
+
let next = css;
|
|
409
|
+
for (const plan of plans) {
|
|
410
|
+
const missing = missingFontFiles(plan.urls, available);
|
|
411
|
+
if (missing.length > 0) {
|
|
412
|
+
skipped.push({ family: plan.family, reason: `${missing.join(", ")} is not in ${FONTS_DIR}` });
|
|
413
|
+
continue;
|
|
414
|
+
}
|
|
415
|
+
next = upsertFontFaceCss(next, plan.family, plan.blocks.join("\n"));
|
|
416
|
+
adopted.push({
|
|
417
|
+
family: plan.family,
|
|
418
|
+
files: plan.files,
|
|
419
|
+
weights: plan.blocks.map((b) => b.match(/font-weight\s*:\s*([^;]+)/i)?.[1]?.trim() ?? "400")
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
if (adopted.length === 0) {
|
|
423
|
+
if (conflicts.length > 0) {
|
|
424
|
+
fail(
|
|
425
|
+
"ADOPTION_CONFLICT",
|
|
426
|
+
`${conflicts.map((c) => `"${c.family}" is declared differently in ${c.files.join(" and ")}`).join("; ")}.`,
|
|
427
|
+
{
|
|
428
|
+
action: "Make the declarations match \u2014 same weights, same files \u2014 then re-run. Pick the one whose page renders correctly.",
|
|
429
|
+
explanation: "One global scope holds one mapping per family, so adopting would silently repaint whichever page lost.",
|
|
430
|
+
conflicts
|
|
431
|
+
}
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
if (skipped.length > 0) {
|
|
435
|
+
fail("FONT_FILE_MISSING", `${skipped.map((s) => `${s.family} \u2014 ${s.reason}`).join("; ")}.`, {
|
|
436
|
+
action: `Add the missing file to ${FONTS_DIR}, or fix the src: url() in the page that declares it, then re-run.`,
|
|
437
|
+
explanation: "The page declares the face but points at a file that is not in the repo, so the rule renders as a fallback. Moving it into the stylesheet would spread that fallback to every page.",
|
|
438
|
+
skipped
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
fail("NOTHING_TO_ADOPT", `No page declares a face for ${unresolved.map((f) => `"${f}"`).join(", ")}.`, {
|
|
442
|
+
action: `Self-host it instead: \`baker brand fonts fetch "${unresolved[0]}"\`.`,
|
|
443
|
+
explanation: "Adopting only moves faces the repo already ships; it never downloads one."
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
await writeFile(path.resolve(process.cwd(), GLOBAL_CSS), next);
|
|
447
|
+
for (const plan of plans.filter((p) => adopted.some((a) => a.family === p.family))) {
|
|
448
|
+
for (const file of plan.files) {
|
|
449
|
+
const source = await readFile(file, "utf8");
|
|
450
|
+
await writeFile(file, stripFontFaceBlocks(source, plan.family));
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
writeJson({
|
|
454
|
+
ok: true,
|
|
455
|
+
data: { adopted, conflicts, skipped },
|
|
456
|
+
hints: [
|
|
457
|
+
`Moved ${adopted.map((a) => `"${a.family}" (${a.weights.join("/")})`).join(", ")} into ${GLOBAL_CSS} and removed the page copies, so every page loads them \u2014 not just the one that declared them.`,
|
|
458
|
+
...conflicts.length > 0 ? [
|
|
459
|
+
`CONFLICT: ${conflicts.map((c) => `"${c.family}" is declared differently in ${c.files.join(" and ")}`).join("; ")}. One global scope can hold only one mapping, so pick which files the family should use and make the declarations match before re-running.`
|
|
460
|
+
] : [],
|
|
461
|
+
...skipped.length > 0 ? [`SKIPPED: ${skipped.map((s) => `${s.family} \u2014 ${s.reason}`).join("; ")}.`] : [],
|
|
462
|
+
`Run \`baker brand fonts check\` to confirm nothing is left unresolved.`
|
|
463
|
+
]
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
var fontsCommand = defineCommand({
|
|
468
|
+
meta: {
|
|
469
|
+
name: "fonts",
|
|
470
|
+
description: `Verify and self-host the brand's typefaces.
|
|
471
|
+
|
|
472
|
+
Start here: \`baker brand fonts check\` \u2014 confirms the fonts the brand claims really load.
|
|
473
|
+
|
|
474
|
+
Subcommands:
|
|
475
|
+
baker brand fonts check \u2014 fail if any --font-* family has nothing loading it, then ask Google what it actually serves for the ones global.css requests
|
|
476
|
+
baker brand fonts fetch <family> \u2014 download a family into src/brand/fonts/ and wire its @font-face into src/styles/global.css
|
|
477
|
+
baker brand fonts adopt \u2014 move faces a page already self-hosts into global.css, so every page loads them. Try this BEFORE fetch when the font files are already in src/brand/fonts/`
|
|
478
|
+
},
|
|
479
|
+
subCommands: {
|
|
480
|
+
check: fontsCheckCommand,
|
|
481
|
+
fetch: fontsFetchCommand,
|
|
482
|
+
adopt: fontsAdoptCommand
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
|
|
486
|
+
export {
|
|
487
|
+
fetchJson,
|
|
488
|
+
lookupGoogleCss,
|
|
489
|
+
fontsCheckCommand,
|
|
490
|
+
fontsFetchCommand,
|
|
491
|
+
fontsAdoptCommand,
|
|
492
|
+
fontsCommand
|
|
493
|
+
};
|
|
494
|
+
//# sourceMappingURL=chunk-4KBTW5NE.js.map
|