@koda-sl/baker-cli 0.455.0 → 0.456.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +100 -17
- package/dist/{account-2OBWFPRG.js → account-AO6PNNPO.js} +6 -6
- package/dist/account-reads-W3XO7CIW.js +218 -0
- package/dist/account-reads-W3XO7CIW.js.map +1 -0
- package/dist/{accounts-TDTME6RQ.js → accounts-4TM4UZEJ.js} +5 -5
- package/dist/{accounts-TZQVAJ3V.js → accounts-XDC26KK6.js} +7 -7
- package/dist/{actions-FHYESJEE.js → actions-CJB4GZYA.js} +18 -18
- package/dist/{add-Q6YFHEOR.js → add-BP4CUUKB.js} +4 -4
- package/dist/{add-7XB5X3D3.js → add-RYR3QGOP.js} +5 -5
- package/dist/{ads-PGTFZA5Q.js → ads-GII5LEOH.js} +6 -6
- package/dist/{ads-6UEDYT3O.js → ads-SATXH4OD.js} +9 -9
- package/dist/{adsets-Q5DWGANV.js → adsets-PMXNW3EG.js} +8 -8
- package/dist/{advertisers-RKWQDCOI.js → advertisers-GM5UFI44.js} +7 -7
- package/dist/{analytics-DEJKJNLN.js → analytics-4CD7CH7H.js} +5 -5
- package/dist/{analytics-U5TTTX7K.js → analytics-JDPRLCHQ.js} +15 -15
- package/dist/{assign-RHUKQWH2.js → assign-XI4HIIIM.js} +5 -5
- package/dist/{audience-size-ICEKQRE4.js → audience-size-DHZ65PGA.js} +5 -5
- package/dist/{audiences-AMRFZRZ7.js → audiences-D7CXP3ZF.js} +3 -3
- package/dist/{audit-GWLQVB4A.js → audit-M7BZYBIS.js} +5 -5
- package/dist/{autocomplete-NAEVFMKZ.js → autocomplete-B45I26R4.js} +7 -7
- package/dist/{avatars-PMV6IMFV.js → avatars-75BALNB7.js} +4 -4
- package/dist/{bid-pricing-XF3LD65L.js → bid-pricing-4RCP24BE.js} +5 -5
- package/dist/{brand-ZC5HDP7B.js → brand-2TOLKYDY.js} +2 -2
- package/dist/{brief-3EZ2JS5F.js → brief-5G4NEZ4O.js} +16 -16
- package/dist/{campaign-groups-JSHBFYDG.js → campaign-groups-G7B26V7K.js} +10 -10
- package/dist/{campaign-writes-5PHXENPN.js → campaign-writes-HZ7ART7W.js} +5 -5
- package/dist/{campaigns-D6B6Z67Y.js → campaigns-MEEM3CNC.js} +8 -8
- package/dist/{campaigns-HPRQVXTH.js → campaigns-OIJGTO7W.js} +5 -5
- package/dist/{campaigns-LQXELRHZ.js → campaigns-RW3QJQ2F.js} +13 -13
- package/dist/{canvas-4NVEZNW5.js → canvas-LXRLDE5G.js} +12 -12
- package/dist/{capabilities-VQRNPBOZ.js → capabilities-BWSB7IFT.js} +5 -5
- package/dist/{changes-TP7ZZHB3.js → changes-AYLNY6KN.js} +5 -5
- package/dist/{chatgpt-QNUN63YS.js → chatgpt-TNSRA3L3.js} +1 -1
- package/dist/{chats-Q4QPA3OQ.js → chats-MMHBJQFM.js} +5 -5
- package/dist/{chunk-RXGR63TP.js → chunk-24GELJP3.js} +2 -2
- package/dist/{chunk-ZKYNGME7.js → chunk-2D4ASTGN.js} +3 -3
- package/dist/{chunk-PRIHMSJH.js → chunk-2K4LMCV2.js} +2 -2
- package/dist/{chunk-4GACYQUI.js → chunk-2YJL6MEB.js} +3 -3
- package/dist/{chunk-L27H2R2N.js → chunk-2ZY7HON7.js} +2 -2
- package/dist/{chunk-RZTNH2TX.js → chunk-45OQOUJA.js} +2 -2
- package/dist/{chunk-LLOOWRBB.js → chunk-4KCKNAVW.js} +189 -20
- package/dist/chunk-4KCKNAVW.js.map +1 -0
- package/dist/{chunk-GX6VAHY7.js → chunk-5FWMRTNB.js} +31 -15
- package/dist/chunk-5FWMRTNB.js.map +1 -0
- package/dist/{chunk-YT2BSTD3.js → chunk-7TNPEURJ.js} +2 -2
- package/dist/chunk-7VHPAGPK.js +228 -0
- package/dist/chunk-7VHPAGPK.js.map +1 -0
- package/dist/{chunk-WKS6ZDUP.js → chunk-BSOWFWEU.js} +7 -7
- package/dist/{chunk-X5ECCSHP.js → chunk-D23EKXOP.js} +2 -2
- package/dist/{chunk-FC3U5XKS.js → chunk-D7PFF6UC.js} +4 -4
- package/dist/{chunk-OU5YA2QX.js → chunk-DT2XXF6O.js} +2 -2
- package/dist/{chunk-ARBKEE6E.js → chunk-DYOI4FQ7.js} +2 -2
- package/dist/{chunk-4EVLVA2R.js → chunk-EFM7OODQ.js} +2 -2
- package/dist/{chunk-P6KWFODZ.js → chunk-EIIANSBX.js} +2 -2
- package/dist/{chunk-HJMRWBR5.js → chunk-EYK6G4XE.js} +2 -2
- package/dist/{chunk-PKC6QBYJ.js → chunk-EZWYX343.js} +4 -4
- package/dist/{chunk-LIQ4SQ2T.js → chunk-FEELV5IV.js} +2 -2
- package/dist/{chunk-YCWIGXH6.js → chunk-GP7QUF5A.js} +2 -2
- package/dist/{chunk-ZGGGA3JR.js → chunk-HOXZOOVA.js} +8 -8
- package/dist/{chunk-CYEO5ZIO.js → chunk-JPK34QPS.js} +3 -2
- package/dist/{chunk-CYEO5ZIO.js.map → chunk-JPK34QPS.js.map} +1 -1
- package/dist/{chunk-TJOGO2MK.js → chunk-JU7FIHQ2.js} +2 -2
- package/dist/{chunk-MVYLY2SF.js → chunk-KN7DFVKW.js} +2 -2
- package/dist/{chunk-K5H3XOYQ.js → chunk-LI6PGY3L.js} +2 -2
- package/dist/{chunk-3KEWXALS.js → chunk-MCWYIEWI.js} +3 -3
- package/dist/{chunk-LIWBVGRE.js → chunk-MFQ5SUJT.js} +3 -3
- package/dist/{credentials-4V55RYZ6.js → chunk-ML7DLFFY.js} +3421 -249
- package/dist/chunk-ML7DLFFY.js.map +1 -0
- package/dist/{chunk-HEOWTR7Z.js → chunk-OW4XDJV2.js} +2 -2
- package/dist/{chunk-KYR4EG3E.js → chunk-PHEEJUFL.js} +2 -2
- package/dist/chunk-QM6T4BFA.js +76 -0
- package/dist/chunk-QM6T4BFA.js.map +1 -0
- package/dist/{chunk-KHV5GALI.js → chunk-QNDLOCAI.js} +2 -2
- package/dist/{chunk-GQ7JE7A7.js → chunk-UZUHXN7H.js} +2 -2
- package/dist/{chunk-YWK4UBVU.js → chunk-V5QJBDBC.js} +2 -2
- package/dist/{chunk-LP2QDRO4.js → chunk-WBUMUELD.js} +7 -7
- package/dist/{chunk-EP5TYLNV.js → chunk-WEU6GKUQ.js} +3 -3
- package/dist/{chunk-46TPPYCI.js → chunk-X5VHGXFB.js} +2 -2
- package/dist/{chunk-3V57D7GE.js → chunk-XJRBFLBD.js} +2 -2
- package/dist/{query-IEZRY6HV.js → chunk-XPOIIQCI.js} +406 -148
- package/dist/chunk-XPOIIQCI.js.map +1 -0
- package/dist/{chunk-ZJWUBJYQ.js → chunk-XQIOCIDO.js} +1 -1
- package/dist/chunk-XQIOCIDO.js.map +1 -0
- package/dist/{chunk-T4DD5YMP.js → chunk-XY7BZSDQ.js} +12 -12
- package/dist/{chunk-T4DD5YMP.js.map → chunk-XY7BZSDQ.js.map} +1 -1
- package/dist/{chunk-QS2BDKFL.js → chunk-Y63Y4QSY.js} +2 -2
- package/dist/{chunk-PAQ3T6OT.js → chunk-YRVDCIJ2.js} +2 -2
- package/dist/{claim-RHZVTMQZ.js → claim-UDNXCJIU.js} +5 -5
- package/dist/cli.js +29 -29
- package/dist/{companies-LIKSVYSR.js → companies-RPZN4JTR.js} +5 -5
- package/dist/{complete-OM7R6VOC.js → complete-HLSRQE3N.js} +5 -5
- package/dist/{connect-AVX3NKP6.js → connect-TIJZO7OV.js} +8 -8
- package/dist/{conversation-3HGRWXKO.js → conversation-BS7TF6LZ.js} +5 -5
- package/dist/{conversion-upload-command-AUF3LNTH.js → conversion-upload-command-CSD344BY.js} +6 -6
- package/dist/{conversions-XADFSQ4W.js → conversions-FEWAX64H.js} +9 -9
- package/dist/{create-PQSDE4J3.js → create-4SH4BZXP.js} +5 -5
- package/dist/{create-BWHYYATN.js → create-B4UVIJZI.js} +4 -4
- package/dist/{create-Z4JLLTPG.js → create-F5FNHJKE.js} +5 -5
- package/dist/{create-3I64N6RJ.js → create-L3JHP6J4.js} +5 -5
- package/dist/{creatives-WPRN6CU4.js → creatives-LK2NZHRX.js} +10 -10
- package/dist/{creatives-UEPLNCPN.js → creatives-RQ2DFHGI.js} +3 -3
- package/dist/{creatives-6Z7CEW5O.js → creatives-UILBPOKO.js} +10 -10
- package/dist/credentials-GC34ZPYP.js +287 -0
- package/dist/credentials-GC34ZPYP.js.map +1 -0
- package/dist/{critique-M5TMIG2D.js → critique-FAOH4FCP.js} +7 -7
- package/dist/{critique-K632OHFP.js → critique-X7HYYEJ4.js} +5 -5
- package/dist/{crm-CWT6BMMX.js → crm-RB5TVV3M.js} +6 -6
- package/dist/{crm-Q2QK4ZMS.js → crm-XEQDSU2U.js} +6 -6
- package/dist/{currency-XCGKQ7FE.js → currency-47QHFHDA.js} +4 -4
- package/dist/{custom-conversions-2VLJGPRV.js → custom-conversions-7HOWR6X6.js} +2 -2
- package/dist/{customers-7TS64ZM5.js → customers-P5WOUY6G.js} +7 -7
- package/dist/{delete-H7W3V6QG.js → delete-DLQ2ZZDA.js} +4 -4
- package/dist/{delete-BPSOLCGB.js → delete-GZKGPBBD.js} +5 -5
- package/dist/{delete-RIY5VUTU.js → delete-SW5OSIGN.js} +5 -5
- package/dist/{demographics-NHGM4QP7.js → demographics-ZLZOIWUE.js} +5 -5
- package/dist/{discard-IBMOGEYB.js → discard-VNVNJWNX.js} +5 -5
- package/dist/{discover-BJPZNXUQ.js → discover-P6TUGZ45.js} +4 -4
- package/dist/{domain-Y3N2UY5I.js → domain-OBICRJP3.js} +5 -5
- package/dist/draft-666YKA3P.js +307 -0
- package/dist/draft-666YKA3P.js.map +1 -0
- package/dist/{draft-322ZG6JG.js → draft-UECMJ6B4.js} +5 -5
- package/dist/{draft-6KBILDJK.js → draft-V75RBORX.js} +5 -5
- package/dist/{draft-P5T2QHCY.js → draft-Z3VUQ4LJ.js} +7 -7
- package/dist/{facets-3SDK42HY.js → facets-7J66L3NK.js} +5 -5
- package/dist/{feedback-P2JZTJY5.js → feedback-3LDG4WVJ.js} +2 -2
- package/dist/{feedback-record-5O6UUWTZ.js → feedback-record-CTAUHLMF.js} +9 -9
- package/dist/{fetch-LN5W3J4E.js → fetch-4RXXZGO4.js} +5 -5
- package/dist/{flows-MN26KBWB.js → flows-GGB46DLH.js} +12 -12
- package/dist/{fonts-7TXPTNCS.js → fonts-S3GWKOUJ.js} +7 -7
- package/dist/{forecast-ZHBKYQFP.js → forecast-6JVKXNFB.js} +5 -5
- package/dist/forecast-SVD3LMMY.js +168 -0
- package/dist/forecast-SVD3LMMY.js.map +1 -0
- package/dist/{funnel-UAXVM7JN.js → funnel-RCQOIQZ5.js} +6 -6
- package/dist/{ga4-DV2AXCSL.js → ga4-U6DMJ6K4.js} +1 -1
- package/dist/{get-EKYSQHNB.js → get-KQSM2MXM.js} +5 -5
- package/dist/{get-P7SSZ46N.js → get-MN2GRXGZ.js} +5 -5
- package/dist/{google-M7KEXVK5.js → google-CI2AMJKN.js} +1518 -200
- package/dist/google-CI2AMJKN.js.map +1 -0
- package/dist/{google-ads-LZDXDFPW.js → google-ads-YAJ33LTW.js} +5 -5
- package/dist/{history-BFGVCJ4J.js → history-QWYLRQBO.js} +5 -5
- package/dist/{hubspot-I3PNNF3E.js → hubspot-DDONLJ7R.js} +9 -9
- package/dist/{ideas-ZNP5BOGE.js → ideas-N44Z2SIT.js} +4 -4
- package/dist/{images-MWWGN672.js → images-BKHCBCE7.js} +4 -4
- package/dist/{ingest-H7BWHY7L.js → ingest-HBECWLOB.js} +4 -4
- package/dist/{ingest-NYP2ZAAK.js → ingest-VNRTFD4Y.js} +5 -5
- package/dist/{inspect-FNNDBZQX.js → inspect-7GGJDJBJ.js} +5 -5
- package/dist/{inspiration-S3DU4CMQ.js → inspiration-CGM3NK6X.js} +1 -1
- package/dist/{intent-E3UIVZBN.js → intent-HKNBXEDS.js} +4 -4
- package/dist/{keyword-gap-BG6M665A.js → keyword-gap-HUSP6MOT.js} +4 -4
- package/dist/{keyword-metrics-WG5LLBUW.js → keyword-metrics-2C3VFGDQ.js} +7 -7
- package/dist/{keywords-for-site-HVEAAODA.js → keywords-for-site-4GV4KS4X.js} +7 -7
- package/dist/{landing-G5MLO4CZ.js → landing-V2FMPQOK.js} +3 -3
- package/dist/{languages-HORKPDNH.js → languages-75YJZAHL.js} +4 -4
- package/dist/{leads-XCAE4OVV.js → leads-DTULNGMU.js} +5 -5
- package/dist/{leads-ARUWPHBM.js → leads-OPRVJBQG.js} +4 -4
- package/dist/{learn-5WSN4PT5.js → learn-EW2CKOFS.js} +9 -9
- package/dist/{line-item-writes-4EOQBQSC.js → line-item-writes-EF3BJ5KV.js} +5 -5
- package/dist/{line-items-45X5BVQW.js → line-items-G467XOZF.js} +5 -5
- package/dist/{link-XAXNBIKU.js → link-5SU4MR6M.js} +5 -5
- package/dist/{linkedin-62HOT3HB.js → linkedin-OFM3VVOB.js} +29 -29
- package/dist/{list-PLWORN75.js → list-HEWXAVCL.js} +4 -4
- package/dist/{list-NYTQ3DBH.js → list-SUTCQLGI.js} +5 -5
- package/dist/{list-H4SN4QYE.js → list-VFZPXFMA.js} +5 -5
- package/dist/{locations-J4G5RNPH.js → locations-6XADFU3V.js} +4 -4
- package/dist/{log-S7TEGEPL.js → log-I3MAU44R.js} +5 -5
- package/dist/{make-F6FOFAS4.js → make-ALBJZKJZ.js} +21 -21
- package/dist/{map-V3YC6Y5I.js → map-OT6F33VF.js} +6 -6
- package/dist/{mcp-3R3FOL2H.js → mcp-LC3L2JQO.js} +4 -4
- package/dist/{media-53DJRC4N.js → media-MYZ5I7WK.js} +2 -2
- package/dist/{media-sources-356UORTR.js → media-sources-RK6EJYBQ.js} +2 -2
- package/dist/{members-KATLJNPJ.js → members-7CHDHW7H.js} +5 -5
- package/dist/{meta-A7KM6TF5.js → meta-7XP5AWYU.js} +10 -10
- package/dist/{metrics-SQDJ5NQO.js → metrics-73LI743C.js} +4 -4
- package/dist/{normalize-RUPEDCAV.js → normalize-CXMYHNSA.js} +5 -5
- package/dist/{options-SCYGSRQX.js → options-E4IO5SR5.js} +8 -8
- package/dist/{performance-U3MA6YXN.js → performance-UQLSBPYN.js} +6 -6
- package/dist/{plan-4QP2G7GV.js → plan-NBFLYAOW.js} +2 -2
- package/dist/{promoted-tweet-writes-5UMGETBC.js → promoted-tweet-writes-ZW3FUPFG.js} +5 -5
- package/dist/{promoted-tweets-A3V53KZI.js → promoted-tweets-ZLQ6GZD5.js} +3 -3
- package/dist/{publish-V22K43GA.js → publish-H2PBR5XN.js} +5 -5
- package/dist/query-GDUTZ4R7.js +61 -0
- package/dist/{reddit-UACCQN3B.js → reddit-TGQYQUNZ.js} +6 -6
- package/dist/{refresh-PSXGRCJE.js → refresh-HVBCC2ZI.js} +4 -4
- package/dist/{release-S2X7UL4U.js → release-VI3JT6O6.js} +5 -5
- package/dist/{relevant-pages-OWMNUCP7.js → relevant-pages-2FW3E5KD.js} +4 -4
- package/dist/{remove-4GTKRBUW.js → remove-4EE7STMS.js} +4 -4
- package/dist/{reopen-3KUS6UZ2.js → reopen-LEGLAOMA.js} +5 -5
- package/dist/{rerun-ZHD7C4W2.js → rerun-A5DPZFOO.js} +14 -14
- package/dist/{research-7LO3G3EP.js → research-O6YMV2TG.js} +13 -13
- package/dist/{research-UF6PKQPH.js → research-WOJELJ4K.js} +4 -4
- package/dist/{reset-PVXTS3FZ.js → reset-PQHURJDC.js} +4 -4
- package/dist/{reset-PU57HTAP.js → reset-V2X7DFHD.js} +4 -4
- package/dist/{resolve-KBIYWRF7.js → resolve-Q4AACDIC.js} +5 -5
- package/dist/{retry-HKWNIGON.js → retry-BB6NJBC4.js} +4 -4
- package/dist/{retry-LSCVGZM5.js → retry-WMGEUJPB.js} +4 -4
- package/dist/{run-HMFS4KQZ.js → run-OBYA2F3E.js} +14 -14
- package/dist/{run-DU6RVXPA.js → run-V6E36GXW.js} +5 -5
- package/dist/{scaffold-ad-SLUGKZIW.js → scaffold-ad-KKYI7FZJ.js} +10 -10
- package/dist/{scaffold-static-ad-NRFAA5HL.js → scaffold-static-ad-R5UE4YIZ.js} +16 -16
- package/dist/{scaffold-video-Q7BSFVS4.js → scaffold-video-Y2BWXZSX.js} +12 -12
- package/dist/{schedule-VNTGMFLQ.js → schedule-EO27AZTT.js} +4 -4
- package/dist/{scheduled-agents-6TNWXJVH.js → scheduled-agents-OIJBX7OO.js} +11 -11
- package/dist/{schema-ZEOL467O.js → schema-7GSCTQIC.js} +6 -6
- package/dist/{search-XUINK3C2.js → search-Q7PAV7NY.js} +4 -4
- package/dist/{select-U3DVKV72.js → select-ASR5SBYE.js} +9 -9
- package/dist/{set-prompt-EQIVJ5LR.js → set-prompt-I32464V4.js} +7 -7
- package/dist/{setup-links-CLPE6UUM.js → setup-links-NP2HULRC.js} +5 -5
- package/dist/{site-GIZB7NWB.js → site-PTIYQQ3Z.js} +6 -6
- package/dist/{sources-7RGXA35S.js → sources-5FRMFKDA.js} +6 -6
- package/dist/{sources-2PG4U4BC.js → sources-FJLCIG6X.js} +8 -8
- package/dist/{stale-ODM7IOO2.js → stale-YUYMETFC.js} +8 -8
- package/dist/{stats-NNXZMPZR.js → stats-F5JZVPYG.js} +1 -1
- package/dist/{status-HKCIXG7P.js → status-UYIQFC7L.js} +5 -5
- package/dist/{studio-EKIPLLHD.js → studio-6ZL76TZR.js} +1 -1
- package/dist/{sync-LGDTHM6C.js → sync-527ZCA4A.js} +4 -4
- package/dist/{sync-definition-6WBQN4Q3.js → sync-definition-M4KRPGTN.js} +9 -9
- package/dist/sync-definition-M4KRPGTN.js.map +1 -0
- package/dist/{tags-BQFPK55V.js → tags-2MX3332V.js} +5 -5
- package/dist/{tags-N72F6AMR.js → tags-7767I2D6.js} +4 -4
- package/dist/{tags-DRZ7GPP4.js → tags-J3BGX3E6.js} +5 -5
- package/dist/{tags-Q5NWILJO.js → tags-O27SK3YX.js} +4 -4
- package/dist/{tags-4NICM2LC.js → tags-VAYVSQM6.js} +5 -5
- package/dist/{targeting-criteria-DXHMEEC2.js → targeting-criteria-GOTI75Y4.js} +3 -3
- package/dist/{targets-A325AP5G.js → targets-FC7CGFRD.js} +5 -5
- package/dist/{templates-WWY4ZVKR.js → templates-EF5LOWP5.js} +5 -5
- package/dist/{testimonials-YVHSZTWW.js → testimonials-MRMRWF2T.js} +6 -6
- package/dist/themes-2ZV7OCJ3.js +94 -0
- package/dist/themes-2ZV7OCJ3.js.map +1 -0
- package/dist/{top-companies-S2Y4I5HF.js → top-companies-VTLR6GTW.js} +5 -5
- package/dist/{translate-BTUMXQSK.js → translate-UMTKAUJ3.js} +15 -15
- package/dist/{triggers-T47AIYVB.js → triggers-Y7ZMMY3C.js} +5 -5
- package/dist/{unlink-XRKX6DVP.js → unlink-HZCFLXH4.js} +5 -5
- package/dist/{unstage-77RAGX3F.js → unstage-562HOOE7.js} +5 -5
- package/dist/{update-R3QSTHUD.js → update-ATSXY5UN.js} +5 -5
- package/dist/{update-RJLMUP7I.js → update-DKU2UDFA.js} +4 -4
- package/dist/{update-YRO5IHDX.js → update-I5A5TOZJ.js} +5 -5
- package/dist/{update-NQIRRGOW.js → update-ZF3VFYLB.js} +5 -5
- package/dist/{upload-KWFKNKAF.js → upload-SIAI6NMH.js} +5 -5
- package/dist/{url-options-GGXAL3J4.js → url-options-JSX6HBZL.js} +10 -7
- package/dist/url-options-JSX6HBZL.js.map +1 -0
- package/dist/{url-params-IMC43AIM.js → url-params-AZUI3CW3.js} +5 -5
- package/dist/{validate-Y6R6F5T3.js → validate-MC4EIQI5.js} +7 -7
- package/dist/{videos-U2FPMNFS.js → videos-S7BYFSU3.js} +5 -5
- package/dist/{web-AHTOJNQY.js → web-5R7LHKIT.js} +5 -5
- package/dist/{winning-ads-TUYN2BST.js → winning-ads-PDCY4YW5.js} +2 -2
- package/dist/{write-commands-CT74VHH6.js → write-commands-MFRZD6Q6.js} +4 -4
- package/dist/{write-commands-2XFNH4BW.js → write-commands-VXL5QKMT.js} +7 -7
- package/dist/{x-5GDVUJ2I.js → x-22PKVRYX.js} +7 -7
- package/package.json +1 -1
- package/dist/chunk-GX6VAHY7.js.map +0 -1
- package/dist/chunk-LLOOWRBB.js.map +0 -1
- package/dist/chunk-NE4F3FHN.js +0 -1854
- package/dist/chunk-NE4F3FHN.js.map +0 -1
- package/dist/chunk-XCM6XWOB.js +0 -417
- package/dist/chunk-XCM6XWOB.js.map +0 -1
- package/dist/chunk-ZJWUBJYQ.js.map +0 -1
- package/dist/credentials-4V55RYZ6.js.map +0 -1
- package/dist/draft-5YAYCEYY.js +0 -107
- package/dist/draft-5YAYCEYY.js.map +0 -1
- package/dist/google-M7KEXVK5.js.map +0 -1
- package/dist/query-IEZRY6HV.js.map +0 -1
- package/dist/url-options-GGXAL3J4.js.map +0 -1
- /package/dist/{account-2OBWFPRG.js.map → account-AO6PNNPO.js.map} +0 -0
- /package/dist/{accounts-TDTME6RQ.js.map → accounts-4TM4UZEJ.js.map} +0 -0
- /package/dist/{accounts-TZQVAJ3V.js.map → accounts-XDC26KK6.js.map} +0 -0
- /package/dist/{actions-FHYESJEE.js.map → actions-CJB4GZYA.js.map} +0 -0
- /package/dist/{add-Q6YFHEOR.js.map → add-BP4CUUKB.js.map} +0 -0
- /package/dist/{add-7XB5X3D3.js.map → add-RYR3QGOP.js.map} +0 -0
- /package/dist/{ads-PGTFZA5Q.js.map → ads-GII5LEOH.js.map} +0 -0
- /package/dist/{ads-6UEDYT3O.js.map → ads-SATXH4OD.js.map} +0 -0
- /package/dist/{adsets-Q5DWGANV.js.map → adsets-PMXNW3EG.js.map} +0 -0
- /package/dist/{advertisers-RKWQDCOI.js.map → advertisers-GM5UFI44.js.map} +0 -0
- /package/dist/{analytics-DEJKJNLN.js.map → analytics-4CD7CH7H.js.map} +0 -0
- /package/dist/{analytics-U5TTTX7K.js.map → analytics-JDPRLCHQ.js.map} +0 -0
- /package/dist/{assign-RHUKQWH2.js.map → assign-XI4HIIIM.js.map} +0 -0
- /package/dist/{audience-size-ICEKQRE4.js.map → audience-size-DHZ65PGA.js.map} +0 -0
- /package/dist/{audiences-AMRFZRZ7.js.map → audiences-D7CXP3ZF.js.map} +0 -0
- /package/dist/{audit-GWLQVB4A.js.map → audit-M7BZYBIS.js.map} +0 -0
- /package/dist/{autocomplete-NAEVFMKZ.js.map → autocomplete-B45I26R4.js.map} +0 -0
- /package/dist/{avatars-PMV6IMFV.js.map → avatars-75BALNB7.js.map} +0 -0
- /package/dist/{bid-pricing-XF3LD65L.js.map → bid-pricing-4RCP24BE.js.map} +0 -0
- /package/dist/{brand-ZC5HDP7B.js.map → brand-2TOLKYDY.js.map} +0 -0
- /package/dist/{brief-3EZ2JS5F.js.map → brief-5G4NEZ4O.js.map} +0 -0
- /package/dist/{campaign-groups-JSHBFYDG.js.map → campaign-groups-G7B26V7K.js.map} +0 -0
- /package/dist/{campaign-writes-5PHXENPN.js.map → campaign-writes-HZ7ART7W.js.map} +0 -0
- /package/dist/{campaigns-D6B6Z67Y.js.map → campaigns-MEEM3CNC.js.map} +0 -0
- /package/dist/{campaigns-HPRQVXTH.js.map → campaigns-OIJGTO7W.js.map} +0 -0
- /package/dist/{campaigns-LQXELRHZ.js.map → campaigns-RW3QJQ2F.js.map} +0 -0
- /package/dist/{canvas-4NVEZNW5.js.map → canvas-LXRLDE5G.js.map} +0 -0
- /package/dist/{capabilities-VQRNPBOZ.js.map → capabilities-BWSB7IFT.js.map} +0 -0
- /package/dist/{changes-TP7ZZHB3.js.map → changes-AYLNY6KN.js.map} +0 -0
- /package/dist/{chatgpt-QNUN63YS.js.map → chatgpt-TNSRA3L3.js.map} +0 -0
- /package/dist/{chats-Q4QPA3OQ.js.map → chats-MMHBJQFM.js.map} +0 -0
- /package/dist/{chunk-RXGR63TP.js.map → chunk-24GELJP3.js.map} +0 -0
- /package/dist/{chunk-ZKYNGME7.js.map → chunk-2D4ASTGN.js.map} +0 -0
- /package/dist/{chunk-PRIHMSJH.js.map → chunk-2K4LMCV2.js.map} +0 -0
- /package/dist/{chunk-4GACYQUI.js.map → chunk-2YJL6MEB.js.map} +0 -0
- /package/dist/{chunk-L27H2R2N.js.map → chunk-2ZY7HON7.js.map} +0 -0
- /package/dist/{chunk-RZTNH2TX.js.map → chunk-45OQOUJA.js.map} +0 -0
- /package/dist/{chunk-YT2BSTD3.js.map → chunk-7TNPEURJ.js.map} +0 -0
- /package/dist/{chunk-WKS6ZDUP.js.map → chunk-BSOWFWEU.js.map} +0 -0
- /package/dist/{chunk-X5ECCSHP.js.map → chunk-D23EKXOP.js.map} +0 -0
- /package/dist/{chunk-FC3U5XKS.js.map → chunk-D7PFF6UC.js.map} +0 -0
- /package/dist/{chunk-OU5YA2QX.js.map → chunk-DT2XXF6O.js.map} +0 -0
- /package/dist/{chunk-ARBKEE6E.js.map → chunk-DYOI4FQ7.js.map} +0 -0
- /package/dist/{chunk-4EVLVA2R.js.map → chunk-EFM7OODQ.js.map} +0 -0
- /package/dist/{chunk-P6KWFODZ.js.map → chunk-EIIANSBX.js.map} +0 -0
- /package/dist/{chunk-HJMRWBR5.js.map → chunk-EYK6G4XE.js.map} +0 -0
- /package/dist/{chunk-PKC6QBYJ.js.map → chunk-EZWYX343.js.map} +0 -0
- /package/dist/{chunk-LIQ4SQ2T.js.map → chunk-FEELV5IV.js.map} +0 -0
- /package/dist/{chunk-YCWIGXH6.js.map → chunk-GP7QUF5A.js.map} +0 -0
- /package/dist/{chunk-ZGGGA3JR.js.map → chunk-HOXZOOVA.js.map} +0 -0
- /package/dist/{chunk-TJOGO2MK.js.map → chunk-JU7FIHQ2.js.map} +0 -0
- /package/dist/{chunk-MVYLY2SF.js.map → chunk-KN7DFVKW.js.map} +0 -0
- /package/dist/{chunk-K5H3XOYQ.js.map → chunk-LI6PGY3L.js.map} +0 -0
- /package/dist/{chunk-3KEWXALS.js.map → chunk-MCWYIEWI.js.map} +0 -0
- /package/dist/{chunk-LIWBVGRE.js.map → chunk-MFQ5SUJT.js.map} +0 -0
- /package/dist/{chunk-HEOWTR7Z.js.map → chunk-OW4XDJV2.js.map} +0 -0
- /package/dist/{chunk-KYR4EG3E.js.map → chunk-PHEEJUFL.js.map} +0 -0
- /package/dist/{chunk-KHV5GALI.js.map → chunk-QNDLOCAI.js.map} +0 -0
- /package/dist/{chunk-GQ7JE7A7.js.map → chunk-UZUHXN7H.js.map} +0 -0
- /package/dist/{chunk-YWK4UBVU.js.map → chunk-V5QJBDBC.js.map} +0 -0
- /package/dist/{chunk-LP2QDRO4.js.map → chunk-WBUMUELD.js.map} +0 -0
- /package/dist/{chunk-EP5TYLNV.js.map → chunk-WEU6GKUQ.js.map} +0 -0
- /package/dist/{chunk-46TPPYCI.js.map → chunk-X5VHGXFB.js.map} +0 -0
- /package/dist/{chunk-3V57D7GE.js.map → chunk-XJRBFLBD.js.map} +0 -0
- /package/dist/{chunk-QS2BDKFL.js.map → chunk-Y63Y4QSY.js.map} +0 -0
- /package/dist/{chunk-PAQ3T6OT.js.map → chunk-YRVDCIJ2.js.map} +0 -0
- /package/dist/{claim-RHZVTMQZ.js.map → claim-UDNXCJIU.js.map} +0 -0
- /package/dist/{companies-LIKSVYSR.js.map → companies-RPZN4JTR.js.map} +0 -0
- /package/dist/{complete-OM7R6VOC.js.map → complete-HLSRQE3N.js.map} +0 -0
- /package/dist/{connect-AVX3NKP6.js.map → connect-TIJZO7OV.js.map} +0 -0
- /package/dist/{conversation-3HGRWXKO.js.map → conversation-BS7TF6LZ.js.map} +0 -0
- /package/dist/{conversion-upload-command-AUF3LNTH.js.map → conversion-upload-command-CSD344BY.js.map} +0 -0
- /package/dist/{conversions-XADFSQ4W.js.map → conversions-FEWAX64H.js.map} +0 -0
- /package/dist/{create-PQSDE4J3.js.map → create-4SH4BZXP.js.map} +0 -0
- /package/dist/{create-BWHYYATN.js.map → create-B4UVIJZI.js.map} +0 -0
- /package/dist/{create-Z4JLLTPG.js.map → create-F5FNHJKE.js.map} +0 -0
- /package/dist/{create-3I64N6RJ.js.map → create-L3JHP6J4.js.map} +0 -0
- /package/dist/{creatives-WPRN6CU4.js.map → creatives-LK2NZHRX.js.map} +0 -0
- /package/dist/{creatives-UEPLNCPN.js.map → creatives-RQ2DFHGI.js.map} +0 -0
- /package/dist/{creatives-6Z7CEW5O.js.map → creatives-UILBPOKO.js.map} +0 -0
- /package/dist/{critique-M5TMIG2D.js.map → critique-FAOH4FCP.js.map} +0 -0
- /package/dist/{critique-K632OHFP.js.map → critique-X7HYYEJ4.js.map} +0 -0
- /package/dist/{crm-CWT6BMMX.js.map → crm-RB5TVV3M.js.map} +0 -0
- /package/dist/{crm-Q2QK4ZMS.js.map → crm-XEQDSU2U.js.map} +0 -0
- /package/dist/{currency-XCGKQ7FE.js.map → currency-47QHFHDA.js.map} +0 -0
- /package/dist/{custom-conversions-2VLJGPRV.js.map → custom-conversions-7HOWR6X6.js.map} +0 -0
- /package/dist/{customers-7TS64ZM5.js.map → customers-P5WOUY6G.js.map} +0 -0
- /package/dist/{delete-H7W3V6QG.js.map → delete-DLQ2ZZDA.js.map} +0 -0
- /package/dist/{delete-BPSOLCGB.js.map → delete-GZKGPBBD.js.map} +0 -0
- /package/dist/{delete-RIY5VUTU.js.map → delete-SW5OSIGN.js.map} +0 -0
- /package/dist/{demographics-NHGM4QP7.js.map → demographics-ZLZOIWUE.js.map} +0 -0
- /package/dist/{discard-IBMOGEYB.js.map → discard-VNVNJWNX.js.map} +0 -0
- /package/dist/{discover-BJPZNXUQ.js.map → discover-P6TUGZ45.js.map} +0 -0
- /package/dist/{domain-Y3N2UY5I.js.map → domain-OBICRJP3.js.map} +0 -0
- /package/dist/{draft-322ZG6JG.js.map → draft-UECMJ6B4.js.map} +0 -0
- /package/dist/{draft-6KBILDJK.js.map → draft-V75RBORX.js.map} +0 -0
- /package/dist/{draft-P5T2QHCY.js.map → draft-Z3VUQ4LJ.js.map} +0 -0
- /package/dist/{facets-3SDK42HY.js.map → facets-7J66L3NK.js.map} +0 -0
- /package/dist/{feedback-P2JZTJY5.js.map → feedback-3LDG4WVJ.js.map} +0 -0
- /package/dist/{feedback-record-5O6UUWTZ.js.map → feedback-record-CTAUHLMF.js.map} +0 -0
- /package/dist/{fetch-LN5W3J4E.js.map → fetch-4RXXZGO4.js.map} +0 -0
- /package/dist/{flows-MN26KBWB.js.map → flows-GGB46DLH.js.map} +0 -0
- /package/dist/{fonts-7TXPTNCS.js.map → fonts-S3GWKOUJ.js.map} +0 -0
- /package/dist/{forecast-ZHBKYQFP.js.map → forecast-6JVKXNFB.js.map} +0 -0
- /package/dist/{funnel-UAXVM7JN.js.map → funnel-RCQOIQZ5.js.map} +0 -0
- /package/dist/{ga4-DV2AXCSL.js.map → ga4-U6DMJ6K4.js.map} +0 -0
- /package/dist/{get-EKYSQHNB.js.map → get-KQSM2MXM.js.map} +0 -0
- /package/dist/{get-P7SSZ46N.js.map → get-MN2GRXGZ.js.map} +0 -0
- /package/dist/{google-ads-LZDXDFPW.js.map → google-ads-YAJ33LTW.js.map} +0 -0
- /package/dist/{history-BFGVCJ4J.js.map → history-QWYLRQBO.js.map} +0 -0
- /package/dist/{hubspot-I3PNNF3E.js.map → hubspot-DDONLJ7R.js.map} +0 -0
- /package/dist/{ideas-ZNP5BOGE.js.map → ideas-N44Z2SIT.js.map} +0 -0
- /package/dist/{images-MWWGN672.js.map → images-BKHCBCE7.js.map} +0 -0
- /package/dist/{ingest-H7BWHY7L.js.map → ingest-HBECWLOB.js.map} +0 -0
- /package/dist/{ingest-NYP2ZAAK.js.map → ingest-VNRTFD4Y.js.map} +0 -0
- /package/dist/{inspect-FNNDBZQX.js.map → inspect-7GGJDJBJ.js.map} +0 -0
- /package/dist/{inspiration-S3DU4CMQ.js.map → inspiration-CGM3NK6X.js.map} +0 -0
- /package/dist/{intent-E3UIVZBN.js.map → intent-HKNBXEDS.js.map} +0 -0
- /package/dist/{keyword-gap-BG6M665A.js.map → keyword-gap-HUSP6MOT.js.map} +0 -0
- /package/dist/{keyword-metrics-WG5LLBUW.js.map → keyword-metrics-2C3VFGDQ.js.map} +0 -0
- /package/dist/{keywords-for-site-HVEAAODA.js.map → keywords-for-site-4GV4KS4X.js.map} +0 -0
- /package/dist/{landing-G5MLO4CZ.js.map → landing-V2FMPQOK.js.map} +0 -0
- /package/dist/{languages-HORKPDNH.js.map → languages-75YJZAHL.js.map} +0 -0
- /package/dist/{leads-XCAE4OVV.js.map → leads-DTULNGMU.js.map} +0 -0
- /package/dist/{leads-ARUWPHBM.js.map → leads-OPRVJBQG.js.map} +0 -0
- /package/dist/{learn-5WSN4PT5.js.map → learn-EW2CKOFS.js.map} +0 -0
- /package/dist/{line-item-writes-4EOQBQSC.js.map → line-item-writes-EF3BJ5KV.js.map} +0 -0
- /package/dist/{line-items-45X5BVQW.js.map → line-items-G467XOZF.js.map} +0 -0
- /package/dist/{link-XAXNBIKU.js.map → link-5SU4MR6M.js.map} +0 -0
- /package/dist/{linkedin-62HOT3HB.js.map → linkedin-OFM3VVOB.js.map} +0 -0
- /package/dist/{list-PLWORN75.js.map → list-HEWXAVCL.js.map} +0 -0
- /package/dist/{list-NYTQ3DBH.js.map → list-SUTCQLGI.js.map} +0 -0
- /package/dist/{list-H4SN4QYE.js.map → list-VFZPXFMA.js.map} +0 -0
- /package/dist/{locations-J4G5RNPH.js.map → locations-6XADFU3V.js.map} +0 -0
- /package/dist/{log-S7TEGEPL.js.map → log-I3MAU44R.js.map} +0 -0
- /package/dist/{make-F6FOFAS4.js.map → make-ALBJZKJZ.js.map} +0 -0
- /package/dist/{map-V3YC6Y5I.js.map → map-OT6F33VF.js.map} +0 -0
- /package/dist/{mcp-3R3FOL2H.js.map → mcp-LC3L2JQO.js.map} +0 -0
- /package/dist/{media-53DJRC4N.js.map → media-MYZ5I7WK.js.map} +0 -0
- /package/dist/{media-sources-356UORTR.js.map → media-sources-RK6EJYBQ.js.map} +0 -0
- /package/dist/{members-KATLJNPJ.js.map → members-7CHDHW7H.js.map} +0 -0
- /package/dist/{meta-A7KM6TF5.js.map → meta-7XP5AWYU.js.map} +0 -0
- /package/dist/{metrics-SQDJ5NQO.js.map → metrics-73LI743C.js.map} +0 -0
- /package/dist/{normalize-RUPEDCAV.js.map → normalize-CXMYHNSA.js.map} +0 -0
- /package/dist/{options-SCYGSRQX.js.map → options-E4IO5SR5.js.map} +0 -0
- /package/dist/{performance-U3MA6YXN.js.map → performance-UQLSBPYN.js.map} +0 -0
- /package/dist/{plan-4QP2G7GV.js.map → plan-NBFLYAOW.js.map} +0 -0
- /package/dist/{promoted-tweet-writes-5UMGETBC.js.map → promoted-tweet-writes-ZW3FUPFG.js.map} +0 -0
- /package/dist/{promoted-tweets-A3V53KZI.js.map → promoted-tweets-ZLQ6GZD5.js.map} +0 -0
- /package/dist/{publish-V22K43GA.js.map → publish-H2PBR5XN.js.map} +0 -0
- /package/dist/{reddit-UACCQN3B.js.map → query-GDUTZ4R7.js.map} +0 -0
- /package/dist/{run-HMFS4KQZ.js.map → reddit-TGQYQUNZ.js.map} +0 -0
- /package/dist/{refresh-PSXGRCJE.js.map → refresh-HVBCC2ZI.js.map} +0 -0
- /package/dist/{release-S2X7UL4U.js.map → release-VI3JT6O6.js.map} +0 -0
- /package/dist/{relevant-pages-OWMNUCP7.js.map → relevant-pages-2FW3E5KD.js.map} +0 -0
- /package/dist/{remove-4GTKRBUW.js.map → remove-4EE7STMS.js.map} +0 -0
- /package/dist/{reopen-3KUS6UZ2.js.map → reopen-LEGLAOMA.js.map} +0 -0
- /package/dist/{rerun-ZHD7C4W2.js.map → rerun-A5DPZFOO.js.map} +0 -0
- /package/dist/{research-7LO3G3EP.js.map → research-O6YMV2TG.js.map} +0 -0
- /package/dist/{research-UF6PKQPH.js.map → research-WOJELJ4K.js.map} +0 -0
- /package/dist/{reset-PVXTS3FZ.js.map → reset-PQHURJDC.js.map} +0 -0
- /package/dist/{reset-PU57HTAP.js.map → reset-V2X7DFHD.js.map} +0 -0
- /package/dist/{resolve-KBIYWRF7.js.map → resolve-Q4AACDIC.js.map} +0 -0
- /package/dist/{retry-HKWNIGON.js.map → retry-BB6NJBC4.js.map} +0 -0
- /package/dist/{retry-LSCVGZM5.js.map → retry-WMGEUJPB.js.map} +0 -0
- /package/dist/{sync-definition-6WBQN4Q3.js.map → run-OBYA2F3E.js.map} +0 -0
- /package/dist/{run-DU6RVXPA.js.map → run-V6E36GXW.js.map} +0 -0
- /package/dist/{scaffold-ad-SLUGKZIW.js.map → scaffold-ad-KKYI7FZJ.js.map} +0 -0
- /package/dist/{scaffold-static-ad-NRFAA5HL.js.map → scaffold-static-ad-R5UE4YIZ.js.map} +0 -0
- /package/dist/{scaffold-video-Q7BSFVS4.js.map → scaffold-video-Y2BWXZSX.js.map} +0 -0
- /package/dist/{schedule-VNTGMFLQ.js.map → schedule-EO27AZTT.js.map} +0 -0
- /package/dist/{scheduled-agents-6TNWXJVH.js.map → scheduled-agents-OIJBX7OO.js.map} +0 -0
- /package/dist/{schema-ZEOL467O.js.map → schema-7GSCTQIC.js.map} +0 -0
- /package/dist/{search-XUINK3C2.js.map → search-Q7PAV7NY.js.map} +0 -0
- /package/dist/{select-U3DVKV72.js.map → select-ASR5SBYE.js.map} +0 -0
- /package/dist/{set-prompt-EQIVJ5LR.js.map → set-prompt-I32464V4.js.map} +0 -0
- /package/dist/{setup-links-CLPE6UUM.js.map → setup-links-NP2HULRC.js.map} +0 -0
- /package/dist/{site-GIZB7NWB.js.map → site-PTIYQQ3Z.js.map} +0 -0
- /package/dist/{sources-7RGXA35S.js.map → sources-5FRMFKDA.js.map} +0 -0
- /package/dist/{sources-2PG4U4BC.js.map → sources-FJLCIG6X.js.map} +0 -0
- /package/dist/{stale-ODM7IOO2.js.map → stale-YUYMETFC.js.map} +0 -0
- /package/dist/{stats-NNXZMPZR.js.map → stats-F5JZVPYG.js.map} +0 -0
- /package/dist/{status-HKCIXG7P.js.map → status-UYIQFC7L.js.map} +0 -0
- /package/dist/{studio-EKIPLLHD.js.map → studio-6ZL76TZR.js.map} +0 -0
- /package/dist/{sync-LGDTHM6C.js.map → sync-527ZCA4A.js.map} +0 -0
- /package/dist/{tags-BQFPK55V.js.map → tags-2MX3332V.js.map} +0 -0
- /package/dist/{tags-N72F6AMR.js.map → tags-7767I2D6.js.map} +0 -0
- /package/dist/{tags-DRZ7GPP4.js.map → tags-J3BGX3E6.js.map} +0 -0
- /package/dist/{tags-Q5NWILJO.js.map → tags-O27SK3YX.js.map} +0 -0
- /package/dist/{tags-4NICM2LC.js.map → tags-VAYVSQM6.js.map} +0 -0
- /package/dist/{targeting-criteria-DXHMEEC2.js.map → targeting-criteria-GOTI75Y4.js.map} +0 -0
- /package/dist/{targets-A325AP5G.js.map → targets-FC7CGFRD.js.map} +0 -0
- /package/dist/{templates-WWY4ZVKR.js.map → templates-EF5LOWP5.js.map} +0 -0
- /package/dist/{testimonials-YVHSZTWW.js.map → testimonials-MRMRWF2T.js.map} +0 -0
- /package/dist/{top-companies-S2Y4I5HF.js.map → top-companies-VTLR6GTW.js.map} +0 -0
- /package/dist/{translate-BTUMXQSK.js.map → translate-UMTKAUJ3.js.map} +0 -0
- /package/dist/{triggers-T47AIYVB.js.map → triggers-Y7ZMMY3C.js.map} +0 -0
- /package/dist/{unlink-XRKX6DVP.js.map → unlink-HZCFLXH4.js.map} +0 -0
- /package/dist/{unstage-77RAGX3F.js.map → unstage-562HOOE7.js.map} +0 -0
- /package/dist/{update-R3QSTHUD.js.map → update-ATSXY5UN.js.map} +0 -0
- /package/dist/{update-RJLMUP7I.js.map → update-DKU2UDFA.js.map} +0 -0
- /package/dist/{update-YRO5IHDX.js.map → update-I5A5TOZJ.js.map} +0 -0
- /package/dist/{update-NQIRRGOW.js.map → update-ZF3VFYLB.js.map} +0 -0
- /package/dist/{upload-KWFKNKAF.js.map → upload-SIAI6NMH.js.map} +0 -0
- /package/dist/{url-params-IMC43AIM.js.map → url-params-AZUI3CW3.js.map} +0 -0
- /package/dist/{validate-Y6R6F5T3.js.map → validate-MC4EIQI5.js.map} +0 -0
- /package/dist/{videos-U2FPMNFS.js.map → videos-S7BYFSU3.js.map} +0 -0
- /package/dist/{web-AHTOJNQY.js.map → web-5R7LHKIT.js.map} +0 -0
- /package/dist/{winning-ads-TUYN2BST.js.map → winning-ads-PDCY4YW5.js.map} +0 -0
- /package/dist/{write-commands-CT74VHH6.js.map → write-commands-MFRZD6Q6.js.map} +0 -0
- /package/dist/{write-commands-2XFNH4BW.js.map → write-commands-VXL5QKMT.js.map} +0 -0
- /package/dist/{x-5GDVUJ2I.js.map → x-22PKVRYX.js.map} +0 -0
package/README.md
CHANGED
|
@@ -221,10 +221,10 @@ baker ads google currency --customer-id 5904042878
|
|
|
221
221
|
|
|
222
222
|
### `baker ads google url-options`
|
|
223
223
|
|
|
224
|
-
The UTM / tracking parameters in force on the account: the account-level Final URL Suffix and tracking template, plus every campaign that overrides them. Start here for any "add `utm_agency=…`" or agency-tag question.
|
|
224
|
+
The UTM / tracking parameters in force on the account: the account-level Final URL Suffix and tracking template, plus every campaign, ad group and ad that overrides them. Start here for any "add `utm_agency=…`" or agency-tag question.
|
|
225
225
|
|
|
226
226
|
```bash
|
|
227
|
-
baker ads google url-options --customer-id 1234567890 # overriding campaigns
|
|
227
|
+
baker ads google url-options --customer-id 1234567890 # overriding campaigns, ad groups and ads
|
|
228
228
|
baker ads google url-options --customer-id 1234567890 --full # every campaign read
|
|
229
229
|
```
|
|
230
230
|
|
|
@@ -235,15 +235,19 @@ Every value is a tagged union, never a bare string, so an unread level can never
|
|
|
235
235
|
"ok": true,
|
|
236
236
|
"data": {
|
|
237
237
|
"account": { "final_url_suffix": { "state": "set", "value": "utm_source=google" } },
|
|
238
|
-
"campaigns": { "
|
|
239
|
-
"
|
|
238
|
+
"campaigns": { "overrides": [], "omitted": 12 },
|
|
239
|
+
"ad_groups": { "read": true, "overrides": [], "truncated": false },
|
|
240
|
+
"ads": { "read": true, "overrides": [], "truncated": false },
|
|
241
|
+
"levels_not_read": []
|
|
240
242
|
}
|
|
241
243
|
}
|
|
242
244
|
```
|
|
243
245
|
|
|
244
246
|
`set` holds a value · `not_set` means Google carries none at that level · `not_read` means it was never observed. **Only `not_set` is a finding.**
|
|
245
247
|
|
|
246
|
-
Writing it: `baker ads google campaigns update <id> --final-url-suffix "utm_source=google&utm_agency=baker"` stages a campaign-level override (it *replaces* the account value for that campaign, it does not merge). The **account** level
|
|
248
|
+
Writing it: `baker ads google campaigns update <id> --final-url-suffix "utm_source=google&utm_agency=baker"` stages a campaign-level override (it *replaces* the account value for that campaign, it does not merge). The **account** level stages too: `baker ads google account update --customer-id … --final-url-suffix "utm_source=google&utm_agency=baker"` (or `campaigns update --level account --final-url-suffix …`, the same op) applies at publish with the rest of the draft; `""` clears it.
|
|
249
|
+
|
|
250
|
+
**Account settings** — `baker ads google account update --customer-id …` stages the account's own settings: `--final-url-suffix`, `--tracking-template`, `--auto-tagging` / `--auto-tagging=false`, `--call-reporting`, `--call-conversions`, `--video-inventory EXPANDED|STANDARD|LIMITED`. One card per account (staging again amends it), shown before → after; a setting the account already holds is a no-op. Turning auto-tagging off stages with a warning (conversion tracking loses the gclid). The conversion action that counts calls is not writable through Google's API.
|
|
247
251
|
|
|
248
252
|
---
|
|
249
253
|
|
|
@@ -317,19 +321,19 @@ baker ads google query --list-presets
|
|
|
317
321
|
|
|
318
322
|
Read it before interpreting any null. Field coverage is folded page by page on the `--out` path too, so the file summary reports it; `.resource_name` is never reported (the server strips it from every row).
|
|
319
323
|
|
|
320
|
-
**A page is not the data set.**
|
|
324
|
+
**A page is not the data set.** Every query is read a page at a time: without `--all` it returns one page of `--limit` rows (the preset's page size, else 200) and, when the account holds more, `pagination.cursor` — pass it back with `--cursor` (same query, same `--limit`) for the next page. `--all` follows every page until the account has no more rows; only a `LIMIT` written in the statement caps it. When the API returns a cursor the run did not follow, or the rows fill the statement's own `LIMIT`, the response carries a `TRUNCATED_RESULTS` warning:
|
|
321
325
|
|
|
322
326
|
```json
|
|
323
327
|
{
|
|
324
328
|
"ok": true,
|
|
325
329
|
"warnings": [{ "code": "TRUNCATED_RESULTS", "message": "INCOMPLETE READ — ..." }],
|
|
326
|
-
"pagination": { "hasMore": true, "cursor": "
|
|
330
|
+
"pagination": { "hasMore": true, "cursor": "skip:200.k3x9q2:" },
|
|
327
331
|
"data": [...],
|
|
328
332
|
"notice": "Read the \"warnings\" above before using these rows: TRUNCATED_RESULTS."
|
|
329
333
|
}
|
|
330
334
|
```
|
|
331
335
|
|
|
332
|
-
Never total or count from a response carrying it — re-run with `--all --
|
|
336
|
+
Never total or count from a response carrying it — re-run with `--all --out data.csv` (it pages through every row, however many) and check the re-run came back without the warning. A read that returns one row by construction — `FROM customer` with no segment selected, such as `--preset account-summary` — has no page to fill, so it never carries `TRUNCATED_RESULTS`, nor `CONVERSION_MIX`, since one account-wide row has no campaigns to total or compare. Warnings reach every output format, so no `--output` choice can hide one:
|
|
333
337
|
|
|
334
338
|
| `--output` | Where warnings land |
|
|
335
339
|
|------------|---------------------|
|
|
@@ -370,9 +374,10 @@ The same lines also go to stderr. A read with nothing to report prints none of i
|
|
|
370
374
|
| `--preset` | Named query template (see presets below) |
|
|
371
375
|
| `--date-range` | Override preset date range: a Google literal (LAST_7_DAYS, LAST_30_DAYS, LAST_MONTH, etc.) or `BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'` — there is no LAST_90_DAYS |
|
|
372
376
|
| `--include-paused` | Include paused entities in preset results. Off by default: presets return only actually-serving entities (enabled campaign **and** ad group **and** ad). Google Ads has no single serving flag, so the whole chain must be `ENABLED` for an entity to serve. |
|
|
373
|
-
| `--
|
|
374
|
-
| `--
|
|
375
|
-
| `--
|
|
377
|
+
| `--gaql` | The GAQL statement as a flag, instead of the positional |
|
|
378
|
+
| `--limit` | Rows per page (default: the preset's page size, else 200; at most 8,192). A page size, not a cap |
|
|
379
|
+
| `--cursor` | `pagination.cursor` from the previous page (same query, same `--limit`) |
|
|
380
|
+
| `--all` | Follow every page until the account has no more rows. Only a `LIMIT` written in the statement stops it early, and a read that fills that `LIMIT` is flagged `TRUNCATED_RESULTS` |
|
|
376
381
|
| `--out` | Write data to file (format from extension: .csv, .jsonl, .json) |
|
|
377
382
|
| `--append` | Append to existing file (skip CSV headers) |
|
|
378
383
|
| `--output` | Output format: `json` \| `csv` \| `jsonl` \| `md` |
|
|
@@ -393,9 +398,21 @@ The same lines also go to stderr. A read with nothing to report prints none of i
|
|
|
393
398
|
| `negative-list-attachments`| Which campaigns each shared list covers | ALL_TIME |
|
|
394
399
|
| `search-terms` | Actual user queries triggering ads | LAST_7_DAYS |
|
|
395
400
|
| `ad-copy-performance` | Ad headline/description effectiveness | LAST_30_DAYS |
|
|
396
|
-
| `asset-performance` | PMax
|
|
401
|
+
| `asset-performance` | PMax assets: serving status + metrics | LAST_30_DAYS |
|
|
397
402
|
| `shopping-products` | Product-level shopping metrics | LAST_30_DAYS |
|
|
398
403
|
| `account-summary` | Account-level totals | LAST_30_DAYS |
|
|
404
|
+
| `pmax-channels` | PMax spend/results per channel (Search, YouTube, Display, …) | LAST_30_DAYS |
|
|
405
|
+
| `pmax-placements` | Where PMax ads showed (impressions) | LAST_30_DAYS |
|
|
406
|
+
| `placements` | Display / Video / Demand Gen placements with cost and conversions | LAST_30_DAYS |
|
|
407
|
+
| `rsa-assets` | Each RSA headline/description: pin, approval, own metrics | LAST_30_DAYS |
|
|
408
|
+
| `landing-pages` | Final URLs with clicks, cost, speed score, mobile-friendly share | LAST_30_DAYS |
|
|
409
|
+
| `geo-performance` | Results by country and location type (in vs interested in) | LAST_30_DAYS |
|
|
410
|
+
| `age-performance` / `gender-performance` | Results by age range / gender per ad group | LAST_30_DAYS |
|
|
411
|
+
| `ai-max-search-terms` | AI Max search terms with the headline and landing page used | LAST_30_DAYS |
|
|
412
|
+
| `account-budget` | Account budget: limit, served, pending change | — |
|
|
413
|
+
| `recommendations` | Google's open recommendations with impact | — |
|
|
414
|
+
| `campaign-simulations` / `keyword-bid-simulations` | Google's what-if points (budget, tCPA, tROAS, CPC bid) | — |
|
|
415
|
+
| `campaigns`, `budgets`, `ad-groups`, `keywords`, `ads`, `assets`, `asset-groups`, `audiences`, `conversion-actions`, `bidding-strategies`, `labels`, `campaign-criteria`, `ad-group-criteria`, `ad-group-bid-modifiers`, `account-exclusions`, `shared-sets`, `campaign-negative-keywords`, `ad-group-negative-keywords` | Inventories behind the `<thing> list` commands | — |
|
|
399
416
|
|
|
400
417
|
Every preset except the negatives lists and `account-summary` filters to **actually-serving entities** by default — the full status chain (`campaign.status = 'ENABLED' AND ad_group.status = 'ENABLED' AND ad_group_ad.status = 'ENABLED'`, as applicable) — and selects the status columns so you can see them. Pass `--include-paused` to widen to `!= 'REMOVED'` (keeps paused, still drops removed). Raw GAQL (no `--preset`) has no such default: a query over a serving-hierarchy resource without a status filter emits a `SERVING_SCOPE` warning reminding you to add the chain, because Google Ads has no single serving flag.
|
|
401
418
|
|
|
@@ -411,13 +428,12 @@ The CLI rejects or automatically corrects common GAQL mistakes before hitting th
|
|
|
411
428
|
|
|
412
429
|
| Pattern | Behavior | Warning/error emitted |
|
|
413
430
|
|---------|----------|-----------------------|
|
|
414
|
-
| Missing LIMIT | Adds `LIMIT 200` | `"Added LIMIT 200. Use --limit to override."` |
|
|
415
431
|
| Bare `keyword.text` / `keyword.match_type` | Rewrites to `ad_group_criterion.*` (resource-scoped forms like `shared_criterion.keyword.text` pass through untouched) | `"keyword.text → ad_group_criterion.keyword.text"` |
|
|
416
432
|
| `shopping_performance_view.product_*` | Rewrites to `segments.product_*` | Field renamed |
|
|
417
433
|
| `campaign.status = 'ACTIVE'` | Rewrites to `= 'ENABLED'` | Enum corrected |
|
|
418
434
|
| `segments.conversion_action_name` with `metrics.cost_micros` | Rejects; split into separate conversion-action and spend queries | `INCOMPATIBLE_FIELDS` with `fix.action: "split_query"` |
|
|
419
435
|
| `DURING` with a literal Google does not accept (`LAST_90_DAYS`, `LAST_12_MONTHS`, `THIS_YEAR` …) | Rejects before any request; `DURING` takes only `TODAY`, `YESTERDAY`, `LAST_7_DAYS`, `LAST_14_DAYS`, `LAST_30_DAYS`, `LAST_BUSINESS_WEEK`, `THIS_MONTH`, `LAST_MONTH`, `THIS_WEEK_SUN_TODAY`, `THIS_WEEK_MON_TODAY`, `LAST_WEEK_SUN_SAT`, `LAST_WEEK_MON_SUN` | `INVALID_DATE_RANGE`, with `fix.correctedCommand` spelling the same window as `BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'` |
|
|
420
|
-
| `--limit` outside 1–8,192
|
|
436
|
+
| `--limit` outside 1–8,192 | Rejects before any request — one page holds at most 8,192 rows | `VALIDATION_ERROR` pointing at `--all --out` for bigger reads |
|
|
421
437
|
| `FROM ad_group_criterion` without `negative` field | Warns | `"ad_group_criterion returns BOTH positive and negative keywords. Use --preset positive-keywords or negative-keywords."` |
|
|
422
438
|
|
|
423
439
|
Auto-fixed queries proceed normally. Warnings appear in the response:
|
|
@@ -456,7 +472,7 @@ Google keeps account history in two layers, and neither reaches past 90 days:
|
|
|
456
472
|
|
|
457
473
|
| Scope | Reach | What you get |
|
|
458
474
|
|-------------|---------|---------------------------------------------------------------------|
|
|
459
|
-
| `detail` | 30 days | What changed, old
|
|
475
|
+
| `detail` | 30 days | What changed — a `changes` list of `{ field, old, new }` per changed field — and who changed it |
|
|
460
476
|
| `summary` | 90 days | Which resources were added, changed or removed — no values, no user |
|
|
461
477
|
|
|
462
478
|
Beyond 90 days there is no API. Infer the change from a monthly spend trend per campaign
|
|
@@ -481,6 +497,43 @@ baker ads google changes --customer-id 1234567890 --days 60 --scope summary
|
|
|
481
497
|
|
|
482
498
|
---
|
|
483
499
|
|
|
500
|
+
### `baker ads google keywords forecast` / `keywords themes`
|
|
501
|
+
|
|
502
|
+
```bash
|
|
503
|
+
baker ads google keywords forecast --customer-id 1234567890 --text "running shoes:PHRASE,trail shoes:EXACT" --max-cpc 1.2 --location 2724 --language 1003
|
|
504
|
+
baker ads google keywords forecast --customer-id 1234567890 --text "crm software" --match-type BROAD --daily-spend 20 --strategy MAXIMIZE_CONVERSIONS --start 2026-11-01 --end 2026-11-30
|
|
505
|
+
baker ads google keywords themes --customer-id 1234567890 --keywords "trail shoes,road shoes" --ad-groups 111,222
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
`forecast` returns Google's Keyword Planner forecast (v25) for the whole period under one bidding strategy: `{ source: "keyword_planner_forecast", period, forecast_clicks, forecast_cost_micros, forecast_conversions, forecast_average_cpc_micros, forecast_average_cpa_micros }`. `--max-cpc` alone is Manual CPC; `--daily-spend` is Maximize clicks (or Maximize conversions with `--strategy`). Without `--start/--end` it forecasts the 30 days from tomorrow. `themes` returns which existing ad group each keyword fits (`suggestions`) and the ad groups Google could not read a theme from (`unusable_ad_groups`).
|
|
509
|
+
|
|
510
|
+
### `baker ads google previews` / `invoices` / `identity-verification` / `brands`
|
|
511
|
+
|
|
512
|
+
```bash
|
|
513
|
+
baker ads google previews --customer-id 1234567890 --asset-groups 6743268912 # Performance Max, Google's preview page
|
|
514
|
+
baker ads google previews --customer-id 1234567890 --ads 111~222 # a Video campaign's ad, live on YouTube
|
|
515
|
+
baker ads google invoices --customer-id 1234567890 --month 2026-09
|
|
516
|
+
baker ads google identity-verification --customer-id 1234567890
|
|
517
|
+
baker ads google brands --customer-id 1234567890 --prefix nike # brand entity ids for a BRANDS list
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
Read-only. A refusal that is the account's situation comes back as a structured error the agent carries on from: `NOT_INVOICED` (not billed by monthly invoicing — no invoices through the API), `VERIFICATION_NOT_READABLE` (verification status is only readable through the API on monthly invoicing), `NO_PREVIEW_FOR_AD_TYPE` (only video ads of Video campaigns preview by ad). Each `error.fix` says where the answer lives instead.
|
|
521
|
+
|
|
522
|
+
### `baker ads google <thing> list`
|
|
523
|
+
|
|
524
|
+
What exists, with the id or resource name each write command takes — one inventory preset read through `query`, so it pages (`--limit`, `--cursor`, `--all --out`) and formats (`--output`) the same way. Paused entities are listed; removed ones are not; `--serving-only` narrows to what serves.
|
|
525
|
+
|
|
526
|
+
```bash
|
|
527
|
+
baker ads google campaigns list --customer-id 1234567890
|
|
528
|
+
baker ads google keywords list --customer-id 1234567890 --all --out keywords.csv
|
|
529
|
+
baker ads google negative-keywords list --customer-id 1234567890 --level adGroup
|
|
530
|
+
baker ads google keyword-lists list --customer-id 1234567890 --members
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
Lists exist for `campaigns`, `budgets`, `ad-groups`, `keywords`, `negative-keywords` (`--level campaign|adGroup`), `keyword-lists` (`--members` for the terms), `ads`, `assets`, `asset-groups`, `audiences`, `conversions`, `bidding-strategies`, `labels`, `campaign-criteria`, `ad-group-criteria`, `ad-group-bid-modifiers` and `account-exclusions`.
|
|
534
|
+
|
|
535
|
+
---
|
|
536
|
+
|
|
484
537
|
### `baker ads google keywords discover`
|
|
485
538
|
|
|
486
539
|
Discover keyword ideas from seed keywords or URLs.
|
|
@@ -488,6 +541,7 @@ Discover keyword ideas from seed keywords or URLs.
|
|
|
488
541
|
```bash
|
|
489
542
|
baker ads google keywords discover --customer-id 1234567890 --seeds "running shoes,athletic footwear"
|
|
490
543
|
baker ads google keywords discover --customer-id 1234567890 --url "https://competitor.com" --limit 50
|
|
544
|
+
baker ads google keywords discover --customer-id 1234567890 --seeds "running shoes" --cursor <next_page_token> # next page
|
|
491
545
|
```
|
|
492
546
|
|
|
493
547
|
**Response:**
|
|
@@ -601,6 +655,8 @@ Reference not-yet-created resources with `g_temp_*` refs returned by earlier `cr
|
|
|
601
655
|
```bash
|
|
602
656
|
# Build a Search campaign bottom-up, chaining temp refs
|
|
603
657
|
baker ads google budgets create --customer-id 1234567890 --name "Search budget" --amount 50
|
|
658
|
+
# Delivery is always STANDARD: --delivery ACCELERATED is refused (Google stores such a budget but will
|
|
659
|
+
# not attach it to a campaign).
|
|
604
660
|
# → { ref: "g_temp_ab12", ... }
|
|
605
661
|
baker ads google campaigns create --customer-id 1234567890 --name "Brand — Search" \
|
|
606
662
|
--channel-type SEARCH --budget-ref g_temp_ab12 --bidding-strategy MANUAL_CPC \
|
|
@@ -633,6 +689,10 @@ baker ads google campaigns update <campaign-id> --customer-id 1234567890 \
|
|
|
633
689
|
# --ai-max-url-expansion (final URL expansion, needs text customization). An omitted switch
|
|
634
690
|
# keeps the campaign's value; a combination Google refuses is refused at staging.
|
|
635
691
|
baker ads google campaigns update <campaign-id> --customer-id 1234567890 --ai-max --ai-max-text
|
|
692
|
+
# Bidding is per campaign type — staging refuses a pair Google does not take and names the ones it does.
|
|
693
|
+
# Target impression share (Search only) needs its whole goal on a new strategy:
|
|
694
|
+
baker ads google campaigns update <campaign-id> --customer-id 1234567890 --bidding-strategy TARGET_IMPRESSION_SHARE \
|
|
695
|
+
--impression-share 70 --impression-share-location ABSOLUTE_TOP_OF_PAGE --max-cpc 2
|
|
636
696
|
baker ads google ad-groups create --customer-id 1234567890 --name "Brand terms" --campaign-ref g_temp_<campaign>
|
|
637
697
|
baker ads google keywords add --customer-id 1234567890 --ad-group-ref g_temp_<adgroup> --text "brand name" --match-type EXACT
|
|
638
698
|
# Shared negative keyword list → attach to the campaign
|
|
@@ -666,7 +726,7 @@ baker ads google ads create --customer-id 1234567890 --ad-group-ref g_temp_<adgr
|
|
|
666
726
|
# Video ad — the YouTube video is its own asset first, then referenced by --video-assets
|
|
667
727
|
baker ads google assets create --customer-id 1234567890 --file '{"type":"youtubeVideo","youtubeVideoId":"dQw4w9WgXcQ"}'
|
|
668
728
|
baker ads google ads create --customer-id 1234567890 --ad-group-ref g_temp_<adgroup> --format video \
|
|
669
|
-
--video-assets g_temp_<video> --final-url https://example.com
|
|
729
|
+
--video-assets g_temp_<video> --business-name "Acme" --logo-image-assets g_temp_<img_logo> --final-url https://example.com
|
|
670
730
|
# Demand Gen ad — image refs the same way
|
|
671
731
|
baker ads google ads create --customer-id 1234567890 --ad-group-ref g_temp_<adgroup> --format demandGen \
|
|
672
732
|
--headlines "Discover the app" --descriptions "Try it free today" --business-name "Acme" --final-url https://example.com \
|
|
@@ -681,6 +741,8 @@ baker ads google ads create --customer-id 1234567890 --ad-group-ref g_temp_<adgr
|
|
|
681
741
|
# App campaign ad — images are fields on the ad itself, same asset-ref flow
|
|
682
742
|
baker ads google ads create --customer-id 1234567890 --ad-group-ref g_temp_<adgroup> --format app \
|
|
683
743
|
--headlines "Insure your dog" --descriptions "Refunds in 2 hours" --image-assets g_temp_<img1>,g_temp_<img2>
|
|
744
|
+
# Call ads are retired — Google's API has no call ad, so --format call is refused. Stage a responsive
|
|
745
|
+
# search ad and have the user add the phone number as a call asset in Google Ads.
|
|
684
746
|
# Change a live ad's content — every field you pass replaces its current value, so list what you want to keep
|
|
685
747
|
baker ads google ads update <adId> --customer-id 1234567890 --format app \
|
|
686
748
|
--headlines "Insure your dog" --descriptions "Refunds in 2 hours" \
|
|
@@ -702,9 +764,16 @@ baker ads google asset-groups attach --customer-id 1234567890 \
|
|
|
702
764
|
baker ads google asset-groups detach customers/1234567890/assetGroupAssets/6718302454~402654762568~PORTRAIT_MARKETING_IMAGE \
|
|
703
765
|
--customer-id 1234567890
|
|
704
766
|
|
|
767
|
+
# Audiences — each type carries what Google builds it from (a type alone is refused)
|
|
768
|
+
baker ads google audiences create --customer-id 1234567890 --file '{"name":"Pricing visitors","type":"RULE_BASED","rule":{"include":[{"conditions":[{"operator":"CONTAINS","value":"/pricing"}],"lookbackWindowDays":30}],"prefill":true}}'
|
|
769
|
+
# BASIC takes "conversionActions", LOGICAL "logic", LOOKALIKE "lookalike" — each naming lists/actions
|
|
770
|
+
# that already exist in the account (not g_temp_* refs). `baker ads google audiences create --help` has one example per type.
|
|
771
|
+
|
|
705
772
|
# Review / undo / amend staged changes
|
|
706
773
|
baker ads google draft list # readable campaign ▸ ad group ▸ ad tree + completeness advisories
|
|
707
774
|
baker ads google draft list --json # raw JSON envelope for scripting
|
|
775
|
+
baker ads google draft validate # dry run the whole draft against Google (validateOnly) — per-op verdicts
|
|
776
|
+
baker ads google draft validate --full # every op, with the built request and Google's raw answer
|
|
708
777
|
baker ads google draft show g_temp_ab12 # full staged payload — the receipt before publish
|
|
709
778
|
baker ads google draft amend g_temp_ab12 --patch '{"amountMicros": 60000000}' # update in place, never remove+recreate
|
|
710
779
|
baker ads google draft remove g_temp_ab12 # cascades to dependents
|
|
@@ -719,7 +788,17 @@ baker tag-manager draft show --chat <chat-id> gtm_temp_ab12
|
|
|
719
788
|
baker actions draft --chat <chat-id>
|
|
720
789
|
```
|
|
721
790
|
|
|
722
|
-
|
|
791
|
+
**Budgets and portfolios** — `budgets create --total 300` stages a total budget (one amount over the campaign's flight; Search, Performance Max and Demand Gen; the campaign needs `--end-date`; never shared) instead of `--amount`'s daily one, and `budgets update --total` moves it. `campaigns create|update --portfolio-ref <ref>` puts a campaign on a portfolio bid strategy (checked against the campaign type); staging a campaign's own `--bidding-strategy` while it is on a portfolio takes it off (with a warning). `budgets remove <id>` and `bidding-strategies remove <id>` remove a budget / portfolio once no campaign uses it — staging refuses while one does, unless the same draft removes or moves those campaigns; publish removes the campaigns first.
|
|
792
|
+
|
|
793
|
+
**Shopping campaigns** — `campaigns create --channel-type SHOPPING --merchant-id <id>` (`merchant-center list` shows the Merchant Center accounts linked to the account; staging refuses any other) with optional `--feed-label`, `--shopping-priority low|medium|high` and `--local-inventory`; `campaigns update` changes those three (`--clear-feed-label`), never the Merchant Center. `ad-groups create --type SHOPPING_PRODUCT_ADS` creates the ad group with its "All products" listing group, and `ads create --format shoppingProduct` its product ad (no copy — the feed supplies it). A retail Performance Max campaign takes `--merchant-id` / `--feed-label` too.
|
|
794
|
+
|
|
795
|
+
**App, Travel and Hotel campaigns** — App: `campaigns create --channel-type MULTI_CHANNEL --sub-type APP_CAMPAIGN|APP_CAMPAIGN_FOR_ENGAGEMENT --app-id <package or App Store id> --app-store google|apple --app-goal installs|installs-volume|in-app|in-app-install-cost|value [--app-conversions <ids>]` (each goal takes one bidding strategy; App ads are created enabled — Google refuses a paused one, so `ads create --format app` defaults to `ENABLED`). Travel: `--channel-type TRAVEL --travel-account-id <id>` on Maximize conversion value with `--target-roas`. Hotel: `--channel-type HOTEL --hotel-center-id <id>`. Staging asks Google (validate-only) whether the app, the travel account or Hotel Center is there and refuses with what to ask the user when it is not. Smart campaigns are refused (their business setting cannot be validated).
|
|
796
|
+
|
|
797
|
+
**Dynamic Search Ads and frequency caps** — `campaigns create|update --dsa-domain <domain> --dsa-language <code> [--dsa-supplied-urls-only]` (Search only; an update may change one field; it cannot be removed) and `--frequency-cap <cap>/<day|week|month>[/<campaign|ad-group|ad>][/<impressions|video-views>]` (repeatable, replaces the campaign's caps; `--clear-frequency-caps`; Display and existing Video campaigns only).
|
|
798
|
+
|
|
799
|
+
**Performance Max creative controls** — `campaigns create|update` take `--term-exclusion` / `--messaging-restriction` (text guidelines; a Search create needs `--ai-max --ai-max-text`), the generated-asset switches `--generated-text --url-expansion --video-enhancement --image-enhancement --image-extraction --image-design-versions` (each `=false` to turn off), `--brand-guidelines` on create (link the business name and a square logo to the campaign in the same draft) and `--main-color --accent-color --font`. `campaigns enable-brand-guidelines <id> --business-name-asset --logo-assets [--landscape-logo-assets] [--final-url-domain] | --auto-populate` turns brand guidelines on for an existing campaign at publish (no dry run: `draft validate` shows it unchecked).
|
|
800
|
+
|
|
801
|
+
Command groups: `account` (update), `budgets` (create/update/remove), `campaigns`, `ad-groups`, `keywords` (add/update/pause/resume/remove), `negative-keywords` (add/update/remove — `update <resource name> --text --match-type` publishes as a replace of the live negative), `keyword-lists` (create/rename/delete a list — `--type NEGATIVE_KEYWORDS|NEGATIVE_PLACEMENTS|BRANDS|ACCOUNT_LEVEL_NEGATIVE_KEYWORDS`; add/remove its members — keywords, or `--placement/--app/--youtube-channel/--youtube-video/--brand`; attach/detach), `ads`, `assets` (create/update/attach/detach), `asset-groups` (create/update/attach/detach — Performance Max), `audiences`, `conversions` (create/update/goal/upload), `bidding-strategies` (create/update/remove), `labels` (create/update/remove; attach/detach on a campaign, ad group, ad or keyword — `--level --on --label-ref`), `campaign-criteria` (add/update/remove — locations, languages, schedule, devices, radius, carriers, operating systems, and exclusions of placements, apps, YouTube, topics, demographics, content types, IP addresses, web pages, brand lists), `ad-group-criteria` (add/update/remove — placements, topics, demographics, web pages, Demand Gen locations/languages/combined audience; `update --bid-modifier --max-cpc --status`), `ad-group-bid-modifiers` (add/update/remove — one ad group's own device bid), `account-exclusions` (add/remove — account-wide site, app, YouTube, content-type, IP and negative-keyword-list exclusions; `add --placement --youtube-channel --youtube-video --app --content-label --ip` comma-separated, or `--file`), `merchant-center` (list), and `draft`. `audiences attach` takes `--user-list`, `--interest` or `--custom-segment`. Amounts are in major currency units (converted to micros). Money/bids: `--amount`, `--cpc-bid`, `--target-cpa`, `--target-cpc`, `--max-cpc` take major units; `--target-roas` a ratio. `--target-cpc` pairs with `--bidding-strategy TARGET_CPC` and is Demand Gen only. `--max-cpc` sets the max CPC bid ceiling for `TARGET_IMPRESSION_SHARE` / `TARGET_SPEND` / `PERCENT_CPC` and must be paired with `--bidding-strategy`. Less-common ops accept a `--file` payload — a path to a JSON file, or the JSON object written inline (flags override its keys). Updates target a resource name or bare id as the positional argument; a target that names an op staged earlier **amends it in place**.
|
|
723
802
|
|
|
724
803
|
**A device criterion can be added, but never removed** — `campaign-criteria add` with a device criterion works, but Google then rejects `campaign-criteria remove` on it forever, including on a criterion you added yourself (and Baker refuses the removal before publish). Adjust it instead with `campaign-criteria update customers/<cid>/campaignCriteria/<campaignId>~<criterionId> --bid-modifier <n>`: `1` for no adjustment, `1.25` to bid 25% more, `0.9` to bid 10% less, `0` to stop serving on that device. Locations, languages and ad schedules remove normally.
|
|
725
804
|
|
|
@@ -733,6 +812,8 @@ Command groups: `budgets`, `campaigns`, `ad-groups`, `keywords` (add/update/remo
|
|
|
733
812
|
|
|
734
813
|
**Retiring a conversion action** — `status` accepts `ENABLED` and `REMOVED` only. Google denies `HIDDEN` on every conversion-action write, so to stop bidding toward an action while it keeps measuring use `--no-primary`, and to stop it counting at all use `"status": "REMOVED"`. Conversion actions **Google owns** cannot be changed at all — Smart campaign call/directions actions, the in-ad lead form's submit, YouTube subscriptions and follow-on views, Floodlight and Search Ads 360 imports, store visits, codeless webpage actions. Staging any edit to one, a rename included, is refused up front; there is no manual route either, since the Google Ads interface will not change them.
|
|
735
814
|
|
|
815
|
+
**Validating the draft** — `baker ads google draft validate` sends the whole staged draft to Google exactly as publish would (same batching and order), with `validateOnly: true`, so nothing is applied. Each op comes back `accepted`, `refused` (with the reason publish would record), `blocked` (a change it depends on is refused), `unchecked` (only publish can check it — a new asset group, whose text assets are created first) or `applied` (an earlier publish did). Compact by default (counts plus the ops that need attention); `--full` lists every op with its request and Google's raw answer.
|
|
816
|
+
|
|
736
817
|
**Reviewing the draft** — `baker ads google draft list` renders everything you've staged as a grouped campaign ▸ ad group ▸ ad tree (with non-blocking completeness advisories), the CLI counterpart to the dashboard's Google Ads tab. Pass `--json` for the raw envelope. Once the chat has published it reports the outcome instead — `published · N applied, M failed`, with a `✗` line naming each op that did not land and why. Aim for a fully built campaign — 2–4 ad groups, ≥5 keywords each, 2–4 RSAs with 8–12 headlines, ≥4 sitelinks / ≥3 callouts / ≥1 structured snippet, and ≥1 shared negative list; the advisories flag what's still thin.
|
|
737
818
|
|
|
738
819
|
**Amending a staged op** — `draft amend <ref> (--file patch.json | --patch '<json>')` merges a JSON patch into an already-staged op's payload (objects deep-merge, `null` deletes a key, arrays/scalars replace) and re-validates it in full. Always prefer this over removing and re-staging — it preserves the op's ref (so dependents don't break) and its position in the draft. `draft show <ref>` prints the full staged payload (including warnings/annotations) so you can verify a change looks right before publish.
|
|
@@ -745,6 +826,8 @@ Command groups: `budgets`, `campaigns`, `ad-groups`, `keywords` (add/update/remo
|
|
|
745
826
|
|
|
746
827
|
**Batch keyword adds** — `keywords add`, `negative-keywords add`, and `keyword-lists add` take a whole batch in one command: comma-separate `--text` entries and/or pass `--file <list.txt>` (one keyword per line). A `:EXACT`/`:PHRASE`/`:BROAD` suffix per entry overrides the `--match-type` default. Batches stage all-or-nothing as one request (limit 500); each keyword still lands as its own draft op, so it stays individually removable/amendable.
|
|
747
828
|
|
|
829
|
+
**Bulk changes — one file, one call** — `draft stage --file ops.json [--customer-id <id>]` stages up to 500 ops of any mix of kinds in one request: the file is a JSON array (or JSON Lines) of whole ops `{"kind","customerId"?,"target"?,"payload"?}`; `--customer-id` fills ops that leave it out. All-or-nothing on validity (an error names `ops[i]`); ops the account already satisfies come back as `skipped`. An op may name a `g_temp_*` ref from an earlier call, not one from the same file. `draft amend --file amends.json` (no ref) amends many staged ops at once from `[{"ref","patch"}, …]`, all or none. The `--file` create commands (`assets create|attach`, `audiences create`, `conversions create`, `bidding-strategies create`, `labels attach`, `campaign-criteria add`, `ad-group-criteria add`) take a JSON array of payloads too. `keywords pause|resume <target>…` (or `--file`, one resource name per line) change many keywords' status in one call, and `keyword-lists remove --list-ref <id> --text "a,b:EXACT"` takes terms out of a shared negative list — the CLI reads the list to find each member (no `:MATCH_TYPE` = every match type), or takes members by resource name / `listId~criterionId`. Five single stages of one kind in a row on a chat earn a `LOOP:` hint pointing at these. A chat's draft holds any number of ops (each is its own record); only one op over `GOOGLE_DRAFT_OP_MAX_BYTES` (512 KB) is refused — the stage or amend stages nothing and answers `OP_TOO_LARGE` with an `error.fix` (split that change).
|
|
830
|
+
|
|
748
831
|
**Pausing or removing a keyword returns a per-ad-group hint** — `keywords update --status PAUSED|REMOVED` and `keywords remove` come back with hints telling you to base the decision on `keyword_view` rows carrying `ad_group.id` + `ad_group_criterion.criterion_id`, never on campaign totals. A keyword's criterion id is derived from its text + match type, so every copy of the same keyword across ad groups shares one id and any aggregate blends the copy holding the history with the copies that never served. The `keyword-analysis` and `positive-keywords` presets select both ids so one query identifies each copy. A bid or URL edit gets no hint — only a pause/removal can strand history.
|
|
749
832
|
|
|
750
833
|
---
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
csvOrJson,
|
|
3
3
|
handleLinkedinError,
|
|
4
4
|
resolveAccountIdArg
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-V5QJBDBC.js";
|
|
6
6
|
import {
|
|
7
7
|
writeAdsJson,
|
|
8
8
|
writeAdsOutput
|
|
@@ -10,11 +10,11 @@ import {
|
|
|
10
10
|
import {
|
|
11
11
|
NO_CACHE_ARG
|
|
12
12
|
} from "./chunk-X7ZODEXJ.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-45OQOUJA.js";
|
|
14
14
|
import "./chunk-GXDLWBOY.js";
|
|
15
15
|
import "./chunk-TEINLN64.js";
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-XQIOCIDO.js";
|
|
17
|
+
import "./chunk-ML7DLFFY.js";
|
|
18
18
|
import {
|
|
19
19
|
apiGet
|
|
20
20
|
} from "./chunk-XBOK23HI.js";
|
|
@@ -68,7 +68,7 @@ Examples:
|
|
|
68
68
|
},
|
|
69
69
|
subCommands: {
|
|
70
70
|
detail: accountDetailCommand,
|
|
71
|
-
"url-params": () => import("./write-commands-
|
|
71
|
+
"url-params": () => import("./write-commands-VXL5QKMT.js").then((m) => m.accountUrlParamsCommand)
|
|
72
72
|
},
|
|
73
73
|
args: accountDetailCommand.args,
|
|
74
74
|
default: "detail"
|
|
@@ -76,4 +76,4 @@ Examples:
|
|
|
76
76
|
export {
|
|
77
77
|
accountCommand
|
|
78
78
|
};
|
|
79
|
-
//# sourceMappingURL=account-
|
|
79
|
+
//# sourceMappingURL=account-AO6PNNPO.js.map
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import {
|
|
2
|
+
exitWithServiceReadError
|
|
3
|
+
} from "./chunk-QM6T4BFA.js";
|
|
4
|
+
import {
|
|
5
|
+
failWriteValidation,
|
|
6
|
+
listFlag,
|
|
7
|
+
requireCustomerId
|
|
8
|
+
} from "./chunk-4KCKNAVW.js";
|
|
9
|
+
import "./chunk-ERSX3MKH.js";
|
|
10
|
+
import "./chunk-XY7BZSDQ.js";
|
|
11
|
+
import "./chunk-4NZ47VXO.js";
|
|
12
|
+
import "./chunk-D5FY4FAK.js";
|
|
13
|
+
import "./chunk-F2S5BLPE.js";
|
|
14
|
+
import "./chunk-7VHPAGPK.js";
|
|
15
|
+
import {
|
|
16
|
+
getManagerIdForCustomer,
|
|
17
|
+
writeJsonEnvelope
|
|
18
|
+
} from "./chunk-VFIOJD5M.js";
|
|
19
|
+
import "./chunk-WTOYCUKH.js";
|
|
20
|
+
import "./chunk-DZSIUEGH.js";
|
|
21
|
+
import "./chunk-VAJBWA2U.js";
|
|
22
|
+
import "./chunk-HRYOZUSK.js";
|
|
23
|
+
import "./chunk-VVZBBKRC.js";
|
|
24
|
+
import "./chunk-YBMVHGY3.js";
|
|
25
|
+
import "./chunk-XQIOCIDO.js";
|
|
26
|
+
import "./chunk-ML7DLFFY.js";
|
|
27
|
+
import {
|
|
28
|
+
apiPost
|
|
29
|
+
} from "./chunk-XBOK23HI.js";
|
|
30
|
+
import "./chunk-IFWP3ZDO.js";
|
|
31
|
+
import "./chunk-NAWWC5I3.js";
|
|
32
|
+
import {
|
|
33
|
+
registerSchema
|
|
34
|
+
} from "./chunk-NU7JSWVA.js";
|
|
35
|
+
import "./chunk-YQSBHWOI.js";
|
|
36
|
+
|
|
37
|
+
// src/commands/ads/google/account-reads.ts
|
|
38
|
+
import { defineCommand } from "citty";
|
|
39
|
+
function register(command, description, args) {
|
|
40
|
+
registerSchema({
|
|
41
|
+
command,
|
|
42
|
+
description,
|
|
43
|
+
args: Object.fromEntries(
|
|
44
|
+
Object.entries(args).map(([name, arg]) => [
|
|
45
|
+
name,
|
|
46
|
+
{ type: arg.type, description: arg.description, required: false }
|
|
47
|
+
])
|
|
48
|
+
)
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
async function serviceRead(path, customerId, body) {
|
|
52
|
+
const managerId = getManagerIdForCustomer(customerId);
|
|
53
|
+
const { data } = await apiPost(path, {
|
|
54
|
+
customerId,
|
|
55
|
+
...managerId ? { managerId } : {},
|
|
56
|
+
...body
|
|
57
|
+
});
|
|
58
|
+
return data;
|
|
59
|
+
}
|
|
60
|
+
var CUSTOMER_ARG = {
|
|
61
|
+
"customer-id": { type: "string", description: "Google Ads customer ID (10 digits, no dashes)" }
|
|
62
|
+
};
|
|
63
|
+
var INVOICE_ARGS = {
|
|
64
|
+
...CUSTOMER_ARG,
|
|
65
|
+
month: { type: "string", description: "Issue month, YYYY-MM (default: last month)" }
|
|
66
|
+
};
|
|
67
|
+
register(
|
|
68
|
+
"ads.google.invoices",
|
|
69
|
+
"List the invoices Google issued in one month (accounts on monthly invoicing only): id, dates, service period, subtotal/tax/total in micros, PDF link. Start here: `baker ads google invoices --customer-id 1234567890 --month 2026-09`. An account that pays automatically has no invoices \u2014 the error's fix says where its receipts are; carry on.",
|
|
70
|
+
INVOICE_ARGS
|
|
71
|
+
);
|
|
72
|
+
var invoicesCommand = defineCommand({
|
|
73
|
+
meta: {
|
|
74
|
+
name: "invoices",
|
|
75
|
+
description: `List one month's invoices (monthly-invoicing accounts only). Read-only.
|
|
76
|
+
|
|
77
|
+
Example:
|
|
78
|
+
baker ads google invoices --customer-id 1234567890 --month 2026-09`
|
|
79
|
+
},
|
|
80
|
+
args: INVOICE_ARGS,
|
|
81
|
+
run: async ({ args }) => {
|
|
82
|
+
const customerId = requireCustomerId(args);
|
|
83
|
+
try {
|
|
84
|
+
const data = await serviceRead("/api/ads/google/invoices", customerId, {
|
|
85
|
+
...args.month ? { month: args.month } : {}
|
|
86
|
+
});
|
|
87
|
+
const hints = data.invoices.length === 0 ? [`No invoice was issued in ${data.month}. Try the month before with --month.`] : [
|
|
88
|
+
"Amounts are micros in each invoice's currency_code (divide by 1,000,000). pdf_url needs the user's Google sign-in."
|
|
89
|
+
];
|
|
90
|
+
writeJsonEnvelope({ ok: true, data, hints });
|
|
91
|
+
} catch (err) {
|
|
92
|
+
exitWithServiceReadError(err);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
register(
|
|
97
|
+
"ads.google.identity-verification",
|
|
98
|
+
"Advertiser identity verification status: each program's status (PENDING_USER_ACTION, PENDING_REVIEW, SUCCESS, FAILURE), deadlines and the link where the user completes it. Start here: `baker ads google identity-verification --customer-id 1234567890`. Google only answers for accounts on monthly invoicing \u2014 otherwise the error's fix says where the user reads it; carry on.",
|
|
99
|
+
CUSTOMER_ARG
|
|
100
|
+
);
|
|
101
|
+
var identityVerificationCommand = defineCommand({
|
|
102
|
+
meta: {
|
|
103
|
+
name: "identity-verification",
|
|
104
|
+
description: `Advertiser identity verification status and deadlines. Read-only.
|
|
105
|
+
|
|
106
|
+
Example:
|
|
107
|
+
baker ads google identity-verification --customer-id 1234567890`
|
|
108
|
+
},
|
|
109
|
+
args: CUSTOMER_ARG,
|
|
110
|
+
run: async ({ args }) => {
|
|
111
|
+
const customerId = requireCustomerId(args);
|
|
112
|
+
try {
|
|
113
|
+
const data = await serviceRead(
|
|
114
|
+
"/api/ads/google/identity-verification",
|
|
115
|
+
customerId,
|
|
116
|
+
{}
|
|
117
|
+
);
|
|
118
|
+
const pending = data.programs.filter((program) => program.status === "PENDING_USER_ACTION");
|
|
119
|
+
const hints = pending.length > 0 ? [
|
|
120
|
+
`Verification is waiting on the advertiser${pending[0]?.completion_deadline ? ` (deadline ${pending[0].completion_deadline})` : ""}: give the user the action_url \u2014 ads stop serving if it lapses.`
|
|
121
|
+
] : [];
|
|
122
|
+
writeJsonEnvelope(hints.length > 0 ? { ok: true, data, hints } : { ok: true, data });
|
|
123
|
+
} catch (err) {
|
|
124
|
+
exitWithServiceReadError(err);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
var PREVIEW_ARGS = {
|
|
129
|
+
...CUSTOMER_ARG,
|
|
130
|
+
ads: {
|
|
131
|
+
type: "string",
|
|
132
|
+
description: "Comma-separated video ads of Video campaigns as {adGroupId}~{adId} (from `ads list`) \u2014 previewed live on YouTube"
|
|
133
|
+
},
|
|
134
|
+
"asset-groups": {
|
|
135
|
+
type: "string",
|
|
136
|
+
description: "Comma-separated Performance Max asset group ids (from `asset-groups list`) \u2014 previewed on Google's preview page"
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
register(
|
|
140
|
+
"ads.google.previews",
|
|
141
|
+
"Shareable preview links for Performance Max asset groups (Google's preview page) and video ads (live on YouTube) that already exist in the account \u2014 a link the user can open or forward. Start here: `baker ads google previews --customer-id 1234567890 --asset-groups 6743268912`. Returns { previews: [{ target, url, youtube_tv_url, expires_at }] }. Only video ads of Video campaigns can be previewed by ad (search, display and Demand Gen ads have no shareable preview); staged (unpublished) changes cannot be previewed.",
|
|
142
|
+
PREVIEW_ARGS
|
|
143
|
+
);
|
|
144
|
+
var previewsCommand = defineCommand({
|
|
145
|
+
meta: {
|
|
146
|
+
name: "previews",
|
|
147
|
+
description: `Shareable preview links for existing Performance Max asset groups and video ads. Read-only.
|
|
148
|
+
|
|
149
|
+
Examples:
|
|
150
|
+
baker ads google previews --customer-id 1234567890 --asset-groups 6743268912
|
|
151
|
+
baker ads google previews --customer-id 1234567890 --ads 195752489650~826812181091 # a video ad, live on YouTube`
|
|
152
|
+
},
|
|
153
|
+
args: PREVIEW_ARGS,
|
|
154
|
+
run: async ({ args }) => {
|
|
155
|
+
const customerId = requireCustomerId(args);
|
|
156
|
+
const ads = listFlag(args.ads);
|
|
157
|
+
const assetGroups = listFlag(args["asset-groups"]);
|
|
158
|
+
if (!ads?.length && !assetGroups?.length) failWriteValidation("pass --ads and/or --asset-groups");
|
|
159
|
+
try {
|
|
160
|
+
const data = await serviceRead("/api/ads/google/previews", customerId, {
|
|
161
|
+
...ads ? { ads } : {},
|
|
162
|
+
...assetGroups ? { assetGroups } : {}
|
|
163
|
+
});
|
|
164
|
+
writeJsonEnvelope({
|
|
165
|
+
ok: true,
|
|
166
|
+
data,
|
|
167
|
+
hints: [
|
|
168
|
+
"Each link expires (expires_at). It shows what is live in the account now, not anything staged in this chat."
|
|
169
|
+
]
|
|
170
|
+
});
|
|
171
|
+
} catch (err) {
|
|
172
|
+
exitWithServiceReadError(err);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
var BRAND_ARGS = {
|
|
177
|
+
...CUSTOMER_ARG,
|
|
178
|
+
prefix: { type: "string", description: "The start of the brand's name (at least 2 letters)" }
|
|
179
|
+
};
|
|
180
|
+
register(
|
|
181
|
+
"ads.google.brands",
|
|
182
|
+
"Find a brand's Google entity id \u2014 what a BRANDS list member names (`keyword-lists add --brand /g/\u2026`). Start here: `baker ads google brands --customer-id 1234567890 --prefix nike`. Several brands can share a name: pick by the URL. Read-only.",
|
|
183
|
+
BRAND_ARGS
|
|
184
|
+
);
|
|
185
|
+
var brandsCommand = defineCommand({
|
|
186
|
+
meta: {
|
|
187
|
+
name: "brands",
|
|
188
|
+
description: `Find brand entity ids for a brand list (BRANDS). Read-only.
|
|
189
|
+
|
|
190
|
+
Example:
|
|
191
|
+
baker ads google brands --customer-id 1234567890 --prefix nike`
|
|
192
|
+
},
|
|
193
|
+
args: BRAND_ARGS,
|
|
194
|
+
run: async ({ args }) => {
|
|
195
|
+
const customerId = requireCustomerId(args);
|
|
196
|
+
if (typeof args.prefix !== "string" || args.prefix.trim().length < 2) {
|
|
197
|
+
failWriteValidation("--prefix needs at least the first 2 letters of the brand");
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
const data = await serviceRead("/api/ads/google/brands", customerId, {
|
|
201
|
+
prefix: args.prefix
|
|
202
|
+
});
|
|
203
|
+
const hints = data.brands.length > 0 ? [
|
|
204
|
+
"Several brands can share a name \u2014 pick the one whose URL is the brand you mean, then `keyword-lists add --list-ref <BRANDS list> --brand <entity_id>`."
|
|
205
|
+
] : ["No brand starts with that \u2014 try a shorter or different prefix."];
|
|
206
|
+
writeJsonEnvelope({ ok: true, data, hints });
|
|
207
|
+
} catch (err) {
|
|
208
|
+
exitWithServiceReadError(err);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
export {
|
|
213
|
+
brandsCommand,
|
|
214
|
+
identityVerificationCommand,
|
|
215
|
+
invoicesCommand,
|
|
216
|
+
previewsCommand
|
|
217
|
+
};
|
|
218
|
+
//# sourceMappingURL=account-reads-W3XO7CIW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/google/account-reads.ts"],"sourcesContent":["/**\n * `baker ads google invoices | identity-verification | previews` — read-only service calls that\n * are not GAQL. A refusal that is the account's situation degrades with an `error.fix` (see\n * `service-read-errors.ts`) instead of failing the job.\n */\nimport type {\n GoogleBrandSuggestionsResponse,\n GoogleIdentityVerificationResponse,\n GoogleInvoicesResponse,\n GoogleShareablePreviewsResponse,\n} from \"@baker/api/ads-google\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { getManagerIdForCustomer } from \"../cache.ts\";\nimport { writeJsonEnvelope } from \"../output.ts\";\nimport { exitWithServiceReadError } from \"./service-read-errors.ts\";\nimport { failWriteValidation, listFlag, requireCustomerId } from \"./write-shared.ts\";\n\ntype ArgDefs = Record<string, { type: \"string\" | \"boolean\"; description: string }>;\n\nfunction register(command: string, description: string, args: ArgDefs): void {\n registerSchema({\n command,\n description,\n args: Object.fromEntries(\n Object.entries(args).map(([name, arg]) => [\n name,\n { type: arg.type, description: arg.description, required: false },\n ]),\n ),\n });\n}\n\nasync function serviceRead<T>(path: string, customerId: string, body: Record<string, unknown>): Promise<T> {\n const managerId = getManagerIdForCustomer(customerId);\n const { data } = await apiPost<{ ok: true; data: T }>(path, {\n customerId,\n ...(managerId ? { managerId } : {}),\n ...body,\n });\n return data;\n}\n\nconst CUSTOMER_ARG = {\n \"customer-id\": { type: \"string\", description: \"Google Ads customer ID (10 digits, no dashes)\" },\n} as const;\n\nconst INVOICE_ARGS = {\n ...CUSTOMER_ARG,\n month: { type: \"string\", description: \"Issue month, YYYY-MM (default: last month)\" },\n} as const;\n\nregister(\n \"ads.google.invoices\",\n \"List the invoices Google issued in one month (accounts on monthly invoicing only): id, dates, service period, subtotal/tax/total in micros, PDF link. Start here: `baker ads google invoices --customer-id 1234567890 --month 2026-09`. An account that pays automatically has no invoices — the error's fix says where its receipts are; carry on.\",\n INVOICE_ARGS,\n);\n\nexport const invoicesCommand = defineCommand({\n meta: {\n name: \"invoices\",\n description: `List one month's invoices (monthly-invoicing accounts only). Read-only.\n\nExample:\n baker ads google invoices --customer-id 1234567890 --month 2026-09`,\n },\n args: INVOICE_ARGS,\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n try {\n const data = await serviceRead<GoogleInvoicesResponse>(\"/api/ads/google/invoices\", customerId, {\n ...(args.month ? { month: args.month } : {}),\n });\n const hints =\n data.invoices.length === 0\n ? [`No invoice was issued in ${data.month}. Try the month before with --month.`]\n : [\n \"Amounts are micros in each invoice's currency_code (divide by 1,000,000). pdf_url needs the user's Google sign-in.\",\n ];\n writeJsonEnvelope({ ok: true, data, hints });\n } catch (err) {\n exitWithServiceReadError(err);\n }\n },\n});\n\nregister(\n \"ads.google.identity-verification\",\n \"Advertiser identity verification status: each program's status (PENDING_USER_ACTION, PENDING_REVIEW, SUCCESS, FAILURE), deadlines and the link where the user completes it. Start here: `baker ads google identity-verification --customer-id 1234567890`. Google only answers for accounts on monthly invoicing — otherwise the error's fix says where the user reads it; carry on.\",\n CUSTOMER_ARG,\n);\n\nexport const identityVerificationCommand = defineCommand({\n meta: {\n name: \"identity-verification\",\n description: `Advertiser identity verification status and deadlines. Read-only.\n\nExample:\n baker ads google identity-verification --customer-id 1234567890`,\n },\n args: CUSTOMER_ARG,\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n try {\n const data = await serviceRead<GoogleIdentityVerificationResponse>(\n \"/api/ads/google/identity-verification\",\n customerId,\n {},\n );\n const pending = data.programs.filter((program) => program.status === \"PENDING_USER_ACTION\");\n const hints =\n pending.length > 0\n ? [\n `Verification is waiting on the advertiser${pending[0]?.completion_deadline ? ` (deadline ${pending[0].completion_deadline})` : \"\"}: give the user the action_url — ads stop serving if it lapses.`,\n ]\n : [];\n writeJsonEnvelope(hints.length > 0 ? { ok: true, data, hints } : { ok: true, data });\n } catch (err) {\n exitWithServiceReadError(err);\n }\n },\n});\n\nconst PREVIEW_ARGS = {\n ...CUSTOMER_ARG,\n ads: {\n type: \"string\",\n description:\n \"Comma-separated video ads of Video campaigns as {adGroupId}~{adId} (from `ads list`) — previewed live on YouTube\",\n },\n \"asset-groups\": {\n type: \"string\",\n description:\n \"Comma-separated Performance Max asset group ids (from `asset-groups list`) — previewed on Google's preview page\",\n },\n} as const;\n\nregister(\n \"ads.google.previews\",\n \"Shareable preview links for Performance Max asset groups (Google's preview page) and video ads (live on YouTube) that already exist in the account — a link the user can open or forward. Start here: `baker ads google previews --customer-id 1234567890 --asset-groups 6743268912`. Returns { previews: [{ target, url, youtube_tv_url, expires_at }] }. Only video ads of Video campaigns can be previewed by ad (search, display and Demand Gen ads have no shareable preview); staged (unpublished) changes cannot be previewed.\",\n PREVIEW_ARGS,\n);\n\nexport const previewsCommand = defineCommand({\n meta: {\n name: \"previews\",\n description: `Shareable preview links for existing Performance Max asset groups and video ads. Read-only.\n\nExamples:\n baker ads google previews --customer-id 1234567890 --asset-groups 6743268912\n baker ads google previews --customer-id 1234567890 --ads 195752489650~826812181091 # a video ad, live on YouTube`,\n },\n args: PREVIEW_ARGS,\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const ads = listFlag(args.ads);\n const assetGroups = listFlag(args[\"asset-groups\"]);\n if (!ads?.length && !assetGroups?.length) failWriteValidation(\"pass --ads and/or --asset-groups\");\n try {\n const data = await serviceRead<GoogleShareablePreviewsResponse>(\"/api/ads/google/previews\", customerId, {\n ...(ads ? { ads } : {}),\n ...(assetGroups ? { assetGroups } : {}),\n });\n writeJsonEnvelope({\n ok: true,\n data,\n hints: [\n \"Each link expires (expires_at). It shows what is live in the account now, not anything staged in this chat.\",\n ],\n });\n } catch (err) {\n exitWithServiceReadError(err);\n }\n },\n});\n\nconst BRAND_ARGS = {\n ...CUSTOMER_ARG,\n prefix: { type: \"string\", description: \"The start of the brand's name (at least 2 letters)\" },\n} as const;\n\nregister(\n \"ads.google.brands\",\n \"Find a brand's Google entity id — what a BRANDS list member names (`keyword-lists add --brand /g/…`). Start here: `baker ads google brands --customer-id 1234567890 --prefix nike`. Several brands can share a name: pick by the URL. Read-only.\",\n BRAND_ARGS,\n);\n\nexport const brandsCommand = defineCommand({\n meta: {\n name: \"brands\",\n description: `Find brand entity ids for a brand list (BRANDS). Read-only.\n\nExample:\n baker ads google brands --customer-id 1234567890 --prefix nike`,\n },\n args: BRAND_ARGS,\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n if (typeof args.prefix !== \"string\" || args.prefix.trim().length < 2) {\n failWriteValidation(\"--prefix needs at least the first 2 letters of the brand\");\n }\n try {\n const data = await serviceRead<GoogleBrandSuggestionsResponse>(\"/api/ads/google/brands\", customerId, {\n prefix: args.prefix,\n });\n const hints =\n data.brands.length > 0\n ? [\n \"Several brands can share a name — pick the one whose URL is the brand you mean, then `keyword-lists add --list-ref <BRANDS list> --brand <entity_id>`.\",\n ]\n : [\"No brand starts with that — try a shorter or different prefix.\"];\n writeJsonEnvelope({ ok: true, data, hints });\n } catch (err) {\n exitWithServiceReadError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,SAAS,qBAAqB;AAU9B,SAAS,SAAS,SAAiB,aAAqB,MAAqB;AAC3E,iBAAe;AAAA,IACb;AAAA,IACA;AAAA,IACA,MAAM,OAAO;AAAA,MACX,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM;AAAA,QACxC;AAAA,QACA,EAAE,MAAM,IAAI,MAAM,aAAa,IAAI,aAAa,UAAU,MAAM;AAAA,MAClE,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,eAAe,YAAe,MAAc,YAAoB,MAA2C;AACzG,QAAM,YAAY,wBAAwB,UAAU;AACpD,QAAM,EAAE,KAAK,IAAI,MAAM,QAA+B,MAAM;AAAA,IAC1D;AAAA,IACA,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACjC,GAAG;AAAA,EACL,CAAC;AACD,SAAO;AACT;AAEA,IAAM,eAAe;AAAA,EACnB,eAAe,EAAE,MAAM,UAAU,aAAa,gDAAgD;AAChG;AAEA,IAAM,eAAe;AAAA,EACnB,GAAG;AAAA,EACH,OAAO,EAAE,MAAM,UAAU,aAAa,6CAA6C;AACrF;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,EACN,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,aAAa,kBAAkB,IAAI;AACzC,QAAI;AACF,YAAM,OAAO,MAAM,YAAoC,4BAA4B,YAAY;AAAA,QAC7F,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,MAC5C,CAAC;AACD,YAAM,QACJ,KAAK,SAAS,WAAW,IACrB,CAAC,4BAA4B,KAAK,KAAK,sCAAsC,IAC7E;AAAA,QACE;AAAA,MACF;AACN,wBAAkB,EAAE,IAAI,MAAM,MAAM,MAAM,CAAC;AAAA,IAC7C,SAAS,KAAK;AACZ,+BAAyB,GAAG;AAAA,IAC9B;AAAA,EACF;AACF,CAAC;AAED;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,8BAA8B,cAAc;AAAA,EACvD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,EACN,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,aAAa,kBAAkB,IAAI;AACzC,QAAI;AACF,YAAM,OAAO,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA,CAAC;AAAA,MACH;AACA,YAAM,UAAU,KAAK,SAAS,OAAO,CAAC,YAAY,QAAQ,WAAW,qBAAqB;AAC1F,YAAM,QACJ,QAAQ,SAAS,IACb;AAAA,QACE,4CAA4C,QAAQ,CAAC,GAAG,sBAAsB,cAAc,QAAQ,CAAC,EAAE,mBAAmB,MAAM,EAAE;AAAA,MACpI,IACA,CAAC;AACP,wBAAkB,MAAM,SAAS,IAAI,EAAE,IAAI,MAAM,MAAM,MAAM,IAAI,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACrF,SAAS,KAAK;AACZ,+BAAyB,GAAG;AAAA,IAC9B;AAAA,EACF;AACF,CAAC;AAED,IAAM,eAAe;AAAA,EACnB,GAAG;AAAA,EACH,KAAK;AAAA,IACH,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AACF;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,EACN,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,aAAa,kBAAkB,IAAI;AACzC,UAAM,MAAM,SAAS,KAAK,GAAG;AAC7B,UAAM,cAAc,SAAS,KAAK,cAAc,CAAC;AACjD,QAAI,CAAC,KAAK,UAAU,CAAC,aAAa,OAAQ,qBAAoB,kCAAkC;AAChG,QAAI;AACF,YAAM,OAAO,MAAM,YAA6C,4BAA4B,YAAY;AAAA,QACtG,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC;AAAA,QACrB,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,MACvC,CAAC;AACD,wBAAkB;AAAA,QAChB,IAAI;AAAA,QACJ;AAAA,QACA,OAAO;AAAA,UACL;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,+BAAyB,GAAG;AAAA,IAC9B;AAAA,EACF;AACF,CAAC;AAED,IAAM,aAAa;AAAA,EACjB,GAAG;AAAA,EACH,QAAQ,EAAE,MAAM,UAAU,aAAa,qDAAqD;AAC9F;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,EACN,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,aAAa,kBAAkB,IAAI;AACzC,QAAI,OAAO,KAAK,WAAW,YAAY,KAAK,OAAO,KAAK,EAAE,SAAS,GAAG;AACpE,0BAAoB,0DAA0D;AAAA,IAChF;AACA,QAAI;AACF,YAAM,OAAO,MAAM,YAA4C,0BAA0B,YAAY;AAAA,QACnG,QAAQ,KAAK;AAAA,MACf,CAAC;AACD,YAAM,QACJ,KAAK,OAAO,SAAS,IACjB;AAAA,QACE;AAAA,MACF,IACA,CAAC,qEAAgE;AACvE,wBAAkB,EAAE,IAAI,MAAM,MAAM,MAAM,CAAC;AAAA,IAC7C,SAAS,KAAK;AACZ,+BAAyB,GAAG;AAAA,IAC9B;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
csvOrJson,
|
|
3
3
|
handleLinkedinError
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-V5QJBDBC.js";
|
|
5
5
|
import {
|
|
6
6
|
connectedResourceHints
|
|
7
7
|
} from "./chunk-P4NSJS54.js";
|
|
@@ -16,11 +16,11 @@ import {
|
|
|
16
16
|
import {
|
|
17
17
|
NO_CACHE_ARG
|
|
18
18
|
} from "./chunk-X7ZODEXJ.js";
|
|
19
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-45OQOUJA.js";
|
|
20
20
|
import "./chunk-GXDLWBOY.js";
|
|
21
21
|
import "./chunk-TEINLN64.js";
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-XQIOCIDO.js";
|
|
23
|
+
import "./chunk-ML7DLFFY.js";
|
|
24
24
|
import {
|
|
25
25
|
apiGet
|
|
26
26
|
} from "./chunk-XBOK23HI.js";
|
|
@@ -74,4 +74,4 @@ Examples:
|
|
|
74
74
|
export {
|
|
75
75
|
accountsCommand
|
|
76
76
|
};
|
|
77
|
-
//# sourceMappingURL=accounts-
|
|
77
|
+
//# sourceMappingURL=accounts-4TM4UZEJ.js.map
|