@koda-sl/baker-cli 0.383.0 → 0.384.0-dev.557795bef
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 +1102 -218
- package/canvas/tiktok-captions-composition/index.html +5 -6
- package/canvas/tiktok-captions-composition/meta.json +5 -0
- package/dist/account-4UEZAY5T.js +49 -0
- package/dist/account-4UEZAY5T.js.map +1 -0
- package/dist/account-OINZG6UP.js +80 -0
- package/dist/account-OINZG6UP.js.map +1 -0
- package/dist/account-QMDCUUSG.js +79 -0
- package/dist/account-QMDCUUSG.js.map +1 -0
- package/dist/account-reads-ZKKDYHK5.js +218 -0
- package/dist/account-reads-ZKKDYHK5.js.map +1 -0
- package/dist/account-writes-N4JDIDRB.js +66 -0
- package/dist/account-writes-N4JDIDRB.js.map +1 -0
- package/dist/accounts-AEBQFCNH.js +114 -0
- package/dist/accounts-AEBQFCNH.js.map +1 -0
- package/dist/accounts-EBGJ2YO7.js +611 -0
- package/dist/accounts-EBGJ2YO7.js.map +1 -0
- package/dist/accounts-HP4BLKK5.js +75 -0
- package/dist/accounts-HP4BLKK5.js.map +1 -0
- package/dist/accounts-YE2SQ3UQ.js +77 -0
- package/dist/accounts-YE2SQ3UQ.js.map +1 -0
- package/dist/accounts-Z4CLGQXJ.js +115 -0
- package/dist/accounts-Z4CLGQXJ.js.map +1 -0
- package/dist/actions-ADRIEQZX.js +55 -0
- package/dist/actions-ADRIEQZX.js.map +1 -0
- package/dist/active-entities-YB46ADQN.js +103 -0
- package/dist/active-entities-YB46ADQN.js.map +1 -0
- package/dist/activities-DUAIQJLN.js +74 -0
- package/dist/activities-DUAIQJLN.js.map +1 -0
- package/dist/ad-group-writes-HL3EZ3BT.js +170 -0
- package/dist/ad-group-writes-HL3EZ3BT.js.map +1 -0
- package/dist/ad-groups-FGS5JJGN.js +68 -0
- package/dist/ad-groups-FGS5JJGN.js.map +1 -0
- package/dist/ad-writes-LX4ACUHB.js +174 -0
- package/dist/ad-writes-LX4ACUHB.js.map +1 -0
- package/dist/add-5CUXNOUM.js +97 -0
- package/dist/add-5CUXNOUM.js.map +1 -0
- package/dist/add-6OXOQNET.js +302 -0
- package/dist/add-6OXOQNET.js.map +1 -0
- package/dist/add-E66HBIZV.js +105 -0
- package/dist/add-E66HBIZV.js.map +1 -0
- package/dist/add-ROK3ETQC.js +104 -0
- package/dist/add-ROK3ETQC.js.map +1 -0
- package/dist/add-accounts-YME5SCXD.js +91 -0
- package/dist/add-accounts-YME5SCXD.js.map +1 -0
- package/dist/ads-65R3WMDU.js +128 -0
- package/dist/ads-65R3WMDU.js.map +1 -0
- package/dist/ads-O63J7BDF.js +113 -0
- package/dist/ads-O63J7BDF.js.map +1 -0
- package/dist/ads-TFZ5PXKS.js +77 -0
- package/dist/ads-TFZ5PXKS.js.map +1 -0
- package/dist/ads-XSVRH45E.js +40 -0
- package/dist/ads-XSVRH45E.js.map +1 -0
- package/dist/adsets-Y62JOOTV.js +176 -0
- package/dist/adsets-Y62JOOTV.js.map +1 -0
- package/dist/advertisers-AIC4QPEK.js +120 -0
- package/dist/advertisers-AIC4QPEK.js.map +1 -0
- package/dist/advertisers-LJ2HKJ4W.js +125 -0
- package/dist/advertisers-LJ2HKJ4W.js.map +1 -0
- package/dist/analytics-N4PGXXEQ.js +1976 -0
- package/dist/analytics-N4PGXXEQ.js.map +1 -0
- package/dist/analytics-X3DR3UVG.js +433 -0
- package/dist/analytics-X3DR3UVG.js.map +1 -0
- package/dist/animate-E3SKQ6SI.js +480 -0
- package/dist/animate-E3SKQ6SI.js.map +1 -0
- package/dist/assign-Y7HGSQVJ.js +77 -0
- package/dist/assign-Y7HGSQVJ.js.map +1 -0
- package/dist/audience-size-SWX5YJQF.js +94 -0
- package/dist/audience-size-SWX5YJQF.js.map +1 -0
- package/dist/audiences-5A6BCWSA.js +268 -0
- package/dist/audiences-5A6BCWSA.js.map +1 -0
- package/dist/audiences-6QOCASVV.js +78 -0
- package/dist/audiences-6QOCASVV.js.map +1 -0
- package/dist/audiences-O67NGIP5.js +85 -0
- package/dist/audiences-O67NGIP5.js.map +1 -0
- package/dist/audit-2KVLWSAI.js +151 -0
- package/dist/audit-2KVLWSAI.js.map +1 -0
- package/dist/audit-HWK24VXI.js +88 -0
- package/dist/audit-HWK24VXI.js.map +1 -0
- package/dist/autocomplete-JJSGC5WU.js +111 -0
- package/dist/autocomplete-JJSGC5WU.js.map +1 -0
- package/dist/avatars-XIEKQ77J.js +38 -0
- package/dist/avatars-XIEKQ77J.js.map +1 -0
- package/dist/bid-pricing-D2HGRWZL.js +99 -0
- package/dist/bid-pricing-D2HGRWZL.js.map +1 -0
- package/dist/brand-AYYWRGIE.js +22 -0
- package/dist/brand-AYYWRGIE.js.map +1 -0
- package/dist/brief-3HUIDK5F.js +490 -0
- package/dist/brief-3HUIDK5F.js.map +1 -0
- package/dist/businesses-65EWTK5E.js +53 -0
- package/dist/businesses-65EWTK5E.js.map +1 -0
- package/dist/campaign-groups-6HCYR2JX.js +95 -0
- package/dist/campaign-groups-6HCYR2JX.js.map +1 -0
- package/dist/campaign-writes-M6JLF5AC.js +170 -0
- package/dist/campaign-writes-M6JLF5AC.js.map +1 -0
- package/dist/campaign-writes-Y6QPRQ4E.js +165 -0
- package/dist/campaign-writes-Y6QPRQ4E.js.map +1 -0
- package/dist/campaigns-6SM2ZSIH.js +76 -0
- package/dist/campaigns-6SM2ZSIH.js.map +1 -0
- package/dist/campaigns-7RKJZRY2.js +107 -0
- package/dist/campaigns-7RKJZRY2.js.map +1 -0
- package/dist/campaigns-KRI25JDZ.js +109 -0
- package/dist/campaigns-KRI25JDZ.js.map +1 -0
- package/dist/campaigns-TD7ZB5DG.js +110 -0
- package/dist/campaigns-TD7ZB5DG.js.map +1 -0
- package/dist/canvas-DMYY2DWI.js +46 -0
- package/dist/canvas-DMYY2DWI.js.map +1 -0
- package/dist/capabilities-3WJTXS2O.js +144 -0
- package/dist/capabilities-3WJTXS2O.js.map +1 -0
- package/dist/cards-7HRC4UQQ.js +85 -0
- package/dist/cards-7HRC4UQQ.js.map +1 -0
- package/dist/catalog-N6MDMIVL.js +64 -0
- package/dist/catalog-N6MDMIVL.js.map +1 -0
- package/dist/catalogs-PB46L7FH.js +128 -0
- package/dist/catalogs-PB46L7FH.js.map +1 -0
- package/dist/changes-SASUQK62.js +135 -0
- package/dist/changes-SASUQK62.js.map +1 -0
- package/dist/chatgpt-JKBSAG25.js +47 -0
- package/dist/chatgpt-JKBSAG25.js.map +1 -0
- package/dist/chats-WRVSQQB2.js +262 -0
- package/dist/chats-WRVSQQB2.js.map +1 -0
- package/dist/chunk-2FGKJY63.js +455 -0
- package/dist/chunk-2FGKJY63.js.map +1 -0
- package/dist/chunk-2GVXNKAE.js +42 -0
- package/dist/chunk-2GVXNKAE.js.map +1 -0
- package/dist/chunk-2J3PTIQB.js +479 -0
- package/dist/chunk-2J3PTIQB.js.map +1 -0
- package/dist/chunk-2J7XC2NO.js +346 -0
- package/dist/chunk-2J7XC2NO.js.map +1 -0
- package/dist/{chunk-VLUGGVJL.js → chunk-2UFRHW3T.js} +12 -4
- package/dist/chunk-2UFRHW3T.js.map +1 -0
- package/dist/chunk-2Y5V23PU.js +29 -0
- package/dist/chunk-2Y5V23PU.js.map +1 -0
- package/dist/chunk-3ACMDRSE.js +39 -0
- package/dist/chunk-3ACMDRSE.js.map +1 -0
- package/dist/chunk-3EWF7VII.js +1079 -0
- package/dist/chunk-3EWF7VII.js.map +1 -0
- package/dist/chunk-3LYMIKKN.js +625 -0
- package/dist/chunk-3LYMIKKN.js.map +1 -0
- package/dist/chunk-3M6RNCDD.js +26 -0
- package/dist/chunk-3M6RNCDD.js.map +1 -0
- package/dist/chunk-3MDO4RR2.js +310 -0
- package/dist/chunk-3MDO4RR2.js.map +1 -0
- package/dist/chunk-3NPOIHSX.js +6667 -0
- package/dist/chunk-3NPOIHSX.js.map +1 -0
- package/dist/chunk-3SK7TWGP.js +103 -0
- package/dist/chunk-3SK7TWGP.js.map +1 -0
- package/dist/chunk-3VXQYDJN.js +1743 -0
- package/dist/chunk-3VXQYDJN.js.map +1 -0
- package/dist/chunk-44VXKO65.js +106 -0
- package/dist/chunk-44VXKO65.js.map +1 -0
- package/dist/chunk-4NZ47VXO.js +137 -0
- package/dist/chunk-4NZ47VXO.js.map +1 -0
- package/dist/chunk-4X3UR372.js +225 -0
- package/dist/chunk-4X3UR372.js.map +1 -0
- package/dist/chunk-553XSIFW.js +304 -0
- package/dist/chunk-553XSIFW.js.map +1 -0
- package/dist/chunk-5FEBUCJU.js +25 -0
- package/dist/chunk-5FEBUCJU.js.map +1 -0
- package/dist/chunk-5HYSKH77.js +315 -0
- package/dist/chunk-5HYSKH77.js.map +1 -0
- package/dist/chunk-5MBPIONY.js +29 -0
- package/dist/chunk-5MBPIONY.js.map +1 -0
- package/dist/chunk-5UCP4EEQ.js +111 -0
- package/dist/chunk-5UCP4EEQ.js.map +1 -0
- package/dist/chunk-5VPJNNJL.js +494 -0
- package/dist/chunk-5VPJNNJL.js.map +1 -0
- package/dist/{chunk-VZEDAFAR.js → chunk-6YYSUISH.js} +47 -8
- package/dist/chunk-6YYSUISH.js.map +1 -0
- package/dist/chunk-7OHWEF3I.js +98 -0
- package/dist/chunk-7OHWEF3I.js.map +1 -0
- package/dist/chunk-A636XRD7.js +159 -0
- package/dist/chunk-A636XRD7.js.map +1 -0
- package/dist/chunk-A76FRBSF.js +297 -0
- package/dist/chunk-A76FRBSF.js.map +1 -0
- package/dist/chunk-AADVCEL4.js +817 -0
- package/dist/chunk-AADVCEL4.js.map +1 -0
- package/dist/chunk-AG62YO7C.js +96 -0
- package/dist/chunk-AG62YO7C.js.map +1 -0
- package/dist/chunk-AIRIT4GF.js +75 -0
- package/dist/chunk-AIRIT4GF.js.map +1 -0
- package/dist/chunk-AMCY5YCB.js +206 -0
- package/dist/chunk-AMCY5YCB.js.map +1 -0
- package/dist/chunk-AP3TP6VG.js +139 -0
- package/dist/chunk-AP3TP6VG.js.map +1 -0
- package/dist/chunk-APP475IQ.js +474 -0
- package/dist/chunk-APP475IQ.js.map +1 -0
- package/dist/chunk-AR7PU7BB.js +76 -0
- package/dist/chunk-AR7PU7BB.js.map +1 -0
- package/dist/chunk-B4S72KSS.js +172 -0
- package/dist/chunk-B4S72KSS.js.map +1 -0
- package/dist/chunk-BIPIL4QA.js +486 -0
- package/dist/chunk-BIPIL4QA.js.map +1 -0
- package/dist/chunk-BPUSL5Y2.js +58 -0
- package/dist/chunk-BPUSL5Y2.js.map +1 -0
- package/dist/chunk-BR32GHYD.js +65 -0
- package/dist/chunk-BR32GHYD.js.map +1 -0
- package/dist/chunk-CAMX6OHF.js +3182 -0
- package/dist/chunk-CAMX6OHF.js.map +1 -0
- package/dist/{chunk-MF7YA62W.js → chunk-CUL3VB4L.js} +10 -5
- package/dist/chunk-CUL3VB4L.js.map +1 -0
- package/dist/chunk-CVEY353K.js +66 -0
- package/dist/chunk-CVEY353K.js.map +1 -0
- package/dist/chunk-CWXADUKL.js +1599 -0
- package/dist/chunk-CWXADUKL.js.map +1 -0
- package/dist/chunk-D5FY4FAK.js +24 -0
- package/dist/chunk-D5FY4FAK.js.map +1 -0
- package/dist/chunk-DGCUPJZD.js +39 -0
- package/dist/chunk-DGCUPJZD.js.map +1 -0
- package/dist/chunk-DNCLWSHO.js +41 -0
- package/dist/chunk-DNCLWSHO.js.map +1 -0
- package/dist/chunk-DUPURL26.js +97 -0
- package/dist/chunk-DUPURL26.js.map +1 -0
- package/dist/chunk-E2ZOSNF5.js +96 -0
- package/dist/chunk-E2ZOSNF5.js.map +1 -0
- package/dist/chunk-E3HYHT7C.js +274 -0
- package/dist/chunk-E3HYHT7C.js.map +1 -0
- package/dist/chunk-EDLZGTGN.js +216 -0
- package/dist/chunk-EDLZGTGN.js.map +1 -0
- package/dist/chunk-EI5QN4UO.js +363 -0
- package/dist/chunk-EI5QN4UO.js.map +1 -0
- package/dist/{chunk-XHC4LMK4.js → chunk-EIGXX6KI.js} +16 -8
- package/dist/chunk-EIGXX6KI.js.map +1 -0
- package/dist/chunk-EPDE7ZRU.js +174 -0
- package/dist/chunk-EPDE7ZRU.js.map +1 -0
- package/dist/chunk-ERSX3MKH.js +34 -0
- package/dist/chunk-ERSX3MKH.js.map +1 -0
- package/dist/chunk-EVDRF4CI.js +509 -0
- package/dist/chunk-EVDRF4CI.js.map +1 -0
- package/dist/chunk-F4IEILTR.js +382 -0
- package/dist/chunk-F4IEILTR.js.map +1 -0
- package/dist/chunk-F7HRLPR5.js +67 -0
- package/dist/chunk-F7HRLPR5.js.map +1 -0
- package/dist/chunk-FEG6MN4H.js +84 -0
- package/dist/chunk-FEG6MN4H.js.map +1 -0
- package/dist/chunk-FKOECEVC.js +126 -0
- package/dist/chunk-FKOECEVC.js.map +1 -0
- package/dist/chunk-FMGW2NZI.js +106 -0
- package/dist/chunk-FMGW2NZI.js.map +1 -0
- package/dist/chunk-FPZKKNDK.js +98 -0
- package/dist/chunk-FPZKKNDK.js.map +1 -0
- package/dist/chunk-FUVCY63N.js +169 -0
- package/dist/chunk-FUVCY63N.js.map +1 -0
- package/dist/chunk-GBNJQNDS.js +19 -0
- package/dist/chunk-GBNJQNDS.js.map +1 -0
- package/dist/chunk-GIWHHCD6.js +145 -0
- package/dist/chunk-GIWHHCD6.js.map +1 -0
- package/dist/chunk-GOJXKIFQ.js +1605 -0
- package/dist/chunk-GOJXKIFQ.js.map +1 -0
- package/dist/chunk-GRQ2AXDX.js +9 -0
- package/dist/chunk-GRQ2AXDX.js.map +1 -0
- package/dist/chunk-GXDLWBOY.js +73 -0
- package/dist/chunk-GXDLWBOY.js.map +1 -0
- package/dist/chunk-HAE4WWFQ.js +455 -0
- package/dist/chunk-HAE4WWFQ.js.map +1 -0
- package/dist/chunk-I2DNBEV6.js +4227 -0
- package/dist/chunk-I2DNBEV6.js.map +1 -0
- package/dist/chunk-I4FTS5EE.js +455 -0
- package/dist/chunk-I4FTS5EE.js.map +1 -0
- package/dist/chunk-IELPT4K2.js +74 -0
- package/dist/chunk-IELPT4K2.js.map +1 -0
- package/dist/chunk-IJMWEO4P.js +57 -0
- package/dist/chunk-IJMWEO4P.js.map +1 -0
- package/dist/chunk-IREMSVKW.js +175 -0
- package/dist/chunk-IREMSVKW.js.map +1 -0
- package/dist/chunk-IVIJJXXT.js +62 -0
- package/dist/chunk-IVIJJXXT.js.map +1 -0
- package/dist/chunk-JD3W3ON7.js +188 -0
- package/dist/chunk-JD3W3ON7.js.map +1 -0
- package/dist/chunk-JLWBK3VC.js +5187 -0
- package/dist/chunk-JLWBK3VC.js.map +1 -0
- package/dist/chunk-JPK34QPS.js +134 -0
- package/dist/chunk-JPK34QPS.js.map +1 -0
- package/dist/chunk-JUY47NZ2.js +183 -0
- package/dist/chunk-JUY47NZ2.js.map +1 -0
- package/dist/chunk-JXMZEOHV.js +333 -0
- package/dist/chunk-JXMZEOHV.js.map +1 -0
- package/dist/chunk-K37K447U.js +51 -0
- package/dist/chunk-K37K447U.js.map +1 -0
- package/dist/chunk-K6TDB2KV.js +1442 -0
- package/dist/chunk-K6TDB2KV.js.map +1 -0
- package/dist/chunk-KIGGMKAE.js +66 -0
- package/dist/chunk-KIGGMKAE.js.map +1 -0
- package/dist/chunk-KKJ4KJCW.js +29 -0
- package/dist/chunk-KKJ4KJCW.js.map +1 -0
- package/dist/chunk-KONA5PSR.js +55 -0
- package/dist/chunk-KONA5PSR.js.map +1 -0
- package/dist/chunk-KVHRW7KO.js +60 -0
- package/dist/chunk-KVHRW7KO.js.map +1 -0
- package/dist/chunk-LA6PPSNA.js +65 -0
- package/dist/chunk-LA6PPSNA.js.map +1 -0
- package/dist/chunk-LKPJADL2.js +74 -0
- package/dist/chunk-LKPJADL2.js.map +1 -0
- package/dist/chunk-LWAEHLKV.js +74 -0
- package/dist/chunk-LWAEHLKV.js.map +1 -0
- package/dist/chunk-M6UNISGO.js +66 -0
- package/dist/chunk-M6UNISGO.js.map +1 -0
- package/dist/chunk-MIJAGBEP.js +23992 -0
- package/dist/chunk-MIJAGBEP.js.map +1 -0
- package/dist/chunk-MP4EXZ45.js +3151 -0
- package/dist/chunk-MP4EXZ45.js.map +1 -0
- package/dist/chunk-MYTDK3AL.js +2102 -0
- package/dist/chunk-MYTDK3AL.js.map +1 -0
- package/dist/chunk-MZQ5DX6S.js +125 -0
- package/dist/chunk-MZQ5DX6S.js.map +1 -0
- package/dist/chunk-NFSLRRIE.js +77 -0
- package/dist/chunk-NFSLRRIE.js.map +1 -0
- package/dist/chunk-NOK7MSVJ.js +533 -0
- package/dist/chunk-NOK7MSVJ.js.map +1 -0
- package/dist/chunk-NR5RZDAW.js +592 -0
- package/dist/chunk-NR5RZDAW.js.map +1 -0
- package/dist/chunk-O2EVJALZ.js +133 -0
- package/dist/chunk-O2EVJALZ.js.map +1 -0
- package/dist/chunk-O6UM5WWH.js +275 -0
- package/dist/chunk-O6UM5WWH.js.map +1 -0
- package/dist/chunk-O6XZIQXZ.js +6212 -0
- package/dist/chunk-O6XZIQXZ.js.map +1 -0
- package/dist/chunk-OIL6PU5W.js +35 -0
- package/dist/chunk-OIL6PU5W.js.map +1 -0
- package/dist/chunk-P4NSJS54.js +20 -0
- package/dist/chunk-P4NSJS54.js.map +1 -0
- package/dist/chunk-P5T7OZKV.js +26 -0
- package/dist/chunk-P5T7OZKV.js.map +1 -0
- package/dist/chunk-PFBQERWX.js +10 -0
- package/dist/chunk-PFBQERWX.js.map +1 -0
- package/dist/chunk-PSWVSLJU.js +56 -0
- package/dist/chunk-PSWVSLJU.js.map +1 -0
- package/dist/chunk-PY2NJ6XZ.js +191 -0
- package/dist/chunk-PY2NJ6XZ.js.map +1 -0
- package/dist/chunk-PZ4OM2LK.js +45 -0
- package/dist/chunk-PZ4OM2LK.js.map +1 -0
- package/dist/chunk-PZNOJ76W.js +541 -0
- package/dist/chunk-PZNOJ76W.js.map +1 -0
- package/dist/chunk-Q6ULQMWG.js +41 -0
- package/dist/chunk-Q6ULQMWG.js.map +1 -0
- package/dist/chunk-QKFD6PPX.js +57 -0
- package/dist/chunk-QKFD6PPX.js.map +1 -0
- package/dist/chunk-QMLGJ5OW.js +2891 -0
- package/dist/chunk-QMLGJ5OW.js.map +1 -0
- package/dist/chunk-R4TPDVBD.js +207 -0
- package/dist/chunk-R4TPDVBD.js.map +1 -0
- package/dist/chunk-R7QV5N2S.js +846 -0
- package/dist/chunk-R7QV5N2S.js.map +1 -0
- package/dist/chunk-RR3KT2E7.js +665 -0
- package/dist/chunk-RR3KT2E7.js.map +1 -0
- package/dist/chunk-SEPPFM5S.js +228 -0
- package/dist/chunk-SEPPFM5S.js.map +1 -0
- package/dist/chunk-SQ7DRYCC.js +150 -0
- package/dist/chunk-SQ7DRYCC.js.map +1 -0
- package/dist/chunk-SYULM665.js +610 -0
- package/dist/chunk-SYULM665.js.map +1 -0
- package/dist/chunk-TKT3OHZ6.js +170 -0
- package/dist/chunk-TKT3OHZ6.js.map +1 -0
- package/dist/chunk-TNOSX3PJ.js +136 -0
- package/dist/chunk-TNOSX3PJ.js.map +1 -0
- package/dist/chunk-TTVKI54A.js +160 -0
- package/dist/chunk-TTVKI54A.js.map +1 -0
- package/dist/chunk-U7ZVXFS3.js +23 -0
- package/dist/chunk-U7ZVXFS3.js.map +1 -0
- package/dist/chunk-UI6BKYQD.js +225 -0
- package/dist/chunk-UI6BKYQD.js.map +1 -0
- package/dist/chunk-UKLDW4UW.js +46 -0
- package/dist/chunk-UKLDW4UW.js.map +1 -0
- package/dist/chunk-V6XXXEXZ.js +76 -0
- package/dist/chunk-V6XXXEXZ.js.map +1 -0
- package/dist/chunk-V7BW2CIQ.js +92 -0
- package/dist/chunk-V7BW2CIQ.js.map +1 -0
- package/dist/chunk-VSU5R34H.js +76 -0
- package/dist/chunk-VSU5R34H.js.map +1 -0
- package/dist/chunk-W4SA4CMR.js +296 -0
- package/dist/chunk-W4SA4CMR.js.map +1 -0
- package/dist/chunk-WFUMNDCE.js +111 -0
- package/dist/chunk-WFUMNDCE.js.map +1 -0
- package/dist/chunk-WHWNXLTD.js +166 -0
- package/dist/chunk-WHWNXLTD.js.map +1 -0
- package/dist/chunk-WN4KX7GE.js +25 -0
- package/dist/chunk-WN4KX7GE.js.map +1 -0
- package/dist/chunk-XIY7P54H.js +84 -0
- package/dist/chunk-XIY7P54H.js.map +1 -0
- package/dist/chunk-YFPLNMPZ.js +337 -0
- package/dist/chunk-YFPLNMPZ.js.map +1 -0
- package/dist/chunk-YMBB4JBD.js +1830 -0
- package/dist/chunk-YMBB4JBD.js.map +1 -0
- package/dist/chunk-YQFM2P5W.js +197 -0
- package/dist/chunk-YQFM2P5W.js.map +1 -0
- package/dist/chunk-YQSBHWOI.js +41 -0
- package/dist/chunk-YTF3IVMF.js +149 -0
- package/dist/chunk-YTF3IVMF.js.map +1 -0
- package/dist/chunk-Z3ENMCFE.js +94 -0
- package/dist/chunk-Z3ENMCFE.js.map +1 -0
- package/dist/chunk-Z7MWSXLG.js +94 -0
- package/dist/chunk-Z7MWSXLG.js.map +1 -0
- package/dist/chunk-ZIXHS6AM.js +42 -0
- package/dist/chunk-ZIXHS6AM.js.map +1 -0
- package/dist/chunk-ZJ7TQUCU.js +4410 -0
- package/dist/chunk-ZJ7TQUCU.js.map +1 -0
- package/dist/chunk-ZNQRDLSS.js +52 -0
- package/dist/chunk-ZNQRDLSS.js.map +1 -0
- package/dist/claim-ROWH6JVB.js +197 -0
- package/dist/claim-ROWH6JVB.js.map +1 -0
- package/dist/cli.js +104 -69952
- package/dist/cli.js.map +1 -1
- package/dist/client-EURRWXPW.js +19 -0
- package/dist/code-FKQW7V7N.js +76 -0
- package/dist/code-FKQW7V7N.js.map +1 -0
- package/dist/companies-MD2MZKU6.js +195 -0
- package/dist/companies-MD2MZKU6.js.map +1 -0
- package/dist/complete-FCAJM6Z4.js +81 -0
- package/dist/complete-FCAJM6Z4.js.map +1 -0
- package/dist/config-OZOHIAOJ.js +88 -0
- package/dist/config-OZOHIAOJ.js.map +1 -0
- package/dist/connect-4YXFMXYX.js +42 -0
- package/dist/content-PCGSX2QU.js +85 -0
- package/dist/content-PCGSX2QU.js.map +1 -0
- package/dist/conversation-UX5NZ3IO.js +93 -0
- package/dist/conversation-UX5NZ3IO.js.map +1 -0
- package/dist/conversion-report-7QSWB2FY.js +125 -0
- package/dist/conversion-report-7QSWB2FY.js.map +1 -0
- package/dist/conversion-upload-command-XESIAQPU.js +438 -0
- package/dist/conversion-upload-command-XESIAQPU.js.map +1 -0
- package/dist/conversion-writes-BGOVLBS5.js +120 -0
- package/dist/conversion-writes-BGOVLBS5.js.map +1 -0
- package/dist/conversions-IYIWW4O7.js +76 -0
- package/dist/conversions-IYIWW4O7.js.map +1 -0
- package/dist/conversions-RLIJAE7E.js +135 -0
- package/dist/conversions-RLIJAE7E.js.map +1 -0
- package/dist/countries-5OBUVLLD.js +82 -0
- package/dist/countries-5OBUVLLD.js.map +1 -0
- package/dist/create-CUJLJUAQ.js +138 -0
- package/dist/create-CUJLJUAQ.js.map +1 -0
- package/dist/create-FENOT6DX.js +236 -0
- package/dist/create-FENOT6DX.js.map +1 -0
- package/dist/create-OFZQMOWO.js +59 -0
- package/dist/create-OFZQMOWO.js.map +1 -0
- package/dist/create-Z5SS2AWB.js +207 -0
- package/dist/create-Z5SS2AWB.js.map +1 -0
- package/dist/creatives-UJW2QBLH.js +182 -0
- package/dist/creatives-UJW2QBLH.js.map +1 -0
- package/dist/creatives-XI2DGQUZ.js +87 -0
- package/dist/creatives-XI2DGQUZ.js.map +1 -0
- package/dist/creatives-YLXQSROD.js +51 -0
- package/dist/creatives-YLXQSROD.js.map +1 -0
- package/dist/credentials-CH73QMD2.js +287 -0
- package/dist/credentials-CH73QMD2.js.map +1 -0
- package/dist/critique-C4WRQ4AJ.js +1449 -0
- package/dist/critique-C4WRQ4AJ.js.map +1 -0
- package/dist/critique-ZBNJ6MQ3.js +213 -0
- package/dist/critique-ZBNJ6MQ3.js.map +1 -0
- package/dist/crm-MJTT6GOJ.js +224 -0
- package/dist/crm-MJTT6GOJ.js.map +1 -0
- package/dist/crm-ZXHSEFYI.js +318 -0
- package/dist/crm-ZXHSEFYI.js.map +1 -0
- package/dist/crop-B52KIQ4O.js +113 -0
- package/dist/crop-B52KIQ4O.js.map +1 -0
- package/dist/currency-GGWF5DMU.js +88 -0
- package/dist/currency-GGWF5DMU.js.map +1 -0
- package/dist/custom-conversions-7WDBTC4X.js +125 -0
- package/dist/custom-conversions-7WDBTC4X.js.map +1 -0
- package/dist/customers-7E4HBSEY.js +56 -0
- package/dist/decide-PK7WNSQ2.js +199 -0
- package/dist/decide-PK7WNSQ2.js.map +1 -0
- package/dist/delete-56LKNEGA.js +71 -0
- package/dist/delete-56LKNEGA.js.map +1 -0
- package/dist/delete-DQY4ZSFN.js +54 -0
- package/dist/delete-DQY4ZSFN.js.map +1 -0
- package/dist/delete-EZ7HHOOD.js +69 -0
- package/dist/delete-EZ7HHOOD.js.map +1 -0
- package/dist/delete-JV4KAA6Y.js +66 -0
- package/dist/delete-JV4KAA6Y.js.map +1 -0
- package/dist/delete-YONJW4UZ.js +63 -0
- package/dist/delete-YONJW4UZ.js.map +1 -0
- package/dist/delete-YSYVFL6W.js +71 -0
- package/dist/delete-YSYVFL6W.js.map +1 -0
- package/dist/demographics-6N3TTYWC.js +138 -0
- package/dist/demographics-6N3TTYWC.js.map +1 -0
- package/dist/describe-AAVYIFE3.js +97 -0
- package/dist/describe-AAVYIFE3.js.map +1 -0
- package/dist/describe-UQFLWVFR.js +97 -0
- package/dist/describe-UQFLWVFR.js.map +1 -0
- package/dist/dimensions-QDXBG2XC.js +101 -0
- package/dist/dimensions-QDXBG2XC.js.map +1 -0
- package/dist/discard-S3NGGUSK.js +66 -0
- package/dist/discard-S3NGGUSK.js.map +1 -0
- package/dist/discover-6TEBPVNC.js +93 -0
- package/dist/discover-6TEBPVNC.js.map +1 -0
- package/dist/discover-SBZPB7T2.js +172 -0
- package/dist/discover-SBZPB7T2.js.map +1 -0
- package/dist/domain-AMAR76PB.js +98 -0
- package/dist/domain-AMAR76PB.js.map +1 -0
- package/dist/download-LV3GPOWV.js +299 -0
- package/dist/download-LV3GPOWV.js.map +1 -0
- package/dist/draft-6QZ7WMWM.js +217 -0
- package/dist/draft-6QZ7WMWM.js.map +1 -0
- package/dist/draft-DDFFTZ43.js +233 -0
- package/dist/draft-DDFFTZ43.js.map +1 -0
- package/dist/draft-FIKJXNIQ.js +281 -0
- package/dist/draft-FIKJXNIQ.js.map +1 -0
- package/dist/draft-GYGWTMBU.js +307 -0
- package/dist/draft-GYGWTMBU.js.map +1 -0
- package/dist/draft-KXL62WFS.js +328 -0
- package/dist/draft-KXL62WFS.js.map +1 -0
- package/dist/draft-N4LFPKTA.js +100 -0
- package/dist/draft-N4LFPKTA.js.map +1 -0
- package/dist/draft-POSLJCWG.js +306 -0
- package/dist/draft-POSLJCWG.js.map +1 -0
- package/dist/draft-XPO5RWST.js +103 -0
- package/dist/draft-XPO5RWST.js.map +1 -0
- package/dist/engine/index.d.ts +213 -127
- package/dist/engine/index.js +18 -4
- package/dist/{env-4P5HOGNA.js → env-TQ2XS2KY.js} +12 -2
- package/dist/env-TQ2XS2KY.js.map +1 -0
- package/dist/experiment-FQNKMORZ.js +1397 -0
- package/dist/experiment-FQNKMORZ.js.map +1 -0
- package/dist/export-4IZQZAPF.js +168 -0
- package/dist/export-4IZQZAPF.js.map +1 -0
- package/dist/extract-DZMGVQ7D.js +113 -0
- package/dist/extract-DZMGVQ7D.js.map +1 -0
- package/dist/facets-223V5P47.js +114 -0
- package/dist/facets-223V5P47.js.map +1 -0
- package/dist/favorites-DD2LNSTG.js +178 -0
- package/dist/favorites-DD2LNSTG.js.map +1 -0
- package/dist/feed-TUVFNX2U.js +177 -0
- package/dist/feed-TUVFNX2U.js.map +1 -0
- package/dist/feedback-MIW23MI2.js +66 -0
- package/dist/feedback-MIW23MI2.js.map +1 -0
- package/dist/feedback-record-RGKRKPGZ.js +175 -0
- package/dist/feedback-record-RGKRKPGZ.js.map +1 -0
- package/dist/fetch-O6UHNXWB.js +139 -0
- package/dist/fetch-O6UHNXWB.js.map +1 -0
- package/dist/fetch-TZ4UCMJK.js +176 -0
- package/dist/fetch-TZ4UCMJK.js.map +1 -0
- package/dist/find-4XKIBF4D.js +134 -0
- package/dist/find-4XKIBF4D.js.map +1 -0
- package/dist/fit-ODVVXV2Q.js +45 -0
- package/dist/fit-ODVVXV2Q.js.map +1 -0
- package/dist/flows-HVWBFZ7T.js +247 -0
- package/dist/flows-HVWBFZ7T.js.map +1 -0
- package/dist/follow-RCOXTZGY.js +94 -0
- package/dist/follow-RCOXTZGY.js.map +1 -0
- package/dist/follow-competitors-SQ5XBFTK.js +112 -0
- package/dist/follow-competitors-SQ5XBFTK.js.map +1 -0
- package/dist/following-VDU3BHC4.js +113 -0
- package/dist/following-VDU3BHC4.js.map +1 -0
- package/dist/fonts-NBIQAVQN.js +34 -0
- package/dist/fonts-NBIQAVQN.js.map +1 -0
- package/dist/forecast-2GJKBNBM.js +168 -0
- package/dist/forecast-2GJKBNBM.js.map +1 -0
- package/dist/forecast-76MUJBPO.js +104 -0
- package/dist/forecast-76MUJBPO.js.map +1 -0
- package/dist/funding-HTFVZLLG.js +85 -0
- package/dist/funding-HTFVZLLG.js.map +1 -0
- package/dist/funnel-FE2HIRVQ.js +394 -0
- package/dist/funnel-FE2HIRVQ.js.map +1 -0
- package/dist/ga4-2RC4EH7V.js +55 -0
- package/dist/ga4-2RC4EH7V.js.map +1 -0
- package/dist/generate-TPDOBCKQ.js +262 -0
- package/dist/generate-TPDOBCKQ.js.map +1 -0
- package/dist/get-6JNOVI27.js +56 -0
- package/dist/get-6JNOVI27.js.map +1 -0
- package/dist/get-FH2LIEYL.js +63 -0
- package/dist/get-FH2LIEYL.js.map +1 -0
- package/dist/get-GZLCDXXW.js +61 -0
- package/dist/get-GZLCDXXW.js.map +1 -0
- package/dist/get-KVAOPAQW.js +78 -0
- package/dist/get-KVAOPAQW.js.map +1 -0
- package/dist/get-TSPQYEKC.js +59 -0
- package/dist/get-TSPQYEKC.js.map +1 -0
- package/dist/get-TY3RXYNZ.js +63 -0
- package/dist/get-TY3RXYNZ.js.map +1 -0
- package/dist/get-VPW33XTN.js +92 -0
- package/dist/get-VPW33XTN.js.map +1 -0
- package/dist/gif-JFEYPFFI.js +94 -0
- package/dist/gif-JFEYPFFI.js.map +1 -0
- package/dist/google-R6RD4L6Z.js +136 -0
- package/dist/google-R6RD4L6Z.js.map +1 -0
- package/dist/google-VPQNRVIB.js +3190 -0
- package/dist/google-VPQNRVIB.js.map +1 -0
- package/dist/google-ads-JEQMNNMN.js +195 -0
- package/dist/google-ads-JEQMNNMN.js.map +1 -0
- package/dist/group-7AV6UL26.js +43 -0
- package/dist/group-7AV6UL26.js.map +1 -0
- package/dist/group-BVQZEZIC.js +43 -0
- package/dist/group-BVQZEZIC.js.map +1 -0
- package/dist/gsc-SQ42WAQE.js +30 -0
- package/dist/gsc-SQ42WAQE.js.map +1 -0
- package/dist/history-BNNHFURR.js +67 -0
- package/dist/history-BNNHFURR.js.map +1 -0
- package/dist/history-EHUQG4CE.js +133 -0
- package/dist/history-EHUQG4CE.js.map +1 -0
- package/dist/hubspot-JABE4USC.js +779 -0
- package/dist/hubspot-JABE4USC.js.map +1 -0
- package/dist/icon-OYTTSNSL.js +137 -0
- package/dist/icon-OYTTSNSL.js.map +1 -0
- package/dist/ideas-OD76WOQ3.js +32 -0
- package/dist/ideas-OD76WOQ3.js.map +1 -0
- package/dist/images-LY7AWWBK.js +90 -0
- package/dist/images-LY7AWWBK.js.map +1 -0
- package/dist/improve-W6GZNT2A.js +86 -0
- package/dist/improve-W6GZNT2A.js.map +1 -0
- package/dist/ingest-47WON6HT.js +23 -0
- package/dist/ingest-47WON6HT.js.map +1 -0
- package/dist/ingest-HDGGHBSJ.js +107 -0
- package/dist/ingest-HDGGHBSJ.js.map +1 -0
- package/dist/insights-IW7LGAWU.js +423 -0
- package/dist/insights-IW7LGAWU.js.map +1 -0
- package/dist/insights-QH54F56A.js +122 -0
- package/dist/insights-QH54F56A.js.map +1 -0
- package/dist/inspect-AJLG2HGL.js +189 -0
- package/dist/inspect-AJLG2HGL.js.map +1 -0
- package/dist/inspiration-RDQ3Y3N3.js +53 -0
- package/dist/inspiration-RDQ3Y3N3.js.map +1 -0
- package/dist/intent-5GSSCFZ2.js +95 -0
- package/dist/intent-5GSSCFZ2.js.map +1 -0
- package/dist/job-URVXJP75.js +202 -0
- package/dist/job-URVXJP75.js.map +1 -0
- package/dist/job-create-S4SECUVF.js +109 -0
- package/dist/job-create-S4SECUVF.js.map +1 -0
- package/dist/job-status-253SUCTJ.js +74 -0
- package/dist/job-status-253SUCTJ.js.map +1 -0
- package/dist/keep-GPSYDIGJ.js +78 -0
- package/dist/keep-GPSYDIGJ.js.map +1 -0
- package/dist/keyword-gap-NTFDX43B.js +130 -0
- package/dist/keyword-gap-NTFDX43B.js.map +1 -0
- package/dist/keyword-metrics-XSFLMBZX.js +197 -0
- package/dist/keyword-metrics-XSFLMBZX.js.map +1 -0
- package/dist/keywords-for-site-U4JLYXVE.js +128 -0
- package/dist/keywords-for-site-U4JLYXVE.js.map +1 -0
- package/dist/landing-AO72EGJ6.js +28 -0
- package/dist/landing-AO72EGJ6.js.map +1 -0
- package/dist/landings-NEF4PQL2.js +151 -0
- package/dist/landings-NEF4PQL2.js.map +1 -0
- package/dist/languages-3RDPPPTE.js +55 -0
- package/dist/languages-3RDPPPTE.js.map +1 -0
- package/dist/languages-CQX3YOIT.js +40 -0
- package/dist/languages-CQX3YOIT.js.map +1 -0
- package/dist/launches-GBHLJH5S.js +19 -0
- package/dist/launches-GBHLJH5S.js.map +1 -0
- package/dist/layerize-Q56C6LFG.js +190 -0
- package/dist/layerize-Q56C6LFG.js.map +1 -0
- package/dist/leads-JHUM6FYR.js +293 -0
- package/dist/leads-JHUM6FYR.js.map +1 -0
- package/dist/leads-UYZM2XQX.js +90 -0
- package/dist/leads-UYZM2XQX.js.map +1 -0
- package/dist/learn-D2KBGJHZ.js +203 -0
- package/dist/learn-D2KBGJHZ.js.map +1 -0
- package/dist/library-6VUFHTEK.js +109 -0
- package/dist/library-6VUFHTEK.js.map +1 -0
- package/dist/lighthouse-57U2GMPV.js +75 -0
- package/dist/lighthouse-57U2GMPV.js.map +1 -0
- package/dist/line-item-writes-R5GO6GTL.js +208 -0
- package/dist/line-item-writes-R5GO6GTL.js.map +1 -0
- package/dist/line-items-RBMH6YBZ.js +103 -0
- package/dist/line-items-RBMH6YBZ.js.map +1 -0
- package/dist/link-WS2RMCOP.js +64 -0
- package/dist/link-WS2RMCOP.js.map +1 -0
- package/dist/linkedin-FSIALZTS.js +1008 -0
- package/dist/linkedin-FSIALZTS.js.map +1 -0
- package/dist/list-2AE2Q4ZD.js +151 -0
- package/dist/list-2AE2Q4ZD.js.map +1 -0
- package/dist/list-E635Y6M4.js +303 -0
- package/dist/list-E635Y6M4.js.map +1 -0
- package/dist/list-G57ZO4PG.js +50 -0
- package/dist/list-G57ZO4PG.js.map +1 -0
- package/dist/list-JCSWZWDI.js +57 -0
- package/dist/list-JCSWZWDI.js.map +1 -0
- package/dist/list-KT6NXVLV.js +63 -0
- package/dist/list-KT6NXVLV.js.map +1 -0
- package/dist/list-RINCJOAC.js +76 -0
- package/dist/list-RINCJOAC.js.map +1 -0
- package/dist/list-SRNXHS6L.js +51 -0
- package/dist/list-SRNXHS6L.js.map +1 -0
- package/dist/list-YJSO4M5Q.js +65 -0
- package/dist/list-YJSO4M5Q.js.map +1 -0
- package/dist/locations-HW2Y5OJO.js +67 -0
- package/dist/locations-HW2Y5OJO.js.map +1 -0
- package/dist/locations-XOHI3VWI.js +40 -0
- package/dist/locations-XOHI3VWI.js.map +1 -0
- package/dist/log-3HX5BIO6.js +92 -0
- package/dist/log-3HX5BIO6.js.map +1 -0
- package/dist/logo-KXTGIYBI.js +18 -0
- package/dist/logo-KXTGIYBI.js.map +1 -0
- package/dist/lookup-X6O5UNJH.js +22 -0
- package/dist/lookup-X6O5UNJH.js.map +1 -0
- package/dist/make-QH77XOWM.js +633 -0
- package/dist/make-QH77XOWM.js.map +1 -0
- package/dist/map-QABBPYZM.js +404 -0
- package/dist/map-QABBPYZM.js.map +1 -0
- package/dist/mcp-HSD3W3OB.js +463 -0
- package/dist/mcp-HSD3W3OB.js.map +1 -0
- package/dist/media-MI4EE7L4.js +89 -0
- package/dist/media-MI4EE7L4.js.map +1 -0
- package/dist/media-QUTQOBA7.js +15 -0
- package/dist/media-QUTQOBA7.js.map +1 -0
- package/dist/media-sources-HO4DXRX5.js +32 -0
- package/dist/media-sources-HO4DXRX5.js.map +1 -0
- package/dist/members-YEYYJGY6.js +44 -0
- package/dist/members-YEYYJGY6.js.map +1 -0
- package/dist/meta-E3JOUOSS.js +69 -0
- package/dist/meta-E3JOUOSS.js.map +1 -0
- package/dist/metrics-HQ7XJAYQ.js +152 -0
- package/dist/metrics-HQ7XJAYQ.js.map +1 -0
- package/dist/models-PGX3FBHU.js +155 -0
- package/dist/models-PGX3FBHU.js.map +1 -0
- package/dist/normalize-FPJ6GSOY.js +806 -0
- package/dist/normalize-FPJ6GSOY.js.map +1 -0
- package/dist/normalize-GSQWN77S.js +141 -0
- package/dist/normalize-GSQWN77S.js.map +1 -0
- package/dist/options-F5XZMQLK.js +121 -0
- package/dist/options-F5XZMQLK.js.map +1 -0
- package/dist/output-GQFJ2T5B.js +24 -0
- package/dist/output-GQFJ2T5B.js.map +1 -0
- package/dist/page-VTTSBC6Y.js +105 -0
- package/dist/page-VTTSBC6Y.js.map +1 -0
- package/dist/pages-PMZVNVQM.js +66 -0
- package/dist/pages-PMZVNVQM.js.map +1 -0
- package/dist/performance-G67JQE5J.js +24 -0
- package/dist/performance-G67JQE5J.js.map +1 -0
- package/dist/pinterest-UDNGOWDM.js +96 -0
- package/dist/pinterest-UDNGOWDM.js.map +1 -0
- package/dist/pixels-OYZDGCH3.js +108 -0
- package/dist/pixels-OYZDGCH3.js.map +1 -0
- package/dist/pixels-XKGNTCFX.js +60 -0
- package/dist/pixels-XKGNTCFX.js.map +1 -0
- package/dist/plan-DZS3TVIJ.js +207 -0
- package/dist/plan-DZS3TVIJ.js.map +1 -0
- package/dist/preview-DR6MXOGI.js +169 -0
- package/dist/preview-DR6MXOGI.js.map +1 -0
- package/dist/profile-VOVZG44G.js +159 -0
- package/dist/profile-VOVZG44G.js.map +1 -0
- package/dist/promoted-tweet-writes-VCK2ADVJ.js +180 -0
- package/dist/promoted-tweet-writes-VCK2ADVJ.js.map +1 -0
- package/dist/promoted-tweets-4ACBP2RV.js +119 -0
- package/dist/promoted-tweets-4ACBP2RV.js.map +1 -0
- package/dist/properties-MKVF7MUK.js +101 -0
- package/dist/properties-MKVF7MUK.js.map +1 -0
- package/dist/publish-6XVA35T6.js +322 -0
- package/dist/publish-6XVA35T6.js.map +1 -0
- package/dist/query-CNWQ6STR.js +61 -0
- package/dist/query-CNWQ6STR.js.map +1 -0
- package/dist/query-DBSBZ73C.js +247 -0
- package/dist/query-DBSBZ73C.js.map +1 -0
- package/dist/query-QK4U4TEL.js +236 -0
- package/dist/query-QK4U4TEL.js.map +1 -0
- package/dist/questionnaire-OVJWNUVV.js +93 -0
- package/dist/questionnaire-OVJWNUVV.js.map +1 -0
- package/dist/read-L2QIVJTL.js +141 -0
- package/dist/read-L2QIVJTL.js.map +1 -0
- package/dist/reddit-SCEB2JQL.js +26 -0
- package/dist/reddit-SCEB2JQL.js.map +1 -0
- package/dist/refresh-TIH5Y3NP.js +94 -0
- package/dist/refresh-TIH5Y3NP.js.map +1 -0
- package/dist/release-LKMUKVXM.js +60 -0
- package/dist/release-LKMUKVXM.js.map +1 -0
- package/dist/relevant-pages-CRI2NLWG.js +99 -0
- package/dist/relevant-pages-CRI2NLWG.js.map +1 -0
- package/dist/remove-6ABOB7TZ.js +50 -0
- package/dist/remove-6ABOB7TZ.js.map +1 -0
- package/dist/remove-JKSCGKQG.js +48 -0
- package/dist/remove-JKSCGKQG.js.map +1 -0
- package/dist/reopen-27TDNXFP.js +63 -0
- package/dist/reopen-27TDNXFP.js.map +1 -0
- package/dist/rerun-XHECBJD5.js +84 -0
- package/dist/rerun-XHECBJD5.js.map +1 -0
- package/dist/research-4MOXIMDX.js +62 -0
- package/dist/research-4MOXIMDX.js.map +1 -0
- package/dist/research-XYXP7D4R.js +262 -0
- package/dist/research-XYXP7D4R.js.map +1 -0
- package/dist/reset-NLYEBPLX.js +54 -0
- package/dist/reset-NLYEBPLX.js.map +1 -0
- package/dist/reset-RDQOYBXX.js +54 -0
- package/dist/reset-RDQOYBXX.js.map +1 -0
- package/dist/resolve-VHKWC5KW.js +121 -0
- package/dist/resolve-VHKWC5KW.js.map +1 -0
- package/dist/retry-MTQSHXKH.js +60 -0
- package/dist/retry-MTQSHXKH.js.map +1 -0
- package/dist/retry-ZI5ECSFD.js +62 -0
- package/dist/retry-ZI5ECSFD.js.map +1 -0
- package/dist/retry-failed-2OYMCB55.js +45 -0
- package/dist/retry-failed-2OYMCB55.js.map +1 -0
- package/dist/run-BMJJRJL2.js +65 -0
- package/dist/run-BMJJRJL2.js.map +1 -0
- package/dist/run-IHXS6F5V.js +59 -0
- package/dist/run-IHXS6F5V.js.map +1 -0
- package/dist/scaffold-ad-QEADKYPL.js +1548 -0
- package/dist/scaffold-ad-QEADKYPL.js.map +1 -0
- package/dist/scaffold-static-ad-PTJ73ZNF.js +971 -0
- package/dist/scaffold-static-ad-PTJ73ZNF.js.map +1 -0
- package/dist/scaffold-video-ZQEZRVD6.js +872 -0
- package/dist/scaffold-video-ZQEZRVD6.js.map +1 -0
- package/dist/schedule-JD2EQJCT.js +61 -0
- package/dist/schedule-JD2EQJCT.js.map +1 -0
- package/dist/schedule-TLYT5UXM.js +66 -0
- package/dist/schedule-TLYT5UXM.js.map +1 -0
- package/dist/scheduled-agents-GIVKWTXX.js +49 -0
- package/dist/scheduled-agents-GIVKWTXX.js.map +1 -0
- package/dist/schema-MZTVCNP4.js +63 -0
- package/dist/schema-MZTVCNP4.js.map +1 -0
- package/dist/schema-RYTVKPLZ.js +132 -0
- package/dist/schema-RYTVKPLZ.js.map +1 -0
- package/dist/scrape-T3DA7ER7.js +2241 -0
- package/dist/scrape-T3DA7ER7.js.map +1 -0
- package/dist/screenshot-EIGC6SZB.js +102 -0
- package/dist/screenshot-EIGC6SZB.js.map +1 -0
- package/dist/search-2SVUDZIX.js +224 -0
- package/dist/search-2SVUDZIX.js.map +1 -0
- package/dist/search-34NFJ5F6.js +26 -0
- package/dist/search-34NFJ5F6.js.map +1 -0
- package/dist/search-AOFAN5NB.js +174 -0
- package/dist/search-AOFAN5NB.js.map +1 -0
- package/dist/search-BWE3OPOY.js +91 -0
- package/dist/search-BWE3OPOY.js.map +1 -0
- package/dist/search-EYYAOZND.js +92 -0
- package/dist/search-EYYAOZND.js.map +1 -0
- package/dist/search-copy-VKQ2OOBM.js +168 -0
- package/dist/search-copy-VKQ2OOBM.js.map +1 -0
- package/dist/seeds-HQYSVFIX.js +101 -0
- package/dist/seeds-HQYSVFIX.js.map +1 -0
- package/dist/select-HJMOAWAU.js +94 -0
- package/dist/select-HJMOAWAU.js.map +1 -0
- package/dist/sends-I7VQFE4S.js +309 -0
- package/dist/sends-I7VQFE4S.js.map +1 -0
- package/dist/sequences-JHSEJJGN.js +146 -0
- package/dist/sequences-JHSEJJGN.js.map +1 -0
- package/dist/set-prompt-TSS33JQZ.js +185 -0
- package/dist/set-prompt-TSS33JQZ.js.map +1 -0
- package/dist/setup-links-IW4BUANK.js +141 -0
- package/dist/setup-links-IW4BUANK.js.map +1 -0
- package/dist/{shared-J7DQZ2ED.js → shared-AT3FXPAG.js} +8 -6
- package/dist/shared-AT3FXPAG.js.map +1 -0
- package/dist/shopify-RQKO5TMR.js +3819 -0
- package/dist/shopify-RQKO5TMR.js.map +1 -0
- package/dist/site-3NU2BDAR.js +177 -0
- package/dist/site-3NU2BDAR.js.map +1 -0
- package/dist/sitemaps-FG37N5EB.js +87 -0
- package/dist/sitemaps-FG37N5EB.js.map +1 -0
- package/dist/sites-FIXK4Y3O.js +101 -0
- package/dist/sites-FIXK4Y3O.js.map +1 -0
- package/dist/skills-OKVCVQVD.js +47 -0
- package/dist/skills-OKVCVQVD.js.map +1 -0
- package/dist/sources-SEODRUIC.js +30 -0
- package/dist/sources-SEODRUIC.js.map +1 -0
- package/dist/sources-Z6BGTBGO.js +421 -0
- package/dist/sources-Z6BGTBGO.js.map +1 -0
- package/dist/stale-SWPDWXG7.js +63 -0
- package/dist/stale-SWPDWXG7.js.map +1 -0
- package/dist/stats-ZWZ7BAHV.js +34 -0
- package/dist/stats-ZWZ7BAHV.js.map +1 -0
- package/dist/status-7Y7UNSO6.js +62 -0
- package/dist/status-7Y7UNSO6.js.map +1 -0
- package/dist/sticker-FLRZM3BI.js +94 -0
- package/dist/sticker-FLRZM3BI.js.map +1 -0
- package/dist/stock-2CSMWRWV.js +179 -0
- package/dist/stock-2CSMWRWV.js.map +1 -0
- package/dist/studio-TTTR6N7D.js +49 -0
- package/dist/studio-TTTR6N7D.js.map +1 -0
- package/dist/sync-FH773IFH.js +54 -0
- package/dist/sync-FH773IFH.js.map +1 -0
- package/dist/sync-G5CS2RYV.js +54 -0
- package/dist/sync-G5CS2RYV.js.map +1 -0
- package/dist/sync-UADA6M33.js +265 -0
- package/dist/sync-UADA6M33.js.map +1 -0
- package/dist/sync-definition-77KLGPMA.js +52 -0
- package/dist/sync-definition-77KLGPMA.js.map +1 -0
- package/dist/tag-manager-NK3ZHSJB.js +43 -0
- package/dist/tag-manager-NK3ZHSJB.js.map +1 -0
- package/dist/tags-ANGHHLAC.js +20 -0
- package/dist/tags-ANGHHLAC.js.map +1 -0
- package/dist/tags-DKPUSQTJ.js +20 -0
- package/dist/tags-DKPUSQTJ.js.map +1 -0
- package/dist/tags-HSCV4ZAQ.js +20 -0
- package/dist/tags-HSCV4ZAQ.js.map +1 -0
- package/dist/tags-J3RMQEQM.js +26 -0
- package/dist/tags-J3RMQEQM.js.map +1 -0
- package/dist/tags-VZGTR3VJ.js +224 -0
- package/dist/tags-VZGTR3VJ.js.map +1 -0
- package/dist/targeting-constants-ZGBX3VWU.js +118 -0
- package/dist/targeting-constants-ZGBX3VWU.js.map +1 -0
- package/dist/targeting-criteria-BSG3CLHU.js +113 -0
- package/dist/targeting-criteria-BSG3CLHU.js.map +1 -0
- package/dist/targets-DVOAFYZQ.js +102 -0
- package/dist/targets-DVOAFYZQ.js.map +1 -0
- package/dist/templates-KJ5O44FF.js +178 -0
- package/dist/templates-KJ5O44FF.js.map +1 -0
- package/dist/testimonials-NB7V3DUO.js +32 -0
- package/dist/testimonials-NB7V3DUO.js.map +1 -0
- package/dist/themes-3RV3HNNE.js +94 -0
- package/dist/themes-3RV3HNNE.js.map +1 -0
- package/dist/top-companies-KRB3OZOT.js +108 -0
- package/dist/top-companies-KRB3OZOT.js.map +1 -0
- package/dist/translate-5FP32BIA.js +598 -0
- package/dist/translate-5FP32BIA.js.map +1 -0
- package/dist/triggers-EURHTCYC.js +141 -0
- package/dist/triggers-EURHTCYC.js.map +1 -0
- package/dist/tweets-X64YDEAA.js +123 -0
- package/dist/tweets-X64YDEAA.js.map +1 -0
- package/dist/unfollow-PIONCSBL.js +46 -0
- package/dist/unfollow-PIONCSBL.js.map +1 -0
- package/dist/unlink-HVVTZ3MB.js +67 -0
- package/dist/unlink-HVVTZ3MB.js.map +1 -0
- package/dist/unstage-BJJ5M7MK.js +95 -0
- package/dist/unstage-BJJ5M7MK.js.map +1 -0
- package/dist/unstage-Y7ZE3NUJ.js +84 -0
- package/dist/unstage-Y7ZE3NUJ.js.map +1 -0
- package/dist/update-3IP7FB6Y.js +98 -0
- package/dist/update-3IP7FB6Y.js.map +1 -0
- package/dist/update-CSDSK5NO.js +63 -0
- package/dist/update-CSDSK5NO.js.map +1 -0
- package/dist/update-FGJXVDB7.js +142 -0
- package/dist/update-FGJXVDB7.js.map +1 -0
- package/dist/update-MF7LY2OT.js +155 -0
- package/dist/update-MF7LY2OT.js.map +1 -0
- package/dist/upload-DDPI7KJV.js +126 -0
- package/dist/upload-DDPI7KJV.js.map +1 -0
- package/dist/upload-IWFYKD7A.js +150 -0
- package/dist/upload-IWFYKD7A.js.map +1 -0
- package/dist/upscale-EYCEYRWE.js +109 -0
- package/dist/upscale-EYCEYRWE.js.map +1 -0
- package/dist/url-options-RA3XISLN.js +130 -0
- package/dist/url-options-RA3XISLN.js.map +1 -0
- package/dist/url-params-SN4APXCK.js +98 -0
- package/dist/url-params-SN4APXCK.js.map +1 -0
- package/dist/use-E2TA2K6J.js +95 -0
- package/dist/use-E2TA2K6J.js.map +1 -0
- package/dist/validate-W52JOEXI.js +88 -0
- package/dist/validate-W52JOEXI.js.map +1 -0
- package/dist/variant-ETHB6XUM.js +338 -0
- package/dist/variant-ETHB6XUM.js.map +1 -0
- package/dist/videos-653WAFPG.js +39 -0
- package/dist/videos-653WAFPG.js.map +1 -0
- package/dist/view-BVEZRRV2.js +121 -0
- package/dist/view-BVEZRRV2.js.map +1 -0
- package/dist/viewer-check-W4ICSBHO.js +68 -0
- package/dist/viewer-check-W4ICSBHO.js.map +1 -0
- package/dist/web-JWIGFGIU.js +140 -0
- package/dist/web-JWIGFGIU.js.map +1 -0
- package/dist/winners-MJDKCGEZ.js +113 -0
- package/dist/winners-MJDKCGEZ.js.map +1 -0
- package/dist/winning-ads-O3IMUGGO.js +84 -0
- package/dist/winning-ads-O3IMUGGO.js.map +1 -0
- package/dist/write-commands-DA6FIFAO.js +737 -0
- package/dist/write-commands-DA6FIFAO.js.map +1 -0
- package/dist/write-commands-EMN2WENA.js +1015 -0
- package/dist/write-commands-EMN2WENA.js.map +1 -0
- package/dist/write-commands-KTPISQRE.js +206 -0
- package/dist/write-commands-KTPISQRE.js.map +1 -0
- package/dist/write-commands-QBGIWU27.js +713 -0
- package/dist/write-commands-QBGIWU27.js.map +1 -0
- package/dist/x-BT3SNCTU.js +47 -0
- package/dist/x-BT3SNCTU.js.map +1 -0
- package/package.json +9 -2
- package/dist/chunk-FGHMWBUD.js +0 -9989
- package/dist/chunk-FGHMWBUD.js.map +0 -1
- package/dist/chunk-HJEMOSPH.js +0 -1292
- package/dist/chunk-HJEMOSPH.js.map +0 -1
- package/dist/chunk-MF7YA62W.js.map +0 -1
- package/dist/chunk-VLUGGVJL.js.map +0 -1
- package/dist/chunk-VZEDAFAR.js.map +0 -1
- package/dist/chunk-XHC4LMK4.js.map +0 -1
- package/dist/client-GR6YL3YX.js +0 -17
- package/dist/output-NMQXZF3Z.js +0 -18
- /package/dist/{client-GR6YL3YX.js.map → chunk-YQSBHWOI.js.map} +0 -0
- /package/dist/{env-4P5HOGNA.js.map → client-EURRWXPW.js.map} +0 -0
- /package/dist/{output-NMQXZF3Z.js.map → connect-4YXFMXYX.js.map} +0 -0
- /package/dist/{shared-J7DQZ2ED.js.map → customers-7E4HBSEY.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/engine/lib/remembered-nouls.ts","../src/engine/lib/file-lock.ts"],"sourcesContent":["/**\n * Yes/no answers from the decision model (Jev, `askJev`), asked in batches and remembered by\n * question, so the same text asked the same question gets the same answer on every run. A gate\n * that counts findings (the landing critique's block count, an idea's warnings) must not flip\n * because Jev answered 0.69 one run and 0.71 the next.\n */\nimport { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { askJev, JEV_MODEL } from \"../nodes/local/lib/jev.ts\";\nimport type { ReviewUsage } from \"../nodes/local/lib/render-review.ts\";\nimport { updateLockedFile } from \"./file-lock.ts\";\n\nexport type NoulQuestion = { instructions: Record<string, string> };\n/** Each question's probability, in order, or null when no answer came back. */\nexport type AskNouls = (questions: readonly NoulQuestion[]) => Promise<number[] | null>;\n\n/** Several hundred fit in one request at the same latency; this keeps each well inside Jev's context. */\nconst PER_REQUEST = 200;\n/** The file never grows past this many answers; the oldest are dropped first. */\nconst MAX_REMEMBERED = 20_000;\n\nfunction keyOf(question: NoulQuestion): string {\n return createHash(\"sha256\")\n .update(JSON.stringify([JEV_MODEL, question.instructions]))\n .digest(\"hex\")\n .slice(0, 32);\n}\n\nasync function remembered(file: string): Promise<Record<string, number>> {\n const parsed: unknown = await readFile(file, \"utf8\").then(JSON.parse, () => ({}));\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return {};\n return Object.fromEntries(\n Object.entries(parsed as Record<string, unknown>).filter((e): e is [string, number] => typeof e[1] === \"number\"),\n );\n}\n\n/**\n * The probability each statement is true, in order: from `file` when asked before, else from\n * `ask`, in requests of `PER_REQUEST` sent at once. Null when any request failed, so the caller\n * takes its fallback for the whole decision rather than half of it. Never throws.\n */\nexport async function rememberedNouls(\n questions: readonly NoulQuestion[],\n opts: { ask: AskNouls; file?: string },\n): Promise<number[] | null> {\n if (questions.length === 0) return [];\n const keys = questions.map(keyOf);\n const known = opts.file ? await remembered(opts.file) : {};\n const missing = [...new Set(keys.filter((k) => known[k] === undefined))];\n const byKey = new Map(questions.map((q, i) => [keys[i], q]));\n const batches: string[][] = [];\n for (let i = 0; i < missing.length; i += PER_REQUEST) batches.push(missing.slice(i, i + PER_REQUEST));\n const answered = await Promise.all(\n batches.map((batch) => opts.ask(batch.flatMap((k) => byKey.get(k) ?? [])).catch(() => null)),\n );\n if (answered.some((a) => a === null || a.length === 0)) return null;\n const fresh: Record<string, number> = {};\n batches.forEach((batch, b) => {\n batch.forEach((k, i) => {\n const answer = answered[b]?.[i];\n if (answer !== undefined) fresh[k] = answer;\n });\n });\n const all = { ...known, ...fresh };\n const file = opts.file;\n if (file && missing.length > 0) {\n // Read again under the lock: another caller sharing the file may have written its answers since.\n await updateLockedFile(file, async () => {\n const kept = Object.entries({ ...(await remembered(file)), ...fresh }).slice(-MAX_REMEMBERED);\n return JSON.stringify(Object.fromEntries(kept));\n }).catch(() => undefined);\n }\n const answers = keys.map((k) => all[k]);\n return answers.every((a): a is number => a !== undefined) ? answers : null;\n}\n\n/** The real decision model, its spend reported to `onSpend`. */\nexport function jevAsker(onSpend?: (usage: ReviewUsage) => void): AskNouls {\n return (questions) => askJev(questions, onSpend);\n}\n\n/** The real decision model behind the answers kept in `file`: what every CLI caller asks through. */\nexport function rememberedJev(file: string, onSpend?: (usage: ReviewUsage) => void): AskNouls {\n const ask = jevAsker(onSpend);\n return (questions) => rememberedNouls(questions, { ask, file });\n}\n","/**\n * Change a JSON file that several processes (or several calls in one) update at once: read,\n * change and write it whole under a lock file, through a temp file renamed into place, so no\n * writer erases another's entries and no reader sees half a file.\n */\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst LOCK_STALE_MS = 10_000;\nconst LOCK_WAIT_MS = 20;\n\n/** Run `change` with `file` locked, and write what it returns as the file's whole new content. */\nexport async function updateLockedFile(file: string, change: () => Promise<string>): Promise<void> {\n await mkdir(path.dirname(file), { recursive: true });\n const lock = `${file}.lock`;\n await acquireLock(lock);\n try {\n const temp = `${file}.${process.pid}.${randomUUID()}.tmp`;\n await writeFile(temp, await change(), \"utf8\");\n await rename(temp, file);\n } finally {\n await rm(lock, { force: true });\n }\n}\n\nasync function acquireLock(lock: string): Promise<void> {\n for (;;) {\n try {\n await writeFile(lock, String(process.pid), { flag: \"wx\" });\n return;\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== \"EEXIST\") throw e;\n }\n // A process that died holding the lock leaves it behind: a lock this old is no one's.\n const held = await stat(lock).catch(() => null);\n if (held && Date.now() - held.mtimeMs > LOCK_STALE_MS) await rm(lock, { force: true });\n await new Promise((resolve) => setTimeout(resolve, LOCK_WAIT_MS));\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import {
|
|
2
|
+
loadCompositionMeta
|
|
3
|
+
} from "./chunk-JLWBK3VC.js";
|
|
4
|
+
import {
|
|
5
|
+
parseRefExpr
|
|
6
|
+
} from "./chunk-ZJ7TQUCU.js";
|
|
7
|
+
import {
|
|
8
|
+
resolveAdaptFormats
|
|
9
|
+
} from "./chunk-CAMX6OHF.js";
|
|
10
|
+
|
|
11
|
+
// src/commands/canvas/output-ratio.ts
|
|
12
|
+
import { readFile } from "fs/promises";
|
|
13
|
+
import path from "path";
|
|
14
|
+
function definitionFormats(markdown) {
|
|
15
|
+
const front = markdown.match(/^---\n([\s\S]*?)\n---/)?.[1];
|
|
16
|
+
if (!front) return [];
|
|
17
|
+
const clean = (s) => s.trim().replace(/^["']|["']$/g, "");
|
|
18
|
+
const flow = front.match(/^formats:\s*\[([^\]]*)\]/m);
|
|
19
|
+
if (flow) return (flow[1] ?? "").split(",").map(clean).filter(Boolean);
|
|
20
|
+
const block = front.match(/^formats:\s*\n((?:\s+-\s+.*\n?)+)/m);
|
|
21
|
+
if (!block) return [];
|
|
22
|
+
return (block[1] ?? "").split("\n").map((l) => l.replace(/^\s+-\s+/, "")).map(clean).filter(Boolean);
|
|
23
|
+
}
|
|
24
|
+
function reduce(width, height) {
|
|
25
|
+
const gcd = (a, b) => b === 0 ? a : gcd(b, a % b);
|
|
26
|
+
const d = gcd(width, height);
|
|
27
|
+
return `${width / d}:${height / d}`;
|
|
28
|
+
}
|
|
29
|
+
async function ratiosOf(nodes, id, seen) {
|
|
30
|
+
const node = nodes.get(id);
|
|
31
|
+
if (!node || seen.has(id)) return null;
|
|
32
|
+
seen.add(id);
|
|
33
|
+
const p = node.params ?? {};
|
|
34
|
+
switch (node.type) {
|
|
35
|
+
case "image_generate":
|
|
36
|
+
return typeof p.aspect_ratio === "string" ? [p.aspect_ratio] : null;
|
|
37
|
+
case "image_aspect_adapt":
|
|
38
|
+
return [...resolveAdaptFormats(p)];
|
|
39
|
+
case "hyperframe_snapshot": {
|
|
40
|
+
if (typeof p.composition !== "string") return null;
|
|
41
|
+
const meta = await loadCompositionMeta(p.composition).catch(() => null);
|
|
42
|
+
return meta ? [reduce(meta.width, meta.height)] : null;
|
|
43
|
+
}
|
|
44
|
+
case "collect": {
|
|
45
|
+
const images = node.inputs?.images;
|
|
46
|
+
if (!Array.isArray(images)) return null;
|
|
47
|
+
const out = [];
|
|
48
|
+
for (const entry of images) {
|
|
49
|
+
const ref = typeof entry === "string" ? parseRefExpr(entry) : null;
|
|
50
|
+
if (!ref || ref.kind !== "ref") return null;
|
|
51
|
+
const upstream = await ratiosOf(nodes, ref.nodeId, seen);
|
|
52
|
+
if (!upstream) return null;
|
|
53
|
+
out.push(ref.index !== void 0 && upstream.length > 1 ? upstream[ref.index] ?? "" : upstream[0] ?? "");
|
|
54
|
+
}
|
|
55
|
+
return out.filter(Boolean);
|
|
56
|
+
}
|
|
57
|
+
default:
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function producedRatios(canvas) {
|
|
62
|
+
const c = canvas;
|
|
63
|
+
if (!Array.isArray(c?.nodes) || typeof c?.output?.node !== "string") return null;
|
|
64
|
+
const nodes = new Map(c.nodes.flatMap((n) => typeof n.id === "string" ? [[n.id, n]] : []));
|
|
65
|
+
return ratiosOf(nodes, c.output.node, /* @__PURE__ */ new Set());
|
|
66
|
+
}
|
|
67
|
+
function value(ratio) {
|
|
68
|
+
const [w, h] = ratio.split(":").map(Number);
|
|
69
|
+
return w && h ? w / h : null;
|
|
70
|
+
}
|
|
71
|
+
function outputRatioWarnings(declared, produced) {
|
|
72
|
+
if (!produced || produced.length === 0) return [];
|
|
73
|
+
const shapes = produced.flatMap((r) => value(r) ?? []);
|
|
74
|
+
return declared.flatMap((format) => {
|
|
75
|
+
const want = value(format);
|
|
76
|
+
if (want === null || shapes.some((s) => Math.abs(s / want - 1) <= 0.02)) return [];
|
|
77
|
+
return [
|
|
78
|
+
{
|
|
79
|
+
path: "output",
|
|
80
|
+
code: "OUTPUT_RATIO_MISMATCH",
|
|
81
|
+
severity: "warning",
|
|
82
|
+
message: `_definition.md declares ${format}, but this canvas delivers ${produced.join(", ")}. A ${format} placement would get the wrong shape: re-scaffold with that format, or fix the formats the creative declares.`
|
|
83
|
+
}
|
|
84
|
+
];
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
async function outputRatioWarningsFor(canvas, canvasPath) {
|
|
88
|
+
const definition = await readFile(path.join(path.dirname(canvasPath), "_definition.md"), "utf8").catch(() => null);
|
|
89
|
+
if (!definition) return [];
|
|
90
|
+
return outputRatioWarnings(definitionFormats(definition), await producedRatios(canvas));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export {
|
|
94
|
+
outputRatioWarningsFor
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=chunk-E2ZOSNF5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/canvas/output-ratio.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { resolveAdaptFormats } from \"@baker/canvas-contract\";\nimport type { ValidationIssue } from \"../../engine/engine/errors.ts\";\nimport { loadCompositionMeta } from \"../../engine/engine/composition-meta.ts\";\nimport { parseRefExpr } from \"../../engine/schema/canvas.ts\";\n\n/**\n * Does the canvas deliver the formats its creative says it delivers?\n *\n * A creative declared `formats: [\"4:5\"]` shipped a 1024x1536 image into a staged Meta ad:\n * its hero was generated at 3:4 (gpt-image has no 4:5) and nothing converted it, and\n * `validate` answered `warnings: []`. This compares the shapes the canvas's output is\n * rendered at with the formats `_definition.md` declares, and warns before anything bills.\n */\n\n/** The `formats` a `_definition.md` frontmatter declares (flow or block list). */\nexport function definitionFormats(markdown: string): string[] {\n const front = markdown.match(/^---\\n([\\s\\S]*?)\\n---/)?.[1];\n if (!front) return [];\n const clean = (s: string) => s.trim().replace(/^[\"']|[\"']$/g, \"\");\n const flow = front.match(/^formats:\\s*\\[([^\\]]*)\\]/m);\n if (flow) return (flow[1] ?? \"\").split(\",\").map(clean).filter(Boolean);\n const block = front.match(/^formats:\\s*\\n((?:\\s+-\\s+.*\\n?)+)/m);\n if (!block) return [];\n return (block[1] ?? \"\")\n .split(\"\\n\")\n .map((l) => l.replace(/^\\s+-\\s+/, \"\"))\n .map(clean)\n .filter(Boolean);\n}\n\ntype Node = { id?: unknown; type?: unknown; params?: Record<string, unknown>; inputs?: Record<string, unknown> };\n\nfunction reduce(width: number, height: number): string {\n const gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\n const d = gcd(width, height);\n return `${width / d}:${height / d}`;\n}\n\n/** The ratios one node renders at, or null when its shape cannot be known before the run. */\nasync function ratiosOf(nodes: Map<string, Node>, id: string, seen: Set<string>): Promise<string[] | null> {\n const node = nodes.get(id);\n if (!node || seen.has(id)) return null;\n seen.add(id);\n const p = node.params ?? {};\n switch (node.type) {\n case \"image_generate\":\n return typeof p.aspect_ratio === \"string\" ? [p.aspect_ratio] : null;\n case \"image_aspect_adapt\":\n return [...resolveAdaptFormats(p as Parameters<typeof resolveAdaptFormats>[0])];\n case \"hyperframe_snapshot\": {\n if (typeof p.composition !== \"string\") return null;\n const meta = await loadCompositionMeta(p.composition).catch(() => null);\n return meta ? [reduce(meta.width, meta.height)] : null;\n }\n case \"collect\": {\n const images = node.inputs?.images;\n if (!Array.isArray(images)) return null;\n const out: string[] = [];\n for (const entry of images) {\n const ref = typeof entry === \"string\" ? parseRefExpr(entry) : null;\n if (!ref || ref.kind !== \"ref\") return null;\n const upstream = await ratiosOf(nodes, ref.nodeId, seen);\n if (!upstream) return null;\n out.push(ref.index !== undefined && upstream.length > 1 ? (upstream[ref.index] ?? \"\") : (upstream[0] ?? \"\"));\n }\n return out.filter(Boolean);\n }\n default:\n return null;\n }\n}\n\n/**\n * The ratios the canvas's output is rendered at, in order, or null when any of them\n * cannot be known before the run (a local transform, a hand-built node). Composition\n * paths must already be resolved.\n */\nexport async function producedRatios(canvas: unknown): Promise<string[] | null> {\n const c = canvas as { nodes?: unknown; output?: { node?: unknown } } | null;\n if (!Array.isArray(c?.nodes) || typeof c?.output?.node !== \"string\") return null;\n const nodes = new Map((c.nodes as Node[]).flatMap((n) => (typeof n.id === \"string\" ? [[n.id, n] as const] : [])));\n return ratiosOf(nodes, c.output.node, new Set());\n}\n\nfunction value(ratio: string): number | null {\n const [w, h] = ratio.split(\":\").map(Number);\n return w && h ? w / h : null;\n}\n\n/** One warning per declared format no output is within 2% of. Pure. */\nexport function outputRatioWarnings(declared: string[], produced: string[] | null): ValidationIssue[] {\n if (!produced || produced.length === 0) return [];\n const shapes = produced.flatMap((r) => value(r) ?? []);\n return declared.flatMap((format) => {\n const want = value(format);\n if (want === null || shapes.some((s) => Math.abs(s / want - 1) <= 0.02)) return [];\n return [\n {\n path: \"output\",\n code: \"OUTPUT_RATIO_MISMATCH\",\n severity: \"warning\" as const,\n message: `_definition.md declares ${format}, but this canvas delivers ${produced.join(\", \")}. A ${format} placement would get the wrong shape: re-scaffold with that format, or fix the formats the creative declares.`,\n },\n ];\n });\n}\n\n/** The warnings for the canvas at `canvasPath`, read against its own `_definition.md`. */\nexport async function outputRatioWarningsFor(canvas: unknown, canvasPath: string): Promise<ValidationIssue[]> {\n const definition = await readFile(path.join(path.dirname(canvasPath), \"_definition.md\"), \"utf8\").catch(() => null);\n if (!definition) return [];\n return outputRatioWarnings(definitionFormats(definition), await producedRatios(canvas));\n}\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,gBAAgB;AACzB,OAAO,UAAU;AAgBV,SAAS,kBAAkB,UAA4B;AAC5D,QAAM,QAAQ,SAAS,MAAM,uBAAuB,IAAI,CAAC;AACzD,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,QAAQ,CAAC,MAAc,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AAChE,QAAM,OAAO,MAAM,MAAM,2BAA2B;AACpD,MAAI,KAAM,SAAQ,KAAK,CAAC,KAAK,IAAI,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,OAAO,OAAO;AACrE,QAAM,QAAQ,MAAM,MAAM,oCAAoC;AAC9D,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,UAAQ,MAAM,CAAC,KAAK,IACjB,MAAM,IAAI,EACV,IAAI,CAAC,MAAM,EAAE,QAAQ,YAAY,EAAE,CAAC,EACpC,IAAI,KAAK,EACT,OAAO,OAAO;AACnB;AAIA,SAAS,OAAO,OAAe,QAAwB;AACrD,QAAM,MAAM,CAAC,GAAW,MAAuB,MAAM,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC;AACzE,QAAM,IAAI,IAAI,OAAO,MAAM;AAC3B,SAAO,GAAG,QAAQ,CAAC,IAAI,SAAS,CAAC;AACnC;AAGA,eAAe,SAAS,OAA0B,IAAY,MAA6C;AACzG,QAAM,OAAO,MAAM,IAAI,EAAE;AACzB,MAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,EAAG,QAAO;AAClC,OAAK,IAAI,EAAE;AACX,QAAM,IAAI,KAAK,UAAU,CAAC;AAC1B,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,OAAO,EAAE,iBAAiB,WAAW,CAAC,EAAE,YAAY,IAAI;AAAA,IACjE,KAAK;AACH,aAAO,CAAC,GAAG,oBAAoB,CAA8C,CAAC;AAAA,IAChF,KAAK,uBAAuB;AAC1B,UAAI,OAAO,EAAE,gBAAgB,SAAU,QAAO;AAC9C,YAAM,OAAO,MAAM,oBAAoB,EAAE,WAAW,EAAE,MAAM,MAAM,IAAI;AACtE,aAAO,OAAO,CAAC,OAAO,KAAK,OAAO,KAAK,MAAM,CAAC,IAAI;AAAA,IACpD;AAAA,IACA,KAAK,WAAW;AACd,YAAM,SAAS,KAAK,QAAQ;AAC5B,UAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO;AACnC,YAAM,MAAgB,CAAC;AACvB,iBAAW,SAAS,QAAQ;AAC1B,cAAM,MAAM,OAAO,UAAU,WAAW,aAAa,KAAK,IAAI;AAC9D,YAAI,CAAC,OAAO,IAAI,SAAS,MAAO,QAAO;AACvC,cAAM,WAAW,MAAM,SAAS,OAAO,IAAI,QAAQ,IAAI;AACvD,YAAI,CAAC,SAAU,QAAO;AACtB,YAAI,KAAK,IAAI,UAAU,UAAa,SAAS,SAAS,IAAK,SAAS,IAAI,KAAK,KAAK,KAAO,SAAS,CAAC,KAAK,EAAG;AAAA,MAC7G;AACA,aAAO,IAAI,OAAO,OAAO;AAAA,IAC3B;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAOA,eAAsB,eAAe,QAA2C;AAC9E,QAAM,IAAI;AACV,MAAI,CAAC,MAAM,QAAQ,GAAG,KAAK,KAAK,OAAO,GAAG,QAAQ,SAAS,SAAU,QAAO;AAC5E,QAAM,QAAQ,IAAI,IAAK,EAAE,MAAiB,QAAQ,CAAC,MAAO,OAAO,EAAE,OAAO,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAU,IAAI,CAAC,CAAE,CAAC;AAChH,SAAO,SAAS,OAAO,EAAE,OAAO,MAAM,oBAAI,IAAI,CAAC;AACjD;AAEA,SAAS,MAAM,OAA8B;AAC3C,QAAM,CAAC,GAAG,CAAC,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM;AAC1C,SAAO,KAAK,IAAI,IAAI,IAAI;AAC1B;AAGO,SAAS,oBAAoB,UAAoB,UAA8C;AACpG,MAAI,CAAC,YAAY,SAAS,WAAW,EAAG,QAAO,CAAC;AAChD,QAAM,SAAS,SAAS,QAAQ,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;AACrD,SAAO,SAAS,QAAQ,CAAC,WAAW;AAClC,UAAM,OAAO,MAAM,MAAM;AACzB,QAAI,SAAS,QAAQ,OAAO,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,IAAI,EAAG,QAAO,CAAC;AACjF,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,2BAA2B,MAAM,8BAA8B,SAAS,KAAK,IAAI,CAAC,OAAO,MAAM;AAAA,MAC1G;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAGA,eAAsB,uBAAuB,QAAiB,YAAgD;AAC5G,QAAM,aAAa,MAAM,SAAS,KAAK,KAAK,KAAK,QAAQ,UAAU,GAAG,gBAAgB,GAAG,MAAM,EAAE,MAAM,MAAM,IAAI;AACjH,MAAI,CAAC,WAAY,QAAO,CAAC;AACzB,SAAO,oBAAoB,kBAAkB,UAAU,GAAG,MAAM,eAAe,MAAM,CAAC;AACxF;","names":[]}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import {
|
|
2
|
+
chatgptDraftOpInputSchema,
|
|
3
|
+
chatgptFailure
|
|
4
|
+
} from "./chunk-MIJAGBEP.js";
|
|
5
|
+
import {
|
|
6
|
+
writeJsonEnvelope
|
|
7
|
+
} from "./chunk-EIGXX6KI.js";
|
|
8
|
+
import {
|
|
9
|
+
ApiError,
|
|
10
|
+
apiPost
|
|
11
|
+
} from "./chunk-CUL3VB4L.js";
|
|
12
|
+
import {
|
|
13
|
+
requireChatId
|
|
14
|
+
} from "./chunk-I4FTS5EE.js";
|
|
15
|
+
import {
|
|
16
|
+
registerSchema
|
|
17
|
+
} from "./chunk-MYTDK3AL.js";
|
|
18
|
+
|
|
19
|
+
// src/commands/ads/chatgpt/write-shared.ts
|
|
20
|
+
import { defineCommand } from "citty";
|
|
21
|
+
function fail(envelope) {
|
|
22
|
+
writeJsonEnvelope({ ...envelope });
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
function failWriteValidation(message) {
|
|
26
|
+
fail({
|
|
27
|
+
ok: false,
|
|
28
|
+
error: {
|
|
29
|
+
code: "VALIDATION_ERROR",
|
|
30
|
+
message,
|
|
31
|
+
fix: { action: "add_required_field", explanation: `${message}. Nothing was staged.` },
|
|
32
|
+
retryable: false
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function writeFailure(err, reference) {
|
|
37
|
+
if (!(err instanceof ApiError) && err instanceof Error && err.message.includes("BAKER_CHAT_ID")) {
|
|
38
|
+
return {
|
|
39
|
+
ok: false,
|
|
40
|
+
error: {
|
|
41
|
+
code: "NO_CHAT",
|
|
42
|
+
message: err.message,
|
|
43
|
+
fix: {
|
|
44
|
+
action: "reject",
|
|
45
|
+
explanation: "ChatGPT Ads changes are staged on a chat and apply when it is published; run this from the chat."
|
|
46
|
+
},
|
|
47
|
+
retryable: false
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return chatgptFailure(err, reference);
|
|
52
|
+
}
|
|
53
|
+
function decimalPlaces(value) {
|
|
54
|
+
const [mantissa, exponent] = String(value).trim().split(/e/i);
|
|
55
|
+
const written = (mantissa?.split(".")[1] ?? "").length;
|
|
56
|
+
return Math.max(0, written - (exponent ? Number(exponent) : 0));
|
|
57
|
+
}
|
|
58
|
+
function parseChatgptMoney(value) {
|
|
59
|
+
if (value === void 0 || value === "") {
|
|
60
|
+
return { ok: true, micros: void 0 };
|
|
61
|
+
}
|
|
62
|
+
const amount = Number(value);
|
|
63
|
+
if (!Number.isFinite(amount) || amount <= 0) {
|
|
64
|
+
return { ok: false, reason: "must be a positive amount, for example 12.50" };
|
|
65
|
+
}
|
|
66
|
+
if (decimalPlaces(value) > 6) {
|
|
67
|
+
return { ok: false, reason: "is finer than ChatGPT Ads can express" };
|
|
68
|
+
}
|
|
69
|
+
return { ok: true, micros: Math.round(amount * 1e6) };
|
|
70
|
+
}
|
|
71
|
+
function microsFromArg(value, flag) {
|
|
72
|
+
const parsed = parseChatgptMoney(value);
|
|
73
|
+
if (!parsed.ok) {
|
|
74
|
+
failWriteValidation(`${flag} ${parsed.reason}`);
|
|
75
|
+
}
|
|
76
|
+
return parsed.micros;
|
|
77
|
+
}
|
|
78
|
+
function csvArg(value) {
|
|
79
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
80
|
+
return void 0;
|
|
81
|
+
}
|
|
82
|
+
const parts = value.split(",").map((part) => part.trim()).filter(Boolean);
|
|
83
|
+
return parts.length > 0 ? parts : void 0;
|
|
84
|
+
}
|
|
85
|
+
function schemaArgs(args) {
|
|
86
|
+
return Object.fromEntries(
|
|
87
|
+
Object.entries(args).map(([name, arg]) => [
|
|
88
|
+
name,
|
|
89
|
+
{
|
|
90
|
+
type: arg.type === "positional" ? "string" : arg.type,
|
|
91
|
+
description: arg.description,
|
|
92
|
+
required: arg.required === true
|
|
93
|
+
}
|
|
94
|
+
])
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
function lowerArg(value) {
|
|
98
|
+
return typeof value === "string" && value.trim() !== "" ? value.trim().toLowerCase() : void 0;
|
|
99
|
+
}
|
|
100
|
+
function lowerCsvArg(value) {
|
|
101
|
+
return csvArg(value)?.map((part) => part.toLowerCase());
|
|
102
|
+
}
|
|
103
|
+
function compact(payload) {
|
|
104
|
+
return Object.fromEntries(Object.entries(payload).filter(([, value]) => value !== void 0 && value !== ""));
|
|
105
|
+
}
|
|
106
|
+
function requireTarget(args, name) {
|
|
107
|
+
const value = args[name];
|
|
108
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
109
|
+
failWriteValidation(`${name} is required`);
|
|
110
|
+
}
|
|
111
|
+
return value.trim();
|
|
112
|
+
}
|
|
113
|
+
function requireTargets(args, name) {
|
|
114
|
+
const ids = csvArg(args[name]);
|
|
115
|
+
if (!ids) {
|
|
116
|
+
failWriteValidation(`${name} is required \u2014 pass one or more ids, comma-separated`);
|
|
117
|
+
}
|
|
118
|
+
return ids;
|
|
119
|
+
}
|
|
120
|
+
function preflight(raw) {
|
|
121
|
+
const parsed = chatgptDraftOpInputSchema.safeParse(raw);
|
|
122
|
+
if (parsed.success) {
|
|
123
|
+
return parsed.data;
|
|
124
|
+
}
|
|
125
|
+
const fields = parsed.error.issues.map((issue) => ({ path: issue.path.join("."), message: issue.message }));
|
|
126
|
+
const message = fields.map((field) => field.path ? `${field.path}: ${field.message}` : field.message).join("; ");
|
|
127
|
+
return fail({
|
|
128
|
+
ok: false,
|
|
129
|
+
error: {
|
|
130
|
+
code: "VALIDATION_ERROR",
|
|
131
|
+
message,
|
|
132
|
+
fix: {
|
|
133
|
+
action: "retry_with_modified_query",
|
|
134
|
+
explanation: "Fix the named fields and stage again. Nothing was staged \u2014 the draft is as it was before this call."
|
|
135
|
+
},
|
|
136
|
+
retryable: false
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
async function postStage(chatId, op) {
|
|
141
|
+
return await apiPost("/api/ads/chatgpt/draft/stage", { chatId, op });
|
|
142
|
+
}
|
|
143
|
+
async function stageChatgptOp(raw, reference, hintsFor) {
|
|
144
|
+
const op = preflight(raw);
|
|
145
|
+
try {
|
|
146
|
+
const staged = await postStage(requireChatId(), op);
|
|
147
|
+
const hints = hintsFor?.(staged) ?? [];
|
|
148
|
+
writeJsonEnvelope({ ok: true, data: staged, ...hints.length > 0 ? { hints } : {} });
|
|
149
|
+
} catch (err) {
|
|
150
|
+
fail(writeFailure(err, reference));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async function stageChatgptOps(raws, reference) {
|
|
154
|
+
if (raws.length === 1 && raws[0]) {
|
|
155
|
+
await stageChatgptOp(raws[0], reference);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const ops = raws.map(preflight);
|
|
159
|
+
const staged = [];
|
|
160
|
+
try {
|
|
161
|
+
const chatId = requireChatId();
|
|
162
|
+
for (const op of ops) {
|
|
163
|
+
staged.push(await postStage(chatId, op));
|
|
164
|
+
}
|
|
165
|
+
writeJsonEnvelope({ ok: true, data: staged });
|
|
166
|
+
} catch (err) {
|
|
167
|
+
const failure = writeFailure(err, reference);
|
|
168
|
+
if (staged.length > 0) {
|
|
169
|
+
failure.error.message = `${failure.error.message} (already staged: ${staged.map((s) => s.summary).join("; ")})`;
|
|
170
|
+
}
|
|
171
|
+
fail(failure);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function clearableCsvArg(value) {
|
|
175
|
+
return typeof value === "string" && value.trim().toLowerCase() === "none" ? [] : csvArg(value);
|
|
176
|
+
}
|
|
177
|
+
function clearableArg(value) {
|
|
178
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
179
|
+
return void 0;
|
|
180
|
+
}
|
|
181
|
+
return value.trim().toLowerCase() === "none" ? null : value.trim();
|
|
182
|
+
}
|
|
183
|
+
function cropArg(value, flag) {
|
|
184
|
+
const parts = csvArg(value);
|
|
185
|
+
if (!parts) {
|
|
186
|
+
return void 0;
|
|
187
|
+
}
|
|
188
|
+
const numbers = parts.map(Number);
|
|
189
|
+
const [x, y, width, height] = numbers;
|
|
190
|
+
if (numbers.length !== 4 || numbers.some(Number.isNaN) || x === void 0 || y === void 0 || width === void 0 || height === void 0) {
|
|
191
|
+
failWriteValidation(`${flag} takes four shares of the image, x,y,width,height \u2014 e.g. 0.1,0,0.8,0.8`);
|
|
192
|
+
}
|
|
193
|
+
return { x, y, width, height };
|
|
194
|
+
}
|
|
195
|
+
var STATUS_OF = {
|
|
196
|
+
pause: "paused",
|
|
197
|
+
resume: "active",
|
|
198
|
+
archive: "archived"
|
|
199
|
+
};
|
|
200
|
+
function statusOps(entity, ids, status) {
|
|
201
|
+
return ids.map((id) => ({ kind: `${entity}.update`, target: id, payload: { status } }));
|
|
202
|
+
}
|
|
203
|
+
var STATUS_NOUN = {
|
|
204
|
+
campaign: { command: "campaigns", plural: "campaigns", example: "cmpn_123,cmpn_456" },
|
|
205
|
+
adGroup: { command: "ad-groups", plural: "ad groups", example: "adgrp_123,adgrp_456" },
|
|
206
|
+
ad: { command: "ads", plural: "cards", example: "ad_123,ad_456" }
|
|
207
|
+
};
|
|
208
|
+
var STATUS_DOING = { pause: "pausing", resume: "resuming", archive: "archiving" };
|
|
209
|
+
function statusCommand(entity, verb, reference) {
|
|
210
|
+
const noun = STATUS_NOUN[entity];
|
|
211
|
+
const args = {
|
|
212
|
+
ids: { type: "positional", description: `${noun.plural} ids, comma-separated`, required: true }
|
|
213
|
+
};
|
|
214
|
+
const forGood = verb === "archive" ? ` Archiving is for good: ChatGPT Ads cannot bring archived ${noun.plural} back, and their results stay in reports. Pause instead unless the user asked to archive.` : "";
|
|
215
|
+
registerSchema({
|
|
216
|
+
command: `ads.chatgpt.${noun.command}.${verb}`,
|
|
217
|
+
description: `Stage ${STATUS_DOING[verb]} one or more ChatGPT Ads ${noun.plural}. Pass every id in one call.${forGood}`,
|
|
218
|
+
args: schemaArgs(args)
|
|
219
|
+
});
|
|
220
|
+
return defineCommand({
|
|
221
|
+
meta: {
|
|
222
|
+
name: verb,
|
|
223
|
+
description: `Stage ${STATUS_DOING[verb]} ${noun.plural}.${forGood}
|
|
224
|
+
|
|
225
|
+
Example:
|
|
226
|
+
baker ads chatgpt ${noun.command} ${verb} ${noun.example}`
|
|
227
|
+
},
|
|
228
|
+
args,
|
|
229
|
+
run: async ({ args: parsed }) => {
|
|
230
|
+
await stageChatgptOps(statusOps(entity, requireTargets(parsed, "ids"), STATUS_OF[verb]), reference);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
function productFiltersArg(value) {
|
|
235
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
236
|
+
return void 0;
|
|
237
|
+
}
|
|
238
|
+
if (value.trim().toLowerCase() === "none") {
|
|
239
|
+
return [];
|
|
240
|
+
}
|
|
241
|
+
return value.split(";").map((condition) => condition.trim()).filter(Boolean).map((condition) => {
|
|
242
|
+
const match = /^(\S+)\s+(\S+)\s+(.+)$/.exec(condition);
|
|
243
|
+
if (!match?.[1] || !match[2] || !match[3]) {
|
|
244
|
+
failWriteValidation(
|
|
245
|
+
`"${condition}" is not a product filter \u2014 write field operator values, e.g. price lte 5000`
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
field: match[1],
|
|
250
|
+
operator: match[2].toLowerCase(),
|
|
251
|
+
values: match[3].split("|").map((part) => part.trim()).filter(Boolean)
|
|
252
|
+
};
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
export {
|
|
257
|
+
failWriteValidation,
|
|
258
|
+
microsFromArg,
|
|
259
|
+
csvArg,
|
|
260
|
+
schemaArgs,
|
|
261
|
+
lowerArg,
|
|
262
|
+
lowerCsvArg,
|
|
263
|
+
compact,
|
|
264
|
+
requireTarget,
|
|
265
|
+
requireTargets,
|
|
266
|
+
stageChatgptOp,
|
|
267
|
+
stageChatgptOps,
|
|
268
|
+
clearableCsvArg,
|
|
269
|
+
clearableArg,
|
|
270
|
+
cropArg,
|
|
271
|
+
statusCommand,
|
|
272
|
+
productFiltersArg
|
|
273
|
+
};
|
|
274
|
+
//# sourceMappingURL=chunk-E3HYHT7C.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/chatgpt/write-shared.ts"],"sourcesContent":["import { type ChatgptDraftStageResponse, chatgptDraftOpInputSchema } from \"@baker/api/ads-chatgpt\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../../client.ts\";\nimport { requireChatId } from \"../../../env.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { writeJsonEnvelope } from \"../output.ts\";\nimport type { AdsErrorEnvelope } from \"../types.ts\";\nimport { chatgptFailure } from \"./shared.ts\";\n\n/**\n * Shared plumbing for the staged ChatGPT Ads write commands.\n *\n * Writes never reach ChatGPT Ads from here: every command stages an op on this\n * chat's draft (`/api/ads/chatgpt/draft/stage`), the dashboard shows it as a\n * pending change, and it applies only when the chat is published.\n */\n\nfunction fail(envelope: AdsErrorEnvelope): never {\n writeJsonEnvelope({ ...envelope });\n process.exit(1);\n}\n\nexport function failWriteValidation(message: string): never {\n fail({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message,\n fix: { action: \"add_required_field\", explanation: `${message}. Nothing was staged.` },\n retryable: false,\n },\n });\n}\n\n/** A write failure, as the agent should act on it; a missing chat is not a network error. */\nfunction writeFailure(err: unknown, reference: string): AdsErrorEnvelope {\n if (!(err instanceof ApiError) && err instanceof Error && err.message.includes(\"BAKER_CHAT_ID\")) {\n return {\n ok: false,\n error: {\n code: \"NO_CHAT\",\n message: err.message,\n fix: {\n action: \"reject\",\n explanation:\n \"ChatGPT Ads changes are staged on a chat and apply when it is published; run this from the chat.\",\n },\n retryable: false,\n },\n };\n }\n return chatgptFailure(err, reference);\n}\n\n/**\n * Digits after the decimal point, read off the written amount: `String(0.0000005)`\n * is `\"5e-7\"`, whose mantissa has no decimals at all.\n */\nfunction decimalPlaces(value: unknown): number {\n const [mantissa, exponent] = String(value).trim().split(/e/i);\n const written = (mantissa?.split(\".\")[1] ?? \"\").length;\n return Math.max(0, written - (exponent ? Number(exponent) : 0));\n}\n\nexport type ChatgptMoneyParse = { ok: true; micros: number | undefined } | { ok: false; reason: string };\n\n/**\n * ChatGPT Ads takes money as integer micros of the account currency; the CLI\n * takes the amount a person writes. Counting decimals instead of comparing\n * `amount * 1e6` with its rounding is exact at every magnitude.\n */\nexport function parseChatgptMoney(value: unknown): ChatgptMoneyParse {\n if (value === undefined || value === \"\") {\n return { ok: true, micros: undefined };\n }\n const amount = Number(value);\n if (!Number.isFinite(amount) || amount <= 0) {\n return { ok: false, reason: \"must be a positive amount, for example 12.50\" };\n }\n if (decimalPlaces(value) > 6) {\n return { ok: false, reason: \"is finer than ChatGPT Ads can express\" };\n }\n return { ok: true, micros: Math.round(amount * 1_000_000) };\n}\n\nexport function microsFromArg(value: unknown, flag: string): number | undefined {\n const parsed = parseChatgptMoney(value);\n if (!parsed.ok) {\n failWriteValidation(`${flag} ${parsed.reason}`);\n }\n return parsed.micros;\n}\n\nexport function csvArg(value: unknown): string[] | undefined {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n return undefined;\n }\n const parts = value\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n return parts.length > 0 ? parts : undefined;\n}\n\ninterface CliArg {\n type: string;\n description: string;\n required?: boolean;\n}\n\n/**\n * The `baker schema` entry for a command, read off the flags it really takes,\n * so the introspection an agent plans from cannot drift from the command.\n */\nexport function schemaArgs(args: Record<string, CliArg>) {\n return Object.fromEntries(\n Object.entries(args).map(([name, arg]) => [\n name,\n {\n type: arg.type === \"positional\" ? \"string\" : arg.type,\n description: arg.description,\n required: arg.required === true,\n },\n ]),\n );\n}\n\n/** A flag naming one of ChatGPT Ads' lowercase values, taken in whatever case it was typed. */\nexport function lowerArg(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() !== \"\" ? value.trim().toLowerCase() : undefined;\n}\n\n/** A comma-separated list of those values. */\nexport function lowerCsvArg(value: unknown): string[] | undefined {\n return csvArg(value)?.map((part) => part.toLowerCase());\n}\n\n/** Drop unset keys so an omitted flag never stages as an explicit value. */\nexport function compact(payload: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(payload).filter(([, value]) => value !== undefined && value !== \"\"));\n}\n\nexport function requireTarget(args: Record<string, unknown>, name: string): string {\n const value = args[name];\n if (typeof value !== \"string\" || value.trim().length === 0) {\n failWriteValidation(`${name} is required`);\n }\n return value.trim();\n}\n\nexport function requireTargets(args: Record<string, unknown>, name: string): string[] {\n const ids = csvArg(args[name]);\n if (!ids) {\n failWriteValidation(`${name} is required — pass one or more ids, comma-separated`);\n }\n return ids;\n}\n\n/** The op, checked against the same schema the backend applies, before anything is sent. */\nfunction preflight(raw: Record<string, unknown>) {\n const parsed = chatgptDraftOpInputSchema.safeParse(raw);\n if (parsed.success) {\n return parsed.data;\n }\n const fields = parsed.error.issues.map((issue) => ({ path: issue.path.join(\".\"), message: issue.message }));\n const message = fields.map((field) => (field.path ? `${field.path}: ${field.message}` : field.message)).join(\"; \");\n return fail({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message,\n fix: {\n action: \"retry_with_modified_query\",\n explanation:\n \"Fix the named fields and stage again. Nothing was staged — the draft is as it was before this call.\",\n },\n retryable: false,\n },\n });\n}\n\n/** The ChatGPT Ads routes answer with the payload itself; the envelope is the CLI's to add. */\nasync function postStage(chatId: string, op: ReturnType<typeof preflight>): Promise<ChatgptDraftStageResponse> {\n return await apiPost<ChatgptDraftStageResponse>(\"/api/ads/chatgpt/draft/stage\", { chatId, op });\n}\n\n/** Stage one op and print what was staged; `hintsFor` names the obvious next step. */\nexport async function stageChatgptOp(\n raw: Record<string, unknown>,\n reference: string,\n hintsFor?: (staged: ChatgptDraftStageResponse) => string[],\n): Promise<void> {\n const op = preflight(raw);\n try {\n const staged = await postStage(requireChatId(), op);\n const hints = hintsFor?.(staged) ?? [];\n writeJsonEnvelope({ ok: true, data: staged, ...(hints.length > 0 ? { hints } : {}) });\n } catch (err) {\n fail(writeFailure(err, reference));\n }\n}\n\n/**\n * Stage the same change on several entities (a pause across campaigns). Each is\n * its own op; when one is refused, the ones already staged are named so the\n * agent neither re-stages nor loses them.\n */\nexport async function stageChatgptOps(raws: Array<Record<string, unknown>>, reference: string): Promise<void> {\n if (raws.length === 1 && raws[0]) {\n await stageChatgptOp(raws[0], reference);\n return;\n }\n const ops = raws.map(preflight);\n const staged: ChatgptDraftStageResponse[] = [];\n try {\n const chatId = requireChatId();\n for (const op of ops) {\n staged.push(await postStage(chatId, op));\n }\n writeJsonEnvelope({ ok: true, data: staged });\n } catch (err) {\n const failure = writeFailure(err, reference);\n if (staged.length > 0) {\n failure.error.message = `${failure.error.message} (already staged: ${staged.map((s) => s.summary).join(\"; \")})`;\n }\n fail(failure);\n }\n}\n\n/** On an update, `none` empties a list — ChatGPT Ads' way to clear exclusions, audiences or regions. */\nexport function clearableCsvArg(value: unknown): string[] | undefined {\n return typeof value === \"string\" && value.trim().toLowerCase() === \"none\" ? [] : csvArg(value);\n}\n\n/** On an update, `none` removes the value — a tracking template. */\nexport function clearableArg(value: unknown): string | null | undefined {\n if (typeof value !== \"string\" || value.trim() === \"\") {\n return undefined;\n }\n return value.trim().toLowerCase() === \"none\" ? null : value.trim();\n}\n\n/** A crop as `x,y,width,height`, each a share of the image from 0 to 1. */\nexport function cropArg(\n value: unknown,\n flag: string,\n): { x: number; y: number; width: number; height: number } | undefined {\n const parts = csvArg(value);\n if (!parts) {\n return undefined;\n }\n const numbers = parts.map(Number);\n const [x, y, width, height] = numbers;\n if (\n numbers.length !== 4 ||\n numbers.some(Number.isNaN) ||\n x === undefined ||\n y === undefined ||\n width === undefined ||\n height === undefined\n ) {\n failWriteValidation(`${flag} takes four shares of the image, x,y,width,height — e.g. 0.1,0,0.8,0.8`);\n }\n return { x, y, width, height };\n}\n\ntype StatusEntity = \"campaign\" | \"adGroup\" | \"ad\";\ntype StatusVerb = \"pause\" | \"resume\" | \"archive\";\n\nconst STATUS_OF: Record<StatusVerb, \"paused\" | \"active\" | \"archived\"> = {\n pause: \"paused\",\n resume: \"active\",\n archive: \"archived\",\n};\n\nexport function statusOps(entity: StatusEntity, ids: readonly string[], status: \"paused\" | \"active\" | \"archived\") {\n return ids.map((id) => ({ kind: `${entity}.update`, target: id, payload: { status } }));\n}\n\nconst STATUS_NOUN: Record<StatusEntity, { command: string; plural: string; example: string }> = {\n campaign: { command: \"campaigns\", plural: \"campaigns\", example: \"cmpn_123,cmpn_456\" },\n adGroup: { command: \"ad-groups\", plural: \"ad groups\", example: \"adgrp_123,adgrp_456\" },\n ad: { command: \"ads\", plural: \"cards\", example: \"ad_123,ad_456\" },\n};\n\nconst STATUS_DOING: Record<StatusVerb, string> = { pause: \"pausing\", resume: \"resuming\", archive: \"archiving\" };\n\n/** `pause`, `resume` or `archive` for every id passed, staged as one change each. */\nexport function statusCommand(entity: StatusEntity, verb: StatusVerb, reference: string) {\n const noun = STATUS_NOUN[entity];\n const args = {\n ids: { type: \"positional\", description: `${noun.plural} ids, comma-separated`, required: true },\n } as const;\n const forGood =\n verb === \"archive\"\n ? ` Archiving is for good: ChatGPT Ads cannot bring archived ${noun.plural} back, and their results stay in reports. Pause instead unless the user asked to archive.`\n : \"\";\n registerSchema({\n command: `ads.chatgpt.${noun.command}.${verb}`,\n description: `Stage ${STATUS_DOING[verb]} one or more ChatGPT Ads ${noun.plural}. Pass every id in one call.${forGood}`,\n args: schemaArgs(args),\n });\n return defineCommand({\n meta: {\n name: verb,\n description: `Stage ${STATUS_DOING[verb]} ${noun.plural}.${forGood}\n\nExample:\n baker ads chatgpt ${noun.command} ${verb} ${noun.example}`,\n },\n args,\n run: async ({ args: parsed }) => {\n await stageChatgptOps(statusOps(entity, requireTargets(parsed, \"ids\"), STATUS_OF[verb]), reference);\n },\n });\n}\n\n/**\n * Product filters as a marketer writes them: `brand in Acme|Baker; price lte 5000`\n * — conditions split by `;`, each field, operator and values (several joined\n * with `|`). `none` is no filter: the whole catalog.\n */\nexport function productFiltersArg(\n value: unknown,\n): Array<{ field: string; operator: string; values: string[] }> | undefined {\n if (typeof value !== \"string\" || value.trim() === \"\") {\n return undefined;\n }\n if (value.trim().toLowerCase() === \"none\") {\n return [];\n }\n return value\n .split(\";\")\n .map((condition) => condition.trim())\n .filter(Boolean)\n .map((condition) => {\n const match = /^(\\S+)\\s+(\\S+)\\s+(.+)$/.exec(condition);\n if (!match?.[1] || !match[2] || !match[3]) {\n failWriteValidation(\n `\"${condition}\" is not a product filter — write field operator values, e.g. price lte 5000`,\n );\n }\n return {\n field: match[1],\n operator: match[2].toLowerCase(),\n values: match[3]\n .split(\"|\")\n .map((part) => part.trim())\n .filter(Boolean),\n };\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
// ../api/src/identity/digest.ts
|
|
2
|
+
var SHA256_HEX = /^[0-9a-fA-F]{64}$/;
|
|
3
|
+
function isSha256Hex(value) {
|
|
4
|
+
return SHA256_HEX.test(value);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
// ../api/src/identity/email.ts
|
|
8
|
+
function normalizeEmailV1(raw) {
|
|
9
|
+
const trimmed = raw.trim().toLowerCase();
|
|
10
|
+
return trimmed === "" ? null : trimmed;
|
|
11
|
+
}
|
|
12
|
+
var EMAIL = /^[^\s@]+@[^\s@.]+(?:\.[^\s@.]+)+$/;
|
|
13
|
+
function normalizeEmailV2(raw) {
|
|
14
|
+
const trimmed = raw.trim().toLowerCase();
|
|
15
|
+
return EMAIL.test(trimmed) ? trimmed : null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// ../api/src/identity/phone.ts
|
|
19
|
+
function normalizePhoneV1(raw) {
|
|
20
|
+
const digits = raw.trim().toLowerCase().replace(/[^0-9]/g, "");
|
|
21
|
+
return digits === "" ? null : `+${digits}`;
|
|
22
|
+
}
|
|
23
|
+
var PHONE_PUNCTUATION = /[\s()./-]/g;
|
|
24
|
+
var E164 = /^\+[1-9]\d{7,14}$/;
|
|
25
|
+
function normalizePhoneV2(raw) {
|
|
26
|
+
const compact = raw.replace(PHONE_PUNCTUATION, "");
|
|
27
|
+
const e164 = compact.startsWith("00") ? `+${compact.slice(2)}` : compact;
|
|
28
|
+
return E164.test(e164) ? e164 : null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ../api/src/identity/index.ts
|
|
32
|
+
function normalizeIdentity(raw, version) {
|
|
33
|
+
const value = raw.kind === "email" ? version === 1 ? normalizeEmailV1(raw.value) : normalizeEmailV2(raw.value) : version === 1 ? normalizePhoneV1(raw.value) : normalizePhoneV2(raw.value);
|
|
34
|
+
return value === null ? null : { kind: raw.kind, value, normalizationVersion: version };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ../api/src/event-ingest/matching.ts
|
|
38
|
+
var MATCH_FIELDS = [
|
|
39
|
+
"first_name",
|
|
40
|
+
"last_name",
|
|
41
|
+
"date_of_birth",
|
|
42
|
+
"gender",
|
|
43
|
+
"city",
|
|
44
|
+
"region",
|
|
45
|
+
"postal_code",
|
|
46
|
+
"country"
|
|
47
|
+
];
|
|
48
|
+
var MATCH_COOKIES = ["fbp", "fbc"];
|
|
49
|
+
function tightened(value) {
|
|
50
|
+
const stripped = value.toLowerCase().replace(/[^\p{L}\p{N}]/gu, "");
|
|
51
|
+
return stripped === "" ? null : stripped;
|
|
52
|
+
}
|
|
53
|
+
function loosened(value) {
|
|
54
|
+
const collapsed = value.trim().toLowerCase().replace(/\s+/g, " ");
|
|
55
|
+
return collapsed === "" ? null : collapsed;
|
|
56
|
+
}
|
|
57
|
+
function birthDate(value) {
|
|
58
|
+
const digits = value.replace(/\D/g, "");
|
|
59
|
+
if (!/^\d{8}$/.test(digits)) return null;
|
|
60
|
+
const month = Number(digits.slice(4, 6));
|
|
61
|
+
const day = Number(digits.slice(6, 8));
|
|
62
|
+
if (month < 1 || month > 12 || day < 1 || day > 31) return null;
|
|
63
|
+
return digits;
|
|
64
|
+
}
|
|
65
|
+
function genderLetter(value) {
|
|
66
|
+
const first = value.trim().toLowerCase().charAt(0);
|
|
67
|
+
return first === "f" || first === "m" ? first : null;
|
|
68
|
+
}
|
|
69
|
+
function countryCode(value) {
|
|
70
|
+
const code = value.trim().toLowerCase();
|
|
71
|
+
return /^[a-z]{2}$/.test(code) ? code : null;
|
|
72
|
+
}
|
|
73
|
+
var MATCH_SPECS = {
|
|
74
|
+
first_name: { keep: "hashed", normalize: tightened, meta: "fn", google: "hashed_first_name" },
|
|
75
|
+
last_name: { keep: "hashed", normalize: tightened, meta: "ln", google: "hashed_last_name" },
|
|
76
|
+
// Meta only. Google's enhanced conversions have no date of birth, so there is
|
|
77
|
+
// no destination wanting it in the clear and every reason not to keep one.
|
|
78
|
+
date_of_birth: { keep: "hashed", normalize: birthDate, meta: "db", google: null },
|
|
79
|
+
gender: { keep: "plain", normalize: genderLetter, meta: "ge", google: null },
|
|
80
|
+
city: { keep: "plain", normalize: loosened, meta: "ct", google: "city" },
|
|
81
|
+
region: { keep: "plain", normalize: loosened, meta: "st", google: "state" },
|
|
82
|
+
postal_code: { keep: "plain", normalize: loosened, meta: "zp", google: "postal_code" },
|
|
83
|
+
country: { keep: "plain", normalize: countryCode, meta: "country", google: "country_code" }
|
|
84
|
+
};
|
|
85
|
+
var MATCH_FIELD_FORWARDING = [
|
|
86
|
+
{ field: "email", meta: "em", google: "hashed_email", hashed: true },
|
|
87
|
+
{ field: "phone", meta: "ph", google: "hashed_phone_number", hashed: true },
|
|
88
|
+
// Kept in the clear — see `resolveOwnId`. The digest is still computed and
|
|
89
|
+
// still stored beside it, so a Meta forward has one; what changed is that the
|
|
90
|
+
// sender's own key is now readable, which is the entire reason they sent it.
|
|
91
|
+
{ field: "external_id", meta: "external_id", google: null, hashed: false },
|
|
92
|
+
...MATCH_FIELDS.map((field) => ({
|
|
93
|
+
field,
|
|
94
|
+
meta: MATCH_SPECS[field].meta,
|
|
95
|
+
google: MATCH_SPECS[field].google,
|
|
96
|
+
hashed: MATCH_SPECS[field].keep === "hashed"
|
|
97
|
+
})),
|
|
98
|
+
{ field: "fbp", meta: "fbp", google: null, hashed: false },
|
|
99
|
+
{ field: "fbc", meta: "fbc", google: null, hashed: false }
|
|
100
|
+
];
|
|
101
|
+
|
|
102
|
+
// ../api/src/event-ingest/vocabulary.ts
|
|
103
|
+
var INGEST_CLICK_ID_PARAMS = [
|
|
104
|
+
"gclid",
|
|
105
|
+
"wbraid",
|
|
106
|
+
"gbraid",
|
|
107
|
+
"dclid",
|
|
108
|
+
"fbclid",
|
|
109
|
+
"ttclid",
|
|
110
|
+
"twclid",
|
|
111
|
+
"li_fat_id",
|
|
112
|
+
"msclkid",
|
|
113
|
+
"rdt_cid",
|
|
114
|
+
"epik",
|
|
115
|
+
"sccid",
|
|
116
|
+
"oppref"
|
|
117
|
+
];
|
|
118
|
+
|
|
119
|
+
// ../api/src/event-sources/fields.ts
|
|
120
|
+
var MATCH_LABELS = {
|
|
121
|
+
first_name: "First name",
|
|
122
|
+
last_name: "Last name",
|
|
123
|
+
date_of_birth: "Date of birth",
|
|
124
|
+
gender: "Gender",
|
|
125
|
+
city: "City",
|
|
126
|
+
region: "Region",
|
|
127
|
+
postal_code: "Postcode",
|
|
128
|
+
country: "Country"
|
|
129
|
+
};
|
|
130
|
+
var CLICK_LABELS = {
|
|
131
|
+
gclid: "Google click id",
|
|
132
|
+
wbraid: "Google click id (iOS, web to app)",
|
|
133
|
+
gbraid: "Google click id (iOS, app)",
|
|
134
|
+
dclid: "Google click id (Display & Video)",
|
|
135
|
+
fbclid: "Meta click id",
|
|
136
|
+
ttclid: "TikTok click id",
|
|
137
|
+
twclid: "X click id",
|
|
138
|
+
li_fat_id: "LinkedIn click id",
|
|
139
|
+
msclkid: "Microsoft click id",
|
|
140
|
+
rdt_cid: "Reddit click id",
|
|
141
|
+
epik: "Pinterest click id",
|
|
142
|
+
sccid: "Snapchat click id",
|
|
143
|
+
oppref: "ChatGPT Ads click id"
|
|
144
|
+
};
|
|
145
|
+
var SOURCE_FIELDS = [
|
|
146
|
+
{ field: "event_name", label: "What happened", group: "event" },
|
|
147
|
+
{ field: "event_time", label: "When it happened", group: "event" },
|
|
148
|
+
{ field: "event_id", label: "Its id", group: "event" },
|
|
149
|
+
{ field: "email", label: "Email", group: "person" },
|
|
150
|
+
{ field: "phone", label: "Phone", group: "person" },
|
|
151
|
+
{ field: "external_id", label: "Your own id for the person", group: "person" },
|
|
152
|
+
...MATCH_FIELDS.map((field) => ({ field, label: MATCH_LABELS[field], group: "person" })),
|
|
153
|
+
{ field: "value", label: "Amount", group: "money" },
|
|
154
|
+
{ field: "currency", label: "Currency", group: "money" },
|
|
155
|
+
...INGEST_CLICK_ID_PARAMS.map((field) => ({ field, label: CLICK_LABELS[field], group: "click" }))
|
|
156
|
+
];
|
|
157
|
+
var SOURCE_FIELD_NAMES = SOURCE_FIELDS.map((spec) => spec.field);
|
|
158
|
+
var FIELD_SET = new Set(SOURCE_FIELD_NAMES);
|
|
159
|
+
function isSourceField(value) {
|
|
160
|
+
return FIELD_SET.has(value);
|
|
161
|
+
}
|
|
162
|
+
var PROPERTY_ROW_PREFIX = "properties.";
|
|
163
|
+
var PROPERTY_KEY_MAX = 64;
|
|
164
|
+
var PROPERTY_KEY = /^[A-Za-z0-9_][A-Za-z0-9_.-]*$/;
|
|
165
|
+
var RESERVED_PROPERTY_KEYS = ["baker_source", "hubspot_property", "hubspot_value"];
|
|
166
|
+
function isPropertyRow(row) {
|
|
167
|
+
return row.startsWith(PROPERTY_ROW_PREFIX);
|
|
168
|
+
}
|
|
169
|
+
function propertyKeyOf(row) {
|
|
170
|
+
return isPropertyRow(row) ? row.slice(PROPERTY_ROW_PREFIX.length) : null;
|
|
171
|
+
}
|
|
172
|
+
function propertyKeyProblem(key) {
|
|
173
|
+
const trimmed = key.trim();
|
|
174
|
+
if (trimmed === "") return "A property needs a name.";
|
|
175
|
+
if (trimmed.length > PROPERTY_KEY_MAX) return `A property name is at most ${PROPERTY_KEY_MAX} characters.`;
|
|
176
|
+
if (!PROPERTY_KEY.test(trimmed)) {
|
|
177
|
+
return `"${trimmed}" is not a property name: letters, digits, underscore, dash and dot only, starting with a letter or digit.`;
|
|
178
|
+
}
|
|
179
|
+
if (RESERVED_PROPERTY_KEYS.includes(trimmed)) return `"${trimmed}" is written by Baker itself; pick another name.`;
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
function mappingRowProblem(row) {
|
|
183
|
+
if (isSourceField(row)) return null;
|
|
184
|
+
const key = propertyKeyOf(row);
|
|
185
|
+
if (key === null) {
|
|
186
|
+
return `"${row}" is not a field an event can carry. A field is one of ${SOURCE_FIELD_NAMES.join(", ")}; an extra property is spelled properties.<name>.`;
|
|
187
|
+
}
|
|
188
|
+
return propertyKeyProblem(key);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// ../api/src/event-sources/template.ts
|
|
192
|
+
var MENTION = /\{\{\s*([^{}]+?)\s*\}\}/g;
|
|
193
|
+
function mentionOf(path) {
|
|
194
|
+
return `{{${path}}}`;
|
|
195
|
+
}
|
|
196
|
+
function templateMentions(template) {
|
|
197
|
+
const seen = [];
|
|
198
|
+
for (const match of template.matchAll(MENTION)) {
|
|
199
|
+
const path = (match[1] ?? "").trim();
|
|
200
|
+
if (path !== "" && !seen.includes(path)) seen.push(path);
|
|
201
|
+
}
|
|
202
|
+
return seen;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export {
|
|
206
|
+
isSha256Hex,
|
|
207
|
+
normalizeIdentity,
|
|
208
|
+
MATCH_COOKIES,
|
|
209
|
+
MATCH_FIELD_FORWARDING,
|
|
210
|
+
INGEST_CLICK_ID_PARAMS,
|
|
211
|
+
SOURCE_FIELD_NAMES,
|
|
212
|
+
mappingRowProblem,
|
|
213
|
+
mentionOf,
|
|
214
|
+
templateMentions
|
|
215
|
+
};
|
|
216
|
+
//# sourceMappingURL=chunk-EDLZGTGN.js.map
|