@koda-sl/baker-cli 0.552.0 → 0.553.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -1
- package/dist/account-NSRT5KE6.js +139 -0
- package/dist/account-OXD426YD.js +82 -0
- package/dist/account-XIC5TTV3.js +82 -0
- package/dist/account-assets-V7KSSTVP.js +290 -0
- package/dist/account-level-2KLG6HTG.js +611 -0
- package/dist/account-reads-ZPZUCB3P.js +219 -0
- package/dist/account-users-XTUKRDWK.js +64 -0
- package/dist/account-writes-VRRLT356.js +68 -0
- package/dist/accounts-25JL77F7.js +701 -0
- package/dist/accounts-45MUDNOM.js +76 -0
- package/dist/accounts-AF72N4NV.js +80 -0
- package/dist/accounts-HJAQTVDA.js +114 -0
- package/dist/accounts-KQ7NCM4L.js +115 -0
- package/dist/actions-IJO4JW7J.js +55 -0
- package/dist/active-entities-3266UJYN.js +103 -0
- package/dist/activecampaign-PBTUMTO5.js +938 -0
- package/dist/activities-ORMACIG2.js +75 -0
- package/dist/ad-group-writes-Y6CCMPCM.js +172 -0
- package/dist/ad-groups-TW2UKDVU.js +70 -0
- package/dist/ad-writes-J3UVUH7D.js +176 -0
- package/dist/add-CKJXQUVI.js +97 -0
- package/dist/add-CSRB6GVJ.js +80 -0
- package/dist/add-KHQXXHC5.js +107 -0
- package/dist/add-NJUG3IQ2.js +81 -0
- package/dist/add-XYSUKZSU.js +148 -0
- package/dist/add-YQPFRDVM.js +305 -0
- package/dist/add-accounts-IRHBFNNC.js +91 -0
- package/dist/ads-5CJQRTUN.js +79 -0
- package/dist/ads-DI3J3KCQ.js +128 -0
- package/dist/ads-EVQ37EV3.js +120 -0
- package/dist/ads-O5PUYU7H.js +48 -0
- package/dist/adsets-4IW5TRAK.js +182 -0
- package/dist/advertisers-5XCIZ7WS.js +125 -0
- package/dist/advertisers-JNOWSZZC.js +123 -0
- package/dist/analytics-CZMCM7XC.js +2437 -0
- package/dist/analytics-K5FCQLI5.js +447 -0
- package/dist/animate-C6BRMRRD.js +480 -0
- package/dist/approved-RP5ADN7E.js +73 -0
- package/dist/asset-writes-RF6XTWLY.js +50 -0
- package/dist/assign-WXZNXVJH.js +80 -0
- package/dist/audience-size-ZCWH4CFC.js +76 -0
- package/dist/audience-writes-5KT6FHUY.js +327 -0
- package/dist/audiences-4MYDTY74.js +280 -0
- package/dist/audiences-5TOTVZMK.js +85 -0
- package/dist/audiences-ZDOK3OYC.js +106 -0
- package/dist/audit-RBRXPPKK.js +154 -0
- package/dist/audit-SACXTAIP.js +88 -0
- package/dist/autocomplete-P5OU7QVL.js +114 -0
- package/dist/avatars-UHBA2BQ3.js +38 -0
- package/dist/bid-pricing-LHNYSDG4.js +103 -0
- package/dist/brand-7WL3O74X.js +22 -0
- package/dist/brief-HWZU75WP.js +543 -0
- package/dist/businesses-F6PN34WK.js +54 -0
- package/dist/campaign-groups-BYS3GNEP.js +99 -0
- package/dist/campaign-writes-BHS3POAH.js +176 -0
- package/dist/campaign-writes-N6OHAK6V.js +168 -0
- package/dist/campaigns-2E4AQBFB.js +113 -0
- package/dist/campaigns-3U5IRXSV.js +130 -0
- package/dist/campaigns-IRMLPW6N.js +78 -0
- package/dist/campaigns-QLKGN4FB.js +111 -0
- package/dist/canvas-GGHJ26ZM.js +46 -0
- package/dist/capabilities-TKEEHR7K.js +147 -0
- package/dist/cards-HUXBNMEM.js +85 -0
- package/dist/catalog-7KQN43HS.js +66 -0
- package/dist/catalogs-5CHPI4H6.js +782 -0
- package/dist/catalogs-5CHPI4H6.js.map +1 -0
- package/dist/catalogs-WYRRTRCM.js +130 -0
- package/dist/changes-OIVPZJHE.js +143 -0
- package/dist/chatgpt-RQQWU7AP.js +47 -0
- package/dist/chats-PBXYH2LT.js +449 -0
- package/dist/check-SVYI72DF.js +107 -0
- package/dist/chunk-2RL2T5JO.js +142 -0
- package/dist/chunk-3HLQZTQ3.js +685 -0
- package/dist/chunk-3J52GJAY.js +46 -0
- package/dist/chunk-42JTSTQ3.js +207 -0
- package/dist/chunk-45D6WRCJ.js +476 -0
- package/dist/chunk-4AEAL63J.js +203 -0
- package/dist/chunk-4H6XLX7E.js +97 -0
- package/dist/chunk-4ULGRGBG.js +333 -0
- package/dist/chunk-4XMPL3RU.js +19 -0
- package/dist/chunk-5AOTCCTT.js +831 -0
- package/dist/chunk-5G6R3WYN.js +58 -0
- package/dist/chunk-5HPKYRTE.js +45 -0
- package/dist/chunk-5NLUTJCQ.js +5368 -0
- package/dist/chunk-6FWVRXDW.js +64 -0
- package/dist/chunk-6HPTF5YS.js +857 -0
- package/dist/chunk-6KEVNO5O.js +191 -0
- package/dist/chunk-6MXM6DA6.js +225 -0
- package/dist/chunk-6MXM6DA6.js.map +1 -0
- package/dist/chunk-6QINKM6T.js +46 -0
- package/dist/chunk-73MLPGI2.js +66 -0
- package/dist/chunk-7OVPQX4X.js +163 -0
- package/dist/chunk-7SNNQCDD.js +274 -0
- package/dist/chunk-B5UVOCYA.js +344 -0
- package/dist/chunk-BRNZMKO4.js +604 -0
- package/dist/chunk-BU7W7MKF.js +42 -0
- package/dist/chunk-CCYZJMZ7.js +2522 -0
- package/dist/chunk-CCYZJMZ7.js.map +1 -0
- package/dist/chunk-CJFCQMUY.js +438 -0
- package/dist/chunk-CQMAR4BH.js +69 -0
- package/dist/chunk-CXYX6G3I.js +98 -0
- package/dist/chunk-CZESYOCC.js +94 -0
- package/dist/chunk-D6VQPBVM.js +5471 -0
- package/dist/chunk-D7FJ5KHG.js +39 -0
- package/dist/chunk-DEZBCK5P.js +66 -0
- package/dist/chunk-DK66PUXL.js +275 -0
- package/dist/chunk-DLM5OSHM.js +843 -0
- package/dist/chunk-DNH2ZPZP.js +287 -0
- package/dist/chunk-DWSSQBLO.js +103 -0
- package/dist/chunk-E56V3RFO.js +75 -0
- package/dist/chunk-EHNORFUW.js +225 -0
- package/dist/chunk-ESXUIV6V.js +169 -0
- package/dist/chunk-FAV6GUOZ.js +24026 -0
- package/dist/chunk-FHN4QXZN.js +139 -0
- package/dist/chunk-FSEFZZ2T.js +930 -0
- package/dist/chunk-G4JTXVLA.js +74 -0
- package/dist/chunk-G6U45QD3.js +296 -0
- package/dist/chunk-GAP7SOGA.js +188 -0
- package/dist/chunk-GFWWHCBF.js +229 -0
- package/dist/chunk-GO6ISZUZ.js +52 -0
- package/dist/chunk-GWLP45WQ.js +1518 -0
- package/dist/chunk-H3HA22Z3.js +1919 -0
- package/dist/chunk-H6GTG665.js +106 -0
- package/dist/chunk-I4BQTVMY.js +225 -0
- package/dist/chunk-IAZKXDWV.js +100 -0
- package/dist/chunk-IBBGABK2.js +91 -0
- package/dist/chunk-IC4MREQH.js +219 -0
- package/dist/chunk-IIK4WNWV.js +84 -0
- package/dist/chunk-IZROFBH7.js +167 -0
- package/dist/chunk-J5UTL4HE.js +3510 -0
- package/dist/chunk-JBMZVC5D.js +91 -0
- package/dist/chunk-JXTNP3B5.js +215 -0
- package/dist/chunk-LBJ2CLRT.js +106 -0
- package/dist/chunk-LFELUKCA.js +249 -0
- package/dist/chunk-LK5OKVCM.js +544 -0
- package/dist/chunk-LMOZWB4G.js +98 -0
- package/dist/chunk-N5AIO23H.js +2209 -0
- package/dist/chunk-NE3OMP7R.js +23 -0
- package/dist/chunk-NO52OH3Y.js +156 -0
- package/dist/chunk-NRIKX35V.js +399 -0
- package/dist/chunk-NRIKX35V.js.map +1 -0
- package/dist/chunk-NZYWKZ3Q.js +76 -0
- package/dist/chunk-OIORUNKH.js +1902 -0
- package/dist/chunk-OKXLOLEV.js +455 -0
- package/dist/chunk-OVC2PIOP.js +111 -0
- package/dist/chunk-P4MXGSSJ.js +178 -0
- package/dist/chunk-P4MXGSSJ.js.map +1 -0
- package/dist/chunk-P5HG6WDH.js +152 -0
- package/dist/chunk-PGAYESXE.js +25 -0
- package/dist/chunk-PQ7RLE43.js +1646 -0
- package/dist/chunk-QFODAMYR.js +69 -0
- package/dist/chunk-QFVZIQRQ.js +8954 -0
- package/dist/chunk-QI5UKQX3.js +297 -0
- package/dist/chunk-QY7EK6Q4.js +217 -0
- package/dist/chunk-QYH2UZAK.js +324 -0
- package/dist/chunk-R7XDGNZD.js +297 -0
- package/dist/chunk-R7XDGNZD.js.map +1 -0
- package/dist/chunk-RHNNFCRY.js +494 -0
- package/dist/chunk-RIVHJC6L.js +35 -0
- package/dist/chunk-RJQT7QXX.js +547 -0
- package/dist/chunk-RMZLB4AH.js +197 -0
- package/dist/chunk-S4NMWYHW.js +51 -0
- package/dist/chunk-SFQFUQDW.js +170 -0
- package/dist/chunk-SNSLYZIT.js +64 -0
- package/dist/chunk-SP3MHBME.js +89 -0
- package/dist/chunk-TGT4XHLX.js +131 -0
- package/dist/chunk-TLNYAZX5.js +76 -0
- package/dist/chunk-UGRL642V.js +73 -0
- package/dist/chunk-UKZKLXTE.js +638 -0
- package/dist/chunk-VAQOSV3I.js +138 -0
- package/dist/chunk-VIRPAJEF.js +97 -0
- package/dist/chunk-VX6GTRT3.js +910 -0
- package/dist/chunk-WR5Y64OE.js +718 -0
- package/dist/chunk-X3YYZLBH.js +285 -0
- package/dist/chunk-XB4NKZAQ.js +136 -0
- package/dist/chunk-XSBX3LJP.js +430 -0
- package/dist/chunk-XXBP73RV.js +148 -0
- package/dist/chunk-XZMO52BP.js +56 -0
- package/dist/chunk-Y3SK6EMU.js +84 -0
- package/dist/chunk-Y4ZBNZBU.js +191 -0
- package/dist/chunk-YCAJCVW4.js +224 -0
- package/dist/chunk-ZANXEMON.js +1744 -0
- package/dist/chunk-ZMTWQDFC.js +709 -0
- package/dist/chunk-ZMTWQDFC.js.map +1 -0
- package/dist/chunk-ZSZ76MUL.js +125 -0
- package/dist/chunk-ZU6JW3ZB.js +26 -0
- package/dist/chunk-ZW2CN6L6.js +288 -0
- package/dist/cite-TRNZYG4W.js +191 -0
- package/dist/claim-Q76T3MYA.js +200 -0
- package/dist/cli.js +46 -46
- package/dist/client-45COYUUH.js +19 -0
- package/dist/code-K4YTLOPA.js +76 -0
- package/dist/companies-MLWRWQ73.js +198 -0
- package/dist/company-X5Z67PMK.js +308 -0
- package/dist/complete-3CFP6XVY.js +84 -0
- package/dist/config-TCAHWE6T.js +88 -0
- package/dist/connect-QXFAB4RJ.js +45 -0
- package/dist/content-MKJP7T7L.js +85 -0
- package/dist/conversation-C6K6IZTH.js +96 -0
- package/dist/conversion-report-OFV4EKTA.js +127 -0
- package/dist/conversion-upload-command-D7S5HF22.js +439 -0
- package/dist/conversion-writes-B3H6VLA2.js +122 -0
- package/dist/conversions-4ILDIG3K.js +140 -0
- package/dist/conversions-CRL327RY.js +78 -0
- package/dist/copy-writes-FYXKHJDB.js +170 -0
- package/dist/countries-6ST54UGJ.js +82 -0
- package/dist/create-LDQ3YHET.js +62 -0
- package/dist/create-TKOG7DNJ.js +210 -0
- package/dist/create-WFMJOZLO.js +135 -0
- package/dist/create-WQNT345R.js +239 -0
- package/dist/creatives-45SJAD3G.js +118 -0
- package/dist/creatives-E4CTMZJJ.js +223 -0
- package/dist/creatives-Q4OXNCTT.js +58 -0
- package/dist/credentials-E2AIMWKX.js +290 -0
- package/dist/critique-EWV3O3TD.js +1451 -0
- package/dist/critique-JVT6X2T3.js +232 -0
- package/dist/crm-NQH5FTK6.js +227 -0
- package/dist/crm-YGQKK76D.js +323 -0
- package/dist/crop-KV24WHOR.js +113 -0
- package/dist/currency-B5T7TYKD.js +88 -0
- package/dist/custom-conversions-EJNX4MCK.js +128 -0
- package/dist/customers-YFEPJF4G.js +65 -0
- package/dist/decide-JZXG6LZR.js +199 -0
- package/dist/delete-2UJVTHRE.js +67 -0
- package/dist/delete-7QAJSOCO.js +69 -0
- package/dist/delete-O4RO2HMR.js +57 -0
- package/dist/delete-POHL3TKX.js +69 -0
- package/dist/delete-Q7J734W2.js +71 -0
- package/dist/delete-XWD37C4T.js +85 -0
- package/dist/demographics-YWBHAMZ5.js +141 -0
- package/dist/describe-MA54W67X.js +97 -0
- package/dist/describe-MJ5SOVWY.js +97 -0
- package/dist/dimensions-YXOXHOXW.js +101 -0
- package/dist/discard-YX4XUXG3.js +69 -0
- package/dist/discover-PPMLFJMU.js +93 -0
- package/dist/discover-SS3PO5Y6.js +172 -0
- package/dist/domain-5R6CYVFY.js +101 -0
- package/dist/download-D2O4RYJ3.js +172 -0
- package/dist/download-SYWQXF57.js +299 -0
- package/dist/draft-2NKXOBT6.js +106 -0
- package/dist/draft-3MPADYS4.js +220 -0
- package/dist/draft-AAEGEQZZ.js +247 -0
- package/dist/draft-CRDQR5I3.js +342 -0
- package/dist/draft-I63QQ7LY.js +106 -0
- package/dist/draft-PO5X4UVA.js +313 -0
- package/dist/draft-QCKJT7XQ.js +288 -0
- package/dist/draft-VMLXZQQX.js +408 -0
- package/dist/engine/index.js +14 -14
- package/dist/env-2RHPS2VF.js +53 -0
- package/dist/experiment-3NDXGQK6.js +1397 -0
- package/dist/experiments-DYNNWQRB.js +236 -0
- package/dist/export-6WWVO4O6.js +168 -0
- package/dist/extract-DWDZI35Y.js +121 -0
- package/dist/facets-Y2IEM37E.js +117 -0
- package/dist/favorites-54Z7PTYR.js +178 -0
- package/dist/feed-TAGQWMRK.js +177 -0
- package/dist/feedback-HJRVTU6C.js +115 -0
- package/dist/feedback-IVSLM5PN.js +136 -0
- package/dist/feedback-record-P7CO3IGE.js +269 -0
- package/dist/fetch-KB64NPDF.js +139 -0
- package/dist/fetch-V2U5VUQZ.js +204 -0
- package/dist/find-UB4JSORZ.js +143 -0
- package/dist/fit-JDG6E46O.js +65 -0
- package/dist/flows-DP574PEX.js +250 -0
- package/dist/follow-SX6BV6VZ.js +94 -0
- package/dist/follow-competitors-UBJJHX36.js +112 -0
- package/dist/following-L7WUEMZ2.js +113 -0
- package/dist/fonts-RMROS3LX.js +39 -0
- package/dist/forecast-AAHHVTBK.js +169 -0
- package/dist/forecast-BRXNGMGD.js +121 -0
- package/dist/funding-7M4TJ3MW.js +85 -0
- package/dist/funnel-FQX3DOE7.js +397 -0
- package/dist/ga4-A3HLGTSI.js +55 -0
- package/dist/generate-SYOQE3F7.js +263 -0
- package/dist/get-4NDYA3G6.js +62 -0
- package/dist/get-HMTI2IR6.js +82 -0
- package/dist/get-JIB6PMGI.js +59 -0
- package/dist/get-JX5JVWH7.js +56 -0
- package/dist/get-KNP2EQRI.js +74 -0
- package/dist/get-Q4M6G7YN.js +92 -0
- package/dist/get-VFDNTZ54.js +62 -0
- package/dist/get-X44ZCIFN.js +38 -0
- package/dist/gif-6244RM75.js +110 -0
- package/dist/google-HWEDJ4YS.js +144 -0
- package/dist/google-WH3IXXMX.js +3285 -0
- package/dist/google-WH3IXXMX.js.map +1 -0
- package/dist/google-ads-4DLYASRC.js +198 -0
- package/dist/group-45M7V46T.js +43 -0
- package/dist/group-RAXOR36M.js +43 -0
- package/dist/gsc-YAU4EA75.js +30 -0
- package/dist/history-6B6RXNV3.js +102 -0
- package/dist/history-BEEREY26.js +69 -0
- package/dist/history-NLZSX4BK.js +153 -0
- package/dist/hubspot-LABBRJ44.js +782 -0
- package/dist/icon-2237C4LP.js +137 -0
- package/dist/ideas-A4ELJN23.js +45 -0
- package/dist/images-JVNT7KYM.js +92 -0
- package/dist/improve-PHFWWTOL.js +86 -0
- package/dist/ingest-GQWR3RHR.js +27 -0
- package/dist/ingest-JYN2IDKV.js +123 -0
- package/dist/insights-A5BKVXFQ.js +132 -0
- package/dist/insights-U6QAA77O.js +658 -0
- package/dist/inspect-72DY33YD.js +192 -0
- package/dist/inspiration-DNWTXEPX.js +53 -0
- package/dist/instant-experiences-6NTBX4SL.js +264 -0
- package/dist/instant-experiences-6NTBX4SL.js.map +1 -0
- package/dist/intent-OMSJPOJZ.js +95 -0
- package/dist/job-RCEPBGZC.js +202 -0
- package/dist/job-create-MDVJ3E7K.js +109 -0
- package/dist/job-status-53FJIFYR.js +74 -0
- package/dist/keep-ZIHW5OEQ.js +78 -0
- package/dist/keyword-gap-3P72T4NV.js +130 -0
- package/dist/keyword-metrics-GP7L2MQE.js +200 -0
- package/dist/keywords-for-site-6YWAUOKJ.js +131 -0
- package/dist/knowledge-PN3FAZJ2.js +195 -0
- package/dist/landing-EKHAZS5P.js +28 -0
- package/dist/landings-FBRB3FF5.js +151 -0
- package/dist/languages-Q5RMPGI4.js +55 -0
- package/dist/languages-WWKMRZCH.js +40 -0
- package/dist/launches-EQ4VS2OR.js +19 -0
- package/dist/layerize-SX6LQK35.js +190 -0
- package/dist/lead-routes-RLYGO47M.js +733 -0
- package/dist/leads-RN6RYOMU.js +541 -0
- package/dist/leads-RN6RYOMU.js.map +1 -0
- package/dist/leads-UCXIIA5K.js +115 -0
- package/dist/learn-EJEFERQZ.js +207 -0
- package/dist/library-RZI7QHRV.js +211 -0
- package/dist/lighthouse-D3BJGHLO.js +75 -0
- package/dist/line-item-writes-IMCE2FDW.js +211 -0
- package/dist/line-items-ISUC3WDO.js +107 -0
- package/dist/link-6QL4ZVSU.js +67 -0
- package/dist/linkedin-ZOBYUBGV.js +1330 -0
- package/dist/linkedin-person-C24CBKCH.js +139 -0
- package/dist/list-2NWMHKTR.js +93 -0
- package/dist/list-2VNI3U7I.js +154 -0
- package/dist/list-5H6UAX6T.js +57 -0
- package/dist/list-ACJBOHPS.js +50 -0
- package/dist/list-COWCCJ4F.js +65 -0
- package/dist/list-EEQJSTLN.js +51 -0
- package/dist/list-OTZB7DOX.js +76 -0
- package/dist/list-PZD2QOZL.js +67 -0
- package/dist/list-SUXUMXPJ.js +306 -0
- package/dist/locations-P3CUBKYZ.js +40 -0
- package/dist/locations-ZO7F75KT.js +69 -0
- package/dist/log-VLI7KQF2.js +95 -0
- package/dist/logo-R34AWI4C.js +18 -0
- package/dist/lookup-BGNLEZMU.js +23 -0
- package/dist/make-365ZJ25L.js +1367 -0
- package/dist/map-OEFL45WA.js +436 -0
- package/dist/mcp-NCZYQXQL.js +729 -0
- package/dist/media-422INJCD.js +89 -0
- package/dist/media-WASM45QW.js +18 -0
- package/dist/media-sources-CZDK4W5Q.js +35 -0
- package/dist/members-N3PQSVQC.js +47 -0
- package/dist/meme-NH4DAORT.js +100 -0
- package/dist/meta-IRXPQRBH.js +122 -0
- package/dist/metrics-PSXIV4QS.js +152 -0
- package/dist/models-SITHUNAA.js +155 -0
- package/dist/normalize-4OKUF5BJ.js +806 -0
- package/dist/normalize-6DEJPTBF.js +144 -0
- package/dist/options-OJX77MYT.js +125 -0
- package/dist/organization-URQGKFEC.js +949 -0
- package/dist/output-2MGOSPDE.js +24 -0
- package/dist/page-WKWRKLTC.js +105 -0
- package/dist/page-photos-N4S7U7FR.js +118 -0
- package/dist/pages-LT3KCVC3.js +67 -0
- package/dist/performance-P5T4LJRG.js +27 -0
- package/dist/performance-SIWBDORI.js +5565 -0
- package/dist/pinterest-KZ7RIHRS.js +104 -0
- package/dist/pixels-3BHTXTDV.js +62 -0
- package/dist/pixels-IGJFC2XC.js +109 -0
- package/dist/plan-ATH2VCVA.js +208 -0
- package/dist/posts-MVCGZV54.js +36 -0
- package/dist/preview-DMTQR6ZW.js +218 -0
- package/dist/profile-OWDBNPNI.js +159 -0
- package/dist/promoted-tweet-writes-S2HP5DEI.js +183 -0
- package/dist/promoted-tweets-WZT4N5IR.js +119 -0
- package/dist/properties-VSOMFI5V.js +101 -0
- package/dist/publish-EDYBQHGJ.js +344 -0
- package/dist/query-5OS6M4ON.js +231 -0
- package/dist/query-NTWXOWPZ.js +236 -0
- package/dist/query-PC7V3OFF.js +62 -0
- package/dist/questionnaire-HUNGUZNQ.js +94 -0
- package/dist/read-DXZJ7UOJ.js +141 -0
- package/dist/reddit-DEGGHR4M.js +29 -0
- package/dist/refresh-BKYZXXRF.js +42 -0
- package/dist/refresh-HPNJGI2U.js +97 -0
- package/dist/release-H7M37CEO.js +63 -0
- package/dist/relevant-pages-3CCAQA5Y.js +99 -0
- package/dist/remove-MV4YS72N.js +53 -0
- package/dist/remove-MX2FV44C.js +49 -0
- package/dist/reopen-EFW2SKOY.js +66 -0
- package/dist/rerun-OM4N74YK.js +96 -0
- package/dist/research-7YDQOKA6.js +265 -0
- package/dist/research-MHXKAQW4.js +75 -0
- package/dist/reset-HT4AGJPR.js +57 -0
- package/dist/reset-XPZQ5F4D.js +57 -0
- package/dist/resolve-RTTXEN2B.js +124 -0
- package/dist/retry-DVLVWHEK.js +63 -0
- package/dist/retry-SBGWOUQO.js +65 -0
- package/dist/retry-failed-T6PK5SKL.js +45 -0
- package/dist/revenue-KJLJ53XY.js +91 -0
- package/dist/rule-writes-DNXELESR.js +530 -0
- package/dist/rule-writes-DNXELESR.js.map +1 -0
- package/dist/rules-KCSET46P.js +217 -0
- package/dist/rules-NVKU732Z.js +99 -0
- package/dist/rules-add-KY42EHJE.js +465 -0
- package/dist/run-2LQ7XJEO.js +69 -0
- package/dist/run-M7YU6KCV.js +71 -0
- package/dist/scaffold-ad-6YPZ75YJ.js +1513 -0
- package/dist/scaffold-static-ad-UJEWTDU5.js +1011 -0
- package/dist/scaffold-video-M4VWSVJ6.js +885 -0
- package/dist/schedule-ANIYXLG6.js +67 -0
- package/dist/schedule-J7HZQ2EL.js +64 -0
- package/dist/scheduled-agents-IVUQUKF4.js +55 -0
- package/dist/schema-L4PETLZT.js +152 -0
- package/dist/schema-L4PETLZT.js.map +1 -0
- package/dist/schema-LHBKBUV7.js +135 -0
- package/dist/scrape-FQUGOXCG.js +2241 -0
- package/dist/screenshot-YRYAOP5E.js +102 -0
- package/dist/search-3AW52FO6.js +177 -0
- package/dist/search-6XKFFDMJ.js +228 -0
- package/dist/search-E75B5APM.js +92 -0
- package/dist/search-EKTUTXVN.js +51 -0
- package/dist/search-OW3E2Z7Z.js +91 -0
- package/dist/search-YARSBZ6D.js +26 -0
- package/dist/search-copy-2KO3VR6R.js +168 -0
- package/dist/seeds-E64JKXWS.js +101 -0
- package/dist/select-STIWQ36I.js +110 -0
- package/dist/sends-DEVRKO4M.js +349 -0
- package/dist/sequences-YIQSLKV5.js +146 -0
- package/dist/set-prompt-TODWV2F4.js +199 -0
- package/dist/setup-links-MNBD3UMH.js +144 -0
- package/dist/shared-V5ZS25EO.js +32 -0
- package/dist/shopify-PVMHMVIC.js +3980 -0
- package/dist/site-ZZUKS6MQ.js +180 -0
- package/dist/sitemaps-ZSISKT6L.js +77 -0
- package/dist/sites-XMZ3HPHT.js +97 -0
- package/dist/skills-6MJC6CSZ.js +47 -0
- package/dist/sources-36MJ6T4V.js +30 -0
- package/dist/sources-GNLQHTSJ.js +457 -0
- package/dist/stale-GJN7UO3D.js +90 -0
- package/dist/stats-FSAXWTSE.js +34 -0
- package/dist/status-6EGB6ORB.js +65 -0
- package/dist/sticker-GXCI4WL5.js +102 -0
- package/dist/stock-DJ6I3CTO.js +187 -0
- package/dist/studies-4XXCEAHH.js +250 -0
- package/dist/studio-OARORMDJ.js +49 -0
- package/dist/study-writes-J56UIIE3.js +471 -0
- package/dist/study-writes-J56UIIE3.js.map +1 -0
- package/dist/suggest-DSMKK4FP.js +66 -0
- package/dist/sync-QHM3LMAX.js +57 -0
- package/dist/sync-WKV3N3LD.js +279 -0
- package/dist/sync-XFK4U6TA.js +55 -0
- package/dist/sync-definition-YXGN6PIQ.js +70 -0
- package/dist/tag-L2H5TSFJ.js +57 -0
- package/dist/tag-manager-XAX5AI42.js +43 -0
- package/dist/tags-GHV5R7NI.js +26 -0
- package/dist/tags-IDWUV2FY.js +227 -0
- package/dist/tags-MBBRBZJH.js +23 -0
- package/dist/tags-MQYF2JHQ.js +23 -0
- package/dist/tags-ZGXJHATH.js +23 -0
- package/dist/targeting-KJ4DI56R.js +762 -0
- package/dist/targeting-constants-ZS422W5A.js +118 -0
- package/dist/targeting-criteria-GDCXOAUD.js +113 -0
- package/dist/targets-MYHOPAYY.js +106 -0
- package/dist/terms-NX5CAJXT.js +102 -0
- package/dist/testimonials-R6RFGAKP.js +32 -0
- package/dist/themes-LHVXXVTX.js +95 -0
- package/dist/top-companies-POTV3Y2A.js +111 -0
- package/dist/transcript-4RVYKDVZ.js +165 -0
- package/dist/translate-UCASCVMN.js +603 -0
- package/dist/triggers-XHMMOZJK.js +144 -0
- package/dist/tweets-33OCH74J.js +123 -0
- package/dist/unfollow-G26NHR5X.js +46 -0
- package/dist/unlink-3IW3EORE.js +70 -0
- package/dist/unstage-APVF6KHB.js +88 -0
- package/dist/unstage-OAPP6Z5V.js +96 -0
- package/dist/update-2VSJH4LQ.js +66 -0
- package/dist/update-42QYBUE3.js +101 -0
- package/dist/update-ESK6PSME.js +192 -0
- package/dist/update-KXTP3VPI.js +81 -0
- package/dist/update-V7SRDGHN.js +155 -0
- package/dist/upload-42IR5RIL.js +130 -0
- package/dist/upload-LSEV74SF.js +150 -0
- package/dist/upscale-X3B5CHG3.js +109 -0
- package/dist/url-options-GJ7ZIUPD.js +131 -0
- package/dist/url-params-GEESXN57.js +101 -0
- package/dist/use-D3SKAKUU.js +111 -0
- package/dist/validate-Z5SSEUES.js +125 -0
- package/dist/variant-MEHXEXFK.js +338 -0
- package/dist/videos-PJAPZPOT.js +41 -0
- package/dist/view-HTCYEBXN.js +133 -0
- package/dist/viewer-check-6M34VY7K.js +83 -0
- package/dist/web-PUVVFMV3.js +173 -0
- package/dist/winners-CGLS7SZ3.js +113 -0
- package/dist/winning-ads-ZCP4MIEQ.js +86 -0
- package/dist/write-commands-5LEEPKA7.js +1169 -0
- package/dist/write-commands-5LEEPKA7.js.map +1 -0
- package/dist/write-commands-HQQOJGP4.js +721 -0
- package/dist/write-commands-HQQOJGP4.js.map +1 -0
- package/dist/write-commands-QNXR5ENS.js +206 -0
- package/dist/write-commands-ZS4O4DSV.js +1524 -0
- package/dist/write-commands-ZS4O4DSV.js.map +1 -0
- package/dist/x-2IZMW46M.js +47 -0
- package/package.json +1 -1
- package/dist/account-2EUMSJ6E.js +0 -82
- package/dist/account-7YEN7D6B.js +0 -139
- package/dist/account-RXX6HCCL.js +0 -82
- package/dist/account-assets-HX7OYWZA.js +0 -290
- package/dist/account-level-I5BKCGP5.js +0 -611
- package/dist/account-reads-7FUCOWBE.js +0 -219
- package/dist/account-users-Z5RFUBXP.js +0 -64
- package/dist/account-writes-TG3XVEPD.js +0 -68
- package/dist/accounts-AC7ZBCS2.js +0 -76
- package/dist/accounts-I4EXOKR7.js +0 -115
- package/dist/accounts-MFCQIHYM.js +0 -701
- package/dist/accounts-MMIWLNGB.js +0 -80
- package/dist/accounts-WYFUDH2V.js +0 -114
- package/dist/actions-QIKHRNJX.js +0 -55
- package/dist/active-entities-AEXKE2EN.js +0 -103
- package/dist/activecampaign-RQJ7PQPM.js +0 -938
- package/dist/activities-N5BD57MF.js +0 -75
- package/dist/ad-group-writes-OLQM2VNX.js +0 -172
- package/dist/ad-groups-ENLD7CU4.js +0 -70
- package/dist/ad-writes-FF6PT3R5.js +0 -176
- package/dist/add-3JWLLGUJ.js +0 -80
- package/dist/add-4JUXMRNA.js +0 -148
- package/dist/add-4NK4DIER.js +0 -97
- package/dist/add-AO3F6EJY.js +0 -107
- package/dist/add-NQUHPVZ5.js +0 -81
- package/dist/add-QYLIXGQT.js +0 -305
- package/dist/add-accounts-XCYWXGO3.js +0 -91
- package/dist/ads-H6TOLQKA.js +0 -79
- package/dist/ads-JNXLC3PU.js +0 -120
- package/dist/ads-MXH4DNG2.js +0 -48
- package/dist/ads-XEAMDEZW.js +0 -128
- package/dist/adsets-W5JSNW4Q.js +0 -182
- package/dist/advertisers-7KCF3ODT.js +0 -123
- package/dist/advertisers-IAXF43LX.js +0 -125
- package/dist/analytics-3AMSN535.js +0 -447
- package/dist/analytics-5SPL5E7Q.js +0 -2437
- package/dist/animate-WXSSXUTY.js +0 -480
- package/dist/approved-HDDHLECJ.js +0 -73
- package/dist/asset-writes-VYGJRLEA.js +0 -50
- package/dist/assign-D3XCS6PD.js +0 -80
- package/dist/audience-size-SQRAXCQD.js +0 -76
- package/dist/audience-writes-YMCOA47Z.js +0 -327
- package/dist/audiences-VKU7E4LI.js +0 -85
- package/dist/audiences-XUY2Y6OH.js +0 -280
- package/dist/audiences-Y4UIPHB7.js +0 -106
- package/dist/audit-DVIKUMSU.js +0 -154
- package/dist/audit-HWA6SOH3.js +0 -88
- package/dist/autocomplete-FJNOPOVG.js +0 -114
- package/dist/avatars-VMJE6IL4.js +0 -38
- package/dist/bid-pricing-HFPRGFPN.js +0 -103
- package/dist/brand-NJI7MUWN.js +0 -22
- package/dist/brief-LHQJCJOK.js +0 -543
- package/dist/businesses-DEKE2CRX.js +0 -54
- package/dist/campaign-groups-QPTKMJBU.js +0 -99
- package/dist/campaign-writes-3NFFDIFM.js +0 -176
- package/dist/campaign-writes-YSFLDOPH.js +0 -168
- package/dist/campaigns-4KDJBCA7.js +0 -78
- package/dist/campaigns-AI2ZHOK6.js +0 -111
- package/dist/campaigns-KXQDUFVX.js +0 -130
- package/dist/campaigns-P6WHQMG3.js +0 -113
- package/dist/canvas-CDMROW44.js +0 -46
- package/dist/capabilities-B24L6H6H.js +0 -147
- package/dist/cards-UCEENP55.js +0 -85
- package/dist/catalog-FBJC7XUE.js +0 -66
- package/dist/catalogs-2CCZQAS3.js +0 -130
- package/dist/catalogs-TAQIAKNJ.js +0 -781
- package/dist/catalogs-TAQIAKNJ.js.map +0 -1
- package/dist/changes-TTQCZMYX.js +0 -143
- package/dist/chatgpt-D7MUGYE5.js +0 -47
- package/dist/chats-AI4NH34F.js +0 -449
- package/dist/check-L2BVFQU6.js +0 -107
- package/dist/chunk-23LJR6WD.js +0 -26
- package/dist/chunk-26ALFAKU.js +0 -8954
- package/dist/chunk-2YYOFA2A.js +0 -638
- package/dist/chunk-353QTP3X.js +0 -69
- package/dist/chunk-3A7BDDXS.js +0 -188
- package/dist/chunk-3I62TYHW.js +0 -438
- package/dist/chunk-3XJM5HX6.js +0 -136
- package/dist/chunk-3XWQ4ZS5.js +0 -494
- package/dist/chunk-43ECPEJT.js +0 -274
- package/dist/chunk-46P74AFU.js +0 -51
- package/dist/chunk-4HHIW7PR.js +0 -46
- package/dist/chunk-4UJOEGWH.js +0 -377
- package/dist/chunk-4UJOEGWH.js.map +0 -1
- package/dist/chunk-542AB7CV.js +0 -718
- package/dist/chunk-5HLAN4U2.js +0 -219
- package/dist/chunk-6VVSAVMC.js +0 -84
- package/dist/chunk-72K4LY24.js +0 -76
- package/dist/chunk-7KJ24KFI.js +0 -324
- package/dist/chunk-7SYPFWCW.js +0 -297
- package/dist/chunk-A2EZCLLG.js +0 -100
- package/dist/chunk-BUKBQPDY.js +0 -1902
- package/dist/chunk-BXHS4OIS.js +0 -207
- package/dist/chunk-BXHS4OIS.js.map +0 -1
- package/dist/chunk-BXTSQUBI.js +0 -544
- package/dist/chunk-CECKSPNC.js +0 -125
- package/dist/chunk-CRORJLBL.js +0 -91
- package/dist/chunk-CTX4RST4.js +0 -287
- package/dist/chunk-DF7IGB3K.js +0 -296
- package/dist/chunk-DNZILIEW.js +0 -56
- package/dist/chunk-DZLPWNR4.js +0 -275
- package/dist/chunk-EFDL5R3O.js +0 -169
- package/dist/chunk-EZ6GOPHI.js +0 -843
- package/dist/chunk-FBTQGEUE.js +0 -225
- package/dist/chunk-FKWXVASL.js +0 -106
- package/dist/chunk-GJKEGZJB.js +0 -84
- package/dist/chunk-GUEFMO3G.js +0 -64
- package/dist/chunk-GUPOLYU5.js +0 -23
- package/dist/chunk-H3KQKEQH.js +0 -74
- package/dist/chunk-H7FWXSSR.js +0 -430
- package/dist/chunk-HQSBYDPE.js +0 -679
- package/dist/chunk-HQSBYDPE.js.map +0 -1
- package/dist/chunk-IWNQRZHT.js +0 -910
- package/dist/chunk-J5RABWAF.js +0 -25
- package/dist/chunk-JGAF356Q.js +0 -46
- package/dist/chunk-JTHOGRB6.js +0 -45
- package/dist/chunk-KDTF2SN6.js +0 -547
- package/dist/chunk-KMQKTZ47.js +0 -19
- package/dist/chunk-KQEDNZ7K.js +0 -73
- package/dist/chunk-KXVJJQG6.js +0 -58
- package/dist/chunk-LFSSOKDJ.js +0 -76
- package/dist/chunk-MBJHRRDS.js +0 -66
- package/dist/chunk-MGHPM72R.js +0 -217
- package/dist/chunk-MPNYIGO7.js +0 -857
- package/dist/chunk-MPQ5HUAO.js +0 -131
- package/dist/chunk-NNQCVHVJ.js +0 -1919
- package/dist/chunk-NNSDAAPZ.js +0 -97
- package/dist/chunk-NSBNIPIW.js +0 -225
- package/dist/chunk-NSBNIPIW.js.map +0 -1
- package/dist/chunk-O3HSNUTL.js +0 -344
- package/dist/chunk-O4OPH3ZE.js +0 -476
- package/dist/chunk-OMOHRYZ3.js +0 -94
- package/dist/chunk-OOGGID5L.js +0 -148
- package/dist/chunk-OPWDBSU4.js +0 -604
- package/dist/chunk-OQ53NO5K.js +0 -42
- package/dist/chunk-OQ7CLFEL.js +0 -229
- package/dist/chunk-OX5OAT7L.js +0 -831
- package/dist/chunk-P4TA3B4C.js +0 -35
- package/dist/chunk-PA5PS5KO.js +0 -333
- package/dist/chunk-PF3SQX7Z.js +0 -197
- package/dist/chunk-PFNUAV22.js +0 -64
- package/dist/chunk-QWRZIHFS.js +0 -685
- package/dist/chunk-QYOEFBWO.js +0 -69
- package/dist/chunk-RFVEHOOC.js +0 -91
- package/dist/chunk-RKNSYZX3.js +0 -142
- package/dist/chunk-RQA2NP4Y.js +0 -207
- package/dist/chunk-S3TBE37M.js +0 -215
- package/dist/chunk-S6ZLKSQJ.js +0 -285
- package/dist/chunk-SF3GHRMB.js +0 -139
- package/dist/chunk-SFDDNAFB.js +0 -152
- package/dist/chunk-SW5ONXMD.js +0 -225
- package/dist/chunk-T764KNWP.js +0 -52
- package/dist/chunk-TDTFJZAC.js +0 -156
- package/dist/chunk-TFEPULZS.js +0 -97
- package/dist/chunk-TMYLRI3S.js +0 -3510
- package/dist/chunk-TSVQTNXZ.js +0 -166
- package/dist/chunk-TSVQTNXZ.js.map +0 -1
- package/dist/chunk-TV67FGUQ.js +0 -39
- package/dist/chunk-U73TWJRK.js +0 -249
- package/dist/chunk-UMLSSKXS.js +0 -103
- package/dist/chunk-UOWWM3YF.js +0 -930
- package/dist/chunk-UOYVUUTX.js +0 -288
- package/dist/chunk-V2FZ4QNC.js +0 -191
- package/dist/chunk-V3O7ZSQD.js +0 -106
- package/dist/chunk-V4GSW4NH.js +0 -1518
- package/dist/chunk-VGEW4R4Y.js +0 -191
- package/dist/chunk-VYEFXIEM.js +0 -2511
- package/dist/chunk-VYEFXIEM.js.map +0 -1
- package/dist/chunk-W2OX5K3G.js +0 -98
- package/dist/chunk-WBZXRHL7.js +0 -163
- package/dist/chunk-X45ABI5E.js +0 -167
- package/dist/chunk-XGEJTRNF.js +0 -455
- package/dist/chunk-XLYLRUFX.js +0 -24026
- package/dist/chunk-XR6FJ272.js +0 -111
- package/dist/chunk-Y5IMWZZN.js +0 -5471
- package/dist/chunk-Y7KAVULE.js +0 -66
- package/dist/chunk-YIQ7PMJG.js +0 -1646
- package/dist/chunk-YKXSJGMA.js +0 -1744
- package/dist/chunk-YUA6VVET.js +0 -75
- package/dist/chunk-YYK4CXLY.js +0 -138
- package/dist/chunk-YYQQPDVY.js +0 -2209
- package/dist/chunk-Z5AO4Y6W.js +0 -5368
- package/dist/chunk-Z5KZ5BV3.js +0 -170
- package/dist/chunk-ZPO3NAJY.js +0 -203
- package/dist/chunk-ZR3BISO2.js +0 -224
- package/dist/chunk-ZR5H5CZI.js +0 -89
- package/dist/chunk-ZSZGKMOK.js +0 -98
- package/dist/cite-KDF6WQXE.js +0 -191
- package/dist/claim-BKJBLN7A.js +0 -200
- package/dist/client-MRXMPXJE.js +0 -19
- package/dist/code-XZWB4INH.js +0 -76
- package/dist/companies-6IQS5YAR.js +0 -198
- package/dist/company-WT4Q52W6.js +0 -308
- package/dist/complete-TTL4GXUZ.js +0 -84
- package/dist/config-ZXODU47A.js +0 -88
- package/dist/connect-G6RW4GPI.js +0 -45
- package/dist/content-3SZYVF56.js +0 -85
- package/dist/conversation-QDMNXK5P.js +0 -96
- package/dist/conversion-report-EIZEII3H.js +0 -127
- package/dist/conversion-upload-command-BYYYQXY5.js +0 -439
- package/dist/conversion-writes-3N2J25ZN.js +0 -122
- package/dist/conversions-3DNIEYY2.js +0 -78
- package/dist/conversions-DPKOO7H5.js +0 -140
- package/dist/copy-writes-OFXLTBQN.js +0 -170
- package/dist/countries-JM54BJXV.js +0 -82
- package/dist/create-64UE6JVK.js +0 -135
- package/dist/create-NKMOQC7A.js +0 -239
- package/dist/create-OXBIHL72.js +0 -62
- package/dist/create-ZM3I3NSN.js +0 -210
- package/dist/creatives-63O6HUXF.js +0 -58
- package/dist/creatives-J6MZKMCX.js +0 -118
- package/dist/creatives-XRLYZ2ME.js +0 -223
- package/dist/credentials-FC36D37N.js +0 -290
- package/dist/critique-AC7EPDQA.js +0 -1451
- package/dist/critique-RHN32S7D.js +0 -232
- package/dist/crm-NFDEK2GT.js +0 -227
- package/dist/crm-NQ4FDJ7E.js +0 -323
- package/dist/crop-B2CACBC4.js +0 -113
- package/dist/currency-XRGG5OKI.js +0 -88
- package/dist/custom-conversions-R3ROXHYL.js +0 -128
- package/dist/customers-TNVCX27L.js +0 -65
- package/dist/decide-MDNIHSQG.js +0 -199
- package/dist/delete-DTHXGG5F.js +0 -67
- package/dist/delete-F43G4Z3D.js +0 -85
- package/dist/delete-LGUXPTBC.js +0 -69
- package/dist/delete-RSZU4I76.js +0 -57
- package/dist/delete-VXYTITXA.js +0 -71
- package/dist/delete-ZKKB553W.js +0 -69
- package/dist/demographics-2UXLA4GW.js +0 -141
- package/dist/describe-CH3IFPOT.js +0 -97
- package/dist/describe-QTAOAQM4.js +0 -97
- package/dist/dimensions-5E3AN6A7.js +0 -101
- package/dist/discard-E7AD6IVJ.js +0 -69
- package/dist/discover-ELMDMJRX.js +0 -93
- package/dist/discover-SRXLIPGU.js +0 -172
- package/dist/domain-B6GYZ6BX.js +0 -101
- package/dist/download-FS5WHNFA.js +0 -172
- package/dist/download-XOABASZF.js +0 -299
- package/dist/draft-4KW5SRI2.js +0 -106
- package/dist/draft-7VI5GTEY.js +0 -247
- package/dist/draft-EWR2ADNX.js +0 -313
- package/dist/draft-F26LGHM5.js +0 -408
- package/dist/draft-ICHAAUVH.js +0 -106
- package/dist/draft-MSWSLIY2.js +0 -288
- package/dist/draft-PFW24WXM.js +0 -342
- package/dist/draft-XBD3UC64.js +0 -220
- package/dist/env-BNQON23N.js +0 -53
- package/dist/experiment-SNC6RCF3.js +0 -1397
- package/dist/experiments-E6NXWJ7X.js +0 -236
- package/dist/export-6O62J5I2.js +0 -168
- package/dist/extract-D2WSRIKY.js +0 -121
- package/dist/facets-R5U2G3R2.js +0 -117
- package/dist/favorites-GGJGLED7.js +0 -178
- package/dist/feed-FN3BLYD2.js +0 -177
- package/dist/feedback-LPFQ567L.js +0 -136
- package/dist/feedback-QQRAOFJN.js +0 -115
- package/dist/feedback-record-OCKDPXGM.js +0 -269
- package/dist/fetch-ET734X4Q.js +0 -139
- package/dist/fetch-I5VVAVLY.js +0 -204
- package/dist/find-XS42XIYQ.js +0 -143
- package/dist/fit-C7SYZA65.js +0 -65
- package/dist/flows-I5G5ICEQ.js +0 -250
- package/dist/follow-7O37OI4Q.js +0 -94
- package/dist/follow-competitors-XLLDO72Q.js +0 -112
- package/dist/following-VLSMUMOM.js +0 -113
- package/dist/fonts-BOQTTVX5.js +0 -39
- package/dist/forecast-5G5LMGHN.js +0 -121
- package/dist/forecast-QBXVLV7Q.js +0 -169
- package/dist/funding-XLY5LNY6.js +0 -85
- package/dist/funnel-O43PBVPI.js +0 -397
- package/dist/ga4-3JQDPZ27.js +0 -55
- package/dist/generate-FW5ZPZCC.js +0 -263
- package/dist/get-4N4F4F5P.js +0 -62
- package/dist/get-55JEQM4R.js +0 -59
- package/dist/get-5P4WESPY.js +0 -92
- package/dist/get-6VRSSUJJ.js +0 -38
- package/dist/get-DOZKX4LD.js +0 -74
- package/dist/get-MS7HTZBZ.js +0 -62
- package/dist/get-RTEW2UQK.js +0 -82
- package/dist/get-SZ3BKDS6.js +0 -56
- package/dist/gif-H2GKAG4C.js +0 -110
- package/dist/google-FJJ34DCE.js +0 -144
- package/dist/google-V74DJSG6.js +0 -3270
- package/dist/google-V74DJSG6.js.map +0 -1
- package/dist/google-ads-3TEGRLIY.js +0 -198
- package/dist/group-JNLMRIKV.js +0 -43
- package/dist/group-KEJHQXTJ.js +0 -43
- package/dist/gsc-N7ILDOX4.js +0 -30
- package/dist/history-IXKSY5DE.js +0 -69
- package/dist/history-SWBZK2YL.js +0 -102
- package/dist/history-ZWU3ZV2E.js +0 -153
- package/dist/hubspot-WIZRU3UE.js +0 -782
- package/dist/icon-V6VRNURZ.js +0 -137
- package/dist/ideas-CXDU7YCE.js +0 -45
- package/dist/images-PB6SWXTZ.js +0 -92
- package/dist/improve-JWQYC7AP.js +0 -86
- package/dist/ingest-7ZN46XK4.js +0 -123
- package/dist/ingest-GZ6EXNHT.js +0 -27
- package/dist/insights-BWZXYBZY.js +0 -658
- package/dist/insights-P7JG6Y2H.js +0 -132
- package/dist/inspect-BCKUHTRR.js +0 -192
- package/dist/inspiration-WGMKYSGM.js +0 -53
- package/dist/instant-experiences-B4HZ7KV4.js +0 -263
- package/dist/instant-experiences-B4HZ7KV4.js.map +0 -1
- package/dist/intent-EWNVDZKU.js +0 -95
- package/dist/job-FJRS3GVA.js +0 -202
- package/dist/job-create-MVXMKPXS.js +0 -109
- package/dist/job-status-O3GGFMAW.js +0 -74
- package/dist/keep-55NEIXH2.js +0 -78
- package/dist/keyword-gap-YUG6BVQI.js +0 -130
- package/dist/keyword-metrics-7VH4DGCR.js +0 -200
- package/dist/keywords-for-site-OIICFZI5.js +0 -131
- package/dist/knowledge-OM3GKZHU.js +0 -195
- package/dist/landing-T42TKOBK.js +0 -28
- package/dist/landings-JKO53RI4.js +0 -151
- package/dist/languages-TAFIWRI6.js +0 -40
- package/dist/languages-YU5YUGFN.js +0 -55
- package/dist/launches-SJTNJHZY.js +0 -19
- package/dist/layerize-HUELG4D3.js +0 -190
- package/dist/lead-routes-KLTGRS2S.js +0 -733
- package/dist/leads-LQT5KDYJ.js +0 -115
- package/dist/leads-YEM6VQAB.js +0 -540
- package/dist/leads-YEM6VQAB.js.map +0 -1
- package/dist/learn-UY5FNEQF.js +0 -207
- package/dist/library-2ZTAEY4Y.js +0 -211
- package/dist/lighthouse-FA4NNWNM.js +0 -75
- package/dist/line-item-writes-CQRO25FM.js +0 -211
- package/dist/line-items-56KP6W53.js +0 -107
- package/dist/link-CQNRSZ2Z.js +0 -67
- package/dist/linkedin-ICM5CNNS.js +0 -1330
- package/dist/linkedin-person-F74QX3WE.js +0 -139
- package/dist/list-5L74D5T5.js +0 -67
- package/dist/list-6PNILPKX.js +0 -76
- package/dist/list-FXMOUNMB.js +0 -93
- package/dist/list-GMEW776J.js +0 -154
- package/dist/list-O6KMSZUA.js +0 -57
- package/dist/list-OLBLGL5J.js +0 -65
- package/dist/list-TLKWSNZR.js +0 -51
- package/dist/list-TSM2LE2Q.js +0 -306
- package/dist/list-VQLA4C62.js +0 -50
- package/dist/locations-CPLAS65V.js +0 -69
- package/dist/locations-ONA23SAQ.js +0 -40
- package/dist/log-55GU4YPD.js +0 -95
- package/dist/logo-3YBVVQ4K.js +0 -18
- package/dist/lookup-Z3AA3ON4.js +0 -23
- package/dist/make-3LNSICDO.js +0 -1367
- package/dist/map-ARNZ3BY3.js +0 -436
- package/dist/mcp-PXKB5LQD.js +0 -729
- package/dist/media-3ON3VBC3.js +0 -18
- package/dist/media-SEC7SPHW.js +0 -89
- package/dist/media-sources-7EXSVEAE.js +0 -35
- package/dist/members-35KOCZHC.js +0 -47
- package/dist/meme-JL24ZEUF.js +0 -100
- package/dist/meta-W2YTPZE7.js +0 -122
- package/dist/metrics-WDFO5ESK.js +0 -152
- package/dist/models-UVJ7M7DP.js +0 -155
- package/dist/normalize-I7KCFLAK.js +0 -144
- package/dist/normalize-KXI3OOFS.js +0 -806
- package/dist/options-EYZEFVNI.js +0 -125
- package/dist/organization-KJPIZ66W.js +0 -949
- package/dist/output-LECDMH7S.js +0 -24
- package/dist/page-OUC6APBH.js +0 -105
- package/dist/page-photos-UULNPJL2.js +0 -118
- package/dist/pages-WBJTWSBH.js +0 -67
- package/dist/performance-4MEHG2H3.js +0 -27
- package/dist/performance-QZGRGTTY.js +0 -5565
- package/dist/pinterest-PXWEV5OM.js +0 -104
- package/dist/pixels-CBZQK7ME.js +0 -62
- package/dist/pixels-ZXBYDD64.js +0 -109
- package/dist/plan-QND22WEP.js +0 -208
- package/dist/posts-XZUV6SGX.js +0 -36
- package/dist/preview-KMEUO2CB.js +0 -218
- package/dist/profile-WXAGYNMQ.js +0 -159
- package/dist/promoted-tweet-writes-RKRDYXAF.js +0 -183
- package/dist/promoted-tweets-UTOGYF5N.js +0 -119
- package/dist/properties-Q7W4YPU6.js +0 -101
- package/dist/publish-4BXIE5GB.js +0 -344
- package/dist/query-H3VKUXUG.js +0 -236
- package/dist/query-ICQABM2L.js +0 -62
- package/dist/query-ZFU76BDS.js +0 -231
- package/dist/questionnaire-7AO5NN34.js +0 -94
- package/dist/read-RQ6B75BE.js +0 -141
- package/dist/reddit-CGDBA7SX.js +0 -29
- package/dist/refresh-L2HDEKPI.js +0 -97
- package/dist/refresh-LMGFOXE6.js +0 -42
- package/dist/release-DLUKLF5A.js +0 -63
- package/dist/relevant-pages-DTSXV6J2.js +0 -99
- package/dist/remove-GOLZDJ7V.js +0 -49
- package/dist/remove-VM3KCNGB.js +0 -53
- package/dist/reopen-HJBG23JS.js +0 -66
- package/dist/rerun-SYTG4PF6.js +0 -96
- package/dist/research-TW6Z74VO.js +0 -265
- package/dist/research-VHJI5A3Y.js +0 -75
- package/dist/reset-L2UK4NTV.js +0 -57
- package/dist/reset-RZFVT6EV.js +0 -57
- package/dist/resolve-2BBQKCP7.js +0 -124
- package/dist/retry-2QFOQQIC.js +0 -63
- package/dist/retry-YN7FECGJ.js +0 -65
- package/dist/retry-failed-NOCAPHDH.js +0 -45
- package/dist/revenue-Y3USV6E7.js +0 -91
- package/dist/rule-writes-DU55RVJE.js +0 -525
- package/dist/rule-writes-DU55RVJE.js.map +0 -1
- package/dist/rules-DQBFGPKC.js +0 -217
- package/dist/rules-S5H4CTN6.js +0 -99
- package/dist/rules-add-UZR5X7QG.js +0 -465
- package/dist/run-DPRASW62.js +0 -69
- package/dist/run-TBGBI522.js +0 -71
- package/dist/scaffold-ad-RCGPKWBQ.js +0 -1513
- package/dist/scaffold-static-ad-2GJOXOKA.js +0 -1011
- package/dist/scaffold-video-Y7X34F3N.js +0 -885
- package/dist/schedule-MMW63ZDZ.js +0 -67
- package/dist/schedule-VY75FPE3.js +0 -64
- package/dist/scheduled-agents-2ZSA5S3K.js +0 -55
- package/dist/schema-KIJGNKJA.js +0 -135
- package/dist/schema-LJTWPB45.js +0 -121
- package/dist/schema-LJTWPB45.js.map +0 -1
- package/dist/scrape-G6QIBY6U.js +0 -2241
- package/dist/screenshot-CMOGVSDO.js +0 -102
- package/dist/search-CSHJCL73.js +0 -228
- package/dist/search-DZGN5GDP.js +0 -51
- package/dist/search-EIIDSTTZ.js +0 -177
- package/dist/search-FY53LEQY.js +0 -26
- package/dist/search-S4YK5ACT.js +0 -92
- package/dist/search-XT22RJG2.js +0 -91
- package/dist/search-copy-32URULZJ.js +0 -168
- package/dist/seeds-XH2263HW.js +0 -101
- package/dist/select-HXFWS3YO.js +0 -110
- package/dist/sends-OKJS7WVX.js +0 -349
- package/dist/sequences-DOITIST4.js +0 -146
- package/dist/set-prompt-QPIXPF4Q.js +0 -199
- package/dist/setup-links-7XH4QW57.js +0 -144
- package/dist/shared-5EPTXTGW.js +0 -32
- package/dist/shopify-MNHCP5JX.js +0 -3980
- package/dist/site-JH5HWJ7P.js +0 -180
- package/dist/sitemaps-NSOO5DBU.js +0 -77
- package/dist/sites-VJDFYXP4.js +0 -97
- package/dist/skills-RFKWA74T.js +0 -47
- package/dist/sources-QZNISAXZ.js +0 -30
- package/dist/sources-X6R7OCG2.js +0 -457
- package/dist/stale-BVP4XBGS.js +0 -90
- package/dist/stats-IYESUTZB.js +0 -34
- package/dist/status-4DXPN6EW.js +0 -65
- package/dist/sticker-C7O2K75Q.js +0 -102
- package/dist/stock-YA27CW4K.js +0 -187
- package/dist/studies-OSYBQE7W.js +0 -250
- package/dist/studio-V3HINEVU.js +0 -49
- package/dist/study-writes-UA2CDAUF.js +0 -470
- package/dist/study-writes-UA2CDAUF.js.map +0 -1
- package/dist/suggest-BLYWQV4H.js +0 -66
- package/dist/sync-BP2NL7BA.js +0 -57
- package/dist/sync-KXOJMM2K.js +0 -279
- package/dist/sync-WGZ4522U.js +0 -55
- package/dist/sync-definition-SAOKH7RQ.js +0 -70
- package/dist/tag-MKWBX22O.js +0 -57
- package/dist/tag-manager-AKW4EG4W.js +0 -43
- package/dist/tags-DV3IVJBS.js +0 -23
- package/dist/tags-N54OQ55M.js +0 -23
- package/dist/tags-QAL6XAHS.js +0 -26
- package/dist/tags-RMPC3Q5E.js +0 -23
- package/dist/tags-TSEVQAKY.js +0 -227
- package/dist/targeting-VOZUDYFI.js +0 -762
- package/dist/targeting-constants-7YWLK6KM.js +0 -118
- package/dist/targeting-criteria-OUN7VYFP.js +0 -113
- package/dist/targets-SUDKTBLH.js +0 -106
- package/dist/terms-AY5LECWX.js +0 -102
- package/dist/testimonials-JMKFBJYD.js +0 -32
- package/dist/themes-WJ35YEXI.js +0 -95
- package/dist/top-companies-ESGGS2SE.js +0 -111
- package/dist/transcript-YXTBCJ67.js +0 -165
- package/dist/translate-W6AMHQWO.js +0 -603
- package/dist/triggers-YZTGKFBI.js +0 -144
- package/dist/tweets-B6EWPDYI.js +0 -123
- package/dist/unfollow-ACQTL2GW.js +0 -46
- package/dist/unlink-FEKMX5Q7.js +0 -70
- package/dist/unstage-MWAG2SLK.js +0 -96
- package/dist/unstage-PIO6RJLT.js +0 -88
- package/dist/update-3PFWIMEI.js +0 -192
- package/dist/update-4ANTGEPT.js +0 -81
- package/dist/update-HCJC2OG4.js +0 -101
- package/dist/update-IHWWJFD5.js +0 -66
- package/dist/update-NGLID7LC.js +0 -155
- package/dist/upload-JMXCQDCA.js +0 -130
- package/dist/upload-JYLLFY3P.js +0 -150
- package/dist/upscale-FZQ5P2UR.js +0 -109
- package/dist/url-options-BWNHNIAK.js +0 -131
- package/dist/url-params-4ROYWFVV.js +0 -101
- package/dist/use-SMS2UK32.js +0 -111
- package/dist/validate-P4RRB3QA.js +0 -125
- package/dist/variant-2PJH7U2M.js +0 -338
- package/dist/videos-RRXYBR52.js +0 -41
- package/dist/view-AJ7ROYFP.js +0 -133
- package/dist/viewer-check-PD6UQ63S.js +0 -83
- package/dist/web-5SWHU5KW.js +0 -173
- package/dist/winners-FJXS3LGU.js +0 -113
- package/dist/winning-ads-HH3WI5KB.js +0 -86
- package/dist/write-commands-EOIXXSVY.js +0 -1172
- package/dist/write-commands-EOIXXSVY.js.map +0 -1
- package/dist/write-commands-GBMVUFZU.js +0 -1525
- package/dist/write-commands-GBMVUFZU.js.map +0 -1
- package/dist/write-commands-GQP24VMR.js +0 -713
- package/dist/write-commands-GQP24VMR.js.map +0 -1
- package/dist/write-commands-HY2OKPWW.js +0 -206
- package/dist/x-6VIOYUKX.js +0 -47
- /package/dist/{account-7YEN7D6B.js.map → account-NSRT5KE6.js.map} +0 -0
- /package/dist/{account-RXX6HCCL.js.map → account-OXD426YD.js.map} +0 -0
- /package/dist/{account-2EUMSJ6E.js.map → account-XIC5TTV3.js.map} +0 -0
- /package/dist/{account-assets-HX7OYWZA.js.map → account-assets-V7KSSTVP.js.map} +0 -0
- /package/dist/{account-level-I5BKCGP5.js.map → account-level-2KLG6HTG.js.map} +0 -0
- /package/dist/{account-reads-7FUCOWBE.js.map → account-reads-ZPZUCB3P.js.map} +0 -0
- /package/dist/{account-users-Z5RFUBXP.js.map → account-users-XTUKRDWK.js.map} +0 -0
- /package/dist/{account-writes-TG3XVEPD.js.map → account-writes-VRRLT356.js.map} +0 -0
- /package/dist/{accounts-MFCQIHYM.js.map → accounts-25JL77F7.js.map} +0 -0
- /package/dist/{accounts-AC7ZBCS2.js.map → accounts-45MUDNOM.js.map} +0 -0
- /package/dist/{accounts-MMIWLNGB.js.map → accounts-AF72N4NV.js.map} +0 -0
- /package/dist/{accounts-WYFUDH2V.js.map → accounts-HJAQTVDA.js.map} +0 -0
- /package/dist/{accounts-I4EXOKR7.js.map → accounts-KQ7NCM4L.js.map} +0 -0
- /package/dist/{actions-QIKHRNJX.js.map → actions-IJO4JW7J.js.map} +0 -0
- /package/dist/{active-entities-AEXKE2EN.js.map → active-entities-3266UJYN.js.map} +0 -0
- /package/dist/{activecampaign-RQJ7PQPM.js.map → activecampaign-PBTUMTO5.js.map} +0 -0
- /package/dist/{activities-N5BD57MF.js.map → activities-ORMACIG2.js.map} +0 -0
- /package/dist/{ad-group-writes-OLQM2VNX.js.map → ad-group-writes-Y6CCMPCM.js.map} +0 -0
- /package/dist/{ad-groups-ENLD7CU4.js.map → ad-groups-TW2UKDVU.js.map} +0 -0
- /package/dist/{ad-writes-FF6PT3R5.js.map → ad-writes-J3UVUH7D.js.map} +0 -0
- /package/dist/{add-4NK4DIER.js.map → add-CKJXQUVI.js.map} +0 -0
- /package/dist/{add-3JWLLGUJ.js.map → add-CSRB6GVJ.js.map} +0 -0
- /package/dist/{add-AO3F6EJY.js.map → add-KHQXXHC5.js.map} +0 -0
- /package/dist/{add-NQUHPVZ5.js.map → add-NJUG3IQ2.js.map} +0 -0
- /package/dist/{add-4JUXMRNA.js.map → add-XYSUKZSU.js.map} +0 -0
- /package/dist/{add-QYLIXGQT.js.map → add-YQPFRDVM.js.map} +0 -0
- /package/dist/{add-accounts-XCYWXGO3.js.map → add-accounts-IRHBFNNC.js.map} +0 -0
- /package/dist/{ads-H6TOLQKA.js.map → ads-5CJQRTUN.js.map} +0 -0
- /package/dist/{ads-XEAMDEZW.js.map → ads-DI3J3KCQ.js.map} +0 -0
- /package/dist/{ads-JNXLC3PU.js.map → ads-EVQ37EV3.js.map} +0 -0
- /package/dist/{ads-MXH4DNG2.js.map → ads-O5PUYU7H.js.map} +0 -0
- /package/dist/{adsets-W5JSNW4Q.js.map → adsets-4IW5TRAK.js.map} +0 -0
- /package/dist/{advertisers-IAXF43LX.js.map → advertisers-5XCIZ7WS.js.map} +0 -0
- /package/dist/{advertisers-7KCF3ODT.js.map → advertisers-JNOWSZZC.js.map} +0 -0
- /package/dist/{analytics-5SPL5E7Q.js.map → analytics-CZMCM7XC.js.map} +0 -0
- /package/dist/{analytics-3AMSN535.js.map → analytics-K5FCQLI5.js.map} +0 -0
- /package/dist/{animate-WXSSXUTY.js.map → animate-C6BRMRRD.js.map} +0 -0
- /package/dist/{approved-HDDHLECJ.js.map → approved-RP5ADN7E.js.map} +0 -0
- /package/dist/{asset-writes-VYGJRLEA.js.map → asset-writes-RF6XTWLY.js.map} +0 -0
- /package/dist/{assign-D3XCS6PD.js.map → assign-WXZNXVJH.js.map} +0 -0
- /package/dist/{audience-size-SQRAXCQD.js.map → audience-size-ZCWH4CFC.js.map} +0 -0
- /package/dist/{audience-writes-YMCOA47Z.js.map → audience-writes-5KT6FHUY.js.map} +0 -0
- /package/dist/{audiences-XUY2Y6OH.js.map → audiences-4MYDTY74.js.map} +0 -0
- /package/dist/{audiences-VKU7E4LI.js.map → audiences-5TOTVZMK.js.map} +0 -0
- /package/dist/{audiences-Y4UIPHB7.js.map → audiences-ZDOK3OYC.js.map} +0 -0
- /package/dist/{audit-DVIKUMSU.js.map → audit-RBRXPPKK.js.map} +0 -0
- /package/dist/{audit-HWA6SOH3.js.map → audit-SACXTAIP.js.map} +0 -0
- /package/dist/{autocomplete-FJNOPOVG.js.map → autocomplete-P5OU7QVL.js.map} +0 -0
- /package/dist/{avatars-VMJE6IL4.js.map → avatars-UHBA2BQ3.js.map} +0 -0
- /package/dist/{bid-pricing-HFPRGFPN.js.map → bid-pricing-LHNYSDG4.js.map} +0 -0
- /package/dist/{brand-NJI7MUWN.js.map → brand-7WL3O74X.js.map} +0 -0
- /package/dist/{brief-LHQJCJOK.js.map → brief-HWZU75WP.js.map} +0 -0
- /package/dist/{businesses-DEKE2CRX.js.map → businesses-F6PN34WK.js.map} +0 -0
- /package/dist/{campaign-groups-QPTKMJBU.js.map → campaign-groups-BYS3GNEP.js.map} +0 -0
- /package/dist/{campaign-writes-3NFFDIFM.js.map → campaign-writes-BHS3POAH.js.map} +0 -0
- /package/dist/{campaign-writes-YSFLDOPH.js.map → campaign-writes-N6OHAK6V.js.map} +0 -0
- /package/dist/{campaigns-P6WHQMG3.js.map → campaigns-2E4AQBFB.js.map} +0 -0
- /package/dist/{campaigns-KXQDUFVX.js.map → campaigns-3U5IRXSV.js.map} +0 -0
- /package/dist/{campaigns-4KDJBCA7.js.map → campaigns-IRMLPW6N.js.map} +0 -0
- /package/dist/{campaigns-AI2ZHOK6.js.map → campaigns-QLKGN4FB.js.map} +0 -0
- /package/dist/{canvas-CDMROW44.js.map → canvas-GGHJ26ZM.js.map} +0 -0
- /package/dist/{capabilities-B24L6H6H.js.map → capabilities-TKEEHR7K.js.map} +0 -0
- /package/dist/{cards-UCEENP55.js.map → cards-HUXBNMEM.js.map} +0 -0
- /package/dist/{catalog-FBJC7XUE.js.map → catalog-7KQN43HS.js.map} +0 -0
- /package/dist/{catalogs-2CCZQAS3.js.map → catalogs-WYRRTRCM.js.map} +0 -0
- /package/dist/{changes-TTQCZMYX.js.map → changes-OIVPZJHE.js.map} +0 -0
- /package/dist/{chatgpt-D7MUGYE5.js.map → chatgpt-RQQWU7AP.js.map} +0 -0
- /package/dist/{chats-AI4NH34F.js.map → chats-PBXYH2LT.js.map} +0 -0
- /package/dist/{check-L2BVFQU6.js.map → check-SVYI72DF.js.map} +0 -0
- /package/dist/{chunk-RKNSYZX3.js.map → chunk-2RL2T5JO.js.map} +0 -0
- /package/dist/{chunk-QWRZIHFS.js.map → chunk-3HLQZTQ3.js.map} +0 -0
- /package/dist/{chunk-4HHIW7PR.js.map → chunk-3J52GJAY.js.map} +0 -0
- /package/dist/{chunk-RQA2NP4Y.js.map → chunk-42JTSTQ3.js.map} +0 -0
- /package/dist/{chunk-O4OPH3ZE.js.map → chunk-45D6WRCJ.js.map} +0 -0
- /package/dist/{chunk-ZPO3NAJY.js.map → chunk-4AEAL63J.js.map} +0 -0
- /package/dist/{chunk-NNSDAAPZ.js.map → chunk-4H6XLX7E.js.map} +0 -0
- /package/dist/{chunk-PA5PS5KO.js.map → chunk-4ULGRGBG.js.map} +0 -0
- /package/dist/{chunk-KMQKTZ47.js.map → chunk-4XMPL3RU.js.map} +0 -0
- /package/dist/{chunk-OX5OAT7L.js.map → chunk-5AOTCCTT.js.map} +0 -0
- /package/dist/{chunk-KXVJJQG6.js.map → chunk-5G6R3WYN.js.map} +0 -0
- /package/dist/{chunk-JTHOGRB6.js.map → chunk-5HPKYRTE.js.map} +0 -0
- /package/dist/{chunk-Z5AO4Y6W.js.map → chunk-5NLUTJCQ.js.map} +0 -0
- /package/dist/{chunk-GUEFMO3G.js.map → chunk-6FWVRXDW.js.map} +0 -0
- /package/dist/{chunk-MPNYIGO7.js.map → chunk-6HPTF5YS.js.map} +0 -0
- /package/dist/{chunk-V2FZ4QNC.js.map → chunk-6KEVNO5O.js.map} +0 -0
- /package/dist/{chunk-JGAF356Q.js.map → chunk-6QINKM6T.js.map} +0 -0
- /package/dist/{chunk-MBJHRRDS.js.map → chunk-73MLPGI2.js.map} +0 -0
- /package/dist/{chunk-WBZXRHL7.js.map → chunk-7OVPQX4X.js.map} +0 -0
- /package/dist/{chunk-43ECPEJT.js.map → chunk-7SNNQCDD.js.map} +0 -0
- /package/dist/{chunk-O3HSNUTL.js.map → chunk-B5UVOCYA.js.map} +0 -0
- /package/dist/{chunk-OPWDBSU4.js.map → chunk-BRNZMKO4.js.map} +0 -0
- /package/dist/{chunk-OQ53NO5K.js.map → chunk-BU7W7MKF.js.map} +0 -0
- /package/dist/{chunk-3I62TYHW.js.map → chunk-CJFCQMUY.js.map} +0 -0
- /package/dist/{chunk-QYOEFBWO.js.map → chunk-CQMAR4BH.js.map} +0 -0
- /package/dist/{chunk-W2OX5K3G.js.map → chunk-CXYX6G3I.js.map} +0 -0
- /package/dist/{chunk-OMOHRYZ3.js.map → chunk-CZESYOCC.js.map} +0 -0
- /package/dist/{chunk-Y5IMWZZN.js.map → chunk-D6VQPBVM.js.map} +0 -0
- /package/dist/{chunk-TV67FGUQ.js.map → chunk-D7FJ5KHG.js.map} +0 -0
- /package/dist/{chunk-Y7KAVULE.js.map → chunk-DEZBCK5P.js.map} +0 -0
- /package/dist/{chunk-DZLPWNR4.js.map → chunk-DK66PUXL.js.map} +0 -0
- /package/dist/{chunk-EZ6GOPHI.js.map → chunk-DLM5OSHM.js.map} +0 -0
- /package/dist/{chunk-CTX4RST4.js.map → chunk-DNH2ZPZP.js.map} +0 -0
- /package/dist/{chunk-UMLSSKXS.js.map → chunk-DWSSQBLO.js.map} +0 -0
- /package/dist/{chunk-YUA6VVET.js.map → chunk-E56V3RFO.js.map} +0 -0
- /package/dist/{chunk-SW5ONXMD.js.map → chunk-EHNORFUW.js.map} +0 -0
- /package/dist/{chunk-EFDL5R3O.js.map → chunk-ESXUIV6V.js.map} +0 -0
- /package/dist/{chunk-XLYLRUFX.js.map → chunk-FAV6GUOZ.js.map} +0 -0
- /package/dist/{chunk-SF3GHRMB.js.map → chunk-FHN4QXZN.js.map} +0 -0
- /package/dist/{chunk-UOWWM3YF.js.map → chunk-FSEFZZ2T.js.map} +0 -0
- /package/dist/{chunk-H3KQKEQH.js.map → chunk-G4JTXVLA.js.map} +0 -0
- /package/dist/{chunk-DF7IGB3K.js.map → chunk-G6U45QD3.js.map} +0 -0
- /package/dist/{chunk-3A7BDDXS.js.map → chunk-GAP7SOGA.js.map} +0 -0
- /package/dist/{chunk-OQ7CLFEL.js.map → chunk-GFWWHCBF.js.map} +0 -0
- /package/dist/{chunk-T764KNWP.js.map → chunk-GO6ISZUZ.js.map} +0 -0
- /package/dist/{chunk-V4GSW4NH.js.map → chunk-GWLP45WQ.js.map} +0 -0
- /package/dist/{chunk-NNQCVHVJ.js.map → chunk-H3HA22Z3.js.map} +0 -0
- /package/dist/{chunk-V3O7ZSQD.js.map → chunk-H6GTG665.js.map} +0 -0
- /package/dist/{chunk-FBTQGEUE.js.map → chunk-I4BQTVMY.js.map} +0 -0
- /package/dist/{chunk-A2EZCLLG.js.map → chunk-IAZKXDWV.js.map} +0 -0
- /package/dist/{chunk-RFVEHOOC.js.map → chunk-IBBGABK2.js.map} +0 -0
- /package/dist/{chunk-5HLAN4U2.js.map → chunk-IC4MREQH.js.map} +0 -0
- /package/dist/{chunk-GJKEGZJB.js.map → chunk-IIK4WNWV.js.map} +0 -0
- /package/dist/{chunk-X45ABI5E.js.map → chunk-IZROFBH7.js.map} +0 -0
- /package/dist/{chunk-TMYLRI3S.js.map → chunk-J5UTL4HE.js.map} +0 -0
- /package/dist/{chunk-CRORJLBL.js.map → chunk-JBMZVC5D.js.map} +0 -0
- /package/dist/{chunk-S3TBE37M.js.map → chunk-JXTNP3B5.js.map} +0 -0
- /package/dist/{chunk-FKWXVASL.js.map → chunk-LBJ2CLRT.js.map} +0 -0
- /package/dist/{chunk-U73TWJRK.js.map → chunk-LFELUKCA.js.map} +0 -0
- /package/dist/{chunk-BXTSQUBI.js.map → chunk-LK5OKVCM.js.map} +0 -0
- /package/dist/{chunk-ZSZGKMOK.js.map → chunk-LMOZWB4G.js.map} +0 -0
- /package/dist/{chunk-YYQQPDVY.js.map → chunk-N5AIO23H.js.map} +0 -0
- /package/dist/{chunk-GUPOLYU5.js.map → chunk-NE3OMP7R.js.map} +0 -0
- /package/dist/{chunk-TDTFJZAC.js.map → chunk-NO52OH3Y.js.map} +0 -0
- /package/dist/{chunk-72K4LY24.js.map → chunk-NZYWKZ3Q.js.map} +0 -0
- /package/dist/{chunk-BUKBQPDY.js.map → chunk-OIORUNKH.js.map} +0 -0
- /package/dist/{chunk-XGEJTRNF.js.map → chunk-OKXLOLEV.js.map} +0 -0
- /package/dist/{chunk-XR6FJ272.js.map → chunk-OVC2PIOP.js.map} +0 -0
- /package/dist/{chunk-SFDDNAFB.js.map → chunk-P5HG6WDH.js.map} +0 -0
- /package/dist/{chunk-J5RABWAF.js.map → chunk-PGAYESXE.js.map} +0 -0
- /package/dist/{chunk-YIQ7PMJG.js.map → chunk-PQ7RLE43.js.map} +0 -0
- /package/dist/{chunk-353QTP3X.js.map → chunk-QFODAMYR.js.map} +0 -0
- /package/dist/{chunk-26ALFAKU.js.map → chunk-QFVZIQRQ.js.map} +0 -0
- /package/dist/{chunk-7SYPFWCW.js.map → chunk-QI5UKQX3.js.map} +0 -0
- /package/dist/{chunk-MGHPM72R.js.map → chunk-QY7EK6Q4.js.map} +0 -0
- /package/dist/{chunk-7KJ24KFI.js.map → chunk-QYH2UZAK.js.map} +0 -0
- /package/dist/{chunk-3XWQ4ZS5.js.map → chunk-RHNNFCRY.js.map} +0 -0
- /package/dist/{chunk-P4TA3B4C.js.map → chunk-RIVHJC6L.js.map} +0 -0
- /package/dist/{chunk-KDTF2SN6.js.map → chunk-RJQT7QXX.js.map} +0 -0
- /package/dist/{chunk-PF3SQX7Z.js.map → chunk-RMZLB4AH.js.map} +0 -0
- /package/dist/{chunk-46P74AFU.js.map → chunk-S4NMWYHW.js.map} +0 -0
- /package/dist/{chunk-Z5KZ5BV3.js.map → chunk-SFQFUQDW.js.map} +0 -0
- /package/dist/{chunk-PFNUAV22.js.map → chunk-SNSLYZIT.js.map} +0 -0
- /package/dist/{chunk-ZR5H5CZI.js.map → chunk-SP3MHBME.js.map} +0 -0
- /package/dist/{chunk-MPQ5HUAO.js.map → chunk-TGT4XHLX.js.map} +0 -0
- /package/dist/{chunk-LFSSOKDJ.js.map → chunk-TLNYAZX5.js.map} +0 -0
- /package/dist/{chunk-KQEDNZ7K.js.map → chunk-UGRL642V.js.map} +0 -0
- /package/dist/{chunk-2YYOFA2A.js.map → chunk-UKZKLXTE.js.map} +0 -0
- /package/dist/{chunk-YYK4CXLY.js.map → chunk-VAQOSV3I.js.map} +0 -0
- /package/dist/{chunk-TFEPULZS.js.map → chunk-VIRPAJEF.js.map} +0 -0
- /package/dist/{chunk-IWNQRZHT.js.map → chunk-VX6GTRT3.js.map} +0 -0
- /package/dist/{chunk-542AB7CV.js.map → chunk-WR5Y64OE.js.map} +0 -0
- /package/dist/{chunk-S6ZLKSQJ.js.map → chunk-X3YYZLBH.js.map} +0 -0
- /package/dist/{chunk-3XJM5HX6.js.map → chunk-XB4NKZAQ.js.map} +0 -0
- /package/dist/{chunk-H7FWXSSR.js.map → chunk-XSBX3LJP.js.map} +0 -0
- /package/dist/{chunk-OOGGID5L.js.map → chunk-XXBP73RV.js.map} +0 -0
- /package/dist/{chunk-DNZILIEW.js.map → chunk-XZMO52BP.js.map} +0 -0
- /package/dist/{chunk-6VVSAVMC.js.map → chunk-Y3SK6EMU.js.map} +0 -0
- /package/dist/{chunk-VGEW4R4Y.js.map → chunk-Y4ZBNZBU.js.map} +0 -0
- /package/dist/{chunk-ZR3BISO2.js.map → chunk-YCAJCVW4.js.map} +0 -0
- /package/dist/{chunk-YKXSJGMA.js.map → chunk-ZANXEMON.js.map} +0 -0
- /package/dist/{chunk-CECKSPNC.js.map → chunk-ZSZ76MUL.js.map} +0 -0
- /package/dist/{chunk-23LJR6WD.js.map → chunk-ZU6JW3ZB.js.map} +0 -0
- /package/dist/{chunk-UOYVUUTX.js.map → chunk-ZW2CN6L6.js.map} +0 -0
- /package/dist/{cite-KDF6WQXE.js.map → cite-TRNZYG4W.js.map} +0 -0
- /package/dist/{claim-BKJBLN7A.js.map → claim-Q76T3MYA.js.map} +0 -0
- /package/dist/{client-MRXMPXJE.js.map → client-45COYUUH.js.map} +0 -0
- /package/dist/{code-XZWB4INH.js.map → code-K4YTLOPA.js.map} +0 -0
- /package/dist/{companies-6IQS5YAR.js.map → companies-MLWRWQ73.js.map} +0 -0
- /package/dist/{company-WT4Q52W6.js.map → company-X5Z67PMK.js.map} +0 -0
- /package/dist/{complete-TTL4GXUZ.js.map → complete-3CFP6XVY.js.map} +0 -0
- /package/dist/{config-ZXODU47A.js.map → config-TCAHWE6T.js.map} +0 -0
- /package/dist/{connect-G6RW4GPI.js.map → connect-QXFAB4RJ.js.map} +0 -0
- /package/dist/{content-3SZYVF56.js.map → content-MKJP7T7L.js.map} +0 -0
- /package/dist/{conversation-QDMNXK5P.js.map → conversation-C6K6IZTH.js.map} +0 -0
- /package/dist/{conversion-report-EIZEII3H.js.map → conversion-report-OFV4EKTA.js.map} +0 -0
- /package/dist/{conversion-upload-command-BYYYQXY5.js.map → conversion-upload-command-D7S5HF22.js.map} +0 -0
- /package/dist/{conversion-writes-3N2J25ZN.js.map → conversion-writes-B3H6VLA2.js.map} +0 -0
- /package/dist/{conversions-DPKOO7H5.js.map → conversions-4ILDIG3K.js.map} +0 -0
- /package/dist/{conversions-3DNIEYY2.js.map → conversions-CRL327RY.js.map} +0 -0
- /package/dist/{copy-writes-OFXLTBQN.js.map → copy-writes-FYXKHJDB.js.map} +0 -0
- /package/dist/{countries-JM54BJXV.js.map → countries-6ST54UGJ.js.map} +0 -0
- /package/dist/{create-OXBIHL72.js.map → create-LDQ3YHET.js.map} +0 -0
- /package/dist/{create-ZM3I3NSN.js.map → create-TKOG7DNJ.js.map} +0 -0
- /package/dist/{create-64UE6JVK.js.map → create-WFMJOZLO.js.map} +0 -0
- /package/dist/{create-NKMOQC7A.js.map → create-WQNT345R.js.map} +0 -0
- /package/dist/{creatives-J6MZKMCX.js.map → creatives-45SJAD3G.js.map} +0 -0
- /package/dist/{creatives-XRLYZ2ME.js.map → creatives-E4CTMZJJ.js.map} +0 -0
- /package/dist/{creatives-63O6HUXF.js.map → creatives-Q4OXNCTT.js.map} +0 -0
- /package/dist/{credentials-FC36D37N.js.map → credentials-E2AIMWKX.js.map} +0 -0
- /package/dist/{critique-AC7EPDQA.js.map → critique-EWV3O3TD.js.map} +0 -0
- /package/dist/{critique-RHN32S7D.js.map → critique-JVT6X2T3.js.map} +0 -0
- /package/dist/{crm-NFDEK2GT.js.map → crm-NQH5FTK6.js.map} +0 -0
- /package/dist/{crm-NQ4FDJ7E.js.map → crm-YGQKK76D.js.map} +0 -0
- /package/dist/{crop-B2CACBC4.js.map → crop-KV24WHOR.js.map} +0 -0
- /package/dist/{currency-XRGG5OKI.js.map → currency-B5T7TYKD.js.map} +0 -0
- /package/dist/{custom-conversions-R3ROXHYL.js.map → custom-conversions-EJNX4MCK.js.map} +0 -0
- /package/dist/{customers-TNVCX27L.js.map → customers-YFEPJF4G.js.map} +0 -0
- /package/dist/{decide-MDNIHSQG.js.map → decide-JZXG6LZR.js.map} +0 -0
- /package/dist/{delete-DTHXGG5F.js.map → delete-2UJVTHRE.js.map} +0 -0
- /package/dist/{delete-ZKKB553W.js.map → delete-7QAJSOCO.js.map} +0 -0
- /package/dist/{delete-RSZU4I76.js.map → delete-O4RO2HMR.js.map} +0 -0
- /package/dist/{delete-LGUXPTBC.js.map → delete-POHL3TKX.js.map} +0 -0
- /package/dist/{delete-VXYTITXA.js.map → delete-Q7J734W2.js.map} +0 -0
- /package/dist/{delete-F43G4Z3D.js.map → delete-XWD37C4T.js.map} +0 -0
- /package/dist/{demographics-2UXLA4GW.js.map → demographics-YWBHAMZ5.js.map} +0 -0
- /package/dist/{describe-QTAOAQM4.js.map → describe-MA54W67X.js.map} +0 -0
- /package/dist/{describe-CH3IFPOT.js.map → describe-MJ5SOVWY.js.map} +0 -0
- /package/dist/{dimensions-5E3AN6A7.js.map → dimensions-YXOXHOXW.js.map} +0 -0
- /package/dist/{discard-E7AD6IVJ.js.map → discard-YX4XUXG3.js.map} +0 -0
- /package/dist/{discover-ELMDMJRX.js.map → discover-PPMLFJMU.js.map} +0 -0
- /package/dist/{discover-SRXLIPGU.js.map → discover-SS3PO5Y6.js.map} +0 -0
- /package/dist/{domain-B6GYZ6BX.js.map → domain-5R6CYVFY.js.map} +0 -0
- /package/dist/{download-FS5WHNFA.js.map → download-D2O4RYJ3.js.map} +0 -0
- /package/dist/{download-XOABASZF.js.map → download-SYWQXF57.js.map} +0 -0
- /package/dist/{draft-ICHAAUVH.js.map → draft-2NKXOBT6.js.map} +0 -0
- /package/dist/{draft-XBD3UC64.js.map → draft-3MPADYS4.js.map} +0 -0
- /package/dist/{draft-7VI5GTEY.js.map → draft-AAEGEQZZ.js.map} +0 -0
- /package/dist/{draft-PFW24WXM.js.map → draft-CRDQR5I3.js.map} +0 -0
- /package/dist/{draft-4KW5SRI2.js.map → draft-I63QQ7LY.js.map} +0 -0
- /package/dist/{draft-EWR2ADNX.js.map → draft-PO5X4UVA.js.map} +0 -0
- /package/dist/{draft-MSWSLIY2.js.map → draft-QCKJT7XQ.js.map} +0 -0
- /package/dist/{draft-F26LGHM5.js.map → draft-VMLXZQQX.js.map} +0 -0
- /package/dist/{env-BNQON23N.js.map → env-2RHPS2VF.js.map} +0 -0
- /package/dist/{experiment-SNC6RCF3.js.map → experiment-3NDXGQK6.js.map} +0 -0
- /package/dist/{experiments-E6NXWJ7X.js.map → experiments-DYNNWQRB.js.map} +0 -0
- /package/dist/{export-6O62J5I2.js.map → export-6WWVO4O6.js.map} +0 -0
- /package/dist/{extract-D2WSRIKY.js.map → extract-DWDZI35Y.js.map} +0 -0
- /package/dist/{facets-R5U2G3R2.js.map → facets-Y2IEM37E.js.map} +0 -0
- /package/dist/{favorites-GGJGLED7.js.map → favorites-54Z7PTYR.js.map} +0 -0
- /package/dist/{feed-FN3BLYD2.js.map → feed-TAGQWMRK.js.map} +0 -0
- /package/dist/{feedback-QQRAOFJN.js.map → feedback-HJRVTU6C.js.map} +0 -0
- /package/dist/{feedback-LPFQ567L.js.map → feedback-IVSLM5PN.js.map} +0 -0
- /package/dist/{feedback-record-OCKDPXGM.js.map → feedback-record-P7CO3IGE.js.map} +0 -0
- /package/dist/{fetch-ET734X4Q.js.map → fetch-KB64NPDF.js.map} +0 -0
- /package/dist/{fetch-I5VVAVLY.js.map → fetch-V2U5VUQZ.js.map} +0 -0
- /package/dist/{find-XS42XIYQ.js.map → find-UB4JSORZ.js.map} +0 -0
- /package/dist/{fit-C7SYZA65.js.map → fit-JDG6E46O.js.map} +0 -0
- /package/dist/{flows-I5G5ICEQ.js.map → flows-DP574PEX.js.map} +0 -0
- /package/dist/{follow-7O37OI4Q.js.map → follow-SX6BV6VZ.js.map} +0 -0
- /package/dist/{follow-competitors-XLLDO72Q.js.map → follow-competitors-UBJJHX36.js.map} +0 -0
- /package/dist/{following-VLSMUMOM.js.map → following-L7WUEMZ2.js.map} +0 -0
- /package/dist/{fonts-BOQTTVX5.js.map → fonts-RMROS3LX.js.map} +0 -0
- /package/dist/{forecast-QBXVLV7Q.js.map → forecast-AAHHVTBK.js.map} +0 -0
- /package/dist/{forecast-5G5LMGHN.js.map → forecast-BRXNGMGD.js.map} +0 -0
- /package/dist/{funding-XLY5LNY6.js.map → funding-7M4TJ3MW.js.map} +0 -0
- /package/dist/{funnel-O43PBVPI.js.map → funnel-FQX3DOE7.js.map} +0 -0
- /package/dist/{ga4-3JQDPZ27.js.map → ga4-A3HLGTSI.js.map} +0 -0
- /package/dist/{generate-FW5ZPZCC.js.map → generate-SYOQE3F7.js.map} +0 -0
- /package/dist/{get-4N4F4F5P.js.map → get-4NDYA3G6.js.map} +0 -0
- /package/dist/{get-RTEW2UQK.js.map → get-HMTI2IR6.js.map} +0 -0
- /package/dist/{get-55JEQM4R.js.map → get-JIB6PMGI.js.map} +0 -0
- /package/dist/{get-SZ3BKDS6.js.map → get-JX5JVWH7.js.map} +0 -0
- /package/dist/{get-DOZKX4LD.js.map → get-KNP2EQRI.js.map} +0 -0
- /package/dist/{get-5P4WESPY.js.map → get-Q4M6G7YN.js.map} +0 -0
- /package/dist/{get-MS7HTZBZ.js.map → get-VFDNTZ54.js.map} +0 -0
- /package/dist/{get-6VRSSUJJ.js.map → get-X44ZCIFN.js.map} +0 -0
- /package/dist/{gif-H2GKAG4C.js.map → gif-6244RM75.js.map} +0 -0
- /package/dist/{google-FJJ34DCE.js.map → google-HWEDJ4YS.js.map} +0 -0
- /package/dist/{google-ads-3TEGRLIY.js.map → google-ads-4DLYASRC.js.map} +0 -0
- /package/dist/{group-JNLMRIKV.js.map → group-45M7V46T.js.map} +0 -0
- /package/dist/{group-KEJHQXTJ.js.map → group-RAXOR36M.js.map} +0 -0
- /package/dist/{gsc-N7ILDOX4.js.map → gsc-YAU4EA75.js.map} +0 -0
- /package/dist/{history-SWBZK2YL.js.map → history-6B6RXNV3.js.map} +0 -0
- /package/dist/{history-IXKSY5DE.js.map → history-BEEREY26.js.map} +0 -0
- /package/dist/{history-ZWU3ZV2E.js.map → history-NLZSX4BK.js.map} +0 -0
- /package/dist/{hubspot-WIZRU3UE.js.map → hubspot-LABBRJ44.js.map} +0 -0
- /package/dist/{icon-V6VRNURZ.js.map → icon-2237C4LP.js.map} +0 -0
- /package/dist/{ideas-CXDU7YCE.js.map → ideas-A4ELJN23.js.map} +0 -0
- /package/dist/{images-PB6SWXTZ.js.map → images-JVNT7KYM.js.map} +0 -0
- /package/dist/{improve-JWQYC7AP.js.map → improve-PHFWWTOL.js.map} +0 -0
- /package/dist/{ingest-GZ6EXNHT.js.map → ingest-GQWR3RHR.js.map} +0 -0
- /package/dist/{ingest-7ZN46XK4.js.map → ingest-JYN2IDKV.js.map} +0 -0
- /package/dist/{insights-P7JG6Y2H.js.map → insights-A5BKVXFQ.js.map} +0 -0
- /package/dist/{insights-BWZXYBZY.js.map → insights-U6QAA77O.js.map} +0 -0
- /package/dist/{inspect-BCKUHTRR.js.map → inspect-72DY33YD.js.map} +0 -0
- /package/dist/{inspiration-WGMKYSGM.js.map → inspiration-DNWTXEPX.js.map} +0 -0
- /package/dist/{intent-EWNVDZKU.js.map → intent-OMSJPOJZ.js.map} +0 -0
- /package/dist/{job-FJRS3GVA.js.map → job-RCEPBGZC.js.map} +0 -0
- /package/dist/{job-create-MVXMKPXS.js.map → job-create-MDVJ3E7K.js.map} +0 -0
- /package/dist/{job-status-O3GGFMAW.js.map → job-status-53FJIFYR.js.map} +0 -0
- /package/dist/{keep-55NEIXH2.js.map → keep-ZIHW5OEQ.js.map} +0 -0
- /package/dist/{keyword-gap-YUG6BVQI.js.map → keyword-gap-3P72T4NV.js.map} +0 -0
- /package/dist/{keyword-metrics-7VH4DGCR.js.map → keyword-metrics-GP7L2MQE.js.map} +0 -0
- /package/dist/{keywords-for-site-OIICFZI5.js.map → keywords-for-site-6YWAUOKJ.js.map} +0 -0
- /package/dist/{knowledge-OM3GKZHU.js.map → knowledge-PN3FAZJ2.js.map} +0 -0
- /package/dist/{landing-T42TKOBK.js.map → landing-EKHAZS5P.js.map} +0 -0
- /package/dist/{landings-JKO53RI4.js.map → landings-FBRB3FF5.js.map} +0 -0
- /package/dist/{languages-YU5YUGFN.js.map → languages-Q5RMPGI4.js.map} +0 -0
- /package/dist/{languages-TAFIWRI6.js.map → languages-WWKMRZCH.js.map} +0 -0
- /package/dist/{launches-SJTNJHZY.js.map → launches-EQ4VS2OR.js.map} +0 -0
- /package/dist/{layerize-HUELG4D3.js.map → layerize-SX6LQK35.js.map} +0 -0
- /package/dist/{lead-routes-KLTGRS2S.js.map → lead-routes-RLYGO47M.js.map} +0 -0
- /package/dist/{leads-LQT5KDYJ.js.map → leads-UCXIIA5K.js.map} +0 -0
- /package/dist/{learn-UY5FNEQF.js.map → learn-EJEFERQZ.js.map} +0 -0
- /package/dist/{library-2ZTAEY4Y.js.map → library-RZI7QHRV.js.map} +0 -0
- /package/dist/{lighthouse-FA4NNWNM.js.map → lighthouse-D3BJGHLO.js.map} +0 -0
- /package/dist/{line-item-writes-CQRO25FM.js.map → line-item-writes-IMCE2FDW.js.map} +0 -0
- /package/dist/{line-items-56KP6W53.js.map → line-items-ISUC3WDO.js.map} +0 -0
- /package/dist/{link-CQNRSZ2Z.js.map → link-6QL4ZVSU.js.map} +0 -0
- /package/dist/{linkedin-ICM5CNNS.js.map → linkedin-ZOBYUBGV.js.map} +0 -0
- /package/dist/{linkedin-person-F74QX3WE.js.map → linkedin-person-C24CBKCH.js.map} +0 -0
- /package/dist/{list-FXMOUNMB.js.map → list-2NWMHKTR.js.map} +0 -0
- /package/dist/{list-GMEW776J.js.map → list-2VNI3U7I.js.map} +0 -0
- /package/dist/{list-O6KMSZUA.js.map → list-5H6UAX6T.js.map} +0 -0
- /package/dist/{list-VQLA4C62.js.map → list-ACJBOHPS.js.map} +0 -0
- /package/dist/{list-OLBLGL5J.js.map → list-COWCCJ4F.js.map} +0 -0
- /package/dist/{list-TLKWSNZR.js.map → list-EEQJSTLN.js.map} +0 -0
- /package/dist/{list-6PNILPKX.js.map → list-OTZB7DOX.js.map} +0 -0
- /package/dist/{list-5L74D5T5.js.map → list-PZD2QOZL.js.map} +0 -0
- /package/dist/{list-TSM2LE2Q.js.map → list-SUXUMXPJ.js.map} +0 -0
- /package/dist/{locations-ONA23SAQ.js.map → locations-P3CUBKYZ.js.map} +0 -0
- /package/dist/{locations-CPLAS65V.js.map → locations-ZO7F75KT.js.map} +0 -0
- /package/dist/{log-55GU4YPD.js.map → log-VLI7KQF2.js.map} +0 -0
- /package/dist/{logo-3YBVVQ4K.js.map → logo-R34AWI4C.js.map} +0 -0
- /package/dist/{lookup-Z3AA3ON4.js.map → lookup-BGNLEZMU.js.map} +0 -0
- /package/dist/{make-3LNSICDO.js.map → make-365ZJ25L.js.map} +0 -0
- /package/dist/{map-ARNZ3BY3.js.map → map-OEFL45WA.js.map} +0 -0
- /package/dist/{mcp-PXKB5LQD.js.map → mcp-NCZYQXQL.js.map} +0 -0
- /package/dist/{media-SEC7SPHW.js.map → media-422INJCD.js.map} +0 -0
- /package/dist/{media-3ON3VBC3.js.map → media-WASM45QW.js.map} +0 -0
- /package/dist/{media-sources-7EXSVEAE.js.map → media-sources-CZDK4W5Q.js.map} +0 -0
- /package/dist/{members-35KOCZHC.js.map → members-N3PQSVQC.js.map} +0 -0
- /package/dist/{meme-JL24ZEUF.js.map → meme-NH4DAORT.js.map} +0 -0
- /package/dist/{meta-W2YTPZE7.js.map → meta-IRXPQRBH.js.map} +0 -0
- /package/dist/{metrics-WDFO5ESK.js.map → metrics-PSXIV4QS.js.map} +0 -0
- /package/dist/{models-UVJ7M7DP.js.map → models-SITHUNAA.js.map} +0 -0
- /package/dist/{normalize-KXI3OOFS.js.map → normalize-4OKUF5BJ.js.map} +0 -0
- /package/dist/{normalize-I7KCFLAK.js.map → normalize-6DEJPTBF.js.map} +0 -0
- /package/dist/{options-EYZEFVNI.js.map → options-OJX77MYT.js.map} +0 -0
- /package/dist/{organization-KJPIZ66W.js.map → organization-URQGKFEC.js.map} +0 -0
- /package/dist/{output-LECDMH7S.js.map → output-2MGOSPDE.js.map} +0 -0
- /package/dist/{page-OUC6APBH.js.map → page-WKWRKLTC.js.map} +0 -0
- /package/dist/{page-photos-UULNPJL2.js.map → page-photos-N4S7U7FR.js.map} +0 -0
- /package/dist/{pages-WBJTWSBH.js.map → pages-LT3KCVC3.js.map} +0 -0
- /package/dist/{performance-4MEHG2H3.js.map → performance-P5T4LJRG.js.map} +0 -0
- /package/dist/{performance-QZGRGTTY.js.map → performance-SIWBDORI.js.map} +0 -0
- /package/dist/{pinterest-PXWEV5OM.js.map → pinterest-KZ7RIHRS.js.map} +0 -0
- /package/dist/{pixels-CBZQK7ME.js.map → pixels-3BHTXTDV.js.map} +0 -0
- /package/dist/{pixels-ZXBYDD64.js.map → pixels-IGJFC2XC.js.map} +0 -0
- /package/dist/{plan-QND22WEP.js.map → plan-ATH2VCVA.js.map} +0 -0
- /package/dist/{posts-XZUV6SGX.js.map → posts-MVCGZV54.js.map} +0 -0
- /package/dist/{preview-KMEUO2CB.js.map → preview-DMTQR6ZW.js.map} +0 -0
- /package/dist/{profile-WXAGYNMQ.js.map → profile-OWDBNPNI.js.map} +0 -0
- /package/dist/{promoted-tweet-writes-RKRDYXAF.js.map → promoted-tweet-writes-S2HP5DEI.js.map} +0 -0
- /package/dist/{promoted-tweets-UTOGYF5N.js.map → promoted-tweets-WZT4N5IR.js.map} +0 -0
- /package/dist/{properties-Q7W4YPU6.js.map → properties-VSOMFI5V.js.map} +0 -0
- /package/dist/{publish-4BXIE5GB.js.map → publish-EDYBQHGJ.js.map} +0 -0
- /package/dist/{query-ZFU76BDS.js.map → query-5OS6M4ON.js.map} +0 -0
- /package/dist/{query-H3VKUXUG.js.map → query-NTWXOWPZ.js.map} +0 -0
- /package/dist/{query-ICQABM2L.js.map → query-PC7V3OFF.js.map} +0 -0
- /package/dist/{questionnaire-7AO5NN34.js.map → questionnaire-HUNGUZNQ.js.map} +0 -0
- /package/dist/{read-RQ6B75BE.js.map → read-DXZJ7UOJ.js.map} +0 -0
- /package/dist/{reddit-CGDBA7SX.js.map → reddit-DEGGHR4M.js.map} +0 -0
- /package/dist/{refresh-LMGFOXE6.js.map → refresh-BKYZXXRF.js.map} +0 -0
- /package/dist/{refresh-L2HDEKPI.js.map → refresh-HPNJGI2U.js.map} +0 -0
- /package/dist/{release-DLUKLF5A.js.map → release-H7M37CEO.js.map} +0 -0
- /package/dist/{relevant-pages-DTSXV6J2.js.map → relevant-pages-3CCAQA5Y.js.map} +0 -0
- /package/dist/{remove-VM3KCNGB.js.map → remove-MV4YS72N.js.map} +0 -0
- /package/dist/{remove-GOLZDJ7V.js.map → remove-MX2FV44C.js.map} +0 -0
- /package/dist/{reopen-HJBG23JS.js.map → reopen-EFW2SKOY.js.map} +0 -0
- /package/dist/{rerun-SYTG4PF6.js.map → rerun-OM4N74YK.js.map} +0 -0
- /package/dist/{research-TW6Z74VO.js.map → research-7YDQOKA6.js.map} +0 -0
- /package/dist/{research-VHJI5A3Y.js.map → research-MHXKAQW4.js.map} +0 -0
- /package/dist/{reset-L2UK4NTV.js.map → reset-HT4AGJPR.js.map} +0 -0
- /package/dist/{reset-RZFVT6EV.js.map → reset-XPZQ5F4D.js.map} +0 -0
- /package/dist/{resolve-2BBQKCP7.js.map → resolve-RTTXEN2B.js.map} +0 -0
- /package/dist/{retry-2QFOQQIC.js.map → retry-DVLVWHEK.js.map} +0 -0
- /package/dist/{retry-YN7FECGJ.js.map → retry-SBGWOUQO.js.map} +0 -0
- /package/dist/{retry-failed-NOCAPHDH.js.map → retry-failed-T6PK5SKL.js.map} +0 -0
- /package/dist/{revenue-Y3USV6E7.js.map → revenue-KJLJ53XY.js.map} +0 -0
- /package/dist/{rules-DQBFGPKC.js.map → rules-KCSET46P.js.map} +0 -0
- /package/dist/{rules-S5H4CTN6.js.map → rules-NVKU732Z.js.map} +0 -0
- /package/dist/{rules-add-UZR5X7QG.js.map → rules-add-KY42EHJE.js.map} +0 -0
- /package/dist/{run-DPRASW62.js.map → run-2LQ7XJEO.js.map} +0 -0
- /package/dist/{run-TBGBI522.js.map → run-M7YU6KCV.js.map} +0 -0
- /package/dist/{scaffold-ad-RCGPKWBQ.js.map → scaffold-ad-6YPZ75YJ.js.map} +0 -0
- /package/dist/{scaffold-static-ad-2GJOXOKA.js.map → scaffold-static-ad-UJEWTDU5.js.map} +0 -0
- /package/dist/{scaffold-video-Y7X34F3N.js.map → scaffold-video-M4VWSVJ6.js.map} +0 -0
- /package/dist/{schedule-MMW63ZDZ.js.map → schedule-ANIYXLG6.js.map} +0 -0
- /package/dist/{schedule-VY75FPE3.js.map → schedule-J7HZQ2EL.js.map} +0 -0
- /package/dist/{scheduled-agents-2ZSA5S3K.js.map → scheduled-agents-IVUQUKF4.js.map} +0 -0
- /package/dist/{schema-KIJGNKJA.js.map → schema-LHBKBUV7.js.map} +0 -0
- /package/dist/{scrape-G6QIBY6U.js.map → scrape-FQUGOXCG.js.map} +0 -0
- /package/dist/{screenshot-CMOGVSDO.js.map → screenshot-YRYAOP5E.js.map} +0 -0
- /package/dist/{search-EIIDSTTZ.js.map → search-3AW52FO6.js.map} +0 -0
- /package/dist/{search-CSHJCL73.js.map → search-6XKFFDMJ.js.map} +0 -0
- /package/dist/{search-S4YK5ACT.js.map → search-E75B5APM.js.map} +0 -0
- /package/dist/{search-DZGN5GDP.js.map → search-EKTUTXVN.js.map} +0 -0
- /package/dist/{search-XT22RJG2.js.map → search-OW3E2Z7Z.js.map} +0 -0
- /package/dist/{search-FY53LEQY.js.map → search-YARSBZ6D.js.map} +0 -0
- /package/dist/{search-copy-32URULZJ.js.map → search-copy-2KO3VR6R.js.map} +0 -0
- /package/dist/{seeds-XH2263HW.js.map → seeds-E64JKXWS.js.map} +0 -0
- /package/dist/{select-HXFWS3YO.js.map → select-STIWQ36I.js.map} +0 -0
- /package/dist/{sends-OKJS7WVX.js.map → sends-DEVRKO4M.js.map} +0 -0
- /package/dist/{sequences-DOITIST4.js.map → sequences-YIQSLKV5.js.map} +0 -0
- /package/dist/{set-prompt-QPIXPF4Q.js.map → set-prompt-TODWV2F4.js.map} +0 -0
- /package/dist/{setup-links-7XH4QW57.js.map → setup-links-MNBD3UMH.js.map} +0 -0
- /package/dist/{shared-5EPTXTGW.js.map → shared-V5ZS25EO.js.map} +0 -0
- /package/dist/{shopify-MNHCP5JX.js.map → shopify-PVMHMVIC.js.map} +0 -0
- /package/dist/{site-JH5HWJ7P.js.map → site-ZZUKS6MQ.js.map} +0 -0
- /package/dist/{sitemaps-NSOO5DBU.js.map → sitemaps-ZSISKT6L.js.map} +0 -0
- /package/dist/{sites-VJDFYXP4.js.map → sites-XMZ3HPHT.js.map} +0 -0
- /package/dist/{skills-RFKWA74T.js.map → skills-6MJC6CSZ.js.map} +0 -0
- /package/dist/{sources-QZNISAXZ.js.map → sources-36MJ6T4V.js.map} +0 -0
- /package/dist/{sources-X6R7OCG2.js.map → sources-GNLQHTSJ.js.map} +0 -0
- /package/dist/{stale-BVP4XBGS.js.map → stale-GJN7UO3D.js.map} +0 -0
- /package/dist/{stats-IYESUTZB.js.map → stats-FSAXWTSE.js.map} +0 -0
- /package/dist/{status-4DXPN6EW.js.map → status-6EGB6ORB.js.map} +0 -0
- /package/dist/{sticker-C7O2K75Q.js.map → sticker-GXCI4WL5.js.map} +0 -0
- /package/dist/{stock-YA27CW4K.js.map → stock-DJ6I3CTO.js.map} +0 -0
- /package/dist/{studies-OSYBQE7W.js.map → studies-4XXCEAHH.js.map} +0 -0
- /package/dist/{studio-V3HINEVU.js.map → studio-OARORMDJ.js.map} +0 -0
- /package/dist/{suggest-BLYWQV4H.js.map → suggest-DSMKK4FP.js.map} +0 -0
- /package/dist/{sync-BP2NL7BA.js.map → sync-QHM3LMAX.js.map} +0 -0
- /package/dist/{sync-KXOJMM2K.js.map → sync-WKV3N3LD.js.map} +0 -0
- /package/dist/{sync-WGZ4522U.js.map → sync-XFK4U6TA.js.map} +0 -0
- /package/dist/{sync-definition-SAOKH7RQ.js.map → sync-definition-YXGN6PIQ.js.map} +0 -0
- /package/dist/{tag-MKWBX22O.js.map → tag-L2H5TSFJ.js.map} +0 -0
- /package/dist/{tag-manager-AKW4EG4W.js.map → tag-manager-XAX5AI42.js.map} +0 -0
- /package/dist/{tags-QAL6XAHS.js.map → tags-GHV5R7NI.js.map} +0 -0
- /package/dist/{tags-TSEVQAKY.js.map → tags-IDWUV2FY.js.map} +0 -0
- /package/dist/{tags-N54OQ55M.js.map → tags-MBBRBZJH.js.map} +0 -0
- /package/dist/{tags-RMPC3Q5E.js.map → tags-MQYF2JHQ.js.map} +0 -0
- /package/dist/{tags-DV3IVJBS.js.map → tags-ZGXJHATH.js.map} +0 -0
- /package/dist/{targeting-VOZUDYFI.js.map → targeting-KJ4DI56R.js.map} +0 -0
- /package/dist/{targeting-constants-7YWLK6KM.js.map → targeting-constants-ZS422W5A.js.map} +0 -0
- /package/dist/{targeting-criteria-OUN7VYFP.js.map → targeting-criteria-GDCXOAUD.js.map} +0 -0
- /package/dist/{targets-SUDKTBLH.js.map → targets-MYHOPAYY.js.map} +0 -0
- /package/dist/{terms-AY5LECWX.js.map → terms-NX5CAJXT.js.map} +0 -0
- /package/dist/{testimonials-JMKFBJYD.js.map → testimonials-R6RFGAKP.js.map} +0 -0
- /package/dist/{themes-WJ35YEXI.js.map → themes-LHVXXVTX.js.map} +0 -0
- /package/dist/{top-companies-ESGGS2SE.js.map → top-companies-POTV3Y2A.js.map} +0 -0
- /package/dist/{transcript-YXTBCJ67.js.map → transcript-4RVYKDVZ.js.map} +0 -0
- /package/dist/{translate-W6AMHQWO.js.map → translate-UCASCVMN.js.map} +0 -0
- /package/dist/{triggers-YZTGKFBI.js.map → triggers-XHMMOZJK.js.map} +0 -0
- /package/dist/{tweets-B6EWPDYI.js.map → tweets-33OCH74J.js.map} +0 -0
- /package/dist/{unfollow-ACQTL2GW.js.map → unfollow-G26NHR5X.js.map} +0 -0
- /package/dist/{unlink-FEKMX5Q7.js.map → unlink-3IW3EORE.js.map} +0 -0
- /package/dist/{unstage-PIO6RJLT.js.map → unstage-APVF6KHB.js.map} +0 -0
- /package/dist/{unstage-MWAG2SLK.js.map → unstage-OAPP6Z5V.js.map} +0 -0
- /package/dist/{update-IHWWJFD5.js.map → update-2VSJH4LQ.js.map} +0 -0
- /package/dist/{update-HCJC2OG4.js.map → update-42QYBUE3.js.map} +0 -0
- /package/dist/{update-3PFWIMEI.js.map → update-ESK6PSME.js.map} +0 -0
- /package/dist/{update-4ANTGEPT.js.map → update-KXTP3VPI.js.map} +0 -0
- /package/dist/{update-NGLID7LC.js.map → update-V7SRDGHN.js.map} +0 -0
- /package/dist/{upload-JMXCQDCA.js.map → upload-42IR5RIL.js.map} +0 -0
- /package/dist/{upload-JYLLFY3P.js.map → upload-LSEV74SF.js.map} +0 -0
- /package/dist/{upscale-FZQ5P2UR.js.map → upscale-X3B5CHG3.js.map} +0 -0
- /package/dist/{url-options-BWNHNIAK.js.map → url-options-GJ7ZIUPD.js.map} +0 -0
- /package/dist/{url-params-4ROYWFVV.js.map → url-params-GEESXN57.js.map} +0 -0
- /package/dist/{use-SMS2UK32.js.map → use-D3SKAKUU.js.map} +0 -0
- /package/dist/{validate-P4RRB3QA.js.map → validate-Z5SSEUES.js.map} +0 -0
- /package/dist/{variant-2PJH7U2M.js.map → variant-MEHXEXFK.js.map} +0 -0
- /package/dist/{videos-RRXYBR52.js.map → videos-PJAPZPOT.js.map} +0 -0
- /package/dist/{view-AJ7ROYFP.js.map → view-HTCYEBXN.js.map} +0 -0
- /package/dist/{viewer-check-PD6UQ63S.js.map → viewer-check-6M34VY7K.js.map} +0 -0
- /package/dist/{web-5SWHU5KW.js.map → web-PUVVFMV3.js.map} +0 -0
- /package/dist/{winners-FJXS3LGU.js.map → winners-CGLS7SZ3.js.map} +0 -0
- /package/dist/{winning-ads-HH3WI5KB.js.map → winning-ads-ZCP4MIEQ.js.map} +0 -0
- /package/dist/{write-commands-HY2OKPWW.js.map → write-commands-QNXR5ENS.js.map} +0 -0
- /package/dist/{x-6VIOYUKX.js.map → x-2IZMW46M.js.map} +0 -0
package/dist/chunk-BUKBQPDY.js
DELETED
|
@@ -1,1902 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
finalOutputLabelsFromCanvas
|
|
3
|
-
} from "./chunk-X45ABI5E.js";
|
|
4
|
-
import {
|
|
5
|
-
BRAND_LOGO_ROLE,
|
|
6
|
-
CLAIMS_MODEL,
|
|
7
|
-
CLAIMS_REQUEST,
|
|
8
|
-
PEOPLE_PROMPT_VERSION,
|
|
9
|
-
STATIC_AD_ROLE,
|
|
10
|
-
formatOfAdaptId,
|
|
11
|
-
isNativeCanvas,
|
|
12
|
-
isWordsObject,
|
|
13
|
-
peoplePrompt,
|
|
14
|
-
plannedPlacements,
|
|
15
|
-
prepareCanvas,
|
|
16
|
-
readPeople,
|
|
17
|
-
uncastPeople,
|
|
18
|
-
unsuppliedPlaceholderAssets
|
|
19
|
-
} from "./chunk-26ALFAKU.js";
|
|
20
|
-
import {
|
|
21
|
-
ViewerAnswerSchema,
|
|
22
|
-
describeViewer,
|
|
23
|
-
jevReadJudge,
|
|
24
|
-
judgeViewerAnswer,
|
|
25
|
-
misreadings,
|
|
26
|
-
readTurnRenders,
|
|
27
|
-
sureEnough,
|
|
28
|
-
turnRenderRefusal
|
|
29
|
-
} from "./chunk-OX5OAT7L.js";
|
|
30
|
-
import {
|
|
31
|
-
heldRules
|
|
32
|
-
} from "./chunk-RKNSYZX3.js";
|
|
33
|
-
import {
|
|
34
|
-
readCompanyReading
|
|
35
|
-
} from "./chunk-O3HSNUTL.js";
|
|
36
|
-
import {
|
|
37
|
-
frontmatterOf
|
|
38
|
-
} from "./chunk-2YYOFA2A.js";
|
|
39
|
-
import {
|
|
40
|
-
findWorkspaceRoot
|
|
41
|
-
} from "./chunk-3XJM5HX6.js";
|
|
42
|
-
import {
|
|
43
|
-
LogoFacts,
|
|
44
|
-
MISALIGNED,
|
|
45
|
-
compareSizes,
|
|
46
|
-
sizeDifferenceFinding
|
|
47
|
-
} from "./chunk-TMYLRI3S.js";
|
|
48
|
-
import {
|
|
49
|
-
LOGO_COMPOSITE_ROLE,
|
|
50
|
-
SERIES_LEAD_ROLE,
|
|
51
|
-
STATIC_ADAPT_FORMAT_ROLE,
|
|
52
|
-
STATIC_ADAPT_ROLE,
|
|
53
|
-
STATIC_FIX_ROLE,
|
|
54
|
-
STATIC_FORMAT_ROLE,
|
|
55
|
-
STATIC_LEAD_ROLE,
|
|
56
|
-
STATIC_MASTER_ROLE,
|
|
57
|
-
STATIC_PICK_ROLE,
|
|
58
|
-
STATIC_PLACE_ROLE,
|
|
59
|
-
STATIC_PLATE_ROLE,
|
|
60
|
-
STATIC_SAFE_FIT_ROLE,
|
|
61
|
-
STATIC_SIZE_ROLE,
|
|
62
|
-
STATIC_VARIANTS_ROLE,
|
|
63
|
-
STATIC_VARIANT_CALL_ROLE,
|
|
64
|
-
VARIANT_PREFILTER_ROLE,
|
|
65
|
-
adaptPlan,
|
|
66
|
-
castsNobody,
|
|
67
|
-
deliveredSize,
|
|
68
|
-
fitArtwork,
|
|
69
|
-
formatSlug,
|
|
70
|
-
isPlateCanvas,
|
|
71
|
-
logoArtwork,
|
|
72
|
-
logoCornerWords,
|
|
73
|
-
nodesWithRole,
|
|
74
|
-
placementProblems,
|
|
75
|
-
rolesById,
|
|
76
|
-
slotPosition,
|
|
77
|
-
staticMasterFormat,
|
|
78
|
-
textColourSource,
|
|
79
|
-
usesTextColour
|
|
80
|
-
} from "./chunk-Z5AO4Y6W.js";
|
|
81
|
-
import {
|
|
82
|
-
bytesOf,
|
|
83
|
-
judgeWinner,
|
|
84
|
-
nearIdenticalFindings,
|
|
85
|
-
parseJudgeScores,
|
|
86
|
-
reviewRenderedStatic,
|
|
87
|
-
samePictureSizes,
|
|
88
|
-
staticVerdict
|
|
89
|
-
} from "./chunk-V4GSW4NH.js";
|
|
90
|
-
import {
|
|
91
|
-
conceptSummary,
|
|
92
|
-
nativeChrome,
|
|
93
|
-
nativeCopy,
|
|
94
|
-
nativeSurfaceName,
|
|
95
|
-
readAdSpec,
|
|
96
|
-
readInterfaceWords
|
|
97
|
-
} from "./chunk-NNQCVHVJ.js";
|
|
98
|
-
import {
|
|
99
|
-
askAboutImages,
|
|
100
|
-
askAboutText
|
|
101
|
-
} from "./chunk-EZ6GOPHI.js";
|
|
102
|
-
import {
|
|
103
|
-
GLANCE_CHECK_MODEL,
|
|
104
|
-
nearestSupportedAspectRatio
|
|
105
|
-
} from "./chunk-MCJ5I5LR.js";
|
|
106
|
-
import {
|
|
107
|
-
describeMarket
|
|
108
|
-
} from "./chunk-2WZI36D3.js";
|
|
109
|
-
import {
|
|
110
|
-
isSourceStale
|
|
111
|
-
} from "./chunk-RCNAKWK7.js";
|
|
112
|
-
|
|
113
|
-
// src/commands/canvas/static-edit.ts
|
|
114
|
-
function specOf(raw) {
|
|
115
|
-
try {
|
|
116
|
-
return raw ? readAdSpec(raw) : null;
|
|
117
|
-
} catch {
|
|
118
|
-
return null;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
function frame(spec) {
|
|
122
|
-
const { copy: _copy, colors: _colors, brand, notes: _notes, source: _source, reference: _reference, ...rest } = spec;
|
|
123
|
-
const concept = rest.concept ? { ...rest.concept, transfer_note: void 0 } : void 0;
|
|
124
|
-
const brandShape = brand ? { ...brand, ground: void 0, ink: void 0, accent: void 0, cta: void 0, palette: [] } : void 0;
|
|
125
|
-
return JSON.stringify({ ...rest, concept, brand: brandShape });
|
|
126
|
-
}
|
|
127
|
-
var ROLE_WORDS = {
|
|
128
|
-
headline: "the headline",
|
|
129
|
-
cta: "the button",
|
|
130
|
-
button: "the button",
|
|
131
|
-
price: "the price",
|
|
132
|
-
body: "body text",
|
|
133
|
-
caption: "a caption",
|
|
134
|
-
label: "a label",
|
|
135
|
-
fine_print: "the fine print"
|
|
136
|
-
};
|
|
137
|
-
function copyEdits(before, after) {
|
|
138
|
-
const out = [];
|
|
139
|
-
const shared = Math.min(before.length, after.length);
|
|
140
|
-
for (let i = 0; i < shared; i++) {
|
|
141
|
-
const a = before[i];
|
|
142
|
-
const b = after[i];
|
|
143
|
-
if (a.text !== b.text) out.push(`Change the words "${a.text}" to exactly "${b.text}".`);
|
|
144
|
-
if ((a.position ?? "") !== (b.position ?? "") && b.position) out.push(`Move "${b.text}" to ${b.position}.`);
|
|
145
|
-
if ((a.look ?? "") !== (b.look ?? "") && b.look) out.push(`Set "${b.text}" ${b.look}.`);
|
|
146
|
-
if (a.lettering !== b.lettering || (a.role ?? "") !== (b.role ?? "") || (a.on ?? "") !== (b.on ?? "")) {
|
|
147
|
-
out.push(`Set "${b.text}" as ${ROLE_WORDS[b.role ?? ""] ?? "it is described"}${b.on ? `, lettered on ${b.on}` : ""}.`);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
for (const added of after.slice(shared)) {
|
|
151
|
-
const role = ROLE_WORDS[added.role ?? ""];
|
|
152
|
-
out.push(`Add the words "${added.text}"${role ? ` (${role})` : ""}${added.position ? `, ${added.position}` : ""}.`);
|
|
153
|
-
}
|
|
154
|
-
for (const removed of before.slice(shared)) out.push(`Remove the words "${removed.text}".`);
|
|
155
|
-
return out;
|
|
156
|
-
}
|
|
157
|
-
function colourEdits(before, after) {
|
|
158
|
-
const out = [];
|
|
159
|
-
for (const use of after.colors) {
|
|
160
|
-
const was = before.colors.find((c) => c.object === use.object);
|
|
161
|
-
if (was && was.name === use.name && was.hex === use.hex) continue;
|
|
162
|
-
out.push(`Make ${use.object} ${use.name}${use.hex ? ` (${use.hex})` : ""}.`);
|
|
163
|
-
}
|
|
164
|
-
const roles = [
|
|
165
|
-
["cta", "the button"],
|
|
166
|
-
["ground", "the background"],
|
|
167
|
-
["ink", "the designed type"],
|
|
168
|
-
["accent", "the accent colour"]
|
|
169
|
-
];
|
|
170
|
-
for (const [key, object] of roles) {
|
|
171
|
-
const was = before.brand?.[key];
|
|
172
|
-
const now = after.brand?.[key];
|
|
173
|
-
if (typeof now === "string" && was !== now) out.push(`Make ${object} ${now}.`);
|
|
174
|
-
}
|
|
175
|
-
return out;
|
|
176
|
-
}
|
|
177
|
-
function specEditInstruction(previous, next) {
|
|
178
|
-
const before = specOf(previous);
|
|
179
|
-
const after = specOf(next);
|
|
180
|
-
if (!before || !after || frame(before) !== frame(after)) return null;
|
|
181
|
-
const edits = [...copyEdits(before.copy, after.copy), ...colourEdits(before, after)];
|
|
182
|
-
return edits.length > 0 ? edits.join(" ") : null;
|
|
183
|
-
}
|
|
184
|
-
function frameChanges(previous, next) {
|
|
185
|
-
const before = specOf(previous);
|
|
186
|
-
const after = specOf(next);
|
|
187
|
-
if (!before || !after) return [];
|
|
188
|
-
const was = JSON.parse(frame(before));
|
|
189
|
-
const now = JSON.parse(frame(after));
|
|
190
|
-
return [.../* @__PURE__ */ new Set([...Object.keys(was), ...Object.keys(now)])].filter(
|
|
191
|
-
(key) => JSON.stringify(was[key]) !== JSON.stringify(now[key])
|
|
192
|
-
);
|
|
193
|
-
}
|
|
194
|
-
var normalized = (text) => text.trim().toLowerCase().replace(/\s+/g, " ");
|
|
195
|
-
function repeatsFailedFix(last, instruction) {
|
|
196
|
-
return Boolean(last && last.blocking.length > 0 && normalized(last.instruction) === normalized(instruction));
|
|
197
|
-
}
|
|
198
|
-
function fixMemoryOf(shown, from) {
|
|
199
|
-
if (from !== void 0 && from !== shown.rendered?.runId) return { blocking: [] };
|
|
200
|
-
return { ...shown.lastFix ? { lastFix: shown.lastFix } : {}, blocking: shown.blocking ?? [] };
|
|
201
|
-
}
|
|
202
|
-
function persistingDefects(before, after) {
|
|
203
|
-
const now = new Set((after ?? []).filter((f) => f.severity === "blocking").map((f) => f.what));
|
|
204
|
-
return before.filter((what) => now.has(what));
|
|
205
|
-
}
|
|
206
|
-
var onSurface = (line) => line.on ? ` on ${line.on}` : "";
|
|
207
|
-
function inSceneEdits(before, after) {
|
|
208
|
-
const was = before.filter((line) => line.lettering === "in_scene");
|
|
209
|
-
const now = after.filter((line) => line.lettering === "in_scene");
|
|
210
|
-
const out = [];
|
|
211
|
-
for (let i = 0; i < Math.min(was.length, now.length); i++) {
|
|
212
|
-
const a = was[i];
|
|
213
|
-
const b = now[i];
|
|
214
|
-
if (a.text !== b.text) out.push(`Change the words "${a.text}"${onSurface(a)} to exactly "${b.text}".`);
|
|
215
|
-
if ((a.on ?? "") !== (b.on ?? "") && b.on)
|
|
216
|
-
out.push(`Letter "${b.text}" on ${b.on}${a.on ? ` instead of ${a.on}` : ""}.`);
|
|
217
|
-
}
|
|
218
|
-
for (const added of now.slice(was.length)) out.push(`Letter the words "${added.text}"${onSurface(added)}.`);
|
|
219
|
-
for (const removed of was.slice(now.length)) out.push(`Remove the words "${removed.text}" from the picture.`);
|
|
220
|
-
return out;
|
|
221
|
-
}
|
|
222
|
-
function pictureEdit(previous, next) {
|
|
223
|
-
const before = specOf(previous);
|
|
224
|
-
const after = specOf(next);
|
|
225
|
-
if (!before || !after || frame(before) !== frame(after)) return null;
|
|
226
|
-
const changed = after.colors.filter((use) => {
|
|
227
|
-
const was = before.colors.find((c) => c.object === use.object);
|
|
228
|
-
return !isWordsObject(use.object) && !(was && was.name === use.name && was.hex === use.hex);
|
|
229
|
-
});
|
|
230
|
-
const ground = after.brand?.ground;
|
|
231
|
-
const edits = [
|
|
232
|
-
...inSceneEdits(before.copy, after.copy),
|
|
233
|
-
...changed.map((use) => `Make ${use.object} ${use.name}${use.hex ? ` (${use.hex})` : ""}.`),
|
|
234
|
-
...typeof ground === "string" && before.brand?.ground !== ground ? [`Make the background ${ground}.`] : []
|
|
235
|
-
];
|
|
236
|
-
return edits.length > 0 ? edits.join(" ") : null;
|
|
237
|
-
}
|
|
238
|
-
function plainRunEdit(canvas, shownPrompt, promptNow) {
|
|
239
|
-
if (isNativeCanvas(canvas)) return null;
|
|
240
|
-
return isPlateCanvas(canvas) ? pictureEdit(shownPrompt, promptNow) : specEditInstruction(shownPrompt, promptNow);
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// src/commands/canvas/static-ad-canvas.ts
|
|
244
|
-
function isStaticAdCanvas(parsed) {
|
|
245
|
-
const nodes = parsed?.nodes;
|
|
246
|
-
if (!Array.isArray(nodes)) return false;
|
|
247
|
-
return nodes.some((n) => {
|
|
248
|
-
const role = n?.tags?.role;
|
|
249
|
-
if (role === STATIC_VARIANTS_ROLE) return true;
|
|
250
|
-
return n?.type === "ingest" && (role === STATIC_AD_ROLE || n?.id === "compose_spec");
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
// src/commands/canvas/named-people-read.ts
|
|
255
|
-
import { createHash } from "crypto";
|
|
256
|
-
import { mkdir, readFile, writeFile } from "fs/promises";
|
|
257
|
-
import path from "path";
|
|
258
|
-
var PEOPLE_TIMEOUT_MS = 3e4;
|
|
259
|
-
function peopleReader(cacheDir, spent) {
|
|
260
|
-
const dir = path.join(cacheDir, "named-people");
|
|
261
|
-
return async (lines) => {
|
|
262
|
-
const said2 = lines.filter((l) => l.trim());
|
|
263
|
-
if (said2.length === 0) return [];
|
|
264
|
-
const key = createHash("sha256").update(JSON.stringify([PEOPLE_PROMPT_VERSION, CLAIMS_MODEL, said2])).digest("hex");
|
|
265
|
-
const file = path.join(dir, `${key}.json`);
|
|
266
|
-
const cached = await readFile(file, "utf8").then((text) => readPeople(JSON.parse(text), said2)).catch(() => null);
|
|
267
|
-
if (cached) return cached;
|
|
268
|
-
const answer = await askAboutText(CLAIMS_MODEL, peoplePrompt(said2), spent, {
|
|
269
|
-
timeoutMs: PEOPLE_TIMEOUT_MS,
|
|
270
|
-
request: CLAIMS_REQUEST
|
|
271
|
-
});
|
|
272
|
-
const people = readPeople(answer, said2);
|
|
273
|
-
if (people) {
|
|
274
|
-
await mkdir(dir, { recursive: true });
|
|
275
|
-
await writeFile(file, JSON.stringify(answer), "utf8");
|
|
276
|
-
}
|
|
277
|
-
return people;
|
|
278
|
-
};
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// src/commands/canvas/static-autofix.ts
|
|
282
|
-
var AUTO_FIX_ROUNDS = 3;
|
|
283
|
-
function wholePicture(f) {
|
|
284
|
-
const kind = f.kind;
|
|
285
|
-
if (!kind) return false;
|
|
286
|
-
return kind.item === "subject" || kind.item === "one_idea" || kind.item === "concept" || (kind.item === "picture" || kind.item === "native" || kind.item === "rule") && kind.element === "picture";
|
|
287
|
-
}
|
|
288
|
-
var BRIEF_ITEMS = /* @__PURE__ */ new Set(["subject", "concept", "proof", "person"]);
|
|
289
|
-
var fromBrief = (f) => f.kind !== void 0 && (BRIEF_ITEMS.has(f.kind.item) || f.kind.item === "rule" && f.kind.element === "picture");
|
|
290
|
-
var wordsBreakRule = (f) => f.kind?.item === "rule" && f.kind.element === "copy";
|
|
291
|
-
var lostVital = (f) => f.severity === "blocking" && f.kind?.item === "concept" && f.kind.job !== void 0;
|
|
292
|
-
function keptLostHint(review, idea) {
|
|
293
|
-
const lost = unique(review.filter(lostVital).map((f) => f.what.replace(/\.$/, "")));
|
|
294
|
-
if (lost.length === 0) return null;
|
|
295
|
-
return `Not done: what made the proven ad win is gone (${lost.join("; ")}). Never show this version as done: restore it as the plan decided it (its line under "What survives and what changes" and prompt.json's \`concept.load_bearing\`, carried in the scene, the references and the lines' \`look\`) and run again; if nothing of ours may carry it, build the idea on another proven ad (\`baker winning-ads fit <adId>\` on the next candidates, then \`baker creatives make ${idea ?? "<idea>"} --slug <new slug> --reference <adId>\`) and tell the person why, in one line.`;
|
|
296
|
-
}
|
|
297
|
-
function stopsWithoutRepair(review, brief, repaired) {
|
|
298
|
-
return !repaired && review.some((f) => lostVital(f) && brief.includes(withoutSize(f.what)));
|
|
299
|
-
}
|
|
300
|
-
var comparesSizes = (f) => f.kind?.item === "sizes";
|
|
301
|
-
var cutCopy = (f) => f.kind?.defect === "cut" && (f.kind.element === "logo" || f.kind.element === "button" || f.kind.element === "copy");
|
|
302
|
-
function aboutWords(f) {
|
|
303
|
-
const what = withoutSize(f.what);
|
|
304
|
-
return PLACED.some((p) => p.test(what)) || MISREAD.test(what) || MISSING.test(what) || EXTRA_WORDS.test(what) || cutCopy(f) || f.kind !== void 0 && ["copy", "button", "logo"].includes(f.kind.element);
|
|
305
|
-
}
|
|
306
|
-
var PATCHED_WORDS = "the words came with a patch of redrawn picture around them";
|
|
307
|
-
var UNREAD_WORDS = "where the words sit could not be read";
|
|
308
|
-
var ARTIFACT = /\b(?:halos?|glow|seams?|smears?|smudges?|blotch(?:es)?|patch(?:es)?|box(?:es)?|rectangles?|scrims?|backings?|ghost(?:ed|ing|s)?)\b/i;
|
|
309
|
-
var WORDS = /\b(?:words?|text|copy|headline|lines?|lettering|type|quote|caption|label|button|pill|cta|logo)\b/i;
|
|
310
|
-
var wordsArtifact = (f) => {
|
|
311
|
-
const what = withoutSize(f.what);
|
|
312
|
-
return ARTIFACT.test(what) && WORDS.test(what);
|
|
313
|
-
};
|
|
314
|
-
var MANY_DEFECTS = 3;
|
|
315
|
-
var withoutSize = (what) => what.replace(/^\d+(?:\.\d+)?:\d+(?:\.\d+)?(?:,\s*\d+(?:\.\d+)?:\d+(?:\.\d+)?)*:\s*/, "");
|
|
316
|
-
var sizesOf = (what) => what.match(/^(\d+(?:\.\d+)?:\d+(?:\.\d+)?(?:,\s*\d+(?:\.\d+)?:\d+(?:\.\d+)?)*):\s/)?.[1]?.split(/,\s*/) ?? [];
|
|
317
|
-
function carryUnchanged(now, prior, unchanged) {
|
|
318
|
-
const settled = (f) => {
|
|
319
|
-
const sizes = sizesOf(f.what);
|
|
320
|
-
return sizes.length > 0 && sizes.every((s) => unchanged.includes(s)) && !comparesSizes(f);
|
|
321
|
-
};
|
|
322
|
-
return [...now.filter((f) => !settled(f)), ...prior.filter(settled)];
|
|
323
|
-
}
|
|
324
|
-
var pct = (share) => `${Math.round(share * 100)}%`;
|
|
325
|
-
var PAST_BAND = /^(.+?) sits? (?:close to )?where (.+?) covers? (?:it|them) \((.+)\)\.?$/;
|
|
326
|
-
var OFF_EDGE = /^(.+?) runs? off the edge of the picture \((.+)\)\.?$/;
|
|
327
|
-
var OUTSIDE_SPACE = /^(.+?) sits? outside the space every size keeps clear \((.+)\)\.?$/;
|
|
328
|
-
var EXTRA_WORDS = /^the picture adds words that aren't in the copy: (.+?)\. Remove them, or add them to the copy\.?$/;
|
|
329
|
-
var SCENE_PRICES = /^the picture shows prices the copy does not hold: (.+?)\. Make them unreadable\.?$/;
|
|
330
|
-
var PLACED = [PAST_BAND, OFF_EDGE, OUTSIDE_SPACE];
|
|
331
|
-
var MISREAD = /^Text: (".+") reads (".*")\.?$/;
|
|
332
|
-
var MISSING = /^Text: (".+") is missing\.?$/;
|
|
333
|
-
var MAKE_ROOM = "Make the room by moving what is next to it with it and shortening the picture or the gaps, keeping every block in its order.";
|
|
334
|
-
var OVERSHOOT = 0.06;
|
|
335
|
-
function moveInto(what, edges, band) {
|
|
336
|
-
const at = (edge) => edges.includes(edge);
|
|
337
|
-
const top = band ? band.top + OVERSHOOT : 0;
|
|
338
|
-
const bottom = band ? band.bottom + OVERSHOOT : 0;
|
|
339
|
-
const vertical = at("bottom") && at("top") ? band ? `so all of it sits between ${pct(top)} and ${pct(1 - bottom)} of the height` : "into the middle of the frame, away from its top and bottom" : at("bottom") && band ? `up so all of it sits above ${pct(1 - bottom)} of the height, the bottom ${pct(bottom)} showing only the picture` : at("top") && band ? `down so all of it sits below ${pct(top)} of the height, the top ${pct(top)} showing only the picture` : at("bottom") ? "up, away from the bottom of the frame" : at("top") ? "down, away from the top of the frame" : "";
|
|
340
|
-
const sides = ["right", "left"].filter((e) => at(e === "right" ? "right edge" : "left edge"));
|
|
341
|
-
const side = sides.map((e) => band ? `at least ${pct(band[e])} in from the ${e} edge` : `away from the ${e} edge`).join(" and ");
|
|
342
|
-
if (!vertical) return `Move ${what} ${side}`;
|
|
343
|
-
return side ? `Move ${what} ${vertical}, and ${side}` : `Move ${what} ${vertical}`;
|
|
344
|
-
}
|
|
345
|
-
function correctionOf(finding, band, kind) {
|
|
346
|
-
const what = withoutSize(finding).trim();
|
|
347
|
-
if (/could not be read back/.test(what)) return null;
|
|
348
|
-
const past = what.match(PAST_BAND);
|
|
349
|
-
if (past) {
|
|
350
|
-
const [, block = "", surface = "", edges = ""] = past;
|
|
351
|
-
const covers = band && edges.includes("bottom") && edges.includes("top") ? `: ${surface} covers the top ${pct(band.top)} and the bottom ${pct(band.bottom)} of the frame` : band && edges.includes("bottom") ? `: ${surface} covers the bottom ${pct(band.bottom)} of the frame` : band && edges.includes("top") ? `: ${surface} covers the top ${pct(band.top)} of the frame` : "";
|
|
352
|
-
return `${moveInto(block, edges, band)}${covers}. ${MAKE_ROOM}`;
|
|
353
|
-
}
|
|
354
|
-
const off = what.match(OFF_EDGE) ?? what.match(OUTSIDE_SPACE);
|
|
355
|
-
if (off) {
|
|
356
|
-
const [, block = "", edges = ""] = off;
|
|
357
|
-
const named = edges.replace(/the (top|bottom) of the screen/g, "the $1 edge").replace(/ and /g, " and ");
|
|
358
|
-
return `Move ${block} fully inside the frame, with clear space between it and ${named}, smaller if it needs to be.`;
|
|
359
|
-
}
|
|
360
|
-
const extra = what.match(EXTRA_WORDS);
|
|
361
|
-
if (extra) {
|
|
362
|
-
return `Erase these words wherever they appear, leaving the surface they are on blank or with plain lines: ${extra[1]}.`;
|
|
363
|
-
}
|
|
364
|
-
const prices = what.match(SCENE_PRICES);
|
|
365
|
-
if (prices) {
|
|
366
|
-
return `Blur these figures until no digit can be read, keeping the document or screen they are on as it is: ${prices[1]}.`;
|
|
367
|
-
}
|
|
368
|
-
const misread = what.match(MISREAD);
|
|
369
|
-
if (misread) return `Re-letter ${misread[1]} exactly as written, letter for letter (it now reads ${misread[2]}).`;
|
|
370
|
-
const missing = what.match(MISSING);
|
|
371
|
-
if (missing) return `Add the line ${missing[1]}, spelled exactly, where it belongs in the layout.`;
|
|
372
|
-
if (kind?.item === "sizes") return FOLLOW_PICTURE;
|
|
373
|
-
const described = what.replace(/\.$/, "");
|
|
374
|
-
return `Fix this: ${described.charAt(0).toLowerCase()}${described.slice(1)}.`;
|
|
375
|
-
}
|
|
376
|
-
function autoFixStep(canvas, review, opts = {}) {
|
|
377
|
-
if ((opts.round ?? 0) >= AUTO_FIX_ROUNDS) return null;
|
|
378
|
-
const flagged = (review ?? []).filter((f) => f.severity === "blocking" && !wordsBreakRule(f));
|
|
379
|
-
if (flagged.length === 0) return null;
|
|
380
|
-
if (isNativeCanvas(canvas)) return { kind: "respec", findings: unique(flagged.map((f) => f.what)) };
|
|
381
|
-
const relaid = relaidSizes(canvas);
|
|
382
|
-
const blocking = onDerivedSizes(flagged, relaid);
|
|
383
|
-
const painted = paintedPlates(canvas);
|
|
384
|
-
const onPainted = (f) => comparesSizes(f) && sizesOf(f.what).length > 0 && sizesOf(f.what).every((size) => painted.has(size));
|
|
385
|
-
const cutSizes = new Map(relaid.filter((r) => r.words).map((r) => [r.format, r.id]));
|
|
386
|
-
const patched = (f) => !lostVital(f) && ([PATCHED_WORDS, UNREAD_WORDS].some((said2) => withoutSize(f.what).startsWith(said2)) || wordsArtifact(f)) && sizesOf(f.what).length > 0 && sizesOf(f.what).every((size) => cutSizes.has(size));
|
|
387
|
-
const wordsOnly = (f) => patched(f) || aboutWords(f) && sizesOf(f.what).length > 0 && sizesOf(f.what).every((size) => cutSizes.has(size));
|
|
388
|
-
if (blocking.length > 0 && blocking.some(patched) && blocking.every(wordsOnly)) {
|
|
389
|
-
return {
|
|
390
|
-
kind: "regenerate",
|
|
391
|
-
ids: unique(blocking.flatMap((f) => sizesOf(f.what).flatMap((size) => cutSizes.get(size) ?? []))),
|
|
392
|
-
note: unique(blocking.map((f) => withoutSize(f.what))).join(" ")
|
|
393
|
-
};
|
|
394
|
-
}
|
|
395
|
-
if (blocking.length > 0 && blocking.every(onPainted)) {
|
|
396
|
-
return {
|
|
397
|
-
kind: "regenerate",
|
|
398
|
-
ids: unique(blocking.flatMap((f) => sizesOf(f.what).flatMap((size) => painted.get(size) ?? []))),
|
|
399
|
-
note: `The last picture painted from the chosen one had this wrong, so avoid it: ${unique(blocking.map((f) => withoutSize(f.what))).join(" ")}`
|
|
400
|
-
};
|
|
401
|
-
}
|
|
402
|
-
const worded = relaid.filter((r) => r.words).map((r) => r.format);
|
|
403
|
-
const unplaceable = /* @__PURE__ */ new Set([
|
|
404
|
-
...(opts.tooFar ?? []).filter((format) => relaid.some((r) => r.format === format)),
|
|
405
|
-
...worded
|
|
406
|
-
]);
|
|
407
|
-
const misplaced = (f) => {
|
|
408
|
-
const what = withoutSize(f.what);
|
|
409
|
-
const sizes = sizesOf(f.what);
|
|
410
|
-
return sizes.length > 0 && !sizes.every((size) => unplaceable.has(size)) && (PLACED.some((p) => p.test(what)) || cutCopy(f));
|
|
411
|
-
};
|
|
412
|
-
const extend = unique(blocking.filter(misplaced).flatMap((f) => sizesOf(f.what))).filter((size) => !unplaceable.has(size));
|
|
413
|
-
const placing = extend.length > 0 ? { extend } : {};
|
|
414
|
-
const rest = blocking.filter((f) => !misplaced(f));
|
|
415
|
-
const at = (f) => relaid.find((r) => f.what.startsWith(`${r.format}:`) && (!r.words || aboutWords(f)));
|
|
416
|
-
const keepRight = keptRules(opts.fixedBefore);
|
|
417
|
-
const edits = {};
|
|
418
|
-
for (const r of relaid) {
|
|
419
|
-
const lines = unique(rest.filter((f) => at(f) === r).flatMap((f) => correctionOf(f.what, r.band, f.kind) ?? []));
|
|
420
|
-
if (lines.length > 0) edits[r.id] = [...lines, ...keepRight ? [keepRight] : []].join(" ");
|
|
421
|
-
}
|
|
422
|
-
const sizesOnly = () => {
|
|
423
|
-
const ids = Object.keys(edits);
|
|
424
|
-
if (ids.length > 0) return { kind: "relayout", ids, edits, ...placing };
|
|
425
|
-
return extend.length > 0 ? { kind: "extend", sizes: extend } : null;
|
|
426
|
-
};
|
|
427
|
-
const onSeveralSizes = (f) => {
|
|
428
|
-
const what = withoutSize(f.what);
|
|
429
|
-
return new Set(rest.filter((g) => withoutSize(g.what) === what).flatMap((g) => sizesOf(g.what))).size >= 2;
|
|
430
|
-
};
|
|
431
|
-
const settledPicture = opts.previous === "relayout" || opts.previous === "extend";
|
|
432
|
-
const pictureFindings = rest.filter((f) => !at(f) && !patched(f) && (!settledPicture || onSeveralSizes(f)));
|
|
433
|
-
const onPicture = unique(pictureFindings.map((f) => withoutSize(f.what)));
|
|
434
|
-
if (onPicture.length === 0) return sizesOnly();
|
|
435
|
-
const every = unique([...extend, ...deliveredSizes(canvas)]).filter((size) => !worded.includes(size));
|
|
436
|
-
const afterNewPicture = every.length > 0 ? { extend: every } : {};
|
|
437
|
-
const persisting = new Set((opts.lastFix?.blocking ?? []).map(withoutSize));
|
|
438
|
-
const stillWrong = opts.previous === "fix" && onPicture.some((w) => persisting.has(w));
|
|
439
|
-
const brief = unique(pictureFindings.filter(fromBrief).map((f) => withoutSize(f.what)));
|
|
440
|
-
const rollAgain = stillWrong || brief.length > 0 || onPicture.length >= MANY_DEFECTS || pictureFindings.some(wholePicture);
|
|
441
|
-
const last = (opts.round ?? 0) >= AUTO_FIX_ROUNDS - 1;
|
|
442
|
-
if (rollAgain && (!last || brief.length > 0) && !opts.keepPicture && nodesWithRole(canvas, STATIC_VARIANTS_ROLE).length > 0) {
|
|
443
|
-
return {
|
|
444
|
-
kind: "regenerate",
|
|
445
|
-
ids: [STATIC_VARIANTS_ROLE],
|
|
446
|
-
note: [`The last picture made from this brief had this wrong, so avoid it: ${onPicture.join(" ")}`, ...keepRight ? [keepRight] : []].join(" "),
|
|
447
|
-
...brief.length > 0 ? { brief } : {},
|
|
448
|
-
...afterNewPicture
|
|
449
|
-
};
|
|
450
|
-
}
|
|
451
|
-
const changes = unique(
|
|
452
|
-
pictureFindings.filter((f) => !fromBrief(f)).flatMap((f) => correctionOf(f.what, void 0, f.kind) ?? [])
|
|
453
|
-
);
|
|
454
|
-
if (changes.length === 0) return sizesOnly();
|
|
455
|
-
const named = new Set(blocking.flatMap((f) => sizesOf(f.what)));
|
|
456
|
-
const keep = relaid.filter((r) => !r.words).map((r) => r.format).filter((format) => !named.has(format));
|
|
457
|
-
const remade = every.filter((size) => !keep.includes(size));
|
|
458
|
-
const kept = {
|
|
459
|
-
...keep.length > 0 ? { keep } : {},
|
|
460
|
-
...remade.length > 0 ? { extend: remade } : {}
|
|
461
|
-
};
|
|
462
|
-
const asked = `Change only this: ${changes.join(" ")}`;
|
|
463
|
-
const again = onPicture.filter((w) => persisting.has(w)).map((w) => w.replace(/\.$/, ""));
|
|
464
|
-
const instruction = [
|
|
465
|
-
again.length > 0 ? `${asked} The last edit was already asked for this and Image 1 still shows it, so make it clearly: ${again.join("; ")}.` : asked,
|
|
466
|
-
...keepRight ? [keepRight] : []
|
|
467
|
-
].join(" ");
|
|
468
|
-
if (repeatsFailedFix(opts.lastFix, asked) || repeatsFailedFix(opts.lastFix, instruction)) return null;
|
|
469
|
-
const relay = Object.fromEntries(Object.entries(edits).filter(([id]) => relaid.some((r) => r.id === id && !r.words)));
|
|
470
|
-
return { kind: "fix", instruction, ...Object.keys(relay).length > 0 ? { relay } : {}, ...kept };
|
|
471
|
-
}
|
|
472
|
-
var unique = (lines) => [...new Set(lines)];
|
|
473
|
-
var blockingOf = (review) => unique(review.filter((f) => f.severity === "blocking").map((f) => f.what));
|
|
474
|
-
function correctFrom(attempts) {
|
|
475
|
-
const latest = attempts[attempts.length - 1];
|
|
476
|
-
const fewest = Math.min(...attempts.map((a) => blockingOf(a.review).length));
|
|
477
|
-
const base = blockingOf(latest.review).length > fewest ? attempts.find((a) => blockingOf(a.review).length === fewest) : latest;
|
|
478
|
-
const now = new Set(blockingOf(base.review).map(withoutSize));
|
|
479
|
-
const fixedBefore = unique(
|
|
480
|
-
attempts.filter((a) => a !== base).flatMap((a) => blockingOf(a.review)).filter((what) => !now.has(withoutSize(what)))
|
|
481
|
-
);
|
|
482
|
-
return { ...base, fixedBefore };
|
|
483
|
-
}
|
|
484
|
-
function keptRules(fixedBefore) {
|
|
485
|
-
const rules = unique((fixedBefore ?? []).map((f) => withoutSize(f).replace(/\.$/, "")));
|
|
486
|
-
return rules.length > 0 ? `These were wrong in an earlier version and are right now, so keep them right: ${rules.join("; ")}.` : null;
|
|
487
|
-
}
|
|
488
|
-
var FOLLOW_PICTURE = "Show exactly what the finished ad (Image 2) shows: its people, products, panels and their order, and nothing it does not show.";
|
|
489
|
-
function onDerivedSizes(findings, relaid) {
|
|
490
|
-
if (relaid.length === 0) return [...findings];
|
|
491
|
-
return findings.flatMap((f) => {
|
|
492
|
-
const sizes = sizesOf(f.what);
|
|
493
|
-
const onPicture = sizes.length > 0 && sizes.every((size) => !relaid.some((r) => r.format === size));
|
|
494
|
-
if (!onPicture || !comparesSizes(f)) return [f];
|
|
495
|
-
return relaid.map((r) => ({ ...f, what: `${r.format}: ${withoutSize(f.what)}` }));
|
|
496
|
-
});
|
|
497
|
-
}
|
|
498
|
-
function deliveredSizes(canvas) {
|
|
499
|
-
const nodes = canvas?.nodes;
|
|
500
|
-
const labels = Array.isArray(nodes) ? nodes.find((n) => n.id === "final" && n.type === "collect")?.params?.labels : void 0;
|
|
501
|
-
return Array.isArray(labels) ? labels.filter((l) => typeof l === "string") : [];
|
|
502
|
-
}
|
|
503
|
-
function relaidSizes(canvas) {
|
|
504
|
-
const nodes = canvas?.nodes;
|
|
505
|
-
const placements = Array.isArray(nodes) ? plannedPlacements(nodes) : void 0;
|
|
506
|
-
const relaid = nodesWithRole(canvas, STATIC_ADAPT_FORMAT_ROLE).flatMap((n) => {
|
|
507
|
-
const format = formatOfAdaptId(n.id);
|
|
508
|
-
if (!format) return [];
|
|
509
|
-
const model = String(n.params?.model ?? "");
|
|
510
|
-
return [{ id: n.id, format, band: adaptPlan(model, format, placements).safe, words: false }];
|
|
511
|
-
});
|
|
512
|
-
const cut = nodesWithRole(canvas, STATIC_FORMAT_ROLE).flatMap((n) => {
|
|
513
|
-
const format = n.params?.format;
|
|
514
|
-
if (typeof format !== "string") return [];
|
|
515
|
-
const model = String(n.params?.words?.model ?? "");
|
|
516
|
-
const own = Array.isArray(n.params?.placements) ? n.params.placements : placements;
|
|
517
|
-
return [{ id: n.id, format, band: adaptPlan(model, format, own).safe, words: true }];
|
|
518
|
-
});
|
|
519
|
-
return [...relaid, ...cut];
|
|
520
|
-
}
|
|
521
|
-
function paintedPlates(canvas) {
|
|
522
|
-
const plates = new Set(nodesWithRole(canvas, STATIC_PLATE_ROLE).map((n) => n.id));
|
|
523
|
-
return new Map(
|
|
524
|
-
nodesWithRole(canvas, STATIC_FORMAT_ROLE).flatMap((n) => {
|
|
525
|
-
const plate = String(n.inputs?.plate ?? "").match(/^\$ref:([a-z][a-z0-9_]*)\./)?.[1];
|
|
526
|
-
const format = n.params?.format;
|
|
527
|
-
return plate && plates.has(plate) && typeof format === "string" ? [[format, plate]] : [];
|
|
528
|
-
})
|
|
529
|
-
);
|
|
530
|
-
}
|
|
531
|
-
function placedTooFar(canvas, outputsByNode) {
|
|
532
|
-
const placed = nodesWithRole(canvas, STATIC_PLACE_ROLE).flatMap((n) => {
|
|
533
|
-
const format = n.params?.format;
|
|
534
|
-
const unmoved = outputsByNode[n.id]?.reason;
|
|
535
|
-
return (unmoved === "too_far" || unmoved === "inside_band") && typeof format === "string" ? [format] : [];
|
|
536
|
-
});
|
|
537
|
-
const cut = nodesWithRole(canvas, STATIC_FORMAT_ROLE).flatMap((n) => {
|
|
538
|
-
const format = n.params?.format;
|
|
539
|
-
const facts = outputsByNode[n.id]?.facts;
|
|
540
|
-
return facts?.reason === "band_too_far" && typeof format === "string" ? [format] : [];
|
|
541
|
-
});
|
|
542
|
-
return [...placed, ...cut];
|
|
543
|
-
}
|
|
544
|
-
function formatOfSizeNode(canvas, id) {
|
|
545
|
-
const relaid = formatOfAdaptId(id);
|
|
546
|
-
if (relaid) return relaid;
|
|
547
|
-
const node = nodesWithRole(canvas, STATIC_FORMAT_ROLE).find((n) => n.id === id);
|
|
548
|
-
const format = node?.params?.format;
|
|
549
|
-
return typeof format === "string" ? format : null;
|
|
550
|
-
}
|
|
551
|
-
function rendersNewPicture(run) {
|
|
552
|
-
return !run.fix && !run.useVariant && !run.sizesOnly;
|
|
553
|
-
}
|
|
554
|
-
function paidFor(run) {
|
|
555
|
-
if (run.fix) return "edit";
|
|
556
|
-
return run.useVariant || run.sizesOnly ? "sizes" : "options";
|
|
557
|
-
}
|
|
558
|
-
function withRelayNote(canvas, ids, note) {
|
|
559
|
-
const holder = canvas;
|
|
560
|
-
if (!Array.isArray(holder.nodes)) return canvas;
|
|
561
|
-
return {
|
|
562
|
-
...holder,
|
|
563
|
-
nodes: holder.nodes.map((n) => {
|
|
564
|
-
if (typeof n.id !== "string" || !ids.includes(n.id)) return n;
|
|
565
|
-
const paint = n.params?.paint;
|
|
566
|
-
if (paint && typeof paint === "object") {
|
|
567
|
-
const prompt = [typeof paint.prompt === "string" ? paint.prompt : "", note].filter(Boolean).join("\n\n");
|
|
568
|
-
return { ...n, params: { ...n.params, paint: { ...paint, prompt } } };
|
|
569
|
-
}
|
|
570
|
-
if (typeof n.params?.prompt !== "string") return n;
|
|
571
|
-
const [lead = "", ...rest] = n.params.prompt.split("\n\n");
|
|
572
|
-
return { ...n, params: { ...n.params, prompt: [lead, note, ...rest].join("\n\n") } };
|
|
573
|
-
})
|
|
574
|
-
};
|
|
575
|
-
}
|
|
576
|
-
function withRelayEdit(canvas, id, opts) {
|
|
577
|
-
const holder = canvas;
|
|
578
|
-
if (!Array.isArray(holder.nodes)) return canvas;
|
|
579
|
-
const target = holder.nodes.find((n) => n.id === id);
|
|
580
|
-
if (target?.type === "static_format") return withWordsEdit({ nodes: holder.nodes, holder }, target, opts);
|
|
581
|
-
const prompt = target?.params?.prompt;
|
|
582
|
-
const refs = target?.inputs?.reference;
|
|
583
|
-
if (!target || typeof prompt !== "string" || !Array.isArray(refs)) return canvas;
|
|
584
|
-
const lastId = `last_${id}`;
|
|
585
|
-
const remote = /^(?:https?|data):/.test(opts.previous);
|
|
586
|
-
const last = {
|
|
587
|
-
id: lastId,
|
|
588
|
-
type: "ingest",
|
|
589
|
-
params: remote ? { source: "url", url: opts.previous, expect: "image" } : { source: "path", path: opts.previous, expect: "image" }
|
|
590
|
-
};
|
|
591
|
-
const again = opts.asked?.includes(opts.instruction) ? "The last edit was asked for this and Image 1 still shows it wrong, so make the change clearly: " : "";
|
|
592
|
-
const lead = `Edit: Image 1 is this ad as it was last laid out for this size. ${again}${opts.instruction} Keep the rest of Image 1 as it is: the picture, the colours, the lettering and every word, its layout changed only as much as this needs.`;
|
|
593
|
-
const kept = prompt.split("\n\n").slice(1).filter((p) => !p.startsWith("Scale:")).map((p) => p.replace(/\bImage (\d+)\b/g, (_, n) => `Image ${Number(n) + 1}`)).map(
|
|
594
|
-
(p) => p.startsWith("References:") ? p.replace("References:", "References:\nImage 1 (THIS SIZE): the last layout of this size, to edit.").replace(/^Image 2 \(AD\):.*$/m, "Image 2 (AD): the finished ad this size is made from: its words, logo and picture are the ones to keep.") : p
|
|
595
|
-
);
|
|
596
|
-
const leads = new Set(
|
|
597
|
-
holder.nodes.flatMap((n) => n.tags?.role === SERIES_LEAD_ROLE ? [n.id] : [])
|
|
598
|
-
);
|
|
599
|
-
const own = refs.map((r) => typeof r === "string" && leads.has(r.match(/^\$ref:([a-z][a-z0-9_]*)\./)?.[1]) ? "$ref:master.image" : r);
|
|
600
|
-
const edited = {
|
|
601
|
-
...target,
|
|
602
|
-
inputs: { ...target.inputs, reference: [`$ref:${lastId}.asset`, ...own] },
|
|
603
|
-
params: { ...target.params, prompt: [lead, ...kept].join("\n\n") }
|
|
604
|
-
};
|
|
605
|
-
const at = holder.nodes.indexOf(target);
|
|
606
|
-
return { ...holder, nodes: [...holder.nodes.slice(0, at), last, edited, ...holder.nodes.slice(at + 1)] };
|
|
607
|
-
}
|
|
608
|
-
function lastFile(id, file) {
|
|
609
|
-
const remote = /^(?:https?|data):/.test(file);
|
|
610
|
-
return {
|
|
611
|
-
id,
|
|
612
|
-
type: "ingest",
|
|
613
|
-
params: remote ? { source: "url", url: file, expect: "image" } : { source: "path", path: file, expect: "image" }
|
|
614
|
-
};
|
|
615
|
-
}
|
|
616
|
-
function withWordsEdit(at, target, opts) {
|
|
617
|
-
const words = target.params?.words;
|
|
618
|
-
if (typeof words?.prompt !== "string") return at.holder;
|
|
619
|
-
const lastId = `last_${String(target.id)}`;
|
|
620
|
-
const again = opts.asked?.includes(opts.instruction) ? "The last edit was asked for this and Image 1 still shows it wrong, so make the change clearly: " : "";
|
|
621
|
-
const instruction = `Image 1 is this size as its words were last set. ${again}${opts.instruction} Keep the rest of Image 1's words as they are: the lines, the type, the colours and what carries them, moved only as much as this needs. The picture is Image 2's, unchanged.`;
|
|
622
|
-
const prompt = words.prompt.replace(/\bImage (\d+)\b/g, (_, n) => `Image ${Number(n) + 1}`).replace("References:", "References:\nImage 1 (THIS SIZE): this size as its words were last set, to edit.");
|
|
623
|
-
const edited = {
|
|
624
|
-
...target,
|
|
625
|
-
inputs: { ...target.inputs, previous: `$ref:${lastId}.asset` },
|
|
626
|
-
params: { ...target.params, words: { ...words, prompt, edit: { instruction } } }
|
|
627
|
-
};
|
|
628
|
-
const index = at.nodes.indexOf(target);
|
|
629
|
-
return {
|
|
630
|
-
...at.holder,
|
|
631
|
-
nodes: [...at.nodes.slice(0, index), lastFile(lastId, opts.previous), edited, ...at.nodes.slice(index + 1)]
|
|
632
|
-
};
|
|
633
|
-
}
|
|
634
|
-
function withSizesFollowingFix(canvas, opts) {
|
|
635
|
-
let out = canvas;
|
|
636
|
-
for (const n of nodesWithRole(canvas, STATIC_ADAPT_FORMAT_ROLE)) {
|
|
637
|
-
const also = opts.also?.[n.id];
|
|
638
|
-
const previous = opts.last[n.id];
|
|
639
|
-
if (previous) {
|
|
640
|
-
const instruction = `Make the change the finished ad (Image 2) just had: ${opts.change}${also ? ` ${also}` : ""}`;
|
|
641
|
-
out = withRelayEdit(out, n.id, { previous, instruction });
|
|
642
|
-
} else if (also) out = withRelayNote(out, [n.id], `This size must also change this: ${also}`);
|
|
643
|
-
}
|
|
644
|
-
return out;
|
|
645
|
-
}
|
|
646
|
-
var EXTEND_PROMPT = [
|
|
647
|
-
"Deliverable: Image 1 is a finished ad set inside a frame with flat grey margins around it. Paint only the grey: continue the picture outward into it so the whole frame reads as one picture, the scene going on (the wall, the floor, the sky, the room) or, where the ad has no scene, its own plain ground and colours.",
|
|
648
|
-
"Keep everything that is not grey exactly where and as it is: every word, the logo, the button, the people, the products. Nothing in it moves, grows or is redrawn.",
|
|
649
|
-
"Add nothing in the grey: no words, no letters, no logos, no buttons, no new people or objects, no frames, borders or shadows around the ad. Never repeat any part of the ad in it: no second logo, button, line of text, card or person; the grey is only more of the room, the table, the floor, the sky or the plain ground."
|
|
650
|
-
].join("\n\n");
|
|
651
|
-
function withExtendedSizes(canvas, formats) {
|
|
652
|
-
const holder = canvas;
|
|
653
|
-
if (!Array.isArray(holder.nodes)) return canvas;
|
|
654
|
-
const nodes = holder.nodes;
|
|
655
|
-
const final = nodes.find((n) => n.id === "final" && n.type === "collect");
|
|
656
|
-
const labels = final?.params?.labels;
|
|
657
|
-
const images = final?.inputs?.images;
|
|
658
|
-
if (!final || !Array.isArray(labels) || !Array.isArray(images)) return canvas;
|
|
659
|
-
const painter = nodesWithRole(canvas, STATIC_ADAPT_FORMAT_ROLE)[0] ?? nodesWithRole(canvas, STATIC_VARIANT_CALL_ROLE)[0];
|
|
660
|
-
const params = painter?.params ?? {};
|
|
661
|
-
const model = typeof params.model === "string" ? params.model : void 0;
|
|
662
|
-
if (!model) return canvas;
|
|
663
|
-
const placements = plannedPlacements(nodes) ?? nodes.find((n) => n.type === "static_safe_fit" && Array.isArray(n.params?.placements))?.params?.placements;
|
|
664
|
-
const copy = placingCopy(nodes);
|
|
665
|
-
const added = [];
|
|
666
|
-
const delivered = [...images];
|
|
667
|
-
const logoOn = /* @__PURE__ */ new Map();
|
|
668
|
-
const cut = new Set(nodesWithRole(canvas, STATIC_FORMAT_ROLE).map((n) => `$ref:${n.id}.image`));
|
|
669
|
-
for (const format of formats) {
|
|
670
|
-
const at = labels.indexOf(format);
|
|
671
|
-
const reads = images[at];
|
|
672
|
-
const composite = nodes.find(
|
|
673
|
-
(n) => typeof reads === "string" && reads === `$ref:${String(n.id)}.image` && n.tags?.role === LOGO_COMPOSITE_ROLE
|
|
674
|
-
);
|
|
675
|
-
const source = composite ? composite.inputs?.image : reads;
|
|
676
|
-
if (at < 0 || typeof source !== "string" || cut.has(source)) continue;
|
|
677
|
-
const slug = formatSlug(format);
|
|
678
|
-
const ratio = nearestSupportedAspectRatio("image_generate", model, format);
|
|
679
|
-
added.push(
|
|
680
|
-
{
|
|
681
|
-
id: `place_${slug}`,
|
|
682
|
-
type: "static_place",
|
|
683
|
-
inputs: { image: source },
|
|
684
|
-
params: {
|
|
685
|
-
format,
|
|
686
|
-
render_ratio: ratio,
|
|
687
|
-
...placements ? { placements: [...placements] } : {},
|
|
688
|
-
...copy ? { copy } : {}
|
|
689
|
-
},
|
|
690
|
-
tags: { role: STATIC_PLACE_ROLE }
|
|
691
|
-
},
|
|
692
|
-
{
|
|
693
|
-
id: `merge_${slug}`,
|
|
694
|
-
type: "static_extend_merge",
|
|
695
|
-
inputs: { placed: `$ref:place_${slug}.placed`, shown: `$ref:place_${slug}.shown`, keep: `$ref:place_${slug}.keep` },
|
|
696
|
-
params: {
|
|
697
|
-
render_ratio: ratio,
|
|
698
|
-
paint: {
|
|
699
|
-
model,
|
|
700
|
-
aspect_ratio: ratio,
|
|
701
|
-
...params.quality !== void 0 ? { quality: params.quality } : {},
|
|
702
|
-
...params.image_size !== void 0 ? { image_size: params.image_size } : {},
|
|
703
|
-
prompt: EXTEND_PROMPT
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
);
|
|
708
|
-
if (composite) logoOn.set(String(composite.id), { ...composite, inputs: { ...composite.inputs, image: `$ref:merge_${slug}.image` } });
|
|
709
|
-
else delivered[at] = `$ref:merge_${slug}.image`;
|
|
710
|
-
}
|
|
711
|
-
if (added.length === 0) return canvas;
|
|
712
|
-
const kept = nodes.filter((n) => n !== final && !logoOn.has(String(n.id)));
|
|
713
|
-
return {
|
|
714
|
-
...holder,
|
|
715
|
-
nodes: [...kept, ...added, ...logoOn.values(), { ...final, inputs: { ...final.inputs, images: delivered } }]
|
|
716
|
-
};
|
|
717
|
-
}
|
|
718
|
-
function placingCopy(nodes) {
|
|
719
|
-
const told = nodes.find(
|
|
720
|
-
(n) => (n.type === "static_safe_fit" || n.type === "static_place") && Array.isArray(n.params?.copy)
|
|
721
|
-
)?.params?.copy;
|
|
722
|
-
if (Array.isArray(told)) return told;
|
|
723
|
-
const kept = nodes.find((n) => n.type === "image_aspect_adapt" && Array.isArray(n.params?.copy))?.params?.copy;
|
|
724
|
-
return Array.isArray(kept) ? kept.filter((t) => typeof t === "string").map((text) => ({ text })) : void 0;
|
|
725
|
-
}
|
|
726
|
-
function deliveredRole(ref, nodes, roles) {
|
|
727
|
-
const idOf = (r) => typeof r === "string" ? /^\$ref:([^.]+)\./.exec(r)?.[1] : void 0;
|
|
728
|
-
const read = idOf(ref);
|
|
729
|
-
const composite = read && roles[read] === LOGO_COMPOSITE_ROLE ? nodes.find((n) => n.id === read) : void 0;
|
|
730
|
-
const from = composite ? idOf(composite.inputs?.image) : read;
|
|
731
|
-
return from ? roles[from] : void 0;
|
|
732
|
-
}
|
|
733
|
-
function withDeliveredSizes(canvas, last) {
|
|
734
|
-
const holder = canvas;
|
|
735
|
-
if (!Array.isArray(holder.nodes)) return canvas;
|
|
736
|
-
const final = holder.nodes.find((n) => n.id === "final" && n.type === "collect");
|
|
737
|
-
const labels = final?.params?.labels;
|
|
738
|
-
const images = final?.inputs?.images;
|
|
739
|
-
if (!final || !Array.isArray(labels) || !Array.isArray(images)) return canvas;
|
|
740
|
-
const ingests = [];
|
|
741
|
-
const roles = rolesById(canvas);
|
|
742
|
-
const delivered = images.map((ref, i) => {
|
|
743
|
-
const format = labels[i];
|
|
744
|
-
const file = typeof format === "string" ? last[format] : void 0;
|
|
745
|
-
if (!file || typeof format !== "string") return ref;
|
|
746
|
-
const id = `last_${formatSlug(format)}`;
|
|
747
|
-
const remote = /^(?:https?|data):/.test(file);
|
|
748
|
-
const role = deliveredRole(ref, holder.nodes ?? [], roles);
|
|
749
|
-
ingests.push({
|
|
750
|
-
id,
|
|
751
|
-
type: "ingest",
|
|
752
|
-
params: remote ? { source: "url", url: file, expect: "image" } : { source: "path", path: file, expect: "image" },
|
|
753
|
-
...role === STATIC_MASTER_ROLE ? { tags: { role } } : {}
|
|
754
|
-
});
|
|
755
|
-
return `$ref:${id}.asset`;
|
|
756
|
-
});
|
|
757
|
-
const at = holder.nodes.indexOf(final);
|
|
758
|
-
return {
|
|
759
|
-
...holder,
|
|
760
|
-
nodes: [
|
|
761
|
-
...holder.nodes.slice(0, at),
|
|
762
|
-
...ingests,
|
|
763
|
-
{ ...final, inputs: { ...final.inputs, images: delivered } },
|
|
764
|
-
...holder.nodes.slice(at + 1)
|
|
765
|
-
]
|
|
766
|
-
};
|
|
767
|
-
}
|
|
768
|
-
|
|
769
|
-
// src/commands/canvas/static-run-review.ts
|
|
770
|
-
import { readFile as readFile2 } from "fs/promises";
|
|
771
|
-
import path2 from "path";
|
|
772
|
-
|
|
773
|
-
// src/commands/canvas/glance-check.ts
|
|
774
|
-
import sharp from "sharp";
|
|
775
|
-
import { z } from "zod";
|
|
776
|
-
var GLANCE_REQUIRED = {
|
|
777
|
-
offer: "guess",
|
|
778
|
-
for_whom: "unclear",
|
|
779
|
-
next_step: "unclear"
|
|
780
|
-
};
|
|
781
|
-
var GLANCE_WIDTH = 400;
|
|
782
|
-
var GlanceAnswerSchema = ViewerAnswerSchema.extend({
|
|
783
|
-
/** What kind of product or service they take it for (D4). */
|
|
784
|
-
category: z.object({ answer: z.string().default(""), clarity: z.enum(["clear", "guess", "unclear"]).default("unclear") }).default({ answer: "", clarity: "unclear" }),
|
|
785
|
-
stopped: z.string().default(""),
|
|
786
|
-
me: z.enum(["yes", "no", "unsure"]).default("unsure")
|
|
787
|
-
});
|
|
788
|
-
function wherePhrase(placements) {
|
|
789
|
-
const fullScreen = placements.length === 0 || placements.some((p) => /automatic|stor|reel/i.test(p));
|
|
790
|
-
return fullScreen ? "your Instagram or Facebook feed, Stories or Reels" : "your Instagram or Facebook feed";
|
|
791
|
-
}
|
|
792
|
-
function knowledge(viewer) {
|
|
793
|
-
if (!viewer.knows.includes("brand")) return "You have never heard of the advertiser.";
|
|
794
|
-
const offer = viewer.knows.includes("offer") ? " You know roughly what they sell." : "";
|
|
795
|
-
return `You have come across the advertiser before.${offer}`;
|
|
796
|
-
}
|
|
797
|
-
function buildGlancePrompt(input) {
|
|
798
|
-
const who = input.market ? `You are ${input.market}. ` : "";
|
|
799
|
-
return [
|
|
800
|
-
`${who}You are scrolling ${wherePhrase(input.viewer.placements)} on your phone. ${knowledge(input.viewer)}`,
|
|
801
|
-
"This ad passes under your thumb and holds you for about three seconds: you take in the picture and read the biggest words, not the small print. The image is shown at the size your phone shows it.",
|
|
802
|
-
"Answer as this person, from those three seconds alone. Do not fill gaps with what ads like this usually sell.",
|
|
803
|
-
'For each question give your answer in English and how sure you are: "clear" when the ad says it outright or you already know it; "guess" when you are piecing it together; "unclear" when you cannot tell.',
|
|
804
|
-
"offer: what is being sold or offered?",
|
|
805
|
-
"for_whom: who is it for?",
|
|
806
|
-
"next_step: what would you do next if you wanted it?",
|
|
807
|
-
"category: what kind of product or service is this for (a payroll app, a trade course, a phone)?",
|
|
808
|
-
'missing: in one short sentence, what you would need to be told to get it; "" when nothing.',
|
|
809
|
-
"stopped: what made you stop on it, or what nearly made you scroll past, in a few words.",
|
|
810
|
-
'me: is this for someone like you? "yes", "no" or "unsure".',
|
|
811
|
-
"",
|
|
812
|
-
'Reply with only this JSON: {"offer":{"answer":"","clarity":"clear|guess|unclear"},"for_whom":{"answer":"","clarity":"clear|guess|unclear"},"next_step":{"answer":"","clarity":"clear|guess|unclear"},"category":{"answer":"","clarity":"clear|guess|unclear"},"missing":"","stopped":"","me":"yes|no|unsure"}'
|
|
813
|
-
].join("\n");
|
|
814
|
-
}
|
|
815
|
-
var QUESTION_WORDS = {
|
|
816
|
-
offer: "what is offered",
|
|
817
|
-
for_whom: "who it is for",
|
|
818
|
-
next_step: "what to do next"
|
|
819
|
-
};
|
|
820
|
-
function missWords(miss) {
|
|
821
|
-
if (miss.question === "presumes") return `it talks to them as a customer already ("${miss.viewerSaid}")`;
|
|
822
|
-
const said2 = miss.viewerSaid.trim() ? `"${miss.viewerSaid.trim()}"` : "nothing";
|
|
823
|
-
const what = QUESTION_WORDS[miss.question];
|
|
824
|
-
return miss.reason === "misread" ? `${what} (they were sure it is ${said2})` : `${what} (they said ${said2})`;
|
|
825
|
-
}
|
|
826
|
-
function glanceFindings(answer, intended, format, viewer, misread = { offer: false, category: false }) {
|
|
827
|
-
const verdict = judgeViewerAnswer({ ...answer, presumes: "" }, intended, GLANCE_REQUIRED, misread.offer);
|
|
828
|
-
const category = answer.category.answer.trim();
|
|
829
|
-
const kind = intended.recognition && category && misread.category ? [
|
|
830
|
-
{
|
|
831
|
-
severity: "warning",
|
|
832
|
-
what: `${format}: At a glance, a stranger took it for "${category}"; it is meant as ${intended.recognition}.`
|
|
833
|
-
}
|
|
834
|
-
] : [];
|
|
835
|
-
if (verdict.pass) return kind;
|
|
836
|
-
const needed = answer.missing.trim() ? ` They needed: ${answer.missing.trim().replace(/[.!]+$/, "")}.` : "";
|
|
837
|
-
const missed = verdict.missed.map(missWords).join("; ");
|
|
838
|
-
return [
|
|
839
|
-
{
|
|
840
|
-
severity: "blocking",
|
|
841
|
-
what: `${format}: At a glance, ${describeViewer(viewer).replace(/, on .* placements$/, "")} could not tell ${missed}.${needed}`
|
|
842
|
-
},
|
|
843
|
-
...kind
|
|
844
|
-
];
|
|
845
|
-
}
|
|
846
|
-
async function glanceMisreads(answer, intended, judge) {
|
|
847
|
-
const sure = sureEnough(answer.offer.clarity, GLANCE_REQUIRED.offer);
|
|
848
|
-
const [offer = false, category = false] = await misreadings(
|
|
849
|
-
[
|
|
850
|
-
{ said: sure ? answer.offer.answer : "", meant: intended.offer, sells: intended.sells },
|
|
851
|
-
{ said: answer.category.answer, meant: intended.recognition }
|
|
852
|
-
],
|
|
853
|
-
judge
|
|
854
|
-
);
|
|
855
|
-
return { offer, category };
|
|
856
|
-
}
|
|
857
|
-
function gatewayGlanceModel(onSpend) {
|
|
858
|
-
return (jpeg, prompt) => askAboutImages(GLANCE_CHECK_MODEL, [jpeg], prompt, onSpend);
|
|
859
|
-
}
|
|
860
|
-
async function glanceCheck(opts) {
|
|
861
|
-
let jpeg;
|
|
862
|
-
try {
|
|
863
|
-
const bytes = await bytesOf(opts.image);
|
|
864
|
-
jpeg = (await sharp(bytes).resize({ width: GLANCE_WIDTH }).jpeg({ quality: 85 }).toBuffer()).toString("base64");
|
|
865
|
-
} catch {
|
|
866
|
-
return null;
|
|
867
|
-
}
|
|
868
|
-
const prompt = buildGlancePrompt({ viewer: opts.viewer, ...opts.market ? { market: opts.market } : {} });
|
|
869
|
-
for (let attempt = 0; attempt < 2; attempt++) {
|
|
870
|
-
const parsed = GlanceAnswerSchema.safeParse(await opts.ask(jpeg, prompt));
|
|
871
|
-
if (parsed.success) {
|
|
872
|
-
const misread = await glanceMisreads(parsed.data, opts.intended, opts.judge ?? jevReadJudge());
|
|
873
|
-
return glanceFindings(parsed.data, opts.intended, opts.format, opts.viewer, misread);
|
|
874
|
-
}
|
|
875
|
-
}
|
|
876
|
-
return null;
|
|
877
|
-
}
|
|
878
|
-
|
|
879
|
-
// src/commands/canvas/logo-review.ts
|
|
880
|
-
import sharp2 from "sharp";
|
|
881
|
-
|
|
882
|
-
// src/engine/nodes/local/lib/logo-match.ts
|
|
883
|
-
var SOLID = 250;
|
|
884
|
-
var SAME_COLOUR = 60;
|
|
885
|
-
var LOGO_MATCH = 0.98;
|
|
886
|
-
var DRAWN_LOGO_MATCH = 0.9;
|
|
887
|
-
var COARSE_WIDTH = 180;
|
|
888
|
-
var MIN_SHOWN = 0.4;
|
|
889
|
-
var MAIN_COLOUR = 0.12;
|
|
890
|
-
var INK_NEAR = 90;
|
|
891
|
-
function inkColours(logo) {
|
|
892
|
-
const bins = /* @__PURE__ */ new Map();
|
|
893
|
-
let total = 0;
|
|
894
|
-
for (let i = 0; i < logo.width * logo.height; i++) {
|
|
895
|
-
if ((logo.data[i * 4 + 3] ?? 0) < SOLID) continue;
|
|
896
|
-
const r = logo.data[i * 4] ?? 0;
|
|
897
|
-
const g = logo.data[i * 4 + 1] ?? 0;
|
|
898
|
-
const b = logo.data[i * 4 + 2] ?? 0;
|
|
899
|
-
const key = r >> 5 << 6 | g >> 5 << 3 | b >> 5;
|
|
900
|
-
const bin = bins.get(key) ?? { n: 0, r: 0, g: 0, b: 0 };
|
|
901
|
-
bins.set(key, { n: bin.n + 1, r: bin.r + r, g: bin.g + g, b: bin.b + b });
|
|
902
|
-
total++;
|
|
903
|
-
}
|
|
904
|
-
return [...bins.values()].filter((b) => b.n >= MAIN_COLOUR * total).map((b) => [b.r / b.n, b.g / b.n, b.b / b.n]);
|
|
905
|
-
}
|
|
906
|
-
function mapOf(img, f, test) {
|
|
907
|
-
const width = Math.max(1, Math.floor(img.width / f));
|
|
908
|
-
const height = Math.max(1, Math.floor(img.height / f));
|
|
909
|
-
const map = new Uint8Array(width * height);
|
|
910
|
-
for (let y = 0; y < height; y++) {
|
|
911
|
-
for (let x = 0; x < width; x++) map[y * width + x] = cellOn(img.width, f, x * f, y * f, test) ? 1 : 0;
|
|
912
|
-
}
|
|
913
|
-
return { map, width, height };
|
|
914
|
-
}
|
|
915
|
-
function cellOn(width, f, x0, y0, test) {
|
|
916
|
-
let on = 0;
|
|
917
|
-
for (let j = 0; j < f; j++) {
|
|
918
|
-
for (let i = 0; i < f; i++) on += test((y0 + j) * width + x0 + i) ? 1 : 0;
|
|
919
|
-
}
|
|
920
|
-
return on * 2 >= f * f;
|
|
921
|
-
}
|
|
922
|
-
function inkMapOf(image, colours, f) {
|
|
923
|
-
return mapOf(image, f, (i) => colours.some((c) => distance(image.data, i * 4, c, 0) < INK_NEAR));
|
|
924
|
-
}
|
|
925
|
-
var maskOf = (logo, f) => mapOf(logo, f, (i) => (logo.data[i * 4 + 3] ?? 0) >= 128);
|
|
926
|
-
function summed(m) {
|
|
927
|
-
const w = m.width + 1;
|
|
928
|
-
const sum = new Int32Array(w * (m.height + 1));
|
|
929
|
-
for (let y = 0; y < m.height; y++) {
|
|
930
|
-
let row = 0;
|
|
931
|
-
for (let x = 0; x < m.width; x++) {
|
|
932
|
-
row += m.map[y * m.width + x] ?? 0;
|
|
933
|
-
sum[(y + 1) * w + x + 1] = (sum[y * w + x + 1] ?? 0) + row;
|
|
934
|
-
}
|
|
935
|
-
}
|
|
936
|
-
return { ...m, sum };
|
|
937
|
-
}
|
|
938
|
-
function inkIn(m, x0, y0, x1, y1) {
|
|
939
|
-
const w = m.width + 1;
|
|
940
|
-
const [a, b] = [Math.max(0, x0), Math.min(m.width, x1)];
|
|
941
|
-
const [c, d] = [Math.max(0, y0), Math.min(m.height, y1)];
|
|
942
|
-
if (a >= b || c >= d) return 0;
|
|
943
|
-
return (m.sum[d * w + b] ?? 0) - (m.sum[c * w + b] ?? 0) - (m.sum[d * w + a] ?? 0) + (m.sum[c * w + a] ?? 0);
|
|
944
|
-
}
|
|
945
|
-
function cellsOf(m) {
|
|
946
|
-
const rows = [];
|
|
947
|
-
const x0s = [];
|
|
948
|
-
const x1s = [];
|
|
949
|
-
for (let y = 0; y < m.height; y++) {
|
|
950
|
-
for (let x = 0; x < m.width; x++) {
|
|
951
|
-
if (!m.map[y * m.width + x]) continue;
|
|
952
|
-
const start = x;
|
|
953
|
-
while (x < m.width && m.map[y * m.width + x]) x++;
|
|
954
|
-
rows.push(y);
|
|
955
|
-
x0s.push(start);
|
|
956
|
-
x1s.push(x);
|
|
957
|
-
}
|
|
958
|
-
}
|
|
959
|
-
const mask = summed(m);
|
|
960
|
-
return {
|
|
961
|
-
rows: Int32Array.from(rows),
|
|
962
|
-
x0s: Int32Array.from(x0s),
|
|
963
|
-
x1s: Int32Array.from(x1s),
|
|
964
|
-
mask,
|
|
965
|
-
area: inkIn(mask, 0, 0, m.width, m.height),
|
|
966
|
-
width: m.width,
|
|
967
|
-
height: m.height
|
|
968
|
-
};
|
|
969
|
-
}
|
|
970
|
-
var fitScore = (inter, inside, win, area) => inter / (inside + win - inter) * Math.sqrt(inside / area);
|
|
971
|
-
function fitAt(ink, cells, x, y, floor = 0) {
|
|
972
|
-
const inside = inkIn(cells.mask, -x, -y, ink.width - x, ink.height - y);
|
|
973
|
-
if (inside < MIN_SHOWN * cells.area) return 0;
|
|
974
|
-
const win = inkIn(ink, x, y, x + cells.width, y + cells.height);
|
|
975
|
-
if (fitScore(Math.min(inside, win), inside, win, cells.area) <= floor) return 0;
|
|
976
|
-
let inter = 0;
|
|
977
|
-
for (let k = 0; k < cells.rows.length; k++) {
|
|
978
|
-
const v = y + (cells.rows[k] ?? 0);
|
|
979
|
-
inter += inkIn(ink, x + (cells.x0s[k] ?? 0), v, x + (cells.x1s[k] ?? 0), v + 1);
|
|
980
|
-
}
|
|
981
|
-
return fitScore(inter, inside, win, cells.area);
|
|
982
|
-
}
|
|
983
|
-
function bestFit(ink, cells, xs, ys, step = 1) {
|
|
984
|
-
let best = { x: 0, y: 0, score: 0 };
|
|
985
|
-
if (cells.area === 0) return best;
|
|
986
|
-
for (let y = ys[0]; y <= ys[1]; y += step) {
|
|
987
|
-
for (let x = xs[0]; x <= xs[1]; x += step) {
|
|
988
|
-
const score = fitAt(ink, cells, x, y, best.score);
|
|
989
|
-
if (score > best.score) best = { x, y, score };
|
|
990
|
-
}
|
|
991
|
-
}
|
|
992
|
-
return best;
|
|
993
|
-
}
|
|
994
|
-
function locateLogo(image, templates) {
|
|
995
|
-
const first = templates[0];
|
|
996
|
-
if (!first) return null;
|
|
997
|
-
const colours = inkColours(templates[templates.length - 1] ?? first);
|
|
998
|
-
if (colours.length === 0) return null;
|
|
999
|
-
const f = Math.max(1, Math.round(image.width / COARSE_WIDTH));
|
|
1000
|
-
const found = coarseFind(summed(inkMapOf(image, colours, f)), templates, f);
|
|
1001
|
-
if (!found || found.score === 0) return null;
|
|
1002
|
-
if (f === 1) {
|
|
1003
|
-
const t = templates[found.template];
|
|
1004
|
-
return { x: found.x, y: found.y, width: t.width, height: t.height, template: found.template, score: found.score };
|
|
1005
|
-
}
|
|
1006
|
-
return fineFind(summed(inkMapOf(image, colours, 1)), templates, found, f);
|
|
1007
|
-
}
|
|
1008
|
-
function coarseFind(coarse, templates, f) {
|
|
1009
|
-
let found = null;
|
|
1010
|
-
templates.forEach((t, k) => {
|
|
1011
|
-
const cells = cellsOf(maskOf(t, f));
|
|
1012
|
-
const reachX = Math.round(cells.width * (1 - MIN_SHOWN));
|
|
1013
|
-
const reachY = Math.round(cells.height * (1 - MIN_SHOWN));
|
|
1014
|
-
const fit = bestFit(
|
|
1015
|
-
coarse,
|
|
1016
|
-
cells,
|
|
1017
|
-
[-reachX, coarse.width - cells.width + reachX],
|
|
1018
|
-
[-reachY, coarse.height - cells.height + reachY]
|
|
1019
|
-
);
|
|
1020
|
-
if (!found || fit.score > found.score) found = { template: k, ...fit };
|
|
1021
|
-
});
|
|
1022
|
-
return found;
|
|
1023
|
-
}
|
|
1024
|
-
function fineFind(full, templates, found, f) {
|
|
1025
|
-
let fine = null;
|
|
1026
|
-
const [cx, cy] = [found.x * f, found.y * f];
|
|
1027
|
-
for (const k of [-2, -1, 0, 1, 2].map((d) => found.template + d)) {
|
|
1028
|
-
const t = templates[k];
|
|
1029
|
-
if (!t) continue;
|
|
1030
|
-
const cells = cellsOf(maskOf(t, 1));
|
|
1031
|
-
const near = bestFit(full, cells, [cx - 2 * f, cx + 2 * f], [cy - 2 * f, cy + 2 * f], 3);
|
|
1032
|
-
const fit = bestFit(full, cells, [near.x - 2, near.x + 2], [near.y - 2, near.y + 2]);
|
|
1033
|
-
if (!fine || fit.score > fine.score)
|
|
1034
|
-
fine = { x: fit.x, y: fit.y, width: t.width, height: t.height, template: k, score: fit.score };
|
|
1035
|
-
}
|
|
1036
|
-
return fine;
|
|
1037
|
-
}
|
|
1038
|
-
var distance = (a, i, b, j) => Math.hypot((a[i] ?? 0) - (b[j] ?? 0), (a[i + 1] ?? 0) - (b[j + 1] ?? 0), (a[i + 2] ?? 0) - (b[j + 2] ?? 0));
|
|
1039
|
-
function logoAgreement(image, logo, at) {
|
|
1040
|
-
let solid = 0;
|
|
1041
|
-
let same = 0;
|
|
1042
|
-
for (let j = 0; j < logo.height; j++) {
|
|
1043
|
-
for (let i = 0; i < logo.width; i++) {
|
|
1044
|
-
const s = (j * logo.width + i) * 4;
|
|
1045
|
-
if ((logo.data[s + 3] ?? 0) < SOLID) continue;
|
|
1046
|
-
solid++;
|
|
1047
|
-
const u = at.x + i;
|
|
1048
|
-
const v = at.y + j;
|
|
1049
|
-
if (u < 0 || v < 0 || u >= image.width || v >= image.height) continue;
|
|
1050
|
-
if (distance(image.data, (v * image.width + u) * 4, logo.data, s) < SAME_COLOUR) same++;
|
|
1051
|
-
}
|
|
1052
|
-
}
|
|
1053
|
-
return solid === 0 ? 0 : same / solid;
|
|
1054
|
-
}
|
|
1055
|
-
|
|
1056
|
-
// src/commands/canvas/logo-review.ts
|
|
1057
|
-
var nodesOf = (parsed) => {
|
|
1058
|
-
const nodes = parsed?.nodes;
|
|
1059
|
-
return Array.isArray(nodes) ? nodes : [];
|
|
1060
|
-
};
|
|
1061
|
-
var refId = (ref) => typeof ref === "string" ? ref.match(/^\$ref:([a-z][a-z0-9_]*)\./)?.[1] ?? null : null;
|
|
1062
|
-
var edgesSaid = (edges) => edges.join(" and ") || "edge";
|
|
1063
|
-
var sizeId = formatSlug;
|
|
1064
|
-
function wordsNodeOf(nodes, composite, format) {
|
|
1065
|
-
let ref = composite?.inputs?.image;
|
|
1066
|
-
for (let hops = 0; hops < 12; hops++) {
|
|
1067
|
-
const n = nodes.find((m) => m.id === refId(ref));
|
|
1068
|
-
if (!n) break;
|
|
1069
|
-
if (n.type === "static_format" || n.type === "image_generate") return String(n.id);
|
|
1070
|
-
if (n.type === "static_prefilter") return null;
|
|
1071
|
-
ref = n.inputs?.image;
|
|
1072
|
-
}
|
|
1073
|
-
return `format_${sizeId(format)}`;
|
|
1074
|
-
}
|
|
1075
|
-
function saidOfRoom(format, defect, corner, words = `format_${sizeId(format)}`) {
|
|
1076
|
-
const kind = { item: "logo", element: "logo", defect: "other", edges: [] };
|
|
1077
|
-
const room = words === null ? `keep the ${corner} plain for the logo, with no word, button or card in it (a \`--fix\` of the chosen picture).` : `run \`baker canvas run \u2026 --regenerate ${words}\` and keep the ${corner} clear for the logo.`;
|
|
1078
|
-
const what = defect === "no_room" ? `${format}: there is no room for the logo, not even on a small plate; ${room}` : `${format}: the logo is lost on the picture under it; run \`--regenerate logo_${sizeId(format)}\` so it is set on a plate.`;
|
|
1079
|
-
return { severity: "blocking", what, kind };
|
|
1080
|
-
}
|
|
1081
|
-
function said(format, p, corner = logoCornerWords(void 0), words) {
|
|
1082
|
-
if (p.defect === "no_room" || p.defect === "illegible") return saidOfRoom(format, p.defect, corner, words);
|
|
1083
|
-
const kind = (item, element, defect) => ({
|
|
1084
|
-
item,
|
|
1085
|
-
element,
|
|
1086
|
-
defect,
|
|
1087
|
-
edges: p.defect === "cut" ? [...p.edges] : []
|
|
1088
|
-
});
|
|
1089
|
-
const blocking = (what, k) => ({
|
|
1090
|
-
severity: "blocking",
|
|
1091
|
-
what: `${format}: ${what}`,
|
|
1092
|
-
kind: k
|
|
1093
|
-
});
|
|
1094
|
-
if (p.element === "logo") {
|
|
1095
|
-
return p.defect === "cut" ? blocking(
|
|
1096
|
-
`the frame cuts the logo at its ${edgesSaid(p.edges)}; place it again inside the frame.`,
|
|
1097
|
-
kind("logo", "logo", "cut")
|
|
1098
|
-
) : blocking(
|
|
1099
|
-
`the logo reaches past the ${edgesSaid(p.edges)} of the part of the frame the app leaves clear; place it again inside it.`,
|
|
1100
|
-
kind("safe_zone", "logo", "other")
|
|
1101
|
-
);
|
|
1102
|
-
}
|
|
1103
|
-
if (p.defect === "under_logo") {
|
|
1104
|
-
const what = p.element === "headline" ? "the headline" : "a line of the copy";
|
|
1105
|
-
return blocking(
|
|
1106
|
-
`the logo covers ${what}; set the words again clear of the logo's corner.`,
|
|
1107
|
-
kind("layout", "copy", "other")
|
|
1108
|
-
);
|
|
1109
|
-
}
|
|
1110
|
-
return p.defect === "cut" ? blocking(
|
|
1111
|
-
`the frame cuts the headline at its ${edgesSaid(p.edges)}; set the words again inside the frame.`,
|
|
1112
|
-
kind("layout", "copy", "cut")
|
|
1113
|
-
) : blocking(
|
|
1114
|
-
`the headline reaches past the ${edgesSaid(p.edges)} of the part of the frame the app leaves clear; set the words again inside it.`,
|
|
1115
|
-
kind("safe_zone", "copy", "other")
|
|
1116
|
-
);
|
|
1117
|
-
}
|
|
1118
|
-
function logoPlacementFindings(parsed, outputsByNode) {
|
|
1119
|
-
return nodesWithRole(parsed, LOGO_COMPOSITE_ROLE).flatMap((n) => {
|
|
1120
|
-
const facts = LogoFacts.safeParse(outputsByNode[n.id]?.facts);
|
|
1121
|
-
if (!facts.success) return [];
|
|
1122
|
-
const { format, slot, problems } = facts.data;
|
|
1123
|
-
const kept = problems.some((p) => p.defect === "no_room") ? slotPosition(slot, deliveredSize(format)) : void 0;
|
|
1124
|
-
const corner = logoCornerWords(kept ?? n.params?.position);
|
|
1125
|
-
const words = wordsNodeOf(nodesOf(parsed), n, facts.data.format);
|
|
1126
|
-
return facts.data.problems.map((p) => said(facts.data.format, p, corner, words));
|
|
1127
|
-
});
|
|
1128
|
-
}
|
|
1129
|
-
async function rgbaOf(bytes) {
|
|
1130
|
-
const { data, info } = await sharp2(bytes).ensureAlpha().raw().toBuffer({ resolveWithObject: true });
|
|
1131
|
-
return { data, width: info.width, height: info.height };
|
|
1132
|
-
}
|
|
1133
|
-
async function ingestBytes(ref, outputsByNode) {
|
|
1134
|
-
const id = refId(ref);
|
|
1135
|
-
const asset = id ? outputsByNode[id]?.asset : void 0;
|
|
1136
|
-
const source = await textColourSource(asset?.metadata);
|
|
1137
|
-
if (source) return source;
|
|
1138
|
-
const at = typeof asset?.path === "string" ? asset.path : typeof asset?.url === "string" ? asset.url : null;
|
|
1139
|
-
return at ? await bytesOf(at).catch(() => null) : null;
|
|
1140
|
-
}
|
|
1141
|
-
var LOGO_FOUND = 0.6;
|
|
1142
|
-
var pct2 = (v) => `${Math.round(v * 100)}%`;
|
|
1143
|
-
function mismatch(format, agreement) {
|
|
1144
|
-
return {
|
|
1145
|
-
severity: "blocking",
|
|
1146
|
-
what: `${format}: the logo is not the brand's file as it is (redrawn or altered: ${pct2(agreement)} of it matches the file); run it again so the file itself is placed.`,
|
|
1147
|
-
kind: { item: "logo", element: "logo", defect: "other", edges: [] }
|
|
1148
|
-
};
|
|
1149
|
-
}
|
|
1150
|
-
function drawnMismatch(format, agreement) {
|
|
1151
|
-
return {
|
|
1152
|
-
severity: "blocking",
|
|
1153
|
-
what: `${format}: the logo drawn is not the brand's logo (only ${pct2(agreement)} of it matches the file); draw this size again with the brand's logo copied exactly from the logo file, letter for letter.`,
|
|
1154
|
-
kind: { item: "logo", element: "logo", defect: "other", edges: [] }
|
|
1155
|
-
};
|
|
1156
|
-
}
|
|
1157
|
-
function searchWidths(frameWidth) {
|
|
1158
|
-
const widths = [];
|
|
1159
|
-
for (let w = frameWidth * 0.08; w <= frameWidth * 0.45; w *= 1.04) widths.push(Math.round(w));
|
|
1160
|
-
return widths;
|
|
1161
|
-
}
|
|
1162
|
-
async function placedLogoFinding(n, outputsByNode, images) {
|
|
1163
|
-
const facts = LogoFacts.safeParse(outputsByNode[String(n.id)]?.facts);
|
|
1164
|
-
if (!facts.success || facts.data.problems.some((p) => p.defect === "no_room")) return [];
|
|
1165
|
-
const { format, box, variant, ink } = facts.data;
|
|
1166
|
-
const image = images.find((i) => i.format === format);
|
|
1167
|
-
const logos = Array.isArray(n.inputs?.logos) ? n.inputs.logos : [];
|
|
1168
|
-
const [ad, file] = await Promise.all([
|
|
1169
|
-
image ? bytesOf(image.path).catch(() => null) : null,
|
|
1170
|
-
ingestBytes(logos[variant], outputsByNode)
|
|
1171
|
-
]);
|
|
1172
|
-
if (!ad || !file) return [];
|
|
1173
|
-
const placed = await fitArtwork(await logoArtwork(file, ink ? { currentColor: ink } : {}), box);
|
|
1174
|
-
const agreement = logoAgreement(await rgbaOf(ad), placed, box);
|
|
1175
|
-
return agreement < LOGO_MATCH ? [mismatch(format, agreement)] : [];
|
|
1176
|
-
}
|
|
1177
|
-
async function drawnLogoOn(picture, arts) {
|
|
1178
|
-
let best = null;
|
|
1179
|
-
for (const art of arts) {
|
|
1180
|
-
if (!art) continue;
|
|
1181
|
-
const templates = await Promise.all(
|
|
1182
|
-
searchWidths(picture.width).map((w) => fitArtwork(art, { width: w, height: picture.height }))
|
|
1183
|
-
);
|
|
1184
|
-
const at = locateLogo(picture, templates);
|
|
1185
|
-
if (!at || at.score < LOGO_FOUND || best && best.score >= at.score) continue;
|
|
1186
|
-
best = { agreement: logoAgreement(picture, templates[at.template], at), box: at, score: at.score };
|
|
1187
|
-
}
|
|
1188
|
-
return best;
|
|
1189
|
-
}
|
|
1190
|
-
var NO_MARGIN = { top: 0, bottom: 0, left: 0, right: 0 };
|
|
1191
|
-
async function artworksOf(file, inks) {
|
|
1192
|
-
const colours = usesTextColour(file) ? inks : [void 0];
|
|
1193
|
-
return await Promise.all(colours.map((ink) => logoArtwork(file, ink ? { currentColor: ink } : {}).catch(() => null)));
|
|
1194
|
-
}
|
|
1195
|
-
async function drawnLogoFinding(image, arts) {
|
|
1196
|
-
const ad = await bytesOf(image.path).catch(() => null);
|
|
1197
|
-
if (!ad) return [];
|
|
1198
|
-
const picture = await rgbaOf(ad);
|
|
1199
|
-
const drawn = await drawnLogoOn(picture, arts);
|
|
1200
|
-
if (!drawn) return [];
|
|
1201
|
-
const frame2 = { width: picture.width, height: picture.height };
|
|
1202
|
-
const cut = placementProblems({ frame: frame2, safe: NO_MARGIN, logo: drawn.box });
|
|
1203
|
-
if (cut.length > 0) return cut.map((p) => said(image.format, p));
|
|
1204
|
-
return drawn.agreement < DRAWN_LOGO_MATCH ? [drawnMismatch(image.format, drawn.agreement)] : [];
|
|
1205
|
-
}
|
|
1206
|
-
async function deliveredLogoFindings(parsed, outputsByNode, images, inks = ["#000000", "#FFFFFF"]) {
|
|
1207
|
-
const nodes = nodesOf(parsed);
|
|
1208
|
-
const composites = nodes.filter((n) => n.tags?.role === LOGO_COMPOSITE_ROLE && n.type === "static_logo");
|
|
1209
|
-
if (composites.length > 0) {
|
|
1210
|
-
return (await Promise.all(composites.map((n) => placedLogoFinding(n, outputsByNode, images)))).flat();
|
|
1211
|
-
}
|
|
1212
|
-
const logos = nodes.filter((n) => n.type === "ingest" && /^brand_logo/.test(String(n.tags?.role ?? "")));
|
|
1213
|
-
const files = await Promise.all(logos.map((n) => ingestBytes(`$ref:${String(n.id)}.asset`, outputsByNode)));
|
|
1214
|
-
const arts = (await Promise.all(files.map((f) => f ? artworksOf(f, inks) : []))).flat();
|
|
1215
|
-
if (!arts.some((a) => a !== null)) return [];
|
|
1216
|
-
const asIs = deliveredAsIs(nodes);
|
|
1217
|
-
const drawn = images.filter((i) => !asIs.has(i.format));
|
|
1218
|
-
return (await Promise.all(drawn.map((image) => drawnLogoFinding(image, arts)))).flat();
|
|
1219
|
-
}
|
|
1220
|
-
function deliveredAsIs(nodes) {
|
|
1221
|
-
const final = nodes.find((n) => n.id === "final" && n.type === "collect");
|
|
1222
|
-
const labels = final?.params?.labels;
|
|
1223
|
-
const images = final?.inputs?.images;
|
|
1224
|
-
if (!Array.isArray(labels) || !Array.isArray(images)) return /* @__PURE__ */ new Set();
|
|
1225
|
-
return new Set(
|
|
1226
|
-
labels.filter((label, i) => {
|
|
1227
|
-
const from = nodes.find((n) => n.id === refId(images[i]));
|
|
1228
|
-
return typeof label === "string" && from?.type === "ingest";
|
|
1229
|
-
})
|
|
1230
|
-
);
|
|
1231
|
-
}
|
|
1232
|
-
|
|
1233
|
-
// src/commands/canvas/static-run-review.ts
|
|
1234
|
-
function imagesOf(output) {
|
|
1235
|
-
const list = Array.isArray(output) ? output : [output];
|
|
1236
|
-
const images = list.filter((o) => Boolean(o) && typeof o === "object");
|
|
1237
|
-
return images.length > 0 && images.every((i) => i.kind === "image") ? images : null;
|
|
1238
|
-
}
|
|
1239
|
-
function promptPathOf(parsed) {
|
|
1240
|
-
const nodes = parsed?.nodes;
|
|
1241
|
-
if (!Array.isArray(nodes)) return null;
|
|
1242
|
-
const prompt = nodes.find((n) => n?.id === "prompt" && n?.type === "ingest");
|
|
1243
|
-
const p = prompt?.params;
|
|
1244
|
-
return p?.source === "path" && p.expect === "json" && typeof p.path === "string" ? p.path : null;
|
|
1245
|
-
}
|
|
1246
|
-
function staticReviewTargets(parsed, output) {
|
|
1247
|
-
const promptPath = promptPathOf(parsed);
|
|
1248
|
-
const images = imagesOf(output);
|
|
1249
|
-
if (!promptPath || !images) return null;
|
|
1250
|
-
const labels = finalOutputLabelsFromCanvas(parsed)?.labels ?? [];
|
|
1251
|
-
return {
|
|
1252
|
-
promptPath,
|
|
1253
|
-
// A local file when the run downloaded it, else its durable URL.
|
|
1254
|
-
images: images.flatMap((image, i) => {
|
|
1255
|
-
const source = typeof image.path === "string" ? image.path : typeof image.url === "string" ? image.url : null;
|
|
1256
|
-
return source ? [{ path: source, format: labels[i] ?? "" }] : [];
|
|
1257
|
-
})
|
|
1258
|
-
};
|
|
1259
|
-
}
|
|
1260
|
-
function nodesOf2(parsed) {
|
|
1261
|
-
const nodes = parsed?.nodes;
|
|
1262
|
-
return Array.isArray(nodes) ? nodes : [];
|
|
1263
|
-
}
|
|
1264
|
-
var refId2 = (ref) => typeof ref === "string" ? ref.match(/^\$ref:([a-z][a-z0-9_]*)\./)?.[1] ?? null : null;
|
|
1265
|
-
var hasRole = (n, role) => n.tags?.role === role;
|
|
1266
|
-
function variantCount(nodes) {
|
|
1267
|
-
const calls = nodes.filter((n) => hasRole(n, STATIC_VARIANT_CALL_ROLE)).length;
|
|
1268
|
-
if (calls > 0) return calls;
|
|
1269
|
-
const one = nodes.find((n) => hasRole(n, STATIC_VARIANTS_ROLE) && n.type === "image_generate");
|
|
1270
|
-
if (one) return typeof one.params?.n === "number" ? one.params.n : 1;
|
|
1271
|
-
if (nodes.some((n) => hasRole(n, STATIC_FIX_ROLE))) return 1;
|
|
1272
|
-
return nodes.filter((n) => n.type === "image_generate" && /^ad(_[a-z])?$/.test(String(n.id))).length;
|
|
1273
|
-
}
|
|
1274
|
-
function staticRunShape(parsed) {
|
|
1275
|
-
const nodes = nodesOf2(parsed);
|
|
1276
|
-
const renders = nodes.filter((n) => n.type === "image_generate" && typeof n.id === "string");
|
|
1277
|
-
const candidates = variantCount(nodes);
|
|
1278
|
-
const logoIds = new Set(nodes.filter((n) => hasRole(n, BRAND_LOGO_ROLE)).map((n) => String(n.id)));
|
|
1279
|
-
const logo = nodes.some((n) => hasRole(n, LOGO_COMPOSITE_ROLE)) || renders.some((n) => {
|
|
1280
|
-
const refs = n.inputs?.reference;
|
|
1281
|
-
return (Array.isArray(refs) ? refs : [refs]).some((r) => logoIds.has(refId2(r) ?? ""));
|
|
1282
|
-
}) || // On one picture each size's words call places the logo file.
|
|
1283
|
-
nodes.some((n) => n.type === "static_format" && logoIds.has(refId2(n.inputs?.logo) ?? ""));
|
|
1284
|
-
const masterId = nodes.find((n) => hasRole(n, STATIC_MASTER_ROLE))?.id;
|
|
1285
|
-
const adapt = nodes.find((n) => hasRole(n, STATIC_ADAPT_ROLE));
|
|
1286
|
-
return {
|
|
1287
|
-
candidates,
|
|
1288
|
-
judged: candidates > 1 && nodes.some(
|
|
1289
|
-
(n) => n.type === "image_select" && (hasRole(n, STATIC_PICK_ROLE) || n.id === "pick") || hasRole(n, VARIANT_PREFILTER_ROLE) && typeof n.params?.judge_model === "string"
|
|
1290
|
-
),
|
|
1291
|
-
relays: masterId !== void 0 ? 0 : Math.max(0, renders.length - candidates),
|
|
1292
|
-
cuts: nodes.filter((n) => {
|
|
1293
|
-
const from = refId2(n.inputs?.image);
|
|
1294
|
-
return hasRole(n, STATIC_SIZE_ROLE) && from !== null && from === masterId;
|
|
1295
|
-
}).length,
|
|
1296
|
-
relaid: nodes.filter((n) => hasRole(n, STATIC_ADAPT_FORMAT_ROLE)).length,
|
|
1297
|
-
adapted: Array.isArray(adapt?.params?.formats) ? adapt.params.formats.length : 0,
|
|
1298
|
-
plates: nodes.some((n) => hasRole(n, STATIC_LEAD_ROLE)) ? nodes.filter((n) => hasRole(n, STATIC_VARIANT_CALL_ROLE)).length : 0,
|
|
1299
|
-
// The lead the master delivers is the chosen option's own words, replayed: not a size set again.
|
|
1300
|
-
worded: nodes.filter((n) => hasRole(n, STATIC_FORMAT_ROLE) && n.id !== masterReads(nodes)).length,
|
|
1301
|
-
logo
|
|
1302
|
-
};
|
|
1303
|
-
}
|
|
1304
|
-
function masterReads(nodes) {
|
|
1305
|
-
return refId2(nodes.find((n) => hasRole(n, STATIC_MASTER_ROLE))?.inputs?.image);
|
|
1306
|
-
}
|
|
1307
|
-
function shapeHint(shape, copy) {
|
|
1308
|
-
const drawn = shape.plates > 0 ? " (a picture each without the ad's words, the lead size's words set on it)" : "";
|
|
1309
|
-
const variants = `${shape.candidates} variant${shape.candidates === 1 ? "" : "s"} rendered${drawn}${shape.judged ? ", ranked by the checks with a judge on a tie" : ", no judge"}`;
|
|
1310
|
-
const sizes = [
|
|
1311
|
-
...shape.worded > 0 ? [`${shape.worded} size${shape.worded === 1 ? "" : "s"} cut from the chosen picture with ${shape.worded === 1 ? "its" : "their"} words set for ${shape.worded === 1 ? "it" : "them"} (one request each)`] : [],
|
|
1312
|
-
...shape.relaid > 0 ? [`${shape.relaid} size${shape.relaid === 1 ? "" : "s"} re-laid out from the chosen picture (one request each)`] : [],
|
|
1313
|
-
...shape.cuts > 0 ? [`${shape.cuts} size${shape.cuts === 1 ? "" : "s"} cut from the chosen picture`] : [],
|
|
1314
|
-
...shape.adapted > 0 ? [`${shape.adapted} adapted from it`] : [],
|
|
1315
|
-
...shape.relays > 0 ? [`${shape.relays} other format${shape.relays === 1 ? "" : "s"} re-laid from the winner`] : []
|
|
1316
|
-
];
|
|
1317
|
-
const text = copy === 0 ? "no copy (the picture is the ad)" : "the copy set by the model and read back word for word";
|
|
1318
|
-
return `This run: ${variants}${sizes.length > 0 ? `; ${sizes.join("; ")}` : ""}; ${text}; ${shape.logo ? "the brand logo on the ad from its real file" : "no logo"}.`;
|
|
1319
|
-
}
|
|
1320
|
-
var PAID_FOR = {
|
|
1321
|
-
edit: "one edit of the version shown",
|
|
1322
|
-
sizes: "only the sizes asked for, laid out again",
|
|
1323
|
-
options: "new options from scratch, every size made from the one chosen"
|
|
1324
|
-
};
|
|
1325
|
-
function runCostHint(stats, kind) {
|
|
1326
|
-
if (!stats) return null;
|
|
1327
|
-
const cached = stats.cached_nodes > 0 ? ` (${stats.cached_nodes} of ${stats.total_nodes} steps came from the cache, free)` : "";
|
|
1328
|
-
return `This run cost ${Math.round(stats.total_credits)} credits: ${PAID_FOR[kind]}${cached}.`;
|
|
1329
|
-
}
|
|
1330
|
-
async function textOf(ref) {
|
|
1331
|
-
const r = ref;
|
|
1332
|
-
try {
|
|
1333
|
-
if (typeof r?.path === "string") return await readFile2(r.path, "utf8");
|
|
1334
|
-
if (typeof r?.url === "string") {
|
|
1335
|
-
const res = await fetch(r.url);
|
|
1336
|
-
return res.ok ? await res.text() : null;
|
|
1337
|
-
}
|
|
1338
|
-
} catch {
|
|
1339
|
-
return null;
|
|
1340
|
-
}
|
|
1341
|
-
return null;
|
|
1342
|
-
}
|
|
1343
|
-
function sizeShapeOf(canvas) {
|
|
1344
|
-
return isPlateCanvas(canvas) ? "plate" : "relayout";
|
|
1345
|
-
}
|
|
1346
|
-
function oneSizeFix(shape) {
|
|
1347
|
-
return shape === "plate" ? "`baker canvas run \u2026 --regenerate format_<size>` (for example `format_9x16`) sets that size's words again on the same picture (one request)" : "`baker canvas run \u2026 --regenerate adapt_<size>` (for example `adapt_9x16`) lays out that size again from the same picture (one request)";
|
|
1348
|
-
}
|
|
1349
|
-
function fixHint(shape) {
|
|
1350
|
-
return `One thing wrong in a version that is otherwise right: \`baker canvas run \u2026 --fix "<what to change>"\` edits that version and changes only that, keeping the picture, the layout and the other words (one render). Wrong or missing words: check the lines in prompt.json \`copy\` are exactly what should be printed, shorten a line the model keeps breaking, and re-run: a change only to copy, positions or colours is made as an edit of the version shown. Wrong picture, colour or subject: edit prompt.json's \`scene\`, \`colors\` or \`references\`. Layout or a logo drawn wrong: say in each line's \`position\` (and \`scene.layout\`) where it sits, by what is around it. A right prompt that rolled badly: \`baker canvas run \u2026 --regenerate static_variants\` renders new options (every size follows from the new pick). One size wrong while the chosen picture is right (words cut or too small, the button small, something drawn twice): ${oneSizeFix(shape)}.`;
|
|
1351
|
-
}
|
|
1352
|
-
function verdictHints(verdict, shape = "plate") {
|
|
1353
|
-
if (verdict === "needs_fixes") {
|
|
1354
|
-
const cost = shape === "plate" ? "each size's words take one request" : "each re-laid-out size takes one request; a cut is free";
|
|
1355
|
-
return [
|
|
1356
|
-
`NOT READY: the finished ad has blocking problems. Do not present it as done, and never ask the person whether to fix them: fix them now, inside this version. A defect in a version that is otherwise right is a \`--fix\`: it edits the chosen picture only, and every size is made from it again (${cost}). The same defect after a fix means the fix does not work: change the spec (prompt.json) or the approach, never the same retry. If it still cannot be fixed, show the person the best version and say in one plain sentence what is left, in their words ("the logo sits where Stories covers it"), without a question; never record your own checks as their feedback.`,
|
|
1357
|
-
fixHint(shape)
|
|
1358
|
-
];
|
|
1359
|
-
}
|
|
1360
|
-
if (verdict === "not_reviewed") {
|
|
1361
|
-
return [
|
|
1362
|
-
"The finished ad was NOT reviewed: no model gateway key here, or the review model did not answer twice. Look at every word of every format yourself before showing it, or re-run the same command (every node comes from the cache) to review it again."
|
|
1363
|
-
];
|
|
1364
|
-
}
|
|
1365
|
-
if (verdict === "ready") {
|
|
1366
|
-
return ["Reviewed every format of the finished ad: every word read back exactly, nothing to fix.", SHOW_IT];
|
|
1367
|
-
}
|
|
1368
|
-
return verdict === "ready_with_notes" ? [SHOW_IT] : [];
|
|
1369
|
-
}
|
|
1370
|
-
var SHOW_IT = `Show it as a Version ("Version 2"), never a run id or a file, in one line: the idea's message, who it is for, the customer quote it stands on (or that it is an explore bet), and the finding it answers. Name the versions you would run first; never ask which to keep or whether to publish: the person answers in their own time.`;
|
|
1371
|
-
function allowedSceneWords(spec) {
|
|
1372
|
-
return [.../* @__PURE__ */ new Set([...spec.scene_text, ...spec.third_party_brands.map((b) => b.name)])];
|
|
1373
|
-
}
|
|
1374
|
-
function brandPalette(brand) {
|
|
1375
|
-
if (!brand) return [];
|
|
1376
|
-
const named = [brand.ink, brand.accent, brand.cta, brand.ground, ...brand.palette];
|
|
1377
|
-
return [...new Set(named.filter((hex) => typeof hex === "string"))];
|
|
1378
|
-
}
|
|
1379
|
-
function safeAreaPlacements(viewer) {
|
|
1380
|
-
const named = (viewer?.placements ?? []).filter((p) => p !== "automatic");
|
|
1381
|
-
return named.length > 0 && named.length === viewer?.placements.length ? named : void 0;
|
|
1382
|
-
}
|
|
1383
|
-
function canvasPlacements(parsed) {
|
|
1384
|
-
const node = nodesWithRole(parsed, VARIANT_PREFILTER_ROLE)[0];
|
|
1385
|
-
const placements = node?.params?.placements;
|
|
1386
|
-
return Array.isArray(placements) && placements.length > 0 && placements.every((p) => typeof p === "string") ? placements : void 0;
|
|
1387
|
-
}
|
|
1388
|
-
async function reviewStaticRun(opts) {
|
|
1389
|
-
const targets = staticReviewTargets(opts.parsed, opts.output);
|
|
1390
|
-
if (!targets) return null;
|
|
1391
|
-
const prefilterId = nodesWithRole(opts.parsed, VARIANT_PREFILTER_ROLE)[0]?.id;
|
|
1392
|
-
const tieBreak = prefilterId ? opts.outputsByNode[prefilterId]?.reasoning : void 0;
|
|
1393
|
-
const pickId = nodesWithRole(opts.parsed, STATIC_PICK_ROLE)[0]?.id ?? "pick";
|
|
1394
|
-
const reasoning = typeof tieBreak === "string" ? tieBreak : await textOf(opts.outputsByNode[pickId]?.reasoning);
|
|
1395
|
-
const judge = reasoning ? parseJudgeScores(reasoning) : null;
|
|
1396
|
-
let copy = [];
|
|
1397
|
-
let mechanisms = [];
|
|
1398
|
-
let intended = {};
|
|
1399
|
-
let expectLogo = false;
|
|
1400
|
-
let concept = null;
|
|
1401
|
-
let uncast = [];
|
|
1402
|
-
let nobody = false;
|
|
1403
|
-
let brand = opts.brandName;
|
|
1404
|
-
let lockup = [...opts.lockup ?? []];
|
|
1405
|
-
let sceneText = [];
|
|
1406
|
-
let lines = [];
|
|
1407
|
-
let native;
|
|
1408
|
-
let palette = [];
|
|
1409
|
-
try {
|
|
1410
|
-
const spec = readAdSpec(JSON.parse(await readFile2(targets.promptPath, "utf8")));
|
|
1411
|
-
copy = spec.copy.map((l) => l.text);
|
|
1412
|
-
lines = spec.copy.map((l) => ({ text: l.text, lettering: l.lettering, ...l.role ? { role: l.role } : {} }));
|
|
1413
|
-
if (spec.native) {
|
|
1414
|
-
copy = nativeCopy(spec.native);
|
|
1415
|
-
lines = copy.map((text) => ({ text, lettering: "designed" }));
|
|
1416
|
-
native = nativeSurfaceName(spec.native);
|
|
1417
|
-
}
|
|
1418
|
-
palette = spec.native ? [] : brandPalette(spec.brand);
|
|
1419
|
-
mechanisms = spec.mechanism.map((m) => m.device);
|
|
1420
|
-
brand = spec.brand?.name ?? opts.brandName;
|
|
1421
|
-
const sells = (await readCompanyReading(path2.resolve(path2.dirname(targets.promptPath), "../../..")))?.sells;
|
|
1422
|
-
intended = {
|
|
1423
|
-
...spec.message?.trim() ? { offer: spec.message.trim() } : {},
|
|
1424
|
-
...spec.viewer?.who.trim() ? { persona: spec.viewer.who.trim() } : {},
|
|
1425
|
-
...spec.recognition?.trim() ? { recognition: spec.recognition.trim() } : {},
|
|
1426
|
-
...sells ? { sells } : {}
|
|
1427
|
-
};
|
|
1428
|
-
lockup = [.../* @__PURE__ */ new Set([...spec.brand?.lockup ?? [], ...lockup])];
|
|
1429
|
-
sceneText = [
|
|
1430
|
-
...allowedSceneWords(spec),
|
|
1431
|
-
...spec.native ? nativeChrome(spec.native, spec.viewer?.market?.language, interfaceWordsOf(opts.parsed)) : []
|
|
1432
|
-
];
|
|
1433
|
-
expectLogo = spec.logo && !spec.native && staticRunShape(opts.parsed).logo;
|
|
1434
|
-
concept = conceptSummary(spec);
|
|
1435
|
-
const cacheDir = path2.join(findWorkspaceRoot(path2.dirname(targets.promptPath)) ?? path2.dirname(targets.promptPath), "canvas", ".cache");
|
|
1436
|
-
const people = spec.native ? [] : await peopleReader(cacheDir, (u) => opts.onSpend?.(u))(copy) ?? [];
|
|
1437
|
-
uncast = uncastPeople(spec, people);
|
|
1438
|
-
nobody = !spec.native && castsNobody(spec);
|
|
1439
|
-
} catch {
|
|
1440
|
-
copy = [];
|
|
1441
|
-
}
|
|
1442
|
-
const shape = staticRunShape(opts.parsed);
|
|
1443
|
-
const placements = canvasPlacements(opts.parsed) ?? safeAreaPlacements(opts.viewer);
|
|
1444
|
-
const masterFormat = staticMasterFormat(opts.parsed) ?? void 0;
|
|
1445
|
-
const glancing = opts.glance === false ? Promise.resolve(null) : glanceAtFinished(
|
|
1446
|
-
targets.images,
|
|
1447
|
-
opts.viewer ?? STRANGER,
|
|
1448
|
-
intended,
|
|
1449
|
-
opts.glance ?? gatewayGlanceModel(opts.onSpend),
|
|
1450
|
-
opts.onSpend
|
|
1451
|
-
).catch(() => null);
|
|
1452
|
-
const comparing = opts.previous ? nearIdenticalFindings(targets.images, opts.previous).catch(() => []) : Promise.resolve([]);
|
|
1453
|
-
const leadFormat = masterFormat ?? targets.images[0]?.format ?? "";
|
|
1454
|
-
const lead = targets.images.find((i) => i.format === leadFormat);
|
|
1455
|
-
const drawn = native || !lead ? [] : drawnSizes(opts.parsed, targets.images.map((i) => i.format), leadFormat);
|
|
1456
|
-
const matching = lead && drawn.length > 0 ? compareSizes(
|
|
1457
|
-
lead,
|
|
1458
|
-
targets.images.filter((i) => drawn.includes(i.format)),
|
|
1459
|
-
{ ...opts.onSpend ? { onSpend: opts.onSpend } : {} }
|
|
1460
|
-
).catch(() => drawn.map((format) => ({ format, compared: false, differences: [] }))) : Promise.resolve([]);
|
|
1461
|
-
const untouched = opts.settled ? await samePictureSizes(targets.images, opts.settled.images) : [];
|
|
1462
|
-
const changed = targets.images.filter((i) => !untouched.includes(i.format));
|
|
1463
|
-
const held = await heldRules(path2.dirname(targets.promptPath)).catch(() => ({ rules: [] }));
|
|
1464
|
-
const review = await reviewRenderedStatic({
|
|
1465
|
-
images: changed.length > 0 ? changed : targets.images,
|
|
1466
|
-
rules: held.rules,
|
|
1467
|
-
copy,
|
|
1468
|
-
lines,
|
|
1469
|
-
palette,
|
|
1470
|
-
...placements ? { placements } : {},
|
|
1471
|
-
...brand ? { brand } : {},
|
|
1472
|
-
...lockup.length > 0 ? { lockup } : {},
|
|
1473
|
-
...sceneText.length > 0 ? { sceneText } : {},
|
|
1474
|
-
...masterFormat ? { masterFormat } : {},
|
|
1475
|
-
...expectLogo ? { expectLogo } : {},
|
|
1476
|
-
...concept && concept.mustKeep.length > 0 && referenceSource(opts.parsed) ? { concept: { ...concept, reference: referenceSource(opts.parsed) } } : {},
|
|
1477
|
-
logo: shape.logo,
|
|
1478
|
-
...native ? { native } : {},
|
|
1479
|
-
...uncast.length > 0 ? { uncastPeople: uncast } : {},
|
|
1480
|
-
...nobody ? { castsNobody: true } : {},
|
|
1481
|
-
...native ? { scrolled: scrolledLines(opts.parsed, opts.outputsByNode) } : {},
|
|
1482
|
-
mechanisms,
|
|
1483
|
-
...opts.viewer ? { viewer: describeViewer(opts.viewer) } : {},
|
|
1484
|
-
onSpend: opts.onSpend
|
|
1485
|
-
});
|
|
1486
|
-
const [glanced, compared, matched] = await Promise.all([glancing, comparing, matching]);
|
|
1487
|
-
const glance = review === null ? null : glanced;
|
|
1488
|
-
const unchanged = review === null ? [] : compared;
|
|
1489
|
-
const sized = sizeFactFindings(opts.parsed, opts.outputsByNode);
|
|
1490
|
-
const logoChecked = expectLogo && review !== null;
|
|
1491
|
-
const placedLogo = logoChecked ? logoPlacementFindings(opts.parsed, opts.outputsByNode) : [];
|
|
1492
|
-
const deliveredLogo = logoChecked ? await deliveredLogoFindings(opts.parsed, opts.outputsByNode, changed.length > 0 ? changed : targets.images, [
|
|
1493
|
-
.../* @__PURE__ */ new Set([...palette, "#FFFFFF", "#000000"])
|
|
1494
|
-
]).catch(() => []) : [];
|
|
1495
|
-
const differing = matched.flatMap((m) => m.differences.length > 0 ? [sizeDifferenceFinding(m.format, m.differences)] : []);
|
|
1496
|
-
const fresh = review === null ? null : [...review, ...glance ?? [], ...unchanged, ...sized, ...placedLogo, ...deliveredLogo, ...differing];
|
|
1497
|
-
const reviewed = fresh === null || !opts.settled ? fresh : carryUnchanged(fresh, opts.settled.review, untouched);
|
|
1498
|
-
const verdict = staticVerdict(reviewed);
|
|
1499
|
-
const hints = verdictHints(verdict, sizeShapeOf(opts.parsed));
|
|
1500
|
-
const lost = keptLostHint(reviewed ?? [], await ideaOf(targets.promptPath));
|
|
1501
|
-
if (lost) hints.push(lost);
|
|
1502
|
-
const sizeHints = verdict === "needs_fixes" ? sizeFixHints(opts.parsed, reviewed) : [];
|
|
1503
|
-
const sizesFirst = sizeHints[0]?.startsWith("Do this first") === true;
|
|
1504
|
-
if (sizesFirst) hints.push(...sizeHints);
|
|
1505
|
-
for (const f of reviewed ?? []) hints.push(`${f.severity === "blocking" ? "Must fix" : "Should fix"}: ${f.what}`);
|
|
1506
|
-
if ((reviewed ?? []).some((f) => f.severity === "blocking" && f.kind?.item === "rule" && f.kind.element === "copy")) {
|
|
1507
|
-
hints.push(
|
|
1508
|
-
'A company rule the words break is yours to rewrite in prompt.json\'s `copy` (no automatic round changes the words); only when the person asked for those words, keep them and add `"waive": [{"rule": "<id>", "why": "<their ask>"}]`.'
|
|
1509
|
-
);
|
|
1510
|
-
}
|
|
1511
|
-
if (review !== null && glance === null && opts.glance !== false) {
|
|
1512
|
-
hints.push("The finished ad was not shown to a stranger at a glance (the model did not answer): look at the 4:5 at phone size yourself and say what it sells in three seconds.");
|
|
1513
|
-
}
|
|
1514
|
-
const unmatched = review === null ? [] : matched.filter((m) => !m.compared).map((m) => m.format);
|
|
1515
|
-
if (unmatched.length > 0) {
|
|
1516
|
-
hints.push(
|
|
1517
|
-
`The ${unmatched.join(" and ")} could not be compared with the ${leadFormat} (the model did not answer): look at them side by side yourself, for the same people and product, shown once, unstretched.`
|
|
1518
|
-
);
|
|
1519
|
-
}
|
|
1520
|
-
if (!sizesFirst) hints.push(...sizeHints);
|
|
1521
|
-
hints.push(shapeHint(shape, copy.length));
|
|
1522
|
-
hints.push(...variantHints(judge, prefilterOutcome(opts.parsed, opts.outputsByNode)));
|
|
1523
|
-
return { review: reviewed, verdict, judge, hints };
|
|
1524
|
-
}
|
|
1525
|
-
function scrolledLines(parsed, outputsByNode) {
|
|
1526
|
-
return Object.fromEntries(
|
|
1527
|
-
nodesOf2(parsed).flatMap((n) => {
|
|
1528
|
-
const out = typeof n.id === "string" ? outputsByNode[n.id] : void 0;
|
|
1529
|
-
const format = n.params?.format;
|
|
1530
|
-
return n.type === "static_native" && typeof format === "string" && Array.isArray(out?.scrolled) ? [[format, out.scrolled.filter((t) => typeof t === "string")]] : [];
|
|
1531
|
-
})
|
|
1532
|
-
);
|
|
1533
|
-
}
|
|
1534
|
-
async function ideaOf(promptPath) {
|
|
1535
|
-
const definition = await readFile2(path2.join(path2.dirname(promptPath), "_definition.md"), "utf8").catch(() => "");
|
|
1536
|
-
const idea = frontmatterOf(definition)?.idea;
|
|
1537
|
-
return typeof idea === "string" && idea.trim() ? idea.trim() : void 0;
|
|
1538
|
-
}
|
|
1539
|
-
function referenceSource(parsed) {
|
|
1540
|
-
const original = nodesOf2(parsed).find((n) => n.id === "original" && n.type === "ingest");
|
|
1541
|
-
const source = original?.params?.url ?? original?.params?.path;
|
|
1542
|
-
return typeof source === "string" && !source.includes("[TODO") ? source : null;
|
|
1543
|
-
}
|
|
1544
|
-
function interfaceWordsOf(parsed) {
|
|
1545
|
-
const nodes = parsed?.nodes;
|
|
1546
|
-
const screen = Array.isArray(nodes) ? nodes.find((n) => n?.type === "static_native") : void 0;
|
|
1547
|
-
return readInterfaceWords(screen?.params?.interface_words) ?? void 0;
|
|
1548
|
-
}
|
|
1549
|
-
var STRANGER = { temperature: "cold", knows: [], placements: ["automatic"], source: "knowledge", reasons: [] };
|
|
1550
|
-
async function glanceAtFinished(images, viewer, intended, ask, onSpend) {
|
|
1551
|
-
const shown = images.find((i) => i.format === "4:5") ?? images[0];
|
|
1552
|
-
if (!shown) return null;
|
|
1553
|
-
return await glanceCheck({
|
|
1554
|
-
image: shown.path,
|
|
1555
|
-
format: shown.format,
|
|
1556
|
-
viewer,
|
|
1557
|
-
intended,
|
|
1558
|
-
ask,
|
|
1559
|
-
judge: jevReadJudge(onSpend),
|
|
1560
|
-
...viewer.market ? { market: describeMarket(viewer.market) } : {}
|
|
1561
|
-
});
|
|
1562
|
-
}
|
|
1563
|
-
function sizeFixHints(parsed, review) {
|
|
1564
|
-
const cut = new Set(nodesWithRole(parsed, STATIC_FORMAT_ROLE).map((n) => n.id));
|
|
1565
|
-
const relaid = [...nodesWithRole(parsed, STATIC_ADAPT_FORMAT_ROLE).map((n) => n.id), ...cut];
|
|
1566
|
-
const blocking = (review ?? []).filter((f) => f.severity === "blocking");
|
|
1567
|
-
const regenerate = relaid.flatMap((id) => {
|
|
1568
|
-
const format = formatOfSizeNode(parsed, id);
|
|
1569
|
-
if (!format || !blocking.some((f) => f.what.startsWith(`${format}:`))) return [];
|
|
1570
|
-
return [
|
|
1571
|
-
cut.has(id) ? `The ${format}'s words alone need fixing and the picture is right: \`baker canvas run \u2026 --regenerate ${id}\` sets the ${format}'s words again on the same picture (one request). If the picture itself is wrong, \`--fix\` it instead: every size's words are set again on the corrected picture.` : `The ${format} alone needs fixing and the chosen picture is right: \`baker canvas run \u2026 --regenerate ${id}\` lays out the ${format} again from the same picture (one request). If the chosen picture itself is wrong, \`--fix\` it instead: every size follows.`
|
|
1572
|
-
];
|
|
1573
|
-
});
|
|
1574
|
-
const relaidFormats = relaid.map((id) => formatOfSizeNode(parsed, id)).filter((f) => Boolean(f));
|
|
1575
|
-
const sizesOnly = regenerate.length > 0 && blocking.every((f) => relaidFormats.some((format) => f.what.startsWith(`${format}:`)));
|
|
1576
|
-
const lead = sizesOnly ? regenerate.map((h, i) => i === 0 ? `Do this first, not a --fix: ${h}` : h) : regenerate;
|
|
1577
|
-
return [...lead, ...safeFitHints(parsed, blocking)];
|
|
1578
|
-
}
|
|
1579
|
-
var COVERED = / sits? where .+? covers? (?:it|them) /;
|
|
1580
|
-
function safeFitHints(parsed, blocking) {
|
|
1581
|
-
return nodesWithRole(parsed, STATIC_SAFE_FIT_ROLE).flatMap((n) => {
|
|
1582
|
-
const format = typeof n.params?.format === "string" ? n.params.format : formatOfSlug(n.id.replace(/^safe_/, ""));
|
|
1583
|
-
if (!blocking.some((f) => f.what.startsWith(`${format}:`) && COVERED.test(f.what))) return [];
|
|
1584
|
-
return [
|
|
1585
|
-
`The ${format} was already shrunk and shifted automatically to clear what the app covers; small misses are corrected that way, so this one is too large for it. Change the layout itself (shorter copy, fewer lines, a smaller block of text) rather than a \`--fix\` asking to move it, which moves it only about 1%.`
|
|
1586
|
-
];
|
|
1587
|
-
});
|
|
1588
|
-
}
|
|
1589
|
-
var SIZE_FACT_FINDING = {
|
|
1590
|
-
band_too_far: {
|
|
1591
|
-
what: (format) => `${format}: the words reach too far past the part of the frame the app leaves clear to be moved inside it; set them inside it.`,
|
|
1592
|
-
kind: { item: "safe_zone", element: "copy", defect: "other", edges: [] }
|
|
1593
|
-
},
|
|
1594
|
-
words_over_face: {
|
|
1595
|
-
what: (format) => `${format}: the words were set over a face; set them where no face is.`,
|
|
1596
|
-
kind: { item: "layout", element: "copy", defect: "other", edges: [] }
|
|
1597
|
-
},
|
|
1598
|
-
words_misaligned: {
|
|
1599
|
-
what: (format) => `${format}: ${PATCHED_WORDS}, which shows as a box; set them again on the same picture.`,
|
|
1600
|
-
kind: { item: "layout", element: "copy", defect: "other", edges: [] }
|
|
1601
|
-
},
|
|
1602
|
-
words_not_read: {
|
|
1603
|
-
what: (format) => `${format}: ${UNREAD_WORDS}, so the picture around them may have been redrawn; set them again on the same picture.`,
|
|
1604
|
-
kind: { item: "layout", element: "copy", defect: "other", edges: [] }
|
|
1605
|
-
},
|
|
1606
|
-
subject_covered: {
|
|
1607
|
-
what: (format, facts) => `${format}: the words hide ${(facts.covered ?? ["the product"]).join(" and ")}, which the other sizes show; set them where it stays in view.`,
|
|
1608
|
-
kind: { item: "layout", element: "copy", defect: "other", edges: [] }
|
|
1609
|
-
},
|
|
1610
|
-
subject_cut: {
|
|
1611
|
-
what: (format) => `${format}: no cut of the picture keeps every person and product whole in this size.`,
|
|
1612
|
-
kind: { item: "picture", element: "picture", defect: "cut", edges: [] }
|
|
1613
|
-
}
|
|
1614
|
-
};
|
|
1615
|
-
function coveredIn(facts) {
|
|
1616
|
-
if (facts === void 0 || facts === null || typeof facts !== "object") return null;
|
|
1617
|
-
const covered = facts.covered;
|
|
1618
|
-
return Array.isArray(covered) ? covered.filter((c) => typeof c === "string") : [];
|
|
1619
|
-
}
|
|
1620
|
-
function hiddenEverywhere(sizes, outputsByNode) {
|
|
1621
|
-
const lists = sizes.map((s) => ({ ...s, covered: coveredIn(outputsByNode[s.id]?.facts) }));
|
|
1622
|
-
const labels = new Set(
|
|
1623
|
-
(lists[0]?.covered ?? []).filter((label) => lists.length > 1 && lists.every((s) => s.covered?.includes(label)))
|
|
1624
|
-
);
|
|
1625
|
-
const first = lists.find((s) => s.format && s.covered?.some((label) => labels.has(label)));
|
|
1626
|
-
const notes = first?.format && labels.size > 0 ? [
|
|
1627
|
-
{
|
|
1628
|
-
severity: "warning",
|
|
1629
|
-
what: `${first.format}: the words hide ${[...labels].join(" and ")} in every size; set them where it stays in view if it is what the ad sells.`,
|
|
1630
|
-
kind: { item: "layout", element: "copy", defect: "other", edges: [] }
|
|
1631
|
-
}
|
|
1632
|
-
] : [];
|
|
1633
|
-
return { labels, notes };
|
|
1634
|
-
}
|
|
1635
|
-
function sizeFactFindings(parsed, outputsByNode) {
|
|
1636
|
-
const added = paintedAdditions(parsed, outputsByNode);
|
|
1637
|
-
const sizes = nodesWithRole(parsed, STATIC_FORMAT_ROLE);
|
|
1638
|
-
const everywhere = hiddenEverywhere(
|
|
1639
|
-
sizes.map((n) => ({ id: n.id, format: formatOfSizeNode(parsed, n.id) })),
|
|
1640
|
-
outputsByNode
|
|
1641
|
-
);
|
|
1642
|
-
const found = sizes.flatMap((n) => {
|
|
1643
|
-
const format = formatOfSizeNode(parsed, n.id);
|
|
1644
|
-
const facts = outputsByNode[n.id]?.facts ?? {};
|
|
1645
|
-
const shownElsewhere = (coveredIn(facts) ?? []).some((label) => !everywhere.labels.has(label));
|
|
1646
|
-
const said2 = typeof facts.reason === "string" && (facts.reason !== "subject_covered" || shownElsewhere) ? SIZE_FACT_FINDING[facts.reason] : void 0;
|
|
1647
|
-
const patched = facts.reason !== "words_misaligned" && facts.words_mode !== "whole" && typeof facts.residual === "number" && facts.residual > MISALIGNED ? SIZE_FACT_FINDING.words_misaligned : void 0;
|
|
1648
|
-
const covered = (coveredIn(facts) ?? []).filter((label) => !everywhere.labels.has(label));
|
|
1649
|
-
const fromPlate = refId2(n.inputs?.plate);
|
|
1650
|
-
const extra = fromPlate ? added.get(fromPlate) : void 0;
|
|
1651
|
-
if (!format) return [];
|
|
1652
|
-
return [
|
|
1653
|
-
...[said2, patched].flatMap(
|
|
1654
|
-
(f) => f ? [{ severity: "blocking", what: f.what(format, covered.length > 0 ? { covered } : {}), kind: f.kind }] : []
|
|
1655
|
-
),
|
|
1656
|
-
...extra ? [
|
|
1657
|
-
{
|
|
1658
|
-
severity: "blocking",
|
|
1659
|
-
what: `${format}: the picture painted wider from the chosen one shows ${extra.join(", ")}, which the other sizes do not. It must show the main size's people and product, once each.`,
|
|
1660
|
-
kind: { item: "sizes", element: "picture", defect: "other", edges: [] }
|
|
1661
|
-
}
|
|
1662
|
-
] : []
|
|
1663
|
-
];
|
|
1664
|
-
});
|
|
1665
|
-
return [...found, ...everywhere.notes];
|
|
1666
|
-
}
|
|
1667
|
-
function paintedAdditions(parsed, outputsByNode) {
|
|
1668
|
-
return new Map(
|
|
1669
|
-
nodesWithRole(parsed, STATIC_PLATE_ROLE).flatMap((n) => {
|
|
1670
|
-
const facts = outputsByNode[n.id]?.facts;
|
|
1671
|
-
const added = Array.isArray(facts?.added) ? facts.added.filter((a) => typeof a === "string") : [];
|
|
1672
|
-
return facts?.reason === "subject_added" && added.length > 0 ? [[n.id, added]] : [];
|
|
1673
|
-
})
|
|
1674
|
-
);
|
|
1675
|
-
}
|
|
1676
|
-
function drawnSizes(parsed, delivered, masterFormat) {
|
|
1677
|
-
const others = delivered.filter((format) => format && format !== masterFormat);
|
|
1678
|
-
const cut = nodesWithRole(parsed, STATIC_FORMAT_ROLE);
|
|
1679
|
-
if (cut.length === 0) return others;
|
|
1680
|
-
const painted = new Set(nodesWithRole(parsed, STATIC_PLATE_ROLE).map((n) => n.id));
|
|
1681
|
-
const fromPainted = new Set(
|
|
1682
|
-
cut.flatMap((n) => {
|
|
1683
|
-
const plate = refId2(n.inputs?.plate);
|
|
1684
|
-
const format = formatOfSizeNode(parsed, n.id);
|
|
1685
|
-
return plate && painted.has(plate) && format ? [format] : [];
|
|
1686
|
-
})
|
|
1687
|
-
);
|
|
1688
|
-
return others.filter((format) => fromPainted.has(format));
|
|
1689
|
-
}
|
|
1690
|
-
function formatOfSlug(slug) {
|
|
1691
|
-
return slug.replace("x", ":").replace("_", ".");
|
|
1692
|
-
}
|
|
1693
|
-
function prefilterNodeId(parsed) {
|
|
1694
|
-
return nodesWithRole(parsed, VARIANT_PREFILTER_ROLE)[0]?.id ?? null;
|
|
1695
|
-
}
|
|
1696
|
-
function prefilterOutcome(parsed, outputsByNode) {
|
|
1697
|
-
const id = prefilterNodeId(parsed);
|
|
1698
|
-
const out = id ? outputsByNode[id] : void 0;
|
|
1699
|
-
return out && Array.isArray(out.dropped) ? out : null;
|
|
1700
|
-
}
|
|
1701
|
-
function prefilterSpend(parsed, outputsByNode, nodeRuns) {
|
|
1702
|
-
const cached = (id2) => nodeRuns.some((r) => r.node_id === id2 && r.cached);
|
|
1703
|
-
const id = prefilterNodeId(parsed);
|
|
1704
|
-
const checks = id && !cached(id) ? prefilterOutcome(parsed, outputsByNode)?.usage ?? [] : [];
|
|
1705
|
-
const fits = [
|
|
1706
|
-
...nodesWithRole(parsed, STATIC_SAFE_FIT_ROLE),
|
|
1707
|
-
...nodesWithRole(parsed, STATIC_PLACE_ROLE),
|
|
1708
|
-
// A size cut from one picture reads its subjects and its words; a widened picture its subjects.
|
|
1709
|
-
...nodesWithRole(parsed, STATIC_LEAD_ROLE),
|
|
1710
|
-
...nodesWithRole(parsed, STATIC_FORMAT_ROLE),
|
|
1711
|
-
...nodesWithRole(parsed, STATIC_PLATE_ROLE),
|
|
1712
|
-
// The logo's composite reads the size's words for its check.
|
|
1713
|
-
...nodesWithRole(parsed, LOGO_COMPOSITE_ROLE)
|
|
1714
|
-
].filter((n) => !cached(n.id)).flatMap((n) => {
|
|
1715
|
-
const usage = outputsByNode[n.id]?.usage;
|
|
1716
|
-
return Array.isArray(usage) ? usage : [];
|
|
1717
|
-
});
|
|
1718
|
-
return [...checks, ...fits];
|
|
1719
|
-
}
|
|
1720
|
-
function variantHints(judge, prefilter) {
|
|
1721
|
-
const hints = [];
|
|
1722
|
-
const dropped = prefilter?.dropped ?? [];
|
|
1723
|
-
const kept = Array.isArray(prefilter?.images) ? prefilter.images.length : judge?.length ?? 0;
|
|
1724
|
-
const total = dropped.length + kept;
|
|
1725
|
-
if (prefilter?.flagged) {
|
|
1726
|
-
hints.push(
|
|
1727
|
-
`Every variant failed the checks; variant ${prefilter.flagged.index + 1} had the fewest problems and was kept: ${prefilter.flagged.reasons.join(" ")}`
|
|
1728
|
-
);
|
|
1729
|
-
} else if (dropped.length > 0) {
|
|
1730
|
-
const list = dropped.map((d) => `variant ${d.index + 1} (${d.reasons.join(" ")})`).join("; ");
|
|
1731
|
-
hints.push(`${dropped.length} of ${total} variants set aside by the checks before the judge: ${list}.`);
|
|
1732
|
-
}
|
|
1733
|
-
const alone = prefilter?.order?.length === 1 && !prefilter.flagged ? prefilter.order[0] : void 0;
|
|
1734
|
-
if (alone !== void 0 && dropped.length > 0) {
|
|
1735
|
-
hints.push(
|
|
1736
|
-
`The checks ranked variant ${alone + 1} best, so no judge was needed; the others stay in this run as options the person can switch to (\`baker canvas run --use-variant\`).`
|
|
1737
|
-
);
|
|
1738
|
-
}
|
|
1739
|
-
const winner = judge ? judgeWinner(judge) : null;
|
|
1740
|
-
if (judge && winner) {
|
|
1741
|
-
const gone = new Set(dropped.map((d) => d.index));
|
|
1742
|
-
const shown = prefilter?.order ?? Array.from({ length: total }, (_, i) => i).filter((i) => !gone.has(i));
|
|
1743
|
-
const variant = (shown[winner.image - 1] ?? winner.image - 1) + 1;
|
|
1744
|
-
const why = winner.of === void 0 ? `${winner.total}/${Object.keys(winner.scores).length * 5}` : `first on ${Object.entries(winner.scores).filter(([, beaten]) => beaten === winner.of).map(([criterion]) => criterion.replace(/_/g, " ")).join(", ") || "none of the criteria alone"}`;
|
|
1745
|
-
hints.push(
|
|
1746
|
-
`The judge picked variant ${variant} of the ${judge.length} it compared (${why}); the others it compared stay in this run as options the person can switch to (\`baker canvas run --use-variant\`).`
|
|
1747
|
-
);
|
|
1748
|
-
}
|
|
1749
|
-
return hints;
|
|
1750
|
-
}
|
|
1751
|
-
|
|
1752
|
-
// src/commands/canvas/render-state.ts
|
|
1753
|
-
import { mkdir as mkdir2, readdir, readFile as readFile3, rm, writeFile as writeFile2 } from "fs/promises";
|
|
1754
|
-
import path3 from "path";
|
|
1755
|
-
var RENDER_STATE_DIR = ".rendered";
|
|
1756
|
-
function statePath(canvasRoot, slug) {
|
|
1757
|
-
return path3.join(canvasRoot, RENDER_STATE_DIR, `${slug}.json`);
|
|
1758
|
-
}
|
|
1759
|
-
async function readRenderState(canvasRoot, slug) {
|
|
1760
|
-
try {
|
|
1761
|
-
const parsed = JSON.parse(await readFile3(statePath(canvasRoot, slug), "utf8"));
|
|
1762
|
-
return parsed && typeof parsed === "object" ? parsed : {};
|
|
1763
|
-
} catch {
|
|
1764
|
-
return {};
|
|
1765
|
-
}
|
|
1766
|
-
}
|
|
1767
|
-
async function latestVersion(canvasRoot, slug) {
|
|
1768
|
-
return (await readRenderState(canvasRoot, slug)).rendered?.runId ?? null;
|
|
1769
|
-
}
|
|
1770
|
-
async function updateRenderState(canvasRoot, slug, patch) {
|
|
1771
|
-
try {
|
|
1772
|
-
const next = { ...await readRenderState(canvasRoot, slug), ...patch };
|
|
1773
|
-
await mkdir2(path3.join(canvasRoot, RENDER_STATE_DIR), { recursive: true });
|
|
1774
|
-
await writeFile2(statePath(canvasRoot, slug), `${JSON.stringify(next, null, 2)}
|
|
1775
|
-
`, "utf8");
|
|
1776
|
-
} catch {
|
|
1777
|
-
}
|
|
1778
|
-
}
|
|
1779
|
-
async function recordRenderAttempt(canvasRoot, slug, sourceSha) {
|
|
1780
|
-
if (!sourceSha) return;
|
|
1781
|
-
await updateRenderState(canvasRoot, slug, { attempted: { sourceSha, at: Date.now() } });
|
|
1782
|
-
}
|
|
1783
|
-
async function recordRendered(canvasRoot, slug, sourceSha, runId, drawn = {}) {
|
|
1784
|
-
if (!sourceSha) return;
|
|
1785
|
-
await updateRenderState(canvasRoot, slug, {
|
|
1786
|
-
rendered: { sourceSha, runId, at: Date.now() },
|
|
1787
|
-
...drawn.prompt !== void 0 ? { prompt: drawn.prompt } : {},
|
|
1788
|
-
...drawn.anchor ? { anchor: drawn.anchor } : {},
|
|
1789
|
-
...drawn.idea ? { idea: drawn.idea } : {},
|
|
1790
|
-
lastFix: drawn.lastFix,
|
|
1791
|
-
picture: drawn.picture,
|
|
1792
|
-
...drawn.seriesLeadRun ? { seriesLeadRun: drawn.seriesLeadRun } : {}
|
|
1793
|
-
});
|
|
1794
|
-
}
|
|
1795
|
-
async function recordSeen(canvasRoot, slug, seen) {
|
|
1796
|
-
await updateRenderState(canvasRoot, slug, { seen });
|
|
1797
|
-
}
|
|
1798
|
-
async function recordIdeaLines(canvasRoot, slug, idea) {
|
|
1799
|
-
if ((await readRenderState(canvasRoot, slug)).idea) return;
|
|
1800
|
-
await updateRenderState(canvasRoot, slug, { idea });
|
|
1801
|
-
}
|
|
1802
|
-
async function recordReviewOutcome(canvasRoot, slug, outcome) {
|
|
1803
|
-
await updateRenderState(canvasRoot, slug, outcome);
|
|
1804
|
-
}
|
|
1805
|
-
async function recordSeriesLeadRun(canvasRoot, slug, leadRunId) {
|
|
1806
|
-
await updateRenderState(canvasRoot, slug, { seriesLeadRun: leadRunId });
|
|
1807
|
-
}
|
|
1808
|
-
async function recordSnapshot(canvasRoot, slug, snapshot) {
|
|
1809
|
-
await updateRenderState(canvasRoot, slug, { snapshot });
|
|
1810
|
-
}
|
|
1811
|
-
function isRenderStale(state, currentSourceSha) {
|
|
1812
|
-
if (!state.rendered) return false;
|
|
1813
|
-
if (!isSourceStale(currentSourceSha, state.rendered.sourceSha)) return false;
|
|
1814
|
-
return state.attempted?.sourceSha !== currentSourceSha;
|
|
1815
|
-
}
|
|
1816
|
-
async function staleCreatives(workspaceRoot, turnId) {
|
|
1817
|
-
const creativesDir = path3.join(workspaceRoot, "src", "creatives");
|
|
1818
|
-
const canvasRoot = path3.join(workspaceRoot, "canvas");
|
|
1819
|
-
const turnRenders = turnId === void 0 ? void 0 : await readTurnRenders(path3.join(canvasRoot, ".cache"));
|
|
1820
|
-
let slugs;
|
|
1821
|
-
try {
|
|
1822
|
-
slugs = (await readdir(creativesDir, { withFileTypes: true })).filter((d) => d.isDirectory()).map((d) => d.name);
|
|
1823
|
-
} catch {
|
|
1824
|
-
return [];
|
|
1825
|
-
}
|
|
1826
|
-
const stale = [];
|
|
1827
|
-
for (const slug of slugs.sort()) {
|
|
1828
|
-
const state = await readRenderState(canvasRoot, slug);
|
|
1829
|
-
if (!state.rendered) continue;
|
|
1830
|
-
const canvasPath = path3.join(creativesDir, slug, `${slug}.canvas.json`);
|
|
1831
|
-
let prepared;
|
|
1832
|
-
try {
|
|
1833
|
-
prepared = await prepareCanvas(canvasPath, { write: false });
|
|
1834
|
-
} catch {
|
|
1835
|
-
continue;
|
|
1836
|
-
}
|
|
1837
|
-
if (unsuppliedPlaceholderAssets(prepared.fileGraph).length > 0) continue;
|
|
1838
|
-
const current = prepared.sourceSha;
|
|
1839
|
-
if (!current || !isRenderStale(state, current)) continue;
|
|
1840
|
-
const promptOnDisk = await readFile3(path3.join(creativesDir, slug, "prompt.json"), "utf8").then((text) => JSON.parse(text)).catch(() => null);
|
|
1841
|
-
const promptNow = isStaticAdCanvas(prepared.canvas) ? promptOnDisk : null;
|
|
1842
|
-
const refusal = turnRenderRefusal(turnRenders, turnId, slug, {
|
|
1843
|
-
correction: plainRunEdit(prepared.canvas, state.prompt, promptNow) !== null,
|
|
1844
|
-
shape: sizeShapeOf(prepared.fileGraph)
|
|
1845
|
-
});
|
|
1846
|
-
stale.push({
|
|
1847
|
-
slug,
|
|
1848
|
-
canvasPath: path3.relative(workspaceRoot, canvasPath).split(path3.sep).join("/"),
|
|
1849
|
-
renderedRunId: state.rendered.runId,
|
|
1850
|
-
sourceSha: current,
|
|
1851
|
-
...refusal ? { refusedThisTurn: `${refusal.message} ${refusal.fix}` } : {}
|
|
1852
|
-
});
|
|
1853
|
-
}
|
|
1854
|
-
return stale;
|
|
1855
|
-
}
|
|
1856
|
-
async function clearLegacyDirtyMarker(canvasRoot, slug) {
|
|
1857
|
-
await rm(path3.join(canvasRoot, ".dirty", `${slug}.json`), { force: true }).catch(() => void 0);
|
|
1858
|
-
}
|
|
1859
|
-
|
|
1860
|
-
export {
|
|
1861
|
-
specEditInstruction,
|
|
1862
|
-
frameChanges,
|
|
1863
|
-
repeatsFailedFix,
|
|
1864
|
-
fixMemoryOf,
|
|
1865
|
-
persistingDefects,
|
|
1866
|
-
pictureEdit,
|
|
1867
|
-
plainRunEdit,
|
|
1868
|
-
isStaticAdCanvas,
|
|
1869
|
-
peopleReader,
|
|
1870
|
-
AUTO_FIX_ROUNDS,
|
|
1871
|
-
lostVital,
|
|
1872
|
-
stopsWithoutRepair,
|
|
1873
|
-
autoFixStep,
|
|
1874
|
-
correctFrom,
|
|
1875
|
-
placedTooFar,
|
|
1876
|
-
formatOfSizeNode,
|
|
1877
|
-
rendersNewPicture,
|
|
1878
|
-
paidFor,
|
|
1879
|
-
withRelayNote,
|
|
1880
|
-
withRelayEdit,
|
|
1881
|
-
withSizesFollowingFix,
|
|
1882
|
-
withExtendedSizes,
|
|
1883
|
-
withDeliveredSizes,
|
|
1884
|
-
staticReviewTargets,
|
|
1885
|
-
runCostHint,
|
|
1886
|
-
sizeShapeOf,
|
|
1887
|
-
oneSizeFix,
|
|
1888
|
-
reviewStaticRun,
|
|
1889
|
-
prefilterSpend,
|
|
1890
|
-
readRenderState,
|
|
1891
|
-
latestVersion,
|
|
1892
|
-
recordRenderAttempt,
|
|
1893
|
-
recordRendered,
|
|
1894
|
-
recordSeen,
|
|
1895
|
-
recordIdeaLines,
|
|
1896
|
-
recordReviewOutcome,
|
|
1897
|
-
recordSeriesLeadRun,
|
|
1898
|
-
recordSnapshot,
|
|
1899
|
-
staleCreatives,
|
|
1900
|
-
clearLegacyDirtyMarker
|
|
1901
|
-
};
|
|
1902
|
-
//# sourceMappingURL=chunk-BUKBQPDY.js.map
|