@koda-sl/baker-cli 0.495.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-G4OFH3MX.js +455 -0
- package/dist/chunk-G4OFH3MX.js.map +1 -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/plan-W2K45F7K.js +207 -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-DVD4OBBR.js +0 -1976
- package/dist/analytics-DVD4OBBR.js.map +0 -1
- package/dist/analytics-HO2SLL4W.js +0 -433
- package/dist/analytics-HO2SLL4W.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-237WE5LX.js +0 -455
- package/dist/chunk-237WE5LX.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-Z2VLXUEQ.js +0 -394
- package/dist/funnel-Z2VLXUEQ.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/plan-ZC4JY4IG.js +0 -207
- 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/{plan-ZC4JY4IG.js.map → plan-W2K45F7K.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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/activecampaign/index.ts","../src/commands/activecampaign/drafts.ts","../src/commands/activecampaign/refusal.ts","../../api/src/activecampaign-reads.ts","../src/commands/activecampaign/reads.ts","../../api/src/activecampaign-writes.ts","../src/commands/activecampaign/stage.ts","../src/commands/activecampaign/unstage.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { draftsCommand } from \"./drafts.ts\";\nimport { READ_COMMANDS } from \"./reads.ts\";\nimport { stageCommandGroup } from \"./stage.ts\";\nimport { unstageCommand } from \"./unstage.ts\";\n\nexport const activecampaignCommand = defineCommand({\n meta: {\n name: \"activecampaign\",\n description: `Read the connected ActiveCampaign account — its tracking set-up, lists, automations, pipelines,\ntags, custom fields, users, email campaign reports, contacts and deals. These reads are live and change nothing.\n\nExamples:\n baker activecampaign account # contacts, site tracking + tracking account id, domains\n baker activecampaign campaigns --since 2026-09-01 # email reports: sends, opens, clicks, unsubscribes, bounces, rates\n baker activecampaign automations --active-only # what runs after a lead arrives, and how many went through\n baker activecampaign contacts --email a@b.com # did this lead arrive?\n baker activecampaign contacts --tag webinar --limit 1 # how many carry a tag (total)\n baker activecampaign deals --status won # won deals and their value per currency\n baker activecampaign pipelines | lists | tags | fields | users\n\nChanges are staged on this chat and made in ActiveCampaign only when the user publishes it:\n baker activecampaign stage field --utm # UTM_SOURCE … UTM_TERM, for Forms to map onto\n baker activecampaign stage field --title \"Plan\" --type dropdown --options \"Basic,Pro\"\n baker activecampaign stage list --name \"Webinar sign-ups\"\n baker activecampaign stage tag --name \"hot-lead\"\n baker activecampaign stage pipeline --title \"Inbound\" --stages \"New lead,Qualified,Won\"\n baker activecampaign drafts # what is staged, and after Publish what happened\n baker activecampaign unstage <ref|name|perstag> # drop one; unstage --all drops every staged change\n\nEvery command takes --account <id> when the company has more than one ActiveCampaign connection, and --full\nfor the untouched ActiveCampaign payload. NO_ACTIVECAMPAIGN_CONNECTION / ACTIVECAMPAIGN_RECONNECT_REQUIRED\ncarry a request_connection fix — only the user can clear them.\nFull guide: __tooling__/docs/tools/baker/activecampaign.md`,\n },\n subCommands: {\n ...READ_COMMANDS,\n stage: stageCommandGroup,\n unstage: unstageCommand,\n drafts: draftsCommand,\n },\n});\n","import type { ActiveCampaignDraftListResponse } from \"@baker/api/activecampaign-writes\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { resolveChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { CHAT_READ_ARG } from \"../chat-arg.ts\";\nimport { failActiveCampaign } from \"./refusal.ts\";\n\nconst DESCRIPTION =\n \"The ActiveCampaign changes staged on this chat — fields, lists, tags, pipelines — and, once published, what happened to each (created, reused because it already existed, or failed and why). Take --chat <id> to read an earlier chat's.\";\n\nregisterSchema({\n command: \"activecampaign.drafts\",\n description: DESCRIPTION,\n args: { chat: { type: \"string\", description: CHAT_READ_ARG.description, required: false } },\n});\n\n/** What the publish did with one op, in a word or two. */\nfunction outcomeOf(op: ActiveCampaignDraftListResponse[\"ops\"][number]): string | undefined {\n if (!op.result) return undefined;\n if (op.result.status === \"applied\") return op.result.reused ? \"already there, reused\" : \"created\";\n return op.result.status === \"failed\" ? `failed: ${op.result.error ?? \"no reason given\"}` : \"not sent\";\n}\n\nexport const draftsCommand = defineCommand({\n meta: { name: \"drafts\", description: DESCRIPTION },\n args: { chat: CHAT_READ_ARG },\n run: async ({ args }) => {\n const chatId = resolveChatId(args.chat);\n try {\n const data = await apiPost<ActiveCampaignDraftListResponse>(\"/api/activecampaign/draft\", { chatId });\n const ops = data.ops.map((op) => {\n const outcome = outcomeOf(op);\n return { ref: op.ref, kind: op.kind, summary: op.summary, ...(outcome ? { outcome } : {}) };\n });\n const hints =\n data.status === \"active\" && data.count > 0\n ? [\"Staged only — these are created in ActiveCampaign when the user publishes this chat.\"]\n : [];\n writeJson({\n ok: true,\n data: {\n status: data.status,\n count: data.count,\n ops,\n ...(data.publishError ? { publishError: data.publishError } : {}),\n },\n ...(hints.length > 0 ? { hints } : {}),\n });\n } catch (err) {\n failActiveCampaign(err);\n }\n },\n});\n","import { ApiError } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { failApi } from \"../actions/shared.ts\";\n\nexport interface ActiveCampaignRefusal {\n code: \"NO_ACTIVECAMPAIGN_CONNECTION\" | \"ACTIVECAMPAIGN_RECONNECT_REQUIRED\";\n fix: { action: \"request_connection\"; explanation: string };\n}\n\nconst CONTINUE =\n \"Keep going with the wider task: say which part you could not read, skip it, and finish everything else.\";\n\n/**\n * The two refusals only the user can clear — nothing connected, or a saved key\n * ActiveCampaign no longer accepts — as the in-chat connect card, where they\n * paste the API URL and key; a connection removed since counts as none.\n * Matched on the backend's own sentences\n * (`flows/destinations/utils.ts` `chooseAccount`, `oauth/activecampaign/*`).\n */\nexport function activeCampaignRefusal(code: string, message: string): ActiveCampaignRefusal | null {\n if (\n code === \"NOT_FOUND\" &&\n (message.includes(\"No ActiveCampaign account is connected\") ||\n message.includes(\"ActiveCampaign connection no longer exists\"))\n ) {\n return {\n code: \"NO_ACTIVECAMPAIGN_CONNECTION\",\n fix: {\n action: \"request_connection\",\n explanation:\n 'AGENT INSTRUCTION: ActiveCampaign is not connected, and only the user can connect it. Call the `request_connection` tool with { platform: \"activecampaign\", reason } — reason in their words — and they paste the API URL and key inside the chat; then run this command again. ' +\n CONTINUE,\n },\n };\n }\n if (code === \"CONFLICT\" && message.includes(\"connect ActiveCampaign again\")) {\n return {\n code: \"ACTIVECAMPAIGN_RECONNECT_REQUIRED\",\n fix: {\n action: \"request_connection\",\n explanation:\n 'AGENT INSTRUCTION: ActiveCampaign is connected, but its saved key no longer works — do not retry. Call the `request_connection` tool with { platform: \"activecampaign\", reason } so the user pastes a current key, then run this command again. ' +\n CONTINUE,\n },\n };\n }\n return null;\n}\n\nexport function failActiveCampaign(err: unknown): never {\n const refusal = err instanceof ApiError ? activeCampaignRefusal(err.code, err.message) : null;\n if (err instanceof ApiError && refusal !== null) {\n writeJson({ ok: false, error: { code: refusal.code, message: err.message, fix: refusal.fix } });\n process.exit(1);\n }\n failApi(err);\n}\n","/**\n * `baker activecampaign` reads: the contract the CLI and the backend share.\n *\n * Every read is `POST /api/activecampaign/reads/<read>` with a body naming the\n * connection (`account`, optional when the company has one) and the read's own\n * filters, answered `{ ok: true, data }`. Rows are compact; `full: true` adds\n * each row's untouched ActiveCampaign payload as `raw`.\n */\nimport { z } from \"zod\";\n\nconst raw = z.record(z.string(), z.unknown()).optional();\nconst limit = z.number().int().min(1).max(100).optional();\n\nconst baseRequest = z.object({\n /** Connection id; optional when the company has exactly one ActiveCampaign account. */\n account: z.string().optional(),\n full: z.boolean().optional(),\n});\n\nfunction envelope<T extends z.ZodRawShape>(shape: T) {\n return z.object({ ok: z.literal(true), data: z.object({ account: z.string(), ...shape }) });\n}\n\n// ── account ─────────────────────────────────────────────────────────────────\n\nexport const activeCampaignAccountRequestSchema = baseRequest;\nexport type ActiveCampaignAccountRequest = z.infer<typeof activeCampaignAccountRequestSchema>;\n\nexport const activeCampaignAccountSummarySchema = z.object({\n label: z.string(),\n apiUrl: z.string(),\n contactCount: z.number().nullable(),\n siteTracking: z.object({\n enabled: z.boolean().nullable(),\n /** The id `vgo('setAccount', …)` takes — what the ActiveCampaign tag on a landing needs. */\n trackingAccountId: z.string().nullable(),\n /** Domains ActiveCampaign accepts visits from; empty means it records visits from none. */\n domains: z.array(z.string()),\n }),\n eventTracking: z.object({ enabled: z.boolean().nullable() }),\n});\nexport type ActiveCampaignAccountSummary = z.infer<typeof activeCampaignAccountSummarySchema>;\n\nexport const activeCampaignAccountResponseSchema = envelope({ summary: activeCampaignAccountSummarySchema });\nexport type ActiveCampaignAccountResponse = z.infer<typeof activeCampaignAccountResponseSchema>;\n\n// ── lists ───────────────────────────────────────────────────────────────────\n\nexport const activeCampaignListsRequestSchema = baseRequest;\nexport type ActiveCampaignListsRequest = z.infer<typeof activeCampaignListsRequestSchema>;\n\nexport const activeCampaignListRowSchema = z.object({\n id: z.string(),\n name: z.string(),\n activeContacts: z.number().nullable(),\n createdAt: z.string().nullable(),\n raw,\n});\nexport type ActiveCampaignListRow = z.infer<typeof activeCampaignListRowSchema>;\n\nexport const activeCampaignListsResponseSchema = envelope({ lists: z.array(activeCampaignListRowSchema) });\nexport type ActiveCampaignListsResponse = z.infer<typeof activeCampaignListsResponseSchema>;\n\n// ── automations ─────────────────────────────────────────────────────────────\n\nexport const activeCampaignAutomationsRequestSchema = baseRequest.extend({ activeOnly: z.boolean().optional() });\nexport type ActiveCampaignAutomationsRequest = z.infer<typeof activeCampaignAutomationsRequestSchema>;\n\nexport const ACTIVECAMPAIGN_AUTOMATION_STATUSES = [\"active\", \"inactive\", \"unknown\"] as const;\n\nexport const activeCampaignAutomationRowSchema = z.object({\n id: z.string(),\n name: z.string(),\n status: z.enum(ACTIVECAMPAIGN_AUTOMATION_STATUSES),\n /** Contacts that have ever entered / finished it. */\n entered: z.number().nullable(),\n exited: z.number().nullable(),\n /** What starts it (`subscribe`, `tagadd`, …), as ActiveCampaign names its triggers. */\n triggers: z.array(z.string()),\n createdAt: z.string().nullable(),\n modifiedAt: z.string().nullable(),\n raw,\n});\nexport type ActiveCampaignAutomationRow = z.infer<typeof activeCampaignAutomationRowSchema>;\n\nexport const activeCampaignAutomationsResponseSchema = envelope({\n automations: z.array(activeCampaignAutomationRowSchema),\n});\nexport type ActiveCampaignAutomationsResponse = z.infer<typeof activeCampaignAutomationsResponseSchema>;\n\n// ── pipelines ───────────────────────────────────────────────────────────────\n\nexport const activeCampaignPipelinesRequestSchema = baseRequest;\nexport type ActiveCampaignPipelinesRequest = z.infer<typeof activeCampaignPipelinesRequestSchema>;\n\nexport const activeCampaignStageSchema = z.object({ id: z.string(), title: z.string(), order: z.number().nullable() });\nexport type ActiveCampaignStage = z.infer<typeof activeCampaignStageSchema>;\n\nexport const activeCampaignPipelineRowSchema = z.object({\n id: z.string(),\n title: z.string(),\n currency: z.string().nullable(),\n /** In board order: the first is where a new deal lands. */\n stages: z.array(activeCampaignStageSchema),\n raw,\n});\nexport type ActiveCampaignPipelineRow = z.infer<typeof activeCampaignPipelineRowSchema>;\n\nexport const activeCampaignPipelinesResponseSchema = envelope({\n pipelines: z.array(activeCampaignPipelineRowSchema),\n});\nexport type ActiveCampaignPipelinesResponse = z.infer<typeof activeCampaignPipelinesResponseSchema>;\n\n// ── tags ────────────────────────────────────────────────────────────────────\n\nexport const activeCampaignTagsRequestSchema = baseRequest.extend({ search: z.string().optional() });\nexport type ActiveCampaignTagsRequest = z.infer<typeof activeCampaignTagsRequestSchema>;\n\nexport const activeCampaignTagRowSchema = z.object({\n id: z.string(),\n name: z.string(),\n /** `contact` or `template`; only contact tags can be put on a lead. */\n type: z.string().nullable(),\n contactCount: z.number().nullable(),\n raw,\n});\nexport type ActiveCampaignTagRow = z.infer<typeof activeCampaignTagRowSchema>;\n\nexport const activeCampaignTagsResponseSchema = envelope({ tags: z.array(activeCampaignTagRowSchema) });\nexport type ActiveCampaignTagsResponse = z.infer<typeof activeCampaignTagsResponseSchema>;\n\n// ── fields ──────────────────────────────────────────────────────────────────\n\nexport const activeCampaignCustomFieldsRequestSchema = baseRequest;\nexport type ActiveCampaignCustomFieldsRequest = z.infer<typeof activeCampaignCustomFieldsRequestSchema>;\n\nexport const activeCampaignCustomFieldRowSchema = z.object({\n id: z.string(),\n title: z.string(),\n /** ActiveCampaign's type: `text`, `textarea`, `date`, `dropdown`, `multiselect`, `radio`, `checkbox`, … */\n type: z.string().nullable(),\n perstag: z.string().nullable(),\n required: z.boolean(),\n /** For a choice field, what may be stored (`value`) and what people see (`label`). */\n options: z.array(z.object({ value: z.string(), label: z.string() })),\n /** True when the field shows on every list (ActiveCampaign's relid 0). */\n allLists: z.boolean(),\n listIds: z.array(z.string()),\n raw,\n});\nexport type ActiveCampaignCustomFieldRow = z.infer<typeof activeCampaignCustomFieldRowSchema>;\n\nexport const activeCampaignCustomFieldsResponseSchema = envelope({\n fields: z.array(activeCampaignCustomFieldRowSchema),\n});\nexport type ActiveCampaignCustomFieldsResponse = z.infer<typeof activeCampaignCustomFieldsResponseSchema>;\n\n// ── users ───────────────────────────────────────────────────────────────────\n\nexport const activeCampaignUsersRequestSchema = baseRequest;\nexport type ActiveCampaignUsersRequest = z.infer<typeof activeCampaignUsersRequestSchema>;\n\nexport const activeCampaignUserRowSchema = z.object({\n id: z.string(),\n username: z.string().nullable(),\n name: z.string().nullable(),\n email: z.string().nullable(),\n raw,\n});\nexport type ActiveCampaignUserRow = z.infer<typeof activeCampaignUserRowSchema>;\n\nexport const activeCampaignUsersResponseSchema = envelope({ users: z.array(activeCampaignUserRowSchema) });\nexport type ActiveCampaignUsersResponse = z.infer<typeof activeCampaignUsersResponseSchema>;\n\n// ── campaigns ───────────────────────────────────────────────────────────────\n\n/** ActiveCampaign's campaign `status` codes 0–5, in its own order. */\nexport const ACTIVECAMPAIGN_CAMPAIGN_STATUSES = [\n \"draft\",\n \"scheduled\",\n \"sending\",\n \"paused\",\n \"stopped\",\n \"completed\",\n] as const;\nexport type ActiveCampaignCampaignStatus = (typeof ACTIVECAMPAIGN_CAMPAIGN_STATUSES)[number];\n\nconst isoDay = z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, \"Use a date like 2026-01-31\");\n\nexport const activeCampaignCampaignsRequestSchema = baseRequest.extend({\n status: z.enum(ACTIVECAMPAIGN_CAMPAIGN_STATUSES).optional(),\n /** Only campaigns first sent on or after this day. */\n since: isoDay.optional(),\n limit,\n});\nexport type ActiveCampaignCampaignsRequest = z.infer<typeof activeCampaignCampaignsRequestSchema>;\n\n/** Shares of `sends` (and click-to-open of unique opens), 0–1; null when nothing was sent. */\nexport const activeCampaignCampaignRatesSchema = z.object({\n open: z.number().nullable(),\n click: z.number().nullable(),\n clickToOpen: z.number().nullable(),\n unsubscribe: z.number().nullable(),\n bounce: z.number().nullable(),\n});\n\nexport const activeCampaignCampaignRowSchema = z.object({\n id: z.string(),\n name: z.string(),\n /** `single`, `recurring`, `split`, `responder`, `reminder`, `special`, `activerss`, `text`, … */\n type: z.string().nullable(),\n status: z.enum([...ACTIVECAMPAIGN_CAMPAIGN_STATUSES, \"unknown\"]),\n /** When it (first) went out, and when its last send ran — ActiveCampaign's `sdate` / `ldate`. */\n sentAt: z.string().nullable(),\n lastSentAt: z.string().nullable(),\n /** Set when an automation sends it. */\n automationId: z.string().nullable(),\n sends: z.number(),\n opens: z.number(),\n uniqueOpens: z.number(),\n clicks: z.number(),\n uniqueClicks: z.number(),\n unsubscribes: z.number(),\n hardBounces: z.number(),\n softBounces: z.number(),\n rates: activeCampaignCampaignRatesSchema,\n raw,\n});\nexport type ActiveCampaignCampaignRow = z.infer<typeof activeCampaignCampaignRowSchema>;\n\nexport const activeCampaignCampaignsResponseSchema = envelope({\n campaigns: z.array(activeCampaignCampaignRowSchema),\n /** True when more campaigns matched than `limit` returned. */\n truncated: z.boolean(),\n});\nexport type ActiveCampaignCampaignsResponse = z.infer<typeof activeCampaignCampaignsResponseSchema>;\n\n// ── contacts ────────────────────────────────────────────────────────────────\n\nexport const activeCampaignContactsRequestSchema = baseRequest.extend({\n /** The contact's ActiveCampaign id — what an ActiveCampaign event's `contact.id` carries. */\n id: z.string().optional(),\n email: z.string().optional(),\n /** A tag's id or exact name. */\n tag: z.string().optional(),\n /** A list's id or exact name. */\n list: z.string().optional(),\n /** ActiveCampaign's own search over name, email, phone and organisation. */\n search: z.string().optional(),\n limit,\n});\nexport type ActiveCampaignContactsRequest = z.infer<typeof activeCampaignContactsRequestSchema>;\n\nexport const activeCampaignContactRowSchema = z.object({\n id: z.string(),\n email: z.string().nullable(),\n firstName: z.string().nullable(),\n lastName: z.string().nullable(),\n createdAt: z.string().nullable(),\n updatedAt: z.string().nullable(),\n /** The contact's tags by name; only on a lookup by `id` or `email`. */\n tags: z.array(z.string()).optional(),\n /** What the contact did and what ActiveCampaign did with them; only on a lookup by `id` or `email`. */\n activity: z\n .object({\n /** Custom events (`event.name` on a Form, or any event tracking), newest first. */\n events: z.array(z.object({ name: z.string(), data: z.string().nullable(), at: z.string().nullable() })),\n /** Site-tracking page visits, newest first. */\n pageVisits: z.array(z.object({ url: z.string(), at: z.string().nullable() })),\n /** Campaign emails: each one sent, opened, and each tracked link clicked (with its address), newest first. */\n emails: z.array(\n z.object({\n campaignId: z.string(),\n event: z.enum([\"sent\", \"opened\", \"clicked\"]),\n url: z.string().nullable(),\n at: z.string().nullable(),\n }),\n ),\n automations: z.array(\n z.object({\n id: z.string(),\n name: z.string().nullable(),\n status: z.enum([\"running\", \"completed\", \"unknown\"]),\n startedAt: z.string().nullable(),\n endedAt: z.string().nullable(),\n }),\n ),\n lists: z.array(\n z.object({\n id: z.string(),\n name: z.string().nullable(),\n status: z.enum([\"subscribed\", \"unsubscribed\", \"unconfirmed\", \"bounced\", \"unknown\"]),\n since: z.string().nullable(),\n }),\n ),\n })\n .optional(),\n raw,\n});\nexport type ActiveCampaignContactActivity = NonNullable<z.infer<typeof activeCampaignContactRowSchema>[\"activity\"]>;\nexport type ActiveCampaignContactRow = z.infer<typeof activeCampaignContactRowSchema>;\n\nexport const activeCampaignContactsResponseSchema = envelope({\n /** Every contact the filters match, of which `contacts` is the newest `limit`. */\n total: z.number().nullable(),\n contacts: z.array(activeCampaignContactRowSchema),\n});\nexport type ActiveCampaignContactsResponse = z.infer<typeof activeCampaignContactsResponseSchema>;\n\n// ── deals ───────────────────────────────────────────────────────────────────\n\n/** ActiveCampaign's deal `status` codes 0–2. */\nexport const ACTIVECAMPAIGN_DEAL_STATUSES = [\"open\", \"won\", \"lost\"] as const;\nexport type ActiveCampaignDealStatus = (typeof ACTIVECAMPAIGN_DEAL_STATUSES)[number];\n\nexport const activeCampaignDealsRequestSchema = baseRequest.extend({\n /** A pipeline's id or exact title. */\n pipeline: z.string().optional(),\n /** A stage's id or exact title (within `pipeline` when both are given). */\n stage: z.string().optional(),\n status: z.enum(ACTIVECAMPAIGN_DEAL_STATUSES).optional(),\n /** A user's id, username or email. */\n owner: z.string().optional(),\n limit,\n});\nexport type ActiveCampaignDealsRequest = z.infer<typeof activeCampaignDealsRequestSchema>;\n\nconst named = z.object({ id: z.string(), title: z.string() }).nullable();\n\nexport const activeCampaignDealRowSchema = z.object({\n id: z.string(),\n title: z.string(),\n /** In the currency's major units (ActiveCampaign stores cents). */\n value: z.number().nullable(),\n currency: z.string().nullable(),\n status: z.enum([...ACTIVECAMPAIGN_DEAL_STATUSES, \"unknown\"]),\n pipeline: named,\n stage: named,\n ownerId: z.string().nullable(),\n contactId: z.string().nullable(),\n createdAt: z.string().nullable(),\n modifiedAt: z.string().nullable(),\n raw,\n});\nexport type ActiveCampaignDealRow = z.infer<typeof activeCampaignDealRowSchema>;\n\nexport const activeCampaignDealTotalSchema = z.object({\n currency: z.string(),\n count: z.number(),\n /** Major units, every matching deal — not only the rows returned. */\n value: z.number(),\n});\n\nexport const activeCampaignDealsResponseSchema = envelope({\n total: z.number().nullable(),\n totals: z.array(activeCampaignDealTotalSchema),\n deals: z.array(activeCampaignDealRowSchema),\n});\nexport type ActiveCampaignDealsResponse = z.infer<typeof activeCampaignDealsResponseSchema>;\n\n/** Every read, by the last segment of its route. */\nexport const ACTIVECAMPAIGN_READS = [\n \"account\",\n \"lists\",\n \"automations\",\n \"pipelines\",\n \"tags\",\n \"fields\",\n \"users\",\n \"campaigns\",\n \"contacts\",\n \"deals\",\n] as const;\nexport type ActiveCampaignRead = (typeof ACTIVECAMPAIGN_READS)[number];\n\nexport function activeCampaignReadPath(read: ActiveCampaignRead): string {\n return `/api/activecampaign/reads/${read}`;\n}\n","import {\n ACTIVECAMPAIGN_CAMPAIGN_STATUSES,\n ACTIVECAMPAIGN_DEAL_STATUSES,\n type ActiveCampaignAccountResponse,\n type ActiveCampaignAutomationsResponse,\n type ActiveCampaignCampaignsResponse,\n type ActiveCampaignContactsResponse,\n type ActiveCampaignCustomFieldsResponse,\n type ActiveCampaignDealsResponse,\n type ActiveCampaignListsResponse,\n type ActiveCampaignPipelinesResponse,\n type ActiveCampaignRead,\n type ActiveCampaignTagsResponse,\n type ActiveCampaignUsersResponse,\n activeCampaignReadPath,\n} from \"@baker/api/activecampaign-reads\";\nimport { type ArgsDef, defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failActiveCampaign } from \"./refusal.ts\";\n\ntype ArgValues = Record<string, unknown>;\n\ninterface SchemaArg {\n type: \"string\" | \"boolean\";\n description: string;\n required: false;\n default?: unknown;\n enum?: string[];\n}\n\nconst COMMON_ARGS: Record<string, SchemaArg> = {\n account: {\n type: \"string\",\n description: \"Which connection to read when the company has more than one (the id the error lists)\",\n required: false,\n },\n full: {\n type: \"boolean\",\n description: \"Add each row's untouched ActiveCampaign payload as `raw`\",\n required: false,\n default: false,\n },\n};\n\nconst LIMIT_ARG: SchemaArg = { type: \"string\", description: \"How many rows, 1-100 (default 20)\", required: false };\n\n/** `--limit` as the number the route takes; anything else is refused before a request is made. */\nexport function parseLimit(value: unknown): number | undefined {\n if (value === undefined || value === \"\") return undefined;\n const limit = Number(value);\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n throw new ApiError(\"VALIDATION_ERROR\", \"--limit must be a whole number from 1 to 100\");\n }\n return limit;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() !== \"\" ? value.trim() : undefined;\n}\n\ninterface ReadSpec<Res extends { ok: true; data: object }> {\n read: ActiveCampaignRead;\n description: string;\n args?: Record<string, SchemaArg>;\n body?: (args: ArgValues) => Record<string, unknown>;\n rows: (data: Res[\"data\"]) => readonly unknown[];\n hints?: (data: Res[\"data\"], args: ArgValues) => string[];\n}\n\nfunction readCommand<Res extends { ok: true; data: object }>(spec: ReadSpec<Res>) {\n const args = { ...(spec.args ?? {}), ...COMMON_ARGS };\n registerSchema({ command: `activecampaign.${spec.read}`, description: spec.description, args });\n return defineCommand({\n meta: { name: spec.read, description: spec.description },\n args: args as ArgsDef,\n run: async ({ args: values }) => {\n try {\n const body = {\n ...(spec.body ? spec.body(values) : {}),\n ...(optionalString(values.account) ? { account: optionalString(values.account) } : {}),\n ...(values.full === true ? { full: true } : {}),\n };\n const response = await apiPost<Res>(activeCampaignReadPath(spec.read), body);\n const hints = spec.hints ? spec.hints(response.data, values) : [];\n writeJson({\n ok: true,\n data: response.data,\n meta: { count: spec.rows(response.data).length },\n ...(hints.length > 0 ? { hints } : {}),\n });\n } catch (err) {\n failActiveCampaign(err);\n }\n },\n });\n}\n\nexport const accountCommand = readCommand<ActiveCampaignAccountResponse>({\n read: \"account\",\n description:\n \"Start here for ActiveCampaign: the connected account at a glance — its label, how many contacts it holds, whether site tracking is on (and its tracking account id, the one id the ActiveCampaign tag on a landing needs), which domains it accepts visits from, and whether event tracking is on. Example: baker activecampaign account\",\n rows: (data) => [data.summary],\n hints: ({ summary }) => {\n const hints: string[] = [];\n if (summary.siteTracking.enabled === false) {\n hints.push(\n \"Site tracking is off in ActiveCampaign, so it records no page visits for these contacts even with the tag on a page.\",\n );\n }\n if (summary.siteTracking.enabled && summary.siteTracking.domains.length === 0) {\n hints.push(\"Site tracking is on but no domain is allowed, so ActiveCampaign ignores visits from every site.\");\n }\n return hints;\n },\n});\n\nexport const listsCommand = readCommand<ActiveCampaignListsResponse>({\n read: \"lists\",\n description:\n \"Every list on the connected ActiveCampaign account with its id and how many active contacts it holds. Use the id or the name with `baker activecampaign contacts --list`. Example: baker activecampaign lists\",\n rows: (data) => data.lists,\n});\n\nexport const automationsCommand = readCommand<ActiveCampaignAutomationsResponse>({\n read: \"automations\",\n description:\n \"Every automation on the connected ActiveCampaign account: on or off, how many contacts entered and finished it, and what starts it (subscribe, tag added, …). Read it when auditing what happens to a lead after it arrives — an automation that is off looks connected and does nothing. Example: baker activecampaign automations --active-only\",\n args: {\n \"active-only\": { type: \"boolean\", description: \"Only automations that are on\", required: false, default: false },\n },\n body: (args) => (args[\"active-only\"] === true ? { activeOnly: true } : {}),\n rows: (data) => data.automations,\n hints: (data) =>\n data.automations.length === 0\n ? [\"This account has no automations, so nothing runs after a lead arrives unless someone acts on it by hand.\"]\n : [],\n});\n\nexport const pipelinesCommand = readCommand<ActiveCampaignPipelinesResponse>({\n read: \"pipelines\",\n description:\n \"Deal pipelines on the connected ActiveCampaign account with their stages in board order — the first stage is where a new deal lands. Ids and titles feed `baker activecampaign deals --pipeline/--stage`. Example: baker activecampaign pipelines\",\n rows: (data) => data.pipelines,\n hints: (data) =>\n data.pipelines.length === 0 ? [\"This account has no deal pipelines, so there are no deals to read.\"] : [],\n});\n\nexport const tagsCommand = readCommand<ActiveCampaignTagsResponse>({\n read: \"tags\",\n description:\n \"Tags on the connected ActiveCampaign account with how many contacts carry each. Use a name with `baker activecampaign contacts --tag`. Example: baker activecampaign tags --search withbaker-\",\n args: { search: { type: \"string\", description: \"Only tags whose name contains this text\", required: false } },\n body: (args) => (optionalString(args.search) ? { search: optionalString(args.search) } : {}),\n rows: (data) => data.tags,\n});\n\nexport const fieldsCommand = readCommand<ActiveCampaignCustomFieldsResponse>({\n read: \"fields\",\n description:\n \"The account's own custom contact fields: id, title, type, personalization tag, whether it is required, the choices a dropdown/radio/checkbox accepts (store the `value`), and which lists it shows on. Map a Form answer onto one with `baker flows map` (`custom.<id>` or the tag). Example: baker activecampaign fields\",\n rows: (data) => data.fields,\n});\n\nexport const usersCommand = readCommand<ActiveCampaignUsersResponse>({\n read: \"users\",\n description:\n \"The people with a login on the connected ActiveCampaign account — who can own a deal. Example: baker activecampaign users\",\n rows: (data) => data.users,\n});\n\nexport const campaignsCommand = readCommand<ActiveCampaignCampaignsResponse>({\n read: \"campaigns\",\n description:\n \"Email campaign reports from the connected ActiveCampaign account, most recently sent first: status, send date, sends, opens and unique opens, clicks and unique clicks, unsubscribes, hard and soft bounces, and the rates (open, click and unsubscribe rates are shares of sends; click-to-open is unique clicks over unique opens; 0-1, null before anything is sent). Start here for 'how are my emails doing'. Example: baker activecampaign campaigns --since 2026-09-01 --status completed\",\n args: {\n status: {\n type: \"string\",\n description: `Only campaigns in this state: ${ACTIVECAMPAIGN_CAMPAIGN_STATUSES.join(\"|\")}`,\n required: false,\n enum: [...ACTIVECAMPAIGN_CAMPAIGN_STATUSES],\n },\n since: { type: \"string\", description: \"Only campaigns sent on or after this day (YYYY-MM-DD)\", required: false },\n limit: LIMIT_ARG,\n },\n body: (args) => ({\n ...(optionalString(args.status) ? { status: optionalString(args.status) } : {}),\n ...(optionalString(args.since) ? { since: optionalString(args.since) } : {}),\n ...(parseLimit(args.limit) ? { limit: parseLimit(args.limit) } : {}),\n }),\n rows: (data) => data.campaigns,\n hints: (data) => {\n const hints: string[] = [];\n if (data.truncated) hints.push(\"More campaigns matched than were returned; raise --limit or narrow with --since.\");\n if (data.campaigns.length === 0) hints.push(\"No campaign matched — this account may not have sent any yet.\");\n if (data.campaigns.some((campaign) => campaign.automationId !== null)) {\n hints.push(\"Rows with an automationId are emails an automation sends; their counts grow as contacts enter it.\");\n }\n return hints;\n },\n});\n\nexport const contactsCommand = readCommand<ActiveCampaignContactsResponse>({\n read: \"contacts\",\n description:\n \"Contacts on the connected ActiveCampaign account, newest first: one by --email (was this lead received?) or by --id (the `contact.id` an ActiveCampaign event carries — a scheduled agent's payload never holds the email), each with its `tags` by name and its `activity` (events, page visits, campaign emails sent/opened/clicked, automation runs, list subscriptions — did the Form's event land? did it enter the automation?); everyone with a --tag or on a --list (id or exact name), or a --search; with no filter, the most recent. `total` counts every match, so `--limit 1` answers 'how many'. Rows are personal data: quote counts in a report, never names or emails. Example: baker activecampaign contacts --tag withbaker-/pricing --limit 5\",\n args: {\n id: { type: \"string\", description: \"The contact's ActiveCampaign id, e.g. an event's contact.id\", required: false },\n email: { type: \"string\", description: \"The contact's exact email\", required: false },\n tag: { type: \"string\", description: \"A tag id or exact name\", required: false },\n list: { type: \"string\", description: \"A list id or exact name\", required: false },\n search: { type: \"string\", description: \"Free text over name, email, phone and organisation\", required: false },\n limit: LIMIT_ARG,\n },\n body: (args) => ({\n ...Object.fromEntries(\n ([\"id\", \"email\", \"tag\", \"list\", \"search\"] as const).flatMap((key) =>\n optionalString(args[key]) ? [[key, optionalString(args[key])]] : [],\n ),\n ),\n ...(parseLimit(args.limit) ? { limit: parseLimit(args.limit) } : {}),\n }),\n rows: (data) => data.contacts,\n hints: (data, args) =>\n optionalString(args.email) && data.contacts.length === 0\n ? [\"No contact has that email: the lead never reached ActiveCampaign. That is a finding, not an error.\"]\n : optionalString(args.id) && data.contacts.length === 0\n ? [\"No contact has that id: it was deleted or merged in ActiveCampaign since the event.\"]\n : [],\n});\n\nexport const dealsCommand = readCommand<ActiveCampaignDealsResponse>({\n read: \"deals\",\n description:\n \"Deals on the connected ActiveCampaign account, newest first, narrowed by --pipeline / --stage (id or exact title, from `baker activecampaign pipelines`), --status open|won|lost and --owner (user id, username or email). Values are in the currency's major units; `totals` sums every matching deal per currency, not only the rows returned. Example: baker activecampaign deals --status won\",\n args: {\n pipeline: { type: \"string\", description: \"A pipeline id or exact title\", required: false },\n stage: { type: \"string\", description: \"A stage id or exact title\", required: false },\n status: {\n type: \"string\",\n description: `Only deals that are ${ACTIVECAMPAIGN_DEAL_STATUSES.join(\"|\")}`,\n required: false,\n enum: [...ACTIVECAMPAIGN_DEAL_STATUSES],\n },\n owner: { type: \"string\", description: \"A user id, username or email\", required: false },\n limit: LIMIT_ARG,\n },\n body: (args) => ({\n ...Object.fromEntries(\n ([\"pipeline\", \"stage\", \"status\", \"owner\"] as const).flatMap((key) =>\n optionalString(args[key]) ? [[key, optionalString(args[key])]] : [],\n ),\n ),\n ...(parseLimit(args.limit) ? { limit: parseLimit(args.limit) } : {}),\n }),\n rows: (data) => data.deals,\n});\n\n/** Every read, by its subcommand name. */\nexport const READ_COMMANDS = {\n account: accountCommand,\n lists: listsCommand,\n automations: automationsCommand,\n pipelines: pipelinesCommand,\n tags: tagsCommand,\n fields: fieldsCommand,\n users: usersCommand,\n campaigns: campaignsCommand,\n contacts: contactsCommand,\n deals: dealsCommand,\n};\n","/**\n * Agent-made ActiveCampaign changes: the contract the CLI and the backend share.\n *\n * `baker activecampaign stage <field|list|tag|pipeline>` never changes the\n * account. It stages one of these ops onto the Session's draft, and the draft\n * applies when the Session completes at Publish. Every op is a create that\n * finds first — a field by its personalization tag, a list, tag or pipeline by\n * its name — so applying it twice, or on an account that already has it, makes\n * nothing twice.\n */\nimport { z } from \"zod\";\n\nexport const ACTIVECAMPAIGN_WRITE_KINDS = [\"field\", \"list\", \"tag\", \"pipeline\"] as const;\nexport type ActiveCampaignWriteKind = (typeof ACTIVECAMPAIGN_WRITE_KINDS)[number];\n\n/** The custom-field types ActiveCampaign's API creates (`POST /fields`). */\nexport const ACTIVECAMPAIGN_STAGEABLE_FIELD_TYPES = [\n \"text\",\n \"textarea\",\n \"date\",\n \"datetime\",\n \"dropdown\",\n \"listbox\",\n \"radio\",\n \"checkbox\",\n \"hidden\",\n] as const;\nexport type ActiveCampaignStageableFieldType = (typeof ACTIVECAMPAIGN_STAGEABLE_FIELD_TYPES)[number];\n\n/** Types whose values are picked from options, which then have to be given. */\nconst OPTION_FIELD_TYPES: ReadonlySet<ActiveCampaignStageableFieldType> = new Set([\n \"dropdown\",\n \"listbox\",\n \"radio\",\n \"checkbox\",\n]);\n\nexport function activeCampaignFieldTakesOptions(type: ActiveCampaignStageableFieldType): boolean {\n return OPTION_FIELD_TYPES.has(type);\n}\n\n/**\n * The personalization tag ActiveCampaign gives a field created without one:\n * upper-cased, whitespace to `_`, anything else that is not a letter, digit or\n * `_` dropped (\"baker-e2e-D no perstag\" → `BAKERE2ED_NO_PERSTAG`, observed on a\n * real account). Deriving it the same way is what lets a re-run find the field.\n */\nexport function activeCampaignPerstag(title: string): string {\n return title\n .trim()\n .toUpperCase()\n .replace(/\\s+/g, \"_\")\n .replace(/[^A-Z0-9_]/g, \"\");\n}\n\nconst name = z.string().trim().min(1).max(255);\nconst description = z.string().trim().max(1000).optional();\n\nconst PERSTAG = /^[A-Z0-9_]+$/;\n\nexport const activeCampaignFieldOpSchema = z\n .object({\n kind: z.literal(\"field\"),\n title: name,\n type: z.enum(ACTIVECAMPAIGN_STAGEABLE_FIELD_TYPES).default(\"text\"),\n /** `UTM_SOURCE` — what Forms map onto (`custom.UTM_SOURCE`). Derived from the title when absent. */\n perstag: z\n .string()\n .trim()\n .transform((value) => value.replace(/^%|%$/g, \"\").toUpperCase())\n .pipe(z.string().min(1).max(100).regex(PERSTAG, \"perstag may only use letters, digits and _ (like UTM_SOURCE)\"))\n .optional(),\n options: z.array(name).max(200).optional(),\n description,\n })\n .superRefine((op, ctx) => {\n const takesOptions = activeCampaignFieldTakesOptions(op.type);\n if (takesOptions && (op.options ?? []).length === 0) {\n ctx.addIssue({ code: \"custom\", path: [\"options\"], message: `a ${op.type} field needs at least one option` });\n }\n if (!takesOptions && op.options !== undefined) {\n ctx.addIssue({ code: \"custom\", path: [\"options\"], message: `a ${op.type} field takes no options` });\n }\n if (op.perstag === undefined && activeCampaignPerstag(op.title) === \"\") {\n ctx.addIssue({\n code: \"custom\",\n path: [\"perstag\"],\n message: \"pass --perstag: the title has no letters or digits\",\n });\n }\n const values = (op.options ?? []).map((option) => option.toLowerCase());\n if (new Set(values).size !== values.length) {\n ctx.addIssue({ code: \"custom\", path: [\"options\"], message: \"options must not repeat\" });\n }\n });\n\nexport const activeCampaignListOpSchema = z.object({ kind: z.literal(\"list\"), name, description });\n\nexport const activeCampaignTagOpSchema = z.object({ kind: z.literal(\"tag\"), name, description });\n\nexport const activeCampaignPipelineOpSchema = z\n .object({\n kind: z.literal(\"pipeline\"),\n title: name,\n currency: z\n .string()\n .trim()\n .toLowerCase()\n .regex(/^[a-z]{3}$/, \"currency is a three-letter code like usd\")\n .default(\"usd\"),\n /** In order. A new pipeline gets exactly these; an existing one gains the ones it lacks. */\n stages: z.array(name).max(30).optional(),\n })\n .superRefine((op, ctx) => {\n const titles = (op.stages ?? []).map((stage) => stage.toLowerCase());\n if (new Set(titles).size !== titles.length) {\n ctx.addIssue({ code: \"custom\", path: [\"stages\"], message: \"stages must not repeat\" });\n }\n });\n\nexport const activeCampaignWriteOpSchema = z.discriminatedUnion(\"kind\", [\n activeCampaignFieldOpSchema,\n activeCampaignListOpSchema,\n activeCampaignTagOpSchema,\n activeCampaignPipelineOpSchema,\n]);\nexport type ActiveCampaignWriteOp = z.infer<typeof activeCampaignWriteOpSchema>;\nexport type ActiveCampaignFieldOp = Extract<ActiveCampaignWriteOp, { kind: \"field\" }>;\nexport type ActiveCampaignPipelineOp = Extract<ActiveCampaignWriteOp, { kind: \"pipeline\" }>;\n\n/** The name an op's thing is known by in ActiveCampaign. */\nexport function activeCampaignWriteName(op: ActiveCampaignWriteOp): string {\n return op.kind === \"field\" || op.kind === \"pipeline\" ? op.title : op.name;\n}\n\n/** A field's personalization tag: the given one, or the one its title derives. */\nexport function activeCampaignFieldPerstag(op: ActiveCampaignFieldOp): string {\n return op.perstag ?? activeCampaignPerstag(op.title);\n}\n\n/**\n * What makes two ops the same thing: a field is its personalization tag, the\n * rest their name (ActiveCampaign compares names without case). Staging the\n * same thing twice replaces the earlier op rather than creating it twice.\n */\nexport function activeCampaignWriteIdentity(op: ActiveCampaignWriteOp): string {\n if (op.kind === \"field\") {\n return `field:${activeCampaignFieldPerstag(op)}`;\n }\n return `${op.kind}:${activeCampaignWriteName(op).toLowerCase()}`;\n}\n\n/** One line a person reads in the review and the agent reads back. */\nexport function summarizeActiveCampaignWrite(op: ActiveCampaignWriteOp): string {\n switch (op.kind) {\n case \"field\": {\n const options = op.options && op.options.length > 0 ? `: ${op.options.join(\", \")}` : \"\";\n return `Add the contact field \"${op.title}\" (%${activeCampaignFieldPerstag(op)}%, ${op.type}${options})`;\n }\n case \"list\":\n return `Add the list \"${op.name}\"`;\n case \"tag\":\n return `Add the tag \"${op.name}\"`;\n default: {\n const stages = op.stages && op.stages.length > 0 ? ` with stages ${op.stages.join(\" → \")}` : \"\";\n return `Add the deal pipeline \"${op.title}\"${stages}`;\n }\n }\n}\n\n// --- Wire ------------------------------------------------------------------\n\nexport const activeCampaignDraftOpResultSchema = z.object({\n status: z.enum([\"applied\", \"failed\", \"skipped\"]),\n /** The id ActiveCampaign gave, or the one it already had. */\n id: z.string().optional(),\n /** True when the account already had it and nothing new was made. */\n reused: z.boolean().optional(),\n note: z.string().optional(),\n error: z.string().optional(),\n executedAt: z.number().optional(),\n});\nexport type ActiveCampaignDraftOpResult = z.infer<typeof activeCampaignDraftOpResultSchema>;\n\nexport const activeCampaignDraftStageRequestSchema = z.object({\n chatId: z.string().min(1),\n /** Connection id; optional when the company has exactly one ActiveCampaign account. */\n account: z.string().optional(),\n op: activeCampaignWriteOpSchema,\n});\nexport type ActiveCampaignDraftStageRequest = z.infer<typeof activeCampaignDraftStageRequestSchema>;\n\nexport const activeCampaignDraftStageResponseSchema = z.object({\n ref: z.string(),\n kind: z.enum(ACTIVECAMPAIGN_WRITE_KINDS),\n summary: z.string(),\n account: z.string(),\n /** True when this replaced an earlier staged op for the same thing. */\n replaced: z.boolean(),\n /** The account already has it: publishing reuses it (a field gains missing options). */\n alreadyInAccount: z.boolean(),\n /** A Form maps a staged field as `custom.<perstag>`. */\n mapAs: z.string().optional(),\n hints: z.array(z.string()).optional(),\n});\nexport type ActiveCampaignDraftStageResponse = z.infer<typeof activeCampaignDraftStageResponseSchema>;\n\nexport const activeCampaignDraftListRequestSchema = z.object({ chatId: z.string().min(1) });\nexport type ActiveCampaignDraftListRequest = z.infer<typeof activeCampaignDraftListRequestSchema>;\n\nexport const activeCampaignDraftOpViewSchema = z.object({\n ref: z.string(),\n kind: z.enum(ACTIVECAMPAIGN_WRITE_KINDS),\n name: z.string(),\n summary: z.string(),\n account: z.string(),\n stagedAt: z.number(),\n result: activeCampaignDraftOpResultSchema.optional(),\n});\n\nexport const activeCampaignDraftListResponseSchema = z.object({\n status: z.enum([\"none\", \"active\", \"publishing\", \"applied\", \"discarded\"]),\n count: z.number(),\n ops: z.array(activeCampaignDraftOpViewSchema),\n publishError: z.string().optional(),\n});\nexport type ActiveCampaignDraftListResponse = z.infer<typeof activeCampaignDraftListResponseSchema>;\n\nexport const activeCampaignDraftRemoveRequestSchema = z.object({\n chatId: z.string().min(1),\n /** A staged ref (`ac_field_1`) or the thing's name / perstag. */\n ref: z.string().min(1),\n});\nexport type ActiveCampaignDraftRemoveRequest = z.infer<typeof activeCampaignDraftRemoveRequestSchema>;\n\nexport const activeCampaignDraftRemoveResponseSchema = z.object({ removed: z.array(z.string()) });\nexport type ActiveCampaignDraftRemoveResponse = z.infer<typeof activeCampaignDraftRemoveResponseSchema>;\n\nexport const activeCampaignDraftClearRequestSchema = z.object({ chatId: z.string().min(1) });\nexport type ActiveCampaignDraftClearRequest = z.infer<typeof activeCampaignDraftClearRequestSchema>;\n\nexport const activeCampaignDraftClearResponseSchema = z.object({ cleared: z.number() });\nexport type ActiveCampaignDraftClearResponse = z.infer<typeof activeCampaignDraftClearResponseSchema>;\n","import {\n ACTIVECAMPAIGN_STAGEABLE_FIELD_TYPES,\n type ActiveCampaignDraftStageResponse,\n type ActiveCampaignWriteKind,\n} from \"@baker/api/activecampaign-writes\";\nimport { type ArgsDef, defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failActiveCampaign } from \"./refusal.ts\";\n\n/**\n * `baker activecampaign stage <field|list|tag|pipeline>`: stage a change to the\n * connected ActiveCampaign account onto this chat. Nothing changes in\n * ActiveCampaign until the chat is published.\n */\n\ntype ArgValues = Record<string, unknown>;\ntype StagedOpInput = Record<string, unknown> & { kind: ActiveCampaignWriteKind };\n\n/** The five campaign parameters a Form usually carries into a lead (`--utm`). */\nconst UTM_FIELDS = [\n [\"UTM_SOURCE\", \"UTM source\"],\n [\"UTM_MEDIUM\", \"UTM medium\"],\n [\"UTM_CAMPAIGN\", \"UTM campaign\"],\n [\"UTM_CONTENT\", \"UTM content\"],\n [\"UTM_TERM\", \"UTM term\"],\n] as const;\n\nfunction text(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() !== \"\" ? value.trim() : undefined;\n}\n\n/** `\"a, b ,c\"` → `[\"a\", \"b\", \"c\"]`. A comma list, because citty keeps only a repeated flag's last value. */\nfunction commaList(value: unknown): string[] | undefined {\n const raw = text(value);\n return raw === undefined\n ? undefined\n : raw\n .split(\",\")\n .map((part) => part.trim())\n .filter((part) => part !== \"\");\n}\n\nfunction defined(entries: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(entries).filter(([, value]) => value !== undefined));\n}\n\n/** The op(s) one `stage` call sends — several only for `field --utm`. The backend validates them. */\nexport function stageOpsFromArgs(kind: ActiveCampaignWriteKind, args: ArgValues): StagedOpInput[] {\n switch (kind) {\n case \"field\":\n if (args.utm === true) {\n return UTM_FIELDS.map(([perstag, title]) => ({ kind, title, type: \"text\", perstag }));\n }\n return [\n {\n kind,\n ...defined({\n title: text(args.title),\n type: text(args.type),\n perstag: text(args.perstag),\n options: commaList(args.options),\n description: text(args.description),\n }),\n },\n ];\n case \"list\":\n case \"tag\":\n return [{ kind, ...defined({ name: text(args.name), description: text(args.description) }) }];\n default:\n return [\n {\n kind,\n ...defined({ title: text(args.title), currency: text(args.currency), stages: commaList(args.stages) }),\n },\n ];\n }\n}\n\nconst STAGED_HINT =\n \"Staged only — nothing has changed in ActiveCampaign yet. It is created when the user publishes this chat (an existing one with the same name is reused, never duplicated). Say it is ready and gets created on Publish — not that it exists already.\";\n\nasync function stage(kind: ActiveCampaignWriteKind, args: ArgValues): Promise<void> {\n const chatId = requireChatId();\n const account = text(args.account);\n try {\n const staged: ActiveCampaignDraftStageResponse[] = [];\n for (const op of stageOpsFromArgs(kind, args)) {\n staged.push(\n await apiPost<ActiveCampaignDraftStageResponse>(\"/api/activecampaign/draft/stage\", {\n chatId,\n ...(account ? { account } : {}),\n op,\n }),\n );\n }\n const hints = [...new Set(staged.flatMap((entry) => entry.hints ?? []))];\n const mapAs = staged.flatMap((entry) => (entry.mapAs ? [entry.mapAs] : []));\n if (mapAs.length > 0) {\n hints.push(\n `Map a Form answer onto it with \\`baker flows map\\` as ${mapAs.map((key) => `\\`${key}\\``).join(\", \")} — the field is found by its perstag when a lead arrives, so the mapping works before and after Publish creates it.`,\n );\n }\n if (staged.some((entry) => entry.alreadyInAccount)) {\n hints.push(\"The account already has at least one of these: Publish reuses it rather than creating a copy.\");\n }\n const data = staged.map(({ hints: _hints, ...entry }) => entry);\n writeJson({ ok: true, data: data.length === 1 ? data[0] : data, hints: [STAGED_HINT, ...hints] });\n } catch (err) {\n failActiveCampaign(err);\n }\n}\n\nconst ACCOUNT_ARG = {\n type: \"string\",\n description: \"Which ActiveCampaign connection, when the company has more than one (the id the error lists)\",\n required: false,\n} as const;\n\nconst FIELD_ARGS = {\n title: { type: \"string\", description: 'Field name as people see it, e.g. \"UTM source\"', required: false },\n type: {\n type: \"string\",\n description: `${ACTIVECAMPAIGN_STAGEABLE_FIELD_TYPES.join(\"|\")} (default text)`,\n required: false,\n },\n perstag: {\n type: \"string\",\n description:\n \"Personalization tag, e.g. UTM_SOURCE — what Forms map onto (custom.UTM_SOURCE). Default: from the title\",\n required: false,\n },\n options: {\n type: \"string\",\n description: 'Comma-separated choices for dropdown|listbox|radio|checkbox, e.g. \"Basic,Pro\"',\n required: false,\n },\n description: { type: \"string\", description: \"Help text shown with the field\", required: false },\n utm: {\n type: \"boolean\",\n description: \"Stage the five UTM text fields at once: UTM_SOURCE, UTM_MEDIUM, UTM_CAMPAIGN, UTM_CONTENT, UTM_TERM\",\n required: false,\n },\n account: ACCOUNT_ARG,\n} as const satisfies ArgsDef;\n\nconst NAMED_ARGS = {\n name: { type: \"string\", description: \"Its name in ActiveCampaign\", required: false },\n description: { type: \"string\", description: \"Optional description\", required: false },\n account: ACCOUNT_ARG,\n} as const satisfies ArgsDef;\n\nconst PIPELINE_ARGS = {\n title: { type: \"string\", description: 'Pipeline name, e.g. \"Inbound leads\"', required: false },\n stages: {\n type: \"string\",\n description:\n 'Comma-separated stages in order, e.g. \"New lead,Qualified,Proposal,Won\". A new pipeline gets exactly these; an existing one only gains the missing ones',\n required: false,\n },\n currency: { type: \"string\", description: \"Deal currency, three letters (default usd)\", required: false },\n account: ACCOUNT_ARG,\n} as const satisfies ArgsDef;\n\nconst DESCRIPTIONS: Record<ActiveCampaignWriteKind, string> = {\n field:\n 'Stage a custom contact field (applied at Publish, on every list). Start here for UTMs: `stage field --utm`, then map `custom.UTM_SOURCE=tracking:utm_source` etc. with `baker flows map`. One field: `stage field --title \"Plan\" --type dropdown --options \"Basic,Pro\"`.',\n list: 'Stage a contact list, e.g. `stage list --name \"Webinar sign-ups\"` (applied at Publish; an existing list of that name is reused).',\n tag: 'Stage a contact tag, e.g. `stage tag --name \"hot-lead\"` (applied at Publish; reused when it exists). A Form can also create tags on its own when it tags a lead.',\n pipeline:\n 'Stage a deal pipeline with its stages, e.g. `stage pipeline --title \"Inbound\" --stages \"New lead,Qualified,Won\"` (applied at Publish; an existing pipeline only gains missing stages).',\n};\n\nfunction schemaArgs(args: ArgsDef): Record<string, { type: string; description: string; required: boolean }> {\n return Object.fromEntries(\n Object.entries(args).map(([name, arg]) => [\n name,\n { type: arg.type ?? \"string\", description: arg.description ?? \"\", required: arg.required === true },\n ]),\n );\n}\n\nfunction stageCommand(kind: ActiveCampaignWriteKind, args: ArgsDef) {\n registerSchema({ command: `activecampaign.stage.${kind}`, description: DESCRIPTIONS[kind], args: schemaArgs(args) });\n return defineCommand({\n meta: { name: kind, description: DESCRIPTIONS[kind] },\n args,\n run: async ({ args: values }) => {\n await stage(kind, values as ArgValues);\n },\n });\n}\n\nexport const stageCommandGroup = defineCommand({\n meta: {\n name: \"stage\",\n description:\n \"Stage an ActiveCampaign change on this chat — a custom field, list, tag or deal pipeline. Nothing changes in ActiveCampaign until the chat is published; restaging the same name replaces the staged one. Review with `baker activecampaign drafts`, drop with `baker activecampaign unstage`.\",\n },\n subCommands: {\n field: stageCommand(\"field\", FIELD_ARGS),\n list: stageCommand(\"list\", NAMED_ARGS),\n tag: stageCommand(\"tag\", NAMED_ARGS),\n pipeline: stageCommand(\"pipeline\", PIPELINE_ARGS),\n },\n});\n","import type {\n ActiveCampaignDraftClearResponse,\n ActiveCampaignDraftRemoveResponse,\n} from \"@baker/api/activecampaign-writes\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failActiveCampaign } from \"./refusal.ts\";\n\nconst DESCRIPTION =\n 'Drop a staged ActiveCampaign change from this chat before it is published: `unstage ac_field_1`, `unstage UTM_SOURCE` (a field\\'s perstag) or `unstage \"Webinar sign-ups\"` (a name). `--all` drops every staged ActiveCampaign change. Nothing in ActiveCampaign is touched.';\n\nregisterSchema({\n command: \"activecampaign.unstage\",\n description: DESCRIPTION,\n args: {\n ref: { type: \"positional\", description: \"Staged ref, name, or a field's perstag\", required: false },\n all: { type: \"boolean\", description: \"Drop every staged ActiveCampaign change on this chat\", required: false },\n },\n});\n\nexport const unstageCommand = defineCommand({\n meta: { name: \"unstage\", description: DESCRIPTION },\n args: {\n ref: { type: \"positional\", description: \"Staged ref, name, or a field's perstag\", required: false },\n all: { type: \"boolean\", description: \"Drop every staged ActiveCampaign change on this chat\", required: false },\n },\n run: async ({ args }) => {\n const chatId = requireChatId();\n try {\n if (args.all === true) {\n const data = await apiPost<ActiveCampaignDraftClearResponse>(\"/api/activecampaign/draft/clear\", { chatId });\n writeJson({ ok: true, data });\n return;\n }\n const ref = typeof args.ref === \"string\" ? args.ref.trim() : \"\";\n if (!ref) {\n writeJson({\n ok: false,\n error: { code: \"VALIDATION_ERROR\", message: \"pass the staged ref, name or perstag to drop, or --all\" },\n });\n process.exit(1);\n }\n const data = await apiPost<ActiveCampaignDraftRemoveResponse>(\"/api/activecampaign/draft/remove\", {\n chatId,\n ref,\n });\n writeJson({\n ok: true,\n data,\n ...(data.removed.length === 0\n ? { hints: [`Nothing staged matches \"${ref}\". Run \\`baker activecampaign drafts\\` to see the refs.`] }\n : {}),\n });\n } catch (err) {\n failActiveCampaign(err);\n }\n },\n});\n"],"mappings":"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","names":["defineCommand","defineCommand","limit","defineCommand","z","stage","z","defineCommand","raw","name","defineCommand","defineCommand","DESCRIPTION","defineCommand","data","defineCommand"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import {
|
|
2
|
+
nextStepHints,
|
|
3
|
+
reportError,
|
|
4
|
+
validationError
|
|
5
|
+
} from "./chunk-GZ4A2VYW.js";
|
|
6
|
+
import {
|
|
7
|
+
postsAddRequestSchema
|
|
8
|
+
} from "./chunk-NZS3KEQ2.js";
|
|
9
|
+
import {
|
|
10
|
+
apiPost
|
|
11
|
+
} from "./chunk-6YLNY6CK.js";
|
|
12
|
+
import "./chunk-D5NEIESR.js";
|
|
13
|
+
import "./chunk-57KKVDDR.js";
|
|
14
|
+
import {
|
|
15
|
+
registerSchema,
|
|
16
|
+
writeJson
|
|
17
|
+
} from "./chunk-QANGHND7.js";
|
|
18
|
+
import "./chunk-YQSBHWOI.js";
|
|
19
|
+
|
|
20
|
+
// src/commands/posts/add.ts
|
|
21
|
+
import { defineCommand } from "citty";
|
|
22
|
+
registerSchema({
|
|
23
|
+
command: "posts.add",
|
|
24
|
+
description: "Add one post by its link \u2014 the way in for a private profile's posts (many people's LinkedIn profiles are), or for a post by someone the company doesn't follow. Any link to the post works; the embed link isn't needed. Reads the post's text, author and numbers, works out whether it can run as an ad, and imports its images and videos into the libraries (not a YouTube video: the hint says how). Applies immediately and shows on the chat as an already-applied change. Costs one read.",
|
|
25
|
+
args: {
|
|
26
|
+
url: { type: "string", description: "The post's link", required: true },
|
|
27
|
+
media: {
|
|
28
|
+
type: "boolean",
|
|
29
|
+
description: "Import its images and videos into the libraries (default); --no-media records the post only",
|
|
30
|
+
required: false
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
function youtubeVideoId(url) {
|
|
35
|
+
return url.match(/(?:[?&]v=|\/shorts\/|youtu\.be\/)([\w-]{11})/)?.[1];
|
|
36
|
+
}
|
|
37
|
+
function addHints(data, link) {
|
|
38
|
+
const hints = nextStepHints(data.post);
|
|
39
|
+
if (data.media && data.media.failed > 0) {
|
|
40
|
+
hints.push(
|
|
41
|
+
`${data.media.failed} of its files couldn't be fetched, so they aren't in the libraries; the post itself is saved.`
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
const videoId = data.post.platform === "youtube" ? youtubeVideoId(link) : void 0;
|
|
45
|
+
if (videoId) {
|
|
46
|
+
hints.push(
|
|
47
|
+
`To put the video itself in the video library: \`baker videos ingest ${link} --source youtube --external-id youtube:${videoId}\`.`
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
return hints;
|
|
51
|
+
}
|
|
52
|
+
var addCommand = defineCommand({
|
|
53
|
+
meta: {
|
|
54
|
+
name: "add",
|
|
55
|
+
description: "Add a post by its link, with its images and videos.\n\nExamples:\n baker posts add https://www.linkedin.com/posts/jane-doe_we-closed-activity-7477679889043750912-K2pu\n baker posts add https://www.instagram.com/p/Dek_RAKjMDJ/ --no-media"
|
|
56
|
+
},
|
|
57
|
+
args: {
|
|
58
|
+
url: { type: "positional", description: "The post's link", required: true },
|
|
59
|
+
media: {
|
|
60
|
+
type: "boolean",
|
|
61
|
+
description: "Import its images and videos into the libraries (default); --no-media records the post only",
|
|
62
|
+
default: true
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
run: async ({ args }) => {
|
|
66
|
+
const parsed = postsAddRequestSchema.safeParse({ url: String(args.url ?? ""), media: args.media !== false });
|
|
67
|
+
if (!parsed.success) validationError(parsed.error.issues[0]?.message ?? "Pass the post's link");
|
|
68
|
+
try {
|
|
69
|
+
const data = await apiPost("/api/posts/add", parsed.data, { timeoutMs: 12e4 });
|
|
70
|
+
writeJson({ ok: true, data, hints: addHints(data, parsed.data.url) });
|
|
71
|
+
} catch (err) {
|
|
72
|
+
reportError(err);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
export {
|
|
77
|
+
addCommand,
|
|
78
|
+
addHints
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=add-AOQLZRPC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/posts/add.ts"],"sourcesContent":["import { postsAddRequestSchema } from \"@baker/api/social-posts\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { nextStepHints, reportError, validationError } from \"./shared.ts\";\n\nregisterSchema({\n command: \"posts.add\",\n description:\n \"Add one post by its link — the way in for a private profile's posts (many people's LinkedIn profiles are), or for a post by someone the company doesn't follow. Any link to the post works; the embed link isn't needed. Reads the post's text, author and numbers, works out whether it can run as an ad, and imports its images and videos into the libraries (not a YouTube video: the hint says how). Applies immediately and shows on the chat as an already-applied change. Costs one read.\",\n args: {\n url: { type: \"string\", description: \"The post's link\", required: true },\n media: {\n type: \"boolean\",\n description: \"Import its images and videos into the libraries (default); --no-media records the post only\",\n required: false,\n },\n },\n});\n\ntype Added = {\n created: boolean;\n post: { id: string; platform: string; usable: string; url: string } & Record<string, unknown>;\n media?: { imported: number; failed: number };\n};\n\n/** The YouTube video id a watch, Shorts or youtu.be link names. */\nfunction youtubeVideoId(url: string): string | undefined {\n return url.match(/(?:[?&]v=|\\/shorts\\/|youtu\\.be\\/)([\\w-]{11})/)?.[1];\n}\n\nexport function addHints(data: Added, link: string): string[] {\n const hints = nextStepHints(data.post);\n if (data.media && data.media.failed > 0) {\n hints.push(\n `${data.media.failed} of its files couldn't be fetched, so they aren't in the libraries; the post itself is saved.`,\n );\n }\n const videoId = data.post.platform === \"youtube\" ? youtubeVideoId(link) : undefined;\n if (videoId) {\n hints.push(\n `To put the video itself in the video library: \\`baker videos ingest ${link} --source youtube --external-id youtube:${videoId}\\`.`,\n );\n }\n return hints;\n}\n\nexport const addCommand = defineCommand({\n meta: {\n name: \"add\",\n description:\n \"Add a post by its link, with its images and videos.\\n\\nExamples:\\n baker posts add https://www.linkedin.com/posts/jane-doe_we-closed-activity-7477679889043750912-K2pu\\n baker posts add https://www.instagram.com/p/Dek_RAKjMDJ/ --no-media\",\n },\n args: {\n url: { type: \"positional\", description: \"The post's link\", required: true },\n media: {\n type: \"boolean\",\n description: \"Import its images and videos into the libraries (default); --no-media records the post only\",\n default: true,\n },\n },\n run: async ({ args }) => {\n const parsed = postsAddRequestSchema.safeParse({ url: String(args.url ?? \"\"), media: args.media !== false });\n if (!parsed.success) validationError(parsed.error.issues[0]?.message ?? \"Pass the post's link\");\n try {\n const data = await apiPost<Added>(\"/api/posts/add\", parsed.data, { timeoutMs: 120_000 });\n writeJson({ ok: true, data, hints: addHints(data, parsed.data.url) });\n } catch (err) {\n reportError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,KAAK;AAAA,IACtE,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AASD,SAAS,eAAe,KAAiC;AACvD,SAAO,IAAI,MAAM,8CAA8C,IAAI,CAAC;AACtE;AAEO,SAAS,SAAS,MAAa,MAAwB;AAC5D,QAAM,QAAQ,cAAc,KAAK,IAAI;AACrC,MAAI,KAAK,SAAS,KAAK,MAAM,SAAS,GAAG;AACvC,UAAM;AAAA,MACJ,GAAG,KAAK,MAAM,MAAM;AAAA,IACtB;AAAA,EACF;AACA,QAAM,UAAU,KAAK,KAAK,aAAa,YAAY,eAAe,IAAI,IAAI;AAC1E,MAAI,SAAS;AACX,UAAM;AAAA,MACJ,uEAAuE,IAAI,2CAA2C,OAAO;AAAA,IAC/H;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,aAAa,cAAc;AAAA,EACtC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,cAAc,aAAa,mBAAmB,UAAU,KAAK;AAAA,IAC1E,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,SAAS,sBAAsB,UAAU,EAAE,KAAK,OAAO,KAAK,OAAO,EAAE,GAAG,OAAO,KAAK,UAAU,MAAM,CAAC;AAC3G,QAAI,CAAC,OAAO,QAAS,iBAAgB,OAAO,MAAM,OAAO,CAAC,GAAG,WAAW,sBAAsB;AAC9F,QAAI;AACF,YAAM,OAAO,MAAM,QAAe,kBAAkB,OAAO,MAAM,EAAE,WAAW,KAAQ,CAAC;AACvF,gBAAU,EAAE,IAAI,MAAM,MAAM,OAAO,SAAS,MAAM,OAAO,KAAK,GAAG,EAAE,CAAC;AAAA,IACtE,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import {
|
|
2
|
+
compactSource,
|
|
3
|
+
reportError,
|
|
4
|
+
reportInvalid
|
|
5
|
+
} from "./chunk-RVTXDQYC.js";
|
|
6
|
+
import {
|
|
7
|
+
testimonialSourceRefreshIntervalSchema,
|
|
8
|
+
testimonialSourceTypeSchema,
|
|
9
|
+
testimonialSourcesAddRequestSchema
|
|
10
|
+
} from "./chunk-O37VU7FG.js";
|
|
11
|
+
import "./chunk-CAZGM2NX.js";
|
|
12
|
+
import "./chunk-NZS3KEQ2.js";
|
|
13
|
+
import "./chunk-GIWHHCD6.js";
|
|
14
|
+
import "./chunk-XQIOCIDO.js";
|
|
15
|
+
import "./chunk-WTJSMYY2.js";
|
|
16
|
+
import {
|
|
17
|
+
apiPost
|
|
18
|
+
} from "./chunk-6YLNY6CK.js";
|
|
19
|
+
import "./chunk-D5NEIESR.js";
|
|
20
|
+
import "./chunk-57KKVDDR.js";
|
|
21
|
+
import {
|
|
22
|
+
registerSchema,
|
|
23
|
+
writeJson
|
|
24
|
+
} from "./chunk-QANGHND7.js";
|
|
25
|
+
import "./chunk-YQSBHWOI.js";
|
|
26
|
+
|
|
27
|
+
// src/commands/testimonials/sources/add.ts
|
|
28
|
+
import { defineCommand } from "citty";
|
|
29
|
+
var SITES = testimonialSourceTypeSchema.options.join("|");
|
|
30
|
+
registerSchema({
|
|
31
|
+
command: "testimonials.sources.add",
|
|
32
|
+
description: "Add a review page as a testimonial source \u2014 Google Maps, Trustpilot, Yelp, Tripadvisor, G2, Capterra, Amazon, App Store or Google Play. Pass the page's link (it names its own site), or a business name for Google Maps. Its reviews (up to 700) are imported, tagged and made searchable in the background over the next minutes. Each imported review costs a little, so add only the client's own listings the user asked for. Applies immediately and shows on the chat as an already-applied change. Adding a listing that is already a source is a no-op that starts a fresh import.",
|
|
33
|
+
args: {
|
|
34
|
+
input: {
|
|
35
|
+
type: "string",
|
|
36
|
+
description: "The review page's link, or a business name (Google Maps only)",
|
|
37
|
+
required: true
|
|
38
|
+
},
|
|
39
|
+
platform: {
|
|
40
|
+
type: "string",
|
|
41
|
+
description: `Only to force a site: ${SITES}. A bare domain with trustpilot is that company's Trustpilot page.`,
|
|
42
|
+
required: false
|
|
43
|
+
},
|
|
44
|
+
every: {
|
|
45
|
+
type: "string",
|
|
46
|
+
description: `Auto-sync cadence: ${testimonialSourceRefreshIntervalSchema.options.join("|")} (default never)`,
|
|
47
|
+
required: false
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
function addSourceHints(input, { created, source }) {
|
|
52
|
+
const hints = [
|
|
53
|
+
created ? `Added ${source.label} on ${source.platformLabel}. Its reviews are importing in the background \u2014 they become searchable with \`baker testimonials search\` as each one is analysed, usually within a few minutes. Don't wait on them in this turn; check with \`baker testimonials sources list\`.` : `${source.label} on ${source.platformLabel} was already a source; a fresh import was started if one wasn't running.`
|
|
54
|
+
];
|
|
55
|
+
if (created && source.platform === "google" && !/^https?:\/\/|\.[a-z]{2,}\//i.test(input.trim())) {
|
|
56
|
+
hints.push(
|
|
57
|
+
`Matched the name to ${source.label} on Google Maps (${source.pageUrl ?? "no link"}). If that is not the client's business, run \`baker testimonials sources remove ${source.id}\` at once and add the listing's Google Maps link instead.`
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
if (source.refreshInterval === "never") {
|
|
61
|
+
hints.push(
|
|
62
|
+
`Auto-sync is off. If the user wants new reviews to keep arriving: \`baker testimonials sources schedule ${source.id} --every monthly\`.`
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
return hints;
|
|
66
|
+
}
|
|
67
|
+
var addCommand = defineCommand({
|
|
68
|
+
meta: {
|
|
69
|
+
name: "add",
|
|
70
|
+
description: `Add a review page as a testimonial source. Start here with the page's link; for Google Maps a business name also works.
|
|
71
|
+
|
|
72
|
+
Examples:
|
|
73
|
+
baker testimonials sources add https://www.yelp.com/biz/acme-bakery-madrid
|
|
74
|
+
baker testimonials sources add https://www.g2.com/products/acme --every monthly
|
|
75
|
+
baker testimonials sources add "Acme Bakery Madrid" # Google Maps, found by name
|
|
76
|
+
baker testimonials sources add acme.com --platform trustpilot`
|
|
77
|
+
},
|
|
78
|
+
args: {
|
|
79
|
+
input: { type: "positional", description: "Review page link, or a business name for Google Maps", required: true },
|
|
80
|
+
platform: { type: "string", description: `Force a site: ${SITES}`, required: false },
|
|
81
|
+
every: { type: "string", description: "Auto-sync: never|daily|weekly|monthly", required: false }
|
|
82
|
+
},
|
|
83
|
+
run: async ({ args }) => {
|
|
84
|
+
const parsed = testimonialSourcesAddRequestSchema.safeParse({
|
|
85
|
+
input: String(args.input ?? ""),
|
|
86
|
+
platform: args.platform ? String(args.platform).toLowerCase().replace(/[\s-]/g, "_") : void 0,
|
|
87
|
+
every: args.every ? String(args.every).toLowerCase() : void 0
|
|
88
|
+
});
|
|
89
|
+
if (!parsed.success) reportInvalid(parsed.error.issues[0]);
|
|
90
|
+
try {
|
|
91
|
+
const data = await apiPost("/api/testimonials/sources/add", parsed.data, {
|
|
92
|
+
timeoutMs: 12e4
|
|
93
|
+
});
|
|
94
|
+
const hints = addSourceHints(parsed.data.input, data);
|
|
95
|
+
writeJson({ ok: true, data: { created: data.created, source: compactSource(data.source) }, hints });
|
|
96
|
+
} catch (err) {
|
|
97
|
+
reportError(err);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
export {
|
|
102
|
+
addCommand,
|
|
103
|
+
addSourceHints
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=add-HWXEPSZF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/testimonials/sources/add.ts"],"sourcesContent":["import {\n type TestimonialSourcesAddResponse,\n testimonialSourceRefreshIntervalSchema,\n testimonialSourcesAddRequestSchema,\n testimonialSourceTypeSchema,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeJson } from \"../../../output.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { compactSource, reportError, reportInvalid } from \"./shared.ts\";\n\nconst SITES = testimonialSourceTypeSchema.options.join(\"|\");\n\nregisterSchema({\n command: \"testimonials.sources.add\",\n description:\n \"Add a review page as a testimonial source — Google Maps, Trustpilot, Yelp, Tripadvisor, G2, Capterra, Amazon, App Store or Google Play. Pass the page's link (it names its own site), or a business name for Google Maps. Its reviews (up to 700) are imported, tagged and made searchable in the background over the next minutes. Each imported review costs a little, so add only the client's own listings the user asked for. Applies immediately and shows on the chat as an already-applied change. Adding a listing that is already a source is a no-op that starts a fresh import.\",\n args: {\n input: {\n type: \"string\",\n description: \"The review page's link, or a business name (Google Maps only)\",\n required: true,\n },\n platform: {\n type: \"string\",\n description: `Only to force a site: ${SITES}. A bare domain with trustpilot is that company's Trustpilot page.`,\n required: false,\n },\n every: {\n type: \"string\",\n description: `Auto-sync cadence: ${testimonialSourceRefreshIntervalSchema.options.join(\"|\")} (default never)`,\n required: false,\n },\n },\n});\n\n/** What the agent should know after an add: that it runs on without it, and what to check. */\nexport function addSourceHints(input: string, { created, source }: TestimonialSourcesAddResponse): string[] {\n const hints = [\n created\n ? `Added ${source.label} on ${source.platformLabel}. Its reviews are importing in the background — they become searchable with \\`baker testimonials search\\` as each one is analysed, usually within a few minutes. Don't wait on them in this turn; check with \\`baker testimonials sources list\\`.`\n : `${source.label} on ${source.platformLabel} was already a source; a fresh import was started if one wasn't running.`,\n ];\n if (created && source.platform === \"google\" && !/^https?:\\/\\/|\\.[a-z]{2,}\\//i.test(input.trim())) {\n hints.push(\n `Matched the name to ${source.label} on Google Maps (${source.pageUrl ?? \"no link\"}). If that is not the client's business, run \\`baker testimonials sources remove ${source.id}\\` at once and add the listing's Google Maps link instead.`,\n );\n }\n if (source.refreshInterval === \"never\") {\n hints.push(\n `Auto-sync is off. If the user wants new reviews to keep arriving: \\`baker testimonials sources schedule ${source.id} --every monthly\\`.`,\n );\n }\n return hints;\n}\n\nexport const addCommand = defineCommand({\n meta: {\n name: \"add\",\n description: `Add a review page as a testimonial source. Start here with the page's link; for Google Maps a business name also works.\n\nExamples:\n baker testimonials sources add https://www.yelp.com/biz/acme-bakery-madrid\n baker testimonials sources add https://www.g2.com/products/acme --every monthly\n baker testimonials sources add \"Acme Bakery Madrid\" # Google Maps, found by name\n baker testimonials sources add acme.com --platform trustpilot`,\n },\n args: {\n input: { type: \"positional\", description: \"Review page link, or a business name for Google Maps\", required: true },\n platform: { type: \"string\", description: `Force a site: ${SITES}`, required: false },\n every: { type: \"string\", description: \"Auto-sync: never|daily|weekly|monthly\", required: false },\n },\n run: async ({ args }) => {\n const parsed = testimonialSourcesAddRequestSchema.safeParse({\n input: String(args.input ?? \"\"),\n platform: args.platform ? String(args.platform).toLowerCase().replace(/[\\s-]/g, \"_\") : undefined,\n every: args.every ? String(args.every).toLowerCase() : undefined,\n });\n if (!parsed.success) reportInvalid(parsed.error.issues[0]);\n\n try {\n const data = await apiPost<TestimonialSourcesAddResponse>(\"/api/testimonials/sources/add\", parsed.data, {\n timeoutMs: 120_000,\n });\n const hints = addSourceHints(parsed.data.input, data);\n writeJson({ ok: true, data: { created: data.created, source: compactSource(data.source) }, hints });\n } catch (err) {\n reportError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,SAAS,qBAAqB;AAM9B,IAAM,QAAQ,4BAA4B,QAAQ,KAAK,GAAG;AAE1D,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa,yBAAyB,KAAK;AAAA,MAC3C,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa,sBAAsB,uCAAuC,QAAQ,KAAK,GAAG,CAAC;AAAA,MAC3F,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAGM,SAAS,eAAe,OAAe,EAAE,SAAS,OAAO,GAA4C;AAC1G,QAAM,QAAQ;AAAA,IACZ,UACI,SAAS,OAAO,KAAK,OAAO,OAAO,aAAa,2PAChD,GAAG,OAAO,KAAK,OAAO,OAAO,aAAa;AAAA,EAChD;AACA,MAAI,WAAW,OAAO,aAAa,YAAY,CAAC,8BAA8B,KAAK,MAAM,KAAK,CAAC,GAAG;AAChG,UAAM;AAAA,MACJ,uBAAuB,OAAO,KAAK,oBAAoB,OAAO,WAAW,SAAS,oFAAoF,OAAO,EAAE;AAAA,IACjL;AAAA,EACF;AACA,MAAI,OAAO,oBAAoB,SAAS;AACtC,UAAM;AAAA,MACJ,2GAA2G,OAAO,EAAE;AAAA,IACtH;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,aAAa,cAAc;AAAA,EACtC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,cAAc,aAAa,wDAAwD,UAAU,KAAK;AAAA,IACjH,UAAU,EAAE,MAAM,UAAU,aAAa,iBAAiB,KAAK,IAAI,UAAU,MAAM;AAAA,IACnF,OAAO,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,MAAM;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,SAAS,mCAAmC,UAAU;AAAA,MAC1D,OAAO,OAAO,KAAK,SAAS,EAAE;AAAA,MAC9B,UAAU,KAAK,WAAW,OAAO,KAAK,QAAQ,EAAE,YAAY,EAAE,QAAQ,UAAU,GAAG,IAAI;AAAA,MACvF,OAAO,KAAK,QAAQ,OAAO,KAAK,KAAK,EAAE,YAAY,IAAI;AAAA,IACzD,CAAC;AACD,QAAI,CAAC,OAAO,QAAS,eAAc,OAAO,MAAM,OAAO,CAAC,CAAC;AAEzD,QAAI;AACF,YAAM,OAAO,MAAM,QAAuC,iCAAiC,OAAO,MAAM;AAAA,QACtG,WAAW;AAAA,MACb,CAAC;AACD,YAAM,QAAQ,eAAe,OAAO,KAAK,OAAO,IAAI;AACpD,gBAAU,EAAE,IAAI,MAAM,MAAM,EAAE,SAAS,KAAK,SAAS,QAAQ,cAAc,KAAK,MAAM,EAAE,GAAG,MAAM,CAAC;AAAA,IACpG,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import {
|
|
2
|
+
compactSource,
|
|
3
|
+
reportError
|
|
4
|
+
} from "./chunk-SZNGQ2GF.js";
|
|
5
|
+
import {
|
|
6
|
+
mediaSourcePlatformSchema,
|
|
7
|
+
mediaSourceRefreshIntervalSchema,
|
|
8
|
+
mediaSourcesAddRequestSchema
|
|
9
|
+
} from "./chunk-CAZGM2NX.js";
|
|
10
|
+
import {
|
|
11
|
+
socialPersonRoleSchema
|
|
12
|
+
} from "./chunk-NZS3KEQ2.js";
|
|
13
|
+
import {
|
|
14
|
+
apiPost
|
|
15
|
+
} from "./chunk-6YLNY6CK.js";
|
|
16
|
+
import "./chunk-D5NEIESR.js";
|
|
17
|
+
import "./chunk-57KKVDDR.js";
|
|
18
|
+
import {
|
|
19
|
+
registerSchema,
|
|
20
|
+
writeJson
|
|
21
|
+
} from "./chunk-QANGHND7.js";
|
|
22
|
+
import "./chunk-YQSBHWOI.js";
|
|
23
|
+
|
|
24
|
+
// src/commands/media-sources/add.ts
|
|
25
|
+
import { defineCommand } from "citty";
|
|
26
|
+
registerSchema({
|
|
27
|
+
command: "media-sources.add",
|
|
28
|
+
description: "Follow a public social account \u2014 a company page or a key person (CEO, CTO, head of sales\u2026) \u2014 on Instagram, TikTok, YouTube (videos only), LinkedIn (company pages and people's /in/ profiles) or Facebook. Its recent posts (up to a year back) go into Posts (`baker posts list`, text-only ones included, with likes and comments and whether each can run as an ad), and their images and videos into the libraries. A Google Drive folder is not added here: ask for it with request_connection (platform google-drive, choose media-folder) and the user picks it in the chat. Everything is described and made searchable in the background. Applies immediately and shows on the chat as an already-applied change. Adding a source that is already connected is a no-op.",
|
|
29
|
+
args: {
|
|
30
|
+
input: {
|
|
31
|
+
type: "string",
|
|
32
|
+
description: "Profile URL (names its own platform), or @handle together with --platform",
|
|
33
|
+
required: true
|
|
34
|
+
},
|
|
35
|
+
platform: {
|
|
36
|
+
type: "string",
|
|
37
|
+
description: `Needed only for a bare handle: ${mediaSourcePlatformSchema.options.join("|")}`,
|
|
38
|
+
required: false
|
|
39
|
+
},
|
|
40
|
+
every: {
|
|
41
|
+
type: "string",
|
|
42
|
+
description: `Auto-sync cadence: ${mediaSourceRefreshIntervalSchema.options.join("|")} (default weekly for a page, daily for a person)`,
|
|
43
|
+
required: false
|
|
44
|
+
},
|
|
45
|
+
person: {
|
|
46
|
+
type: "string",
|
|
47
|
+
description: "Following a key person rather than a page: their name. A LinkedIn /in/ profile is always a person; pass this with --role for one on another platform.",
|
|
48
|
+
required: false
|
|
49
|
+
},
|
|
50
|
+
role: {
|
|
51
|
+
type: "string",
|
|
52
|
+
description: `Who they are: ${socialPersonRoleSchema.options.join("|")}. Scheduled agents can wait for "any CEO's post".`,
|
|
53
|
+
required: false,
|
|
54
|
+
enum: [...socialPersonRoleSchema.options]
|
|
55
|
+
},
|
|
56
|
+
title: { type: "string", description: "Their job title as written, e.g. 'VP Sales EMEA'", required: false },
|
|
57
|
+
"not-own": {
|
|
58
|
+
type: "boolean",
|
|
59
|
+
description: "A partner, a creator or another brand \u2014 not the company's own page or people. Its posts need the author's OK to run as ads.",
|
|
60
|
+
required: false
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
var addCommand = defineCommand({
|
|
65
|
+
meta: {
|
|
66
|
+
name: "add",
|
|
67
|
+
description: 'Follow a social account \u2014 the company\'s page, or a key person such as the CEO \u2014 on Instagram, TikTok, YouTube, LinkedIn or Facebook. Start here with the profile URL. Its posts land in `baker posts`, its images and videos in the libraries. A Google Drive folder is never added by link: call request_connection with platform google-drive and choose media-folder, and the user picks the folder in the chat.\n\nExamples:\n baker media-sources add https://www.linkedin.com/company/acme\n baker media-sources add https://www.linkedin.com/in/jane-doe --role ceo\n baker media-sources add https://www.tiktok.com/@acme\n baker media-sources add @creator --platform instagram --person "Ana Ruiz" --role creator --not-own'
|
|
68
|
+
},
|
|
69
|
+
args: {
|
|
70
|
+
input: { type: "positional", description: "Profile URL or @handle", required: true },
|
|
71
|
+
platform: {
|
|
72
|
+
type: "string",
|
|
73
|
+
description: "instagram|tiktok|youtube|linkedin|facebook \u2014 only for a bare handle",
|
|
74
|
+
required: false
|
|
75
|
+
},
|
|
76
|
+
every: { type: "string", description: "Auto-sync: never|daily|weekly|monthly", required: false },
|
|
77
|
+
person: {
|
|
78
|
+
type: "string",
|
|
79
|
+
description: "A key person's name (implied for a LinkedIn /in/ profile)",
|
|
80
|
+
required: false
|
|
81
|
+
},
|
|
82
|
+
role: { type: "string", description: socialPersonRoleSchema.options.join("|"), required: false },
|
|
83
|
+
title: { type: "string", description: "Their job title", required: false },
|
|
84
|
+
"not-own": { type: "boolean", description: "A partner, creator or another brand", required: false }
|
|
85
|
+
},
|
|
86
|
+
run: async ({ args }) => {
|
|
87
|
+
const parsed = mediaSourcesAddRequestSchema.safeParse({
|
|
88
|
+
input: String(args.input ?? ""),
|
|
89
|
+
platform: args.platform ? String(args.platform).toLowerCase() : void 0,
|
|
90
|
+
every: args.every ? String(args.every).toLowerCase() : void 0,
|
|
91
|
+
person: args.person ? String(args.person) : void 0,
|
|
92
|
+
role: args.role ? String(args.role).toLowerCase() : void 0,
|
|
93
|
+
title: args.title ? String(args.title) : void 0,
|
|
94
|
+
own: args["not-own"] === true ? false : void 0
|
|
95
|
+
});
|
|
96
|
+
if (!parsed.success) {
|
|
97
|
+
const issue = parsed.error.issues[0];
|
|
98
|
+
writeJson({
|
|
99
|
+
ok: false,
|
|
100
|
+
error: {
|
|
101
|
+
code: "VALIDATION_ERROR",
|
|
102
|
+
message: issue ? `${issue.path.join(".") || "input"}: ${issue.message}` : "Invalid request"
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const data = await apiPost("/api/media-sources/add", parsed.data, {
|
|
109
|
+
timeoutMs: 12e4
|
|
110
|
+
});
|
|
111
|
+
const hints = addHints(data);
|
|
112
|
+
writeJson({
|
|
113
|
+
ok: true,
|
|
114
|
+
data: { created: data.created, source: compactSource(data.source), name: data.profile.displayName },
|
|
115
|
+
hints
|
|
116
|
+
});
|
|
117
|
+
} catch (err) {
|
|
118
|
+
reportError(err, parsed.data.input);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
function addHints(data) {
|
|
123
|
+
const hints = data.profile.isPrivate ? [`Followed ${data.source.label} on LinkedIn.`] : [
|
|
124
|
+
data.created ? `Connected ${data.source.label} on ${data.source.platformLabel}. Its posts are importing in the background \u2014 they become searchable with \`baker images search\` / \`baker videos search\` as each one is analysed. Check progress with \`baker media-sources list\`.` : `${data.source.label} on ${data.source.platformLabel} was already connected; a fresh import was started if one wasn't running.`
|
|
125
|
+
];
|
|
126
|
+
if (data.profile.isPrivate) {
|
|
127
|
+
hints.push(
|
|
128
|
+
`${data.profile.displayName}'s profile is private (or the link is wrong \u2014 LinkedIn answers both the same way), so Baker can't read their posts on its own. Add each post by its link: \`baker posts add <post link>\` (the user copies it from the post's \u22EF menu \u2192 Copy link). If the link was wrong: \`baker media-sources remove ${data.source.key}\`.`
|
|
129
|
+
);
|
|
130
|
+
} else {
|
|
131
|
+
hints.push(`Their posts: \`baker posts list --account ${data.source.key}\`.`);
|
|
132
|
+
}
|
|
133
|
+
if (data.source.platform === "youtube") {
|
|
134
|
+
hints.push(
|
|
135
|
+
"YouTube feeds the video library only, newest first, a batch per sync; videos over 20 minutes are skipped."
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
if (data.source.refreshInterval === "never" && !data.profile.isPrivate) {
|
|
139
|
+
hints.push(
|
|
140
|
+
`Auto-sync is off. If the user wants new posts to keep arriving: \`baker media-sources schedule ${data.source.key} --every weekly\`.`
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
return hints;
|
|
144
|
+
}
|
|
145
|
+
export {
|
|
146
|
+
addCommand
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=add-VDZPGZF5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/media-sources/add.ts"],"sourcesContent":["import {\n type MediaSourcesAddResponse,\n mediaSourcePlatformSchema,\n mediaSourceRefreshIntervalSchema,\n mediaSourcesAddRequestSchema,\n} from \"@baker/api/media-sources\";\nimport { socialPersonRoleSchema } from \"@baker/api/social-posts\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { compactSource, reportError } from \"./shared.ts\";\n\nregisterSchema({\n command: \"media-sources.add\",\n description:\n \"Follow a public social account — a company page or a key person (CEO, CTO, head of sales…) — on Instagram, TikTok, YouTube (videos only), LinkedIn (company pages and people's /in/ profiles) or Facebook. Its recent posts (up to a year back) go into Posts (`baker posts list`, text-only ones included, with likes and comments and whether each can run as an ad), and their images and videos into the libraries. A Google Drive folder is not added here: ask for it with request_connection (platform google-drive, choose media-folder) and the user picks it in the chat. Everything is described and made searchable in the background. Applies immediately and shows on the chat as an already-applied change. Adding a source that is already connected is a no-op.\",\n args: {\n input: {\n type: \"string\",\n description: \"Profile URL (names its own platform), or @handle together with --platform\",\n required: true,\n },\n platform: {\n type: \"string\",\n description: `Needed only for a bare handle: ${mediaSourcePlatformSchema.options.join(\"|\")}`,\n required: false,\n },\n every: {\n type: \"string\",\n description: `Auto-sync cadence: ${mediaSourceRefreshIntervalSchema.options.join(\"|\")} (default weekly for a page, daily for a person)`,\n required: false,\n },\n person: {\n type: \"string\",\n description:\n \"Following a key person rather than a page: their name. A LinkedIn /in/ profile is always a person; pass this with --role for one on another platform.\",\n required: false,\n },\n role: {\n type: \"string\",\n description: `Who they are: ${socialPersonRoleSchema.options.join(\"|\")}. Scheduled agents can wait for \"any CEO's post\".`,\n required: false,\n enum: [...socialPersonRoleSchema.options],\n },\n title: { type: \"string\", description: \"Their job title as written, e.g. 'VP Sales EMEA'\", required: false },\n \"not-own\": {\n type: \"boolean\",\n description:\n \"A partner, a creator or another brand — not the company's own page or people. Its posts need the author's OK to run as ads.\",\n required: false,\n },\n },\n});\n\nexport const addCommand = defineCommand({\n meta: {\n name: \"add\",\n description:\n 'Follow a social account — the company\\'s page, or a key person such as the CEO — on Instagram, TikTok, YouTube, LinkedIn or Facebook. Start here with the profile URL. Its posts land in `baker posts`, its images and videos in the libraries. A Google Drive folder is never added by link: call request_connection with platform google-drive and choose media-folder, and the user picks the folder in the chat.\\n\\nExamples:\\n baker media-sources add https://www.linkedin.com/company/acme\\n baker media-sources add https://www.linkedin.com/in/jane-doe --role ceo\\n baker media-sources add https://www.tiktok.com/@acme\\n baker media-sources add @creator --platform instagram --person \"Ana Ruiz\" --role creator --not-own',\n },\n args: {\n input: { type: \"positional\", description: \"Profile URL or @handle\", required: true },\n platform: {\n type: \"string\",\n description: \"instagram|tiktok|youtube|linkedin|facebook — only for a bare handle\",\n required: false,\n },\n every: { type: \"string\", description: \"Auto-sync: never|daily|weekly|monthly\", required: false },\n person: {\n type: \"string\",\n description: \"A key person's name (implied for a LinkedIn /in/ profile)\",\n required: false,\n },\n role: { type: \"string\", description: socialPersonRoleSchema.options.join(\"|\"), required: false },\n title: { type: \"string\", description: \"Their job title\", required: false },\n \"not-own\": { type: \"boolean\", description: \"A partner, creator or another brand\", required: false },\n },\n run: async ({ args }) => {\n const parsed = mediaSourcesAddRequestSchema.safeParse({\n input: String(args.input ?? \"\"),\n platform: args.platform ? String(args.platform).toLowerCase() : undefined,\n every: args.every ? String(args.every).toLowerCase() : undefined,\n person: args.person ? String(args.person) : undefined,\n role: args.role ? String(args.role).toLowerCase() : undefined,\n title: args.title ? String(args.title) : undefined,\n own: args[\"not-own\"] === true ? false : undefined,\n });\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: issue ? `${issue.path.join(\".\") || \"input\"}: ${issue.message}` : \"Invalid request\",\n },\n });\n process.exit(1);\n }\n\n try {\n const data = await apiPost<MediaSourcesAddResponse>(\"/api/media-sources/add\", parsed.data, {\n timeoutMs: 120_000,\n });\n const hints = addHints(data);\n writeJson({\n ok: true,\n data: { created: data.created, source: compactSource(data.source), name: data.profile.displayName },\n hints,\n });\n } catch (err) {\n reportError(err, parsed.data.input);\n }\n },\n});\n\n/** What the agent should tell the user, and do next, after following an account. */\nfunction addHints(data: MediaSourcesAddResponse): string[] {\n const hints: string[] = data.profile.isPrivate\n ? [`Followed ${data.source.label} on LinkedIn.`]\n : [\n data.created\n ? `Connected ${data.source.label} on ${data.source.platformLabel}. Its posts are importing in the background — they become searchable with \\`baker images search\\` / \\`baker videos search\\` as each one is analysed. Check progress with \\`baker media-sources list\\`.`\n : `${data.source.label} on ${data.source.platformLabel} was already connected; a fresh import was started if one wasn't running.`,\n ];\n if (data.profile.isPrivate) {\n hints.push(\n `${data.profile.displayName}'s profile is private (or the link is wrong — LinkedIn answers both the same way), so Baker can't read their posts on its own. Add each post by its link: \\`baker posts add <post link>\\` (the user copies it from the post's ⋯ menu → Copy link). If the link was wrong: \\`baker media-sources remove ${data.source.key}\\`.`,\n );\n } else {\n hints.push(`Their posts: \\`baker posts list --account ${data.source.key}\\`.`);\n }\n if (data.source.platform === \"youtube\") {\n hints.push(\n \"YouTube feeds the video library only, newest first, a batch per sync; videos over 20 minutes are skipped.\",\n );\n }\n if (data.source.refreshInterval === \"never\" && !data.profile.isPrivate) {\n hints.push(\n `Auto-sync is off. If the user wants new posts to keep arriving: \\`baker media-sources schedule ${data.source.key} --every weekly\\`.`,\n );\n }\n return hints;\n}\n"],"mappings":"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","names":[]}
|