@koda-sl/baker-cli 0.568.0 → 0.569.0-dev.1b455b3fe

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 (1186) hide show
  1. package/README.md +3 -3
  2. package/dist/account-JREYXYNE.js +82 -0
  3. package/dist/account-OUKPRB7C.js +139 -0
  4. package/dist/account-WN5MJ5QN.js +82 -0
  5. package/dist/account-assets-IWJWYNQ3.js +290 -0
  6. package/dist/account-level-SHZBOMVV.js +612 -0
  7. package/dist/account-level-SHZBOMVV.js.map +1 -0
  8. package/dist/account-reads-GF3T25HX.js +220 -0
  9. package/dist/account-reads-GF3T25HX.js.map +1 -0
  10. package/dist/account-users-7NKBUVYA.js +65 -0
  11. package/dist/account-users-7NKBUVYA.js.map +1 -0
  12. package/dist/account-writes-IUIXIVRC.js +68 -0
  13. package/dist/accounts-4YRDRLHX.js +80 -0
  14. package/dist/accounts-HEGADQ6E.js +119 -0
  15. package/dist/accounts-OSVXKNSI.js +76 -0
  16. package/dist/accounts-SJOO4MQX.js +115 -0
  17. package/dist/accounts-V7EOUTNL.js +713 -0
  18. package/dist/actions-5LYJ3U6G.js +55 -0
  19. package/dist/active-entities-4KQQSMRZ.js +103 -0
  20. package/dist/activecampaign-CZHLHGT4.js +938 -0
  21. package/dist/activities-FRA33VZZ.js +75 -0
  22. package/dist/ad-group-writes-YQXBUA3Q.js +172 -0
  23. package/dist/ad-groups-NJR4ILEN.js +70 -0
  24. package/dist/ad-writes-TZV64CC2.js +176 -0
  25. package/dist/add-MZUSKY2L.js +305 -0
  26. package/dist/add-NAUSQKRS.js +107 -0
  27. package/dist/ads-A2FXTQES.js +120 -0
  28. package/dist/ads-PYTK3LJE.js +48 -0
  29. package/dist/ads-Q7DD5VXU.js +79 -0
  30. package/dist/adsets-ZHEVFOK4.js +182 -0
  31. package/dist/advertisers-HSTND4HE.js +123 -0
  32. package/dist/analytics-63Q3FJN4.js +447 -0
  33. package/dist/analytics-GLJODEIM.js +2437 -0
  34. package/dist/animate-EI6AYBDI.js +480 -0
  35. package/dist/asset-writes-MS45UKJ3.js +51 -0
  36. package/dist/assign-7HT3XSSN.js +80 -0
  37. package/dist/audience-size-DG7544D2.js +76 -0
  38. package/dist/audience-writes-IL64HQBS.js +328 -0
  39. package/dist/audience-writes-IL64HQBS.js.map +1 -0
  40. package/dist/audiences-2IVVS3SJ.js +280 -0
  41. package/dist/audiences-RN745R53.js +85 -0
  42. package/dist/audiences-Z2TQT35L.js +106 -0
  43. package/dist/audit-BIHMDO5K.js +88 -0
  44. package/dist/audit-ZYST7KCO.js +154 -0
  45. package/dist/autocomplete-5BKEMOQ3.js +114 -0
  46. package/dist/avatars-FQOCDWLW.js +38 -0
  47. package/dist/bid-pricing-JEW7T2VR.js +103 -0
  48. package/dist/brand-FR6BKWXN.js +22 -0
  49. package/dist/brief-32IXDJ4J.js +543 -0
  50. package/dist/businesses-HECSW3EL.js +54 -0
  51. package/dist/campaign-groups-LYPVIZT5.js +99 -0
  52. package/dist/campaign-writes-D5MM5LUH.js +168 -0
  53. package/dist/campaign-writes-S7A6W5V3.js +176 -0
  54. package/dist/campaigns-CMDF3P7Y.js +111 -0
  55. package/dist/campaigns-LIICP5JU.js +113 -0
  56. package/dist/campaigns-N72TOUQX.js +130 -0
  57. package/dist/campaigns-ZWJKBF3L.js +78 -0
  58. package/dist/canvas-3SNC3UUV.js +46 -0
  59. package/dist/capabilities-GL7P3SWY.js +147 -0
  60. package/dist/cards-RYQN5JLR.js +85 -0
  61. package/dist/catalog-PWAWDK42.js +66 -0
  62. package/dist/catalogs-2R5RV4L7.js +783 -0
  63. package/dist/catalogs-2R5RV4L7.js.map +1 -0
  64. package/dist/catalogs-SLPYHA7D.js +130 -0
  65. package/dist/changes-WOD4EOSN.js +167 -0
  66. package/dist/chatgpt-3GX4I6NH.js +47 -0
  67. package/dist/chats-K2WUFVCG.js +584 -0
  68. package/dist/check-ZSQ4EIFB.js +154 -0
  69. package/dist/check-ZSQ4EIFB.js.map +1 -0
  70. package/dist/chunk-34ARMQNL.js +197 -0
  71. package/dist/chunk-34MZGC2Y.js +207 -0
  72. package/dist/chunk-3JOGDGGP.js +24026 -0
  73. package/dist/chunk-3JOGDGGP.js.map +1 -0
  74. package/dist/chunk-46DHUWMV.js +642 -0
  75. package/dist/chunk-46DHUWMV.js.map +1 -0
  76. package/dist/chunk-4KBTW5NE.js +494 -0
  77. package/dist/chunk-4PAGS7QH.js +76 -0
  78. package/dist/chunk-53KV66ZZ.js +163 -0
  79. package/dist/chunk-55AX6DOP.js +86 -0
  80. package/dist/chunk-55AX6DOP.js.map +1 -0
  81. package/dist/chunk-5C4RRCKM.js +69 -0
  82. package/dist/chunk-5I6XOSNI.js +709 -0
  83. package/dist/chunk-5OE4Z7TP.js +287 -0
  84. package/dist/chunk-6OIKNJ7G.js +26 -0
  85. package/dist/chunk-6S4B67KP.js +962 -0
  86. package/dist/chunk-77LXZAX2.js +930 -0
  87. package/dist/chunk-7TVVYP7K.js +217 -0
  88. package/dist/chunk-7URHRPC7.js +3510 -0
  89. package/dist/chunk-7YMQEAGA.js +399 -0
  90. package/dist/chunk-A4O3JL6D.js +26 -0
  91. package/dist/chunk-ANRTDNPQ.js +115 -0
  92. package/dist/chunk-AQNTVM6S.js +1518 -0
  93. package/dist/chunk-BPDIY5CF.js +274 -0
  94. package/dist/chunk-CKHF7UXS.js +831 -0
  95. package/dist/chunk-CUTTTFAU.js +783 -0
  96. package/dist/chunk-D32EWSMB.js +150 -0
  97. package/dist/chunk-D55MN5IH.js +547 -0
  98. package/dist/chunk-DRQI2CJJ.js +138 -0
  99. package/dist/chunk-ESSA3AWR.js +133 -0
  100. package/dist/chunk-ESSA3AWR.js.map +1 -0
  101. package/dist/chunk-ETI6DGR2.js +312 -0
  102. package/dist/chunk-F3CZFUXZ.js +3187 -0
  103. package/dist/chunk-F3CZFUXZ.js.map +1 -0
  104. package/dist/chunk-FFTD7XDA.js +91 -0
  105. package/dist/chunk-FTKUHGTC.js +224 -0
  106. package/dist/chunk-GFYGVIT3.js +392 -0
  107. package/dist/chunk-GGXPO4NQ.js +225 -0
  108. package/dist/chunk-H56UJRLV.js +170 -0
  109. package/dist/chunk-HDMD6LXS.js +142 -0
  110. package/dist/chunk-HFZZKYUX.js +1320 -0
  111. package/dist/chunk-IAYJKH4R.js +5471 -0
  112. package/dist/chunk-IEPCI2EB.js +479 -0
  113. package/dist/chunk-IKADYUXK.js +344 -0
  114. package/dist/chunk-IMS53EQU.js +4277 -0
  115. package/dist/chunk-IMS53EQU.js.map +1 -0
  116. package/dist/chunk-IUX2LBW4.js +86 -0
  117. package/dist/chunk-IUX2LBW4.js.map +1 -0
  118. package/dist/chunk-J32CYEIH.js +74 -0
  119. package/dist/chunk-J5I3GYSJ.js +156 -0
  120. package/dist/chunk-JCVXKHVB.js +285 -0
  121. package/dist/chunk-JESSFI7R.js +468 -0
  122. package/dist/chunk-K4QPBXV7.js +61 -0
  123. package/dist/chunk-KJ3J2DYM.js +1919 -0
  124. package/dist/chunk-L43B2YGZ.js +2209 -0
  125. package/dist/chunk-L7UD57TV.js +219 -0
  126. package/dist/chunk-LJYXGUQ3.js +430 -0
  127. package/dist/chunk-LNYM4PQS.js +203 -0
  128. package/dist/chunk-LZR7LSYO.js +180 -0
  129. package/dist/chunk-LZR7LSYO.js.map +1 -0
  130. package/dist/chunk-MIXUMGJE.js +66 -0
  131. package/dist/chunk-MK4HCMEA.js +325 -0
  132. package/dist/chunk-MK4HCMEA.js.map +1 -0
  133. package/dist/chunk-MTFAG6E3.js +853 -0
  134. package/dist/chunk-MTFAG6E3.js.map +1 -0
  135. package/dist/chunk-MWJ6BCZJ.js +455 -0
  136. package/dist/chunk-MX5NQAK6.js +54 -0
  137. package/dist/chunk-MX5NQAK6.js.map +1 -0
  138. package/dist/chunk-O7WRA3JU.js +1902 -0
  139. package/dist/chunk-OADMSHME.js +334 -0
  140. package/dist/chunk-OLPABGH3.js +152 -0
  141. package/dist/chunk-ONGZKI5J.js +57 -0
  142. package/dist/chunk-OSZOUSK5.js +23 -0
  143. package/dist/chunk-PK7YNQ2T.js +454 -0
  144. package/dist/chunk-PN3CHL5W.js +98 -0
  145. package/dist/chunk-QMQSI4WA.js +89 -0
  146. package/dist/chunk-QUSDGZFS.js +188 -0
  147. package/dist/chunk-QXRSFH6M.js +604 -0
  148. package/dist/chunk-QZ4YHQLW.js +63 -0
  149. package/dist/chunk-RF3TP643.js +288 -0
  150. package/dist/chunk-RIRSFFWA.js +191 -0
  151. package/dist/chunk-ROHICQPK.js +8954 -0
  152. package/dist/chunk-RP3PC54R.js +169 -0
  153. package/dist/chunk-SIKCVWM3.js +76 -0
  154. package/dist/chunk-SOM4OTR5.js +167 -0
  155. package/dist/chunk-SYDPUGF5.js +126 -0
  156. package/dist/chunk-SYDPUGF5.js.map +1 -0
  157. package/dist/chunk-SZZ7BBED.js +148 -0
  158. package/dist/chunk-TAGJYHVI.js +191 -0
  159. package/dist/chunk-TB5JZTLN.js +19 -0
  160. package/dist/chunk-TQJLEVLA.js +131 -0
  161. package/dist/chunk-TW57RTKN.js +5368 -0
  162. package/dist/chunk-TXJOYQE2.js +1065 -0
  163. package/dist/chunk-TXJOYQE2.js.map +1 -0
  164. package/dist/chunk-UGIF56NZ.js +1254 -0
  165. package/dist/chunk-UGIF56NZ.js.map +1 -0
  166. package/dist/chunk-V3ANSXCB.js +51 -0
  167. package/dist/chunk-WSG4K2TR.js +103 -0
  168. package/dist/chunk-WXSRSMY3.js +64 -0
  169. package/dist/chunk-WZXMZFVB.js +238 -0
  170. package/dist/chunk-X3L5HYQM.js +91 -0
  171. package/dist/chunk-Y2TOB4N5.js +46 -0
  172. package/dist/chunk-YOHGEF2N.js +7899 -0
  173. package/dist/chunk-Z2LPYAN4.js +297 -0
  174. package/dist/chunk-ZICB4OI5.js +106 -0
  175. package/dist/chunk-ZOCAGPS5.js +225 -0
  176. package/dist/chunk-ZZWZUTEP.js +685 -0
  177. package/dist/claim-QHYA5UTF.js +200 -0
  178. package/dist/cli.js +36 -36
  179. package/dist/companies-BNMAOQUQ.js +198 -0
  180. package/dist/company-YANP3G62.js +308 -0
  181. package/dist/complete-ICZCBO6M.js +84 -0
  182. package/dist/config-GIETKZGS.js +88 -0
  183. package/dist/connect-ZXGEFS53.js +45 -0
  184. package/dist/conversation-YIWZIUIK.js +96 -0
  185. package/dist/conversion-report-E35RCZU7.js +127 -0
  186. package/dist/conversion-upload-command-QN33HEVV.js +440 -0
  187. package/dist/conversion-upload-command-QN33HEVV.js.map +1 -0
  188. package/dist/conversion-writes-MUD7WJDH.js +122 -0
  189. package/dist/conversions-B7HR6JMC.js +140 -0
  190. package/dist/conversions-WU7DNFF7.js +78 -0
  191. package/dist/copy-writes-R7VYSZXC.js +171 -0
  192. package/dist/copy-writes-R7VYSZXC.js.map +1 -0
  193. package/dist/create-EL47XN73.js +135 -0
  194. package/dist/create-GU5MUZ7U.js +62 -0
  195. package/dist/create-IKQ7A47F.js +239 -0
  196. package/dist/create-TKQDLX7M.js +218 -0
  197. package/dist/creatives-PW6HB4JB.js +58 -0
  198. package/dist/creatives-S4EGN44U.js +118 -0
  199. package/dist/creatives-VBD4T6C7.js +229 -0
  200. package/dist/credentials-57U2UQ7G.js +290 -0
  201. package/dist/critique-JTHSIXUF.js +233 -0
  202. package/dist/critique-JTHSIXUF.js.map +1 -0
  203. package/dist/critique-KAOJTSPQ.js +420 -0
  204. package/dist/critique-KAOJTSPQ.js.map +1 -0
  205. package/dist/crm-JCYLJQ7K.js +323 -0
  206. package/dist/crm-LQTYPDMZ.js +229 -0
  207. package/dist/currency-5NYTOLEL.js +88 -0
  208. package/dist/custom-conversions-NT7ONTEX.js +128 -0
  209. package/dist/customers-LP6I7POL.js +65 -0
  210. package/dist/delete-PZ6GP7J6.js +57 -0
  211. package/dist/delete-WW4JYQMX.js +69 -0
  212. package/dist/delete-XZNY426Q.js +67 -0
  213. package/dist/demographics-HZY2JEYQ.js +141 -0
  214. package/dist/discard-NRTGRVXR.js +69 -0
  215. package/dist/discover-5ZFAAPNG.js +172 -0
  216. package/dist/domain-YGKFTN6D.js +101 -0
  217. package/dist/download-XERSDEN3.js +172 -0
  218. package/dist/draft-2EVXU5XB.js +134 -0
  219. package/dist/draft-CQWYTMSS.js +138 -0
  220. package/dist/draft-EL74RDAG.js +374 -0
  221. package/dist/draft-EWB4A3FG.js +579 -0
  222. package/dist/draft-EWB4A3FG.js.map +1 -0
  223. package/dist/draft-GFZ3KMRX.js +315 -0
  224. package/dist/draft-JYZA3BFD.js +260 -0
  225. package/dist/draft-RBLMOZIL.js +333 -0
  226. package/dist/draft-RBLMOZIL.js.map +1 -0
  227. package/dist/draft-UNPTTHP4.js +220 -0
  228. package/dist/engine/index.js +8 -8
  229. package/dist/experiment-YAX26BOO.js +1397 -0
  230. package/dist/experiments-ERXZYY5E.js +237 -0
  231. package/dist/experiments-ERXZYY5E.js.map +1 -0
  232. package/dist/extract-QMY6WPTV.js +143 -0
  233. package/dist/facets-QHM2IQ3E.js +117 -0
  234. package/dist/feedback-NLPTKWOH.js +114 -0
  235. package/dist/feedback-X5FNVHKU.js +116 -0
  236. package/dist/feedback-X5FNVHKU.js.map +1 -0
  237. package/dist/feedback-record-7QCQTF26.js +270 -0
  238. package/dist/feedback-record-7QCQTF26.js.map +1 -0
  239. package/dist/fetch-72ZILZHO.js +204 -0
  240. package/dist/fit-AURKFPAY.js +65 -0
  241. package/dist/flows-CZPXHOZW.js +340 -0
  242. package/dist/fonts-NA26RQ4C.js +40 -0
  243. package/dist/forecast-ARIHRQAX.js +121 -0
  244. package/dist/forecast-BU22ZMOW.js +170 -0
  245. package/dist/forecast-BU22ZMOW.js.map +1 -0
  246. package/dist/funding-QDKFNQI2.js +85 -0
  247. package/dist/funnel-4VQB3T3M.js +397 -0
  248. package/dist/ga4-N6EBLN2W.js +55 -0
  249. package/dist/generate-IJLMJC4S.js +263 -0
  250. package/dist/get-LOEUOTG3.js +82 -0
  251. package/dist/get-W3VJIQBN.js +62 -0
  252. package/dist/google-5RKO3DND.js +3301 -0
  253. package/dist/google-5RKO3DND.js.map +1 -0
  254. package/dist/google-7VEPEBFV.js +163 -0
  255. package/dist/google-ads-YBOJ3XXK.js +198 -0
  256. package/dist/gsc-FILOUFCG.js +30 -0
  257. package/dist/history-6LLGAK7B.js +69 -0
  258. package/dist/history-H2SHADAM.js +153 -0
  259. package/dist/history-LJG64M6P.js +102 -0
  260. package/dist/hubspot-6JDARLIU.js +814 -0
  261. package/dist/ideas-MTWJDRRK.js +45 -0
  262. package/dist/images-RIFC6D3H.js +92 -0
  263. package/dist/ingest-K45T4OLM.js +131 -0
  264. package/dist/ingest-MSS52UO5.js +28 -0
  265. package/dist/insights-AVNMRFQ4.js +658 -0
  266. package/dist/insights-TBIT6DTF.js +132 -0
  267. package/dist/inspect-EBGYJOZ3.js +192 -0
  268. package/dist/instant-experiences-EEMQJ7H5.js +265 -0
  269. package/dist/instant-experiences-EEMQJ7H5.js.map +1 -0
  270. package/dist/intent-URHTU4AK.js +95 -0
  271. package/dist/job-OJB6KIDV.js +202 -0
  272. package/dist/job-create-C6FGCDW4.js +109 -0
  273. package/dist/job-status-4RJHESID.js +74 -0
  274. package/dist/keyword-gap-WXM6SN6A.js +130 -0
  275. package/dist/keyword-metrics-57MUTYMH.js +200 -0
  276. package/dist/keywords-for-site-ABZS7O5B.js +131 -0
  277. package/dist/landing-AXCYLUQZ.js +28 -0
  278. package/dist/languages-6XTVTFZC.js +40 -0
  279. package/dist/leads-C5BUBBLZ.js +115 -0
  280. package/dist/leads-IXF647ZC.js +542 -0
  281. package/dist/leads-IXF647ZC.js.map +1 -0
  282. package/dist/learn-M64GVGPX.js +207 -0
  283. package/dist/line-item-writes-HYLWBQTM.js +211 -0
  284. package/dist/line-items-Y4THDHSE.js +107 -0
  285. package/dist/link-BU7YCL2M.js +67 -0
  286. package/dist/linkedin-2SUTGGII.js +1345 -0
  287. package/dist/linkedin-2SUTGGII.js.map +1 -0
  288. package/dist/linkedin-person-FEIY7FYQ.js +139 -0
  289. package/dist/list-BKIL7O4G.js +306 -0
  290. package/dist/list-H3C345WG.js +154 -0
  291. package/dist/list-UGTDZ7YI.js +67 -0
  292. package/dist/locations-F4365X4S.js +40 -0
  293. package/dist/locations-HOI7AUZ2.js +69 -0
  294. package/dist/log-54SJV6MW.js +95 -0
  295. package/dist/lookup-QNLX2535.js +23 -0
  296. package/dist/make-AQ43J5LH.js +1368 -0
  297. package/dist/make-AQ43J5LH.js.map +1 -0
  298. package/dist/map-BPPGQGDV.js +445 -0
  299. package/dist/mcp-EXOMBMYL.js +729 -0
  300. package/dist/media-MITWBYVZ.js +18 -0
  301. package/dist/media-WGIEUEZW.js +89 -0
  302. package/dist/media-sources-XEC72K7X.js +35 -0
  303. package/dist/members-VDON57BE.js +47 -0
  304. package/dist/meta-NUBBKE2V.js +124 -0
  305. package/dist/metrics-V6FAZO5A.js +152 -0
  306. package/dist/models-TSMFIOZU.js +155 -0
  307. package/dist/normalize-632DD2HJ.js +144 -0
  308. package/dist/options-TZYZQZ3M.js +125 -0
  309. package/dist/organization-FYRXSGB4.js +949 -0
  310. package/dist/output-HZW7LNUL.js +24 -0
  311. package/dist/page-photos-4DNBQZUL.js +119 -0
  312. package/dist/page-photos-4DNBQZUL.js.map +1 -0
  313. package/dist/pages-UH6XEZBO.js +67 -0
  314. package/dist/performance-JKXHQIAV.js +27 -0
  315. package/dist/performance-OF3N43OP.js +5565 -0
  316. package/dist/pixels-KXA6R3G3.js +62 -0
  317. package/dist/pixels-PYNK73UG.js +109 -0
  318. package/dist/plan-4OYUV2EF.js +208 -0
  319. package/dist/preview-7E4E3QPT.js +245 -0
  320. package/dist/preview-FPBM75L2.js +101 -0
  321. package/dist/promoted-tweet-writes-IJRBFK7W.js +183 -0
  322. package/dist/promoted-tweets-7PYH3RPV.js +119 -0
  323. package/dist/properties-RDOGNY2O.js +101 -0
  324. package/dist/publish-MNSDFPEQ.js +350 -0
  325. package/dist/query-GMGWJW3X.js +62 -0
  326. package/dist/query-K7R5GQ4E.js +236 -0
  327. package/dist/query-PO3RT7BR.js +231 -0
  328. package/dist/questionnaire-4OH6K2BF.js +94 -0
  329. package/dist/read-MU5XGWMK.js +141 -0
  330. package/dist/reddit-JFFMZLJS.js +29 -0
  331. package/dist/refresh-EJ7WKW3H.js +97 -0
  332. package/dist/release-AFRLCZWB.js +63 -0
  333. package/dist/relevant-pages-4YGN3I2U.js +99 -0
  334. package/dist/remove-QD4PITBL.js +53 -0
  335. package/dist/reopen-JSC6AVJC.js +66 -0
  336. package/dist/rerun-QIAUVJX6.js +98 -0
  337. package/dist/rerun-QIAUVJX6.js.map +1 -0
  338. package/dist/research-MMFUFZGS.js +265 -0
  339. package/dist/research-SRISCVBM.js +75 -0
  340. package/dist/reset-752CNET3.js +57 -0
  341. package/dist/reset-R3TQAHRU.js +57 -0
  342. package/dist/resolve-EWHSJNBX.js +124 -0
  343. package/dist/retry-DVHDVHVP.js +65 -0
  344. package/dist/retry-PVULTONO.js +63 -0
  345. package/dist/revenue-B4N6QJM3.js +92 -0
  346. package/dist/revenue-B4N6QJM3.js.map +1 -0
  347. package/dist/rule-writes-YXK7HNLR.js +531 -0
  348. package/dist/rule-writes-YXK7HNLR.js.map +1 -0
  349. package/dist/rules-4YTY57FM.js +217 -0
  350. package/dist/rules-LRFDZFF6.js +108 -0
  351. package/dist/rules-LRFDZFF6.js.map +1 -0
  352. package/dist/rules-add-XVOGYHQO.js +497 -0
  353. package/dist/rules-add-XVOGYHQO.js.map +1 -0
  354. package/dist/run-PCZRYL42.js +69 -0
  355. package/dist/run-PRSAUWAJ.js +73 -0
  356. package/dist/scaffold-ad-A6SROV4X.js +1514 -0
  357. package/dist/scaffold-ad-A6SROV4X.js.map +1 -0
  358. package/dist/scaffold-static-ad-CRN5XZIZ.js +1013 -0
  359. package/dist/scaffold-static-ad-CRN5XZIZ.js.map +1 -0
  360. package/dist/scaffold-video-3F5JVFFR.js +886 -0
  361. package/dist/scaffold-video-3F5JVFFR.js.map +1 -0
  362. package/dist/schedule-6YTZBCZA.js +64 -0
  363. package/dist/scheduled-agents-XCPU57LU.js +55 -0
  364. package/dist/schema-4PS5BDG3.js +135 -0
  365. package/dist/search-IMZD5RGD.js +177 -0
  366. package/dist/select-GSO4BEIL.js +111 -0
  367. package/dist/select-GSO4BEIL.js.map +1 -0
  368. package/dist/sends-I2B6F5NW.js +349 -0
  369. package/dist/set-prompt-D32XJNWM.js +200 -0
  370. package/dist/set-prompt-D32XJNWM.js.map +1 -0
  371. package/dist/setup-links-PTL6RF2J.js +144 -0
  372. package/dist/shared-Z7INVKCZ.js +32 -0
  373. package/dist/shopify-SDZZ5HTA.js +4009 -0
  374. package/dist/site-NGQ7K6UD.js +180 -0
  375. package/dist/sitemaps-EOMSRKOD.js +77 -0
  376. package/dist/sites-6M73AONG.js +97 -0
  377. package/dist/sources-NKFSCI6M.js +30 -0
  378. package/dist/sources-O4CQ5KSX.js +457 -0
  379. package/dist/stale-CEZJ53RO.js +91 -0
  380. package/dist/stale-CEZJ53RO.js.map +1 -0
  381. package/dist/stats-MFEH2TSW.js +34 -0
  382. package/dist/status-DLYRPGFS.js +65 -0
  383. package/dist/stock-RDCDVBHX.js +212 -0
  384. package/dist/studies-SSA3SR2L.js +250 -0
  385. package/dist/studio-MBHPDGMN.js +49 -0
  386. package/dist/study-writes-EDV6OH7I.js +472 -0
  387. package/dist/study-writes-EDV6OH7I.js.map +1 -0
  388. package/dist/sync-BEW3TZP7.js +57 -0
  389. package/dist/sync-SI25TKY5.js +279 -0
  390. package/dist/sync-definition-RECCA3QH.js +71 -0
  391. package/dist/tag-manager-JFC6YYVP.js +43 -0
  392. package/dist/tags-IJIGZYR3.js +23 -0
  393. package/dist/tags-K4HIKHNU.js +26 -0
  394. package/dist/tags-OTA55BQ6.js +23 -0
  395. package/dist/tags-QF2V4B3M.js +23 -0
  396. package/dist/tags-SK7WXMBS.js +227 -0
  397. package/dist/targeting-NPNBPEHW.js +763 -0
  398. package/dist/targeting-NPNBPEHW.js.map +1 -0
  399. package/dist/targeting-constants-RF2732EW.js +118 -0
  400. package/dist/targeting-criteria-7BUUYDYC.js +113 -0
  401. package/dist/targets-7V3NCQSD.js +106 -0
  402. package/dist/terms-XFL6QO7A.js +102 -0
  403. package/dist/testimonials-XYD5DLBJ.js +32 -0
  404. package/dist/themes-HYDGH4GM.js +96 -0
  405. package/dist/themes-HYDGH4GM.js.map +1 -0
  406. package/dist/top-companies-LI26TONY.js +111 -0
  407. package/dist/transcript-FTHDWMGU.js +165 -0
  408. package/dist/translate-YATYKOEX.js +604 -0
  409. package/dist/translate-YATYKOEX.js.map +1 -0
  410. package/dist/triggers-3LHJVK5P.js +144 -0
  411. package/dist/tweets-6PQHJXJC.js +123 -0
  412. package/dist/unlink-BMOUBGWO.js +70 -0
  413. package/dist/unstage-O23ILHCY.js +96 -0
  414. package/dist/unstage-YEW5KXJL.js +88 -0
  415. package/dist/update-2IWZA5UU.js +101 -0
  416. package/dist/update-G7YZICSU.js +155 -0
  417. package/dist/update-T5INCQJZ.js +192 -0
  418. package/dist/update-UTQVTG45.js +66 -0
  419. package/dist/upload-UXYJDA2U.js +137 -0
  420. package/dist/url-options-Y7I5EL55.js +131 -0
  421. package/dist/url-params-PE4XAQNH.js +101 -0
  422. package/dist/validate-MMHBTNWU.js +126 -0
  423. package/dist/validate-MMHBTNWU.js.map +1 -0
  424. package/dist/videos-AHOLXU42.js +146 -0
  425. package/dist/videos-EVPJHY3B.js +41 -0
  426. package/dist/viewer-check-NA4TMNY4.js +83 -0
  427. package/dist/web-7EODEH25.js +173 -0
  428. package/dist/winning-ads-5UKX6QV7.js +86 -0
  429. package/dist/write-commands-HFP5KLYZ.js +1525 -0
  430. package/dist/write-commands-HFP5KLYZ.js.map +1 -0
  431. package/dist/write-commands-KVOMOYME.js +1170 -0
  432. package/dist/write-commands-KVOMOYME.js.map +1 -0
  433. package/dist/write-commands-LHEJESKL.js +206 -0
  434. package/dist/write-commands-SD6DXVNK.js +721 -0
  435. package/dist/x-R72UTFQT.js +47 -0
  436. package/package.json +1 -1
  437. package/dist/account-D2AGXMM3.js +0 -82
  438. package/dist/account-OCFXNHG7.js +0 -139
  439. package/dist/account-U6DFMD2V.js +0 -82
  440. package/dist/account-assets-W7K2PUYB.js +0 -290
  441. package/dist/account-level-Z2JEIJ3X.js +0 -611
  442. package/dist/account-level-Z2JEIJ3X.js.map +0 -1
  443. package/dist/account-reads-WPKD2LPB.js +0 -219
  444. package/dist/account-reads-WPKD2LPB.js.map +0 -1
  445. package/dist/account-users-BK45DBUH.js +0 -64
  446. package/dist/account-users-BK45DBUH.js.map +0 -1
  447. package/dist/account-writes-QSJ74QFR.js +0 -68
  448. package/dist/accounts-3DS67RX7.js +0 -119
  449. package/dist/accounts-55PDBEDN.js +0 -76
  450. package/dist/accounts-AK4QIG24.js +0 -115
  451. package/dist/accounts-FALANOYX.js +0 -80
  452. package/dist/accounts-VSJVFIPH.js +0 -713
  453. package/dist/actions-JIXQEVIN.js +0 -55
  454. package/dist/active-entities-HR7NJJLU.js +0 -103
  455. package/dist/activecampaign-4ST7BMHO.js +0 -938
  456. package/dist/activities-DEWHKBID.js +0 -75
  457. package/dist/ad-group-writes-QBHOPTT5.js +0 -172
  458. package/dist/ad-groups-JZDUFT6J.js +0 -70
  459. package/dist/ad-writes-QYJO4IB3.js +0 -176
  460. package/dist/add-NZ6SEWUR.js +0 -107
  461. package/dist/add-ZH5HJBUN.js +0 -305
  462. package/dist/ads-JYSYXF3U.js +0 -48
  463. package/dist/ads-QKVNPHBH.js +0 -120
  464. package/dist/ads-UMSWEI5X.js +0 -79
  465. package/dist/adsets-FEVYHKAQ.js +0 -182
  466. package/dist/advertisers-T37UHN3C.js +0 -123
  467. package/dist/analytics-7QSUKFXF.js +0 -2437
  468. package/dist/analytics-DR4DPUP4.js +0 -447
  469. package/dist/animate-WS63CZ3Y.js +0 -480
  470. package/dist/asset-writes-7RFZZYU7.js +0 -50
  471. package/dist/assign-3CVJL35R.js +0 -80
  472. package/dist/audience-size-6CZ2AZCK.js +0 -76
  473. package/dist/audience-writes-RUGU6KEC.js +0 -327
  474. package/dist/audience-writes-RUGU6KEC.js.map +0 -1
  475. package/dist/audiences-6GVUZUCN.js +0 -106
  476. package/dist/audiences-7OS2ZJYO.js +0 -85
  477. package/dist/audiences-RSAUXKHR.js +0 -280
  478. package/dist/audit-4L7IKIRY.js +0 -88
  479. package/dist/audit-Q66O3Z46.js +0 -154
  480. package/dist/autocomplete-T642QXBX.js +0 -114
  481. package/dist/avatars-33UGHCQA.js +0 -38
  482. package/dist/bid-pricing-LUWEWGCJ.js +0 -103
  483. package/dist/brand-36YIAVGK.js +0 -22
  484. package/dist/brief-A5XFT6VH.js +0 -543
  485. package/dist/businesses-42NZP6FP.js +0 -54
  486. package/dist/campaign-groups-SZSO5B6C.js +0 -99
  487. package/dist/campaign-writes-AN4IHY5G.js +0 -168
  488. package/dist/campaign-writes-GKNH2EHV.js +0 -176
  489. package/dist/campaigns-7RV65SXR.js +0 -78
  490. package/dist/campaigns-RDHQNOTI.js +0 -111
  491. package/dist/campaigns-TO74Z7UH.js +0 -130
  492. package/dist/campaigns-VLVV2PPO.js +0 -113
  493. package/dist/canvas-D7L7R4D2.js +0 -46
  494. package/dist/capabilities-YC36LOZU.js +0 -147
  495. package/dist/cards-CAOGPPG4.js +0 -85
  496. package/dist/catalog-URTZYAPU.js +0 -66
  497. package/dist/catalogs-5LWEXG5X.js +0 -130
  498. package/dist/catalogs-7IEXGLSR.js +0 -782
  499. package/dist/catalogs-7IEXGLSR.js.map +0 -1
  500. package/dist/changes-WWZYTLC6.js +0 -167
  501. package/dist/chatgpt-ZI4GWP6S.js +0 -47
  502. package/dist/chats-M3RP62YO.js +0 -584
  503. package/dist/check-FQYDJ5RS.js +0 -107
  504. package/dist/check-FQYDJ5RS.js.map +0 -1
  505. package/dist/chunk-22RM3UOO.js +0 -63
  506. package/dist/chunk-2DAWUWA4.js +0 -115
  507. package/dist/chunk-2JBPS2CV.js +0 -89
  508. package/dist/chunk-2LBQNTTH.js +0 -76
  509. package/dist/chunk-2N2R5YSN.js +0 -156
  510. package/dist/chunk-2Q7K4F4H.js +0 -7899
  511. package/dist/chunk-2TS2ITSG.js +0 -392
  512. package/dist/chunk-3E74OM2E.js +0 -288
  513. package/dist/chunk-4NZ47VXO.js +0 -137
  514. package/dist/chunk-4NZ47VXO.js.map +0 -1
  515. package/dist/chunk-5H6N36LS.js +0 -217
  516. package/dist/chunk-6E4KJMXO.js +0 -51
  517. package/dist/chunk-6IR7IQPV.js +0 -69
  518. package/dist/chunk-6QINKM6T.js +0 -46
  519. package/dist/chunk-7CORYCEZ.js +0 -142
  520. package/dist/chunk-AC7WLPXF.js +0 -8954
  521. package/dist/chunk-AIK2HPDZ.js +0 -312
  522. package/dist/chunk-BMMXYR7A.js +0 -238
  523. package/dist/chunk-C3EX5OKN.js +0 -188
  524. package/dist/chunk-CDTAKCJR.js +0 -178
  525. package/dist/chunk-CDTAKCJR.js.map +0 -1
  526. package/dist/chunk-CI3QSB6G.js +0 -207
  527. package/dist/chunk-CORECUKT.js +0 -685
  528. package/dist/chunk-DLM5OSHM.js +0 -843
  529. package/dist/chunk-DLM5OSHM.js.map +0 -1
  530. package/dist/chunk-DWPOAU4Z.js +0 -5471
  531. package/dist/chunk-E3PYHCQL.js +0 -344
  532. package/dist/chunk-EIDHLGQM.js +0 -249
  533. package/dist/chunk-EIDHLGQM.js.map +0 -1
  534. package/dist/chunk-EJBLF2LI.js +0 -167
  535. package/dist/chunk-FGAXZ7ET.js +0 -23
  536. package/dist/chunk-FGTOOTYC.js +0 -91
  537. package/dist/chunk-FWHEAR7F.js +0 -138
  538. package/dist/chunk-GDRJS2QJ.js +0 -197
  539. package/dist/chunk-GUYFVYLY.js +0 -170
  540. package/dist/chunk-GWLP45WQ.js +0 -1518
  541. package/dist/chunk-H3HA22Z3.js +0 -1919
  542. package/dist/chunk-H3RCEM6L.js +0 -61
  543. package/dist/chunk-HBRXFQQV.js +0 -3510
  544. package/dist/chunk-HH5WM5VA.js +0 -430
  545. package/dist/chunk-IGCS3X4F.js +0 -150
  546. package/dist/chunk-IID2MAYZ.js +0 -91
  547. package/dist/chunk-ILGRC7LJ.js +0 -287
  548. package/dist/chunk-JAC6JVCI.js +0 -26
  549. package/dist/chunk-JCDCIQMA.js +0 -479
  550. package/dist/chunk-JHS5PE5Y.js +0 -1246
  551. package/dist/chunk-JHS5PE5Y.js.map +0 -1
  552. package/dist/chunk-JIE45TKJ.js +0 -962
  553. package/dist/chunk-JSOOLOHP.js +0 -468
  554. package/dist/chunk-JTIWQLY5.js +0 -98
  555. package/dist/chunk-JWV7LUFM.js +0 -547
  556. package/dist/chunk-KDAINT54.js +0 -131
  557. package/dist/chunk-KH7AOX2R.js +0 -930
  558. package/dist/chunk-KJTMY7K6.js +0 -224
  559. package/dist/chunk-KZQQ6OLC.js +0 -169
  560. package/dist/chunk-L5GFFF5G.js +0 -604
  561. package/dist/chunk-LQACNCAV.js +0 -334
  562. package/dist/chunk-MCJ5I5LR.js +0 -3187
  563. package/dist/chunk-MCJ5I5LR.js.map +0 -1
  564. package/dist/chunk-MKG57P2E.js +0 -783
  565. package/dist/chunk-MOKZ5XZO.js +0 -455
  566. package/dist/chunk-MXVP7Z54.js +0 -163
  567. package/dist/chunk-MZPS46OR.js +0 -76
  568. package/dist/chunk-N2TXADL7.js +0 -1320
  569. package/dist/chunk-NTFNLVZG.js +0 -26
  570. package/dist/chunk-O3O7PXMK.js +0 -103
  571. package/dist/chunk-OASXBRXQ.js +0 -24026
  572. package/dist/chunk-OASXBRXQ.js.map +0 -1
  573. package/dist/chunk-ORQ3WBM6.js +0 -225
  574. package/dist/chunk-OSQTSS27.js +0 -74
  575. package/dist/chunk-OTRKBCUB.js +0 -219
  576. package/dist/chunk-Q5DFEVLE.js +0 -148
  577. package/dist/chunk-QVQKCVP7.js +0 -85
  578. package/dist/chunk-QVQKCVP7.js.map +0 -1
  579. package/dist/chunk-R4RWQ6YX.js +0 -152
  580. package/dist/chunk-RBCO3C3Q.js +0 -324
  581. package/dist/chunk-RBCO3C3Q.js.map +0 -1
  582. package/dist/chunk-SIUYWLXB.js +0 -494
  583. package/dist/chunk-TPGFX47R.js +0 -709
  584. package/dist/chunk-TYFXPC5D.js +0 -1902
  585. package/dist/chunk-TZTHGLWN.js +0 -66
  586. package/dist/chunk-UJTIMPEE.js +0 -203
  587. package/dist/chunk-UKZKLXTE.js +0 -638
  588. package/dist/chunk-UKZKLXTE.js.map +0 -1
  589. package/dist/chunk-ULIQNJ5J.js +0 -274
  590. package/dist/chunk-UQZZM6UM.js +0 -831
  591. package/dist/chunk-UUXGSDUC.js +0 -297
  592. package/dist/chunk-UYZ4FUC7.js +0 -225
  593. package/dist/chunk-UZHDNE6M.js +0 -2209
  594. package/dist/chunk-VJ4IOJQZ.js +0 -19
  595. package/dist/chunk-WBWEKZQ2.js +0 -191
  596. package/dist/chunk-X25XRSDP.js +0 -57
  597. package/dist/chunk-X3GWGFZP.js +0 -5368
  598. package/dist/chunk-X3YYZLBH.js +0 -285
  599. package/dist/chunk-XHWHBGKX.js +0 -4277
  600. package/dist/chunk-XHWHBGKX.js.map +0 -1
  601. package/dist/chunk-XRUB4KRV.js +0 -191
  602. package/dist/chunk-XZAVBONI.js +0 -64
  603. package/dist/chunk-YD6OZSSY.js +0 -106
  604. package/dist/chunk-YVFHDZ3K.js +0 -399
  605. package/dist/chunk-ZQ7JDYJB.js +0 -454
  606. package/dist/claim-CG3J32WS.js +0 -200
  607. package/dist/companies-X6O55ACG.js +0 -198
  608. package/dist/company-4CD2OJLB.js +0 -308
  609. package/dist/complete-JSP6VQYI.js +0 -84
  610. package/dist/config-NDL2YP37.js +0 -88
  611. package/dist/connect-O5NRDY4Y.js +0 -45
  612. package/dist/conversation-J22BH6O5.js +0 -96
  613. package/dist/conversion-report-76S5JOVT.js +0 -127
  614. package/dist/conversion-upload-command-5OILW65U.js +0 -439
  615. package/dist/conversion-upload-command-5OILW65U.js.map +0 -1
  616. package/dist/conversion-writes-6HX665JT.js +0 -122
  617. package/dist/conversions-I2ZOQHKJ.js +0 -140
  618. package/dist/conversions-QZJRF4WN.js +0 -78
  619. package/dist/copy-writes-X2LM5I4Z.js +0 -170
  620. package/dist/copy-writes-X2LM5I4Z.js.map +0 -1
  621. package/dist/create-DQ5X5AJT.js +0 -62
  622. package/dist/create-FNPFVKLT.js +0 -239
  623. package/dist/create-GXOFZCR5.js +0 -135
  624. package/dist/create-VAZ65QNJ.js +0 -218
  625. package/dist/creatives-4G2V4J6N.js +0 -229
  626. package/dist/creatives-QWNQDPNE.js +0 -58
  627. package/dist/creatives-SFPNXJ6Z.js +0 -118
  628. package/dist/credentials-VCERJE24.js +0 -290
  629. package/dist/critique-62QFBC33.js +0 -1451
  630. package/dist/critique-62QFBC33.js.map +0 -1
  631. package/dist/critique-MSL6EU5V.js +0 -232
  632. package/dist/critique-MSL6EU5V.js.map +0 -1
  633. package/dist/crm-HODCOAAI.js +0 -229
  634. package/dist/crm-J3SCOR4L.js +0 -323
  635. package/dist/currency-BZUNQ4XJ.js +0 -88
  636. package/dist/custom-conversions-UHRBVUD2.js +0 -128
  637. package/dist/customers-EYVTYCGY.js +0 -65
  638. package/dist/delete-7A6T6XBD.js +0 -69
  639. package/dist/delete-I3W3M6T7.js +0 -67
  640. package/dist/delete-RZCW3Y6L.js +0 -57
  641. package/dist/demographics-OFBRSF7A.js +0 -141
  642. package/dist/discard-I773LYVR.js +0 -69
  643. package/dist/discover-PDSEJR2P.js +0 -172
  644. package/dist/domain-7YO5HYHU.js +0 -101
  645. package/dist/download-IYK3UVBF.js +0 -172
  646. package/dist/draft-2Z7EGKBO.js +0 -220
  647. package/dist/draft-44KTLX4P.js +0 -134
  648. package/dist/draft-6MWXURYC.js +0 -374
  649. package/dist/draft-CKFSZDVI.js +0 -260
  650. package/dist/draft-PCXWAA2Y.js +0 -578
  651. package/dist/draft-PCXWAA2Y.js.map +0 -1
  652. package/dist/draft-QN5XXOS6.js +0 -332
  653. package/dist/draft-QN5XXOS6.js.map +0 -1
  654. package/dist/draft-RSKZSUOS.js +0 -138
  655. package/dist/draft-WOE7KQ7T.js +0 -315
  656. package/dist/experiment-AZUKJ7ZO.js +0 -1397
  657. package/dist/experiments-2DX4K3AQ.js +0 -236
  658. package/dist/experiments-2DX4K3AQ.js.map +0 -1
  659. package/dist/extract-ZIW5JFTY.js +0 -143
  660. package/dist/facets-OLRASLT7.js +0 -117
  661. package/dist/feedback-2YJ24NV7.js +0 -115
  662. package/dist/feedback-2YJ24NV7.js.map +0 -1
  663. package/dist/feedback-X3GLQ2QF.js +0 -114
  664. package/dist/feedback-record-A5JLS3QY.js +0 -269
  665. package/dist/feedback-record-A5JLS3QY.js.map +0 -1
  666. package/dist/fetch-6XMRKLYH.js +0 -204
  667. package/dist/fit-BRJSLR7P.js +0 -65
  668. package/dist/flows-LXJHL3KW.js +0 -340
  669. package/dist/fonts-UUSCLUHW.js +0 -39
  670. package/dist/forecast-3KMAJJWJ.js +0 -169
  671. package/dist/forecast-3KMAJJWJ.js.map +0 -1
  672. package/dist/forecast-7DZGLC7Y.js +0 -121
  673. package/dist/funding-BSAHWU35.js +0 -85
  674. package/dist/funnel-2ALYZ3GP.js +0 -397
  675. package/dist/ga4-YVKA3V4V.js +0 -55
  676. package/dist/generate-VGGXTZBP.js +0 -263
  677. package/dist/get-KVZSVN7U.js +0 -62
  678. package/dist/get-OZ7THI2W.js +0 -82
  679. package/dist/google-5U5KXEX7.js +0 -163
  680. package/dist/google-RTDPHVLU.js +0 -3300
  681. package/dist/google-RTDPHVLU.js.map +0 -1
  682. package/dist/google-ads-YZTK3YTW.js +0 -198
  683. package/dist/gsc-OJDMSP6H.js +0 -30
  684. package/dist/history-LXRFZNW7.js +0 -69
  685. package/dist/history-RYTNMGU5.js +0 -153
  686. package/dist/history-XDYDNQWK.js +0 -102
  687. package/dist/hubspot-MRUCRJLL.js +0 -814
  688. package/dist/ideas-TT24LJR5.js +0 -45
  689. package/dist/images-PLYPUXM2.js +0 -92
  690. package/dist/ingest-CSPC3RUK.js +0 -131
  691. package/dist/ingest-MSPQX3Z6.js +0 -28
  692. package/dist/insights-H6M6VI43.js +0 -132
  693. package/dist/insights-LZJZGNJZ.js +0 -658
  694. package/dist/inspect-VD6CB2NA.js +0 -192
  695. package/dist/instant-experiences-J4GSS3Y6.js +0 -264
  696. package/dist/instant-experiences-J4GSS3Y6.js.map +0 -1
  697. package/dist/intent-HXRSLFIO.js +0 -95
  698. package/dist/job-UFGGBDG7.js +0 -202
  699. package/dist/job-create-XM4NH322.js +0 -109
  700. package/dist/job-status-47L5Z57J.js +0 -74
  701. package/dist/keyword-gap-WUHMSTNR.js +0 -130
  702. package/dist/keyword-metrics-NJV3WR75.js +0 -200
  703. package/dist/keywords-for-site-B7MUDHFH.js +0 -131
  704. package/dist/landing-RKOEVY7L.js +0 -28
  705. package/dist/languages-SVTYYYOC.js +0 -40
  706. package/dist/leads-HFB5UXZJ.js +0 -115
  707. package/dist/leads-SEEJ3KRR.js +0 -541
  708. package/dist/leads-SEEJ3KRR.js.map +0 -1
  709. package/dist/learn-XNN3DGDF.js +0 -207
  710. package/dist/line-item-writes-VEJ5Y6X4.js +0 -211
  711. package/dist/line-items-U6L2TMPG.js +0 -107
  712. package/dist/link-ENZQAISO.js +0 -67
  713. package/dist/linkedin-SY2WZWKP.js +0 -1344
  714. package/dist/linkedin-SY2WZWKP.js.map +0 -1
  715. package/dist/linkedin-person-3RCX4MI3.js +0 -139
  716. package/dist/list-AF522LRC.js +0 -67
  717. package/dist/list-GPTYUCSX.js +0 -154
  718. package/dist/list-VYTHVUDP.js +0 -306
  719. package/dist/locations-5SLLGWZO.js +0 -69
  720. package/dist/locations-7EBZ6KRH.js +0 -40
  721. package/dist/log-NJR3FJWN.js +0 -95
  722. package/dist/lookup-OU6CLATK.js +0 -23
  723. package/dist/make-4XUB6RSF.js +0 -1367
  724. package/dist/make-4XUB6RSF.js.map +0 -1
  725. package/dist/map-LIYQCWXU.js +0 -445
  726. package/dist/mcp-QDOAKB3A.js +0 -729
  727. package/dist/media-DGV2AMZI.js +0 -89
  728. package/dist/media-YKCCMLXL.js +0 -18
  729. package/dist/media-sources-LFSDIPUB.js +0 -35
  730. package/dist/members-KGKQQFMN.js +0 -47
  731. package/dist/meta-5TRG7RTQ.js +0 -124
  732. package/dist/metrics-WRERNMRK.js +0 -152
  733. package/dist/models-SITHUNAA.js +0 -155
  734. package/dist/normalize-DQPKM3MG.js +0 -144
  735. package/dist/options-XIH7YPEG.js +0 -125
  736. package/dist/organization-BUSXIGA4.js +0 -949
  737. package/dist/output-7X5WPPCA.js +0 -24
  738. package/dist/page-photos-VYJU4RNQ.js +0 -118
  739. package/dist/page-photos-VYJU4RNQ.js.map +0 -1
  740. package/dist/pages-6YMPZDEY.js +0 -67
  741. package/dist/performance-PU4NHFUE.js +0 -27
  742. package/dist/performance-Y2DTYSFV.js +0 -5565
  743. package/dist/pixels-DZDVNIVL.js +0 -109
  744. package/dist/pixels-WTTLC4O5.js +0 -62
  745. package/dist/plan-JAWESWJN.js +0 -208
  746. package/dist/preview-3UOBVP6M.js +0 -101
  747. package/dist/preview-JZXGR4KN.js +0 -245
  748. package/dist/promoted-tweet-writes-6Y4MDPBH.js +0 -183
  749. package/dist/promoted-tweets-JAR2W6KC.js +0 -119
  750. package/dist/properties-Z5S3LRJ5.js +0 -101
  751. package/dist/publish-MDVPC77V.js +0 -350
  752. package/dist/query-3QFT42PG.js +0 -62
  753. package/dist/query-KKXCMH3Q.js +0 -236
  754. package/dist/query-QXKGVHZL.js +0 -231
  755. package/dist/questionnaire-U7UYICEA.js +0 -94
  756. package/dist/read-ENUS7P3L.js +0 -141
  757. package/dist/reddit-ZPKVVZGP.js +0 -29
  758. package/dist/refresh-V34YWN3W.js +0 -97
  759. package/dist/release-WRNUOSHB.js +0 -63
  760. package/dist/relevant-pages-OFKZYWR3.js +0 -99
  761. package/dist/remove-HKWV7P27.js +0 -53
  762. package/dist/reopen-VHHYVAKC.js +0 -66
  763. package/dist/rerun-THE43RCG.js +0 -97
  764. package/dist/rerun-THE43RCG.js.map +0 -1
  765. package/dist/research-773Y7GT4.js +0 -75
  766. package/dist/research-G5A2WXVK.js +0 -265
  767. package/dist/reset-GFJ3AKF5.js +0 -57
  768. package/dist/reset-MVTWA3HT.js +0 -57
  769. package/dist/resolve-JRSSTIAF.js +0 -124
  770. package/dist/retry-AGHA6IVT.js +0 -65
  771. package/dist/retry-LDJ6FZCZ.js +0 -63
  772. package/dist/revenue-Q2JK5VY6.js +0 -91
  773. package/dist/revenue-Q2JK5VY6.js.map +0 -1
  774. package/dist/rule-writes-WT6DQZZE.js +0 -530
  775. package/dist/rule-writes-WT6DQZZE.js.map +0 -1
  776. package/dist/rules-4A25K2P7.js +0 -99
  777. package/dist/rules-4A25K2P7.js.map +0 -1
  778. package/dist/rules-Y75KR2PC.js +0 -217
  779. package/dist/rules-add-GT7NCUB3.js +0 -465
  780. package/dist/rules-add-GT7NCUB3.js.map +0 -1
  781. package/dist/run-NFLKYVIC.js +0 -72
  782. package/dist/run-ZLHQNLCF.js +0 -69
  783. package/dist/scaffold-ad-AJN67FWG.js +0 -1513
  784. package/dist/scaffold-ad-AJN67FWG.js.map +0 -1
  785. package/dist/scaffold-static-ad-L6KXZ3TN.js +0 -1012
  786. package/dist/scaffold-static-ad-L6KXZ3TN.js.map +0 -1
  787. package/dist/scaffold-video-XQBZZ5TZ.js +0 -885
  788. package/dist/scaffold-video-XQBZZ5TZ.js.map +0 -1
  789. package/dist/schedule-45CJDHIX.js +0 -64
  790. package/dist/scheduled-agents-72MWHK63.js +0 -55
  791. package/dist/schema-VX66FH4O.js +0 -135
  792. package/dist/search-Y6TS5UZS.js +0 -177
  793. package/dist/select-MZ2U7U5U.js +0 -110
  794. package/dist/select-MZ2U7U5U.js.map +0 -1
  795. package/dist/sends-4ZO6BNZ4.js +0 -349
  796. package/dist/set-prompt-YH6PXNXB.js +0 -199
  797. package/dist/set-prompt-YH6PXNXB.js.map +0 -1
  798. package/dist/setup-links-Y4YYDQBK.js +0 -144
  799. package/dist/shared-UPMEBTVP.js +0 -32
  800. package/dist/shopify-HGFUHYT7.js +0 -4009
  801. package/dist/site-WZ654OP3.js +0 -180
  802. package/dist/sitemaps-P3K5Z4TW.js +0 -77
  803. package/dist/sites-TURWC53D.js +0 -97
  804. package/dist/sources-7ZFY3VEZ.js +0 -457
  805. package/dist/sources-FCBFLR2J.js +0 -30
  806. package/dist/stale-VSSDVB4H.js +0 -90
  807. package/dist/stale-VSSDVB4H.js.map +0 -1
  808. package/dist/stats-XNKAJD2Z.js +0 -34
  809. package/dist/status-L7LYUD3F.js +0 -65
  810. package/dist/stock-73PLAUYU.js +0 -212
  811. package/dist/studies-5G67ODR2.js +0 -250
  812. package/dist/studio-D2OMFCZZ.js +0 -49
  813. package/dist/study-writes-34BJFZAZ.js +0 -471
  814. package/dist/study-writes-34BJFZAZ.js.map +0 -1
  815. package/dist/sync-QVEUQKU5.js +0 -279
  816. package/dist/sync-XBC3PSSV.js +0 -57
  817. package/dist/sync-definition-IM2NY5QC.js +0 -70
  818. package/dist/tag-manager-3GIW6BPB.js +0 -43
  819. package/dist/tags-2KNOJ7A6.js +0 -26
  820. package/dist/tags-COALQ2CT.js +0 -23
  821. package/dist/tags-HCJTTLSR.js +0 -227
  822. package/dist/tags-MVC56SHA.js +0 -23
  823. package/dist/tags-UNUZVGUA.js +0 -23
  824. package/dist/targeting-TVZPIUUI.js +0 -762
  825. package/dist/targeting-TVZPIUUI.js.map +0 -1
  826. package/dist/targeting-constants-RJS2STR5.js +0 -118
  827. package/dist/targeting-criteria-SMBIEM7U.js +0 -113
  828. package/dist/targets-BNH37YAQ.js +0 -106
  829. package/dist/terms-AATAGKPT.js +0 -102
  830. package/dist/testimonials-IIAT5IDM.js +0 -32
  831. package/dist/themes-5HKRO5RR.js +0 -95
  832. package/dist/themes-5HKRO5RR.js.map +0 -1
  833. package/dist/top-companies-PY2NL2GS.js +0 -111
  834. package/dist/transcript-7WFXVRVW.js +0 -165
  835. package/dist/translate-IPTYPZF6.js +0 -603
  836. package/dist/translate-IPTYPZF6.js.map +0 -1
  837. package/dist/triggers-RBD2XGNG.js +0 -144
  838. package/dist/tweets-MLDLLLDB.js +0 -123
  839. package/dist/unlink-5IMEUVIS.js +0 -70
  840. package/dist/unstage-65DUBYNZ.js +0 -96
  841. package/dist/unstage-DSOVSWEK.js +0 -88
  842. package/dist/update-7JVV5ZL3.js +0 -66
  843. package/dist/update-FIU2ECYQ.js +0 -192
  844. package/dist/update-HSS6CVUK.js +0 -101
  845. package/dist/update-XWL3Q5QY.js +0 -155
  846. package/dist/upload-B5SM33MK.js +0 -137
  847. package/dist/url-options-4J3FRXHO.js +0 -131
  848. package/dist/url-params-TGCGWKAJ.js +0 -101
  849. package/dist/validate-4NXKYAL2.js +0 -125
  850. package/dist/validate-4NXKYAL2.js.map +0 -1
  851. package/dist/videos-FMV4AVB2.js +0 -41
  852. package/dist/videos-NITQKILV.js +0 -146
  853. package/dist/viewer-check-2W6BTVQV.js +0 -83
  854. package/dist/web-K2EMYVCD.js +0 -173
  855. package/dist/winning-ads-Q3RXH7EC.js +0 -86
  856. package/dist/write-commands-OBQPQUIE.js +0 -721
  857. package/dist/write-commands-SIOVTRHH.js +0 -1169
  858. package/dist/write-commands-SIOVTRHH.js.map +0 -1
  859. package/dist/write-commands-VQPEHKH7.js +0 -1524
  860. package/dist/write-commands-VQPEHKH7.js.map +0 -1
  861. package/dist/write-commands-XLZCRVTU.js +0 -206
  862. package/dist/x-PW43O6JS.js +0 -47
  863. /package/dist/{account-U6DFMD2V.js.map → account-JREYXYNE.js.map} +0 -0
  864. /package/dist/{account-OCFXNHG7.js.map → account-OUKPRB7C.js.map} +0 -0
  865. /package/dist/{account-D2AGXMM3.js.map → account-WN5MJ5QN.js.map} +0 -0
  866. /package/dist/{account-assets-W7K2PUYB.js.map → account-assets-IWJWYNQ3.js.map} +0 -0
  867. /package/dist/{account-writes-QSJ74QFR.js.map → account-writes-IUIXIVRC.js.map} +0 -0
  868. /package/dist/{accounts-FALANOYX.js.map → accounts-4YRDRLHX.js.map} +0 -0
  869. /package/dist/{accounts-3DS67RX7.js.map → accounts-HEGADQ6E.js.map} +0 -0
  870. /package/dist/{accounts-55PDBEDN.js.map → accounts-OSVXKNSI.js.map} +0 -0
  871. /package/dist/{accounts-AK4QIG24.js.map → accounts-SJOO4MQX.js.map} +0 -0
  872. /package/dist/{accounts-VSJVFIPH.js.map → accounts-V7EOUTNL.js.map} +0 -0
  873. /package/dist/{actions-JIXQEVIN.js.map → actions-5LYJ3U6G.js.map} +0 -0
  874. /package/dist/{active-entities-HR7NJJLU.js.map → active-entities-4KQQSMRZ.js.map} +0 -0
  875. /package/dist/{activecampaign-4ST7BMHO.js.map → activecampaign-CZHLHGT4.js.map} +0 -0
  876. /package/dist/{activities-DEWHKBID.js.map → activities-FRA33VZZ.js.map} +0 -0
  877. /package/dist/{ad-group-writes-QBHOPTT5.js.map → ad-group-writes-YQXBUA3Q.js.map} +0 -0
  878. /package/dist/{ad-groups-JZDUFT6J.js.map → ad-groups-NJR4ILEN.js.map} +0 -0
  879. /package/dist/{ad-writes-QYJO4IB3.js.map → ad-writes-TZV64CC2.js.map} +0 -0
  880. /package/dist/{add-ZH5HJBUN.js.map → add-MZUSKY2L.js.map} +0 -0
  881. /package/dist/{add-NZ6SEWUR.js.map → add-NAUSQKRS.js.map} +0 -0
  882. /package/dist/{ads-QKVNPHBH.js.map → ads-A2FXTQES.js.map} +0 -0
  883. /package/dist/{ads-JYSYXF3U.js.map → ads-PYTK3LJE.js.map} +0 -0
  884. /package/dist/{ads-UMSWEI5X.js.map → ads-Q7DD5VXU.js.map} +0 -0
  885. /package/dist/{adsets-FEVYHKAQ.js.map → adsets-ZHEVFOK4.js.map} +0 -0
  886. /package/dist/{advertisers-T37UHN3C.js.map → advertisers-HSTND4HE.js.map} +0 -0
  887. /package/dist/{analytics-DR4DPUP4.js.map → analytics-63Q3FJN4.js.map} +0 -0
  888. /package/dist/{analytics-7QSUKFXF.js.map → analytics-GLJODEIM.js.map} +0 -0
  889. /package/dist/{animate-WS63CZ3Y.js.map → animate-EI6AYBDI.js.map} +0 -0
  890. /package/dist/{asset-writes-7RFZZYU7.js.map → asset-writes-MS45UKJ3.js.map} +0 -0
  891. /package/dist/{assign-3CVJL35R.js.map → assign-7HT3XSSN.js.map} +0 -0
  892. /package/dist/{audience-size-6CZ2AZCK.js.map → audience-size-DG7544D2.js.map} +0 -0
  893. /package/dist/{audiences-RSAUXKHR.js.map → audiences-2IVVS3SJ.js.map} +0 -0
  894. /package/dist/{audiences-7OS2ZJYO.js.map → audiences-RN745R53.js.map} +0 -0
  895. /package/dist/{audiences-6GVUZUCN.js.map → audiences-Z2TQT35L.js.map} +0 -0
  896. /package/dist/{audit-4L7IKIRY.js.map → audit-BIHMDO5K.js.map} +0 -0
  897. /package/dist/{audit-Q66O3Z46.js.map → audit-ZYST7KCO.js.map} +0 -0
  898. /package/dist/{autocomplete-T642QXBX.js.map → autocomplete-5BKEMOQ3.js.map} +0 -0
  899. /package/dist/{avatars-33UGHCQA.js.map → avatars-FQOCDWLW.js.map} +0 -0
  900. /package/dist/{bid-pricing-LUWEWGCJ.js.map → bid-pricing-JEW7T2VR.js.map} +0 -0
  901. /package/dist/{brand-36YIAVGK.js.map → brand-FR6BKWXN.js.map} +0 -0
  902. /package/dist/{brief-A5XFT6VH.js.map → brief-32IXDJ4J.js.map} +0 -0
  903. /package/dist/{businesses-42NZP6FP.js.map → businesses-HECSW3EL.js.map} +0 -0
  904. /package/dist/{campaign-groups-SZSO5B6C.js.map → campaign-groups-LYPVIZT5.js.map} +0 -0
  905. /package/dist/{campaign-writes-AN4IHY5G.js.map → campaign-writes-D5MM5LUH.js.map} +0 -0
  906. /package/dist/{campaign-writes-GKNH2EHV.js.map → campaign-writes-S7A6W5V3.js.map} +0 -0
  907. /package/dist/{campaigns-RDHQNOTI.js.map → campaigns-CMDF3P7Y.js.map} +0 -0
  908. /package/dist/{campaigns-VLVV2PPO.js.map → campaigns-LIICP5JU.js.map} +0 -0
  909. /package/dist/{campaigns-TO74Z7UH.js.map → campaigns-N72TOUQX.js.map} +0 -0
  910. /package/dist/{campaigns-7RV65SXR.js.map → campaigns-ZWJKBF3L.js.map} +0 -0
  911. /package/dist/{canvas-D7L7R4D2.js.map → canvas-3SNC3UUV.js.map} +0 -0
  912. /package/dist/{capabilities-YC36LOZU.js.map → capabilities-GL7P3SWY.js.map} +0 -0
  913. /package/dist/{cards-CAOGPPG4.js.map → cards-RYQN5JLR.js.map} +0 -0
  914. /package/dist/{catalog-URTZYAPU.js.map → catalog-PWAWDK42.js.map} +0 -0
  915. /package/dist/{catalogs-5LWEXG5X.js.map → catalogs-SLPYHA7D.js.map} +0 -0
  916. /package/dist/{changes-WWZYTLC6.js.map → changes-WOD4EOSN.js.map} +0 -0
  917. /package/dist/{chatgpt-ZI4GWP6S.js.map → chatgpt-3GX4I6NH.js.map} +0 -0
  918. /package/dist/{chats-M3RP62YO.js.map → chats-K2WUFVCG.js.map} +0 -0
  919. /package/dist/{chunk-GDRJS2QJ.js.map → chunk-34ARMQNL.js.map} +0 -0
  920. /package/dist/{chunk-CI3QSB6G.js.map → chunk-34MZGC2Y.js.map} +0 -0
  921. /package/dist/{chunk-SIUYWLXB.js.map → chunk-4KBTW5NE.js.map} +0 -0
  922. /package/dist/{chunk-2LBQNTTH.js.map → chunk-4PAGS7QH.js.map} +0 -0
  923. /package/dist/{chunk-MXVP7Z54.js.map → chunk-53KV66ZZ.js.map} +0 -0
  924. /package/dist/{chunk-6IR7IQPV.js.map → chunk-5C4RRCKM.js.map} +0 -0
  925. /package/dist/{chunk-TPGFX47R.js.map → chunk-5I6XOSNI.js.map} +0 -0
  926. /package/dist/{chunk-ILGRC7LJ.js.map → chunk-5OE4Z7TP.js.map} +0 -0
  927. /package/dist/{chunk-JAC6JVCI.js.map → chunk-6OIKNJ7G.js.map} +0 -0
  928. /package/dist/{chunk-JIE45TKJ.js.map → chunk-6S4B67KP.js.map} +0 -0
  929. /package/dist/{chunk-KH7AOX2R.js.map → chunk-77LXZAX2.js.map} +0 -0
  930. /package/dist/{chunk-5H6N36LS.js.map → chunk-7TVVYP7K.js.map} +0 -0
  931. /package/dist/{chunk-HBRXFQQV.js.map → chunk-7URHRPC7.js.map} +0 -0
  932. /package/dist/{chunk-YVFHDZ3K.js.map → chunk-7YMQEAGA.js.map} +0 -0
  933. /package/dist/{chunk-NTFNLVZG.js.map → chunk-A4O3JL6D.js.map} +0 -0
  934. /package/dist/{chunk-2DAWUWA4.js.map → chunk-ANRTDNPQ.js.map} +0 -0
  935. /package/dist/{chunk-GWLP45WQ.js.map → chunk-AQNTVM6S.js.map} +0 -0
  936. /package/dist/{chunk-ULIQNJ5J.js.map → chunk-BPDIY5CF.js.map} +0 -0
  937. /package/dist/{chunk-UQZZM6UM.js.map → chunk-CKHF7UXS.js.map} +0 -0
  938. /package/dist/{chunk-MKG57P2E.js.map → chunk-CUTTTFAU.js.map} +0 -0
  939. /package/dist/{chunk-IGCS3X4F.js.map → chunk-D32EWSMB.js.map} +0 -0
  940. /package/dist/{chunk-JWV7LUFM.js.map → chunk-D55MN5IH.js.map} +0 -0
  941. /package/dist/{chunk-FWHEAR7F.js.map → chunk-DRQI2CJJ.js.map} +0 -0
  942. /package/dist/{chunk-AIK2HPDZ.js.map → chunk-ETI6DGR2.js.map} +0 -0
  943. /package/dist/{chunk-FGTOOTYC.js.map → chunk-FFTD7XDA.js.map} +0 -0
  944. /package/dist/{chunk-KJTMY7K6.js.map → chunk-FTKUHGTC.js.map} +0 -0
  945. /package/dist/{chunk-2TS2ITSG.js.map → chunk-GFYGVIT3.js.map} +0 -0
  946. /package/dist/{chunk-ORQ3WBM6.js.map → chunk-GGXPO4NQ.js.map} +0 -0
  947. /package/dist/{chunk-GUYFVYLY.js.map → chunk-H56UJRLV.js.map} +0 -0
  948. /package/dist/{chunk-7CORYCEZ.js.map → chunk-HDMD6LXS.js.map} +0 -0
  949. /package/dist/{chunk-N2TXADL7.js.map → chunk-HFZZKYUX.js.map} +0 -0
  950. /package/dist/{chunk-DWPOAU4Z.js.map → chunk-IAYJKH4R.js.map} +0 -0
  951. /package/dist/{chunk-JCDCIQMA.js.map → chunk-IEPCI2EB.js.map} +0 -0
  952. /package/dist/{chunk-E3PYHCQL.js.map → chunk-IKADYUXK.js.map} +0 -0
  953. /package/dist/{chunk-OSQTSS27.js.map → chunk-J32CYEIH.js.map} +0 -0
  954. /package/dist/{chunk-2N2R5YSN.js.map → chunk-J5I3GYSJ.js.map} +0 -0
  955. /package/dist/{chunk-X3YYZLBH.js.map → chunk-JCVXKHVB.js.map} +0 -0
  956. /package/dist/{chunk-JSOOLOHP.js.map → chunk-JESSFI7R.js.map} +0 -0
  957. /package/dist/{chunk-H3RCEM6L.js.map → chunk-K4QPBXV7.js.map} +0 -0
  958. /package/dist/{chunk-H3HA22Z3.js.map → chunk-KJ3J2DYM.js.map} +0 -0
  959. /package/dist/{chunk-UZHDNE6M.js.map → chunk-L43B2YGZ.js.map} +0 -0
  960. /package/dist/{chunk-OTRKBCUB.js.map → chunk-L7UD57TV.js.map} +0 -0
  961. /package/dist/{chunk-HH5WM5VA.js.map → chunk-LJYXGUQ3.js.map} +0 -0
  962. /package/dist/{chunk-UJTIMPEE.js.map → chunk-LNYM4PQS.js.map} +0 -0
  963. /package/dist/{chunk-TZTHGLWN.js.map → chunk-MIXUMGJE.js.map} +0 -0
  964. /package/dist/{chunk-MOKZ5XZO.js.map → chunk-MWJ6BCZJ.js.map} +0 -0
  965. /package/dist/{chunk-TYFXPC5D.js.map → chunk-O7WRA3JU.js.map} +0 -0
  966. /package/dist/{chunk-LQACNCAV.js.map → chunk-OADMSHME.js.map} +0 -0
  967. /package/dist/{chunk-R4RWQ6YX.js.map → chunk-OLPABGH3.js.map} +0 -0
  968. /package/dist/{chunk-X25XRSDP.js.map → chunk-ONGZKI5J.js.map} +0 -0
  969. /package/dist/{chunk-FGAXZ7ET.js.map → chunk-OSZOUSK5.js.map} +0 -0
  970. /package/dist/{chunk-ZQ7JDYJB.js.map → chunk-PK7YNQ2T.js.map} +0 -0
  971. /package/dist/{chunk-JTIWQLY5.js.map → chunk-PN3CHL5W.js.map} +0 -0
  972. /package/dist/{chunk-2JBPS2CV.js.map → chunk-QMQSI4WA.js.map} +0 -0
  973. /package/dist/{chunk-C3EX5OKN.js.map → chunk-QUSDGZFS.js.map} +0 -0
  974. /package/dist/{chunk-L5GFFF5G.js.map → chunk-QXRSFH6M.js.map} +0 -0
  975. /package/dist/{chunk-22RM3UOO.js.map → chunk-QZ4YHQLW.js.map} +0 -0
  976. /package/dist/{chunk-3E74OM2E.js.map → chunk-RF3TP643.js.map} +0 -0
  977. /package/dist/{chunk-WBWEKZQ2.js.map → chunk-RIRSFFWA.js.map} +0 -0
  978. /package/dist/{chunk-AC7WLPXF.js.map → chunk-ROHICQPK.js.map} +0 -0
  979. /package/dist/{chunk-KZQQ6OLC.js.map → chunk-RP3PC54R.js.map} +0 -0
  980. /package/dist/{chunk-MZPS46OR.js.map → chunk-SIKCVWM3.js.map} +0 -0
  981. /package/dist/{chunk-EJBLF2LI.js.map → chunk-SOM4OTR5.js.map} +0 -0
  982. /package/dist/{chunk-Q5DFEVLE.js.map → chunk-SZZ7BBED.js.map} +0 -0
  983. /package/dist/{chunk-XRUB4KRV.js.map → chunk-TAGJYHVI.js.map} +0 -0
  984. /package/dist/{chunk-VJ4IOJQZ.js.map → chunk-TB5JZTLN.js.map} +0 -0
  985. /package/dist/{chunk-KDAINT54.js.map → chunk-TQJLEVLA.js.map} +0 -0
  986. /package/dist/{chunk-X3GWGFZP.js.map → chunk-TW57RTKN.js.map} +0 -0
  987. /package/dist/{chunk-6E4KJMXO.js.map → chunk-V3ANSXCB.js.map} +0 -0
  988. /package/dist/{chunk-O3O7PXMK.js.map → chunk-WSG4K2TR.js.map} +0 -0
  989. /package/dist/{chunk-XZAVBONI.js.map → chunk-WXSRSMY3.js.map} +0 -0
  990. /package/dist/{chunk-BMMXYR7A.js.map → chunk-WZXMZFVB.js.map} +0 -0
  991. /package/dist/{chunk-IID2MAYZ.js.map → chunk-X3L5HYQM.js.map} +0 -0
  992. /package/dist/{chunk-6QINKM6T.js.map → chunk-Y2TOB4N5.js.map} +0 -0
  993. /package/dist/{chunk-2Q7K4F4H.js.map → chunk-YOHGEF2N.js.map} +0 -0
  994. /package/dist/{chunk-UUXGSDUC.js.map → chunk-Z2LPYAN4.js.map} +0 -0
  995. /package/dist/{chunk-YD6OZSSY.js.map → chunk-ZICB4OI5.js.map} +0 -0
  996. /package/dist/{chunk-UYZ4FUC7.js.map → chunk-ZOCAGPS5.js.map} +0 -0
  997. /package/dist/{chunk-CORECUKT.js.map → chunk-ZZWZUTEP.js.map} +0 -0
  998. /package/dist/{claim-CG3J32WS.js.map → claim-QHYA5UTF.js.map} +0 -0
  999. /package/dist/{companies-X6O55ACG.js.map → companies-BNMAOQUQ.js.map} +0 -0
  1000. /package/dist/{company-4CD2OJLB.js.map → company-YANP3G62.js.map} +0 -0
  1001. /package/dist/{complete-JSP6VQYI.js.map → complete-ICZCBO6M.js.map} +0 -0
  1002. /package/dist/{config-NDL2YP37.js.map → config-GIETKZGS.js.map} +0 -0
  1003. /package/dist/{connect-O5NRDY4Y.js.map → connect-ZXGEFS53.js.map} +0 -0
  1004. /package/dist/{conversation-J22BH6O5.js.map → conversation-YIWZIUIK.js.map} +0 -0
  1005. /package/dist/{conversion-report-76S5JOVT.js.map → conversion-report-E35RCZU7.js.map} +0 -0
  1006. /package/dist/{conversion-writes-6HX665JT.js.map → conversion-writes-MUD7WJDH.js.map} +0 -0
  1007. /package/dist/{conversions-I2ZOQHKJ.js.map → conversions-B7HR6JMC.js.map} +0 -0
  1008. /package/dist/{conversions-QZJRF4WN.js.map → conversions-WU7DNFF7.js.map} +0 -0
  1009. /package/dist/{create-GXOFZCR5.js.map → create-EL47XN73.js.map} +0 -0
  1010. /package/dist/{create-DQ5X5AJT.js.map → create-GU5MUZ7U.js.map} +0 -0
  1011. /package/dist/{create-FNPFVKLT.js.map → create-IKQ7A47F.js.map} +0 -0
  1012. /package/dist/{create-VAZ65QNJ.js.map → create-TKQDLX7M.js.map} +0 -0
  1013. /package/dist/{creatives-QWNQDPNE.js.map → creatives-PW6HB4JB.js.map} +0 -0
  1014. /package/dist/{creatives-SFPNXJ6Z.js.map → creatives-S4EGN44U.js.map} +0 -0
  1015. /package/dist/{creatives-4G2V4J6N.js.map → creatives-VBD4T6C7.js.map} +0 -0
  1016. /package/dist/{credentials-VCERJE24.js.map → credentials-57U2UQ7G.js.map} +0 -0
  1017. /package/dist/{crm-J3SCOR4L.js.map → crm-JCYLJQ7K.js.map} +0 -0
  1018. /package/dist/{crm-HODCOAAI.js.map → crm-LQTYPDMZ.js.map} +0 -0
  1019. /package/dist/{currency-BZUNQ4XJ.js.map → currency-5NYTOLEL.js.map} +0 -0
  1020. /package/dist/{custom-conversions-UHRBVUD2.js.map → custom-conversions-NT7ONTEX.js.map} +0 -0
  1021. /package/dist/{customers-EYVTYCGY.js.map → customers-LP6I7POL.js.map} +0 -0
  1022. /package/dist/{delete-RZCW3Y6L.js.map → delete-PZ6GP7J6.js.map} +0 -0
  1023. /package/dist/{delete-7A6T6XBD.js.map → delete-WW4JYQMX.js.map} +0 -0
  1024. /package/dist/{delete-I3W3M6T7.js.map → delete-XZNY426Q.js.map} +0 -0
  1025. /package/dist/{demographics-OFBRSF7A.js.map → demographics-HZY2JEYQ.js.map} +0 -0
  1026. /package/dist/{discard-I773LYVR.js.map → discard-NRTGRVXR.js.map} +0 -0
  1027. /package/dist/{discover-PDSEJR2P.js.map → discover-5ZFAAPNG.js.map} +0 -0
  1028. /package/dist/{domain-7YO5HYHU.js.map → domain-YGKFTN6D.js.map} +0 -0
  1029. /package/dist/{download-IYK3UVBF.js.map → download-XERSDEN3.js.map} +0 -0
  1030. /package/dist/{draft-44KTLX4P.js.map → draft-2EVXU5XB.js.map} +0 -0
  1031. /package/dist/{draft-RSKZSUOS.js.map → draft-CQWYTMSS.js.map} +0 -0
  1032. /package/dist/{draft-6MWXURYC.js.map → draft-EL74RDAG.js.map} +0 -0
  1033. /package/dist/{draft-WOE7KQ7T.js.map → draft-GFZ3KMRX.js.map} +0 -0
  1034. /package/dist/{draft-CKFSZDVI.js.map → draft-JYZA3BFD.js.map} +0 -0
  1035. /package/dist/{draft-2Z7EGKBO.js.map → draft-UNPTTHP4.js.map} +0 -0
  1036. /package/dist/{experiment-AZUKJ7ZO.js.map → experiment-YAX26BOO.js.map} +0 -0
  1037. /package/dist/{extract-ZIW5JFTY.js.map → extract-QMY6WPTV.js.map} +0 -0
  1038. /package/dist/{facets-OLRASLT7.js.map → facets-QHM2IQ3E.js.map} +0 -0
  1039. /package/dist/{feedback-X3GLQ2QF.js.map → feedback-NLPTKWOH.js.map} +0 -0
  1040. /package/dist/{fetch-6XMRKLYH.js.map → fetch-72ZILZHO.js.map} +0 -0
  1041. /package/dist/{fit-BRJSLR7P.js.map → fit-AURKFPAY.js.map} +0 -0
  1042. /package/dist/{flows-LXJHL3KW.js.map → flows-CZPXHOZW.js.map} +0 -0
  1043. /package/dist/{fonts-UUSCLUHW.js.map → fonts-NA26RQ4C.js.map} +0 -0
  1044. /package/dist/{forecast-7DZGLC7Y.js.map → forecast-ARIHRQAX.js.map} +0 -0
  1045. /package/dist/{funding-BSAHWU35.js.map → funding-QDKFNQI2.js.map} +0 -0
  1046. /package/dist/{funnel-2ALYZ3GP.js.map → funnel-4VQB3T3M.js.map} +0 -0
  1047. /package/dist/{ga4-YVKA3V4V.js.map → ga4-N6EBLN2W.js.map} +0 -0
  1048. /package/dist/{generate-VGGXTZBP.js.map → generate-IJLMJC4S.js.map} +0 -0
  1049. /package/dist/{get-OZ7THI2W.js.map → get-LOEUOTG3.js.map} +0 -0
  1050. /package/dist/{get-KVZSVN7U.js.map → get-W3VJIQBN.js.map} +0 -0
  1051. /package/dist/{google-5U5KXEX7.js.map → google-7VEPEBFV.js.map} +0 -0
  1052. /package/dist/{google-ads-YZTK3YTW.js.map → google-ads-YBOJ3XXK.js.map} +0 -0
  1053. /package/dist/{gsc-OJDMSP6H.js.map → gsc-FILOUFCG.js.map} +0 -0
  1054. /package/dist/{history-LXRFZNW7.js.map → history-6LLGAK7B.js.map} +0 -0
  1055. /package/dist/{history-RYTNMGU5.js.map → history-H2SHADAM.js.map} +0 -0
  1056. /package/dist/{history-XDYDNQWK.js.map → history-LJG64M6P.js.map} +0 -0
  1057. /package/dist/{hubspot-MRUCRJLL.js.map → hubspot-6JDARLIU.js.map} +0 -0
  1058. /package/dist/{ideas-TT24LJR5.js.map → ideas-MTWJDRRK.js.map} +0 -0
  1059. /package/dist/{images-PLYPUXM2.js.map → images-RIFC6D3H.js.map} +0 -0
  1060. /package/dist/{ingest-CSPC3RUK.js.map → ingest-K45T4OLM.js.map} +0 -0
  1061. /package/dist/{ingest-MSPQX3Z6.js.map → ingest-MSS52UO5.js.map} +0 -0
  1062. /package/dist/{insights-LZJZGNJZ.js.map → insights-AVNMRFQ4.js.map} +0 -0
  1063. /package/dist/{insights-H6M6VI43.js.map → insights-TBIT6DTF.js.map} +0 -0
  1064. /package/dist/{inspect-VD6CB2NA.js.map → inspect-EBGYJOZ3.js.map} +0 -0
  1065. /package/dist/{intent-HXRSLFIO.js.map → intent-URHTU4AK.js.map} +0 -0
  1066. /package/dist/{job-UFGGBDG7.js.map → job-OJB6KIDV.js.map} +0 -0
  1067. /package/dist/{job-create-XM4NH322.js.map → job-create-C6FGCDW4.js.map} +0 -0
  1068. /package/dist/{job-status-47L5Z57J.js.map → job-status-4RJHESID.js.map} +0 -0
  1069. /package/dist/{keyword-gap-WUHMSTNR.js.map → keyword-gap-WXM6SN6A.js.map} +0 -0
  1070. /package/dist/{keyword-metrics-NJV3WR75.js.map → keyword-metrics-57MUTYMH.js.map} +0 -0
  1071. /package/dist/{keywords-for-site-B7MUDHFH.js.map → keywords-for-site-ABZS7O5B.js.map} +0 -0
  1072. /package/dist/{landing-RKOEVY7L.js.map → landing-AXCYLUQZ.js.map} +0 -0
  1073. /package/dist/{languages-SVTYYYOC.js.map → languages-6XTVTFZC.js.map} +0 -0
  1074. /package/dist/{leads-HFB5UXZJ.js.map → leads-C5BUBBLZ.js.map} +0 -0
  1075. /package/dist/{learn-XNN3DGDF.js.map → learn-M64GVGPX.js.map} +0 -0
  1076. /package/dist/{line-item-writes-VEJ5Y6X4.js.map → line-item-writes-HYLWBQTM.js.map} +0 -0
  1077. /package/dist/{line-items-U6L2TMPG.js.map → line-items-Y4THDHSE.js.map} +0 -0
  1078. /package/dist/{link-ENZQAISO.js.map → link-BU7YCL2M.js.map} +0 -0
  1079. /package/dist/{linkedin-person-3RCX4MI3.js.map → linkedin-person-FEIY7FYQ.js.map} +0 -0
  1080. /package/dist/{list-VYTHVUDP.js.map → list-BKIL7O4G.js.map} +0 -0
  1081. /package/dist/{list-GPTYUCSX.js.map → list-H3C345WG.js.map} +0 -0
  1082. /package/dist/{list-AF522LRC.js.map → list-UGTDZ7YI.js.map} +0 -0
  1083. /package/dist/{locations-7EBZ6KRH.js.map → locations-F4365X4S.js.map} +0 -0
  1084. /package/dist/{locations-5SLLGWZO.js.map → locations-HOI7AUZ2.js.map} +0 -0
  1085. /package/dist/{log-NJR3FJWN.js.map → log-54SJV6MW.js.map} +0 -0
  1086. /package/dist/{lookup-OU6CLATK.js.map → lookup-QNLX2535.js.map} +0 -0
  1087. /package/dist/{map-LIYQCWXU.js.map → map-BPPGQGDV.js.map} +0 -0
  1088. /package/dist/{mcp-QDOAKB3A.js.map → mcp-EXOMBMYL.js.map} +0 -0
  1089. /package/dist/{media-YKCCMLXL.js.map → media-MITWBYVZ.js.map} +0 -0
  1090. /package/dist/{media-DGV2AMZI.js.map → media-WGIEUEZW.js.map} +0 -0
  1091. /package/dist/{media-sources-LFSDIPUB.js.map → media-sources-XEC72K7X.js.map} +0 -0
  1092. /package/dist/{members-KGKQQFMN.js.map → members-VDON57BE.js.map} +0 -0
  1093. /package/dist/{meta-5TRG7RTQ.js.map → meta-NUBBKE2V.js.map} +0 -0
  1094. /package/dist/{metrics-WRERNMRK.js.map → metrics-V6FAZO5A.js.map} +0 -0
  1095. /package/dist/{models-SITHUNAA.js.map → models-TSMFIOZU.js.map} +0 -0
  1096. /package/dist/{normalize-DQPKM3MG.js.map → normalize-632DD2HJ.js.map} +0 -0
  1097. /package/dist/{options-XIH7YPEG.js.map → options-TZYZQZ3M.js.map} +0 -0
  1098. /package/dist/{organization-BUSXIGA4.js.map → organization-FYRXSGB4.js.map} +0 -0
  1099. /package/dist/{output-7X5WPPCA.js.map → output-HZW7LNUL.js.map} +0 -0
  1100. /package/dist/{pages-6YMPZDEY.js.map → pages-UH6XEZBO.js.map} +0 -0
  1101. /package/dist/{performance-PU4NHFUE.js.map → performance-JKXHQIAV.js.map} +0 -0
  1102. /package/dist/{performance-Y2DTYSFV.js.map → performance-OF3N43OP.js.map} +0 -0
  1103. /package/dist/{pixels-WTTLC4O5.js.map → pixels-KXA6R3G3.js.map} +0 -0
  1104. /package/dist/{pixels-DZDVNIVL.js.map → pixels-PYNK73UG.js.map} +0 -0
  1105. /package/dist/{plan-JAWESWJN.js.map → plan-4OYUV2EF.js.map} +0 -0
  1106. /package/dist/{preview-JZXGR4KN.js.map → preview-7E4E3QPT.js.map} +0 -0
  1107. /package/dist/{preview-3UOBVP6M.js.map → preview-FPBM75L2.js.map} +0 -0
  1108. /package/dist/{promoted-tweet-writes-6Y4MDPBH.js.map → promoted-tweet-writes-IJRBFK7W.js.map} +0 -0
  1109. /package/dist/{promoted-tweets-JAR2W6KC.js.map → promoted-tweets-7PYH3RPV.js.map} +0 -0
  1110. /package/dist/{properties-Z5S3LRJ5.js.map → properties-RDOGNY2O.js.map} +0 -0
  1111. /package/dist/{publish-MDVPC77V.js.map → publish-MNSDFPEQ.js.map} +0 -0
  1112. /package/dist/{query-3QFT42PG.js.map → query-GMGWJW3X.js.map} +0 -0
  1113. /package/dist/{query-KKXCMH3Q.js.map → query-K7R5GQ4E.js.map} +0 -0
  1114. /package/dist/{query-QXKGVHZL.js.map → query-PO3RT7BR.js.map} +0 -0
  1115. /package/dist/{questionnaire-U7UYICEA.js.map → questionnaire-4OH6K2BF.js.map} +0 -0
  1116. /package/dist/{read-ENUS7P3L.js.map → read-MU5XGWMK.js.map} +0 -0
  1117. /package/dist/{reddit-ZPKVVZGP.js.map → reddit-JFFMZLJS.js.map} +0 -0
  1118. /package/dist/{refresh-V34YWN3W.js.map → refresh-EJ7WKW3H.js.map} +0 -0
  1119. /package/dist/{release-WRNUOSHB.js.map → release-AFRLCZWB.js.map} +0 -0
  1120. /package/dist/{relevant-pages-OFKZYWR3.js.map → relevant-pages-4YGN3I2U.js.map} +0 -0
  1121. /package/dist/{remove-HKWV7P27.js.map → remove-QD4PITBL.js.map} +0 -0
  1122. /package/dist/{reopen-VHHYVAKC.js.map → reopen-JSC6AVJC.js.map} +0 -0
  1123. /package/dist/{research-G5A2WXVK.js.map → research-MMFUFZGS.js.map} +0 -0
  1124. /package/dist/{research-773Y7GT4.js.map → research-SRISCVBM.js.map} +0 -0
  1125. /package/dist/{reset-GFJ3AKF5.js.map → reset-752CNET3.js.map} +0 -0
  1126. /package/dist/{reset-MVTWA3HT.js.map → reset-R3TQAHRU.js.map} +0 -0
  1127. /package/dist/{resolve-JRSSTIAF.js.map → resolve-EWHSJNBX.js.map} +0 -0
  1128. /package/dist/{retry-AGHA6IVT.js.map → retry-DVHDVHVP.js.map} +0 -0
  1129. /package/dist/{retry-LDJ6FZCZ.js.map → retry-PVULTONO.js.map} +0 -0
  1130. /package/dist/{rules-Y75KR2PC.js.map → rules-4YTY57FM.js.map} +0 -0
  1131. /package/dist/{run-ZLHQNLCF.js.map → run-PCZRYL42.js.map} +0 -0
  1132. /package/dist/{run-NFLKYVIC.js.map → run-PRSAUWAJ.js.map} +0 -0
  1133. /package/dist/{schedule-45CJDHIX.js.map → schedule-6YTZBCZA.js.map} +0 -0
  1134. /package/dist/{scheduled-agents-72MWHK63.js.map → scheduled-agents-XCPU57LU.js.map} +0 -0
  1135. /package/dist/{schema-VX66FH4O.js.map → schema-4PS5BDG3.js.map} +0 -0
  1136. /package/dist/{search-Y6TS5UZS.js.map → search-IMZD5RGD.js.map} +0 -0
  1137. /package/dist/{sends-4ZO6BNZ4.js.map → sends-I2B6F5NW.js.map} +0 -0
  1138. /package/dist/{setup-links-Y4YYDQBK.js.map → setup-links-PTL6RF2J.js.map} +0 -0
  1139. /package/dist/{shared-UPMEBTVP.js.map → shared-Z7INVKCZ.js.map} +0 -0
  1140. /package/dist/{shopify-HGFUHYT7.js.map → shopify-SDZZ5HTA.js.map} +0 -0
  1141. /package/dist/{site-WZ654OP3.js.map → site-NGQ7K6UD.js.map} +0 -0
  1142. /package/dist/{sitemaps-P3K5Z4TW.js.map → sitemaps-EOMSRKOD.js.map} +0 -0
  1143. /package/dist/{sites-TURWC53D.js.map → sites-6M73AONG.js.map} +0 -0
  1144. /package/dist/{sources-FCBFLR2J.js.map → sources-NKFSCI6M.js.map} +0 -0
  1145. /package/dist/{sources-7ZFY3VEZ.js.map → sources-O4CQ5KSX.js.map} +0 -0
  1146. /package/dist/{stats-XNKAJD2Z.js.map → stats-MFEH2TSW.js.map} +0 -0
  1147. /package/dist/{status-L7LYUD3F.js.map → status-DLYRPGFS.js.map} +0 -0
  1148. /package/dist/{stock-73PLAUYU.js.map → stock-RDCDVBHX.js.map} +0 -0
  1149. /package/dist/{studies-5G67ODR2.js.map → studies-SSA3SR2L.js.map} +0 -0
  1150. /package/dist/{studio-D2OMFCZZ.js.map → studio-MBHPDGMN.js.map} +0 -0
  1151. /package/dist/{sync-XBC3PSSV.js.map → sync-BEW3TZP7.js.map} +0 -0
  1152. /package/dist/{sync-QVEUQKU5.js.map → sync-SI25TKY5.js.map} +0 -0
  1153. /package/dist/{sync-definition-IM2NY5QC.js.map → sync-definition-RECCA3QH.js.map} +0 -0
  1154. /package/dist/{tag-manager-3GIW6BPB.js.map → tag-manager-JFC6YYVP.js.map} +0 -0
  1155. /package/dist/{tags-UNUZVGUA.js.map → tags-IJIGZYR3.js.map} +0 -0
  1156. /package/dist/{tags-2KNOJ7A6.js.map → tags-K4HIKHNU.js.map} +0 -0
  1157. /package/dist/{tags-COALQ2CT.js.map → tags-OTA55BQ6.js.map} +0 -0
  1158. /package/dist/{tags-MVC56SHA.js.map → tags-QF2V4B3M.js.map} +0 -0
  1159. /package/dist/{tags-HCJTTLSR.js.map → tags-SK7WXMBS.js.map} +0 -0
  1160. /package/dist/{targeting-constants-RJS2STR5.js.map → targeting-constants-RF2732EW.js.map} +0 -0
  1161. /package/dist/{targeting-criteria-SMBIEM7U.js.map → targeting-criteria-7BUUYDYC.js.map} +0 -0
  1162. /package/dist/{targets-BNH37YAQ.js.map → targets-7V3NCQSD.js.map} +0 -0
  1163. /package/dist/{terms-AATAGKPT.js.map → terms-XFL6QO7A.js.map} +0 -0
  1164. /package/dist/{testimonials-IIAT5IDM.js.map → testimonials-XYD5DLBJ.js.map} +0 -0
  1165. /package/dist/{top-companies-PY2NL2GS.js.map → top-companies-LI26TONY.js.map} +0 -0
  1166. /package/dist/{transcript-7WFXVRVW.js.map → transcript-FTHDWMGU.js.map} +0 -0
  1167. /package/dist/{triggers-RBD2XGNG.js.map → triggers-3LHJVK5P.js.map} +0 -0
  1168. /package/dist/{tweets-MLDLLLDB.js.map → tweets-6PQHJXJC.js.map} +0 -0
  1169. /package/dist/{unlink-5IMEUVIS.js.map → unlink-BMOUBGWO.js.map} +0 -0
  1170. /package/dist/{unstage-65DUBYNZ.js.map → unstage-O23ILHCY.js.map} +0 -0
  1171. /package/dist/{unstage-DSOVSWEK.js.map → unstage-YEW5KXJL.js.map} +0 -0
  1172. /package/dist/{update-HSS6CVUK.js.map → update-2IWZA5UU.js.map} +0 -0
  1173. /package/dist/{update-XWL3Q5QY.js.map → update-G7YZICSU.js.map} +0 -0
  1174. /package/dist/{update-FIU2ECYQ.js.map → update-T5INCQJZ.js.map} +0 -0
  1175. /package/dist/{update-7JVV5ZL3.js.map → update-UTQVTG45.js.map} +0 -0
  1176. /package/dist/{upload-B5SM33MK.js.map → upload-UXYJDA2U.js.map} +0 -0
  1177. /package/dist/{url-options-4J3FRXHO.js.map → url-options-Y7I5EL55.js.map} +0 -0
  1178. /package/dist/{url-params-TGCGWKAJ.js.map → url-params-PE4XAQNH.js.map} +0 -0
  1179. /package/dist/{videos-NITQKILV.js.map → videos-AHOLXU42.js.map} +0 -0
  1180. /package/dist/{videos-FMV4AVB2.js.map → videos-EVPJHY3B.js.map} +0 -0
  1181. /package/dist/{viewer-check-2W6BTVQV.js.map → viewer-check-NA4TMNY4.js.map} +0 -0
  1182. /package/dist/{web-K2EMYVCD.js.map → web-7EODEH25.js.map} +0 -0
  1183. /package/dist/{winning-ads-Q3RXH7EC.js.map → winning-ads-5UKX6QV7.js.map} +0 -0
  1184. /package/dist/{write-commands-XLZCRVTU.js.map → write-commands-LHEJESKL.js.map} +0 -0
  1185. /package/dist/{write-commands-OBQPQUIE.js.map → write-commands-SD6DXVNK.js.map} +0 -0
  1186. /package/dist/{x-PW43O6JS.js.map → x-R72UTFQT.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/ads/google/index.ts","../src/commands/ads/google/keywords/index.ts","../src/commands/ads/google/list-commands.ts","../src/commands/ads/google/write-commands.ts","../src/commands/ads/google/ad-copy-flags.ts","../src/commands/ads/google/channel-flags.ts","../src/commands/ads/google/criteria-commands.ts","../src/commands/ads/google/keyword-list-members.ts"],"sourcesContent":["import { type CommandDef, defineCommand } from \"citty\";\nimport { keywordsCommand } from \"./keywords/index.ts\";\nimport { LIST_COMMANDS } from \"./list-commands.ts\";\nimport { googleWriteCommands, keywordWriteSubcommands } from \"./write-commands.ts\";\n\n/** The read keyword command (discover/metrics/…), `list`, plus staged write subcommands (add/update/remove). */\nconst keywordsWithWrites = defineCommand({\n meta: keywordsCommand.meta,\n subCommands: {\n ...keywordsCommand.subCommands,\n ...(LIST_COMMANDS.keywords ? { list: LIST_COMMANDS.keywords } : {}),\n ...keywordWriteSubcommands,\n },\n});\n\n/** Each write-command group with its `list` read beside its staged writes. */\nfunction withList(thing: string, command: CommandDef): CommandDef {\n const list = LIST_COMMANDS[thing];\n if (!list) return command;\n return defineCommand({ meta: command.meta, args: command.args, subCommands: { list, ...command.subCommands } });\n}\n\nconst googleWriteCommandsWithLists = Object.fromEntries(\n Object.entries(googleWriteCommands).map(([thing, command]) => [thing, withList(thing, command)]),\n);\n\n/** Read-only groups: a `list` with no staged writes beside it. */\nconst merchantCenterCommand = defineCommand({\n meta: { name: \"merchant-center\", description: \"Merchant Center accounts linked to this Google Ads account\" },\n subCommands: LIST_COMMANDS[\"merchant-center\"] ? { list: LIST_COMMANDS[\"merchant-center\"] } : {},\n});\n\nexport const googleCommand = defineCommand({\n meta: {\n name: \"google\",\n description: `Google Ads commands. Query campaigns, keywords, search terms, and more via GAQL.\n\nStart here:\n baker ads google accounts — list accessible accounts\n baker ads google campaigns list — what exists, with ids (also ad-groups, keywords, ads, … list)\n baker ads google query --list-presets — see available query templates\n\nExamples:\n baker ads google query \"SELECT campaign.name, metrics.clicks FROM campaign WHERE segments.date DURING LAST_7_DAYS\" --customer-id 1234567890\n baker ads google query --preset campaign-performance --customer-id 1234567890\n baker ads google currency --customer-id 1234567890\n baker ads google url-options --customer-id 1234567890 — UTM / tracking parameters in force\n baker ads google keywords discover --customer-id 1234567890 --seeds \"running shoes\"\n baker ads google keywords forecast --customer-id 1234567890 --text \"running shoes:PHRASE\" --max-cpc 1.2\n baker ads google previews --customer-id 1234567890 --asset-groups 111 — shareable preview link\n baker ads google invoices --customer-id 1234567890 — last month's invoices\n\nStaged writes (never touch Google until the chat is published):\n baker ads google budgets create --customer-id 1234567890 --name \"Search\" --amount 50\n baker ads google campaigns create --customer-id 1234567890 --name \"Brand\" --channel-type SEARCH --budget-ref g_temp_… --bidding-strategy MANUAL_CPC\n baker ads google keyword-lists create --customer-id 1234567890 --name \"Brand exclusions\"\n baker ads google draft list — review staged Google Ads changes\nFull guide: __tooling__/docs/tools/baker/ads-google.md`,\n },\n subCommands: {\n accounts: () => import(\"./accounts.ts\").then((m) => m.accountsCommand),\n currency: () => import(\"./currency.ts\").then((m) => m.currencyCommand),\n \"url-options\": () => import(\"./url-options.ts\").then((m) => m.urlOptionsCommand),\n changes: () => import(\"./changes.ts\").then((m) => m.changesCommand),\n invoices: () => import(\"./account-reads.ts\").then((m) => m.invoicesCommand),\n \"identity-verification\": () => import(\"./account-reads.ts\").then((m) => m.identityVerificationCommand),\n previews: () => import(\"./account-reads.ts\").then((m) => m.previewsCommand),\n brands: () => import(\"./account-reads.ts\").then((m) => m.brandsCommand),\n query: () => import(\"./query.ts\").then((m) => m.queryCommand),\n keywords: keywordsWithWrites,\n ...googleWriteCommandsWithLists,\n \"merchant-center\": merchantCenterCommand,\n draft: () => import(\"./draft.ts\").then((m) => m.draftCommand),\n },\n});\n","import { defineCommand } from \"citty\";\n\nexport const keywordsCommand = defineCommand({\n meta: {\n name: \"keywords\",\n description: `Keyword research, plus staged keyword changes. Research: discover, metrics, forecast, themes, locations, languages. Changes: list, add, update, pause, resume, remove — pause/resume/add take many keywords in one call.\n\nExamples:\n baker ads google keywords discover --customer-id 1234567890 --seeds \"running shoes\"\n baker ads google keywords metrics --customer-id 1234567890 --keywords \"running shoes,nike shoes\"\n baker ads google keywords forecast --customer-id 1234567890 --text \"running shoes:PHRASE\" --max-cpc 1.2\n baker ads google keywords themes --customer-id 1234567890 --keywords \"trail shoes\" --ad-groups 111,222\n baker ads google keywords locations\n baker ads google keywords languages`,\n },\n subCommands: {\n discover: () => import(\"./discover.ts\").then((m) => m.discoverCommand),\n metrics: () => import(\"./metrics.ts\").then((m) => m.metricsCommand),\n forecast: () => import(\"./forecast.ts\").then((m) => m.forecastCommand),\n themes: () => import(\"./themes.ts\").then((m) => m.themesCommand),\n locations: () => import(\"./locations.ts\").then((m) => m.locationsCommand),\n languages: () => import(\"./languages.ts\").then((m) => m.languagesCommand),\n },\n});\n","/**\n * `baker ads google <thing> list` — what exists, with the ids and resource names the write\n * commands take. Each one is an inventory preset read through `query` (`runQuery`), so it pages,\n * caches and warns like any read: one page by default, `pagination.cursor` for the next, `--all\n * --out` for everything. Paused entities are listed (they are what you come to edit); removed ones\n * are not. `--serving-only` narrows a chained list to what actually serves.\n */\nimport { type ArgsDef, defineCommand } from \"citty\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { runQuery } from \"./query.ts\";\n\ninterface ListSpec {\n /** The write-command group this `list` hangs under (`campaigns`, `keyword-lists`, …). */\n thing: string;\n /** The inventory preset it reads — or a function of the args when one flag picks between two. */\n preset: string | ((args: Record<string, unknown>) => string);\n description: string;\n /** Flags of its own, beyond the shared paging/output set. */\n extraArgs?: ArgsDef;\n example: string;\n}\n\nconst LIST_ARGS = {\n \"customer-id\": { type: \"string\", description: \"Google Ads customer ID (10 digits, no dashes)\" },\n limit: { type: \"string\", description: \"Rows per page (default: the list's page size)\" },\n cursor: { type: \"string\", description: \"pagination.cursor from the previous page\" },\n all: { type: \"boolean\", description: \"Follow every page (use with --out for large lists)\" },\n out: { type: \"string\", description: \"Write rows to a file (.csv, .jsonl, .json)\" },\n output: { type: \"string\", description: \"Format: json|csv|jsonl|md\", default: \"json\" },\n \"serving-only\": {\n type: \"boolean\",\n description:\n \"Only entities whose whole chain is ENABLED (campaign, ad group, …) — paused ones are listed by default\",\n },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\" },\n} as const satisfies ArgsDef;\n\n/** For a list whose rows sit under a campaign: the read narrowed to some campaigns, in Google. */\nconst CAMPAIGN_ID_ARG = {\n \"campaign-id\": {\n type: \"string\",\n description: \"Only these campaigns, comma-separated ids (--campaign-id 123,456)\",\n },\n} as const satisfies ArgsDef;\n\nconst LIST_SPECS: ListSpec[] = [\n {\n thing: \"campaigns\",\n preset: \"campaigns\",\n description: \"List campaigns: id, name, status, channel, bidding, budget and dates\",\n example: \"baker ads google campaigns list --customer-id 1234567890\",\n },\n {\n thing: \"budgets\",\n preset: \"budgets\",\n description: \"List campaign budgets: id, name, daily amount, delivery, shared or not, campaigns using it\",\n example: \"baker ads google budgets list --customer-id 1234567890\",\n },\n {\n thing: \"ad-groups\",\n preset: \"ad-groups\",\n description: \"List ad groups under their campaigns: id, name, status, type, default CPC bid\",\n extraArgs: CAMPAIGN_ID_ARG,\n example: \"baker ads google ad-groups list --customer-id 1234567890\",\n },\n {\n thing: \"keywords\",\n preset: \"keywords\",\n description: \"List positive keywords with the resource name `keywords update|remove` take\",\n extraArgs: CAMPAIGN_ID_ARG,\n example: \"baker ads google keywords list --customer-id 1234567890 --campaign-id 23837707642\",\n },\n {\n thing: \"negative-keywords\",\n preset: (args) => (args.level === \"adGroup\" ? \"ad-group-negative-keywords\" : \"campaign-negative-keywords\"),\n description:\n \"List negative keywords (campaign level by default) with the resource name `negative-keywords remove` takes\",\n extraArgs: { level: { type: \"string\", description: \"campaign (default) | adGroup\" }, ...CAMPAIGN_ID_ARG },\n example: \"baker ads google negative-keywords list --customer-id 1234567890 --level adGroup\",\n },\n {\n thing: \"keyword-lists\",\n preset: (args) => (args.members ? \"negative-keyword-lists\" : \"shared-sets\"),\n description: \"List shared lists (id, name, type, member and campaign counts); --members lists the terms in each\",\n extraArgs: {\n members: { type: \"boolean\", description: \"List each negative list's terms with their resource names\" },\n },\n example: \"baker ads google keyword-lists list --customer-id 1234567890 --members\",\n },\n {\n thing: \"ads\",\n preset: \"ads\",\n description: \"List ads under their ad groups: id, type, name, status, approval, final URLs\",\n extraArgs: CAMPAIGN_ID_ARG,\n example: \"baker ads google ads list --customer-id 1234567890\",\n },\n {\n thing: \"assets\",\n preset: \"assets\",\n description: \"List the account's asset library: id, name, type, text, final URLs\",\n example: \"baker ads google assets list --customer-id 1234567890\",\n },\n {\n thing: \"asset-groups\",\n preset: \"asset-groups\",\n description: \"List Performance Max asset groups: id, name, status, final URLs, ad strength\",\n extraArgs: CAMPAIGN_ID_ARG,\n example: \"baker ads google asset-groups list --customer-id 1234567890\",\n },\n {\n thing: \"audiences\",\n preset: \"audiences\",\n description: \"List audiences (user lists): id, name, type, size on search and display, membership duration\",\n example: \"baker ads google audiences list --customer-id 1234567890\",\n },\n {\n thing: \"conversions\",\n preset: \"conversion-actions\",\n description: \"List conversion actions: id, name, type, category, origin, status, primary or secondary\",\n example: \"baker ads google conversions list --customer-id 1234567890\",\n },\n {\n thing: \"bidding-strategies\",\n preset: \"bidding-strategies\",\n description: \"List portfolio bidding strategies: id, name, type, status, campaigns using each\",\n example: \"baker ads google bidding-strategies list --customer-id 1234567890\",\n },\n {\n thing: \"labels\",\n preset: \"labels\",\n description: \"List labels: id, name, colour, description\",\n example: \"baker ads google labels list --customer-id 1234567890\",\n },\n {\n thing: \"merchant-center\",\n preset: \"merchant-center\",\n description:\n \"List the Merchant Center accounts linked to this account — the merchantId a Shopping or retail Performance Max campaign takes\",\n example: \"baker ads google merchant-center list --customer-id 1234567890\",\n },\n {\n thing: \"campaign-criteria\",\n preset: \"campaign-criteria\",\n description:\n \"List campaign targeting and exclusions (locations, languages, devices, schedules, radius, placements, topics, demographics, content types, IP addresses, web pages, brand lists, audiences) with the resource name `campaign-criteria update|remove` take\",\n extraArgs: CAMPAIGN_ID_ARG,\n example: \"baker ads google campaign-criteria list --customer-id 1234567890\",\n },\n {\n thing: \"ad-group-criteria\",\n preset: \"ad-group-criteria\",\n description:\n \"List ad group targeting and exclusions other than keywords (placements, topics, demographics, web pages, Demand Gen locations and audiences) with the resource name `ad-group-criteria update|remove` take\",\n extraArgs: CAMPAIGN_ID_ARG,\n example: \"baker ads google ad-group-criteria list --customer-id 1234567890\",\n },\n {\n thing: \"account-exclusions\",\n preset: \"account-exclusions\",\n description:\n \"List the account-wide exclusions (sites, apps, YouTube, content types, IP addresses, account negative keyword lists) with the resource name `account-exclusions remove` takes\",\n example: \"baker ads google account-exclusions list --customer-id 1234567890\",\n },\n {\n thing: \"asset-group-signals\",\n preset: \"asset-group-signals\",\n description:\n \"List Performance Max asset groups' signals (search themes and the combined audience) with the resource name `asset-group-signals remove` takes\",\n extraArgs: CAMPAIGN_ID_ARG,\n example: \"baker ads google asset-group-signals list --customer-id 1234567890\",\n },\n {\n thing: \"ad-group-bid-modifiers\",\n preset: \"ad-group-bid-modifiers\",\n description:\n \"List ad groups' own device bid adjustments with the resource name `ad-group-bid-modifiers update|remove` take\",\n extraArgs: CAMPAIGN_ID_ARG,\n example: \"baker ads google ad-group-bid-modifiers list --customer-id 1234567890\",\n },\n];\n\n/** The query args a list hands to `runQuery`: its preset, paused entities in unless --serving-only. */\nexport function listQueryArgs(spec: ListSpec, args: Record<string, unknown>): Record<string, unknown> {\n const preset = typeof spec.preset === \"function\" ? spec.preset(args) : spec.preset;\n return {\n preset,\n \"customer-id\": args[\"customer-id\"],\n limit: args.limit,\n cursor: args.cursor,\n all: args.all,\n out: args.out,\n output: args.output,\n \"no-cache\": args[\"no-cache\"],\n \"include-paused\": !args[\"serving-only\"],\n \"campaign-id\": args[\"campaign-id\"],\n };\n}\n\nfunction listCommand(spec: ListSpec) {\n const args = { ...LIST_ARGS, ...spec.extraArgs } satisfies ArgsDef;\n registerSchema({\n command: `ads.google.${spec.thing}.list`,\n description: `${spec.description}. Start here: \\`${spec.example}\\`. One page per call (pagination.cursor → --cursor for the next; --all --out <file> for everything). Paused entities are included; removed ones are not.`,\n args: Object.fromEntries(\n Object.entries(args).map(([name, arg]) => [\n name,\n {\n type: arg.type,\n description: arg.description ?? \"\",\n required: false,\n ...(\"default\" in arg ? { default: arg.default } : {}),\n },\n ]),\n ),\n });\n return defineCommand({\n meta: { name: \"list\", description: `${spec.description}.\\n\\nExample:\\n ${spec.example}` },\n args,\n run: async ({ args: parsed }) => {\n await runQuery(listQueryArgs(spec, parsed));\n },\n });\n}\n\n/** `list` subcommands keyed by the write-command group they join. */\nexport const LIST_COMMANDS: Record<string, ReturnType<typeof listCommand>> = Object.fromEntries(\n LIST_SPECS.map((spec) => [spec.thing, listCommand(spec)]),\n);\n\n/** Every preset a list can read, for each value of its own flags. */\nexport function listPresetNames(): string[] {\n return LIST_SPECS.flatMap((spec) =>\n typeof spec.preset === \"function\"\n ? [spec.preset({}), spec.preset({ level: \"adGroup\", members: true })]\n : [spec.preset],\n );\n}\n\nexport function listSpecFor(thing: string): ListSpec | undefined {\n return LIST_SPECS.find((spec) => spec.thing === thing);\n}\n","import {\n ASSET_GROUP_ASSET_FIELD_TYPES,\n CALL_AD_RETIRED_MESSAGE,\n CONVERSION_ACTION_CATEGORIES,\n CONVERSION_ORIGINS,\n GOOGLE_DRAFT_BATCH_MAX,\n NEGATIVE_GEO_TARGET_TYPES,\n POSITIVE_GEO_TARGET_TYPES,\n} from \"@baker/api/ads-google\";\nimport { defineCommand } from \"citty\";\nimport { repeatedValues } from \"../../../lib/repeatedFlags.ts\";\nimport { booleanWordPositionalError } from \"../boolean-word-positional.ts\";\nimport { copyListFlag, copyListSplitHints, withRepeatedCopyFlags } from \"./ad-copy-flags.ts\";\nimport {\n appArgs,\n appSettingsFromFlags,\n assetAutomationArgs,\n assetAutomationFromFlags,\n brandGuidelinesCreateArgs,\n brandGuidelinesFromFlags,\n brandStyleArgs,\n defaultAdStatus,\n dynamicSearchAdsArgs,\n dynamicSearchAdsFromFlags,\n enableBrandGuidelinesArgs,\n enableBrandGuidelinesFromFlags,\n frequencyCapArgs,\n frequencyCapsFromFlags,\n linkedAccountArgs,\n linkedAccountFromFlags,\n shoppingArgs,\n shoppingSettingFromFlags,\n shoppingSettingUpdateFromFlags,\n shoppingUpdateArgs,\n} from \"./channel-flags.ts\";\nimport { AD_COPY_LIST_USAGE } from \"./copy-list-usage.ts\";\nimport {\n accountExclusionsCommand,\n adGroupBidModifiersCommand,\n adGroupCriteriaCommand,\n assetGroupSignalsCommand,\n campaignCriteriaCommand,\n LIST_MEMBER_ARGS,\n listMemberCriteria,\n} from \"./criteria-commands.ts\";\nimport { listIdOf, memberRemovals, memberTarget, readListMembers } from \"./keyword-list-members.ts\";\nimport {\n customerIdArg,\n failWriteValidation,\n fileArg,\n fileBatchArg,\n fileCreateCommand,\n fileLines,\n handleGoogleError,\n keywordEntries,\n listFlag,\n loadJsonFileArg,\n loadJsonPayloads,\n mergePayload,\n microsFlag,\n requireCustomerId,\n requireStringFlag,\n requireTarget,\n stageCreate,\n stageGoogleOp,\n stageGoogleOps,\n stageTarget,\n stageUpdate,\n targetArg,\n targetEntries,\n} from \"./write-shared.ts\";\n\n/**\n * Staged Google Ads write commands. Each command builds an op payload from\n * flags (a `--file` JSON payload is merged first, flags override) and stages it\n * against this chat's draft — never calling Google. Reference not-yet-created\n * resources with `g_temp_*` refs returned by earlier create commands.\n */\n\nconst STAGED_WRITE =\n \"Stages only — applies to the live account when the chat is published. Field contract: `baker capabilities google-ads`.\";\n\n// --- Budgets ---\n\n/**\n * Set where the budget is set, not where a hook guessed a chat had started writing. The number is\n * decided in this one command, so this is the last cheap moment to hold it against the demand that\n * actually exists.\n */\nconst BUDGET_DEMAND_HINTS = [\n \"Check this daily budget against the search volume you measured for these keywords, not against the plan you had before you measured it. A budget many times larger than the traffic the target pool can absorb never spends, and reads to the client as a number nobody costed.\",\n \"No volume measured yet? Pull it first — `baker ads google query --preset search-terms` for what the account already captures, `baker ads google keywords metrics` for the market estimate (those are planner figures, never account performance).\",\n];\n\n/** `--amount` (daily) / `--total` (the campaign's whole flight) → the staged amounts, in micros. */\nexport function budgetAmountsFromFlags(args: Record<string, unknown>): Record<string, number> {\n if (args.amount !== undefined && args.total !== undefined) {\n failWriteValidation(\n \"pass --amount OR --total: a budget is either daily or one total for the campaign's flight, never both\",\n );\n }\n const amountMicros = microsFlag(args.amount, \"--amount\");\n const totalAmountMicros = microsFlag(args.total, \"--total\");\n return {\n ...(amountMicros !== undefined ? { amountMicros } : {}),\n ...(totalAmountMicros !== undefined ? { totalAmountMicros } : {}),\n };\n}\n\nconst totalArg = {\n total: {\n type: \"string\" as const,\n description:\n \"A TOTAL budget instead of a daily one: one amount in major units spent across the campaign's start and end dates (e.g. 300). Search, Performance Max and Demand Gen only; the campaign needs --end-date; never shared. A budget stays daily or total for life.\",\n },\n};\n\nconst BUDGET_REMOVE_HINTS = [\n \"A budget can be removed only once no campaign uses it: staging refuses it while one does, unless this draft removes those campaigns or moves them to another budget (publish sends the campaign changes first).\",\n];\n\nconst budgetsCommand = defineCommand({\n meta: { name: \"budgets\", description: \"Stage campaign budget create/update/remove\" },\n subCommands: {\n // Fires where the budget is actually set, rather than on whatever the chat happened to stage\n // first. A budget several times what the target pool can absorb never spends, and reads to the\n // client as a plan nobody costed.\n create: defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a daily campaign budget; campaigns reference it by the g_temp_* ref it returns (--budget-ref). ${STAGED_WRITE}`,\n },\n args: {\n ...customerIdArg,\n ...fileArg(\"google.budget.create\"),\n name: { type: \"string\", description: 'Budget name as shown in Google Ads (e.g. \"Brand search — daily\")' },\n amount: { type: \"string\", description: \"Daily amount in major currency units (e.g. 50)\" },\n ...totalArg,\n delivery: {\n type: \"string\",\n description:\n \"STANDARD — the only delivery Google still runs (ACCELERATED is refused: Google will not attach it to a campaign)\",\n },\n shared: { type: \"boolean\", description: \"Explicitly shared budget\" },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n ...budgetAmountsFromFlags(args),\n deliveryMethod: args.delivery,\n explicitlyShared: args.shared || undefined,\n });\n await stageCreate(\"google.budget.create\", customerId, payload, BUDGET_DEMAND_HINTS);\n },\n }),\n update: defineCommand({\n meta: {\n name: \"update\",\n description: `Stage a change to an existing budget's name, daily amount or delivery. ${STAGED_WRITE}`,\n },\n args: {\n ...customerIdArg,\n ...targetArg(\"budget\"),\n ...fileArg(\"google.budget.update\"),\n name: { type: \"string\", description: \"New budget name as shown in Google Ads\" },\n amount: { type: \"string\", description: \"New daily amount in major currency units\" },\n total: { type: \"string\", description: \"A total budget's new total, in major units (total budgets only)\" },\n delivery: {\n type: \"string\",\n description: \"STANDARD (ACCELERATED is refused — Google will not attach it to a campaign)\",\n },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const target = requireTarget(args, \"budget\");\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n ...budgetAmountsFromFlags(args),\n deliveryMethod: args.delivery,\n });\n await stageUpdate(\"google.budget.update\", customerId, target, payload, BUDGET_DEMAND_HINTS);\n },\n }),\n remove: statusCommand(\"google.budget.remove\", \"budget\", BUDGET_REMOVE_HINTS),\n },\n});\n\n// --- Campaigns ---\n\n/** The only campaign bidding strategies with a max CPC bid ceiling field. */\nconst MAX_CPC_STRATEGIES = [\"TARGET_IMPRESSION_SHARE\", \"TARGET_SPEND\", \"PERCENT_CPC\"];\n\n/** Strategy settings that mean nothing without the strategy — staged alone they would vanish. */\nconst STRATEGY_SETTING_FLAGS = [\"target-cpa\", \"target-roas\", \"impression-share\", \"impression-share-location\"];\n\nexport function biddingFromFlags(args: Record<string, unknown>): Record<string, unknown> | undefined {\n const type = args[\"bidding-strategy\"] as string | undefined;\n const maxCpcMicros = microsFlag(args[\"max-cpc\"], \"--max-cpc\");\n if (!type) {\n if (maxCpcMicros !== undefined) {\n failWriteValidation(\n \"--max-cpc needs --bidding-strategy too (the ceiling belongs to a strategy) — e.g. --bidding-strategy TARGET_IMPRESSION_SHARE --max-cpc 12\",\n );\n }\n // Same rule, and the reason it is worth stating twice: without it the most natural call for\n // this flag — retargeting a Demand Gen campaign that is already on TARGET_CPC — returns\n // undefined here and stages nothing at all, silently.\n if (args[\"target-cpc\"] !== undefined) {\n failWriteValidation(\n \"--target-cpc needs --bidding-strategy too (the target belongs to a strategy) — use --bidding-strategy TARGET_CPC --target-cpc 1.5\",\n );\n }\n const orphan = STRATEGY_SETTING_FLAGS.find((flag) => args[flag] !== undefined);\n if (orphan) {\n failWriteValidation(\n `--${orphan} needs --bidding-strategy too (it belongs to a strategy) — e.g. --bidding-strategy TARGET_IMPRESSION_SHARE --impression-share 70, or TARGET_CPA --target-cpa 35`,\n );\n }\n return undefined;\n }\n // Every other strategy drops the ceiling on the way to Google, so the staged draft would\n // preview a ceiling that publish never writes.\n if (maxCpcMicros !== undefined && !MAX_CPC_STRATEGIES.includes(type.toUpperCase())) {\n failWriteValidation(`${type} does not take --max-cpc — only ${MAX_CPC_STRATEGIES.join(\", \")} carry a bid ceiling`);\n }\n // Same reason as the ceiling above: `biddingResource` emits `targetCpc` only for TARGET_CPC, so\n // any other strategy would preview a target that publish silently discards.\n const targetCpcMicros = microsFlag(args[\"target-cpc\"], \"--target-cpc\");\n if (targetCpcMicros !== undefined && type.toUpperCase() !== \"TARGET_CPC\") {\n failWriteValidation(\n `${type} does not take --target-cpc — pair it with --bidding-strategy TARGET_CPC (Demand Gen campaigns only)`,\n );\n }\n return {\n type,\n targetCpaMicros: microsFlag(args[\"target-cpa\"], \"--target-cpa\"),\n targetRoas: args[\"target-roas\"] !== undefined ? Number(args[\"target-roas\"]) : undefined,\n targetCpcMicros,\n cpcBidCeilingMicros: maxCpcMicros,\n ...impressionShareGoalFromFlags(args, type),\n };\n}\n\n/** `--impression-share 70 --impression-share-location ABSOLUTE_TOP_OF_PAGE` → Google's goal fields. */\nfunction impressionShareGoalFromFlags(\n args: Record<string, unknown>,\n type: string,\n): { location?: string; locationFractionMicros?: number } {\n const share = args[\"impression-share\"];\n const location = args[\"impression-share-location\"];\n if (share === undefined && location === undefined) {\n return {};\n }\n if (type.toUpperCase() !== \"TARGET_IMPRESSION_SHARE\") {\n failWriteValidation(\n `${type} does not take --impression-share / --impression-share-location — they set the goal of --bidding-strategy TARGET_IMPRESSION_SHARE`,\n );\n }\n const percent = share === undefined ? undefined : Number(share);\n if (percent !== undefined && !(percent > 0 && percent <= 100)) {\n failWriteValidation(`--impression-share is a percentage between 0 and 100 (e.g. 70), got ${String(share)}`);\n }\n return {\n ...(typeof location === \"string\" ? { location: location.toUpperCase() } : {}),\n ...(percent !== undefined ? { locationFractionMicros: Math.round(percent * 10_000) } : {}),\n };\n}\n\nconst maxCpcArg = {\n \"max-cpc\": {\n type: \"string\" as const,\n description: \"Max CPC bid ceiling (major units) for TARGET_IMPRESSION_SHARE, TARGET_SPEND or PERCENT_CPC\",\n },\n \"impression-share\": {\n type: \"string\" as const,\n description:\n \"TARGET_IMPRESSION_SHARE goal: the share of auctions to show in, as a percentage (e.g. 70). A new Target impression share needs this, --impression-share-location and --max-cpc.\",\n },\n \"impression-share-location\": {\n type: \"string\" as const,\n description: \"TARGET_IMPRESSION_SHARE goal: ANYWHERE_ON_PAGE | TOP_OF_PAGE | ABSOLUTE_TOP_OF_PAGE\",\n },\n};\n\nconst portfolioRefArg = {\n \"portfolio-ref\": {\n type: \"string\" as const,\n description:\n \"Put the campaign on a portfolio bid strategy (g_temp_* from `bidding-strategies create`, id, or resource name) instead of its own bidding. Which campaign types join which portfolios is fixed by Google — staging refuses the rest. To take a campaign OFF its portfolio, stage its own --bidding-strategy: staging clears the portfolio with it and says so.\",\n },\n};\n\nconst finalUrlSuffixArg = {\n \"final-url-suffix\": {\n type: \"string\" as const,\n description:\n 'Final URL suffix for this campaign — bare query params, no leading \"?\" (e.g. \"utm_source=google&utm_agency=baker\"). REPLACES the account-level suffix for this campaign; pass \"\" to clear it back to the account value. Account-wide tagging belongs at the account level: --level account stages it there.',\n },\n};\n\nconst urlOptionsArgs = {\n \"tracking-template\": {\n type: \"string\" as const,\n description:\n 'Campaign tracking template — the click-measurement URL every ad routes through. Must carry the landing page through {lpurl}, e.g. \"https://tracker.example/?url={lpurl}\". REPLACES the account-level template for this campaign; pass \"\" to clear it back to the account value.',\n },\n \"custom-param\": {\n type: \"string\" as const,\n description:\n \"Custom parameter as key=value, referenced in a template or final URL as {_key} (e.g. --custom-param season=summer). Repeat for several; Google allows 8. REPLACES the campaign's whole set.\",\n },\n \"clear-custom-params\": {\n type: \"boolean\" as const,\n description: \"Remove every custom parameter from this campaign (Google replaces the set wholesale).\",\n },\n};\n\n/**\n * `--custom-param key=value` (repeatable) / `--clear-custom-params` → the staged\n * `urlCustomParameters`.\n *\n * Read from `rawArgs`, not `args`: citty keeps only a repeated flag's last\n * value, and Google replaces the parameter set wholesale — so taking it from\n * `args` would stage one pair and drop the rest at publish, silently.\n */\nexport function urlCustomParametersFromFlags(\n args: Record<string, unknown>,\n rawArgs?: readonly string[],\n): Array<{ key: string; value: string }> | undefined {\n const entries = repeatedValues(rawArgs, \"custom-param\", args[\"custom-param\"]).filter((v) => v.length > 0);\n if (entries.length === 0) {\n return args[\"clear-custom-params\"] === true ? [] : undefined;\n }\n if (args[\"clear-custom-params\"] === true) {\n failWriteValidation(\"--clear-custom-params removes every parameter — pass it OR --custom-param, not both\");\n }\n return entries.map((entry) => {\n const split = entry.indexOf(\"=\");\n if (split <= 0) {\n failWriteValidation(`--custom-param \"${entry}\" must be key=value (e.g. --custom-param season=summer)`);\n }\n return { key: entry.slice(0, split), value: entry.slice(split + 1) };\n });\n}\n\nconst aiMaxArgs = {\n \"ai-max\": {\n type: \"boolean\" as const,\n description:\n \"AI Max for Search: --ai-max turns it on (Google then matches searches beyond your keywords), --ai-max=false turns it off along with its text customization and URL expansion. Search campaigns only.\",\n },\n \"ai-max-text\": {\n type: \"boolean\" as const,\n description:\n \"AI Max text customization: --ai-max-text lets Google write ad text from your landing page and ads (needs AI Max on); --ai-max-text=false stops it. Required before text guidelines.\",\n },\n \"ai-max-url-expansion\": {\n type: \"boolean\" as const,\n description:\n \"AI Max final URL expansion: --ai-max-url-expansion lets Google send clicks to the most relevant page of your site (needs text customization on); --ai-max-url-expansion=false keeps every click on your final URLs.\",\n },\n};\n\n/** `--ai-max` / `--ai-max-text` / `--ai-max-url-expansion` → the staged `aiMax`, or nothing. */\nexport function aiMaxFromFlags(\n args: Record<string, unknown>,\n): { enabled?: boolean; textCustomization?: boolean; finalUrlExpansion?: boolean } | undefined {\n const flag = (name: string) => (typeof args[name] === \"boolean\" ? (args[name] as boolean) : undefined);\n const aiMax = {\n enabled: flag(\"ai-max\"),\n textCustomization: flag(\"ai-max-text\"),\n finalUrlExpansion: flag(\"ai-max-url-expansion\"),\n };\n const stated = Object.entries(aiMax).filter(([, v]) => v !== undefined);\n return stated.length > 0 ? Object.fromEntries(stated) : undefined;\n}\n\nconst textGuidelinesArgs = {\n \"term-exclusion\": {\n type: \"string\" as const,\n description:\n \"Text guidelines (AI Max Search and Performance Max): a word or phrase Google's generated ad text must never use, up to 30 characters (e.g. --term-exclusion \\\"cheap\\\"). Repeat for several; Google allows 25. REPLACES the campaign's whole list.\",\n },\n \"messaging-restriction\": {\n type: \"string\" as const,\n description:\n \"Text guidelines (AI Max Search and Performance Max): a plain-language rule for Google's generated ad text, up to 300 characters (e.g. --messaging-restriction \\\"Never promise a delivery date\\\"). Repeat for several; Google allows 40. REPLACES the campaign's whole list.\",\n },\n \"clear-term-exclusions\": {\n type: \"boolean\" as const,\n description: \"Remove every term exclusion from this campaign's text guidelines.\",\n },\n \"clear-messaging-restrictions\": {\n type: \"boolean\" as const,\n description: \"Remove every messaging restriction from this campaign's text guidelines.\",\n },\n};\n\n/** One text-guidelines list from its repeatable flag and its clear flag, or undefined to leave it alone. */\nfunction guidelineListFromFlags(\n args: Record<string, unknown>,\n rawArgs: readonly string[] | undefined,\n flag: string,\n clearFlag: string,\n): string[] | undefined {\n const values = repeatedValues(rawArgs, flag, args[flag]).filter((v) => v.length > 0);\n if (values.length === 0) {\n return args[clearFlag] === true ? [] : undefined;\n }\n if (args[clearFlag] === true) {\n failWriteValidation(`--${clearFlag} removes the whole list — pass it OR --${flag}, not both`);\n }\n return values;\n}\n\n/**\n * `--term-exclusion` / `--messaging-restriction` (repeatable) and their `--clear-…` flags → the\n * staged `textGuidelines`. Read from `rawArgs` for the same reason as `--custom-param`: each list\n * replaces the campaign's whole list, so keeping only citty's last value would drop the rest.\n */\nexport function textGuidelinesFromFlags(\n args: Record<string, unknown>,\n rawArgs?: readonly string[],\n): { termExclusions?: string[]; messagingRestrictions?: string[] } | undefined {\n const termExclusions = guidelineListFromFlags(args, rawArgs, \"term-exclusion\", \"clear-term-exclusions\");\n const messagingRestrictions = guidelineListFromFlags(\n args,\n rawArgs,\n \"messaging-restriction\",\n \"clear-messaging-restrictions\",\n );\n if (termExclusions === undefined && messagingRestrictions === undefined) {\n return undefined;\n }\n return {\n ...(termExclusions !== undefined ? { termExclusions } : {}),\n ...(messagingRestrictions !== undefined ? { messagingRestrictions } : {}),\n };\n}\n\nconst geoTargetTypeArgs = {\n \"geo-target-type\": {\n type: \"string\" as const,\n description:\n 'Location option — PRESENCE (only people in your targeted locations) or PRESENCE_OR_INTEREST (also people interested in them). Google applies PRESENCE_OR_INTEREST when this is left out, so pass PRESENCE explicitly for local-service, delivery-radius or in-store campaigns. Sets the same \"Location options\" as the Google Ads UI.',\n },\n \"negative-geo-target-type\": {\n type: \"string\" as const,\n description:\n \"How EXCLUDED locations are matched — PRESENCE (default: excludes people in the location) or PRESENCE_OR_INTEREST (also excludes people interested in it).\",\n },\n};\n\n/** An enum flag, upper-cased, rejected here rather than at publish where it would fail the whole batch. */\nfunction enumFlag(value: unknown, flag: string, allowed: readonly string[]): string | undefined {\n if (typeof value !== \"string\" || value.length === 0) {\n return undefined;\n }\n const upper = value.toUpperCase();\n if (!allowed.includes(upper)) {\n failWriteValidation(`${flag} must be one of ${allowed.join(\" | \")}`);\n }\n return upper;\n}\n\n/** `--geo-target-type` / `--negative-geo-target-type` → the staged `geoTargetTypeSetting`, or nothing. */\nexport function geoTargetTypeFromFlags(args: Record<string, unknown>): Record<string, string> | undefined {\n const positiveGeoTargetType = enumFlag(args[\"geo-target-type\"], \"--geo-target-type\", POSITIVE_GEO_TARGET_TYPES);\n const negativeGeoTargetType = enumFlag(\n args[\"negative-geo-target-type\"],\n \"--negative-geo-target-type\",\n NEGATIVE_GEO_TARGET_TYPES,\n );\n if (positiveGeoTargetType === undefined && negativeGeoTargetType === undefined) {\n return undefined;\n }\n return Object.fromEntries(\n Object.entries({ positiveGeoTargetType, negativeGeoTargetType }).filter(([, v]) => v !== undefined),\n ) as Record<string, string>;\n}\n\n/**\n * `--networks` names the networks to serve on; every network not named is turned OFF. All four\n * booleans are always sent, because a half-stated `networkSettings` is how a campaign ends up on a\n * surface nobody chose — the flag has to say the whole picture or say nothing.\n */\nconst NETWORK_SETTING_KEYS = [\n \"targetGoogleSearch\",\n \"targetSearchNetwork\",\n \"targetContentNetwork\",\n \"targetPartnerSearchNetwork\",\n] as const;\n\nconst NETWORK_FLAG_VALUES: Record<string, (typeof NETWORK_SETTING_KEYS)[number]> = {\n search: \"targetGoogleSearch\",\n \"search-partners\": \"targetSearchNetwork\",\n partners: \"targetSearchNetwork\",\n display: \"targetContentNetwork\",\n \"partner-search\": \"targetPartnerSearchNetwork\",\n};\n\nconst networksArg = {\n networks: {\n type: \"string\" as const,\n description:\n 'Networks to serve on, comma-separated: search | search-partners | display | partner-search. Every network you do not list is turned OFF, so state the whole set. Start here: --networks search — a new Search campaign left unset publishes on Google Search only, because Google\\'s own default adds Search partners and the Display network, which spends the same budget on surfaces the advertiser did not pick. Sets the same \"Networks\" as the Google Ads UI.',\n },\n};\n\n/** `--networks` → the staged `networkSettings`, all four booleans, or nothing. */\nexport function networkSettingsFromFlags(args: Record<string, unknown>): Record<string, boolean> | undefined {\n const raw = args.networks;\n if (typeof raw !== \"string\") {\n return undefined;\n }\n const names = raw\n .split(\",\")\n .map((n) => n.trim().toLowerCase())\n .filter((n) => n.length > 0);\n const allowed = Object.keys(NETWORK_FLAG_VALUES).join(\" | \");\n if (names.length === 0) {\n failWriteValidation(`--networks needs at least one of ${allowed}`);\n }\n const settings: Record<string, boolean> = Object.fromEntries(NETWORK_SETTING_KEYS.map((k) => [k, false]));\n for (const name of names) {\n const key = NETWORK_FLAG_VALUES[name];\n if (!key) {\n failWriteValidation(`--networks must list only ${allowed}`);\n }\n settings[key] = true;\n }\n return settings;\n}\n\n/**\n * Networks are the setting an unstated campaign gets most wrong, so the command always says which\n * ones it just staged. A SEARCH campaign with no `--networks` gets Baker's Search-only default; any\n * other channel type keeps Google's own behaviour, and there the agent has to look before promising\n * the user anything.\n */\nexport function networksHints(payload: Record<string, unknown>): string[] {\n if (payload.networkSettings !== undefined) {\n return [];\n }\n if (payload.channelType !== \"SEARCH\") {\n return [];\n }\n return [\n \"No --networks set, so this campaign publishes on Google Search only — Search partners and the Display network are off. Re-stage with --networks search,search-partners (or add display) to widen it, and tell the user which networks this campaign serves on.\",\n ];\n}\n\n/**\n * A campaign staged without `--geo-target-type` publishes on Google's \"Presence or interest\", which\n * spends on people merely interested in the location. The command can't decide that for the\n * advertiser, so it says what it just staged and how to change it.\n */\nexport function geoTargetTypeHints(payload: Record<string, unknown>): string[] {\n if (payload.geoTargetTypeSetting !== undefined) {\n return [];\n }\n return [\n 'No --geo-target-type set, so this campaign will use Google\\'s default location option \"Presence or interest\" — it reaches people interested in your locations, not only people in them. Re-stage with --geo-target-type PRESENCE if the offer is local (in-store, delivery radius, service area), and tell the user which of the two this campaign uses.',\n ];\n}\n\n// --- Account settings ---\n\nconst accountSettingsArgs = {\n \"auto-tagging\": {\n type: \"boolean\" as const,\n description:\n \"Auto-tagging: --auto-tagging adds Google's click id (gclid) to every landing page; --auto-tagging=false stops it, and conversion tracking, offline conversion uploads and the Google Analytics link lose the click they match on.\",\n },\n \"tracking-template\": {\n type: \"string\" as const,\n description:\n 'Account tracking template — the click-measurement URL every ad routes through unless a campaign, ad group or ad sets its own. Must carry the landing page through {lpurl}, e.g. \"{lpurl}?src=google\". Pass \"\" to clear it.',\n },\n \"final-url-suffix\": {\n type: \"string\" as const,\n description:\n 'Account final URL suffix — bare query params appended to every landing page, no leading \"?\" (e.g. \"utm_source=google&utm_agency=baker\"). A campaign, ad group or ad suffix REPLACES it there. Pass \"\" to clear it.',\n },\n \"call-reporting\": {\n type: \"boolean\" as const,\n description:\n \"Call reporting: --call-reporting counts and reports calls from call assets; --call-reporting=false stops it.\",\n },\n \"call-conversions\": {\n type: \"boolean\" as const,\n description:\n \"Whether calls from ads count as conversions: --call-conversions / --call-conversions=false. Needs call reporting on.\",\n },\n \"video-inventory\": {\n type: \"string\" as const,\n description:\n \"Video inventory (brand safety) for YouTube and video placements: EXPANDED | STANDARD | LIMITED — limited shows ads beside the narrowest, safest range of content.\",\n },\n};\n\nconst VIDEO_INVENTORY_LEVELS = [\"EXPANDED\", \"STANDARD\", \"LIMITED\"];\n\n/** The account-settings flags → the staged `google.customer.update` payload; only stated flags. */\nexport function accountSettingsFromFlags(args: Record<string, unknown>): Record<string, unknown> {\n const flag = (name: string) => (typeof args[name] === \"boolean\" ? (args[name] as boolean) : undefined);\n const text = (name: string) => (typeof args[name] === \"string\" ? (args[name] as string) : undefined);\n const inventory = text(\"video-inventory\")\n ?.toUpperCase()\n .replace(/_INVENTORY$/, \"\");\n if (inventory !== undefined && !VIDEO_INVENTORY_LEVELS.includes(inventory)) {\n failWriteValidation(`--video-inventory must be ${VIDEO_INVENTORY_LEVELS.join(\" | \")}`);\n }\n const payload = {\n autoTaggingEnabled: flag(\"auto-tagging\"),\n trackingUrlTemplate: text(\"tracking-template\"),\n finalUrlSuffix: text(\"final-url-suffix\"),\n callReportingEnabled: flag(\"call-reporting\"),\n callConversionReportingEnabled: flag(\"call-conversions\"),\n videoBrandSafety: inventory === undefined ? undefined : `${inventory}_INVENTORY`,\n };\n return Object.fromEntries(Object.entries(payload).filter(([, value]) => value !== undefined));\n}\n\n/** The URL-option flags `campaigns update --level account` carries to the account. */\nconst ACCOUNT_LEVEL_URL_FLAGS: Readonly<Record<string, string>> = {\n \"final-url-suffix\": \"finalUrlSuffix\",\n \"tracking-template\": \"trackingUrlTemplate\",\n};\n\n/**\n * `campaigns update --level account`: the account's own URL options, staged as an account settings\n * change rather than on one campaign. Any other campaign flag has no account-level meaning and is\n * refused by name, so nothing the agent asked for is dropped in silence.\n */\nexport function accountLevelUrlOptions(args: Record<string, unknown>): Record<string, unknown> {\n const kebab = (key: string) => key.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n const ignored = new Set([\"level\", \"customer-id\", \"_\", \"id\", ...Object.keys(ACCOUNT_LEVEL_URL_FLAGS)]);\n const other = [\n ...new Set(\n Object.entries(args)\n .filter(([key, value]) => !ignored.has(kebab(key)) && value !== undefined && value !== false)\n .map(([key]) => kebab(key)),\n ),\n ];\n if (other.length > 0) {\n failWriteValidation(\n `--level account stages the account's final URL suffix and tracking template only — ${other.map((key) => `--${key}`).join(\", \")} ${other.length === 1 ? \"is a campaign setting\" : \"are campaign settings\"}. Stage the account change alone, and the rest with \\`baker ads google campaigns update <campaign-id>\\` (or other account settings with \\`baker ads google account update\\`).`,\n );\n }\n const payload = Object.fromEntries(\n Object.entries(ACCOUNT_LEVEL_URL_FLAGS).flatMap(([flag, key]) =>\n typeof args[flag] === \"string\" ? [[key, args[flag]]] : [],\n ),\n );\n if (Object.keys(payload).length === 0) {\n failWriteValidation('--level account needs --final-url-suffix or --tracking-template (pass \"\" to clear one)');\n }\n return payload;\n}\n\n/** Hints after staging an account URL option: who still overrides it. */\nfunction accountUrlOptionHints(customerId: string): string[] {\n return [\n `A campaign, ad group or ad that sets its own suffix or template REPLACES the account one there — run \\`baker ads google url-options --customer-id ${customerId}\\` and tell the user which ones will not pick this up.`,\n ];\n}\n\nconst accountCommand = defineCommand({\n meta: {\n name: \"account\",\n description:\n \"Stage the account's own settings — auto-tagging, account tracking template and final URL suffix, call reporting, video inventory (brand safety). Start here for an account-wide UTM or agency tag.\",\n },\n subCommands: {\n update: defineCommand({\n meta: {\n name: \"update\",\n description: `Stage a change to the account's settings (Google Ads → Admin → Account settings). One op per account; restaging amends it. ${STAGED_WRITE}\n\nExamples:\n baker ads google account update --customer-id 1234567890 --final-url-suffix \"utm_source=google&utm_agency=baker\"\n baker ads google account update --customer-id 1234567890 --auto-tagging\n baker ads google account update --customer-id 1234567890 --call-reporting --call-conversions\n baker ads google account update --customer-id 1234567890 --video-inventory LIMITED\n baker ads google account update --customer-id 1234567890 --final-url-suffix \"\" — clear it`,\n },\n args: { ...customerIdArg, ...fileArg(\"google.customer.update\"), ...accountSettingsArgs },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const payload = mergePayload(loadJsonFileArg(args.file), accountSettingsFromFlags(args));\n const urlHints =\n payload.finalUrlSuffix !== undefined || payload.trackingUrlTemplate !== undefined\n ? accountUrlOptionHints(customerId)\n : [];\n await stageUpdate(\"google.customer.update\", customerId, customerId, payload, urlHints);\n },\n }),\n },\n});\n\nconst campaignsCommand = defineCommand({\n meta: { name: \"campaigns\", description: \"Stage campaign create/update/pause/resume/remove\" },\n subCommands: {\n create: defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new campaign on a budget (--budget-ref); it is created paused unless --status ENABLED. ${STAGED_WRITE}`,\n },\n args: {\n ...customerIdArg,\n ...fileArg(\"google.campaign.create\"),\n name: { type: \"string\", description: 'Campaign name, unique in the account (e.g. \"Search — Brand — ES\")' },\n \"channel-type\": {\n type: \"string\",\n description:\n \"SEARCH | DISPLAY | PERFORMANCE_MAX | DEMAND_GEN | SHOPPING (--merchant-id) | MULTI_CHANNEL = App (--sub-type APP_CAMPAIGN --app-id --app-store --app-goal) | TRAVEL (--travel-account-id) | HOTEL (--hotel-center-id). Video, Smart and Local campaigns are refused with the reason and the route (video on YouTube → DEMAND_GEN).\",\n },\n \"sub-type\": {\n type: \"string\",\n description:\n \"Leave out for a standard campaign. APP_CAMPAIGN (installs) or APP_CAMPAIGN_FOR_ENGAGEMENT on an App campaign (required); DISPLAY_MOBILE_APP on Display. Travel's own sub-type is sent for you.\",\n },\n \"budget-ref\": { type: \"string\", description: \"Budget ref (g_temp_*, id, or resource name)\" },\n ...portfolioRefArg,\n \"bidding-strategy\": {\n type: \"string\",\n description:\n \"MANUAL_CPC | MAXIMIZE_CONVERSIONS | MAXIMIZE_CONVERSION_VALUE | TARGET_SPEND | TARGET_IMPRESSION_SHARE | TARGET_CPA | TARGET_ROAS | TARGET_CPC | MANUAL_CPM. Each campaign type takes only some — staging refuses the rest and names the ones that work.\",\n },\n \"target-cpa\": {\n type: \"string\",\n description:\n \"Target CPA (major units). On a Search campaign pair it with --bidding-strategy MAXIMIZE_CONVERSIONS — Google keeps the target inside that strategy and rejects a standalone TARGET_CPA.\",\n },\n \"target-roas\": {\n type: \"string\",\n description:\n \"Target ROAS (e.g. 4.0). On a Search campaign pair it with --bidding-strategy MAXIMIZE_CONVERSION_VALUE — Google keeps the target inside that strategy and rejects a standalone TARGET_ROAS.\",\n },\n \"target-cpc\": {\n type: \"string\",\n description:\n \"Target CPC (major units) for Demand Gen — pair it with --bidding-strategy TARGET_CPC. Demand Gen only; other channels have no target CPC.\",\n },\n ...maxCpcArg,\n ...finalUrlSuffixArg,\n ...urlOptionsArgs,\n ...geoTargetTypeArgs,\n ...networksArg,\n ...aiMaxArgs,\n ...shoppingArgs,\n ...appArgs,\n ...linkedAccountArgs,\n ...dynamicSearchAdsArgs,\n ...frequencyCapArgs,\n ...textGuidelinesArgs,\n ...assetAutomationArgs,\n ...brandGuidelinesCreateArgs,\n objective: { type: \"string\", description: \"Advisory UI objective (SALES, LEADS, …)\" },\n \"start-date\": { type: \"string\", description: \"YYYY-MM-DD\" },\n \"end-date\": { type: \"string\", description: \"YYYY-MM-DD\" },\n \"eu-political-ads\": {\n type: \"boolean\",\n description:\n \"Pass when the campaign contains EU political advertising. Google requires the declaration on every new campaign; omitted stages the campaign as not containing EU political ads.\",\n },\n status: { type: \"string\", description: \"ENABLED | PAUSED (default PAUSED)\" },\n },\n run: async ({ args, rawArgs }) => {\n const customerId = requireCustomerId(args);\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n channelType: args[\"channel-type\"],\n channelSubType: args[\"sub-type\"],\n budget: args[\"budget-ref\"],\n bidding: biddingFromFlags(args),\n biddingStrategy: args[\"portfolio-ref\"],\n geoTargetTypeSetting: geoTargetTypeFromFlags(args),\n networkSettings: networkSettingsFromFlags(args),\n finalUrlSuffix: args[\"final-url-suffix\"],\n trackingUrlTemplate: args[\"tracking-template\"],\n urlCustomParameters: urlCustomParametersFromFlags(args, rawArgs),\n objective: args.objective,\n startDate: args[\"start-date\"],\n endDate: args[\"end-date\"],\n euPoliticalAds: args[\"eu-political-ads\"],\n aiMax: aiMaxFromFlags(args),\n shoppingSetting: shoppingSettingFromFlags(args),\n ...appSettingsFromFlags(args),\n ...linkedAccountFromFlags(args),\n dynamicSearchAdsSetting: dynamicSearchAdsFromFlags(args),\n frequencyCaps: frequencyCapsFromFlags(args, rawArgs),\n textGuidelines: textGuidelinesFromFlags(args, rawArgs),\n assetAutomation: assetAutomationFromFlags(args),\n brandGuidelines: brandGuidelinesFromFlags(args, \"create\"),\n status: args.status,\n });\n await stageCreate(\"google.campaign.create\", customerId, payload, [\n ...geoTargetTypeHints(payload),\n ...networksHints(payload),\n ]);\n },\n }),\n update: defineCommand({\n meta: {\n name: \"update\",\n description: `Stage a change to an existing campaign's name, budget, bidding, settings, AI Max switches or text guidelines (what AI Max and Performance Max ad text must avoid). ${STAGED_WRITE}`,\n },\n args: {\n ...customerIdArg,\n ...targetArg(\"campaign\"),\n ...fileArg(\"google.campaign.update\"),\n name: { type: \"string\", description: \"New campaign name, unique in the account\" },\n \"budget-ref\": { type: \"string\" },\n ...portfolioRefArg,\n \"bidding-strategy\": {\n type: \"string\",\n description:\n \"MANUAL_CPC | MAXIMIZE_CONVERSIONS | MAXIMIZE_CONVERSION_VALUE | TARGET_SPEND | TARGET_IMPRESSION_SHARE | TARGET_CPA | TARGET_ROAS | TARGET_CPC | MANUAL_CPM. Each campaign type takes only some — staging refuses the rest and names the ones that work.\",\n },\n \"target-cpa\": {\n type: \"string\",\n description:\n \"Target CPA (major units). On a Search campaign pair it with --bidding-strategy MAXIMIZE_CONVERSIONS — Google keeps the target inside that strategy and rejects a standalone TARGET_CPA.\",\n },\n \"target-roas\": {\n type: \"string\",\n description:\n \"Target ROAS (e.g. 4.0). On a Search campaign pair it with --bidding-strategy MAXIMIZE_CONVERSION_VALUE — Google keeps the target inside that strategy and rejects a standalone TARGET_ROAS.\",\n },\n \"target-cpc\": {\n type: \"string\",\n description:\n \"Target CPC (major units) for Demand Gen — pair it with --bidding-strategy TARGET_CPC. Demand Gen only; other channels have no target CPC.\",\n },\n ...maxCpcArg,\n ...finalUrlSuffixArg,\n ...urlOptionsArgs,\n ...geoTargetTypeArgs,\n ...networksArg,\n ...textGuidelinesArgs,\n ...aiMaxArgs,\n ...shoppingUpdateArgs,\n ...dynamicSearchAdsArgs,\n ...frequencyCapArgs,\n ...assetAutomationArgs,\n ...brandStyleArgs,\n \"eu-political-ads\": {\n type: \"boolean\",\n description:\n \"Corrects the campaign's EU political advertising declaration: --eu-political-ads if it contains EU political ads, --eu-political-ads=false if it does not. Existing campaigns without a declaration block location-targeting changes until one is set.\",\n },\n level: {\n type: \"string\",\n description:\n \"campaign (default) | account. `account` stages --final-url-suffix / --tracking-template on the ACCOUNT (every campaign without its own inherits it) — same as `baker ads google account update`.\",\n },\n status: { type: \"string\" },\n },\n run: async ({ args, rawArgs }) => {\n const customerId = requireCustomerId(args);\n const level = typeof args.level === \"string\" && args.level.length > 0 ? args.level : \"campaign\";\n if (level === \"account\") {\n const payload = accountLevelUrlOptions(args);\n await stageUpdate(\n \"google.customer.update\",\n customerId,\n customerId,\n payload,\n accountUrlOptionHints(customerId),\n );\n return;\n }\n if (level !== \"campaign\") {\n failWriteValidation(\"--level must be campaign or account\");\n }\n const target = requireTarget(args, \"campaign\");\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n budget: args[\"budget-ref\"],\n bidding: biddingFromFlags(args),\n biddingStrategy: args[\"portfolio-ref\"],\n geoTargetTypeSetting: geoTargetTypeFromFlags(args),\n networkSettings: networkSettingsFromFlags(args),\n finalUrlSuffix: args[\"final-url-suffix\"],\n trackingUrlTemplate: args[\"tracking-template\"],\n urlCustomParameters: urlCustomParametersFromFlags(args, rawArgs),\n euPoliticalAds: args[\"eu-political-ads\"],\n textGuidelines: textGuidelinesFromFlags(args, rawArgs),\n aiMax: aiMaxFromFlags(args),\n shoppingSetting: shoppingSettingUpdateFromFlags(args),\n dynamicSearchAdsSetting: dynamicSearchAdsFromFlags(args),\n frequencyCaps: frequencyCapsFromFlags(args, rawArgs),\n assetAutomation: assetAutomationFromFlags(args),\n brandGuidelines: brandGuidelinesFromFlags(args, \"update\"),\n status: args.status,\n });\n await stageUpdate(\"google.campaign.update\", customerId, target, payload);\n },\n }),\n pause: statusCommand(\"google.campaign.pause\", \"campaign\"),\n resume: statusCommand(\"google.campaign.resume\", \"campaign\"),\n remove: statusCommand(\"google.campaign.remove\", \"campaign\"),\n \"enable-brand-guidelines\": defineCommand({\n meta: {\n name: \"enable-brand-guidelines\",\n description: `Turn brand guidelines on for an existing Performance Max campaign (Google fixes them at creation otherwise). Start here: \\`baker ads google campaigns enable-brand-guidelines <id> --business-name-asset <id> --logo-assets <id> --final-url-domain example.com\\`, or \\`--auto-populate\\` to take them from its asset groups. Applied at publish; \\`draft validate\\` cannot check it (Google has no dry run for it). ${STAGED_WRITE}`,\n },\n args: {\n ...customerIdArg,\n ...fileArg(\"google.campaign.enableBrandGuidelines\"),\n id: { type: \"positional\", description: \"Performance Max campaign id or resource name\", required: false },\n ...enableBrandGuidelinesArgs,\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const payload = mergePayload(loadJsonFileArg(args.file), enableBrandGuidelinesFromFlags(args));\n await stageUpdate(\n \"google.campaign.enableBrandGuidelines\",\n customerId,\n requireTarget(args, \"campaign\"),\n payload,\n );\n },\n }),\n },\n});\n\nfunction statusCommand(kind: string, entity: string, hints?: string[]) {\n return defineCommand({\n meta: {\n name: kind.split(\".\")[2],\n description: `Stage a ${entity} ${kind.split(\".\")[2]}. Several? Stage them in one call with \\`baker ads google draft stage --file ops.json\\` — never one command per row.`,\n },\n args: {\n ...customerIdArg,\n id: { type: \"positional\", description: `${entity} resource name or id`, required: false },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageTarget(kind, customerId, requireTarget(args, entity), hints);\n },\n });\n}\n\n// --- Ad groups ---\n\nconst adGroupsCommand = defineCommand({\n meta: { name: \"ad-groups\", description: \"Stage ad group create/update/pause/resume/remove\" },\n subCommands: {\n create: defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new ad group in a campaign (--campaign-ref); it is created paused unless --status ENABLED. ${STAGED_WRITE}`,\n },\n args: {\n ...customerIdArg,\n ...fileArg(\"google.adGroup.create\"),\n name: {\n type: \"string\",\n description: 'Ad group name, unique within its campaign (e.g. \"Solar panels — price\")',\n },\n \"campaign-ref\": { type: \"string\", description: \"Campaign ref (g_temp_*, id, or resource name)\" },\n type: {\n type: \"string\",\n description:\n \"Ad group type — leave it out and Google derives it from the campaign's channel, which is required on a Demand Gen campaign (there is no Demand Gen ad group type). SEARCH_STANDARD | DISPLAY_STANDARD | SHOPPING_PRODUCT_ADS | VIDEO_*\",\n },\n \"cpc-bid\": { type: \"string\", description: \"Default CPC bid in major units\" },\n status: { type: \"string\" },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n campaign: args[\"campaign-ref\"],\n type: args.type,\n cpcBidMicros: microsFlag(args[\"cpc-bid\"], \"--cpc-bid\"),\n status: args.status,\n });\n await stageCreate(\"google.adGroup.create\", customerId, payload);\n },\n }),\n update: defineCommand({\n meta: {\n name: \"update\",\n description: `Stage a change to an existing ad group's name, default CPC bid or status. ${STAGED_WRITE}`,\n },\n args: {\n ...customerIdArg,\n ...targetArg(\"ad group\"),\n ...fileArg(\"google.adGroup.update\"),\n name: { type: \"string\", description: \"New ad group name, unique within its campaign\" },\n \"cpc-bid\": { type: \"string\" },\n status: { type: \"string\" },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const target = requireTarget(args, \"ad group\");\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n cpcBidMicros: microsFlag(args[\"cpc-bid\"], \"--cpc-bid\"),\n status: args.status,\n });\n await stageUpdate(\"google.adGroup.update\", customerId, target, payload);\n },\n }),\n pause: statusCommand(\"google.adGroup.pause\", \"ad group\"),\n resume: statusCommand(\"google.adGroup.resume\", \"ad group\"),\n remove: statusCommand(\"google.adGroup.remove\", \"ad group\"),\n },\n});\n\n// --- Keywords ---\n\n/**\n * Kill nudge: keyword performance is per ad group, and a keyword's criterion id comes from its text\n * + match type — so every copy of the same keyword across ad groups carries the SAME id. Read the\n * numbers at campaign level (or summed by keyword text) and the aggregate blends the copy holding\n * the history with the copies that never served, so the cleanup pauses whichever copy sorts first.\n * That is how a real cleanup paused the winning copy of 9 keywords and stranded 44 rows of history.\n */\nconst KEYWORD_KILL_HINTS = [\n \"Keyword metrics are per ad group. Decide this from keyword_view rows carrying ad_group.id + ad_group_criterion.criterion_id (`--preset keyword-analysis` returns both) — never from campaign totals or metrics summed across ad groups.\",\n \"The same keyword text in several ad groups shares ONE criterion id, so an aggregate blends the copy that holds the history with the copies that never served. Compare the copies row by row and keep the one with the impressions/conversions; if the keyword is duplicated and only one copy performs, pause the others, not it.\",\n];\n\n/**\n * Only a pause/removal can strand a keyword's history — a bid or URL edit leaves it serving.\n * Negatives deliberately get no equivalent hint: a negative blocks traffic rather than earning it,\n * so it carries no per-copy conversion history to weigh, and removing one only widens reach.\n * Upper-casing here is belt-and-braces, not a divergence from the payload: `keywordUpdateSchema`\n * is a case-sensitive `z.enum([\"ENABLED\",\"PAUSED\",\"REMOVED\"])` (Google's own enum casing) and\n * `stageGoogleOp` parses before it stages, so a lowercase `--status paused` fails validation and\n * never reaches the draft, the backend, or Google.\n */\nexport function keywordKillHints(status: unknown): string[] {\n const kills = typeof status === \"string\" && [\"PAUSED\", \"REMOVED\"].includes(status.toUpperCase());\n return kills ? KEYWORD_KILL_HINTS : [];\n}\n\n/**\n * A keyword-level final URL overrides the ad's landing page for every click on that keyword, and\n * `--final-url` applies to the whole batch — so the same URL stamped on 20 keywords says nothing the\n * ad doesn't already say, while making 20 rows of the change review look like 20 deliberate routing\n * decisions. Keep it only where THIS keyword must land somewhere the ad doesn't.\n */\nexport function keywordFinalUrlHints(finalUrl: unknown, count: number): string[] {\n if (typeof finalUrl !== \"string\" || finalUrl.length === 0) {\n return [];\n }\n return count > 1\n ? [\n `--final-url applied the same landing page to all ${count} keywords — the flag has no per-keyword form. A keyword-level URL only earns its place when that keyword must land somewhere the ad doesn't, so one URL shared by every keyword belongs on the ad instead: set the ad's final URL to this page and re-stage the keywords without --final-url. Keep it only if this page is genuinely each keyword's own destination and not the ad's.`,\n ]\n : [\n \"Keep --final-url only if this keyword's destination differs from the ad's final URL — otherwise drop it and let the keyword inherit the ad's landing page.\",\n ];\n}\n\n/**\n * `--final-url` / `--clear-final-url` on a keyword update → the staged `finalUrls`.\n *\n * The clear is the point: Google replaces the set wholesale, so an empty array is what sends a\n * keyword back to inheriting the ad's landing page. Without it, undoing a keyword-level URL —\n * the misuse `keywordFinalUrlHints` exists to catch — costs the keyword its whole history,\n * because remove + re-add is a new criterion to Google.\n */\nexport function keywordUpdateFinalUrls(args: Record<string, unknown>): string[] | undefined {\n const finalUrl = args[\"final-url\"];\n const clear = args[\"clear-final-url\"] === true;\n if (typeof finalUrl !== \"string\" || finalUrl.length === 0) {\n return clear ? [] : undefined;\n }\n if (clear) {\n failWriteValidation(\n \"--clear-final-url sends the keyword back to the ad's landing page — pass it OR --final-url, not both\",\n );\n }\n return [finalUrl];\n}\n\n/** Keyword write subcommands — merged into the existing read `keywords` command in the index. */\nexport const keywordWriteSubcommands = {\n add: defineCommand({\n meta: { name: \"add\", description: \"Add keyword(s) to an ad group — one --text or a whole batch\" },\n args: {\n ...customerIdArg,\n \"ad-group-ref\": { type: \"string\" as const, description: \"Ad group ref (g_temp_*, id, or resource name)\" },\n text: {\n type: \"string\" as const,\n description: 'Keyword text — comma-separate for a batch, optional \":EXACT|:PHRASE|:BROAD\" suffix per entry',\n },\n file: { type: \"string\" as const, description: \"Text file with one keyword[:MATCH_TYPE] per line\" },\n \"match-type\": { type: \"string\" as const, description: \"Default match type: EXACT | PHRASE | BROAD\" },\n \"cpc-bid\": { type: \"string\" as const, description: \"Keyword CPC bid in major units (applies to all)\" },\n \"final-url\": {\n type: \"string\" as const,\n description:\n \"Rarely needed: send THIS keyword to a page the ad doesn't go to. Applies to every keyword in the call, so leave it unset unless the destination is keyword-specific — otherwise set the ad's final URL\",\n },\n },\n run: async ({ args, rawArgs }) => {\n const customerId = requireCustomerId(args);\n const adGroup = requireStringFlag(args[\"ad-group-ref\"], \"--ad-group-ref\");\n const cpcBidMicros = microsFlag(args[\"cpc-bid\"], \"--cpc-bid\");\n const finalUrls = args[\"final-url\"] ? [args[\"final-url\"]] : undefined;\n const entries = keywordEntries(args, rawArgs);\n await stageGoogleOps(\n entries.map((entry) => ({\n kind: \"google.keyword.add\",\n customerId,\n payload: { adGroup, text: entry.text, matchType: entry.matchType, cpcBidMicros, finalUrls },\n })),\n keywordFinalUrlHints(args[\"final-url\"], entries.length),\n );\n },\n }),\n update: defineCommand({\n meta: {\n name: \"update\",\n description:\n \"Update one keyword's bid, status or final URL. Many keywords? `keywords pause|resume` take a list, and `baker ads google draft stage --file` stages any mix of updates in one call.\",\n },\n args: {\n ...customerIdArg,\n ...targetArg(\"keyword\"),\n \"cpc-bid\": { type: \"string\" as const },\n status: { type: \"string\" as const },\n \"final-url\": {\n type: \"string\" as const,\n description:\n \"Rarely needed: send THIS keyword to a page the ad doesn't go to. Leave unset unless the destination is keyword-specific — otherwise set the ad's final URL\",\n },\n \"clear-final-url\": {\n type: \"boolean\" as const,\n description: \"Drop this keyword's own landing page so it inherits the ad's again\",\n },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const finalUrls = keywordUpdateFinalUrls(args);\n await stageUpdate(\n \"google.keyword.update\",\n customerId,\n requireTarget(args, \"keyword\"),\n { cpcBidMicros: microsFlag(args[\"cpc-bid\"], \"--cpc-bid\"), status: args.status, finalUrls },\n [...keywordKillHints(args.status), ...keywordFinalUrlHints(args[\"final-url\"], 1)],\n );\n },\n }),\n remove: statusCommand(\"google.keyword.remove\", \"keyword\", KEYWORD_KILL_HINTS),\n pause: keywordStatusCommand(\"pause\", \"PAUSED\"),\n resume: keywordStatusCommand(\"resume\", \"ENABLED\"),\n};\n\n/**\n * `keywords pause|resume`: one keyword or hundreds in one call. A keyword has no pause kind of its own\n * — it is a status update — so each target stages a `google.keyword.update` with only the status.\n */\nfunction keywordStatusCommand(verb: \"pause\" | \"resume\", status: \"PAUSED\" | \"ENABLED\") {\n return defineCommand({\n meta: {\n name: verb,\n description: `${verb === \"pause\" ? \"Pause\" : \"Resume\"} keyword(s) — every target in ONE call. Start here:\n baker ads google keywords ${verb} customers/1234567890/adGroupCriteria/111~222 customers/1234567890/adGroupCriteria/111~333 --customer-id 1234567890\n baker ads google keywords ${verb} --file keywords.txt --customer-id 1234567890 # one resource name per line, up to 500\nTake each keyword's resource name (adGroupId~criterionId) from \\`--preset keyword-analysis\\` rows — the same text in another ad group is a different keyword. ${STAGED_WRITE}`,\n },\n args: {\n ...customerIdArg,\n id: { type: \"positional\", description: \"Keyword resource name(s) — several allowed\", required: false },\n file: { type: \"string\", description: \"Text file with one keyword resource name per line\" },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageGoogleOps(\n targetEntries(args, \"keyword\").map((target) => ({\n kind: \"google.keyword.update\",\n customerId,\n target,\n payload: { status },\n })),\n keywordKillHints(status),\n );\n },\n });\n}\n\n/**\n * Coverage pre-check nudge (BAKER-127): before recommending a search term to waste, confirm it\n * isn't already blocked by an existing negative — including shared negative lists, which the plain\n * `negative-keywords` preset can't see. If a term is already covered but still surfaces, that's the\n * finding to explain (list not attached here, or a narrower match type), not another duplicate negative.\n */\nconst NEGATIVE_COVERAGE_HINTS = [\n \"Before publishing, confirm each term isn't already blocked: run `baker ads google query --preset negative-keyword-lists` (shared-list terms) and `--preset negative-keywords` (campaign/ad-group negatives).\",\n \"If a term is already in a negative list but still shows in search terms, the list likely isn't attached to this campaign (check `--preset negative-list-attachments`) or its match type is narrower than the query — explain that instead of staging a duplicate negative.\",\n];\n\nconst negativeKeywordsCommand = defineCommand({\n meta: {\n name: \"negative-keywords\",\n description:\n \"Stage negative keyword add/update/remove (ad-group or campaign level) — update changes text or match type\",\n },\n subCommands: {\n add: defineCommand({\n meta: { name: \"add\", description: \"Add negative keyword(s) — one --text or a whole batch\" },\n args: {\n ...customerIdArg,\n level: { type: \"string\", description: \"adGroup | campaign\" },\n \"parent-ref\": { type: \"string\", description: \"Ad group or campaign ref\" },\n text: {\n type: \"string\",\n description: 'Keyword text — comma-separate for a batch, optional \":MATCH_TYPE\" suffix per entry',\n },\n file: { type: \"string\", description: \"Text file with one keyword[:MATCH_TYPE] per line\" },\n \"match-type\": { type: \"string\", description: \"Default match type: EXACT | PHRASE | BROAD\" },\n },\n run: async ({ args, rawArgs }) => {\n const customerId = requireCustomerId(args);\n const level = requireStringFlag(args.level, \"--level\");\n const parent = requireStringFlag(args[\"parent-ref\"], \"--parent-ref\");\n await stageGoogleOps(\n keywordEntries(args, rawArgs).map((entry) => ({\n kind: \"google.negativeKeyword.add\",\n customerId,\n payload: { level, parent, text: entry.text, matchType: entry.matchType },\n })),\n NEGATIVE_COVERAGE_HINTS,\n );\n },\n }),\n update: defineCommand({\n meta: {\n name: \"update\",\n description:\n \"Change a negative keyword's text or match type. Start here: `negative-keywords update customers/<cid>/adGroupCriteria/<adGroupId>~<criterionId> --match-type PHRASE`. Google never edits either on a live negative, so this publishes as a replace — the new negative added and the old one removed together, all or nothing. The field you leave out keeps its live value. Read them with `baker ads google negative-keywords list`.\",\n },\n args: {\n ...customerIdArg,\n id: {\n type: \"positional\",\n description:\n \"customers/…/adGroupCriteria/{adGroupId}~{criterionId} or campaignCriteria/{campaignId}~{criterionId}\",\n required: false,\n },\n text: { type: \"string\", description: \"The new text\" },\n \"match-type\": { type: \"string\", description: \"EXACT | PHRASE | BROAD\" },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const payload = {\n ...(args.text !== undefined ? { text: args.text } : {}),\n ...(args[\"match-type\"] !== undefined ? { matchType: args[\"match-type\"] } : {}),\n };\n if (Object.keys(payload).length === 0) {\n failWriteValidation(\"pass --text and/or --match-type\");\n }\n await stageUpdate(\n \"google.negativeKeyword.update\",\n customerId,\n requireTarget(args, \"negative keyword\"),\n payload,\n );\n },\n }),\n remove: statusCommand(\"google.negativeKeyword.remove\", \"negative keyword\", [\n \"Pass the full resource name — customers/{cid}/campaignCriteria/{campaignId}~{criterionId} or …/adGroupCriteria/{adGroupId}~{criterionId}, read from the row's resource_name; a bare id is refused. A shared keyword list's member (…/sharedCriteria/{listId}~{criterionId}) is staged as a removal from that list, which every campaign the list covers loses.\",\n ]),\n },\n});\n\n// --- Keyword lists (shared sets) ---\n\nconst keywordListsCommand = defineCommand({\n meta: {\n name: \"keyword-lists\",\n description:\n \"Stage shared lists — negative keyword lists, placement exclusion lists (sites, apps, YouTube) and brand lists (create/rename/delete a list; add/remove its members; attach/detach a keyword or placement list on a campaign — a brand list goes on a campaign as a `brandList` criterion).\",\n },\n subCommands: {\n create: defineCommand({\n meta: {\n name: \"create\",\n description:\n \"Stage a new shared list — negative keywords (default), placement exclusions, account-level negative keywords or brands (--type). Applies when the chat is published; returns a temp ref to pass as --list-ref to `keyword-lists add` and `attach`.\",\n },\n args: {\n ...customerIdArg,\n name: { type: \"string\", description: \"List name (required)\" },\n type: {\n type: \"string\",\n description:\n \"NEGATIVE_KEYWORDS (default) | NEGATIVE_PLACEMENTS (sites, apps, YouTube to exclude) | ACCOUNT_LEVEL_NEGATIVE_KEYWORDS (applied with `account-exclusions add`) | BRANDS (a brand list for brand exclusions / AI Max)\",\n },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageCreate(\"google.sharedSet.create\", customerId, {\n name: requireStringFlag(args.name, \"--name\"),\n type: args.type,\n });\n },\n }),\n add: defineCommand({\n meta: {\n name: \"add\",\n description:\n 'Add members to a shared list — keywords to a negative keyword list (--text / --file), or sites, apps and YouTube to a NEGATIVE_PLACEMENTS list (--placement, --app, --youtube-channel, --youtube-video) and brands to a BRANDS list (--brand). Start here: `keyword-lists add --list-ref <list> --placement \"example.com,spam-site.net\"`. A member the list type cannot hold is refused at staging.',\n },\n args: {\n ...customerIdArg,\n \"list-ref\": { type: \"string\", description: \"Shared set ref\" },\n text: {\n type: \"string\",\n description: 'Keyword text — comma-separate for a batch, optional \":MATCH_TYPE\" suffix per entry',\n },\n file: { type: \"string\", description: \"Text file with one keyword[:MATCH_TYPE] per line\" },\n \"match-type\": { type: \"string\", description: \"Default match type: EXACT | PHRASE | BROAD\" },\n ...LIST_MEMBER_ARGS,\n },\n run: async ({ args, rawArgs }) => {\n const customerId = requireCustomerId(args);\n const sharedSet = requireStringFlag(args[\"list-ref\"], \"--list-ref\");\n const criteria = listMemberCriteria(args);\n const keywords =\n criteria.length > 0 && args.text === undefined && args.file === undefined\n ? []\n : keywordEntries(args, rawArgs);\n await stageGoogleOps([\n ...keywords.map((entry) => ({\n kind: \"google.sharedSetMember.add\",\n customerId,\n payload: { sharedSet, text: entry.text, matchType: entry.matchType },\n })),\n ...criteria.map((criterion) => ({\n kind: \"google.sharedSetMember.add\",\n customerId,\n payload: { sharedSet, criterion },\n })),\n ]);\n },\n }),\n attach: defineCommand({\n meta: { name: \"attach\", description: \"Attach a keyword list to a campaign\" },\n args: { ...customerIdArg, \"campaign-ref\": { type: \"string\" }, \"list-ref\": { type: \"string\" } },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageCreate(\"google.campaignSharedSet.attach\", customerId, {\n campaign: requireStringFlag(args[\"campaign-ref\"], \"--campaign-ref\"),\n sharedSet: requireStringFlag(args[\"list-ref\"], \"--list-ref\"),\n });\n },\n }),\n remove: defineCommand({\n meta: {\n name: \"remove\",\n description: `Take term(s) out of a shared negative keyword list — every campaign the list covers stops excluding them. Start here:\n baker ads google keyword-lists remove --list-ref 1234 --text \"free,jobs:EXACT\" --customer-id 1234567890\n baker ads google keyword-lists remove --list-ref 1234 --file terms.txt --customer-id 1234567890 # one term[:MATCH_TYPE] per line\nBaker reads the list and finds each term (no :MATCH_TYPE = every match type of it); a term the list does not hold is reported, not staged. Members named directly also work: their resource name (customers/{cid}/sharedCriteria/{listId}~{criterionId}), listId~criterionId, or a criterion id. ${STAGED_WRITE}`,\n },\n args: {\n ...customerIdArg,\n \"list-ref\": { type: \"string\", description: \"The list's id or customers/{cid}/sharedSets/{id}\" },\n text: { type: \"string\", description: 'Terms to take out — comma-separated, optional \":MATCH_TYPE\" each' },\n file: { type: \"string\", description: \"Text file with one term[:MATCH_TYPE] per line\" },\n id: {\n type: \"positional\",\n description: \"Member resource name(s), listId~criterionId or criterion id(s) — instead of --text\",\n required: false,\n },\n },\n run: async ({ args, rawArgs }) => {\n const customerId = requireCustomerId(args);\n const listId = listIdOf(requireStringFlag(args[\"list-ref\"], \"--list-ref\"));\n const terms = [\n ...repeatedValues(rawArgs, \"text\", args.text).flatMap((v) => v.split(\",\")),\n ...(typeof args.file === \"string\" && args.file.length > 0 ? fileLines(args.file) : []),\n ]\n .map((v) => v.trim())\n .filter(Boolean);\n const direct = (Array.isArray(args._) ? args._ : [])\n .filter((v): v is string => typeof v === \"string\")\n .flatMap((v) => v.split(\",\"))\n .map((v) => v.trim())\n .filter(Boolean)\n .map((v) => memberTarget(customerId, listId, v));\n if (terms.length === 0 && direct.length === 0) {\n failWriteValidation(\"pass the terms to take out with --text / --file, or the members' resource names\");\n }\n const found =\n terms.length > 0\n ? memberRemovals(await readListMembersOrExit(customerId, listId), terms)\n : { targets: [], missing: [] };\n const targets = [...new Set([...direct, ...found.targets])];\n if (targets.length === 0) {\n failWriteValidation(\n `list ${listId} holds none of: ${found.missing.join(\", \")} — nothing to remove. Read its terms with \\`baker ads google keyword-lists list --members --customer-id ${customerId}\\``,\n );\n }\n await stageGoogleOps(\n targets.map((target) => ({ kind: \"google.sharedSetMember.remove\", customerId, target })),\n [\n ...(found.missing.length > 0\n ? [\n `NOT STAGED — list ${listId} does not hold: ${found.missing.join(\", \")}. Nothing to remove for those; say so.`,\n ]\n : []),\n \"Every campaign this list is attached to stops excluding these terms once published — check `--preset negative-list-attachments` if the user should hear which.\",\n ],\n );\n },\n }),\n detach: statusCommand(\"google.campaignSharedSet.detach\", \"campaign shared set\"),\n rename: defineCommand({\n meta: {\n name: \"rename\",\n description: `Rename a keyword list (its type never changes). Start here:\n baker ads google keyword-lists rename 12263133655 --name \"Junk terms\" --customer-id 1234567890\nNames are unique in the account. ${STAGED_WRITE}`,\n },\n args: {\n ...customerIdArg,\n id: { type: \"positional\", description: \"The list's id or customers/{cid}/sharedSets/{id}\", required: false },\n name: { type: \"string\", description: \"New name — unique among the account's lists\" },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageUpdate(\"google.sharedSet.update\", customerId, requireTarget(args, \"keyword list\"), {\n name: requireStringFlag(args.name, \"--name\"),\n });\n },\n }),\n delete: defineCommand({\n meta: {\n name: \"delete\",\n description: `Remove a whole keyword list (to take terms OUT of a list, use \\`keyword-lists remove\\`). Start here:\n baker ads google keyword-lists delete 12263133655 --customer-id 1234567890\nGoogle refuses to remove a list that is still attached — to a campaign (even one removed in the same publish), to the whole account, or as a campaign's brand list: take it off in the same draft first (\\`keyword-lists detach\\`, \\`account-exclusions remove\\`, \\`campaign-criteria remove\\`) — staging refuses the delete until then, naming each one. Those campaigns stop excluding its terms; staging says how many. ${STAGED_WRITE}`,\n },\n args: {\n ...customerIdArg,\n id: { type: \"positional\", description: \"The list's id or customers/{cid}/sharedSets/{id}\", required: false },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageTarget(\"google.sharedSet.remove\", customerId, requireTarget(args, \"keyword list\"));\n },\n }),\n },\n});\n\n/** The list's members, or the read's failure as this command's own error envelope. */\nasync function readListMembersOrExit(customerId: string, listId: string): Promise<Array<Record<string, unknown>>> {\n try {\n return await readListMembers(customerId, listId);\n } catch (err) {\n handleGoogleError(err);\n }\n}\n\n// --- Ads ---\n\nfunction rsaContentFromFlags(args: Record<string, unknown>): Record<string, unknown> {\n const headlines = copyListFlag(args.headlines, \"headlines\");\n const descriptions = copyListFlag(args.descriptions, \"descriptions\");\n if (!headlines || !descriptions) {\n failWriteValidation(\"responsive search ads need --headlines and --descriptions, or use --file\");\n }\n const finalUrls = listFlag(args[\"final-url\"]);\n if (!finalUrls) {\n failWriteValidation(\"--final-url is required for a responsive search ad\");\n }\n return {\n format: \"responsiveSearch\",\n headlines: headlines.map((text) => ({ text })),\n descriptions: descriptions.map((text) => ({ text })),\n path1: args.path1,\n path2: args.path2,\n finalUrls,\n };\n}\n\n/**\n * Build a responsive display ad's content from flags, layered over any `--file` content (flags win).\n * A RDA's images are fields on the ad's own content — `--marketing-images`/`--square-marketing-images`/\n * `--logo-images` take comma-separated asset refs (the `g_temp_*` refs `ads google assets create` returns,\n * or real asset ids). Fields the flags don't cover fall through to `--file`; the backend schema validates.\n */\nexport function rdaContentFromFlags(args: Record<string, unknown>, base: unknown): Record<string, unknown> {\n const content: Record<string, unknown> = {\n format: \"responsiveDisplay\",\n ...(base !== null && typeof base === \"object\" && !Array.isArray(base) ? (base as Record<string, unknown>) : {}),\n };\n const headlines = copyListFlag(args.headlines, \"headlines\");\n if (headlines) {\n content.headlines = headlines.map((text) => ({ text }));\n }\n const descriptions = copyListFlag(args.descriptions, \"descriptions\");\n if (descriptions) {\n content.descriptions = descriptions.map((text) => ({ text }));\n }\n if (typeof args[\"long-headline\"] === \"string\") {\n content.longHeadline = { text: args[\"long-headline\"] };\n }\n if (typeof args[\"business-name\"] === \"string\") {\n content.businessName = args[\"business-name\"];\n }\n const finalUrls = listFlag(args[\"final-url\"]);\n if (finalUrls) {\n content.finalUrls = finalUrls;\n }\n const marketing = listFlag(args[\"marketing-images\"]);\n if (marketing) {\n content.marketingImageAssets = marketing;\n }\n const square = listFlag(args[\"square-marketing-images\"]);\n if (square) {\n content.squareMarketingImageAssets = square;\n }\n const logos = listFlag(args[\"logo-images\"]);\n if (logos) {\n content.logoImageAssets = logos;\n }\n return content;\n}\n\n/**\n * Video ad content from flags, layered over `--file` content (flags win). A YouTube video is not a\n * publishable Google Ads reference by itself — stage it as its own asset first\n * (`assets create --file '{\"type\":\"youtubeVideo\",\"youtubeVideoId\":\"…\"}'`), then reference the\n * returned ref here via `--video-assets` (comma-separated; real asset resource names also work).\n */\nexport function videoContentFromFlags(args: Record<string, unknown>, base: unknown): Record<string, unknown> {\n const content: Record<string, unknown> = {\n format: \"video\",\n ...(base !== null && typeof base === \"object\" && !Array.isArray(base) ? (base as Record<string, unknown>) : {}),\n };\n const videoAssets = listFlag(args[\"video-assets\"]);\n if (videoAssets) {\n content.videoAssets = videoAssets;\n }\n if (typeof args[\"business-name\"] === \"string\") {\n content.businessName = args[\"business-name\"];\n }\n const logoImages = listFlag(args[\"logo-image-assets\"]);\n if (logoImages) {\n content.logoImageAssets = logoImages;\n }\n const finalUrls = listFlag(args[\"final-url\"]);\n if (finalUrls) {\n content.finalUrls = finalUrls;\n }\n return content;\n}\n\n/**\n * Demand Gen ad content from flags, layered over `--file` content (flags win). Images are fields on\n * the ad's own content — `--image-assets`/`--square-image-assets`/`--logo-image-assets` take\n * comma-separated asset refs from `assets create`.\n */\nexport function demandGenContentFromFlags(args: Record<string, unknown>, base: unknown): Record<string, unknown> {\n const content: Record<string, unknown> = {\n format: \"demandGen\",\n ...(base !== null && typeof base === \"object\" && !Array.isArray(base) ? (base as Record<string, unknown>) : {}),\n };\n if (typeof args[\"ad-name\"] === \"string\") {\n content.name = args[\"ad-name\"];\n }\n const headlines = copyListFlag(args.headlines, \"headlines\");\n if (headlines) {\n content.headlines = headlines.map((text) => ({ text }));\n }\n const descriptions = copyListFlag(args.descriptions, \"descriptions\");\n if (descriptions) {\n content.descriptions = descriptions.map((text) => ({ text }));\n }\n if (typeof args[\"business-name\"] === \"string\") {\n content.businessName = args[\"business-name\"];\n }\n const finalUrls = listFlag(args[\"final-url\"]);\n if (finalUrls) {\n content.finalUrls = finalUrls;\n }\n const images = listFlag(args[\"image-assets\"]);\n if (images) {\n content.imageAssets = images;\n }\n const squareImages = listFlag(args[\"square-image-assets\"]);\n if (squareImages) {\n content.squareImageAssets = squareImages;\n }\n const logoImages = listFlag(args[\"logo-image-assets\"]);\n if (logoImages) {\n content.logoImageAssets = logoImages;\n }\n return content;\n}\n\n/**\n * Demand Gen VIDEO ad content from flags, layered over `--file` content (flags win). This is the\n * format of a `DEMAND_GEN_VIDEO_RESPONSIVE_AD` — the ad most Demand Gen spend actually runs through —\n * and it is separate from `demandGen` because only it has `--long-headlines`. Its videos, logos and\n * call-to-action buttons are asset refs from `assets create`; omit a list entirely to leave that\n * media untouched on an existing ad.\n */\nexport function demandGenVideoContentFromFlags(args: Record<string, unknown>, base: unknown): Record<string, unknown> {\n const content: Record<string, unknown> = {\n format: \"demandGenVideo\",\n ...(base !== null && typeof base === \"object\" && !Array.isArray(base) ? (base as Record<string, unknown>) : {}),\n };\n if (typeof args[\"ad-name\"] === \"string\") {\n content.name = args[\"ad-name\"];\n }\n const headlines = copyListFlag(args.headlines, \"headlines\");\n if (headlines) {\n content.headlines = headlines.map((text) => ({ text }));\n }\n const longHeadlines = copyListFlag(args[\"long-headlines\"], \"long-headlines\");\n if (longHeadlines) {\n content.longHeadlines = longHeadlines.map((text) => ({ text }));\n }\n const descriptions = copyListFlag(args.descriptions, \"descriptions\");\n if (descriptions) {\n content.descriptions = descriptions.map((text) => ({ text }));\n }\n if (typeof args[\"business-name\"] === \"string\") {\n content.businessName = args[\"business-name\"];\n }\n const finalUrls = listFlag(args[\"final-url\"]);\n if (finalUrls) {\n content.finalUrls = finalUrls;\n }\n const videos = listFlag(args[\"video-assets\"]);\n if (videos) {\n content.videoAssets = videos;\n }\n const logoImages = listFlag(args[\"logo-image-assets\"]);\n if (logoImages) {\n content.logoImageAssets = logoImages;\n }\n const callToActions = listFlag(args[\"call-to-action-assets\"]);\n if (callToActions) {\n content.callToActionAssets = callToActions;\n }\n return content;\n}\n\n/**\n * App ad content from flags, layered over `--file` content (flags win). An App campaign ad's images\n * and videos are fields on the ad's own content (`--image-assets` / `--video-assets`), not\n * campaign-level asset links — stage each one with `assets create` first and pass the `g_temp_*`\n * refs it returns. The field names are `images` / `youtubeVideos`: a Demand Gen name here is\n * rejected at stage time rather than dropped, so the assets can't vanish between staging and publish.\n */\nexport function appContentFromFlags(args: Record<string, unknown>, base: unknown): Record<string, unknown> {\n const content: Record<string, unknown> = {\n format: \"app\",\n ...(base !== null && typeof base === \"object\" && !Array.isArray(base) ? (base as Record<string, unknown>) : {}),\n };\n const headlines = copyListFlag(args.headlines, \"headlines\");\n if (headlines) {\n content.headlines = headlines.map((text) => ({ text }));\n }\n const descriptions = copyListFlag(args.descriptions, \"descriptions\");\n if (descriptions) {\n content.descriptions = descriptions.map((text) => ({ text }));\n }\n const images = listFlag(args[\"image-assets\"]);\n if (images) {\n content.images = images;\n }\n const videos = listFlag(args[\"video-assets\"]);\n if (videos) {\n content.youtubeVideos = videos;\n }\n return content;\n}\n\n/**\n * The content flags each format actually reads. A flag a format does not read is DROPPED by its\n * builder, and the command then reports a staged change that is missing the thing it was run for —\n * `--long-headlines` on `--format demandGen` staged the copy without them and said \"staged: true\".\n * Same failure the backend's strict content schemas exist to stop, one layer earlier and with the\n * format to switch to in the message.\n */\nconst FORMAT_CONTENT_FLAGS: Record<string, readonly string[]> = {\n responsiveSearch: [\"headlines\", \"descriptions\", \"path1\", \"path2\", \"final-url\"],\n responsiveDisplay: [\n \"headlines\",\n \"descriptions\",\n \"long-headline\",\n \"business-name\",\n \"final-url\",\n \"marketing-images\",\n \"square-marketing-images\",\n \"logo-images\",\n ],\n video: [\"video-assets\", \"business-name\", \"logo-image-assets\", \"final-url\"],\n demandGen: [\n \"ad-name\",\n \"headlines\",\n \"descriptions\",\n \"business-name\",\n \"final-url\",\n \"image-assets\",\n \"square-image-assets\",\n \"logo-image-assets\",\n ],\n demandGenVideo: [\n \"ad-name\",\n \"headlines\",\n \"long-headlines\",\n \"descriptions\",\n \"business-name\",\n \"final-url\",\n \"video-assets\",\n \"logo-image-assets\",\n \"call-to-action-assets\",\n ],\n app: [\"headlines\", \"descriptions\", \"image-assets\", \"video-assets\"],\n // No copy at all: Google builds each product ad from the Merchant Center feed.\n shoppingProduct: [],\n};\n\n/** The format that DOES read a flag, so a refusal can name the way to get what was asked for. */\nfunction formatsReading(flag: string): string[] {\n return Object.entries(FORMAT_CONTENT_FLAGS)\n .filter(([, flags]) => flags.includes(flag))\n .map(([format]) => format);\n}\n\nexport function assertFlagsFitFormat(args: Record<string, unknown>, format: string): void {\n if (format === \"call\") {\n failWriteValidation(CALL_AD_RETIRED_MESSAGE);\n }\n const allowed = FORMAT_CONTENT_FLAGS[format];\n if (!allowed) {\n return;\n }\n const stray = Object.keys(adContentArgs).filter(\n (flag) => flag !== \"format\" && args[flag] !== undefined && !allowed.includes(flag),\n );\n if (stray.length === 0) {\n return;\n }\n const detail = stray\n .map((flag) => {\n const elsewhere = formatsReading(flag);\n return elsewhere.length > 0 ? `--${flag} (${elsewhere.join(\" / \")})` : `--${flag}`;\n })\n .join(\", \");\n failWriteValidation(\n `a ${format} ad has no ${stray.map((f) => `--${f}`).join(\", \")} — passing it here would stage the change without it. ` +\n `Formats that take it: ${detail}. Check the format with \\`baker ads google query \"SELECT ad_group_ad.ad.type FROM ad_group_ad WHERE ad_group_ad.ad.id = <id>\"\\`.`,\n );\n}\n\n/** Ad content from flags for the formats that support flag-building; other formats need `--file`. */\nfunction adContentFromFlags(args: Record<string, unknown>, format: string, fileContent: unknown): unknown {\n assertFlagsFitFormat(args, format);\n if (format === \"responsiveSearch\") {\n return fileContent ?? rsaContentFromFlags(args);\n }\n if (format === \"responsiveDisplay\") {\n return rdaContentFromFlags(args, fileContent);\n }\n if (format === \"video\") {\n return videoContentFromFlags(args, fileContent);\n }\n if (format === \"demandGen\") {\n return demandGenContentFromFlags(args, fileContent);\n }\n if (format === \"demandGenVideo\") {\n return demandGenVideoContentFromFlags(args, fileContent);\n }\n if (format === \"app\") {\n return appContentFromFlags(args, fileContent);\n }\n if (format === \"shoppingProduct\") {\n return { format: \"shoppingProduct\" };\n }\n return fileContent ?? failWriteValidation(`--format ${format} needs --file with the ad content`);\n}\n\n/** The ad-content flags, shared by `ads create` and `ads update` (an update replaces the whole content). */\nconst adContentArgs = {\n format: {\n type: \"string\",\n description:\n \"responsiveSearch (default) | responsiveDisplay | app | video | demandGen | demandGenVideo | shoppingProduct (a Shopping ad group's product ad — no copy flags)\",\n },\n headlines: {\n type: \"string\",\n description: `Headlines (RSA/RDA/demandGen/demandGenVideo/app) — ${AD_COPY_LIST_USAGE}`,\n },\n descriptions: {\n type: \"string\",\n description: `Descriptions (RSA/RDA/demandGen/demandGenVideo/app) — ${AD_COPY_LIST_USAGE}`,\n },\n path1: { type: \"string\" },\n path2: { type: \"string\" },\n \"long-headline\": { type: \"string\", description: \"Long headline (responsiveDisplay)\" },\n \"ad-name\": {\n type: \"string\",\n description:\n 'The ad\\'s own name, shown as \"Ad name\" in Google Ads. REQUIRED on a Demand Gen ad (demandGen/demandGenVideo) and on no other format',\n },\n \"long-headlines\": {\n type: \"string\",\n description: `Long headlines, up to 5 of 90 chars (demandGenVideo — no other format has them) — ${AD_COPY_LIST_USAGE}`,\n },\n \"business-name\": { type: \"string\", description: \"Business name (responsiveDisplay/demandGen/demandGenVideo/video)\" },\n \"marketing-images\": {\n type: \"string\",\n description: \"Comma-separated marketing image asset refs (responsiveDisplay)\",\n },\n \"square-marketing-images\": {\n type: \"string\",\n description: \"Comma-separated square marketing image asset refs (responsiveDisplay)\",\n },\n \"logo-images\": { type: \"string\", description: \"Comma-separated logo image asset refs (responsiveDisplay)\" },\n \"video-assets\": {\n type: \"string\",\n description:\n 'Comma-separated video asset refs (video/app/demandGenVideo formats) — stage the YouTube video as an asset first (assets create --file \\'{\"type\":\"youtubeVideo\",…}\\')',\n },\n \"image-assets\": { type: \"string\", description: \"Comma-separated image asset refs (demandGen/app)\" },\n \"square-image-assets\": { type: \"string\", description: \"Comma-separated square image asset refs (demandGen)\" },\n \"logo-image-assets\": {\n type: \"string\",\n description: \"Comma-separated logo image asset refs (demandGen/demandGenVideo/video)\",\n },\n \"call-to-action-assets\": {\n type: \"string\",\n description: \"Comma-separated callToAction asset refs for the ad's button (demandGenVideo)\",\n },\n \"final-url\": { type: \"string\", description: \"Comma-separated final URLs\" },\n} as const;\n\n/**\n * `--format` is what turns the content flags into a content payload, so without it they would be\n * silently dropped — with `--status` alongside, the command would stage a status-only op and report\n * success while the copy change vanished. Fail loudly instead, naming the flags that were ignored.\n */\nexport function assertNoContentFlags(args: Record<string, unknown>): void {\n const passed = Object.keys(adContentArgs).filter((flag) => flag !== \"format\" && args[flag] !== undefined);\n if (passed.length > 0) {\n failWriteValidation(\n `${passed.map((flag) => `--${flag}`).join(\", \")} only build an ad's content alongside --format (responsiveSearch | responsiveDisplay | app | video | demandGen | demandGenVideo | shoppingProduct) — add it, or pass --file with the complete content`,\n );\n }\n}\n\nconst adsCommand = defineCommand({\n meta: { name: \"ads\", description: \"Stage ad create/update/pause/resume/remove\" },\n subCommands: {\n create: defineCommand({\n meta: {\n name: \"create\",\n description:\n \"Stage an ad (responsive search via flags; other formats via --file). RSA needs 3–15 headlines and 2–4 descriptions — give Google 8–12 varied headlines to test, and stage 2–4 ads per ad group. Performance Max has no ad format of its own — stage its copy with `asset-groups create`.\",\n },\n args: {\n ...customerIdArg,\n ...fileArg(\"google.ad.create\"),\n \"ad-group-ref\": { type: \"string\", description: \"Ad group ref\" },\n ...adContentArgs,\n status: { type: \"string\" },\n },\n run: async ({ args: parsedArgs, rawArgs }) => {\n const args = withRepeatedCopyFlags(parsedArgs, rawArgs);\n const customerId = requireCustomerId(args);\n const file = loadJsonFileArg(args.file);\n const format = (args.format as string | undefined) ?? \"responsiveSearch\";\n const content = adContentFromFlags(args, format, file.content);\n await stageCreate(\n \"google.ad.create\",\n customerId,\n {\n adGroup: requireStringFlag((args[\"ad-group-ref\"] ?? file.adGroup) as string, \"--ad-group-ref\"),\n status: defaultAdStatus(format, args.status ?? file.status),\n content,\n },\n copyListSplitHints(args),\n );\n },\n }),\n update: defineCommand({\n meta: {\n name: \"update\",\n description:\n \"Stage an ad update. Any content change needs --format plus EVERY required field of that format (or --file with the complete content) — a field you send replaces its current value wholesale, so a list you pass must already include the entries you want to keep. Optional asset lists you omit entirely are left untouched on the ad. Status-only changes need neither --format nor content flags.\",\n },\n args: {\n ...customerIdArg,\n ...targetArg(\"ad\"),\n ...fileArg(\"google.ad.update\"),\n ...adContentArgs,\n status: { type: \"string\" },\n },\n run: async ({ args: parsedArgs, rawArgs }) => {\n const args = withRepeatedCopyFlags(parsedArgs, rawArgs);\n const customerId = requireCustomerId(args);\n const file = loadJsonFileArg(args.file);\n const format = args.format as string | undefined;\n if (!format) {\n assertNoContentFlags(args);\n }\n const payload = mergePayload(file, {\n status: args.status,\n ...(format ? { content: adContentFromFlags(args, format, file.content) } : {}),\n });\n await stageUpdate(\"google.ad.update\", customerId, requireTarget(args, \"ad\"), payload, [\n ...(payload.content !== undefined\n ? [\n \"Each content field you sent replaces its current value wholesale at publish — re-check that every headline, description, final URL and asset you want to KEEP is in this payload, not just the ones you changed.\",\n ]\n : []),\n ...(format ? copyListSplitHints(args) : []),\n ]);\n },\n }),\n pause: statusCommand(\"google.ad.pause\", \"ad\"),\n resume: statusCommand(\"google.ad.resume\", \"ad\"),\n remove: statusCommand(\"google.ad.remove\", \"ad\"),\n },\n});\n\n// --- Performance Max asset groups ---\n\n/**\n * A Performance Max asset group is its own entity, not an ad format (PMax has no ad groups —\n * `ads create --format performanceMaxAssetGroup` never existed as a buildable format). Publish\n * synthesizes text assets for each headline/longHeadline/description/businessName plus one\n * AssetGroupAsset link per asset; staging here only carries the group's copy + image refs.\n */\nconst assetGroupsCommand = defineCommand({\n meta: {\n name: \"asset-groups\",\n description: \"Stage Performance Max asset group create/update — the PMax campaign's copy and images.\",\n },\n subCommands: {\n create: defineCommand({\n meta: {\n name: \"create\",\n description:\n \"Stage a Performance Max asset group: 3–15 headlines (≤30ch), 1–5 long headlines (≤90ch), 2–5 descriptions (≤90ch), a business name, and image refs.\",\n },\n args: {\n ...customerIdArg,\n ...fileArg(\"google.assetGroup.create\"),\n \"campaign-ref\": {\n type: \"string\",\n description: \"Performance Max campaign ref (g_temp_*, id, or resource name)\",\n },\n name: { type: \"string\", description: \"Asset group name\" },\n \"final-urls\": { type: \"string\", description: \"Comma-separated final URLs\" },\n headlines: { type: \"string\", description: `Headlines (3–15, ≤30 chars) — ${AD_COPY_LIST_USAGE}` },\n \"long-headlines\": { type: \"string\", description: `Long headlines (1–5, ≤90 chars) — ${AD_COPY_LIST_USAGE}` },\n descriptions: { type: \"string\", description: `Descriptions (2–5, ≤90 chars) — ${AD_COPY_LIST_USAGE}` },\n \"business-name\": { type: \"string\" },\n \"image-assets\": { type: \"string\", description: \"Comma-separated marketing image asset refs (1.91:1)\" },\n \"square-image-assets\": {\n type: \"string\",\n description: \"Comma-separated square marketing image asset refs (1:1)\",\n },\n \"portrait-image-assets\": {\n type: \"string\",\n description: \"Comma-separated portrait marketing image asset refs (4:5)\",\n },\n \"logo-assets\": { type: \"string\", description: \"Comma-separated logo image asset refs\" },\n status: { type: \"string\", description: \"ENABLED | PAUSED (default PAUSED)\" },\n },\n run: async ({ args: parsedArgs, rawArgs }) => {\n const args = withRepeatedCopyFlags(parsedArgs, rawArgs);\n const customerId = requireCustomerId(args);\n const headlines = copyListFlag(args.headlines, \"headlines\");\n const longHeadlines = copyListFlag(args[\"long-headlines\"], \"long-headlines\");\n const descriptions = copyListFlag(args.descriptions, \"descriptions\");\n const payload = mergePayload(loadJsonFileArg(args.file), {\n campaign: args[\"campaign-ref\"],\n name: args.name,\n finalUrls: listFlag(args[\"final-urls\"]),\n headlines: headlines?.map((text) => ({ text })),\n longHeadlines: longHeadlines?.map((text) => ({ text })),\n descriptions: descriptions?.map((text) => ({ text })),\n businessName: args[\"business-name\"],\n imageAssets: listFlag(args[\"image-assets\"]),\n squareImageAssets: listFlag(args[\"square-image-assets\"]),\n portraitImageAssets: listFlag(args[\"portrait-image-assets\"]),\n logoAssets: listFlag(args[\"logo-assets\"]),\n status: args.status,\n });\n await stageCreate(\"google.assetGroup.create\", customerId, payload, [\n ...copyListSplitHints(args),\n \"Performance Max has no keywords: give this group its search themes (and its audience signal, when the account has one) with `baker ads google asset-group-signals add --asset-group <its ref>` in this same draft.\",\n ]);\n },\n }),\n update: defineCommand({\n meta: { name: \"update\", description: \"Stage a Performance Max asset group update\" },\n args: {\n ...customerIdArg,\n ...targetArg(\"asset group\"),\n ...fileArg(\"google.assetGroup.update\"),\n name: { type: \"string\" },\n \"final-urls\": { type: \"string\", description: \"Comma-separated final URLs\" },\n status: { type: \"string\", description: \"ENABLED | PAUSED | REMOVED\" },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const target = requireTarget(args, \"asset group\");\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n finalUrls: listFlag(args[\"final-urls\"]),\n status: args.status,\n });\n await stageUpdate(\"google.assetGroup.update\", customerId, target, payload);\n },\n }),\n attach: defineCommand({\n meta: {\n name: \"attach\",\n description:\n \"Add one existing asset to an existing asset group. Start here to refresh a live PMax group's creatives: attach the new image, then `detach` the old one — never detach first.\",\n },\n args: {\n ...customerIdArg,\n ...fileArg(\"google.assetGroupAsset.attach\"),\n \"asset-group-ref\": { type: \"string\", description: \"Asset group ref (g_temp_*, id, or resource name)\" },\n \"asset-ref\": { type: \"string\", description: \"Asset ref (g_temp_*, id, or resource name)\" },\n \"field-type\": {\n type: \"string\",\n description: `Slot the asset fills: ${ASSET_GROUP_ASSET_FIELD_TYPES.join(\" | \")}`,\n },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const payload = mergePayload(loadJsonFileArg(args.file), {\n assetGroup: args[\"asset-group-ref\"],\n asset: args[\"asset-ref\"],\n fieldType: args[\"field-type\"],\n });\n await stageCreate(\"google.assetGroupAsset.attach\", customerId, payload, [\n \"Swapping a creative? Stage the matching `asset-groups detach` for the image this one replaces — an attach alone grows the group instead of refreshing it.\",\n \"The field type must match the image's real ratio (1.91:1 → MARKETING_IMAGE, 1:1 → SQUARE_MARKETING_IMAGE, 4:5 → PORTRAIT_MARKETING_IMAGE); Google rejects a mismatch at publish.\",\n \"Slots have ceilings as well as minimums: BUSINESS_NAME and CALL_TO_ACTION_SELECTION hold 1, LOGO 5, LONG_HEADLINE and DESCRIPTION 5, HEADLINE 15, YOUTUBE_VIDEO 15, images 20. Staging counts what the group holds plus this chat's attaches and detaches, and refuses an attach to a full slot — stage the detach alongside it; removals are sent after additions. Replacing the business name (exactly 1): stage its detach first, then this attach.\",\n ]);\n },\n }),\n detach: statusCommand(\"google.assetGroupAsset.detach\", \"asset group asset\", [\n \"Replacing this image? Stage its `asset-groups attach` too — removals publish after every addition whatever order they are staged in, so the new image is in place before this one leaves and the group never drops below its per-ratio minimum.\",\n \"Pass the full composite resource name (customers/{cid}/assetGroupAssets/{assetGroupId}~{assetId}~{FIELD_TYPE}) — read it from `asset_group_asset.resource_name` via `ads google query`, scoping `asset_group_asset.status != 'REMOVED'`: the link carries its own status and Google returns an already-detached one like any other row.\",\n ]),\n },\n});\n\n// --- File-payload commands for the broader surface ---\n\n/**\n * What to do with an image asset once it is staged — fired here because this is the only command\n * that runs on the half of the job that works.\n *\n * Google splits an image extension in two: the upload is generally available, the link that makes it\n * serve is allowlisted. A production publish put six images into an advertiser's Google Ads asset\n * library and failed only the six links — and the agent, reading a refusal that said \"add them in\n * the Google Ads interface\", told the user to upload images they already had. So the hint lands on\n * the upload, names the one step Google keeps for itself, and asks for a Task so it is tracked.\n */\nexport function imageAssetHints(payload: Record<string, unknown>): string[] {\n if (payload.type !== \"image\") {\n return [];\n }\n return [\n \"This image publishes into the advertiser's Google Ads asset library. Stage the `assets attach` too, with field type AD_IMAGE on the campaign (or ad group) it belongs on: Google opens Search image links per account, so Baker asks Google as you stage — where the account takes them the link is staged and applies at publish, and where it does not the link is skipped and names the campaign in the handover Task.\",\n \"Until a link to it is staged, Baker keeps a Task for this image in this chat's changes — the user adding it to the campaign under Assets — and withdraws it when an accepted link names the image; do not stage a second one with `baker actions`. If that Task is still there after the attach, tell the user the images are already in their Google Ads account and only need adding to the campaign under Assets, and name them. Never tell them to upload images they already have. (A Performance Max asset group is different — images link there with `asset-groups attach`.)\",\n ];\n}\n\nconst assetsUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description:\n \"Update a staged or live asset in place (flat partial — set only the fields that changed). Works across asset types: sitelink (--link-text/--description1/--description2/--final-urls), callout (--callout-text), structured snippet (--header/--values), call-to-action (--cta), text (--text), or --name.\",\n },\n args: {\n ...customerIdArg,\n ...targetArg(\"asset\"),\n ...fileArg(\"google.asset.update\"),\n name: { type: \"string\", description: \"Asset display name\" },\n \"link-text\": { type: \"string\", description: \"Sitelink link text\" },\n description1: { type: \"string\", description: \"Sitelink description line 1\" },\n description2: { type: \"string\", description: \"Sitelink description line 2\" },\n \"final-urls\": { type: \"string\", description: \"Comma-separated sitelink final URLs\" },\n \"callout-text\": { type: \"string\", description: \"Callout text\" },\n header: { type: \"string\", description: \"Structured snippet header\" },\n values: { type: \"string\", description: \"Comma-separated structured snippet values (3-10, max 25 characters each)\" },\n cta: { type: \"string\", description: \"Call-to-action text\" },\n text: { type: \"string\", description: \"Text asset content\" },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const target = requireTarget(args, \"asset\");\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n linkText: args[\"link-text\"],\n description1: args.description1,\n description2: args.description2,\n finalUrls: listFlag(args[\"final-urls\"]),\n calloutText: args[\"callout-text\"],\n header: args.header,\n values: listFlag(args.values),\n callToAction: args.cta,\n text: args.text,\n });\n await stageUpdate(\"google.asset.update\", customerId, target, payload);\n },\n});\n\nconst assetsCommand = defineCommand({\n meta: {\n name: \"assets\",\n description:\n \"Stage asset create/update + asset-link attach/detach (via --file). For a high-performance Search campaign add ≥4 sitelinks, ≥3 callouts and ≥1 structured snippet per campaign. Image extensions: `create` uploads the image into the advertiser's account, then `attach` links it with field type AD_IMAGE (campaign or ad group). Google opens image links per account, so Baker asks Google as you stage: an account that takes them stages the link like a sitelink; one that does not skips it and stages a handover Task instead — never tell them to upload anything. The advertiser's logo links as BUSINESS_LOGO, at campaign or customer level, on a verified account.\",\n },\n subCommands: {\n create: fileCreateCommand(\n \"create\",\n \"google.asset.create\",\n \"Stage an asset (text/image/sitelink/callout/structuredSnippet/…)\",\n imageAssetHints,\n ),\n update: assetsUpdateCommand,\n attach: fileCreateCommand(\"attach\", \"google.assetLink.attach\", \"Attach an asset to a campaign/adGroup/customer\", [\n 'Search image extensions link as AD_IMAGE, at campaign or ad group level: `{\"level\":\"campaign\",\"parent\":\"<campaign id>\",\"asset\":\"<image asset id or g_temp_ ref>\",\"fieldType\":\"AD_IMAGE\"}`. Google opens these per advertiser account, so Baker asks Google (a check that changes nothing) as you stage. The image must be 1.91:1 or 1:1 — any other shape is sent back to crop. Accepted → the link is staged and applies at publish. Refused or not confirmed → it is skipped rather than stored, the rest of a batch is unaffected, and Baker stages the handover Task naming those images and that campaign; then tell the user they are already in their Google Ads account and only need adding to the campaign under Assets, and do not stage a second Task with `baker actions`. MARKETING_IMAGE / SQUARE_MARKETING_IMAGE are Performance Max asset-group slots (`asset-groups attach`), never a Search link. The advertiser\\'s logo links as `BUSINESS_LOGO` (campaign or customer level, on a verified account).',\n ]),\n detach: statusCommand(\"google.assetLink.detach\", \"asset link\", [\n \"Pass the resource name Google gave you — `SELECT campaign_asset.resource_name … FROM campaign_asset WHERE campaign_asset.status != 'REMOVED'` (or `ad_group_asset` / `customer_asset`) — never one composed out of an owner id and an asset id. A link's own status is not its campaign's and not its ad group's, so an inventory read scoped only to those lists extensions that are already detached, and a link between an asset and an owner that never held it parses fine and exists nowhere. Either way the target is read back before it is staged, and a detach of a link that is not there is refused here rather than at publish.\",\n ]),\n },\n});\n\nconst audienceModeArg = {\n mode: {\n type: \"string\" as const,\n description:\n \"observation = the audience only adjusts bids, reach is unchanged | targeting = the ads are shown only to people in the audiences attached to this campaign/ad group\",\n },\n};\n\n/**\n * The mode an audience op has to state, or the reason it cannot be guessed.\n *\n * There is no default here for the same reason `--biddable` has none: Google's API default is\n * `targeting`, its interface offers `observation`, and the difference between them is whether a\n * campaign keeps its audience or is cut down to the size of one remarketing list. A silent default\n * would pick that for the user; an unstated flag has to fail instead.\n */\nexport function requireAudienceMode(value: unknown): \"OBSERVATION\" | \"TARGETING\" {\n const mode = typeof value === \"string\" ? value.toLowerCase() : undefined;\n if (mode !== \"observation\" && mode !== \"targeting\") {\n failWriteValidation(\n `pass --mode observation (the audience adjusts bids and reach is unchanged — the Google Ads interface's default) or --mode targeting (the ads are shown only to people in the audiences on this campaign/ad group). There is no safe default: the API's own default is targeting, which can cut a campaign's reach to the size of the list.`,\n );\n }\n return mode === \"observation\" ? \"OBSERVATION\" : \"TARGETING\";\n}\n\nfunction requireAudienceLevel(value: unknown): \"campaign\" | \"adGroup\" {\n const level = requireStringFlag(value, \"--level\");\n if (level !== \"campaign\" && level !== \"adGroup\") {\n failWriteValidation(\"--level must be campaign or adGroup\");\n }\n return level;\n}\n\nconst AUDIENCE_ATTACH_HINTS = [\n 'Read back what the parent ended up with before you report: `baker ads google query \"SELECT campaign.id, campaign.targeting_setting.target_restrictions FROM campaign\"` (or the ad_group equivalent). A missing AUDIENCE row means TARGETING — Google does not serialize an empty setting, so absence is a value, not a gap.',\n \"Staging checks the list is big enough to serve on this campaign's network (100 active users on search, display and YouTube) and refuses a targeting attach that is not. It does NOT check delivery afterwards, and Google reports no error when an audience stops a campaign serving — after publishing, read the campaign's impressions for the hour that follows and say what you saw.\",\n];\n\nconst audiencesAttachCommand = defineCommand({\n meta: {\n name: \"attach\",\n description:\n \"Target or exclude an audience on a campaign or ad group — a list (--user-list), an interest or in-market segment (--interest) or a custom segment (--custom-segment). Start here: baker ads google audiences attach --customer-id 1234567890 --level campaign --parent 23837707642 --user-list 9398951971 --mode observation. `--mode` is required for a positive attach and decides whether the list only adjusts bids (observation) or narrows who sees the ads (targeting) — with --mode observation the audience setting is staged alongside the attach, because Google's API otherwise defaults to targeting.\",\n },\n args: {\n ...customerIdArg,\n ...fileArg(\"google.audienceCriterion.attach\"),\n ...audienceModeArg,\n level: { type: \"string\", description: \"campaign | adGroup\" },\n parent: { type: \"string\", description: \"Campaign or ad group id (or a g_temp_* ref staged earlier)\" },\n \"user-list\": { type: \"string\", description: \"User list id (or a g_temp_* ref from `audiences create`)\" },\n interest: {\n type: \"string\",\n description: \"Interest or in-market segment id (`user_interest.user_interest_id`) — instead of --user-list\",\n },\n \"custom-segment\": {\n type: \"string\",\n description: \"Custom segment id (`custom_audience.id`) built in Google Ads — instead of --user-list\",\n },\n negative: { type: \"boolean\", description: \"Exclude this audience instead of targeting it\" },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const payload = mergePayload(loadJsonFileArg(args.file), {\n level: args.level,\n parent: args.parent,\n userList: args[\"user-list\"],\n userInterest: args.interest,\n customAudience: args[\"custom-segment\"],\n negative: args.negative,\n });\n // An exclusion excludes whichever way the setting reads, so it has no mode to state — and\n // accepting one would suggest it did something.\n if (payload.negative === true) {\n if (args.mode !== undefined) {\n failWriteValidation(\n \"--mode does not apply to --negative: an excluded audience is excluded under both observation and targeting. Drop --mode, or drop --negative if you meant to target the list.\",\n );\n }\n await stageGoogleOp({ kind: \"google.audienceCriterion.attach\", customerId, payload });\n return;\n }\n const ops = audienceAttachOps(customerId, payload, requireAudienceMode(args.mode));\n await stageGoogleOps(ops, AUDIENCE_ATTACH_HINTS);\n },\n});\n\n/**\n * The ops a positive attach stages.\n *\n * Observation is a property of the campaign / ad group, not of the criterion, so it is its own op —\n * staged FIRST, so the review reads in the order the two things take effect, and so a parent that\n * is already in observation comes back as \"not staged\" rather than rewriting every targeting\n * dimension for nothing. Targeting mode stages the criterion alone for that same reason: the\n * account is probably already there (it is Google's API default), and stage time warns about what\n * the attach does to reach either way.\n */\nexport function audienceAttachOps(\n customerId: string,\n payload: Record<string, unknown>,\n mode: \"OBSERVATION\" | \"TARGETING\",\n): Array<Record<string, unknown>> {\n const attachOp = { kind: \"google.audienceCriterion.attach\", customerId, payload };\n if (mode === \"TARGETING\") {\n return [attachOp];\n }\n return [\n {\n kind: \"google.targetingSetting.set\",\n customerId,\n payload: { level: payload.level, parent: payload.parent, audience: \"OBSERVATION\" },\n },\n attachOp,\n ];\n}\n\nconst audiencesTargetingCommand = defineCommand({\n meta: {\n name: \"targeting\",\n description:\n \"Switch the audiences already on a campaign or ad group between observation (they adjust bids only) and targeting (the ads are shown only to people in them) — the Observation/Targeting selector in the Google Ads interface. Start here: baker ads google audiences targeting 195883284706 --customer-id 1234567890 --level adGroup --mode observation.\",\n },\n args: {\n ...customerIdArg,\n ...targetArg(\"campaign or ad group\"),\n ...audienceModeArg,\n level: { type: \"string\", description: \"campaign | adGroup\" },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const parent = requireTarget(args, \"campaign or ad group\");\n await stageGoogleOp({\n kind: \"google.targetingSetting.set\",\n customerId,\n payload: { level: requireAudienceLevel(args.level), parent, audience: requireAudienceMode(args.mode) },\n });\n },\n});\n\nconst audiencesCommand = defineCommand({\n meta: {\n name: \"audiences\",\n description:\n \"Stage audience (user list) create, criterion attach/detach, and the observation/targeting setting the criteria are read under\",\n },\n subCommands: {\n create: fileCreateCommand(\n \"create\",\n \"google.audience.create\",\n `Stage a user-list audience from --file. Each type carries what Google builds it from. Start here:\n website visitors {\"name\":\"Pricing visitors\",\"type\":\"RULE_BASED\",\"rule\":{\"include\":[{\"conditions\":[{\"operator\":\"CONTAINS\",\"value\":\"/pricing\"}],\"lookbackWindowDays\":30}],\"prefill\":true}}\n converters {\"name\":\"Buyers\",\"type\":\"BASIC\",\"conversionActions\":[\"<existing conversion action id>\"],\"membershipLifeSpanDays\":90}\n combined {\"name\":\"Visitors, not buyers\",\"type\":\"LOGICAL\",\"logic\":[{\"operator\":\"ANY\",\"audiences\":[\"<existing id>\"]},{\"operator\":\"NONE\",\"audiences\":[\"<existing id>\"]}]}\n lookalike {\"name\":\"Like buyers\",\"type\":\"LOOKALIKE\",\"lookalike\":{\"seedAudiences\":[\"<existing audience id>\"],\"expansion\":\"BALANCED\",\"countryCodes\":[\"ES\"]}} (Demand Gen only)\n customer list {\"name\":\"Customers\",\"type\":\"CRM_BASED\",\"members\":[{\"email\":\"…\"}]}`,\n ),\n attach: audiencesAttachCommand,\n detach: statusCommand(\"google.audienceCriterion.detach\", \"audience criterion\"),\n targeting: audiencesTargetingCommand,\n },\n});\n\n/**\n * A conversion action is PRIMARY (automated bidding optimizes toward it) or SECONDARY (reported\n * only). Nothing else in this surface moves spend by flipping one boolean, so both commands say\n * where the account stands afterwards rather than leaving the agent to assume.\n */\nconst PRIMARY_FOR_GOAL_QUERY =\n 'baker ads google query \"SELECT conversion_action.name, conversion_action.primary_for_goal, conversion_action.status FROM conversion_action\"';\n\nconst CONVERSION_CREATE_HINTS = [\n `A new conversion action is staged as SECONDARY (reported, not bid toward) unless the payload says \\`\"primaryForGoal\": true\\` — Google otherwise decides for you, and an accidentally-primary action redirects the spend of every Maximize Conversions / Target CPA campaign. Ask the user which they want rather than guessing.`,\n];\n\nconst CONVERSION_ROLE_HINTS = [\n `Primary actions are what Maximize Conversions / Target CPA campaigns bid toward. Before publishing, list what the account will be left with: ${PRIMARY_FOR_GOAL_QUERY} — and say so if this leaves no primary action, because bidding then has nothing to optimize toward.`,\n];\n\n/**\n * `--category` / `--origin` / `--biddable` → the account-level goal payload.\n *\n * Nothing here has a default. The pair is an ADDRESS — guessing it edits somebody else's goal — and\n * the decision moves what the whole account bids toward, so an unstated `--biddable` has to fail\n * rather than pick a direction. `--biddable false` is refused for the same reason `--primary false`\n * is: citty reads it as TRUE plus a stray word, which is the opposite of what was typed.\n */\nexport function conversionGoalFromFlags(args: Record<string, unknown>): Record<string, unknown> {\n const booleanWord = booleanWordPositionalError(args, \"conversion goal\");\n if (booleanWord) {\n failWriteValidation(booleanWord);\n }\n const category = requireStringFlag(args.category, \"--category\").toUpperCase();\n const origin = requireStringFlag(args.origin, \"--origin\").toUpperCase();\n if (typeof args.biddable !== \"boolean\") {\n failWriteValidation(\n \"pass --biddable (this conversion category drives automated bidding) or --no-biddable (it is measured only). There is no safe default — this changes what the whole account bids toward.\",\n );\n }\n if (!(CONVERSION_ACTION_CATEGORIES as readonly string[]).includes(category)) {\n failWriteValidation(`--category must be one of ${CONVERSION_ACTION_CATEGORIES.join(\" | \")}`);\n }\n if (!(CONVERSION_ORIGINS as readonly string[]).includes(origin)) {\n failWriteValidation(`--origin must be one of ${CONVERSION_ORIGINS.join(\" | \")}`);\n }\n return { category, origin, biddable: args.biddable };\n}\n\nconst CONVERSION_GOAL_QUERY =\n 'baker ads google query \"SELECT customer_conversion_goal.category, customer_conversion_goal.origin, customer_conversion_goal.biddable FROM customer_conversion_goal\"';\n\nconst CONVERSION_GOAL_HINTS = [\n `A conversion drives automated bidding only when BOTH halves are on: the action is primary (\\`conversions update --primary\\`) AND its category's account-level goal is included (this command). Before publishing, read back what the account will bid toward: ${CONVERSION_GOAL_QUERY} — and say plainly which conversions this leaves driving spend.`,\n];\n\nconst conversionsCommand = defineCommand({\n meta: {\n name: \"conversions\",\n description:\n \"Stage conversion action create/update (via --file), the account-level goal, and manual conversion uploads for a period where tracking was broken\",\n },\n subCommands: {\n upload: () => import(\"./conversion-upload-command.ts\").then((m) => m.conversionsUploadCommand),\n create: fileCreateCommand(\n \"create\",\n \"google.conversionAction.create\",\n \"Stage a conversion action (secondary unless the payload sets primaryForGoal)\",\n CONVERSION_CREATE_HINTS,\n ),\n update: defineCommand({\n meta: {\n name: \"update\",\n description:\n \"Stage a conversion action update. --primary makes it a primary action (automated bidding optimizes toward it); --no-primary demotes it to secondary (reported only).\",\n },\n args: {\n ...customerIdArg,\n ...targetArg(\"conversion action\"),\n ...fileArg(\"google.conversionAction.update\"),\n primary: {\n type: \"boolean\",\n // The spaced form is refused by `booleanWordPositionalError`, shared by every ad surface\n // and the source of truth for this — the description only states the forms that work.\n description:\n \"Primary action — automated bidding optimizes toward it. Demote to secondary (reported only) with --no-primary or --primary=false.\",\n },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const payload = mergePayload(loadJsonFileArg(args.file), { primaryForGoal: args.primary });\n await stageUpdate(\n \"google.conversionAction.update\",\n customerId,\n requireTarget(args, \"conversion action\"),\n payload,\n payload.primaryForGoal === undefined ? undefined : CONVERSION_ROLE_HINTS,\n );\n },\n }),\n goal: defineCommand({\n meta: {\n name: \"goal\",\n description:\n 'Stage the ACCOUNT-LEVEL conversion goal for one (category, origin) pair — Google Ads\\' \"Included in account-level goals\" switch. Start here when a conversion action is already Primary but bidding still ignores it: both halves have to be on. One command per pair. --biddable includes the category in bidding; --no-biddable measures it only.',\n },\n args: {\n ...customerIdArg,\n category: {\n type: \"string\",\n description: `Conversion category, e.g. PURCHASE, SUBMIT_LEAD_FORM, SIGNUP (${CONVERSION_ACTION_CATEGORIES.join(\" | \")})`,\n },\n origin: {\n type: \"string\",\n description: `Where the conversion happens (${CONVERSION_ORIGINS.join(\" | \")})`,\n },\n biddable: {\n type: \"boolean\",\n // The spaced form is refused by `booleanWordPositionalError` — the description only states\n // the forms that work.\n description:\n \"Include this category in the account's bidding goals. Exclude it (measured only, never bid toward) with --no-biddable or --biddable=false.\",\n },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageCreate(\"google.conversionAction.goal\", customerId, conversionGoalFromFlags(args), [\n ...CONVERSION_GOAL_HINTS,\n ]);\n },\n }),\n },\n});\n\nconst biddingStrategiesCommand = defineCommand({\n meta: {\n name: \"bidding-strategies\",\n description: \"Stage portfolio bidding strategy create/update (via --file) and remove\",\n },\n subCommands: {\n create: fileCreateCommand(\"create\", \"google.biddingStrategy.create\", \"Stage a portfolio bidding strategy\"),\n update: defineCommand({\n meta: { name: \"update\", description: \"Stage a portfolio bidding strategy update\" },\n args: { ...customerIdArg, ...targetArg(\"bidding strategy\"), ...fileArg(\"google.biddingStrategy.update\") },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageUpdate(\n \"google.biddingStrategy.update\",\n customerId,\n requireTarget(args, \"bidding strategy\"),\n loadJsonFileArg(args.file),\n );\n },\n }),\n remove: statusCommand(\"google.biddingStrategy.remove\", \"portfolio bid strategy\", [\n \"A portfolio can be removed only once no campaign bids with it: staging refuses it while one does, unless this draft removes those campaigns or moves them to their own bidding or another portfolio.\",\n ]),\n },\n});\n\n/** `labels attach` flags → a label attach payload: where (`--level`), on what (`--on`), which label. */\nexport function labelAttachFromFlags(args: Record<string, unknown>): Record<string, unknown> {\n return {\n level: requireStringFlag(args.level, \"--level\"),\n parent: requireStringFlag(args.on, \"--on\"),\n label: requireStringFlag(args[\"label-ref\"], \"--label-ref\"),\n };\n}\n\n/** `labels update` flags → the fields it changes; `--description \"\"` clears the description. */\nexport function labelUpdateFromFlags(args: Record<string, unknown>): Record<string, unknown> {\n return {\n name: args.name,\n backgroundColor: args[\"background-color\"],\n description: args.description,\n };\n}\n\nconst LABEL_LEVEL_HELP =\n \"campaign | adGroup | ad | keyword. An ad or keyword is named by its full resource name (customers/{cid}/adGroupAds/{adGroupId}~{adId}, customers/{cid}/adGroupCriteria/{adGroupId}~{criterionId}). Google has no labels on assets, and labels on the account itself come only from a manager account — both are refused.\";\n\nconst labelsCommand = defineCommand({\n meta: {\n name: \"labels\",\n description:\n \"Stage labels: create, update (name/colour/description), remove, attach to a campaign/ad group/ad/keyword, detach\",\n },\n subCommands: {\n create: defineCommand({\n meta: { name: \"create\", description: `Create a label. Names are unique in the account. ${STAGED_WRITE}` },\n args: {\n ...customerIdArg,\n name: { type: \"string\" },\n \"background-color\": { type: \"string\", description: \"Hex colour, e.g. #1A73E8\" },\n description: { type: \"string\" },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageCreate(\"google.label.create\", customerId, {\n name: requireStringFlag(args.name, \"--name\"),\n backgroundColor: args[\"background-color\"],\n description: args.description,\n });\n },\n }),\n update: defineCommand({\n meta: {\n name: \"update\",\n description: `Rename a label or change its colour or description. Start here:\n baker ads google labels update 22297940102 --name \"Q4 push\" --customer-id 1234567890\n\\`--description \"\"\\` clears the description. ${STAGED_WRITE}`,\n },\n args: {\n ...customerIdArg,\n id: { type: \"positional\", description: \"Label id or customers/{cid}/labels/{id}\", required: false },\n name: { type: \"string\", description: \"New name — unique in the account\" },\n \"background-color\": { type: \"string\", description: \"Hex colour, e.g. #1A73E8\" },\n description: { type: \"string\", description: 'New description (\"\" clears it)' },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageUpdate(\"google.label.update\", customerId, requireTarget(args, \"label\"), labelUpdateFromFlags(args));\n },\n }),\n remove: statusCommand(\"google.label.remove\", \"label\", [\n \"This removes the label itself — no need to detach it first. To take it off one thing only, use `labels detach <link resource name>`.\",\n ]),\n attach: defineCommand({\n meta: {\n name: \"attach\",\n description: `Put a label on a campaign, ad group, ad or keyword. Start here:\n baker ads google labels attach --level campaign --on 23456789 --label-ref g_temp_… --customer-id 1234567890\n baker ads google labels attach --level keyword --on customers/1234567890/adGroupCriteria/55~66 --label-ref 22297940102 --customer-id 1234567890\nMany at once: --file labels.json (a JSON array of {level, parent, label}). ${STAGED_WRITE}`,\n },\n args: {\n ...customerIdArg,\n ...fileBatchArg(\"google.label.attach\"),\n level: { type: \"string\", description: LABEL_LEVEL_HELP },\n on: {\n type: \"string\",\n description: \"What gets the label: campaign/ad group ref, or an ad's/keyword's resource name\",\n },\n \"label-ref\": {\n type: \"string\",\n description: \"The label: g_temp_* from `labels create`, its id, or resource name\",\n },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const payloads = args.file ? loadJsonPayloads(args.file) : [labelAttachFromFlags(args)];\n if (payloads.length > GOOGLE_DRAFT_BATCH_MAX) {\n failWriteValidation(\n `${payloads.length} payloads exceeds the batch limit of ${GOOGLE_DRAFT_BATCH_MAX} — split the file`,\n );\n }\n await stageGoogleOps(payloads.map((payload) => ({ kind: \"google.label.attach\", customerId, payload })));\n },\n }),\n detach: statusCommand(\"google.label.detach\", \"label link\", [\n 'A label link is named by what it sits on and the label: customers/{cid}/campaignLabels/{campaignId}~{labelId}, adGroupLabels/{adGroupId}~{labelId}, adGroupAdLabels/{adGroupId}~{adId}~{labelId} or adGroupCriterionLabels/{adGroupId}~{criterionId}~{labelId} — read it with `baker ads google query \"SELECT campaign_label.resource_name, label.name FROM campaign_label\"`.',\n ]),\n },\n});\n\nexport const googleWriteCommands = {\n account: accountCommand,\n budgets: budgetsCommand,\n campaigns: campaignsCommand,\n \"ad-groups\": adGroupsCommand,\n \"negative-keywords\": negativeKeywordsCommand,\n \"keyword-lists\": keywordListsCommand,\n ads: adsCommand,\n assets: assetsCommand,\n \"asset-groups\": assetGroupsCommand,\n audiences: audiencesCommand,\n conversions: conversionsCommand,\n \"bidding-strategies\": biddingStrategiesCommand,\n labels: labelsCommand,\n \"campaign-criteria\": campaignCriteriaCommand,\n \"ad-group-criteria\": adGroupCriteriaCommand,\n \"ad-group-bid-modifiers\": adGroupBidModifiersCommand,\n \"account-exclusions\": accountExclusionsCommand,\n \"asset-group-signals\": assetGroupSignalsCommand,\n};\n","import { repeatedFlagValues } from \"../../../lib/repeatedFlags.ts\";\nimport { AD_COPY_LIST_USAGE } from \"./copy-list-usage.ts\";\nimport { failWriteValidation } from \"./write-shared.ts\";\n\n/**\n * The list flags whose items are copy a person reads. Copy routinely contains commas, so a plain\n * `split(\",\")` turned \"Filter by lead type, status or charged only.\" into two descriptions and\n * staged them with no warning. Asset refs and URLs cannot hold a comma and keep `listFlag`.\n */\nexport const AD_COPY_LIST_FLAGS = [\"headlines\", \"descriptions\", \"long-headlines\"] as const;\n\ninterface CopyItem {\n text: string;\n /** Came out of an unquoted comma split, so it may be the tail of one item cut in two. */\n splitAtComma: boolean;\n}\n\nfunction skipBlanks(value: string, at: number): number {\n let i = at;\n while (value[i] === \" \" || value[i] === \"\\t\") i++;\n return i;\n}\n\n/** The quoted field opening at `value[open]`; `next` is the index just past its separating comma. */\nfunction readQuotedField(value: string, open: number, flag: string): { text: string; next: number } {\n let text = \"\";\n let j = open + 1;\n while (!(value[j] === '\"' && value[j + 1] !== '\"')) {\n if (j >= value.length) {\n failWriteValidation(`--${flag} has a quote with no closing quote: ${value} — ${AD_COPY_LIST_USAGE}`);\n }\n text += value[j];\n j += value[j] === '\"' ? 2 : 1;\n }\n const after = skipBlanks(value, j + 1);\n if (after < value.length && value[after] !== \",\") {\n failWriteValidation(\n `--${flag}: text follows the closing quote of \"${text}\" — a quoted item must end at a comma. To put a quote inside an item, double it (\"\") or ${AD_COPY_LIST_USAGE}`,\n );\n }\n return { text, next: after + 1 };\n}\n\n/** One comma-separated value, CSV-style: a field that starts with `\"` runs to its closing quote (`\"\"` escapes one). */\nfunction splitQuotedList(value: string, flag: string): CopyItem[] {\n const fields: Array<{ text: string; quoted: boolean }> = [];\n let i = 0;\n while (i <= value.length) {\n const start = skipBlanks(value, i);\n if (value[start] === '\"') {\n const { text, next } = readQuotedField(value, start, flag);\n fields.push({ text, quoted: true });\n i = next;\n } else {\n const comma = value.indexOf(\",\", start);\n const end = comma === -1 ? value.length : comma;\n fields.push({ text: value.slice(start, end), quoted: false });\n i = end + 1;\n }\n }\n const several = fields.length > 1;\n return fields.map((field) => ({ text: field.text.trim(), splitAtComma: several && !field.quoted }));\n}\n\n/** A value that is a JSON array of strings, or undefined — `[New] Same-day plumbing` is copy, not JSON. */\nfunction jsonStringArray(value: string): string[] | undefined {\n if (!value.startsWith(\"[\")) return undefined;\n try {\n const parsed: unknown = JSON.parse(value);\n return Array.isArray(parsed) && parsed.every((v) => typeof v === \"string\") ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction parseCopyList(value: unknown, flag: string): CopyItem[] | undefined {\n let items: CopyItem[];\n if (Array.isArray(value)) {\n items = value\n .filter((v): v is string => typeof v === \"string\")\n .map((v) => ({ text: v.trim(), splitAtComma: false }));\n } else if (typeof value === \"string\") {\n const trimmed = value.trim();\n const json = jsonStringArray(trimmed);\n items = json ? json.map((v) => ({ text: v.trim(), splitAtComma: false })) : splitQuotedList(trimmed, flag);\n } else {\n return undefined;\n }\n const kept = items.filter((item) => item.text.length > 0);\n return kept.length > 0 ? kept : undefined;\n}\n\n/**\n * The items of a copy list flag: one per repeated flag (already collected by `withRepeatedCopyFlags`),\n * a JSON array of strings, or a comma-separated list where a double-quoted item keeps its commas.\n */\nexport function copyListFlag(value: unknown, flag: string): string[] | undefined {\n return parseCopyList(value, flag)?.map((item) => item.text);\n}\n\n/**\n * `--descriptions \"- 10% off\"` reads as a flag with no value, so the item is dropped and the ad\n * stages short with `ok: true`. Copy often starts with a dash, so refuse it and name the form that\n * keeps it: the value joined to the flag with `=`.\n */\nfunction refuseDashLedValue(rawArgs: readonly string[], flag: string): void {\n for (let i = 0; i < rawArgs.length - 1; i++) {\n if (rawArgs[i] === \"--\") return;\n const value = rawArgs[i + 1];\n if (rawArgs[i] === `--${flag}` && value?.startsWith(\"-\")) {\n failWriteValidation(\n `--${flag} is followed by \"${value}\", which starts with a dash and is read as another flag, not as copy. Join copy that starts with a dash to its flag with =: --${flag}=\"${value}\"`,\n );\n }\n }\n}\n\n/**\n * `args` with every copy flag given more than once replaced by the array of its values. citty keeps\n * only a repeated flag's LAST value, so without this `--description a --description b` stages `b`.\n * A flag given once stays a string and is read as a list: one `--headlines \"a,b,c\"` is three items,\n * so a lone item with a comma has to be quoted or passed as a JSON array.\n */\nexport function withRepeatedCopyFlags<T extends Record<string, unknown>>(\n args: T,\n rawArgs: readonly string[] | undefined,\n): T {\n const out: Record<string, unknown> = { ...args };\n for (const flag of AD_COPY_LIST_FLAGS) {\n refuseDashLedValue(rawArgs ?? [], flag);\n const values = repeatedFlagValues(rawArgs ?? [], flag);\n if (values.length > 1) {\n out[flag] = values;\n }\n }\n return out as T;\n}\n\n/**\n * A comma split that left an item starting in lowercase almost always cut one sentence in two\n * (\"…by lead type\" + \"status or charged only.\"). It still stages — the split may be meant — but\n * says so, because the result is otherwise indistinguishable from success.\n */\nexport function copyListSplitHints(args: Record<string, unknown>): string[] {\n const hints: string[] = [];\n for (const flag of AD_COPY_LIST_FLAGS) {\n const items = parseCopyList(args[flag], flag) ?? [];\n const fragments = items.filter((item, index) => index > 0 && item.splitAtComma && /^\\p{Ll}/u.test(item.text));\n if (fragments.length > 0) {\n hints.push(\n `--${flag}: ${fragments.map((f) => `\"${f.text}\"`).join(\", \")} starts in lowercase — it looks like the end of one item cut at a comma. Check the staged copy; if it was one item, fix this op in place with \\`draft amend <ref>\\` (the ref this response returned) rather than staging it again, which would leave the cut copy staged too — ${AD_COPY_LIST_USAGE}.`,\n );\n }\n }\n return hints;\n}\n","/**\n * Flags for the settings a campaign type needs beyond the shared ones — a Shopping campaign's\n * Merchant Center feed, … — turned into the payload fields `campaigns create|update` stage.\n * The rules about which campaign type takes which setting live in `@baker/api/ads-google`\n * (`channel-settings.ts`); these only translate flags.\n */\nimport { repeatedValues } from \"../../../lib/repeatedFlags.ts\";\nimport { failWriteValidation } from \"./write-shared.ts\";\n\nfunction str(args: Record<string, unknown>, name: string): string | undefined {\n const value = args[name];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction bool(args: Record<string, unknown>, name: string): boolean | undefined {\n const value = args[name];\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction defined(entries: Record<string, unknown>): Record<string, unknown> | undefined {\n const kept = Object.entries(entries).filter(([, value]) => value !== undefined);\n return kept.length > 0 ? Object.fromEntries(kept) : undefined;\n}\n\nconst SHOPPING_PRIORITIES: Record<string, number> = { low: 0, medium: 1, high: 2 };\n\nexport const shoppingArgs = {\n \"merchant-id\": {\n type: \"string\" as const,\n description:\n \"Shopping / retail Performance Max: the Merchant Center account whose products the campaign advertises. It must be linked to the account — `baker ads google merchant-center list` shows the linked ones.\",\n },\n \"feed-label\": {\n type: \"string\" as const,\n description: 'Shopping / retail Performance Max: only products with this feed label (e.g. \"ES\").',\n },\n \"shopping-priority\": {\n type: \"string\" as const,\n description:\n \"Shopping only: low (default) | medium | high — which Shopping campaign wins when several advertise the same product.\",\n },\n \"local-inventory\": {\n type: \"boolean\" as const,\n description: \"Shopping only: also advertise products sold in nearby stores (local inventory ads).\",\n },\n};\n\n/** `--merchant-id --feed-label --shopping-priority --local-inventory` → `shoppingSetting`, or nothing. */\nexport function shoppingSettingFromFlags(args: Record<string, unknown>): Record<string, unknown> | undefined {\n const priority = str(args, \"shopping-priority\");\n const campaignPriority = priority === undefined ? undefined : SHOPPING_PRIORITIES[priority.toLowerCase()];\n if (priority !== undefined && campaignPriority === undefined) {\n failWriteValidation(\"--shopping-priority must be low, medium or high\");\n }\n return defined({\n merchantId: str(args, \"merchant-id\"),\n feedLabel: str(args, \"feed-label\"),\n campaignPriority,\n enableLocal: bool(args, \"local-inventory\"),\n });\n}\n\nexport const shoppingUpdateArgs = {\n \"merchant-id\": {\n type: \"string\" as const,\n description: \"Not changeable: a campaign keeps the Merchant Center account it was created with.\",\n },\n \"feed-label\": shoppingArgs[\"feed-label\"],\n \"clear-feed-label\": {\n type: \"boolean\" as const,\n description: \"Shopping / retail Performance Max: advertise every feed of the Merchant Center again.\",\n },\n \"shopping-priority\": shoppingArgs[\"shopping-priority\"],\n \"local-inventory\": {\n type: \"boolean\" as const,\n description:\n \"Shopping only: --local-inventory turns local inventory ads on, --local-inventory=false turns them off.\",\n },\n};\n\n/** `campaigns update` Shopping flags → `shoppingSetting`, or nothing. The Merchant Center is fixed. */\nexport function shoppingSettingUpdateFromFlags(args: Record<string, unknown>): Record<string, unknown> | undefined {\n if (str(args, \"merchant-id\") !== undefined) {\n failWriteValidation(\n \"A campaign keeps the Merchant Center account it was created with — Google does not move it. Create a new campaign on the other account instead.\",\n );\n }\n if (args[\"clear-feed-label\"] === true && str(args, \"feed-label\") !== undefined) {\n failWriteValidation(\"--clear-feed-label removes the feed label — pass it OR --feed-label, not both\");\n }\n const { merchantId: _fixed, ...rest } = shoppingSettingFromFlags(args) ?? {};\n return defined({ ...rest, ...(args[\"clear-feed-label\"] === true ? { feedLabel: \"\" } : {}) });\n}\n\nconst APP_STORES: Record<string, string> = { google: \"GOOGLE_APP_STORE\", apple: \"APPLE_APP_STORE\" };\n\n/** `--app-goal` words → Google's goal; Google's own value passes through. */\nconst APP_GOALS: Record<string, string> = {\n installs: \"OPTIMIZE_INSTALLS_TARGET_INSTALL_COST\",\n \"installs-volume\": \"OPTIMIZE_INSTALLS_WITHOUT_TARGET_INSTALL_COST\",\n \"in-app\": \"OPTIMIZE_IN_APP_CONVERSIONS_TARGET_CONVERSION_COST\",\n \"in-app-install-cost\": \"OPTIMIZE_IN_APP_CONVERSIONS_TARGET_INSTALL_COST\",\n value: \"OPTIMIZE_RETURN_ON_ADVERTISING_SPEND\",\n};\n\nexport const appArgs = {\n \"app-id\": {\n type: \"string\" as const,\n description:\n \"App campaigns (--channel-type MULTI_CHANNEL --sub-type APP_CAMPAIGN): the app's package name (Android, e.g. com.example.app) or numeric App Store id. Fixed once created.\",\n },\n \"app-store\": { type: \"string\" as const, description: \"App campaigns: google | apple\" },\n \"app-goal\": {\n type: \"string\" as const,\n description:\n \"App campaigns: installs (TARGET_CPA = target cost per install) | installs-volume (MAXIMIZE_CONVERSIONS) | in-app (TARGET_CPA per in-app conversion) | in-app-install-cost (TARGET_CPA per install, optimizing in-app) | value (TARGET_ROAS). Each goal takes the one bidding strategy in brackets.\",\n },\n \"app-conversions\": {\n type: \"string\" as const,\n description:\n \"App campaigns with an in-app or value goal: comma-separated ids of the APP's conversion actions to optimize toward (required for those goals).\",\n },\n};\n\n/** `--app-id --app-store --app-goal --app-conversions` → `appCampaignSetting` / `selectiveOptimization`. */\nexport function appSettingsFromFlags(args: Record<string, unknown>): Record<string, unknown> {\n const store = str(args, \"app-store\");\n const goal = str(args, \"app-goal\");\n const appStore = store === undefined ? undefined : (APP_STORES[store.toLowerCase()] ?? store.toUpperCase());\n const biddingStrategyGoalType =\n goal === undefined ? undefined : (APP_GOALS[goal.toLowerCase()] ?? goal.toUpperCase());\n const conversions = str(args, \"app-conversions\")\n ?.split(\",\")\n .map((id) => id.trim())\n .filter((id) => id.length > 0);\n const appCampaignSetting = defined({ appId: str(args, \"app-id\"), appStore, biddingStrategyGoalType });\n return {\n ...(appCampaignSetting ? { appCampaignSetting } : {}),\n ...(conversions && conversions.length > 0 ? { selectiveOptimization: { conversionActions: conversions } } : {}),\n };\n}\n\nexport const linkedAccountArgs = {\n \"travel-account-id\": {\n type: \"string\" as const,\n description: \"Travel campaigns (--channel-type TRAVEL): the travel account linked to this Google Ads account.\",\n },\n \"hotel-center-id\": {\n type: \"string\" as const,\n description: \"Hotel campaigns (--channel-type HOTEL): the Hotel Center account linked to this Google Ads account.\",\n },\n};\n\n/** `--travel-account-id` / `--hotel-center-id` → `travelCampaignSettings` / `hotelSetting`. */\nexport function linkedAccountFromFlags(args: Record<string, unknown>): Record<string, unknown> {\n const travel = str(args, \"travel-account-id\");\n const hotel = str(args, \"hotel-center-id\");\n return {\n ...(travel ? { travelCampaignSettings: { travelAccountId: travel } } : {}),\n ...(hotel ? { hotelSetting: { hotelCenterId: hotel } } : {}),\n };\n}\n\n/**\n * The status an `ads create` stages when none was given. An App ad cannot be created paused\n * (AD_TYPE_CANNOT_BE_PAUSED), so it is created enabled — its paused ad group and campaign keep it off.\n */\nexport function defaultAdStatus(format: string, status: unknown): unknown {\n if (status !== undefined) {\n return status;\n }\n return format === \"app\" ? \"ENABLED\" : undefined;\n}\n\nexport const dynamicSearchAdsArgs = {\n \"dsa-domain\": {\n type: \"string\" as const,\n description:\n \"Search: the site dynamic ads are built from, as a bare domain (withbaker.com — no https://, no path).\",\n },\n \"dsa-language\": {\n type: \"string\" as const,\n description: 'Search: the language of that site, Google\\'s lowercase code (\"en\", \"es\"; \"zh_CN\" with a region).',\n },\n \"dsa-supplied-urls-only\": {\n type: \"boolean\" as const,\n description: \"Search: build dynamic ads only from the pages a page feed lists, not the whole site.\",\n },\n};\n\n/** `--dsa-domain --dsa-language --dsa-supplied-urls-only` → `dynamicSearchAdsSetting`, or nothing. */\nexport function dynamicSearchAdsFromFlags(args: Record<string, unknown>): Record<string, unknown> | undefined {\n return defined({\n domainName: str(args, \"dsa-domain\"),\n languageCode: str(args, \"dsa-language\"),\n useSuppliedUrlsOnly: bool(args, \"dsa-supplied-urls-only\"),\n });\n}\n\nexport const frequencyCapArgs = {\n \"frequency-cap\": {\n type: \"string\" as const,\n description:\n 'Display (and existing Video): how often one person sees the ads — \"<cap>/<day|week|month>[/<campaign|ad-group|ad>][/<impressions|video-views>]\", e.g. --frequency-cap 3/day or --frequency-cap 10/week/ad-group. Repeat for several; the list REPLACES the campaign\\'s caps.',\n },\n \"clear-frequency-caps\": { type: \"boolean\" as const, description: \"Remove every frequency cap from the campaign.\" },\n};\n\nconst CAP_UNITS: Record<string, string> = { day: \"DAY\", week: \"WEEK\", month: \"MONTH\" };\nconst CAP_LEVELS: Record<string, string> = { campaign: \"CAMPAIGN\", \"ad-group\": \"AD_GROUP\", ad: \"AD_GROUP_AD\" };\nconst CAP_EVENTS: Record<string, string> = { impressions: \"IMPRESSION\", \"video-views\": \"VIDEO_VIEW\" };\n\nfunction parseCap(entry: string): Record<string, unknown> {\n const [count, unit, level = \"campaign\", event = \"impressions\"] = entry\n .split(\"/\")\n .map((part) => part.trim().toLowerCase());\n const cap = Number(count);\n const timeUnit = CAP_UNITS[unit ?? \"\"];\n if (!Number.isInteger(cap) || cap < 1 || !timeUnit || !CAP_LEVELS[level] || !CAP_EVENTS[event]) {\n failWriteValidation(\n `--frequency-cap \"${entry}\" must be <cap>/<day|week|month>[/<campaign|ad-group|ad>][/<impressions|video-views>] (e.g. 3/day)`,\n );\n }\n return { level: CAP_LEVELS[level], eventType: CAP_EVENTS[event], timeUnit, cap };\n}\n\n/** Every repeated `--frequency-cap`, or `[]` for `--clear-frequency-caps`, or nothing. */\nexport function frequencyCapsFromFlags(\n args: Record<string, unknown>,\n rawArgs: readonly string[] | undefined,\n): Array<Record<string, unknown>> | undefined {\n const entries = repeatedValues(rawArgs, \"frequency-cap\", args[\"frequency-cap\"]).filter((v) => v.length > 0);\n if (entries.length > 0 && args[\"clear-frequency-caps\"] === true) {\n failWriteValidation(\"--clear-frequency-caps removes every cap — pass it OR --frequency-cap, not both\");\n }\n if (entries.length === 0) {\n return args[\"clear-frequency-caps\"] === true ? [] : undefined;\n }\n return entries.map(parseCap);\n}\n\nexport const assetAutomationArgs = {\n \"generated-text\": {\n type: \"boolean\" as const,\n description:\n \"Performance Max: --generated-text lets Google write text from the landing page and assets; --generated-text=false stops it (needs --url-expansion=false with it).\",\n },\n \"url-expansion\": {\n type: \"boolean\" as const,\n description:\n \"Performance Max: --url-expansion=false keeps every click on the asset groups' final URLs; --url-expansion lets Google send traffic to the most relevant page of the site.\",\n },\n \"video-enhancement\": {\n type: \"boolean\" as const,\n description: \"Performance Max: Google makes enhanced versions of the campaign's YouTube videos (=false stops it).\",\n },\n \"image-enhancement\": {\n type: \"boolean\" as const,\n description: \"Performance Max: Google enhances the campaign's images (=false stops it).\",\n },\n \"image-extraction\": {\n type: \"boolean\" as const,\n description: \"Performance Max: Google takes images from the landing page (=false stops it).\",\n },\n \"image-design-versions\": {\n type: \"boolean\" as const,\n description: \"Performance Max: Google makes new designs from the campaign's images (=false stops it).\",\n },\n};\n\n/** The generated-asset switches → `assetAutomation`, or nothing. */\nexport function assetAutomationFromFlags(args: Record<string, unknown>): Record<string, unknown> | undefined {\n return defined({\n textAssets: bool(args, \"generated-text\"),\n finalUrlExpansion: bool(args, \"url-expansion\"),\n videoEnhancement: bool(args, \"video-enhancement\"),\n imageEnhancement: bool(args, \"image-enhancement\"),\n imageExtraction: bool(args, \"image-extraction\"),\n imageDesignVersions: bool(args, \"image-design-versions\"),\n });\n}\n\nexport const brandStyleArgs = {\n \"main-color\": {\n type: \"string\" as const,\n description: \"Performance Max brand guidelines: main color, #RRGGBB (with --accent-color).\",\n },\n \"accent-color\": {\n type: \"string\" as const,\n description: \"Performance Max brand guidelines: accent color, #RRGGBB (with --main-color).\",\n },\n font: {\n type: \"string\" as const,\n description: 'Performance Max brand guidelines: one of Google\\'s fonts, e.g. \"Roboto\".',\n },\n};\n\nexport const brandGuidelinesCreateArgs = {\n \"brand-guidelines\": {\n type: \"boolean\" as const,\n description:\n \"Performance Max: create the campaign with brand guidelines on — link its business name and a square logo at campaign level in the same draft (assets attach --file with level campaign, fieldType BUSINESS_NAME and LOGO).\",\n },\n ...brandStyleArgs,\n};\n\n/** `--brand-guidelines --main-color --accent-color --font` → `brandGuidelines` (create: with `enabled`). */\nexport function brandGuidelinesFromFlags(\n args: Record<string, unknown>,\n mode: \"create\" | \"update\",\n): Record<string, unknown> | undefined {\n const style = {\n mainColor: str(args, \"main-color\"),\n accentColor: str(args, \"accent-color\"),\n fontFamily: str(args, \"font\"),\n };\n if (mode === \"update\") {\n return defined(style);\n }\n const enabled = bool(args, \"brand-guidelines\");\n const stated = defined(style);\n if (enabled === undefined && !stated) {\n return undefined;\n }\n return { enabled: enabled ?? false, ...stated };\n}\n\nconst list = (args: Record<string, unknown>, name: string) =>\n str(args, name)\n ?.split(\",\")\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n\nexport const enableBrandGuidelinesArgs = {\n \"auto-populate\": {\n type: \"boolean\" as const,\n description:\n \"Let Google take the business name and logo from the campaign's asset groups (needs at least one asset group).\",\n },\n \"business-name-asset\": {\n type: \"string\" as const,\n description: \"The business name text asset (id) to link to the campaign.\",\n },\n \"logo-assets\": { type: \"string\" as const, description: \"Comma-separated square logo image asset ids (1–5).\" },\n \"landscape-logo-assets\": { type: \"string\" as const, description: \"Comma-separated landscape logo image asset ids.\" },\n \"final-url-domain\": { type: \"string\" as const, description: \"The site's domain, e.g. withbaker.com.\" },\n ...brandStyleArgs,\n};\n\n/** `campaigns enable-brand-guidelines` flags → the enable payload. */\nexport function enableBrandGuidelinesFromFlags(args: Record<string, unknown>): Record<string, unknown> {\n return (\n defined({\n autoPopulateBrandAssets: bool(args, \"auto-populate\"),\n businessNameAsset: str(args, \"business-name-asset\"),\n logoAssets: list(args, \"logo-assets\"),\n landscapeLogoAssets: list(args, \"landscape-logo-assets\"),\n finalUriDomain: str(args, \"final-url-domain\"),\n mainColor: str(args, \"main-color\"),\n accentColor: str(args, \"accent-color\"),\n fontFamily: str(args, \"font\"),\n }) ?? {}\n );\n}\n","import { defineCommand } from \"citty\";\nimport {\n bidModifierFlag,\n customerIdArg,\n failWriteValidation,\n fileBatchArg,\n fileCreateCommand,\n loadJsonPayloads,\n microsFlag,\n requireCustomerId,\n requireStringFlag,\n requireTarget,\n stageGoogleOp,\n stageGoogleOps,\n stageTarget,\n stageUpdate,\n} from \"./write-shared.ts\";\n\n/**\n * Staged criterion writes: what a campaign or ad group targets and excludes, and an ad group's own\n * device bids. A criterion is the same `criterion` object at every level (`baker ads google\n * capabilities` / ads-google.md § Targeting and exclusions list every `criterionType`); which level\n * and campaign type takes which one is checked at staging, from what Google answered.\n */\n\nconst CRITERION_FILE_HELP =\n 'The `criterion` object is one `criterionType` with its fields, e.g. {\"criterionType\":\"placement\",\"url\":\"example.com\"}, {\"criterionType\":\"ageRange\",\"ageRange\":\"AGE_RANGE_18_24\"}, {\"criterionType\":\"topic\",\"topicConstant\":\"5\"} — every type with an example: __tooling__/docs/tools/baker/ads-google.md § Targeting and exclusions.';\n\nconst CRITERION_HINTS = [\n \"Run `baker ads google draft validate` once the targeting is staged: Google's dry run is the only thing that proves a criterion is accepted on this campaign before the user publishes.\",\n];\n\nexport const campaignCriteriaCommand = defineCommand({\n meta: {\n name: \"campaign-criteria\",\n description:\n \"Stage what a campaign targets or excludes — locations, languages, ad schedule, devices, a radius, carriers, operating systems, and exclusions (placements, apps, YouTube, topics, demographics, content types, IP addresses, web pages, brand lists) — or change a criterion's bid adjustment\",\n },\n subCommands: {\n add: fileCreateCommand(\n \"add\",\n \"google.campaignCriterion.add\",\n `Add a campaign criterion. Start here: --file '{\"campaign\":\"23837707642\",\"negative\":true,\"criterion\":{\"criterionType\":\"placement\",\"url\":\"example.com\"}}'. A bid adjustment rides on the criterion (\"bidModifier\": 1.2 on a location, schedule, device or radius). Audience lists, interests and custom segments go through \\`audiences attach\\`. ${CRITERION_FILE_HELP}`,\n CRITERION_HINTS,\n ),\n update: defineCommand({\n meta: {\n name: \"update\",\n description:\n \"Change a criterion's bid adjustment — the only way to change a device setting the campaign already has, since Google never lets one be removed. Start here: `campaign-criteria update customers/<cid>/campaignCriteria/<campaignId>~<criterionId> --bid-modifier 1` resets a boost to neutral; --bid-modifier 0 stops ads serving on that device. Use `campaign-criteria add` instead when the campaign has no criterion for that device yet. Read the current ones with `baker ads google campaign-criteria list`.\",\n },\n args: {\n ...customerIdArg,\n id: {\n type: \"positional\",\n description: \"Criterion resource name (customers/…/campaignCriteria/{campaignId}~{criterionId})\",\n required: false,\n },\n \"bid-modifier\": {\n type: \"string\",\n description:\n \"1 = no adjustment, 1.25 = bid 25% more, 0.9 = bid 10% less, 0 = don't serve on it (a device only; 0.1–10 elsewhere)\",\n },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const target = requireTarget(args, \"campaign criterion\");\n await stageUpdate(\"google.campaignCriterion.update\", customerId, target, {\n bidModifier: bidModifierFlag(args[\"bid-modifier\"]),\n });\n },\n }),\n remove: defineCommand({\n meta: {\n name: \"remove\",\n description:\n \"Stage a campaign criterion remove. Works for what you added — locations, languages, ad schedules, exclusions. A device setting CANNOT be removed once the campaign has one: use `campaign-criteria update --bid-modifier` to change or neutralise it instead.\",\n },\n args: {\n ...customerIdArg,\n id: { type: \"positional\", description: \"Criterion resource name\", required: false },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageTarget(\"google.campaignCriterion.remove\", customerId, requireTarget(args, \"campaign criterion\"));\n },\n }),\n },\n});\n\nfunction statusFlag(value: unknown): \"ENABLED\" | \"PAUSED\" | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (value !== \"ENABLED\" && value !== \"PAUSED\") {\n failWriteValidation(\"--status must be ENABLED or PAUSED\");\n }\n return value;\n}\n\nexport const adGroupCriteriaCommand = defineCommand({\n meta: {\n name: \"ad-group-criteria\",\n description:\n \"Stage what an ad group targets or excludes — placements, apps, YouTube channels and videos, topics, demographics (age, gender, parental status, household income), web pages for Dynamic Search Ads, brand lists, and on Demand Gen its locations, languages and combined audience — or change one's bid adjustment, max CPC or status\",\n },\n subCommands: {\n add: fileCreateCommand(\n \"add\",\n \"google.adGroupCriterion.add\",\n `Add an ad group criterion. Start here: --file '{\"adGroup\":\"154000000001\",\"criterion\":{\"criterionType\":\"placement\",\"url\":\"example.com\",\"bidModifier\":1.2}}' — add \"negative\":true to exclude it instead, \"status\":\"PAUSED\" to add it paused, \"cpcBidMicros\" for a Display placement's own max CPC. On Demand Gen, locations and languages go here, not on the campaign. Audience lists, interests and custom segments go through \\`audiences attach\\`. ${CRITERION_FILE_HELP}`,\n CRITERION_HINTS,\n ),\n update: defineCommand({\n meta: {\n name: \"update\",\n description:\n \"Change a live ad group criterion's bid adjustment, own max CPC or status. Start here: `ad-group-criteria update customers/<cid>/adGroupCriteria/<adGroupId>~<criterionId> --bid-modifier 1.3`. What it targets cannot change — remove it and add the replacement. Read them with `baker ads google ad-group-criteria list`.\",\n },\n args: {\n ...customerIdArg,\n id: {\n type: \"positional\",\n description: \"Criterion resource name (customers/…/adGroupCriteria/{adGroupId}~{criterionId})\",\n required: false,\n },\n \"bid-modifier\": { type: \"string\", description: \"1 = no adjustment, 1.25 = bid 25% more, 0.9 = 10% less\" },\n \"max-cpc\": { type: \"string\", description: \"The criterion's own max CPC, in the account currency\" },\n status: { type: \"string\", description: \"ENABLED | PAUSED\" },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const target = requireTarget(args, \"ad group criterion\");\n const payload = {\n ...(args[\"bid-modifier\"] !== undefined ? { bidModifier: bidModifierFlag(args[\"bid-modifier\"]) } : {}),\n ...(args[\"max-cpc\"] !== undefined ? { cpcBidMicros: microsFlag(args[\"max-cpc\"], \"--max-cpc\") } : {}),\n ...(args.status !== undefined ? { status: statusFlag(args.status) } : {}),\n };\n if (Object.keys(payload).length === 0) {\n failWriteValidation(\"pass --bid-modifier, --max-cpc or --status\");\n }\n await stageUpdate(\"google.adGroupCriterion.update\", customerId, target, payload);\n },\n }),\n remove: defineCommand({\n meta: { name: \"remove\", description: \"Stage an ad group criterion remove (targeting or exclusion).\" },\n args: {\n ...customerIdArg,\n id: {\n type: \"positional\",\n description: \"Criterion resource name (customers/…/adGroupCriteria/{adGroupId}~{criterionId})\",\n required: false,\n },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageTarget(\"google.adGroupCriterion.remove\", customerId, requireTarget(args, \"ad group criterion\"));\n },\n }),\n },\n});\n\nconst DEVICES = [\"MOBILE\", \"TABLET\", \"DESKTOP\", \"CONNECTED_TV\"];\n\nexport const adGroupBidModifiersCommand = defineCommand({\n meta: {\n name: \"ad-group-bid-modifiers\",\n description:\n \"Stage an ad group's own device bid adjustment (bid more on mobile in this ad group only), change it, or remove it\",\n },\n subCommands: {\n add: defineCommand({\n meta: {\n name: \"add\",\n description:\n \"Bid differently on one device in this ad group. Start here: `ad-group-bid-modifiers add --customer-id 1234567890 --ad-group 154000000001 --device MOBILE --bid-modifier 1.2`. 0 stops this ad group serving on that device. Search and Shopping take MOBILE, TABLET, DESKTOP; Display also CONNECTED_TV; Demand Gen takes none (set it on the campaign with `campaign-criteria add`).\",\n },\n args: {\n ...customerIdArg,\n \"ad-group\": { type: \"string\", description: \"Ad group id or a g_temp_* ref\" },\n device: { type: \"string\", description: DEVICES.join(\" | \") },\n \"bid-modifier\": { type: \"string\", description: \"1.2 = bid 20% more, 0.8 = 20% less, 0 = don't serve on it\" },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const device = requireStringFlag(args.device, \"--device\");\n if (!DEVICES.includes(device)) {\n failWriteValidation(`--device must be one of ${DEVICES.join(\", \")}`);\n }\n await stageGoogleOp({\n kind: \"google.adGroupBidModifier.add\",\n customerId,\n payload: {\n adGroup: requireStringFlag(args[\"ad-group\"], \"--ad-group\"),\n device,\n bidModifier: bidModifierFlag(args[\"bid-modifier\"]),\n },\n });\n },\n }),\n update: defineCommand({\n meta: {\n name: \"update\",\n description:\n \"Change an ad group device bid. Start here: `ad-group-bid-modifiers update customers/<cid>/adGroupBidModifiers/<adGroupId>~<criterionId> --bid-modifier 1`.\",\n },\n args: {\n ...customerIdArg,\n id: {\n type: \"positional\",\n description: \"customers/…/adGroupBidModifiers/{adGroupId}~{criterionId}\",\n required: false,\n },\n \"bid-modifier\": { type: \"string\", description: \"1 = no adjustment, 0 = don't serve on it\" },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageUpdate(\n \"google.adGroupBidModifier.update\",\n customerId,\n requireTarget(args, \"ad group bid modifier\"),\n { bidModifier: bidModifierFlag(args[\"bid-modifier\"]) },\n );\n },\n }),\n remove: defineCommand({\n meta: {\n name: \"remove\",\n description: \"Stage an ad group device bid remove — the ad group bids like its campaign again.\",\n },\n args: {\n ...customerIdArg,\n id: {\n type: \"positional\",\n description: \"customers/…/adGroupBidModifiers/{adGroupId}~{criterionId}\",\n required: false,\n },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageTarget(\"google.adGroupBidModifier.remove\", customerId, requireTarget(args, \"ad group bid modifier\"));\n },\n }),\n },\n});\n\ntype CriterionFlag = { flag: string; criterion: (value: string) => Record<string, unknown> };\n\n/** `--flag a,b` → one criterion per comma-separated value, across every flag given. */\nfunction criteriaFromFlags(\n args: Record<string, unknown>,\n flags: readonly CriterionFlag[],\n): Array<Record<string, unknown>> {\n return flags.flatMap(({ flag, criterion }) => {\n const value = args[flag];\n return typeof value === \"string\"\n ? value\n .split(\",\")\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .map(criterion)\n : [];\n });\n}\n\nconst PLACEMENT_FLAGS: readonly CriterionFlag[] = [\n { flag: \"placement\", criterion: (url) => ({ criterionType: \"placement\", url }) },\n { flag: \"youtube-channel\", criterion: (channelId) => ({ criterionType: \"youtubeChannel\", channelId }) },\n { flag: \"youtube-video\", criterion: (videoId) => ({ criterionType: \"youtubeVideo\", videoId }) },\n { flag: \"app\", criterion: (appId) => ({ criterionType: \"mobileApp\", appId }) },\n];\n\nconst ACCOUNT_EXCLUSION_FLAGS: readonly CriterionFlag[] = [\n ...PLACEMENT_FLAGS,\n { flag: \"content-label\", criterion: (contentLabel) => ({ criterionType: \"contentLabel\", contentLabel }) },\n { flag: \"ip\", criterion: (ipAddress) => ({ criterionType: \"ipBlock\", ipAddress }) },\n];\n\nconst LIST_MEMBER_FLAGS: readonly CriterionFlag[] = [\n ...PLACEMENT_FLAGS,\n { flag: \"brand\", criterion: (entityId) => ({ criterionType: \"brand\", entityId }) },\n];\n\nexport function accountExclusionCriteria(args: Record<string, unknown>): Array<Record<string, unknown>> {\n return criteriaFromFlags(args, ACCOUNT_EXCLUSION_FLAGS);\n}\n\n/** The placement / app / YouTube / brand members `keyword-lists add` stages into a placement or brand list. */\nexport function listMemberCriteria(args: Record<string, unknown>): Array<Record<string, unknown>> {\n return criteriaFromFlags(args, LIST_MEMBER_FLAGS);\n}\n\nexport const LIST_MEMBER_ARGS = {\n placement: { type: \"string\", description: \"Sites for a NEGATIVE_PLACEMENTS list (example.com), comma-separated\" },\n \"youtube-channel\": {\n type: \"string\",\n description: \"YouTube channel ids for a NEGATIVE_PLACEMENTS list, comma-separated\",\n },\n \"youtube-video\": { type: \"string\", description: \"YouTube video ids for a NEGATIVE_PLACEMENTS list, comma-separated\" },\n app: { type: \"string\", description: \"App ids (1-<App Store id> / 2-<package>) for a NEGATIVE_PLACEMENTS list\" },\n brand: {\n type: \"string\",\n description:\n \"Brand entity ids (/g/…) for a BRANDS list, comma-separated — find them with `baker ads google brands`\",\n },\n} as const;\n\nexport const accountExclusionsCommand = defineCommand({\n meta: {\n name: \"account-exclusions\",\n description:\n \"Stage exclusions for the WHOLE account — sites, apps, YouTube channels/videos, content types, IP addresses, an account-level negative keyword list — or remove one. They reach every campaign, Performance Max included (which takes no placement exclusion of its own).\",\n },\n subCommands: {\n add: defineCommand({\n meta: {\n name: \"add\",\n description: `Exclude across the whole account. Start here: \\`account-exclusions add --customer-id 1234567890 --placement \"example.com,spam-site.net\" --content-label SEXUALLY_SUGGESTIVE\\`. Flags take comma-separated values and stage one exclusion each; --file takes {\"criterion\": {...}} objects (an array for many) for app categories or an account-level negative keyword list ({\"criterionType\":\"negativeKeywordList\",\"sharedSet\":\"<ACCOUNT_LEVEL_NEGATIVE_KEYWORDS list>\"}). Read what is already excluded with \\`account-exclusions list\\` first — they apply to every campaign. ${CRITERION_FILE_HELP}`,\n },\n args: {\n ...customerIdArg,\n ...fileBatchArg(\"google.customerNegativeCriterion.add\"),\n placement: { type: \"string\", description: \"Sites to exclude (example.com), comma-separated\" },\n \"youtube-channel\": { type: \"string\", description: \"YouTube channel ids (UC…), comma-separated\" },\n \"youtube-video\": { type: \"string\", description: \"YouTube video ids, comma-separated\" },\n app: { type: \"string\", description: \"App ids (1-<App Store id> / 2-<package>), comma-separated\" },\n \"content-label\": {\n type: \"string\",\n description:\n \"Content types: SEXUALLY_SUGGESTIVE, BELOW_THE_FOLD, PARKED_DOMAIN, JUVENILE, PROFANITY, TRAGEDY, VIDEO_RATING_DV_*, EMBEDDED_VIDEO, LIVE_STREAMING_VIDEO, SOCIAL_ISSUES, BRAND_SUITABILITY_* (comma-separated)\",\n },\n ip: { type: \"string\", description: \"IP addresses to exclude, comma-separated\" },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const payloads = [\n ...(args.file ? loadJsonPayloads(args.file) : []),\n ...accountExclusionCriteria(args).map((criterion) => ({ criterion })),\n ];\n if (payloads.length === 0) {\n failWriteValidation(\n \"name what to exclude: --placement, --youtube-channel, --youtube-video, --app, --content-label, --ip or --file\",\n );\n }\n await stageGoogleOps(\n payloads.map((payload) => ({ kind: \"google.customerNegativeCriterion.add\", customerId, payload })),\n [\"Account exclusions reach every campaign in the account — say so when you report them.\"],\n );\n },\n }),\n remove: defineCommand({\n meta: {\n name: \"remove\",\n description:\n \"Stage removing an account exclusion. Start here: `account-exclusions remove customers/<cid>/customerNegativeCriteria/<criterionId>` (read it with `account-exclusions list`).\",\n },\n args: {\n ...customerIdArg,\n id: { type: \"positional\", description: \"customers/…/customerNegativeCriteria/{criterionId}\", required: false },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageTarget(\n \"google.customerNegativeCriterion.remove\",\n customerId,\n requireTarget(args, \"account exclusion\"),\n );\n },\n }),\n },\n});\n\nconst ASSET_GROUP_SIGNAL_FLAGS: readonly CriterionFlag[] = [\n { flag: \"search-theme\", criterion: (text) => ({ criterionType: \"searchTheme\", text }) },\n { flag: \"audience\", criterion: (audience) => ({ criterionType: \"audience\", audience }) },\n];\n\n/** `--search-theme a,b --audience 77` → one signal payload each, on `--asset-group`. */\nexport function assetGroupSignalPayloads(args: Record<string, unknown>): Array<Record<string, unknown>> {\n const assetGroup = args[\"asset-group\"];\n return criteriaFromFlags(args, ASSET_GROUP_SIGNAL_FLAGS).map((criterion) => ({ assetGroup, criterion }));\n}\n\nexport const assetGroupSignalsCommand = defineCommand({\n meta: {\n name: \"asset-group-signals\",\n description:\n \"Stage a Performance Max asset group's signals — its search themes and the one combined audience it is pointed at — or remove one. Signals steer who Google looks for; they narrow nothing.\",\n },\n subCommands: {\n add: defineCommand({\n meta: {\n name: \"add\",\n description:\n 'Add signals to an asset group, live or staged in this chat. Start here: `asset-group-signals add --customer-id 1234567890 --asset-group <id or g_temp_ ref> --search-theme \"fulfillment for online stores,shopify logistics\"`. Up to 25 search themes per group (≤80 characters each), phrased the way a buyer searches; skip themes the account\\'s Search campaigns already bid on — Search wins that auction. `--audience <id>` points the group at an existing combined audience (`audiences/{id}`, one per group; Baker cannot build one, the user does in Google Ads). A theme with a comma in it goes through --file: {\"assetGroup\":\"<ref>\",\"criterion\":{\"criterionType\":\"searchTheme\",\"text\":\"…\"}} (an array for many). Read what a group already has with `asset-group-signals list`.',\n },\n args: {\n ...customerIdArg,\n ...fileBatchArg(\"google.assetGroupSignal.add\"),\n \"asset-group\": { type: \"string\", description: \"Asset group id, resource name, or g_temp_ ref from this chat\" },\n \"search-theme\": { type: \"string\", description: \"Search themes, comma-separated (≤80 characters each)\" },\n audience: {\n type: \"string\",\n description: \"An existing combined audience: its id or customers/…/audiences/{id}\",\n },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n const fromFlags = assetGroupSignalPayloads(args);\n if (fromFlags.length > 0 && typeof args[\"asset-group\"] !== \"string\") {\n failWriteValidation(\"--asset-group names the asset group the signals go on\");\n }\n const payloads = [...(args.file ? loadJsonPayloads(args.file) : []), ...fromFlags];\n if (payloads.length === 0) {\n failWriteValidation(\"name the signals: --search-theme, --audience or --file\");\n }\n await stageGoogleOps(\n payloads.map((payload) => ({ kind: \"google.assetGroupSignal.add\", customerId, payload })),\n CRITERION_HINTS,\n );\n },\n }),\n remove: defineCommand({\n meta: {\n name: \"remove\",\n description:\n \"Stage removing an asset group signal. Start here: `asset-group-signals remove customers/<cid>/assetGroupSignals/<assetGroupId>~<criterionId>` (read it with `asset-group-signals list`). A signal cannot be edited: remove it and add the replacement.\",\n },\n args: {\n ...customerIdArg,\n id: {\n type: \"positional\",\n description: \"customers/…/assetGroupSignals/{assetGroupId}~{criterionId}\",\n required: false,\n },\n },\n run: async ({ args }) => {\n const customerId = requireCustomerId(args);\n await stageTarget(\"google.assetGroupSignal.remove\", customerId, requireTarget(args, \"asset group signal\"));\n },\n }),\n },\n});\n","import { apiPost } from \"../../../client.ts\";\nimport { getManagerIdForCustomer } from \"../cache.ts\";\nimport { failWriteValidation } from \"./write-shared.ts\";\n\n/**\n * `keyword-lists remove`: which members of a shared negative keyword list a removal names.\n *\n * A member is addressed by `customers/{cid}/sharedCriteria/{listId}~{criterionId}` and nothing else,\n * and agents composing that string by hand is how production staged 153 removals Google could not\n * parse. So the command takes what the agent actually has — the terms — and reads the list to find\n * each one's resource name; a resource name, `listId~criterionId` or a criterion id also works.\n */\n\nconst MATCH_TYPES = new Set([\"EXACT\", \"PHRASE\", \"BROAD\"]);\n\ntype Row = Record<string, unknown>;\n\n/** A term with an optional `:MATCH_TYPE` suffix; no suffix matches the term at every match type. */\nfunction parseTerm(raw: string): { text: string; matchType?: string } {\n const colon = raw.lastIndexOf(\":\");\n const suffix =\n colon > 0\n ? raw\n .slice(colon + 1)\n .trim()\n .toUpperCase()\n : undefined;\n return suffix && MATCH_TYPES.has(suffix)\n ? { text: raw.slice(0, colon).trim(), matchType: suffix }\n : { text: raw.trim() };\n}\n\nconst normalized = (text: string) => text.trim().replace(/\\s+/g, \" \").toLowerCase();\n\n/** The members each term names (text compared case-insensitively), and the terms the list does not hold. */\nexport function memberRemovals(\n rows: readonly Row[],\n terms: readonly string[],\n): { targets: string[]; missing: string[] } {\n const targets: string[] = [];\n const missing: string[] = [];\n for (const raw of terms) {\n const term = parseTerm(raw);\n const found = rows.filter(\n (row) =>\n normalized(String(row[\"shared_criterion.keyword.text\"] ?? \"\")) === normalized(term.text) &&\n (!term.matchType || row[\"shared_criterion.keyword.match_type\"] === term.matchType),\n );\n if (found.length === 0) {\n missing.push(raw);\n }\n for (const row of found) {\n const name = String(row[\"shared_criterion.resource_name\"] ?? \"\");\n if (name && !targets.includes(name)) {\n targets.push(name);\n }\n }\n }\n return { targets, missing };\n}\n\n/** `--list-ref` → the list's numeric id: an id or `customers/{cid}/sharedSets/{id}`. */\nexport function listIdOf(listRef: string): string {\n const id = listRef.split(\"/\").pop() ?? \"\";\n if (!/^\\d+$/.test(id)) {\n failWriteValidation(\n `--list-ref must be the list's id or customers/{cid}/sharedSets/{id} — a list staged in this chat has no published members yet, so take a term out of it with \\`draft remove\\` on the member's add instead`,\n );\n }\n return id;\n}\n\n/** A member named directly: its resource name, `listId~criterionId`, or a criterion id of this list. */\nexport function memberTarget(customerId: string, listId: string, value: string): string {\n if (value.startsWith(\"customers/\")) {\n if (!value.includes(\"/sharedCriteria/\")) {\n failWriteValidation(\n `${value} is not a keyword list member — members are customers/{cid}/sharedCriteria/{listId}~{criterionId}`,\n );\n }\n return value;\n }\n if (/^\\d+~\\d+$/.test(value)) {\n return `customers/${customerId}/sharedCriteria/${value}`;\n }\n if (/^\\d+$/.test(value)) {\n return `customers/${customerId}/sharedCriteria/${listId}~${value}`;\n }\n failWriteValidation(\n `\"${value}\" is not a member resource name, listId~criterionId or criterion id — pass terms with --text`,\n );\n}\n\n/** Every member of one list, read live (paged through to the end). */\nexport async function readListMembers(customerId: string, listId: string): Promise<Row[]> {\n const query = `SELECT shared_criterion.resource_name, shared_criterion.keyword.text, shared_criterion.keyword.match_type FROM shared_criterion WHERE shared_set.id = ${listId}`;\n const managerId = getManagerIdForCustomer(customerId);\n const rows: Row[] = [];\n let pageToken: string | undefined;\n do {\n const response = await apiPost<{ rows?: Row[]; pageToken?: string }>(\"/api/ads/google/query\", {\n customerId,\n query,\n pageSize: 8192,\n skipCache: true,\n ...(managerId ? { managerId } : {}),\n ...(pageToken ? { pageToken } : {}),\n });\n rows.push(...(response.rows ?? []));\n pageToken = response.pageToken;\n } while (pageToken);\n return rows;\n}\n"],"mappings":"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","names":["defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","payload","defineCommand","list"]}