@koda-sl/baker-cli 0.545.0-dev.2a6beac48 → 0.546.0-dev.a72c87f73
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 +2 -0
- package/dist/{account-D236Y3BP.js → account-IGWCS2VJ.js} +5 -5
- package/dist/{account-reads-L2GYNCD3.js → account-reads-LOCJMS35.js} +4 -4
- package/dist/{account-users-A5H7FC7T.js → account-users-H4VP43RZ.js} +5 -5
- package/dist/{accounts-ENS2ONLA.js → accounts-C4PNBT5X.js} +8 -8
- package/dist/{accounts-RTUSISHG.js → accounts-GPTG4XW5.js} +4 -4
- package/dist/{actions-3SQGXLLM.js → actions-F7YO5I27.js} +18 -18
- package/dist/{activecampaign-MJ4SIVWY.js → activecampaign-S4E46SA6.js} +5 -5
- package/dist/{add-FJJHZDVW.js → add-LROKBWW4.js} +3 -3
- package/dist/{add-BH2GJZ46.js → add-SG5XWFRN.js} +4 -4
- package/dist/{ads-WE6GT2BL.js → ads-7ICT2D4M.js} +7 -7
- package/dist/{advertisers-P742OQFI.js → advertisers-IQMTOR4D.js} +6 -6
- package/dist/{analytics-XCUJSG3F.js → analytics-6DSJ6WHO.js} +11 -11
- package/dist/{analytics-ICV42S7D.js → analytics-D6S5LW2F.js} +4 -4
- package/dist/{assign-OQYVRXCT.js → assign-TMG6FDLW.js} +4 -4
- package/dist/{audience-size-NN43B7FF.js → audience-size-KPJOSG5W.js} +4 -4
- package/dist/{audit-JLH2TBIL.js → audit-35TDKIGY.js} +4 -4
- package/dist/{autocomplete-ZQAKVB6T.js → autocomplete-T63KPKRZ.js} +6 -6
- package/dist/{avatars-JWCZ2KVM.js → avatars-AVK4S3HS.js} +4 -4
- package/dist/{bid-pricing-CX3V76MC.js → bid-pricing-O5IK37CL.js} +5 -5
- package/dist/{brand-NKHAO4TK.js → brand-SG6VOHF4.js} +2 -2
- package/dist/{brief-6RDPVD4A.js → brief-RWA6MXTN.js} +13 -13
- package/dist/{campaign-groups-3PVR3IXH.js → campaign-groups-SSZISPJ5.js} +10 -10
- package/dist/{campaign-writes-TBWAZOZ2.js → campaign-writes-74KDZ7RR.js} +4 -4
- package/dist/{campaigns-PW4XK65Y.js → campaigns-B5TSL3UD.js} +13 -13
- package/dist/{campaigns-RN3SPC7L.js → campaigns-TFNPOQEW.js} +5 -5
- package/dist/{canvas-QJI65546.js → canvas-4LSM4Y5I.js} +13 -13
- package/dist/{capabilities-KPQWOCTA.js → capabilities-CTKSS7AI.js} +4 -4
- package/dist/{changes-RSEGYV45.js → changes-JAGWBHQC.js} +4 -4
- package/dist/{chatgpt-PDFFKPY2.js → chatgpt-NE2RBMFK.js} +2 -2
- package/dist/{chats-RRD42PZ5.js → chats-6TRVVEBG.js} +4 -4
- package/dist/{check-TPP2KZY6.js → check-DZGMLLRL.js} +6 -6
- package/dist/{chunk-SOYKSA2X.js → chunk-2DQC4XSN.js} +2 -2
- package/dist/{chunk-QJCGLIVD.js → chunk-3BWT5YDD.js} +2 -2
- package/dist/{chunk-WGJHVP7T.js → chunk-3J5ZTJGN.js} +3 -3
- package/dist/{chunk-SBPUCN6H.js → chunk-3OFLYMPK.js} +5 -5
- package/dist/{chunk-CXCZHEVW.js → chunk-5YNGVEX2.js} +2 -2
- package/dist/{chunk-EYBIZT7T.js → chunk-7L3Z2GDZ.js} +2 -2
- package/dist/{chunk-OM45JY2R.js → chunk-7LYJVM7L.js} +3 -3
- package/dist/{chunk-ORLQEQDF.js → chunk-AGVLJLOT.js} +2 -2
- package/dist/{chunk-RM5T4MA6.js → chunk-BNI5DAB7.js} +2 -2
- package/dist/{chunk-FGSRPKOV.js → chunk-BRT5IG7N.js} +2 -2
- package/dist/{chunk-NQF5U6FX.js → chunk-CXRS5YLB.js} +2 -2
- package/dist/{chunk-7YYTE5XE.js → chunk-CY6EPTJA.js} +3 -3
- package/dist/{chunk-6UMQSHGK.js → chunk-CZ4Q3I25.js} +8 -8
- package/dist/{chunk-DD6IMD7G.js → chunk-EGW3D3RW.js} +2 -2
- package/dist/{chunk-TSNL3AYG.js → chunk-EPLSDHBT.js} +5 -5
- package/dist/{chunk-IUWM5XHR.js → chunk-F2VUMTCJ.js} +2 -2
- package/dist/{chunk-OKBIPYZN.js → chunk-FLF2CIL2.js} +3 -3
- package/dist/{chunk-3MZNBHC7.js → chunk-FM4YT7QA.js} +2 -2
- package/dist/{chunk-3BXD6MC6.js → chunk-FUIPDGGH.js} +2 -2
- package/dist/{chunk-FSK77EEM.js → chunk-G47B4DOH.js} +2 -2
- package/dist/{chunk-CYKFXG4R.js → chunk-GVYJOHX5.js} +2 -2
- package/dist/{chunk-BNO3EFGR.js → chunk-H4CLWLYF.js} +6 -3
- package/dist/{chunk-BNO3EFGR.js.map → chunk-H4CLWLYF.js.map} +1 -1
- package/dist/{chunk-B74ZFQKS.js → chunk-ICEYCLRU.js} +8 -5
- package/dist/chunk-ICEYCLRU.js.map +1 -0
- package/dist/{chunk-WSYZT2QI.js → chunk-IDFTXHRQ.js} +2 -2
- package/dist/{chunk-TTDLK73U.js → chunk-J2RUOIME.js} +2 -2
- package/dist/{chunk-TGW2POU6.js → chunk-K4IPXVVC.js} +2 -2
- package/dist/{chunk-DD33NA2U.js → chunk-KAUP6ONR.js} +2 -2
- package/dist/{chunk-JW6VZBV7.js → chunk-KTO2Y3DI.js} +3 -3
- package/dist/{chunk-RKT6RFOR.js → chunk-KVYXHWX2.js} +2 -2
- package/dist/{chunk-IM3GD4G3.js → chunk-LHC6OHQ6.js} +2 -2
- package/dist/{chunk-OW2SDF66.js → chunk-LQOJBPKV.js} +3 -3
- package/dist/{chunk-HMFIOE4P.js → chunk-METHLFNZ.js} +2 -2
- package/dist/{chunk-HGRCKRCF.js → chunk-MGOSJSDV.js} +3 -3
- package/dist/{chunk-Y2AKJYI4.js → chunk-MLJKPUWP.js} +4 -4
- package/dist/{chunk-Y2AKJYI4.js.map → chunk-MLJKPUWP.js.map} +1 -1
- package/dist/{chunk-QB334QBO.js → chunk-O34P4WD5.js} +3 -3
- package/dist/{chunk-TL6P7WDT.js → chunk-O5V2KBI4.js} +3 -3
- package/dist/{chunk-KIX3ZM24.js → chunk-OO7Y2NMT.js} +2 -2
- package/dist/{chunk-47K5MDGX.js → chunk-P3AHGZH2.js} +2 -2
- package/dist/{chunk-VJKLZVAM.js → chunk-Q7G5CWH6.js} +2 -2
- package/dist/{chunk-RYXGJDBK.js → chunk-RA73BVUX.js} +2 -2
- package/dist/{chunk-ODN2LYPJ.js → chunk-S6ZCFRL5.js} +2 -2
- package/dist/{chunk-BLGTDKIV.js → chunk-SIWXWRAD.js} +3 -3
- package/dist/{chunk-S47XHWFU.js → chunk-UKIS6BLM.js} +12 -6
- package/dist/chunk-UKIS6BLM.js.map +1 -0
- package/dist/{chunk-7VDTLOSX.js → chunk-UNIJPTDU.js} +2 -2
- package/dist/{chunk-WJ6UJBHB.js → chunk-UXFRUYTR.js} +2 -2
- package/dist/{chunk-BKIHYRQL.js → chunk-V2XA5SIO.js} +7 -4
- package/dist/{chunk-BKIHYRQL.js.map → chunk-V2XA5SIO.js.map} +1 -1
- package/dist/{chunk-ANUFRN3B.js → chunk-W46BM7HF.js} +2 -2
- package/dist/{chunk-VZGLL54O.js → chunk-WH7CATSZ.js} +4 -4
- package/dist/{chunk-BDWNJRTY.js → chunk-WM2PLENG.js} +6 -6
- package/dist/chunk-X32MFGWW.js +15 -0
- package/dist/{chunk-PFBQERWX.js.map → chunk-X32MFGWW.js.map} +1 -1
- package/dist/{chunk-GCFC2MNR.js → chunk-YKFGXS26.js} +2 -2
- package/dist/{chunk-G2FDUCUU.js → chunk-YZKZQXRX.js} +3 -3
- package/dist/{chunk-BH3JS7EF.js → chunk-ZDHWB32Y.js} +2 -2
- package/dist/{chunk-GJD43KID.js → chunk-ZOYNCIRB.js} +2 -2
- package/dist/{claim-75KAZXLJ.js → claim-PTCFUZM2.js} +4 -4
- package/dist/cli.js +32 -32
- package/dist/{companies-IB4C245S.js → companies-STCBOG5Z.js} +4 -4
- package/dist/{company-5J2EGA42.js → company-4CE7CGNC.js} +4 -4
- package/dist/{complete-7AT7QWZN.js → complete-R4A7LBOQ.js} +4 -4
- package/dist/{config-3GCILBEL.js → config-3VK74MY6.js} +2 -2
- package/dist/{connect-HKVHKX44.js → connect-4VLRGTAM.js} +7 -7
- package/dist/{conversation-5OEBGDYR.js → conversation-JS52LHCZ.js} +4 -4
- package/dist/{conversion-upload-command-XQQWLYHZ.js → conversion-upload-command-WCLWA27O.js} +4 -4
- package/dist/{conversions-LLVHKDOQ.js → conversions-IYEF6WZP.js} +9 -9
- package/dist/{create-RL3L7L2S.js → create-6I7SRQHV.js} +4 -4
- package/dist/{create-2TAKPSGG.js → create-JYBMK5JH.js} +3 -3
- package/dist/{create-ZVTM57AZ.js → create-MPUAOJQB.js} +4 -4
- package/dist/{create-J3OXZGXC.js → create-W7L5B374.js} +4 -4
- package/dist/{creatives-3EAIKWGU.js → creatives-EPXJ2PDV.js} +10 -10
- package/dist/{creatives-AALLH7YU.js → creatives-PP6Z2T6Z.js} +12 -12
- package/dist/{credentials-MS4NJHEG.js → credentials-R4BZ76RD.js} +4 -4
- package/dist/{critique-NFPZD54K.js → critique-ICVRILIZ.js} +9 -9
- package/dist/{critique-KLITVZA4.js → critique-OTIGYFZU.js} +4 -4
- package/dist/{crm-7BAHXTK4.js → crm-5JFMA2YB.js} +5 -5
- package/dist/{crm-QQ7LGCLO.js → crm-PRTHRLXM.js} +6 -6
- package/dist/{currency-XFHCLKAV.js → currency-BY647ZB7.js} +4 -4
- package/dist/{customers-NENDLH5A.js → customers-5EWPVKJV.js} +6 -6
- package/dist/{delete-ZCPZ2ACI.js → delete-5EWH2SQQ.js} +4 -4
- package/dist/{delete-WACZG5SD.js → delete-V2FBPIN7.js} +3 -3
- package/dist/{delete-VOUXBXU3.js → delete-ZWUCKXI5.js} +4 -4
- package/dist/{demographics-C5EL3BI6.js → demographics-2YCVAAPH.js} +4 -4
- package/dist/{discard-RQXALYQZ.js → discard-N7K3UQ7M.js} +4 -4
- package/dist/{discover-R3QBVUHZ.js → discover-TAJUFO5R.js} +4 -4
- package/dist/{domain-HV2N4S3O.js → domain-YYTNWNSF.js} +4 -4
- package/dist/{download-OQFJOZFD.js → download-JMJRYJ37.js} +3 -3
- package/dist/{draft-GIJCJIQ5.js → draft-6EHV5NAN.js} +15 -8
- package/dist/draft-6EHV5NAN.js.map +1 -0
- package/dist/{draft-RK3ZAUBF.js → draft-FSZMTGWI.js} +12 -6
- package/dist/draft-FSZMTGWI.js.map +1 -0
- package/dist/{draft-4SZHKEAW.js → draft-KQACMPH2.js} +16 -13
- package/dist/draft-KQACMPH2.js.map +1 -0
- package/dist/{draft-6E7EQUCU.js → draft-P3YJZY74.js} +9 -6
- package/dist/draft-P3YJZY74.js.map +1 -0
- package/dist/{draft-SDOXYIND.js → draft-PENVOYCI.js} +5 -5
- package/dist/{draft-25YY6NMC.js → draft-RGSDXFFT.js} +20 -8
- package/dist/draft-RGSDXFFT.js.map +1 -0
- package/dist/{draft-Q74WOMUR.js → draft-SKEGKHIK.js} +10 -5
- package/dist/draft-SKEGKHIK.js.map +1 -0
- package/dist/{draft-IXHBF7UK.js → draft-UOMHLIVY.js} +18 -11
- package/dist/draft-UOMHLIVY.js.map +1 -0
- package/dist/{experiments-5UC4QVZU.js → experiments-W5D7ERVJ.js} +5 -5
- package/dist/{facets-I2CY2STO.js → facets-FUNOZ6JS.js} +4 -4
- package/dist/{feedback-WGRNI4J3.js → feedback-OVZFH7UV.js} +13 -13
- package/dist/{feedback-record-C6VYJQOL.js → feedback-record-DKDR3XHH.js} +14 -14
- package/dist/{fetch-WS4CABQN.js → fetch-QKP23NSX.js} +4 -4
- package/dist/{fit-BJH2KAKU.js → fit-PZPU2IZZ.js} +6 -6
- package/dist/{flows-ZQ66S64A.js → flows-GBMZJX4R.js} +11 -11
- package/dist/{fonts-EKLOSPJA.js → fonts-2YY5465Q.js} +6 -6
- package/dist/{forecast-KDJVAWTO.js → forecast-7B75GCRH.js} +5 -5
- package/dist/{forecast-JOQESPEP.js → forecast-VOND3WVO.js} +4 -4
- package/dist/{funnel-PD7EMXAX.js → funnel-G4CMJ2C4.js} +5 -5
- package/dist/{ga4-SBHUQKGK.js → ga4-GDMHIFBU.js} +12 -12
- package/dist/{get-IMZPHROU.js → get-44VNCDBQ.js} +4 -4
- package/dist/{get-PIYAY4MD.js → get-ZPJFKFHL.js} +5 -5
- package/dist/{google-Q424277P.js → google-VYARAUQH.js} +22 -22
- package/dist/{google-ads-VG2ZQBAP.js → google-ads-BKDTCXUS.js} +4 -4
- package/dist/{history-4LN2MMCY.js → history-NEKVFRGQ.js} +4 -4
- package/dist/{history-SECNIWQQ.js → history-YU6HH574.js} +4 -4
- package/dist/{hubspot-HW3DMFB2.js → hubspot-Q3ZQODAX.js} +8 -8
- package/dist/{ideas-CIFADAYV.js → ideas-75LW4KBY.js} +5 -5
- package/dist/{images-KV7UJMNO.js → images-7FS4KEGU.js} +4 -4
- package/dist/{ingest-OG3RUM2Z.js → ingest-MHH5OQP4.js} +4 -4
- package/dist/{ingest-3DW2YGCB.js → ingest-S5OS6WIU.js} +3 -3
- package/dist/{inspect-YJGFTVGT.js → inspect-PIFZILBU.js} +4 -4
- package/dist/{inspiration-CSN3AXDD.js → inspiration-KL27O45N.js} +3 -3
- package/dist/{intent-5VLQBTM7.js → intent-GIAQDMHF.js} +4 -4
- package/dist/{keyword-gap-COLF7JNH.js → keyword-gap-NZF75XGF.js} +4 -4
- package/dist/{keyword-metrics-I7OIBLCO.js → keyword-metrics-H5M5I3N4.js} +6 -6
- package/dist/{keywords-for-site-DIIUKEVJ.js → keywords-for-site-RILBDULX.js} +6 -6
- package/dist/{landing-FFAMZ3CD.js → landing-H5KY6F7K.js} +3 -3
- package/dist/{languages-RYIOZQFH.js → languages-GGNN7FEK.js} +4 -4
- package/dist/{leads-WSK4N2I6.js → leads-WCWH4C73.js} +4 -4
- package/dist/{learn-A4LSAKRL.js → learn-RUZUBNQZ.js} +5 -5
- package/dist/{line-item-writes-Q47ZVHB6.js → line-item-writes-5Z3AEUV2.js} +4 -4
- package/dist/{line-items-MHIXPRTG.js → line-items-IYSM2NEA.js} +5 -5
- package/dist/{link-6FVFHGP4.js → link-KRNL5O7Z.js} +4 -4
- package/dist/{linkedin-ATHYXJ4Q.js → linkedin-GZIYAH4C.js} +34 -32
- package/dist/linkedin-GZIYAH4C.js.map +1 -0
- package/dist/{linkedin-person-3MFAKS2Y.js → linkedin-person-PMXUBPVL.js} +4 -4
- package/dist/{list-MPZF6NTD.js → list-ALQGX6JI.js} +5 -5
- package/dist/{list-7RNRZN4W.js → list-I37IE3NN.js} +3 -3
- package/dist/{list-BDGTMCFP.js → list-JD5T6CGQ.js} +4 -4
- package/dist/{locations-OF2ZI5YX.js → locations-BU4ZGWAS.js} +4 -4
- package/dist/{log-MBPVGWLX.js → log-JWUFDOG6.js} +4 -4
- package/dist/{make-DYFGYGMD.js → make-QCGOTYNW.js} +16 -16
- package/dist/{map-UUHQJSSU.js → map-EYKEY4VA.js} +5 -5
- package/dist/{mcp-BH5MXQMJ.js → mcp-P2PZCFFJ.js} +3 -3
- package/dist/{media-sources-4BJOODBR.js → media-sources-UUNS3LES.js} +2 -2
- package/dist/{members-PK2AXSE4.js → members-XTW5F5N5.js} +4 -4
- package/dist/{meta-X46LC3GI.js → meta-XVPSGNHU.js} +2 -2
- package/dist/{metrics-PKMIG7VL.js → metrics-Z75Q2FHP.js} +4 -4
- package/dist/{normalize-36K2VJMB.js → normalize-P2UQIQOX.js} +4 -4
- package/dist/{options-7BEM4Z5E.js → options-2OK4LBAD.js} +7 -7
- package/dist/{organization-RSFFVT2M.js → organization-I5AIPZEH.js} +4 -4
- package/dist/{performance-PVZ5V6YL.js → performance-4UPNHWC2.js} +4 -4
- package/dist/{performance-4L2AFM4A.js → performance-H5FJQBOP.js} +5 -5
- package/dist/{plan-2Q6SOHMD.js → plan-FRRE4YQC.js} +2 -2
- package/dist/{promoted-tweet-writes-UW2VRBZ2.js → promoted-tweet-writes-V5N5JDYQ.js} +4 -4
- package/dist/{promoted-tweets-MJEZFPLW.js → promoted-tweets-ZSNBS3QQ.js} +3 -3
- package/dist/{publish-XNYDOQ7I.js → publish-M6U72N3H.js} +4 -4
- package/dist/{query-GBIWIZSS.js → query-NMQKS4MY.js} +5 -5
- package/dist/{read-DF3UPNBM.js → read-7ZFZAJSQ.js} +2 -2
- package/dist/{reddit-NLC55XYL.js → reddit-AZMVTHPR.js} +5 -5
- package/dist/{refresh-5EGKQGJI.js → refresh-42TJTJSN.js} +3 -3
- package/dist/{release-RDNXS362.js → release-VT6TNWUV.js} +4 -4
- package/dist/{relevant-pages-OZPYOGFO.js → relevant-pages-JRIDJL4L.js} +4 -4
- package/dist/{remove-OVN7XALF.js → remove-YW25PRT4.js} +3 -3
- package/dist/{reopen-ODW3ZUEG.js → reopen-WGTMBOHK.js} +4 -4
- package/dist/{rerun-3MTIAJUZ.js → rerun-O7P5LMC4.js} +15 -15
- package/dist/{research-RKFSB7OH.js → research-IQWYPRBV.js} +3 -3
- package/dist/{research-63ISQ74U.js → research-WYNVU26K.js} +16 -16
- package/dist/{reset-EZSCJXPC.js → reset-4YPVS6QU.js} +3 -3
- package/dist/{reset-GUJSHPHR.js → reset-NF6K4NHK.js} +3 -3
- package/dist/{resolve-BTM6MDOY.js → resolve-GB4ORVSB.js} +4 -4
- package/dist/{retry-6BXQONQ3.js → retry-LKJVOXVX.js} +3 -3
- package/dist/{retry-OL2W3HFH.js → retry-W3NSNNDV.js} +3 -3
- package/dist/{revenue-P26LJFEF.js → revenue-KHUWJPMJ.js} +5 -5
- package/dist/{rules-MN5CBYLN.js → rules-HMAONF3A.js} +6 -6
- package/dist/{rules-add-YPD466NS.js → rules-add-BP5XSD23.js} +6 -6
- package/dist/{run-WTN5QQ2P.js → run-EBCP5VIQ.js} +15 -15
- package/dist/{run-PEHYPLDQ.js → run-QP7JP2H4.js} +4 -4
- package/dist/{scaffold-ad-ZHZUX4Q6.js → scaffold-ad-JVDV7FET.js} +11 -11
- package/dist/{scaffold-static-ad-SHGWFBBO.js → scaffold-static-ad-VD3KXMHT.js} +19 -19
- package/dist/{scaffold-video-VENWOP75.js → scaffold-video-X3YR6APK.js} +10 -10
- package/dist/{schedule-637C6MY3.js → schedule-7OKUUJHO.js} +3 -3
- package/dist/{scheduled-agents-ZUM6UUF2.js → scheduled-agents-N6FDAL7K.js} +11 -11
- package/dist/{schema-NEL6O4O2.js → schema-6O6CJTT5.js} +5 -5
- package/dist/{scrape-3PWNMK4D.js → scrape-U6DIREQ2.js} +3 -3
- package/dist/scrape-U6DIREQ2.js.map +1 -0
- package/dist/{search-36RRNTF6.js → search-WGOCL2KW.js} +3 -3
- package/dist/{select-INJUT4PU.js → select-6PVDRJQJ.js} +12 -12
- package/dist/{set-prompt-X3DCUAGP.js → set-prompt-EDM7CPME.js} +9 -9
- package/dist/{setup-links-UG7S553A.js → setup-links-Z2KIKKJM.js} +4 -4
- package/dist/{shopify-WLXZHJII.js → shopify-AANLSYQY.js} +34 -12
- package/dist/shopify-AANLSYQY.js.map +1 -0
- package/dist/{site-YCSCW42E.js → site-6HHZJW2S.js} +5 -5
- package/dist/{sources-TQKN3HD7.js → sources-72AAZL4C.js} +6 -6
- package/dist/{sources-HP3PRSU6.js → sources-VRWQ65G6.js} +7 -7
- package/dist/{stale-KKBZ5FJX.js → stale-KO6NQVR4.js} +11 -11
- package/dist/{status-2HQBV7WL.js → status-QRO7U5K2.js} +4 -4
- package/dist/{sync-QVPBBQAW.js → sync-AQZ7JYEG.js} +3 -3
- package/dist/{sync-definition-YQJTCJJC.js → sync-definition-OKSJA6MA.js} +10 -10
- package/dist/{tag-manager-5ORFHLM4.js → tag-manager-74CGUGXX.js} +9 -9
- package/dist/{tags-YQVXWGWX.js → tags-5GFUNIIK.js} +4 -4
- package/dist/{tags-UUDTBJ6U.js → tags-DIFC2HFB.js} +4 -4
- package/dist/{tags-4VQS3QAK.js → tags-M26JKN2F.js} +4 -4
- package/dist/{tags-VJS37ZWW.js → tags-QFEG7LJV.js} +4 -4
- package/dist/{tags-TCGLKPB5.js → tags-ZWYUQYWT.js} +4 -4
- package/dist/{targeting-criteria-3EXFTUMR.js → targeting-criteria-UQMPM2K5.js} +3 -3
- package/dist/{targets-H7TVQ47T.js → targets-YCVILKKZ.js} +4 -4
- package/dist/{testimonials-NOLI2BVV.js → testimonials-SJQJDEK4.js} +6 -6
- package/dist/{themes-GD53PVOD.js → themes-RRLYZ46U.js} +4 -4
- package/dist/{top-companies-2KMUKTCC.js → top-companies-LPYM65KX.js} +4 -4
- package/dist/{transcript-HJH2YNGC.js → transcript-D2IQWUSP.js} +4 -4
- package/dist/{translate-X7TMHL22.js → translate-CPDFHEI4.js} +14 -14
- package/dist/{triggers-7HRFXKFZ.js → triggers-543HDVJK.js} +4 -4
- package/dist/{unlink-G5KUMOL4.js → unlink-DQGU7K7V.js} +4 -4
- package/dist/{unstage-WYJY5HKG.js → unstage-7UQU4MQT.js} +4 -4
- package/dist/{update-THOWGBFC.js → update-DGIBKKIB.js} +4 -4
- package/dist/{update-WKS5QUFB.js → update-FEZ3EVTA.js} +4 -4
- package/dist/{update-GJ425R5V.js → update-QF6WBJU7.js} +4 -4
- package/dist/{update-T6COJ6BO.js → update-RY3GU5QI.js} +3 -3
- package/dist/{upload-35QHU7B4.js → upload-VMDGQ4HS.js} +4 -4
- package/dist/{url-options-VNNI4QXX.js → url-options-2TQCGD2W.js} +4 -4
- package/dist/{url-params-3JU5W2AS.js → url-params-LMC2DRHP.js} +4 -4
- package/dist/{validate-XQD5H6MU.js → validate-TLWEN4IL.js} +12 -12
- package/dist/{videos-JBJP3CZD.js → videos-GFOHRAJ7.js} +6 -6
- package/dist/{view-VFZUL5UL.js → view-ZT3SAZKQ.js} +2 -2
- package/dist/view-ZT3SAZKQ.js.map +1 -0
- package/dist/{viewer-check-ACRU6HY3.js → viewer-check-EKDFC7LQ.js} +7 -7
- package/dist/{web-NRG6WKRV.js → web-L7LF6FLF.js} +4 -4
- package/dist/{winning-ads-ZKVXCS2L.js → winning-ads-RUS4NE5C.js} +3 -3
- package/dist/{write-commands-ECCJLDLG.js → write-commands-2JYDSXAX.js} +5 -5
- package/dist/{write-commands-FGWCJHLH.js → write-commands-5Z5A3D3M.js} +2 -2
- package/dist/{write-commands-UTM7PPK5.js → write-commands-7DTFGM6E.js} +2 -2
- package/dist/{x-M3LIA6SI.js → x-HLZUSGJT.js} +6 -6
- package/package.json +1 -1
- package/dist/chunk-B74ZFQKS.js.map +0 -1
- package/dist/chunk-PFBQERWX.js +0 -10
- package/dist/chunk-S47XHWFU.js.map +0 -1
- package/dist/draft-25YY6NMC.js.map +0 -1
- package/dist/draft-4SZHKEAW.js.map +0 -1
- package/dist/draft-6E7EQUCU.js.map +0 -1
- package/dist/draft-GIJCJIQ5.js.map +0 -1
- package/dist/draft-IXHBF7UK.js.map +0 -1
- package/dist/draft-Q74WOMUR.js.map +0 -1
- package/dist/draft-RK3ZAUBF.js.map +0 -1
- package/dist/linkedin-ATHYXJ4Q.js.map +0 -1
- package/dist/scrape-3PWNMK4D.js.map +0 -1
- package/dist/shopify-WLXZHJII.js.map +0 -1
- package/dist/view-VFZUL5UL.js.map +0 -1
- /package/dist/{account-D236Y3BP.js.map → account-IGWCS2VJ.js.map} +0 -0
- /package/dist/{account-reads-L2GYNCD3.js.map → account-reads-LOCJMS35.js.map} +0 -0
- /package/dist/{account-users-A5H7FC7T.js.map → account-users-H4VP43RZ.js.map} +0 -0
- /package/dist/{accounts-ENS2ONLA.js.map → accounts-C4PNBT5X.js.map} +0 -0
- /package/dist/{accounts-RTUSISHG.js.map → accounts-GPTG4XW5.js.map} +0 -0
- /package/dist/{actions-3SQGXLLM.js.map → actions-F7YO5I27.js.map} +0 -0
- /package/dist/{activecampaign-MJ4SIVWY.js.map → activecampaign-S4E46SA6.js.map} +0 -0
- /package/dist/{add-FJJHZDVW.js.map → add-LROKBWW4.js.map} +0 -0
- /package/dist/{add-BH2GJZ46.js.map → add-SG5XWFRN.js.map} +0 -0
- /package/dist/{ads-WE6GT2BL.js.map → ads-7ICT2D4M.js.map} +0 -0
- /package/dist/{advertisers-P742OQFI.js.map → advertisers-IQMTOR4D.js.map} +0 -0
- /package/dist/{analytics-XCUJSG3F.js.map → analytics-6DSJ6WHO.js.map} +0 -0
- /package/dist/{analytics-ICV42S7D.js.map → analytics-D6S5LW2F.js.map} +0 -0
- /package/dist/{assign-OQYVRXCT.js.map → assign-TMG6FDLW.js.map} +0 -0
- /package/dist/{audience-size-NN43B7FF.js.map → audience-size-KPJOSG5W.js.map} +0 -0
- /package/dist/{audit-JLH2TBIL.js.map → audit-35TDKIGY.js.map} +0 -0
- /package/dist/{autocomplete-ZQAKVB6T.js.map → autocomplete-T63KPKRZ.js.map} +0 -0
- /package/dist/{avatars-JWCZ2KVM.js.map → avatars-AVK4S3HS.js.map} +0 -0
- /package/dist/{bid-pricing-CX3V76MC.js.map → bid-pricing-O5IK37CL.js.map} +0 -0
- /package/dist/{brand-NKHAO4TK.js.map → brand-SG6VOHF4.js.map} +0 -0
- /package/dist/{brief-6RDPVD4A.js.map → brief-RWA6MXTN.js.map} +0 -0
- /package/dist/{campaign-groups-3PVR3IXH.js.map → campaign-groups-SSZISPJ5.js.map} +0 -0
- /package/dist/{campaign-writes-TBWAZOZ2.js.map → campaign-writes-74KDZ7RR.js.map} +0 -0
- /package/dist/{campaigns-PW4XK65Y.js.map → campaigns-B5TSL3UD.js.map} +0 -0
- /package/dist/{campaigns-RN3SPC7L.js.map → campaigns-TFNPOQEW.js.map} +0 -0
- /package/dist/{canvas-QJI65546.js.map → canvas-4LSM4Y5I.js.map} +0 -0
- /package/dist/{capabilities-KPQWOCTA.js.map → capabilities-CTKSS7AI.js.map} +0 -0
- /package/dist/{changes-RSEGYV45.js.map → changes-JAGWBHQC.js.map} +0 -0
- /package/dist/{chatgpt-PDFFKPY2.js.map → chatgpt-NE2RBMFK.js.map} +0 -0
- /package/dist/{chats-RRD42PZ5.js.map → chats-6TRVVEBG.js.map} +0 -0
- /package/dist/{check-TPP2KZY6.js.map → check-DZGMLLRL.js.map} +0 -0
- /package/dist/{chunk-SOYKSA2X.js.map → chunk-2DQC4XSN.js.map} +0 -0
- /package/dist/{chunk-QJCGLIVD.js.map → chunk-3BWT5YDD.js.map} +0 -0
- /package/dist/{chunk-WGJHVP7T.js.map → chunk-3J5ZTJGN.js.map} +0 -0
- /package/dist/{chunk-SBPUCN6H.js.map → chunk-3OFLYMPK.js.map} +0 -0
- /package/dist/{chunk-CXCZHEVW.js.map → chunk-5YNGVEX2.js.map} +0 -0
- /package/dist/{chunk-EYBIZT7T.js.map → chunk-7L3Z2GDZ.js.map} +0 -0
- /package/dist/{chunk-OM45JY2R.js.map → chunk-7LYJVM7L.js.map} +0 -0
- /package/dist/{chunk-ORLQEQDF.js.map → chunk-AGVLJLOT.js.map} +0 -0
- /package/dist/{chunk-RM5T4MA6.js.map → chunk-BNI5DAB7.js.map} +0 -0
- /package/dist/{chunk-FGSRPKOV.js.map → chunk-BRT5IG7N.js.map} +0 -0
- /package/dist/{chunk-NQF5U6FX.js.map → chunk-CXRS5YLB.js.map} +0 -0
- /package/dist/{chunk-7YYTE5XE.js.map → chunk-CY6EPTJA.js.map} +0 -0
- /package/dist/{chunk-6UMQSHGK.js.map → chunk-CZ4Q3I25.js.map} +0 -0
- /package/dist/{chunk-DD6IMD7G.js.map → chunk-EGW3D3RW.js.map} +0 -0
- /package/dist/{chunk-TSNL3AYG.js.map → chunk-EPLSDHBT.js.map} +0 -0
- /package/dist/{chunk-IUWM5XHR.js.map → chunk-F2VUMTCJ.js.map} +0 -0
- /package/dist/{chunk-OKBIPYZN.js.map → chunk-FLF2CIL2.js.map} +0 -0
- /package/dist/{chunk-3MZNBHC7.js.map → chunk-FM4YT7QA.js.map} +0 -0
- /package/dist/{chunk-3BXD6MC6.js.map → chunk-FUIPDGGH.js.map} +0 -0
- /package/dist/{chunk-FSK77EEM.js.map → chunk-G47B4DOH.js.map} +0 -0
- /package/dist/{chunk-CYKFXG4R.js.map → chunk-GVYJOHX5.js.map} +0 -0
- /package/dist/{chunk-WSYZT2QI.js.map → chunk-IDFTXHRQ.js.map} +0 -0
- /package/dist/{chunk-TTDLK73U.js.map → chunk-J2RUOIME.js.map} +0 -0
- /package/dist/{chunk-TGW2POU6.js.map → chunk-K4IPXVVC.js.map} +0 -0
- /package/dist/{chunk-DD33NA2U.js.map → chunk-KAUP6ONR.js.map} +0 -0
- /package/dist/{chunk-JW6VZBV7.js.map → chunk-KTO2Y3DI.js.map} +0 -0
- /package/dist/{chunk-RKT6RFOR.js.map → chunk-KVYXHWX2.js.map} +0 -0
- /package/dist/{chunk-IM3GD4G3.js.map → chunk-LHC6OHQ6.js.map} +0 -0
- /package/dist/{chunk-OW2SDF66.js.map → chunk-LQOJBPKV.js.map} +0 -0
- /package/dist/{chunk-HMFIOE4P.js.map → chunk-METHLFNZ.js.map} +0 -0
- /package/dist/{chunk-HGRCKRCF.js.map → chunk-MGOSJSDV.js.map} +0 -0
- /package/dist/{chunk-QB334QBO.js.map → chunk-O34P4WD5.js.map} +0 -0
- /package/dist/{chunk-TL6P7WDT.js.map → chunk-O5V2KBI4.js.map} +0 -0
- /package/dist/{chunk-KIX3ZM24.js.map → chunk-OO7Y2NMT.js.map} +0 -0
- /package/dist/{chunk-47K5MDGX.js.map → chunk-P3AHGZH2.js.map} +0 -0
- /package/dist/{chunk-VJKLZVAM.js.map → chunk-Q7G5CWH6.js.map} +0 -0
- /package/dist/{chunk-RYXGJDBK.js.map → chunk-RA73BVUX.js.map} +0 -0
- /package/dist/{chunk-ODN2LYPJ.js.map → chunk-S6ZCFRL5.js.map} +0 -0
- /package/dist/{chunk-BLGTDKIV.js.map → chunk-SIWXWRAD.js.map} +0 -0
- /package/dist/{chunk-7VDTLOSX.js.map → chunk-UNIJPTDU.js.map} +0 -0
- /package/dist/{chunk-WJ6UJBHB.js.map → chunk-UXFRUYTR.js.map} +0 -0
- /package/dist/{chunk-ANUFRN3B.js.map → chunk-W46BM7HF.js.map} +0 -0
- /package/dist/{chunk-VZGLL54O.js.map → chunk-WH7CATSZ.js.map} +0 -0
- /package/dist/{chunk-BDWNJRTY.js.map → chunk-WM2PLENG.js.map} +0 -0
- /package/dist/{chunk-GCFC2MNR.js.map → chunk-YKFGXS26.js.map} +0 -0
- /package/dist/{chunk-G2FDUCUU.js.map → chunk-YZKZQXRX.js.map} +0 -0
- /package/dist/{chunk-BH3JS7EF.js.map → chunk-ZDHWB32Y.js.map} +0 -0
- /package/dist/{chunk-GJD43KID.js.map → chunk-ZOYNCIRB.js.map} +0 -0
- /package/dist/{claim-75KAZXLJ.js.map → claim-PTCFUZM2.js.map} +0 -0
- /package/dist/{companies-IB4C245S.js.map → companies-STCBOG5Z.js.map} +0 -0
- /package/dist/{company-5J2EGA42.js.map → company-4CE7CGNC.js.map} +0 -0
- /package/dist/{complete-7AT7QWZN.js.map → complete-R4A7LBOQ.js.map} +0 -0
- /package/dist/{config-3GCILBEL.js.map → config-3VK74MY6.js.map} +0 -0
- /package/dist/{connect-HKVHKX44.js.map → connect-4VLRGTAM.js.map} +0 -0
- /package/dist/{conversation-5OEBGDYR.js.map → conversation-JS52LHCZ.js.map} +0 -0
- /package/dist/{conversion-upload-command-XQQWLYHZ.js.map → conversion-upload-command-WCLWA27O.js.map} +0 -0
- /package/dist/{conversions-LLVHKDOQ.js.map → conversions-IYEF6WZP.js.map} +0 -0
- /package/dist/{create-RL3L7L2S.js.map → create-6I7SRQHV.js.map} +0 -0
- /package/dist/{create-2TAKPSGG.js.map → create-JYBMK5JH.js.map} +0 -0
- /package/dist/{create-ZVTM57AZ.js.map → create-MPUAOJQB.js.map} +0 -0
- /package/dist/{create-J3OXZGXC.js.map → create-W7L5B374.js.map} +0 -0
- /package/dist/{creatives-3EAIKWGU.js.map → creatives-EPXJ2PDV.js.map} +0 -0
- /package/dist/{creatives-AALLH7YU.js.map → creatives-PP6Z2T6Z.js.map} +0 -0
- /package/dist/{credentials-MS4NJHEG.js.map → credentials-R4BZ76RD.js.map} +0 -0
- /package/dist/{critique-NFPZD54K.js.map → critique-ICVRILIZ.js.map} +0 -0
- /package/dist/{critique-KLITVZA4.js.map → critique-OTIGYFZU.js.map} +0 -0
- /package/dist/{crm-7BAHXTK4.js.map → crm-5JFMA2YB.js.map} +0 -0
- /package/dist/{crm-QQ7LGCLO.js.map → crm-PRTHRLXM.js.map} +0 -0
- /package/dist/{currency-XFHCLKAV.js.map → currency-BY647ZB7.js.map} +0 -0
- /package/dist/{customers-NENDLH5A.js.map → customers-5EWPVKJV.js.map} +0 -0
- /package/dist/{delete-ZCPZ2ACI.js.map → delete-5EWH2SQQ.js.map} +0 -0
- /package/dist/{delete-WACZG5SD.js.map → delete-V2FBPIN7.js.map} +0 -0
- /package/dist/{delete-VOUXBXU3.js.map → delete-ZWUCKXI5.js.map} +0 -0
- /package/dist/{demographics-C5EL3BI6.js.map → demographics-2YCVAAPH.js.map} +0 -0
- /package/dist/{discard-RQXALYQZ.js.map → discard-N7K3UQ7M.js.map} +0 -0
- /package/dist/{discover-R3QBVUHZ.js.map → discover-TAJUFO5R.js.map} +0 -0
- /package/dist/{domain-HV2N4S3O.js.map → domain-YYTNWNSF.js.map} +0 -0
- /package/dist/{download-OQFJOZFD.js.map → download-JMJRYJ37.js.map} +0 -0
- /package/dist/{draft-SDOXYIND.js.map → draft-PENVOYCI.js.map} +0 -0
- /package/dist/{experiments-5UC4QVZU.js.map → experiments-W5D7ERVJ.js.map} +0 -0
- /package/dist/{facets-I2CY2STO.js.map → facets-FUNOZ6JS.js.map} +0 -0
- /package/dist/{feedback-WGRNI4J3.js.map → feedback-OVZFH7UV.js.map} +0 -0
- /package/dist/{feedback-record-C6VYJQOL.js.map → feedback-record-DKDR3XHH.js.map} +0 -0
- /package/dist/{fetch-WS4CABQN.js.map → fetch-QKP23NSX.js.map} +0 -0
- /package/dist/{fit-BJH2KAKU.js.map → fit-PZPU2IZZ.js.map} +0 -0
- /package/dist/{flows-ZQ66S64A.js.map → flows-GBMZJX4R.js.map} +0 -0
- /package/dist/{fonts-EKLOSPJA.js.map → fonts-2YY5465Q.js.map} +0 -0
- /package/dist/{forecast-KDJVAWTO.js.map → forecast-7B75GCRH.js.map} +0 -0
- /package/dist/{forecast-JOQESPEP.js.map → forecast-VOND3WVO.js.map} +0 -0
- /package/dist/{funnel-PD7EMXAX.js.map → funnel-G4CMJ2C4.js.map} +0 -0
- /package/dist/{ga4-SBHUQKGK.js.map → ga4-GDMHIFBU.js.map} +0 -0
- /package/dist/{get-IMZPHROU.js.map → get-44VNCDBQ.js.map} +0 -0
- /package/dist/{get-PIYAY4MD.js.map → get-ZPJFKFHL.js.map} +0 -0
- /package/dist/{google-Q424277P.js.map → google-VYARAUQH.js.map} +0 -0
- /package/dist/{google-ads-VG2ZQBAP.js.map → google-ads-BKDTCXUS.js.map} +0 -0
- /package/dist/{history-4LN2MMCY.js.map → history-NEKVFRGQ.js.map} +0 -0
- /package/dist/{history-SECNIWQQ.js.map → history-YU6HH574.js.map} +0 -0
- /package/dist/{hubspot-HW3DMFB2.js.map → hubspot-Q3ZQODAX.js.map} +0 -0
- /package/dist/{ideas-CIFADAYV.js.map → ideas-75LW4KBY.js.map} +0 -0
- /package/dist/{images-KV7UJMNO.js.map → images-7FS4KEGU.js.map} +0 -0
- /package/dist/{ingest-OG3RUM2Z.js.map → ingest-MHH5OQP4.js.map} +0 -0
- /package/dist/{ingest-3DW2YGCB.js.map → ingest-S5OS6WIU.js.map} +0 -0
- /package/dist/{inspect-YJGFTVGT.js.map → inspect-PIFZILBU.js.map} +0 -0
- /package/dist/{inspiration-CSN3AXDD.js.map → inspiration-KL27O45N.js.map} +0 -0
- /package/dist/{intent-5VLQBTM7.js.map → intent-GIAQDMHF.js.map} +0 -0
- /package/dist/{keyword-gap-COLF7JNH.js.map → keyword-gap-NZF75XGF.js.map} +0 -0
- /package/dist/{keyword-metrics-I7OIBLCO.js.map → keyword-metrics-H5M5I3N4.js.map} +0 -0
- /package/dist/{keywords-for-site-DIIUKEVJ.js.map → keywords-for-site-RILBDULX.js.map} +0 -0
- /package/dist/{landing-FFAMZ3CD.js.map → landing-H5KY6F7K.js.map} +0 -0
- /package/dist/{languages-RYIOZQFH.js.map → languages-GGNN7FEK.js.map} +0 -0
- /package/dist/{leads-WSK4N2I6.js.map → leads-WCWH4C73.js.map} +0 -0
- /package/dist/{learn-A4LSAKRL.js.map → learn-RUZUBNQZ.js.map} +0 -0
- /package/dist/{line-item-writes-Q47ZVHB6.js.map → line-item-writes-5Z3AEUV2.js.map} +0 -0
- /package/dist/{line-items-MHIXPRTG.js.map → line-items-IYSM2NEA.js.map} +0 -0
- /package/dist/{link-6FVFHGP4.js.map → link-KRNL5O7Z.js.map} +0 -0
- /package/dist/{linkedin-person-3MFAKS2Y.js.map → linkedin-person-PMXUBPVL.js.map} +0 -0
- /package/dist/{list-MPZF6NTD.js.map → list-ALQGX6JI.js.map} +0 -0
- /package/dist/{list-7RNRZN4W.js.map → list-I37IE3NN.js.map} +0 -0
- /package/dist/{list-BDGTMCFP.js.map → list-JD5T6CGQ.js.map} +0 -0
- /package/dist/{locations-OF2ZI5YX.js.map → locations-BU4ZGWAS.js.map} +0 -0
- /package/dist/{log-MBPVGWLX.js.map → log-JWUFDOG6.js.map} +0 -0
- /package/dist/{make-DYFGYGMD.js.map → make-QCGOTYNW.js.map} +0 -0
- /package/dist/{map-UUHQJSSU.js.map → map-EYKEY4VA.js.map} +0 -0
- /package/dist/{mcp-BH5MXQMJ.js.map → mcp-P2PZCFFJ.js.map} +0 -0
- /package/dist/{media-sources-4BJOODBR.js.map → media-sources-UUNS3LES.js.map} +0 -0
- /package/dist/{members-PK2AXSE4.js.map → members-XTW5F5N5.js.map} +0 -0
- /package/dist/{meta-X46LC3GI.js.map → meta-XVPSGNHU.js.map} +0 -0
- /package/dist/{metrics-PKMIG7VL.js.map → metrics-Z75Q2FHP.js.map} +0 -0
- /package/dist/{normalize-36K2VJMB.js.map → normalize-P2UQIQOX.js.map} +0 -0
- /package/dist/{options-7BEM4Z5E.js.map → options-2OK4LBAD.js.map} +0 -0
- /package/dist/{organization-RSFFVT2M.js.map → organization-I5AIPZEH.js.map} +0 -0
- /package/dist/{performance-PVZ5V6YL.js.map → performance-4UPNHWC2.js.map} +0 -0
- /package/dist/{performance-4L2AFM4A.js.map → performance-H5FJQBOP.js.map} +0 -0
- /package/dist/{plan-2Q6SOHMD.js.map → plan-FRRE4YQC.js.map} +0 -0
- /package/dist/{promoted-tweet-writes-UW2VRBZ2.js.map → promoted-tweet-writes-V5N5JDYQ.js.map} +0 -0
- /package/dist/{promoted-tweets-MJEZFPLW.js.map → promoted-tweets-ZSNBS3QQ.js.map} +0 -0
- /package/dist/{publish-XNYDOQ7I.js.map → publish-M6U72N3H.js.map} +0 -0
- /package/dist/{query-GBIWIZSS.js.map → query-NMQKS4MY.js.map} +0 -0
- /package/dist/{read-DF3UPNBM.js.map → read-7ZFZAJSQ.js.map} +0 -0
- /package/dist/{reddit-NLC55XYL.js.map → reddit-AZMVTHPR.js.map} +0 -0
- /package/dist/{refresh-5EGKQGJI.js.map → refresh-42TJTJSN.js.map} +0 -0
- /package/dist/{release-RDNXS362.js.map → release-VT6TNWUV.js.map} +0 -0
- /package/dist/{relevant-pages-OZPYOGFO.js.map → relevant-pages-JRIDJL4L.js.map} +0 -0
- /package/dist/{remove-OVN7XALF.js.map → remove-YW25PRT4.js.map} +0 -0
- /package/dist/{reopen-ODW3ZUEG.js.map → reopen-WGTMBOHK.js.map} +0 -0
- /package/dist/{rerun-3MTIAJUZ.js.map → rerun-O7P5LMC4.js.map} +0 -0
- /package/dist/{research-RKFSB7OH.js.map → research-IQWYPRBV.js.map} +0 -0
- /package/dist/{research-63ISQ74U.js.map → research-WYNVU26K.js.map} +0 -0
- /package/dist/{reset-EZSCJXPC.js.map → reset-4YPVS6QU.js.map} +0 -0
- /package/dist/{reset-GUJSHPHR.js.map → reset-NF6K4NHK.js.map} +0 -0
- /package/dist/{resolve-BTM6MDOY.js.map → resolve-GB4ORVSB.js.map} +0 -0
- /package/dist/{retry-6BXQONQ3.js.map → retry-LKJVOXVX.js.map} +0 -0
- /package/dist/{retry-OL2W3HFH.js.map → retry-W3NSNNDV.js.map} +0 -0
- /package/dist/{revenue-P26LJFEF.js.map → revenue-KHUWJPMJ.js.map} +0 -0
- /package/dist/{rules-MN5CBYLN.js.map → rules-HMAONF3A.js.map} +0 -0
- /package/dist/{rules-add-YPD466NS.js.map → rules-add-BP5XSD23.js.map} +0 -0
- /package/dist/{run-WTN5QQ2P.js.map → run-EBCP5VIQ.js.map} +0 -0
- /package/dist/{run-PEHYPLDQ.js.map → run-QP7JP2H4.js.map} +0 -0
- /package/dist/{scaffold-ad-ZHZUX4Q6.js.map → scaffold-ad-JVDV7FET.js.map} +0 -0
- /package/dist/{scaffold-static-ad-SHGWFBBO.js.map → scaffold-static-ad-VD3KXMHT.js.map} +0 -0
- /package/dist/{scaffold-video-VENWOP75.js.map → scaffold-video-X3YR6APK.js.map} +0 -0
- /package/dist/{schedule-637C6MY3.js.map → schedule-7OKUUJHO.js.map} +0 -0
- /package/dist/{scheduled-agents-ZUM6UUF2.js.map → scheduled-agents-N6FDAL7K.js.map} +0 -0
- /package/dist/{schema-NEL6O4O2.js.map → schema-6O6CJTT5.js.map} +0 -0
- /package/dist/{search-36RRNTF6.js.map → search-WGOCL2KW.js.map} +0 -0
- /package/dist/{select-INJUT4PU.js.map → select-6PVDRJQJ.js.map} +0 -0
- /package/dist/{set-prompt-X3DCUAGP.js.map → set-prompt-EDM7CPME.js.map} +0 -0
- /package/dist/{setup-links-UG7S553A.js.map → setup-links-Z2KIKKJM.js.map} +0 -0
- /package/dist/{site-YCSCW42E.js.map → site-6HHZJW2S.js.map} +0 -0
- /package/dist/{sources-TQKN3HD7.js.map → sources-72AAZL4C.js.map} +0 -0
- /package/dist/{sources-HP3PRSU6.js.map → sources-VRWQ65G6.js.map} +0 -0
- /package/dist/{stale-KKBZ5FJX.js.map → stale-KO6NQVR4.js.map} +0 -0
- /package/dist/{status-2HQBV7WL.js.map → status-QRO7U5K2.js.map} +0 -0
- /package/dist/{sync-QVPBBQAW.js.map → sync-AQZ7JYEG.js.map} +0 -0
- /package/dist/{sync-definition-YQJTCJJC.js.map → sync-definition-OKSJA6MA.js.map} +0 -0
- /package/dist/{tag-manager-5ORFHLM4.js.map → tag-manager-74CGUGXX.js.map} +0 -0
- /package/dist/{tags-YQVXWGWX.js.map → tags-5GFUNIIK.js.map} +0 -0
- /package/dist/{tags-UUDTBJ6U.js.map → tags-DIFC2HFB.js.map} +0 -0
- /package/dist/{tags-4VQS3QAK.js.map → tags-M26JKN2F.js.map} +0 -0
- /package/dist/{tags-VJS37ZWW.js.map → tags-QFEG7LJV.js.map} +0 -0
- /package/dist/{tags-TCGLKPB5.js.map → tags-ZWYUQYWT.js.map} +0 -0
- /package/dist/{targeting-criteria-3EXFTUMR.js.map → targeting-criteria-UQMPM2K5.js.map} +0 -0
- /package/dist/{targets-H7TVQ47T.js.map → targets-YCVILKKZ.js.map} +0 -0
- /package/dist/{testimonials-NOLI2BVV.js.map → testimonials-SJQJDEK4.js.map} +0 -0
- /package/dist/{themes-GD53PVOD.js.map → themes-RRLYZ46U.js.map} +0 -0
- /package/dist/{top-companies-2KMUKTCC.js.map → top-companies-LPYM65KX.js.map} +0 -0
- /package/dist/{transcript-HJH2YNGC.js.map → transcript-D2IQWUSP.js.map} +0 -0
- /package/dist/{translate-X7TMHL22.js.map → translate-CPDFHEI4.js.map} +0 -0
- /package/dist/{triggers-7HRFXKFZ.js.map → triggers-543HDVJK.js.map} +0 -0
- /package/dist/{unlink-G5KUMOL4.js.map → unlink-DQGU7K7V.js.map} +0 -0
- /package/dist/{unstage-WYJY5HKG.js.map → unstage-7UQU4MQT.js.map} +0 -0
- /package/dist/{update-THOWGBFC.js.map → update-DGIBKKIB.js.map} +0 -0
- /package/dist/{update-WKS5QUFB.js.map → update-FEZ3EVTA.js.map} +0 -0
- /package/dist/{update-GJ425R5V.js.map → update-QF6WBJU7.js.map} +0 -0
- /package/dist/{update-T6COJ6BO.js.map → update-RY3GU5QI.js.map} +0 -0
- /package/dist/{upload-35QHU7B4.js.map → upload-VMDGQ4HS.js.map} +0 -0
- /package/dist/{url-options-VNNI4QXX.js.map → url-options-2TQCGD2W.js.map} +0 -0
- /package/dist/{url-params-3JU5W2AS.js.map → url-params-LMC2DRHP.js.map} +0 -0
- /package/dist/{validate-XQD5H6MU.js.map → validate-TLWEN4IL.js.map} +0 -0
- /package/dist/{videos-JBJP3CZD.js.map → videos-GFOHRAJ7.js.map} +0 -0
- /package/dist/{viewer-check-ACRU6HY3.js.map → viewer-check-EKDFC7LQ.js.map} +0 -0
- /package/dist/{web-NRG6WKRV.js.map → web-L7LF6FLF.js.map} +0 -0
- /package/dist/{winning-ads-ZKVXCS2L.js.map → winning-ads-RUS4NE5C.js.map} +0 -0
- /package/dist/{write-commands-ECCJLDLG.js.map → write-commands-2JYDSXAX.js.map} +0 -0
- /package/dist/{write-commands-FGWCJHLH.js.map → write-commands-5Z5A3D3M.js.map} +0 -0
- /package/dist/{write-commands-UTM7PPK5.js.map → write-commands-7DTFGM6E.js.map} +0 -0
- /package/dist/{x-M3LIA6SI.js.map → x-HLZUSGJT.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/ads/google/draft.ts","../src/commands/ads/google/draft-batch.ts","../src/commands/ads/google/draft-validate.ts"],"sourcesContent":["import type { GoogleDraftValidateResponse } from \"@baker/api/ads-google\";\nimport type { GoogleDraftImportResponse } from \"@baker/api/ads-google/wire\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { requireChatId } from \"../../../env.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { CHAT_READ_ARG } from \"../../chat-arg.ts\";\nimport { writeJsonEnvelope } from \"../output.ts\";\nimport { amendBatchEntries, stageFileOps } from \"./draft-batch.ts\";\nimport { validationEnvelope } from \"./draft-validate.ts\";\nimport {\n draftAction,\n draftListAction,\n handleGoogleError,\n loadJsonPayloads,\n loadPatchArg,\n requireTarget,\n stageGoogleOps,\n} from \"./write-shared.ts\";\n\nconst VALIDATE_DESCRIPTION = `Ask Google whether the whole staged draft would publish — without applying anything.\n\nStart here, after the last staged change and before telling the user the draft is ready:\n baker ads google draft validate\n\nEvery staged op is built, batched and sent exactly as publish sends it, with Google's validateOnly\nflag, so each verdict is the answer publish would get: accepted | refused | blocked (a change it\ndepends on was refused) | unchecked (only publish can check it) | applied (an earlier publish did).\nCompact by default — counts, plus only the ops that need attention, each with Google's reason.\nFix refused ops with \\`draft amend <ref>\\` and validate again.\n\nExamples:\n baker ads google draft validate\n baker ads google draft validate --full # every op, with its built request and Google's raw answer`;\n\nregisterSchema({\n command: \"ads.google.draft.validate\",\n description: VALIDATE_DESCRIPTION,\n args: {\n full: {\n type: \"boolean\",\n description: \"List every op with its built request and Google's raw answer\",\n required: false,\n },\n },\n});\n\nconst STAGE_DESCRIPTION = `Stage many Google Ads changes from ONE file, in one call — any mix of kinds, up to 500 ops.\n\nStart here whenever a change touches more than a few rows (a keyword cleanup, bid changes, pausing\nads, a list of negatives): write the ops to a file and stage them together instead of running one\ncommand per row.\n baker ads google draft stage --file changes.json --customer-id 1234567890\n\nThe file is a JSON array (or JSON Lines, one op per line). Each op is what the single commands\nbuild — kind, customerId (or --customer-id for all), target for a change to something that exists,\npayload. Read the shape for a kind with \\`baker capabilities google-ads\\`.\n [\n {\"kind\":\"google.keyword.add\",\"payload\":{\"adGroup\":\"customers/1234567890/adGroups/111\",\"text\":\"solar panels\",\"matchType\":\"PHRASE\"}},\n {\"kind\":\"google.keyword.update\",\"target\":\"customers/1234567890/adGroupCriteria/111~222\",\"payload\":{\"status\":\"PAUSED\"}},\n {\"kind\":\"google.negativeKeyword.add\",\"payload\":{\"level\":\"campaign\",\"parent\":\"222333\",\"text\":\"free\",\"matchType\":\"BROAD\"}}\n ]\nAn op may name a g_temp_* ref an EARLIER call returned (a campaign or ad group staged before), but\nnot another op in the same file — a ref exists only once its op is staged, so stage new parents first.\nAll-or-nothing: one invalid op stages nothing. Ops already in effect come back as skipped.\nThen: baker ads google draft validate`;\n\nregisterSchema({\n command: \"ads.google.draft.stage\",\n description: STAGE_DESCRIPTION,\n args: {\n file: {\n type: \"string\",\n description: \"JSON array or JSON Lines of ops ({kind, customerId?, target?, payload?}), path or inline\",\n required: true,\n },\n \"customer-id\": {\n type: \"string\",\n description: \"10-digit customer id for every op that does not name its own\",\n required: false,\n },\n },\n});\n\nconst IMPORT_DESCRIPTION = `Move another open chat's staged Google Ads changes into this chat, in one call — and out of that chat, so the two can never publish the same change twice.\n\nStart here when the user wants another chat's changes brought into this one (\"bring over\", \"merge\",\n\"include what the other chat prepared\", \"all of them except …\"):\n baker ads google draft import --from-chat <chat-id>\n baker ads google draft import --from-chat <chat-id> --exclude g_temp_a,customers/123/adGroupAds/4~5\n baker ads google draft import --from-chat <chat-id> --refs g_temp_b\n\nEvery op moves exactly as it was staged — same ref, same payload, nothing retyped — so never copy\nanother chat's changes with \\`draft show --chat\\` and re-stage them. An op moves with the creates it\ndepends on and the ops that depend on it (an asset and the link that attaches it go together).\nThe other chat must still be open; its other work (Knowledge, Tasks) stays where it is. Find chat ids\nwith \\`baker chats list\\`, and refs with \\`baker ads google draft list --chat <chat-id> --json\\`.\nThen: baker ads google draft validate`;\n\nregisterSchema({\n command: \"ads.google.draft.import\",\n description: IMPORT_DESCRIPTION,\n args: {\n \"from-chat\": { type: \"string\", description: \"The other open chat whose staged changes move here\", required: true },\n refs: {\n type: \"string\",\n description: \"Comma-separated refs to move (default: all); what they depend on comes too\",\n required: false,\n },\n exclude: {\n type: \"string\",\n description: \"Comma-separated refs to leave in the other chat, with the ops that depend on them\",\n required: false,\n },\n },\n});\n\n/** The refs a comma-separated flag names: undefined when the flag is absent, null when it names none. */\nfunction refList(value: unknown): string[] | undefined | null {\n if (typeof value !== \"string\") return undefined;\n const refs = value\n .split(\",\")\n .map((ref) => ref.trim())\n .filter((ref) => ref.length > 0);\n return refs.length > 0 ? refs : null;\n}\n\n/** What the agent needs after a move: the next step, and what the other chat now holds. */\nexport function importHints(fromChatId: string, data: GoogleDraftImportResponse): string[] {\n const source =\n data.sourceRemaining > 0\n ? `Chat ${fromChatId} still has ${data.sourceRemaining} Google Ads change(s) staged, which publish with that chat.`\n : `Chat ${fromChatId} has no Google Ads changes staged any more, so publishing it cannot apply these twice. Its other work stays there — never tell the user to discard it for this.`;\n return [source, \"Run `baker ads google draft validate` next.\"];\n}\n\n/** After a bulk stage: what to do next, and the reminder that the file — not a loop — is the tool. */\nexport const BULK_STAGE_HINTS = [\n \"Run `baker ads google draft validate` next: it asks Google about every staged op at once and lists only the ones it would refuse.\",\n 'To fix several staged ops, amend them together: `baker ads google draft amend --file amends.json` with [{\"ref\":\"…\",\"patch\":{…}}, …].',\n];\n\n/** Review and undo staged Google Ads ops on this chat's draft; `list`/`show` can also read another chat's. */\nexport const draftCommand = defineCommand({\n meta: {\n name: \"draft\",\n description:\n \"Stage many ops from one file, or list, validate, remove, clear, amend, or show staged Google Ads write ops for this chat. `list` and `show` take --chat <id> to read an earlier chat's changes instead; `import --from-chat <id>` moves another open chat's staged changes here.\",\n },\n subCommands: {\n stage: defineCommand({\n meta: { name: \"stage\", description: STAGE_DESCRIPTION },\n args: {\n file: {\n type: \"string\",\n description: \"JSON array or JSON Lines of ops ({kind, customerId?, target?, payload?}), path or inline\",\n },\n \"customer-id\": { type: \"string\", description: \"10-digit customer id for every op that does not name its own\" },\n },\n run: async ({ args }) => {\n const customerId = typeof args[\"customer-id\"] === \"string\" ? args[\"customer-id\"] : undefined;\n await stageGoogleOps(stageFileOps(loadJsonPayloads(args.file), customerId), BULK_STAGE_HINTS);\n },\n }),\n import: defineCommand({\n meta: { name: \"import\", description: IMPORT_DESCRIPTION },\n args: {\n \"from-chat\": { type: \"string\", description: \"The other open chat whose staged changes move here\" },\n refs: { type: \"string\", description: \"Comma-separated refs to move (default: all)\" },\n exclude: { type: \"string\", description: \"Comma-separated refs to leave in the other chat\" },\n },\n run: async ({ args }) => {\n const fromChatId = typeof args[\"from-chat\"] === \"string\" ? args[\"from-chat\"].trim() : \"\";\n if (!fromChatId) {\n writeJsonEnvelope({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: \"--from-chat is required\",\n fix: \"Name the other chat: baker ads google draft import --from-chat <chat-id> (ids from `baker chats list`).\",\n },\n });\n process.exit(1);\n }\n const refs = refList(args.refs);\n const exclude = refList(args.exclude);\n const empty = refs === null ? \"--refs\" : exclude === null ? \"--exclude\" : undefined;\n if (empty) {\n // An empty selection must never widen to \"every change\": the move takes them out of the other chat.\n writeJsonEnvelope({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: `${empty} names no change`,\n fix: `Pass the refs, comma-separated (from \\`baker ads google draft list --chat ${fromChatId} --json\\`), or leave ${empty} off to move every change.`,\n },\n });\n process.exit(1);\n }\n try {\n const response = await apiPost<{ ok: boolean; data?: GoogleDraftImportResponse }>(\n \"/api/ads/google/draft/import\",\n { chatId: requireChatId(), fromChatId, refs: refs ?? undefined, exclude: exclude ?? undefined },\n );\n writeJsonEnvelope(\n response.ok && response.data ? { ...response, hints: importHints(fromChatId, response.data) } : response,\n );\n } catch (err) {\n handleGoogleError(err);\n }\n },\n }),\n list: defineCommand({\n meta: {\n name: \"list\",\n description: \"Review everything staged as a campaign ▸ ad group ▸ ad tree (--json for the raw envelope)\",\n },\n args: {\n json: { type: \"boolean\", description: \"Print the raw JSON envelope instead of the readable tree\" },\n chat: CHAT_READ_ARG,\n },\n run: async ({ args }) => {\n await draftListAction(args.json === true, args.chat);\n },\n }),\n remove: defineCommand({\n meta: { name: \"remove\", description: \"Remove one staged op (cascades to dependents)\" },\n args: { ref: { type: \"positional\", description: \"Staged op ref (g_temp_* or target)\", required: false } },\n run: async ({ args }) => {\n await draftAction(\"/api/ads/google/draft/remove\", { ref: requireTarget(args, \"op\") });\n },\n }),\n clear: defineCommand({\n meta: { name: \"clear\", description: \"Discard all staged ops on this chat\" },\n run: async () => {\n await draftAction(\"/api/ads/google/draft/clear\", {});\n },\n }),\n amend: defineCommand({\n meta: {\n name: \"amend\",\n description:\n 'Update a staged op in place — merges a JSON patch into its payload (RFC-7386: objects deep-merge, null deletes a key, arrays/scalars replace) and re-validates. Use this instead of remove + re-create. Many at once: no ref, and --file holding [{\"ref\":\"g_temp_…\",\"patch\":{…}}, …] — all amended in one call, or none if any is refused.',\n },\n args: {\n ref: {\n type: \"positional\",\n description: \"Staged op ref (g_temp_*) or target id/resource name — leave out to amend many from --file\",\n required: false,\n },\n file: {\n type: \"string\",\n description: 'JSON file with the patch object — or, with no ref, a JSON array of {\"ref\",\"patch\"} amends',\n },\n patch: { type: \"string\", description: \"Inline JSON patch object\" },\n },\n run: async ({ args }) => {\n const positional = Array.isArray(args._) ? args._[0] : undefined;\n if (!(args.ref ?? positional) && typeof args.file === \"string\" && args.file.length > 0) {\n const amends = amendBatchEntries(loadJsonPayloads(args.file));\n await draftAction(\"/api/ads/google/draft/amend-batch\", { amends });\n return;\n }\n const ref = requireTarget(args, \"op\");\n const patch = loadPatchArg(args);\n await draftAction(\"/api/ads/google/draft/amend\", { ref, patch });\n },\n }),\n validate: defineCommand({\n meta: { name: \"validate\", description: VALIDATE_DESCRIPTION },\n args: {\n full: { type: \"boolean\", description: \"List every op with its built request and Google's raw answer\" },\n },\n run: async ({ args }) => {\n try {\n const full = args.full === true;\n const response = await apiPost<{ ok: boolean; data?: GoogleDraftValidateResponse }>(\n \"/api/ads/google/draft/validate\",\n { chatId: requireChatId(), full },\n );\n writeJsonEnvelope(response.ok && response.data ? validationEnvelope(response.data, full) : response);\n } catch (err) {\n handleGoogleError(err);\n }\n },\n }),\n show: defineCommand({\n meta: {\n name: \"show\",\n description:\n \"Print the full staged payload for one op — the receipt to verify a change looks right before publish (never truncated).\",\n },\n args: {\n ref: {\n type: \"positional\",\n description: \"Staged op ref (g_temp_*) or target id/resource name\",\n required: false,\n },\n chat: CHAT_READ_ARG,\n },\n run: async ({ args }) => {\n await draftAction(\"/api/ads/google/draft/show\", { ref: requireTarget(args, \"op\") }, args.chat);\n },\n }),\n },\n});\n","import { GOOGLE_DRAFT_BATCH_MAX } from \"@baker/api/ads-google\";\nimport { failWriteValidation } from \"./write-shared.ts\";\n\n/**\n * The bulk halves of `draft`: one file of many changes, staged or amended in ONE request. A bulk\n * change done as a loop of single commands is one request, one rate-limit hit and one tool call per\n * row — production saw 1,284 such calls — while a file is one of each for up to 500 rows.\n */\n\nfunction refuseOversized(count: number, what: string): void {\n if (count > GOOGLE_DRAFT_BATCH_MAX) {\n failWriteValidation(\n `${count} ${what} exceeds the batch limit of ${GOOGLE_DRAFT_BATCH_MAX} — split the file and run the command once per part`,\n );\n }\n}\n\n/**\n * `draft stage --file` items → ops: each item is a whole op (`kind`, `customerId`, `target` for a\n * change to something that exists, `payload`); `--customer-id` fills the account on items that leave\n * it out, so a one-account file need not repeat it. The ops are preflighted by `stageGoogleOps`.\n */\nexport function stageFileOps(\n items: ReadonlyArray<Record<string, unknown>>,\n customerId: string | undefined,\n): Array<Record<string, unknown>> {\n if (items.length === 0) {\n failWriteValidation(\n 'pass --file with the ops to stage: a JSON array (or JSON Lines) of {\"kind\",\"customerId\",\"target\"?,\"payload\"?}',\n );\n }\n refuseOversized(items.length, \"ops\");\n return items.map((item, index) => {\n if (typeof item.kind !== \"string\") {\n failWriteValidation(\n `item ${index} has no \"kind\" — every item is a whole op, e.g. {\"kind\":\"google.keyword.add\",…}`,\n );\n }\n return item.customerId === undefined && customerId ? { ...item, customerId } : item;\n });\n}\n\n/** `draft amend --file` items → the amend batch: each `{ ref, patch }` exactly as `draft amend <ref>` takes it. */\nexport function amendBatchEntries(\n items: ReadonlyArray<Record<string, unknown>>,\n): Array<{ ref: string; patch: Record<string, unknown> }> {\n refuseOversized(items.length, \"amends\");\n return items.map((item, index) => {\n const { ref, patch } = item;\n if (typeof ref !== \"string\" || ref.length === 0) {\n failWriteValidation(`item ${index} has no \"ref\" — name the staged op (g_temp_* or its target) to amend`);\n }\n if (patch === null || typeof patch !== \"object\" || Array.isArray(patch)) {\n failWriteValidation(`item ${index} has no \"patch\" object — {\"ref\":\"…\",\"patch\":{…fields to change…}}`);\n }\n return { ref, patch: patch as Record<string, unknown> };\n });\n}\n","import type { GoogleDraftOpVerdict, GoogleDraftValidateResponse } from \"@baker/api/ads-google\";\n\n/** Verdicts that need nothing from the agent — counted, never listed in the compact view. */\nconst QUIET: ReadonlySet<GoogleDraftOpVerdict[\"verdict\"]> = new Set([\"accepted\", \"applied\"]);\n\nfunction changes(n: number): string {\n return n === 1 ? \"1 change\" : `${n} changes`;\n}\n\n/** What to do next, read off the counts — the agent decides from these without re-reading every op. */\nfunction validationHints(data: GoogleDraftValidateResponse): string[] {\n const { refused, blocked, unchecked } = data.counts;\n const hints: string[] = [];\n if (refused > 0) {\n hints.push(\n `${changes(refused)} would fail at publish. Fix each refused op in place with \\`draft amend <ref>\\` (or \\`draft remove <ref>\\` if it should not exist), then run \\`draft validate\\` again before asking the user to publish. Never tell the user a refused change will go live.`,\n );\n }\n if (blocked > 0) {\n hints.push(\n `${changes(blocked)} would not apply only because a refused change they depend on fails — fixing the refused one clears them.`,\n );\n }\n if (data.publishHeld) {\n hints.push(\n \"Baker would hold this whole publish: a refused change stops a first publish from sending anything. Fix it first.\",\n );\n }\n if (unchecked > 0) {\n hints.push(\n `${changes(unchecked)} can only be checked by Google at publish (the reason is on each one). Nothing here says they will fail.`,\n );\n }\n if (refused + blocked === 0 && !data.publishHeld && data.ops.length > 0) {\n hints.push(\n \"Google accepted every change it was asked about. The draft is ready for the user to review and publish.\",\n );\n }\n return hints;\n}\n\n/**\n * The `draft validate` envelope. Compact by default: counts for everything, and only the ops that\n * need attention listed — a 300-keyword draft that Google accepts reads as one line, not 300.\n * `full` keeps every op with its built request and Google's raw answer.\n */\nexport function validationEnvelope(\n data: GoogleDraftValidateResponse,\n full = false,\n): { ok: true; data: GoogleDraftValidateResponse; hints: string[] } {\n const ops = full ? data.ops : data.ops.filter((op) => !QUIET.has(op.verdict));\n return { ok: true, data: { ...data, ops }, hints: validationHints(data) };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/ads/linkedin/draft.ts","../src/commands/ads/linkedin/draft-status.ts"],"sourcesContent":["import type {\n LinkedinDraftAmendRequest,\n LinkedinDraftClearResponse,\n LinkedinDraftListResponse,\n LinkedinDraftRemoveResponse,\n LinkedinDraftShowRequest,\n LinkedinDraftShowResponse,\n LinkedinDraftStageResponse,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { requireChatId, resolveChatId } from \"../../../env.ts\";\nimport { CHAT_READ_ARG } from \"../../chat-arg.ts\";\nimport { hintLines } from \"../hints.ts\";\nimport { writeJsonEnvelope } from \"../output.ts\";\nimport { renderDraftStatus } from \"./draft-status.ts\";\nimport { handleLinkedinError } from \"./shared.ts\";\nimport { loadPatchArg, requireTarget } from \"./write-shared.ts\";\n\n/**\n * List the staged draft. By default renders a readable Campaign group ▸ Campaign ▸ Creative status\n * tree so the agent can review everything it has staged at a glance; `--json` returns the raw\n * envelope for tools.\n */\nasync function listDraft(json: boolean, chat?: unknown): Promise<void> {\n try {\n const chatId = resolveChatId(chat);\n const response = await apiPost<{ ok: boolean; data?: LinkedinDraftListResponse }>(\"/api/ads/linkedin/draft\", {\n chatId,\n });\n if (json || !response.ok || !response.data) {\n writeJsonEnvelope(response);\n return;\n }\n process.stdout.write(`${renderDraftStatus(response.data)}${hintLines(response)}\\n`);\n } catch (err) {\n handleLinkedinError(err);\n }\n}\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"Review everything staged as a Campaign group ▸ Campaign ▸ Creative tree (--json for the raw envelope). Example: baker ads linkedin draft\",\n },\n args: {\n json: { type: \"boolean\", description: \"Print the raw JSON envelope instead of the readable tree\" },\n chat: CHAT_READ_ARG,\n },\n run: async ({ args }) => {\n await listDraft(args.json === true, args.chat);\n },\n});\n\nconst removeCommand = defineCommand({\n meta: {\n name: \"remove\",\n description:\n \"Drop one staged LinkedIn op. Removing a create cascades to everything that depends on it — except a company exclusion, which only loses the removed audience and keeps its companies (listed under `updated`). Example: baker ads linkedin draft remove li_temp_abc123\",\n },\n args: {\n ref: {\n type: \"positional\",\n description: \"Op ref (li_temp_* for creates, target id/URN for updates)\",\n required: true,\n },\n },\n run: async ({ args }) => {\n try {\n const chatId = requireChatId();\n const response = await apiPost<{ ok: true; data: LinkedinDraftRemoveResponse }>(\n \"/api/ads/linkedin/draft/remove\",\n { chatId, ref: args.ref },\n );\n writeJsonEnvelope(response);\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\nconst clearCommand = defineCommand({\n meta: {\n name: \"clear\",\n description:\n \"Discard ALL staged LinkedIn ops in this chat's draft — nothing will apply on publish. Example: baker ads linkedin draft clear\",\n },\n run: async () => {\n try {\n const chatId = requireChatId();\n const response = await apiPost<{ ok: true; data: LinkedinDraftClearResponse }>(\"/api/ads/linkedin/draft/clear\", {\n chatId,\n });\n writeJsonEnvelope(response);\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\nconst amendCommand = defineCommand({\n meta: {\n name: \"amend\",\n description:\n \"Update a staged op in place — merges a JSON patch into its payload (RFC-7386: objects deep-merge, null deletes a key, arrays/scalars replace) and re-validates. Use this instead of remove + re-create.\",\n },\n args: {\n ref: { type: \"positional\", description: \"Staged op ref (li_temp_*) or target id/URN\", required: true },\n file: { type: \"string\", description: \"JSON file with the patch object\" },\n patch: { type: \"string\", description: \"Inline JSON patch object\" },\n },\n run: async ({ args }) => {\n const ref = requireTarget(args as Record<string, unknown>, \"op\");\n const patch = loadPatchArg(args as Record<string, unknown>);\n try {\n const chatId = requireChatId();\n const body: LinkedinDraftAmendRequest = { chatId, ref, patch };\n const response = await apiPost<{ ok: true; data: LinkedinDraftStageResponse }>(\n \"/api/ads/linkedin/draft/amend\",\n body,\n );\n writeJsonEnvelope(response);\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\nconst showCommand = defineCommand({\n meta: {\n name: \"show\",\n description:\n \"Print the full staged payload for one op — the receipt to verify a change looks right before publish (never truncated).\",\n },\n args: {\n ref: { type: \"positional\", description: \"Staged op ref (li_temp_*) or target id/URN\", required: true },\n chat: CHAT_READ_ARG,\n },\n run: async ({ args }) => {\n const ref = requireTarget(args as Record<string, unknown>, \"op\");\n try {\n const chatId = resolveChatId(args.chat);\n const body: LinkedinDraftShowRequest = { chatId, ref };\n const response = await apiPost<{ ok: true; data: LinkedinDraftShowResponse }>(\n \"/api/ads/linkedin/draft/show\",\n body,\n );\n writeJsonEnvelope(response);\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\nexport const linkedinDraftCommand = defineCommand({\n meta: {\n name: \"draft\",\n description:\n \"Review and edit the LinkedIn write ops staged in this chat BEFORE publish. Subcommands: list (default), remove, clear, amend, show. Ops never hit LinkedIn until the chat is published. `list` and `show` take --chat <id> to read an earlier chat's changes instead.\",\n },\n // Declared on the parent too: `default: \"list\"` dispatches the bare `draft --chat <id>` form, and\n // citty prints help for a flag the parent does not know instead of forwarding it.\n args: { chat: CHAT_READ_ARG },\n subCommands: {\n list: listCommand,\n remove: removeCommand,\n clear: clearCommand,\n amend: amendCommand,\n show: showCommand,\n },\n // A parent must never declare `run`: citty falls through to it *after* running\n // the matched subcommand, so `draft show <ref>` would also re-list the draft.\n default: \"list\",\n});\n","import type { LinkedinDraftListResponse, LinkedinDraftStatusCollection, LinkedinDraftStatusNode } from \"@baker/api\";\n\n/**\n * Render the staged LinkedIn draft as a readable Campaign group ▸ Campaign ▸ Creative tree — the\n * CLI counterpart to `ads google draft list`'s campaign ▸ ad group ▸ ad tree, using the identical\n * node shape (`LinkedinDraftStatusNode` mirrors `GoogleDraftStatusNode`). Pure: takes the draft-list\n * response, returns text.\n */\n\nconst OPERATION_LABELS: Record<string, string> = {\n create: \"Creating\",\n update: \"Updating\",\n pause: \"Pausing\",\n resume: \"Resuming\",\n archive: \"Archiving\",\n delete: \"Deleting\",\n};\n\nfunction badge(node: LinkedinDraftStatusNode): string {\n const label = node.operation ? OPERATION_LABELS[node.operation] : undefined;\n if (label) {\n return label;\n }\n return node.existing ? \"on LinkedIn\" : \"staged\";\n}\n\nfunction collectionLine(collection: LinkedinDraftStatusCollection): string | undefined {\n const parts: string[] = [];\n if (collection.added > 0) {\n parts.push(`+${collection.added}`);\n }\n if (collection.existing > 0) {\n parts.push(`${collection.existing} existing`);\n }\n if (collection.removed > 0) {\n parts.push(`-${collection.removed}`);\n }\n return parts.length > 0 ? `${collection.label}: ${parts.join(\", \")}` : undefined;\n}\n\n/**\n * Every ad account the tree touches. A draft may legitimately span several, and\n * two accounts can hold identically-named campaigns — so the account is printed\n * on each node once there is more than one, and left off when there is not.\n */\nfunction accountsInTree(nodes: readonly LinkedinDraftStatusNode[]): Set<string> {\n const accounts = new Set<string>();\n const walk = (node: LinkedinDraftStatusNode): void => {\n accounts.add(node.accountId);\n for (const child of node.children) {\n walk(child);\n }\n };\n for (const node of nodes) {\n walk(node);\n }\n return accounts;\n}\n\nfunction renderNode(node: LinkedinDraftStatusNode, depth: number, lines: string[], showAccount: boolean): void {\n const indent = \" \".repeat(depth);\n const account = showAccount ? ` · account ${node.accountId}` : \"\";\n lines.push(`${indent}• ${node.name} · ${badge(node)}${account}`);\n for (const warning of node.warnings ?? []) {\n lines.push(`${indent} ⚠ ${warning}`);\n }\n for (const collection of node.collections) {\n const line = collectionLine(collection);\n if (line) {\n lines.push(`${indent} ${line}`);\n }\n }\n for (const child of node.children) {\n renderNode(child, depth + 1, lines, showAccount);\n }\n}\n\nfunction renderSection(title: string, nodes: LinkedinDraftStatusNode[], lines: string[], showAccount: boolean): void {\n if (nodes.length === 0) {\n return;\n }\n lines.push(\"\");\n lines.push(title);\n for (const node of nodes) {\n renderNode(node, 1, lines, showAccount);\n }\n}\n\n/** Campaign group ▸ Campaign ▸ Creative roots go under \"Campaigns\" (campaign group is the group parent). */\nconst CAMPAIGN_TREE_ENTITIES = new Set([\"campaignGroup\", \"campaign\", \"creative\"]);\n\n/**\n * What the publish did, once there is a publish to report.\n *\n * A published draft used to render exactly like a staged one — same count, same\n * tree, no mention of the outcome — so the surface an agent reaches for to see\n * what a publish did could not answer, and a publish that changed LinkedIn and\n * then failed to finish was indistinguishable from one that had not run yet.\n * The per-op results were in the response the whole time; only the renderer\n * dropped them.\n */\nfunction renderOutcome(data: LinkedinDraftListResponse, lines: string[]): void {\n const counts = new Map<string, number>();\n for (const op of data.ops ?? []) {\n const status = op.result?.status ?? \"pending\";\n counts.set(status, (counts.get(status) ?? 0) + 1);\n }\n const summary = [...counts].map(([status, count]) => `${count} ${status}`).join(\", \");\n lines.push(`LinkedIn Ads — published · ${summary || `${data.count} op(s)`} · ${data.mode}`);\n // A failure is the reason to read this at all, so it is named with its error\n // rather than left as a number to go and look up.\n for (const op of data.ops ?? []) {\n const status = op.result?.status;\n // An audience whose segment was created but whose rule or rows did not\n // land is `applied` with an error: it exists on LinkedIn and stays empty.\n if (status === \"applied\" && op.result?.error) {\n lines.push(` ⚠ ${op.summary} — applied in part: ${op.result.error}`);\n continue;\n }\n if (status !== \"failed\" && status !== \"skipped\") {\n continue;\n }\n const reason = op.result?.error ?? op.result?.skippedBecause ?? \"no reason recorded\";\n lines.push(` ✗ ${op.summary} — ${status}: ${reason}`);\n }\n}\n\nexport function renderDraftStatus(data: LinkedinDraftListResponse): string {\n if (data.status === \"none\" || data.count === 0) {\n return \"No staged LinkedIn changes on this chat.\";\n }\n const modeNote =\n data.mode === \"live\"\n ? \"Live — publishing writes directly to LinkedIn.\"\n : \"Simulated — publishing completes the whole draft without calling LinkedIn.\";\n const lines: string[] = [];\n if (data.status === \"applied\") {\n renderOutcome(data, lines);\n } else if (data.status === \"publishing\") {\n lines.push(`LinkedIn Ads — publishing ${data.count} change${data.count === 1 ? \"\" : \"s\"} · ${data.mode}`);\n } else {\n lines.push(`LinkedIn Ads — ${data.count} staged change${data.count === 1 ? \"\" : \"s\"} · ${data.mode}`);\n }\n lines.push(modeNote);\n\n const tree = data.tree ?? [];\n const showAccount = accountsInTree(tree).size > 1;\n renderSection(\n \"Campaigns\",\n tree.filter((node) => CAMPAIGN_TREE_ENTITIES.has(node.entity)),\n lines,\n showAccount,\n );\n const rest = tree.filter((node) => !CAMPAIGN_TREE_ENTITIES.has(node.entity));\n renderSection(\"Other\", rest, lines, showAccount);\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/tag-manager/draft.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { CHAT_READ_ARG } from \"../chat-arg.ts\";\nimport { draftAction, draftList, loadJsonArg, requireTarget } from \"./shared.ts\";\n\nregisterSchema({\n command: \"tagManager.draft\",\n description:\n \"Review and undo the Tag Manager changes staged on this chat. Use `list` to see everything staged, `show` to inspect one change in full before publish, `amend` to correct one in place, and `remove`/`clear` to drop them. `list` and `show` take --chat <id> to read an earlier chat's changes instead.\",\n args: {\n json: { type: \"boolean\", description: \"Print the raw JSON envelope instead of the readable list\", required: false },\n chat: { type: \"string\", description: CHAT_READ_ARG.description, required: false },\n },\n});\n\nexport const draftCommand = defineCommand({\n meta: {\n name: \"draft\",\n description:\n \"List, show, amend, remove, or clear staged Tag Manager changes for this chat. `list` and `show` take --chat <id> to read an earlier chat's changes instead.\",\n },\n subCommands: {\n list: defineCommand({\n meta: {\n name: \"list\",\n description: \"Review everything staged on this chat (--json for the raw envelope)\",\n },\n args: {\n json: { type: \"boolean\", description: \"Print the raw JSON envelope\", required: false },\n chat: CHAT_READ_ARG,\n },\n run: async ({ args }) => {\n await draftList(args.json === true, args.chat);\n },\n }),\n show: defineCommand({\n meta: {\n name: \"show\",\n description:\n \"Print the full staged payload for one change — the receipt to verify it looks right before publish (never truncated).\",\n },\n args: {\n ref: { type: \"positional\", description: \"Staged ref (gtm_temp_*) or target\", required: false },\n chat: CHAT_READ_ARG,\n },\n run: async ({ args }) => {\n await draftAction(\n \"/api/tag-manager/draft/show\",\n { ref: requireTarget(args as Record<string, unknown>, \"change\") },\n args.chat,\n );\n },\n }),\n amend: defineCommand({\n meta: {\n name: \"amend\",\n description:\n \"Update a staged change in place — merges a JSON patch into its payload (objects deep-merge, null deletes a key, arrays/scalars replace) and re-validates. Use this instead of remove + re-create.\",\n },\n args: {\n ref: { type: \"positional\", description: \"Staged ref (gtm_temp_*) or target\", required: false },\n patch: { type: \"string\", description: \"Inline JSON patch object\", required: false },\n file: { type: \"string\", description: \"JSON file with the patch object\", required: false },\n },\n run: async ({ args }) => {\n await draftAction(\"/api/tag-manager/draft/amend\", {\n ref: requireTarget(args as Record<string, unknown>, \"change\"),\n patch: loadJsonArg(args as Record<string, unknown>, \"patch\"),\n });\n },\n }),\n remove: defineCommand({\n meta: { name: \"remove\", description: \"Remove one staged change (cascades to anything depending on it)\" },\n args: { ref: { type: \"positional\", description: \"Staged ref (gtm_temp_*) or target\", required: false } },\n run: async ({ args }) => {\n await draftAction(\"/api/tag-manager/draft/remove\", {\n ref: requireTarget(args as Record<string, unknown>, \"change\"),\n });\n },\n }),\n clear: defineCommand({\n meta: { name: \"clear\", description: \"Discard all Tag Manager changes staged on this chat\" },\n run: async () => {\n await draftAction(\"/api/tag-manager/draft/clear\", {});\n },\n }),\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,WAAW,aAAa,4DAA4D,UAAU,MAAM;AAAA,IAClH,MAAM,EAAE,MAAM,UAAU,aAAa,cAAc,aAAa,UAAU,MAAM;AAAA,EAClF;AACF,CAAC;AAEM,IAAM,eAAe,cAAc;AAAA,EACxC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,aAAa;AAAA,IACX,MAAM,cAAc;AAAA,MAClB,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,MAAM,EAAE,MAAM,WAAW,aAAa,+BAA+B,UAAU,MAAM;AAAA,QACrF,MAAM;AAAA,MACR;AAAA,MACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,cAAM,UAAU,KAAK,SAAS,MAAM,KAAK,IAAI;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,IACD,MAAM,cAAc;AAAA,MAClB,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACJ,KAAK,EAAE,MAAM,cAAc,aAAa,qCAAqC,UAAU,MAAM;AAAA,QAC7F,MAAM;AAAA,MACR;AAAA,MACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,cAAM;AAAA,UACJ;AAAA,UACA,EAAE,KAAK,cAAc,MAAiC,QAAQ,EAAE;AAAA,UAChE,KAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,OAAO,cAAc;AAAA,MACnB,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACJ,KAAK,EAAE,MAAM,cAAc,aAAa,qCAAqC,UAAU,MAAM;AAAA,QAC7F,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,QAClF,MAAM,EAAE,MAAM,UAAU,aAAa,mCAAmC,UAAU,MAAM;AAAA,MAC1F;AAAA,MACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,cAAM,YAAY,gCAAgC;AAAA,UAChD,KAAK,cAAc,MAAiC,QAAQ;AAAA,UAC5D,OAAO,YAAY,MAAiC,OAAO;AAAA,QAC7D,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,IACD,QAAQ,cAAc;AAAA,MACpB,MAAM,EAAE,MAAM,UAAU,aAAa,kEAAkE;AAAA,MACvG,MAAM,EAAE,KAAK,EAAE,MAAM,cAAc,aAAa,qCAAqC,UAAU,MAAM,EAAE;AAAA,MACvG,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,cAAM,YAAY,iCAAiC;AAAA,UACjD,KAAK,cAAc,MAAiC,QAAQ;AAAA,QAC9D,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,IACD,OAAO,cAAc;AAAA,MACnB,MAAM,EAAE,MAAM,SAAS,aAAa,sDAAsD;AAAA,MAC1F,KAAK,YAAY;AACf,cAAM,YAAY,gCAAgC,CAAC,CAAC;AAAA,MACtD;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/ads/meta/draft.ts","../src/commands/ads/meta/draft-status.ts"],"sourcesContent":["import type {\n MetaDraftClearResponse,\n MetaDraftListResponse,\n MetaDraftRemoveResponse,\n MetaDraftShowResponse,\n} from \"@baker/api/ads-meta\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { requireChatId, resolveChatId } from \"../../../env.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { CHAT_READ_ARG } from \"../../chat-arg.ts\";\nimport { hintLines } from \"../hints.ts\";\nimport { writeJsonEnvelope } from \"../output.ts\";\nimport { renderDraftStatus } from \"./draft-status.ts\";\nimport { handleMetaError } from \"./shared.ts\";\n\nregisterSchema({\n command: \"ads.meta.draft\",\n description:\n \"Review every Meta op staged on this chat, one line each: ref · kind · summary · what it waits on, and after a publish ✓ applied → id or ✗ failed: <error>. `draft show <ref>` prints one op's full payload.\",\n args: {\n json: { type: \"boolean\", description: \"Raw JSON envelope instead of the readable list\", required: false },\n chat: { type: \"string\", description: \"Read another chat's draft instead of this one\", required: false },\n },\n});\n\n/**\n * The readable one-line-per-op view is the default, like the Google, LinkedIn and X drafts;\n * `--json` (or `--output json`) returns the raw envelope for tools.\n */\nasync function listDraft(json: boolean, chat?: unknown): Promise<void> {\n try {\n const chatId = resolveChatId(chat);\n const response = await apiPost<{ ok: boolean; data?: MetaDraftListResponse }>(\"/api/ads/meta/draft\", { chatId });\n if (json || !response.ok || !response.data) {\n writeJsonEnvelope(response);\n return;\n }\n process.stdout.write(`${renderDraftStatus(response.data)}${hintLines(response)}\\n`);\n } catch (err) {\n handleMetaError(err);\n }\n}\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"Show every Meta write op staged in this chat, one line each (ref · kind · summary · dependencies · post-publish result); --json for the raw envelope. Publishing reaches the real ad account, so review this before you finish. Example: baker ads meta draft\",\n },\n args: {\n json: { type: \"boolean\", description: \"Print the raw JSON envelope instead of the readable list\" },\n chat: CHAT_READ_ARG,\n },\n run: async ({ args }) => {\n await listDraft(args.json === true, args.chat);\n },\n});\n\nconst showCommand = defineCommand({\n meta: {\n name: \"show\",\n description:\n \"Print the full staged payload for one op — the receipt to verify a change looks right before publish (never truncated). Example: baker ads meta draft show meta_temp_abc123\",\n },\n args: {\n ref: { type: \"positional\", description: \"Op ref (meta_temp_* for creates, target id for updates)\", required: true },\n // `show` always prints the envelope; `--json` is the spelling `list` taught, so it is accepted here too.\n json: { type: \"boolean\", description: \"Accepted for symmetry with list; show always prints the JSON envelope\" },\n chat: CHAT_READ_ARG,\n },\n run: async ({ args }) => {\n try {\n const chatId = resolveChatId(args.chat);\n const response = await apiPost<{ ok: true; data: MetaDraftShowResponse }>(\"/api/ads/meta/draft/show\", {\n chatId,\n ref: args.ref,\n });\n writeJsonEnvelope(response);\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nconst removeCommand = defineCommand({\n meta: {\n name: \"remove\",\n description:\n \"Drop one staged Meta op. Removing a create cascades to everything that depends on it. Example: baker ads meta draft remove meta_temp_abc123\",\n },\n args: {\n ref: { type: \"positional\", description: \"Op ref (meta_temp_* for creates, target id for updates)\", required: true },\n },\n run: async ({ args }) => {\n try {\n const chatId = requireChatId();\n const response = await apiPost<{ ok: true; data: MetaDraftRemoveResponse }>(\"/api/ads/meta/draft/remove\", {\n chatId,\n ref: args.ref,\n });\n writeJsonEnvelope(response);\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nconst clearCommand = defineCommand({\n meta: {\n name: \"clear\",\n description:\n \"Discard ALL staged Meta ops in this chat's draft — nothing will apply on publish. Example: baker ads meta draft clear\",\n },\n run: async () => {\n try {\n const chatId = requireChatId();\n const response = await apiPost<{ ok: true; data: MetaDraftClearResponse }>(\"/api/ads/meta/draft/clear\", {\n chatId,\n });\n writeJsonEnvelope(response);\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nexport const metaDraftCommand = defineCommand({\n meta: {\n name: \"draft\",\n description:\n \"Review and edit the Meta write ops staged in this chat BEFORE publish. Subcommands: list (default), show, remove, clear. Ops never hit Meta until the chat is published. `list` and `show` take --chat <id> to read an earlier chat's changes instead.\",\n },\n // Declared on the parent too: `default: \"list\"` dispatches the bare `draft --chat <id>` form, and\n // citty prints help for a flag the parent does not know instead of forwarding it.\n args: {\n json: { type: \"boolean\", description: \"Print the raw JSON envelope instead of the readable list\" },\n chat: CHAT_READ_ARG,\n },\n subCommands: { list: listCommand, show: showCommand, remove: removeCommand, clear: clearCommand },\n // `default` (not `run`) dispatches the bare invocation: citty falls through to `run`\n // after dispatching a subcommand, so a `run` here would list the draft a second time\n // on every `draft list` / `draft remove` / `draft clear`.\n default: \"list\",\n});\n","import type { MetaDraftListResponse, MetaDraftOpView } from \"@baker/api/ads-meta\";\n\n/**\n * Render the staged Meta draft as one line per op — ref, kind, summary, what it\n * waits on and, after a publish, what happened to it. The Google, LinkedIn and\n * X drafts already print a readable view by default; Meta printed the pretty\n * JSON envelope, and agents piped every read through python to get these same\n * columns back. Pure: takes the draft-list response, returns text.\n */\n\nconst STATUS_HEADINGS: Record<MetaDraftListResponse[\"status\"], string> = {\n active: \"staged\",\n publishing: \"publishing\",\n applied: \"published\",\n partial: \"published with failures\",\n discarded: \"discarded\",\n none: \"none\",\n};\n\nfunction plural(count: number, word: string): string {\n return `${count} ${word}${count === 1 ? \"\" : \"s\"}`;\n}\n\nfunction headingLine(draft: MetaDraftListResponse): string {\n const heading = STATUS_HEADINGS[draft.status];\n if (draft.status === \"active\" || draft.status === \"discarded\") {\n return `Meta Ads — ${plural(draft.count, \"change\")} ${heading} · ${draft.mode}`;\n }\n const counts = new Map<string, number>();\n for (const op of draft.ops) {\n const status = op.result?.status ?? \"pending\";\n counts.set(status, (counts.get(status) ?? 0) + 1);\n }\n const summary = [...counts].map(([status, count]) => `${count} ${status}`).join(\", \");\n return `Meta Ads — ${heading} · ${summary} · ${draft.mode}`;\n}\n\n/** A failed op: why, and what of it already reached Meta. */\nfunction failedPart(result: NonNullable<MetaDraftOpView[\"result\"]>): string {\n const landed = result.landed ? ` (${result.landed})` : \"\";\n return `✗ failed: ${result.error ?? \"no reason recorded\"}${landed}`;\n}\n\nfunction resultPart(op: MetaDraftOpView): string | undefined {\n const result = op.result;\n if (!result) {\n return undefined;\n }\n if (result.status === \"failed\") {\n return failedPart(result);\n }\n if (result.status === \"skipped\") {\n // Publish records either the dependency ref that did not apply or a plain reason; either way the op is finished.\n const because = result.skippedBecause;\n if (because && op.dependsOn.includes(because)) {\n return `✗ skipped: ${because} did not apply`;\n }\n return `✗ skipped: ${because ?? \"a change it needs did not apply\"}`;\n }\n const id = result.id ?? result.hash;\n const applied = `✓ ${result.status}${id ? ` → ${id}` : \"\"}`;\n const verification = result.verification;\n if (verification && verification.status !== \"confirmed\") {\n return `${applied} (read-back ${verification.status}${verification.note ? `: ${verification.note}` : \"\"})`;\n }\n return applied;\n}\n\nfunction opLine(op: MetaDraftOpView, showAccount: boolean): string {\n const parts = [op.ref, op.kind, op.summary];\n if (op.target && op.target !== op.ref) {\n parts.push(`target ${op.target}`);\n }\n if (showAccount) {\n parts.push(`account ${op.accountId}`);\n }\n if (op.dependsOn.length > 0) {\n parts.push(`after ${op.dependsOn.join(\", \")}`);\n }\n const result = resultPart(op);\n if (result) {\n parts.push(result);\n }\n // Creative copy and provider errors can carry line breaks; one op stays one line.\n return ` ${parts.join(\" · \").replace(/[\\r\\n]+/g, \" \")}`;\n}\n\nexport function renderDraftStatus(draft: MetaDraftListResponse): string {\n if (draft.status === \"none\" || draft.count === 0) {\n return \"No staged Meta changes on this chat.\";\n }\n const lines = [headingLine(draft)];\n if (draft.status === \"active\") {\n lines.push(\"Publishing makes every change real on the ad account.\");\n }\n lines.push(\"\");\n // A draft may span several ad accounts; the account is only noise when there is one.\n const showAccount = new Set(draft.ops.map((op) => op.accountId)).size > 1;\n for (const op of draft.ops) {\n lines.push(opLine(op, showAccount));\n }\n if (draft.advisories.length > 0) {\n lines.push(\"\", \"Advisories\");\n for (const advisory of draft.advisories) {\n lines.push(` ! ${advisory.ref}: ${advisory.message}`);\n }\n }\n lines.push(\"\", \"Full staged payload for one op: baker ads meta draft show <ref> · raw envelope: --json\");\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/ads/x/draft.ts","../src/commands/ads/x/draft-status.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport type {\n XDraftClearResponse,\n XDraftListResponse,\n XDraftRemoveResponse,\n XDraftShowResponse,\n XDraftStageResponse,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../../client.ts\";\nimport { requireChatId, resolveChatId } from \"../../../env.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { CHAT_READ_ARG } from \"../../chat-arg.ts\";\nimport { writeAdsJson, writeJsonEnvelope } from \"../output.ts\";\nimport { renderDraftStatus } from \"./draft-status.ts\";\nimport { parseXApiError } from \"./error-parser.ts\";\nimport { failWriteValidation } from \"./write-shared.ts\";\n\nfunction handleDraftError(err: unknown): never {\n if (err instanceof ApiError) {\n writeAdsJson(parseXApiError(err.message, \"—\"));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n}\n\nregisterSchema({\n command: \"ads.x.draft\",\n description:\n \"Review everything staged for X Ads on this chat as a Campaign ▸ Ad group ▸ Ad tree. After a publish this is the authoritative record: `published · N applied`, or a `✗ … failed:` line per op that did not land.\",\n args: {\n json: { type: \"boolean\", description: \"Raw JSON envelope instead of the readable tree\", required: false },\n chat: { type: \"string\", description: \"Read another chat's draft instead of this one\", required: false },\n },\n});\n\nasync function listDraft(json: boolean, chat?: unknown): Promise<void> {\n try {\n const chatId = resolveChatId(chat);\n const response = await apiPost<{ ok: boolean; data?: XDraftListResponse }>(\"/api/ads/x/draft\", { chatId });\n if (json || !response.ok || !response.data) {\n writeJsonEnvelope(response);\n return;\n }\n process.stdout.write(`${renderDraftStatus(response.data)}\\n`);\n } catch (err) {\n handleDraftError(err);\n }\n}\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description: \"Review everything staged as a Campaign ▸ Ad group ▸ Ad tree. Example: baker ads x draft\",\n },\n args: {\n json: { type: \"boolean\", description: \"Print the raw JSON envelope instead of the readable tree\" },\n chat: CHAT_READ_ARG,\n },\n run: async ({ args }) => {\n await listDraft(args.json === true, args.chat);\n },\n});\n\nregisterSchema({\n command: \"ads.x.draft.show\",\n description:\n \"The full staged payload, warnings and before-snapshot for one op — the receipt to check before publishing.\",\n args: {\n ref: {\n type: \"positional\",\n description: \"Op ref (x_temp_* for creates, the target id for updates)\",\n required: true,\n },\n chat: { type: \"string\", description: \"Read another chat's draft instead of this one\", required: false },\n },\n});\n\nconst showCommand = defineCommand({\n meta: {\n name: \"show\",\n description: \"Show one staged op in full. Example: baker ads x draft show x_temp_abc123\",\n },\n args: {\n ref: { type: \"positional\", description: \"Op ref, or the target id for a staged update\", required: true },\n chat: CHAT_READ_ARG,\n },\n run: async ({ args }) => {\n try {\n const chatId = resolveChatId(args.chat);\n const response = await apiPost<{ ok: boolean; data?: XDraftShowResponse }>(\"/api/ads/x/draft/show\", {\n chatId,\n ref: String(args.ref),\n });\n writeJsonEnvelope(response);\n } catch (err) {\n handleDraftError(err);\n }\n },\n});\n\nregisterSchema({\n command: \"ads.x.draft.amend\",\n description:\n \"Change a staged op in place instead of removing and re-staging it. The patch merges into the payload (JSON merge-patch: `null` deletes a key) and the whole op re-validates.\",\n args: {\n ref: { type: \"positional\", description: \"Op ref or target id\", required: true },\n patch: { type: \"positional\", description: \"JSON object, or @path to a file holding one\", required: true },\n },\n});\n\nconst amendCommand = defineCommand({\n meta: {\n name: \"amend\",\n description: `Change a staged op in place.\n\nExample:\n baker ads x draft amend x_temp_abc '{\"dailyBudgetAmountLocalMicro\": 20000000}'`,\n },\n args: {\n ref: { type: \"positional\", description: \"Op ref or target id\", required: true },\n patch: { type: \"positional\", description: \"JSON object, or @path to a file\", required: true },\n },\n run: async ({ args }) => {\n const raw = String(args.patch);\n let patch: unknown;\n try {\n patch = JSON.parse(raw.startsWith(\"@\") ? readFileSync(raw.slice(1), \"utf8\") : raw);\n } catch {\n failWriteValidation(\"patch must be a JSON object, or @path to a file holding one\");\n }\n if (patch === null || typeof patch !== \"object\" || Array.isArray(patch)) {\n failWriteValidation(\"patch must be a JSON object\");\n }\n try {\n const chatId = requireChatId();\n const response = await apiPost<{ ok: boolean; data?: XDraftStageResponse }>(\"/api/ads/x/draft/amend\", {\n chatId,\n ref: String(args.ref),\n patch,\n });\n writeJsonEnvelope(response);\n } catch (err) {\n handleDraftError(err);\n }\n },\n});\n\nregisterSchema({\n command: \"ads.x.draft.remove\",\n description: \"Drop one staged X op. Removing a create cascades to everything staged that depends on it.\",\n args: { ref: { type: \"positional\", description: \"Op ref or target id\", required: true } },\n});\n\nconst removeCommand = defineCommand({\n meta: {\n name: \"remove\",\n description: \"Drop one staged op (cascades to its dependents). Example: baker ads x draft remove x_temp_abc123\",\n },\n args: { ref: { type: \"positional\", description: \"Op ref or target id\", required: true } },\n run: async ({ args }) => {\n try {\n const chatId = requireChatId();\n const response = await apiPost<{ ok: boolean; data?: XDraftRemoveResponse }>(\"/api/ads/x/draft/remove\", {\n chatId,\n ref: String(args.ref),\n });\n writeJsonEnvelope(response);\n } catch (err) {\n handleDraftError(err);\n }\n },\n});\n\nregisterSchema({\n command: \"ads.x.draft.clear\",\n description: \"Drop every staged X op on this chat. Nothing reached X, so nothing needs reversing.\",\n args: {},\n});\n\nconst clearCommand = defineCommand({\n meta: { name: \"clear\", description: \"Drop every staged X op on this chat. Example: baker ads x draft clear\" },\n args: {},\n run: async () => {\n try {\n const chatId = requireChatId();\n const response = await apiPost<{ ok: boolean; data?: XDraftClearResponse }>(\"/api/ads/x/draft/clear\", { chatId });\n writeJsonEnvelope(response);\n } catch (err) {\n handleDraftError(err);\n }\n },\n});\n\nexport const draftCommand = defineCommand({\n meta: {\n name: \"draft\",\n description: `Review and edit the X Ads changes staged on this chat.\n\nNothing staged has reached X. Everything applies when the chat is published,\nand discarding the chat reverses all of it.\n\nExamples:\n baker ads x draft — the Campaign ▸ Ad group ▸ Ad tree\n baker ads x draft show x_temp_abc123 — one op in full\n baker ads x draft amend x_temp_abc '{\"name\":\"New\"}'\n baker ads x draft remove x_temp_abc123\n baker ads x draft clear`,\n },\n subCommands: {\n list: listCommand,\n show: showCommand,\n amend: amendCommand,\n remove: removeCommand,\n clear: clearCommand,\n },\n // A parent must never declare `run`: citty falls through to it AFTER running\n // the matched subcommand, so every edit would also trigger a full list.\n args: { json: { type: \"boolean\", description: \"Raw JSON envelope\" }, chat: CHAT_READ_ARG },\n default: \"list\",\n});\n","import type { XDraftListResponse, XDraftOpView, XDraftStatusCollection, XDraftStatusNode } from \"@baker/api\";\n\n/**\n * Render the staged X draft as a readable Campaign ▸ Ad group ▸ Ad tree — the\n * counterpart to the Google and LinkedIn renderers, using the identical node\n * shape. Pure: takes the draft-list response, returns text.\n */\n\nconst OPERATION_LABELS: Record<string, string> = {\n create: \"Creating\",\n update: \"Updating\",\n pause: \"Pausing\",\n resume: \"Resuming\",\n remove: \"Removing\",\n};\n\nfunction badge(node: XDraftStatusNode): string {\n const label = node.operation ? OPERATION_LABELS[node.operation] : undefined;\n return label ?? (node.existing ? \"on X\" : \"staged\");\n}\n\nfunction collectionLine(collection: XDraftStatusCollection): string | undefined {\n const parts: string[] = [];\n if (collection.added > 0) {\n parts.push(`+${collection.added}`);\n }\n if (collection.existing > 0) {\n parts.push(`${collection.existing} existing`);\n }\n if (collection.removed > 0) {\n parts.push(`-${collection.removed}`);\n }\n return parts.length > 0 ? `${collection.label}: ${parts.join(\", \")}` : undefined;\n}\n\n/**\n * Every ad account the tree touches. A draft may span several, and two accounts\n * can hold identically-named campaigns — so the account is printed on each node\n * once there is more than one, and left off when there is not.\n */\nfunction accountsInTree(nodes: readonly XDraftStatusNode[]): Set<string> {\n const accounts = new Set<string>();\n const walk = (node: XDraftStatusNode): void => {\n accounts.add(node.accountId);\n for (const child of node.children) {\n walk(child);\n }\n };\n for (const node of nodes) {\n walk(node);\n }\n return accounts;\n}\n\nfunction renderNode(node: XDraftStatusNode, depth: number, showAccount: boolean, out: string[]): void {\n const indent = \" \".repeat(depth);\n const account = showAccount ? ` [${node.accountId}]` : \"\";\n out.push(`${indent}${node.entity}: ${node.name} — ${badge(node)}${account}`);\n for (const collection of node.collections) {\n const line = collectionLine(collection);\n if (line) {\n out.push(`${indent} ${line}`);\n }\n }\n for (const warning of node.warnings ?? []) {\n out.push(`${indent} ! ${warning}`);\n }\n for (const child of node.children) {\n renderNode(child, depth + 1, showAccount, out);\n }\n}\n\nconst NO_CHANGES = \"No X Ads changes staged\";\n\nconst STATUS_HEADINGS: Record<string, string> = {\n active: \"staged\",\n publishing: \"publishing\",\n applied: \"published\",\n discarded: \"discarded\",\n};\n\nfunction didNotApply(op: XDraftOpView): boolean {\n return op.result?.status === \"failed\" || op.result?.status === \"skipped\";\n}\n\nfunction didApply(op: XDraftOpView): boolean {\n return op.result?.status === \"applied\" || op.result?.status === \"simulated\";\n}\n\n/**\n * The outcome line, which is the authoritative record after a publish: a draft\n * still reading `publishing` minutes later did not finish, whatever X shows.\n */\nfunction headingLine(draft: XDraftListResponse): string {\n const heading = STATUS_HEADINGS[draft.status] ?? draft.status;\n if (draft.status !== \"applied\" && draft.status !== \"publishing\") {\n return `X Ads: ${draft.count} change${draft.count === 1 ? \"\" : \"s\"} ${heading}`;\n }\n const applied = draft.ops.filter(didApply).length;\n const failed = draft.ops.filter(didNotApply).length;\n return `X Ads: ${heading} · ${applied} applied${failed > 0 ? `, ${failed} failed` : \"\"}`;\n}\n\nfunction problemLines(draft: XDraftListResponse): string[] {\n return draft.ops.filter(didNotApply).map((op) => {\n const reason =\n op.result?.error ?? `skipped: waiting on ${op.result?.skippedBecause ?? \"a change that did not apply\"}`;\n return `✗ ${op.summary} — failed: ${reason}`;\n });\n}\n\nexport function renderDraftStatus(draft: XDraftListResponse): string {\n if (draft.status === \"none\" || draft.count === 0) {\n return NO_CHANGES;\n }\n const out: string[] = [headingLine(draft), \"\"];\n const tree = draft.tree ?? [];\n const showAccount = accountsInTree(tree).size > 1;\n for (const node of tree) {\n renderNode(node, 0, showAccount, out);\n }\n const problems = problemLines(draft);\n if (problems.length > 0) {\n out.push(\"\", ...problems);\n }\n return out.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/ads/chatgpt/draft.ts","../src/commands/ads/chatgpt/draft-status.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport type {\n ChatgptDraftClearResponse,\n ChatgptDraftListResponse,\n ChatgptDraftRemoveResponse,\n ChatgptDraftShowResponse,\n ChatgptDraftStageResponse,\n} from \"@baker/api/ads-chatgpt\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { requireChatId, resolveChatId } from \"../../../env.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { CHAT_READ_ARG } from \"../../chat-arg.ts\";\nimport { writeJsonEnvelope } from \"../output.ts\";\nimport { renderChatgptDraftStatus } from \"./draft-status.ts\";\nimport { CHATGPT_ADS_REFERENCE, chatgptFailure } from \"./shared.ts\";\nimport { failWriteValidation, schemaArgs } from \"./write-shared.ts\";\n\n/**\n * Review and edit the ChatGPT Ads changes staged on this chat. Nothing staged\n * has reached ChatGPT Ads; it all applies when the chat is published.\n */\n\n/** The ChatGPT Ads routes answer with the payload itself; the envelope is the CLI's to add. */\nasync function run<T>(call: () => Promise<T>): Promise<void> {\n try {\n writeJsonEnvelope({ ok: true, data: await call() });\n } catch (err) {\n writeJsonEnvelope({ ...chatgptFailure(err, CHATGPT_ADS_REFERENCE.overview) });\n process.exit(1);\n }\n}\n\nconst LIST_ARGS = {\n json: { type: \"boolean\", description: \"Print the raw JSON envelope instead of the readable tree\" },\n chat: CHAT_READ_ARG,\n} as const;\n\nregisterSchema({\n command: \"ads.chatgpt.draft\",\n description:\n \"Review everything staged for ChatGPT Ads on this chat as a Campaign ▸ Ad group ▸ Ad tree. After a publish this is the authoritative record: `published · N applied`, or a `✗ … failed:` line per change that did not land, with ChatGPT Ads' reason.\",\n args: schemaArgs(LIST_ARGS),\n});\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description: \"Review everything staged as a Campaign ▸ Ad group ▸ Ad tree. Example: baker ads chatgpt draft\",\n },\n args: LIST_ARGS,\n run: async ({ args }) => {\n try {\n const draft = await apiPost<ChatgptDraftListResponse>(\"/api/ads/chatgpt/draft\", {\n chatId: resolveChatId(args.chat),\n });\n if (args.json === true) {\n writeJsonEnvelope({ ok: true, data: draft });\n return;\n }\n process.stdout.write(`${renderChatgptDraftStatus(draft)}\\n`);\n } catch (err) {\n writeJsonEnvelope({ ...chatgptFailure(err, CHATGPT_ADS_REFERENCE.overview) });\n process.exit(1);\n }\n },\n});\n\nconst SHOW_ARGS = {\n ref: {\n type: \"positional\",\n description: \"Op ref (chatgpt_temp_* for creates), or the target id for a staged update\",\n required: true,\n },\n chat: CHAT_READ_ARG,\n} as const;\n\nregisterSchema({\n command: \"ads.chatgpt.draft.show\",\n description:\n \"The full staged payload, warnings and before-snapshot for one change — the receipt to check before publishing.\",\n args: schemaArgs(SHOW_ARGS),\n});\n\nconst showCommand = defineCommand({\n meta: {\n name: \"show\",\n description: \"Show one staged change in full. Example: baker ads chatgpt draft show chatgpt_temp_ab12\",\n },\n args: SHOW_ARGS,\n run: async ({ args }) => {\n await run(() =>\n apiPost<ChatgptDraftShowResponse>(\"/api/ads/chatgpt/draft/show\", {\n chatId: resolveChatId(args.chat),\n ref: String(args.ref),\n }),\n );\n },\n});\n\nconst AMEND_ARGS = {\n ref: { type: \"positional\", description: \"Op ref or target id\", required: true },\n patch: { type: \"positional\", description: \"JSON object, or @path to a file holding one\", required: true },\n} as const;\n\nregisterSchema({\n command: \"ads.chatgpt.draft.amend\",\n description:\n \"Change a staged op in place instead of removing and re-staging it. The patch merges into the payload (JSON merge-patch: `null` deletes a key; money is in micros) and the whole op re-validates.\",\n args: schemaArgs(AMEND_ARGS),\n});\n\nconst amendCommand = defineCommand({\n meta: {\n name: \"amend\",\n description: `Change a staged op in place. Money in the payload is micros: 20 = 20000000.\n\nExample:\n baker ads chatgpt draft amend chatgpt_temp_ab12 '{\"dailyBudgetMicros\": 30000000}'`,\n },\n args: AMEND_ARGS,\n run: async ({ args }) => {\n const raw = String(args.patch);\n let patch: unknown;\n try {\n patch = JSON.parse(raw.startsWith(\"@\") ? readFileSync(raw.slice(1), \"utf8\") : raw);\n } catch {\n failWriteValidation(\"patch must be a JSON object, or @path to a file holding one\");\n }\n if (patch === null || typeof patch !== \"object\" || Array.isArray(patch)) {\n failWriteValidation(\"patch must be a JSON object\");\n }\n await run(() =>\n apiPost<ChatgptDraftStageResponse>(\"/api/ads/chatgpt/draft/amend\", {\n chatId: requireChatId(),\n ref: String(args.ref),\n patch,\n }),\n );\n },\n});\n\nconst REMOVE_ARGS = { ref: { type: \"positional\", description: \"Op ref or target id\", required: true } } as const;\n\nregisterSchema({\n command: \"ads.chatgpt.draft.remove\",\n description: \"Drop one staged ChatGPT Ads change. Removing a create also drops everything staged under it.\",\n args: schemaArgs(REMOVE_ARGS),\n});\n\nconst removeCommand = defineCommand({\n meta: {\n name: \"remove\",\n description:\n \"Drop one staged change (and what depends on it). Example: baker ads chatgpt draft remove chatgpt_temp_ab12\",\n },\n args: REMOVE_ARGS,\n run: async ({ args }) => {\n await run(() =>\n apiPost<ChatgptDraftRemoveResponse>(\"/api/ads/chatgpt/draft/remove\", {\n chatId: requireChatId(),\n ref: String(args.ref),\n }),\n );\n },\n});\n\nregisterSchema({\n command: \"ads.chatgpt.draft.clear\",\n description:\n \"Drop every staged ChatGPT Ads change on this chat. Nothing reached ChatGPT Ads, so nothing needs reversing.\",\n args: {},\n});\n\nconst clearCommand = defineCommand({\n meta: {\n name: \"clear\",\n description: \"Drop every staged ChatGPT Ads change on this chat. Example: baker ads chatgpt draft clear\",\n },\n args: {},\n run: async () => {\n await run(() =>\n apiPost<ChatgptDraftClearResponse>(\"/api/ads/chatgpt/draft/clear\", {\n chatId: requireChatId(),\n }),\n );\n },\n});\n\nexport const draftCommand = defineCommand({\n meta: {\n name: \"draft\",\n description: `Review and edit the ChatGPT Ads changes staged on this chat.\n\nNothing staged has reached ChatGPT Ads. Everything applies when the chat is\npublished, and discarding the chat drops all of it.\n\nExamples:\n baker ads chatgpt draft — the Campaign ▸ Ad group ▸ Ad tree\n baker ads chatgpt draft show chatgpt_temp_ab12 — one change in full\n baker ads chatgpt draft amend chatgpt_temp_ab12 '{\"name\":\"New\"}'\n baker ads chatgpt draft remove chatgpt_temp_ab12\n baker ads chatgpt draft clear`,\n },\n subCommands: {\n list: listCommand,\n show: showCommand,\n amend: amendCommand,\n remove: removeCommand,\n clear: clearCommand,\n },\n // A parent must never declare `run`: citty falls through to it after the\n // matched subcommand, so every edit would also print the whole draft.\n args: LIST_ARGS,\n default: \"list\",\n});\n","import type { ChatgptDraftListResponse, ChatgptDraftOpView, ChatgptDraftStatusNode } from \"@baker/api/ads-chatgpt\";\n\n/**\n * The staged ChatGPT Ads draft as a readable Campaign ▸ Ad group ▸ Ad tree.\n * After a publish its first line is the authoritative record: a draft still\n * reading `publishing` minutes later did not finish, whatever ChatGPT Ads shows.\n */\n\nconst OPERATION_LABELS: Record<string, { staged: string; done: string; notDone: string }> = {\n create: { staged: \"Creating\", done: \"Created\", notDone: \"Not created\" },\n update: { staged: \"Updating\", done: \"Updated\", notDone: \"Not updated\" },\n pause: { staged: \"Pausing\", done: \"Paused\", notDone: \"Not paused\" },\n resume: { staged: \"Resuming\", done: \"Resumed\", notDone: \"Not resumed\" },\n archive: { staged: \"Archiving\", done: \"Archived\", notDone: \"Not archived\" },\n};\n\nconst STATUS_HEADINGS: Record<string, string> = {\n active: \"staged\",\n publishing: \"publishing\",\n applied: \"published\",\n discarded: \"discarded\",\n};\n\nfunction badge(node: ChatgptDraftStatusNode): string {\n const label = node.operation ? OPERATION_LABELS[node.operation] : undefined;\n if (!label) {\n return node.existing ? \"on ChatGPT Ads\" : \"staged\";\n }\n if (node.outcome === \"applied\") {\n return label.done;\n }\n return node.outcome ? `${label.notDone} (${node.outcome})` : label.staged;\n}\n\nfunction renderNode(node: ChatgptDraftStatusNode, depth: number, out: string[]): void {\n const indent = \" \".repeat(depth);\n out.push(`${indent}${node.entity}: ${node.name} — ${badge(node)}`);\n for (const warning of node.warnings ?? []) {\n out.push(`${indent} ! ${warning}`);\n }\n for (const child of node.children) {\n renderNode(child, depth + 1, out);\n }\n}\n\nfunction didNotApply(op: ChatgptDraftOpView): boolean {\n return op.result?.status === \"failed\" || op.result?.status === \"skipped\";\n}\n\nfunction didApply(op: ChatgptDraftOpView): boolean {\n return op.result?.status === \"applied\" || op.result?.status === \"simulated\";\n}\n\nfunction headingLine(draft: ChatgptDraftListResponse): string {\n const heading = STATUS_HEADINGS[draft.status] ?? draft.status;\n if (draft.status !== \"applied\" && draft.status !== \"publishing\") {\n return `ChatGPT Ads: ${draft.count} change${draft.count === 1 ? \"\" : \"s\"} ${heading}`;\n }\n const applied = draft.ops.filter(didApply).length;\n const failed = draft.ops.filter(didNotApply).length;\n return `ChatGPT Ads: ${heading} · ${applied} applied${failed > 0 ? `, ${failed} failed` : \"\"}`;\n}\n\nexport function renderChatgptDraftStatus(draft: ChatgptDraftListResponse): string {\n if (draft.status === \"none\" || draft.count === 0) {\n return \"No ChatGPT Ads changes staged\";\n }\n const out = [headingLine(draft), \"\"];\n for (const node of draft.tree ?? []) {\n renderNode(node, 0, out);\n }\n const summaryByRef = new Map(draft.ops.map((op) => [op.ref, op.summary]));\n const problems = draft.ops.filter(didNotApply).map((op) => {\n if (op.result?.status === \"failed\") {\n return `✗ ${op.summary} — failed: ${op.result.error ?? \"ChatGPT Ads gave no reason\"}`;\n }\n const waitedOn = op.result?.skippedBecause;\n const parent = (waitedOn && summaryByRef.get(waitedOn)) ?? \"a change that did not apply\";\n return `✗ ${op.summary} — skipped: waiting on ${parent}, which did not apply`;\n });\n if (problems.length > 0) {\n out.push(\"\", ...problems);\n }\n return out.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/ga4/draft.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { CHAT_READ_ARG } from \"../chat-arg.ts\";\nimport { draftAction, draftList, loadJsonArg, requireTarget } from \"./shared.ts\";\n\nregisterSchema({\n command: \"ga4.draft\",\n description:\n \"Review and undo the Google Analytics changes staged on this chat. Use `list` to see everything staged, `show` to inspect one change in full before the chat completes, `amend` to correct one in place, and `remove`/`clear` to drop them. `list` and `show` take --chat <id> to read an earlier chat's changes instead.\",\n args: {\n json: { type: \"boolean\", description: \"Print the raw JSON envelope instead of the readable list\", required: false },\n chat: { type: \"string\", description: CHAT_READ_ARG.description, required: false },\n },\n});\n\nexport const draftCommand = defineCommand({\n meta: {\n name: \"draft\",\n description:\n \"List, show, amend, remove or clear the Google Analytics changes staged on this chat. `list` and `show` take --chat <id> to read an earlier chat's changes instead.\",\n },\n subCommands: {\n list: defineCommand({\n meta: { name: \"list\", description: \"Review everything staged on this chat (--json for the raw envelope)\" },\n args: {\n json: { type: \"boolean\", description: \"Print the raw JSON envelope\", required: false },\n chat: CHAT_READ_ARG,\n },\n run: async ({ args }) => {\n await draftList(args.json === true, args.chat);\n },\n }),\n show: defineCommand({\n meta: {\n name: \"show\",\n description:\n \"Print the full staged payload for one change, alongside how the property looks today — the receipt to verify it before the chat completes (never truncated).\",\n },\n args: {\n ref: { type: \"positional\", description: \"Staged ref or target id\", required: false },\n chat: CHAT_READ_ARG,\n },\n run: async ({ args }) => {\n await draftAction(\n \"/api/ga4/draft/show\",\n { ref: requireTarget(args as Record<string, unknown>, \"change\") },\n args.chat,\n );\n },\n }),\n amend: defineCommand({\n meta: {\n name: \"amend\",\n description:\n \"Update a staged change in place — merges a JSON patch into its payload (objects deep-merge, null deletes a key, arrays/scalars replace) and re-runs every check. Use this instead of remove + re-create.\",\n },\n args: {\n ref: { type: \"positional\", description: \"Staged ref or target id\", required: false },\n patch: { type: \"string\", description: \"Inline JSON patch object\", required: false },\n file: { type: \"string\", description: \"JSON file with the patch object\", required: false },\n },\n run: async ({ args }) => {\n await draftAction(\"/api/ga4/draft/amend\", {\n ref: requireTarget(args as Record<string, unknown>, \"change\"),\n patch: loadJsonArg(args as Record<string, unknown>, \"patch\"),\n });\n },\n }),\n remove: defineCommand({\n meta: { name: \"remove\", description: \"Remove one staged change\" },\n args: { ref: { type: \"positional\", description: \"Staged ref or target id\", required: false } },\n run: async ({ args }) => {\n await draftAction(\"/api/ga4/draft/remove\", {\n ref: requireTarget(args as Record<string, unknown>, \"change\"),\n });\n },\n }),\n clear: defineCommand({\n meta: { name: \"clear\", description: \"Discard all Google Analytics changes staged on this chat\" },\n run: async () => {\n await draftAction(\"/api/ga4/draft/clear\", {});\n },\n }),\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,WAAW,aAAa,4DAA4D,UAAU,MAAM;AAAA,IAClH,MAAM,EAAE,MAAM,UAAU,aAAa,cAAc,aAAa,UAAU,MAAM;AAAA,EAClF;AACF,CAAC;AAEM,IAAM,eAAe,cAAc;AAAA,EACxC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,aAAa;AAAA,IACX,MAAM,cAAc;AAAA,MAClB,MAAM,EAAE,MAAM,QAAQ,aAAa,sEAAsE;AAAA,MACzG,MAAM;AAAA,QACJ,MAAM,EAAE,MAAM,WAAW,aAAa,+BAA+B,UAAU,MAAM;AAAA,QACrF,MAAM;AAAA,MACR;AAAA,MACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,cAAM,UAAU,KAAK,SAAS,MAAM,KAAK,IAAI;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,IACD,MAAM,cAAc;AAAA,MAClB,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACJ,KAAK,EAAE,MAAM,cAAc,aAAa,2BAA2B,UAAU,MAAM;AAAA,QACnF,MAAM;AAAA,MACR;AAAA,MACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,cAAM;AAAA,UACJ;AAAA,UACA,EAAE,KAAK,cAAc,MAAiC,QAAQ,EAAE;AAAA,UAChE,KAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,OAAO,cAAc;AAAA,MACnB,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACJ,KAAK,EAAE,MAAM,cAAc,aAAa,2BAA2B,UAAU,MAAM;AAAA,QACnF,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,QAClF,MAAM,EAAE,MAAM,UAAU,aAAa,mCAAmC,UAAU,MAAM;AAAA,MAC1F;AAAA,MACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,cAAM,YAAY,wBAAwB;AAAA,UACxC,KAAK,cAAc,MAAiC,QAAQ;AAAA,UAC5D,OAAO,YAAY,MAAiC,OAAO;AAAA,QAC7D,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,IACD,QAAQ,cAAc;AAAA,MACpB,MAAM,EAAE,MAAM,UAAU,aAAa,2BAA2B;AAAA,MAChE,MAAM,EAAE,KAAK,EAAE,MAAM,cAAc,aAAa,2BAA2B,UAAU,MAAM,EAAE;AAAA,MAC7F,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,cAAM,YAAY,yBAAyB;AAAA,UACzC,KAAK,cAAc,MAAiC,QAAQ;AAAA,QAC9D,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,IACD,OAAO,cAAc;AAAA,MACnB,MAAM,EAAE,MAAM,SAAS,aAAa,2DAA2D;AAAA,MAC/F,KAAK,YAAY;AACf,cAAM,YAAY,wBAAwB,CAAC,CAAC;AAAA,MAC9C;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/ads/linkedin/index.ts","../src/commands/ads/linkedin/schemas.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport \"./schemas.ts\"; // side-effect import: registers `baker schema ads.linkedin.*` entries\n\n/**\n * LinkedIn Ads CLI — designed around LinkedIn's distinguishing strength:\n * firmographic (per-job-title, per-company, per-industry, per-seniority)\n * pivots on adAnalytics. AI agents should reach for `linkedin analytics\n * --pivot job-title` and `--pivot company` when answering ABM/persona\n * questions — Meta and Google can't do that.\n *\n * Read-only v1. All analytics queries default to `--level account --intent\n * baseline --granularity DAILY --last-days 7`. When pivoting on a MEMBER_*\n * dimension, the CLI auto-forces granularity=ALL (LinkedIn rejects\n * DAILY + demographic) and surfaces a \"demographic delayed 12-24h\" warning.\n *\n * Authentication: requires the LinkedIn integration to be connected in the\n * dashboard with `r_ads` and `r_ads_reporting` scopes. CLI talks to Baker's\n * backend, which holds the OAuth token.\n */\nexport const linkedinCommand = defineCommand({\n meta: {\n name: \"linkedin\",\n description: `LinkedIn Marketing API — AI-first command surface for B2B ad insights.\n\nDiscovery:\n baker ads linkedin accounts — accounts in this company's connected scope\n baker ads linkedin account --account-id 503001492 — single-account detail (currency, type, status)\n baker ads linkedin url-params [--ad-sets] — UTMs in effect today, and keys set at two levels\n baker ads linkedin account-users — who is on the ad account, their role, who connected LinkedIn\n\nHierarchy (default ACTIVE-only — pass --all-statuses to widen):\n baker ads linkedin campaign-groups --account-id 503001492\n baker ads linkedin campaigns --account-id 503001492\n baker ads linkedin campaigns --account-id 503001492 --campaign-group-id 12345\n baker ads linkedin creatives --account-id 503001492 --campaign-id 67890\n baker ads linkedin creatives get <id> — one ad: headline, landing URL, form, review, why not serving\n baker ads linkedin lead-forms — lead gen forms: state, version, questions\n\nRevenue (CRM deals credited to the ads; needs Business Manager + CRM):\n baker ads linkedin revenue [--pivot campaign|campaign-group|account] [--start --end]\n\nPerformance — the workhorse (3 axes):\n baker ads linkedin analytics — defaults: level=account, intent=baseline, last_7d, DAILY\n baker ads linkedin analytics --intent revenue --last-days 28\n baker ads linkedin analytics --level campaign --campaign-id 1234 --pivot job-title — LinkedIn's superpower (per-title perf)\n baker ads linkedin analytics --level campaign --campaign-id 1234 --pivot company — top companies seeing the ad (ABM gold; names auto-resolved)\n baker ads linkedin companies --last-months 12 --by month — which companies the ads reached, per month (ABM / warm accounts)\n baker ads linkedin resolve --urns urn:li:organization:17719 — resolve org URNs to company names\n baker ads linkedin analytics --level campaign --campaign-id 1234 --intent ranking — fatigue: derives frequency\n baker ads linkedin analytics --list-intents\n baker ads linkedin analytics --list-pivots\n\nStaged writes (never hit LinkedIn directly — ops stage on this chat's draft,\nshow in the dashboard as pending LinkedIn changes, and apply when the chat is\npublished, at which point they reach the real ad account):\n baker ads linkedin account url-params — UTMs for every ad in the account\n baker ads linkedin campaign-groups create|update|pause|resume|duplicate|delete\n baker ads linkedin campaigns create|update|pause|resume|archive|duplicate|delete\n baker ads linkedin creatives create|update|pause|resume|duplicate|delete\n baker ads linkedin audiences create|upload|delete\n baker ads linkedin conversions create|update\n baker ads linkedin lead-forms create|update|publish|archive\n baker ads linkedin experiments create|update|start|pause|end — A/B test two ad sets (list/get to read)\n baker ads linkedin draft list — review staged ops\n baker ads linkedin draft remove <ref> — undo one (draft clear: all)\n\nAccount ID format:\n --account-id accepts numeric (503001492) or URN (urn:li:sponsoredAccount:503001492).\n Set BAKER_LINKEDIN_AD_ACCOUNT_ID env to skip --account-id on every call.\nFull guide: __tooling__/docs/tools/baker/ads-linkedin.md`,\n },\n subCommands: {\n accounts: () => import(\"./accounts.ts\").then((m) => m.accountsCommand),\n account: () => import(\"./account.ts\").then((m) => m.accountCommand),\n \"account-users\": () => import(\"./account-users.ts\").then((m) => m.accountUsersCommand),\n \"campaign-groups\": () => import(\"./campaign-groups.ts\").then((m) => m.campaignGroupsCommand),\n campaigns: () => import(\"./campaigns.ts\").then((m) => m.campaignsCommand),\n creatives: () => import(\"./creatives.ts\").then((m) => m.creativesCommand),\n audiences: () => import(\"./write-commands.ts\").then((m) => m.audiencesCommand),\n \"lead-forms\": () => import(\"./write-commands.ts\").then((m) => m.leadFormsCommand),\n experiments: () => import(\"./experiments.ts\").then((m) => m.experimentsCommand),\n draft: () => import(\"./draft.ts\").then((m) => m.linkedinDraftCommand),\n analytics: () => import(\"./analytics.ts\").then((m) => m.analyticsCommand),\n demographics: () => import(\"./demographics.ts\").then((m) => m.demographicsCommand),\n companies: () => import(\"./companies.ts\").then((m) => m.companiesCommand),\n \"top-companies\": () => import(\"./top-companies.ts\").then((m) => m.topCompaniesCommand),\n resolve: () => import(\"./resolve.ts\").then((m) => m.resolveCommand),\n facets: () => import(\"./facets.ts\").then((m) => m.facetsCommand),\n \"audience-size\": () => import(\"./audience-size.ts\").then((m) => m.audienceSizeCommand),\n \"bid-pricing\": () => import(\"./bid-pricing.ts\").then((m) => m.bidPricingCommand),\n forecast: () => import(\"./forecast.ts\").then((m) => m.forecastCommand),\n leads: () => import(\"./leads.ts\").then((m) => m.leadsCommand),\n revenue: () => import(\"./revenue.ts\").then((m) => m.revenueCommand),\n conversions: () => import(\"./conversions.ts\").then((m) => m.conversionsCommand),\n conversation: () => import(\"./conversation.ts\").then((m) => m.conversationCommand),\n audit: () => import(\"./audit.ts\").then((m) => m.auditCommand),\n \"url-params\": () => import(\"./url-params.ts\").then((m) => m.urlParamsCommand),\n },\n});\n","import { AVAILABLE_ARG } from \"../../../available-accounts.ts\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { CHAT_READ_ARG } from \"../../chat-arg.ts\";\nimport { statusesArgDescription } from \"./shared.ts\";\nimport { TOTAL_BUDGET_HELP } from \"./write-shared.ts\";\n\nconst CHAT_READ_ARG_DESCRIPTION = CHAT_READ_ARG.description;\n\n// Single file rather than per-command. Imported from ./index.ts so registration\n// runs at CLI startup. Mirrors the surface visible to AI agents via\n// `baker schema ads.linkedin.<name>`.\n\nregisterSchema({\n command: \"ads.linkedin.accounts\",\n description: \"List LinkedIn ad accounts in the company's connected scope.\",\n args: {\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n available: AVAILABLE_ARG,\n },\n});\n\nconst accountDetailSchema = {\n description:\n \"Single LinkedIn ad account detail (currency, status, type). Resolves the urn → {id, name, currency, status, type}.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric ID or urn:li:sponsoredAccount:N\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n} as const;\n\n// `account` with no subcommand still runs the detail read, so both names answer.\nregisterSchema({ command: \"ads.linkedin.account\", ...accountDetailSchema });\nregisterSchema({ command: \"ads.linkedin.account.detail\", ...accountDetailSchema });\n\nregisterSchema({\n command: \"ads.linkedin.campaign-groups\",\n description: \"List LinkedIn campaign groups in an account. Default ACTIVE-only — pass --all-statuses to widen.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\", required: false },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the ACTIVE filter\", required: false },\n statuses: { type: \"string\", description: statusesArgDescription(\"campaignGroups\"), required: false },\n limit: { type: \"string\", description: \"Max rows (default 500)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns\",\n description:\n \"List LinkedIn campaigns. Returns audit-relevant settings (audienceExpansionEnabled, offsiteDeliveryEnabled, optimizationTargetType, costType, budgets, runSchedule, targetingCriteria).\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-group-id\": { type: \"string\", description: \"Filter by campaign group\", required: false },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the ACTIVE filter\", required: false },\n statuses: { type: \"string\", description: statusesArgDescription(\"campaigns\"), required: false },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.creatives\",\n description:\n \"List LinkedIn creatives. Compact by default: id, urn, campaign, status, review status, format, and the resolved destination (landingUrl, or postUrn for post-based ads). The opaque 'content' block is NOT returned unless you pass --full; --fields takes dotted paths for anything narrower.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-id\": { type: \"string\", description: \"Filter by campaign\", required: false },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the ACTIVE filter\", required: false },\n statuses: { type: \"string\", description: statusesArgDescription(\"creatives\"), required: false },\n fields: {\n type: \"string\",\n description: \"CSV of dotted paths to return instead of the compact row, e.g. id,content.textAd.landingPage\",\n required: false,\n },\n full: {\n type: \"boolean\",\n description: \"Return the complete raw records, including the opaque 'content' block\",\n required: false,\n },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.analytics\",\n description:\n \"Performance reporting (3-axis: --level × --intent × --pivot). LinkedIn's superpower: pivot=job-title|company|industry|seniority. Demographic pivots auto-force granularity=ALL and surface a delayed-data warning.\",\n args: {\n level: {\n type: \"string\",\n description: \"account|campaign-group|campaign|creative\",\n required: false,\n default: \"account\",\n },\n \"account-id\": { type: \"string\", description: \"When level=account\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-group-id\": { type: \"string\", description: \"CSV when level=campaign-group\", required: false },\n \"campaign-id\": { type: \"string\", description: \"CSV when level=campaign\", required: false },\n \"creative-id\": { type: \"string\", description: \"CSV when level=creative\", required: false },\n ids: { type: \"string\", description: \"Generic CSV alternative\", required: false },\n intent: {\n type: \"string\",\n description: \"Field bundle\",\n required: false,\n default: \"baseline\",\n enum: [\n \"baseline\",\n \"revenue\",\n \"funnel\",\n \"engagement\",\n \"video\",\n \"lead-gen\",\n \"inmail\",\n \"document\",\n \"ranking\",\n \"identity\",\n ],\n },\n pivot: {\n type: \"string\",\n description: \"Demographic / firmographic dim\",\n required: false,\n default: \"none\",\n enum: [\n \"none\",\n \"campaign\",\n \"campaign-group\",\n \"creative\",\n \"company\",\n \"account\",\n \"conversion\",\n \"job-title\",\n \"job-function\",\n \"seniority\",\n \"industry\",\n \"company-size\",\n \"country\",\n \"region\",\n \"dma\",\n \"device\",\n \"placement\",\n \"serving-location\",\n \"card-index\",\n \"objective\",\n \"conversation-node\",\n \"conversation-node-button\",\n ],\n },\n metrics: { type: \"string\", description: \"CSV metric override (escape hatch)\", required: false },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 7)\", required: false },\n granularity: {\n type: \"string\",\n description: \"DAILY|MONTHLY|YEARLY|ALL\",\n required: false,\n default: \"DAILY\",\n enum: [\"DAILY\", \"MONTHLY\", \"YEARLY\", \"ALL\"],\n },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"no-sort\": { type: \"boolean\", description: \"Skip default sort\", required: false },\n \"list-intents\": { type: \"boolean\", description: \"List intents and exit\", required: false },\n \"list-pivots\": { type: \"boolean\", description: \"List pivots and exit\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.demographics\",\n description:\n \"Sweep all firmographic pivots (job-title, company, industry, seniority, function, company-size) in one call. Returns top-N rows per pivot.\",\n args: {\n \"campaign-id\": { type: \"string\", description: \"CSV campaign IDs\", required: true },\n pivots: { type: \"string\", description: \"CSV of pivots (default: all firmographic)\", required: false },\n \"top-n\": { type: \"string\", description: \"Top rows per pivot (default 10)\", required: false },\n intent: { type: \"string\", description: \"Field bundle\", required: false, default: \"baseline\" },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 30)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.companies\",\n description:\n \"Which companies the LinkedIn ads reached — one row per company over the whole period ({org, name, impressions, clicks, engagements, costLocal}), most engaged first. Start here for warm accounts / ABM reporting. Defaults: last 12 calendar months, the only selected ad account, 100 companies a page (--page N for the next, --full for all; totalCompanies counts them all). --by month|campaign adds a months[] or campaigns[] breakdown; --with-domains adds domain + domainSource for CRM matching; --stats adds row counts and cost/reach/domain coverage (no names). LinkedIn drops companies under 3 events a month.\",\n args: {\n \"account-id\": {\n type: \"string\",\n description: \"Ad account id (numeric or urn:li:sponsoredAccount:N). Default: the only selected account\",\n required: false,\n },\n \"campaign-id\": { type: \"string\", description: \"CSV campaign ids — read only these campaigns\", required: false },\n \"last-months\": {\n type: \"string\",\n description: \"Calendar months back incl. this one (1-24, default 12)\",\n required: false,\n },\n start: { type: \"string\", description: \"YYYY-MM-DD (instead of --last-months)\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD (default today)\", required: false },\n by: { type: \"string\", description: \"none | month | campaign (default none)\", required: false },\n \"with-domains\": { type: \"boolean\", description: \"Add website domain + domainSource per company\", required: false },\n \"min-impressions\": { type: \"string\", description: \"Leave out companies under N impressions\", required: false },\n full: { type: \"boolean\", description: \"Every company, plus videoViews\", required: false },\n page: {\n type: \"string\",\n description: \"Which page of 100 companies, most engaged first (default 1)\",\n required: false,\n },\n stats: { type: \"boolean\", description: \"Add read-quality stats (counts and rates only)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.top-companies\",\n description:\n \"Top companies whose employees saw / clicked / converted. Wrapper for analytics --pivot company. The ABM feedback loop.\",\n args: {\n \"campaign-id\": { type: \"string\", description: \"CSV campaign IDs\", required: true },\n intent: { type: \"string\", description: \"Field bundle (default baseline)\", required: false },\n \"top-n\": { type: \"string\", description: \"Top rows by impressions (default 25)\", required: false },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 30)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.resolve\",\n description:\n \"Resolve organization URNs (from top-companies / analytics --pivot company) to company names. With --with-domains, returns each org's LinkedIn page (vanityName), website and registrable domain instead — ready to match against CRM company domains. domainSource: website (the org's own domain), subdomain (e.g. news.microsoft.com → microsoft.com; lower confidence), none (shortlink/redirector or no website). Unknown ids come back in errors.\",\n args: {\n urns: { type: \"string\", description: \"Comma-separated org URNs (urn:li:organization:NNN)\", required: false },\n ids: { type: \"string\", description: \"Comma-separated bare org ids (17719,19022)\", required: false },\n \"with-domains\": {\n type: \"boolean\",\n description: \"Return vanityName, website, domain and domainSource per org (+ errors for unknown ids)\",\n required: false,\n },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.facets.list\",\n description:\n \"List every targeting facet LinkedIn supports (industries, seniorities, titles, employers, growthRate, etc).\",\n args: {\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.facets.values\",\n description:\n \"Look up entity values for a facet — full list (q=adTargetingFacet) or typeahead search (q=typeahead, with --query).\",\n args: {\n facet: { type: \"string\", description: \"Facet name (industries) or URN\", required: true },\n query: { type: \"string\", description: \"Typeahead query (auto-switches finder)\", required: false },\n finder: { type: \"string\", description: \"adTargetingFacet|typeahead|similarEntities\", required: false },\n locale: { type: \"string\", description: \"Locale (default en_US)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audience-size\",\n description:\n \"Estimate audience size for a targetingCriteria payload. Returns total + active + playbook §04 sweet-spot warnings.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria\", required: false },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.bid-pricing\",\n description:\n \"LinkedIn's suggested bid (min/default/max), bid limits and daily budget range for a targeting + objective + bid type, in the account's currency, plus the playbook §06 floor (2/3 of suggested).\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n objective: {\n type: \"string\",\n description: \"Objective type (LEAD_GENERATION, WEBSITE_VISIT, etc.)\",\n required: true,\n },\n \"cost-type\": {\n type: \"string\",\n description: \"CPC|CPM|CPV\",\n required: false,\n default: \"CPC\",\n enum: [\"CPC\", \"CPM\", \"CPV\"],\n },\n \"campaign-type\": {\n type: \"string\",\n description: \"Campaign type\",\n required: false,\n default: \"SPONSORED_UPDATES\",\n enum: [\"SPONSORED_UPDATES\", \"SPONSORED_INMAILS\", \"TEXT_AD\"],\n },\n \"audience-expansion\": {\n type: \"boolean\",\n description: \"Price with audience expansion on\",\n required: false,\n default: false,\n },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria\", required: false },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.forecast\",\n description:\n \"LinkedIn's forecast for a campaign that doesn't exist yet: impressions, clicks, leads, spend, unit costs (cpc, cpm, costPerLead) and rates over a period, each { value, low, high }. Needs a budget; --bid forecasts a manual bid, without it LinkedIn's automated bidding.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n objective: { type: \"string\", description: \"Objective type\", required: false },\n \"cost-type\": {\n type: \"string\",\n description: \"Bid type of --bid\",\n required: false,\n default: \"CPC\",\n enum: [\"CPC\", \"CPM\", \"CPV\"],\n },\n \"campaign-type\": {\n type: \"string\",\n description: \"Campaign type\",\n required: false,\n default: \"SPONSORED_UPDATES\",\n enum: [\"SPONSORED_UPDATES\", \"SPONSORED_INMAILS\", \"DYNAMIC\"],\n },\n \"daily-budget\": { type: \"string\", description: \"e.g. '250' or '250 EUR'\", required: false },\n \"total-budget\": { type: \"string\", description: \"e.g. '7250' or '7250 EUR'\", required: false },\n bid: { type: \"string\", description: \"Manual bid e.g. '5.57'; omit for automated bidding\", required: false },\n \"optimization-target\": { type: \"string\", description: \"Automated-bidding goal, e.g. MAX_LEAD\", required: false },\n start: { type: \"string\", description: \"First day YYYY-MM-DD (default tomorrow)\", required: false },\n days: { type: \"string\", description: \"Period length in days (default 30)\", required: false },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria\", required: false },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file\", required: false },\n full: { type: \"boolean\", description: \"Include LinkedIn's raw series\", required: false, default: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.leads\",\n description:\n \"List Lead Gen Form responses (90-day LinkedIn retention — sync to CRM via this endpoint). Filter by --form-id, --campaign-id, or --since-days.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"form-id\": { type: \"string\", description: \"Filter by form ID\", required: false },\n \"campaign-id\": { type: \"string\", description: \"Filter by campaign\", required: false },\n \"since-days\": { type: \"string\", description: \"Last N days\", required: false },\n \"since-ms\": { type: \"string\", description: \"Epoch ms (alternative to --since-days)\", required: false },\n until: { type: \"string\", description: \"Submitted before (YYYY-MM-DD or epoch ms)\", required: false },\n \"test-leads\": { type: \"boolean\", description: \"Only test leads\", required: false },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.list\",\n description: \"List conversion rules (Insight Tag + Conversions API).\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.health\",\n description:\n \"Playbook §07 5-point health check: rules enabled? lead/purchase event? CAPI fired in 7d? view-through ≤7d? lead de-dup correct?\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversation\",\n description:\n \"Per-button click rates inside Sponsored Messaging / Conversation Ads. Wraps analytics --pivot conversation-node-button.\",\n args: {\n \"campaign-id\": { type: \"string\", description: \"CSV campaign IDs\", required: true },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 30)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audit\",\n description:\n \"Run a 30+ check playbook audit (Settings, Tracking, Audience, Campaigns, Creative, Performance, Bidding, Compliance, Hygiene). Each finding: {id, area, check, status, severity, evidence, fix} with playbook citations. --format md renders a deliverable-ready table.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-id\": { type: \"string\", description: \"Narrow to a single campaign\", required: false },\n \"window-days\": { type: \"string\", description: \"Performance lookback (default 30)\", required: false },\n severity: { type: \"string\", description: \"CSV severity filter (critical,high,medium,low)\", required: false },\n area: { type: \"string\", description: \"CSV area filter\", required: false },\n format: { type: \"string\", description: \"json | md\", required: false, default: \"json\" },\n \"no-cache\": NO_CACHE_ARG,\n },\n});\n\n// ---------------------------------------------------------------------------\n// Staged writes — ops stage on this chat's draft, appear in the dashboard as\n// pending LinkedIn changes, and hit the LinkedIn API only when the chat is\n// published — at which point they reach the real ad account, for every company.\n// ---------------------------------------------------------------------------\n\nconst writeAccountArgs = {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\", required: false },\n} as const;\n\nregisterSchema({\n command: \"ads.linkedin.campaign-groups.create\",\n description:\n \"Stage a new campaign group (staged until publish; review with `baker ads linkedin draft`). Returns a li_temp_* ref that later `campaigns create --group` calls can reference.\",\n args: {\n ...writeAccountArgs,\n name: { type: \"string\", description: \"Name (≤100 chars)\", required: true },\n start: {\n type: \"string\",\n description: \"Run schedule start: now (default), ISO date or epoch ms — a passed start moves to publish\",\n required: false,\n },\n end: { type: \"string\", description: \"Run schedule end\", required: false },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP, required: false },\n currency: {\n type: \"string\",\n description: \"3-letter currency code (defaults to the ad account currency)\",\n required: false,\n },\n objective: { type: \"string\", description: \"Objective every ad set takes, create-only\", required: false },\n \"shared-budget\": {\n type: \"string\",\n description:\n \"MAXIMUM_DELIVERY|MANUAL|COST_CAP — share the total budget across its ad sets (needs --total-budget, --end)\",\n required: false,\n },\n status: {\n type: \"string\",\n description: \"DRAFT|ACTIVE (default DRAFT) — LinkedIn refuses a new group created PAUSED\",\n required: false,\n },\n file: { type: \"string\", description: \"JSON payload file; flags override file keys\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaign-groups.update\",\n description:\n \"Stage changes to an existing campaign group (name, schedule, budget, status). Captures a before-snapshot for the dashboard diff. Pass a li_temp_* ref to AMEND a group staged in this chat. Applies on chat publish.\",\n args: {\n id: {\n type: \"positional\",\n description: \"Campaign group id/URN, or li_temp_* ref staged in this chat\",\n required: true,\n },\n ...writeAccountArgs,\n name: { type: \"string\", description: \"New name\", required: false },\n start: { type: \"string\", description: \"New schedule start\", required: false },\n end: { type: \"string\", description: \"New schedule end\", required: false },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP, required: false },\n currency: {\n type: \"string\",\n description: \"3-letter currency code (defaults to the ad account currency)\",\n required: false,\n },\n \"shared-budget\": {\n type: \"string\",\n description: \"MAXIMUM_DELIVERY|MANUAL|COST_CAP — share the budget across its ad sets\",\n required: false,\n },\n status: { type: \"string\", description: \"ACTIVE|PAUSED|ARCHIVED\", required: false },\n file: { type: \"string\", description: \"JSON file with fields to change\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.create\",\n description:\n \"Stage a new campaign. --group accepts a real id/URN or a li_temp_* ref staged earlier in this chat. Targeting goes in --targeting-file as LinkedIn criteria: {include:{and:[{or:{'urn:li:adTargetingFacet:locations':['urn:li:geo:…']}}]}} — find facet values with `baker ads linkedin facets values`. Playbook defaults: manual bid (--bid), audience expansion off, LAN off. Staged until publish.\",\n args: {\n ...writeAccountArgs,\n name: { type: \"string\", description: \"Name (≤255 chars)\", required: true },\n group: { type: \"string\", description: \"Campaign group id/URN or li_temp_* ref\", required: true },\n type: { type: \"string\", description: \"SPONSORED_UPDATES|TEXT_AD|SPONSORED_INMAILS|DYNAMIC\", required: true },\n objective: { type: \"string\", description: \"LEAD_GENERATION|WEBSITE_VISIT|BRAND_AWARENESS|…\", required: false },\n \"cost-type\": { type: \"string\", description: \"CPC|CPM|CPV\", required: true },\n bid: { type: \"string\", description: \"Manual bid amount (unitCost)\", required: false },\n \"daily-budget\": { type: \"string\", description: \"Daily budget amount\", required: false },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP, required: false },\n currency: {\n type: \"string\",\n description: \"3-letter currency code (defaults to the ad account currency)\",\n required: false,\n },\n start: {\n type: \"string\",\n description: \"Run schedule start: now (default — when the chat publishes), ISO date or epoch ms\",\n required: false,\n },\n end: { type: \"string\", description: \"Run schedule end\", required: false },\n locale: { type: \"string\", description: \"Profile locale like en_US (default en_US)\", required: false },\n \"targeting-file\": { type: \"string\", description: \"JSON file with targetingCriteria\", required: true },\n \"audience-expansion\": { type: \"string\", description: \"on|off (playbook: off; default off)\", required: false },\n lan: {\n type: \"string\",\n description: \"LinkedIn Audience Network on|off (playbook: off; default off)\",\n required: false,\n },\n ctv: { type: \"string\", description: \"Connected TV on|off (default off)\", required: false },\n \"creative-selection\": { type: \"string\", description: \"OPTIMIZED|ROUND_ROBIN\", required: false },\n \"associated-entity\": { type: \"string\", description: \"Organization URN\", required: false },\n \"political-intent\": {\n type: \"string\",\n description:\n \"NOT_POLITICAL (default)|POLITICAL|NOT_DECLARED — the advertiser's declaration; new ad sets are declared not political unless the ads are political advertising\",\n required: false,\n },\n optimization: {\n type: \"string\",\n description:\n \"optimizationTargetType — NONE (manual, default)|ENHANCED_CONVERSION|MAX_LEAD|MAX_QUALIFIED_LEAD|MAX_CONVERSION|MAX_CLICK|MAX_IMPRESSION|MAX_REACH|MAX_VIDEO_VIEW (CPM)|TARGET_COST_PER_CLICK|TARGET_COST_PER_IMPRESSION|TARGET_COST_PER_VIDEO_VIEW|CAP_COST_AND_MAXIMIZE_LEADS|…_CLICKS|…_IMPRESSIONS|…_VIDEO_VIEWS (CPM); target cost and cost cap need --bid\",\n required: false,\n },\n format: {\n type: \"string\",\n description:\n \"Ad format, create-only: STANDARD_UPDATE|SINGLE_VIDEO|CAROUSEL|TEXT_AD|SPOTLIGHT|FOLLOW_COMPANY|JOBS|SPONSORED_INMAIL|SPONSORED_MESSAGE|SPONSORED_UPDATE_EVENT|SPONSORED_UPDATE_NATIVE_DOCUMENT\",\n required: false,\n },\n pacing: { type: \"string\", description: \"LIFETIME|ACCELERATED, create-only\", required: false },\n \"frequency-cap\": {\n type: \"string\",\n description: \"At most N impressions per member a week (3–30), Brand awareness only\",\n required: false,\n },\n status: {\n type: \"string\",\n description: \"DRAFT|ACTIVE|PAUSED (default DRAFT) — PAUSED needs a group that is not DRAFT\",\n required: false,\n },\n file: { type: \"string\", description: \"JSON payload file; flags override file keys\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.update\",\n description:\n \"Stage changes to an existing campaign — budget, bid, targeting, schedule, flags, status. Only pass what changes; a before-snapshot powers the dashboard diff. Pass a li_temp_* ref to AMEND a campaign staged in this chat (fields merge into the staged create). Applies on chat publish.\",\n args: {\n id: { type: \"positional\", description: \"Campaign id/URN, or li_temp_* ref staged in this chat\", required: true },\n ...writeAccountArgs,\n name: { type: \"string\", description: \"New name\", required: false },\n objective: { type: \"string\", description: \"New objective\", required: false },\n \"cost-type\": { type: \"string\", description: \"CPC|CPM|CPV\", required: false },\n bid: { type: \"string\", description: \"New manual bid\", required: false },\n \"daily-budget\": { type: \"string\", description: \"New daily budget\", required: false },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP, required: false },\n currency: {\n type: \"string\",\n description: \"3-letter currency code (defaults to the ad account currency)\",\n required: false,\n },\n start: { type: \"string\", description: \"New schedule start\", required: false },\n end: { type: \"string\", description: \"New schedule end\", required: false },\n \"targeting-file\": { type: \"string\", description: \"JSON file with replacement targetingCriteria\", required: false },\n \"audience-expansion\": { type: \"string\", description: \"on|off\", required: false },\n lan: { type: \"string\", description: \"on|off\", required: false },\n ctv: { type: \"string\", description: \"on|off\", required: false },\n \"creative-selection\": { type: \"string\", description: \"OPTIMIZED|ROUND_ROBIN\", required: false },\n \"political-intent\": {\n type: \"string\",\n description:\n \"NOT_POLITICAL|POLITICAL|NOT_DECLARED — corrects the ad set's political-advertising declaration; leave it out to keep the current one\",\n required: false,\n },\n status: { type: \"string\", description: \"ACTIVE|PAUSED|ARCHIVED\", required: false },\n optimization: {\n type: \"string\",\n description:\n \"optimizationTargetType — NONE (manual, default)|ENHANCED_CONVERSION|MAX_LEAD|MAX_QUALIFIED_LEAD|MAX_CONVERSION|MAX_CLICK|MAX_IMPRESSION|MAX_REACH|MAX_VIDEO_VIEW (CPM)|TARGET_COST_PER_CLICK|TARGET_COST_PER_IMPRESSION|TARGET_COST_PER_VIDEO_VIEW|CAP_COST_AND_MAXIMIZE_LEADS|…_CLICKS|…_IMPRESSIONS|…_VIDEO_VIEWS (CPM); target cost and cost cap need --bid\",\n required: false,\n },\n format: {\n type: \"string\",\n description:\n \"Ad format, create-only: STANDARD_UPDATE|SINGLE_VIDEO|CAROUSEL|TEXT_AD|SPOTLIGHT|FOLLOW_COMPANY|JOBS|SPONSORED_INMAIL|SPONSORED_MESSAGE|SPONSORED_UPDATE_EVENT|SPONSORED_UPDATE_NATIVE_DOCUMENT\",\n required: false,\n },\n pacing: { type: \"string\", description: \"LIFETIME|ACCELERATED, create-only\", required: false },\n \"frequency-cap\": {\n type: \"string\",\n description: \"At most N impressions per member a week (3–30), Brand awareness only\",\n required: false,\n },\n file: { type: \"string\", description: \"JSON file with fields to change\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.exclude-companies\",\n description:\n \"Stop a live ad set reaching some companies (customers, open deals, competitors). Add-only — never removes an exclusion. At publish Baker re-reads the ad set and merges into its targeting as it stands then, keeping audience, locations and every existing exclusion. --org takes company ids (as `companies` / `top-companies` print them) or urn:li:organization URNs, comma-separated, up to 200 per call; a longer list goes into a company-list audience passed to --segment. Staged until publish.\",\n args: {\n id: {\n type: \"positional\",\n description: \"Ad set (campaign) id or URN — must already be on LinkedIn\",\n required: true,\n },\n ...writeAccountArgs,\n org: {\n type: \"string\",\n description: \"Company ids or urn:li:organization URNs, comma-separated — e.g. 1035,1441\",\n required: false,\n },\n segment: {\n type: \"string\",\n description: \"Matched audiences, comma-separated: urn:li:dmpSegment:N / urn:li:adSegment:N or a li_temp_* ref\",\n required: false,\n },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.url-params\",\n description:\n \"Start here for UTMs: stage the URL tracking parameters on an ad set. LinkedIn appends them to the link of EVERY ad in the ad set, including ads already running, so this is the level to set campaign-wide UTMs at — editing each ad's landing URL instead risks the same key landing twice. For a value that never varies across the whole account, set it once with `account url-params` instead; LinkedIn appends BOTH levels, so a key set at both lands in the URL twice. REPLACES the ad set's whole parameter set — LinkedIn does not merge, so read `ads.linkedin.url-params` first and re-send every pair that should survive. --param takes fixed values (repeatable or &-joined); --dynamic takes a value LinkedIn fills in per ad (ACCOUNT_ID, ACCOUNT_NAME, CAMPAIGN_GROUP_ID, CAMPAIGN_GROUP_NAME, CAMPAIGN_ID, CAMPAIGN_NAME, CREATIVE_ID, CREATIVE_NAME). Applies on chat publish; message and conversation ads are unaffected.\",\n args: {\n id: { type: \"positional\", description: \"Ad set (campaign) id or URN\", required: true },\n ...writeAccountArgs,\n param: {\n type: \"string\",\n description: 'Fixed key=value, repeatable or &-joined — e.g. \"utm_source=linkedin&utm_medium=paid-social\"',\n required: false,\n },\n dynamic: {\n type: \"string\",\n description: \"key=PLACEHOLDER filled in per ad, repeatable — e.g. utm_campaign=CAMPAIGN_NAME\",\n required: false,\n },\n clear: { type: \"boolean\", description: \"Remove every tracking parameter from this ad set\", required: false },\n file: { type: \"string\", description: \"JSON payload file; flags override file keys\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.url-params\",\n description:\n \"Read the URL tracking parameters in effect: the ad account's, optionally every ad set's, and the keys set at BOTH levels — which LinkedIn appends twice into the served URL. Run this BEFORE setting UTMs on an ad set, because whatever the account already carries is appended on top. Account-only by default (there is no batch read, so each ad set costs its own call); --ad-sets sweeps them, capped, and the response says how many of how many were examined.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric ID or urn:li:sponsoredAccount:N\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\", required: false },\n \"ad-sets\": { type: \"boolean\", description: \"Also read every ad set's parameters\", required: false },\n \"campaign-ids\": {\n type: \"string\",\n description: \"Comma-separated ad set ids to read instead of all\",\n required: false,\n },\n \"collisions-only\": { type: \"boolean\", description: \"Only the keys set at more than one level\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.account.url-params\",\n description:\n \"Stage the URL tracking parameters on the whole AD ACCOUNT — LinkedIn appends them to the link of every ad in every ad set, including ads already running. Use it for the values that never vary across the account (utm_source, utm_medium, an agency tag); anything naming a specific ad set belongs on the ad set (`campaigns url-params`), because LinkedIn appends BOTH levels and a key set at both lands in the URL twice. REPLACES the account's whole parameter set — LinkedIn does not merge, so read `ads.linkedin.url-params` first and re-send every pair that should survive. --param takes fixed values (repeatable or &-joined); --dynamic takes a value LinkedIn fills in per ad (ACCOUNT_ID, ACCOUNT_NAME, CAMPAIGN_GROUP_ID, CAMPAIGN_GROUP_NAME, CAMPAIGN_ID, CAMPAIGN_NAME, CREATIVE_ID, CREATIVE_NAME). Applies on chat publish; message and conversation ads are unaffected.\",\n args: {\n ...writeAccountArgs,\n param: {\n type: \"string\",\n description: 'Fixed key=value, repeatable or &-joined — e.g. \"utm_source=linkedin&utm_medium=paid-social\"',\n required: false,\n },\n dynamic: {\n type: \"string\",\n description: \"key=PLACEHOLDER filled in per ad, repeatable — e.g. utm_campaign=CAMPAIGN_NAME\",\n required: false,\n },\n clear: { type: \"boolean\", description: \"Remove every tracking parameter set on the ad account\", required: false },\n file: { type: \"string\", description: \"JSON payload file; flags override file keys\", required: false },\n },\n});\n\nconst statusSugarArgs = {\n id: {\n type: \"positional\",\n description: \"Entity id or URN — comma-separate several to change them all in one call\",\n required: false,\n },\n \"ids-file\": { type: \"string\", description: \"File of ids, one per line or comma-separated\", required: false },\n ...writeAccountArgs,\n} as const;\n\n/** Every status command takes a list; say so once, in the words the agent reads. */\nconst MULTI_ID_NOTE =\n \"Takes one id or many: comma-separate the ids, or pass --ids-file. Several ids stage together as one set — all of them or none. The list form is for real ids/URNs only: a li_temp_* ref AMENDS what this chat already staged, and an amend must be passed on its own.\";\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.pause\",\n description: `Stage pausing a campaign (status → PAUSED on publish). ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.campaigns.resume\",\n description: `Stage resuming a paused campaign (status → ACTIVE on publish). ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.campaigns.archive\",\n description: `Stage archiving a campaign (status → ARCHIVED on publish). ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.campaign-groups.pause\",\n description: `Stage pausing a campaign group. ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.campaign-groups.resume\",\n description: `Stage resuming a campaign group. ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.creatives.pause\",\n description: `Stage pausing a creative (intendedStatus → PAUSED on publish). Playbook early-kill rule: >30 impressions with 0 clicks. ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.creatives.resume\",\n description: `Stage resuming a paused creative. ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\n\nfor (const [entity, what] of [\n [\"campaign-groups\", \"campaign\"],\n [\"campaigns\", \"ad set\"],\n [\"creatives\", \"ad\"],\n] as const) {\n registerSchema({\n command: `ads.linkedin.${entity}.delete`,\n description: `Stage deleting a ${what} that is still a DRAFT on LinkedIn; anything that has left draft is paused or archived instead. Deletes run last at publish, ads before ad sets before campaigns. ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n });\n}\n\nconst duplicateArgs = {\n id: { type: \"positional\", description: \"Source id or URN\", required: true },\n ...writeAccountArgs,\n name: { type: \"string\", description: \"Name for the copy\", required: false },\n file: { type: \"string\", description: \"JSON file with field overrides for the copy\", required: false },\n} as const;\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.duplicate\",\n description:\n \"Stage a copy of an existing campaign as a new DRAFT create (playbook: duplicate, never link-to-original). Reads the source at stage time; override fields via --name/--file.\",\n args: duplicateArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.campaign-groups.duplicate\",\n description: \"Stage a copy of an existing campaign group as a new DRAFT create.\",\n args: duplicateArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.creatives.duplicate\",\n description:\n \"Stage a copy of an existing ad, optionally with new content. Direct-content ads (text/spotlight/follower/jobs) copy field-by-field, so a copy is how their immutable content changes (they can also update in place via creatives.update). Post-based ads re-sponsor the SAME post — the post owns the copy, media and destination, so content flags are rejected here: stage creatives.create with the new content instead, then pause the old ad. --replace stages pausing the original, gated on the new ad publishing successfully, and the copy inherits the source's status.\",\n args: {\n id: { type: \"positional\", description: \"Source creative id or URN\", required: true },\n ...writeAccountArgs,\n campaign: { type: \"string\", description: \"Stage the copy under a different ad set\", required: false },\n \"intended-status\": { type: \"string\", description: \"Status for the copy (default DRAFT)\", required: false },\n replace: { type: \"boolean\", description: \"Also pause the original once the new ad publishes\", required: false },\n headline: { type: \"string\", description: \"New headline\", required: false },\n description: { type: \"string\", description: \"New description (text/spotlight)\", required: false },\n intro: { type: \"string\", description: \"New commentary / intro text\", required: false },\n \"landing-url\": { type: \"string\", description: \"New https destination URL\", required: false },\n cta: { type: \"string\", description: \"New CTA\", required: false },\n \"cta-label\": { type: \"string\", description: \"Spotlight custom CTA label\", required: false },\n \"image-id\": { type: \"string\", description: \"Baker image library id\", required: false },\n \"image-urn\": { type: \"string\", description: \"Existing urn:li:image:*\", required: false },\n \"video-id\": {\n type: \"string\",\n description:\n \"Baker video library id (`baker videos`) — uploaded to LinkedIn at publish; a first publish may ask to retry while the full-quality copy is prepared\",\n required: false,\n },\n \"video-urn\": { type: \"string\", description: \"Existing urn:li:video:*\", required: false },\n \"logo-image-id\": { type: \"string\", description: \"Baker image id for the logo\", required: false },\n title: { type: \"string\", description: \"Media title\", required: false },\n file: { type: \"string\", description: \"JSON file with field overrides for the copy\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.creatives.create\",\n description:\n \"Stage a new creative (ad). Formats: image|video|text|spotlight|follower|document|carousel|conversation|tla|jobs|event|article. Media: --image-id references the Baker library (`baker images`) and uploads to LinkedIn at publish, any format; --video-id uploads a Baker library video at publish; --image-urn/--video-urn reference media already on LinkedIn. Limits: headline ≤70 (text ads ≤25), intro soft-truncates at 600 chars, landing URL must be https. Complex formats take --file with the full content object; conversation ads take --file with the message flow ({message: {subject, body (≤500), senderName?, buttons ≤5 × {label ≤25, type NESTED|LANDING_PAGE|LEAD_FORM, nestedMessage?|landingPageUrl?|leadForm?}}}, ≤25 messages) and arrive from --sender (default: whoever connected LinkedIn). --format tla boosts an existing post (Thought Leader ad): name it with --post <Baker post id from `baker posts list`>, --post-url <any link to the post>, or --post-urn <urn:li:share|ugcPost:*>. --format document (in a SPONSORED_UPDATE_NATIVE_DOCUMENT ad set) takes --document <Baker document name> or --document-url <PDF link> and --title; gate it with --lead-form + --preview-pages N. Staged until publish.\",\n args: {\n ...writeAccountArgs,\n campaign: { type: \"string\", description: \"Campaign id/URN or li_temp_* ref\", required: true },\n format: {\n type: \"string\",\n description: \"image|video|text|spotlight|follower|document|carousel|conversation|tla|jobs|event|article\",\n required: true,\n },\n \"image-id\": { type: \"string\", description: \"Baker image library id\", required: false },\n \"image-urn\": { type: \"string\", description: \"Existing urn:li:image:*\", required: false },\n \"video-id\": {\n type: \"string\",\n description:\n \"Baker video library id (`baker videos`) — uploaded to LinkedIn at publish; a first publish may ask to retry while the full-quality copy is prepared\",\n required: false,\n },\n \"video-urn\": { type: \"string\", description: \"Existing urn:li:video:*\", required: false },\n \"logo-image-id\": { type: \"string\", description: \"Baker image id for the logo\", required: false },\n intro: { type: \"string\", description: \"Commentary / intro text\", required: false },\n headline: { type: \"string\", description: \"Headline\", required: false },\n description: { type: \"string\", description: \"Description (text/spotlight)\", required: false },\n \"landing-url\": { type: \"string\", description: \"https destination URL\", required: false },\n cta: { type: \"string\", description: \"LEARN_MORE|REQUEST_DEMO|SIGN_UP|REGISTER|DOWNLOAD|…\", required: false },\n \"cta-label\": { type: \"string\", description: \"Spotlight CTA label (≤18 chars)\", required: false },\n post: {\n type: \"string\",\n description:\n \"TLA: the post to sponsor, by its Baker post id (`baker posts list`). Staging refuses one that can't run as an ad.\",\n required: false,\n },\n \"post-urn\": {\n type: \"string\",\n description: \"TLA: the post to sponsor by its URN — urn:li:share|ugcPost:*\",\n required: false,\n },\n \"post-url\": {\n type: \"string\",\n description: \"TLA: any link to the post, normal or embed — Baker reads it and adds it to Posts\",\n required: false,\n },\n sender: {\n type: \"string\",\n description:\n \"Conversation ads: urn:li:person:* sender from `account-users` (default: whoever connected LinkedIn)\",\n required: false,\n },\n document: {\n type: \"string\",\n description: \"Document ads: a Baker document's folder name (src/documents/<name>), uploaded at publish\",\n required: false,\n },\n \"document-url\": {\n type: \"string\",\n description: \"Document ads: https link to a PDF, PowerPoint or Word file (≤100 MB, ≤300 pages)\",\n required: false,\n },\n \"document-urn\": { type: \"string\", description: \"Document ads: existing urn:li:document:*\", required: false },\n \"preview-pages\": {\n type: \"string\",\n description: \"Gated document ads: pages shown before the lead gen form (needs --lead-form)\",\n required: false,\n },\n \"event-urn\": {\n type: \"string\",\n description: \"Event ads: the LinkedIn event to sponsor (urn:li:event:*)\",\n required: false,\n },\n \"article-url\": {\n type: \"string\",\n description: \"Article ads: https URL of the article/newsletter to sponsor\",\n required: false,\n },\n \"thumbnail-image-id\": {\n type: \"string\",\n description: \"Article ads: Baker image id for the link thumbnail\",\n required: false,\n },\n \"thumbnail-urn\": { type: \"string\", description: \"Article ads: existing urn:li:image:* thumbnail\", required: false },\n \"intended-status\": {\n type: \"string\",\n description: \"DRAFT|ACTIVE (default DRAFT) — a new ad can't start PAUSED; DRAFT holds it back\",\n required: false,\n },\n title: {\n type: \"string\",\n description: \"Media title (image/video), article title, or document title\",\n required: false,\n },\n \"lead-form\": {\n type: \"string\",\n description:\n \"Lead gen form the ad opens (image|video|carousel|document|tla): li_temp_* from `lead-forms create` or a form id from `lead-forms`. Required in a LEAD_GENERATION ad set; replaces --landing-url\",\n required: false,\n },\n \"lead-form-button\": {\n type: \"string\",\n description:\n \"APPLY|DOWNLOAD|VIEW_QUOTE|LEARN_MORE|SIGN_UP (default)|SUBSCRIBE|REGISTER|REQUEST_DEMO|JOIN|ATTEND|UNLOCK_FULL_DOCUMENT|SHOP_NOW|BUY_NOW|SEE_MORE\",\n required: false,\n },\n file: { type: \"string\", description: \"JSON file with the full content object\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.creatives.update\",\n description: `Stage changes to an existing creative. Direct-content ads (text/spotlight/follower/jobs) update copy/media/URL IN PLACE — pass only the changed fields (headline, description, landing-url, image-id, …); the ad's current content carries over. Post-based ads (image/video/carousel/…) sponsor a post that owns the copy, media and destination — neither this command nor creatives.duplicate can change it; stage creatives.create with the new content, then pause the old ad. Passing a li_temp_* ref AMENDS the creative staged in this chat instead. ${MULTI_ID_NOTE} Applies on chat publish.`,\n args: {\n id: {\n type: \"positional\",\n description:\n \"Creative id/URN — comma-separate several. A li_temp_* ref amends what this chat staged and must be passed on its own.\",\n required: false,\n },\n \"ids-file\": {\n type: \"string\",\n description: \"File of creative ids, one per line or comma-separated\",\n required: false,\n },\n ...writeAccountArgs,\n \"intended-status\": { type: \"string\", description: \"ACTIVE|PAUSED|ARCHIVED|DRAFT\", required: false },\n name: { type: \"string\", description: \"New creative name\", required: false },\n campaign: {\n type: \"string\",\n description: \"Re-parent to a different ad set (id/URN or li_temp_*) — staged creatives only\",\n required: false,\n },\n headline: { type: \"string\", description: \"New headline\", required: false },\n intro: { type: \"string\", description: \"Commentary / intro text\", required: false },\n description: { type: \"string\", description: \"Description (text/spotlight)\", required: false },\n \"landing-url\": { type: \"string\", description: \"New https destination URL\", required: false },\n cta: { type: \"string\", description: \"New CTA\", required: false },\n \"cta-label\": { type: \"string\", description: \"Spotlight custom CTA label\", required: false },\n \"image-id\": { type: \"string\", description: \"Baker image library id\", required: false },\n \"image-urn\": { type: \"string\", description: \"Existing urn:li:image:*\", required: false },\n \"video-id\": {\n type: \"string\",\n description:\n \"Baker video library id (`baker videos`) — uploaded to LinkedIn at publish; a first publish may ask to retry while the full-quality copy is prepared\",\n required: false,\n },\n \"video-urn\": { type: \"string\", description: \"Existing urn:li:video:*\", required: false },\n \"logo-image-id\": { type: \"string\", description: \"Baker image id for the logo\", required: false },\n \"thumbnail-image-id\": {\n type: \"string\",\n description: \"Baker image id for the article thumbnail\",\n required: false,\n },\n \"thumbnail-urn\": { type: \"string\", description: \"Existing urn:li:image:* thumbnail\", required: false },\n title: { type: \"string\", description: \"Media or article title\", required: false },\n \"lead-form\": {\n type: \"string\",\n description:\n \"Lead gen form the ad opens (image|video|carousel|document|tla): li_temp_* from `lead-forms create` or a form id from `lead-forms`. Required in a LEAD_GENERATION ad set; replaces --landing-url\",\n required: false,\n },\n \"lead-form-button\": {\n type: \"string\",\n description:\n \"APPLY|DOWNLOAD|VIEW_QUOTE|LEARN_MORE|SIGN_UP (default)|SUBSCRIBE|REGISTER|REQUEST_DEMO|JOIN|ATTEND|UNLOCK_FULL_DOCUMENT|SHOP_NOW|BUY_NOW|SEE_MORE\",\n required: false,\n },\n file: { type: \"string\", description: \"JSON file with fields to change; flags override file keys\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audiences.create\",\n description:\n \"Stage a new matched audience. company-list/user-list take --list-file (CSV with header; companies by companyName, domain and the LinkedIn page — a linkedinCompanyPageUrl column (LinkedIn's own template; https://www.linkedin.com/company/<slug>) or organizationUrn — which matches the company exactly, so keep it, never drop it; email column is SHA-256 hashed locally). LinkedIn needs 300+ MATCHED members to serve — a contact list needs well above 300 rows; a company list counts every employee of its companies. retargeting/engagement configs go in --file. Staged until publish.\",\n args: {\n ...writeAccountArgs,\n name: { type: \"string\", description: \"Audience name (≤100 chars)\", required: true },\n type: { type: \"string\", description: \"company-list|user-list|retargeting|engagement\", required: true },\n \"list-file\": { type: \"string\", description: \"CSV file with the list rows\", required: false },\n file: {\n type: \"string\",\n description:\n \"JSON raw source config for retargeting/engagement — sourcePlatform, type USER, and engagementRules (engagementSource, engagementTrigger, timeFrame)\",\n required: false,\n },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audiences.upload\",\n description:\n \"Stage REPLACING an audience's list with a new file (LinkedIn keeps one list per audience and has no row-level add or remove for this app): send the whole list — to add people, the old rows plus the new; to remove people, the list without them. Same CSV rules as audiences.create.\",\n args: {\n id: { type: \"positional\", description: \"Segment URN/id or li_temp_* ref\", required: true },\n ...writeAccountArgs,\n \"list-file\": {\n type: \"string\",\n description: \"CSV file with the WHOLE list the audience should hold\",\n required: true,\n },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.create\",\n description:\n \"Stage a new conversion rule. Playbook defaults: --post-click-window 30 --view-window 7, counting ONE_TIME_EACH_MEMBER for leads. Staged until publish.\",\n args: {\n ...writeAccountArgs,\n name: { type: \"string\", description: \"Rule name\", required: true },\n type: {\n type: \"string\",\n description:\n \"Conversion type. Common: LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, SIGN_UP, DOWNLOAD, PURCHASE, KEY_PAGE_VIEW, ADD_TO_CART, BOOK_APPOINTMENT, SUBMIT_APPLICATION, OTHER — `baker schema ads.linkedin.conversions.create` lists all 34\",\n required: true,\n },\n method: { type: \"string\", description: \"INSIGHT_TAG|CONVERSIONS_API\", required: true },\n \"post-click-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n required: false,\n },\n \"view-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n required: false,\n },\n \"attribution-type\": {\n type: \"string\",\n description: \"LAST_TOUCH_BY_CAMPAIGN|LAST_TOUCH_BY_CONVERSION\",\n required: false,\n },\n \"associate-all-campaigns\": {\n type: \"boolean\",\n description: \"Auto-associate with active campaigns\",\n required: false,\n },\n file: { type: \"string\", description: \"JSON payload file (e.g. urlMatchRuleExpression)\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.update\",\n description: \"Stage changes to a conversion rule (windows, attribution, enabled, name). Applies on chat publish.\",\n args: {\n id: { type: \"positional\", description: \"Conversion rule id or URN\", required: true },\n ...writeAccountArgs,\n name: { type: \"string\", description: \"New name\", required: false },\n \"post-click-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n required: false,\n },\n \"view-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n required: false,\n },\n \"attribution-type\": { type: \"string\", description: \"New attribution type\", required: false },\n enabled: { type: \"string\", description: \"on|off\", required: false },\n file: { type: \"string\", description: \"JSON file with fields to change\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.associate-campaign\",\n description:\n \"Count an existing conversion rule for one ad set. Which ad sets a rule counts for is a separate LinkedIn record, not a field on the rule — `conversions update` cannot change it, and `--associate-all-campaigns` exists only on create. Staged until publish.\",\n args: {\n id: { type: \"positional\", description: \"Conversion rule id or URN\", required: true },\n ...writeAccountArgs,\n campaign: { type: \"string\", description: \"Ad set (campaign) id or URN\", required: true },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.dissociate-campaign\",\n description: \"Stop counting an existing conversion rule for one ad set. Staged until publish.\",\n args: {\n id: { type: \"positional\", description: \"Conversion rule id or URN\", required: true },\n ...writeAccountArgs,\n campaign: { type: \"string\", description: \"Ad set (campaign) id or URN\", required: true },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.lead-forms.create\",\n description:\n \"Stage a new Lead Gen Form from a JSON file: {name, headline ≤60, description? ≤160, privacyPolicyUrl, questions[] ≤12 (playbook: ≤4 for completion), thankYou?, legalDisclaimer?}. Staged until publish.\",\n args: {\n ...writeAccountArgs,\n file: { type: \"string\", description: \"JSON form definition file\", required: true },\n name: { type: \"string\", description: \"Override the form name\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.lead-forms.update\",\n description:\n \"Stage changes to a Lead Gen Form. Once its ads are live LinkedIn keeps only the copy editable (headline, description, privacy policy URL, legal disclaimer, thank-you message and link) and the state. Copy is written in the form's own language. Applies on chat publish.\",\n args: {\n id: { type: \"positional\", description: \"Lead form id or URN\", required: true },\n ...writeAccountArgs,\n name: { type: \"string\", description: \"New form name\", required: false },\n state: { type: \"string\", description: \"PUBLISHED|ARCHIVED\", required: false },\n headline: { type: \"string\", description: \"Form headline (≤60)\", required: false },\n description: { type: \"string\", description: \"Form details text\", required: false },\n \"privacy-policy-url\": { type: \"string\", description: \"https privacy policy URL\", required: false },\n \"legal-disclaimer\": { type: \"string\", description: \"Custom legal disclaimer\", required: false },\n \"thank-you-message\": { type: \"string\", description: \"Confirmation message\", required: false },\n \"thank-you-url\": { type: \"string\", description: \"https link on the confirmation screen\", required: false },\n file: { type: \"string\", description: \"JSON file with any of the fields above\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.lead-forms.list\",\n description:\n \"List the ad account's lead gen forms — id, name, state (a DRAFT form can't serve), version, how many questions. --full spells out every form's questions and options; --form-id reads one form in full.\",\n args: {\n ...writeAccountArgs,\n \"form-id\": { type: \"string\", description: \"Read one form (id or urn:li:leadGenForm:N)\", required: false },\n full: { type: \"boolean\", description: \"Every form's questions and options\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.lead-forms.publish\",\n description: \"Stage publishing a DRAFT lead gen form so ads that open it can serve. Applies on chat publish.\",\n args: { id: { type: \"positional\", description: \"Lead form id or URN\", required: true }, ...writeAccountArgs },\n});\n\nregisterSchema({\n command: \"ads.linkedin.lead-forms.archive\",\n description: \"Stage archiving a lead gen form — every ad that opens it stops serving. Applies on chat publish.\",\n args: { id: { type: \"positional\", description: \"Lead form id or URN\", required: true }, ...writeAccountArgs },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audiences.delete\",\n description:\n \"Stage deleting a matched audience already on LinkedIn (its list and targetable twin go too). Refused by LinkedIn while a live ad set targets it. Applies on chat publish.\",\n args: {\n id: { type: \"positional\", description: \"Audience URN (urn:li:dmpSegment:…) or id\", required: true },\n ...writeAccountArgs,\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.account-users\",\n description:\n \"Who works on the ad account and their Campaign Manager role; connectedLinkedin marks the person Baker publishes as — the default sender of a conversation ad.\",\n args: { ...writeAccountArgs },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.upload\",\n description:\n \"Stage CRM / offline conversions (deals won, qualified leads) into a Conversions API rule — LinkedIn credits the ads and bids toward them. --file is a CSV or JSON array: eventId (CRM id; LinkedIn counts a re-sent id once), happenedAt (ISO WITH timezone, last 90 days), and email, or firstName + lastName (+ companyName, title, countryCode), or liFatId; optional value + currency. Emails and names are hashed on the sandbox. ≤2,000 per upload; re-staging for the same rule replaces the rows. Applies on chat publish.\",\n args: {\n id: { type: \"positional\", description: \"Conversions API rule id\", required: true },\n ...writeAccountArgs,\n file: { type: \"string\", description: \"CSV or JSON file of conversions\", required: true },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.revenue\",\n description:\n \"LinkedIn revenue attribution: CRM deals credited to the ads — revenue won (USD), return on ad spend, deals won, win rate, average deal size, days to close — per campaign, campaign group or account. Needs the ad account in a Business Manager with Salesforce, Dynamics 365 or HubSpot connected. 30–366 days within the last year (default last 90).\",\n args: {\n ...writeAccountArgs,\n pivot: { type: \"string\", description: \"campaign (default)|campaign-group|account\", required: false },\n start: { type: \"string\", description: \"First day, YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"Last day, YYYY-MM-DD (default today)\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audiences.list\",\n description:\n \"List matched audiences: status (BUILDING/READY), rows uploaded vs matched, targetingUrn (urn:li:adSegment:…) for targeting and exclusions.\",\n args: { ...writeAccountArgs },\n});\n\nregisterSchema({\n command: \"ads.linkedin.creatives.get\",\n description:\n \"Read one ad as LinkedIn holds it: headline, intro text, landing URL, lead gen form, review status and rejection reasons, and why it isn't serving (notServingBecause).\",\n args: {\n id: { type: \"positional\", description: \"Creative id or urn:li:sponsoredCreative:N\", required: true },\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.draft.list\",\n description:\n \"Show every LinkedIn write op staged in this chat: ref, summary, dependencies, warnings, and post-publish results. Ops are invisible to the read commands until publish, and publishing reaches the real ad account — check here before finishing.\",\n args: {\n json: {\n type: \"boolean\",\n description: \"Print the raw JSON envelope instead of the readable tree\",\n required: false,\n },\n chat: { type: \"string\", description: CHAT_READ_ARG_DESCRIPTION, required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.draft.remove\",\n description:\n \"Drop one staged LinkedIn op from this chat's draft. Removing a create cascades to every op that depends on it (a campaign removal drops its staged creatives).\",\n args: {\n ref: {\n type: \"positional\",\n description: \"Op ref (li_temp_* for creates, target id/URN for updates)\",\n required: true,\n },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.draft.show\",\n description:\n \"Print the full staged payload for one LinkedIn op — the receipt to verify a change looks right before publish (never truncated), and the only way to read back verbatim what an earlier chat wrote.\",\n args: {\n ref: {\n type: \"positional\",\n description: \"Op ref (li_temp_* for creates, target id/URN for updates)\",\n required: true,\n },\n chat: { type: \"string\", description: CHAT_READ_ARG_DESCRIPTION, required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.draft.clear\",\n description: \"Discard ALL staged LinkedIn ops in this chat's draft. Nothing applies on publish.\",\n args: {},\n});\n\nconst experimentAccountArgs = { ...writeAccountArgs };\n\nregisterSchema({\n command: \"ads.linkedin.experiments.list\",\n description:\n \"List A/B tests: state, running (PENDING|RUNNING|ON_HOLD|STOPPED|ENDED), metric, dates, the two versions.\",\n args: experimentAccountArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.experiments.get\",\n description:\n \"One A/B test with LinkedIn's setup checks (ERROR blocks it) and the latest result (winner, p-value, intervals).\",\n args: { id: { type: \"positional\", description: \"A/B test id\", required: true }, ...experimentAccountArgs },\n});\nregisterSchema({\n command: \"ads.linkedin.experiments.create\",\n description:\n \"Stage an A/B test between two ad sets of one campaign (no shared budget), ≤90 days, winner on CPC|CPM|CPV|CPMS. Applies on chat publish.\",\n args: {\n ...experimentAccountArgs,\n name: { type: \"string\", description: \"Test name\", required: true },\n description: { type: \"string\", description: \"What is being tested\", required: false },\n \"version-a\": { type: \"string\", description: \"Ad set for version A (id/URN/li_temp_*)\", required: true },\n \"version-b\": { type: \"string\", description: \"Ad set for version B (id/URN/li_temp_*)\", required: true },\n \"name-a\": { type: \"string\", description: \"Version A label\", required: false },\n \"name-b\": { type: \"string\", description: \"Version B label\", required: false },\n \"weight-a\": { type: \"string\", description: \"Version A audience share 1–99 (default 50)\", required: false },\n metric: { type: \"string\", description: \"CPC|CPM|CPV|CPMS\", required: true },\n confidence: { type: \"string\", description: \"51–99 (default 90)\", required: false },\n start: { type: \"string\", description: \"Start date\", required: true },\n end: { type: \"string\", description: \"End date (≤90 days)\", required: true },\n \"stop-at\": { type: \"string\", description: \"end-date|winner|never\", required: false },\n draft: { type: \"boolean\", description: \"Set up but not running\", required: false },\n },\n});\nregisterSchema({\n command: \"ads.linkedin.experiments.update\",\n description: \"Stage changes to an A/B test (name, description, end, confidence, stop-at). Applies on chat publish.\",\n args: {\n id: { type: \"positional\", description: \"A/B test id\", required: true },\n ...experimentAccountArgs,\n name: { type: \"string\", description: \"New name\", required: false },\n description: { type: \"string\", description: \"New description\", required: false },\n end: { type: \"string\", description: \"New end date\", required: false },\n confidence: { type: \"string\", description: \"51–99\", required: false },\n \"stop-at\": { type: \"string\", description: \"end-date|winner|never\", required: false },\n },\n});\nfor (const [verb, what] of [\n [\"start\", \"Stage starting or resuming an A/B test.\"],\n [\"pause\", \"Stage pausing an A/B test (both ad sets pause).\"],\n [\"end\", \"Stage ending an A/B test for good.\"],\n] as const) {\n registerSchema({\n command: `ads.linkedin.experiments.${verb}`,\n description: `${what} Applies on chat publish.`,\n args: { id: { type: \"positional\", description: \"A/B test id\", required: true }, ...experimentAccountArgs },\n });\n}\n"],"mappings":"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","names":[]}
|