@koda-sl/baker-cli 0.386.0 → 0.387.0-dev.3bafd569e
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 +1090 -211
- package/canvas/tiktok-captions-composition/index.html +5 -6
- package/canvas/tiktok-captions-composition/meta.json +5 -0
- package/dist/account-CLOKMTTC.js +49 -0
- package/dist/account-CLOKMTTC.js.map +1 -0
- package/dist/account-V5Y2QHAK.js +79 -0
- package/dist/account-V5Y2QHAK.js.map +1 -0
- package/dist/account-XFK6VX2R.js +80 -0
- package/dist/account-XFK6VX2R.js.map +1 -0
- package/dist/account-reads-S5VXX2QU.js +218 -0
- package/dist/account-reads-S5VXX2QU.js.map +1 -0
- package/dist/account-writes-Y7EQXDXF.js +66 -0
- package/dist/account-writes-Y7EQXDXF.js.map +1 -0
- package/dist/accounts-7YD457YN.js +114 -0
- package/dist/accounts-7YD457YN.js.map +1 -0
- package/dist/accounts-BJ3X5JQT.js +115 -0
- package/dist/accounts-BJ3X5JQT.js.map +1 -0
- package/dist/accounts-LOJ4WLIX.js +77 -0
- package/dist/accounts-LOJ4WLIX.js.map +1 -0
- package/dist/accounts-RYBDLQ6H.js +75 -0
- package/dist/accounts-RYBDLQ6H.js.map +1 -0
- package/dist/accounts-UO4XBWM2.js +611 -0
- package/dist/accounts-UO4XBWM2.js.map +1 -0
- package/dist/actions-3AW3R63U.js +55 -0
- package/dist/actions-3AW3R63U.js.map +1 -0
- package/dist/active-entities-R6GZIO6Z.js +103 -0
- package/dist/active-entities-R6GZIO6Z.js.map +1 -0
- package/dist/activities-ESBF3GFS.js +74 -0
- package/dist/activities-ESBF3GFS.js.map +1 -0
- package/dist/ad-group-writes-I225OYDZ.js +170 -0
- package/dist/ad-group-writes-I225OYDZ.js.map +1 -0
- package/dist/ad-groups-O35MWNF6.js +68 -0
- package/dist/ad-groups-O35MWNF6.js.map +1 -0
- package/dist/ad-writes-SS5YZO5W.js +174 -0
- package/dist/ad-writes-SS5YZO5W.js.map +1 -0
- package/dist/add-43DUOVNR.js +104 -0
- package/dist/add-43DUOVNR.js.map +1 -0
- package/dist/add-IE5WDELB.js +302 -0
- package/dist/add-IE5WDELB.js.map +1 -0
- package/dist/add-QZHAWUBA.js +97 -0
- package/dist/add-QZHAWUBA.js.map +1 -0
- package/dist/add-TGQIVVXH.js +105 -0
- package/dist/add-TGQIVVXH.js.map +1 -0
- package/dist/add-accounts-6QYPOPR2.js +91 -0
- package/dist/add-accounts-6QYPOPR2.js.map +1 -0
- package/dist/ads-AUSRB4GU.js +128 -0
- package/dist/ads-AUSRB4GU.js.map +1 -0
- package/dist/ads-COYOTEKE.js +77 -0
- package/dist/ads-COYOTEKE.js.map +1 -0
- package/dist/ads-DZ4N5INZ.js +40 -0
- package/dist/ads-DZ4N5INZ.js.map +1 -0
- package/dist/ads-XZCMSPM5.js +113 -0
- package/dist/ads-XZCMSPM5.js.map +1 -0
- package/dist/adsets-AKR75THA.js +176 -0
- package/dist/adsets-AKR75THA.js.map +1 -0
- package/dist/advertisers-52FMMBTQ.js +120 -0
- package/dist/advertisers-52FMMBTQ.js.map +1 -0
- package/dist/advertisers-BCGKUMEH.js +125 -0
- package/dist/advertisers-BCGKUMEH.js.map +1 -0
- package/dist/analytics-JPDBKETM.js +1980 -0
- package/dist/analytics-JPDBKETM.js.map +1 -0
- package/dist/analytics-YVQ6H4BG.js +433 -0
- package/dist/analytics-YVQ6H4BG.js.map +1 -0
- package/dist/animate-JXIT77Y5.js +480 -0
- package/dist/animate-JXIT77Y5.js.map +1 -0
- package/dist/assign-66NTWTR2.js +77 -0
- package/dist/assign-66NTWTR2.js.map +1 -0
- package/dist/audience-size-LVQJWQAS.js +94 -0
- package/dist/audience-size-LVQJWQAS.js.map +1 -0
- package/dist/audiences-DC3IOG34.js +85 -0
- package/dist/audiences-DC3IOG34.js.map +1 -0
- package/dist/audiences-NEW3LLQR.js +268 -0
- package/dist/audiences-NEW3LLQR.js.map +1 -0
- package/dist/audiences-NYGMBGQ3.js +79 -0
- package/dist/audiences-NYGMBGQ3.js.map +1 -0
- package/dist/audit-UIPMTI5C.js +88 -0
- package/dist/audit-UIPMTI5C.js.map +1 -0
- package/dist/audit-XGN2OFLN.js +151 -0
- package/dist/audit-XGN2OFLN.js.map +1 -0
- package/dist/autocomplete-LVPDV3JE.js +111 -0
- package/dist/autocomplete-LVPDV3JE.js.map +1 -0
- package/dist/avatars-S6NSLMJK.js +38 -0
- package/dist/avatars-S6NSLMJK.js.map +1 -0
- package/dist/bid-pricing-2LYULXU2.js +99 -0
- package/dist/bid-pricing-2LYULXU2.js.map +1 -0
- package/dist/brand-WWHUZ72R.js +22 -0
- package/dist/brand-WWHUZ72R.js.map +1 -0
- package/dist/brief-K3FILESK.js +492 -0
- package/dist/brief-K3FILESK.js.map +1 -0
- package/dist/businesses-J7OP7MSK.js +53 -0
- package/dist/businesses-J7OP7MSK.js.map +1 -0
- package/dist/campaign-groups-N4TZ2F3L.js +95 -0
- package/dist/campaign-groups-N4TZ2F3L.js.map +1 -0
- package/dist/campaign-writes-5XA727KI.js +170 -0
- package/dist/campaign-writes-5XA727KI.js.map +1 -0
- package/dist/campaign-writes-7YFRQIQT.js +165 -0
- package/dist/campaign-writes-7YFRQIQT.js.map +1 -0
- package/dist/campaigns-JPYNVFQI.js +76 -0
- package/dist/campaigns-JPYNVFQI.js.map +1 -0
- package/dist/campaigns-L43ZUKAI.js +107 -0
- package/dist/campaigns-L43ZUKAI.js.map +1 -0
- package/dist/campaigns-OD7Z332M.js +109 -0
- package/dist/campaigns-OD7Z332M.js.map +1 -0
- package/dist/campaigns-R4DXIR2Q.js +110 -0
- package/dist/campaigns-R4DXIR2Q.js.map +1 -0
- package/dist/canvas-57K7AGAP.js +46 -0
- package/dist/canvas-57K7AGAP.js.map +1 -0
- package/dist/capabilities-FVTZAFPV.js +144 -0
- package/dist/capabilities-FVTZAFPV.js.map +1 -0
- package/dist/cards-7H32TNMO.js +85 -0
- package/dist/cards-7H32TNMO.js.map +1 -0
- package/dist/catalog-OTICZPJA.js +64 -0
- package/dist/catalog-OTICZPJA.js.map +1 -0
- package/dist/catalogs-ABCQLCDU.js +128 -0
- package/dist/catalogs-ABCQLCDU.js.map +1 -0
- package/dist/changes-7ZIGNUW6.js +135 -0
- package/dist/changes-7ZIGNUW6.js.map +1 -0
- package/dist/chatgpt-B3NHRJUE.js +47 -0
- package/dist/chatgpt-B3NHRJUE.js.map +1 -0
- package/dist/chats-E7DBRHBF.js +262 -0
- package/dist/chats-E7DBRHBF.js.map +1 -0
- package/dist/chunk-2CV7LX23.js +474 -0
- package/dist/chunk-2CV7LX23.js.map +1 -0
- package/dist/chunk-2HCI5BXB.js +479 -0
- package/dist/chunk-2HCI5BXB.js.map +1 -0
- package/dist/chunk-2SQJL7ZN.js +56 -0
- package/dist/chunk-2SQJL7ZN.js.map +1 -0
- package/dist/chunk-2Y5V23PU.js +29 -0
- package/dist/chunk-2Y5V23PU.js.map +1 -0
- package/dist/chunk-32CPGJPL.js +149 -0
- package/dist/chunk-32CPGJPL.js.map +1 -0
- package/dist/chunk-3ACMDRSE.js +39 -0
- package/dist/chunk-3ACMDRSE.js.map +1 -0
- package/dist/chunk-3N4PZIIV.js +304 -0
- package/dist/chunk-3N4PZIIV.js.map +1 -0
- package/dist/chunk-3U7TDBIB.js +275 -0
- package/dist/chunk-3U7TDBIB.js.map +1 -0
- package/dist/chunk-3UDSYYND.js +42 -0
- package/dist/chunk-3UDSYYND.js.map +1 -0
- package/dist/chunk-3ZWWXAQZ.js +150 -0
- package/dist/chunk-3ZWWXAQZ.js.map +1 -0
- package/dist/chunk-4MH6LONO.js +274 -0
- package/dist/chunk-4MH6LONO.js.map +1 -0
- package/dist/chunk-4NZ47VXO.js +137 -0
- package/dist/chunk-4NZ47VXO.js.map +1 -0
- package/dist/chunk-564AEU2Q.js +541 -0
- package/dist/chunk-564AEU2Q.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-5OVOLYY3.js +74 -0
- package/dist/chunk-5OVOLYY3.js.map +1 -0
- package/dist/chunk-5SJ3JNNY.js +6683 -0
- package/dist/chunk-5SJ3JNNY.js.map +1 -0
- package/dist/chunk-66USKCVY.js +4410 -0
- package/dist/chunk-66USKCVY.js.map +1 -0
- package/dist/chunk-6I7SYEYN.js +166 -0
- package/dist/chunk-6I7SYEYN.js.map +1 -0
- package/dist/chunk-6O7ISBC7.js +65 -0
- package/dist/chunk-6O7ISBC7.js.map +1 -0
- package/dist/chunk-752S7JF6.js +35 -0
- package/dist/chunk-752S7JF6.js.map +1 -0
- package/dist/chunk-77DN7R35.js +228 -0
- package/dist/chunk-77DN7R35.js.map +1 -0
- package/dist/chunk-7F7MFMLI.js +175 -0
- package/dist/chunk-7F7MFMLI.js.map +1 -0
- package/dist/chunk-7THBBTJJ.js +183 -0
- package/dist/chunk-7THBBTJJ.js.map +1 -0
- package/dist/chunk-7XU3HKMX.js +1599 -0
- package/dist/chunk-7XU3HKMX.js.map +1 -0
- package/dist/chunk-AEA5JV2X.js +92 -0
- package/dist/chunk-AEA5JV2X.js.map +1 -0
- package/dist/chunk-AFJGYJ7Z.js +45 -0
- package/dist/chunk-AFJGYJ7Z.js.map +1 -0
- package/dist/chunk-AR7PU7BB.js +76 -0
- package/dist/chunk-AR7PU7BB.js.map +1 -0
- package/dist/chunk-ASL7JFBD.js +96 -0
- package/dist/chunk-ASL7JFBD.js.map +1 -0
- package/dist/chunk-AUSKKFVH.js +84 -0
- package/dist/chunk-AUSKKFVH.js.map +1 -0
- package/dist/chunk-B52DCYL2.js +159 -0
- package/dist/chunk-B52DCYL2.js.map +1 -0
- package/dist/{chunk-XHC4LMK4.js → chunk-BVM5IRZW.js} +16 -8
- package/dist/chunk-BVM5IRZW.js.map +1 -0
- package/dist/chunk-CAMX6OHF.js +3182 -0
- package/dist/chunk-CAMX6OHF.js.map +1 -0
- package/dist/chunk-CYBLKMXQ.js +310 -0
- package/dist/chunk-CYBLKMXQ.js.map +1 -0
- package/dist/chunk-CZENWCBS.js +333 -0
- package/dist/chunk-CZENWCBS.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-DX4GIDO7.js +296 -0
- package/dist/chunk-DX4GIDO7.js.map +1 -0
- package/dist/chunk-EDLZGTGN.js +216 -0
- package/dist/chunk-EDLZGTGN.js.map +1 -0
- package/dist/chunk-EDNX3AOS.js +76 -0
- package/dist/chunk-EDNX3AOS.js.map +1 -0
- package/dist/chunk-EF5DP6EB.js +52 -0
- package/dist/chunk-EF5DP6EB.js.map +1 -0
- package/dist/chunk-ERSX3MKH.js +34 -0
- package/dist/chunk-ERSX3MKH.js.map +1 -0
- package/dist/chunk-F3IJSR7O.js +346 -0
- package/dist/chunk-F3IJSR7O.js.map +1 -0
- package/dist/chunk-FKOECEVC.js +126 -0
- package/dist/chunk-FKOECEVC.js.map +1 -0
- package/dist/chunk-FYWWTMXP.js +2902 -0
- package/dist/chunk-FYWWTMXP.js.map +1 -0
- package/dist/chunk-G7AFVTUS.js +106 -0
- package/dist/chunk-G7AFVTUS.js.map +1 -0
- package/dist/chunk-GIW7ABMM.js +74 -0
- package/dist/chunk-GIW7ABMM.js.map +1 -0
- package/dist/chunk-GIWHHCD6.js +145 -0
- package/dist/chunk-GIWHHCD6.js.map +1 -0
- package/dist/chunk-GPZH5ASB.js +3151 -0
- package/dist/chunk-GPZH5ASB.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-GYABNLWW.js +629 -0
- package/dist/chunk-GYABNLWW.js.map +1 -0
- package/dist/chunk-H7MLHG2I.js +94 -0
- package/dist/chunk-H7MLHG2I.js.map +1 -0
- package/dist/chunk-H7XVKLIY.js +206 -0
- package/dist/chunk-H7XVKLIY.js.map +1 -0
- package/dist/chunk-HAE4WWFQ.js +455 -0
- package/dist/chunk-HAE4WWFQ.js.map +1 -0
- package/dist/chunk-HDHWIEJJ.js +136 -0
- package/dist/chunk-HDHWIEJJ.js.map +1 -0
- package/dist/chunk-HJTIBTF7.js +98 -0
- package/dist/chunk-HJTIBTF7.js.map +1 -0
- package/dist/{chunk-VZEDAFAR.js → chunk-HLXWKMTK.js} +47 -8
- package/dist/chunk-HLXWKMTK.js.map +1 -0
- package/dist/{chunk-MF7YA62W.js → chunk-HREWXNTO.js} +10 -5
- package/dist/chunk-HREWXNTO.js.map +1 -0
- package/dist/chunk-HYXKRNRV.js +176 -0
- package/dist/chunk-HYXKRNRV.js.map +1 -0
- package/dist/chunk-I3DIZWN5.js +97 -0
- package/dist/chunk-I3DIZWN5.js.map +1 -0
- package/dist/chunk-IJMWEO4P.js +57 -0
- package/dist/chunk-IJMWEO4P.js.map +1 -0
- package/dist/chunk-IOCSDFF2.js +23992 -0
- package/dist/chunk-IOCSDFF2.js.map +1 -0
- package/dist/chunk-IVIJJXXT.js +62 -0
- package/dist/chunk-IVIJJXXT.js.map +1 -0
- package/dist/chunk-J57GWTPK.js +106 -0
- package/dist/chunk-J57GWTPK.js.map +1 -0
- package/dist/chunk-JPK34QPS.js +134 -0
- package/dist/chunk-JPK34QPS.js.map +1 -0
- package/dist/chunk-JRCFCIE3.js +188 -0
- package/dist/chunk-JRCFCIE3.js.map +1 -0
- package/dist/chunk-JUAIGJ2A.js +76 -0
- package/dist/chunk-JUAIGJ2A.js.map +1 -0
- package/dist/chunk-K5OQES4V.js +58 -0
- package/dist/chunk-K5OQES4V.js.map +1 -0
- package/dist/chunk-KBS5GH4T.js +1626 -0
- package/dist/chunk-KBS5GH4T.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-KLK6KQLQ.js +55 -0
- package/dist/chunk-KLK6KQLQ.js.map +1 -0
- package/dist/chunk-KUZFWMJN.js +207 -0
- package/dist/chunk-KUZFWMJN.js.map +1 -0
- package/dist/chunk-KXGG6EQM.js +382 -0
- package/dist/chunk-KXGG6EQM.js.map +1 -0
- package/dist/chunk-KXRKPZZY.js +169 -0
- package/dist/chunk-KXRKPZZY.js.map +1 -0
- package/dist/chunk-KZUHRZ2C.js +5187 -0
- package/dist/chunk-KZUHRZ2C.js.map +1 -0
- package/dist/chunk-L45A3IYV.js +1079 -0
- package/dist/chunk-L45A3IYV.js.map +1 -0
- package/dist/chunk-LA6PPSNA.js +65 -0
- package/dist/chunk-LA6PPSNA.js.map +1 -0
- package/dist/chunk-LEIQAHWF.js +25 -0
- package/dist/chunk-LEIQAHWF.js.map +1 -0
- package/dist/chunk-LERWCRY5.js +297 -0
- package/dist/chunk-LERWCRY5.js.map +1 -0
- package/dist/chunk-M6UNISGO.js +66 -0
- package/dist/chunk-M6UNISGO.js.map +1 -0
- package/dist/chunk-MGKHFGLV.js +75 -0
- package/dist/chunk-MGKHFGLV.js.map +1 -0
- package/dist/chunk-MZWC6HHA.js +455 -0
- package/dist/chunk-MZWC6HHA.js.map +1 -0
- package/dist/chunk-N3XJ434P.js +197 -0
- package/dist/chunk-N3XJ434P.js.map +1 -0
- package/dist/chunk-NFSLRRIE.js +77 -0
- package/dist/chunk-NFSLRRIE.js.map +1 -0
- package/dist/chunk-NHU33T2S.js +60 -0
- package/dist/chunk-NHU33T2S.js.map +1 -0
- package/dist/chunk-NJEZM4OB.js +51 -0
- package/dist/chunk-NJEZM4OB.js.map +1 -0
- package/dist/chunk-O6QKCJE4.js +455 -0
- package/dist/chunk-O6QKCJE4.js.map +1 -0
- package/dist/chunk-OFFAMC5H.js +225 -0
- package/dist/chunk-OFFAMC5H.js.map +1 -0
- package/dist/chunk-OHGTCFFE.js +57 -0
- package/dist/chunk-OHGTCFFE.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-PKTLHYH4.js +509 -0
- package/dist/chunk-PKTLHYH4.js.map +1 -0
- package/dist/chunk-PUPEGICD.js +103 -0
- package/dist/chunk-PUPEGICD.js.map +1 -0
- package/dist/chunk-Q6ULQMWG.js +41 -0
- package/dist/chunk-Q6ULQMWG.js.map +1 -0
- package/dist/chunk-QO23YHLK.js +84 -0
- package/dist/chunk-QO23YHLK.js.map +1 -0
- package/dist/chunk-QSGIWV4P.js +337 -0
- package/dist/chunk-QSGIWV4P.js.map +1 -0
- package/dist/chunk-R5OQM7FF.js +179 -0
- package/dist/chunk-R5OQM7FF.js.map +1 -0
- package/dist/chunk-RFB6RYKA.js +111 -0
- package/dist/chunk-RFB6RYKA.js.map +1 -0
- package/dist/chunk-RGIXQEGJ.js +502 -0
- package/dist/chunk-RGIXQEGJ.js.map +1 -0
- package/dist/chunk-RODLBWIR.js +592 -0
- package/dist/chunk-RODLBWIR.js.map +1 -0
- package/dist/chunk-S4LZ7KTG.js +160 -0
- package/dist/chunk-S4LZ7KTG.js.map +1 -0
- package/dist/chunk-SHTESUB6.js +1442 -0
- package/dist/chunk-SHTESUB6.js.map +1 -0
- package/dist/chunk-SJH4EOZH.js +23 -0
- package/dist/chunk-SJH4EOZH.js.map +1 -0
- package/dist/chunk-SLB46MSS.js +64 -0
- package/dist/chunk-SLB46MSS.js.map +1 -0
- package/dist/chunk-SMIENBNX.js +6212 -0
- package/dist/chunk-SMIENBNX.js.map +1 -0
- package/dist/chunk-T7GT22KA.js +494 -0
- package/dist/chunk-T7GT22KA.js.map +1 -0
- package/dist/chunk-T7M4WFNV.js +172 -0
- package/dist/chunk-T7M4WFNV.js.map +1 -0
- package/dist/chunk-TLQ23DDW.js +19 -0
- package/dist/chunk-TLQ23DDW.js.map +1 -0
- package/dist/chunk-TMIDUSOR.js +665 -0
- package/dist/chunk-TMIDUSOR.js.map +1 -0
- package/dist/{chunk-WLDM2TRF.js → chunk-TPXI2GCW.js} +4 -4
- package/dist/chunk-U6VRBDNQ.js +1830 -0
- package/dist/chunk-U6VRBDNQ.js.map +1 -0
- package/dist/chunk-U7BBXM67.js +1743 -0
- package/dist/chunk-U7BBXM67.js.map +1 -0
- package/dist/chunk-UI6BKYQD.js +225 -0
- package/dist/chunk-UI6BKYQD.js.map +1 -0
- package/dist/chunk-UOI5S62H.js +846 -0
- package/dist/chunk-UOI5S62H.js.map +1 -0
- package/dist/chunk-USL5ARRE.js +26 -0
- package/dist/chunk-USL5ARRE.js.map +1 -0
- package/dist/chunk-UYC45JNS.js +139 -0
- package/dist/chunk-UYC45JNS.js.map +1 -0
- package/dist/chunk-VNKVBY54.js +363 -0
- package/dist/chunk-VNKVBY54.js.map +1 -0
- package/dist/chunk-VS4C7VAR.js +533 -0
- package/dist/chunk-VS4C7VAR.js.map +1 -0
- package/dist/chunk-W4W4ZRBP.js +191 -0
- package/dist/chunk-W4W4ZRBP.js.map +1 -0
- package/dist/chunk-WN4KX7GE.js +25 -0
- package/dist/chunk-WN4KX7GE.js.map +1 -0
- package/dist/chunk-WNFTXSGR.js +111 -0
- package/dist/chunk-WNFTXSGR.js.map +1 -0
- package/dist/chunk-WOTDHRNF.js +2109 -0
- package/dist/chunk-WOTDHRNF.js.map +1 -0
- package/dist/chunk-XGWKTYXQ.js +67 -0
- package/dist/chunk-XGWKTYXQ.js.map +1 -0
- package/dist/chunk-XIGIJJSF.js +66 -0
- package/dist/chunk-XIGIJJSF.js.map +1 -0
- package/dist/chunk-XNUXB63I.js +817 -0
- package/dist/chunk-XNUXB63I.js.map +1 -0
- package/dist/chunk-XQ3CCNJD.js +610 -0
- package/dist/chunk-XQ3CCNJD.js.map +1 -0
- package/dist/chunk-XX6ZMCY5.js +4227 -0
- package/dist/chunk-XX6ZMCY5.js.map +1 -0
- package/dist/chunk-Y362QH54.js +98 -0
- package/dist/chunk-Y362QH54.js.map +1 -0
- package/dist/chunk-Y4T6ATDQ.js +74 -0
- package/dist/chunk-Y4T6ATDQ.js.map +1 -0
- package/dist/chunk-YQSBHWOI.js +41 -0
- package/dist/chunk-YU26SDNT.js +46 -0
- package/dist/chunk-YU26SDNT.js.map +1 -0
- package/dist/chunk-YULENNA7.js +501 -0
- package/dist/chunk-YULENNA7.js.map +1 -0
- package/dist/chunk-YYSZYSAG.js +150 -0
- package/dist/chunk-YYSZYSAG.js.map +1 -0
- package/dist/chunk-Z3ENMCFE.js +94 -0
- package/dist/chunk-Z3ENMCFE.js.map +1 -0
- package/dist/chunk-ZH7ZM3ZM.js +125 -0
- package/dist/chunk-ZH7ZM3ZM.js.map +1 -0
- package/dist/chunk-ZIXHS6AM.js +42 -0
- package/dist/chunk-ZIXHS6AM.js.map +1 -0
- package/dist/chunk-ZLLJKSNS.js +96 -0
- package/dist/chunk-ZLLJKSNS.js.map +1 -0
- package/dist/claim-LF6VQ7OR.js +197 -0
- package/dist/claim-LF6VQ7OR.js.map +1 -0
- package/dist/cli.js +104 -70026
- package/dist/cli.js.map +1 -1
- package/dist/client-26SAJ46D.js +19 -0
- package/dist/code-MOWYJMDH.js +76 -0
- package/dist/code-MOWYJMDH.js.map +1 -0
- package/dist/companies-6HSK5BLK.js +195 -0
- package/dist/companies-6HSK5BLK.js.map +1 -0
- package/dist/complete-2PUAFQEC.js +81 -0
- package/dist/complete-2PUAFQEC.js.map +1 -0
- package/dist/config-X6GKOVQ6.js +88 -0
- package/dist/config-X6GKOVQ6.js.map +1 -0
- package/dist/connect-RXPMAJQI.js +42 -0
- package/dist/content-UYZC4AKN.js +85 -0
- package/dist/content-UYZC4AKN.js.map +1 -0
- package/dist/conversation-Y3NB2VDI.js +93 -0
- package/dist/conversation-Y3NB2VDI.js.map +1 -0
- package/dist/conversion-report-R4GJWWTK.js +125 -0
- package/dist/conversion-report-R4GJWWTK.js.map +1 -0
- package/dist/conversion-upload-command-YP4DGTPP.js +438 -0
- package/dist/conversion-upload-command-YP4DGTPP.js.map +1 -0
- package/dist/conversion-writes-WHFFUWWL.js +120 -0
- package/dist/conversion-writes-WHFFUWWL.js.map +1 -0
- package/dist/conversions-K7C32DPW.js +135 -0
- package/dist/conversions-K7C32DPW.js.map +1 -0
- package/dist/conversions-OXJAX5GB.js +76 -0
- package/dist/conversions-OXJAX5GB.js.map +1 -0
- package/dist/countries-PBXNB3BR.js +82 -0
- package/dist/countries-PBXNB3BR.js.map +1 -0
- package/dist/create-AJ4KPSJ4.js +59 -0
- package/dist/create-AJ4KPSJ4.js.map +1 -0
- package/dist/create-ALKOAD5J.js +138 -0
- package/dist/create-ALKOAD5J.js.map +1 -0
- package/dist/create-HTKZMXKB.js +207 -0
- package/dist/create-HTKZMXKB.js.map +1 -0
- package/dist/create-TZMAOFBR.js +236 -0
- package/dist/create-TZMAOFBR.js.map +1 -0
- package/dist/creatives-BJYJFVXJ.js +51 -0
- package/dist/creatives-BJYJFVXJ.js.map +1 -0
- package/dist/creatives-OZHVU4WB.js +182 -0
- package/dist/creatives-OZHVU4WB.js.map +1 -0
- package/dist/creatives-VMGY5SU4.js +87 -0
- package/dist/creatives-VMGY5SU4.js.map +1 -0
- package/dist/credentials-FY4UH6TF.js +287 -0
- package/dist/credentials-FY4UH6TF.js.map +1 -0
- package/dist/critique-B3H7QFM2.js +1449 -0
- package/dist/critique-B3H7QFM2.js.map +1 -0
- package/dist/critique-YZBOA27H.js +216 -0
- package/dist/critique-YZBOA27H.js.map +1 -0
- package/dist/crm-2IBLUHDB.js +318 -0
- package/dist/crm-2IBLUHDB.js.map +1 -0
- package/dist/crm-YMYO4U53.js +224 -0
- package/dist/crm-YMYO4U53.js.map +1 -0
- package/dist/crop-U3AD4DDR.js +113 -0
- package/dist/crop-U3AD4DDR.js.map +1 -0
- package/dist/currency-S6KWZSZ6.js +88 -0
- package/dist/currency-S6KWZSZ6.js.map +1 -0
- package/dist/custom-conversions-FABS6YVT.js +125 -0
- package/dist/custom-conversions-FABS6YVT.js.map +1 -0
- package/dist/customers-P6LLLJHK.js +56 -0
- package/dist/decide-YTHCBKM6.js +199 -0
- package/dist/decide-YTHCBKM6.js.map +1 -0
- package/dist/delete-B2TDEW7H.js +63 -0
- package/dist/delete-B2TDEW7H.js.map +1 -0
- package/dist/delete-DZUDLYPC.js +69 -0
- package/dist/delete-DZUDLYPC.js.map +1 -0
- package/dist/delete-NZGZP4YP.js +71 -0
- package/dist/delete-NZGZP4YP.js.map +1 -0
- package/dist/delete-SDOZNDWQ.js +54 -0
- package/dist/delete-SDOZNDWQ.js.map +1 -0
- package/dist/delete-VQMU56OH.js +71 -0
- package/dist/delete-VQMU56OH.js.map +1 -0
- package/dist/delete-WKQPMVAM.js +66 -0
- package/dist/delete-WKQPMVAM.js.map +1 -0
- package/dist/demographics-Q3DCXULY.js +138 -0
- package/dist/demographics-Q3DCXULY.js.map +1 -0
- package/dist/describe-JNTCQZNL.js +97 -0
- package/dist/describe-JNTCQZNL.js.map +1 -0
- package/dist/describe-MT4334NG.js +97 -0
- package/dist/describe-MT4334NG.js.map +1 -0
- package/dist/dimensions-FEZUJRAG.js +101 -0
- package/dist/dimensions-FEZUJRAG.js.map +1 -0
- package/dist/discard-NEZM5CHF.js +66 -0
- package/dist/discard-NEZM5CHF.js.map +1 -0
- package/dist/discover-4GD7QSF5.js +93 -0
- package/dist/discover-4GD7QSF5.js.map +1 -0
- package/dist/discover-6K3IOYXR.js +172 -0
- package/dist/discover-6K3IOYXR.js.map +1 -0
- package/dist/domain-7Y256IDR.js +98 -0
- package/dist/domain-7Y256IDR.js.map +1 -0
- package/dist/download-L27HWEOE.js +299 -0
- package/dist/download-L27HWEOE.js.map +1 -0
- package/dist/draft-25G2P2TE.js +281 -0
- package/dist/draft-25G2P2TE.js.map +1 -0
- package/dist/draft-F6TUGXAY.js +307 -0
- package/dist/draft-F6TUGXAY.js.map +1 -0
- package/dist/draft-KLULNBWP.js +233 -0
- package/dist/draft-KLULNBWP.js.map +1 -0
- package/dist/draft-LY5ZPF73.js +217 -0
- package/dist/draft-LY5ZPF73.js.map +1 -0
- package/dist/draft-M4ZHDQ46.js +306 -0
- package/dist/draft-M4ZHDQ46.js.map +1 -0
- package/dist/draft-MI7RWY2K.js +100 -0
- package/dist/draft-MI7RWY2K.js.map +1 -0
- package/dist/draft-P4IVYTY3.js +103 -0
- package/dist/draft-P4IVYTY3.js.map +1 -0
- package/dist/draft-QQMCVDDS.js +328 -0
- package/dist/draft-QQMCVDDS.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-FBTHZKGN.js} +12 -2
- package/dist/env-FBTHZKGN.js.map +1 -0
- package/dist/experiment-HDYTJPUY.js +1397 -0
- package/dist/experiment-HDYTJPUY.js.map +1 -0
- package/dist/export-TS5GYEMA.js +168 -0
- package/dist/export-TS5GYEMA.js.map +1 -0
- package/dist/extract-QVQFUOIK.js +113 -0
- package/dist/extract-QVQFUOIK.js.map +1 -0
- package/dist/facets-7MBSM7BP.js +114 -0
- package/dist/facets-7MBSM7BP.js.map +1 -0
- package/dist/favorites-7QP7BY5K.js +178 -0
- package/dist/favorites-7QP7BY5K.js.map +1 -0
- package/dist/feed-EETRO2FG.js +177 -0
- package/dist/feed-EETRO2FG.js.map +1 -0
- package/dist/feedback-ZOUL22TP.js +66 -0
- package/dist/feedback-ZOUL22TP.js.map +1 -0
- package/dist/feedback-record-XFFJRKS6.js +177 -0
- package/dist/feedback-record-XFFJRKS6.js.map +1 -0
- package/dist/fetch-QE3EB756.js +176 -0
- package/dist/fetch-QE3EB756.js.map +1 -0
- package/dist/fetch-Z7O3ZL4D.js +139 -0
- package/dist/fetch-Z7O3ZL4D.js.map +1 -0
- package/dist/find-KAQ6JDMO.js +134 -0
- package/dist/find-KAQ6JDMO.js.map +1 -0
- package/dist/fit-MY5GVZZZ.js +45 -0
- package/dist/fit-MY5GVZZZ.js.map +1 -0
- package/dist/flows-C67KEMDU.js +247 -0
- package/dist/flows-C67KEMDU.js.map +1 -0
- package/dist/follow-IX4XVK5Y.js +94 -0
- package/dist/follow-IX4XVK5Y.js.map +1 -0
- package/dist/follow-competitors-UZBUOYTH.js +112 -0
- package/dist/follow-competitors-UZBUOYTH.js.map +1 -0
- package/dist/following-VGOIUCIZ.js +113 -0
- package/dist/following-VGOIUCIZ.js.map +1 -0
- package/dist/fonts-UR7XZ5XZ.js +34 -0
- package/dist/fonts-UR7XZ5XZ.js.map +1 -0
- package/dist/forecast-3F4SZNAK.js +104 -0
- package/dist/forecast-3F4SZNAK.js.map +1 -0
- package/dist/forecast-K5E7CTKX.js +168 -0
- package/dist/forecast-K5E7CTKX.js.map +1 -0
- package/dist/funding-H5YO37OW.js +85 -0
- package/dist/funding-H5YO37OW.js.map +1 -0
- package/dist/funnel-2PPEPAMY.js +394 -0
- package/dist/funnel-2PPEPAMY.js.map +1 -0
- package/dist/ga4-YHJ2XMLC.js +55 -0
- package/dist/ga4-YHJ2XMLC.js.map +1 -0
- package/dist/generate-M2ZX5DMI.js +262 -0
- package/dist/generate-M2ZX5DMI.js.map +1 -0
- package/dist/get-4EYKCZ6F.js +59 -0
- package/dist/get-4EYKCZ6F.js.map +1 -0
- package/dist/get-637GALM2.js +63 -0
- package/dist/get-637GALM2.js.map +1 -0
- package/dist/get-AZARFR6O.js +61 -0
- package/dist/get-AZARFR6O.js.map +1 -0
- package/dist/get-BPMEHRUG.js +56 -0
- package/dist/get-BPMEHRUG.js.map +1 -0
- package/dist/get-MQ6MMIZ7.js +78 -0
- package/dist/get-MQ6MMIZ7.js.map +1 -0
- package/dist/get-N4BPOQCB.js +63 -0
- package/dist/get-N4BPOQCB.js.map +1 -0
- package/dist/get-RPZHLQ56.js +92 -0
- package/dist/get-RPZHLQ56.js.map +1 -0
- package/dist/gif-6PRTB2VR.js +94 -0
- package/dist/gif-6PRTB2VR.js.map +1 -0
- package/dist/google-4XAYE4OI.js +3190 -0
- package/dist/google-4XAYE4OI.js.map +1 -0
- package/dist/google-52JRH7X3.js +136 -0
- package/dist/google-52JRH7X3.js.map +1 -0
- package/dist/google-ads-PWX7OF5Z.js +195 -0
- package/dist/google-ads-PWX7OF5Z.js.map +1 -0
- package/dist/group-AAZ5QKC3.js +43 -0
- package/dist/group-AAZ5QKC3.js.map +1 -0
- package/dist/group-GSYCZORC.js +43 -0
- package/dist/group-GSYCZORC.js.map +1 -0
- package/dist/gsc-TS5T7ML2.js +30 -0
- package/dist/gsc-TS5T7ML2.js.map +1 -0
- package/dist/history-EW6LFFCX.js +67 -0
- package/dist/history-EW6LFFCX.js.map +1 -0
- package/dist/history-XI5ABCFO.js +133 -0
- package/dist/history-XI5ABCFO.js.map +1 -0
- package/dist/hubspot-AVUOILRE.js +779 -0
- package/dist/hubspot-AVUOILRE.js.map +1 -0
- package/dist/icon-K75KI6BV.js +137 -0
- package/dist/icon-K75KI6BV.js.map +1 -0
- package/dist/ideas-UCPV3KTM.js +35 -0
- package/dist/ideas-UCPV3KTM.js.map +1 -0
- package/dist/images-CD53I2W5.js +90 -0
- package/dist/images-CD53I2W5.js.map +1 -0
- package/dist/improve-L3BW4EQG.js +86 -0
- package/dist/improve-L3BW4EQG.js.map +1 -0
- package/dist/ingest-KRJOYTCQ.js +107 -0
- package/dist/ingest-KRJOYTCQ.js.map +1 -0
- package/dist/ingest-WE3SPPND.js +23 -0
- package/dist/ingest-WE3SPPND.js.map +1 -0
- package/dist/insights-PELVD4RY.js +122 -0
- package/dist/insights-PELVD4RY.js.map +1 -0
- package/dist/insights-XCA4BUJW.js +423 -0
- package/dist/insights-XCA4BUJW.js.map +1 -0
- package/dist/inspect-QKETG5UJ.js +189 -0
- package/dist/inspect-QKETG5UJ.js.map +1 -0
- package/dist/inspiration-Y2J2PUPC.js +53 -0
- package/dist/inspiration-Y2J2PUPC.js.map +1 -0
- package/dist/intent-YJOJGNVJ.js +95 -0
- package/dist/intent-YJOJGNVJ.js.map +1 -0
- package/dist/job-E2U4FS5P.js +202 -0
- package/dist/job-E2U4FS5P.js.map +1 -0
- package/dist/job-create-DFYCHVQ7.js +109 -0
- package/dist/job-create-DFYCHVQ7.js.map +1 -0
- package/dist/job-status-FFPMTSHB.js +74 -0
- package/dist/job-status-FFPMTSHB.js.map +1 -0
- package/dist/keep-GYZS2UTL.js +78 -0
- package/dist/keep-GYZS2UTL.js.map +1 -0
- package/dist/keyword-gap-QU7O7UKC.js +130 -0
- package/dist/keyword-gap-QU7O7UKC.js.map +1 -0
- package/dist/keyword-metrics-HLCM3QU7.js +197 -0
- package/dist/keyword-metrics-HLCM3QU7.js.map +1 -0
- package/dist/keywords-for-site-BDKPQKWB.js +128 -0
- package/dist/keywords-for-site-BDKPQKWB.js.map +1 -0
- package/dist/landing-4K6XYNFM.js +28 -0
- package/dist/landing-4K6XYNFM.js.map +1 -0
- package/dist/landings-F7LOAEJE.js +151 -0
- package/dist/landings-F7LOAEJE.js.map +1 -0
- package/dist/languages-P3ZM6R2A.js +40 -0
- package/dist/languages-P3ZM6R2A.js.map +1 -0
- package/dist/languages-XEJKTIFP.js +55 -0
- package/dist/languages-XEJKTIFP.js.map +1 -0
- package/dist/launches-TCFAYUA5.js +19 -0
- package/dist/launches-TCFAYUA5.js.map +1 -0
- package/dist/layerize-ZSKFIPZA.js +190 -0
- package/dist/layerize-ZSKFIPZA.js.map +1 -0
- package/dist/leads-GDF4S2AM.js +90 -0
- package/dist/leads-GDF4S2AM.js.map +1 -0
- package/dist/leads-TPB5OFSQ.js +293 -0
- package/dist/leads-TPB5OFSQ.js.map +1 -0
- package/dist/learn-NMFEA5H5.js +203 -0
- package/dist/learn-NMFEA5H5.js.map +1 -0
- package/dist/library-IP2UKNRU.js +109 -0
- package/dist/library-IP2UKNRU.js.map +1 -0
- package/dist/lighthouse-57XBJRCO.js +75 -0
- package/dist/lighthouse-57XBJRCO.js.map +1 -0
- package/dist/line-item-writes-O6SSS5NQ.js +208 -0
- package/dist/line-item-writes-O6SSS5NQ.js.map +1 -0
- package/dist/line-items-ZZAKH3YZ.js +103 -0
- package/dist/line-items-ZZAKH3YZ.js.map +1 -0
- package/dist/link-CRY57R3E.js +64 -0
- package/dist/link-CRY57R3E.js.map +1 -0
- package/dist/linkedin-WC7LGYPP.js +1008 -0
- package/dist/linkedin-WC7LGYPP.js.map +1 -0
- package/dist/list-6IKPWQGG.js +57 -0
- package/dist/list-6IKPWQGG.js.map +1 -0
- package/dist/list-CAUH3BMG.js +65 -0
- package/dist/list-CAUH3BMG.js.map +1 -0
- package/dist/list-CWAKX5TH.js +63 -0
- package/dist/list-CWAKX5TH.js.map +1 -0
- package/dist/list-FJ5FSVL6.js +151 -0
- package/dist/list-FJ5FSVL6.js.map +1 -0
- package/dist/list-GTOSN7DP.js +50 -0
- package/dist/list-GTOSN7DP.js.map +1 -0
- package/dist/list-HLJP4NVE.js +51 -0
- package/dist/list-HLJP4NVE.js.map +1 -0
- package/dist/list-LCUPF7EF.js +76 -0
- package/dist/list-LCUPF7EF.js.map +1 -0
- package/dist/list-NH4ZRZTL.js +303 -0
- package/dist/list-NH4ZRZTL.js.map +1 -0
- package/dist/locations-2BYWKIYA.js +67 -0
- package/dist/locations-2BYWKIYA.js.map +1 -0
- package/dist/locations-LVVDOSXO.js +40 -0
- package/dist/locations-LVVDOSXO.js.map +1 -0
- package/dist/log-6JOWOY5G.js +92 -0
- package/dist/log-6JOWOY5G.js.map +1 -0
- package/dist/logo-AJK2TDQU.js +18 -0
- package/dist/logo-AJK2TDQU.js.map +1 -0
- package/dist/lookup-H5GEM77H.js +22 -0
- package/dist/lookup-H5GEM77H.js.map +1 -0
- package/dist/make-Q2AMLCWE.js +640 -0
- package/dist/make-Q2AMLCWE.js.map +1 -0
- package/dist/map-4KOYFHAN.js +404 -0
- package/dist/map-4KOYFHAN.js.map +1 -0
- package/dist/mcp-LSS2DHYL.js +463 -0
- package/dist/mcp-LSS2DHYL.js.map +1 -0
- package/dist/media-JBCN6V4X.js +15 -0
- package/dist/media-JBCN6V4X.js.map +1 -0
- package/dist/media-RAGEJTZX.js +89 -0
- package/dist/media-RAGEJTZX.js.map +1 -0
- package/dist/media-sources-GSPAV7HT.js +32 -0
- package/dist/media-sources-GSPAV7HT.js.map +1 -0
- package/dist/members-GUUVEK2Y.js +44 -0
- package/dist/members-GUUVEK2Y.js.map +1 -0
- package/dist/meta-Z37ZR3PJ.js +69 -0
- package/dist/meta-Z37ZR3PJ.js.map +1 -0
- package/dist/metrics-KW6SDULI.js +152 -0
- package/dist/metrics-KW6SDULI.js.map +1 -0
- package/dist/models-5J4WFUD3.js +155 -0
- package/dist/models-5J4WFUD3.js.map +1 -0
- package/dist/normalize-DSFVTRXN.js +806 -0
- package/dist/normalize-DSFVTRXN.js.map +1 -0
- package/dist/normalize-EUDI5HEM.js +141 -0
- package/dist/normalize-EUDI5HEM.js.map +1 -0
- package/dist/options-P4PPJQH4.js +121 -0
- package/dist/options-P4PPJQH4.js.map +1 -0
- package/dist/output-DTCLVPUF.js +24 -0
- package/dist/output-DTCLVPUF.js.map +1 -0
- package/dist/page-N2ZO3O7F.js +105 -0
- package/dist/page-N2ZO3O7F.js.map +1 -0
- package/dist/pages-FQ4CBAJ2.js +66 -0
- package/dist/pages-FQ4CBAJ2.js.map +1 -0
- package/dist/performance-A66LYIZX.js +24 -0
- package/dist/performance-A66LYIZX.js.map +1 -0
- package/dist/pinterest-NV5XTNJE.js +96 -0
- package/dist/pinterest-NV5XTNJE.js.map +1 -0
- package/dist/pixels-CTJ43FZ4.js +108 -0
- package/dist/pixels-CTJ43FZ4.js.map +1 -0
- package/dist/pixels-HKINGZCH.js +60 -0
- package/dist/pixels-HKINGZCH.js.map +1 -0
- package/dist/plan-ZYTWLGWK.js +207 -0
- package/dist/plan-ZYTWLGWK.js.map +1 -0
- package/dist/preview-5ROBOQG7.js +169 -0
- package/dist/preview-5ROBOQG7.js.map +1 -0
- package/dist/profile-Q3PHR6FU.js +159 -0
- package/dist/profile-Q3PHR6FU.js.map +1 -0
- package/dist/promoted-tweet-writes-AEOUK2LK.js +180 -0
- package/dist/promoted-tweet-writes-AEOUK2LK.js.map +1 -0
- package/dist/promoted-tweets-L2CEC2BJ.js +119 -0
- package/dist/promoted-tweets-L2CEC2BJ.js.map +1 -0
- package/dist/properties-WLL6M2P6.js +101 -0
- package/dist/properties-WLL6M2P6.js.map +1 -0
- package/dist/publish-KHNR5ARF.js +322 -0
- package/dist/publish-KHNR5ARF.js.map +1 -0
- package/dist/query-A34J7BGX.js +61 -0
- package/dist/query-A34J7BGX.js.map +1 -0
- package/dist/query-IYZN5KHO.js +236 -0
- package/dist/query-IYZN5KHO.js.map +1 -0
- package/dist/query-UN2P6DBA.js +247 -0
- package/dist/query-UN2P6DBA.js.map +1 -0
- package/dist/questionnaire-Z2ZIKNBV.js +93 -0
- package/dist/questionnaire-Z2ZIKNBV.js.map +1 -0
- package/dist/read-GM7PQYJA.js +141 -0
- package/dist/read-GM7PQYJA.js.map +1 -0
- package/dist/reddit-5NPFULGD.js +26 -0
- package/dist/reddit-5NPFULGD.js.map +1 -0
- package/dist/refresh-FGXW4Y4X.js +94 -0
- package/dist/refresh-FGXW4Y4X.js.map +1 -0
- package/dist/release-OKZMC73N.js +60 -0
- package/dist/release-OKZMC73N.js.map +1 -0
- package/dist/relevant-pages-J76ZKNKF.js +99 -0
- package/dist/relevant-pages-J76ZKNKF.js.map +1 -0
- package/dist/remove-CA2J6ACH.js +50 -0
- package/dist/remove-CA2J6ACH.js.map +1 -0
- package/dist/remove-GOYW2G4R.js +48 -0
- package/dist/remove-GOYW2G4R.js.map +1 -0
- package/dist/reopen-XPKSOE6O.js +63 -0
- package/dist/reopen-XPKSOE6O.js.map +1 -0
- package/dist/rerun-2ERJV4WC.js +86 -0
- package/dist/rerun-2ERJV4WC.js.map +1 -0
- package/dist/research-FZ63UZTE.js +62 -0
- package/dist/research-FZ63UZTE.js.map +1 -0
- package/dist/research-YGQQ6CNG.js +262 -0
- package/dist/research-YGQQ6CNG.js.map +1 -0
- package/dist/reset-BGPZ4HMA.js +54 -0
- package/dist/reset-BGPZ4HMA.js.map +1 -0
- package/dist/reset-HTD6LCIT.js +54 -0
- package/dist/reset-HTD6LCIT.js.map +1 -0
- package/dist/resolve-NRDZ6N2B.js +121 -0
- package/dist/resolve-NRDZ6N2B.js.map +1 -0
- package/dist/retry-PF4BGKJV.js +60 -0
- package/dist/retry-PF4BGKJV.js.map +1 -0
- package/dist/retry-XL26JDAV.js +62 -0
- package/dist/retry-XL26JDAV.js.map +1 -0
- package/dist/retry-failed-BEFWRV4Z.js +45 -0
- package/dist/retry-failed-BEFWRV4Z.js.map +1 -0
- package/dist/run-EMJLI7LR.js +65 -0
- package/dist/run-EMJLI7LR.js.map +1 -0
- package/dist/run-L5K44UEA.js +61 -0
- package/dist/run-L5K44UEA.js.map +1 -0
- package/dist/scaffold-ad-AY2OL7RI.js +1550 -0
- package/dist/scaffold-ad-AY2OL7RI.js.map +1 -0
- package/dist/scaffold-static-ad-FXYE46MT.js +973 -0
- package/dist/scaffold-static-ad-FXYE46MT.js.map +1 -0
- package/dist/scaffold-video-533BT6RX.js +874 -0
- package/dist/scaffold-video-533BT6RX.js.map +1 -0
- package/dist/schedule-KQ7UIR3N.js +66 -0
- package/dist/schedule-KQ7UIR3N.js.map +1 -0
- package/dist/schedule-PKPNSISL.js +61 -0
- package/dist/schedule-PKPNSISL.js.map +1 -0
- package/dist/scheduled-agents-LP5LITA3.js +49 -0
- package/dist/scheduled-agents-LP5LITA3.js.map +1 -0
- package/dist/schema-B6J6VPTO.js +132 -0
- package/dist/schema-B6J6VPTO.js.map +1 -0
- package/dist/schema-QXTDLZVC.js +63 -0
- package/dist/schema-QXTDLZVC.js.map +1 -0
- package/dist/scrape-7YKJWFZE.js +2241 -0
- package/dist/scrape-7YKJWFZE.js.map +1 -0
- package/dist/screenshot-ZHBSG3SI.js +102 -0
- package/dist/screenshot-ZHBSG3SI.js.map +1 -0
- package/dist/search-332KFYZ6.js +224 -0
- package/dist/search-332KFYZ6.js.map +1 -0
- package/dist/search-4PBMXXUY.js +91 -0
- package/dist/search-4PBMXXUY.js.map +1 -0
- package/dist/search-6WNUKCMP.js +174 -0
- package/dist/search-6WNUKCMP.js.map +1 -0
- package/dist/search-AVNUU6TJ.js +26 -0
- package/dist/search-AVNUU6TJ.js.map +1 -0
- package/dist/search-F5INRFFK.js +92 -0
- package/dist/search-F5INRFFK.js.map +1 -0
- package/dist/search-copy-DZVBYG2B.js +168 -0
- package/dist/search-copy-DZVBYG2B.js.map +1 -0
- package/dist/seeds-5JTQN5WI.js +101 -0
- package/dist/seeds-5JTQN5WI.js.map +1 -0
- package/dist/select-RSGLDQ5Z.js +96 -0
- package/dist/select-RSGLDQ5Z.js.map +1 -0
- package/dist/sends-3L6QBS46.js +309 -0
- package/dist/sends-3L6QBS46.js.map +1 -0
- package/dist/sequences-YKFV7BDH.js +146 -0
- package/dist/sequences-YKFV7BDH.js.map +1 -0
- package/dist/set-prompt-7WWJI6XW.js +188 -0
- package/dist/set-prompt-7WWJI6XW.js.map +1 -0
- package/dist/setup-links-6H5ONDCQ.js +141 -0
- package/dist/setup-links-6H5ONDCQ.js.map +1 -0
- package/dist/{shared-6762QE6R.js → shared-QAMP7FZV.js} +8 -6
- package/dist/shared-QAMP7FZV.js.map +1 -0
- package/dist/shopify-2OY3J3OY.js +3692 -0
- package/dist/shopify-2OY3J3OY.js.map +1 -0
- package/dist/site-TBPERLY3.js +177 -0
- package/dist/site-TBPERLY3.js.map +1 -0
- package/dist/sitemaps-XPGLW24S.js +87 -0
- package/dist/sitemaps-XPGLW24S.js.map +1 -0
- package/dist/sites-WMBY2HJV.js +101 -0
- package/dist/sites-WMBY2HJV.js.map +1 -0
- package/dist/skills-3HEILQCU.js +47 -0
- package/dist/skills-3HEILQCU.js.map +1 -0
- package/dist/sources-JFQKTK2L.js +421 -0
- package/dist/sources-JFQKTK2L.js.map +1 -0
- package/dist/sources-Q3I6DDV7.js +30 -0
- package/dist/sources-Q3I6DDV7.js.map +1 -0
- package/dist/stale-CAXBLZKJ.js +66 -0
- package/dist/stale-CAXBLZKJ.js.map +1 -0
- package/dist/stats-GNILHSKK.js +34 -0
- package/dist/stats-GNILHSKK.js.map +1 -0
- package/dist/status-LIZWJYS4.js +62 -0
- package/dist/status-LIZWJYS4.js.map +1 -0
- package/dist/sticker-KCV3VZHY.js +94 -0
- package/dist/sticker-KCV3VZHY.js.map +1 -0
- package/dist/stock-VTORKR4C.js +179 -0
- package/dist/stock-VTORKR4C.js.map +1 -0
- package/dist/studio-QCRA6BY5.js +49 -0
- package/dist/studio-QCRA6BY5.js.map +1 -0
- package/dist/sync-455DB46Y.js +54 -0
- package/dist/sync-455DB46Y.js.map +1 -0
- package/dist/sync-A4KKQ3B6.js +265 -0
- package/dist/sync-A4KKQ3B6.js.map +1 -0
- package/dist/sync-ULKWDFXM.js +54 -0
- package/dist/sync-ULKWDFXM.js.map +1 -0
- package/dist/sync-definition-P6QTHJJ6.js +55 -0
- package/dist/sync-definition-P6QTHJJ6.js.map +1 -0
- package/dist/tag-manager-E7QTXBWQ.js +43 -0
- package/dist/tag-manager-E7QTXBWQ.js.map +1 -0
- package/dist/tags-4Q4I5GQJ.js +20 -0
- package/dist/tags-4Q4I5GQJ.js.map +1 -0
- package/dist/tags-AMEVAQZ4.js +26 -0
- package/dist/tags-AMEVAQZ4.js.map +1 -0
- package/dist/tags-DPLOLH3E.js +20 -0
- package/dist/tags-DPLOLH3E.js.map +1 -0
- package/dist/tags-LDHXONR3.js +224 -0
- package/dist/tags-LDHXONR3.js.map +1 -0
- package/dist/tags-UW3WJTAQ.js +20 -0
- package/dist/tags-UW3WJTAQ.js.map +1 -0
- package/dist/targeting-constants-D64YO3E7.js +118 -0
- package/dist/targeting-constants-D64YO3E7.js.map +1 -0
- package/dist/targeting-criteria-BP6VJA7X.js +113 -0
- package/dist/targeting-criteria-BP6VJA7X.js.map +1 -0
- package/dist/targets-CQWO2UXD.js +102 -0
- package/dist/targets-CQWO2UXD.js.map +1 -0
- package/dist/templates-WZSTNRNZ.js +178 -0
- package/dist/templates-WZSTNRNZ.js.map +1 -0
- package/dist/testimonials-ETHSNWUH.js +32 -0
- package/dist/testimonials-ETHSNWUH.js.map +1 -0
- package/dist/themes-YU663LQH.js +94 -0
- package/dist/themes-YU663LQH.js.map +1 -0
- package/dist/top-companies-KTXHS472.js +108 -0
- package/dist/top-companies-KTXHS472.js.map +1 -0
- package/dist/translate-A7LYHUW3.js +600 -0
- package/dist/translate-A7LYHUW3.js.map +1 -0
- package/dist/triggers-4EDFLNGH.js +141 -0
- package/dist/triggers-4EDFLNGH.js.map +1 -0
- package/dist/tweets-ZUKQAAUQ.js +123 -0
- package/dist/tweets-ZUKQAAUQ.js.map +1 -0
- package/dist/unfollow-A4JVCJBF.js +46 -0
- package/dist/unfollow-A4JVCJBF.js.map +1 -0
- package/dist/unlink-KY2OEKMD.js +67 -0
- package/dist/unlink-KY2OEKMD.js.map +1 -0
- package/dist/unstage-FHUG67RI.js +84 -0
- package/dist/unstage-FHUG67RI.js.map +1 -0
- package/dist/unstage-ZRLLCSQF.js +95 -0
- package/dist/unstage-ZRLLCSQF.js.map +1 -0
- package/dist/update-27LGM65V.js +63 -0
- package/dist/update-27LGM65V.js.map +1 -0
- package/dist/update-AIY46I2Q.js +155 -0
- package/dist/update-AIY46I2Q.js.map +1 -0
- package/dist/update-QYD2XZFM.js +142 -0
- package/dist/update-QYD2XZFM.js.map +1 -0
- package/dist/update-W2OSRNFO.js +98 -0
- package/dist/update-W2OSRNFO.js.map +1 -0
- package/dist/upload-JGBTSKGH.js +126 -0
- package/dist/upload-JGBTSKGH.js.map +1 -0
- package/dist/upload-XEHWYMJG.js +150 -0
- package/dist/upload-XEHWYMJG.js.map +1 -0
- package/dist/upscale-I5P2OHTN.js +109 -0
- package/dist/upscale-I5P2OHTN.js.map +1 -0
- package/dist/url-options-QHGA42RP.js +130 -0
- package/dist/url-options-QHGA42RP.js.map +1 -0
- package/dist/url-params-NWSUHWRE.js +98 -0
- package/dist/url-params-NWSUHWRE.js.map +1 -0
- package/dist/use-U4HG2NF3.js +95 -0
- package/dist/use-U4HG2NF3.js.map +1 -0
- package/dist/validate-VKL3XKQ2.js +91 -0
- package/dist/validate-VKL3XKQ2.js.map +1 -0
- package/dist/variant-FOVE6URJ.js +338 -0
- package/dist/variant-FOVE6URJ.js.map +1 -0
- package/dist/videos-DP3VCSYG.js +39 -0
- package/dist/videos-DP3VCSYG.js.map +1 -0
- package/dist/view-HRI3FHCH.js +121 -0
- package/dist/view-HRI3FHCH.js.map +1 -0
- package/dist/viewer-check-JYUE24M6.js +68 -0
- package/dist/viewer-check-JYUE24M6.js.map +1 -0
- package/dist/web-AFUIWPFU.js +140 -0
- package/dist/web-AFUIWPFU.js.map +1 -0
- package/dist/winners-SMMDN6LW.js +113 -0
- package/dist/winners-SMMDN6LW.js.map +1 -0
- package/dist/winning-ads-PCIJUYVA.js +84 -0
- package/dist/winning-ads-PCIJUYVA.js.map +1 -0
- package/dist/write-commands-7Z34WG2J.js +206 -0
- package/dist/write-commands-7Z34WG2J.js.map +1 -0
- package/dist/write-commands-BLT2SEC4.js +713 -0
- package/dist/write-commands-BLT2SEC4.js.map +1 -0
- package/dist/write-commands-N4FSGRVQ.js +743 -0
- package/dist/write-commands-N4FSGRVQ.js.map +1 -0
- package/dist/write-commands-Q4MQ3BGM.js +1015 -0
- package/dist/write-commands-Q4MQ3BGM.js.map +1 -0
- package/dist/x-AUOZJNWE.js +47 -0
- package/dist/x-AUOZJNWE.js.map +1 -0
- package/package.json +9 -2
- package/dist/chunk-FGHMWBUD.js +0 -9989
- package/dist/chunk-FGHMWBUD.js.map +0 -1
- package/dist/chunk-HJEMOSPH.js +0 -1292
- package/dist/chunk-HJEMOSPH.js.map +0 -1
- package/dist/chunk-MF7YA62W.js.map +0 -1
- package/dist/chunk-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/{chunk-WLDM2TRF.js.map → chunk-TPXI2GCW.js.map} +0 -0
- /package/dist/{client-GR6YL3YX.js.map → chunk-YQSBHWOI.js.map} +0 -0
- /package/dist/{env-4P5HOGNA.js.map → client-26SAJ46D.js.map} +0 -0
- /package/dist/{output-NMQXZF3Z.js.map → connect-RXPMAJQI.js.map} +0 -0
- /package/dist/{shared-6762QE6R.js.map → customers-P6LLLJHK.js.map} +0 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import {
|
|
2
|
+
REDDIT_LINK_REJECTED,
|
|
3
|
+
redditSearchHints,
|
|
4
|
+
redditSubredditsHints,
|
|
5
|
+
redditThreadHints
|
|
6
|
+
} from "./chunk-H7XVKLIY.js";
|
|
7
|
+
import {
|
|
8
|
+
handleResearchError,
|
|
9
|
+
writeResearchJson
|
|
10
|
+
} from "./chunk-Y362QH54.js";
|
|
11
|
+
import {
|
|
12
|
+
repeatedValues
|
|
13
|
+
} from "./chunk-ERSX3MKH.js";
|
|
14
|
+
import {
|
|
15
|
+
RESEARCH_REDDIT_THREAD_DEFAULT_COMMENTS
|
|
16
|
+
} from "./chunk-SMIENBNX.js";
|
|
17
|
+
import {
|
|
18
|
+
apiPost
|
|
19
|
+
} from "./chunk-HREWXNTO.js";
|
|
20
|
+
import {
|
|
21
|
+
registerSchema
|
|
22
|
+
} from "./chunk-WOTDHRNF.js";
|
|
23
|
+
|
|
24
|
+
// src/commands/research/reddit.ts
|
|
25
|
+
import { defineCommand } from "citty";
|
|
26
|
+
var TIMEOUT_MS = 18e4;
|
|
27
|
+
var TEXT_PREVIEW_CHARS = 1500;
|
|
28
|
+
var ITEM_FIELDS = {
|
|
29
|
+
kind: "post or comment",
|
|
30
|
+
subreddit: "Where it was said",
|
|
31
|
+
title: "The post's title (on a comment: the post it answers)",
|
|
32
|
+
text: "Verbatim \u2014 quote this, exactly",
|
|
33
|
+
text_truncated: "The text was cut; re-run with --full before quoting the end of it",
|
|
34
|
+
author: "Reddit username, or null once the account is deleted",
|
|
35
|
+
score: "Points",
|
|
36
|
+
comment_count: "Posts only",
|
|
37
|
+
created: "Date written (UTC)",
|
|
38
|
+
permalink: "Cite THIS link \u2014 it is built from where the words actually are",
|
|
39
|
+
depth: "Thread comments: 0 answers the post, 1 answers a comment",
|
|
40
|
+
source: "reddit_api / reddit_web = live Reddit; archive = the Arctic Shift archive of Reddit"
|
|
41
|
+
};
|
|
42
|
+
registerSchema({
|
|
43
|
+
command: "research.reddit.search",
|
|
44
|
+
description: "Search Reddit posts or comments for the audience's own words. Returns verbatim text with a real permalink for each hit. Start here for voice-of-customer work on Reddit.",
|
|
45
|
+
args: {
|
|
46
|
+
query: {
|
|
47
|
+
type: "string",
|
|
48
|
+
description: "Words to match \u2014 the audience's phrasing, not a description of it",
|
|
49
|
+
required: true
|
|
50
|
+
},
|
|
51
|
+
subreddit: {
|
|
52
|
+
type: "string",
|
|
53
|
+
description: "Subreddits to search (up to 10): comma-separated (couriersofreddit,AmazonFlexUK) or the flag repeated. Needed for --kind comments",
|
|
54
|
+
required: false
|
|
55
|
+
},
|
|
56
|
+
kind: {
|
|
57
|
+
type: "string",
|
|
58
|
+
description: "posts (default) or comments \u2014 the replies are where most of the voice is",
|
|
59
|
+
required: false,
|
|
60
|
+
enum: ["posts", "comments"]
|
|
61
|
+
},
|
|
62
|
+
since: { type: "string", description: "Only things written on or after this day, YYYY-MM-DD", required: false },
|
|
63
|
+
limit: { type: "number", description: "Results to return (1-50, default 25)", required: false },
|
|
64
|
+
full: {
|
|
65
|
+
type: "boolean",
|
|
66
|
+
description: "Return every text whole instead of a preview",
|
|
67
|
+
required: false,
|
|
68
|
+
default: false
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
registerSchema({
|
|
73
|
+
command: "research.reddit.thread",
|
|
74
|
+
description: "Read one Reddit thread verbatim: the post and its best comments, each with its own permalink. Use it on any Reddit link before quoting it \u2014 it also exposes links that point somewhere other than they claim.",
|
|
75
|
+
args: {
|
|
76
|
+
target: {
|
|
77
|
+
type: "string",
|
|
78
|
+
description: "The thread's link (any Reddit form, including share links) or post id",
|
|
79
|
+
required: true
|
|
80
|
+
},
|
|
81
|
+
comments: { type: "number", description: "Comments to return, best first (0-200, default 40)", required: false },
|
|
82
|
+
full: {
|
|
83
|
+
type: "boolean",
|
|
84
|
+
description: "Return every text whole instead of a preview",
|
|
85
|
+
required: false,
|
|
86
|
+
default: false
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
registerSchema({
|
|
91
|
+
command: "research.reddit.subreddits",
|
|
92
|
+
description: "Find the subreddits where an audience talks about a topic, with member counts and whether they can be read. Run it before searching, instead of guessing subreddit names.",
|
|
93
|
+
args: {
|
|
94
|
+
query: { type: "string", description: 'The audience or topic, e.g. "amazon flex uk", "deliveroo"', required: true },
|
|
95
|
+
limit: { type: "number", description: "Subreddits to return (1-25, default 10)", required: false }
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
function searchReddit(body) {
|
|
99
|
+
return apiPost("/api/research/reddit/search", body, { timeoutMs: TIMEOUT_MS });
|
|
100
|
+
}
|
|
101
|
+
function findSubreddits(body) {
|
|
102
|
+
return apiPost("/api/research/reddit/subreddits", body, { timeoutMs: TIMEOUT_MS });
|
|
103
|
+
}
|
|
104
|
+
function row(item, full) {
|
|
105
|
+
const cut = !full && item.text.length > TEXT_PREVIEW_CHARS;
|
|
106
|
+
return {
|
|
107
|
+
kind: item.kind,
|
|
108
|
+
subreddit: item.subreddit,
|
|
109
|
+
title: item.title,
|
|
110
|
+
text: cut ? `${item.text.slice(0, TEXT_PREVIEW_CHARS)}\u2026` : item.text,
|
|
111
|
+
...cut ? { text_truncated: true } : {},
|
|
112
|
+
author: item.author,
|
|
113
|
+
score: item.score,
|
|
114
|
+
...item.kind === "post" ? { comment_count: item.commentCount } : {},
|
|
115
|
+
created: item.createdAt.slice(0, 10),
|
|
116
|
+
permalink: item.permalink,
|
|
117
|
+
...item.depth !== null ? { depth: item.depth } : {}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function redditFix(code) {
|
|
121
|
+
if (code === "NOT_FOUND") return REDDIT_LINK_REJECTED;
|
|
122
|
+
if (code === "BAD_REQUEST" || code === "VALIDATION_ERROR") {
|
|
123
|
+
return { action: "retry_with_changes", explanation: "Follow the message above and run the command again." };
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
action: "continue_without",
|
|
127
|
+
explanation: "Don't loop on it. Finish the job with the other sources, say plainly that Reddit is a gap in this research, and never stand in a summary's paraphrase for a Reddit quote."
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function failValidation(message) {
|
|
131
|
+
writeResearchJson({ ok: false, error: { code: "VALIDATION_ERROR", message, fix: redditFix("VALIDATION_ERROR") } });
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
function subredditsFromArgs(rawArgs, parsed) {
|
|
135
|
+
return repeatedValues(rawArgs, "subreddit", parsed).flatMap((value) => value.split(",")).map((name) => name.trim()).filter(Boolean);
|
|
136
|
+
}
|
|
137
|
+
var searchCommand = defineCommand({
|
|
138
|
+
meta: {
|
|
139
|
+
name: "search",
|
|
140
|
+
description: `Search Reddit for the audience's own words, verbatim, each with a permalink you can cite.
|
|
141
|
+
|
|
142
|
+
Start here for Reddit voice-of-customer. Matches words, not meaning \u2014 search the way the audience writes, and quote a phrase to keep it together ('"right to work"').
|
|
143
|
+
|
|
144
|
+
Examples:
|
|
145
|
+
baker research reddit search "agency never paid" --subreddit couriersofreddit,AmazonFlexUK
|
|
146
|
+
baker research reddit search '"right to work"' --subreddit UKJobs,AmazonFlexUK
|
|
147
|
+
baker research reddit search "visa" --subreddit UberEATS --kind comments --since 2025-01-01
|
|
148
|
+
baker research reddit search "side hustle student deliveries"`
|
|
149
|
+
},
|
|
150
|
+
args: {
|
|
151
|
+
query: { type: "positional", description: "Words to match", required: false },
|
|
152
|
+
subreddit: {
|
|
153
|
+
type: "string",
|
|
154
|
+
description: "Subreddits (up to 10): comma-separated, or repeat the flag",
|
|
155
|
+
required: false
|
|
156
|
+
},
|
|
157
|
+
kind: { type: "string", description: "posts (default) or comments", required: false },
|
|
158
|
+
since: { type: "string", description: "YYYY-MM-DD", required: false },
|
|
159
|
+
limit: { type: "string", description: "1-50, default 25", required: false },
|
|
160
|
+
full: { type: "boolean", description: "Whole texts, not previews", required: false }
|
|
161
|
+
},
|
|
162
|
+
run: async ({ args, rawArgs }) => {
|
|
163
|
+
const query = args.query?.trim();
|
|
164
|
+
if (!query) failValidation('Say what to search for: baker research reddit search "<words>"');
|
|
165
|
+
const kind = args.kind ?? "posts";
|
|
166
|
+
if (kind !== "posts" && kind !== "comments") failValidation("--kind must be posts or comments");
|
|
167
|
+
const body = {
|
|
168
|
+
query,
|
|
169
|
+
kind,
|
|
170
|
+
subreddits: subredditsFromArgs(rawArgs, args.subreddit)
|
|
171
|
+
};
|
|
172
|
+
if (args.since) body.since = args.since;
|
|
173
|
+
if (args.limit) body.limit = Number(args.limit);
|
|
174
|
+
try {
|
|
175
|
+
const data = await searchReddit(body);
|
|
176
|
+
writeResearchJson({
|
|
177
|
+
ok: true,
|
|
178
|
+
data: data.results.map((item) => row(item, Boolean(args.full))),
|
|
179
|
+
source: data.source,
|
|
180
|
+
fields: ITEM_FIELDS,
|
|
181
|
+
hints: redditSearchHints({ resultCount: data.results.length, kind, source: data.source })
|
|
182
|
+
});
|
|
183
|
+
} catch (err) {
|
|
184
|
+
handleResearchError(err, redditFix);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
var threadCommand = defineCommand({
|
|
189
|
+
meta: {
|
|
190
|
+
name: "thread",
|
|
191
|
+
description: `Read one Reddit thread verbatim \u2014 the post and its best comments, each with its own permalink.
|
|
192
|
+
|
|
193
|
+
Run it on every Reddit link before you quote from it, including links a research summary gave you: it refuses a link whose post is somewhere other than the link claims.
|
|
194
|
+
|
|
195
|
+
Examples:
|
|
196
|
+
baker research reddit thread "https://www.reddit.com/r/AmazonFlexUK/comments/1abc2de/agency_still_hasnt_paid_me/"
|
|
197
|
+
baker research reddit thread "https://www.reddit.com/r/UberEATS/s/3TzXiyxaMD" --comments 100
|
|
198
|
+
baker research reddit thread 1abc2de --full`
|
|
199
|
+
},
|
|
200
|
+
args: {
|
|
201
|
+
target: { type: "positional", description: "Thread link or post id", required: false },
|
|
202
|
+
comments: { type: "string", description: "0-200, default 40", required: false },
|
|
203
|
+
full: { type: "boolean", description: "Whole texts, not previews", required: false }
|
|
204
|
+
},
|
|
205
|
+
run: async ({ args }) => {
|
|
206
|
+
const target = args.target?.trim();
|
|
207
|
+
if (!target) failValidation("Pass the thread's link or post id: baker research reddit thread <url>");
|
|
208
|
+
const commentsAsked = args.comments ? Number(args.comments) : RESEARCH_REDDIT_THREAD_DEFAULT_COMMENTS;
|
|
209
|
+
const body = { target, comments: commentsAsked };
|
|
210
|
+
try {
|
|
211
|
+
const data = await apiPost("/api/research/reddit/thread", body, {
|
|
212
|
+
timeoutMs: TIMEOUT_MS
|
|
213
|
+
});
|
|
214
|
+
const full = Boolean(args.full);
|
|
215
|
+
writeResearchJson({
|
|
216
|
+
ok: true,
|
|
217
|
+
data: { post: row(data.post, full), comments: data.comments.map((item) => row(item, full)) },
|
|
218
|
+
source: data.source,
|
|
219
|
+
fields: ITEM_FIELDS,
|
|
220
|
+
hints: redditThreadHints({
|
|
221
|
+
commentsShown: data.comments.length,
|
|
222
|
+
commentsAsked,
|
|
223
|
+
commentCount: data.post.commentCount,
|
|
224
|
+
source: data.source
|
|
225
|
+
})
|
|
226
|
+
});
|
|
227
|
+
} catch (err) {
|
|
228
|
+
handleResearchError(err, redditFix);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
var subredditsCommand = defineCommand({
|
|
233
|
+
meta: {
|
|
234
|
+
name: "subreddits",
|
|
235
|
+
description: `Find the subreddits where an audience talks \u2014 name, members, and whether it can be read.
|
|
236
|
+
|
|
237
|
+
Run it before \`reddit search\` instead of guessing names: a plausible-sounding subreddit can be dead (r/CouriersUK has one post), while the conversation sits in r/AmazonFlexUK or r/deliveroos.
|
|
238
|
+
|
|
239
|
+
Examples:
|
|
240
|
+
baker research reddit subreddits "amazon flex uk"
|
|
241
|
+
baker research reddit subreddits "deliveroo" --limit 5`
|
|
242
|
+
},
|
|
243
|
+
args: {
|
|
244
|
+
query: { type: "positional", description: "Audience or topic", required: false },
|
|
245
|
+
limit: { type: "string", description: "1-25, default 10", required: false }
|
|
246
|
+
},
|
|
247
|
+
run: async ({ args }) => {
|
|
248
|
+
const query = args.query?.trim();
|
|
249
|
+
if (!query) failValidation('Say what to look for: baker research reddit subreddits "<audience or topic>"');
|
|
250
|
+
const body = { query };
|
|
251
|
+
if (args.limit) body.limit = Number(args.limit);
|
|
252
|
+
try {
|
|
253
|
+
const data = await findSubreddits(body);
|
|
254
|
+
writeResearchJson({
|
|
255
|
+
ok: true,
|
|
256
|
+
data: data.results,
|
|
257
|
+
source: data.source,
|
|
258
|
+
fields: {
|
|
259
|
+
name: "Pass this to --subreddit",
|
|
260
|
+
subscribers: "Members \u2014 size, not activity",
|
|
261
|
+
access: "public / restricted (readable, members post) / private (unreadable) / null when the source doesn't say",
|
|
262
|
+
description: "The subreddit's own summary",
|
|
263
|
+
url: "The subreddit"
|
|
264
|
+
},
|
|
265
|
+
hints: redditSubredditsHints({ resultCount: data.results.length })
|
|
266
|
+
});
|
|
267
|
+
} catch (err) {
|
|
268
|
+
handleResearchError(err, redditFix);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
var redditCommand = defineCommand({
|
|
273
|
+
meta: {
|
|
274
|
+
name: "reddit",
|
|
275
|
+
description: `Read Reddit verbatim \u2014 the one site no page reader will open for us.
|
|
276
|
+
|
|
277
|
+
Commands:
|
|
278
|
+
subreddits \u2014 Find where the audience talks (start here)
|
|
279
|
+
search \u2014 Find posts or comments in the audience's own words
|
|
280
|
+
thread \u2014 Read one thread: the post and its best comments
|
|
281
|
+
|
|
282
|
+
Examples:
|
|
283
|
+
baker research reddit subreddits "amazon flex uk"
|
|
284
|
+
baker research reddit search "agency never paid" --subreddit couriersofreddit,AmazonFlexUK --kind comments
|
|
285
|
+
baker research reddit thread "https://www.reddit.com/r/AmazonFlexUK/comments/1abc2de/"
|
|
286
|
+
Full guide: __tooling__/docs/tools/baker/research.md`
|
|
287
|
+
},
|
|
288
|
+
subCommands: { subreddits: subredditsCommand, search: searchCommand, thread: threadCommand }
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
export {
|
|
292
|
+
searchReddit,
|
|
293
|
+
findSubreddits,
|
|
294
|
+
subredditsFromArgs,
|
|
295
|
+
redditCommand
|
|
296
|
+
};
|
|
297
|
+
//# sourceMappingURL=chunk-LERWCRY5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/research/reddit.ts"],"sourcesContent":["import {\n RESEARCH_REDDIT_THREAD_DEFAULT_COMMENTS,\n type ResearchRedditItem,\n type ResearchRedditSearchRequest,\n type ResearchRedditSearchResponse,\n type ResearchRedditSubredditsRequest,\n type ResearchRedditSubredditsResponse,\n type ResearchRedditThreadRequest,\n type ResearchRedditThreadResponse,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { repeatedValues } from \"../../lib/repeatedFlags.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { REDDIT_LINK_REJECTED, redditSearchHints, redditSubredditsHints, redditThreadHints } from \"./hints.ts\";\nimport { handleResearchError, type ResearchFix, writeResearchJson } from \"./output.ts\";\n\n/**\n * Up to three sources may be asked in turn, and the archive waits out its own\n * rate limit before giving up — so a read can legitimately take a minute.\n */\nconst TIMEOUT_MS = 180_000;\n\n/** Long enough for almost every comment; a longer one says it was cut, so a partial quote is never mistaken for a whole one. */\nconst TEXT_PREVIEW_CHARS = 1_500;\n\nconst ITEM_FIELDS: Record<string, string> = {\n kind: \"post or comment\",\n subreddit: \"Where it was said\",\n title: \"The post's title (on a comment: the post it answers)\",\n text: \"Verbatim — quote this, exactly\",\n text_truncated: \"The text was cut; re-run with --full before quoting the end of it\",\n author: \"Reddit username, or null once the account is deleted\",\n score: \"Points\",\n comment_count: \"Posts only\",\n created: \"Date written (UTC)\",\n permalink: \"Cite THIS link — it is built from where the words actually are\",\n depth: \"Thread comments: 0 answers the post, 1 answers a comment\",\n source: \"reddit_api / reddit_web = live Reddit; archive = the Arctic Shift archive of Reddit\",\n};\n\nregisterSchema({\n command: \"research.reddit.search\",\n description:\n \"Search Reddit posts or comments for the audience's own words. Returns verbatim text with a real permalink for each hit. Start here for voice-of-customer work on Reddit.\",\n args: {\n query: {\n type: \"string\",\n description: \"Words to match — the audience's phrasing, not a description of it\",\n required: true,\n },\n subreddit: {\n type: \"string\",\n description:\n \"Subreddits to search (up to 10): comma-separated (couriersofreddit,AmazonFlexUK) or the flag repeated. Needed for --kind comments\",\n required: false,\n },\n kind: {\n type: \"string\",\n description: \"posts (default) or comments — the replies are where most of the voice is\",\n required: false,\n enum: [\"posts\", \"comments\"],\n },\n since: { type: \"string\", description: \"Only things written on or after this day, YYYY-MM-DD\", required: false },\n limit: { type: \"number\", description: \"Results to return (1-50, default 25)\", required: false },\n full: {\n type: \"boolean\",\n description: \"Return every text whole instead of a preview\",\n required: false,\n default: false,\n },\n },\n});\n\nregisterSchema({\n command: \"research.reddit.thread\",\n description:\n \"Read one Reddit thread verbatim: the post and its best comments, each with its own permalink. Use it on any Reddit link before quoting it — it also exposes links that point somewhere other than they claim.\",\n args: {\n target: {\n type: \"string\",\n description: \"The thread's link (any Reddit form, including share links) or post id\",\n required: true,\n },\n comments: { type: \"number\", description: \"Comments to return, best first (0-200, default 40)\", required: false },\n full: {\n type: \"boolean\",\n description: \"Return every text whole instead of a preview\",\n required: false,\n default: false,\n },\n },\n});\n\nregisterSchema({\n command: \"research.reddit.subreddits\",\n description:\n \"Find the subreddits where an audience talks about a topic, with member counts and whether they can be read. Run it before searching, instead of guessing subreddit names.\",\n args: {\n query: { type: \"string\", description: 'The audience or topic, e.g. \"amazon flex uk\", \"deliveroo\"', required: true },\n limit: { type: \"number\", description: \"Subreddits to return (1-25, default 10)\", required: false },\n },\n});\n\n/** One Reddit search, as `reddit search` and `research customers` both ask it. */\nexport function searchReddit(body: ResearchRedditSearchRequest): Promise<ResearchRedditSearchResponse> {\n return apiPost<ResearchRedditSearchResponse>(\"/api/research/reddit/search\", body, { timeoutMs: TIMEOUT_MS });\n}\n\n/** Where an audience talks, as `reddit subreddits` and `research customers` both ask it. */\nexport function findSubreddits(body: ResearchRedditSubredditsRequest): Promise<ResearchRedditSubredditsResponse> {\n return apiPost<ResearchRedditSubredditsResponse>(\"/api/research/reddit/subreddits\", body, { timeoutMs: TIMEOUT_MS });\n}\n\nfunction row(item: ResearchRedditItem, full: boolean) {\n const cut = !full && item.text.length > TEXT_PREVIEW_CHARS;\n return {\n kind: item.kind,\n subreddit: item.subreddit,\n title: item.title,\n text: cut ? `${item.text.slice(0, TEXT_PREVIEW_CHARS)}…` : item.text,\n ...(cut ? { text_truncated: true } : {}),\n author: item.author,\n score: item.score,\n ...(item.kind === \"post\" ? { comment_count: item.commentCount } : {}),\n created: item.createdAt.slice(0, 10),\n permalink: item.permalink,\n ...(item.depth !== null ? { depth: item.depth } : {}),\n };\n}\n\n/**\n * The failures split three ways, and the split is the whole point: a link that\n * leads nowhere real must never be quoted, a question asked the wrong way should\n * be asked again, and a Reddit nobody will serve today is a named gap, not a\n * reason to stop the job.\n */\nfunction redditFix(code: string): ResearchFix {\n if (code === \"NOT_FOUND\") return REDDIT_LINK_REJECTED;\n if (code === \"BAD_REQUEST\" || code === \"VALIDATION_ERROR\") {\n return { action: \"retry_with_changes\", explanation: \"Follow the message above and run the command again.\" };\n }\n return {\n action: \"continue_without\",\n explanation:\n \"Don't loop on it. Finish the job with the other sources, say plainly that Reddit is a gap in this research, and never stand in a summary's paraphrase for a Reddit quote.\",\n };\n}\n\nfunction failValidation(message: string): never {\n writeResearchJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message, fix: redditFix(\"VALIDATION_ERROR\") } });\n process.exit(1);\n}\n\n/** `--subreddit a,b` and `--subreddit a --subreddit b` both name every subreddit given. */\nexport function subredditsFromArgs(rawArgs: readonly string[] | undefined, parsed: unknown): string[] {\n return repeatedValues(rawArgs, \"subreddit\", parsed)\n .flatMap((value) => value.split(\",\"))\n .map((name) => name.trim())\n .filter(Boolean);\n}\n\nconst searchCommand = defineCommand({\n meta: {\n name: \"search\",\n description: `Search Reddit for the audience's own words, verbatim, each with a permalink you can cite.\n\nStart here for Reddit voice-of-customer. Matches words, not meaning — search the way the audience writes, and quote a phrase to keep it together ('\"right to work\"').\n\nExamples:\n baker research reddit search \"agency never paid\" --subreddit couriersofreddit,AmazonFlexUK\n baker research reddit search '\"right to work\"' --subreddit UKJobs,AmazonFlexUK\n baker research reddit search \"visa\" --subreddit UberEATS --kind comments --since 2025-01-01\n baker research reddit search \"side hustle student deliveries\"`,\n },\n args: {\n query: { type: \"positional\", description: \"Words to match\", required: false },\n subreddit: {\n type: \"string\",\n description: \"Subreddits (up to 10): comma-separated, or repeat the flag\",\n required: false,\n },\n kind: { type: \"string\", description: \"posts (default) or comments\", required: false },\n since: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n limit: { type: \"string\", description: \"1-50, default 25\", required: false },\n full: { type: \"boolean\", description: \"Whole texts, not previews\", required: false },\n },\n run: async ({ args, rawArgs }) => {\n const query = (args.query as string | undefined)?.trim();\n if (!query) failValidation('Say what to search for: baker research reddit search \"<words>\"');\n const kind = (args.kind as string | undefined) ?? \"posts\";\n if (kind !== \"posts\" && kind !== \"comments\") failValidation(\"--kind must be posts or comments\");\n\n const body: ResearchRedditSearchRequest = {\n query,\n kind,\n subreddits: subredditsFromArgs(rawArgs, args.subreddit),\n };\n if (args.since) body.since = args.since as string;\n if (args.limit) body.limit = Number(args.limit);\n\n try {\n const data = await searchReddit(body);\n writeResearchJson({\n ok: true,\n data: data.results.map((item) => row(item, Boolean(args.full))),\n source: data.source,\n fields: ITEM_FIELDS,\n hints: redditSearchHints({ resultCount: data.results.length, kind, source: data.source }),\n });\n } catch (err) {\n handleResearchError(err, redditFix);\n }\n },\n});\n\nconst threadCommand = defineCommand({\n meta: {\n name: \"thread\",\n description: `Read one Reddit thread verbatim — the post and its best comments, each with its own permalink.\n\nRun it on every Reddit link before you quote from it, including links a research summary gave you: it refuses a link whose post is somewhere other than the link claims.\n\nExamples:\n baker research reddit thread \"https://www.reddit.com/r/AmazonFlexUK/comments/1abc2de/agency_still_hasnt_paid_me/\"\n baker research reddit thread \"https://www.reddit.com/r/UberEATS/s/3TzXiyxaMD\" --comments 100\n baker research reddit thread 1abc2de --full`,\n },\n args: {\n target: { type: \"positional\", description: \"Thread link or post id\", required: false },\n comments: { type: \"string\", description: \"0-200, default 40\", required: false },\n full: { type: \"boolean\", description: \"Whole texts, not previews\", required: false },\n },\n run: async ({ args }) => {\n const target = (args.target as string | undefined)?.trim();\n if (!target) failValidation(\"Pass the thread's link or post id: baker research reddit thread <url>\");\n\n const commentsAsked = args.comments ? Number(args.comments) : RESEARCH_REDDIT_THREAD_DEFAULT_COMMENTS;\n const body: ResearchRedditThreadRequest = { target, comments: commentsAsked };\n\n try {\n const data = await apiPost<ResearchRedditThreadResponse>(\"/api/research/reddit/thread\", body, {\n timeoutMs: TIMEOUT_MS,\n });\n const full = Boolean(args.full);\n writeResearchJson({\n ok: true,\n data: { post: row(data.post, full), comments: data.comments.map((item) => row(item, full)) },\n source: data.source,\n fields: ITEM_FIELDS,\n hints: redditThreadHints({\n commentsShown: data.comments.length,\n commentsAsked,\n commentCount: data.post.commentCount,\n source: data.source,\n }),\n });\n } catch (err) {\n handleResearchError(err, redditFix);\n }\n },\n});\n\nconst subredditsCommand = defineCommand({\n meta: {\n name: \"subreddits\",\n description: `Find the subreddits where an audience talks — name, members, and whether it can be read.\n\nRun it before \\`reddit search\\` instead of guessing names: a plausible-sounding subreddit can be dead (r/CouriersUK has one post), while the conversation sits in r/AmazonFlexUK or r/deliveroos.\n\nExamples:\n baker research reddit subreddits \"amazon flex uk\"\n baker research reddit subreddits \"deliveroo\" --limit 5`,\n },\n args: {\n query: { type: \"positional\", description: \"Audience or topic\", required: false },\n limit: { type: \"string\", description: \"1-25, default 10\", required: false },\n },\n run: async ({ args }) => {\n const query = (args.query as string | undefined)?.trim();\n if (!query) failValidation('Say what to look for: baker research reddit subreddits \"<audience or topic>\"');\n const body: ResearchRedditSubredditsRequest = { query };\n if (args.limit) body.limit = Number(args.limit);\n\n try {\n const data = await findSubreddits(body);\n writeResearchJson({\n ok: true,\n data: data.results,\n source: data.source,\n fields: {\n name: \"Pass this to --subreddit\",\n subscribers: \"Members — size, not activity\",\n access:\n \"public / restricted (readable, members post) / private (unreadable) / null when the source doesn't say\",\n description: \"The subreddit's own summary\",\n url: \"The subreddit\",\n },\n hints: redditSubredditsHints({ resultCount: data.results.length }),\n });\n } catch (err) {\n handleResearchError(err, redditFix);\n }\n },\n});\n\nexport const redditCommand = defineCommand({\n meta: {\n name: \"reddit\",\n description: `Read Reddit verbatim — the one site no page reader will open for us.\n\nCommands:\n subreddits — Find where the audience talks (start here)\n search — Find posts or comments in the audience's own words\n thread — Read one thread: the post and its best comments\n\nExamples:\n baker research reddit subreddits \"amazon flex uk\"\n baker research reddit search \"agency never paid\" --subreddit couriersofreddit,AmazonFlexUK --kind comments\n baker research reddit thread \"https://www.reddit.com/r/AmazonFlexUK/comments/1abc2de/\"\nFull guide: __tooling__/docs/tools/baker/research.md`,\n },\n subCommands: { subreddits: subredditsCommand, search: searchCommand, thread: threadCommand },\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// src/commands/ads/x/error-parser.ts
|
|
2
|
+
function mapXErrorCode(message) {
|
|
3
|
+
if (/UNAUTHORIZED_ACCESS|authentication/i.test(message)) return "AUTH_ERROR";
|
|
4
|
+
if (/UNAUTHORIZED_CLIENT_APPLICATION/i.test(message)) return "PERMISSION_DENIED";
|
|
5
|
+
if (/ACCOUNT_NOT_FOUND|NOT_FOUND/i.test(message)) return "ACCOUNT_NOT_FOUND";
|
|
6
|
+
if (/CAMPAIGN_NOT_FOUND/i.test(message)) return "CAMPAIGN_NOT_FOUND";
|
|
7
|
+
if (/LINE_ITEM_NOT_FOUND/i.test(message)) return "LINE_ITEM_NOT_FOUND";
|
|
8
|
+
if (/MEDIA_NOT_FOUND|TWEET_NOT_FOUND|TAILORED_AUDIENCE_NOT_FOUND/i.test(message)) return "RESOURCE_NOT_FOUND";
|
|
9
|
+
if (/TOO_MANY_REQUESTS|TWEET_RATE_LIMIT_EXCEEDED|rate.*limit/i.test(message)) return "QUOTA_EXCEEDED";
|
|
10
|
+
if (/SPEND_EXCEEDS_BUDGET/i.test(message)) return "BUDGET_EXCEEDED";
|
|
11
|
+
if (/INVALID_PARAMETER|MISSING_PARAMETER|EXCLUSIVE_PARAMETERS|INCLUSIVE_PARAMETERS/i.test(message))
|
|
12
|
+
return "INVALID_PARAMETER";
|
|
13
|
+
if (/SERVICE_UNAVAILABLE|OVER_CAPACITY|INTERNAL_ERROR/i.test(message)) return "SERVICE_UNAVAILABLE";
|
|
14
|
+
if (/CANCELLED_REQUEST|timeout|DEADLINE_EXCEEDED/i.test(message)) return "TIMEOUT";
|
|
15
|
+
return "API_ERROR";
|
|
16
|
+
}
|
|
17
|
+
function isRetryable(code) {
|
|
18
|
+
return code === "QUOTA_EXCEEDED" || code === "TIMEOUT" || code === "SERVICE_UNAVAILABLE";
|
|
19
|
+
}
|
|
20
|
+
function getRetryDelay(code) {
|
|
21
|
+
if (code === "QUOTA_EXCEEDED") return 6e4;
|
|
22
|
+
if (code === "SERVICE_UNAVAILABLE") return 15e3;
|
|
23
|
+
if (code === "TIMEOUT") return 5e3;
|
|
24
|
+
return void 0;
|
|
25
|
+
}
|
|
26
|
+
function parseXApiError(errorMessage, accountId) {
|
|
27
|
+
const code = mapXErrorCode(errorMessage);
|
|
28
|
+
return {
|
|
29
|
+
ok: false,
|
|
30
|
+
error: {
|
|
31
|
+
code,
|
|
32
|
+
message: errorMessage,
|
|
33
|
+
fix: {
|
|
34
|
+
action: code === "AUTH_ERROR" ? "authenticate" : code === "PERMISSION_DENIED" ? "authenticate" : isRetryable(code) ? "wait_and_retry" : "reject",
|
|
35
|
+
explanation: explainFix(code, accountId, errorMessage)
|
|
36
|
+
},
|
|
37
|
+
retryable: isRetryable(code),
|
|
38
|
+
retryAfterMs: getRetryDelay(code)
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function explainFix(code, accountId, message) {
|
|
43
|
+
switch (code) {
|
|
44
|
+
case "AUTH_ERROR":
|
|
45
|
+
return "Token rejected by X. Reconnect the X Ads provider in Baker dashboard settings.";
|
|
46
|
+
case "PERMISSION_DENIED":
|
|
47
|
+
return "App not authorized for this resource. Verify Ads API access at ads.x.com/help and reconnect the provider.";
|
|
48
|
+
case "ACCOUNT_NOT_FOUND":
|
|
49
|
+
return `Account ${accountId} not accessible. Run 'baker ads x accounts' to list visible accounts.`;
|
|
50
|
+
case "QUOTA_EXCEEDED":
|
|
51
|
+
return "X Ads rate limit exceeded. Wait until the x-rate-limit-reset window passes and retry.";
|
|
52
|
+
case "INVALID_PARAMETER":
|
|
53
|
+
return `Invalid parameter sent to X Ads API: ${message}`;
|
|
54
|
+
case "BUDGET_EXCEEDED":
|
|
55
|
+
return "Spend exceeds available budget on the funding instrument.";
|
|
56
|
+
case "SERVICE_UNAVAILABLE":
|
|
57
|
+
return "X Ads API is temporarily unavailable. Retry after a short backoff.";
|
|
58
|
+
default:
|
|
59
|
+
return `Unrecognized X Ads error \u2014 verify request shape against X Ads API docs (${code}).`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export {
|
|
64
|
+
parseXApiError
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=chunk-M6UNISGO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/x/error-parser.ts"],"sourcesContent":["import type { AdsErrorEnvelope } from \"../types.ts\";\n\nfunction mapXErrorCode(message: string): string {\n if (/UNAUTHORIZED_ACCESS|authentication/i.test(message)) return \"AUTH_ERROR\";\n if (/UNAUTHORIZED_CLIENT_APPLICATION/i.test(message)) return \"PERMISSION_DENIED\";\n if (/ACCOUNT_NOT_FOUND|NOT_FOUND/i.test(message)) return \"ACCOUNT_NOT_FOUND\";\n if (/CAMPAIGN_NOT_FOUND/i.test(message)) return \"CAMPAIGN_NOT_FOUND\";\n if (/LINE_ITEM_NOT_FOUND/i.test(message)) return \"LINE_ITEM_NOT_FOUND\";\n if (/MEDIA_NOT_FOUND|TWEET_NOT_FOUND|TAILORED_AUDIENCE_NOT_FOUND/i.test(message)) return \"RESOURCE_NOT_FOUND\";\n if (/TOO_MANY_REQUESTS|TWEET_RATE_LIMIT_EXCEEDED|rate.*limit/i.test(message)) return \"QUOTA_EXCEEDED\";\n if (/SPEND_EXCEEDS_BUDGET/i.test(message)) return \"BUDGET_EXCEEDED\";\n if (/INVALID_PARAMETER|MISSING_PARAMETER|EXCLUSIVE_PARAMETERS|INCLUSIVE_PARAMETERS/i.test(message))\n return \"INVALID_PARAMETER\";\n if (/SERVICE_UNAVAILABLE|OVER_CAPACITY|INTERNAL_ERROR/i.test(message)) return \"SERVICE_UNAVAILABLE\";\n if (/CANCELLED_REQUEST|timeout|DEADLINE_EXCEEDED/i.test(message)) return \"TIMEOUT\";\n return \"API_ERROR\";\n}\n\nfunction isRetryable(code: string): boolean {\n return code === \"QUOTA_EXCEEDED\" || code === \"TIMEOUT\" || code === \"SERVICE_UNAVAILABLE\";\n}\n\nfunction getRetryDelay(code: string): number | undefined {\n if (code === \"QUOTA_EXCEEDED\") return 60_000;\n if (code === \"SERVICE_UNAVAILABLE\") return 15_000;\n if (code === \"TIMEOUT\") return 5_000;\n return undefined;\n}\n\nexport function parseXApiError(errorMessage: string, accountId: string): AdsErrorEnvelope {\n const code = mapXErrorCode(errorMessage);\n return {\n ok: false,\n error: {\n code,\n message: errorMessage,\n fix: {\n action:\n code === \"AUTH_ERROR\"\n ? \"authenticate\"\n : code === \"PERMISSION_DENIED\"\n ? \"authenticate\"\n : isRetryable(code)\n ? \"wait_and_retry\"\n : \"reject\",\n explanation: explainFix(code, accountId, errorMessage),\n },\n retryable: isRetryable(code),\n retryAfterMs: getRetryDelay(code),\n },\n };\n}\n\nfunction explainFix(code: string, accountId: string, message: string): string {\n switch (code) {\n case \"AUTH_ERROR\":\n return \"Token rejected by X. Reconnect the X Ads provider in Baker dashboard settings.\";\n case \"PERMISSION_DENIED\":\n return \"App not authorized for this resource. Verify Ads API access at ads.x.com/help and reconnect the provider.\";\n case \"ACCOUNT_NOT_FOUND\":\n return `Account ${accountId} not accessible. Run 'baker ads x accounts' to list visible accounts.`;\n case \"QUOTA_EXCEEDED\":\n return \"X Ads rate limit exceeded. Wait until the x-rate-limit-reset window passes and retry.\";\n case \"INVALID_PARAMETER\":\n return `Invalid parameter sent to X Ads API: ${message}`;\n case \"BUDGET_EXCEEDED\":\n return \"Spend exceeds available budget on the funding instrument.\";\n case \"SERVICE_UNAVAILABLE\":\n return \"X Ads API is temporarily unavailable. Retry after a short backoff.\";\n default:\n return `Unrecognized X Ads error — verify request shape against X Ads API docs (${code}).`;\n }\n}\n"],"mappings":";AAEA,SAAS,cAAc,SAAyB;AAC9C,MAAI,sCAAsC,KAAK,OAAO,EAAG,QAAO;AAChE,MAAI,mCAAmC,KAAK,OAAO,EAAG,QAAO;AAC7D,MAAI,+BAA+B,KAAK,OAAO,EAAG,QAAO;AACzD,MAAI,sBAAsB,KAAK,OAAO,EAAG,QAAO;AAChD,MAAI,uBAAuB,KAAK,OAAO,EAAG,QAAO;AACjD,MAAI,+DAA+D,KAAK,OAAO,EAAG,QAAO;AACzF,MAAI,2DAA2D,KAAK,OAAO,EAAG,QAAO;AACrF,MAAI,wBAAwB,KAAK,OAAO,EAAG,QAAO;AAClD,MAAI,iFAAiF,KAAK,OAAO;AAC/F,WAAO;AACT,MAAI,oDAAoD,KAAK,OAAO,EAAG,QAAO;AAC9E,MAAI,+CAA+C,KAAK,OAAO,EAAG,QAAO;AACzE,SAAO;AACT;AAEA,SAAS,YAAY,MAAuB;AAC1C,SAAO,SAAS,oBAAoB,SAAS,aAAa,SAAS;AACrE;AAEA,SAAS,cAAc,MAAkC;AACvD,MAAI,SAAS,iBAAkB,QAAO;AACtC,MAAI,SAAS,sBAAuB,QAAO;AAC3C,MAAI,SAAS,UAAW,QAAO;AAC/B,SAAO;AACT;AAEO,SAAS,eAAe,cAAsB,WAAqC;AACxF,QAAM,OAAO,cAAc,YAAY;AACvC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,KAAK;AAAA,QACH,QACE,SAAS,eACL,iBACA,SAAS,sBACP,iBACA,YAAY,IAAI,IACd,mBACA;AAAA,QACV,aAAa,WAAW,MAAM,WAAW,YAAY;AAAA,MACvD;AAAA,MACA,WAAW,YAAY,IAAI;AAAA,MAC3B,cAAc,cAAc,IAAI;AAAA,IAClC;AAAA,EACF;AACF;AAEA,SAAS,WAAW,MAAc,WAAmB,SAAyB;AAC5E,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,WAAW,SAAS;AAAA,IAC7B,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,wCAAwC,OAAO;AAAA,IACxD,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,gFAA2E,IAAI;AAAA,EAC1F;AACF;","names":[]}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import {
|
|
2
|
+
openRouterKey
|
|
3
|
+
} from "./chunk-O6QKCJE4.js";
|
|
4
|
+
|
|
5
|
+
// src/engine/nodes/local/lib/jev.ts
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
var JEV_MODEL = "typesafe/jev-1.13";
|
|
8
|
+
var ENDPOINT = "https://openrouter.ai/api/v1/systemone";
|
|
9
|
+
var TIMEOUT_MS = 2500;
|
|
10
|
+
var Reply = z.object({
|
|
11
|
+
answers: z.record(z.string(), z.object({ noul: z.number() })),
|
|
12
|
+
usage: z.object({ cost: z.number() }).optional()
|
|
13
|
+
});
|
|
14
|
+
var Answer = z.union([
|
|
15
|
+
z.object({ choice: z.string(), probabilities: z.record(z.string(), z.number()), confidence: z.number() }),
|
|
16
|
+
z.object({ noul: z.number() })
|
|
17
|
+
]);
|
|
18
|
+
var AnswersReply = z.object({
|
|
19
|
+
answers: z.record(z.string(), z.unknown()),
|
|
20
|
+
usage: z.object({ cost: z.number() }).optional()
|
|
21
|
+
});
|
|
22
|
+
function readAnswers(body, ids) {
|
|
23
|
+
const parsed = AnswersReply.safeParse(body);
|
|
24
|
+
if (!parsed.success) return null;
|
|
25
|
+
const answers = [];
|
|
26
|
+
for (const id of ids) {
|
|
27
|
+
const answer = Answer.safeParse(parsed.data.answers[id]);
|
|
28
|
+
if (!answer.success) return null;
|
|
29
|
+
answers.push(
|
|
30
|
+
"choice" in answer.data ? { choice: answer.data.choice, probabilities: answer.data.probabilities, confidence: answer.data.confidence } : { noul: answer.data.noul }
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
return { answers, costUsd: parsed.data.usage?.cost ?? 0 };
|
|
34
|
+
}
|
|
35
|
+
async function askJevQuestions(questions, onSpend) {
|
|
36
|
+
const key = openRouterKey();
|
|
37
|
+
if (questions.length === 0) return [];
|
|
38
|
+
if (!key) return null;
|
|
39
|
+
const ids = questions.map((_, i) => `q${i}`);
|
|
40
|
+
try {
|
|
41
|
+
const response = await fetch(ENDPOINT, {
|
|
42
|
+
method: "POST",
|
|
43
|
+
headers: { authorization: `Bearer ${key}`, "content-type": "application/json" },
|
|
44
|
+
body: JSON.stringify({
|
|
45
|
+
model: JEV_MODEL,
|
|
46
|
+
state: {},
|
|
47
|
+
questions: Object.fromEntries(questions.map((q, i) => [ids[i], q]))
|
|
48
|
+
}),
|
|
49
|
+
signal: AbortSignal.timeout(TIMEOUT_MS)
|
|
50
|
+
});
|
|
51
|
+
if (!response.ok) return null;
|
|
52
|
+
const read = readAnswers(await response.json(), ids);
|
|
53
|
+
if (!read) return null;
|
|
54
|
+
onSpend?.({ model: JEV_MODEL, inputTokens: 0, outputTokens: 0, costUsd: read.costUsd });
|
|
55
|
+
return read.answers;
|
|
56
|
+
} catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function askJev(questions, onSpend) {
|
|
61
|
+
const answers = await askJevQuestions(
|
|
62
|
+
questions.map((q) => ({ type: "noul", instructions: q.instructions })),
|
|
63
|
+
onSpend
|
|
64
|
+
);
|
|
65
|
+
if (!answers) return null;
|
|
66
|
+
const nouls = answers.flatMap((a) => "noul" in a ? [a.noul] : []);
|
|
67
|
+
return nouls.length === answers.length ? nouls : null;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export {
|
|
71
|
+
JEV_MODEL,
|
|
72
|
+
askJevQuestions,
|
|
73
|
+
askJev
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=chunk-MGKHFGLV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/engine/nodes/local/lib/jev.ts"],"sourcesContent":["/**\n * Jev, the decision model (TypeSafe's, served by OpenRouter at `/api/v1/systemone`): the CLI's\n * one boundary module for it. It reads text and answers typed questions with a probability;\n * it writes nothing. See docs/decision-model.md for when it is the right tool and the call shape.\n */\nimport { z } from \"zod\";\nimport { openRouterKey } from \"../../../../env.ts\";\nimport type { ReviewUsage } from \"./render-review.ts\";\n\n/** Pinned: the thresholds its callers act on were measured against this version. */\nexport const JEV_MODEL = \"typesafe/jev-1.13\";\nconst ENDPOINT = \"https://openrouter.ai/api/v1/systemone\";\n/** Several times its p50 (about 0.3 s): a decision that cannot come back this fast is the caller's fallback. */\nconst TIMEOUT_MS = 2_500;\n\nconst Reply = z.object({\n answers: z.record(z.string(), z.object({ noul: z.number() })),\n usage: z.object({ cost: z.number() }).optional(),\n});\n\n/** Each yes/no answer to `ids`, in order, and the call's cost; null when the reply does not answer them all. Pure. */\nexport function readNouls(body: unknown, ids: readonly string[]): { answers: number[]; costUsd: number } | null {\n const parsed = Reply.safeParse(body);\n if (!parsed.success) return null;\n const answers = ids.map((id) => parsed.data.answers[id]?.noul);\n if (answers.some((a) => a === undefined)) return null;\n return { answers: answers as number[], costUsd: parsed.data.usage?.cost ?? 0 };\n}\n\n/** One question: a yes/no statement (Noul), or one option of `criteria`, keyed by option (Choice). */\nexport type JevQuestion =\n | { type: \"noul\"; instructions: Record<string, string> }\n | { type: \"choice\"; instructions: Record<string, string>; criteria: Record<string, string> };\n\n/** A Noul's probability of yes, or a Choice's pick with the probability of every option. */\nexport type JevAnswer =\n | { noul: number }\n | { choice: string; probabilities: Record<string, number>; confidence: number };\n\nconst Answer = z.union([\n z.object({ choice: z.string(), probabilities: z.record(z.string(), z.number()), confidence: z.number() }),\n z.object({ noul: z.number() }),\n]);\nconst AnswersReply = z.object({\n answers: z.record(z.string(), z.unknown()),\n usage: z.object({ cost: z.number() }).optional(),\n});\n\n/** Each answer to `ids`, in order, and the call's cost; null when the reply does not answer them all. Pure. */\nexport function readAnswers(body: unknown, ids: readonly string[]): { answers: JevAnswer[]; costUsd: number } | null {\n const parsed = AnswersReply.safeParse(body);\n if (!parsed.success) return null;\n const answers: JevAnswer[] = [];\n for (const id of ids) {\n const answer = Answer.safeParse(parsed.data.answers[id]);\n if (!answer.success) return null;\n answers.push(\n \"choice\" in answer.data\n ? { choice: answer.data.choice, probabilities: answer.data.probabilities, confidence: answer.data.confidence }\n : { noul: answer.data.noul },\n );\n }\n return { answers, costUsd: parsed.data.usage?.cost ?? 0 };\n}\n\n/**\n * Every answer, in order (one request, whatever the mix of Nouls and Choices), or null when Jev\n * could not answer: no key, a timeout, an outage. There is no route to fall back to, so the\n * caller decides what null means.\n */\nexport async function askJevQuestions(\n questions: readonly JevQuestion[],\n onSpend?: (usage: ReviewUsage) => void,\n): Promise<JevAnswer[] | null> {\n const key = openRouterKey();\n if (questions.length === 0) return [];\n if (!key) return null;\n const ids = questions.map((_, i) => `q${i}`);\n try {\n const response = await fetch(ENDPOINT, {\n method: \"POST\",\n headers: { authorization: `Bearer ${key}`, \"content-type\": \"application/json\" },\n body: JSON.stringify({\n model: JEV_MODEL,\n state: {},\n questions: Object.fromEntries(questions.map((q, i) => [ids[i], q])),\n }),\n signal: AbortSignal.timeout(TIMEOUT_MS),\n });\n if (!response.ok) return null;\n const read = readAnswers(await response.json(), ids);\n if (!read) return null;\n onSpend?.({ model: JEV_MODEL, inputTokens: 0, outputTokens: 0, costUsd: read.costUsd });\n return read.answers;\n } catch {\n return null;\n }\n}\n\n/**\n * The probability that each statement is true, in order (a Noul each, one request), or null when\n * Jev could not answer: no key, a timeout, an outage. There is no route to fall back to, so the\n * caller decides what null means.\n */\nexport async function askJev(\n questions: ReadonlyArray<{ instructions: Record<string, string> }>,\n onSpend?: (usage: ReviewUsage) => void,\n): Promise<number[] | null> {\n const answers = await askJevQuestions(\n questions.map((q) => ({ type: \"noul\", instructions: q.instructions })),\n onSpend,\n );\n if (!answers) return null;\n const nouls = answers.flatMap((a) => (\"noul\" in a ? [a.noul] : []));\n return nouls.length === answers.length ? nouls : null;\n}\n"],"mappings":";;;;;AAKA,SAAS,SAAS;AAKX,IAAM,YAAY;AACzB,IAAM,WAAW;AAEjB,IAAM,aAAa;AAEnB,IAAM,QAAQ,EAAE,OAAO;AAAA,EACrB,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AAAA,EAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS;AACjD,CAAC;AAqBD,IAAM,SAAS,EAAE,MAAM;AAAA,EACrB,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,GAAG,YAAY,EAAE,OAAO,EAAE,CAAC;AAAA,EACxG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AACD,IAAM,eAAe,EAAE,OAAO;AAAA,EAC5B,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC;AAAA,EACzC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS;AACjD,CAAC;AAGM,SAAS,YAAY,MAAe,KAA0E;AACnH,QAAM,SAAS,aAAa,UAAU,IAAI;AAC1C,MAAI,CAAC,OAAO,QAAS,QAAO;AAC5B,QAAM,UAAuB,CAAC;AAC9B,aAAW,MAAM,KAAK;AACpB,UAAM,SAAS,OAAO,UAAU,OAAO,KAAK,QAAQ,EAAE,CAAC;AACvD,QAAI,CAAC,OAAO,QAAS,QAAO;AAC5B,YAAQ;AAAA,MACN,YAAY,OAAO,OACf,EAAE,QAAQ,OAAO,KAAK,QAAQ,eAAe,OAAO,KAAK,eAAe,YAAY,OAAO,KAAK,WAAW,IAC3G,EAAE,MAAM,OAAO,KAAK,KAAK;AAAA,IAC/B;AAAA,EACF;AACA,SAAO,EAAE,SAAS,SAAS,OAAO,KAAK,OAAO,QAAQ,EAAE;AAC1D;AAOA,eAAsB,gBACpB,WACA,SAC6B;AAC7B,QAAM,MAAM,cAAc;AAC1B,MAAI,UAAU,WAAW,EAAG,QAAO,CAAC;AACpC,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,MAAM,UAAU,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE;AAC3C,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,UAAU;AAAA,MACrC,QAAQ;AAAA,MACR,SAAS,EAAE,eAAe,UAAU,GAAG,IAAI,gBAAgB,mBAAmB;AAAA,MAC9E,MAAM,KAAK,UAAU;AAAA,QACnB,OAAO;AAAA,QACP,OAAO,CAAC;AAAA,QACR,WAAW,OAAO,YAAY,UAAU,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAAA,MACpE,CAAC;AAAA,MACD,QAAQ,YAAY,QAAQ,UAAU;AAAA,IACxC,CAAC;AACD,QAAI,CAAC,SAAS,GAAI,QAAO;AACzB,UAAM,OAAO,YAAY,MAAM,SAAS,KAAK,GAAG,GAAG;AACnD,QAAI,CAAC,KAAM,QAAO;AAClB,cAAU,EAAE,OAAO,WAAW,aAAa,GAAG,cAAc,GAAG,SAAS,KAAK,QAAQ,CAAC;AACtF,WAAO,KAAK;AAAA,EACd,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOA,eAAsB,OACpB,WACA,SAC0B;AAC1B,QAAM,UAAU,MAAM;AAAA,IACpB,UAAU,IAAI,CAAC,OAAO,EAAE,MAAM,QAAQ,cAAc,EAAE,aAAa,EAAE;AAAA,IACrE;AAAA,EACF;AACA,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,QAAQ,QAAQ,QAAQ,CAAC,MAAO,UAAU,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,CAAE;AAClE,SAAO,MAAM,WAAW,QAAQ,SAAS,QAAQ;AACnD;","names":[]}
|