@koda-sl/baker-cli 0.531.0 → 0.532.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 +12 -10
- package/dist/account-2UXZ6CZJ.js +82 -0
- package/dist/account-HQD5P3AF.js +139 -0
- package/dist/account-OWMJG4IW.js +82 -0
- package/dist/account-assets-JRMYVXQP.js +290 -0
- package/dist/account-level-PEGLZQTI.js +611 -0
- package/dist/account-reads-W2GAN335.js +219 -0
- package/dist/account-users-WLTQNPL7.js +64 -0
- package/dist/account-writes-TNADUSHW.js +68 -0
- package/dist/accounts-D3SQTZB7.js +701 -0
- package/dist/accounts-HRQFOTBJ.js +80 -0
- package/dist/accounts-MQMEOGQD.js +114 -0
- package/dist/accounts-T6SRCZJQ.js +76 -0
- package/dist/accounts-Y2VWI3AA.js +115 -0
- package/dist/actions-VJXED57L.js +55 -0
- package/dist/active-entities-BOMM4YDF.js +103 -0
- package/dist/activecampaign-TNJIQA4C.js +938 -0
- package/dist/activities-YH4K4JAI.js +75 -0
- package/dist/ad-group-writes-7BGCZA3M.js +172 -0
- package/dist/ad-groups-A6GU6EW5.js +70 -0
- package/dist/ad-writes-CEMCUDU2.js +176 -0
- package/dist/add-2L2VQ5MU.js +80 -0
- package/dist/add-DRTKSLEQ.js +107 -0
- package/dist/add-LBHISK44.js +305 -0
- package/dist/add-PS36Q2S3.js +97 -0
- package/dist/add-RLMXZLLO.js +148 -0
- package/dist/add-Z2OTFSQO.js +81 -0
- package/dist/add-accounts-GXBE4ZR2.js +91 -0
- package/dist/ads-4EVKVAMR.js +48 -0
- package/dist/ads-OY455VCX.js +79 -0
- package/dist/ads-WYQYZ44U.js +128 -0
- package/dist/ads-ZEF5AU3D.js +120 -0
- package/dist/adsets-ZRS7AZIK.js +182 -0
- package/dist/advertisers-AAGUUSAX.js +125 -0
- package/dist/advertisers-G6DZRBOK.js +123 -0
- package/dist/analytics-ANG42PKM.js +2437 -0
- package/dist/analytics-UI4AKUSF.js +447 -0
- package/dist/animate-KCSICY2N.js +480 -0
- package/dist/approved-LHYBVDXH.js +73 -0
- package/dist/asset-writes-CUF25BLM.js +50 -0
- package/dist/assign-5DFH6HBV.js +80 -0
- package/dist/audience-size-P6WIXOB3.js +76 -0
- package/dist/audience-writes-L7SNU2SB.js +327 -0
- package/dist/audiences-4ASLCNOF.js +280 -0
- package/dist/audiences-A54MU63W.js +86 -0
- package/dist/audiences-SG2BBM7R.js +85 -0
- package/dist/audit-6K5FFV6K.js +88 -0
- package/dist/audit-LA4BSLXV.js +154 -0
- package/dist/autocomplete-XMG6E7TG.js +114 -0
- package/dist/avatars-4IFN4GZD.js +38 -0
- package/dist/bid-pricing-JEOG2Q3L.js +103 -0
- package/dist/brand-C6HUAK74.js +22 -0
- package/dist/brief-5BCPPBU3.js +543 -0
- package/dist/businesses-GQ5FOZDU.js +54 -0
- package/dist/campaign-groups-IYQZSICZ.js +99 -0
- package/dist/campaign-writes-CVOOPZ35.js +176 -0
- package/dist/campaign-writes-YXI5UOPH.js +168 -0
- package/dist/campaigns-FW4WVD25.js +113 -0
- package/dist/campaigns-QMFHNG3N.js +111 -0
- package/dist/campaigns-TX37WHVL.js +78 -0
- package/dist/campaigns-VZJMYETG.js +130 -0
- package/dist/canvas-G4QXNPPE.js +46 -0
- package/dist/capabilities-7643Y2HU.js +147 -0
- package/dist/cards-YHZFJ3US.js +85 -0
- package/dist/catalog-PTVQSATT.js +65 -0
- package/dist/catalogs-YNIUP2AH.js +130 -0
- package/dist/catalogs-ZHCLH43A.js +781 -0
- package/dist/changes-QUKBZVB3.js +135 -0
- package/dist/chatgpt-TIUBMATF.js +47 -0
- package/dist/chats-BGLAG4Q7.js +279 -0
- package/dist/check-MN5ZQ7RX.js +107 -0
- package/dist/chunk-23KN4NL4.js +45 -0
- package/dist/chunk-2UJ5ABI6.js +604 -0
- package/dist/chunk-2XRFWXSA.js +103 -0
- package/dist/chunk-3JV4T6XW.js +69 -0
- package/dist/chunk-3OSBCYKA.js +8954 -0
- package/dist/chunk-3QQHPRRB.js +89 -0
- package/dist/chunk-3WTCMBDC.js +1518 -0
- package/dist/chunk-4BTUF2AV.js +69 -0
- package/dist/chunk-4D37LCBS.js +111 -0
- package/dist/chunk-4QITYZUH.js +163 -0
- package/dist/chunk-4XNF52NU.js +429 -0
- package/dist/chunk-4Y7IJ2PU.js +5368 -0
- package/dist/chunk-53BTYIMJ.js +91 -0
- package/dist/chunk-5ITB24SC.js +544 -0
- package/dist/chunk-5N47LB7X.js +285 -0
- package/dist/chunk-5UBFYJHF.js +170 -0
- package/dist/chunk-6CQOHJZW.js +125 -0
- package/dist/chunk-6OXENBTF.js +74 -0
- package/dist/chunk-6PMJU7IU.js +169 -0
- package/dist/chunk-7GGLZOQN.js +91 -0
- package/dist/chunk-7I65KXU7.js +98 -0
- package/dist/chunk-7JFVMJZI.js +207 -0
- package/dist/chunk-A6VODUO3.js +166 -0
- package/dist/chunk-AGTA5FJX.js +139 -0
- package/dist/chunk-AGU4KGT6.js +84 -0
- package/dist/chunk-BXUUKRMM.js +46 -0
- package/dist/chunk-BZTAEZLT.js +51 -0
- package/dist/chunk-C7IOSSI4.js +58 -0
- package/dist/chunk-CIW3Q7B2.js +229 -0
- package/dist/chunk-CJQ77HO5.js +1646 -0
- package/dist/chunk-CNPYG4F3.js +75 -0
- package/dist/chunk-COS3TPHX.js +377 -0
- package/dist/chunk-CQ6HBFOB.js +23 -0
- package/dist/chunk-D7Y3UNWO.js +66 -0
- package/dist/chunk-DJTWY7GL.js +942 -0
- package/dist/chunk-DWW5QSUF.js +638 -0
- package/dist/chunk-E34YYDCE.js +35 -0
- package/dist/chunk-ENUCJ6AO.js +148 -0
- package/dist/chunk-ES3PWGS3.js +438 -0
- package/dist/chunk-ES3PWGS3.js.map +1 -0
- package/dist/chunk-FESQ5TXU.js +42 -0
- package/dist/chunk-FEUKUZRA.js +106 -0
- package/dist/chunk-FJDSL4O5.js +910 -0
- package/dist/chunk-FSTDWVXG.js +455 -0
- package/dist/chunk-FUR7R4D7.js +249 -0
- package/dist/chunk-GYMZCJX6.js +97 -0
- package/dist/chunk-HTT7RBRC.js +846 -0
- package/dist/chunk-HZPTQRX6.js +2441 -0
- package/dist/chunk-HZPTQRX6.js.map +1 -0
- package/dist/chunk-IQWFJEA3.js +217 -0
- package/dist/chunk-IU5K42Q3.js +831 -0
- package/dist/chunk-JARRF5VX.js +66 -0
- package/dist/chunk-JEUFRIYS.js +297 -0
- package/dist/chunk-JNSRQQDP.js +94 -0
- package/dist/chunk-KGAI4E2I.js +106 -0
- package/dist/chunk-KITVYLEX.js +843 -0
- package/dist/chunk-L5VVKIMB.js +203 -0
- package/dist/chunk-L763CNKH.js +333 -0
- package/dist/chunk-LO2MZJJP.js +225 -0
- package/dist/chunk-LV7EU6HM.js +324 -0
- package/dist/chunk-LXZ5E6AC.js +84 -0
- package/dist/chunk-LZRZVIEJ.js +191 -0
- package/dist/chunk-M2MJ52HS.js +676 -0
- package/dist/chunk-MBSAHNMJ.js +547 -0
- package/dist/chunk-MCKYNFPH.js +219 -0
- package/dist/chunk-MHZIOOT5.js +197 -0
- package/dist/chunk-MNOCC5AL.js +207 -0
- package/dist/chunk-MUEJVDHI.js +200 -0
- package/dist/chunk-N6WHUUFH.js +19 -0
- package/dist/chunk-NA5Q473J.js +3868 -0
- package/dist/chunk-NCO5NGBN.js +74 -0
- package/dist/chunk-NLW25WW3.js +52 -0
- package/dist/chunk-NYAFSC5V.js +287 -0
- package/dist/chunk-O7AMKMII.js +215 -0
- package/dist/chunk-OL3QHART.js +188 -0
- package/dist/chunk-OPUEQSKM.js +122 -0
- package/dist/chunk-OXLB5M5M.js +592 -0
- package/dist/chunk-OXYWSVOJ.js +100 -0
- package/dist/chunk-PE4ZP7MX.js +8914 -0
- package/dist/chunk-PG5R35QY.js +73 -0
- package/dist/chunk-PG5R35QY.js.map +1 -0
- package/dist/chunk-PHZOMTI6.js +97 -0
- package/dist/chunk-PIAG4UJT.js +274 -0
- package/dist/chunk-PYWIHAVD.js +64 -0
- package/dist/chunk-QKNPF6ZD.js +24026 -0
- package/dist/chunk-QOBA6PHB.js +131 -0
- package/dist/chunk-QPPQXU3U.js +98 -0
- package/dist/chunk-QTKNS2U2.js +149 -0
- package/dist/chunk-QTLIXCVN.js +46 -0
- package/dist/chunk-R5LRBDEM.js +136 -0
- package/dist/chunk-RRC7F3QQ.js +1919 -0
- package/dist/chunk-SEYCF446.js +191 -0
- package/dist/chunk-SF52UGHZ.js +225 -0
- package/dist/chunk-SVNH6P7O.js +1744 -0
- package/dist/chunk-SWFZJROM.js +64 -0
- package/dist/chunk-UCNIJ2IW.js +494 -0
- package/dist/chunk-UFUYTWEF.js +344 -0
- package/dist/chunk-ULW4EWAA.js +39 -0
- package/dist/chunk-UROKPFIS.js +142 -0
- package/dist/chunk-VCOIFNYH.js +714 -0
- package/dist/chunk-VPF5A7CM.js +476 -0
- package/dist/chunk-VV6FDIP5.js +224 -0
- package/dist/chunk-WRTG3KXU.js +156 -0
- package/dist/chunk-XAW5GL6B.js +76 -0
- package/dist/chunk-XRNJRQ6Q.js +26 -0
- package/dist/chunk-Y5GQO6CR.js +56 -0
- package/dist/chunk-YE4RCEEJ.js +167 -0
- package/dist/chunk-YJYKSMLF.js +296 -0
- package/dist/chunk-YO54MA7R.js +275 -0
- package/dist/chunk-Z6T6VDDA.js +76 -0
- package/dist/chunk-ZOH672S6.js +25 -0
- package/dist/claim-2JNNC66N.js +200 -0
- package/dist/cli.js +45 -45
- package/dist/client-YUVT3RZN.js +19 -0
- package/dist/code-LOOWLRUL.js +76 -0
- package/dist/companies-4NJU5TLU.js +198 -0
- package/dist/company-QOYWS4W6.js +308 -0
- package/dist/complete-7FX2K3PV.js +84 -0
- package/dist/config-AOF6ACIP.js +88 -0
- package/dist/connect-H2HSPMRT.js +45 -0
- package/dist/content-NCW5IJFR.js +85 -0
- package/dist/conversation-4M7YMQOL.js +96 -0
- package/dist/conversion-report-G5JMZNYV.js +127 -0
- package/dist/conversion-upload-command-43PZFYT7.js +439 -0
- package/dist/conversion-writes-JQQCCGPO.js +122 -0
- package/dist/conversions-UO4CQNF6.js +78 -0
- package/dist/conversions-Z7FW7CFT.js +140 -0
- package/dist/copy-writes-ONVSSBLJ.js +170 -0
- package/dist/countries-Q6TA42P7.js +82 -0
- package/dist/create-4SFO4AQZ.js +62 -0
- package/dist/create-D5MA64KL.js +239 -0
- package/dist/create-GJ4ZMY3A.js +210 -0
- package/dist/create-QVY6DSYM.js +135 -0
- package/dist/creatives-ADH6HCCA.js +58 -0
- package/dist/creatives-R3XILT6D.js +223 -0
- package/dist/creatives-S3EZCXUT.js +89 -0
- package/dist/credentials-EQRB6XGZ.js +290 -0
- package/dist/critique-4YRRUNAU.js +1451 -0
- package/dist/critique-JCU2ATT6.js +232 -0
- package/dist/crm-AF6XOOSF.js +323 -0
- package/dist/crm-LSMFGR6R.js +227 -0
- package/dist/crop-RDP7YCNV.js +113 -0
- package/dist/currency-4KNOOZUU.js +88 -0
- package/dist/custom-conversions-7MZFTHUM.js +128 -0
- package/dist/customers-MM3VIZNA.js +59 -0
- package/dist/decide-OPCCKAIT.js +199 -0
- package/dist/delete-CO2YBPTI.js +67 -0
- package/dist/delete-D7HTW32U.js +57 -0
- package/dist/delete-GKQTDOZF.js +69 -0
- package/dist/delete-JUPBYK3H.js +69 -0
- package/dist/delete-KZFI235B.js +85 -0
- package/dist/delete-KZFI235B.js.map +1 -0
- package/dist/delete-R3LXCKA4.js +71 -0
- package/dist/demographics-DK5JDY6M.js +141 -0
- package/dist/describe-537PPL7P.js +97 -0
- package/dist/describe-GIG46DT5.js +97 -0
- package/dist/dimensions-UXK7DMTF.js +101 -0
- package/dist/discard-DEJOM62Y.js +69 -0
- package/dist/discover-MKFDG6NK.js +93 -0
- package/dist/discover-U6YLVLTF.js +172 -0
- package/dist/domain-MBOMV3CQ.js +101 -0
- package/dist/download-KN2I55SA.js +172 -0
- package/dist/download-PRBLR6IQ.js +299 -0
- package/dist/draft-BMNBT37B.js +283 -0
- package/dist/draft-CGPVRRKC.js +335 -0
- package/dist/draft-F74OIT5O.js +310 -0
- package/dist/draft-FIEZWBIX.js +308 -0
- package/dist/draft-H5RVDTFD.js +240 -0
- package/dist/draft-HZ5T6NOI.js +220 -0
- package/dist/draft-UMPCOCP6.js +100 -0
- package/dist/draft-XEUHTUMR.js +103 -0
- package/dist/engine/index.js +13 -13
- package/dist/env-VBSATLEF.js +53 -0
- package/dist/experiment-2XR6MBE2.js +1397 -0
- package/dist/experiments-YNJZCMQM.js +236 -0
- package/dist/export-YCLJG5YP.js +168 -0
- package/dist/extract-E3CMEN5U.js +113 -0
- package/dist/facets-Y4OACBMC.js +117 -0
- package/dist/favorites-NSQX6HKB.js +178 -0
- package/dist/feed-TKMMYAEH.js +177 -0
- package/dist/feedback-MORAVN52.js +111 -0
- package/dist/feedback-record-M3RB7H2C.js +265 -0
- package/dist/fetch-EHP2FK6Y.js +139 -0
- package/dist/fetch-XU6QVWMS.js +179 -0
- package/dist/find-I7U3THF3.js +143 -0
- package/dist/fit-IHUUFCGI.js +65 -0
- package/dist/flows-WSCIMXQX.js +250 -0
- package/dist/follow-A46RAJEX.js +94 -0
- package/dist/follow-competitors-VU2L3KWF.js +112 -0
- package/dist/following-UOUNSU6P.js +113 -0
- package/dist/fonts-3QW7EDHE.js +39 -0
- package/dist/forecast-2WVHMSZP.js +169 -0
- package/dist/forecast-F25LSCM5.js +121 -0
- package/dist/funding-2VROIMLS.js +85 -0
- package/dist/funnel-35DYDBJH.js +397 -0
- package/dist/ga4-ULHKTF23.js +55 -0
- package/dist/generate-Z7AROAES.js +263 -0
- package/dist/get-4CAX33L2.js +59 -0
- package/dist/get-5E4YJKPO.js +66 -0
- package/dist/get-5E4YJKPO.js.map +1 -0
- package/dist/get-ABQZJ2VQ.js +38 -0
- package/dist/get-ASAW6TVF.js +62 -0
- package/dist/get-ASAW6TVF.js.map +1 -0
- package/dist/get-GXVAJZHM.js +56 -0
- package/dist/get-GXVAJZHM.js.map +1 -0
- package/dist/get-IF7KHMSI.js +92 -0
- package/dist/get-N7X75ZJO.js +82 -0
- package/dist/get-ZISAHMTQ.js +59 -0
- package/dist/gif-QLNWBFAH.js +102 -0
- package/dist/google-FDR55RRD.js +136 -0
- package/dist/google-M6XR7YGT.js +3267 -0
- package/dist/google-ads-NCSMNNND.js +198 -0
- package/dist/group-HAQM6P7M.js +43 -0
- package/dist/group-XVDH2ONO.js +43 -0
- package/dist/gsc-72AFO6B4.js +30 -0
- package/dist/history-FGQ2H7XH.js +69 -0
- package/dist/history-LTOFKBMJ.js +136 -0
- package/dist/history-VJ254UXF.js +102 -0
- package/dist/hubspot-W2NM75YK.js +782 -0
- package/dist/icon-F7AOOTFI.js +137 -0
- package/dist/ideas-54KFDNDM.js +45 -0
- package/dist/images-JOEVCCP6.js +92 -0
- package/dist/improve-LIKOER3S.js +86 -0
- package/dist/ingest-6R7XUL46.js +27 -0
- package/dist/ingest-VCIH5QDR.js +123 -0
- package/dist/ingest-VCIH5QDR.js.map +1 -0
- package/dist/insights-QNE6XCBA.js +439 -0
- package/dist/insights-UXUUOQB7.js +132 -0
- package/dist/inspect-MGOR77FP.js +192 -0
- package/dist/inspiration-VXNGKAJV.js +53 -0
- package/dist/instant-experiences-MT2XMQNH.js +260 -0
- package/dist/intent-FZWPRUCI.js +95 -0
- package/dist/job-TS34W4IU.js +202 -0
- package/dist/job-create-FXXDR2EE.js +109 -0
- package/dist/job-status-R2H4HNC5.js +74 -0
- package/dist/keep-YSU3XMW3.js +78 -0
- package/dist/keyword-gap-4ECYPWXJ.js +130 -0
- package/dist/keyword-metrics-SBIRN5KC.js +200 -0
- package/dist/keywords-for-site-TLNPJHT2.js +131 -0
- package/dist/knowledge-L3VLOVLG.js +195 -0
- package/dist/landing-ZICSVWKF.js +28 -0
- package/dist/landings-XTPNPTHN.js +151 -0
- package/dist/languages-DIKRMAYE.js +55 -0
- package/dist/languages-VNZQ5USL.js +40 -0
- package/dist/launches-5R7EUONQ.js +19 -0
- package/dist/layerize-Q2QWDARG.js +190 -0
- package/dist/lead-routes-IXUCGINI.js +733 -0
- package/dist/leads-JUQFNK55.js +115 -0
- package/dist/leads-UVG6VYAC.js +540 -0
- package/dist/learn-A6BT25LQ.js +207 -0
- package/dist/library-G5YAFLTR.js +211 -0
- package/dist/lighthouse-BCBV2XGP.js +75 -0
- package/dist/line-item-writes-NW7A6HNH.js +211 -0
- package/dist/line-items-OAG3QMDE.js +107 -0
- package/dist/link-4VJ7FSOA.js +67 -0
- package/dist/linkedin-CKOWKD4M.js +1328 -0
- package/dist/linkedin-person-C22IDK7S.js +139 -0
- package/dist/list-2DKLO6AO.js +67 -0
- package/dist/list-4SDJZVOL.js +93 -0
- package/dist/list-6YW4I4VG.js +65 -0
- package/dist/list-CDDXHMJQ.js +306 -0
- package/dist/list-GS42LK5C.js +51 -0
- package/dist/list-HWNHRWGB.js +57 -0
- package/dist/list-QSBEYU45.js +76 -0
- package/dist/list-ZFGOONWL.js +50 -0
- package/dist/list-ZORO7PFP.js +154 -0
- package/dist/locations-4RDUHKVR.js +69 -0
- package/dist/locations-HATR6PSC.js +40 -0
- package/dist/log-OSJHKHPV.js +95 -0
- package/dist/logo-ABO4HJRG.js +18 -0
- package/dist/lookup-SPNT3W3W.js +23 -0
- package/dist/make-7CIVNW77.js +1366 -0
- package/dist/map-PMGZDXAN.js +436 -0
- package/dist/mcp-MOOOTRYG.js +729 -0
- package/dist/media-CIJW2Q3I.js +89 -0
- package/dist/media-GZKW2PZB.js +18 -0
- package/dist/media-sources-5OYCKQ5J.js +35 -0
- package/dist/members-QG5IP5HM.js +47 -0
- package/dist/meme-BPWX7YQH.js +100 -0
- package/dist/meta-KVOSCSPJ.js +122 -0
- package/dist/metrics-R4YS2JL6.js +152 -0
- package/dist/models-RJMZV5SH.js +155 -0
- package/dist/normalize-LATTXSL3.js +144 -0
- package/dist/normalize-NMNOJ6Q5.js +806 -0
- package/dist/options-KALH5TB7.js +125 -0
- package/dist/organization-AGCF7DUJ.js +949 -0
- package/dist/output-34QMC3OU.js +24 -0
- package/dist/page-UDF3LJHP.js +105 -0
- package/dist/page-photos-FCBW5UZS.js +118 -0
- package/dist/pages-5W5G4MRB.js +67 -0
- package/dist/performance-SITVZQWX.js +5565 -0
- package/dist/performance-YNXPUSGJ.js +27 -0
- package/dist/pinterest-IABDXLF5.js +96 -0
- package/dist/pixels-4QAWLSEL.js +109 -0
- package/dist/pixels-TYJVE377.js +62 -0
- package/dist/plan-I6EFL7RC.js +208 -0
- package/dist/posts-SXQSLOFV.js +36 -0
- package/dist/preview-7Y5LE24E.js +218 -0
- package/dist/profile-R5VPOOJU.js +159 -0
- package/dist/promoted-tweet-writes-NAHPJ3VD.js +183 -0
- package/dist/promoted-tweets-2XQ4MWAC.js +119 -0
- package/dist/properties-2D2BIDGC.js +101 -0
- package/dist/publish-UITYPUBD.js +344 -0
- package/dist/query-LB5H7IRK.js +236 -0
- package/dist/query-NDOYOIHL.js +247 -0
- package/dist/query-RE7NB2BK.js +62 -0
- package/dist/questionnaire-U767HYDE.js +94 -0
- package/dist/read-3TCDDALC.js +141 -0
- package/dist/reddit-6XIARCTX.js +29 -0
- package/dist/refresh-6UCN7PDX.js +97 -0
- package/dist/refresh-GIB6QQZS.js +42 -0
- package/dist/release-IN65L23O.js +63 -0
- package/dist/relevant-pages-W7IM6YQW.js +99 -0
- package/dist/remove-LZQHDFZF.js +49 -0
- package/dist/remove-X3XWVE2M.js +53 -0
- package/dist/reopen-RMMQ55CH.js +66 -0
- package/dist/rerun-ON6YCJAL.js +95 -0
- package/dist/research-LZBPCXIW.js +72 -0
- package/dist/research-W5KUOBXZ.js +265 -0
- package/dist/reset-MUWXTLIB.js +57 -0
- package/dist/reset-VQNKXFAF.js +57 -0
- package/dist/resolve-DMGWLMTC.js +124 -0
- package/dist/retry-YI4YLYTQ.js +63 -0
- package/dist/retry-ZQUJPKQH.js +65 -0
- package/dist/retry-failed-PEAUXGNT.js +45 -0
- package/dist/revenue-6YZAOMF6.js +91 -0
- package/dist/rule-writes-G25O5JZS.js +525 -0
- package/dist/rules-FHVZEN4D.js +99 -0
- package/dist/rules-KSOAKEI3.js +217 -0
- package/dist/rules-add-7X46VTIJ.js +465 -0
- package/dist/run-TA6HYFKZ.js +69 -0
- package/dist/run-YORKHK6S.js +70 -0
- package/dist/scaffold-ad-RHSHBCVV.js +1512 -0
- package/dist/scaffold-static-ad-XNOGCMPF.js +1010 -0
- package/dist/scaffold-video-XEVJQ7QZ.js +884 -0
- package/dist/schedule-TMTLYULK.js +64 -0
- package/dist/schedule-TNF6M6UD.js +67 -0
- package/dist/scheduled-agents-TS3WLRCM.js +55 -0
- package/dist/schema-2YQAQVON.js +121 -0
- package/dist/schema-6S5ZEPBS.js +135 -0
- package/dist/scrape-FDBYU3TU.js +2241 -0
- package/dist/screenshot-QSRWL4J6.js +102 -0
- package/dist/search-BOCQFUM3.js +51 -0
- package/dist/search-CENPR7GA.js +224 -0
- package/dist/search-GEXDRTAQ.js +26 -0
- package/dist/search-LFTFNDMC.js +91 -0
- package/dist/search-LTUUAGZG.js +177 -0
- package/dist/search-PYLNVZXI.js +92 -0
- package/dist/search-copy-RLRRR3LB.js +168 -0
- package/dist/seeds-E2GLHJ2T.js +101 -0
- package/dist/select-BXBNFGVL.js +106 -0
- package/dist/sends-NBTGBZT7.js +349 -0
- package/dist/sequences-UOIHUOD3.js +146 -0
- package/dist/set-prompt-JJWBB23C.js +198 -0
- package/dist/setup-links-6ANVKZCE.js +144 -0
- package/dist/shared-IMDHTVSW.js +32 -0
- package/dist/shopify-6ISTKZCA.js +3958 -0
- package/dist/site-OIV55MGO.js +180 -0
- package/dist/sitemaps-6A6JFBV4.js +87 -0
- package/dist/sites-PZLE5FFV.js +101 -0
- package/dist/skills-FBIVWINH.js +47 -0
- package/dist/sources-5L4S5BQV.js +457 -0
- package/dist/sources-GLJWZFHZ.js +30 -0
- package/dist/stale-SK2SDGOT.js +76 -0
- package/dist/stats-2NLNQBRY.js +34 -0
- package/dist/status-TD7ISXC5.js +65 -0
- package/dist/sticker-4NKFAGEK.js +94 -0
- package/dist/stock-XOXZGGU3.js +179 -0
- package/dist/studies-C5IINK5Y.js +250 -0
- package/dist/studio-IDNM42JP.js +49 -0
- package/dist/study-writes-GJXLMM3D.js +470 -0
- package/dist/suggest-Z553OSYW.js +66 -0
- package/dist/sync-CIRDY55O.js +279 -0
- package/dist/sync-PVIFUXX3.js +57 -0
- package/dist/sync-UBOHNOXB.js +55 -0
- package/dist/sync-definition-7NBT6LTK.js +69 -0
- package/dist/tag-22TFBGDG.js +57 -0
- package/dist/tag-manager-QLZHU6NG.js +43 -0
- package/dist/tags-3HB7N5WB.js +23 -0
- package/dist/tags-DG3XQ4SF.js +227 -0
- package/dist/tags-T4EN6XYE.js +23 -0
- package/dist/tags-T6THTVNP.js +26 -0
- package/dist/tags-XY6R2VJ6.js +23 -0
- package/dist/targeting-GNEBULXU.js +762 -0
- package/dist/targeting-constants-GR6BVM2H.js +118 -0
- package/dist/targeting-criteria-CL472KJO.js +113 -0
- package/dist/targets-7AQMSO6H.js +106 -0
- package/dist/terms-LG7FYQOG.js +102 -0
- package/dist/testimonials-4QWVSEPU.js +32 -0
- package/dist/themes-ZTM4OVGK.js +95 -0
- package/dist/top-companies-PMFYOAFK.js +111 -0
- package/dist/transcript-YWFYNFWX.js +165 -0
- package/dist/translate-VMQHPX4B.js +600 -0
- package/dist/triggers-JKXISN45.js +144 -0
- package/dist/tweets-IF5FFFTH.js +123 -0
- package/dist/unfollow-CDUOZWM7.js +46 -0
- package/dist/unlink-IUAFDLBT.js +70 -0
- package/dist/unstage-OVOZE6DA.js +96 -0
- package/dist/unstage-ZYT5RNLK.js +88 -0
- package/dist/update-23Q4T2J5.js +155 -0
- package/dist/update-74VME6PN.js +66 -0
- package/dist/update-O22DAZVX.js +192 -0
- package/dist/update-Q3WJ3DQN.js +81 -0
- package/dist/update-QAWK3O7L.js +101 -0
- package/dist/upload-EAEILUQB.js +150 -0
- package/dist/upload-WASRCKS4.js +130 -0
- package/dist/upload-WASRCKS4.js.map +1 -0
- package/dist/upscale-HB6L6SZG.js +109 -0
- package/dist/url-options-M7RX2TD4.js +131 -0
- package/dist/url-params-E5ON6W2N.js +101 -0
- package/dist/use-HGX7ZRH5.js +111 -0
- package/dist/use-HGX7ZRH5.js.map +1 -0
- package/dist/validate-NB6PS5PF.js +122 -0
- package/dist/variant-O7LXOA2E.js +338 -0
- package/dist/videos-SS2Y6FJF.js +41 -0
- package/dist/view-ED636LWD.js +121 -0
- package/dist/viewer-check-CWS6OVM7.js +83 -0
- package/dist/web-HT22JFQR.js +143 -0
- package/dist/winners-ZG5SHNBS.js +113 -0
- package/dist/winning-ads-FXTP4PWZ.js +86 -0
- package/dist/write-commands-5YVQKO7E.js +1525 -0
- package/dist/write-commands-AIWR7NBO.js +713 -0
- package/dist/write-commands-UK6MKGHI.js +206 -0
- package/dist/write-commands-W3UN6F4Y.js +1172 -0
- package/dist/x-KEMAY75C.js +47 -0
- package/package.json +1 -1
- package/dist/account-2G3IT7J4.js +0 -82
- package/dist/account-CQJFUII3.js +0 -139
- package/dist/account-ULC5N7SI.js +0 -82
- package/dist/account-assets-IDVG4DGK.js +0 -290
- package/dist/account-level-GK7M2MMQ.js +0 -611
- package/dist/account-reads-FRFI6OHK.js +0 -219
- package/dist/account-users-PINZLBT7.js +0 -64
- package/dist/account-writes-WRGJC7VU.js +0 -68
- package/dist/accounts-2KFG33EX.js +0 -80
- package/dist/accounts-5754XUS3.js +0 -115
- package/dist/accounts-KRW3JNCW.js +0 -76
- package/dist/accounts-MHPNZW3W.js +0 -701
- package/dist/accounts-MTNBMXHD.js +0 -114
- package/dist/actions-33IZOT5C.js +0 -55
- package/dist/active-entities-JR5B32X2.js +0 -103
- package/dist/activecampaign-BV5GZFVR.js +0 -938
- package/dist/activities-2RAJXP3J.js +0 -75
- package/dist/ad-group-writes-W6RCMYLC.js +0 -172
- package/dist/ad-groups-XAI2Z62X.js +0 -70
- package/dist/ad-writes-IGWZRTXY.js +0 -176
- package/dist/add-4PJDIW2M.js +0 -148
- package/dist/add-DBCN33GH.js +0 -107
- package/dist/add-KB7O7NSB.js +0 -97
- package/dist/add-PRU32PQN.js +0 -81
- package/dist/add-UZDOQAJL.js +0 -80
- package/dist/add-WDX66JSM.js +0 -305
- package/dist/add-accounts-ZWXG6HLM.js +0 -91
- package/dist/ads-255V76SZ.js +0 -79
- package/dist/ads-7TEPA4KZ.js +0 -48
- package/dist/ads-I6I4MYQH.js +0 -128
- package/dist/ads-JVBLNTBF.js +0 -120
- package/dist/adsets-FN5ZWSYF.js +0 -182
- package/dist/advertisers-BPJWOY7I.js +0 -125
- package/dist/advertisers-SJO6JYIO.js +0 -123
- package/dist/analytics-TXPEXLPQ.js +0 -447
- package/dist/analytics-XDWBEY57.js +0 -2437
- package/dist/animate-425S4ZXS.js +0 -480
- package/dist/approved-KUVAJ5M7.js +0 -73
- package/dist/asset-writes-SSI3CO2A.js +0 -50
- package/dist/assign-CTV6LDEI.js +0 -80
- package/dist/audience-size-5QYI5PKH.js +0 -76
- package/dist/audience-writes-G64754LR.js +0 -327
- package/dist/audiences-JAVNJ5NC.js +0 -86
- package/dist/audiences-JZ6SCEUC.js +0 -280
- package/dist/audiences-OMLKMHEJ.js +0 -85
- package/dist/audit-2YFDJAKL.js +0 -88
- package/dist/audit-4UE6GFLG.js +0 -154
- package/dist/autocomplete-HTUV2UDS.js +0 -114
- package/dist/avatars-K7RBSMIJ.js +0 -38
- package/dist/bid-pricing-OWP4SZP5.js +0 -103
- package/dist/brand-GBP4OEJI.js +0 -22
- package/dist/brief-SLTB3EPO.js +0 -543
- package/dist/businesses-DXRDQIFP.js +0 -54
- package/dist/campaign-groups-LDOQU65Q.js +0 -99
- package/dist/campaign-writes-SHF3XZXV.js +0 -176
- package/dist/campaign-writes-SK55QLY5.js +0 -168
- package/dist/campaigns-6CAKRANC.js +0 -113
- package/dist/campaigns-EHV7J7PW.js +0 -111
- package/dist/campaigns-GG7LLI4X.js +0 -78
- package/dist/campaigns-GQWFSKGC.js +0 -130
- package/dist/canvas-2VRPGRND.js +0 -46
- package/dist/capabilities-BEZXR2FZ.js +0 -147
- package/dist/cards-J2PGFKEF.js +0 -85
- package/dist/catalog-XECCXRM6.js +0 -65
- package/dist/catalogs-P5KMIMC2.js +0 -130
- package/dist/catalogs-TBRONC2D.js +0 -781
- package/dist/changes-3COSIJLU.js +0 -135
- package/dist/chatgpt-S5EVEKYV.js +0 -47
- package/dist/chats-AN52YVBT.js +0 -279
- package/dist/check-AQO7CMDD.js +0 -107
- package/dist/chunk-2MXDSPUO.js +0 -76
- package/dist/chunk-2SGREP24.js +0 -76
- package/dist/chunk-34FVKJS2.js +0 -64
- package/dist/chunk-364TCROV.js +0 -207
- package/dist/chunk-3H5MJOG2.js +0 -91
- package/dist/chunk-3J3W23S4.js +0 -592
- package/dist/chunk-3KMYOPBI.js +0 -98
- package/dist/chunk-3WSJGYA3.js +0 -148
- package/dist/chunk-4745PLPI.js +0 -111
- package/dist/chunk-4JS2O2KV.js +0 -89
- package/dist/chunk-4ULRDQVD.js +0 -714
- package/dist/chunk-4VXQAJRU.js +0 -225
- package/dist/chunk-4XXA4WCS.js +0 -207
- package/dist/chunk-52IYZCRS.js +0 -476
- package/dist/chunk-5CTNSIWY.js +0 -69
- package/dist/chunk-5EF7ZLXA.js +0 -942
- package/dist/chunk-62QMJYML.js +0 -167
- package/dist/chunk-6B4KNOJZ.js +0 -75
- package/dist/chunk-6M77QNJ4.js +0 -69
- package/dist/chunk-7HH4F2KX.js +0 -188
- package/dist/chunk-7O4HFODK.js +0 -26
- package/dist/chunk-AFQF6ISC.js +0 -215
- package/dist/chunk-AXTOIHH2.js +0 -74
- package/dist/chunk-B4UVJCJ4.js +0 -229
- package/dist/chunk-BN4TDL5L.js +0 -217
- package/dist/chunk-C5UFKDAX.js +0 -377
- package/dist/chunk-CREEY2FS.js +0 -455
- package/dist/chunk-CSCHS3JG.js +0 -8954
- package/dist/chunk-DJWEQDBB.js +0 -98
- package/dist/chunk-DLNADMQV.js +0 -547
- package/dist/chunk-DNWP5DL6.js +0 -42
- package/dist/chunk-DW3OPKXI.js +0 -51
- package/dist/chunk-ECJIMIEJ.js +0 -142
- package/dist/chunk-EHIISZYD.js +0 -296
- package/dist/chunk-ERRTBCDW.js +0 -191
- package/dist/chunk-EZBZU6N7.js +0 -66
- package/dist/chunk-FBG3JDET.js +0 -97
- package/dist/chunk-FOWT6ENH.js +0 -170
- package/dist/chunk-FSGJSREN.js +0 -2437
- package/dist/chunk-FSGJSREN.js.map +0 -1
- package/dist/chunk-FVZL2YC5.js +0 -3868
- package/dist/chunk-GDQJG4BO.js +0 -91
- package/dist/chunk-GEFZVG4P.js +0 -219
- package/dist/chunk-GLCHD54W.js +0 -74
- package/dist/chunk-GT77XMOG.js +0 -23
- package/dist/chunk-GXPZJ2QN.js +0 -225
- package/dist/chunk-HAJYFRXL.js +0 -224
- package/dist/chunk-HPDGVK6R.js +0 -324
- package/dist/chunk-ILEJXJH2.js +0 -1518
- package/dist/chunk-J4ASA24X.js +0 -203
- package/dist/chunk-JCVPZ7CV.js +0 -638
- package/dist/chunk-KG7FPYM2.js +0 -64
- package/dist/chunk-KRQ2AXFW.js +0 -191
- package/dist/chunk-L5IYVZM2.js +0 -39
- package/dist/chunk-LHQ6GXNF.js +0 -46
- package/dist/chunk-LS2KEAYJ.js +0 -66
- package/dist/chunk-LURM3KKS.js +0 -94
- package/dist/chunk-MHH7SGLS.js +0 -106
- package/dist/chunk-MZIYRWXL.js +0 -285
- package/dist/chunk-NY5VYGTP.js +0 -97
- package/dist/chunk-O37YK4P6.js +0 -136
- package/dist/chunk-PGBZ73UZ.js +0 -429
- package/dist/chunk-PN72Z2W2.js +0 -56
- package/dist/chunk-QJ5TU5J6.js +0 -100
- package/dist/chunk-QNLPZOHV.js +0 -84
- package/dist/chunk-QNXDSNOQ.js +0 -544
- package/dist/chunk-QOC3JEUQ.js +0 -363
- package/dist/chunk-QOC3JEUQ.js.map +0 -1
- package/dist/chunk-R44B522K.js +0 -139
- package/dist/chunk-R5GGTLYE.js +0 -846
- package/dist/chunk-R6T25WTZ.js +0 -344
- package/dist/chunk-RUJS2NOA.js +0 -297
- package/dist/chunk-SDQLZYQG.js +0 -843
- package/dist/chunk-SEC6FPWC.js +0 -494
- package/dist/chunk-SJAUMPL3.js +0 -46
- package/dist/chunk-SNDHR5QA.js +0 -24026
- package/dist/chunk-SP5L7EYC.js +0 -125
- package/dist/chunk-SPBNAGIN.js +0 -1646
- package/dist/chunk-SWNCS2OD.js +0 -333
- package/dist/chunk-T37PAZT2.js +0 -274
- package/dist/chunk-T6PTG6VM.js +0 -5368
- package/dist/chunk-TE4ASZSC.js +0 -45
- package/dist/chunk-TEKML2NW.js +0 -35
- package/dist/chunk-TKDOVFO6.js +0 -287
- package/dist/chunk-TRMZQRVV.js +0 -1919
- package/dist/chunk-TTKDFRON.js +0 -149
- package/dist/chunk-U2BPZ27S.js +0 -910
- package/dist/chunk-UPDIBQUC.js +0 -106
- package/dist/chunk-V2XEX2YR.js +0 -84
- package/dist/chunk-V62ZWGCL.js +0 -103
- package/dist/chunk-VCUXAPLM.js +0 -169
- package/dist/chunk-W7C7HZFJ.js +0 -275
- package/dist/chunk-WPAW6EVY.js +0 -166
- package/dist/chunk-WPSLL3S2.js +0 -604
- package/dist/chunk-WW6JLISJ.js +0 -200
- package/dist/chunk-X3HPRECW.js +0 -52
- package/dist/chunk-XGX2WOV2.js +0 -8914
- package/dist/chunk-XJHUSJY6.js +0 -156
- package/dist/chunk-XPDUBDPL.js +0 -25
- package/dist/chunk-XRSRHAEU.js +0 -163
- package/dist/chunk-XVHR2NCG.js +0 -249
- package/dist/chunk-XWO6CXNG.js +0 -19
- package/dist/chunk-XZWBLUDV.js +0 -831
- package/dist/chunk-Y25HSPRJ.js +0 -122
- package/dist/chunk-YUCGCJKT.js +0 -676
- package/dist/chunk-ZBUIWVF3.js +0 -197
- package/dist/chunk-ZFJ2FQUH.js +0 -131
- package/dist/chunk-ZNXP3WNJ.js +0 -58
- package/dist/chunk-ZVXKWLLE.js +0 -1744
- package/dist/claim-NRNO4XCO.js +0 -200
- package/dist/client-463NKLRT.js +0 -19
- package/dist/code-R4JOQ27J.js +0 -76
- package/dist/companies-4TOBU44J.js +0 -198
- package/dist/company-RK34S3IA.js +0 -308
- package/dist/complete-7BNBQ5AI.js +0 -84
- package/dist/config-GDLHHBJZ.js +0 -88
- package/dist/connect-CRIRSXN3.js +0 -45
- package/dist/content-FCO6MGXW.js +0 -85
- package/dist/conversation-4CQG2B2C.js +0 -96
- package/dist/conversion-report-PDTQTRVB.js +0 -127
- package/dist/conversion-upload-command-MEO4WLZH.js +0 -439
- package/dist/conversion-writes-ZVBOXUIA.js +0 -122
- package/dist/conversions-BND5HYTL.js +0 -78
- package/dist/conversions-POBKTXQF.js +0 -140
- package/dist/copy-writes-EUFEVWDW.js +0 -170
- package/dist/countries-TKL5T5JL.js +0 -82
- package/dist/create-BJ7XBNY5.js +0 -62
- package/dist/create-PYP3QWTL.js +0 -135
- package/dist/create-XN4KVB5U.js +0 -210
- package/dist/create-YSGBH6Q4.js +0 -239
- package/dist/creatives-57XIJAEG.js +0 -223
- package/dist/creatives-6VJDUHEY.js +0 -89
- package/dist/creatives-ANTJUTIE.js +0 -58
- package/dist/credentials-KIH6ICDU.js +0 -290
- package/dist/critique-GWRXVXVG.js +0 -1451
- package/dist/critique-MZUTDK4V.js +0 -232
- package/dist/crm-QSHUYXTW.js +0 -323
- package/dist/crm-Y5QTZAHO.js +0 -227
- package/dist/crop-WKTW3EMP.js +0 -113
- package/dist/currency-PTOI5SPU.js +0 -88
- package/dist/custom-conversions-NDY5RHSM.js +0 -128
- package/dist/customers-2G32E6W7.js +0 -59
- package/dist/decide-X2UAKYXK.js +0 -199
- package/dist/delete-2ZTMTKYD.js +0 -69
- package/dist/delete-3H6YH4YK.js +0 -67
- package/dist/delete-FOSTK2RA.js +0 -71
- package/dist/delete-FOSTK2RA.js.map +0 -1
- package/dist/delete-HIAZHA56.js +0 -57
- package/dist/delete-I43JQH2E.js +0 -69
- package/dist/delete-RF44ILYE.js +0 -71
- package/dist/demographics-2UYQW6II.js +0 -141
- package/dist/describe-M6DYXNQC.js +0 -97
- package/dist/describe-OQ6R3EF7.js +0 -97
- package/dist/dimensions-DGYM5E5P.js +0 -101
- package/dist/discard-NKPQ73UM.js +0 -69
- package/dist/discover-XLIH7RCB.js +0 -93
- package/dist/discover-YKMBVSPF.js +0 -172
- package/dist/domain-LUDUZB3F.js +0 -101
- package/dist/download-LL6DL62N.js +0 -172
- package/dist/download-SFWMT7DL.js +0 -299
- package/dist/draft-374Z4MGY.js +0 -103
- package/dist/draft-736FJJWK.js +0 -310
- package/dist/draft-7LPUJZCF.js +0 -283
- package/dist/draft-G432FJ7N.js +0 -240
- package/dist/draft-MPWR47CG.js +0 -308
- package/dist/draft-R5ND5SWT.js +0 -100
- package/dist/draft-T7TWIFEX.js +0 -335
- package/dist/draft-XAAIGE6Q.js +0 -220
- package/dist/env-DQHY5ODN.js +0 -53
- package/dist/experiment-MO6MT6OJ.js +0 -1397
- package/dist/experiments-OGZV73W6.js +0 -236
- package/dist/export-6Z6QBU6V.js +0 -168
- package/dist/extract-YGOQBOQK.js +0 -113
- package/dist/facets-OLZ7JLFL.js +0 -117
- package/dist/favorites-R3JO4SJJ.js +0 -178
- package/dist/feed-IUMMHM3I.js +0 -177
- package/dist/feedback-TJRYTOR3.js +0 -111
- package/dist/feedback-record-7IAJI5IY.js +0 -265
- package/dist/fetch-AL44XS4Q.js +0 -139
- package/dist/fetch-K3NRT2L2.js +0 -179
- package/dist/find-ZFIGMRYQ.js +0 -143
- package/dist/fit-5NVXWXZV.js +0 -65
- package/dist/flows-LL5SPPIK.js +0 -250
- package/dist/follow-SS374QUW.js +0 -94
- package/dist/follow-competitors-3LTOTTBY.js +0 -112
- package/dist/following-YMA5O3LF.js +0 -113
- package/dist/fonts-E3CNWPD5.js +0 -39
- package/dist/forecast-KOBF5TKM.js +0 -169
- package/dist/forecast-PWGN4ETP.js +0 -121
- package/dist/funding-KLIZ73SS.js +0 -85
- package/dist/funnel-XIZROHV7.js +0 -397
- package/dist/ga4-XPCE4EK5.js +0 -55
- package/dist/generate-GHIXVLMY.js +0 -263
- package/dist/get-HCGFATFD.js +0 -38
- package/dist/get-JR2KZXW5.js +0 -63
- package/dist/get-JR2KZXW5.js.map +0 -1
- package/dist/get-RDTJSWSA.js +0 -92
- package/dist/get-SGNT4JG2.js +0 -59
- package/dist/get-TGFXZC5S.js +0 -61
- package/dist/get-TGFXZC5S.js.map +0 -1
- package/dist/get-WS744HAO.js +0 -59
- package/dist/get-XPJ4BZGP.js +0 -82
- package/dist/get-YD7GDMDR.js +0 -63
- package/dist/get-YD7GDMDR.js.map +0 -1
- package/dist/gif-YK5HJXRE.js +0 -102
- package/dist/google-5JV7OMOH.js +0 -3267
- package/dist/google-BI45CXMW.js +0 -136
- package/dist/google-ads-DYZGUM6W.js +0 -198
- package/dist/group-7OWIYAKJ.js +0 -43
- package/dist/group-H6ZYRPE6.js +0 -43
- package/dist/gsc-HI2KXDEU.js +0 -30
- package/dist/history-3EQQHYKT.js +0 -69
- package/dist/history-RD2YMNNL.js +0 -102
- package/dist/history-SQPJ7PPE.js +0 -136
- package/dist/hubspot-MYTV36SM.js +0 -782
- package/dist/icon-HLJCWTR3.js +0 -137
- package/dist/ideas-CVXHFVX7.js +0 -45
- package/dist/images-XP4TKE2F.js +0 -92
- package/dist/improve-BRC4R6MW.js +0 -86
- package/dist/ingest-4GNJ2PWL.js +0 -26
- package/dist/ingest-5NYBUZE2.js +0 -110
- package/dist/ingest-5NYBUZE2.js.map +0 -1
- package/dist/insights-CN3GUTT7.js +0 -132
- package/dist/insights-IVW6W5CP.js +0 -439
- package/dist/inspect-25IVRU45.js +0 -192
- package/dist/inspiration-D75DO3MD.js +0 -53
- package/dist/instant-experiences-6F6GXZ67.js +0 -260
- package/dist/intent-3GDLPKKN.js +0 -95
- package/dist/job-2JJNKUHT.js +0 -202
- package/dist/job-create-BNTNZCSP.js +0 -109
- package/dist/job-status-N7RWRDRO.js +0 -74
- package/dist/keep-Z2WH3CKU.js +0 -78
- package/dist/keyword-gap-B2WPVHOB.js +0 -130
- package/dist/keyword-metrics-UDGWN7BO.js +0 -200
- package/dist/keywords-for-site-GEG6AXD3.js +0 -131
- package/dist/knowledge-PKXPN4RV.js +0 -195
- package/dist/landing-O2ZUIUGE.js +0 -28
- package/dist/landings-7QRITXZ2.js +0 -151
- package/dist/languages-RZLMZR57.js +0 -55
- package/dist/languages-UJAOPTV2.js +0 -40
- package/dist/launches-4H6ANGTG.js +0 -19
- package/dist/layerize-P5LFIA4X.js +0 -190
- package/dist/lead-routes-WVXWVG62.js +0 -733
- package/dist/leads-CJKRKB2Q.js +0 -540
- package/dist/leads-MTTOYNPM.js +0 -115
- package/dist/learn-QPXZZIZZ.js +0 -207
- package/dist/library-VW27X75P.js +0 -211
- package/dist/lighthouse-FGUFJRGR.js +0 -75
- package/dist/line-item-writes-RVOAMJ5R.js +0 -211
- package/dist/line-items-POZRAJLC.js +0 -107
- package/dist/link-IXEZKRM7.js +0 -67
- package/dist/linkedin-5PYG5HEM.js +0 -1328
- package/dist/linkedin-person-EMJXEZYR.js +0 -139
- package/dist/list-4KS7WSUG.js +0 -306
- package/dist/list-7GDMM26I.js +0 -93
- package/dist/list-DVVOP6FM.js +0 -50
- package/dist/list-J5KWXHFO.js +0 -76
- package/dist/list-OZCU2T22.js +0 -67
- package/dist/list-PTK2HOUY.js +0 -51
- package/dist/list-Q5LVTPQP.js +0 -57
- package/dist/list-UG4V5AM2.js +0 -65
- package/dist/list-XOYU7UTX.js +0 -154
- package/dist/locations-EISZ6JOT.js +0 -40
- package/dist/locations-VJX64ZZR.js +0 -69
- package/dist/log-2F2N24DT.js +0 -95
- package/dist/logo-H2KHGLYD.js +0 -18
- package/dist/lookup-K57ITJWF.js +0 -23
- package/dist/make-T6HLXIYY.js +0 -1366
- package/dist/map-QGJZIC5N.js +0 -436
- package/dist/mcp-RSW7KAWP.js +0 -729
- package/dist/media-HDHZULQ7.js +0 -18
- package/dist/media-K5RJXLTN.js +0 -89
- package/dist/media-sources-7R7FO53Y.js +0 -35
- package/dist/members-B6TKGGT5.js +0 -47
- package/dist/meme-QMCUGXUE.js +0 -100
- package/dist/meta-MOSJVYIE.js +0 -122
- package/dist/metrics-PRIKXVYZ.js +0 -152
- package/dist/models-M3E4YFCT.js +0 -155
- package/dist/normalize-5B4EQLUX.js +0 -144
- package/dist/normalize-5QIGANTK.js +0 -806
- package/dist/options-K33CJOR6.js +0 -125
- package/dist/organization-A4NFWWWI.js +0 -949
- package/dist/output-U5ZV6PST.js +0 -24
- package/dist/page-XVOUD4VV.js +0 -105
- package/dist/page-photos-4JTIKXAW.js +0 -118
- package/dist/pages-BAUS7LQM.js +0 -67
- package/dist/performance-MHJDRLEK.js +0 -5565
- package/dist/performance-NVURSEZ6.js +0 -27
- package/dist/pinterest-NA6HGPMB.js +0 -96
- package/dist/pixels-QOSEYXCP.js +0 -109
- package/dist/pixels-THDQD3RF.js +0 -62
- package/dist/plan-JYSHKPZQ.js +0 -208
- package/dist/posts-ILAFADBW.js +0 -36
- package/dist/preview-X6EJGPAY.js +0 -218
- package/dist/profile-YHI65VGK.js +0 -159
- package/dist/promoted-tweet-writes-MXXVRLVQ.js +0 -183
- package/dist/promoted-tweets-HFLGXWX2.js +0 -119
- package/dist/properties-ZLY6NYVK.js +0 -101
- package/dist/publish-6ZXFUBGP.js +0 -344
- package/dist/query-ELD7WSFR.js +0 -247
- package/dist/query-HFHTLNDN.js +0 -236
- package/dist/query-WMEX73ZB.js +0 -62
- package/dist/questionnaire-Y37I64FO.js +0 -94
- package/dist/read-2HQEZIJW.js +0 -141
- package/dist/reddit-BIHGJPGP.js +0 -29
- package/dist/refresh-4O32S4YR.js +0 -97
- package/dist/refresh-LVV4SPLT.js +0 -42
- package/dist/release-VIPNSPQ5.js +0 -63
- package/dist/relevant-pages-B5SYN575.js +0 -99
- package/dist/remove-2E77743U.js +0 -53
- package/dist/remove-TPOWWFZ6.js +0 -49
- package/dist/reopen-UOBTJBMQ.js +0 -66
- package/dist/rerun-UPDIXTEL.js +0 -95
- package/dist/research-ELM3KHGE.js +0 -72
- package/dist/research-FOJIDMSE.js +0 -265
- package/dist/reset-FTLWUFZK.js +0 -57
- package/dist/reset-GIXXLPHQ.js +0 -57
- package/dist/resolve-QHR5JJTJ.js +0 -124
- package/dist/retry-HNWXJR5U.js +0 -65
- package/dist/retry-NY5KFEDA.js +0 -63
- package/dist/retry-failed-OAH7JQKD.js +0 -45
- package/dist/revenue-JFMUODJO.js +0 -91
- package/dist/rule-writes-A4BFYHPA.js +0 -525
- package/dist/rules-56E55SGC.js +0 -99
- package/dist/rules-HLREXY2M.js +0 -217
- package/dist/rules-add-ZOPOWJMY.js +0 -465
- package/dist/run-4UIPMCSN.js +0 -69
- package/dist/run-GACZDI6Q.js +0 -70
- package/dist/scaffold-ad-Z2HSN4PE.js +0 -1512
- package/dist/scaffold-static-ad-ODZGTIM5.js +0 -1010
- package/dist/scaffold-video-EHGAMEEP.js +0 -884
- package/dist/schedule-OFPSZVZ2.js +0 -67
- package/dist/schedule-ZATNBBWD.js +0 -64
- package/dist/scheduled-agents-4VY4CAA2.js +0 -55
- package/dist/schema-EYGPETLF.js +0 -121
- package/dist/schema-OGP4DUPP.js +0 -135
- package/dist/scrape-ZHL2BHS7.js +0 -2241
- package/dist/screenshot-ADMRDYWN.js +0 -102
- package/dist/search-6W4HXR2S.js +0 -91
- package/dist/search-6ZWI2NML.js +0 -92
- package/dist/search-CQUS7EOM.js +0 -51
- package/dist/search-HF5ECIYW.js +0 -26
- package/dist/search-MKVVMJ2Q.js +0 -224
- package/dist/search-QUF6LHQ5.js +0 -177
- package/dist/search-copy-O6FDX4HT.js +0 -168
- package/dist/seeds-5TM3O3K3.js +0 -101
- package/dist/select-FCQUYBKV.js +0 -106
- package/dist/sends-MZKHZZGJ.js +0 -349
- package/dist/sequences-3CEVHGHB.js +0 -146
- package/dist/set-prompt-IBAG6BDA.js +0 -198
- package/dist/setup-links-4STQ5B4P.js +0 -144
- package/dist/shared-I3SB77VH.js +0 -32
- package/dist/shopify-7LDHCWUQ.js +0 -3958
- package/dist/site-I3NFMPJB.js +0 -180
- package/dist/sitemaps-PLAWVXQL.js +0 -87
- package/dist/sites-WX2IBTZT.js +0 -101
- package/dist/skills-O6EQOAMQ.js +0 -47
- package/dist/sources-K2LILGTW.js +0 -30
- package/dist/sources-ZM7LEIMM.js +0 -457
- package/dist/stale-VR5QAYB6.js +0 -76
- package/dist/stats-QQRYOMZA.js +0 -34
- package/dist/status-5OMVGFCH.js +0 -65
- package/dist/sticker-654HS3K2.js +0 -94
- package/dist/stock-35LOO3YN.js +0 -179
- package/dist/studies-IGOCWM7F.js +0 -250
- package/dist/studio-3D42TUJX.js +0 -49
- package/dist/study-writes-Z5P2W7JH.js +0 -470
- package/dist/suggest-JASHCOL5.js +0 -66
- package/dist/sync-6AN67IX3.js +0 -55
- package/dist/sync-RCDODSOD.js +0 -57
- package/dist/sync-URIRLHTS.js +0 -279
- package/dist/sync-definition-MZUJOJYI.js +0 -69
- package/dist/tag-7YMFAZQQ.js +0 -57
- package/dist/tag-manager-LU4GAZ6R.js +0 -43
- package/dist/tags-6A7QOYBI.js +0 -23
- package/dist/tags-JHT3Q6VO.js +0 -227
- package/dist/tags-KSMLT4G2.js +0 -26
- package/dist/tags-MTVZJHCE.js +0 -23
- package/dist/tags-OU32R2SH.js +0 -23
- package/dist/targeting-7HXKBXWY.js +0 -762
- package/dist/targeting-constants-QIB3UZHM.js +0 -118
- package/dist/targeting-criteria-NUXZB7NP.js +0 -113
- package/dist/targets-LQ7HGI73.js +0 -106
- package/dist/terms-X4OJWTQH.js +0 -102
- package/dist/testimonials-Z2KOOMVH.js +0 -32
- package/dist/themes-6KVP3COR.js +0 -95
- package/dist/top-companies-WWNPUJ23.js +0 -111
- package/dist/transcript-P7HKVABU.js +0 -165
- package/dist/translate-II4JY2XW.js +0 -600
- package/dist/triggers-Z3LV3KJR.js +0 -144
- package/dist/tweets-X5PTAT6F.js +0 -123
- package/dist/unfollow-S5LHFLGW.js +0 -46
- package/dist/unlink-XTZA474P.js +0 -70
- package/dist/unstage-AVLORZLW.js +0 -96
- package/dist/unstage-QXOL5DXZ.js +0 -88
- package/dist/update-3NA6ABLW.js +0 -101
- package/dist/update-5ZNS2DKP.js +0 -66
- package/dist/update-DDKNKV6M.js +0 -81
- package/dist/update-MDVZ24VQ.js +0 -192
- package/dist/update-UE4XVBKL.js +0 -155
- package/dist/upload-IMP5CUY5.js +0 -129
- package/dist/upload-IMP5CUY5.js.map +0 -1
- package/dist/upload-SYFB2VTJ.js +0 -150
- package/dist/upscale-P5EYUVOZ.js +0 -109
- package/dist/url-options-DJZV3ADK.js +0 -131
- package/dist/url-params-Y5XQSDEF.js +0 -101
- package/dist/use-D3RBWLJO.js +0 -95
- package/dist/use-D3RBWLJO.js.map +0 -1
- package/dist/validate-BCK22BQL.js +0 -122
- package/dist/variant-JQVZUUA4.js +0 -338
- package/dist/videos-YCQVOOFE.js +0 -41
- package/dist/view-IKKRJ5YD.js +0 -121
- package/dist/viewer-check-5GREZIVJ.js +0 -83
- package/dist/web-7TPDDBI6.js +0 -143
- package/dist/winners-4PKEVMUC.js +0 -113
- package/dist/winning-ads-7X5EWSJX.js +0 -86
- package/dist/write-commands-CTLF2M6L.js +0 -713
- package/dist/write-commands-CY734U34.js +0 -1172
- package/dist/write-commands-FIS6Y2MN.js +0 -206
- package/dist/write-commands-V77MD5SC.js +0 -1525
- package/dist/x-EMLFCHSG.js +0 -47
- /package/dist/{account-2G3IT7J4.js.map → account-2UXZ6CZJ.js.map} +0 -0
- /package/dist/{account-CQJFUII3.js.map → account-HQD5P3AF.js.map} +0 -0
- /package/dist/{account-ULC5N7SI.js.map → account-OWMJG4IW.js.map} +0 -0
- /package/dist/{account-assets-IDVG4DGK.js.map → account-assets-JRMYVXQP.js.map} +0 -0
- /package/dist/{account-level-GK7M2MMQ.js.map → account-level-PEGLZQTI.js.map} +0 -0
- /package/dist/{account-reads-FRFI6OHK.js.map → account-reads-W2GAN335.js.map} +0 -0
- /package/dist/{account-users-PINZLBT7.js.map → account-users-WLTQNPL7.js.map} +0 -0
- /package/dist/{account-writes-WRGJC7VU.js.map → account-writes-TNADUSHW.js.map} +0 -0
- /package/dist/{accounts-MHPNZW3W.js.map → accounts-D3SQTZB7.js.map} +0 -0
- /package/dist/{accounts-2KFG33EX.js.map → accounts-HRQFOTBJ.js.map} +0 -0
- /package/dist/{accounts-MTNBMXHD.js.map → accounts-MQMEOGQD.js.map} +0 -0
- /package/dist/{accounts-KRW3JNCW.js.map → accounts-T6SRCZJQ.js.map} +0 -0
- /package/dist/{accounts-5754XUS3.js.map → accounts-Y2VWI3AA.js.map} +0 -0
- /package/dist/{actions-33IZOT5C.js.map → actions-VJXED57L.js.map} +0 -0
- /package/dist/{active-entities-JR5B32X2.js.map → active-entities-BOMM4YDF.js.map} +0 -0
- /package/dist/{activecampaign-BV5GZFVR.js.map → activecampaign-TNJIQA4C.js.map} +0 -0
- /package/dist/{activities-2RAJXP3J.js.map → activities-YH4K4JAI.js.map} +0 -0
- /package/dist/{ad-group-writes-W6RCMYLC.js.map → ad-group-writes-7BGCZA3M.js.map} +0 -0
- /package/dist/{ad-groups-XAI2Z62X.js.map → ad-groups-A6GU6EW5.js.map} +0 -0
- /package/dist/{ad-writes-IGWZRTXY.js.map → ad-writes-CEMCUDU2.js.map} +0 -0
- /package/dist/{add-UZDOQAJL.js.map → add-2L2VQ5MU.js.map} +0 -0
- /package/dist/{add-DBCN33GH.js.map → add-DRTKSLEQ.js.map} +0 -0
- /package/dist/{add-WDX66JSM.js.map → add-LBHISK44.js.map} +0 -0
- /package/dist/{add-KB7O7NSB.js.map → add-PS36Q2S3.js.map} +0 -0
- /package/dist/{add-4PJDIW2M.js.map → add-RLMXZLLO.js.map} +0 -0
- /package/dist/{add-PRU32PQN.js.map → add-Z2OTFSQO.js.map} +0 -0
- /package/dist/{add-accounts-ZWXG6HLM.js.map → add-accounts-GXBE4ZR2.js.map} +0 -0
- /package/dist/{ads-7TEPA4KZ.js.map → ads-4EVKVAMR.js.map} +0 -0
- /package/dist/{ads-255V76SZ.js.map → ads-OY455VCX.js.map} +0 -0
- /package/dist/{ads-I6I4MYQH.js.map → ads-WYQYZ44U.js.map} +0 -0
- /package/dist/{ads-JVBLNTBF.js.map → ads-ZEF5AU3D.js.map} +0 -0
- /package/dist/{adsets-FN5ZWSYF.js.map → adsets-ZRS7AZIK.js.map} +0 -0
- /package/dist/{advertisers-BPJWOY7I.js.map → advertisers-AAGUUSAX.js.map} +0 -0
- /package/dist/{advertisers-SJO6JYIO.js.map → advertisers-G6DZRBOK.js.map} +0 -0
- /package/dist/{analytics-XDWBEY57.js.map → analytics-ANG42PKM.js.map} +0 -0
- /package/dist/{analytics-TXPEXLPQ.js.map → analytics-UI4AKUSF.js.map} +0 -0
- /package/dist/{animate-425S4ZXS.js.map → animate-KCSICY2N.js.map} +0 -0
- /package/dist/{approved-KUVAJ5M7.js.map → approved-LHYBVDXH.js.map} +0 -0
- /package/dist/{asset-writes-SSI3CO2A.js.map → asset-writes-CUF25BLM.js.map} +0 -0
- /package/dist/{assign-CTV6LDEI.js.map → assign-5DFH6HBV.js.map} +0 -0
- /package/dist/{audience-size-5QYI5PKH.js.map → audience-size-P6WIXOB3.js.map} +0 -0
- /package/dist/{audience-writes-G64754LR.js.map → audience-writes-L7SNU2SB.js.map} +0 -0
- /package/dist/{audiences-JZ6SCEUC.js.map → audiences-4ASLCNOF.js.map} +0 -0
- /package/dist/{audiences-JAVNJ5NC.js.map → audiences-A54MU63W.js.map} +0 -0
- /package/dist/{audiences-OMLKMHEJ.js.map → audiences-SG2BBM7R.js.map} +0 -0
- /package/dist/{audit-2YFDJAKL.js.map → audit-6K5FFV6K.js.map} +0 -0
- /package/dist/{audit-4UE6GFLG.js.map → audit-LA4BSLXV.js.map} +0 -0
- /package/dist/{autocomplete-HTUV2UDS.js.map → autocomplete-XMG6E7TG.js.map} +0 -0
- /package/dist/{avatars-K7RBSMIJ.js.map → avatars-4IFN4GZD.js.map} +0 -0
- /package/dist/{bid-pricing-OWP4SZP5.js.map → bid-pricing-JEOG2Q3L.js.map} +0 -0
- /package/dist/{brand-GBP4OEJI.js.map → brand-C6HUAK74.js.map} +0 -0
- /package/dist/{brief-SLTB3EPO.js.map → brief-5BCPPBU3.js.map} +0 -0
- /package/dist/{businesses-DXRDQIFP.js.map → businesses-GQ5FOZDU.js.map} +0 -0
- /package/dist/{campaign-groups-LDOQU65Q.js.map → campaign-groups-IYQZSICZ.js.map} +0 -0
- /package/dist/{campaign-writes-SHF3XZXV.js.map → campaign-writes-CVOOPZ35.js.map} +0 -0
- /package/dist/{campaign-writes-SK55QLY5.js.map → campaign-writes-YXI5UOPH.js.map} +0 -0
- /package/dist/{campaigns-6CAKRANC.js.map → campaigns-FW4WVD25.js.map} +0 -0
- /package/dist/{campaigns-EHV7J7PW.js.map → campaigns-QMFHNG3N.js.map} +0 -0
- /package/dist/{campaigns-GG7LLI4X.js.map → campaigns-TX37WHVL.js.map} +0 -0
- /package/dist/{campaigns-GQWFSKGC.js.map → campaigns-VZJMYETG.js.map} +0 -0
- /package/dist/{canvas-2VRPGRND.js.map → canvas-G4QXNPPE.js.map} +0 -0
- /package/dist/{capabilities-BEZXR2FZ.js.map → capabilities-7643Y2HU.js.map} +0 -0
- /package/dist/{cards-J2PGFKEF.js.map → cards-YHZFJ3US.js.map} +0 -0
- /package/dist/{catalog-XECCXRM6.js.map → catalog-PTVQSATT.js.map} +0 -0
- /package/dist/{catalogs-P5KMIMC2.js.map → catalogs-YNIUP2AH.js.map} +0 -0
- /package/dist/{catalogs-TBRONC2D.js.map → catalogs-ZHCLH43A.js.map} +0 -0
- /package/dist/{changes-3COSIJLU.js.map → changes-QUKBZVB3.js.map} +0 -0
- /package/dist/{chatgpt-S5EVEKYV.js.map → chatgpt-TIUBMATF.js.map} +0 -0
- /package/dist/{chats-AN52YVBT.js.map → chats-BGLAG4Q7.js.map} +0 -0
- /package/dist/{check-AQO7CMDD.js.map → check-MN5ZQ7RX.js.map} +0 -0
- /package/dist/{chunk-TE4ASZSC.js.map → chunk-23KN4NL4.js.map} +0 -0
- /package/dist/{chunk-WPSLL3S2.js.map → chunk-2UJ5ABI6.js.map} +0 -0
- /package/dist/{chunk-V62ZWGCL.js.map → chunk-2XRFWXSA.js.map} +0 -0
- /package/dist/{chunk-6M77QNJ4.js.map → chunk-3JV4T6XW.js.map} +0 -0
- /package/dist/{chunk-CSCHS3JG.js.map → chunk-3OSBCYKA.js.map} +0 -0
- /package/dist/{chunk-4JS2O2KV.js.map → chunk-3QQHPRRB.js.map} +0 -0
- /package/dist/{chunk-ILEJXJH2.js.map → chunk-3WTCMBDC.js.map} +0 -0
- /package/dist/{chunk-5CTNSIWY.js.map → chunk-4BTUF2AV.js.map} +0 -0
- /package/dist/{chunk-4745PLPI.js.map → chunk-4D37LCBS.js.map} +0 -0
- /package/dist/{chunk-XRSRHAEU.js.map → chunk-4QITYZUH.js.map} +0 -0
- /package/dist/{chunk-PGBZ73UZ.js.map → chunk-4XNF52NU.js.map} +0 -0
- /package/dist/{chunk-T6PTG6VM.js.map → chunk-4Y7IJ2PU.js.map} +0 -0
- /package/dist/{chunk-GDQJG4BO.js.map → chunk-53BTYIMJ.js.map} +0 -0
- /package/dist/{chunk-QNXDSNOQ.js.map → chunk-5ITB24SC.js.map} +0 -0
- /package/dist/{chunk-MZIYRWXL.js.map → chunk-5N47LB7X.js.map} +0 -0
- /package/dist/{chunk-FOWT6ENH.js.map → chunk-5UBFYJHF.js.map} +0 -0
- /package/dist/{chunk-SP5L7EYC.js.map → chunk-6CQOHJZW.js.map} +0 -0
- /package/dist/{chunk-GLCHD54W.js.map → chunk-6OXENBTF.js.map} +0 -0
- /package/dist/{chunk-VCUXAPLM.js.map → chunk-6PMJU7IU.js.map} +0 -0
- /package/dist/{chunk-3H5MJOG2.js.map → chunk-7GGLZOQN.js.map} +0 -0
- /package/dist/{chunk-DJWEQDBB.js.map → chunk-7I65KXU7.js.map} +0 -0
- /package/dist/{chunk-4XXA4WCS.js.map → chunk-7JFVMJZI.js.map} +0 -0
- /package/dist/{chunk-WPAW6EVY.js.map → chunk-A6VODUO3.js.map} +0 -0
- /package/dist/{chunk-R44B522K.js.map → chunk-AGTA5FJX.js.map} +0 -0
- /package/dist/{chunk-V2XEX2YR.js.map → chunk-AGU4KGT6.js.map} +0 -0
- /package/dist/{chunk-LHQ6GXNF.js.map → chunk-BXUUKRMM.js.map} +0 -0
- /package/dist/{chunk-DW3OPKXI.js.map → chunk-BZTAEZLT.js.map} +0 -0
- /package/dist/{chunk-ZNXP3WNJ.js.map → chunk-C7IOSSI4.js.map} +0 -0
- /package/dist/{chunk-B4UVJCJ4.js.map → chunk-CIW3Q7B2.js.map} +0 -0
- /package/dist/{chunk-SPBNAGIN.js.map → chunk-CJQ77HO5.js.map} +0 -0
- /package/dist/{chunk-6B4KNOJZ.js.map → chunk-CNPYG4F3.js.map} +0 -0
- /package/dist/{chunk-C5UFKDAX.js.map → chunk-COS3TPHX.js.map} +0 -0
- /package/dist/{chunk-GT77XMOG.js.map → chunk-CQ6HBFOB.js.map} +0 -0
- /package/dist/{chunk-LS2KEAYJ.js.map → chunk-D7Y3UNWO.js.map} +0 -0
- /package/dist/{chunk-5EF7ZLXA.js.map → chunk-DJTWY7GL.js.map} +0 -0
- /package/dist/{chunk-JCVPZ7CV.js.map → chunk-DWW5QSUF.js.map} +0 -0
- /package/dist/{chunk-TEKML2NW.js.map → chunk-E34YYDCE.js.map} +0 -0
- /package/dist/{chunk-3WSJGYA3.js.map → chunk-ENUCJ6AO.js.map} +0 -0
- /package/dist/{chunk-DNWP5DL6.js.map → chunk-FESQ5TXU.js.map} +0 -0
- /package/dist/{chunk-UPDIBQUC.js.map → chunk-FEUKUZRA.js.map} +0 -0
- /package/dist/{chunk-U2BPZ27S.js.map → chunk-FJDSL4O5.js.map} +0 -0
- /package/dist/{chunk-CREEY2FS.js.map → chunk-FSTDWVXG.js.map} +0 -0
- /package/dist/{chunk-XVHR2NCG.js.map → chunk-FUR7R4D7.js.map} +0 -0
- /package/dist/{chunk-FBG3JDET.js.map → chunk-GYMZCJX6.js.map} +0 -0
- /package/dist/{chunk-R5GGTLYE.js.map → chunk-HTT7RBRC.js.map} +0 -0
- /package/dist/{chunk-BN4TDL5L.js.map → chunk-IQWFJEA3.js.map} +0 -0
- /package/dist/{chunk-XZWBLUDV.js.map → chunk-IU5K42Q3.js.map} +0 -0
- /package/dist/{chunk-EZBZU6N7.js.map → chunk-JARRF5VX.js.map} +0 -0
- /package/dist/{chunk-RUJS2NOA.js.map → chunk-JEUFRIYS.js.map} +0 -0
- /package/dist/{chunk-LURM3KKS.js.map → chunk-JNSRQQDP.js.map} +0 -0
- /package/dist/{chunk-MHH7SGLS.js.map → chunk-KGAI4E2I.js.map} +0 -0
- /package/dist/{chunk-SDQLZYQG.js.map → chunk-KITVYLEX.js.map} +0 -0
- /package/dist/{chunk-J4ASA24X.js.map → chunk-L5VVKIMB.js.map} +0 -0
- /package/dist/{chunk-SWNCS2OD.js.map → chunk-L763CNKH.js.map} +0 -0
- /package/dist/{chunk-4VXQAJRU.js.map → chunk-LO2MZJJP.js.map} +0 -0
- /package/dist/{chunk-HPDGVK6R.js.map → chunk-LV7EU6HM.js.map} +0 -0
- /package/dist/{chunk-QNLPZOHV.js.map → chunk-LXZ5E6AC.js.map} +0 -0
- /package/dist/{chunk-KRQ2AXFW.js.map → chunk-LZRZVIEJ.js.map} +0 -0
- /package/dist/{chunk-YUCGCJKT.js.map → chunk-M2MJ52HS.js.map} +0 -0
- /package/dist/{chunk-DLNADMQV.js.map → chunk-MBSAHNMJ.js.map} +0 -0
- /package/dist/{chunk-GEFZVG4P.js.map → chunk-MCKYNFPH.js.map} +0 -0
- /package/dist/{chunk-ZBUIWVF3.js.map → chunk-MHZIOOT5.js.map} +0 -0
- /package/dist/{chunk-364TCROV.js.map → chunk-MNOCC5AL.js.map} +0 -0
- /package/dist/{chunk-WW6JLISJ.js.map → chunk-MUEJVDHI.js.map} +0 -0
- /package/dist/{chunk-XWO6CXNG.js.map → chunk-N6WHUUFH.js.map} +0 -0
- /package/dist/{chunk-FVZL2YC5.js.map → chunk-NA5Q473J.js.map} +0 -0
- /package/dist/{chunk-AXTOIHH2.js.map → chunk-NCO5NGBN.js.map} +0 -0
- /package/dist/{chunk-X3HPRECW.js.map → chunk-NLW25WW3.js.map} +0 -0
- /package/dist/{chunk-TKDOVFO6.js.map → chunk-NYAFSC5V.js.map} +0 -0
- /package/dist/{chunk-AFQF6ISC.js.map → chunk-O7AMKMII.js.map} +0 -0
- /package/dist/{chunk-7HH4F2KX.js.map → chunk-OL3QHART.js.map} +0 -0
- /package/dist/{chunk-Y25HSPRJ.js.map → chunk-OPUEQSKM.js.map} +0 -0
- /package/dist/{chunk-3J3W23S4.js.map → chunk-OXLB5M5M.js.map} +0 -0
- /package/dist/{chunk-QJ5TU5J6.js.map → chunk-OXYWSVOJ.js.map} +0 -0
- /package/dist/{chunk-XGX2WOV2.js.map → chunk-PE4ZP7MX.js.map} +0 -0
- /package/dist/{chunk-NY5VYGTP.js.map → chunk-PHZOMTI6.js.map} +0 -0
- /package/dist/{chunk-T37PAZT2.js.map → chunk-PIAG4UJT.js.map} +0 -0
- /package/dist/{chunk-KG7FPYM2.js.map → chunk-PYWIHAVD.js.map} +0 -0
- /package/dist/{chunk-SNDHR5QA.js.map → chunk-QKNPF6ZD.js.map} +0 -0
- /package/dist/{chunk-ZFJ2FQUH.js.map → chunk-QOBA6PHB.js.map} +0 -0
- /package/dist/{chunk-3KMYOPBI.js.map → chunk-QPPQXU3U.js.map} +0 -0
- /package/dist/{chunk-TTKDFRON.js.map → chunk-QTKNS2U2.js.map} +0 -0
- /package/dist/{chunk-SJAUMPL3.js.map → chunk-QTLIXCVN.js.map} +0 -0
- /package/dist/{chunk-O37YK4P6.js.map → chunk-R5LRBDEM.js.map} +0 -0
- /package/dist/{chunk-TRMZQRVV.js.map → chunk-RRC7F3QQ.js.map} +0 -0
- /package/dist/{chunk-ERRTBCDW.js.map → chunk-SEYCF446.js.map} +0 -0
- /package/dist/{chunk-GXPZJ2QN.js.map → chunk-SF52UGHZ.js.map} +0 -0
- /package/dist/{chunk-ZVXKWLLE.js.map → chunk-SVNH6P7O.js.map} +0 -0
- /package/dist/{chunk-34FVKJS2.js.map → chunk-SWFZJROM.js.map} +0 -0
- /package/dist/{chunk-SEC6FPWC.js.map → chunk-UCNIJ2IW.js.map} +0 -0
- /package/dist/{chunk-R6T25WTZ.js.map → chunk-UFUYTWEF.js.map} +0 -0
- /package/dist/{chunk-L5IYVZM2.js.map → chunk-ULW4EWAA.js.map} +0 -0
- /package/dist/{chunk-ECJIMIEJ.js.map → chunk-UROKPFIS.js.map} +0 -0
- /package/dist/{chunk-4ULRDQVD.js.map → chunk-VCOIFNYH.js.map} +0 -0
- /package/dist/{chunk-52IYZCRS.js.map → chunk-VPF5A7CM.js.map} +0 -0
- /package/dist/{chunk-HAJYFRXL.js.map → chunk-VV6FDIP5.js.map} +0 -0
- /package/dist/{chunk-XJHUSJY6.js.map → chunk-WRTG3KXU.js.map} +0 -0
- /package/dist/{chunk-2SGREP24.js.map → chunk-XAW5GL6B.js.map} +0 -0
- /package/dist/{chunk-7O4HFODK.js.map → chunk-XRNJRQ6Q.js.map} +0 -0
- /package/dist/{chunk-PN72Z2W2.js.map → chunk-Y5GQO6CR.js.map} +0 -0
- /package/dist/{chunk-62QMJYML.js.map → chunk-YE4RCEEJ.js.map} +0 -0
- /package/dist/{chunk-EHIISZYD.js.map → chunk-YJYKSMLF.js.map} +0 -0
- /package/dist/{chunk-W7C7HZFJ.js.map → chunk-YO54MA7R.js.map} +0 -0
- /package/dist/{chunk-2MXDSPUO.js.map → chunk-Z6T6VDDA.js.map} +0 -0
- /package/dist/{chunk-XPDUBDPL.js.map → chunk-ZOH672S6.js.map} +0 -0
- /package/dist/{claim-NRNO4XCO.js.map → claim-2JNNC66N.js.map} +0 -0
- /package/dist/{client-463NKLRT.js.map → client-YUVT3RZN.js.map} +0 -0
- /package/dist/{code-R4JOQ27J.js.map → code-LOOWLRUL.js.map} +0 -0
- /package/dist/{companies-4TOBU44J.js.map → companies-4NJU5TLU.js.map} +0 -0
- /package/dist/{company-RK34S3IA.js.map → company-QOYWS4W6.js.map} +0 -0
- /package/dist/{complete-7BNBQ5AI.js.map → complete-7FX2K3PV.js.map} +0 -0
- /package/dist/{config-GDLHHBJZ.js.map → config-AOF6ACIP.js.map} +0 -0
- /package/dist/{connect-CRIRSXN3.js.map → connect-H2HSPMRT.js.map} +0 -0
- /package/dist/{content-FCO6MGXW.js.map → content-NCW5IJFR.js.map} +0 -0
- /package/dist/{conversation-4CQG2B2C.js.map → conversation-4M7YMQOL.js.map} +0 -0
- /package/dist/{conversion-report-PDTQTRVB.js.map → conversion-report-G5JMZNYV.js.map} +0 -0
- /package/dist/{conversion-upload-command-MEO4WLZH.js.map → conversion-upload-command-43PZFYT7.js.map} +0 -0
- /package/dist/{conversion-writes-ZVBOXUIA.js.map → conversion-writes-JQQCCGPO.js.map} +0 -0
- /package/dist/{conversions-BND5HYTL.js.map → conversions-UO4CQNF6.js.map} +0 -0
- /package/dist/{conversions-POBKTXQF.js.map → conversions-Z7FW7CFT.js.map} +0 -0
- /package/dist/{copy-writes-EUFEVWDW.js.map → copy-writes-ONVSSBLJ.js.map} +0 -0
- /package/dist/{countries-TKL5T5JL.js.map → countries-Q6TA42P7.js.map} +0 -0
- /package/dist/{create-BJ7XBNY5.js.map → create-4SFO4AQZ.js.map} +0 -0
- /package/dist/{create-YSGBH6Q4.js.map → create-D5MA64KL.js.map} +0 -0
- /package/dist/{create-XN4KVB5U.js.map → create-GJ4ZMY3A.js.map} +0 -0
- /package/dist/{create-PYP3QWTL.js.map → create-QVY6DSYM.js.map} +0 -0
- /package/dist/{creatives-ANTJUTIE.js.map → creatives-ADH6HCCA.js.map} +0 -0
- /package/dist/{creatives-57XIJAEG.js.map → creatives-R3XILT6D.js.map} +0 -0
- /package/dist/{creatives-6VJDUHEY.js.map → creatives-S3EZCXUT.js.map} +0 -0
- /package/dist/{credentials-KIH6ICDU.js.map → credentials-EQRB6XGZ.js.map} +0 -0
- /package/dist/{critique-GWRXVXVG.js.map → critique-4YRRUNAU.js.map} +0 -0
- /package/dist/{critique-MZUTDK4V.js.map → critique-JCU2ATT6.js.map} +0 -0
- /package/dist/{crm-QSHUYXTW.js.map → crm-AF6XOOSF.js.map} +0 -0
- /package/dist/{crm-Y5QTZAHO.js.map → crm-LSMFGR6R.js.map} +0 -0
- /package/dist/{crop-WKTW3EMP.js.map → crop-RDP7YCNV.js.map} +0 -0
- /package/dist/{currency-PTOI5SPU.js.map → currency-4KNOOZUU.js.map} +0 -0
- /package/dist/{custom-conversions-NDY5RHSM.js.map → custom-conversions-7MZFTHUM.js.map} +0 -0
- /package/dist/{customers-2G32E6W7.js.map → customers-MM3VIZNA.js.map} +0 -0
- /package/dist/{decide-X2UAKYXK.js.map → decide-OPCCKAIT.js.map} +0 -0
- /package/dist/{delete-3H6YH4YK.js.map → delete-CO2YBPTI.js.map} +0 -0
- /package/dist/{delete-HIAZHA56.js.map → delete-D7HTW32U.js.map} +0 -0
- /package/dist/{delete-2ZTMTKYD.js.map → delete-GKQTDOZF.js.map} +0 -0
- /package/dist/{delete-I43JQH2E.js.map → delete-JUPBYK3H.js.map} +0 -0
- /package/dist/{delete-RF44ILYE.js.map → delete-R3LXCKA4.js.map} +0 -0
- /package/dist/{demographics-2UYQW6II.js.map → demographics-DK5JDY6M.js.map} +0 -0
- /package/dist/{describe-M6DYXNQC.js.map → describe-537PPL7P.js.map} +0 -0
- /package/dist/{describe-OQ6R3EF7.js.map → describe-GIG46DT5.js.map} +0 -0
- /package/dist/{dimensions-DGYM5E5P.js.map → dimensions-UXK7DMTF.js.map} +0 -0
- /package/dist/{discard-NKPQ73UM.js.map → discard-DEJOM62Y.js.map} +0 -0
- /package/dist/{discover-XLIH7RCB.js.map → discover-MKFDG6NK.js.map} +0 -0
- /package/dist/{discover-YKMBVSPF.js.map → discover-U6YLVLTF.js.map} +0 -0
- /package/dist/{domain-LUDUZB3F.js.map → domain-MBOMV3CQ.js.map} +0 -0
- /package/dist/{download-LL6DL62N.js.map → download-KN2I55SA.js.map} +0 -0
- /package/dist/{download-SFWMT7DL.js.map → download-PRBLR6IQ.js.map} +0 -0
- /package/dist/{draft-7LPUJZCF.js.map → draft-BMNBT37B.js.map} +0 -0
- /package/dist/{draft-T7TWIFEX.js.map → draft-CGPVRRKC.js.map} +0 -0
- /package/dist/{draft-736FJJWK.js.map → draft-F74OIT5O.js.map} +0 -0
- /package/dist/{draft-MPWR47CG.js.map → draft-FIEZWBIX.js.map} +0 -0
- /package/dist/{draft-G432FJ7N.js.map → draft-H5RVDTFD.js.map} +0 -0
- /package/dist/{draft-XAAIGE6Q.js.map → draft-HZ5T6NOI.js.map} +0 -0
- /package/dist/{draft-R5ND5SWT.js.map → draft-UMPCOCP6.js.map} +0 -0
- /package/dist/{draft-374Z4MGY.js.map → draft-XEUHTUMR.js.map} +0 -0
- /package/dist/{env-DQHY5ODN.js.map → env-VBSATLEF.js.map} +0 -0
- /package/dist/{experiment-MO6MT6OJ.js.map → experiment-2XR6MBE2.js.map} +0 -0
- /package/dist/{experiments-OGZV73W6.js.map → experiments-YNJZCMQM.js.map} +0 -0
- /package/dist/{export-6Z6QBU6V.js.map → export-YCLJG5YP.js.map} +0 -0
- /package/dist/{extract-YGOQBOQK.js.map → extract-E3CMEN5U.js.map} +0 -0
- /package/dist/{facets-OLZ7JLFL.js.map → facets-Y4OACBMC.js.map} +0 -0
- /package/dist/{favorites-R3JO4SJJ.js.map → favorites-NSQX6HKB.js.map} +0 -0
- /package/dist/{feed-IUMMHM3I.js.map → feed-TKMMYAEH.js.map} +0 -0
- /package/dist/{feedback-TJRYTOR3.js.map → feedback-MORAVN52.js.map} +0 -0
- /package/dist/{feedback-record-7IAJI5IY.js.map → feedback-record-M3RB7H2C.js.map} +0 -0
- /package/dist/{fetch-AL44XS4Q.js.map → fetch-EHP2FK6Y.js.map} +0 -0
- /package/dist/{fetch-K3NRT2L2.js.map → fetch-XU6QVWMS.js.map} +0 -0
- /package/dist/{find-ZFIGMRYQ.js.map → find-I7U3THF3.js.map} +0 -0
- /package/dist/{fit-5NVXWXZV.js.map → fit-IHUUFCGI.js.map} +0 -0
- /package/dist/{flows-LL5SPPIK.js.map → flows-WSCIMXQX.js.map} +0 -0
- /package/dist/{follow-SS374QUW.js.map → follow-A46RAJEX.js.map} +0 -0
- /package/dist/{follow-competitors-3LTOTTBY.js.map → follow-competitors-VU2L3KWF.js.map} +0 -0
- /package/dist/{following-YMA5O3LF.js.map → following-UOUNSU6P.js.map} +0 -0
- /package/dist/{fonts-E3CNWPD5.js.map → fonts-3QW7EDHE.js.map} +0 -0
- /package/dist/{forecast-KOBF5TKM.js.map → forecast-2WVHMSZP.js.map} +0 -0
- /package/dist/{forecast-PWGN4ETP.js.map → forecast-F25LSCM5.js.map} +0 -0
- /package/dist/{funding-KLIZ73SS.js.map → funding-2VROIMLS.js.map} +0 -0
- /package/dist/{funnel-XIZROHV7.js.map → funnel-35DYDBJH.js.map} +0 -0
- /package/dist/{ga4-XPCE4EK5.js.map → ga4-ULHKTF23.js.map} +0 -0
- /package/dist/{generate-GHIXVLMY.js.map → generate-Z7AROAES.js.map} +0 -0
- /package/dist/{get-WS744HAO.js.map → get-4CAX33L2.js.map} +0 -0
- /package/dist/{get-HCGFATFD.js.map → get-ABQZJ2VQ.js.map} +0 -0
- /package/dist/{get-RDTJSWSA.js.map → get-IF7KHMSI.js.map} +0 -0
- /package/dist/{get-XPJ4BZGP.js.map → get-N7X75ZJO.js.map} +0 -0
- /package/dist/{get-SGNT4JG2.js.map → get-ZISAHMTQ.js.map} +0 -0
- /package/dist/{gif-YK5HJXRE.js.map → gif-QLNWBFAH.js.map} +0 -0
- /package/dist/{google-BI45CXMW.js.map → google-FDR55RRD.js.map} +0 -0
- /package/dist/{google-5JV7OMOH.js.map → google-M6XR7YGT.js.map} +0 -0
- /package/dist/{google-ads-DYZGUM6W.js.map → google-ads-NCSMNNND.js.map} +0 -0
- /package/dist/{group-7OWIYAKJ.js.map → group-HAQM6P7M.js.map} +0 -0
- /package/dist/{group-H6ZYRPE6.js.map → group-XVDH2ONO.js.map} +0 -0
- /package/dist/{gsc-HI2KXDEU.js.map → gsc-72AFO6B4.js.map} +0 -0
- /package/dist/{history-3EQQHYKT.js.map → history-FGQ2H7XH.js.map} +0 -0
- /package/dist/{history-SQPJ7PPE.js.map → history-LTOFKBMJ.js.map} +0 -0
- /package/dist/{history-RD2YMNNL.js.map → history-VJ254UXF.js.map} +0 -0
- /package/dist/{hubspot-MYTV36SM.js.map → hubspot-W2NM75YK.js.map} +0 -0
- /package/dist/{icon-HLJCWTR3.js.map → icon-F7AOOTFI.js.map} +0 -0
- /package/dist/{ideas-CVXHFVX7.js.map → ideas-54KFDNDM.js.map} +0 -0
- /package/dist/{images-XP4TKE2F.js.map → images-JOEVCCP6.js.map} +0 -0
- /package/dist/{improve-BRC4R6MW.js.map → improve-LIKOER3S.js.map} +0 -0
- /package/dist/{ingest-4GNJ2PWL.js.map → ingest-6R7XUL46.js.map} +0 -0
- /package/dist/{insights-IVW6W5CP.js.map → insights-QNE6XCBA.js.map} +0 -0
- /package/dist/{insights-CN3GUTT7.js.map → insights-UXUUOQB7.js.map} +0 -0
- /package/dist/{inspect-25IVRU45.js.map → inspect-MGOR77FP.js.map} +0 -0
- /package/dist/{inspiration-D75DO3MD.js.map → inspiration-VXNGKAJV.js.map} +0 -0
- /package/dist/{instant-experiences-6F6GXZ67.js.map → instant-experiences-MT2XMQNH.js.map} +0 -0
- /package/dist/{intent-3GDLPKKN.js.map → intent-FZWPRUCI.js.map} +0 -0
- /package/dist/{job-2JJNKUHT.js.map → job-TS34W4IU.js.map} +0 -0
- /package/dist/{job-create-BNTNZCSP.js.map → job-create-FXXDR2EE.js.map} +0 -0
- /package/dist/{job-status-N7RWRDRO.js.map → job-status-R2H4HNC5.js.map} +0 -0
- /package/dist/{keep-Z2WH3CKU.js.map → keep-YSU3XMW3.js.map} +0 -0
- /package/dist/{keyword-gap-B2WPVHOB.js.map → keyword-gap-4ECYPWXJ.js.map} +0 -0
- /package/dist/{keyword-metrics-UDGWN7BO.js.map → keyword-metrics-SBIRN5KC.js.map} +0 -0
- /package/dist/{keywords-for-site-GEG6AXD3.js.map → keywords-for-site-TLNPJHT2.js.map} +0 -0
- /package/dist/{knowledge-PKXPN4RV.js.map → knowledge-L3VLOVLG.js.map} +0 -0
- /package/dist/{landing-O2ZUIUGE.js.map → landing-ZICSVWKF.js.map} +0 -0
- /package/dist/{landings-7QRITXZ2.js.map → landings-XTPNPTHN.js.map} +0 -0
- /package/dist/{languages-RZLMZR57.js.map → languages-DIKRMAYE.js.map} +0 -0
- /package/dist/{languages-UJAOPTV2.js.map → languages-VNZQ5USL.js.map} +0 -0
- /package/dist/{launches-4H6ANGTG.js.map → launches-5R7EUONQ.js.map} +0 -0
- /package/dist/{layerize-P5LFIA4X.js.map → layerize-Q2QWDARG.js.map} +0 -0
- /package/dist/{lead-routes-WVXWVG62.js.map → lead-routes-IXUCGINI.js.map} +0 -0
- /package/dist/{leads-MTTOYNPM.js.map → leads-JUQFNK55.js.map} +0 -0
- /package/dist/{leads-CJKRKB2Q.js.map → leads-UVG6VYAC.js.map} +0 -0
- /package/dist/{learn-QPXZZIZZ.js.map → learn-A6BT25LQ.js.map} +0 -0
- /package/dist/{library-VW27X75P.js.map → library-G5YAFLTR.js.map} +0 -0
- /package/dist/{lighthouse-FGUFJRGR.js.map → lighthouse-BCBV2XGP.js.map} +0 -0
- /package/dist/{line-item-writes-RVOAMJ5R.js.map → line-item-writes-NW7A6HNH.js.map} +0 -0
- /package/dist/{line-items-POZRAJLC.js.map → line-items-OAG3QMDE.js.map} +0 -0
- /package/dist/{link-IXEZKRM7.js.map → link-4VJ7FSOA.js.map} +0 -0
- /package/dist/{linkedin-5PYG5HEM.js.map → linkedin-CKOWKD4M.js.map} +0 -0
- /package/dist/{linkedin-person-EMJXEZYR.js.map → linkedin-person-C22IDK7S.js.map} +0 -0
- /package/dist/{list-OZCU2T22.js.map → list-2DKLO6AO.js.map} +0 -0
- /package/dist/{list-7GDMM26I.js.map → list-4SDJZVOL.js.map} +0 -0
- /package/dist/{list-UG4V5AM2.js.map → list-6YW4I4VG.js.map} +0 -0
- /package/dist/{list-4KS7WSUG.js.map → list-CDDXHMJQ.js.map} +0 -0
- /package/dist/{list-PTK2HOUY.js.map → list-GS42LK5C.js.map} +0 -0
- /package/dist/{list-Q5LVTPQP.js.map → list-HWNHRWGB.js.map} +0 -0
- /package/dist/{list-J5KWXHFO.js.map → list-QSBEYU45.js.map} +0 -0
- /package/dist/{list-DVVOP6FM.js.map → list-ZFGOONWL.js.map} +0 -0
- /package/dist/{list-XOYU7UTX.js.map → list-ZORO7PFP.js.map} +0 -0
- /package/dist/{locations-VJX64ZZR.js.map → locations-4RDUHKVR.js.map} +0 -0
- /package/dist/{locations-EISZ6JOT.js.map → locations-HATR6PSC.js.map} +0 -0
- /package/dist/{log-2F2N24DT.js.map → log-OSJHKHPV.js.map} +0 -0
- /package/dist/{logo-H2KHGLYD.js.map → logo-ABO4HJRG.js.map} +0 -0
- /package/dist/{lookup-K57ITJWF.js.map → lookup-SPNT3W3W.js.map} +0 -0
- /package/dist/{make-T6HLXIYY.js.map → make-7CIVNW77.js.map} +0 -0
- /package/dist/{map-QGJZIC5N.js.map → map-PMGZDXAN.js.map} +0 -0
- /package/dist/{mcp-RSW7KAWP.js.map → mcp-MOOOTRYG.js.map} +0 -0
- /package/dist/{media-K5RJXLTN.js.map → media-CIJW2Q3I.js.map} +0 -0
- /package/dist/{media-HDHZULQ7.js.map → media-GZKW2PZB.js.map} +0 -0
- /package/dist/{media-sources-7R7FO53Y.js.map → media-sources-5OYCKQ5J.js.map} +0 -0
- /package/dist/{members-B6TKGGT5.js.map → members-QG5IP5HM.js.map} +0 -0
- /package/dist/{meme-QMCUGXUE.js.map → meme-BPWX7YQH.js.map} +0 -0
- /package/dist/{meta-MOSJVYIE.js.map → meta-KVOSCSPJ.js.map} +0 -0
- /package/dist/{metrics-PRIKXVYZ.js.map → metrics-R4YS2JL6.js.map} +0 -0
- /package/dist/{models-M3E4YFCT.js.map → models-RJMZV5SH.js.map} +0 -0
- /package/dist/{normalize-5B4EQLUX.js.map → normalize-LATTXSL3.js.map} +0 -0
- /package/dist/{normalize-5QIGANTK.js.map → normalize-NMNOJ6Q5.js.map} +0 -0
- /package/dist/{options-K33CJOR6.js.map → options-KALH5TB7.js.map} +0 -0
- /package/dist/{organization-A4NFWWWI.js.map → organization-AGCF7DUJ.js.map} +0 -0
- /package/dist/{output-U5ZV6PST.js.map → output-34QMC3OU.js.map} +0 -0
- /package/dist/{page-XVOUD4VV.js.map → page-UDF3LJHP.js.map} +0 -0
- /package/dist/{page-photos-4JTIKXAW.js.map → page-photos-FCBW5UZS.js.map} +0 -0
- /package/dist/{pages-BAUS7LQM.js.map → pages-5W5G4MRB.js.map} +0 -0
- /package/dist/{performance-MHJDRLEK.js.map → performance-SITVZQWX.js.map} +0 -0
- /package/dist/{performance-NVURSEZ6.js.map → performance-YNXPUSGJ.js.map} +0 -0
- /package/dist/{pinterest-NA6HGPMB.js.map → pinterest-IABDXLF5.js.map} +0 -0
- /package/dist/{pixels-QOSEYXCP.js.map → pixels-4QAWLSEL.js.map} +0 -0
- /package/dist/{pixels-THDQD3RF.js.map → pixels-TYJVE377.js.map} +0 -0
- /package/dist/{plan-JYSHKPZQ.js.map → plan-I6EFL7RC.js.map} +0 -0
- /package/dist/{posts-ILAFADBW.js.map → posts-SXQSLOFV.js.map} +0 -0
- /package/dist/{preview-X6EJGPAY.js.map → preview-7Y5LE24E.js.map} +0 -0
- /package/dist/{profile-YHI65VGK.js.map → profile-R5VPOOJU.js.map} +0 -0
- /package/dist/{promoted-tweet-writes-MXXVRLVQ.js.map → promoted-tweet-writes-NAHPJ3VD.js.map} +0 -0
- /package/dist/{promoted-tweets-HFLGXWX2.js.map → promoted-tweets-2XQ4MWAC.js.map} +0 -0
- /package/dist/{properties-ZLY6NYVK.js.map → properties-2D2BIDGC.js.map} +0 -0
- /package/dist/{publish-6ZXFUBGP.js.map → publish-UITYPUBD.js.map} +0 -0
- /package/dist/{query-HFHTLNDN.js.map → query-LB5H7IRK.js.map} +0 -0
- /package/dist/{query-ELD7WSFR.js.map → query-NDOYOIHL.js.map} +0 -0
- /package/dist/{query-WMEX73ZB.js.map → query-RE7NB2BK.js.map} +0 -0
- /package/dist/{questionnaire-Y37I64FO.js.map → questionnaire-U767HYDE.js.map} +0 -0
- /package/dist/{read-2HQEZIJW.js.map → read-3TCDDALC.js.map} +0 -0
- /package/dist/{reddit-BIHGJPGP.js.map → reddit-6XIARCTX.js.map} +0 -0
- /package/dist/{refresh-4O32S4YR.js.map → refresh-6UCN7PDX.js.map} +0 -0
- /package/dist/{refresh-LVV4SPLT.js.map → refresh-GIB6QQZS.js.map} +0 -0
- /package/dist/{release-VIPNSPQ5.js.map → release-IN65L23O.js.map} +0 -0
- /package/dist/{relevant-pages-B5SYN575.js.map → relevant-pages-W7IM6YQW.js.map} +0 -0
- /package/dist/{remove-TPOWWFZ6.js.map → remove-LZQHDFZF.js.map} +0 -0
- /package/dist/{remove-2E77743U.js.map → remove-X3XWVE2M.js.map} +0 -0
- /package/dist/{reopen-UOBTJBMQ.js.map → reopen-RMMQ55CH.js.map} +0 -0
- /package/dist/{rerun-UPDIXTEL.js.map → rerun-ON6YCJAL.js.map} +0 -0
- /package/dist/{research-ELM3KHGE.js.map → research-LZBPCXIW.js.map} +0 -0
- /package/dist/{research-FOJIDMSE.js.map → research-W5KUOBXZ.js.map} +0 -0
- /package/dist/{reset-FTLWUFZK.js.map → reset-MUWXTLIB.js.map} +0 -0
- /package/dist/{reset-GIXXLPHQ.js.map → reset-VQNKXFAF.js.map} +0 -0
- /package/dist/{resolve-QHR5JJTJ.js.map → resolve-DMGWLMTC.js.map} +0 -0
- /package/dist/{retry-NY5KFEDA.js.map → retry-YI4YLYTQ.js.map} +0 -0
- /package/dist/{retry-HNWXJR5U.js.map → retry-ZQUJPKQH.js.map} +0 -0
- /package/dist/{retry-failed-OAH7JQKD.js.map → retry-failed-PEAUXGNT.js.map} +0 -0
- /package/dist/{revenue-JFMUODJO.js.map → revenue-6YZAOMF6.js.map} +0 -0
- /package/dist/{rule-writes-A4BFYHPA.js.map → rule-writes-G25O5JZS.js.map} +0 -0
- /package/dist/{rules-56E55SGC.js.map → rules-FHVZEN4D.js.map} +0 -0
- /package/dist/{rules-HLREXY2M.js.map → rules-KSOAKEI3.js.map} +0 -0
- /package/dist/{rules-add-ZOPOWJMY.js.map → rules-add-7X46VTIJ.js.map} +0 -0
- /package/dist/{run-4UIPMCSN.js.map → run-TA6HYFKZ.js.map} +0 -0
- /package/dist/{run-GACZDI6Q.js.map → run-YORKHK6S.js.map} +0 -0
- /package/dist/{scaffold-ad-Z2HSN4PE.js.map → scaffold-ad-RHSHBCVV.js.map} +0 -0
- /package/dist/{scaffold-static-ad-ODZGTIM5.js.map → scaffold-static-ad-XNOGCMPF.js.map} +0 -0
- /package/dist/{scaffold-video-EHGAMEEP.js.map → scaffold-video-XEVJQ7QZ.js.map} +0 -0
- /package/dist/{schedule-ZATNBBWD.js.map → schedule-TMTLYULK.js.map} +0 -0
- /package/dist/{schedule-OFPSZVZ2.js.map → schedule-TNF6M6UD.js.map} +0 -0
- /package/dist/{scheduled-agents-4VY4CAA2.js.map → scheduled-agents-TS3WLRCM.js.map} +0 -0
- /package/dist/{schema-EYGPETLF.js.map → schema-2YQAQVON.js.map} +0 -0
- /package/dist/{schema-OGP4DUPP.js.map → schema-6S5ZEPBS.js.map} +0 -0
- /package/dist/{scrape-ZHL2BHS7.js.map → scrape-FDBYU3TU.js.map} +0 -0
- /package/dist/{screenshot-ADMRDYWN.js.map → screenshot-QSRWL4J6.js.map} +0 -0
- /package/dist/{search-CQUS7EOM.js.map → search-BOCQFUM3.js.map} +0 -0
- /package/dist/{search-MKVVMJ2Q.js.map → search-CENPR7GA.js.map} +0 -0
- /package/dist/{search-HF5ECIYW.js.map → search-GEXDRTAQ.js.map} +0 -0
- /package/dist/{search-6W4HXR2S.js.map → search-LFTFNDMC.js.map} +0 -0
- /package/dist/{search-QUF6LHQ5.js.map → search-LTUUAGZG.js.map} +0 -0
- /package/dist/{search-6ZWI2NML.js.map → search-PYLNVZXI.js.map} +0 -0
- /package/dist/{search-copy-O6FDX4HT.js.map → search-copy-RLRRR3LB.js.map} +0 -0
- /package/dist/{seeds-5TM3O3K3.js.map → seeds-E2GLHJ2T.js.map} +0 -0
- /package/dist/{select-FCQUYBKV.js.map → select-BXBNFGVL.js.map} +0 -0
- /package/dist/{sends-MZKHZZGJ.js.map → sends-NBTGBZT7.js.map} +0 -0
- /package/dist/{sequences-3CEVHGHB.js.map → sequences-UOIHUOD3.js.map} +0 -0
- /package/dist/{set-prompt-IBAG6BDA.js.map → set-prompt-JJWBB23C.js.map} +0 -0
- /package/dist/{setup-links-4STQ5B4P.js.map → setup-links-6ANVKZCE.js.map} +0 -0
- /package/dist/{shared-I3SB77VH.js.map → shared-IMDHTVSW.js.map} +0 -0
- /package/dist/{shopify-7LDHCWUQ.js.map → shopify-6ISTKZCA.js.map} +0 -0
- /package/dist/{site-I3NFMPJB.js.map → site-OIV55MGO.js.map} +0 -0
- /package/dist/{sitemaps-PLAWVXQL.js.map → sitemaps-6A6JFBV4.js.map} +0 -0
- /package/dist/{sites-WX2IBTZT.js.map → sites-PZLE5FFV.js.map} +0 -0
- /package/dist/{skills-O6EQOAMQ.js.map → skills-FBIVWINH.js.map} +0 -0
- /package/dist/{sources-ZM7LEIMM.js.map → sources-5L4S5BQV.js.map} +0 -0
- /package/dist/{sources-K2LILGTW.js.map → sources-GLJWZFHZ.js.map} +0 -0
- /package/dist/{stale-VR5QAYB6.js.map → stale-SK2SDGOT.js.map} +0 -0
- /package/dist/{stats-QQRYOMZA.js.map → stats-2NLNQBRY.js.map} +0 -0
- /package/dist/{status-5OMVGFCH.js.map → status-TD7ISXC5.js.map} +0 -0
- /package/dist/{sticker-654HS3K2.js.map → sticker-4NKFAGEK.js.map} +0 -0
- /package/dist/{stock-35LOO3YN.js.map → stock-XOXZGGU3.js.map} +0 -0
- /package/dist/{studies-IGOCWM7F.js.map → studies-C5IINK5Y.js.map} +0 -0
- /package/dist/{studio-3D42TUJX.js.map → studio-IDNM42JP.js.map} +0 -0
- /package/dist/{study-writes-Z5P2W7JH.js.map → study-writes-GJXLMM3D.js.map} +0 -0
- /package/dist/{suggest-JASHCOL5.js.map → suggest-Z553OSYW.js.map} +0 -0
- /package/dist/{sync-URIRLHTS.js.map → sync-CIRDY55O.js.map} +0 -0
- /package/dist/{sync-RCDODSOD.js.map → sync-PVIFUXX3.js.map} +0 -0
- /package/dist/{sync-6AN67IX3.js.map → sync-UBOHNOXB.js.map} +0 -0
- /package/dist/{sync-definition-MZUJOJYI.js.map → sync-definition-7NBT6LTK.js.map} +0 -0
- /package/dist/{tag-7YMFAZQQ.js.map → tag-22TFBGDG.js.map} +0 -0
- /package/dist/{tag-manager-LU4GAZ6R.js.map → tag-manager-QLZHU6NG.js.map} +0 -0
- /package/dist/{tags-6A7QOYBI.js.map → tags-3HB7N5WB.js.map} +0 -0
- /package/dist/{tags-JHT3Q6VO.js.map → tags-DG3XQ4SF.js.map} +0 -0
- /package/dist/{tags-MTVZJHCE.js.map → tags-T4EN6XYE.js.map} +0 -0
- /package/dist/{tags-KSMLT4G2.js.map → tags-T6THTVNP.js.map} +0 -0
- /package/dist/{tags-OU32R2SH.js.map → tags-XY6R2VJ6.js.map} +0 -0
- /package/dist/{targeting-7HXKBXWY.js.map → targeting-GNEBULXU.js.map} +0 -0
- /package/dist/{targeting-constants-QIB3UZHM.js.map → targeting-constants-GR6BVM2H.js.map} +0 -0
- /package/dist/{targeting-criteria-NUXZB7NP.js.map → targeting-criteria-CL472KJO.js.map} +0 -0
- /package/dist/{targets-LQ7HGI73.js.map → targets-7AQMSO6H.js.map} +0 -0
- /package/dist/{terms-X4OJWTQH.js.map → terms-LG7FYQOG.js.map} +0 -0
- /package/dist/{testimonials-Z2KOOMVH.js.map → testimonials-4QWVSEPU.js.map} +0 -0
- /package/dist/{themes-6KVP3COR.js.map → themes-ZTM4OVGK.js.map} +0 -0
- /package/dist/{top-companies-WWNPUJ23.js.map → top-companies-PMFYOAFK.js.map} +0 -0
- /package/dist/{transcript-P7HKVABU.js.map → transcript-YWFYNFWX.js.map} +0 -0
- /package/dist/{translate-II4JY2XW.js.map → translate-VMQHPX4B.js.map} +0 -0
- /package/dist/{triggers-Z3LV3KJR.js.map → triggers-JKXISN45.js.map} +0 -0
- /package/dist/{tweets-X5PTAT6F.js.map → tweets-IF5FFFTH.js.map} +0 -0
- /package/dist/{unfollow-S5LHFLGW.js.map → unfollow-CDUOZWM7.js.map} +0 -0
- /package/dist/{unlink-XTZA474P.js.map → unlink-IUAFDLBT.js.map} +0 -0
- /package/dist/{unstage-AVLORZLW.js.map → unstage-OVOZE6DA.js.map} +0 -0
- /package/dist/{unstage-QXOL5DXZ.js.map → unstage-ZYT5RNLK.js.map} +0 -0
- /package/dist/{update-UE4XVBKL.js.map → update-23Q4T2J5.js.map} +0 -0
- /package/dist/{update-5ZNS2DKP.js.map → update-74VME6PN.js.map} +0 -0
- /package/dist/{update-MDVZ24VQ.js.map → update-O22DAZVX.js.map} +0 -0
- /package/dist/{update-DDKNKV6M.js.map → update-Q3WJ3DQN.js.map} +0 -0
- /package/dist/{update-3NA6ABLW.js.map → update-QAWK3O7L.js.map} +0 -0
- /package/dist/{upload-SYFB2VTJ.js.map → upload-EAEILUQB.js.map} +0 -0
- /package/dist/{upscale-P5EYUVOZ.js.map → upscale-HB6L6SZG.js.map} +0 -0
- /package/dist/{url-options-DJZV3ADK.js.map → url-options-M7RX2TD4.js.map} +0 -0
- /package/dist/{url-params-Y5XQSDEF.js.map → url-params-E5ON6W2N.js.map} +0 -0
- /package/dist/{validate-BCK22BQL.js.map → validate-NB6PS5PF.js.map} +0 -0
- /package/dist/{variant-JQVZUUA4.js.map → variant-O7LXOA2E.js.map} +0 -0
- /package/dist/{videos-YCQVOOFE.js.map → videos-SS2Y6FJF.js.map} +0 -0
- /package/dist/{view-IKKRJ5YD.js.map → view-ED636LWD.js.map} +0 -0
- /package/dist/{viewer-check-5GREZIVJ.js.map → viewer-check-CWS6OVM7.js.map} +0 -0
- /package/dist/{web-7TPDDBI6.js.map → web-HT22JFQR.js.map} +0 -0
- /package/dist/{winners-4PKEVMUC.js.map → winners-ZG5SHNBS.js.map} +0 -0
- /package/dist/{winning-ads-7X5EWSJX.js.map → winning-ads-FXTP4PWZ.js.map} +0 -0
- /package/dist/{write-commands-V77MD5SC.js.map → write-commands-5YVQKO7E.js.map} +0 -0
- /package/dist/{write-commands-CTLF2M6L.js.map → write-commands-AIWR7NBO.js.map} +0 -0
- /package/dist/{write-commands-FIS6Y2MN.js.map → write-commands-UK6MKGHI.js.map} +0 -0
- /package/dist/{write-commands-CY734U34.js.map → write-commands-W3UN6F4Y.js.map} +0 -0
- /package/dist/{x-EMLFCHSG.js.map → x-KEMAY75C.js.map} +0 -0
|
@@ -0,0 +1,1744 @@
|
|
|
1
|
+
import {
|
|
2
|
+
YT_DLP_BIN,
|
|
3
|
+
YtDlpError,
|
|
4
|
+
runYtDlp
|
|
5
|
+
} from "./chunk-YJYKSMLF.js";
|
|
6
|
+
import {
|
|
7
|
+
fetchExternalBytes
|
|
8
|
+
} from "./chunk-L763CNKH.js";
|
|
9
|
+
import {
|
|
10
|
+
debugLogHttp,
|
|
11
|
+
readBodyForLog
|
|
12
|
+
} from "./chunk-O7AMKMII.js";
|
|
13
|
+
import {
|
|
14
|
+
API_KEY_FORMAT_MESSAGE,
|
|
15
|
+
canvasAssetOriginsSetting,
|
|
16
|
+
isBakerApiKey
|
|
17
|
+
} from "./chunk-VPF5A7CM.js";
|
|
18
|
+
|
|
19
|
+
// src/engine/engine/errors.ts
|
|
20
|
+
function isBlocking(issue) {
|
|
21
|
+
return issue.severity !== "warning";
|
|
22
|
+
}
|
|
23
|
+
var CanvasError = class extends Error {
|
|
24
|
+
constructor(message2) {
|
|
25
|
+
super(message2);
|
|
26
|
+
this.name = "CanvasError";
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
var ValidationError = class extends CanvasError {
|
|
30
|
+
issues;
|
|
31
|
+
constructor(issues) {
|
|
32
|
+
const head = issues[0];
|
|
33
|
+
const summary = head ? `${head.code}: ${head.message}` : "canvas validation failed";
|
|
34
|
+
super(`${issues.length} validation issue(s): ${summary}`);
|
|
35
|
+
this.name = "ValidationError";
|
|
36
|
+
this.issues = issues;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
var NodeExecutionError = class extends CanvasError {
|
|
40
|
+
nodeId;
|
|
41
|
+
nodeType;
|
|
42
|
+
cause;
|
|
43
|
+
constructor(nodeId, nodeType, cause) {
|
|
44
|
+
super(`node ${nodeId} (${nodeType}) failed: ${describeCause(cause)}`);
|
|
45
|
+
this.name = "NodeExecutionError";
|
|
46
|
+
this.nodeId = nodeId;
|
|
47
|
+
this.nodeType = nodeType;
|
|
48
|
+
this.cause = cause;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
var RunAbortedError = class extends CanvasError {
|
|
52
|
+
reason;
|
|
53
|
+
constructor(reason, message2) {
|
|
54
|
+
super(message2);
|
|
55
|
+
this.name = "RunAbortedError";
|
|
56
|
+
this.reason = reason;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
var LayerExecutionError = class extends CanvasError {
|
|
60
|
+
failures;
|
|
61
|
+
constructor(failures) {
|
|
62
|
+
const ids = failures.map((f) => f.nodeId).join(", ");
|
|
63
|
+
super(`${failures.length} nodes failed in one layer: ${ids}`);
|
|
64
|
+
this.name = "LayerExecutionError";
|
|
65
|
+
this.failures = failures;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
function describeFailureReason(reason) {
|
|
69
|
+
return reason instanceof Error ? reason.message : String(reason);
|
|
70
|
+
}
|
|
71
|
+
function isInputRejection(reason) {
|
|
72
|
+
if (!(reason instanceof NodeExecutionError) || reason.cause.kind !== "remote") return false;
|
|
73
|
+
const { status, provider } = reason.cause;
|
|
74
|
+
return (status === 400 || status === 422) && provider === void 0;
|
|
75
|
+
}
|
|
76
|
+
function runFailureCode(e) {
|
|
77
|
+
const reasons = e instanceof LayerExecutionError ? e.failures.map((f) => f.reason) : [e];
|
|
78
|
+
return reasons.length > 0 && reasons.every(isInputRejection) ? "input_invalid" : "runtime";
|
|
79
|
+
}
|
|
80
|
+
function failureDetail(reason) {
|
|
81
|
+
if (reason instanceof NodeExecutionError) {
|
|
82
|
+
const c = reason.cause;
|
|
83
|
+
switch (c.kind) {
|
|
84
|
+
case "remote":
|
|
85
|
+
return {
|
|
86
|
+
message: c.message,
|
|
87
|
+
code: c.code,
|
|
88
|
+
provider: c.provider,
|
|
89
|
+
retryable: c.retryable ?? (c.status >= 500 || c.status === 429)
|
|
90
|
+
};
|
|
91
|
+
case "timeout":
|
|
92
|
+
return {
|
|
93
|
+
message: `timed out${c.provider ? ` (${c.provider})` : ""}`,
|
|
94
|
+
code: "timeout",
|
|
95
|
+
provider: c.provider,
|
|
96
|
+
retryable: true
|
|
97
|
+
};
|
|
98
|
+
case "content_policy":
|
|
99
|
+
return { message: c.message, code: "content_policy", provider: c.provider, retryable: false };
|
|
100
|
+
case "network":
|
|
101
|
+
return {
|
|
102
|
+
message: c.cause instanceof Error ? c.cause.message : "network error",
|
|
103
|
+
code: "network",
|
|
104
|
+
retryable: true
|
|
105
|
+
};
|
|
106
|
+
case "local":
|
|
107
|
+
return { message: c.cause instanceof Error ? c.cause.message : String(c.cause), code: "local" };
|
|
108
|
+
default: {
|
|
109
|
+
const _exhaustive = c;
|
|
110
|
+
return { message: String(_exhaustive) };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return { message: describeFailureReason(reason) };
|
|
115
|
+
}
|
|
116
|
+
function retryVerdict(retryable) {
|
|
117
|
+
if (retryable === true) return "transient \u2014 retry the run";
|
|
118
|
+
if (retryable === false) return "not retryable \u2014 retrying will not help, fix the input";
|
|
119
|
+
return "retryability unknown";
|
|
120
|
+
}
|
|
121
|
+
function describeCause(c) {
|
|
122
|
+
switch (c.kind) {
|
|
123
|
+
case "local":
|
|
124
|
+
return c.cause instanceof Error ? c.cause.message : String(c.cause);
|
|
125
|
+
case "remote":
|
|
126
|
+
return `[${c.code}] ${c.message}${c.provider ? ` (${c.provider})` : ""} \u2014 ${retryVerdict(c.retryable)}`;
|
|
127
|
+
case "timeout":
|
|
128
|
+
return `timeout${c.provider ? ` (${c.provider})` : ""}`;
|
|
129
|
+
case "network":
|
|
130
|
+
return c.cause instanceof Error ? `network: ${c.cause.message}` : "network error";
|
|
131
|
+
case "content_policy":
|
|
132
|
+
return `CONTENT_POLICY_BLOCKED${c.provider ? ` (${c.provider})` : ""}: ${c.message}`;
|
|
133
|
+
default: {
|
|
134
|
+
const _exhaustive = c;
|
|
135
|
+
return String(_exhaustive);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// src/engine/storage/sha256.ts
|
|
141
|
+
import { createHash } from "crypto";
|
|
142
|
+
function sha256Hex(input) {
|
|
143
|
+
const h = createHash("sha256");
|
|
144
|
+
h.update(input);
|
|
145
|
+
return h.digest("hex");
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// src/engine/storage/asset-store.ts
|
|
149
|
+
import { randomUUID } from "crypto";
|
|
150
|
+
import { createWriteStream } from "fs";
|
|
151
|
+
import { mkdir, readFile, rename, stat, unlink, writeFile } from "fs/promises";
|
|
152
|
+
import path from "path";
|
|
153
|
+
import { Readable, Transform } from "stream";
|
|
154
|
+
import { pipeline } from "stream/promises";
|
|
155
|
+
var MAX_ASSET_BYTES = 2 * 1024 * 1024 * 1024;
|
|
156
|
+
var MIME_TO_EXT = {
|
|
157
|
+
"image/png": "png",
|
|
158
|
+
"image/jpeg": "jpg",
|
|
159
|
+
"image/webp": "webp",
|
|
160
|
+
"image/gif": "gif",
|
|
161
|
+
"image/avif": "avif",
|
|
162
|
+
"video/mp4": "mp4",
|
|
163
|
+
"video/webm": "webm",
|
|
164
|
+
"video/quicktime": "mov",
|
|
165
|
+
"audio/mpeg": "mp3",
|
|
166
|
+
"audio/wav": "wav",
|
|
167
|
+
"audio/x-wav": "wav",
|
|
168
|
+
"audio/ogg": "ogg",
|
|
169
|
+
"audio/mp4": "m4a",
|
|
170
|
+
"application/json": "json",
|
|
171
|
+
"text/plain": "txt",
|
|
172
|
+
"text/markdown": "md",
|
|
173
|
+
"text/html": "html",
|
|
174
|
+
"font/ttf": "ttf",
|
|
175
|
+
"font/otf": "otf",
|
|
176
|
+
"font/woff": "woff",
|
|
177
|
+
"font/woff2": "woff2"
|
|
178
|
+
};
|
|
179
|
+
function extForMime(mime) {
|
|
180
|
+
return MIME_TO_EXT[mime] ?? "bin";
|
|
181
|
+
}
|
|
182
|
+
var LocalAssetStore = class {
|
|
183
|
+
rootDir;
|
|
184
|
+
fetchFn;
|
|
185
|
+
maxRemoteAssetBytes;
|
|
186
|
+
constructor(rootDir, fetchFn = fetch, opts) {
|
|
187
|
+
this.rootDir = rootDir;
|
|
188
|
+
this.fetchFn = fetchFn;
|
|
189
|
+
this.maxRemoteAssetBytes = opts?.maxRemoteAssetBytes ?? MAX_ASSET_BYTES;
|
|
190
|
+
}
|
|
191
|
+
pathFor(sha, mime) {
|
|
192
|
+
const ext = extForMime(mime);
|
|
193
|
+
const shard = sha.slice(0, 2);
|
|
194
|
+
return path.join(this.rootDir, shard, `${sha}.${ext}`);
|
|
195
|
+
}
|
|
196
|
+
async exists(sha, mime) {
|
|
197
|
+
try {
|
|
198
|
+
await stat(this.pathFor(sha, mime));
|
|
199
|
+
return true;
|
|
200
|
+
} catch {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
readBytes(sha, mime) {
|
|
205
|
+
return readFile(this.pathFor(sha, mime));
|
|
206
|
+
}
|
|
207
|
+
async ingestBytes(args) {
|
|
208
|
+
const sha = sha256Hex(args.bytes);
|
|
209
|
+
const dest = this.pathFor(sha, args.mime);
|
|
210
|
+
await mkdir(path.dirname(dest), { recursive: true });
|
|
211
|
+
if (!await this.exists(sha, args.mime)) {
|
|
212
|
+
const tmp = `${dest}.tmp-${process.pid}-${randomUUID()}`;
|
|
213
|
+
await writeFile(tmp, args.bytes);
|
|
214
|
+
await rename(tmp, dest);
|
|
215
|
+
}
|
|
216
|
+
return buildRef({ kind: args.kind, sha, mime: args.mime, path: dest, metadata: args.metadata });
|
|
217
|
+
}
|
|
218
|
+
async ingestRemote(args) {
|
|
219
|
+
const dest = this.pathFor(args.sha256, args.mime);
|
|
220
|
+
let bytes;
|
|
221
|
+
if (await this.exists(args.sha256, args.mime)) {
|
|
222
|
+
bytes = await readFile(dest);
|
|
223
|
+
} else {
|
|
224
|
+
await mkdir(path.dirname(dest), { recursive: true });
|
|
225
|
+
const res = await this.fetchFn(args.url);
|
|
226
|
+
if (!res.ok || !res.body) {
|
|
227
|
+
throw new Error(`asset-store: fetch ${args.url} \u2192 ${res.status}`);
|
|
228
|
+
}
|
|
229
|
+
const declared = Number(res.headers.get("content-length"));
|
|
230
|
+
if (Number.isFinite(declared) && declared > this.maxRemoteAssetBytes) {
|
|
231
|
+
throw new Error(
|
|
232
|
+
`asset-store: ${args.url} is ${declared} bytes, exceeds the ${this.maxRemoteAssetBytes} byte limit`
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
const tmp = `${dest}.tmp-${process.pid}-${randomUUID()}`;
|
|
236
|
+
try {
|
|
237
|
+
await pipeline(
|
|
238
|
+
Readable.fromWeb(res.body),
|
|
239
|
+
byteLimit(args.url, this.maxRemoteAssetBytes),
|
|
240
|
+
createWriteStream(tmp)
|
|
241
|
+
);
|
|
242
|
+
const written = await readFile(tmp);
|
|
243
|
+
const computed = sha256Hex(written);
|
|
244
|
+
if (computed !== args.sha256 && !cdnReencodedImage(res, args.kind)) {
|
|
245
|
+
throw new Error(`asset-store: sha mismatch for ${args.url} (got ${computed}, expected ${args.sha256})`);
|
|
246
|
+
}
|
|
247
|
+
await rename(tmp, dest);
|
|
248
|
+
bytes = written;
|
|
249
|
+
} catch (e) {
|
|
250
|
+
await unlink(tmp).catch(() => void 0);
|
|
251
|
+
throw e;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return buildRef({
|
|
255
|
+
kind: args.kind,
|
|
256
|
+
sha: args.sha256,
|
|
257
|
+
mime: args.mime,
|
|
258
|
+
url: args.url,
|
|
259
|
+
path: dest,
|
|
260
|
+
metadata: args.metadata,
|
|
261
|
+
bytes
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
function cdnReencodedImage(res, kind) {
|
|
266
|
+
return kind === "image" && res.headers.get("cf-polished") !== null;
|
|
267
|
+
}
|
|
268
|
+
function byteLimit(url, maxBytes) {
|
|
269
|
+
let total = 0;
|
|
270
|
+
return new Transform({
|
|
271
|
+
transform(chunk, _enc, cb) {
|
|
272
|
+
total += chunk.length;
|
|
273
|
+
if (total > maxBytes) {
|
|
274
|
+
cb(new Error(`asset-store: ${url} exceeds the ${maxBytes} byte limit (aborted at ${total} bytes)`));
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
cb(null, chunk);
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
function buildRef(args) {
|
|
282
|
+
const base = {
|
|
283
|
+
sha256: args.sha,
|
|
284
|
+
mime: args.mime,
|
|
285
|
+
url: args.url,
|
|
286
|
+
path: args.path,
|
|
287
|
+
metadata: args.metadata
|
|
288
|
+
};
|
|
289
|
+
switch (args.kind) {
|
|
290
|
+
case "image": {
|
|
291
|
+
const { width, height } = args.metadata ?? {};
|
|
292
|
+
return { kind: "image", ...base, width, height };
|
|
293
|
+
}
|
|
294
|
+
case "video": {
|
|
295
|
+
const { width, height, duration_ms } = args.metadata ?? {};
|
|
296
|
+
return { kind: "video", ...base, width, height, duration_ms };
|
|
297
|
+
}
|
|
298
|
+
case "audio": {
|
|
299
|
+
const { duration_ms } = args.metadata ?? {};
|
|
300
|
+
return { kind: "audio", ...base, duration_ms };
|
|
301
|
+
}
|
|
302
|
+
case "json":
|
|
303
|
+
return { kind: "json", ...base };
|
|
304
|
+
case "text":
|
|
305
|
+
return { kind: "text", ...base };
|
|
306
|
+
case "font":
|
|
307
|
+
return { kind: "font", ...base };
|
|
308
|
+
default: {
|
|
309
|
+
const _exhaustive = args.kind;
|
|
310
|
+
throw new Error(`asset-store: unknown kind ${String(_exhaustive)}`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// src/engine/lib/json-walk.ts
|
|
316
|
+
function isContainerObject(value) {
|
|
317
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
318
|
+
}
|
|
319
|
+
function forEachString(value, visit, path3 = "") {
|
|
320
|
+
if (typeof value === "string") {
|
|
321
|
+
visit(value, path3);
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
if (Array.isArray(value)) {
|
|
325
|
+
for (let i = 0; i < value.length; i++) forEachString(value[i], visit, path3 ? `${path3}[${i}]` : `[${i}]`);
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
if (isContainerObject(value)) {
|
|
329
|
+
for (const [k, v] of Object.entries(value)) forEachString(v, visit, path3 ? `${path3}.${k}` : k);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
function forEachObject(value, visit) {
|
|
333
|
+
if (Array.isArray(value)) {
|
|
334
|
+
for (const v of value) forEachObject(v, visit);
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
if (!isContainerObject(value)) return;
|
|
338
|
+
visit(value);
|
|
339
|
+
for (const v of Object.values(value)) forEachObject(v, visit);
|
|
340
|
+
}
|
|
341
|
+
function mapStrings(value, fn) {
|
|
342
|
+
if (typeof value === "string") return fn(value);
|
|
343
|
+
if (Array.isArray(value)) return value.map((v) => mapStrings(v, fn));
|
|
344
|
+
if (isContainerObject(value)) {
|
|
345
|
+
const out = {};
|
|
346
|
+
for (const [k, v] of Object.entries(value)) out[k] = mapStrings(v, fn);
|
|
347
|
+
return out;
|
|
348
|
+
}
|
|
349
|
+
return value;
|
|
350
|
+
}
|
|
351
|
+
function mapObjects(value, replace) {
|
|
352
|
+
if (Array.isArray(value)) return value.map((v) => mapObjects(v, replace));
|
|
353
|
+
if (!isContainerObject(value)) return value;
|
|
354
|
+
const replaced = replace(value);
|
|
355
|
+
if (replaced !== void 0) return replaced;
|
|
356
|
+
const out = {};
|
|
357
|
+
for (const [k, v] of Object.entries(value)) out[k] = mapObjects(v, replace);
|
|
358
|
+
return out;
|
|
359
|
+
}
|
|
360
|
+
async function mapObjectsAsync(value, replace) {
|
|
361
|
+
if (Array.isArray(value)) return Promise.all(value.map((v) => mapObjectsAsync(v, replace)));
|
|
362
|
+
if (!isContainerObject(value)) return value;
|
|
363
|
+
const replaced = replace(value);
|
|
364
|
+
if (replaced !== void 0) return replaced;
|
|
365
|
+
const out = {};
|
|
366
|
+
for (const [k, v] of Object.entries(value)) out[k] = await mapObjectsAsync(v, replace);
|
|
367
|
+
return out;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// src/engine/schema/refs.ts
|
|
371
|
+
import { z as z2 } from "zod";
|
|
372
|
+
|
|
373
|
+
// src/engine/schema/primitives.ts
|
|
374
|
+
import { z } from "zod";
|
|
375
|
+
var Sha256Hex = z.string().regex(/^[0-9a-f]{64}$/, "expected 64-char lower-case hex sha-256");
|
|
376
|
+
var MimeType = z.string().regex(/^[a-zA-Z0-9!#$&^_.+-]+\/[a-zA-Z0-9!#$&^_.+-]+$/, "expected RFC 6838 mime");
|
|
377
|
+
|
|
378
|
+
// src/engine/schema/refs.ts
|
|
379
|
+
var BaseAssetRef = z2.object({
|
|
380
|
+
url: z2.string().url().optional(),
|
|
381
|
+
path: z2.string().optional(),
|
|
382
|
+
sha256: Sha256Hex,
|
|
383
|
+
mime: MimeType,
|
|
384
|
+
metadata: z2.record(z2.string(), z2.unknown()).optional()
|
|
385
|
+
});
|
|
386
|
+
var ImageRef = BaseAssetRef.extend({
|
|
387
|
+
kind: z2.literal("image"),
|
|
388
|
+
width: z2.number().int().positive().optional(),
|
|
389
|
+
height: z2.number().int().positive().optional()
|
|
390
|
+
});
|
|
391
|
+
var VideoRef = BaseAssetRef.extend({
|
|
392
|
+
kind: z2.literal("video"),
|
|
393
|
+
width: z2.number().int().positive().optional(),
|
|
394
|
+
height: z2.number().int().positive().optional(),
|
|
395
|
+
duration_ms: z2.number().nonnegative().optional()
|
|
396
|
+
});
|
|
397
|
+
var AudioRef = BaseAssetRef.extend({
|
|
398
|
+
kind: z2.literal("audio"),
|
|
399
|
+
duration_ms: z2.number().nonnegative().optional()
|
|
400
|
+
});
|
|
401
|
+
var JsonRef = BaseAssetRef.extend({
|
|
402
|
+
kind: z2.literal("json")
|
|
403
|
+
});
|
|
404
|
+
var TextRef = BaseAssetRef.extend({
|
|
405
|
+
kind: z2.literal("text")
|
|
406
|
+
});
|
|
407
|
+
var FontRef = BaseAssetRef.extend({
|
|
408
|
+
kind: z2.literal("font")
|
|
409
|
+
});
|
|
410
|
+
var AssetRef = z2.discriminatedUnion("kind", [ImageRef, VideoRef, AudioRef, JsonRef, TextRef, FontRef]);
|
|
411
|
+
function isObject(v) {
|
|
412
|
+
return Boolean(v) && typeof v === "object";
|
|
413
|
+
}
|
|
414
|
+
var ASSET_KINDS = /* @__PURE__ */ new Set(["image", "video", "audio", "json", "text", "font"]);
|
|
415
|
+
function contentShaOf(v) {
|
|
416
|
+
if (isObject(v) && "sha256" in v && typeof v.sha256 === "string") return v.sha256;
|
|
417
|
+
return null;
|
|
418
|
+
}
|
|
419
|
+
function isAssetRef(v) {
|
|
420
|
+
return isObject(v) && typeof v.kind === "string" && "sha256" in v;
|
|
421
|
+
}
|
|
422
|
+
function isAssetRefArray(v) {
|
|
423
|
+
return Array.isArray(v) && v.length > 0 && v.every(isAssetRef);
|
|
424
|
+
}
|
|
425
|
+
function isUrlOnlyRef(v) {
|
|
426
|
+
return isObject(v) && typeof v.kind === "string" && typeof v.url === "string" && typeof v.sha256 === "string" && typeof v.mime === "string" && typeof v.path !== "string";
|
|
427
|
+
}
|
|
428
|
+
function isStageableRef(v) {
|
|
429
|
+
return isObject(v) && typeof v.kind === "string" && ASSET_KINDS.has(v.kind) && typeof v.mime === "string" && typeof v.sha256 === "string" && (typeof v.url === "string" || typeof v.path === "string");
|
|
430
|
+
}
|
|
431
|
+
function isAssetRefLike(v) {
|
|
432
|
+
return isObject(v) && !Array.isArray(v) && typeof v.sha256 === "string" && typeof v.mime === "string";
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// src/engine/storage/remote-cache-store.ts
|
|
436
|
+
var CANVAS_ASSETS_URL_SEGMENT = "/canvas-assets/";
|
|
437
|
+
function canvasAssetOrigins(setting = canvasAssetOriginsSetting()) {
|
|
438
|
+
return (setting ?? "https://media.withbaker.com,https://media.dev-baker.com").split(",").map((origin) => origin.trim().replace(/\/+$/, "")).filter(Boolean);
|
|
439
|
+
}
|
|
440
|
+
function isCanvasAssetOrigin(url) {
|
|
441
|
+
try {
|
|
442
|
+
const { origin } = new URL(url);
|
|
443
|
+
return canvasAssetOrigins().some((allowed) => {
|
|
444
|
+
try {
|
|
445
|
+
return new URL(allowed).origin === origin;
|
|
446
|
+
} catch {
|
|
447
|
+
return false;
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
} catch {
|
|
451
|
+
return false;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
function parseCanvasAssetUrl(url) {
|
|
455
|
+
let pathname;
|
|
456
|
+
try {
|
|
457
|
+
const parsed = new URL(url);
|
|
458
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return null;
|
|
459
|
+
pathname = parsed.pathname;
|
|
460
|
+
} catch {
|
|
461
|
+
return null;
|
|
462
|
+
}
|
|
463
|
+
const match = /\/canvas-assets\/([0-9a-f]{2})\/([0-9a-f]{64})\.([a-z0-9]+)$/.exec(pathname);
|
|
464
|
+
if (!match) return null;
|
|
465
|
+
const [, shard, sha256, ext] = match;
|
|
466
|
+
if (shard === void 0 || sha256 === void 0 || ext === void 0 || !sha256.startsWith(shard)) return null;
|
|
467
|
+
return { sha256, ext };
|
|
468
|
+
}
|
|
469
|
+
function isPersistedAssetRef(ref) {
|
|
470
|
+
const { url, sha256 } = ref;
|
|
471
|
+
if (typeof url !== "string" || typeof sha256 !== "string") return false;
|
|
472
|
+
return url.includes(`${CANVAS_ASSETS_URL_SEGMENT}${sha256.slice(0, 2)}/${sha256}`) || url.includes(`${CANVAS_ASSETS_URL_SEGMENT}${sha256}`);
|
|
473
|
+
}
|
|
474
|
+
function collectAssetRefLikes(value) {
|
|
475
|
+
const out = [];
|
|
476
|
+
forEachObject(value, (o) => {
|
|
477
|
+
if (isAssetRefLike(o)) out.push(o);
|
|
478
|
+
});
|
|
479
|
+
return out;
|
|
480
|
+
}
|
|
481
|
+
function entryFullyPersisted(entry) {
|
|
482
|
+
return collectAssetRefLikes(entry.outputs).every((ref) => isPersistedAssetRef(ref));
|
|
483
|
+
}
|
|
484
|
+
function stripLocalFields(entry) {
|
|
485
|
+
const clone = JSON.parse(JSON.stringify(entry));
|
|
486
|
+
for (const ref of collectAssetRefLikes(clone.outputs)) {
|
|
487
|
+
delete ref.path;
|
|
488
|
+
delete ref.bytes;
|
|
489
|
+
}
|
|
490
|
+
return clone;
|
|
491
|
+
}
|
|
492
|
+
var RemoteCacheStore = class {
|
|
493
|
+
client;
|
|
494
|
+
log;
|
|
495
|
+
constructor(client, log) {
|
|
496
|
+
this.client = client;
|
|
497
|
+
this.log = log ?? (() => void 0);
|
|
498
|
+
}
|
|
499
|
+
async get(cacheKey) {
|
|
500
|
+
return await this.client.getCacheEntry(cacheKey);
|
|
501
|
+
}
|
|
502
|
+
async put(entry) {
|
|
503
|
+
if (!entryFullyPersisted(entry)) {
|
|
504
|
+
this.log(`[cache ] ${entry.cacheKey.slice(0, 12)}\u2026 has local-only assets, kept local`);
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
const stripped = stripLocalFields(entry);
|
|
508
|
+
if (stripped.refs.length > MAX_REMOTE_REFS) {
|
|
509
|
+
stripped.refs = stripped.refs.slice(0, MAX_REMOTE_REFS);
|
|
510
|
+
}
|
|
511
|
+
await this.client.putCacheEntry(stripped);
|
|
512
|
+
}
|
|
513
|
+
};
|
|
514
|
+
var MAX_REMOTE_REFS = 512;
|
|
515
|
+
var LayeredCacheStore = class {
|
|
516
|
+
rootDir;
|
|
517
|
+
local;
|
|
518
|
+
remote;
|
|
519
|
+
assets;
|
|
520
|
+
log;
|
|
521
|
+
constructor(opts) {
|
|
522
|
+
this.local = opts.local;
|
|
523
|
+
this.remote = opts.remote;
|
|
524
|
+
this.assets = opts.assets;
|
|
525
|
+
this.rootDir = opts.local.rootDir;
|
|
526
|
+
this.log = opts.log ?? (() => void 0);
|
|
527
|
+
}
|
|
528
|
+
async get(cacheKey) {
|
|
529
|
+
const localHit = await this.local.get(cacheKey);
|
|
530
|
+
if (localHit) return localHit;
|
|
531
|
+
let remoteEntry;
|
|
532
|
+
try {
|
|
533
|
+
remoteEntry = await this.remote.get(cacheKey);
|
|
534
|
+
} catch (e) {
|
|
535
|
+
this.log(`[cache ] remote lookup failed (${message(e)}) \u2014 treating as miss`);
|
|
536
|
+
return null;
|
|
537
|
+
}
|
|
538
|
+
if (!remoteEntry) return null;
|
|
539
|
+
let rehydrated;
|
|
540
|
+
try {
|
|
541
|
+
rehydrated = await this.rehydrate(remoteEntry);
|
|
542
|
+
} catch (e) {
|
|
543
|
+
this.log(`[cache ] ${cacheKey.slice(0, 12)}\u2026 rehydration failed (${message(e)}) \u2014 treating as miss`);
|
|
544
|
+
return null;
|
|
545
|
+
}
|
|
546
|
+
await this.local.put(rehydrated);
|
|
547
|
+
return rehydrated;
|
|
548
|
+
}
|
|
549
|
+
async put(entry) {
|
|
550
|
+
await this.local.put(entry);
|
|
551
|
+
try {
|
|
552
|
+
await this.remote.put(entry);
|
|
553
|
+
} catch (e) {
|
|
554
|
+
this.log(`[cache ] remote write failed (${message(e)}) \u2014 entry kept local`);
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Download every referenced asset into the local content-addressed store
|
|
559
|
+
* (sha-verified) and stamp fresh local paths. Any ref that cannot be
|
|
560
|
+
* rehydrated fails the WHOLE entry — a partially-hydrated cache hit would
|
|
561
|
+
* crash materialization later with a far less actionable error.
|
|
562
|
+
*/
|
|
563
|
+
async rehydrate(entry) {
|
|
564
|
+
const clone = JSON.parse(JSON.stringify(entry));
|
|
565
|
+
for (const ref of collectAssetRefLikes(clone.outputs)) {
|
|
566
|
+
if (!isPersistedAssetRef(ref)) {
|
|
567
|
+
throw new Error(`ref ${ref.sha256.slice(0, 12)}\u2026 has no persisted url`);
|
|
568
|
+
}
|
|
569
|
+
const ingested = await this.assets.ingestRemote({
|
|
570
|
+
kind: typeof ref.kind === "string" ? ref.kind : "json",
|
|
571
|
+
url: ref.url,
|
|
572
|
+
sha256: ref.sha256,
|
|
573
|
+
mime: ref.mime,
|
|
574
|
+
metadata: ref.metadata ?? void 0
|
|
575
|
+
});
|
|
576
|
+
ref.path = ingested.path;
|
|
577
|
+
}
|
|
578
|
+
return clone;
|
|
579
|
+
}
|
|
580
|
+
};
|
|
581
|
+
function message(e) {
|
|
582
|
+
return e instanceof Error ? e.message : String(e);
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// src/engine/client/env.ts
|
|
586
|
+
function credentialsFromEnv(env = process.env) {
|
|
587
|
+
const url = env.BAKER_API_URL;
|
|
588
|
+
const apiKey = env.BAKER_API_KEY;
|
|
589
|
+
if (!url || !apiKey) return null;
|
|
590
|
+
return { url, apiKey };
|
|
591
|
+
}
|
|
592
|
+
function requireCredentialsFromEnv(env = process.env) {
|
|
593
|
+
const c = credentialsFromEnv(env);
|
|
594
|
+
if (!c) {
|
|
595
|
+
throw new Error("missing BAKER_API_URL and/or BAKER_API_KEY environment variables");
|
|
596
|
+
}
|
|
597
|
+
if (!isBakerApiKey(c.apiKey)) {
|
|
598
|
+
throw new Error(`BAKER_API_KEY invalid: ${API_KEY_FORMAT_MESSAGE}`);
|
|
599
|
+
}
|
|
600
|
+
return c;
|
|
601
|
+
}
|
|
602
|
+
function remoteCacheEnabledFromEnv(env = process.env) {
|
|
603
|
+
return env.BAKER_CANVAS_REMOTE_CACHE !== "off";
|
|
604
|
+
}
|
|
605
|
+
function keyScopeFromEnv(env = process.env) {
|
|
606
|
+
return env.BAKER_KEY_SCOPE === "report" ? "report" : void 0;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
// src/engine/client/http.ts
|
|
610
|
+
var CONTENT_POLICY_CODE = "content_policy_blocked";
|
|
611
|
+
var REQUEST_IN_PROGRESS_CODE = "request_in_progress";
|
|
612
|
+
var BackendHttpError = class extends Error {
|
|
613
|
+
detail;
|
|
614
|
+
constructor(detail) {
|
|
615
|
+
super(describe(detail));
|
|
616
|
+
this.name = "BackendHttpError";
|
|
617
|
+
this.detail = detail;
|
|
618
|
+
}
|
|
619
|
+
};
|
|
620
|
+
function describe(d) {
|
|
621
|
+
switch (d.kind) {
|
|
622
|
+
case "unauthorized":
|
|
623
|
+
return `unauthorized: ${d.message}`;
|
|
624
|
+
case "validation":
|
|
625
|
+
return `invalid request: ${d.message}`;
|
|
626
|
+
case "provider":
|
|
627
|
+
return `provider error${d.provider ? ` (${d.provider})` : ""}: ${d.message}`;
|
|
628
|
+
case "content_policy":
|
|
629
|
+
return `content policy blocked${d.provider ? ` (${d.provider})` : ""}: ${d.message}`;
|
|
630
|
+
case "timeout":
|
|
631
|
+
return `provider timeout${d.provider ? ` (${d.provider})` : ""}: ${d.message}`;
|
|
632
|
+
case "server":
|
|
633
|
+
return `server error ${d.status}: ${d.message}`;
|
|
634
|
+
case "network":
|
|
635
|
+
return d.cause instanceof Error ? `network: ${d.cause.message}` : "network error";
|
|
636
|
+
default: {
|
|
637
|
+
const _ex = d;
|
|
638
|
+
return String(_ex);
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
var HttpClient = class {
|
|
643
|
+
baseUrl;
|
|
644
|
+
timeoutMs;
|
|
645
|
+
maxRetries;
|
|
646
|
+
fetchFn;
|
|
647
|
+
sleepFn;
|
|
648
|
+
authHeaders;
|
|
649
|
+
constructor(opts) {
|
|
650
|
+
this.baseUrl = opts.baseUrl.replace(/\/+$/, "");
|
|
651
|
+
this.timeoutMs = opts.timeoutMs ?? 10 * 60 * 1e3;
|
|
652
|
+
this.maxRetries = opts.maxRetries ?? 3;
|
|
653
|
+
this.fetchFn = opts.fetchFn ?? fetch;
|
|
654
|
+
this.sleepFn = opts.sleepFn ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
655
|
+
const keyScope = opts.keyScope ?? keyScopeFromEnv();
|
|
656
|
+
this.authHeaders = {
|
|
657
|
+
Authorization: `Bearer ${opts.apiKey}`,
|
|
658
|
+
...keyScope && { "x-baker-key-scope": keyScope }
|
|
659
|
+
};
|
|
660
|
+
}
|
|
661
|
+
async postJson(path3, body, signal) {
|
|
662
|
+
return await this.requestJson("POST", path3, body, signal);
|
|
663
|
+
}
|
|
664
|
+
async putJson(path3, body, signal) {
|
|
665
|
+
return await this.requestJson("PUT", path3, body, signal);
|
|
666
|
+
}
|
|
667
|
+
async getJson(path3, signal) {
|
|
668
|
+
return await this.requestJson("GET", path3, void 0, signal);
|
|
669
|
+
}
|
|
670
|
+
async requestJson(method, path3, body, signal) {
|
|
671
|
+
const url = `${this.baseUrl}${path3.startsWith("/") ? path3 : `/${path3}`}`;
|
|
672
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
673
|
+
const outcome = await this.attempt(method, url, body, attempt, signal);
|
|
674
|
+
if (outcome.kind === "value") return outcome.value;
|
|
675
|
+
if (outcome.kind === "retry") {
|
|
676
|
+
await this.sleepFn(backoffMs(attempt));
|
|
677
|
+
continue;
|
|
678
|
+
}
|
|
679
|
+
throw outcome.error;
|
|
680
|
+
}
|
|
681
|
+
throw new BackendHttpError({ kind: "server", status: 0, message: "retries exhausted" });
|
|
682
|
+
}
|
|
683
|
+
async attempt(method, url, body, attempt, signal) {
|
|
684
|
+
const controller = new AbortController();
|
|
685
|
+
const onAbort = () => controller.abort(signal?.reason);
|
|
686
|
+
if (signal) {
|
|
687
|
+
if (signal.aborted) controller.abort(signal.reason);
|
|
688
|
+
else signal.addEventListener("abort", onAbort, { once: true });
|
|
689
|
+
}
|
|
690
|
+
const timer = setTimeout(() => controller.abort(new Error("timeout")), this.timeoutMs);
|
|
691
|
+
const startedAt = Date.now();
|
|
692
|
+
try {
|
|
693
|
+
const res = await this.fetchFn(url, {
|
|
694
|
+
method,
|
|
695
|
+
headers: method === "GET" ? this.authHeaders : { "Content-Type": "application/json", ...this.authHeaders },
|
|
696
|
+
body: method === "GET" ? void 0 : JSON.stringify(body),
|
|
697
|
+
signal: controller.signal
|
|
698
|
+
});
|
|
699
|
+
debugLogHttp({
|
|
700
|
+
source: "canvas",
|
|
701
|
+
method,
|
|
702
|
+
url,
|
|
703
|
+
requestBody: method === "GET" ? void 0 : body,
|
|
704
|
+
status: res.status,
|
|
705
|
+
ok: res.ok,
|
|
706
|
+
responseBody: await readBodyForLog(res),
|
|
707
|
+
durationMs: Date.now() - startedAt
|
|
708
|
+
});
|
|
709
|
+
if (res.ok) return { kind: "value", value: await res.json() };
|
|
710
|
+
const err = await parseErrorBody(res);
|
|
711
|
+
if (attempt < this.maxRetries && shouldRetry(err)) return { kind: "retry" };
|
|
712
|
+
return { kind: "throw", error: new BackendHttpError(err) };
|
|
713
|
+
} catch (e) {
|
|
714
|
+
debugLogHttp({
|
|
715
|
+
source: "canvas",
|
|
716
|
+
method,
|
|
717
|
+
url,
|
|
718
|
+
requestBody: method === "GET" ? void 0 : body,
|
|
719
|
+
durationMs: Date.now() - startedAt,
|
|
720
|
+
error: e
|
|
721
|
+
});
|
|
722
|
+
return this.handleAttemptException(e, attempt, signal, method);
|
|
723
|
+
} finally {
|
|
724
|
+
clearTimeout(timer);
|
|
725
|
+
if (signal) signal.removeEventListener("abort", onAbort);
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
handleAttemptException(e, attempt, signal, method) {
|
|
729
|
+
if (e instanceof BackendHttpError) return { kind: "throw", error: e };
|
|
730
|
+
const aborted = e.name === "AbortError";
|
|
731
|
+
if (aborted && signal?.aborted) {
|
|
732
|
+
return { kind: "throw", error: new BackendHttpError({ kind: "network", cause: signal.reason ?? e }) };
|
|
733
|
+
}
|
|
734
|
+
if (aborted) {
|
|
735
|
+
if (method === "GET" && attempt < this.maxRetries) return { kind: "retry" };
|
|
736
|
+
return { kind: "throw", error: new BackendHttpError({ kind: "timeout", message: "request timed out" }) };
|
|
737
|
+
}
|
|
738
|
+
if (attempt < this.maxRetries) return { kind: "retry" };
|
|
739
|
+
return { kind: "throw", error: new BackendHttpError({ kind: "network", cause: e }) };
|
|
740
|
+
}
|
|
741
|
+
};
|
|
742
|
+
async function parseErrorBody(res) {
|
|
743
|
+
let body = {};
|
|
744
|
+
try {
|
|
745
|
+
body = await res.json();
|
|
746
|
+
} catch {
|
|
747
|
+
}
|
|
748
|
+
const errObj = body.error ?? {};
|
|
749
|
+
const bodyless = body.error === void 0 && res.status >= 500;
|
|
750
|
+
const message2 = bodyless ? `HTTP ${res.status} with no response body \u2014 the request was dropped before the server answered` : errObj.message ?? `HTTP ${res.status}`;
|
|
751
|
+
if (bodyless && res.status === 502) {
|
|
752
|
+
return { kind: "server", status: res.status, message: message2 };
|
|
753
|
+
}
|
|
754
|
+
return classifyBackendError(res.status, errObj, message2);
|
|
755
|
+
}
|
|
756
|
+
function providerVerdict(status, errObj, message2) {
|
|
757
|
+
if (errObj.provider === void 0 && errObj.code !== "provider_error") return null;
|
|
758
|
+
return {
|
|
759
|
+
kind: "provider",
|
|
760
|
+
status,
|
|
761
|
+
provider: errObj.provider,
|
|
762
|
+
code: errObj.code ?? "provider_error",
|
|
763
|
+
message: message2,
|
|
764
|
+
// A 4xx is terminal unless the backend says otherwise — the opposite
|
|
765
|
+
// default from the 502 branch, where the status itself means "try again".
|
|
766
|
+
retryable: errObj.retryable ?? false
|
|
767
|
+
};
|
|
768
|
+
}
|
|
769
|
+
function classifyBackendError(status, errObj, message2) {
|
|
770
|
+
return codeVerdict(status, errObj, message2) ?? clientVerdict(status, errObj, message2) ?? serverVerdict(status, errObj, message2) ?? {
|
|
771
|
+
// Remaining 4xx (404, 405, 409, …): the request itself is wrong, so a retry
|
|
772
|
+
// can't help — and re-dispatching a POST risks a double provider charge.
|
|
773
|
+
kind: "validation",
|
|
774
|
+
status,
|
|
775
|
+
message: message2,
|
|
776
|
+
code: errObj.code,
|
|
777
|
+
details: errObj.details
|
|
778
|
+
};
|
|
779
|
+
}
|
|
780
|
+
function codeVerdict(status, errObj, message2) {
|
|
781
|
+
if (errObj.code === CONTENT_POLICY_CODE) {
|
|
782
|
+
return { kind: "content_policy", status, provider: errObj.provider, message: message2 };
|
|
783
|
+
}
|
|
784
|
+
if (errObj.code === REQUEST_IN_PROGRESS_CODE) return { kind: "server", status, message: message2 };
|
|
785
|
+
return null;
|
|
786
|
+
}
|
|
787
|
+
function clientVerdict(status, errObj, message2) {
|
|
788
|
+
if (status === 401 || status === 403) return { kind: "unauthorized", status, message: message2 };
|
|
789
|
+
if (status !== 400 && status !== 422) return null;
|
|
790
|
+
return providerVerdict(status, errObj, message2) ?? {
|
|
791
|
+
kind: "validation",
|
|
792
|
+
status,
|
|
793
|
+
message: message2,
|
|
794
|
+
code: errObj.code,
|
|
795
|
+
details: errObj.details
|
|
796
|
+
};
|
|
797
|
+
}
|
|
798
|
+
function serverVerdict(status, errObj, message2) {
|
|
799
|
+
if (status >= 500 && errObj.retryable === false) {
|
|
800
|
+
return {
|
|
801
|
+
kind: "provider",
|
|
802
|
+
status,
|
|
803
|
+
provider: errObj.provider,
|
|
804
|
+
code: errObj.code ?? "server_error",
|
|
805
|
+
message: message2,
|
|
806
|
+
retryable: false
|
|
807
|
+
};
|
|
808
|
+
}
|
|
809
|
+
if (status === 504 || status === 502 && errObj.code === "provider_timeout") {
|
|
810
|
+
return { kind: "timeout", provider: errObj.provider, message: message2 };
|
|
811
|
+
}
|
|
812
|
+
if (status === 502) {
|
|
813
|
+
return {
|
|
814
|
+
kind: "provider",
|
|
815
|
+
status,
|
|
816
|
+
provider: errObj.provider,
|
|
817
|
+
code: errObj.code ?? "provider_error",
|
|
818
|
+
message: message2,
|
|
819
|
+
retryable: errObj.retryable ?? true
|
|
820
|
+
};
|
|
821
|
+
}
|
|
822
|
+
if (status >= 500 || status === 429) return { kind: "server", status, message: message2 };
|
|
823
|
+
return null;
|
|
824
|
+
}
|
|
825
|
+
function backoffMs(attempt) {
|
|
826
|
+
return 1e3 * 2 ** attempt;
|
|
827
|
+
}
|
|
828
|
+
function shouldRetry(err) {
|
|
829
|
+
if (err.kind === "server") return true;
|
|
830
|
+
if (err.kind === "provider" && err.retryable) return true;
|
|
831
|
+
return false;
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
// src/engine/nodes/ingest.ts
|
|
835
|
+
import { execFile as execFileCb } from "child_process";
|
|
836
|
+
import { createHash as createHash2 } from "crypto";
|
|
837
|
+
import { createReadStream } from "fs";
|
|
838
|
+
import { mkdtemp, readFile as readFile2, rm, stat as stat2 } from "fs/promises";
|
|
839
|
+
import { tmpdir } from "os";
|
|
840
|
+
import path2 from "path";
|
|
841
|
+
import { promisify } from "util";
|
|
842
|
+
import { z as z3 } from "zod";
|
|
843
|
+
|
|
844
|
+
// src/engine/engine/define.ts
|
|
845
|
+
function resolveOutputKinds(spec, params) {
|
|
846
|
+
if (!spec) return {};
|
|
847
|
+
return typeof spec === "function" ? spec(params) : spec;
|
|
848
|
+
}
|
|
849
|
+
function defineNode(def) {
|
|
850
|
+
return def;
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
// src/engine/lib/url.ts
|
|
854
|
+
function looksLikeHttpUrl(value) {
|
|
855
|
+
return typeof value === "string" && /^https?:\/\//i.test(value.trim());
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
// src/engine/nodes/remote/upload.ts
|
|
859
|
+
var PUT_MAX_ATTEMPTS = 4;
|
|
860
|
+
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
861
|
+
async function presignAndPut(args) {
|
|
862
|
+
let lastFailure = null;
|
|
863
|
+
for (let attempt = 0; attempt < PUT_MAX_ATTEMPTS; attempt++) {
|
|
864
|
+
if (args.ctx.signal?.aborted) break;
|
|
865
|
+
if (attempt > 0) await sleep(500 * 2 ** (attempt - 1) * (1 + Math.random() * 0.25));
|
|
866
|
+
const result = await attemptPresignedPut(args);
|
|
867
|
+
if (result.ok) return result.url;
|
|
868
|
+
lastFailure = result.failure;
|
|
869
|
+
if (!result.retryable) break;
|
|
870
|
+
}
|
|
871
|
+
throw lastFailure ?? new Error("upload: aborted before the PUT could start");
|
|
872
|
+
}
|
|
873
|
+
async function attemptPresignedPut(args) {
|
|
874
|
+
try {
|
|
875
|
+
const { putUrl, publicUrl, conditional } = await args.ctx.client.presignAssetUpload(
|
|
876
|
+
args.sha256,
|
|
877
|
+
args.mime,
|
|
878
|
+
args.ctx.signal,
|
|
879
|
+
void 0,
|
|
880
|
+
true
|
|
881
|
+
);
|
|
882
|
+
const putRes = await fetch(putUrl, {
|
|
883
|
+
method: "PUT",
|
|
884
|
+
body: new Uint8Array(args.bytes),
|
|
885
|
+
// A conditional URL was signed WITH this header, so it must be sent exactly.
|
|
886
|
+
headers: conditional ? { "Content-Type": args.mime, "If-None-Match": "*" } : { "Content-Type": args.mime },
|
|
887
|
+
signal: args.ctx.signal
|
|
888
|
+
});
|
|
889
|
+
if (putRes.ok) return { ok: true, url: publicUrl };
|
|
890
|
+
if (conditional && putRes.status === 412) return { ok: true, url: publicUrl };
|
|
891
|
+
return {
|
|
892
|
+
ok: false,
|
|
893
|
+
failure: new Error(`upload: presigned PUT failed ${putRes.status} ${putRes.statusText}`),
|
|
894
|
+
// Only transient statuses warrant a replay — a 400/403 fails identically every attempt.
|
|
895
|
+
retryable: putRes.status >= 500 || putRes.status === 429 || putRes.status === 408
|
|
896
|
+
};
|
|
897
|
+
} catch (e) {
|
|
898
|
+
return {
|
|
899
|
+
ok: false,
|
|
900
|
+
failure: e instanceof Error ? e : new Error(String(e)),
|
|
901
|
+
retryable: args.ctx.signal?.aborted !== true
|
|
902
|
+
};
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
async function ensureUploaded(ref, ctx) {
|
|
906
|
+
if (ref.url) return ref;
|
|
907
|
+
const bytes = await ctx.assets.readBytes(ref.sha256, ref.mime);
|
|
908
|
+
const url = await presignAndPut({ bytes, sha256: ref.sha256, mime: ref.mime, ctx });
|
|
909
|
+
return { ...ref, url };
|
|
910
|
+
}
|
|
911
|
+
async function persistOutputAssetUrls(outputs, ctx) {
|
|
912
|
+
for (const ref of collectAssetRefLikes(outputs)) {
|
|
913
|
+
if (isPersistedAssetRef(ref)) continue;
|
|
914
|
+
const bytes = await ctx.assets.readBytes(ref.sha256, ref.mime);
|
|
915
|
+
ref.url = await presignAndPut({ bytes, sha256: ref.sha256, mime: ref.mime, ctx });
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
// src/engine/nodes/remote/delegate.ts
|
|
920
|
+
function delegated(spec) {
|
|
921
|
+
return {
|
|
922
|
+
...spec,
|
|
923
|
+
location: "remote",
|
|
924
|
+
execute: async ({ inputs, params, ctx }) => {
|
|
925
|
+
return await callBackendExec({
|
|
926
|
+
nodeType: spec.id,
|
|
927
|
+
nodeVersion: spec.version,
|
|
928
|
+
params,
|
|
929
|
+
inputs,
|
|
930
|
+
outputKinds: resolveOutputKinds(spec.outputKinds, params),
|
|
931
|
+
ctx
|
|
932
|
+
});
|
|
933
|
+
}
|
|
934
|
+
};
|
|
935
|
+
}
|
|
936
|
+
async function callBackendExec(args) {
|
|
937
|
+
try {
|
|
938
|
+
const serialized = await serializeInputs(args.inputs, args.ctx);
|
|
939
|
+
const suffix = args.idempotencySuffix ? `:${args.idempotencySuffix}` : "";
|
|
940
|
+
const idempotencyKey = args.ctx.cacheKey ? `${args.ctx.canvasRunId}:${args.ctx.cacheKey}${suffix}` : void 0;
|
|
941
|
+
const res = await args.ctx.client.exec(
|
|
942
|
+
{
|
|
943
|
+
nodeType: args.nodeType,
|
|
944
|
+
nodeVersion: args.nodeVersion,
|
|
945
|
+
params: args.params,
|
|
946
|
+
inputs: serialized,
|
|
947
|
+
idempotency_key: idempotencyKey,
|
|
948
|
+
canvas_run_id: args.ctx.canvasRunId,
|
|
949
|
+
node_id: args.ctx.nodeId
|
|
950
|
+
},
|
|
951
|
+
args.ctx.signal
|
|
952
|
+
);
|
|
953
|
+
if (typeof res.credits_charged === "number") args.ctx.reportCharge?.(res.credits_charged);
|
|
954
|
+
return await ingestOutputs(res.outputs, args.ctx, args.outputKinds);
|
|
955
|
+
} catch (e) {
|
|
956
|
+
throw mapClientError(args.ctx, e);
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
async function serializeInputs(inputs, ctx) {
|
|
960
|
+
if (!inputs || typeof inputs !== "object") return {};
|
|
961
|
+
const out = {};
|
|
962
|
+
for (const [k, v] of Object.entries(inputs)) {
|
|
963
|
+
out[k] = await stripLocalRefs(v, ctx);
|
|
964
|
+
}
|
|
965
|
+
return out;
|
|
966
|
+
}
|
|
967
|
+
async function stripLocalRefs(value, ctx) {
|
|
968
|
+
if (Array.isArray(value)) return Promise.all(value.map((v) => stripLocalRefs(v, ctx)));
|
|
969
|
+
if (value && typeof value === "object") {
|
|
970
|
+
if ("kind" in value && "sha256" in value && "mime" in value) {
|
|
971
|
+
const ref = await ensureUploaded(value, ctx);
|
|
972
|
+
return {
|
|
973
|
+
kind: ref.kind,
|
|
974
|
+
url: ref.url,
|
|
975
|
+
sha256: ref.sha256,
|
|
976
|
+
mime: ref.mime,
|
|
977
|
+
metadata: ref.metadata
|
|
978
|
+
};
|
|
979
|
+
}
|
|
980
|
+
const out = {};
|
|
981
|
+
for (const [k, v] of Object.entries(value)) out[k] = await stripLocalRefs(v, ctx);
|
|
982
|
+
return out;
|
|
983
|
+
}
|
|
984
|
+
return value;
|
|
985
|
+
}
|
|
986
|
+
async function ingestOutputs(outputs, ctx, kinds) {
|
|
987
|
+
const result = {};
|
|
988
|
+
for (const [name, value] of Object.entries(outputs)) {
|
|
989
|
+
const declaredKind = kinds[name];
|
|
990
|
+
result[name] = await ingestValue(value, ctx, declaredKind);
|
|
991
|
+
}
|
|
992
|
+
return result;
|
|
993
|
+
}
|
|
994
|
+
async function ingestValue(value, ctx, declaredKind) {
|
|
995
|
+
if (Array.isArray(value)) {
|
|
996
|
+
const out = [];
|
|
997
|
+
for (const v of value) out.push(await ingestValue(v, ctx, declaredKind));
|
|
998
|
+
return out;
|
|
999
|
+
}
|
|
1000
|
+
if (isRawAsset(value)) {
|
|
1001
|
+
const kind = value.kind ?? declaredKind ?? "json";
|
|
1002
|
+
if (ctx.downloadOutputs === false) {
|
|
1003
|
+
return buildRef({ kind, sha: value.sha256, mime: value.mime, url: value.url, metadata: value.metadata });
|
|
1004
|
+
}
|
|
1005
|
+
return ctx.assets.ingestRemote({
|
|
1006
|
+
kind,
|
|
1007
|
+
url: value.url,
|
|
1008
|
+
sha256: value.sha256,
|
|
1009
|
+
mime: value.mime,
|
|
1010
|
+
metadata: value.metadata
|
|
1011
|
+
});
|
|
1012
|
+
}
|
|
1013
|
+
return value;
|
|
1014
|
+
}
|
|
1015
|
+
function isRawAsset(v) {
|
|
1016
|
+
return Boolean(
|
|
1017
|
+
v && typeof v === "object" && "url" in v && "sha256" in v && "mime" in v && typeof v.url === "string" && typeof v.sha256 === "string"
|
|
1018
|
+
);
|
|
1019
|
+
}
|
|
1020
|
+
function mapClientError(ctx, e) {
|
|
1021
|
+
if (e instanceof BackendHttpError) {
|
|
1022
|
+
const d = e.detail;
|
|
1023
|
+
if (d.kind === "provider") {
|
|
1024
|
+
return new NodeExecutionError(ctx.nodeId, ctx.nodeType, {
|
|
1025
|
+
kind: "remote",
|
|
1026
|
+
status: d.status,
|
|
1027
|
+
code: d.code,
|
|
1028
|
+
message: d.message,
|
|
1029
|
+
provider: d.provider,
|
|
1030
|
+
// The backend's real classification — providerErr pins the status to 502,
|
|
1031
|
+
// so this flag (not the status) is the source of truth for retryability.
|
|
1032
|
+
retryable: d.retryable
|
|
1033
|
+
});
|
|
1034
|
+
}
|
|
1035
|
+
if (d.kind === "content_policy") {
|
|
1036
|
+
return new NodeExecutionError(ctx.nodeId, ctx.nodeType, {
|
|
1037
|
+
kind: "content_policy",
|
|
1038
|
+
provider: d.provider,
|
|
1039
|
+
message: d.message
|
|
1040
|
+
});
|
|
1041
|
+
}
|
|
1042
|
+
if (d.kind === "timeout") {
|
|
1043
|
+
return new NodeExecutionError(ctx.nodeId, ctx.nodeType, { kind: "timeout", provider: d.provider });
|
|
1044
|
+
}
|
|
1045
|
+
if (d.kind === "validation") {
|
|
1046
|
+
return new NodeExecutionError(ctx.nodeId, ctx.nodeType, {
|
|
1047
|
+
kind: "remote",
|
|
1048
|
+
status: d.status,
|
|
1049
|
+
// The backend's own code (`model_invalid_params`, `cost_limit_exceeded`,
|
|
1050
|
+
// `invalid_inputs`, …) says WHICH refusal; `invalid_params` only when it gave none.
|
|
1051
|
+
code: d.code ?? "invalid_params",
|
|
1052
|
+
message: d.message,
|
|
1053
|
+
// The request itself was refused; it fails the same way until the input changes.
|
|
1054
|
+
retryable: false
|
|
1055
|
+
});
|
|
1056
|
+
}
|
|
1057
|
+
if (d.kind === "unauthorized") {
|
|
1058
|
+
return new NodeExecutionError(ctx.nodeId, ctx.nodeType, {
|
|
1059
|
+
kind: "remote",
|
|
1060
|
+
status: d.status,
|
|
1061
|
+
code: "unauthorized",
|
|
1062
|
+
message: d.message
|
|
1063
|
+
});
|
|
1064
|
+
}
|
|
1065
|
+
if (d.kind === "network") {
|
|
1066
|
+
return new NodeExecutionError(ctx.nodeId, ctx.nodeType, { kind: "network", cause: d.cause });
|
|
1067
|
+
}
|
|
1068
|
+
return new NodeExecutionError(ctx.nodeId, ctx.nodeType, {
|
|
1069
|
+
kind: "remote",
|
|
1070
|
+
status: d.status,
|
|
1071
|
+
code: "server_error",
|
|
1072
|
+
message: d.message
|
|
1073
|
+
});
|
|
1074
|
+
}
|
|
1075
|
+
return new NodeExecutionError(ctx.nodeId, ctx.nodeType, { kind: "local", cause: e });
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
// src/engine/nodes/ingest.ts
|
|
1079
|
+
var execFile = promisify(execFileCb);
|
|
1080
|
+
var ExpectEnum = z3.enum(["image", "video", "audio", "text", "json", "font"]);
|
|
1081
|
+
function coercePathUrlToUrl(input) {
|
|
1082
|
+
if (!input || typeof input !== "object") return input;
|
|
1083
|
+
const obj = input;
|
|
1084
|
+
if (obj.source === "path" && looksLikeHttpUrl(obj.path)) {
|
|
1085
|
+
const { path: _path, ...rest } = obj;
|
|
1086
|
+
return { ...rest, source: "url", url: obj.path.trim() };
|
|
1087
|
+
}
|
|
1088
|
+
return input;
|
|
1089
|
+
}
|
|
1090
|
+
var IngestParams = z3.preprocess(
|
|
1091
|
+
coercePathUrlToUrl,
|
|
1092
|
+
z3.discriminatedUnion("source", [
|
|
1093
|
+
z3.object({
|
|
1094
|
+
source: z3.literal("url"),
|
|
1095
|
+
url: z3.string().url(),
|
|
1096
|
+
expect: ExpectEnum
|
|
1097
|
+
}).strict(),
|
|
1098
|
+
z3.object({
|
|
1099
|
+
source: z3.literal("path"),
|
|
1100
|
+
path: z3.string().min(1),
|
|
1101
|
+
expect: ExpectEnum
|
|
1102
|
+
}).strict()
|
|
1103
|
+
])
|
|
1104
|
+
);
|
|
1105
|
+
var IngestInputs = z3.object({}).strict();
|
|
1106
|
+
var IngestOutputs = z3.object({ asset: AssetRef }).strict();
|
|
1107
|
+
var RAW_TEXT_EXTENSIONS = [".txt", ".md"];
|
|
1108
|
+
function resolveStrategy(params) {
|
|
1109
|
+
if (params.source === "path") return "local_file";
|
|
1110
|
+
if (takesCanvasAssetVerbatim(params.url, params.expect)) return "canvas_asset";
|
|
1111
|
+
switch (params.expect) {
|
|
1112
|
+
case "video":
|
|
1113
|
+
case "audio":
|
|
1114
|
+
return "yt_dlp";
|
|
1115
|
+
case "image":
|
|
1116
|
+
case "json":
|
|
1117
|
+
case "font":
|
|
1118
|
+
return "direct_fetch";
|
|
1119
|
+
case "text": {
|
|
1120
|
+
const p = safePathname(params.url);
|
|
1121
|
+
const isRawText = RAW_TEXT_EXTENSIONS.some((ext) => p.endsWith(ext));
|
|
1122
|
+
return isRawText ? "direct_fetch" : "firecrawl";
|
|
1123
|
+
}
|
|
1124
|
+
default: {
|
|
1125
|
+
params.expect;
|
|
1126
|
+
throw new Error(`ingest: unhandled expect=${String(params.expect)}`);
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
function safePathname(rawUrl) {
|
|
1131
|
+
try {
|
|
1132
|
+
return new URL(rawUrl).pathname.toLowerCase();
|
|
1133
|
+
} catch {
|
|
1134
|
+
return "";
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
var ingestNode = defineNode({
|
|
1138
|
+
id: "ingest",
|
|
1139
|
+
version: "1.3.0",
|
|
1140
|
+
category: "io",
|
|
1141
|
+
location: "local",
|
|
1142
|
+
summary: "Ingest an external URL or a local file into the asset store. Declare the kind you expect (image/video/audio/text/json/font); the node picks the strategy. For source=url: a canvas-assets URL (`\u2026/canvas-assets/<xx>/<sha>.<ext>`, the durable copy of an earlier output) is taken back byte-for-byte with its sha unchanged; yt-dlp for other video/audio (YouTube/TikTok/Vimeo/etc. and direct file URLs), Firecrawl for HTML/PDF pages \u2192 markdown, direct HTTP fetch for binary URLs (images, fonts) and raw .txt/.md. For source=path: read a committed file from the workspace and upload to R2.",
|
|
1143
|
+
when_to_use: 'Use as the on-ramp for any external asset a canvas needs. `expect` makes the output port statically typed so downstream wiring is checked before any byte is fetched. Pick `source: "url"` for portable canvas; pick `source: "path"` only for a file committed to the workspace (`src/brand/\u2026`, `src/creatives/<slug>/assets/\u2026`) \u2014 the canvas is rendered again in other Sessions, which have only what is committed. To reuse an earlier output (a voice take, a clip, a frame), ingest its canvas-assets URL from the run outputs: it comes back with the same sha, so nothing downstream re-renders. Never point `path` into `canvas/` (`canvas/.cache/`, `canvas/r_*`): that folder is not committed, and validate rewrites a cache path to its canvas-assets URL. Compose with other nodes for richer pipelines (e.g. `ingest expect=video` \u2192 `video_transcribe`).',
|
|
1144
|
+
inputs: IngestInputs,
|
|
1145
|
+
params: IngestParams,
|
|
1146
|
+
outputs: IngestOutputs,
|
|
1147
|
+
cost: () => ({ credits: 0, seconds_estimate: 5 }),
|
|
1148
|
+
// Output kind is declared in params, so validators/UI can type the port
|
|
1149
|
+
// statically without running the node.
|
|
1150
|
+
outputKinds: (params) => ({ asset: params.expect }),
|
|
1151
|
+
async execute({ params, ctx }) {
|
|
1152
|
+
const strategy = resolveStrategy(params);
|
|
1153
|
+
const source = params.source === "url" ? params.url : params.path;
|
|
1154
|
+
ctx.log(`ingest: ${strategy} (${params.expect}) ${source}`);
|
|
1155
|
+
const asset = await runStrategy(strategy, params, ctx);
|
|
1156
|
+
return { asset };
|
|
1157
|
+
}
|
|
1158
|
+
});
|
|
1159
|
+
function runStrategy(strategy, params, ctx) {
|
|
1160
|
+
if (params.source === "path") {
|
|
1161
|
+
if (strategy !== "local_file") {
|
|
1162
|
+
throw new Error(`ingest: invariant \u2014 source=path but strategy=${strategy}`);
|
|
1163
|
+
}
|
|
1164
|
+
return execLocalFile(params, ctx);
|
|
1165
|
+
}
|
|
1166
|
+
switch (strategy) {
|
|
1167
|
+
case "canvas_asset":
|
|
1168
|
+
return execCanvasAsset(params, ctx);
|
|
1169
|
+
case "direct_fetch":
|
|
1170
|
+
return execDirectFetch(params, ctx);
|
|
1171
|
+
case "firecrawl":
|
|
1172
|
+
return execFirecrawl(params, ctx);
|
|
1173
|
+
case "yt_dlp":
|
|
1174
|
+
return execYtDlp(params, ctx);
|
|
1175
|
+
case "local_file":
|
|
1176
|
+
throw new Error(`ingest: invariant \u2014 source=url but strategy=local_file`);
|
|
1177
|
+
default: {
|
|
1178
|
+
strategy;
|
|
1179
|
+
throw new Error(`ingest: unhandled strategy=${String(strategy)}`);
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
function canvasAssetMime(url, expect) {
|
|
1184
|
+
const address = parseCanvasAssetUrl(url);
|
|
1185
|
+
const mime = address ? EXT_TO_MIME[address.ext] : void 0;
|
|
1186
|
+
return mime !== void 0 && inferKindFromMime(mime) === expect ? mime : null;
|
|
1187
|
+
}
|
|
1188
|
+
function takesCanvasAssetVerbatim(url, expect) {
|
|
1189
|
+
return isCanvasAssetOrigin(url) && canvasAssetMime(url, expect) !== null;
|
|
1190
|
+
}
|
|
1191
|
+
async function execCanvasAsset(params, ctx) {
|
|
1192
|
+
const address = parseCanvasAssetUrl(params.url);
|
|
1193
|
+
const mime = canvasAssetMime(params.url, params.expect);
|
|
1194
|
+
if (!address || mime === null) throw new Error(`ingest: invariant \u2014 canvas_asset strategy for ${params.url}`);
|
|
1195
|
+
try {
|
|
1196
|
+
return await ctx.assets.ingestRemote({
|
|
1197
|
+
kind: params.expect,
|
|
1198
|
+
url: params.url,
|
|
1199
|
+
sha256: address.sha256,
|
|
1200
|
+
mime,
|
|
1201
|
+
metadata: { strategy: "canvas_asset", source_url: params.url, ingested_at: (/* @__PURE__ */ new Date()).toISOString() }
|
|
1202
|
+
});
|
|
1203
|
+
} catch (e) {
|
|
1204
|
+
throw localExecError(ctx, e.message);
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
async function execDirectFetch(params, ctx) {
|
|
1208
|
+
if (params.expect === "image") {
|
|
1209
|
+
return ingestImageUrl(params.url, ctx);
|
|
1210
|
+
}
|
|
1211
|
+
const result = await callBackendExec({
|
|
1212
|
+
nodeType: "ingest",
|
|
1213
|
+
nodeVersion: ingestNode.version,
|
|
1214
|
+
params: { strategy: "direct_fetch", url: params.url, expect: params.expect },
|
|
1215
|
+
inputs: {},
|
|
1216
|
+
outputKinds: { asset: params.expect },
|
|
1217
|
+
ctx
|
|
1218
|
+
});
|
|
1219
|
+
return assertAssetOutput(result, params.expect);
|
|
1220
|
+
}
|
|
1221
|
+
async function ingestImageUrl(url, ctx) {
|
|
1222
|
+
let bytes;
|
|
1223
|
+
try {
|
|
1224
|
+
({ buffer: bytes } = await fetchExternalBytes(url, { maxBytes: MAX_ASSET_BYTES }));
|
|
1225
|
+
} catch (e) {
|
|
1226
|
+
throw localExecError(ctx, `fetch ${url} \u2192 ${e.message}`);
|
|
1227
|
+
}
|
|
1228
|
+
let normalized;
|
|
1229
|
+
try {
|
|
1230
|
+
normalized = await toModelSafeImage(bytes);
|
|
1231
|
+
} catch (e) {
|
|
1232
|
+
throw localExecError(ctx, `${url}: ${e.message}`);
|
|
1233
|
+
}
|
|
1234
|
+
const note = normalizationNote(normalized);
|
|
1235
|
+
if (note) ctx.log(`ingest: ${url} ${note}`);
|
|
1236
|
+
return uploadAndIngest({
|
|
1237
|
+
bytes: normalized.bytes,
|
|
1238
|
+
kind: "image",
|
|
1239
|
+
mime: normalized.mime,
|
|
1240
|
+
metadata: {
|
|
1241
|
+
source_url: url,
|
|
1242
|
+
strategy: "direct_fetch",
|
|
1243
|
+
ingested_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1244
|
+
...normalized.rasterizedFrom ? { rasterized_from: normalized.rasterizedFrom } : {}
|
|
1245
|
+
},
|
|
1246
|
+
ctx
|
|
1247
|
+
});
|
|
1248
|
+
}
|
|
1249
|
+
async function execFirecrawl(params, ctx) {
|
|
1250
|
+
const result = await callBackendExec({
|
|
1251
|
+
nodeType: "ingest",
|
|
1252
|
+
nodeVersion: ingestNode.version,
|
|
1253
|
+
params: { strategy: "firecrawl", url: params.url },
|
|
1254
|
+
inputs: {},
|
|
1255
|
+
outputKinds: { asset: "text" },
|
|
1256
|
+
ctx
|
|
1257
|
+
});
|
|
1258
|
+
return assertAssetOutput(result, "text");
|
|
1259
|
+
}
|
|
1260
|
+
function assertAssetOutput(result, expected) {
|
|
1261
|
+
const asset = result.asset;
|
|
1262
|
+
if (!asset || typeof asset !== "object" || !("kind" in asset)) {
|
|
1263
|
+
throw new Error(`ingest: backend returned no asset (got ${JSON.stringify(result)})`);
|
|
1264
|
+
}
|
|
1265
|
+
if (asset.kind !== expected) {
|
|
1266
|
+
throw new Error(`ingest: backend returned kind=${asset.kind} but expected ${expected}`);
|
|
1267
|
+
}
|
|
1268
|
+
return asset;
|
|
1269
|
+
}
|
|
1270
|
+
function resolveLocalPath(input) {
|
|
1271
|
+
if (input.startsWith("~")) {
|
|
1272
|
+
throw new Error(
|
|
1273
|
+
`ingest: ~ path expansion is not supported (got "${input}"). Use an absolute path or a cwd-relative path.`
|
|
1274
|
+
);
|
|
1275
|
+
}
|
|
1276
|
+
if (path2.isAbsolute(input)) return input;
|
|
1277
|
+
return path2.resolve(process.cwd(), input);
|
|
1278
|
+
}
|
|
1279
|
+
var EXT_TO_MIME = {
|
|
1280
|
+
png: "image/png",
|
|
1281
|
+
jpg: "image/jpeg",
|
|
1282
|
+
jpeg: "image/jpeg",
|
|
1283
|
+
webp: "image/webp",
|
|
1284
|
+
gif: "image/gif",
|
|
1285
|
+
// Non-model-safe rasters `toModelSafeImage` transcodes to PNG at ingest — they
|
|
1286
|
+
// must resolve to an image mime here or the kind-check rejects the local file
|
|
1287
|
+
// before normalization ever runs.
|
|
1288
|
+
avif: "image/avif",
|
|
1289
|
+
heic: "image/heic",
|
|
1290
|
+
heif: "image/heif",
|
|
1291
|
+
tif: "image/tiff",
|
|
1292
|
+
tiff: "image/tiff",
|
|
1293
|
+
bmp: "image/bmp",
|
|
1294
|
+
mp4: "video/mp4",
|
|
1295
|
+
webm: "video/webm",
|
|
1296
|
+
mov: "video/quicktime",
|
|
1297
|
+
m4v: "video/mp4",
|
|
1298
|
+
mp3: "audio/mpeg",
|
|
1299
|
+
wav: "audio/wav",
|
|
1300
|
+
m4a: "audio/mp4",
|
|
1301
|
+
ogg: "audio/ogg",
|
|
1302
|
+
flac: "audio/flac",
|
|
1303
|
+
json: "application/json",
|
|
1304
|
+
txt: "text/plain",
|
|
1305
|
+
md: "text/markdown",
|
|
1306
|
+
markdown: "text/markdown",
|
|
1307
|
+
html: "text/html",
|
|
1308
|
+
htm: "text/html",
|
|
1309
|
+
csv: "text/csv",
|
|
1310
|
+
ttf: "font/ttf",
|
|
1311
|
+
otf: "font/otf",
|
|
1312
|
+
woff: "font/woff",
|
|
1313
|
+
woff2: "font/woff2",
|
|
1314
|
+
svg: "image/svg+xml"
|
|
1315
|
+
};
|
|
1316
|
+
var SVG_MIME = "image/svg+xml";
|
|
1317
|
+
var SVG_TARGET_LONGEST_PX = 2048;
|
|
1318
|
+
var SVG_BASE_DENSITY = 72;
|
|
1319
|
+
var SVG_MAX_DENSITY = 2400;
|
|
1320
|
+
function sniffSvg(buf) {
|
|
1321
|
+
const head = buf.subarray(0, Math.min(buf.length, 512)).toString("utf8").trimStart();
|
|
1322
|
+
return head.startsWith("<?xml") ? head.includes("<svg") : head.startsWith("<svg");
|
|
1323
|
+
}
|
|
1324
|
+
function inferMimeFromPath(absPath, sniffBytes) {
|
|
1325
|
+
const ext = path2.extname(absPath).slice(1).toLowerCase();
|
|
1326
|
+
const fromExt = EXT_TO_MIME[ext];
|
|
1327
|
+
if (fromExt) return fromExt;
|
|
1328
|
+
const fromBytes = sniffImageMime(sniffBytes);
|
|
1329
|
+
if (fromBytes) return fromBytes;
|
|
1330
|
+
if (sniffSvg(sniffBytes)) return SVG_MIME;
|
|
1331
|
+
return "application/octet-stream";
|
|
1332
|
+
}
|
|
1333
|
+
async function rasterizeSvgToPng(bytes) {
|
|
1334
|
+
const { default: sharp } = await import("sharp");
|
|
1335
|
+
const base = await sharp(bytes).metadata();
|
|
1336
|
+
const longest = Math.max(base.width ?? 0, base.height ?? 0);
|
|
1337
|
+
let density = SVG_BASE_DENSITY;
|
|
1338
|
+
if (longest > 0) {
|
|
1339
|
+
const scaled = Math.round(SVG_BASE_DENSITY * SVG_TARGET_LONGEST_PX / longest);
|
|
1340
|
+
density = Math.min(SVG_MAX_DENSITY, Math.max(SVG_BASE_DENSITY, scaled));
|
|
1341
|
+
}
|
|
1342
|
+
return await sharp(bytes, { density }).png({ force: true, palette: false }).toBuffer();
|
|
1343
|
+
}
|
|
1344
|
+
var MODEL_SAFE_IMAGE_MIMES = /* @__PURE__ */ new Set(["image/jpeg", "image/png", "image/gif", "image/webp"]);
|
|
1345
|
+
var MAX_MODEL_REFERENCE_BYTES = 30 * 1024 * 1024;
|
|
1346
|
+
async function fitWithinReferenceLimit(bytes, mime, maxBytes) {
|
|
1347
|
+
if (bytes.byteLength <= maxBytes) return { bytes, mime };
|
|
1348
|
+
const { default: sharp } = await import("sharp");
|
|
1349
|
+
const read = () => sharp(bytes, { animated: true });
|
|
1350
|
+
const meta = await read().metadata();
|
|
1351
|
+
const animated = (meta.pages ?? 1) > 1;
|
|
1352
|
+
const keepAlpha = meta.hasAlpha === true;
|
|
1353
|
+
const width = meta.width ?? 0;
|
|
1354
|
+
const encode = async (scale2) => {
|
|
1355
|
+
let pipeline2 = read();
|
|
1356
|
+
if (scale2 < 1 && width > 0) pipeline2 = pipeline2.resize({ width: Math.max(256, Math.round(width * scale2)) });
|
|
1357
|
+
if (animated && mime === "image/gif") return { bytes: await pipeline2.gif().toBuffer(), mime: "image/gif" };
|
|
1358
|
+
if (animated || keepAlpha) return { bytes: await pipeline2.webp({ quality: 90 }).toBuffer(), mime: "image/webp" };
|
|
1359
|
+
return { bytes: await pipeline2.jpeg({ quality: 90, mozjpeg: true }).toBuffer(), mime: "image/jpeg" };
|
|
1360
|
+
};
|
|
1361
|
+
let out = await encode(1);
|
|
1362
|
+
let scale = 1;
|
|
1363
|
+
for (let pass = 0; pass < 4 && out.bytes.byteLength > maxBytes; pass++) {
|
|
1364
|
+
scale *= Math.min(0.9, Math.sqrt(maxBytes / out.bytes.byteLength));
|
|
1365
|
+
out = await encode(scale);
|
|
1366
|
+
}
|
|
1367
|
+
return out;
|
|
1368
|
+
}
|
|
1369
|
+
async function toModelSafeImage(bytes, opts) {
|
|
1370
|
+
const maxBytes = opts?.maxBytes ?? MAX_MODEL_REFERENCE_BYTES;
|
|
1371
|
+
const fitToModel = async (candidate, mime, rasterizedFrom) => {
|
|
1372
|
+
const fitted = await fitWithinReferenceLimit(candidate, mime, maxBytes);
|
|
1373
|
+
return {
|
|
1374
|
+
bytes: fitted.bytes,
|
|
1375
|
+
mime: fitted.mime,
|
|
1376
|
+
...rasterizedFrom ? { rasterizedFrom } : {},
|
|
1377
|
+
...fitted.bytes === candidate ? {} : { shrunkFromBytes: candidate.byteLength }
|
|
1378
|
+
};
|
|
1379
|
+
};
|
|
1380
|
+
const safe = sniffImageMime(bytes);
|
|
1381
|
+
if (safe && MODEL_SAFE_IMAGE_MIMES.has(safe)) {
|
|
1382
|
+
return await fitToModel(bytes, safe);
|
|
1383
|
+
}
|
|
1384
|
+
if (sniffSvg(bytes)) {
|
|
1385
|
+
return await fitToModel(await rasterizeSvgToPng(bytes), "image/png", "svg");
|
|
1386
|
+
}
|
|
1387
|
+
const { default: sharp } = await import("sharp");
|
|
1388
|
+
let png;
|
|
1389
|
+
let format;
|
|
1390
|
+
try {
|
|
1391
|
+
const img = sharp(bytes);
|
|
1392
|
+
format = (await img.metadata()).format ?? "unknown";
|
|
1393
|
+
png = await img.png({ force: true }).toBuffer();
|
|
1394
|
+
} catch (e) {
|
|
1395
|
+
throw new Error(`bytes are not a decodable image (${e.message})`);
|
|
1396
|
+
}
|
|
1397
|
+
return await fitToModel(png, "image/png", format);
|
|
1398
|
+
}
|
|
1399
|
+
function normalizationNote(image) {
|
|
1400
|
+
const parts = [];
|
|
1401
|
+
if (image.rasterizedFrom) parts.push(`normalized ${image.rasterizedFrom} -> ${image.mime}`);
|
|
1402
|
+
if (image.shrunkFromBytes !== void 0) {
|
|
1403
|
+
parts.push(
|
|
1404
|
+
`fitted ${image.shrunkFromBytes}B -> ${image.bytes.length}B as ${image.mime} (providers refuse a reference over ${MAX_MODEL_REFERENCE_BYTES}B)`
|
|
1405
|
+
);
|
|
1406
|
+
}
|
|
1407
|
+
return parts.length > 0 ? parts.join("; ") : null;
|
|
1408
|
+
}
|
|
1409
|
+
function hasAscii(buf, offset, sig) {
|
|
1410
|
+
return buf.length >= offset + sig.length && buf.toString("ascii", offset, offset + sig.length) === sig;
|
|
1411
|
+
}
|
|
1412
|
+
var HEIC_BRANDS = /* @__PURE__ */ new Set(["heic", "heix", "heim", "heis", "hevc", "hevx", "mif1", "msf1", "heif"]);
|
|
1413
|
+
function sniffIsoBmff(buf) {
|
|
1414
|
+
if (!hasAscii(buf, 4, "ftyp")) return null;
|
|
1415
|
+
const brand = buf.subarray(8, 12).toString("ascii");
|
|
1416
|
+
if (brand === "avif" || brand === "avis") return "image/avif";
|
|
1417
|
+
if (HEIC_BRANDS.has(brand)) return "image/heic";
|
|
1418
|
+
return null;
|
|
1419
|
+
}
|
|
1420
|
+
function sniffImageMime(buf) {
|
|
1421
|
+
if (buf.length < 4) return null;
|
|
1422
|
+
if (buf[0] === 137 && hasAscii(buf, 1, "PNG")) return "image/png";
|
|
1423
|
+
if (buf[0] === 255 && buf[1] === 216 && buf[2] === 255) return "image/jpeg";
|
|
1424
|
+
if (hasAscii(buf, 0, "GIF")) return "image/gif";
|
|
1425
|
+
if (hasAscii(buf, 0, "RIFF") && hasAscii(buf, 8, "WEBP")) return "image/webp";
|
|
1426
|
+
if (hasAscii(buf, 0, "II*\0") || hasAscii(buf, 0, "MM\0*")) return "image/tiff";
|
|
1427
|
+
if (hasAscii(buf, 0, "BM")) return "image/bmp";
|
|
1428
|
+
return sniffIsoBmff(buf);
|
|
1429
|
+
}
|
|
1430
|
+
function findBoxPayload(buf, start, end, type) {
|
|
1431
|
+
let offset = start;
|
|
1432
|
+
while (offset + 8 <= end) {
|
|
1433
|
+
let size = buf.readUInt32BE(offset);
|
|
1434
|
+
const boxType = buf.toString("ascii", offset + 4, offset + 8);
|
|
1435
|
+
let headerLen = 8;
|
|
1436
|
+
if (size === 1) {
|
|
1437
|
+
if (offset + 16 > end) return null;
|
|
1438
|
+
size = Number(buf.readBigUInt64BE(offset + 8));
|
|
1439
|
+
headerLen = 16;
|
|
1440
|
+
} else if (size === 0) {
|
|
1441
|
+
size = end - offset;
|
|
1442
|
+
}
|
|
1443
|
+
if (size < headerLen || offset + size > end) return null;
|
|
1444
|
+
if (boxType === type) return { start: offset + headerLen, end: offset + size };
|
|
1445
|
+
offset += size;
|
|
1446
|
+
}
|
|
1447
|
+
return null;
|
|
1448
|
+
}
|
|
1449
|
+
var MVHD_DURATION_UNKNOWN = 4294967295;
|
|
1450
|
+
function mp4DurationMs(bytes) {
|
|
1451
|
+
const buf = Buffer.isBuffer(bytes) ? bytes : Buffer.from(bytes);
|
|
1452
|
+
const moov = findBoxPayload(buf, 0, buf.length, "moov");
|
|
1453
|
+
if (!moov) return void 0;
|
|
1454
|
+
const mvhd = findBoxPayload(buf, moov.start, moov.end, "mvhd");
|
|
1455
|
+
if (!mvhd) return void 0;
|
|
1456
|
+
const version = buf[mvhd.start];
|
|
1457
|
+
const tsOffset = mvhd.start + 4 + (version === 1 ? 16 : 8);
|
|
1458
|
+
if (version === 1) {
|
|
1459
|
+
if (tsOffset + 12 > mvhd.end) return void 0;
|
|
1460
|
+
const timescale2 = buf.readUInt32BE(tsOffset);
|
|
1461
|
+
const duration2 = buf.readBigUInt64BE(tsOffset + 4);
|
|
1462
|
+
if (timescale2 === 0 || duration2 === 0n) return void 0;
|
|
1463
|
+
return Math.round(Number(duration2) / timescale2 * 1e3);
|
|
1464
|
+
}
|
|
1465
|
+
if (version !== 0) return void 0;
|
|
1466
|
+
if (tsOffset + 8 > mvhd.end) return void 0;
|
|
1467
|
+
const timescale = buf.readUInt32BE(tsOffset);
|
|
1468
|
+
const duration = buf.readUInt32BE(tsOffset + 4);
|
|
1469
|
+
if (timescale === 0 || duration === 0 || duration === MVHD_DURATION_UNKNOWN) return void 0;
|
|
1470
|
+
return Math.round(duration / timescale * 1e3);
|
|
1471
|
+
}
|
|
1472
|
+
function inferKindFromMime(mime) {
|
|
1473
|
+
if (mime.startsWith("image/")) return "image";
|
|
1474
|
+
if (mime.startsWith("video/")) return "video";
|
|
1475
|
+
if (mime.startsWith("audio/")) return "audio";
|
|
1476
|
+
if (mime === "application/json") return "json";
|
|
1477
|
+
if (mime.startsWith("text/")) return "text";
|
|
1478
|
+
if (mime.startsWith("font/")) return "font";
|
|
1479
|
+
return null;
|
|
1480
|
+
}
|
|
1481
|
+
function localExecError(ctx, message2) {
|
|
1482
|
+
return new NodeExecutionError(ctx.nodeId, ctx.nodeType, {
|
|
1483
|
+
kind: "local",
|
|
1484
|
+
cause: new Error(`ingest: ${message2}`)
|
|
1485
|
+
});
|
|
1486
|
+
}
|
|
1487
|
+
async function execLocalFile(params, ctx) {
|
|
1488
|
+
const absPath = resolveLocalPath(params.path);
|
|
1489
|
+
let stats;
|
|
1490
|
+
try {
|
|
1491
|
+
stats = await stat2(absPath);
|
|
1492
|
+
} catch (e) {
|
|
1493
|
+
const code = e.code;
|
|
1494
|
+
if (code === "ENOENT") {
|
|
1495
|
+
throw localExecError(ctx, `file_not_found: ${absPath}`);
|
|
1496
|
+
}
|
|
1497
|
+
if (code === "EACCES") {
|
|
1498
|
+
throw localExecError(ctx, `permission_denied: ${absPath}`);
|
|
1499
|
+
}
|
|
1500
|
+
throw localExecError(ctx, `stat failed for ${absPath}: ${e.message}`);
|
|
1501
|
+
}
|
|
1502
|
+
if (!stats.isFile()) {
|
|
1503
|
+
throw localExecError(ctx, `not_a_file: ${absPath} (isDirectory=${stats.isDirectory()})`);
|
|
1504
|
+
}
|
|
1505
|
+
if (stats.size > MAX_ASSET_BYTES) {
|
|
1506
|
+
throw localExecError(ctx, `file_too_large: ${absPath} is ${stats.size} bytes (limit ${MAX_ASSET_BYTES})`);
|
|
1507
|
+
}
|
|
1508
|
+
let bytes;
|
|
1509
|
+
try {
|
|
1510
|
+
bytes = await readFile2(absPath);
|
|
1511
|
+
} catch (e) {
|
|
1512
|
+
if (e.code === "EACCES") {
|
|
1513
|
+
throw localExecError(ctx, `permission_denied: ${absPath}`);
|
|
1514
|
+
}
|
|
1515
|
+
throw localExecError(ctx, `read failed for ${absPath}: ${e.message}`);
|
|
1516
|
+
}
|
|
1517
|
+
const mime = inferMimeFromPath(absPath, bytes);
|
|
1518
|
+
const kind = inferKindFromMime(mime);
|
|
1519
|
+
if (kind === null) {
|
|
1520
|
+
throw localExecError(
|
|
1521
|
+
ctx,
|
|
1522
|
+
`kind_mismatch: ${absPath} has mime=${mime} which doesn't map to any ingest kind (image/video/audio/text/json/font). If this is a PDF and you want text extraction, host it via URL and use source="url".`
|
|
1523
|
+
);
|
|
1524
|
+
}
|
|
1525
|
+
if (kind !== params.expect) {
|
|
1526
|
+
throw localExecError(ctx, `kind_mismatch: expect=${params.expect} but ${absPath} has mime=${mime} (kind=${kind})`);
|
|
1527
|
+
}
|
|
1528
|
+
ctx.log(`ingest: local file ${stats.size}B mime=${mime}`);
|
|
1529
|
+
let outBytes = bytes;
|
|
1530
|
+
let outMime = mime;
|
|
1531
|
+
let rasterizedFrom;
|
|
1532
|
+
if (kind === "image") {
|
|
1533
|
+
const normalized = await toModelSafeImage(bytes);
|
|
1534
|
+
outBytes = normalized.bytes;
|
|
1535
|
+
outMime = normalized.mime;
|
|
1536
|
+
rasterizedFrom = normalized.rasterizedFrom;
|
|
1537
|
+
const note = normalizationNote(normalized);
|
|
1538
|
+
if (note) ctx.log(`ingest: ${note}`);
|
|
1539
|
+
}
|
|
1540
|
+
const durationMs = probeVideoDurationMs(params.expect, outBytes, ctx);
|
|
1541
|
+
const ref = await uploadAndIngest({
|
|
1542
|
+
bytes: outBytes,
|
|
1543
|
+
kind: params.expect,
|
|
1544
|
+
mime: outMime,
|
|
1545
|
+
metadata: localFileMetadata({ absPath, fileSize: stats.size, mime, durationMs, rasterizedFrom }),
|
|
1546
|
+
ctx
|
|
1547
|
+
});
|
|
1548
|
+
return withProbedDuration(ref, durationMs);
|
|
1549
|
+
}
|
|
1550
|
+
function probeVideoDurationMs(expect, bytes, ctx) {
|
|
1551
|
+
if (expect !== "video") return void 0;
|
|
1552
|
+
const durationMs = mp4DurationMs(bytes);
|
|
1553
|
+
if (durationMs !== void 0) ctx.log(`ingest: probed video duration ${durationMs}ms`);
|
|
1554
|
+
return durationMs;
|
|
1555
|
+
}
|
|
1556
|
+
function localFileMetadata(args) {
|
|
1557
|
+
return {
|
|
1558
|
+
source_path: args.absPath,
|
|
1559
|
+
strategy: "local_file",
|
|
1560
|
+
ingested_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1561
|
+
file_size: args.fileSize,
|
|
1562
|
+
original_filename: path2.basename(args.absPath),
|
|
1563
|
+
...args.rasterizedFrom ? { rasterized_from: args.rasterizedFrom } : {},
|
|
1564
|
+
...args.durationMs !== void 0 ? { duration_ms: args.durationMs } : {}
|
|
1565
|
+
};
|
|
1566
|
+
}
|
|
1567
|
+
function withProbedDuration(ref, durationMs) {
|
|
1568
|
+
if (durationMs === void 0 || ref.kind !== "video") return ref;
|
|
1569
|
+
return { ...ref, duration_ms: durationMs };
|
|
1570
|
+
}
|
|
1571
|
+
var YT_DLP_MIME = {
|
|
1572
|
+
image: "image/png",
|
|
1573
|
+
video: "video/mp4",
|
|
1574
|
+
audio: "audio/mp4",
|
|
1575
|
+
text: "text/plain",
|
|
1576
|
+
json: "application/json",
|
|
1577
|
+
font: "font/ttf"
|
|
1578
|
+
// unreachable — resolveStrategy never routes font to yt_dlp
|
|
1579
|
+
};
|
|
1580
|
+
async function execYtDlp(params, ctx) {
|
|
1581
|
+
if (params.expect !== "video" && params.expect !== "audio") {
|
|
1582
|
+
throw new Error(`ingest: yt_dlp only handles video/audio, got expect=${params.expect}`);
|
|
1583
|
+
}
|
|
1584
|
+
const workDir = await mkdtemp(path2.join(tmpdir(), "ingest-yt-"));
|
|
1585
|
+
try {
|
|
1586
|
+
const { filePath, info, reducedQuality } = await runYtDlpForNode({
|
|
1587
|
+
url: params.url,
|
|
1588
|
+
audioOnly: params.expect === "audio",
|
|
1589
|
+
workDir,
|
|
1590
|
+
ctx
|
|
1591
|
+
});
|
|
1592
|
+
const downloadedStats = await stat2(filePath);
|
|
1593
|
+
if (downloadedStats.size > MAX_ASSET_BYTES) {
|
|
1594
|
+
throw localExecError(
|
|
1595
|
+
ctx,
|
|
1596
|
+
`file_too_large: yt-dlp output for ${params.url} is ${downloadedStats.size} bytes (limit ${MAX_ASSET_BYTES})`
|
|
1597
|
+
);
|
|
1598
|
+
}
|
|
1599
|
+
const bytes = await readFile2(filePath);
|
|
1600
|
+
const kind = params.expect;
|
|
1601
|
+
const mime = YT_DLP_MIME[kind];
|
|
1602
|
+
const metadata = buildYtDlpMetadata(params.url, info);
|
|
1603
|
+
if (reducedQuality) {
|
|
1604
|
+
metadata.reduced_quality = true;
|
|
1605
|
+
ctx.log(`ingest: ${params.url} was only available at reduced resolution`);
|
|
1606
|
+
}
|
|
1607
|
+
return await uploadAndIngest({ bytes, kind, mime, metadata, ctx });
|
|
1608
|
+
} finally {
|
|
1609
|
+
await rm(workDir, { recursive: true, force: true }).catch((e) => {
|
|
1610
|
+
ctx.log(`ingest: tmp cleanup failed (${e.message})`);
|
|
1611
|
+
});
|
|
1612
|
+
}
|
|
1613
|
+
}
|
|
1614
|
+
async function runYtDlpForNode(args) {
|
|
1615
|
+
try {
|
|
1616
|
+
return await runYtDlp({
|
|
1617
|
+
url: args.url,
|
|
1618
|
+
audioOnly: args.audioOnly,
|
|
1619
|
+
workDir: args.workDir,
|
|
1620
|
+
onLog: (message2) => args.ctx.log(`ingest: ${message2}`)
|
|
1621
|
+
});
|
|
1622
|
+
} catch (error) {
|
|
1623
|
+
if (error instanceof YtDlpError) {
|
|
1624
|
+
throw new NodeExecutionError(args.ctx.nodeId, args.ctx.nodeType, {
|
|
1625
|
+
kind: "local",
|
|
1626
|
+
cause: new Error(describeYtDlpFailure(error.message, error.stderrTail))
|
|
1627
|
+
});
|
|
1628
|
+
}
|
|
1629
|
+
throw error;
|
|
1630
|
+
}
|
|
1631
|
+
}
|
|
1632
|
+
function describeYtDlpFailure(message2, stderrTail) {
|
|
1633
|
+
const base = stderrTail ? `${message2}
|
|
1634
|
+
${stderrTail}` : message2;
|
|
1635
|
+
if (!/CERTIFICATE_VERIFY_FAILED|SSL certificate problem/i.test(stderrTail)) return base;
|
|
1636
|
+
return `${base}
|
|
1637
|
+
This machine could not verify the download's TLS certificate; the file itself is fine. Report it and leave this ingest as it is. Never copy the file out of canvas/ (the render cache or a run folder) to work around it: canvas/ is not committed, so the creative would fail every later publish. To reuse one of our own outputs, ingest its canvas-assets URL, which does not go through this downloader.`;
|
|
1638
|
+
}
|
|
1639
|
+
function buildYtDlpMetadata(sourceUrl, info) {
|
|
1640
|
+
const out = {
|
|
1641
|
+
source_url: sourceUrl,
|
|
1642
|
+
strategy: "yt_dlp",
|
|
1643
|
+
ingested_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
1644
|
+
};
|
|
1645
|
+
if (typeof info.title === "string") out.original_title = info.title;
|
|
1646
|
+
if (typeof info.uploader === "string") out.original_uploader = info.uploader;
|
|
1647
|
+
if (typeof info.duration === "number") out.original_duration_s = info.duration;
|
|
1648
|
+
if (typeof info.webpage_url === "string") out.webpage_url = info.webpage_url;
|
|
1649
|
+
if (typeof info.width === "number") out.width = info.width;
|
|
1650
|
+
if (typeof info.height === "number") out.height = info.height;
|
|
1651
|
+
return out;
|
|
1652
|
+
}
|
|
1653
|
+
async function uploadAndIngest(args) {
|
|
1654
|
+
const sha = sha256Hex(args.bytes);
|
|
1655
|
+
const publicUrl = await presignAndPut({ bytes: args.bytes, sha256: sha, mime: args.mime, ctx: args.ctx });
|
|
1656
|
+
const localRef = await args.ctx.assets.ingestBytes({
|
|
1657
|
+
bytes: args.bytes,
|
|
1658
|
+
kind: args.kind,
|
|
1659
|
+
mime: args.mime,
|
|
1660
|
+
metadata: args.metadata
|
|
1661
|
+
});
|
|
1662
|
+
return { ...localRef, url: publicUrl };
|
|
1663
|
+
}
|
|
1664
|
+
async function ytDlpVersion() {
|
|
1665
|
+
try {
|
|
1666
|
+
const { stdout } = await execFile(YT_DLP_BIN, ["--version"], { encoding: "utf-8", maxBuffer: 64 * 1024 });
|
|
1667
|
+
return stdout.trim();
|
|
1668
|
+
} catch {
|
|
1669
|
+
return "yt-dlp:unknown";
|
|
1670
|
+
}
|
|
1671
|
+
}
|
|
1672
|
+
async function fileSha256(abs) {
|
|
1673
|
+
const hash = createHash2("sha256");
|
|
1674
|
+
for await (const chunk of createReadStream(abs)) hash.update(chunk);
|
|
1675
|
+
return hash.digest("hex");
|
|
1676
|
+
}
|
|
1677
|
+
ingestNode.cacheKeyExtras = async ({ params }) => {
|
|
1678
|
+
const p = params;
|
|
1679
|
+
const extras = {};
|
|
1680
|
+
if (p.source === "path" && typeof p.path === "string") {
|
|
1681
|
+
try {
|
|
1682
|
+
extras.local_file_sha256 = await fileSha256(resolveLocalPath(p.path));
|
|
1683
|
+
} catch {
|
|
1684
|
+
}
|
|
1685
|
+
}
|
|
1686
|
+
if (p.source === "url" && (p.expect === "video" || p.expect === "audio") && !(typeof p.url === "string" && takesCanvasAssetVerbatim(p.url, p.expect))) {
|
|
1687
|
+
extras.yt_dlp_version = await ytDlpVersion();
|
|
1688
|
+
}
|
|
1689
|
+
return extras;
|
|
1690
|
+
};
|
|
1691
|
+
|
|
1692
|
+
export {
|
|
1693
|
+
looksLikeHttpUrl,
|
|
1694
|
+
resolveOutputKinds,
|
|
1695
|
+
defineNode,
|
|
1696
|
+
isBlocking,
|
|
1697
|
+
ValidationError,
|
|
1698
|
+
NodeExecutionError,
|
|
1699
|
+
RunAbortedError,
|
|
1700
|
+
LayerExecutionError,
|
|
1701
|
+
describeFailureReason,
|
|
1702
|
+
runFailureCode,
|
|
1703
|
+
failureDetail,
|
|
1704
|
+
ImageRef,
|
|
1705
|
+
VideoRef,
|
|
1706
|
+
AudioRef,
|
|
1707
|
+
JsonRef,
|
|
1708
|
+
TextRef,
|
|
1709
|
+
FontRef,
|
|
1710
|
+
ASSET_KINDS,
|
|
1711
|
+
contentShaOf,
|
|
1712
|
+
isAssetRef,
|
|
1713
|
+
isAssetRefArray,
|
|
1714
|
+
isUrlOnlyRef,
|
|
1715
|
+
isStageableRef,
|
|
1716
|
+
sha256Hex,
|
|
1717
|
+
MAX_ASSET_BYTES,
|
|
1718
|
+
extForMime,
|
|
1719
|
+
LocalAssetStore,
|
|
1720
|
+
forEachString,
|
|
1721
|
+
forEachObject,
|
|
1722
|
+
mapStrings,
|
|
1723
|
+
mapObjects,
|
|
1724
|
+
mapObjectsAsync,
|
|
1725
|
+
isPersistedAssetRef,
|
|
1726
|
+
collectAssetRefLikes,
|
|
1727
|
+
RemoteCacheStore,
|
|
1728
|
+
LayeredCacheStore,
|
|
1729
|
+
requireCredentialsFromEnv,
|
|
1730
|
+
remoteCacheEnabledFromEnv,
|
|
1731
|
+
BackendHttpError,
|
|
1732
|
+
HttpClient,
|
|
1733
|
+
classifyBackendError,
|
|
1734
|
+
persistOutputAssetUrls,
|
|
1735
|
+
delegated,
|
|
1736
|
+
callBackendExec,
|
|
1737
|
+
coercePathUrlToUrl,
|
|
1738
|
+
ingestNode,
|
|
1739
|
+
canvasAssetMime,
|
|
1740
|
+
inferMimeFromPath,
|
|
1741
|
+
toModelSafeImage,
|
|
1742
|
+
uploadAndIngest
|
|
1743
|
+
};
|
|
1744
|
+
//# sourceMappingURL=chunk-SVNH6P7O.js.map
|