@koda-sl/baker-cli 0.384.0-dev.4699b7308 → 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 +1098 -217
- 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 -69986
- 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-CHJOTJTZ.js +0 -9989
- package/dist/chunk-CHJOTJTZ.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/commands/gsc/resolve.ts"],"sourcesContent":["import { ApiError, apiGet } from \"../../client.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport { handleConnectionError, needsConnectionFix } from \"../../error-handler.ts\";\nimport { cacheGet, cacheSet } from \"../ads/cache.ts\";\nimport { writeJsonEnvelope } from \"../ads/output.ts\";\n\ninterface GscSite {\n siteUrl: string;\n permissionLevel: string;\n}\n\nasync function fetchSites(useCache = true): Promise<GscSite[]> {\n if (useCache) {\n const cached = cacheGet<GscSite[]>(\"gsc-sites\", \"list\");\n if (cached) return cached.data;\n }\n const params = !useCache ? { \"skip-cache\": \"true\" } : undefined;\n const data = await apiGet<GscSite[]>(\"/api/gsc/sites\", params);\n if (useCache) {\n cacheSet(\"gsc-sites\", \"list\", data, 60 * 60 * 1000);\n }\n return data;\n}\n\nexport async function resolveSiteUrl(args: Record<string, unknown>): Promise<string> {\n const fromArgs = args[\"site-url\"] as string | undefined;\n const fromEnv = getEnv().BAKER_GSC_SITE_URL;\n const siteUrl = fromArgs || fromEnv;\n\n if (siteUrl) return siteUrl;\n\n const useCache = !args[\"no-cache\"];\n\n try {\n const sites = await fetchSites(useCache);\n const [single] = sites;\n if (sites.length === 1 && single) {\n process.stderr.write(`Using site \"${single.siteUrl}\"\\n`);\n return single.siteUrl;\n }\n if (sites.length === 0) {\n handleConnectionError(\"gsc\");\n }\n const list = sites.map((s) => ` ${s.siteUrl} (${s.permissionLevel})`).join(\"\\n\");\n writeJsonEnvelope({\n ok: false,\n error: {\n code: \"MULTIPLE_SITES\",\n message: `Multiple sites found. Pass --site-url or set BAKER_GSC_SITE_URL:\\n${list}`,\n },\n });\n process.exit(1);\n } catch (err) {\n // The listing call is the only thing that can throw here, so a 401/404 from\n // it means the connection is missing — not that resolution is ambiguous.\n if (err instanceof ApiError && needsConnectionFix(err.code, err.message)) {\n handleConnectionError(\"gsc\", err.message);\n }\n writeJsonEnvelope({\n ok: false,\n error: {\n code: \"RESOLUTION_ERROR\",\n message: \"Could not auto-detect site. Pass --site-url or set BAKER_GSC_SITE_URL.\",\n },\n });\n process.exit(1);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAWA,eAAe,WAAW,WAAW,MAA0B;AAC7D,MAAI,UAAU;AACZ,UAAM,SAAS,SAAoB,aAAa,MAAM;AACtD,QAAI,OAAQ,QAAO,OAAO;AAAA,EAC5B;AACA,QAAM,SAAS,CAAC,WAAW,EAAE,cAAc,OAAO,IAAI;AACtD,QAAM,OAAO,MAAM,OAAkB,kBAAkB,MAAM;AAC7D,MAAI,UAAU;AACZ,aAAS,aAAa,QAAQ,MAAM,KAAK,KAAK,GAAI;AAAA,EACpD;AACA,SAAO;AACT;AAEA,eAAsB,eAAe,MAAgD;AACnF,QAAM,WAAW,KAAK,UAAU;AAChC,QAAM,UAAU,OAAO,EAAE;AACzB,QAAM,UAAU,YAAY;AAE5B,MAAI,QAAS,QAAO;AAEpB,QAAM,WAAW,CAAC,KAAK,UAAU;AAEjC,MAAI;AACF,UAAM,QAAQ,MAAM,WAAW,QAAQ;AACvC,UAAM,CAAC,MAAM,IAAI;AACjB,QAAI,MAAM,WAAW,KAAK,QAAQ;AAChC,cAAQ,OAAO,MAAM,eAAe,OAAO,OAAO;AAAA,CAAK;AACvD,aAAO,OAAO;AAAA,IAChB;AACA,QAAI,MAAM,WAAW,GAAG;AACtB,4BAAsB,KAAK;AAAA,IAC7B;AACA,UAAM,OAAO,MAAM,IAAI,CAAC,MAAM,KAAK,EAAE,OAAO,MAAM,EAAE,eAAe,GAAG,EAAE,KAAK,IAAI;AACjF,sBAAkB;AAAA,MAChB,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,EAAqE,IAAI;AAAA,MACpF;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,KAAK;AAGZ,QAAI,eAAe,YAAY,mBAAmB,IAAI,MAAM,IAAI,OAAO,GAAG;AACxE,4BAAsB,OAAO,IAAI,OAAO;AAAA,IAC1C;AACA,sBAAkB;AAAA,MAChB,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;","names":[]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// src/commands/avatars/profile.ts
|
|
2
|
+
var TEXT_FIELDS = [
|
|
3
|
+
["subject", "subjectDescription"],
|
|
4
|
+
["persona", "persona"],
|
|
5
|
+
["speech", "speech"],
|
|
6
|
+
["accent", "accent"],
|
|
7
|
+
["motion", "motion"],
|
|
8
|
+
["wardrobe", "wardrobe"],
|
|
9
|
+
["setting", "setting"]
|
|
10
|
+
];
|
|
11
|
+
function parseGuardrails(value) {
|
|
12
|
+
if (typeof value !== "string") {
|
|
13
|
+
return void 0;
|
|
14
|
+
}
|
|
15
|
+
return [
|
|
16
|
+
...new Set(
|
|
17
|
+
value.split(",").map((rule) => rule.trim()).filter((rule) => rule.length > 0)
|
|
18
|
+
)
|
|
19
|
+
];
|
|
20
|
+
}
|
|
21
|
+
function buildProfilePatch(args) {
|
|
22
|
+
const patch = {};
|
|
23
|
+
for (const [flag, field] of TEXT_FIELDS) {
|
|
24
|
+
const value = args[flag];
|
|
25
|
+
if (typeof value === "string") {
|
|
26
|
+
Object.assign(patch, { [field]: value.trim() });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const guardrails = parseGuardrails(args.guardrails);
|
|
30
|
+
if (guardrails) {
|
|
31
|
+
patch.guardrails = guardrails;
|
|
32
|
+
}
|
|
33
|
+
return patch;
|
|
34
|
+
}
|
|
35
|
+
function hasProfileEdit(patch) {
|
|
36
|
+
return Object.keys(patch).length > 0;
|
|
37
|
+
}
|
|
38
|
+
function mergeProfile(current, patch) {
|
|
39
|
+
const merged = { ...current };
|
|
40
|
+
for (const [key, value] of Object.entries(patch)) {
|
|
41
|
+
if (value.length === 0) {
|
|
42
|
+
if (key !== "subjectDescription") {
|
|
43
|
+
delete merged[key];
|
|
44
|
+
}
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
Object.assign(merged, { [key]: value });
|
|
48
|
+
}
|
|
49
|
+
return merged;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export {
|
|
53
|
+
buildProfilePatch,
|
|
54
|
+
hasProfileEdit,
|
|
55
|
+
mergeProfile
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=chunk-IJMWEO4P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/avatars/profile.ts"],"sourcesContent":["import type { AvatarProfile } from \"@baker/api\";\n\n/**\n * A partial edit of an avatar's written profile.\n *\n * `update` sends the profile whole — the backend replaces it rather than\n * merging — so an agent that passes `--persona` alone would wipe the subject\n * description, which is the one field the identity depends on. The CLI reads\n * the stored profile first and merges this patch over it.\n */\nexport type AvatarProfilePatch = Partial<AvatarProfile>;\n\n/** Written-profile flags, in the order they read on the command line. */\nexport const PROFILE_FLAGS = [\n \"subject\",\n \"persona\",\n \"speech\",\n \"accent\",\n \"motion\",\n \"wardrobe\",\n \"setting\",\n \"guardrails\",\n] as const;\n\ntype AvatarProfileTextField = Exclude<keyof AvatarProfile, \"guardrails\">;\n\nconst TEXT_FIELDS: ReadonlyArray<[flag: string, field: AvatarProfileTextField]> = [\n [\"subject\", \"subjectDescription\"],\n [\"persona\", \"persona\"],\n [\"speech\", \"speech\"],\n [\"accent\", \"accent\"],\n [\"motion\", \"motion\"],\n [\"wardrobe\", \"wardrobe\"],\n [\"setting\", \"setting\"],\n];\n\n/**\n * Split a `--guardrails \"never a, never b\"` flag into single rules.\n *\n * Returns undefined when the flag was omitted so the caller can tell \"leave the\n * stored rules alone\" from \"clear them\" (an empty string).\n */\nexport function parseGuardrails(value: unknown): string[] | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n return [\n ...new Set(\n value\n .split(\",\")\n .map((rule) => rule.trim())\n .filter((rule) => rule.length > 0),\n ),\n ];\n}\n\n/** Read the profile flags a caller actually passed. Omitted flags stay absent. */\nexport function buildProfilePatch(args: Record<string, unknown>): AvatarProfilePatch {\n const patch: AvatarProfilePatch = {};\n for (const [flag, field] of TEXT_FIELDS) {\n const value = args[flag];\n if (typeof value === \"string\") {\n Object.assign(patch, { [field]: value.trim() });\n }\n }\n const guardrails = parseGuardrails(args.guardrails);\n if (guardrails) {\n patch.guardrails = guardrails;\n }\n return patch;\n}\n\nexport function hasProfileEdit(patch: AvatarProfilePatch): boolean {\n return Object.keys(patch).length > 0;\n}\n\n/**\n * Merge a patch over the stored profile. An empty value clears the field it\n * names — except `subjectDescription`, which the identity sheet was fused from\n * and can only ever be replaced, never removed (`update` rejects the empty\n * flag outright, so this is the second line of defence).\n */\nexport function mergeProfile(current: AvatarProfile, patch: AvatarProfilePatch): AvatarProfile {\n const merged: AvatarProfile = { ...current };\n for (const [key, value] of Object.entries(patch) as [keyof AvatarProfile, string | string[]][]) {\n if (value.length === 0) {\n if (key !== \"subjectDescription\") {\n delete merged[key];\n }\n continue;\n }\n Object.assign(merged, { [key]: value });\n }\n return merged;\n}\n"],"mappings":";AA0BA,IAAM,cAA4E;AAAA,EAChF,CAAC,WAAW,oBAAoB;AAAA,EAChC,CAAC,WAAW,SAAS;AAAA,EACrB,CAAC,UAAU,QAAQ;AAAA,EACnB,CAAC,UAAU,QAAQ;AAAA,EACnB,CAAC,UAAU,QAAQ;AAAA,EACnB,CAAC,YAAY,UAAU;AAAA,EACvB,CAAC,WAAW,SAAS;AACvB;AAQO,SAAS,gBAAgB,OAAsC;AACpE,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,GAAG,IAAI;AAAA,MACL,MACG,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAAA,IACrC;AAAA,EACF;AACF;AAGO,SAAS,kBAAkB,MAAmD;AACnF,QAAM,QAA4B,CAAC;AACnC,aAAW,CAAC,MAAM,KAAK,KAAK,aAAa;AACvC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,OAAO,OAAO,EAAE,CAAC,KAAK,GAAG,MAAM,KAAK,EAAE,CAAC;AAAA,IAChD;AAAA,EACF;AACA,QAAM,aAAa,gBAAgB,KAAK,UAAU;AAClD,MAAI,YAAY;AACd,UAAM,aAAa;AAAA,EACrB;AACA,SAAO;AACT;AAEO,SAAS,eAAe,OAAoC;AACjE,SAAO,OAAO,KAAK,KAAK,EAAE,SAAS;AACrC;AAQO,SAAS,aAAa,SAAwB,OAA0C;AAC7F,QAAM,SAAwB,EAAE,GAAG,QAAQ;AAC3C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAiD;AAC9F,QAAI,MAAM,WAAW,GAAG;AACtB,UAAI,QAAQ,sBAAsB;AAChC,eAAO,OAAO,GAAG;AAAA,MACnB;AACA;AAAA,IACF;AACA,WAAO,OAAO,QAAQ,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC;AAAA,EACxC;AACA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import {
|
|
2
|
+
handleConnectionError,
|
|
3
|
+
needsConnectionFix,
|
|
4
|
+
writeAdsJson
|
|
5
|
+
} from "./chunk-EIGXX6KI.js";
|
|
6
|
+
import {
|
|
7
|
+
LINKEDIN_SEARCH_STATUSES,
|
|
8
|
+
unsupportedLinkedinSearchStatuses
|
|
9
|
+
} from "./chunk-O6XZIQXZ.js";
|
|
10
|
+
import {
|
|
11
|
+
ApiError
|
|
12
|
+
} from "./chunk-CUL3VB4L.js";
|
|
13
|
+
import {
|
|
14
|
+
MissingChatIdError,
|
|
15
|
+
getEnv
|
|
16
|
+
} from "./chunk-I4FTS5EE.js";
|
|
17
|
+
|
|
18
|
+
// src/commands/ads/linkedin/shared.ts
|
|
19
|
+
var DAY_MS = 864e5;
|
|
20
|
+
function handleLinkedinError(err) {
|
|
21
|
+
if (err instanceof ApiError) {
|
|
22
|
+
if (needsConnectionFix(err.code, err.message)) {
|
|
23
|
+
handleConnectionError("linkedin_ads", err.message);
|
|
24
|
+
}
|
|
25
|
+
if (isNoAccountsSelectedError(err.code, err.message)) {
|
|
26
|
+
handleConnectionError("linkedin_ads", err.message);
|
|
27
|
+
}
|
|
28
|
+
const explanation = explainLinkedinError(err);
|
|
29
|
+
const envelope = {
|
|
30
|
+
ok: false,
|
|
31
|
+
error: {
|
|
32
|
+
code: err.code,
|
|
33
|
+
message: err.message,
|
|
34
|
+
fix: {
|
|
35
|
+
action: explanation.action,
|
|
36
|
+
explanation: explanation.message,
|
|
37
|
+
correctedCommand: explanation.correctedCommand
|
|
38
|
+
},
|
|
39
|
+
retryable: err.code === "RATE_LIMITED" || err.code === "UNAVAILABLE" || err.code === "INTERNAL_ERROR"
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
writeAdsJson(envelope);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
writeAdsJson(unexpectedErrorEnvelope(err));
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
function unexpectedErrorEnvelope(err) {
|
|
49
|
+
if (err instanceof MissingChatIdError) {
|
|
50
|
+
return {
|
|
51
|
+
ok: false,
|
|
52
|
+
error: {
|
|
53
|
+
code: err.code,
|
|
54
|
+
message: err.message,
|
|
55
|
+
fix: {
|
|
56
|
+
action: "reject",
|
|
57
|
+
explanation: "LinkedIn changes are staged in a chat and this run has none. Don't retry: carry on with the rest of the job and tell the user this change couldn't be staged from here."
|
|
58
|
+
},
|
|
59
|
+
retryable: false
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const message = err instanceof Error ? err.message : "Unexpected error";
|
|
64
|
+
return { ok: false, error: { code: "NETWORK_ERROR", message } };
|
|
65
|
+
}
|
|
66
|
+
function isNoAccountsSelectedError(code, message) {
|
|
67
|
+
return code === "VALIDATION_ERROR" && /no linkedin ad accounts selected/i.test(message);
|
|
68
|
+
}
|
|
69
|
+
function explainLinkedinError(err) {
|
|
70
|
+
const lower = err.message.toLowerCase();
|
|
71
|
+
if (err.code === "VALIDATION_ERROR" && lower.includes("granularity") && lower.includes("daily")) {
|
|
72
|
+
return {
|
|
73
|
+
action: "retry_with_flag",
|
|
74
|
+
message: "LinkedIn rejects DAILY granularity when pivoting on demographic dims (job-title, company, etc.). Re-run with --granularity ALL or MONTHLY.",
|
|
75
|
+
correctedCommand: void 0
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
if (err.code === "RATE_LIMITED") {
|
|
79
|
+
return {
|
|
80
|
+
action: "wait_and_retry",
|
|
81
|
+
message: "Hit a LinkedIn throttle. The CLI already backs off automatically \u2014 if you see this you've exhausted the retry budget. Wait ~60s and retry."
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
if (err.code === "INTERNAL_ERROR" && lower.includes("deprecat")) {
|
|
85
|
+
return {
|
|
86
|
+
action: "reject",
|
|
87
|
+
message: "LinkedIn-Version header is deprecated. The backend constant LINKEDIN_API_VERSION needs to be bumped \u2014 file an issue or update the constant."
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return { action: "reject", message: err.message };
|
|
91
|
+
}
|
|
92
|
+
var LI_ACCOUNT_ID_RE = /^(urn:li:sponsoredAccount:)?\d+$/;
|
|
93
|
+
function resolveAccountIdArg(args) {
|
|
94
|
+
const fromArgs = args["account-id"] ?? args["account-urn"];
|
|
95
|
+
const id = fromArgs || getEnv().BAKER_LINKEDIN_AD_ACCOUNT_ID;
|
|
96
|
+
if (!id) {
|
|
97
|
+
writeAdsJson({
|
|
98
|
+
ok: false,
|
|
99
|
+
error: {
|
|
100
|
+
code: "MISSING_ACCOUNT_ID",
|
|
101
|
+
message: "Pass --account-id (numeric) or --account-urn (urn:li:sponsoredAccount:N), or set BAKER_LINKEDIN_AD_ACCOUNT_ID. Run `baker ads linkedin accounts` to find IDs."
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
if (!LI_ACCOUNT_ID_RE.test(id)) {
|
|
107
|
+
writeAdsJson({
|
|
108
|
+
ok: false,
|
|
109
|
+
error: {
|
|
110
|
+
code: "INVALID_ACCOUNT_ID",
|
|
111
|
+
message: `Invalid LinkedIn account ID "${id}". Expected numeric or urn:li:sponsoredAccount:N.`
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
return id.startsWith("urn:") ? id.split(":").pop() ?? id : id;
|
|
117
|
+
}
|
|
118
|
+
function todayIso() {
|
|
119
|
+
return (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
120
|
+
}
|
|
121
|
+
function daysAgoIso(days) {
|
|
122
|
+
return new Date(Date.now() - days * DAY_MS).toISOString().slice(0, 10);
|
|
123
|
+
}
|
|
124
|
+
function csvOrJson(args) {
|
|
125
|
+
return args.output ?? "json";
|
|
126
|
+
}
|
|
127
|
+
function statusesArgDescription(level) {
|
|
128
|
+
return `CSV of statuses (${LINKEDIN_SEARCH_STATUSES[level].join(",")})`;
|
|
129
|
+
}
|
|
130
|
+
function statusFilterError(level, statuses) {
|
|
131
|
+
const unsupported = unsupportedLinkedinSearchStatuses(level, statuses);
|
|
132
|
+
if (unsupported.length === 0) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
const accepted = LINKEDIN_SEARCH_STATUSES[level].join(",");
|
|
136
|
+
return {
|
|
137
|
+
ok: false,
|
|
138
|
+
error: {
|
|
139
|
+
code: "INVALID_STATUS",
|
|
140
|
+
message: `LinkedIn does not accept status ${unsupported.join(", ")} for this listing.`,
|
|
141
|
+
fix: {
|
|
142
|
+
action: "retry_with_flag",
|
|
143
|
+
explanation: `Re-run with --statuses from ${accepted}, or --all-statuses to drop the filter.`
|
|
144
|
+
},
|
|
145
|
+
retryable: false
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function resolveStatusFilter(args, level) {
|
|
150
|
+
if (args["all-statuses"]) {
|
|
151
|
+
return void 0;
|
|
152
|
+
}
|
|
153
|
+
const explicit = args.statuses;
|
|
154
|
+
if (!explicit) {
|
|
155
|
+
return ["ACTIVE"];
|
|
156
|
+
}
|
|
157
|
+
const statuses = explicit.split(",").map((s) => s.trim().toUpperCase()).filter(Boolean);
|
|
158
|
+
const error = statusFilterError(level, statuses);
|
|
159
|
+
if (error) {
|
|
160
|
+
writeAdsJson(error);
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
return statuses;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export {
|
|
167
|
+
handleLinkedinError,
|
|
168
|
+
resolveAccountIdArg,
|
|
169
|
+
todayIso,
|
|
170
|
+
daysAgoIso,
|
|
171
|
+
csvOrJson,
|
|
172
|
+
statusesArgDescription,
|
|
173
|
+
resolveStatusFilter
|
|
174
|
+
};
|
|
175
|
+
//# sourceMappingURL=chunk-IREMSVKW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/linkedin/shared.ts"],"sourcesContent":["import { LINKEDIN_SEARCH_STATUSES, type LinkedinSearchLevel, unsupportedLinkedinSearchStatuses } from \"@baker/api\";\nimport { ApiError } from \"../../../client.ts\";\nimport { getEnv, MissingChatIdError } from \"../../../env.ts\";\nimport { handleConnectionError, needsConnectionFix } from \"../../../error-handler.ts\";\nimport { writeAdsJson } from \"../output.ts\";\nimport type { AdsErrorEnvelope } from \"../types.ts\";\n\nconst DAY_MS = 86_400_000;\n\n/**\n * Map LinkedIn-flavored API errors into the shared CLI error envelope. The\n * backend already maps LinkedIn `serviceErrorCode` → tagged HTTP status, so by\n * the time we get here we just need to attach an actionable `fix` and exit.\n */\nexport function handleLinkedinError(err: unknown): never {\n if (err instanceof ApiError) {\n if (needsConnectionFix(err.code, err.message)) {\n handleConnectionError(\"linkedin_ads\", err.message);\n }\n if (isNoAccountsSelectedError(err.code, err.message)) {\n handleConnectionError(\"linkedin_ads\", err.message);\n }\n const explanation = explainLinkedinError(err);\n const envelope: AdsErrorEnvelope = {\n ok: false,\n error: {\n code: err.code,\n message: err.message,\n fix: {\n action: explanation.action,\n explanation: explanation.message,\n correctedCommand: explanation.correctedCommand,\n },\n retryable: err.code === \"RATE_LIMITED\" || err.code === \"UNAVAILABLE\" || err.code === \"INTERNAL_ERROR\",\n },\n };\n writeAdsJson(envelope);\n process.exit(1);\n }\n writeAdsJson(unexpectedErrorEnvelope(err));\n process.exit(1);\n}\n\n/**\n * Any failure that is not an API answer. A missing chat id gets its own code\n * and a fix — no retry can supply it — and anything else reads as the network.\n */\nexport function unexpectedErrorEnvelope(err: unknown): {\n ok: false;\n error: Pick<AdsErrorEnvelope[\"error\"], \"code\" | \"message\"> &\n Partial<Pick<AdsErrorEnvelope[\"error\"], \"fix\" | \"retryable\">>;\n} {\n if (err instanceof MissingChatIdError) {\n return {\n ok: false,\n error: {\n code: err.code,\n message: err.message,\n fix: {\n action: \"reject\",\n explanation:\n \"LinkedIn changes are staged in a chat and this run has none. Don't retry: carry on with the rest of the job and tell the user this change couldn't be staged from here.\",\n },\n retryable: false,\n },\n };\n }\n const message = err instanceof Error ? err.message : \"Unexpected error\";\n return { ok: false, error: { code: \"NETWORK_ERROR\", message } };\n}\n\n/**\n * \"No ad accounts selected\" comes back as a 400 (→ VALIDATION_ERROR), which\n * reads like a bad flag but is really an unfinished connection: the user has to\n * pick their accounts again. Route it to the connect flow, not flag advice.\n */\nexport function isNoAccountsSelectedError(code: string, message: string): boolean {\n return code === \"VALIDATION_ERROR\" && /no linkedin ad accounts selected/i.test(message);\n}\n\nfunction explainLinkedinError(err: ApiError): {\n action: AdsErrorEnvelope[\"error\"][\"fix\"][\"action\"];\n message: string;\n correctedCommand?: string;\n} {\n const lower = err.message.toLowerCase();\n if (err.code === \"VALIDATION_ERROR\" && lower.includes(\"granularity\") && lower.includes(\"daily\")) {\n return {\n action: \"retry_with_flag\",\n message:\n \"LinkedIn rejects DAILY granularity when pivoting on demographic dims (job-title, company, etc.). Re-run with --granularity ALL or MONTHLY.\",\n correctedCommand: undefined,\n };\n }\n if (err.code === \"RATE_LIMITED\") {\n return {\n action: \"wait_and_retry\",\n message:\n \"Hit a LinkedIn throttle. The CLI already backs off automatically — if you see this you've exhausted the retry budget. Wait ~60s and retry.\",\n };\n }\n if (err.code === \"INTERNAL_ERROR\" && lower.includes(\"deprecat\")) {\n return {\n action: \"reject\",\n message:\n \"LinkedIn-Version header is deprecated. The backend constant LINKEDIN_API_VERSION needs to be bumped — file an issue or update the constant.\",\n };\n }\n return { action: \"reject\", message: err.message };\n}\n\nconst LI_ACCOUNT_ID_RE = /^(urn:li:sponsoredAccount:)?\\d+$/;\n\n/** Pull the default LinkedIn ad account ID from `--account-id` arg or env. */\nexport function resolveAccountIdArg(args: Record<string, unknown>): string {\n const fromArgs = (args[\"account-id\"] as string | undefined) ?? (args[\"account-urn\"] as string | undefined);\n const id = fromArgs || getEnv().BAKER_LINKEDIN_AD_ACCOUNT_ID;\n if (!id) {\n writeAdsJson({\n ok: false,\n error: {\n code: \"MISSING_ACCOUNT_ID\",\n message:\n \"Pass --account-id (numeric) or --account-urn (urn:li:sponsoredAccount:N), or set BAKER_LINKEDIN_AD_ACCOUNT_ID. Run `baker ads linkedin accounts` to find IDs.\",\n },\n });\n process.exit(1);\n }\n if (!LI_ACCOUNT_ID_RE.test(id)) {\n writeAdsJson({\n ok: false,\n error: {\n code: \"INVALID_ACCOUNT_ID\",\n message: `Invalid LinkedIn account ID \"${id}\". Expected numeric or urn:li:sponsoredAccount:N.`,\n },\n });\n process.exit(1);\n }\n return id.startsWith(\"urn:\") ? (id.split(\":\").pop() ?? id) : id;\n}\n\nexport function todayIso(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\nexport function daysAgoIso(days: number): string {\n return new Date(Date.now() - days * DAY_MS).toISOString().slice(0, 10);\n}\n\nexport function csvOrJson(args: Record<string, unknown>): string {\n return (args.output as string | undefined) ?? \"json\";\n}\n\n/** The `--statuses` help line, listing exactly what LinkedIn accepts at this level. */\nexport function statusesArgDescription(level: LinkedinSearchLevel): string {\n return `CSV of statuses (${LINKEDIN_SEARCH_STATUSES[level].join(\",\")})`;\n}\n\n/**\n * One status LinkedIn does not know fails the whole listing, so refuse it here\n * with the accepted values instead of forwarding LinkedIn's enum error.\n */\nexport function statusFilterError(level: LinkedinSearchLevel, statuses: readonly string[]): AdsErrorEnvelope | null {\n const unsupported = unsupportedLinkedinSearchStatuses(level, statuses);\n if (unsupported.length === 0) {\n return null;\n }\n const accepted = LINKEDIN_SEARCH_STATUSES[level].join(\",\");\n return {\n ok: false,\n error: {\n code: \"INVALID_STATUS\",\n message: `LinkedIn does not accept status ${unsupported.join(\", \")} for this listing.`,\n fix: {\n action: \"retry_with_flag\",\n explanation: `Re-run with --statuses from ${accepted}, or --all-statuses to drop the filter.`,\n },\n retryable: false,\n },\n };\n}\n\n/**\n * Default to ACTIVE-only on listings — almost always what an AI agent or human\n * glance wants. `--all-statuses` widens; `--statuses ACTIVE,PAUSED` overrides.\n */\nexport function resolveStatusFilter(args: Record<string, unknown>, level: LinkedinSearchLevel): string[] | undefined {\n if (args[\"all-statuses\"]) {\n return undefined;\n }\n const explicit = args.statuses as string | undefined;\n if (!explicit) {\n return [\"ACTIVE\"];\n }\n const statuses = explicit\n .split(\",\")\n .map((s) => s.trim().toUpperCase())\n .filter(Boolean);\n const error = statusFilterError(level, statuses);\n if (error) {\n writeAdsJson(error);\n process.exit(1);\n }\n return statuses;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// src/commands/images/brandVerification.ts
|
|
2
|
+
function brandToken(domain) {
|
|
3
|
+
const bare = domain.trim().toLowerCase().replace(/^[a-z]+:\/\//, "").replace(/^www\./, "").split("/")[0];
|
|
4
|
+
const label = (bare ?? "").split(".")[0] ?? "";
|
|
5
|
+
return label;
|
|
6
|
+
}
|
|
7
|
+
function readBackHints(domain, ingested, token, recoverRoute) {
|
|
8
|
+
if (ingested.length === 0) {
|
|
9
|
+
return [
|
|
10
|
+
`Nothing was catalogued, so no described row exists to check the mark against. Re-run with \`--auto-ingest 1\` and read \`textInImage\` / \`subject\` back with \`baker images get <imageId>\`, or open the URL and confirm by eye that it is ${token || domain}'s mark and not another company's.`
|
|
11
|
+
];
|
|
12
|
+
}
|
|
13
|
+
const readBack = ingested.map((item) => `baker images get ${item.imageId}`).join(" && ");
|
|
14
|
+
return [
|
|
15
|
+
`Read the mark itself: run \`${readBack}\` and confirm \`textInImage\` / \`subject\` names ${token || domain}. If it names a different company, this is the wrong mark: discard it and use ${recoverRoute} instead.`,
|
|
16
|
+
"The catalogued row is described asynchronously, so `textInImage` may be empty on the first read \u2014 re-read once the row is `ready` rather than treating an empty field as a match."
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
function brandVerificationHints({
|
|
20
|
+
domain,
|
|
21
|
+
ingested,
|
|
22
|
+
hitCount = 0,
|
|
23
|
+
recover,
|
|
24
|
+
brandMatch
|
|
25
|
+
}) {
|
|
26
|
+
if (ingested.length === 0 && hitCount === 0) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
const token = brandToken(domain);
|
|
30
|
+
const recoverRoute = recover ?? `\`baker images extract https://${domain}\` to pull the mark off the brand's own site`;
|
|
31
|
+
const readBack = readBackHints(domain, ingested, token, recoverRoute);
|
|
32
|
+
if (brandMatch?.verdict === "mismatch") {
|
|
33
|
+
const owner = brandMatch.name ?? "a different company";
|
|
34
|
+
const ownerDomain = brandMatch.domain ? ` (${brandMatch.domain})` : "";
|
|
35
|
+
return [
|
|
36
|
+
`WRONG BRAND \u2014 Brandfetch holds no record for "${domain}". The closest one it has is ${owner}${ownerDomain}, so the mark returned here is very likely ${owner}'s, not ${token || domain}'s. Do not place it. Use ${recoverRoute}, and if that fails, tell the user you could not find their logo rather than shipping this one.`,
|
|
37
|
+
...readBack
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
if (brandMatch?.verdict === "confirmed") {
|
|
41
|
+
const owner = brandMatch.name ?? (token || domain);
|
|
42
|
+
return [
|
|
43
|
+
`Brandfetch confirms "${domain}" is ${owner}, which verifies the record \u2014 not the artwork. Its ${owner} record is what the returned files come from, and a provider record can hold the wrong company's image: this is exactly how a domain confirmed as "Zernio" served ClickUp's logo into a client's page.`,
|
|
44
|
+
...readBack
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
if (brandMatch?.verdict === "unverified") {
|
|
48
|
+
return [
|
|
49
|
+
`This mark could not be checked \u2014 Brandfetch returned no record for "${domain}", so nothing confirms whose logo these files are. Treat it as unverified rather than as correct.`,
|
|
50
|
+
...readBack
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
return [
|
|
54
|
+
`VERIFY BRAND before placing any of these. This matched on the string "${domain}", not on what the image shows \u2014 a 200 from the provider's CDN only means bytes were served, so a wrong brand's mark comes back looking exactly like a right one.`,
|
|
55
|
+
...readBack
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export {
|
|
60
|
+
brandVerificationHints
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=chunk-IVIJJXXT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/images/brandVerification.ts"],"sourcesContent":["/**\n * Brandfetch matches on the domain string, not on what the mark depicts.\n *\n * Resolution is a constructed CDN URL probed with a GET whose bytes are thrown\n * away, so a 200 means \"the CDN served something\", never \"this is that brand's\n * logo\". In a real run `freepik.com` returned the Magnific wordmark and\n * `zernio.com` returned ClickUp — both shipped into a client's page and both\n * only noticed twenty minutes later, by eye.\n *\n * The response now carries `brandMatch`, Brandfetch's own answer to \"whose brand\n * is this domain\", so these hints no longer have to fire blind:\n *\n * - `mismatch` — Brandfetch has records and none is this brand. Loudest\n * warning available, naming the company whose mark this is.\n * - `unverified` — the check did not run. Say so; do not imply either verdict.\n * - `confirmed` — the metadata agrees. Says nothing about the artwork, and\n * the read-back check stays exactly where it was, because\n * `zernio.com` is `confirmed` and still serves ClickUp.\n *\n * The hits are never withheld. A warned-about wrong logo is recoverable; a\n * client whose real mark refuses to load is not.\n */\n\ninterface IngestedRef {\n imageId: string;\n}\n\n/** Brandfetch's verdict, as carried on the `logo` response. Absent for `icon`,\n * which has no brand record to consult, and for an older backend. */\ninterface BrandMatchRef {\n verdict: \"confirmed\" | \"mismatch\" | \"unverified\";\n requestedDomain?: string;\n name?: string;\n domain?: string;\n}\n\ninterface BrandVerificationInput {\n /** What was asked for — a domain for `logo`, an icon slug for `icon`. */\n domain: string;\n ingested: IngestedRef[];\n /** Hits returned by the provider. With `--no-auto-ingest` there are hits but\n * no library row, so the read-back check has nothing to read. */\n hitCount?: number;\n /** What to run when the mark turns out to be the wrong brand. Callers whose\n * subject is not a hostname must pass their own route — `https://<icon-slug>`\n * is not a page. */\n recover?: string;\n brandMatch?: BrandMatchRef;\n}\n\n/**\n * The brand's own word, as it would appear burned into its wordmark:\n * `www.zernio.com` → `zernio`, `linear.app` → `linear`.\n */\nexport function brandToken(domain: string): string {\n const bare = domain\n .trim()\n .toLowerCase()\n .replace(/^[a-z]+:\\/\\//, \"\")\n .replace(/^www\\./, \"\")\n .split(\"/\")[0];\n const label = (bare ?? \"\").split(\".\")[0] ?? \"\";\n return label;\n}\n\n/** How to read the mark back, or how to get into a position to. */\nfunction readBackHints(domain: string, ingested: IngestedRef[], token: string, recoverRoute: string): string[] {\n if (ingested.length === 0) {\n return [\n `Nothing was catalogued, so no described row exists to check the mark against. Re-run with \\`--auto-ingest 1\\` and read \\`textInImage\\` / \\`subject\\` back with \\`baker images get <imageId>\\`, or open the URL and confirm by eye that it is ${token || domain}'s mark and not another company's.`,\n ];\n }\n const readBack = ingested.map((item) => `baker images get ${item.imageId}`).join(\" && \");\n return [\n `Read the mark itself: run \\`${readBack}\\` and confirm \\`textInImage\\` / \\`subject\\` names ${token || domain}. If it names a different company, this is the wrong mark: discard it and use ${recoverRoute} instead.`,\n \"The catalogued row is described asynchronously, so `textInImage` may be empty on the first read — re-read once the row is `ready` rather than treating an empty field as a match.\",\n ];\n}\n\nexport function brandVerificationHints({\n domain,\n ingested,\n hitCount = 0,\n recover,\n brandMatch,\n}: BrandVerificationInput): string[] {\n if (ingested.length === 0 && hitCount === 0) {\n return [];\n }\n\n const token = brandToken(domain);\n const recoverRoute =\n recover ?? `\\`baker images extract https://${domain}\\` to pull the mark off the brand's own site`;\n const readBack = readBackHints(domain, ingested, token, recoverRoute);\n\n if (brandMatch?.verdict === \"mismatch\") {\n const owner = brandMatch.name ?? \"a different company\";\n const ownerDomain = brandMatch.domain ? ` (${brandMatch.domain})` : \"\";\n return [\n `WRONG BRAND — Brandfetch holds no record for \"${domain}\". The closest one it has is ${owner}${ownerDomain}, so the mark returned here is very likely ${owner}'s, not ${token || domain}'s. Do not place it. Use ${recoverRoute}, and if that fails, tell the user you could not find their logo rather than shipping this one.`,\n ...readBack,\n ];\n }\n\n if (brandMatch?.verdict === \"confirmed\") {\n const owner = brandMatch.name ?? (token || domain);\n return [\n `Brandfetch confirms \"${domain}\" is ${owner}, which verifies the record — not the artwork. Its ${owner} record is what the returned files come from, and a provider record can hold the wrong company's image: this is exactly how a domain confirmed as \"Zernio\" served ClickUp's logo into a client's page.`,\n ...readBack,\n ];\n }\n\n if (brandMatch?.verdict === \"unverified\") {\n return [\n `This mark could not be checked — Brandfetch returned no record for \"${domain}\", so nothing confirms whose logo these files are. Treat it as unverified rather than as correct.`,\n ...readBack,\n ];\n }\n\n // No verdict at all (an `icon` lookup, or a backend that predates the field):\n // fall back to warning unconditionally, since a wrong brand and a right one\n // are byte-identical in shape.\n return [\n `VERIFY BRAND before placing any of these. This matched on the string \"${domain}\", not on what the image shows — a 200 from the provider's CDN only means bytes were served, so a wrong brand's mark comes back looking exactly like a right one.`,\n ...readBack,\n ];\n}\n"],"mappings":";AAsDO,SAAS,WAAW,QAAwB;AACjD,QAAM,OAAO,OACV,KAAK,EACL,YAAY,EACZ,QAAQ,gBAAgB,EAAE,EAC1B,QAAQ,UAAU,EAAE,EACpB,MAAM,GAAG,EAAE,CAAC;AACf,QAAM,SAAS,QAAQ,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK;AAC5C,SAAO;AACT;AAGA,SAAS,cAAc,QAAgB,UAAyB,OAAe,cAAgC;AAC7G,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,MACL,gPAAgP,SAAS,MAAM;AAAA,IACjQ;AAAA,EACF;AACA,QAAM,WAAW,SAAS,IAAI,CAAC,SAAS,oBAAoB,KAAK,OAAO,EAAE,EAAE,KAAK,MAAM;AACvF,SAAO;AAAA,IACL,+BAA+B,QAAQ,sDAAsD,SAAS,MAAM,iFAAiF,YAAY;AAAA,IACzM;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAqC;AACnC,MAAI,SAAS,WAAW,KAAK,aAAa,GAAG;AAC3C,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQ,WAAW,MAAM;AAC/B,QAAM,eACJ,WAAW,kCAAkC,MAAM;AACrD,QAAM,WAAW,cAAc,QAAQ,UAAU,OAAO,YAAY;AAEpE,MAAI,YAAY,YAAY,YAAY;AACtC,UAAM,QAAQ,WAAW,QAAQ;AACjC,UAAM,cAAc,WAAW,SAAS,KAAK,WAAW,MAAM,MAAM;AACpE,WAAO;AAAA,MACL,sDAAiD,MAAM,gCAAgC,KAAK,GAAG,WAAW,8CAA8C,KAAK,WAAW,SAAS,MAAM,4BAA4B,YAAY;AAAA,MAC/N,GAAG;AAAA,IACL;AAAA,EACF;AAEA,MAAI,YAAY,YAAY,aAAa;AACvC,UAAM,QAAQ,WAAW,SAAS,SAAS;AAC3C,WAAO;AAAA,MACL,wBAAwB,MAAM,QAAQ,KAAK,2DAAsD,KAAK;AAAA,MACtG,GAAG;AAAA,IACL;AAAA,EACF;AAEA,MAAI,YAAY,YAAY,cAAc;AACxC,WAAO;AAAA,MACL,4EAAuE,MAAM;AAAA,MAC7E,GAAG;AAAA,IACL;AAAA,EACF;AAKA,SAAO;AAAA,IACL,yEAAyE,MAAM;AAAA,IAC/E,GAAG;AAAA,EACL;AACF;","names":[]}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import {
|
|
2
|
+
analyticsErrorEnvelope
|
|
3
|
+
} from "./chunk-PZ4OM2LK.js";
|
|
4
|
+
import {
|
|
5
|
+
PEOPLE_SEARCH_MAX_TERMS,
|
|
6
|
+
parsePeopleQuery,
|
|
7
|
+
peopleLookupRequestSchema
|
|
8
|
+
} from "./chunk-QMLGJ5OW.js";
|
|
9
|
+
import {
|
|
10
|
+
writeJsonEnvelope
|
|
11
|
+
} from "./chunk-EIGXX6KI.js";
|
|
12
|
+
import {
|
|
13
|
+
apiPost
|
|
14
|
+
} from "./chunk-CUL3VB4L.js";
|
|
15
|
+
import {
|
|
16
|
+
registerSchema
|
|
17
|
+
} from "./chunk-MYTDK3AL.js";
|
|
18
|
+
|
|
19
|
+
// src/commands/analytics/lookup.ts
|
|
20
|
+
import { readFileSync } from "fs";
|
|
21
|
+
import { defineCommand } from "citty";
|
|
22
|
+
function peopleArgs(args2) {
|
|
23
|
+
const parts = peopleParts(args2);
|
|
24
|
+
if (parts.length === 0) return {};
|
|
25
|
+
const people = parsePeopleQuery(parts).terms.map((term) => term.input);
|
|
26
|
+
return people.length === 0 ? {} : { people };
|
|
27
|
+
}
|
|
28
|
+
function peopleParts(args2) {
|
|
29
|
+
return [...args2.person ? [String(args2.person)] : [], ...args2["people-file"] ? [readPeopleFile(args2)] : []];
|
|
30
|
+
}
|
|
31
|
+
function readPeopleFile(args2) {
|
|
32
|
+
try {
|
|
33
|
+
return readFileSync(String(args2["people-file"]), "utf8");
|
|
34
|
+
} catch {
|
|
35
|
+
return "";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function unreadablePeopleFile(args2) {
|
|
39
|
+
if (!args2["people-file"]) return void 0;
|
|
40
|
+
const path = String(args2["people-file"]);
|
|
41
|
+
try {
|
|
42
|
+
readFileSync(path, "utf8");
|
|
43
|
+
return void 0;
|
|
44
|
+
} catch {
|
|
45
|
+
return `Couldn't read --people-file ${path}. Check the path, or pass the people inline with --person.`;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function peopleLimitError(args2) {
|
|
49
|
+
const unreadable = unreadablePeopleFile(args2);
|
|
50
|
+
if (unreadable !== void 0) return unreadable;
|
|
51
|
+
const { terms, dropped } = parsePeopleQuery(peopleParts(args2));
|
|
52
|
+
if (dropped === 0) return void 0;
|
|
53
|
+
return `${terms.length + dropped} people named; one search takes up to ${PEOPLE_SEARCH_MAX_TERMS}. Split the list and run each part.`;
|
|
54
|
+
}
|
|
55
|
+
function compactRow(row) {
|
|
56
|
+
const clicks = [...row.googleClick ? ["google"] : [], ...row.metaClick ? ["meta"] : []];
|
|
57
|
+
const candidates = {
|
|
58
|
+
input: row.input,
|
|
59
|
+
readAs: row.kind,
|
|
60
|
+
found: row.found,
|
|
61
|
+
problem: row.problem,
|
|
62
|
+
contacts: row.contacts,
|
|
63
|
+
events: row.events,
|
|
64
|
+
firstSeen: row.firstSeen,
|
|
65
|
+
lastSeen: row.lastSeen,
|
|
66
|
+
pageViews: row.pageViews,
|
|
67
|
+
landings: row.landings,
|
|
68
|
+
visits: row.visits,
|
|
69
|
+
formSubmits: row.formSubmits,
|
|
70
|
+
firstSource: row.firstSource,
|
|
71
|
+
systemEvents: row.systemEvents,
|
|
72
|
+
pageEvents: row.pageEvents,
|
|
73
|
+
uploads: row.uploads,
|
|
74
|
+
uploadedTo: row.uploadedTo,
|
|
75
|
+
clicks,
|
|
76
|
+
knownBy: row.knownBy
|
|
77
|
+
};
|
|
78
|
+
return Object.fromEntries(
|
|
79
|
+
Object.entries(candidates).filter(
|
|
80
|
+
([key, value]) => key === "found" || !(value === 0 || value === "" || Array.isArray(value) && value.length === 0)
|
|
81
|
+
)
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
function lookupHints(data) {
|
|
85
|
+
const hints = [];
|
|
86
|
+
if (data.dropped > 0) {
|
|
87
|
+
hints.push(
|
|
88
|
+
`${data.dropped} lines past the limit of ${PEOPLE_SEARCH_MAX_TERMS} were not looked up. Run the rest separately.`
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
const unseen = data.people.filter((row) => !row.found && row.problem === "");
|
|
92
|
+
if (unseen.length > 0) {
|
|
93
|
+
hints.push(
|
|
94
|
+
`Not seen by Baker: ${unseen.map((row) => row.input).join(", ")}. Baker knows a person by what its pages, Forms and connected systems recorded \u2014 a lead that came in through a form or site Baker does not measure, or a source not connected, is not here.`
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
for (const row of data.people.filter((person) => person.problem !== "")) {
|
|
98
|
+
hints.push(`${row.input}: ${row.problem}`);
|
|
99
|
+
}
|
|
100
|
+
const found = data.people.filter((row) => row.found);
|
|
101
|
+
const neverVisited = found.filter((row) => row.pageViews === 0);
|
|
102
|
+
if (neverVisited.length > 0) {
|
|
103
|
+
hints.push(
|
|
104
|
+
`${neverVisited.length} of ${found.length} found never visited a page Baker publishes: Baker knows them only from what their systems reported, so no landing can be credited with them.`
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
if (found.length > 0) {
|
|
108
|
+
hints.push(
|
|
109
|
+
`\`baker analytics feed --person '${found[0]?.input}' --days 90\` lists everything one of them did, in order \u2014 add more, comma-separated, to follow several.`
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
return hints;
|
|
113
|
+
}
|
|
114
|
+
function lookupReport(data, full = false) {
|
|
115
|
+
const found = data.people.filter((row) => row.found);
|
|
116
|
+
return {
|
|
117
|
+
summary: {
|
|
118
|
+
searched: data.people.length,
|
|
119
|
+
found: found.length,
|
|
120
|
+
notFound: data.people.length - found.length,
|
|
121
|
+
visitedABakerPage: found.filter((row) => row.pageViews > 0).length
|
|
122
|
+
},
|
|
123
|
+
people: full ? data.people : data.people.map(compactRow),
|
|
124
|
+
hints: lookupHints(data)
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
var NO_PEOPLE = "Name at least one person: --person 'ana@empresa.com, deal:40001234567' or --people-file leads.txt.";
|
|
128
|
+
var args = {
|
|
129
|
+
person: {
|
|
130
|
+
type: "string",
|
|
131
|
+
description: "The people, comma-separated: an email, a phone (+34\u2026), a HubSpot contact id, deal:<HubSpot deal id>, a gclid/fbclid, a browser id. Prefix to be exact: email:, phone:, hubspot:, deal:, gclid:, fbclid:, browser:",
|
|
132
|
+
required: false
|
|
133
|
+
},
|
|
134
|
+
"people-file": {
|
|
135
|
+
type: "string",
|
|
136
|
+
description: "A file with one person per line \u2014 a column pasted from a CRM export",
|
|
137
|
+
required: false
|
|
138
|
+
},
|
|
139
|
+
full: {
|
|
140
|
+
type: "boolean",
|
|
141
|
+
description: "Every field of every line, zeros included",
|
|
142
|
+
required: false
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
registerSchema({
|
|
146
|
+
command: "analytics.lookup",
|
|
147
|
+
description: "What Baker saw of each person in a list, by email, phone, CRM id, deal or click id",
|
|
148
|
+
args
|
|
149
|
+
});
|
|
150
|
+
var lookupCommand = defineCommand({
|
|
151
|
+
meta: {
|
|
152
|
+
name: "lookup",
|
|
153
|
+
description: `What Baker saw of each person in a list \u2014 all time, one line each \u2014 by whatever the client holds about them. The reconciliation question: "HubSpot says 26 leads yesterday, which of them does Baker have, and where did they come from".
|
|
154
|
+
|
|
155
|
+
Start here:
|
|
156
|
+
baker analytics lookup --person 'ana@empresa.com, +34600111222, 90001234567'
|
|
157
|
+
baker analytics lookup --person 'deal:40001234567, deal:40001234568' \u2014 HubSpot deal ids, looked up through the deal's contacts
|
|
158
|
+
baker analytics lookup --people-file leads.txt \u2014 one per line, up to ${PEOPLE_SEARCH_MAX_TERMS}
|
|
159
|
+
|
|
160
|
+
Each line says whether Baker has them, when it first and last saw them, the pages and Forms they touched, what their systems reported (systemEvents: CRM stages, orders), what Baker uploaded for them to ad platforms, which ad click they carried, and every kind of key they are linked by. A bare number is read as a HubSpot contact id or a phone; prefix it to be exact. Emails and phones are hashed by Baker \u2014 say them to the client as they gave them, never as a hash. Follow one with \`baker analytics feed --person <same value>\`.`
|
|
161
|
+
},
|
|
162
|
+
args,
|
|
163
|
+
run: async ({ args: raw }) => {
|
|
164
|
+
const { people } = peopleArgs(raw);
|
|
165
|
+
const parsed = peopleLookupRequestSchema.safeParse({ people: people ?? [] });
|
|
166
|
+
const invalid = peopleLimitError(raw) ?? (parsed.success ? void 0 : NO_PEOPLE);
|
|
167
|
+
if (invalid !== void 0 || !parsed.success) {
|
|
168
|
+
writeJsonEnvelope({ ok: false, error: { code: "VALIDATION_ERROR", message: invalid ?? NO_PEOPLE } });
|
|
169
|
+
process.exit(1);
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
const response = await apiPost("/api/analytics/people", parsed.data);
|
|
173
|
+
const { hints, ...data } = lookupReport(response.data, raw.full === true);
|
|
174
|
+
writeJsonEnvelope({ ok: true, data, ...hints.length > 0 ? { hints } : {} });
|
|
175
|
+
} catch (error) {
|
|
176
|
+
writeJsonEnvelope({ ok: false, error: analyticsErrorEnvelope(error) });
|
|
177
|
+
process.exit(1);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
export {
|
|
183
|
+
peopleArgs,
|
|
184
|
+
peopleLimitError,
|
|
185
|
+
lookupReport,
|
|
186
|
+
lookupCommand
|
|
187
|
+
};
|
|
188
|
+
//# sourceMappingURL=chunk-JD3W3ON7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/analytics/lookup.ts"],"sourcesContent":["/**\n * `baker analytics lookup` — what Baker saw of each person in a list.\n *\n * The question a CRM export puts to Baker: here are yesterday's leads, which\n * of them do you have and what did you see them do. One line per person, all\n * time, by whatever the reader holds — an email, a phone, a HubSpot contact or\n * deal id, a click id. The server hashes contact details and asks HubSpot whose\n * each deal is; nothing here does either.\n *\n * `baker analytics feed --person` is the same list as rows.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport {\n PEOPLE_SEARCH_MAX_TERMS,\n type PeopleLookupData,\n type PeopleLookupRow,\n parsePeopleQuery,\n peopleLookupRequestSchema,\n} from \"@baker/api/analytics\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { writeJsonEnvelope } from \"../ads/output.ts\";\nimport { analyticsErrorEnvelope } from \"./errorEnvelope.ts\";\n\n/**\n * The people `--person` and `--people-file` name, one per line of the search.\n *\n * Split here with the server's own reading of a list, so the fifty-line limit\n * is the same one on both sides and a long pasted list travels as lines, not\n * as one oversized string.\n */\nexport function peopleArgs(args: Record<string, unknown>): { people?: string[] } {\n const parts = peopleParts(args);\n if (parts.length === 0) return {};\n const people = parsePeopleQuery(parts).terms.map((term) => term.input);\n return people.length === 0 ? {} : { people };\n}\n\nfunction peopleParts(args: Record<string, unknown>): string[] {\n return [...(args.person ? [String(args.person)] : []), ...(args[\"people-file\"] ? [readPeopleFile(args)] : [])];\n}\n\n/** `--people-file`, or `\"\"` when it cannot be read — {@link peopleLimitError} is what reports that. */\nfunction readPeopleFile(args: Record<string, unknown>): string {\n try {\n return readFileSync(String(args[\"people-file\"]), \"utf8\");\n } catch {\n return \"\";\n }\n}\n\nfunction unreadablePeopleFile(args: Record<string, unknown>): string | undefined {\n if (!args[\"people-file\"]) return undefined;\n const path = String(args[\"people-file\"]);\n try {\n readFileSync(path, \"utf8\");\n return undefined;\n } catch {\n return `Couldn't read --people-file ${path}. Check the path, or pass the people inline with --person.`;\n }\n}\n\n/**\n * Why a list is refused, when it is longer than one search holds. Refused\n * rather than cut: fifty lines answered out of sixty read as the whole list,\n * and \"not seen by Baker\" is then silently wrong about the other ten.\n */\nexport function peopleLimitError(args: Record<string, unknown>): string | undefined {\n const unreadable = unreadablePeopleFile(args);\n if (unreadable !== undefined) return unreadable;\n const { terms, dropped } = parsePeopleQuery(peopleParts(args));\n if (dropped === 0) return undefined;\n return `${terms.length + dropped} people named; one search takes up to ${PEOPLE_SEARCH_MAX_TERMS}. Split the list and run each part.`;\n}\n\n/** One person as an agent reads them: what was seen, with every zero and empty list left out. */\nfunction compactRow(row: PeopleLookupRow): Record<string, unknown> {\n const clicks = [...(row.googleClick ? [\"google\"] : []), ...(row.metaClick ? [\"meta\"] : [])];\n const candidates: Record<string, unknown> = {\n input: row.input,\n readAs: row.kind,\n found: row.found,\n problem: row.problem,\n contacts: row.contacts,\n events: row.events,\n firstSeen: row.firstSeen,\n lastSeen: row.lastSeen,\n pageViews: row.pageViews,\n landings: row.landings,\n visits: row.visits,\n formSubmits: row.formSubmits,\n firstSource: row.firstSource,\n systemEvents: row.systemEvents,\n pageEvents: row.pageEvents,\n uploads: row.uploads,\n uploadedTo: row.uploadedTo,\n clicks,\n knownBy: row.knownBy,\n };\n return Object.fromEntries(\n Object.entries(candidates).filter(\n ([key, value]) =>\n key === \"found\" || !(value === 0 || value === \"\" || (Array.isArray(value) && value.length === 0)),\n ),\n );\n}\n\nfunction lookupHints(data: PeopleLookupData): string[] {\n const hints: string[] = [];\n if (data.dropped > 0) {\n hints.push(\n `${data.dropped} lines past the limit of ${PEOPLE_SEARCH_MAX_TERMS} were not looked up. Run the rest separately.`,\n );\n }\n const unseen = data.people.filter((row) => !row.found && row.problem === \"\");\n if (unseen.length > 0) {\n hints.push(\n `Not seen by Baker: ${unseen.map((row) => row.input).join(\", \")}. Baker knows a person by what its pages, Forms and connected systems recorded — a lead that came in through a form or site Baker does not measure, or a source not connected, is not here.`,\n );\n }\n for (const row of data.people.filter((person) => person.problem !== \"\")) {\n hints.push(`${row.input}: ${row.problem}`);\n }\n const found = data.people.filter((row) => row.found);\n const neverVisited = found.filter((row) => row.pageViews === 0);\n if (neverVisited.length > 0) {\n hints.push(\n `${neverVisited.length} of ${found.length} found never visited a page Baker publishes: Baker knows them only from what their systems reported, so no landing can be credited with them.`,\n );\n }\n if (found.length > 0) {\n hints.push(\n `\\`baker analytics feed --person '${found[0]?.input}' --days 90\\` lists everything one of them did, in order — add more, comma-separated, to follow several.`,\n );\n }\n return hints;\n}\n\n/** The envelope's data and hints. Pure, so what an agent reads is tested without a network. */\nexport function lookupReport(data: PeopleLookupData, full = false) {\n const found = data.people.filter((row) => row.found);\n return {\n summary: {\n searched: data.people.length,\n found: found.length,\n notFound: data.people.length - found.length,\n visitedABakerPage: found.filter((row) => row.pageViews > 0).length,\n },\n people: full ? data.people : data.people.map(compactRow),\n hints: lookupHints(data),\n };\n}\n\nconst NO_PEOPLE = \"Name at least one person: --person 'ana@empresa.com, deal:40001234567' or --people-file leads.txt.\";\n\nconst args = {\n person: {\n type: \"string\",\n description:\n \"The people, comma-separated: an email, a phone (+34…), a HubSpot contact id, deal:<HubSpot deal id>, a gclid/fbclid, a browser id. Prefix to be exact: email:, phone:, hubspot:, deal:, gclid:, fbclid:, browser:\",\n required: false,\n },\n \"people-file\": {\n type: \"string\",\n description: \"A file with one person per line — a column pasted from a CRM export\",\n required: false,\n },\n full: {\n type: \"boolean\",\n description: \"Every field of every line, zeros included\",\n required: false,\n },\n} as const;\n\nregisterSchema({\n command: \"analytics.lookup\",\n description: \"What Baker saw of each person in a list, by email, phone, CRM id, deal or click id\",\n args,\n});\n\nexport const lookupCommand = defineCommand({\n meta: {\n name: \"lookup\",\n description: `What Baker saw of each person in a list — all time, one line each — by whatever the client holds about them. The reconciliation question: \"HubSpot says 26 leads yesterday, which of them does Baker have, and where did they come from\".\n\nStart here:\n baker analytics lookup --person 'ana@empresa.com, +34600111222, 90001234567'\n baker analytics lookup --person 'deal:40001234567, deal:40001234568' — HubSpot deal ids, looked up through the deal's contacts\n baker analytics lookup --people-file leads.txt — one per line, up to ${PEOPLE_SEARCH_MAX_TERMS}\n\nEach line says whether Baker has them, when it first and last saw them, the pages and Forms they touched, what their systems reported (systemEvents: CRM stages, orders), what Baker uploaded for them to ad platforms, which ad click they carried, and every kind of key they are linked by. A bare number is read as a HubSpot contact id or a phone; prefix it to be exact. Emails and phones are hashed by Baker — say them to the client as they gave them, never as a hash. Follow one with \\`baker analytics feed --person <same value>\\`.`,\n },\n args,\n run: async ({ args: raw }) => {\n const { people } = peopleArgs(raw as Record<string, unknown>);\n const parsed = peopleLookupRequestSchema.safeParse({ people: people ?? [] });\n const invalid = peopleLimitError(raw as Record<string, unknown>) ?? (parsed.success ? undefined : NO_PEOPLE);\n if (invalid !== undefined || !parsed.success) {\n writeJsonEnvelope({ ok: false, error: { code: \"VALIDATION_ERROR\", message: invalid ?? NO_PEOPLE } });\n process.exit(1);\n }\n try {\n const response = await apiPost<{ ok: true; data: PeopleLookupData }>(\"/api/analytics/people\", parsed.data);\n const { hints, ...data } = lookupReport(response.data, raw.full === true);\n writeJsonEnvelope({ ok: true, data, ...(hints.length > 0 ? { hints } : {}) });\n } catch (error) {\n writeJsonEnvelope({ ok: false, error: analyticsErrorEnvelope(error) });\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["args"]}
|