@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.
Files changed (474) hide show
  1. package/README.md +100 -17
  2. package/dist/{account-2OBWFPRG.js → account-AO6PNNPO.js} +6 -6
  3. package/dist/account-reads-W3XO7CIW.js +218 -0
  4. package/dist/account-reads-W3XO7CIW.js.map +1 -0
  5. package/dist/{accounts-TDTME6RQ.js → accounts-4TM4UZEJ.js} +5 -5
  6. package/dist/{accounts-TZQVAJ3V.js → accounts-XDC26KK6.js} +7 -7
  7. package/dist/{actions-FHYESJEE.js → actions-CJB4GZYA.js} +18 -18
  8. package/dist/{add-Q6YFHEOR.js → add-BP4CUUKB.js} +4 -4
  9. package/dist/{add-7XB5X3D3.js → add-RYR3QGOP.js} +5 -5
  10. package/dist/{ads-PGTFZA5Q.js → ads-GII5LEOH.js} +6 -6
  11. package/dist/{ads-6UEDYT3O.js → ads-SATXH4OD.js} +9 -9
  12. package/dist/{adsets-Q5DWGANV.js → adsets-PMXNW3EG.js} +8 -8
  13. package/dist/{advertisers-RKWQDCOI.js → advertisers-GM5UFI44.js} +7 -7
  14. package/dist/{analytics-DEJKJNLN.js → analytics-4CD7CH7H.js} +5 -5
  15. package/dist/{analytics-U5TTTX7K.js → analytics-JDPRLCHQ.js} +15 -15
  16. package/dist/{assign-RHUKQWH2.js → assign-XI4HIIIM.js} +5 -5
  17. package/dist/{audience-size-ICEKQRE4.js → audience-size-DHZ65PGA.js} +5 -5
  18. package/dist/{audiences-AMRFZRZ7.js → audiences-D7CXP3ZF.js} +3 -3
  19. package/dist/{audit-GWLQVB4A.js → audit-M7BZYBIS.js} +5 -5
  20. package/dist/{autocomplete-NAEVFMKZ.js → autocomplete-B45I26R4.js} +7 -7
  21. package/dist/{avatars-PMV6IMFV.js → avatars-75BALNB7.js} +4 -4
  22. package/dist/{bid-pricing-XF3LD65L.js → bid-pricing-4RCP24BE.js} +5 -5
  23. package/dist/{brand-ZC5HDP7B.js → brand-2TOLKYDY.js} +2 -2
  24. package/dist/{brief-3EZ2JS5F.js → brief-5G4NEZ4O.js} +16 -16
  25. package/dist/{campaign-groups-JSHBFYDG.js → campaign-groups-G7B26V7K.js} +10 -10
  26. package/dist/{campaign-writes-5PHXENPN.js → campaign-writes-HZ7ART7W.js} +5 -5
  27. package/dist/{campaigns-D6B6Z67Y.js → campaigns-MEEM3CNC.js} +8 -8
  28. package/dist/{campaigns-HPRQVXTH.js → campaigns-OIJGTO7W.js} +5 -5
  29. package/dist/{campaigns-LQXELRHZ.js → campaigns-RW3QJQ2F.js} +13 -13
  30. package/dist/{canvas-4NVEZNW5.js → canvas-LXRLDE5G.js} +12 -12
  31. package/dist/{capabilities-VQRNPBOZ.js → capabilities-BWSB7IFT.js} +5 -5
  32. package/dist/{changes-TP7ZZHB3.js → changes-AYLNY6KN.js} +5 -5
  33. package/dist/{chatgpt-QNUN63YS.js → chatgpt-TNSRA3L3.js} +1 -1
  34. package/dist/{chats-Q4QPA3OQ.js → chats-MMHBJQFM.js} +5 -5
  35. package/dist/{chunk-RXGR63TP.js → chunk-24GELJP3.js} +2 -2
  36. package/dist/{chunk-ZKYNGME7.js → chunk-2D4ASTGN.js} +3 -3
  37. package/dist/{chunk-PRIHMSJH.js → chunk-2K4LMCV2.js} +2 -2
  38. package/dist/{chunk-4GACYQUI.js → chunk-2YJL6MEB.js} +3 -3
  39. package/dist/{chunk-L27H2R2N.js → chunk-2ZY7HON7.js} +2 -2
  40. package/dist/{chunk-RZTNH2TX.js → chunk-45OQOUJA.js} +2 -2
  41. package/dist/{chunk-LLOOWRBB.js → chunk-4KCKNAVW.js} +189 -20
  42. package/dist/chunk-4KCKNAVW.js.map +1 -0
  43. package/dist/{chunk-GX6VAHY7.js → chunk-5FWMRTNB.js} +31 -15
  44. package/dist/chunk-5FWMRTNB.js.map +1 -0
  45. package/dist/{chunk-YT2BSTD3.js → chunk-7TNPEURJ.js} +2 -2
  46. package/dist/chunk-7VHPAGPK.js +228 -0
  47. package/dist/chunk-7VHPAGPK.js.map +1 -0
  48. package/dist/{chunk-WKS6ZDUP.js → chunk-BSOWFWEU.js} +7 -7
  49. package/dist/{chunk-X5ECCSHP.js → chunk-D23EKXOP.js} +2 -2
  50. package/dist/{chunk-FC3U5XKS.js → chunk-D7PFF6UC.js} +4 -4
  51. package/dist/{chunk-OU5YA2QX.js → chunk-DT2XXF6O.js} +2 -2
  52. package/dist/{chunk-ARBKEE6E.js → chunk-DYOI4FQ7.js} +2 -2
  53. package/dist/{chunk-4EVLVA2R.js → chunk-EFM7OODQ.js} +2 -2
  54. package/dist/{chunk-P6KWFODZ.js → chunk-EIIANSBX.js} +2 -2
  55. package/dist/{chunk-HJMRWBR5.js → chunk-EYK6G4XE.js} +2 -2
  56. package/dist/{chunk-PKC6QBYJ.js → chunk-EZWYX343.js} +4 -4
  57. package/dist/{chunk-LIQ4SQ2T.js → chunk-FEELV5IV.js} +2 -2
  58. package/dist/{chunk-YCWIGXH6.js → chunk-GP7QUF5A.js} +2 -2
  59. package/dist/{chunk-ZGGGA3JR.js → chunk-HOXZOOVA.js} +8 -8
  60. package/dist/{chunk-CYEO5ZIO.js → chunk-JPK34QPS.js} +3 -2
  61. package/dist/{chunk-CYEO5ZIO.js.map → chunk-JPK34QPS.js.map} +1 -1
  62. package/dist/{chunk-TJOGO2MK.js → chunk-JU7FIHQ2.js} +2 -2
  63. package/dist/{chunk-MVYLY2SF.js → chunk-KN7DFVKW.js} +2 -2
  64. package/dist/{chunk-K5H3XOYQ.js → chunk-LI6PGY3L.js} +2 -2
  65. package/dist/{chunk-3KEWXALS.js → chunk-MCWYIEWI.js} +3 -3
  66. package/dist/{chunk-LIWBVGRE.js → chunk-MFQ5SUJT.js} +3 -3
  67. package/dist/{credentials-4V55RYZ6.js → chunk-ML7DLFFY.js} +3421 -249
  68. package/dist/chunk-ML7DLFFY.js.map +1 -0
  69. package/dist/{chunk-HEOWTR7Z.js → chunk-OW4XDJV2.js} +2 -2
  70. package/dist/{chunk-KYR4EG3E.js → chunk-PHEEJUFL.js} +2 -2
  71. package/dist/chunk-QM6T4BFA.js +76 -0
  72. package/dist/chunk-QM6T4BFA.js.map +1 -0
  73. package/dist/{chunk-KHV5GALI.js → chunk-QNDLOCAI.js} +2 -2
  74. package/dist/{chunk-GQ7JE7A7.js → chunk-UZUHXN7H.js} +2 -2
  75. package/dist/{chunk-YWK4UBVU.js → chunk-V5QJBDBC.js} +2 -2
  76. package/dist/{chunk-LP2QDRO4.js → chunk-WBUMUELD.js} +7 -7
  77. package/dist/{chunk-EP5TYLNV.js → chunk-WEU6GKUQ.js} +3 -3
  78. package/dist/{chunk-46TPPYCI.js → chunk-X5VHGXFB.js} +2 -2
  79. package/dist/{chunk-3V57D7GE.js → chunk-XJRBFLBD.js} +2 -2
  80. package/dist/{query-IEZRY6HV.js → chunk-XPOIIQCI.js} +406 -148
  81. package/dist/chunk-XPOIIQCI.js.map +1 -0
  82. package/dist/{chunk-ZJWUBJYQ.js → chunk-XQIOCIDO.js} +1 -1
  83. package/dist/chunk-XQIOCIDO.js.map +1 -0
  84. package/dist/{chunk-T4DD5YMP.js → chunk-XY7BZSDQ.js} +12 -12
  85. package/dist/{chunk-T4DD5YMP.js.map → chunk-XY7BZSDQ.js.map} +1 -1
  86. package/dist/{chunk-QS2BDKFL.js → chunk-Y63Y4QSY.js} +2 -2
  87. package/dist/{chunk-PAQ3T6OT.js → chunk-YRVDCIJ2.js} +2 -2
  88. package/dist/{claim-RHZVTMQZ.js → claim-UDNXCJIU.js} +5 -5
  89. package/dist/cli.js +29 -29
  90. package/dist/{companies-LIKSVYSR.js → companies-RPZN4JTR.js} +5 -5
  91. package/dist/{complete-OM7R6VOC.js → complete-HLSRQE3N.js} +5 -5
  92. package/dist/{connect-AVX3NKP6.js → connect-TIJZO7OV.js} +8 -8
  93. package/dist/{conversation-3HGRWXKO.js → conversation-BS7TF6LZ.js} +5 -5
  94. package/dist/{conversion-upload-command-AUF3LNTH.js → conversion-upload-command-CSD344BY.js} +6 -6
  95. package/dist/{conversions-XADFSQ4W.js → conversions-FEWAX64H.js} +9 -9
  96. package/dist/{create-PQSDE4J3.js → create-4SH4BZXP.js} +5 -5
  97. package/dist/{create-BWHYYATN.js → create-B4UVIJZI.js} +4 -4
  98. package/dist/{create-Z4JLLTPG.js → create-F5FNHJKE.js} +5 -5
  99. package/dist/{create-3I64N6RJ.js → create-L3JHP6J4.js} +5 -5
  100. package/dist/{creatives-WPRN6CU4.js → creatives-LK2NZHRX.js} +10 -10
  101. package/dist/{creatives-UEPLNCPN.js → creatives-RQ2DFHGI.js} +3 -3
  102. package/dist/{creatives-6Z7CEW5O.js → creatives-UILBPOKO.js} +10 -10
  103. package/dist/credentials-GC34ZPYP.js +287 -0
  104. package/dist/credentials-GC34ZPYP.js.map +1 -0
  105. package/dist/{critique-M5TMIG2D.js → critique-FAOH4FCP.js} +7 -7
  106. package/dist/{critique-K632OHFP.js → critique-X7HYYEJ4.js} +5 -5
  107. package/dist/{crm-CWT6BMMX.js → crm-RB5TVV3M.js} +6 -6
  108. package/dist/{crm-Q2QK4ZMS.js → crm-XEQDSU2U.js} +6 -6
  109. package/dist/{currency-XCGKQ7FE.js → currency-47QHFHDA.js} +4 -4
  110. package/dist/{custom-conversions-2VLJGPRV.js → custom-conversions-7HOWR6X6.js} +2 -2
  111. package/dist/{customers-7TS64ZM5.js → customers-P5WOUY6G.js} +7 -7
  112. package/dist/{delete-H7W3V6QG.js → delete-DLQ2ZZDA.js} +4 -4
  113. package/dist/{delete-BPSOLCGB.js → delete-GZKGPBBD.js} +5 -5
  114. package/dist/{delete-RIY5VUTU.js → delete-SW5OSIGN.js} +5 -5
  115. package/dist/{demographics-NHGM4QP7.js → demographics-ZLZOIWUE.js} +5 -5
  116. package/dist/{discard-IBMOGEYB.js → discard-VNVNJWNX.js} +5 -5
  117. package/dist/{discover-BJPZNXUQ.js → discover-P6TUGZ45.js} +4 -4
  118. package/dist/{domain-Y3N2UY5I.js → domain-OBICRJP3.js} +5 -5
  119. package/dist/draft-666YKA3P.js +307 -0
  120. package/dist/draft-666YKA3P.js.map +1 -0
  121. package/dist/{draft-322ZG6JG.js → draft-UECMJ6B4.js} +5 -5
  122. package/dist/{draft-6KBILDJK.js → draft-V75RBORX.js} +5 -5
  123. package/dist/{draft-P5T2QHCY.js → draft-Z3VUQ4LJ.js} +7 -7
  124. package/dist/{facets-3SDK42HY.js → facets-7J66L3NK.js} +5 -5
  125. package/dist/{feedback-P2JZTJY5.js → feedback-3LDG4WVJ.js} +2 -2
  126. package/dist/{feedback-record-5O6UUWTZ.js → feedback-record-CTAUHLMF.js} +9 -9
  127. package/dist/{fetch-LN5W3J4E.js → fetch-4RXXZGO4.js} +5 -5
  128. package/dist/{flows-MN26KBWB.js → flows-GGB46DLH.js} +12 -12
  129. package/dist/{fonts-7TXPTNCS.js → fonts-S3GWKOUJ.js} +7 -7
  130. package/dist/{forecast-ZHBKYQFP.js → forecast-6JVKXNFB.js} +5 -5
  131. package/dist/forecast-SVD3LMMY.js +168 -0
  132. package/dist/forecast-SVD3LMMY.js.map +1 -0
  133. package/dist/{funnel-UAXVM7JN.js → funnel-RCQOIQZ5.js} +6 -6
  134. package/dist/{ga4-DV2AXCSL.js → ga4-U6DMJ6K4.js} +1 -1
  135. package/dist/{get-EKYSQHNB.js → get-KQSM2MXM.js} +5 -5
  136. package/dist/{get-P7SSZ46N.js → get-MN2GRXGZ.js} +5 -5
  137. package/dist/{google-M7KEXVK5.js → google-CI2AMJKN.js} +1518 -200
  138. package/dist/google-CI2AMJKN.js.map +1 -0
  139. package/dist/{google-ads-LZDXDFPW.js → google-ads-YAJ33LTW.js} +5 -5
  140. package/dist/{history-BFGVCJ4J.js → history-QWYLRQBO.js} +5 -5
  141. package/dist/{hubspot-I3PNNF3E.js → hubspot-DDONLJ7R.js} +9 -9
  142. package/dist/{ideas-ZNP5BOGE.js → ideas-N44Z2SIT.js} +4 -4
  143. package/dist/{images-MWWGN672.js → images-BKHCBCE7.js} +4 -4
  144. package/dist/{ingest-H7BWHY7L.js → ingest-HBECWLOB.js} +4 -4
  145. package/dist/{ingest-NYP2ZAAK.js → ingest-VNRTFD4Y.js} +5 -5
  146. package/dist/{inspect-FNNDBZQX.js → inspect-7GGJDJBJ.js} +5 -5
  147. package/dist/{inspiration-S3DU4CMQ.js → inspiration-CGM3NK6X.js} +1 -1
  148. package/dist/{intent-E3UIVZBN.js → intent-HKNBXEDS.js} +4 -4
  149. package/dist/{keyword-gap-BG6M665A.js → keyword-gap-HUSP6MOT.js} +4 -4
  150. package/dist/{keyword-metrics-WG5LLBUW.js → keyword-metrics-2C3VFGDQ.js} +7 -7
  151. package/dist/{keywords-for-site-HVEAAODA.js → keywords-for-site-4GV4KS4X.js} +7 -7
  152. package/dist/{landing-G5MLO4CZ.js → landing-V2FMPQOK.js} +3 -3
  153. package/dist/{languages-HORKPDNH.js → languages-75YJZAHL.js} +4 -4
  154. package/dist/{leads-XCAE4OVV.js → leads-DTULNGMU.js} +5 -5
  155. package/dist/{leads-ARUWPHBM.js → leads-OPRVJBQG.js} +4 -4
  156. package/dist/{learn-5WSN4PT5.js → learn-EW2CKOFS.js} +9 -9
  157. package/dist/{line-item-writes-4EOQBQSC.js → line-item-writes-EF3BJ5KV.js} +5 -5
  158. package/dist/{line-items-45X5BVQW.js → line-items-G467XOZF.js} +5 -5
  159. package/dist/{link-XAXNBIKU.js → link-5SU4MR6M.js} +5 -5
  160. package/dist/{linkedin-62HOT3HB.js → linkedin-OFM3VVOB.js} +29 -29
  161. package/dist/{list-PLWORN75.js → list-HEWXAVCL.js} +4 -4
  162. package/dist/{list-NYTQ3DBH.js → list-SUTCQLGI.js} +5 -5
  163. package/dist/{list-H4SN4QYE.js → list-VFZPXFMA.js} +5 -5
  164. package/dist/{locations-J4G5RNPH.js → locations-6XADFU3V.js} +4 -4
  165. package/dist/{log-S7TEGEPL.js → log-I3MAU44R.js} +5 -5
  166. package/dist/{make-F6FOFAS4.js → make-ALBJZKJZ.js} +21 -21
  167. package/dist/{map-V3YC6Y5I.js → map-OT6F33VF.js} +6 -6
  168. package/dist/{mcp-3R3FOL2H.js → mcp-LC3L2JQO.js} +4 -4
  169. package/dist/{media-53DJRC4N.js → media-MYZ5I7WK.js} +2 -2
  170. package/dist/{media-sources-356UORTR.js → media-sources-RK6EJYBQ.js} +2 -2
  171. package/dist/{members-KATLJNPJ.js → members-7CHDHW7H.js} +5 -5
  172. package/dist/{meta-A7KM6TF5.js → meta-7XP5AWYU.js} +10 -10
  173. package/dist/{metrics-SQDJ5NQO.js → metrics-73LI743C.js} +4 -4
  174. package/dist/{normalize-RUPEDCAV.js → normalize-CXMYHNSA.js} +5 -5
  175. package/dist/{options-SCYGSRQX.js → options-E4IO5SR5.js} +8 -8
  176. package/dist/{performance-U3MA6YXN.js → performance-UQLSBPYN.js} +6 -6
  177. package/dist/{plan-4QP2G7GV.js → plan-NBFLYAOW.js} +2 -2
  178. package/dist/{promoted-tweet-writes-5UMGETBC.js → promoted-tweet-writes-ZW3FUPFG.js} +5 -5
  179. package/dist/{promoted-tweets-A3V53KZI.js → promoted-tweets-ZLQ6GZD5.js} +3 -3
  180. package/dist/{publish-V22K43GA.js → publish-H2PBR5XN.js} +5 -5
  181. package/dist/query-GDUTZ4R7.js +61 -0
  182. package/dist/{reddit-UACCQN3B.js → reddit-TGQYQUNZ.js} +6 -6
  183. package/dist/{refresh-PSXGRCJE.js → refresh-HVBCC2ZI.js} +4 -4
  184. package/dist/{release-S2X7UL4U.js → release-VI3JT6O6.js} +5 -5
  185. package/dist/{relevant-pages-OWMNUCP7.js → relevant-pages-2FW3E5KD.js} +4 -4
  186. package/dist/{remove-4GTKRBUW.js → remove-4EE7STMS.js} +4 -4
  187. package/dist/{reopen-3KUS6UZ2.js → reopen-LEGLAOMA.js} +5 -5
  188. package/dist/{rerun-ZHD7C4W2.js → rerun-A5DPZFOO.js} +14 -14
  189. package/dist/{research-7LO3G3EP.js → research-O6YMV2TG.js} +13 -13
  190. package/dist/{research-UF6PKQPH.js → research-WOJELJ4K.js} +4 -4
  191. package/dist/{reset-PVXTS3FZ.js → reset-PQHURJDC.js} +4 -4
  192. package/dist/{reset-PU57HTAP.js → reset-V2X7DFHD.js} +4 -4
  193. package/dist/{resolve-KBIYWRF7.js → resolve-Q4AACDIC.js} +5 -5
  194. package/dist/{retry-HKWNIGON.js → retry-BB6NJBC4.js} +4 -4
  195. package/dist/{retry-LSCVGZM5.js → retry-WMGEUJPB.js} +4 -4
  196. package/dist/{run-HMFS4KQZ.js → run-OBYA2F3E.js} +14 -14
  197. package/dist/{run-DU6RVXPA.js → run-V6E36GXW.js} +5 -5
  198. package/dist/{scaffold-ad-SLUGKZIW.js → scaffold-ad-KKYI7FZJ.js} +10 -10
  199. package/dist/{scaffold-static-ad-NRFAA5HL.js → scaffold-static-ad-R5UE4YIZ.js} +16 -16
  200. package/dist/{scaffold-video-Q7BSFVS4.js → scaffold-video-Y2BWXZSX.js} +12 -12
  201. package/dist/{schedule-VNTGMFLQ.js → schedule-EO27AZTT.js} +4 -4
  202. package/dist/{scheduled-agents-6TNWXJVH.js → scheduled-agents-OIJBX7OO.js} +11 -11
  203. package/dist/{schema-ZEOL467O.js → schema-7GSCTQIC.js} +6 -6
  204. package/dist/{search-XUINK3C2.js → search-Q7PAV7NY.js} +4 -4
  205. package/dist/{select-U3DVKV72.js → select-ASR5SBYE.js} +9 -9
  206. package/dist/{set-prompt-EQIVJ5LR.js → set-prompt-I32464V4.js} +7 -7
  207. package/dist/{setup-links-CLPE6UUM.js → setup-links-NP2HULRC.js} +5 -5
  208. package/dist/{site-GIZB7NWB.js → site-PTIYQQ3Z.js} +6 -6
  209. package/dist/{sources-7RGXA35S.js → sources-5FRMFKDA.js} +6 -6
  210. package/dist/{sources-2PG4U4BC.js → sources-FJLCIG6X.js} +8 -8
  211. package/dist/{stale-ODM7IOO2.js → stale-YUYMETFC.js} +8 -8
  212. package/dist/{stats-NNXZMPZR.js → stats-F5JZVPYG.js} +1 -1
  213. package/dist/{status-HKCIXG7P.js → status-UYIQFC7L.js} +5 -5
  214. package/dist/{studio-EKIPLLHD.js → studio-6ZL76TZR.js} +1 -1
  215. package/dist/{sync-LGDTHM6C.js → sync-527ZCA4A.js} +4 -4
  216. package/dist/{sync-definition-6WBQN4Q3.js → sync-definition-M4KRPGTN.js} +9 -9
  217. package/dist/sync-definition-M4KRPGTN.js.map +1 -0
  218. package/dist/{tags-BQFPK55V.js → tags-2MX3332V.js} +5 -5
  219. package/dist/{tags-N72F6AMR.js → tags-7767I2D6.js} +4 -4
  220. package/dist/{tags-DRZ7GPP4.js → tags-J3BGX3E6.js} +5 -5
  221. package/dist/{tags-Q5NWILJO.js → tags-O27SK3YX.js} +4 -4
  222. package/dist/{tags-4NICM2LC.js → tags-VAYVSQM6.js} +5 -5
  223. package/dist/{targeting-criteria-DXHMEEC2.js → targeting-criteria-GOTI75Y4.js} +3 -3
  224. package/dist/{targets-A325AP5G.js → targets-FC7CGFRD.js} +5 -5
  225. package/dist/{templates-WWY4ZVKR.js → templates-EF5LOWP5.js} +5 -5
  226. package/dist/{testimonials-YVHSZTWW.js → testimonials-MRMRWF2T.js} +6 -6
  227. package/dist/themes-2ZV7OCJ3.js +94 -0
  228. package/dist/themes-2ZV7OCJ3.js.map +1 -0
  229. package/dist/{top-companies-S2Y4I5HF.js → top-companies-VTLR6GTW.js} +5 -5
  230. package/dist/{translate-BTUMXQSK.js → translate-UMTKAUJ3.js} +15 -15
  231. package/dist/{triggers-T47AIYVB.js → triggers-Y7ZMMY3C.js} +5 -5
  232. package/dist/{unlink-XRKX6DVP.js → unlink-HZCFLXH4.js} +5 -5
  233. package/dist/{unstage-77RAGX3F.js → unstage-562HOOE7.js} +5 -5
  234. package/dist/{update-R3QSTHUD.js → update-ATSXY5UN.js} +5 -5
  235. package/dist/{update-RJLMUP7I.js → update-DKU2UDFA.js} +4 -4
  236. package/dist/{update-YRO5IHDX.js → update-I5A5TOZJ.js} +5 -5
  237. package/dist/{update-NQIRRGOW.js → update-ZF3VFYLB.js} +5 -5
  238. package/dist/{upload-KWFKNKAF.js → upload-SIAI6NMH.js} +5 -5
  239. package/dist/{url-options-GGXAL3J4.js → url-options-JSX6HBZL.js} +10 -7
  240. package/dist/url-options-JSX6HBZL.js.map +1 -0
  241. package/dist/{url-params-IMC43AIM.js → url-params-AZUI3CW3.js} +5 -5
  242. package/dist/{validate-Y6R6F5T3.js → validate-MC4EIQI5.js} +7 -7
  243. package/dist/{videos-U2FPMNFS.js → videos-S7BYFSU3.js} +5 -5
  244. package/dist/{web-AHTOJNQY.js → web-5R7LHKIT.js} +5 -5
  245. package/dist/{winning-ads-TUYN2BST.js → winning-ads-PDCY4YW5.js} +2 -2
  246. package/dist/{write-commands-CT74VHH6.js → write-commands-MFRZD6Q6.js} +4 -4
  247. package/dist/{write-commands-2XFNH4BW.js → write-commands-VXL5QKMT.js} +7 -7
  248. package/dist/{x-5GDVUJ2I.js → x-22PKVRYX.js} +7 -7
  249. package/package.json +1 -1
  250. package/dist/chunk-GX6VAHY7.js.map +0 -1
  251. package/dist/chunk-LLOOWRBB.js.map +0 -1
  252. package/dist/chunk-NE4F3FHN.js +0 -1854
  253. package/dist/chunk-NE4F3FHN.js.map +0 -1
  254. package/dist/chunk-XCM6XWOB.js +0 -417
  255. package/dist/chunk-XCM6XWOB.js.map +0 -1
  256. package/dist/chunk-ZJWUBJYQ.js.map +0 -1
  257. package/dist/credentials-4V55RYZ6.js.map +0 -1
  258. package/dist/draft-5YAYCEYY.js +0 -107
  259. package/dist/draft-5YAYCEYY.js.map +0 -1
  260. package/dist/google-M7KEXVK5.js.map +0 -1
  261. package/dist/query-IEZRY6HV.js.map +0 -1
  262. package/dist/url-options-GGXAL3J4.js.map +0 -1
  263. /package/dist/{account-2OBWFPRG.js.map → account-AO6PNNPO.js.map} +0 -0
  264. /package/dist/{accounts-TDTME6RQ.js.map → accounts-4TM4UZEJ.js.map} +0 -0
  265. /package/dist/{accounts-TZQVAJ3V.js.map → accounts-XDC26KK6.js.map} +0 -0
  266. /package/dist/{actions-FHYESJEE.js.map → actions-CJB4GZYA.js.map} +0 -0
  267. /package/dist/{add-Q6YFHEOR.js.map → add-BP4CUUKB.js.map} +0 -0
  268. /package/dist/{add-7XB5X3D3.js.map → add-RYR3QGOP.js.map} +0 -0
  269. /package/dist/{ads-PGTFZA5Q.js.map → ads-GII5LEOH.js.map} +0 -0
  270. /package/dist/{ads-6UEDYT3O.js.map → ads-SATXH4OD.js.map} +0 -0
  271. /package/dist/{adsets-Q5DWGANV.js.map → adsets-PMXNW3EG.js.map} +0 -0
  272. /package/dist/{advertisers-RKWQDCOI.js.map → advertisers-GM5UFI44.js.map} +0 -0
  273. /package/dist/{analytics-DEJKJNLN.js.map → analytics-4CD7CH7H.js.map} +0 -0
  274. /package/dist/{analytics-U5TTTX7K.js.map → analytics-JDPRLCHQ.js.map} +0 -0
  275. /package/dist/{assign-RHUKQWH2.js.map → assign-XI4HIIIM.js.map} +0 -0
  276. /package/dist/{audience-size-ICEKQRE4.js.map → audience-size-DHZ65PGA.js.map} +0 -0
  277. /package/dist/{audiences-AMRFZRZ7.js.map → audiences-D7CXP3ZF.js.map} +0 -0
  278. /package/dist/{audit-GWLQVB4A.js.map → audit-M7BZYBIS.js.map} +0 -0
  279. /package/dist/{autocomplete-NAEVFMKZ.js.map → autocomplete-B45I26R4.js.map} +0 -0
  280. /package/dist/{avatars-PMV6IMFV.js.map → avatars-75BALNB7.js.map} +0 -0
  281. /package/dist/{bid-pricing-XF3LD65L.js.map → bid-pricing-4RCP24BE.js.map} +0 -0
  282. /package/dist/{brand-ZC5HDP7B.js.map → brand-2TOLKYDY.js.map} +0 -0
  283. /package/dist/{brief-3EZ2JS5F.js.map → brief-5G4NEZ4O.js.map} +0 -0
  284. /package/dist/{campaign-groups-JSHBFYDG.js.map → campaign-groups-G7B26V7K.js.map} +0 -0
  285. /package/dist/{campaign-writes-5PHXENPN.js.map → campaign-writes-HZ7ART7W.js.map} +0 -0
  286. /package/dist/{campaigns-D6B6Z67Y.js.map → campaigns-MEEM3CNC.js.map} +0 -0
  287. /package/dist/{campaigns-HPRQVXTH.js.map → campaigns-OIJGTO7W.js.map} +0 -0
  288. /package/dist/{campaigns-LQXELRHZ.js.map → campaigns-RW3QJQ2F.js.map} +0 -0
  289. /package/dist/{canvas-4NVEZNW5.js.map → canvas-LXRLDE5G.js.map} +0 -0
  290. /package/dist/{capabilities-VQRNPBOZ.js.map → capabilities-BWSB7IFT.js.map} +0 -0
  291. /package/dist/{changes-TP7ZZHB3.js.map → changes-AYLNY6KN.js.map} +0 -0
  292. /package/dist/{chatgpt-QNUN63YS.js.map → chatgpt-TNSRA3L3.js.map} +0 -0
  293. /package/dist/{chats-Q4QPA3OQ.js.map → chats-MMHBJQFM.js.map} +0 -0
  294. /package/dist/{chunk-RXGR63TP.js.map → chunk-24GELJP3.js.map} +0 -0
  295. /package/dist/{chunk-ZKYNGME7.js.map → chunk-2D4ASTGN.js.map} +0 -0
  296. /package/dist/{chunk-PRIHMSJH.js.map → chunk-2K4LMCV2.js.map} +0 -0
  297. /package/dist/{chunk-4GACYQUI.js.map → chunk-2YJL6MEB.js.map} +0 -0
  298. /package/dist/{chunk-L27H2R2N.js.map → chunk-2ZY7HON7.js.map} +0 -0
  299. /package/dist/{chunk-RZTNH2TX.js.map → chunk-45OQOUJA.js.map} +0 -0
  300. /package/dist/{chunk-YT2BSTD3.js.map → chunk-7TNPEURJ.js.map} +0 -0
  301. /package/dist/{chunk-WKS6ZDUP.js.map → chunk-BSOWFWEU.js.map} +0 -0
  302. /package/dist/{chunk-X5ECCSHP.js.map → chunk-D23EKXOP.js.map} +0 -0
  303. /package/dist/{chunk-FC3U5XKS.js.map → chunk-D7PFF6UC.js.map} +0 -0
  304. /package/dist/{chunk-OU5YA2QX.js.map → chunk-DT2XXF6O.js.map} +0 -0
  305. /package/dist/{chunk-ARBKEE6E.js.map → chunk-DYOI4FQ7.js.map} +0 -0
  306. /package/dist/{chunk-4EVLVA2R.js.map → chunk-EFM7OODQ.js.map} +0 -0
  307. /package/dist/{chunk-P6KWFODZ.js.map → chunk-EIIANSBX.js.map} +0 -0
  308. /package/dist/{chunk-HJMRWBR5.js.map → chunk-EYK6G4XE.js.map} +0 -0
  309. /package/dist/{chunk-PKC6QBYJ.js.map → chunk-EZWYX343.js.map} +0 -0
  310. /package/dist/{chunk-LIQ4SQ2T.js.map → chunk-FEELV5IV.js.map} +0 -0
  311. /package/dist/{chunk-YCWIGXH6.js.map → chunk-GP7QUF5A.js.map} +0 -0
  312. /package/dist/{chunk-ZGGGA3JR.js.map → chunk-HOXZOOVA.js.map} +0 -0
  313. /package/dist/{chunk-TJOGO2MK.js.map → chunk-JU7FIHQ2.js.map} +0 -0
  314. /package/dist/{chunk-MVYLY2SF.js.map → chunk-KN7DFVKW.js.map} +0 -0
  315. /package/dist/{chunk-K5H3XOYQ.js.map → chunk-LI6PGY3L.js.map} +0 -0
  316. /package/dist/{chunk-3KEWXALS.js.map → chunk-MCWYIEWI.js.map} +0 -0
  317. /package/dist/{chunk-LIWBVGRE.js.map → chunk-MFQ5SUJT.js.map} +0 -0
  318. /package/dist/{chunk-HEOWTR7Z.js.map → chunk-OW4XDJV2.js.map} +0 -0
  319. /package/dist/{chunk-KYR4EG3E.js.map → chunk-PHEEJUFL.js.map} +0 -0
  320. /package/dist/{chunk-KHV5GALI.js.map → chunk-QNDLOCAI.js.map} +0 -0
  321. /package/dist/{chunk-GQ7JE7A7.js.map → chunk-UZUHXN7H.js.map} +0 -0
  322. /package/dist/{chunk-YWK4UBVU.js.map → chunk-V5QJBDBC.js.map} +0 -0
  323. /package/dist/{chunk-LP2QDRO4.js.map → chunk-WBUMUELD.js.map} +0 -0
  324. /package/dist/{chunk-EP5TYLNV.js.map → chunk-WEU6GKUQ.js.map} +0 -0
  325. /package/dist/{chunk-46TPPYCI.js.map → chunk-X5VHGXFB.js.map} +0 -0
  326. /package/dist/{chunk-3V57D7GE.js.map → chunk-XJRBFLBD.js.map} +0 -0
  327. /package/dist/{chunk-QS2BDKFL.js.map → chunk-Y63Y4QSY.js.map} +0 -0
  328. /package/dist/{chunk-PAQ3T6OT.js.map → chunk-YRVDCIJ2.js.map} +0 -0
  329. /package/dist/{claim-RHZVTMQZ.js.map → claim-UDNXCJIU.js.map} +0 -0
  330. /package/dist/{companies-LIKSVYSR.js.map → companies-RPZN4JTR.js.map} +0 -0
  331. /package/dist/{complete-OM7R6VOC.js.map → complete-HLSRQE3N.js.map} +0 -0
  332. /package/dist/{connect-AVX3NKP6.js.map → connect-TIJZO7OV.js.map} +0 -0
  333. /package/dist/{conversation-3HGRWXKO.js.map → conversation-BS7TF6LZ.js.map} +0 -0
  334. /package/dist/{conversion-upload-command-AUF3LNTH.js.map → conversion-upload-command-CSD344BY.js.map} +0 -0
  335. /package/dist/{conversions-XADFSQ4W.js.map → conversions-FEWAX64H.js.map} +0 -0
  336. /package/dist/{create-PQSDE4J3.js.map → create-4SH4BZXP.js.map} +0 -0
  337. /package/dist/{create-BWHYYATN.js.map → create-B4UVIJZI.js.map} +0 -0
  338. /package/dist/{create-Z4JLLTPG.js.map → create-F5FNHJKE.js.map} +0 -0
  339. /package/dist/{create-3I64N6RJ.js.map → create-L3JHP6J4.js.map} +0 -0
  340. /package/dist/{creatives-WPRN6CU4.js.map → creatives-LK2NZHRX.js.map} +0 -0
  341. /package/dist/{creatives-UEPLNCPN.js.map → creatives-RQ2DFHGI.js.map} +0 -0
  342. /package/dist/{creatives-6Z7CEW5O.js.map → creatives-UILBPOKO.js.map} +0 -0
  343. /package/dist/{critique-M5TMIG2D.js.map → critique-FAOH4FCP.js.map} +0 -0
  344. /package/dist/{critique-K632OHFP.js.map → critique-X7HYYEJ4.js.map} +0 -0
  345. /package/dist/{crm-CWT6BMMX.js.map → crm-RB5TVV3M.js.map} +0 -0
  346. /package/dist/{crm-Q2QK4ZMS.js.map → crm-XEQDSU2U.js.map} +0 -0
  347. /package/dist/{currency-XCGKQ7FE.js.map → currency-47QHFHDA.js.map} +0 -0
  348. /package/dist/{custom-conversions-2VLJGPRV.js.map → custom-conversions-7HOWR6X6.js.map} +0 -0
  349. /package/dist/{customers-7TS64ZM5.js.map → customers-P5WOUY6G.js.map} +0 -0
  350. /package/dist/{delete-H7W3V6QG.js.map → delete-DLQ2ZZDA.js.map} +0 -0
  351. /package/dist/{delete-BPSOLCGB.js.map → delete-GZKGPBBD.js.map} +0 -0
  352. /package/dist/{delete-RIY5VUTU.js.map → delete-SW5OSIGN.js.map} +0 -0
  353. /package/dist/{demographics-NHGM4QP7.js.map → demographics-ZLZOIWUE.js.map} +0 -0
  354. /package/dist/{discard-IBMOGEYB.js.map → discard-VNVNJWNX.js.map} +0 -0
  355. /package/dist/{discover-BJPZNXUQ.js.map → discover-P6TUGZ45.js.map} +0 -0
  356. /package/dist/{domain-Y3N2UY5I.js.map → domain-OBICRJP3.js.map} +0 -0
  357. /package/dist/{draft-322ZG6JG.js.map → draft-UECMJ6B4.js.map} +0 -0
  358. /package/dist/{draft-6KBILDJK.js.map → draft-V75RBORX.js.map} +0 -0
  359. /package/dist/{draft-P5T2QHCY.js.map → draft-Z3VUQ4LJ.js.map} +0 -0
  360. /package/dist/{facets-3SDK42HY.js.map → facets-7J66L3NK.js.map} +0 -0
  361. /package/dist/{feedback-P2JZTJY5.js.map → feedback-3LDG4WVJ.js.map} +0 -0
  362. /package/dist/{feedback-record-5O6UUWTZ.js.map → feedback-record-CTAUHLMF.js.map} +0 -0
  363. /package/dist/{fetch-LN5W3J4E.js.map → fetch-4RXXZGO4.js.map} +0 -0
  364. /package/dist/{flows-MN26KBWB.js.map → flows-GGB46DLH.js.map} +0 -0
  365. /package/dist/{fonts-7TXPTNCS.js.map → fonts-S3GWKOUJ.js.map} +0 -0
  366. /package/dist/{forecast-ZHBKYQFP.js.map → forecast-6JVKXNFB.js.map} +0 -0
  367. /package/dist/{funnel-UAXVM7JN.js.map → funnel-RCQOIQZ5.js.map} +0 -0
  368. /package/dist/{ga4-DV2AXCSL.js.map → ga4-U6DMJ6K4.js.map} +0 -0
  369. /package/dist/{get-EKYSQHNB.js.map → get-KQSM2MXM.js.map} +0 -0
  370. /package/dist/{get-P7SSZ46N.js.map → get-MN2GRXGZ.js.map} +0 -0
  371. /package/dist/{google-ads-LZDXDFPW.js.map → google-ads-YAJ33LTW.js.map} +0 -0
  372. /package/dist/{history-BFGVCJ4J.js.map → history-QWYLRQBO.js.map} +0 -0
  373. /package/dist/{hubspot-I3PNNF3E.js.map → hubspot-DDONLJ7R.js.map} +0 -0
  374. /package/dist/{ideas-ZNP5BOGE.js.map → ideas-N44Z2SIT.js.map} +0 -0
  375. /package/dist/{images-MWWGN672.js.map → images-BKHCBCE7.js.map} +0 -0
  376. /package/dist/{ingest-H7BWHY7L.js.map → ingest-HBECWLOB.js.map} +0 -0
  377. /package/dist/{ingest-NYP2ZAAK.js.map → ingest-VNRTFD4Y.js.map} +0 -0
  378. /package/dist/{inspect-FNNDBZQX.js.map → inspect-7GGJDJBJ.js.map} +0 -0
  379. /package/dist/{inspiration-S3DU4CMQ.js.map → inspiration-CGM3NK6X.js.map} +0 -0
  380. /package/dist/{intent-E3UIVZBN.js.map → intent-HKNBXEDS.js.map} +0 -0
  381. /package/dist/{keyword-gap-BG6M665A.js.map → keyword-gap-HUSP6MOT.js.map} +0 -0
  382. /package/dist/{keyword-metrics-WG5LLBUW.js.map → keyword-metrics-2C3VFGDQ.js.map} +0 -0
  383. /package/dist/{keywords-for-site-HVEAAODA.js.map → keywords-for-site-4GV4KS4X.js.map} +0 -0
  384. /package/dist/{landing-G5MLO4CZ.js.map → landing-V2FMPQOK.js.map} +0 -0
  385. /package/dist/{languages-HORKPDNH.js.map → languages-75YJZAHL.js.map} +0 -0
  386. /package/dist/{leads-XCAE4OVV.js.map → leads-DTULNGMU.js.map} +0 -0
  387. /package/dist/{leads-ARUWPHBM.js.map → leads-OPRVJBQG.js.map} +0 -0
  388. /package/dist/{learn-5WSN4PT5.js.map → learn-EW2CKOFS.js.map} +0 -0
  389. /package/dist/{line-item-writes-4EOQBQSC.js.map → line-item-writes-EF3BJ5KV.js.map} +0 -0
  390. /package/dist/{line-items-45X5BVQW.js.map → line-items-G467XOZF.js.map} +0 -0
  391. /package/dist/{link-XAXNBIKU.js.map → link-5SU4MR6M.js.map} +0 -0
  392. /package/dist/{linkedin-62HOT3HB.js.map → linkedin-OFM3VVOB.js.map} +0 -0
  393. /package/dist/{list-PLWORN75.js.map → list-HEWXAVCL.js.map} +0 -0
  394. /package/dist/{list-NYTQ3DBH.js.map → list-SUTCQLGI.js.map} +0 -0
  395. /package/dist/{list-H4SN4QYE.js.map → list-VFZPXFMA.js.map} +0 -0
  396. /package/dist/{locations-J4G5RNPH.js.map → locations-6XADFU3V.js.map} +0 -0
  397. /package/dist/{log-S7TEGEPL.js.map → log-I3MAU44R.js.map} +0 -0
  398. /package/dist/{make-F6FOFAS4.js.map → make-ALBJZKJZ.js.map} +0 -0
  399. /package/dist/{map-V3YC6Y5I.js.map → map-OT6F33VF.js.map} +0 -0
  400. /package/dist/{mcp-3R3FOL2H.js.map → mcp-LC3L2JQO.js.map} +0 -0
  401. /package/dist/{media-53DJRC4N.js.map → media-MYZ5I7WK.js.map} +0 -0
  402. /package/dist/{media-sources-356UORTR.js.map → media-sources-RK6EJYBQ.js.map} +0 -0
  403. /package/dist/{members-KATLJNPJ.js.map → members-7CHDHW7H.js.map} +0 -0
  404. /package/dist/{meta-A7KM6TF5.js.map → meta-7XP5AWYU.js.map} +0 -0
  405. /package/dist/{metrics-SQDJ5NQO.js.map → metrics-73LI743C.js.map} +0 -0
  406. /package/dist/{normalize-RUPEDCAV.js.map → normalize-CXMYHNSA.js.map} +0 -0
  407. /package/dist/{options-SCYGSRQX.js.map → options-E4IO5SR5.js.map} +0 -0
  408. /package/dist/{performance-U3MA6YXN.js.map → performance-UQLSBPYN.js.map} +0 -0
  409. /package/dist/{plan-4QP2G7GV.js.map → plan-NBFLYAOW.js.map} +0 -0
  410. /package/dist/{promoted-tweet-writes-5UMGETBC.js.map → promoted-tweet-writes-ZW3FUPFG.js.map} +0 -0
  411. /package/dist/{promoted-tweets-A3V53KZI.js.map → promoted-tweets-ZLQ6GZD5.js.map} +0 -0
  412. /package/dist/{publish-V22K43GA.js.map → publish-H2PBR5XN.js.map} +0 -0
  413. /package/dist/{reddit-UACCQN3B.js.map → query-GDUTZ4R7.js.map} +0 -0
  414. /package/dist/{run-HMFS4KQZ.js.map → reddit-TGQYQUNZ.js.map} +0 -0
  415. /package/dist/{refresh-PSXGRCJE.js.map → refresh-HVBCC2ZI.js.map} +0 -0
  416. /package/dist/{release-S2X7UL4U.js.map → release-VI3JT6O6.js.map} +0 -0
  417. /package/dist/{relevant-pages-OWMNUCP7.js.map → relevant-pages-2FW3E5KD.js.map} +0 -0
  418. /package/dist/{remove-4GTKRBUW.js.map → remove-4EE7STMS.js.map} +0 -0
  419. /package/dist/{reopen-3KUS6UZ2.js.map → reopen-LEGLAOMA.js.map} +0 -0
  420. /package/dist/{rerun-ZHD7C4W2.js.map → rerun-A5DPZFOO.js.map} +0 -0
  421. /package/dist/{research-7LO3G3EP.js.map → research-O6YMV2TG.js.map} +0 -0
  422. /package/dist/{research-UF6PKQPH.js.map → research-WOJELJ4K.js.map} +0 -0
  423. /package/dist/{reset-PVXTS3FZ.js.map → reset-PQHURJDC.js.map} +0 -0
  424. /package/dist/{reset-PU57HTAP.js.map → reset-V2X7DFHD.js.map} +0 -0
  425. /package/dist/{resolve-KBIYWRF7.js.map → resolve-Q4AACDIC.js.map} +0 -0
  426. /package/dist/{retry-HKWNIGON.js.map → retry-BB6NJBC4.js.map} +0 -0
  427. /package/dist/{retry-LSCVGZM5.js.map → retry-WMGEUJPB.js.map} +0 -0
  428. /package/dist/{sync-definition-6WBQN4Q3.js.map → run-OBYA2F3E.js.map} +0 -0
  429. /package/dist/{run-DU6RVXPA.js.map → run-V6E36GXW.js.map} +0 -0
  430. /package/dist/{scaffold-ad-SLUGKZIW.js.map → scaffold-ad-KKYI7FZJ.js.map} +0 -0
  431. /package/dist/{scaffold-static-ad-NRFAA5HL.js.map → scaffold-static-ad-R5UE4YIZ.js.map} +0 -0
  432. /package/dist/{scaffold-video-Q7BSFVS4.js.map → scaffold-video-Y2BWXZSX.js.map} +0 -0
  433. /package/dist/{schedule-VNTGMFLQ.js.map → schedule-EO27AZTT.js.map} +0 -0
  434. /package/dist/{scheduled-agents-6TNWXJVH.js.map → scheduled-agents-OIJBX7OO.js.map} +0 -0
  435. /package/dist/{schema-ZEOL467O.js.map → schema-7GSCTQIC.js.map} +0 -0
  436. /package/dist/{search-XUINK3C2.js.map → search-Q7PAV7NY.js.map} +0 -0
  437. /package/dist/{select-U3DVKV72.js.map → select-ASR5SBYE.js.map} +0 -0
  438. /package/dist/{set-prompt-EQIVJ5LR.js.map → set-prompt-I32464V4.js.map} +0 -0
  439. /package/dist/{setup-links-CLPE6UUM.js.map → setup-links-NP2HULRC.js.map} +0 -0
  440. /package/dist/{site-GIZB7NWB.js.map → site-PTIYQQ3Z.js.map} +0 -0
  441. /package/dist/{sources-7RGXA35S.js.map → sources-5FRMFKDA.js.map} +0 -0
  442. /package/dist/{sources-2PG4U4BC.js.map → sources-FJLCIG6X.js.map} +0 -0
  443. /package/dist/{stale-ODM7IOO2.js.map → stale-YUYMETFC.js.map} +0 -0
  444. /package/dist/{stats-NNXZMPZR.js.map → stats-F5JZVPYG.js.map} +0 -0
  445. /package/dist/{status-HKCIXG7P.js.map → status-UYIQFC7L.js.map} +0 -0
  446. /package/dist/{studio-EKIPLLHD.js.map → studio-6ZL76TZR.js.map} +0 -0
  447. /package/dist/{sync-LGDTHM6C.js.map → sync-527ZCA4A.js.map} +0 -0
  448. /package/dist/{tags-BQFPK55V.js.map → tags-2MX3332V.js.map} +0 -0
  449. /package/dist/{tags-N72F6AMR.js.map → tags-7767I2D6.js.map} +0 -0
  450. /package/dist/{tags-DRZ7GPP4.js.map → tags-J3BGX3E6.js.map} +0 -0
  451. /package/dist/{tags-Q5NWILJO.js.map → tags-O27SK3YX.js.map} +0 -0
  452. /package/dist/{tags-4NICM2LC.js.map → tags-VAYVSQM6.js.map} +0 -0
  453. /package/dist/{targeting-criteria-DXHMEEC2.js.map → targeting-criteria-GOTI75Y4.js.map} +0 -0
  454. /package/dist/{targets-A325AP5G.js.map → targets-FC7CGFRD.js.map} +0 -0
  455. /package/dist/{templates-WWY4ZVKR.js.map → templates-EF5LOWP5.js.map} +0 -0
  456. /package/dist/{testimonials-YVHSZTWW.js.map → testimonials-MRMRWF2T.js.map} +0 -0
  457. /package/dist/{top-companies-S2Y4I5HF.js.map → top-companies-VTLR6GTW.js.map} +0 -0
  458. /package/dist/{translate-BTUMXQSK.js.map → translate-UMTKAUJ3.js.map} +0 -0
  459. /package/dist/{triggers-T47AIYVB.js.map → triggers-Y7ZMMY3C.js.map} +0 -0
  460. /package/dist/{unlink-XRKX6DVP.js.map → unlink-HZCFLXH4.js.map} +0 -0
  461. /package/dist/{unstage-77RAGX3F.js.map → unstage-562HOOE7.js.map} +0 -0
  462. /package/dist/{update-R3QSTHUD.js.map → update-ATSXY5UN.js.map} +0 -0
  463. /package/dist/{update-RJLMUP7I.js.map → update-DKU2UDFA.js.map} +0 -0
  464. /package/dist/{update-YRO5IHDX.js.map → update-I5A5TOZJ.js.map} +0 -0
  465. /package/dist/{update-NQIRRGOW.js.map → update-ZF3VFYLB.js.map} +0 -0
  466. /package/dist/{upload-KWFKNKAF.js.map → upload-SIAI6NMH.js.map} +0 -0
  467. /package/dist/{url-params-IMC43AIM.js.map → url-params-AZUI3CW3.js.map} +0 -0
  468. /package/dist/{validate-Y6R6F5T3.js.map → validate-MC4EIQI5.js.map} +0 -0
  469. /package/dist/{videos-U2FPMNFS.js.map → videos-S7BYFSU3.js.map} +0 -0
  470. /package/dist/{web-AHTOJNQY.js.map → web-5R7LHKIT.js.map} +0 -0
  471. /package/dist/{winning-ads-TUYN2BST.js.map → winning-ads-PDCY4YW5.js.map} +0 -0
  472. /package/dist/{write-commands-CT74VHH6.js.map → write-commands-MFRZD6Q6.js.map} +0 -0
  473. /package/dist/{write-commands-2XFNH4BW.js.map → write-commands-VXL5QKMT.js.map} +0 -0
  474. /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 only
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": { "overriding": [], "omitted": 12 },
239
- "levels_not_read": ["ad_group", "ad"]
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 is deliberately not stageable — Google writes it through `CustomerService`, outside the atomic publish batch, so it could not be published atomically nor reversed by discarding the chat. `--level account` stages nothing and returns a structured `error.fix` naming where to set it.
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.** Without `--all`, a query returns one page capped by `--limit` (default 200, or the `LIMIT` in the statement, whichever is smaller). With `--all` every page is followed, but the statement's `LIMIT` still caps the read — and preflight adds one at `--limit` to any query that arrives without it, so `--all` on its own still stops at 200 rows. When the rows fill whichever cap is in force, or the API returns a cursor the run did not follow, the response carries a `TRUNCATED_RESULTS` warning:
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": "eyJwYWdl..." },
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 --limit 8192 --out data.csv` (one read returns at most 8,192 rows; split a bigger data set into narrower queries — a shorter date range or one campaign each) 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:
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
- | `--limit` | Max rows per page (default 200, at most 8,192) |
374
- | `--cursor` | Pagination cursor from previous response |
375
- | `--all` | Auto-paginate all results. Exhausts the pages, not the statement's `LIMIT` — pair it with a `LIMIT` in the statement above the expected row count (at most 8,192 — split bigger reads into narrower queries), and a read that still fills its cap is flagged `TRUNCATED_RESULTS` either way |
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 asset performance labels | LAST_30_DAYS |
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, or a statement `LIMIT` above 8,192 | Rejects before any request — one read returns at most 8,192 rows | `VALIDATION_ERROR` naming the cap and how to split a bigger read; a statement `LIMIT` also gets `fix.correctedCommand` at `LIMIT 8192` |
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 → new value, and who changed it |
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
- Command groups: `budgets`, `campaigns`, `ad-groups`, `keywords` (add/update/remove), `negative-keywords`, `keyword-lists`, `ads`, `assets` (create/update/attach/detach), `asset-groups` (create/update/attach/detach — Performance Max), `audiences`, `conversions` (create/update/goal/upload), `bidding-strategies`, `labels`, `campaign-criteria` (add/update/remove), and `draft`. 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**.
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-YWK4UBVU.js";
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-RZTNH2TX.js";
13
+ import "./chunk-45OQOUJA.js";
14
14
  import "./chunk-GXDLWBOY.js";
15
15
  import "./chunk-TEINLN64.js";
16
- import "./chunk-ZJWUBJYQ.js";
17
- import "./chunk-NE4F3FHN.js";
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-2XFNH4BW.js").then((m) => m.accountUrlParamsCommand)
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-2OBWFPRG.js.map
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-YWK4UBVU.js";
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-RZTNH2TX.js";
19
+ import "./chunk-45OQOUJA.js";
20
20
  import "./chunk-GXDLWBOY.js";
21
21
  import "./chunk-TEINLN64.js";
22
- import "./chunk-ZJWUBJYQ.js";
23
- import "./chunk-NE4F3FHN.js";
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-TDTME6RQ.js.map
77
+ //# sourceMappingURL=accounts-4TM4UZEJ.js.map