@koda-sl/baker-cli 0.496.0 → 0.497.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -4
- package/dist/account-ZKJFX2GK.js +80 -0
- package/dist/account-ZKJFX2GK.js.map +1 -0
- package/dist/account-users-SZCYHVBM.js +62 -0
- package/dist/account-users-SZCYHVBM.js.map +1 -0
- package/dist/accounts-5DFYKYSM.js +78 -0
- package/dist/accounts-5DFYKYSM.js.map +1 -0
- package/dist/accounts-OGAIQNE6.js +612 -0
- package/dist/accounts-OGAIQNE6.js.map +1 -0
- package/dist/actions-FMNJSOBA.js +55 -0
- package/dist/activecampaign-LYYYH6XD.js +936 -0
- package/dist/activecampaign-LYYYH6XD.js.map +1 -0
- package/dist/add-AOQLZRPC.js +80 -0
- package/dist/add-AOQLZRPC.js.map +1 -0
- package/dist/add-HWXEPSZF.js +105 -0
- package/dist/add-HWXEPSZF.js.map +1 -0
- package/dist/add-VDZPGZF5.js +148 -0
- package/dist/add-VDZPGZF5.js.map +1 -0
- package/dist/add-YYP3O536.js +303 -0
- package/dist/add-YYP3O536.js.map +1 -0
- package/dist/ads-OLXSDPD6.js +40 -0
- package/dist/advertisers-STYAIX72.js +121 -0
- package/dist/advertisers-STYAIX72.js.map +1 -0
- package/dist/analytics-6WBK4VFO.js +1977 -0
- package/dist/analytics-6WBK4VFO.js.map +1 -0
- package/dist/analytics-DHB325DM.js +434 -0
- package/dist/analytics-DHB325DM.js.map +1 -0
- package/dist/assign-BFXHYTMF.js +78 -0
- package/dist/assign-BFXHYTMF.js.map +1 -0
- package/dist/audience-size-XWHZV2GH.js +74 -0
- package/dist/audience-size-XWHZV2GH.js.map +1 -0
- package/dist/audit-IYGRU7LD.js +152 -0
- package/dist/audit-IYGRU7LD.js.map +1 -0
- package/dist/autocomplete-SDDSJTAF.js +112 -0
- package/dist/autocomplete-SDDSJTAF.js.map +1 -0
- package/dist/avatars-I4H3NMEJ.js +38 -0
- package/dist/bid-pricing-OVYBDRMV.js +101 -0
- package/dist/bid-pricing-OVYBDRMV.js.map +1 -0
- package/dist/brand-3V7ECY7D.js +22 -0
- package/dist/brief-U2W7KMFC.js +539 -0
- package/dist/brief-U2W7KMFC.js.map +1 -0
- package/dist/campaign-groups-FJHBVUA3.js +97 -0
- package/dist/campaign-groups-FJHBVUA3.js.map +1 -0
- package/dist/campaign-writes-XKYYMZML.js +166 -0
- package/dist/campaign-writes-XKYYMZML.js.map +1 -0
- package/dist/campaigns-E5UW4I3X.js +111 -0
- package/dist/campaigns-E5UW4I3X.js.map +1 -0
- package/dist/campaigns-MCB76NPQ.js +107 -0
- package/dist/canvas-JCNKMGCG.js +46 -0
- package/dist/capabilities-CLTZCXCZ.js +145 -0
- package/dist/capabilities-CLTZCXCZ.js.map +1 -0
- package/dist/chatgpt-XFZ42NXC.js +47 -0
- package/dist/chats-DTJSBDWO.js +277 -0
- package/dist/chats-DTJSBDWO.js.map +1 -0
- package/dist/check-CZTS64AW.js +105 -0
- package/dist/check-CZTS64AW.js.map +1 -0
- package/dist/chunk-2YTBPRRG.js +207 -0
- package/dist/chunk-3SNCMEJB.js +97 -0
- package/dist/chunk-7QGFO35A.js +23 -0
- package/dist/chunk-AV7ALENU.js +191 -0
- package/dist/chunk-BRLFQ4VX.js +604 -0
- package/dist/chunk-CAZGM2NX.js +92 -0
- package/dist/chunk-CAZGM2NX.js.map +1 -0
- package/dist/chunk-DJE7UXYT.js +831 -0
- package/dist/chunk-EFWXYUSK.js +139 -0
- package/dist/chunk-EONSZAZB.js +3868 -0
- package/dist/chunk-FALJQCWL.js +661 -0
- package/dist/chunk-FALJQCWL.js.map +1 -0
- package/dist/chunk-FG3MV2XM.js +89 -0
- package/dist/chunk-FKG476GH.js +392 -0
- package/dist/chunk-FUGQSIYG.js +297 -0
- package/dist/chunk-GZ4A2VYW.js +39 -0
- package/dist/chunk-GZ4A2VYW.js.map +1 -0
- package/dist/chunk-HPLHAHG5.js +275 -0
- package/dist/chunk-I24YT2KG.js +122 -0
- package/dist/chunk-IFDZZOUC.js +903 -0
- package/dist/chunk-JVVUI55M.js +455 -0
- package/dist/chunk-KKSHEPBY.js +363 -0
- package/dist/chunk-KQ7RCLGC.js +547 -0
- package/dist/chunk-L7WMS5PW.js +172 -0
- package/dist/chunk-LBRO4MTL.js +19 -0
- package/dist/chunk-LNRPOULW.js +224 -0
- package/dist/chunk-LX6WC2XZ.js +942 -0
- package/dist/chunk-MMGTJBM6.js +142 -0
- package/dist/chunk-NZS3KEQ2.js +97 -0
- package/dist/chunk-NZS3KEQ2.js.map +1 -0
- package/dist/chunk-O37VU7FG.js +6799 -0
- package/dist/chunk-O37VU7FG.js.map +1 -0
- package/dist/chunk-OEZYSL3U.js +51 -0
- package/dist/chunk-OOVHBMQB.js +103 -0
- package/dist/chunk-PTH7VWKK.js +159 -0
- package/dist/chunk-PYD6IGW6.js +401 -0
- package/dist/chunk-PYD6IGW6.js.map +1 -0
- package/dist/chunk-QE2E4EYJ.js +349 -0
- package/dist/chunk-QE2E4EYJ.js.map +1 -0
- package/dist/chunk-QZF4BVKL.js +66 -0
- package/dist/chunk-RITUSBYO.js +61 -0
- package/dist/chunk-SSTL3A7Z.js +206 -0
- package/dist/chunk-SZNGQ2GF.js +64 -0
- package/dist/chunk-SZNGQ2GF.js.map +1 -0
- package/dist/chunk-TD4SO6TR.js +169 -0
- package/dist/chunk-UZ4RTOFG.js +91 -0
- package/dist/chunk-VAX7PFQV.js +592 -0
- package/dist/chunk-VDRSZK4P.js +494 -0
- package/dist/chunk-VNU2EYD4.js +344 -0
- package/dist/chunk-WT4WDIXA.js +156 -0
- package/dist/chunk-XEX23CIB.js +160 -0
- package/dist/chunk-XXDF25BW.js +8939 -0
- package/dist/chunk-YJ3LSFMX.js +249 -0
- package/dist/chunk-YVK5RT3B.js +197 -0
- package/dist/chunk-YWWRLZUR.js +433 -0
- package/dist/chunk-Z4S5BCVZ.js +57 -0
- package/dist/chunk-ZYGK7GAK.js +1079 -0
- package/dist/claim-TSFPWTQY.js +198 -0
- package/dist/claim-TSFPWTQY.js.map +1 -0
- package/dist/cli.js +38 -37
- package/dist/cli.js.map +1 -1
- package/dist/companies-P7FZNJQV.js +196 -0
- package/dist/companies-P7FZNJQV.js.map +1 -0
- package/dist/complete-SYDIHMD5.js +82 -0
- package/dist/complete-SYDIHMD5.js.map +1 -0
- package/dist/connect-COS6G45S.js +43 -0
- package/dist/conversation-UJOWMJRH.js +94 -0
- package/dist/conversation-UJOWMJRH.js.map +1 -0
- package/dist/conversions-ONOIEILU.js +138 -0
- package/dist/conversions-ONOIEILU.js.map +1 -0
- package/dist/create-DPQRYQXK.js +208 -0
- package/dist/create-DPQRYQXK.js.map +1 -0
- package/dist/create-JD76Z4A4.js +60 -0
- package/dist/create-JD76Z4A4.js.map +1 -0
- package/dist/create-NOT3HGP2.js +133 -0
- package/dist/create-NOT3HGP2.js.map +1 -0
- package/dist/create-ZYEB7SHF.js +236 -0
- package/dist/create-ZYEB7SHF.js.map +1 -0
- package/dist/creatives-LRSELC7Y.js +221 -0
- package/dist/creatives-LRSELC7Y.js.map +1 -0
- package/dist/creatives-SEQHJD2M.js +58 -0
- package/dist/credentials-LHPTUVVA.js +288 -0
- package/dist/credentials-LHPTUVVA.js.map +1 -0
- package/dist/critique-Q7GSZ5RP.js +1459 -0
- package/dist/critique-Q7GSZ5RP.js.map +1 -0
- package/dist/critique-RR2XOQCE.js +228 -0
- package/dist/critique-RR2XOQCE.js.map +1 -0
- package/dist/crm-J7EU32PL.js +319 -0
- package/dist/crm-J7EU32PL.js.map +1 -0
- package/dist/crm-MC444ZVU.js +225 -0
- package/dist/crm-MC444ZVU.js.map +1 -0
- package/dist/customers-LMSX33FO.js +57 -0
- package/dist/delete-BQBVATMF.js +55 -0
- package/dist/delete-BQBVATMF.js.map +1 -0
- package/dist/delete-K7A3AUPH.js +65 -0
- package/dist/delete-K7A3AUPH.js.map +1 -0
- package/dist/delete-VV2ICIHF.js +67 -0
- package/dist/delete-VV2ICIHF.js.map +1 -0
- package/dist/demographics-7GWUXXS6.js +139 -0
- package/dist/demographics-7GWUXXS6.js.map +1 -0
- package/dist/discard-3CLZ4DPD.js +67 -0
- package/dist/discard-3CLZ4DPD.js.map +1 -0
- package/dist/domain-ZS74BSE6.js +99 -0
- package/dist/domain-ZS74BSE6.js.map +1 -0
- package/dist/draft-J3B33RAZ.js +308 -0
- package/dist/draft-J3B33RAZ.js.map +1 -0
- package/dist/draft-MZLWVX3D.js +218 -0
- package/dist/draft-MZLWVX3D.js.map +1 -0
- package/dist/draft-R56PIXCV.js +333 -0
- package/dist/draft-R56PIXCV.js.map +1 -0
- package/dist/experiment-7RJ5X2LL.js +1397 -0
- package/dist/experiments-NOSJJMYI.js +234 -0
- package/dist/experiments-NOSJJMYI.js.map +1 -0
- package/dist/facets-E6SHYUAI.js +115 -0
- package/dist/facets-E6SHYUAI.js.map +1 -0
- package/dist/feedback-HXCQBV7S.js +107 -0
- package/dist/feedback-HXCQBV7S.js.map +1 -0
- package/dist/feedback-record-GXPYXNT6.js +261 -0
- package/dist/feedback-record-GXPYXNT6.js.map +1 -0
- package/dist/fetch-HMUGSRE4.js +177 -0
- package/dist/fetch-HMUGSRE4.js.map +1 -0
- package/dist/find-2EPXK5RF.js +134 -0
- package/dist/fit-W7UNFZT5.js +63 -0
- package/dist/flows-SO5J3M3X.js +248 -0
- package/dist/flows-SO5J3M3X.js.map +1 -0
- package/dist/fonts-N42UYWTX.js +37 -0
- package/dist/forecast-24LGJVLC.js +119 -0
- package/dist/forecast-24LGJVLC.js.map +1 -0
- package/dist/funnel-NYT36B3C.js +395 -0
- package/dist/funnel-NYT36B3C.js.map +1 -0
- package/dist/ga4-6EIQC2TG.js +55 -0
- package/dist/get-KAGO4EC5.js +80 -0
- package/dist/get-KAGO4EC5.js.map +1 -0
- package/dist/get-PZX27LQY.js +38 -0
- package/dist/get-PZX27LQY.js.map +1 -0
- package/dist/get-R5JAFHTH.js +57 -0
- package/dist/get-R5JAFHTH.js.map +1 -0
- package/dist/google-O5OI6QFU.js +136 -0
- package/dist/google-ads-6X4BHGUR.js +196 -0
- package/dist/google-ads-6X4BHGUR.js.map +1 -0
- package/dist/gsc-BM3T2GDL.js +30 -0
- package/dist/history-LGOWYLBE.js +134 -0
- package/dist/history-LGOWYLBE.js.map +1 -0
- package/dist/hubspot-LJB3ETUT.js +780 -0
- package/dist/hubspot-LJB3ETUT.js.map +1 -0
- package/dist/icon-B7DG53S5.js +137 -0
- package/dist/ideas-DYN2DMFN.js +41 -0
- package/dist/images-EQCUXEHF.js +92 -0
- package/dist/ingest-B46AY3QU.js +24 -0
- package/dist/ingest-T7ZS2R4U.js +108 -0
- package/dist/ingest-T7ZS2R4U.js.map +1 -0
- package/dist/inspect-BSNGAT2S.js +190 -0
- package/dist/inspect-BSNGAT2S.js.map +1 -0
- package/dist/inspiration-TCCKM4R7.js +53 -0
- package/dist/keyword-metrics-KNTIN4ZK.js +198 -0
- package/dist/keyword-metrics-KNTIN4ZK.js.map +1 -0
- package/dist/keywords-for-site-S4MXGXWR.js +129 -0
- package/dist/keywords-for-site-S4MXGXWR.js.map +1 -0
- package/dist/landing-WVPA7NBR.js +28 -0
- package/dist/leads-EINV5FK3.js +113 -0
- package/dist/leads-EINV5FK3.js.map +1 -0
- package/dist/learn-7Z2VR6MS.js +205 -0
- package/dist/learn-7Z2VR6MS.js.map +1 -0
- package/dist/line-item-writes-Z3TIB5KZ.js +209 -0
- package/dist/line-item-writes-Z3TIB5KZ.js.map +1 -0
- package/dist/line-items-OEWYOPFP.js +103 -0
- package/dist/link-KYHUIPJE.js +65 -0
- package/dist/link-KYHUIPJE.js.map +1 -0
- package/dist/linkedin-JVB4HXJC.js +1314 -0
- package/dist/linkedin-JVB4HXJC.js.map +1 -0
- package/dist/list-EORTO73V.js +93 -0
- package/dist/list-EORTO73V.js.map +1 -0
- package/dist/list-QQVLURKH.js +152 -0
- package/dist/list-QQVLURKH.js.map +1 -0
- package/dist/list-QWGKRUSM.js +65 -0
- package/dist/list-QWGKRUSM.js.map +1 -0
- package/dist/list-WRBWQASJ.js +50 -0
- package/dist/list-Z6NMNK3T.js +304 -0
- package/dist/list-Z6NMNK3T.js.map +1 -0
- package/dist/log-RUMKYPYK.js +93 -0
- package/dist/log-RUMKYPYK.js.map +1 -0
- package/dist/logo-QTSBKP2J.js +18 -0
- package/dist/make-IJGCQA7C.js +1354 -0
- package/dist/make-IJGCQA7C.js.map +1 -0
- package/dist/map-QZHIJFQT.js +434 -0
- package/dist/map-QZHIJFQT.js.map +1 -0
- package/dist/mcp-ZH2XDV5P.js +715 -0
- package/dist/mcp-ZH2XDV5P.js.map +1 -0
- package/dist/media-sources-SQ2RPDBO.js +35 -0
- package/dist/media-sources-SQ2RPDBO.js.map +1 -0
- package/dist/members-4YX7JEZM.js +45 -0
- package/dist/members-4YX7JEZM.js.map +1 -0
- package/dist/normalize-ABIWLRIT.js +142 -0
- package/dist/normalize-ABIWLRIT.js.map +1 -0
- package/dist/options-SVCQVTNE.js +123 -0
- package/dist/options-SVCQVTNE.js.map +1 -0
- package/dist/organization-FNKDC742.js +947 -0
- package/dist/organization-FNKDC742.js.map +1 -0
- package/dist/performance-HTU5FR2K.js +25 -0
- package/dist/posts-3DAPTBH2.js +34 -0
- package/dist/posts-3DAPTBH2.js.map +1 -0
- package/dist/promoted-tweet-writes-DD3CJNWW.js +181 -0
- package/dist/promoted-tweet-writes-DD3CJNWW.js.map +1 -0
- package/dist/promoted-tweets-TTWN5OMW.js +119 -0
- package/dist/publish-Z62KGDJ2.js +342 -0
- package/dist/publish-Z62KGDJ2.js.map +1 -0
- package/dist/reddit-6C3PT5CT.js +27 -0
- package/dist/refresh-HCQXVFVR.js +95 -0
- package/dist/refresh-HCQXVFVR.js.map +1 -0
- package/dist/refresh-ZCGH64OZ.js +42 -0
- package/dist/refresh-ZCGH64OZ.js.map +1 -0
- package/dist/release-FIHW2HCH.js +61 -0
- package/dist/release-FIHW2HCH.js.map +1 -0
- package/dist/remove-CBR7NVMI.js +51 -0
- package/dist/remove-CBR7NVMI.js.map +1 -0
- package/dist/remove-PUZP5GWN.js +49 -0
- package/dist/remove-PUZP5GWN.js.map +1 -0
- package/dist/reopen-EJGLRQWR.js +64 -0
- package/dist/reopen-EJGLRQWR.js.map +1 -0
- package/dist/rerun-TVBZXASH.js +91 -0
- package/dist/rerun-TVBZXASH.js.map +1 -0
- package/dist/research-L25D4WHQ.js +263 -0
- package/dist/research-L25D4WHQ.js.map +1 -0
- package/dist/research-YCMMQVK6.js +62 -0
- package/dist/reset-HKKCWKZ7.js +55 -0
- package/dist/reset-HKKCWKZ7.js.map +1 -0
- package/dist/reset-SRL6I6GP.js +55 -0
- package/dist/reset-SRL6I6GP.js.map +1 -0
- package/dist/resolve-POMTTAFR.js +122 -0
- package/dist/resolve-POMTTAFR.js.map +1 -0
- package/dist/retry-MEPTOAV2.js +61 -0
- package/dist/retry-MEPTOAV2.js.map +1 -0
- package/dist/retry-RNGM3KKA.js +63 -0
- package/dist/retry-RNGM3KKA.js.map +1 -0
- package/dist/revenue-X4KPTSAM.js +89 -0
- package/dist/revenue-X4KPTSAM.js.map +1 -0
- package/dist/rules-VK7YA23Q.js +97 -0
- package/dist/rules-VK7YA23Q.js.map +1 -0
- package/dist/rules-add-VG7AT6EG.js +463 -0
- package/dist/rules-add-VG7AT6EG.js.map +1 -0
- package/dist/run-DIDQSZU7.js +67 -0
- package/dist/run-DIDQSZU7.js.map +1 -0
- package/dist/run-SR7DJ7M5.js +66 -0
- package/dist/scaffold-ad-46GTFUMP.js +1512 -0
- package/dist/scaffold-ad-46GTFUMP.js.map +1 -0
- package/dist/scaffold-static-ad-U63V4UHR.js +1006 -0
- package/dist/scaffold-static-ad-U63V4UHR.js.map +1 -0
- package/dist/scaffold-video-4DNTURH6.js +884 -0
- package/dist/scaffold-video-4DNTURH6.js.map +1 -0
- package/dist/schedule-JO66N7XO.js +62 -0
- package/dist/schedule-JO66N7XO.js.map +1 -0
- package/dist/schedule-JZBIX6LH.js +67 -0
- package/dist/schedule-JZBIX6LH.js.map +1 -0
- package/dist/scheduled-agents-N63EZNY6.js +50 -0
- package/dist/schema-B2XANMEY.js +133 -0
- package/dist/schema-B2XANMEY.js.map +1 -0
- package/dist/schema-C6SGBNA6.js +69 -0
- package/dist/search-7GHS3OUZ.js +51 -0
- package/dist/search-7GHS3OUZ.js.map +1 -0
- package/dist/search-W5HZUJA2.js +175 -0
- package/dist/search-W5HZUJA2.js.map +1 -0
- package/dist/select-LMGLNFWB.js +102 -0
- package/dist/select-LMGLNFWB.js.map +1 -0
- package/dist/set-prompt-M5E3UZDM.js +194 -0
- package/dist/set-prompt-M5E3UZDM.js.map +1 -0
- package/dist/setup-links-ERBQSKAB.js +142 -0
- package/dist/setup-links-ERBQSKAB.js.map +1 -0
- package/dist/site-PNVFJRYK.js +178 -0
- package/dist/site-PNVFJRYK.js.map +1 -0
- package/dist/sources-DMZJPLKC.js +455 -0
- package/dist/sources-DMZJPLKC.js.map +1 -0
- package/dist/sources-HN3GCEDX.js +30 -0
- package/dist/stale-VWN25WTL.js +72 -0
- package/dist/stale-VWN25WTL.js.map +1 -0
- package/dist/stats-CVF6AC7R.js +34 -0
- package/dist/status-SF7DTPCJ.js +63 -0
- package/dist/status-SF7DTPCJ.js.map +1 -0
- package/dist/stock-4LPQ6SM7.js +179 -0
- package/dist/studio-NZ6WQ7OE.js +49 -0
- package/dist/suggest-WMMEQCUH.js +66 -0
- package/dist/suggest-WMMEQCUH.js.map +1 -0
- package/dist/sync-F7VNZLWY.js +55 -0
- package/dist/sync-F7VNZLWY.js.map +1 -0
- package/dist/sync-HVNDPBOD.js +55 -0
- package/dist/sync-HVNDPBOD.js.map +1 -0
- package/dist/sync-definition-CKEUYKWN.js +65 -0
- package/dist/tag-KTQ2FV5C.js +57 -0
- package/dist/tag-KTQ2FV5C.js.map +1 -0
- package/dist/tag-manager-FLXXLNKP.js +43 -0
- package/dist/tags-EUOOSAKN.js +26 -0
- package/dist/tags-KOMAP2G5.js +21 -0
- package/dist/tags-KOMAP2G5.js.map +1 -0
- package/dist/tags-TKXJGTR3.js +21 -0
- package/dist/tags-TKXJGTR3.js.map +1 -0
- package/dist/tags-VWIPDCUA.js +225 -0
- package/dist/tags-VWIPDCUA.js.map +1 -0
- package/dist/tags-XAB4HWGW.js +21 -0
- package/dist/tags-XAB4HWGW.js.map +1 -0
- package/dist/targeting-criteria-HE7K52WN.js +113 -0
- package/dist/targets-NA4XPDBF.js +104 -0
- package/dist/targets-NA4XPDBF.js.map +1 -0
- package/dist/testimonials-3Q5XM7JD.js +32 -0
- package/dist/top-companies-TKO4QGPJ.js +109 -0
- package/dist/top-companies-TKO4QGPJ.js.map +1 -0
- package/dist/translate-YVIZ5T44.js +605 -0
- package/dist/translate-YVIZ5T44.js.map +1 -0
- package/dist/triggers-QX7VW7UO.js +143 -0
- package/dist/triggers-QX7VW7UO.js.map +1 -0
- package/dist/unlink-64SRPUNG.js +68 -0
- package/dist/unlink-64SRPUNG.js.map +1 -0
- package/dist/unstage-5X2MOUMF.js +86 -0
- package/dist/unstage-5X2MOUMF.js.map +1 -0
- package/dist/update-22ZBHURE.js +81 -0
- package/dist/update-22ZBHURE.js.map +1 -0
- package/dist/update-2LTPSGWT.js +99 -0
- package/dist/update-2LTPSGWT.js.map +1 -0
- package/dist/update-DOKS7ATM.js +189 -0
- package/dist/update-DOKS7ATM.js.map +1 -0
- package/dist/update-FB6X463M.js +64 -0
- package/dist/update-FB6X463M.js.map +1 -0
- package/dist/update-QIZ7XFAM.js +153 -0
- package/dist/update-QIZ7XFAM.js.map +1 -0
- package/dist/upload-XJ7TUVIK.js +127 -0
- package/dist/upload-XJ7TUVIK.js.map +1 -0
- package/dist/url-params-KLQOLNPS.js +99 -0
- package/dist/url-params-KLQOLNPS.js.map +1 -0
- package/dist/validate-YTBJBG44.js +118 -0
- package/dist/validate-YTBJBG44.js.map +1 -0
- package/dist/videos-WAPUPJVT.js +39 -0
- package/dist/viewer-check-GHQA3UY2.js +81 -0
- package/dist/web-6JMWERTT.js +141 -0
- package/dist/web-6JMWERTT.js.map +1 -0
- package/dist/winning-ads-XCVUAIOU.js +86 -0
- package/dist/write-commands-N74CDMQM.js +1493 -0
- package/dist/write-commands-N74CDMQM.js.map +1 -0
- package/dist/x-SI4KYDEY.js +47 -0
- package/package.json +1 -1
- package/dist/account-UHNR5KTE.js +0 -79
- package/dist/account-UHNR5KTE.js.map +0 -1
- package/dist/accounts-KMLXHADA.js +0 -77
- package/dist/accounts-KMLXHADA.js.map +0 -1
- package/dist/accounts-QDGNTSTV.js +0 -611
- package/dist/accounts-QDGNTSTV.js.map +0 -1
- package/dist/actions-QL5UD2W4.js +0 -55
- package/dist/activecampaign-5OD45ROS.js +0 -935
- package/dist/activecampaign-5OD45ROS.js.map +0 -1
- package/dist/add-2F7BEVYD.js +0 -105
- package/dist/add-2F7BEVYD.js.map +0 -1
- package/dist/add-6K6LO7CM.js +0 -104
- package/dist/add-6K6LO7CM.js.map +0 -1
- package/dist/add-LYDJZDGO.js +0 -302
- package/dist/add-LYDJZDGO.js.map +0 -1
- package/dist/ads-DHPJFU52.js +0 -40
- package/dist/advertisers-23LU7GTV.js +0 -120
- package/dist/advertisers-23LU7GTV.js.map +0 -1
- package/dist/analytics-HO2SLL4W.js +0 -433
- package/dist/analytics-HO2SLL4W.js.map +0 -1
- package/dist/analytics-LD3D7ISK.js +0 -1976
- package/dist/analytics-LD3D7ISK.js.map +0 -1
- package/dist/assign-CLKJKH2B.js +0 -77
- package/dist/assign-CLKJKH2B.js.map +0 -1
- package/dist/audience-size-NNYYXODL.js +0 -73
- package/dist/audience-size-NNYYXODL.js.map +0 -1
- package/dist/audit-KB4P2XGS.js +0 -151
- package/dist/audit-KB4P2XGS.js.map +0 -1
- package/dist/autocomplete-VZD2SMTE.js +0 -111
- package/dist/autocomplete-VZD2SMTE.js.map +0 -1
- package/dist/avatars-FKOO6VZ2.js +0 -38
- package/dist/bid-pricing-6LLXOLLI.js +0 -100
- package/dist/bid-pricing-6LLXOLLI.js.map +0 -1
- package/dist/brand-NNWHBIAX.js +0 -22
- package/dist/brief-CPJQWT6W.js +0 -538
- package/dist/brief-CPJQWT6W.js.map +0 -1
- package/dist/campaign-groups-YPYNXOWU.js +0 -95
- package/dist/campaign-groups-YPYNXOWU.js.map +0 -1
- package/dist/campaign-writes-UJ4L2O6G.js +0 -165
- package/dist/campaign-writes-UJ4L2O6G.js.map +0 -1
- package/dist/campaigns-HLBZRH5A.js +0 -107
- package/dist/campaigns-N44ZDGB5.js +0 -109
- package/dist/campaigns-N44ZDGB5.js.map +0 -1
- package/dist/canvas-D64GLWUO.js +0 -46
- package/dist/capabilities-LWXCWMIY.js +0 -144
- package/dist/capabilities-LWXCWMIY.js.map +0 -1
- package/dist/chatgpt-YI6YNACI.js +0 -47
- package/dist/chats-7WGC2CVW.js +0 -276
- package/dist/chats-7WGC2CVW.js.map +0 -1
- package/dist/check-EH6BXWWL.js +0 -104
- package/dist/check-EH6BXWWL.js.map +0 -1
- package/dist/chunk-2B772ZEA.js +0 -169
- package/dist/chunk-2KRK667G.js +0 -51
- package/dist/chunk-2TVXJPGR.js +0 -103
- package/dist/chunk-3AMLOCXY.js +0 -392
- package/dist/chunk-3B5LPK6D.js +0 -658
- package/dist/chunk-3B5LPK6D.js.map +0 -1
- package/dist/chunk-3N5A44NQ.js +0 -122
- package/dist/chunk-3WAYZQNV.js +0 -61
- package/dist/chunk-5A257KJA.js +0 -160
- package/dist/chunk-6QGS3RQP.js +0 -363
- package/dist/chunk-AFD32O4A.js +0 -494
- package/dist/chunk-AW2GKIGS.js +0 -433
- package/dist/chunk-CYSBNCPX.js +0 -55
- package/dist/chunk-CYSBNCPX.js.map +0 -1
- package/dist/chunk-DAO63OOP.js +0 -6352
- package/dist/chunk-DAO63OOP.js.map +0 -1
- package/dist/chunk-EMQUW6JB.js +0 -942
- package/dist/chunk-EW3JEKIV.js +0 -139
- package/dist/chunk-FBFWMTOP.js +0 -19
- package/dist/chunk-GXDLWBOY.js +0 -73
- package/dist/chunk-GXDLWBOY.js.map +0 -1
- package/dist/chunk-GXGYTFZA.js +0 -8939
- package/dist/chunk-I7J7YQXZ.js +0 -142
- package/dist/chunk-IBY44U2M.js +0 -1079
- package/dist/chunk-IFXGCI33.js +0 -297
- package/dist/chunk-IKLHXGMF.js +0 -91
- package/dist/chunk-IYTPWAN3.js +0 -604
- package/dist/chunk-J3CWAERS.js +0 -3868
- package/dist/chunk-JH2L5CQD.js +0 -206
- package/dist/chunk-JUVVCA7B.js +0 -97
- package/dist/chunk-MK6XJUCQ.js +0 -197
- package/dist/chunk-N3I6ZXR7.js +0 -66
- package/dist/chunk-NBO2NSAW.js +0 -592
- package/dist/chunk-NEU5QD2C.js +0 -249
- package/dist/chunk-NKIBXOHT.js +0 -344
- package/dist/chunk-OE3MIV4F.js +0 -547
- package/dist/chunk-P2MFWJR3.js +0 -903
- package/dist/chunk-PHCIFBP3.js +0 -89
- package/dist/chunk-PTUXBO5O.js +0 -224
- package/dist/chunk-Q3LXLWZY.js +0 -275
- package/dist/chunk-Q5WBTVA7.js +0 -455
- package/dist/chunk-RDEAVCMF.js +0 -399
- package/dist/chunk-RDEAVCMF.js.map +0 -1
- package/dist/chunk-RGMKXNQP.js +0 -23
- package/dist/chunk-RZTKCCUL.js +0 -831
- package/dist/chunk-TTKBNBQF.js +0 -156
- package/dist/chunk-VB3XUR6A.js +0 -207
- package/dist/chunk-XCKINS7K.js +0 -57
- package/dist/chunk-Y6GKV7CU.js +0 -346
- package/dist/chunk-Y6GKV7CU.js.map +0 -1
- package/dist/chunk-Z2GQREJY.js +0 -159
- package/dist/chunk-ZDAVSTEE.js +0 -172
- package/dist/chunk-ZXCSOVS5.js +0 -191
- package/dist/claim-SVDCQ2AI.js +0 -197
- package/dist/claim-SVDCQ2AI.js.map +0 -1
- package/dist/companies-BYMYQK6A.js +0 -195
- package/dist/companies-BYMYQK6A.js.map +0 -1
- package/dist/complete-NEH3MWRI.js +0 -81
- package/dist/complete-NEH3MWRI.js.map +0 -1
- package/dist/connect-5PGL7ZOM.js +0 -42
- package/dist/conversation-CSOKJXDW.js +0 -93
- package/dist/conversation-CSOKJXDW.js.map +0 -1
- package/dist/conversions-4JOTTFEH.js +0 -135
- package/dist/conversions-4JOTTFEH.js.map +0 -1
- package/dist/create-2XYMBULY.js +0 -207
- package/dist/create-2XYMBULY.js.map +0 -1
- package/dist/create-56PTZABQ.js +0 -235
- package/dist/create-56PTZABQ.js.map +0 -1
- package/dist/create-D6S6TGWY.js +0 -59
- package/dist/create-D6S6TGWY.js.map +0 -1
- package/dist/create-SMW4O5PC.js +0 -132
- package/dist/create-SMW4O5PC.js.map +0 -1
- package/dist/creatives-OO76DAFS.js +0 -58
- package/dist/creatives-VJUYWJL6.js +0 -182
- package/dist/creatives-VJUYWJL6.js.map +0 -1
- package/dist/credentials-2ONYUJW6.js +0 -287
- package/dist/credentials-2ONYUJW6.js.map +0 -1
- package/dist/critique-NDDFSGPE.js +0 -1458
- package/dist/critique-NDDFSGPE.js.map +0 -1
- package/dist/critique-YXZVMLZ4.js +0 -227
- package/dist/critique-YXZVMLZ4.js.map +0 -1
- package/dist/crm-Q6CEP5XV.js +0 -224
- package/dist/crm-Q6CEP5XV.js.map +0 -1
- package/dist/crm-WRONZYDH.js +0 -318
- package/dist/crm-WRONZYDH.js.map +0 -1
- package/dist/customers-2EFYSCU2.js +0 -56
- package/dist/delete-7WEVC3FS.js +0 -66
- package/dist/delete-7WEVC3FS.js.map +0 -1
- package/dist/delete-RBWK255M.js +0 -54
- package/dist/delete-RBWK255M.js.map +0 -1
- package/dist/delete-VN4WWMQF.js +0 -64
- package/dist/delete-VN4WWMQF.js.map +0 -1
- package/dist/demographics-I5XZ435C.js +0 -138
- package/dist/demographics-I5XZ435C.js.map +0 -1
- package/dist/discard-XJLIXTNM.js +0 -66
- package/dist/discard-XJLIXTNM.js.map +0 -1
- package/dist/domain-M7AEGAYI.js +0 -98
- package/dist/domain-M7AEGAYI.js.map +0 -1
- package/dist/draft-5DQI4W5F.js +0 -306
- package/dist/draft-5DQI4W5F.js.map +0 -1
- package/dist/draft-7IIYHSY2.js +0 -332
- package/dist/draft-7IIYHSY2.js.map +0 -1
- package/dist/draft-CN6GKVBF.js +0 -217
- package/dist/draft-CN6GKVBF.js.map +0 -1
- package/dist/experiment-IDDWRCJ7.js +0 -1397
- package/dist/facets-ZLZ6LIHN.js +0 -114
- package/dist/facets-ZLZ6LIHN.js.map +0 -1
- package/dist/feedback-7LEX2P5Q.js +0 -106
- package/dist/feedback-7LEX2P5Q.js.map +0 -1
- package/dist/feedback-record-P4JJ63KA.js +0 -260
- package/dist/feedback-record-P4JJ63KA.js.map +0 -1
- package/dist/fetch-MIVCEHXZ.js +0 -176
- package/dist/fetch-MIVCEHXZ.js.map +0 -1
- package/dist/find-VHN34MWL.js +0 -134
- package/dist/fit-SS6HSZPU.js +0 -62
- package/dist/flows-UTIIHDNE.js +0 -247
- package/dist/flows-UTIIHDNE.js.map +0 -1
- package/dist/fonts-YPNN7ZJP.js +0 -36
- package/dist/forecast-OBSHG2GJ.js +0 -118
- package/dist/forecast-OBSHG2GJ.js.map +0 -1
- package/dist/funnel-A4MXQYBA.js +0 -394
- package/dist/funnel-A4MXQYBA.js.map +0 -1
- package/dist/ga4-ZPAEF2G2.js +0 -55
- package/dist/get-MDAO6I7T.js +0 -56
- package/dist/get-MDAO6I7T.js.map +0 -1
- package/dist/get-ZB553BSH.js +0 -79
- package/dist/get-ZB553BSH.js.map +0 -1
- package/dist/google-C3X7O2UO.js +0 -136
- package/dist/google-ads-FTWL772L.js +0 -195
- package/dist/google-ads-FTWL772L.js.map +0 -1
- package/dist/gsc-SDDHGTZK.js +0 -30
- package/dist/history-WKJYKDMG.js +0 -133
- package/dist/history-WKJYKDMG.js.map +0 -1
- package/dist/hubspot-EPHVEPOO.js +0 -779
- package/dist/hubspot-EPHVEPOO.js.map +0 -1
- package/dist/icon-MYPDC6FM.js +0 -137
- package/dist/ideas-3PBH7VEX.js +0 -40
- package/dist/images-J35C3WG4.js +0 -92
- package/dist/ingest-5QOPUKFE.js +0 -107
- package/dist/ingest-5QOPUKFE.js.map +0 -1
- package/dist/ingest-OKUYP632.js +0 -23
- package/dist/inspect-PMNCP6MV.js +0 -189
- package/dist/inspect-PMNCP6MV.js.map +0 -1
- package/dist/inspiration-QAL7NS7G.js +0 -53
- package/dist/keyword-metrics-R752SJIT.js +0 -197
- package/dist/keyword-metrics-R752SJIT.js.map +0 -1
- package/dist/keywords-for-site-7UWPJYQF.js +0 -128
- package/dist/keywords-for-site-7UWPJYQF.js.map +0 -1
- package/dist/landing-CBVIOGJ5.js +0 -28
- package/dist/leads-LIJS6Y5W.js +0 -90
- package/dist/leads-LIJS6Y5W.js.map +0 -1
- package/dist/learn-N6QV7GXA.js +0 -204
- package/dist/learn-N6QV7GXA.js.map +0 -1
- package/dist/line-item-writes-3WPJXKIL.js +0 -208
- package/dist/line-item-writes-3WPJXKIL.js.map +0 -1
- package/dist/line-items-ZOFKOGAA.js +0 -103
- package/dist/link-DDRQKOUL.js +0 -64
- package/dist/link-DDRQKOUL.js.map +0 -1
- package/dist/linkedin-UWZCF66X.js +0 -1057
- package/dist/linkedin-UWZCF66X.js.map +0 -1
- package/dist/list-5PLXVPLB.js +0 -151
- package/dist/list-5PLXVPLB.js.map +0 -1
- package/dist/list-RC2NX6AX.js +0 -50
- package/dist/list-VSJISE7U.js +0 -303
- package/dist/list-VSJISE7U.js.map +0 -1
- package/dist/list-WTVOBQYX.js +0 -64
- package/dist/list-WTVOBQYX.js.map +0 -1
- package/dist/log-YKKPROLZ.js +0 -92
- package/dist/log-YKKPROLZ.js.map +0 -1
- package/dist/logo-WE2UELX6.js +0 -18
- package/dist/make-RNOWBLZQ.js +0 -1353
- package/dist/make-RNOWBLZQ.js.map +0 -1
- package/dist/map-WTDPQLVO.js +0 -433
- package/dist/map-WTDPQLVO.js.map +0 -1
- package/dist/mcp-XJNSCPP3.js +0 -714
- package/dist/mcp-XJNSCPP3.js.map +0 -1
- package/dist/media-sources-JGBDDXZ5.js +0 -32
- package/dist/media-sources-JGBDDXZ5.js.map +0 -1
- package/dist/members-O3BTMRXX.js +0 -44
- package/dist/members-O3BTMRXX.js.map +0 -1
- package/dist/normalize-R5AYLA2J.js +0 -141
- package/dist/normalize-R5AYLA2J.js.map +0 -1
- package/dist/options-AILRY7JY.js +0 -122
- package/dist/options-AILRY7JY.js.map +0 -1
- package/dist/organization-KJJXZLVK.js +0 -946
- package/dist/organization-KJJXZLVK.js.map +0 -1
- package/dist/performance-7YU4HOGH.js +0 -24
- package/dist/promoted-tweet-writes-TNELWPVG.js +0 -180
- package/dist/promoted-tweet-writes-TNELWPVG.js.map +0 -1
- package/dist/promoted-tweets-76WKUFJQ.js +0 -119
- package/dist/publish-BKLHCKHB.js +0 -341
- package/dist/publish-BKLHCKHB.js.map +0 -1
- package/dist/reddit-YK3YUZEI.js +0 -26
- package/dist/refresh-WIII7KXB.js +0 -94
- package/dist/refresh-WIII7KXB.js.map +0 -1
- package/dist/release-ZHXYQI7G.js +0 -60
- package/dist/release-ZHXYQI7G.js.map +0 -1
- package/dist/remove-NOX4BXWK.js +0 -50
- package/dist/remove-NOX4BXWK.js.map +0 -1
- package/dist/remove-VLWRCOEZ.js +0 -48
- package/dist/remove-VLWRCOEZ.js.map +0 -1
- package/dist/reopen-NLWKK5HB.js +0 -63
- package/dist/reopen-NLWKK5HB.js.map +0 -1
- package/dist/rerun-DZWQNMZQ.js +0 -90
- package/dist/rerun-DZWQNMZQ.js.map +0 -1
- package/dist/research-Q3P76RHN.js +0 -62
- package/dist/research-UDZBCDNX.js +0 -262
- package/dist/research-UDZBCDNX.js.map +0 -1
- package/dist/reset-5UHFX7QY.js +0 -54
- package/dist/reset-5UHFX7QY.js.map +0 -1
- package/dist/reset-MTRJQUP7.js +0 -54
- package/dist/reset-MTRJQUP7.js.map +0 -1
- package/dist/resolve-DA72VT7Q.js +0 -121
- package/dist/resolve-DA72VT7Q.js.map +0 -1
- package/dist/retry-LQUBX5TK.js +0 -62
- package/dist/retry-LQUBX5TK.js.map +0 -1
- package/dist/retry-U6F4CS6O.js +0 -60
- package/dist/retry-U6F4CS6O.js.map +0 -1
- package/dist/rules-VS5PZ7VO.js +0 -96
- package/dist/rules-VS5PZ7VO.js.map +0 -1
- package/dist/rules-add-LMVZYDXE.js +0 -462
- package/dist/rules-add-LMVZYDXE.js.map +0 -1
- package/dist/run-6PRA2YSD.js +0 -65
- package/dist/run-R6COFNOR.js +0 -66
- package/dist/run-R6COFNOR.js.map +0 -1
- package/dist/scaffold-ad-3OVJ7VZQ.js +0 -1511
- package/dist/scaffold-ad-3OVJ7VZQ.js.map +0 -1
- package/dist/scaffold-static-ad-DDRA3Q5I.js +0 -1005
- package/dist/scaffold-static-ad-DDRA3Q5I.js.map +0 -1
- package/dist/scaffold-video-3JZYFYFU.js +0 -883
- package/dist/scaffold-video-3JZYFYFU.js.map +0 -1
- package/dist/schedule-BRSYHMKR.js +0 -66
- package/dist/schedule-BRSYHMKR.js.map +0 -1
- package/dist/schedule-ED2YDUPY.js +0 -61
- package/dist/schedule-ED2YDUPY.js.map +0 -1
- package/dist/scheduled-agents-5P67MVGX.js +0 -50
- package/dist/schema-4XVKERSA.js +0 -132
- package/dist/schema-4XVKERSA.js.map +0 -1
- package/dist/schema-RRAQW3OS.js +0 -69
- package/dist/search-Y2UMIQ57.js +0 -174
- package/dist/search-Y2UMIQ57.js.map +0 -1
- package/dist/select-OZ4E6VLF.js +0 -101
- package/dist/select-OZ4E6VLF.js.map +0 -1
- package/dist/set-prompt-O4YAE4CE.js +0 -193
- package/dist/set-prompt-O4YAE4CE.js.map +0 -1
- package/dist/setup-links-2GJYCV2A.js +0 -141
- package/dist/setup-links-2GJYCV2A.js.map +0 -1
- package/dist/site-47B6V2UX.js +0 -177
- package/dist/site-47B6V2UX.js.map +0 -1
- package/dist/sources-DXPZAPQ7.js +0 -454
- package/dist/sources-DXPZAPQ7.js.map +0 -1
- package/dist/sources-NDXYTASG.js +0 -30
- package/dist/stale-VLVBO2L6.js +0 -71
- package/dist/stale-VLVBO2L6.js.map +0 -1
- package/dist/stats-37OFAMPW.js +0 -34
- package/dist/status-4ODD46XY.js +0 -62
- package/dist/status-4ODD46XY.js.map +0 -1
- package/dist/stock-6R5E7MJX.js +0 -179
- package/dist/studio-LEIGL3Q7.js +0 -49
- package/dist/sync-EKGEWE53.js +0 -54
- package/dist/sync-EKGEWE53.js.map +0 -1
- package/dist/sync-TKNVBUDM.js +0 -54
- package/dist/sync-TKNVBUDM.js.map +0 -1
- package/dist/sync-definition-M5R3H3TP.js +0 -64
- package/dist/tag-manager-3Q55PBEW.js +0 -43
- package/dist/tags-4N5UUUN6.js +0 -26
- package/dist/tags-5NHIAD5A.js +0 -20
- package/dist/tags-5NHIAD5A.js.map +0 -1
- package/dist/tags-UUKWSWCN.js +0 -20
- package/dist/tags-UUKWSWCN.js.map +0 -1
- package/dist/tags-VK7B5DJF.js +0 -20
- package/dist/tags-VK7B5DJF.js.map +0 -1
- package/dist/tags-XAHIB3WA.js +0 -224
- package/dist/tags-XAHIB3WA.js.map +0 -1
- package/dist/targeting-criteria-AVARWV2G.js +0 -113
- package/dist/targets-6RYLQRID.js +0 -103
- package/dist/targets-6RYLQRID.js.map +0 -1
- package/dist/testimonials-6TF6BOFN.js +0 -32
- package/dist/top-companies-45EHRCJD.js +0 -108
- package/dist/top-companies-45EHRCJD.js.map +0 -1
- package/dist/translate-VHLBACCE.js +0 -604
- package/dist/translate-VHLBACCE.js.map +0 -1
- package/dist/triggers-ERQONJNO.js +0 -142
- package/dist/triggers-ERQONJNO.js.map +0 -1
- package/dist/unlink-TPDO6JNF.js +0 -67
- package/dist/unlink-TPDO6JNF.js.map +0 -1
- package/dist/unstage-YKKQQ7LW.js +0 -85
- package/dist/unstage-YKKQQ7LW.js.map +0 -1
- package/dist/update-43WU6X7R.js +0 -63
- package/dist/update-43WU6X7R.js.map +0 -1
- package/dist/update-CAHLAXWO.js +0 -98
- package/dist/update-CAHLAXWO.js.map +0 -1
- package/dist/update-NGH6YADN.js +0 -152
- package/dist/update-NGH6YADN.js.map +0 -1
- package/dist/update-SPJIHHLE.js +0 -188
- package/dist/update-SPJIHHLE.js.map +0 -1
- package/dist/upload-ACESIZIZ.js +0 -126
- package/dist/upload-ACESIZIZ.js.map +0 -1
- package/dist/url-params-MIXEDBF7.js +0 -98
- package/dist/url-params-MIXEDBF7.js.map +0 -1
- package/dist/validate-XJJA7ULE.js +0 -117
- package/dist/validate-XJJA7ULE.js.map +0 -1
- package/dist/videos-LBXPG7WC.js +0 -39
- package/dist/viewer-check-7VJ3GUZX.js +0 -80
- package/dist/web-EWQJC2SD.js +0 -140
- package/dist/web-EWQJC2SD.js.map +0 -1
- package/dist/winning-ads-SAOJAKEQ.js +0 -86
- package/dist/write-commands-QPDE4GWW.js +0 -1024
- package/dist/write-commands-QPDE4GWW.js.map +0 -1
- package/dist/x-LXOJPCRF.js +0 -47
- /package/dist/{actions-QL5UD2W4.js.map → actions-FMNJSOBA.js.map} +0 -0
- /package/dist/{ads-DHPJFU52.js.map → ads-OLXSDPD6.js.map} +0 -0
- /package/dist/{avatars-FKOO6VZ2.js.map → avatars-I4H3NMEJ.js.map} +0 -0
- /package/dist/{brand-NNWHBIAX.js.map → brand-3V7ECY7D.js.map} +0 -0
- /package/dist/{campaigns-HLBZRH5A.js.map → campaigns-MCB76NPQ.js.map} +0 -0
- /package/dist/{canvas-D64GLWUO.js.map → canvas-JCNKMGCG.js.map} +0 -0
- /package/dist/{chatgpt-YI6YNACI.js.map → chatgpt-XFZ42NXC.js.map} +0 -0
- /package/dist/{chunk-VB3XUR6A.js.map → chunk-2YTBPRRG.js.map} +0 -0
- /package/dist/{chunk-JUVVCA7B.js.map → chunk-3SNCMEJB.js.map} +0 -0
- /package/dist/{chunk-RGMKXNQP.js.map → chunk-7QGFO35A.js.map} +0 -0
- /package/dist/{chunk-ZXCSOVS5.js.map → chunk-AV7ALENU.js.map} +0 -0
- /package/dist/{chunk-IYTPWAN3.js.map → chunk-BRLFQ4VX.js.map} +0 -0
- /package/dist/{chunk-RZTKCCUL.js.map → chunk-DJE7UXYT.js.map} +0 -0
- /package/dist/{chunk-EW3JEKIV.js.map → chunk-EFWXYUSK.js.map} +0 -0
- /package/dist/{chunk-J3CWAERS.js.map → chunk-EONSZAZB.js.map} +0 -0
- /package/dist/{chunk-PHCIFBP3.js.map → chunk-FG3MV2XM.js.map} +0 -0
- /package/dist/{chunk-3AMLOCXY.js.map → chunk-FKG476GH.js.map} +0 -0
- /package/dist/{chunk-IFXGCI33.js.map → chunk-FUGQSIYG.js.map} +0 -0
- /package/dist/{chunk-Q3LXLWZY.js.map → chunk-HPLHAHG5.js.map} +0 -0
- /package/dist/{chunk-3N5A44NQ.js.map → chunk-I24YT2KG.js.map} +0 -0
- /package/dist/{chunk-P2MFWJR3.js.map → chunk-IFDZZOUC.js.map} +0 -0
- /package/dist/{chunk-Q5WBTVA7.js.map → chunk-JVVUI55M.js.map} +0 -0
- /package/dist/{chunk-6QGS3RQP.js.map → chunk-KKSHEPBY.js.map} +0 -0
- /package/dist/{chunk-OE3MIV4F.js.map → chunk-KQ7RCLGC.js.map} +0 -0
- /package/dist/{chunk-ZDAVSTEE.js.map → chunk-L7WMS5PW.js.map} +0 -0
- /package/dist/{chunk-FBFWMTOP.js.map → chunk-LBRO4MTL.js.map} +0 -0
- /package/dist/{chunk-PTUXBO5O.js.map → chunk-LNRPOULW.js.map} +0 -0
- /package/dist/{chunk-EMQUW6JB.js.map → chunk-LX6WC2XZ.js.map} +0 -0
- /package/dist/{chunk-I7J7YQXZ.js.map → chunk-MMGTJBM6.js.map} +0 -0
- /package/dist/{chunk-2KRK667G.js.map → chunk-OEZYSL3U.js.map} +0 -0
- /package/dist/{chunk-2TVXJPGR.js.map → chunk-OOVHBMQB.js.map} +0 -0
- /package/dist/{chunk-Z2GQREJY.js.map → chunk-PTH7VWKK.js.map} +0 -0
- /package/dist/{chunk-N3I6ZXR7.js.map → chunk-QZF4BVKL.js.map} +0 -0
- /package/dist/{chunk-3WAYZQNV.js.map → chunk-RITUSBYO.js.map} +0 -0
- /package/dist/{chunk-JH2L5CQD.js.map → chunk-SSTL3A7Z.js.map} +0 -0
- /package/dist/{chunk-2B772ZEA.js.map → chunk-TD4SO6TR.js.map} +0 -0
- /package/dist/{chunk-IKLHXGMF.js.map → chunk-UZ4RTOFG.js.map} +0 -0
- /package/dist/{chunk-NBO2NSAW.js.map → chunk-VAX7PFQV.js.map} +0 -0
- /package/dist/{chunk-AFD32O4A.js.map → chunk-VDRSZK4P.js.map} +0 -0
- /package/dist/{chunk-NKIBXOHT.js.map → chunk-VNU2EYD4.js.map} +0 -0
- /package/dist/{chunk-TTKBNBQF.js.map → chunk-WT4WDIXA.js.map} +0 -0
- /package/dist/{chunk-5A257KJA.js.map → chunk-XEX23CIB.js.map} +0 -0
- /package/dist/{chunk-GXGYTFZA.js.map → chunk-XXDF25BW.js.map} +0 -0
- /package/dist/{chunk-NEU5QD2C.js.map → chunk-YJ3LSFMX.js.map} +0 -0
- /package/dist/{chunk-MK6XJUCQ.js.map → chunk-YVK5RT3B.js.map} +0 -0
- /package/dist/{chunk-AW2GKIGS.js.map → chunk-YWWRLZUR.js.map} +0 -0
- /package/dist/{chunk-XCKINS7K.js.map → chunk-Z4S5BCVZ.js.map} +0 -0
- /package/dist/{chunk-IBY44U2M.js.map → chunk-ZYGK7GAK.js.map} +0 -0
- /package/dist/{connect-5PGL7ZOM.js.map → connect-COS6G45S.js.map} +0 -0
- /package/dist/{creatives-OO76DAFS.js.map → creatives-SEQHJD2M.js.map} +0 -0
- /package/dist/{customers-2EFYSCU2.js.map → customers-LMSX33FO.js.map} +0 -0
- /package/dist/{experiment-IDDWRCJ7.js.map → experiment-7RJ5X2LL.js.map} +0 -0
- /package/dist/{find-VHN34MWL.js.map → find-2EPXK5RF.js.map} +0 -0
- /package/dist/{fit-SS6HSZPU.js.map → fit-W7UNFZT5.js.map} +0 -0
- /package/dist/{fonts-YPNN7ZJP.js.map → fonts-N42UYWTX.js.map} +0 -0
- /package/dist/{ga4-ZPAEF2G2.js.map → ga4-6EIQC2TG.js.map} +0 -0
- /package/dist/{google-C3X7O2UO.js.map → google-O5OI6QFU.js.map} +0 -0
- /package/dist/{gsc-SDDHGTZK.js.map → gsc-BM3T2GDL.js.map} +0 -0
- /package/dist/{icon-MYPDC6FM.js.map → icon-B7DG53S5.js.map} +0 -0
- /package/dist/{ideas-3PBH7VEX.js.map → ideas-DYN2DMFN.js.map} +0 -0
- /package/dist/{images-J35C3WG4.js.map → images-EQCUXEHF.js.map} +0 -0
- /package/dist/{ingest-OKUYP632.js.map → ingest-B46AY3QU.js.map} +0 -0
- /package/dist/{inspiration-QAL7NS7G.js.map → inspiration-TCCKM4R7.js.map} +0 -0
- /package/dist/{landing-CBVIOGJ5.js.map → landing-WVPA7NBR.js.map} +0 -0
- /package/dist/{line-items-ZOFKOGAA.js.map → line-items-OEWYOPFP.js.map} +0 -0
- /package/dist/{list-RC2NX6AX.js.map → list-WRBWQASJ.js.map} +0 -0
- /package/dist/{logo-WE2UELX6.js.map → logo-QTSBKP2J.js.map} +0 -0
- /package/dist/{performance-7YU4HOGH.js.map → performance-HTU5FR2K.js.map} +0 -0
- /package/dist/{promoted-tweets-76WKUFJQ.js.map → promoted-tweets-TTWN5OMW.js.map} +0 -0
- /package/dist/{reddit-YK3YUZEI.js.map → reddit-6C3PT5CT.js.map} +0 -0
- /package/dist/{research-Q3P76RHN.js.map → research-YCMMQVK6.js.map} +0 -0
- /package/dist/{run-6PRA2YSD.js.map → run-SR7DJ7M5.js.map} +0 -0
- /package/dist/{scheduled-agents-5P67MVGX.js.map → scheduled-agents-N63EZNY6.js.map} +0 -0
- /package/dist/{schema-RRAQW3OS.js.map → schema-C6SGBNA6.js.map} +0 -0
- /package/dist/{sources-NDXYTASG.js.map → sources-HN3GCEDX.js.map} +0 -0
- /package/dist/{stats-37OFAMPW.js.map → stats-CVF6AC7R.js.map} +0 -0
- /package/dist/{stock-6R5E7MJX.js.map → stock-4LPQ6SM7.js.map} +0 -0
- /package/dist/{studio-LEIGL3Q7.js.map → studio-NZ6WQ7OE.js.map} +0 -0
- /package/dist/{sync-definition-M5R3H3TP.js.map → sync-definition-CKEUYKWN.js.map} +0 -0
- /package/dist/{tag-manager-3Q55PBEW.js.map → tag-manager-FLXXLNKP.js.map} +0 -0
- /package/dist/{tags-4N5UUUN6.js.map → tags-EUOOSAKN.js.map} +0 -0
- /package/dist/{targeting-criteria-AVARWV2G.js.map → targeting-criteria-HE7K52WN.js.map} +0 -0
- /package/dist/{testimonials-6TF6BOFN.js.map → testimonials-3Q5XM7JD.js.map} +0 -0
- /package/dist/{videos-LBXPG7WC.js.map → videos-WAPUPJVT.js.map} +0 -0
- /package/dist/{viewer-check-7VJ3GUZX.js.map → viewer-check-GHQA3UY2.js.map} +0 -0
- /package/dist/{winning-ads-SAOJAKEQ.js.map → winning-ads-XCVUAIOU.js.map} +0 -0
- /package/dist/{x-LXOJPCRF.js.map → x-SI4KYDEY.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/flows/index.ts"],"sourcesContent":["import {\n driftRepairHint,\n FLOW_AGENT_DESTINATION_KINDS,\n type FlowConfigStatus,\n type FlowDrift,\n type FlowSummary,\n type FlowsDriftResponse,\n type FlowsShowResponse,\n flowNodeTriggers,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport {\n collectConfigStatus,\n collectSideEffects,\n listFlowSlugs,\n readFlowTree,\n readSettings,\n redactTree,\n requestFlowInputCall,\n withSettings,\n} from \"./shared.ts\";\n\nregisterSchema({\n command: \"flows.list\",\n description:\n \"List the Forms (flows) in this workspace and how many confidential fields each still needs configured. Read-only.\",\n args: {},\n});\n\nregisterSchema({\n command: \"flows.show\",\n description:\n \"Show a Form's confidential fields and whether each is configured (secrets/connections/third-party resources), AND whether its destination has changed under it — never reveals secret values. Destination drift is the one problem a Form cannot show you itself: when a HubSpot field a Form maps is deleted, HubSpot refuses the WHOLE submission and the visitor still sees the thank-you screen, so every lead is lost silently. Run this before changing any Form. Each sealed destination says where it sends (recipients, subject, sheet) — never a credential. Author structure by editing the flow's _data.json; set destinations yourself with `baker flows connect` (email: --email/--subject); only a typed secret goes to the request_flow_input tool.\",\n args: {\n slug: { type: \"positional\", description: \"Form slug (folder under flows/)\", required: true },\n full: { type: \"boolean\", description: \"Include the full flow tree (secret values redacted)\", required: false },\n },\n});\n\nfunction statusFor(slug: string): FlowConfigStatus[] {\n const tree = readFlowTree(slug);\n const config: FlowConfigStatus[] = [];\n collectConfigStatus(tree, config);\n return config;\n}\n\n/**\n * The calls that close out everything this form is still waiting on.\n *\n * `show` is the command an agent runs to answer \"is this form wired up?\", and\n * it answered with `needsInput: true` and nothing else — leaving the agent to\n * work out that a tool exists, which tool, and how to address the exact node or\n * side effect. The whole point of asking is to find out what to do next, so the\n * answer is the call itself.\n */\nfunction pendingInputHints(slug: string, config: FlowConfigStatus[]): string[] {\n const pending = config.filter((row) => row.needsInput);\n if (pending.length === 0) return [];\n const calls = pending.slice(0, MAX_PENDING_HINTS).map((row) => `${row.kind}: ${requestFlowInputCall(slug, row)}`);\n const rest = pending.length - calls.length;\n return [\n ...repeatedKindHints(slug, pending),\n `${pending.length} item${pending.length === 1 ? \"\" : \"s\"} still unwired. Wire each yourself with the command below when you know which resource is meant; the card is the fallback, and its result carries the destination — read the names from there rather than looking them up again.`,\n ...calls,\n ...(rest > 0 ? [`…and ${rest} more — see \\`config\\` above.`] : []),\n ];\n}\n\n/**\n * Several unwired items of one kind usually share one destination — chat\n * r57ed43j had 24 HubSpot side effects all sending to the same form — so\n * name the call that fills them all at once.\n */\nfunction repeatedKindHints(slug: string, pending: FlowConfigStatus[]): string[] {\n const counts = new Map<string, number>();\n for (const row of pending) counts.set(row.kind, (counts.get(row.kind) ?? 0) + 1);\n return [...counts].flatMap(([kind, count]) => {\n if (count < 2) return [];\n if (kind === \"hubspotForm\") {\n return [\n `${count} hubspotForm side effects are unwired. When they all send to the same HubSpot form: baker flows connect ${slug} --all --hubspot-form <formId>.`,\n ];\n }\n if (!(FLOW_AGENT_DESTINATION_KINDS as readonly string[]).includes(kind)) return [];\n return [\n `${count} ${kind} items are unwired. When they share one destination: baker flows connect ${slug} --all --type ${kind} [--resource <id>].`,\n ];\n });\n}\n\n/** Enough for any real form; the cap only stops a pathological tree flooding the response. */\nconst MAX_PENDING_HINTS = 6;\n\n/**\n * Side effects wired to a moment their own step never raises.\n *\n * `fireSideEffects` filters on `triggerId` equality, so one that does not match\n * is inert: written, valid, green on every check in the repo, and it never\n * runs. Nothing else in the toolchain looks at the pair — `validate-flow.mjs`\n * only checks the key is present and `validate-flow-schema.mjs` does not read\n * it at all — so a form can report \"fully configured\" while a side effect on it\n * has never fired once. This is the one command that is asked whether a form is\n * wired up, so it is the one that has to say.\n *\n * Silent about a node type the trigger table does not cover: no opinion is the\n * honest answer there, and a false \"this never fires\" on a working form would\n * cost more than the warning is worth.\n */\nexport function inertSideEffectHints(tree: Record<string, unknown>): string[] {\n const dead = collectSideEffects(tree).flatMap(({ node, sideEffect }) => {\n const triggers = flowNodeTriggers(node.nodeData);\n if (!triggers.known) return [];\n const triggerId = String(sideEffect.triggerId ?? \"\");\n if (triggers.available.includes(triggerId)) return [];\n const where = `${String(sideEffect.id ?? sideEffect.type)} on \"${String(node.name ?? node.id)}\"`;\n const raises =\n triggers.available.length > 0\n ? `It raises: ${triggers.available.join(\", \")}.`\n : (triggers.why ?? \"That step raises nothing.\");\n return [`${where} fires on \\`${triggerId || \"(none)\"}\\`, which that step never raises. ${raises}`];\n });\n\n if (dead.length === 0) return [];\n return [\n `${dead.length} side effect${dead.length === 1 ? \" has\" : \"s have\"} a triggerId their step never raises, so ${dead.length === 1 ? \"it never runs\" : \"they never run\"} — no error, nothing half-written, just nothing. A triggerId belongs to the STEP, not to the side-effect type.`,\n ...dead.slice(0, MAX_PENDING_HINTS),\n ...(dead.length > MAX_PENDING_HINTS ? [`…and ${dead.length - MAX_PENDING_HINTS} more.`] : []),\n \"Fix each by setting the id its own step raises: `baker flows schema node <nodeType>` lists them.\",\n ];\n}\n\n/**\n * Where the company funnel stands on this Form.\n *\n * A Form moves nobody along the company funnel until a step names one of its\n * endings, and nothing places it for the agent — so a Form that is configured,\n * fires every pixel and counts its conversions can still leave \"Became a lead\"\n * at zero. `show` reads only the local file and cannot tell whether a step\n * names it; `baker funnel` can, so the hint names that read and the write.\n */\nexport function funnelPlacementHint(slug: string): string {\n return `Whether this Form moves anyone along the company funnel is not in _data.json either: \\`baker funnel\\` names every Form no step counts. If it names this one, place its ending on the step it moves people to — \\`submit:${slug}\\`, or its booking trigger, both listed by \\`baker funnel --moments\\` — with \\`baker funnel --step\\`, which replaces the step it names, so keep that step's other ways in.`;\n}\n\n/**\n * What this Form's destination has changed under it, asked of Baker.\n *\n * A read the Company Workspace cannot do for itself twice over: the findings\n * live on the `flows` row, and the HubSpot form id a repair needs is inside an\n * encrypted config. Before this, detection had no reader in the Runtime at all\n * — 47 live findings across 11 Forms, and an agent editing one of those Forms\n * could not see a single one.\n *\n * A failure returns null rather than `[]`. They are different answers and\n * collapsing them would report a Form healthy on the strength of a network\n * error, which is exactly the silence the drift check exists to break.\n */\nasync function readDrift(slug: string): Promise<FlowsDriftResponse | null> {\n try {\n const response = await apiPost<{ ok: true; data: FlowsDriftResponse }>(\"/api/flows/drift\", { slug });\n return response.data;\n } catch {\n return null;\n }\n}\n\n/**\n * Drift said to an agent: what is wrong, and the command that fixes it.\n *\n * The summary comes from `@baker/api`, which the dashboard badge reads too, so\n * this and the badge cannot come apart about whether a Form is healthy. What is\n * added here is the half that is the CLI's: the repair, spelled as a command\n * line, because an agent that has to go and work out `--prune-missing` for\n * itself will instead reach for `--replace` and delete the mappings that still\n * work.\n */\nexport function driftHints(slug: string, drift: FlowsDriftResponse | null): string[] {\n if (drift === null) {\n return [\n \"Could not check whether this Form's destination has changed under it. Treat that as UNKNOWN, not as healthy — a deleted HubSpot field refuses every submission while the visitor still sees the thank-you screen.\",\n ];\n }\n\n const forms = drift.forms.filter((form) => form.slug === slug);\n if (forms.length === 0) {\n return drift.checkedAt === null\n ? [\n \"This Form's destination has never been checked, so nothing here says it is healthy — only that nothing was compared.\",\n ]\n : [];\n }\n\n return forms.flatMap((form: FlowDrift) => {\n const repair = driftRepairHint(slug, form.formGuid, form.deadFields, form.sideEffectId);\n return [`DESTINATION DRIFT (${form.severity}): ${form.summary}`, ...(repair === null ? [] : [repair])];\n });\n}\n\nfunction displayName(slug: string): string {\n const tree = readFlowTree(slug);\n const name = tree.displayName;\n return typeof name === \"string\" && name.trim() ? name.trim() : slug;\n}\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List Forms in this workspace with the count of confidential fields still needing setup. Example: baker flows list\",\n },\n run: () => {\n const flows: FlowSummary[] = listFlowSlugs().map((slug) => ({\n slug,\n name: displayName(slug),\n needsConfig: statusFor(slug).filter((c) => c.needsInput).length,\n }));\n const pending = flows.filter((flow) => flow.needsConfig > 0);\n writeJson({\n ok: true,\n data: { flows },\n hints: [\n ...(pending.length > 0\n ? [\n `Still unwired: ${pending.map((flow) => `${flow.slug} (${flow.needsConfig})`).join(\", \")}. \\`baker flows show <slug>\\` returns the command that wires each — most you run yourself.`,\n ]\n : []),\n // \"Set the conversions on the Forms\" lands here first, and nothing in\n // this family can do it — the conversion side effects it does offer\n // fire a pixel and are not what any Baker report counts.\n \"Setting what a Form COUNTS is not in this family: a conversion is a named event held in Baker. `baker analytics conversions` lists what this company counts; `--flow <slug>` spells one Form's endings as keys you can count, traffic or no traffic.\",\n ],\n });\n },\n});\n\nconst showCommand = defineCommand({\n meta: {\n name: \"show\",\n description:\n \"Show a Form's confidential fields and their configuration status (never secret values). Example: baker flows show contact\",\n },\n args: {\n slug: { type: \"positional\", description: \"Form slug\", required: true },\n full: { type: \"boolean\", description: \"Include the full flow tree (secret values redacted)\" },\n },\n run: async ({ args }) => {\n const slug = String(args.slug);\n const tree = readFlowTree(slug);\n const [drift, settings] = await Promise.all([readDrift(slug), readSettings(tree)]);\n const config = withSettings(statusFor(slug), settings ?? {});\n const response: FlowsShowResponse = {\n slug,\n name: displayName(slug),\n config,\n drift: drift === null ? null : drift.forms.filter((form) => form.slug === slug),\n ...(drift === null ? {} : { driftCheckedAt: drift.checkedAt }),\n ...(args.full === true ? { tree: redactTree(tree) } : {}),\n };\n writeJson({\n ok: true,\n data: response,\n // Drift first, above everything. The other hints are about work still to\n // do; this one is about leads already being lost, and it is the only\n // thing here that is true of a Form that looks completely finished.\n hints: [\n ...driftHints(slug, drift),\n ...inertSideEffectHints(tree),\n ...pendingInputHints(slug, config),\n // The question this command is asked — \"is this Form wired up?\" — has\n // an answer that is not in this file at all. What a Form counts is a\n // named event in Baker, and a Form can be perfectly configured, fire\n // every pixel it has, and still report converting nobody.\n `What this Form counts as a conversion is NOT in _data.json and not in any side effect here: it is a named event held in Baker. Read it, and this Form's own endings spelled as event keys, with \\`baker analytics conversions --flow ${slug}\\`.`,\n funnelPlacementHint(slug),\n ],\n });\n },\n});\n\nexport const flowsCommand = defineCommand({\n meta: {\n name: \"flows\",\n description: `Read and shape this workspace's Forms (flows).\n\nReads never reveal a secret value. Writes touch only the form's own _data.json — they stage structure, never a live system.\n\nWire every destination yourself — no card for the user: an email (\\`connect --email \"a@x.com, b@x.com\" --subject \"New lead — Contact\"\\`; write the subject yourself), a webhook without a token (\\`--url\\`), and any connected platform once you know which resource is meant (\\`baker flows options <kind>\\` lists it; Calendly, SavvyCal, GoHighLevel steps; Google Sheets, Pipedrive, GoHighLevel, ActiveCampaign and HubSpot destinations; \\`--same-as\\` copies another Form's). A HubSpot step takes \\`baker hubspot forms view <id> --as-node\\`. \\`show\\` reads back where each destination sends; a credential is never shown.\n\nThe request_flow_input tool (baker_ui MCP server) is only for what the user alone holds: a typed secret (a webhook token, Zapier, Crmble), a platform nobody connected, or several resources that could equally be meant.\n\nExamples:\n baker flows list # every Form + how many fields still need setup\n baker flows show contact # one Form's confidential fields and their status\n baker flows schema node customForm # the shape of a step, before you author one\n baker flows add-node contact --type text --name \"Thanks\"\n baker flows add-side-effect contact --node <id> --type googleSpreadsheet\n baker flows options calendly # what the connected account holds\n baker flows connect contact --node book --resource <id>\n baker flows connect contact --side-effect se-email-1 --email \"ana@x.com, luis@x.com\" --subject \"New lead — Contact\"\n baker flows connect contact --side-effect se-hubspotForm-1 --hubspot-form <formId> # --all: every unwired one\n baker flows map contact --map A=name --map B=email --write\nFull guide: __tooling__/docs/tools/baker/flows.md`,\n },\n subCommands: {\n list: listCommand,\n show: showCommand,\n schema: () => import(\"./schema.ts\").then((m) => m.schemaCommand),\n \"add-node\": () => import(\"./add.ts\").then((m) => m.addNodeCommand),\n \"add-side-effect\": () => import(\"./add.ts\").then((m) => m.addSideEffectCommand),\n options: () => import(\"./options.ts\").then((m) => m.optionsCommand),\n connect: () => import(\"./connect.ts\").then((m) => m.connectCommand),\n map: () => import(\"./map.ts\").then((m) => m.mapCommand),\n normalize: () => import(\"./normalize.ts\").then((m) => m.normalizeCommand),\n },\n // Bare `baker flows` lists the Forms. This must be `default`, not `run`: citty falls\n // through to `run` after dispatching a subcommand, so a `run` here would also print\n // the list on every `baker flows show <slug>`.\n default: \"list\",\n});\n"],"mappings":"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","names":[]}
|
package/dist/fonts-YPNN7ZJP.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
fetchJson,
|
|
3
|
-
fontsAdoptCommand,
|
|
4
|
-
fontsCheckCommand,
|
|
5
|
-
fontsCommand,
|
|
6
|
-
fontsFetchCommand,
|
|
7
|
-
lookupGoogleCss
|
|
8
|
-
} from "./chunk-AFD32O4A.js";
|
|
9
|
-
import "./chunk-Q5WBTVA7.js";
|
|
10
|
-
import "./chunk-NEU5QD2C.js";
|
|
11
|
-
import "./chunk-3S274625.js";
|
|
12
|
-
import "./chunk-UFKO626N.js";
|
|
13
|
-
import "./chunk-XRIM7NYV.js";
|
|
14
|
-
import "./chunk-S4VLLGTW.js";
|
|
15
|
-
import "./chunk-MCJ5I5LR.js";
|
|
16
|
-
import "./chunk-U7YR5CZL.js";
|
|
17
|
-
import "./chunk-VI5YQQ63.js";
|
|
18
|
-
import "./chunk-JX7BX2NB.js";
|
|
19
|
-
import "./chunk-DAO63OOP.js";
|
|
20
|
-
import "./chunk-GXDLWBOY.js";
|
|
21
|
-
import "./chunk-GIWHHCD6.js";
|
|
22
|
-
import "./chunk-XQIOCIDO.js";
|
|
23
|
-
import "./chunk-WTJSMYY2.js";
|
|
24
|
-
import "./chunk-D5NEIESR.js";
|
|
25
|
-
import "./chunk-57KKVDDR.js";
|
|
26
|
-
import "./chunk-QANGHND7.js";
|
|
27
|
-
import "./chunk-YQSBHWOI.js";
|
|
28
|
-
export {
|
|
29
|
-
fetchJson,
|
|
30
|
-
fontsAdoptCommand,
|
|
31
|
-
fontsCheckCommand,
|
|
32
|
-
fontsCommand,
|
|
33
|
-
fontsFetchCommand,
|
|
34
|
-
lookupGoogleCss
|
|
35
|
-
};
|
|
36
|
-
//# sourceMappingURL=fonts-YPNN7ZJP.js.map
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
LINKEDIN_FORECAST_DEFAULT_DAYS,
|
|
3
|
-
linkedinForecastRequestSchema
|
|
4
|
-
} from "./chunk-3WAYZQNV.js";
|
|
5
|
-
import {
|
|
6
|
-
exitOnInvalidArgs,
|
|
7
|
-
handleLinkedinError,
|
|
8
|
-
loadTargetingArg,
|
|
9
|
-
resolveAccountIdArg
|
|
10
|
-
} from "./chunk-VB3XUR6A.js";
|
|
11
|
-
import {
|
|
12
|
-
writeAdsJson
|
|
13
|
-
} from "./chunk-2VIZ4UUZ.js";
|
|
14
|
-
import {
|
|
15
|
-
NO_CACHE_ARG
|
|
16
|
-
} from "./chunk-U6RONIJC.js";
|
|
17
|
-
import "./chunk-DAO63OOP.js";
|
|
18
|
-
import "./chunk-GXDLWBOY.js";
|
|
19
|
-
import "./chunk-GIWHHCD6.js";
|
|
20
|
-
import "./chunk-XQIOCIDO.js";
|
|
21
|
-
import "./chunk-WTJSMYY2.js";
|
|
22
|
-
import {
|
|
23
|
-
apiPost
|
|
24
|
-
} from "./chunk-6YLNY6CK.js";
|
|
25
|
-
import "./chunk-D5NEIESR.js";
|
|
26
|
-
import "./chunk-57KKVDDR.js";
|
|
27
|
-
import "./chunk-QANGHND7.js";
|
|
28
|
-
import "./chunk-YQSBHWOI.js";
|
|
29
|
-
|
|
30
|
-
// src/commands/ads/linkedin/forecast.ts
|
|
31
|
-
import { defineCommand } from "citty";
|
|
32
|
-
var FLAG_OF_FIELD = {
|
|
33
|
-
objectiveType: "--objective",
|
|
34
|
-
costType: "--cost-type",
|
|
35
|
-
campaignType: "--campaign-type",
|
|
36
|
-
startDate: "--start",
|
|
37
|
-
days: "--days",
|
|
38
|
-
dailyBudget: "--daily-budget",
|
|
39
|
-
totalBudget: "--total-budget",
|
|
40
|
-
bid: "--bid",
|
|
41
|
-
optimizationTarget: "--optimization-target",
|
|
42
|
-
targetingCriteria: "--targeting"
|
|
43
|
-
};
|
|
44
|
-
function parseMoney(raw) {
|
|
45
|
-
if (typeof raw !== "string" || raw.trim() === "") return void 0;
|
|
46
|
-
const m = /^(\d+(?:\.\d+)?)(?:\s+([A-Za-z]{3}))?$/.exec(raw.trim());
|
|
47
|
-
if (!m?.[1]) return raw;
|
|
48
|
-
return m[2] ? { amount: m[1], currencyCode: m[2].toUpperCase() } : { amount: m[1] };
|
|
49
|
-
}
|
|
50
|
-
var forecastCommand = defineCommand({
|
|
51
|
-
meta: {
|
|
52
|
-
name: "forecast",
|
|
53
|
-
description: `Forecast what a campaign that doesn't exist yet would deliver \u2014 LinkedIn's own estimate, the "Forecasted results" Campaign Manager shows while building one.
|
|
54
|
-
|
|
55
|
-
Returns, for the whole period: results (impressions, clicks, leads, spend, \u2026), LinkedIn's unit costs (cpc, cpm, costPerLead, \u2026) and rates (ctr, \u2026), each as { value, low, high }. Unit costs are LinkedIn's per-result estimates and need not equal spend \xF7 results; spend can stay under the budget when the bid or audience caps delivery.
|
|
56
|
-
|
|
57
|
-
A budget is required (--daily-budget or --total-budget). With --bid it forecasts that manual bid (get one from \`bid-pricing\`); without it, LinkedIn's automated bidding for the objective (LEAD_GENERATION, WEBSITE_VISIT, BRAND_AWARENESS, VIDEO_VIEW \u2014 others need --bid or --optimization-target). The period starts tomorrow (or --start) and lasts --days (default ${LINKEDIN_FORECAST_DEFAULT_DAYS}). Amounts without a currency use the ad account's.
|
|
58
|
-
|
|
59
|
-
Start here:
|
|
60
|
-
baker ads linkedin forecast --account-id 503001492 --objective LEAD_GENERATION --total-budget 7250 --days 28 --targeting-file targeting.json
|
|
61
|
-
baker ads linkedin forecast --account-id 503001492 --objective LEAD_GENERATION --bid 5.57 --cost-type CPC --daily-budget "250 EUR" --targeting-file targeting.json`
|
|
62
|
-
},
|
|
63
|
-
args: {
|
|
64
|
-
"account-id": { type: "string", description: "Numeric account ID or urn:li:sponsoredAccount:N" },
|
|
65
|
-
"account-urn": { type: "string", description: "Alias for --account-id" },
|
|
66
|
-
objective: { type: "string", description: "Objective type (e.g. LEAD_GENERATION, WEBSITE_VISIT)" },
|
|
67
|
-
"cost-type": { type: "string", description: "Bid type of --bid: CPC (default) | CPM | CPV", default: "CPC" },
|
|
68
|
-
"campaign-type": {
|
|
69
|
-
type: "string",
|
|
70
|
-
description: "SPONSORED_UPDATES (default, sponsored content) | SPONSORED_INMAILS | DYNAMIC",
|
|
71
|
-
default: "SPONSORED_UPDATES"
|
|
72
|
-
},
|
|
73
|
-
"daily-budget": { type: "string", description: "e.g. '250' or '250 EUR'" },
|
|
74
|
-
"total-budget": { type: "string", description: "Budget for the whole period, e.g. '7250' or '7250 EUR'" },
|
|
75
|
-
bid: { type: "string", description: "Manual bid, e.g. '5.57' or '5.57 EUR'. Omit for automated bidding" },
|
|
76
|
-
"optimization-target": {
|
|
77
|
-
type: "string",
|
|
78
|
-
description: "Automated-bidding goal when --bid is omitted (e.g. MAX_LEAD, MAX_CLICK)"
|
|
79
|
-
},
|
|
80
|
-
start: { type: "string", description: "First day, YYYY-MM-DD (default tomorrow, UTC)" },
|
|
81
|
-
days: { type: "string", description: `Length of the period in days (default ${LINKEDIN_FORECAST_DEFAULT_DAYS})` },
|
|
82
|
-
targeting: { type: "string", description: "Inline JSON targetingCriteria" },
|
|
83
|
-
"targeting-file": { type: "string", description: "Path to JSON file with targetingCriteria" },
|
|
84
|
-
full: { type: "boolean", description: "Also return LinkedIn's daily / 7-day / 30-day series", default: false },
|
|
85
|
-
"no-cache": NO_CACHE_ARG,
|
|
86
|
-
output: { type: "string", description: "json", default: "json" }
|
|
87
|
-
},
|
|
88
|
-
run: async ({ args }) => {
|
|
89
|
-
const accountId = resolveAccountIdArg(args);
|
|
90
|
-
const targetingCriteria = loadTargetingArg(args);
|
|
91
|
-
const parsed = linkedinForecastRequestSchema.safeParse({
|
|
92
|
-
accountId,
|
|
93
|
-
objectiveType: args.objective ? String(args.objective).toUpperCase() : void 0,
|
|
94
|
-
costType: String(args["cost-type"]).toUpperCase(),
|
|
95
|
-
campaignType: String(args["campaign-type"]).toUpperCase(),
|
|
96
|
-
startDate: args.start || void 0,
|
|
97
|
-
days: args.days ? Number(args.days) : void 0,
|
|
98
|
-
dailyBudget: parseMoney(args["daily-budget"]),
|
|
99
|
-
totalBudget: parseMoney(args["total-budget"]),
|
|
100
|
-
bid: parseMoney(args.bid),
|
|
101
|
-
optimizationTarget: args["optimization-target"] ? String(args["optimization-target"]).toUpperCase() : void 0,
|
|
102
|
-
targetingCriteria,
|
|
103
|
-
full: Boolean(args.full),
|
|
104
|
-
skipCache: Boolean(args["no-cache"])
|
|
105
|
-
});
|
|
106
|
-
if (!parsed.success) exitOnInvalidArgs(parsed.error.issues, FLAG_OF_FIELD);
|
|
107
|
-
try {
|
|
108
|
-
const data = await apiPost("/api/ads/linkedin/forecast", parsed.data);
|
|
109
|
-
writeAdsJson({ ok: true, data });
|
|
110
|
-
} catch (err) {
|
|
111
|
-
handleLinkedinError(err);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
export {
|
|
116
|
-
forecastCommand
|
|
117
|
-
};
|
|
118
|
-
//# sourceMappingURL=forecast-OBSHG2GJ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/ads/linkedin/forecast.ts"],"sourcesContent":["import { LINKEDIN_FORECAST_DEFAULT_DAYS, linkedinForecastRequestSchema } from \"@baker/api/ads-linkedin/planning\";\nimport { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeAdsJson } from \"../output.ts\";\nimport { exitOnInvalidArgs, handleLinkedinError, loadTargetingArg, resolveAccountIdArg } from \"./shared.ts\";\n\nconst FLAG_OF_FIELD: Record<string, string> = {\n objectiveType: \"--objective\",\n costType: \"--cost-type\",\n campaignType: \"--campaign-type\",\n startDate: \"--start\",\n days: \"--days\",\n dailyBudget: \"--daily-budget\",\n totalBudget: \"--total-budget\",\n bid: \"--bid\",\n optimizationTarget: \"--optimization-target\",\n targetingCriteria: \"--targeting\",\n};\n\ntype Money = { amount: string; currencyCode: string };\ntype Range = { value: number; low: number; high: number };\n\ninterface ForecastResult {\n period: { start: string; end: string; days: number };\n budget: { daily?: Money; total?: Money };\n bidding: { mode: \"manual\"; bidType: string; bid: Money } | { mode: \"auto\"; optimizationTarget: string };\n results: Record<string, Range>;\n unitCosts: Record<string, Range>;\n rates: Record<string, Range>;\n series?: unknown[];\n}\n\n/** \"250\" or \"250 EUR\" → money; no currency means the ad account's. */\nfunction parseMoney(raw: unknown): { amount: string; currencyCode?: string } | string | undefined {\n if (typeof raw !== \"string\" || raw.trim() === \"\") return undefined;\n const m = /^(\\d+(?:\\.\\d+)?)(?:\\s+([A-Za-z]{3}))?$/.exec(raw.trim());\n if (!m?.[1]) return raw;\n return m[2] ? { amount: m[1], currencyCode: m[2].toUpperCase() } : { amount: m[1] };\n}\n\nexport const forecastCommand = defineCommand({\n meta: {\n name: \"forecast\",\n description: `Forecast what a campaign that doesn't exist yet would deliver — LinkedIn's own estimate, the \"Forecasted results\" Campaign Manager shows while building one.\n\nReturns, for the whole period: results (impressions, clicks, leads, spend, …), LinkedIn's unit costs (cpc, cpm, costPerLead, …) and rates (ctr, …), each as { value, low, high }. Unit costs are LinkedIn's per-result estimates and need not equal spend ÷ results; spend can stay under the budget when the bid or audience caps delivery.\n\nA budget is required (--daily-budget or --total-budget). With --bid it forecasts that manual bid (get one from \\`bid-pricing\\`); without it, LinkedIn's automated bidding for the objective (LEAD_GENERATION, WEBSITE_VISIT, BRAND_AWARENESS, VIDEO_VIEW — others need --bid or --optimization-target). The period starts tomorrow (or --start) and lasts --days (default ${LINKEDIN_FORECAST_DEFAULT_DAYS}). Amounts without a currency use the ad account's.\n\nStart here:\n baker ads linkedin forecast --account-id 503001492 --objective LEAD_GENERATION --total-budget 7250 --days 28 --targeting-file targeting.json\n baker ads linkedin forecast --account-id 503001492 --objective LEAD_GENERATION --bid 5.57 --cost-type CPC --daily-budget \"250 EUR\" --targeting-file targeting.json`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n objective: { type: \"string\", description: \"Objective type (e.g. LEAD_GENERATION, WEBSITE_VISIT)\" },\n \"cost-type\": { type: \"string\", description: \"Bid type of --bid: CPC (default) | CPM | CPV\", default: \"CPC\" },\n \"campaign-type\": {\n type: \"string\",\n description: \"SPONSORED_UPDATES (default, sponsored content) | SPONSORED_INMAILS | DYNAMIC\",\n default: \"SPONSORED_UPDATES\",\n },\n \"daily-budget\": { type: \"string\", description: \"e.g. '250' or '250 EUR'\" },\n \"total-budget\": { type: \"string\", description: \"Budget for the whole period, e.g. '7250' or '7250 EUR'\" },\n bid: { type: \"string\", description: \"Manual bid, e.g. '5.57' or '5.57 EUR'. Omit for automated bidding\" },\n \"optimization-target\": {\n type: \"string\",\n description: \"Automated-bidding goal when --bid is omitted (e.g. MAX_LEAD, MAX_CLICK)\",\n },\n start: { type: \"string\", description: \"First day, YYYY-MM-DD (default tomorrow, UTC)\" },\n days: { type: \"string\", description: `Length of the period in days (default ${LINKEDIN_FORECAST_DEFAULT_DAYS})` },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria\" },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file with targetingCriteria\" },\n full: { type: \"boolean\", description: \"Also return LinkedIn's daily / 7-day / 30-day series\", default: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n const targetingCriteria = loadTargetingArg(args);\n const parsed = linkedinForecastRequestSchema.safeParse({\n accountId,\n objectiveType: args.objective ? String(args.objective).toUpperCase() : undefined,\n costType: String(args[\"cost-type\"]).toUpperCase(),\n campaignType: String(args[\"campaign-type\"]).toUpperCase(),\n startDate: args.start || undefined,\n days: args.days ? Number(args.days) : undefined,\n dailyBudget: parseMoney(args[\"daily-budget\"]),\n totalBudget: parseMoney(args[\"total-budget\"]),\n bid: parseMoney(args.bid),\n optimizationTarget: args[\"optimization-target\"] ? String(args[\"optimization-target\"]).toUpperCase() : undefined,\n targetingCriteria,\n full: Boolean(args.full),\n skipCache: Boolean(args[\"no-cache\"]),\n });\n if (!parsed.success) exitOnInvalidArgs(parsed.error.issues, FLAG_OF_FIELD);\n try {\n const data = await apiPost<ForecastResult>(\"/api/ads/linkedin/forecast\", parsed.data);\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n"],"mappings":"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","names":[]}
|
package/dist/funnel-A4MXQYBA.js
DELETED
|
@@ -1,394 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
FUNNEL_VERTICALS,
|
|
3
|
-
funnelRequestSchema
|
|
4
|
-
} from "./chunk-G4OFH3MX.js";
|
|
5
|
-
import {
|
|
6
|
-
flowEventKeys
|
|
7
|
-
} from "./chunk-XCKINS7K.js";
|
|
8
|
-
import {
|
|
9
|
-
flowDataPath,
|
|
10
|
-
listFlowSlugs
|
|
11
|
-
} from "./chunk-Q3LXLWZY.js";
|
|
12
|
-
import {
|
|
13
|
-
parseEventKey
|
|
14
|
-
} from "./chunk-BC2BXRXY.js";
|
|
15
|
-
import "./chunk-EDLZGTGN.js";
|
|
16
|
-
import {
|
|
17
|
-
writeJsonEnvelope
|
|
18
|
-
} from "./chunk-2VIZ4UUZ.js";
|
|
19
|
-
import "./chunk-DAO63OOP.js";
|
|
20
|
-
import "./chunk-GXDLWBOY.js";
|
|
21
|
-
import "./chunk-GIWHHCD6.js";
|
|
22
|
-
import "./chunk-XQIOCIDO.js";
|
|
23
|
-
import "./chunk-WTJSMYY2.js";
|
|
24
|
-
import {
|
|
25
|
-
ApiError,
|
|
26
|
-
apiPost
|
|
27
|
-
} from "./chunk-6YLNY6CK.js";
|
|
28
|
-
import "./chunk-D5NEIESR.js";
|
|
29
|
-
import "./chunk-57KKVDDR.js";
|
|
30
|
-
import {
|
|
31
|
-
registerSchema
|
|
32
|
-
} from "./chunk-QANGHND7.js";
|
|
33
|
-
import "./chunk-YQSBHWOI.js";
|
|
34
|
-
|
|
35
|
-
// src/commands/funnel/index.ts
|
|
36
|
-
import { readFileSync } from "fs";
|
|
37
|
-
import { defineCommand } from "citty";
|
|
38
|
-
|
|
39
|
-
// src/commands/funnel/formMoments.ts
|
|
40
|
-
function offeredEndings(form) {
|
|
41
|
-
return flowEventKeys(form.tree, form.slug).filter((ending) => ending.isCompletion || ending.nodeId === null);
|
|
42
|
-
}
|
|
43
|
-
function formMoments(events, forms, counted) {
|
|
44
|
-
const endings = /* @__PURE__ */ new Map();
|
|
45
|
-
for (const form of forms) {
|
|
46
|
-
for (const ending of offeredEndings(form)) endings.set(ending.eventKey, { slug: form.slug, ending });
|
|
47
|
-
}
|
|
48
|
-
const known = events.map((event) => {
|
|
49
|
-
const found = endings.get(event.eventKey);
|
|
50
|
-
if (found === void 0) return event;
|
|
51
|
-
endings.delete(event.eventKey);
|
|
52
|
-
return { ...event, step: found.ending.nodeName };
|
|
53
|
-
});
|
|
54
|
-
const unfired = [...endings.values()].map(({ slug, ending }) => {
|
|
55
|
-
const countedAs = counted.get(ending.eventKey);
|
|
56
|
-
return {
|
|
57
|
-
eventKey: ending.eventKey,
|
|
58
|
-
origin: "site",
|
|
59
|
-
flowSlug: slug,
|
|
60
|
-
...ending.nodeType === null ? {} : { nodeType: ending.nodeType },
|
|
61
|
-
events: 0,
|
|
62
|
-
sessions: 0,
|
|
63
|
-
step: ending.nodeName,
|
|
64
|
-
seen: false,
|
|
65
|
-
...countedAs === void 0 ? {} : { countedAs }
|
|
66
|
-
};
|
|
67
|
-
});
|
|
68
|
-
return [...known, ...unfired];
|
|
69
|
-
}
|
|
70
|
-
function withFormMoments(moments, forms, counted) {
|
|
71
|
-
return { ...moments, events: formMoments(moments.events, forms, counted) };
|
|
72
|
-
}
|
|
73
|
-
function formsNamedHere(forms) {
|
|
74
|
-
return forms.filter((form) => flowEventKeys(form.tree, form.slug).length > 0).map((form) => form.slug);
|
|
75
|
-
}
|
|
76
|
-
function unplacedFormHints(steps, forms, counted) {
|
|
77
|
-
const onAStep = new Set(
|
|
78
|
-
steps.flatMap((step) => (step.triggers ?? []).flatMap((trigger) => trigger.eventKey ? [trigger.eventKey] : []))
|
|
79
|
-
);
|
|
80
|
-
const unplaced = [];
|
|
81
|
-
for (const form of forms) {
|
|
82
|
-
const endings = flowEventKeys(form.tree, form.slug);
|
|
83
|
-
if (endings.length === 0 || endings.some((ending) => onAStep.has(ending.eventKey))) continue;
|
|
84
|
-
const countedOn = endings.filter((ending) => counted.has(ending.eventKey));
|
|
85
|
-
unplaced.push(
|
|
86
|
-
countedOn.length === 0 ? form.slug : `${form.slug} (counted as ${countedOn.map((ending) => `"${counted.get(ending.eventKey)}" on \`${ending.eventKey}\``).join(", ")})`
|
|
87
|
-
);
|
|
88
|
-
}
|
|
89
|
-
if (unplaced.length === 0) return [];
|
|
90
|
-
return [
|
|
91
|
-
`${unplaced.length} Form(s) in this workspace reach no funnel step, so they move nobody along it however many people finish them: ${unplaced.join("; ")}. Which ending moves somebody to which step is your call: \`baker funnel --moments\` lists every Form's endings by the step each happens on, and when the step names do not make it obvious \u2014 a Form that branches into a rejection and a confirmation \u2014 ask the person which one means a lead or a customer. Place it with \`baker funnel --add-trigger <step> --event <key>\`. A Form already counted as a page conversion goes on the funnel by THAT SAME key, or the two numbers disagree for ever.`
|
|
92
|
-
];
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// src/commands/funnel/funnelArgs.ts
|
|
96
|
-
var FunnelArgsError = class extends Error {
|
|
97
|
-
/** Structured remediation, in the shape the CLI's error envelope carries. */
|
|
98
|
-
fix;
|
|
99
|
-
constructor(message, fix) {
|
|
100
|
-
super(message);
|
|
101
|
-
this.name = "FunnelArgsError";
|
|
102
|
-
if (fix) {
|
|
103
|
-
this.fix = fix;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
};
|
|
107
|
-
function parseFunnelArgs(raw) {
|
|
108
|
-
const steps = parseSteps(raw.steps);
|
|
109
|
-
const step = parseStep(raw.step);
|
|
110
|
-
const removeStep = parseRemoveStep(raw["remove-step"] ?? raw.removeStep);
|
|
111
|
-
const preset = parsePreset(raw.preset);
|
|
112
|
-
const addTrigger = parseWayIn(raw["add-trigger"] ?? raw.addTrigger, raw.event, "--add-trigger");
|
|
113
|
-
const removeTrigger = parseWayIn(raw["remove-trigger"] ?? raw.removeTrigger, raw.event, "--remove-trigger");
|
|
114
|
-
const doors = [steps, step, removeStep, preset, addTrigger, removeTrigger].filter(
|
|
115
|
-
(door) => door !== void 0
|
|
116
|
-
).length;
|
|
117
|
-
if (doors > 1) {
|
|
118
|
-
throw new FunnelArgsError(
|
|
119
|
-
"Give one of --steps, --step, --remove-step, --preset, --add-trigger or --remove-trigger, not two."
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
const days = raw.days === void 0 ? void 0 : Number(raw.days);
|
|
123
|
-
if (days !== void 0 && (!Number.isInteger(days) || days <= 0 || days > 400)) {
|
|
124
|
-
throw new FunnelArgsError("--days must be a whole number of days, from 1 to 400.");
|
|
125
|
-
}
|
|
126
|
-
return {
|
|
127
|
-
...steps === void 0 ? {} : { steps },
|
|
128
|
-
...step === void 0 ? {} : { step },
|
|
129
|
-
...removeStep === void 0 ? {} : { removeStep },
|
|
130
|
-
...preset === void 0 ? {} : { preset },
|
|
131
|
-
...addTrigger === void 0 ? {} : { addTrigger },
|
|
132
|
-
...removeTrigger === void 0 ? {} : { removeTrigger },
|
|
133
|
-
templates: raw.templates === true,
|
|
134
|
-
moments: raw.moments === true,
|
|
135
|
-
...days === void 0 ? {} : { days }
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
function funnelWrite(args2) {
|
|
139
|
-
const body = {
|
|
140
|
-
...args2.steps === void 0 ? {} : { steps: args2.steps },
|
|
141
|
-
...args2.step === void 0 ? {} : { step: args2.step },
|
|
142
|
-
...args2.removeStep === void 0 ? {} : { removeStep: args2.removeStep },
|
|
143
|
-
...args2.preset === void 0 ? {} : { preset: args2.preset },
|
|
144
|
-
...args2.addTrigger === void 0 ? {} : { addTrigger: args2.addTrigger },
|
|
145
|
-
...args2.removeTrigger === void 0 ? {} : { removeTrigger: args2.removeTrigger },
|
|
146
|
-
...args2.templates ? { templates: true } : {},
|
|
147
|
-
...args2.moments ? { moments: true } : {},
|
|
148
|
-
...args2.days === void 0 ? {} : { days: args2.days }
|
|
149
|
-
};
|
|
150
|
-
const parsed = funnelRequestSchema.safeParse(body);
|
|
151
|
-
if (!parsed.success) {
|
|
152
|
-
const issue = parsed.error.issues[0];
|
|
153
|
-
throw new FunnelArgsError(
|
|
154
|
-
`That funnel cannot be sent \u2014 ${issue?.path.join(".") || "steps"}: ${issue?.message ?? "invalid"}`,
|
|
155
|
-
{
|
|
156
|
-
action: "read_the_schema",
|
|
157
|
-
explanation: "Run `baker schema funnel` for the exact shape of one step, or `baker funnel --templates` for sixteen worked examples plus every field an event carries."
|
|
158
|
-
}
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
return parsed.data;
|
|
162
|
-
}
|
|
163
|
-
function parseSteps(raw) {
|
|
164
|
-
if (raw === void 0) {
|
|
165
|
-
return void 0;
|
|
166
|
-
}
|
|
167
|
-
if (typeof raw !== "string") {
|
|
168
|
-
throw new FunnelArgsError("--steps takes a JSON array of steps.");
|
|
169
|
-
}
|
|
170
|
-
let parsed;
|
|
171
|
-
try {
|
|
172
|
-
parsed = JSON.parse(raw);
|
|
173
|
-
} catch (cause) {
|
|
174
|
-
throw new FunnelArgsError(`--steps is not valid JSON: ${cause instanceof Error ? cause.message : "parse failed"}`, {
|
|
175
|
-
action: "quote_the_json",
|
|
176
|
-
explanation: `Wrap the whole array in single quotes so the shell leaves the double quotes alone: --steps '[{"key":"lead",...}]'.`
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
if (!Array.isArray(parsed)) {
|
|
180
|
-
throw new FunnelArgsError("--steps takes an ARRAY of steps, even when the funnel has one step.");
|
|
181
|
-
}
|
|
182
|
-
refuseRetiredShapes(parsed);
|
|
183
|
-
return parsed;
|
|
184
|
-
}
|
|
185
|
-
function parseStep(raw) {
|
|
186
|
-
if (raw === void 0) {
|
|
187
|
-
return void 0;
|
|
188
|
-
}
|
|
189
|
-
if (typeof raw !== "string") {
|
|
190
|
-
throw new FunnelArgsError("--step takes one step as a JSON object.");
|
|
191
|
-
}
|
|
192
|
-
let parsed;
|
|
193
|
-
try {
|
|
194
|
-
parsed = JSON.parse(raw);
|
|
195
|
-
} catch (cause) {
|
|
196
|
-
throw new FunnelArgsError(`--step is not valid JSON: ${cause instanceof Error ? cause.message : "parse failed"}`, {
|
|
197
|
-
action: "quote_the_json",
|
|
198
|
-
explanation: `Wrap the object in single quotes so the shell leaves the double quotes alone: --step '{"key":"demo",...}'.`
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
202
|
-
throw new FunnelArgsError("--step takes ONE step as an object. To restate several, use --steps with an array.");
|
|
203
|
-
}
|
|
204
|
-
refuseRetiredShapes([parsed]);
|
|
205
|
-
return parsed;
|
|
206
|
-
}
|
|
207
|
-
function parseRemoveStep(raw) {
|
|
208
|
-
if (raw === void 0) {
|
|
209
|
-
return void 0;
|
|
210
|
-
}
|
|
211
|
-
if (typeof raw !== "string" || raw.trim() === "") {
|
|
212
|
-
throw new FunnelArgsError("--remove-step takes the key of the step to take off, as `baker funnel` lists it.");
|
|
213
|
-
}
|
|
214
|
-
return raw.trim();
|
|
215
|
-
}
|
|
216
|
-
function refuseRetiredShapes(steps) {
|
|
217
|
-
for (const step of steps) {
|
|
218
|
-
if (typeof step !== "object" || step === null) continue;
|
|
219
|
-
const key = String(step.key ?? "?");
|
|
220
|
-
if ("offlineConversions" in step) {
|
|
221
|
-
throw new FunnelArgsError(`Step "${key}" puts sends on the step, and a send belongs to the conversion.`, {
|
|
222
|
-
action: "set_sends_on_the_conversion",
|
|
223
|
-
explanation: "Drop `offlineConversions`. Name the outcome with `baker analytics conversions`, then `baker analytics sends --set --conversion <name> --platform <p> --tag <tagId> --event <e>`; the step reads its conversions' sends back as `sends[]`."
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
const triggers = step.triggers;
|
|
227
|
-
if (!Array.isArray(triggers)) continue;
|
|
228
|
-
const kinds = triggers.map(
|
|
229
|
-
(trigger) => typeof trigger === "object" && trigger !== null ? trigger.kind : void 0
|
|
230
|
-
);
|
|
231
|
-
if (kinds.includes("analytics") || kinds.includes("conversion")) {
|
|
232
|
-
const word = kinds.includes("analytics") ? "analytics" : "conversion";
|
|
233
|
-
throw new FunnelArgsError(
|
|
234
|
-
`Step "${key}" has a \`${word}\` trigger, and a step is reached by an event or a landing only.`,
|
|
235
|
-
{
|
|
236
|
-
action: "use_an_event_trigger",
|
|
237
|
-
explanation: 'Pick the moment from `baker funnel --moments` and write it as `{"kind":"event","eventKey":"<from moments.events or moments.sources>"}` \u2014 nothing has to be named first. A landing is `{"kind":"landing","landingId":"<from moments.landings>"}`.'
|
|
238
|
-
}
|
|
239
|
-
);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
function parsePreset(raw) {
|
|
244
|
-
if (raw === void 0) {
|
|
245
|
-
return void 0;
|
|
246
|
-
}
|
|
247
|
-
if (typeof raw !== "string" || !FUNNEL_VERTICALS.includes(raw)) {
|
|
248
|
-
throw new FunnelArgsError(`--preset must be one of: ${FUNNEL_VERTICALS.join(", ")}`, {
|
|
249
|
-
action: "list_the_presets",
|
|
250
|
-
explanation: "Run `baker funnel --templates` to see what each preset contains before picking one."
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
return raw;
|
|
254
|
-
}
|
|
255
|
-
function parseWayIn(stepKey, eventKey, flag) {
|
|
256
|
-
if (stepKey === void 0) return void 0;
|
|
257
|
-
if (typeof stepKey !== "string" || stepKey.trim() === "") {
|
|
258
|
-
throw new FunnelArgsError(`${flag} takes the key of the step to change: \`${flag} lead\`.`);
|
|
259
|
-
}
|
|
260
|
-
if (typeof eventKey !== "string" || eventKey.trim() === "") {
|
|
261
|
-
throw new FunnelArgsError(`${flag} needs --event, naming what gets somebody there.`, {
|
|
262
|
-
action: "read_the_moments",
|
|
263
|
-
explanation: `Run \`baker funnel --moments\` and copy an \`events[].eventKey\` \u2014 a Form's own outcome is listed there at zero before anybody has filled it in. Then: \`${flag} ${stepKey.trim()} --event "<key>"\`.`
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
const key = eventKey.trim();
|
|
267
|
-
if (flag === "--add-trigger" && parseEventKey(key) === null) {
|
|
268
|
-
throw new FunnelArgsError(`"${key}" is not an event key, so nothing would ever reach that step through it.`, {
|
|
269
|
-
action: "read_the_moments",
|
|
270
|
-
explanation: "Run `baker funnel --moments` and copy an `events[].eventKey`. They look like form:<form>:<step>:<trigger>, submit:<form>, page:<name> or view:<landing>."
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
return { stepKey: stepKey.trim(), eventKey: key };
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
// src/commands/funnel/index.ts
|
|
277
|
-
var args = {
|
|
278
|
-
steps: {
|
|
279
|
-
type: "string",
|
|
280
|
-
description: 'The WHOLE funnel, as a JSON array. One object per step: {"key":"meeting_held","displayName":"Demo held","stepClass":"engaged","after":["lead"],"triggers":[{"id":"t1","kind":"event","eventKey":"page:demo_held"}]}. It REPLACES the funnel rather than adding to it, so read first and restate everything you want to keep. `key` is permanent and reaches reporting and URLs (lowercase, digits, underscores); `displayName` is the client\'s own words and can be anything. `stepClass` is the stage, one of visited, lead, engaged, customer, repeat, lost \u2014 six plain words every business has, used to compare one company\'s funnel with another\'s. `after` is a LIST, so two ways into one step is expressible and normal. `triggers` is what MOVES somebody onto the step, any one of them being enough, and there are three kinds: `{"id":"t1","kind":"event","eventKey":"submit:contact"}` for anything the company\'s Forms, pages or systems produced, used by its own key with nothing named first; `{"id":"t2","kind":"landing","landingId":"<from --moments>"}` for one landing page being viewed; `{"id":"t3","kind":"any_landing"}` for any landing being viewed. Take every key and id from `--moments`. A trigger carries no amount: an event is worth what it says, and a step is worth the sum. Where a step SENDS its people is not written here: a send belongs to the system\'s event (`baker analytics sends`), and the step reads it back as `sends[]`',
|
|
281
|
-
required: false
|
|
282
|
-
},
|
|
283
|
-
step: {
|
|
284
|
-
type: "string",
|
|
285
|
-
description: 'ONE step as a JSON object, in the same shape as an entry of --steps. It is added to the funnel as it now stands, or replaces the step with the same `key`, and every other step is left exactly as it is \u2014 the door for adding or changing a stage without restating the rest. Example: --step \'{"key":"demo","displayName":"Demo held","stepClass":"engaged","after":["lead"],"triggers":[{"id":"t1","kind":"event","eventKey":"page:demo_held"}]}\'',
|
|
286
|
-
required: false
|
|
287
|
-
},
|
|
288
|
-
"add-trigger": {
|
|
289
|
-
type: "string",
|
|
290
|
-
description: 'The key of ONE step to add a way in to, with `--event` naming what gets somebody there: `--add-trigger lead --event "submit:contact"`. Start here for "this Form should count as a lead" \u2014 it adds that one way in and leaves the step\'s name, stage, `after[]` and every other trigger exactly as they are. Prefer it to `--step`, which takes a WHOLE step and therefore silently removes any trigger the restatement forgets. Adding a key the step already listens for changes nothing. Take the key from `--moments`, never from memory',
|
|
291
|
-
required: false
|
|
292
|
-
},
|
|
293
|
-
"remove-trigger": {
|
|
294
|
-
type: "string",
|
|
295
|
-
description: 'The key of ONE step to take a way in OFF, with `--event` naming which: `--remove-trigger lead --event "submit:contact"`. By event key rather than by trigger id, because the id is not something you ever saw. Everything else about the step is untouched',
|
|
296
|
-
required: false
|
|
297
|
-
},
|
|
298
|
-
event: {
|
|
299
|
-
type: "string",
|
|
300
|
-
description: "The event key `--add-trigger` or `--remove-trigger` acts on \u2014 an `events[].eventKey` from `--moments`, never invented. Every Form's endings are listed there by the step each happens on, at zero before anybody has filled the Form in; which one means the step is your decision",
|
|
301
|
-
required: false
|
|
302
|
-
},
|
|
303
|
-
"remove-step": {
|
|
304
|
-
type: "string",
|
|
305
|
-
description: "The key of one step to take off the funnel. Whatever came after it moves up to whatever came before it, so the chain stays joined. The response lists it under `removed`",
|
|
306
|
-
required: false
|
|
307
|
-
},
|
|
308
|
-
preset: {
|
|
309
|
-
type: "string",
|
|
310
|
-
description: "Draw one of the ready-made graphs instead of stating steps: b2b_sales, b2b_inbound, saas_self_serve, saas_sales_assisted, ecommerce_purchase. It draws over the whole funnel \u2014 every company already has one, so prefer --step to change a step. Run --templates first to see what each one contains",
|
|
311
|
-
required: false
|
|
312
|
-
},
|
|
313
|
-
moments: {
|
|
314
|
-
type: "boolean",
|
|
315
|
-
description: "Also return everything a trigger can name, so a trigger is PICKED rather than invented: `events` (every event this company's Forms, pages and systems produced in the window, with volume, the Form it belongs to, `origin` \u2014 `site` for a page or Form, `systems` for the client's own server, `both` \u2014 and `countedAs` when the company also counts it as a page conversion, which a trigger does not need; PLUS **every workspace Form's endings** \u2014 each step's completion and its `submit:` \u2014 with the `step` each happens on, at zero and `seen: false` until somebody fires one, so a Form built minutes ago is pickable with nothing set up first, and `countedAs` when the company already counts it. Nothing is marked as the outcome: which ending means a step is YOUR decision \u2014 read the step names, and ask the person when they do not make it obvious (a Form that branches into \u201CNot a fit\u201D and \u201CQuote confirmed\u201D). If the Form is already counted, use that same key, so the step and the conversion agree. `baker analytics conversions --flow <slug>` also lists a widget's housekeeping), `sources` (the client's own systems that post events to Baker, by the `page:<name>` key each raises, pickable before its first send arrives) and `landings` (its pages, by the id a `landing` trigger takes). Use this before writing any `triggers`: a key typed from memory saves, publishes and counts nobody forever. A Form's events need NOTHING set up first \u2014 no Source, no conversion: a Baker page raises them by itself",
|
|
316
|
-
required: false
|
|
317
|
-
},
|
|
318
|
-
days: {
|
|
319
|
-
type: "string",
|
|
320
|
-
description: "How many days the counts beside each step cover (default 30, up to 400). Every step comes back with `people` (reached it), `atLeast` (reached it or anything after it), `before` (got as far as the step before) and `share` (atLeast / before) \u2014 counted in PEOPLE across visits and devices, not in visits",
|
|
321
|
-
required: false
|
|
322
|
-
},
|
|
323
|
-
templates: {
|
|
324
|
-
type: "boolean",
|
|
325
|
-
description: "Also return the libraries: the suggested steps with their stages, the presets, and `stages[]` (the six stages with the test to apply). Where a step can be sent is not here \u2014 a send belongs to the system's event, and `baker analytics sends` lists the platforms and the tags that can send",
|
|
326
|
-
required: false
|
|
327
|
-
}
|
|
328
|
-
};
|
|
329
|
-
registerSchema({
|
|
330
|
-
command: "funnel",
|
|
331
|
-
description: "Read the company's funnel, or draw one",
|
|
332
|
-
args
|
|
333
|
-
});
|
|
334
|
-
var funnelCommand = defineCommand({
|
|
335
|
-
meta: {
|
|
336
|
-
name: "funnel",
|
|
337
|
-
description: 'Start here: run with no flags to see the funnel this company has, with the last 30 days of PEOPLE counted beside every step \u2014 `people` reached it, `atLeast` got at least that far, `before` got as far as the step before, `share` is the ratio, and `worstStep` names where the most people are lost. Every company has one from the day it exists: Visited (any landing) \u2192 Became a lead \u2192 Became a customer, the last two with no way in until somebody gives them one. Then `--moments` for everything a trigger can name (every event the company\'s Forms, pages and systems produced, its sources, its landings, plus each Form\'s own outcome at zero). **To make an event count on a step \u2014 the usual job \u2014 use `--add-trigger <step> --event <key>`:** it adds that one way in and touches nothing else about the step. `--step \'<json>\'` is for adding or renaming a STEP; it replaces the step with that key, so it means restating its `after` and every trigger it keeps, and one left out is gone. A step is reached by three kinds of thing and nothing else: an event by its own key (`{"id":"t1","kind":"event","eventKey":"<from moments.events or moments.sources>"}`), one landing being viewed (`{"id":"t2","kind":"landing","landingId":"<from moments.landings>"}`) or any landing (`{"id":"t3","kind":"any_landing"}`). Nothing has to be named first. Pick every trigger from `--moments`, never from memory. A step with no `triggers` advances NOBODY and reports zero forever without warning \u2014 that is what the hints keep pointing at. There is no default door: a Form is only counted where a trigger names it. Keep it true: a chat that adds a Form, a Source or an event that moves people forward places it on its step in the same chat. Each step comes back with `sends[]`, read-only: where the people who reach it are sent and what happened, read off the system events behind its ways in. A send is set on the event with `baker analytics sends`, never on a step, and once published it spends ad budget \u2014 a failed one is named in the hints. Everything here is STAGED: it becomes the company\'s funnel in one piece when the chat is published \u2014 the client sees it on the canvas in this chat and can edit it there too \u2014 and the previous version stays on file so what was already measured under it is not lost.'
|
|
338
|
-
},
|
|
339
|
-
args,
|
|
340
|
-
run: async ({ args: raw }) => {
|
|
341
|
-
try {
|
|
342
|
-
const parsed = parseFunnelArgs(raw);
|
|
343
|
-
const forms = workspaceForms();
|
|
344
|
-
const namedByCaller = formsNamedHere(forms);
|
|
345
|
-
const request = {
|
|
346
|
-
...funnelWrite(parsed),
|
|
347
|
-
...namedByCaller.length === 0 ? {} : { namedByCaller }
|
|
348
|
-
};
|
|
349
|
-
const response = await apiPost("/api/funnel", request);
|
|
350
|
-
const counted = new Map((response.data.counted ?? []).map((row) => [row.eventKey, row.name]));
|
|
351
|
-
const data = response.data.moments === void 0 ? response.data : { ...response.data, moments: withFormMoments(response.data.moments, forms, counted) };
|
|
352
|
-
const hints = [...response.hints ?? [], ...unplacedFormHints(response.data.steps ?? [], forms, counted)];
|
|
353
|
-
writeJsonEnvelope({
|
|
354
|
-
ok: true,
|
|
355
|
-
data,
|
|
356
|
-
...hints.length > 0 ? { hints } : {}
|
|
357
|
-
});
|
|
358
|
-
} catch (err) {
|
|
359
|
-
handleError(err);
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
});
|
|
363
|
-
function handleError(err) {
|
|
364
|
-
if (err instanceof FunnelArgsError) {
|
|
365
|
-
writeJsonEnvelope({
|
|
366
|
-
ok: false,
|
|
367
|
-
error: { code: "VALIDATION_ERROR", message: err.message, ...err.fix ? { fix: err.fix } : {} }
|
|
368
|
-
});
|
|
369
|
-
process.exit(1);
|
|
370
|
-
}
|
|
371
|
-
if (err instanceof ApiError) {
|
|
372
|
-
writeJsonEnvelope({ ok: false, error: { code: err.code, message: err.message } });
|
|
373
|
-
process.exit(1);
|
|
374
|
-
}
|
|
375
|
-
writeJsonEnvelope({
|
|
376
|
-
ok: false,
|
|
377
|
-
error: { code: "NETWORK_ERROR", message: err instanceof Error ? err.message : "Unexpected error" }
|
|
378
|
-
});
|
|
379
|
-
process.exit(1);
|
|
380
|
-
}
|
|
381
|
-
function workspaceForms() {
|
|
382
|
-
const forms = [];
|
|
383
|
-
for (const slug of listFlowSlugs()) {
|
|
384
|
-
try {
|
|
385
|
-
forms.push({ slug, tree: JSON.parse(readFileSync(flowDataPath(slug), "utf-8")) });
|
|
386
|
-
} catch {
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
return forms;
|
|
390
|
-
}
|
|
391
|
-
export {
|
|
392
|
-
funnelCommand
|
|
393
|
-
};
|
|
394
|
-
//# sourceMappingURL=funnel-A4MXQYBA.js.map
|