@koda-sl/baker-cli 0.559.0 → 0.561.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1347) hide show
  1. package/README.md +8 -1
  2. package/dist/account-B77TBYMN.js +82 -0
  3. package/dist/account-OCFXNHG7.js +139 -0
  4. package/dist/account-U6DFMD2V.js +82 -0
  5. package/dist/account-assets-W7K2PUYB.js +290 -0
  6. package/dist/account-level-Z2JEIJ3X.js +611 -0
  7. package/dist/account-reads-X35O4MCA.js +219 -0
  8. package/dist/account-users-UKKABT5U.js +64 -0
  9. package/dist/account-writes-QSJ74QFR.js +68 -0
  10. package/dist/accounts-55PDBEDN.js +76 -0
  11. package/dist/accounts-AK4QIG24.js +115 -0
  12. package/dist/accounts-HGCR3WFZ.js +119 -0
  13. package/dist/accounts-QYNZXW2E.js +80 -0
  14. package/dist/accounts-XL2TMLGE.js +701 -0
  15. package/dist/actions-CVTRCHPG.js +55 -0
  16. package/dist/active-entities-HR7NJJLU.js +103 -0
  17. package/dist/activecampaign-UNNM6J7M.js +938 -0
  18. package/dist/activities-DEWHKBID.js +75 -0
  19. package/dist/ad-group-writes-QBHOPTT5.js +172 -0
  20. package/dist/ad-groups-JZDUFT6J.js +70 -0
  21. package/dist/ad-writes-QYJO4IB3.js +176 -0
  22. package/dist/add-3GOSW7LW.js +107 -0
  23. package/dist/add-DPCBGUA5.js +305 -0
  24. package/dist/add-IMKVYDQV.js +85 -0
  25. package/dist/add-PZEVRQ7Z.js +81 -0
  26. package/dist/add-QXI627AS.js +148 -0
  27. package/dist/add-SPQ4MOCQ.js +97 -0
  28. package/dist/add-accounts-D4V5K7SO.js +91 -0
  29. package/dist/ads-LDCZ65B5.js +48 -0
  30. package/dist/ads-QKVNPHBH.js +120 -0
  31. package/dist/ads-RTRWWEP5.js +128 -0
  32. package/dist/ads-UMSWEI5X.js +79 -0
  33. package/dist/adsets-FEVYHKAQ.js +182 -0
  34. package/dist/advertisers-2GKICB23.js +125 -0
  35. package/dist/advertisers-3D36UJTQ.js +123 -0
  36. package/dist/analytics-YHOXWFBI.js +2437 -0
  37. package/dist/analytics-ZPPZJETP.js +447 -0
  38. package/dist/animate-WS63CZ3Y.js +480 -0
  39. package/dist/approved-3XFZNRJR.js +73 -0
  40. package/dist/asset-writes-7RFZZYU7.js +50 -0
  41. package/dist/assign-5P7OJBAH.js +80 -0
  42. package/dist/audience-size-PHFJ22TX.js +76 -0
  43. package/dist/audience-writes-RUGU6KEC.js +327 -0
  44. package/dist/audiences-6GVUZUCN.js +106 -0
  45. package/dist/audiences-7OS2ZJYO.js +85 -0
  46. package/dist/audiences-RSAUXKHR.js +280 -0
  47. package/dist/audit-3GRXRDLR.js +154 -0
  48. package/dist/audit-4L7IKIRY.js +88 -0
  49. package/dist/autocomplete-GQLXBG5V.js +114 -0
  50. package/dist/avatars-I73KFB3F.js +38 -0
  51. package/dist/bid-pricing-6MZ7SC72.js +103 -0
  52. package/dist/brief-MI4RLV4N.js +543 -0
  53. package/dist/businesses-42NZP6FP.js +54 -0
  54. package/dist/campaign-groups-QZ2NW5AW.js +99 -0
  55. package/dist/campaign-writes-BGS53O4B.js +168 -0
  56. package/dist/campaign-writes-GKNH2EHV.js +176 -0
  57. package/dist/campaigns-7RV65SXR.js +78 -0
  58. package/dist/campaigns-FGIVPEVA.js +113 -0
  59. package/dist/campaigns-TO74Z7UH.js +130 -0
  60. package/dist/campaigns-YBPXM6B3.js +111 -0
  61. package/dist/canvas-YTSJAEOF.js +46 -0
  62. package/dist/capabilities-YFXCTUJJ.js +147 -0
  63. package/dist/cards-CAOGPPG4.js +85 -0
  64. package/dist/catalogs-5LWEXG5X.js +130 -0
  65. package/dist/catalogs-7IEXGLSR.js +782 -0
  66. package/dist/changes-6CL42LG3.js +167 -0
  67. package/dist/changes-6CL42LG3.js.map +1 -0
  68. package/dist/chatgpt-HLIQ7OJZ.js +47 -0
  69. package/dist/chats-D5W2UWD4.js +449 -0
  70. package/dist/check-FFMWUB72.js +107 -0
  71. package/dist/chunk-2DAWUWA4.js +115 -0
  72. package/dist/chunk-2DVFPCH3.js +91 -0
  73. package/dist/chunk-2LBQNTTH.js +76 -0
  74. package/dist/chunk-2VHYY4RU.js +191 -0
  75. package/dist/chunk-3E74OM2E.js +288 -0
  76. package/dist/chunk-3FLSRUID.js +344 -0
  77. package/dist/chunk-3LYT3NQX.js +42 -0
  78. package/dist/chunk-4UNJ4ENA.js +106 -0
  79. package/dist/chunk-533R4P5O.js +224 -0
  80. package/dist/chunk-5E4Y6RVY.js +56 -0
  81. package/dist/chunk-5H6N36LS.js +217 -0
  82. package/dist/chunk-6I7GJDBX.js +910 -0
  83. package/dist/chunk-6IR7IQPV.js +69 -0
  84. package/dist/chunk-6PO3WSFJ.js +97 -0
  85. package/dist/chunk-6QNXBEIN.js +207 -0
  86. package/dist/chunk-BESCYH3K.js +125 -0
  87. package/dist/chunk-BGMIO2FR.js +64 -0
  88. package/dist/chunk-BVGRKVHL.js +103 -0
  89. package/dist/chunk-C3EX5OKN.js +188 -0
  90. package/dist/chunk-CHVLFACB.js +91 -0
  91. package/dist/chunk-CP6RFWLW.js +69 -0
  92. package/dist/chunk-D2GDHVZP.js +51 -0
  93. package/dist/chunk-D3YAFC6K.js +98 -0
  94. package/dist/chunk-DFDV42NY.js +709 -0
  95. package/dist/chunk-EFTYCX5C.js +46 -0
  96. package/dist/chunk-F62BW6DJ.js +139 -0
  97. package/dist/chunk-FLQNIFG2.js +84 -0
  98. package/dist/chunk-FWHEAR7F.js +138 -0
  99. package/dist/chunk-FXZGRP3F.js +454 -0
  100. package/dist/chunk-GQ4DMO5Q.js +8954 -0
  101. package/dist/chunk-GUH2A5R5.js +66 -0
  102. package/dist/chunk-HJ3Q4NOM.js +58 -0
  103. package/dist/chunk-IDDG4QKO.js +39 -0
  104. package/dist/chunk-ILGRC7LJ.js +287 -0
  105. package/dist/chunk-JQDYH5XP.js +156 -0
  106. package/dist/chunk-JQDYH5XP.js.map +1 -0
  107. package/dist/chunk-JTIWQLY5.js +98 -0
  108. package/dist/chunk-KDVYI4LC.js +35 -0
  109. package/dist/chunk-LAP23AND.js +399 -0
  110. package/dist/chunk-LFPBZL2X.js +163 -0
  111. package/dist/chunk-MSGIF4EC.js +275 -0
  112. package/dist/chunk-MYIOR35H.js +225 -0
  113. package/dist/chunk-NTFNLVZG.js +26 -0
  114. package/dist/chunk-OAJ6LVL2.js +430 -0
  115. package/dist/chunk-OASXBRXQ.js +24026 -0
  116. package/dist/chunk-OFMFBRSL.js +25 -0
  117. package/dist/chunk-ORQ3WBM6.js +225 -0
  118. package/dist/chunk-OSQTSS27.js +74 -0
  119. package/dist/chunk-OTRKBCUB.js +219 -0
  120. package/dist/chunk-OWEON2S7.js +1246 -0
  121. package/dist/chunk-OWEON2S7.js.map +1 -0
  122. package/dist/chunk-PH3FZZIT.js +544 -0
  123. package/dist/chunk-PXLBPOI3.js +203 -0
  124. package/dist/chunk-QEREDRZO.js +246 -0
  125. package/dist/chunk-QEREDRZO.js.map +1 -0
  126. package/dist/chunk-QLXVHWAC.js +685 -0
  127. package/dist/chunk-QPTYTM2X.js +142 -0
  128. package/dist/chunk-R2Z5L5CF.js +297 -0
  129. package/dist/chunk-R4RWQ6YX.js +152 -0
  130. package/dist/chunk-RBCO3C3Q.js +324 -0
  131. package/dist/chunk-RHSKKWPO.js +1902 -0
  132. package/dist/chunk-RJ2ETGAQ.js +73 -0
  133. package/dist/chunk-S37ZZSNM.js +604 -0
  134. package/dist/chunk-SJIEU3VG.js +831 -0
  135. package/dist/chunk-SKI7QMDT.js +170 -0
  136. package/dist/chunk-SLLY4ZTT.js +169 -0
  137. package/dist/chunk-TCR6KI6P.js +1320 -0
  138. package/dist/chunk-TCR6KI6P.js.map +1 -0
  139. package/dist/chunk-UKDILXEA.js +23 -0
  140. package/dist/chunk-ULIQNJ5J.js +274 -0
  141. package/dist/chunk-UR7ENZ3F.js +547 -0
  142. package/dist/chunk-UYZ4FUC7.js +225 -0
  143. package/dist/chunk-WBWEKZQ2.js +191 -0
  144. package/dist/chunk-WYXYAKUP.js +19 -0
  145. package/dist/chunk-X7XFAFU4.js +2209 -0
  146. package/dist/chunk-Y43FKOED.js +89 -0
  147. package/dist/chunk-Y6XWO4V4.js +111 -0
  148. package/dist/chunk-YB6G3B3L.js +45 -0
  149. package/dist/chunk-YD6OZSSY.js +106 -0
  150. package/dist/chunk-YFBHZ57K.js +197 -0
  151. package/dist/chunk-ZD5MNBLA.js +930 -0
  152. package/dist/chunk-ZZ5B2ZRM.js +94 -0
  153. package/dist/cite-AJ5ZQWD2.js +191 -0
  154. package/dist/claim-G4TW75Z2.js +200 -0
  155. package/dist/cli.js +100 -39
  156. package/dist/cli.js.map +1 -1
  157. package/dist/client-F6KOC77S.js +19 -0
  158. package/dist/code-NV4ARLFS.js +76 -0
  159. package/dist/companies-TYDUEKET.js +198 -0
  160. package/dist/company-V5WKGDGU.js +308 -0
  161. package/dist/complete-QEKKP7YL.js +84 -0
  162. package/dist/config-NDL2YP37.js +88 -0
  163. package/dist/connect-5Q2HQ7LT.js +45 -0
  164. package/dist/content-EQZKKIST.js +85 -0
  165. package/dist/conversation-JIVOIZ5E.js +96 -0
  166. package/dist/conversion-report-76S5JOVT.js +127 -0
  167. package/dist/conversion-upload-command-WNHVNVMW.js +439 -0
  168. package/dist/conversion-writes-6HX665JT.js +122 -0
  169. package/dist/conversions-A524MH5C.js +78 -0
  170. package/dist/conversions-PSXVU4JL.js +140 -0
  171. package/dist/copy-writes-X2LM5I4Z.js +170 -0
  172. package/dist/countries-GZSBGSVT.js +82 -0
  173. package/dist/create-7QGB33HI.js +135 -0
  174. package/dist/create-AV7UY4N5.js +239 -0
  175. package/dist/create-CHBC745Y.js +62 -0
  176. package/dist/create-SBQU7B3S.js +218 -0
  177. package/dist/creatives-LNUSBQXQ.js +229 -0
  178. package/dist/creatives-SFPNXJ6Z.js +118 -0
  179. package/dist/creatives-XQILGK6P.js +58 -0
  180. package/dist/credentials-IWF37PAQ.js +290 -0
  181. package/dist/critique-ETRQP3QZ.js +232 -0
  182. package/dist/crm-IDN55BIC.js +323 -0
  183. package/dist/crm-T2ZJNZ6G.js +229 -0
  184. package/dist/crm-T2ZJNZ6G.js.map +1 -0
  185. package/dist/currency-VQMZZXSS.js +88 -0
  186. package/dist/custom-conversions-UHRBVUD2.js +128 -0
  187. package/dist/customers-XANEOEW6.js +65 -0
  188. package/dist/decide-AM6B7WIL.js +199 -0
  189. package/dist/delete-2WL6K24W.js +69 -0
  190. package/dist/delete-46B7DSQV.js +71 -0
  191. package/dist/delete-6K7EZXNR.js +67 -0
  192. package/dist/delete-SCAVFYZL.js +57 -0
  193. package/dist/delete-WAPC4XC2.js +69 -0
  194. package/dist/delete-YYIM564B.js +85 -0
  195. package/dist/demographics-JJKL7MZC.js +141 -0
  196. package/dist/describe-5OC7XX2U.js +97 -0
  197. package/dist/describe-EAPKNUUU.js +97 -0
  198. package/dist/discard-FQDZ5GKN.js +69 -0
  199. package/dist/discover-4F4USNHE.js +172 -0
  200. package/dist/discover-P7PBB3IV.js +93 -0
  201. package/dist/domain-AFWPUOI7.js +101 -0
  202. package/dist/download-MXKBJPPF.js +172 -0
  203. package/dist/download-YB2DVMRS.js +337 -0
  204. package/dist/draft-44KTLX4P.js +134 -0
  205. package/dist/draft-CKFSZDVI.js +260 -0
  206. package/dist/draft-EKJQGNFT.js +374 -0
  207. package/dist/draft-OJHTFELQ.js +332 -0
  208. package/dist/draft-RSKZSUOS.js +138 -0
  209. package/dist/draft-VIZTQ6W4.js +557 -0
  210. package/dist/draft-WOE7KQ7T.js +315 -0
  211. package/dist/draft-Z5IVHUHR.js +220 -0
  212. package/dist/experiment-EFLKDQ3C.js +1397 -0
  213. package/dist/experiments-YUBVWNB5.js +236 -0
  214. package/dist/export-RPNRPTDK.js +168 -0
  215. package/dist/extract-VHM2UNIE.js +143 -0
  216. package/dist/facets-5GLKSHTA.js +117 -0
  217. package/dist/favorites-536I3GZD.js +178 -0
  218. package/dist/feed-W3ECHUEX.js +177 -0
  219. package/dist/feedback-36TL4GPS.js +115 -0
  220. package/dist/feedback-VCYIVDO2.js +136 -0
  221. package/dist/feedback-record-QGAP4HA4.js +269 -0
  222. package/dist/fetch-X4RIDS7N.js +204 -0
  223. package/dist/find-57WYB4V3.js +144 -0
  224. package/dist/fit-V4CRDVQV.js +65 -0
  225. package/dist/flows-YPBWZR4P.js +250 -0
  226. package/dist/follow-5VX5JWAQ.js +94 -0
  227. package/dist/follow-competitors-D7I33T5C.js +112 -0
  228. package/dist/following-6DI4IZ7P.js +113 -0
  229. package/dist/forecast-E2HJSD6E.js +169 -0
  230. package/dist/forecast-LMYMZHZE.js +121 -0
  231. package/dist/funding-BSAHWU35.js +85 -0
  232. package/dist/funnel-MF2KFXEX.js +397 -0
  233. package/dist/ga4-FCMTGV4S.js +55 -0
  234. package/dist/generate-VGGXTZBP.js +263 -0
  235. package/dist/get-42V7UTNF.js +59 -0
  236. package/dist/get-5SCYUC4G.js +38 -0
  237. package/dist/get-7NI64G6K.js +82 -0
  238. package/dist/get-BQBLPGFE.js +74 -0
  239. package/dist/get-JHOH74X5.js +56 -0
  240. package/dist/get-MVZWQ4BE.js +62 -0
  241. package/dist/get-TBMTBGHJ.js +62 -0
  242. package/dist/get-V4NJXKUR.js +92 -0
  243. package/dist/gif-M2GMVWM4.js +111 -0
  244. package/dist/google-YNVTLX5E.js +163 -0
  245. package/dist/google-ZRZGM2XI.js +3300 -0
  246. package/dist/google-ZRZGM2XI.js.map +1 -0
  247. package/dist/google-ads-UER2CSQN.js +198 -0
  248. package/dist/group-PLTVV7UZ.js +43 -0
  249. package/dist/group-THZPJALS.js +43 -0
  250. package/dist/gsc-A3KB36WH.js +30 -0
  251. package/dist/history-3GRRZSWW.js +102 -0
  252. package/dist/history-LBIA45H3.js +153 -0
  253. package/dist/history-LXRFZNW7.js +69 -0
  254. package/dist/hubspot-NEENQKIP.js +814 -0
  255. package/dist/hubspot-NEENQKIP.js.map +1 -0
  256. package/dist/icon-7WND6UPY.js +138 -0
  257. package/dist/ideas-LDQMFMJM.js +45 -0
  258. package/dist/images-2FDXHKMR.js +92 -0
  259. package/dist/improve-NWFQI63B.js +86 -0
  260. package/dist/ingest-OJDK7AGH.js +131 -0
  261. package/dist/ingest-PS2LOYBM.js +28 -0
  262. package/dist/insights-H6M6VI43.js +132 -0
  263. package/dist/insights-LZJZGNJZ.js +658 -0
  264. package/dist/inspect-ALSHVHUP.js +192 -0
  265. package/dist/inspiration-TQHQNILK.js +53 -0
  266. package/dist/instant-experiences-J4GSS3Y6.js +264 -0
  267. package/dist/intent-ZKLT4DAW.js +95 -0
  268. package/dist/job-UFGGBDG7.js +202 -0
  269. package/dist/job-create-XM4NH322.js +109 -0
  270. package/dist/job-status-47L5Z57J.js +74 -0
  271. package/dist/keep-I6FLGJH4.js +78 -0
  272. package/dist/keyword-gap-QC3ITLNG.js +130 -0
  273. package/dist/keyword-metrics-PERWGH54.js +200 -0
  274. package/dist/keywords-for-site-CCCB6KHE.js +131 -0
  275. package/dist/knowledge-H5PJ6LZB.js +195 -0
  276. package/dist/landing-VE3MHOA3.js +28 -0
  277. package/dist/landings-AELJXEYN.js +151 -0
  278. package/dist/languages-GCRI2PI3.js +55 -0
  279. package/dist/languages-QMLC4QWZ.js +40 -0
  280. package/dist/launches-CKPZFVMQ.js +19 -0
  281. package/dist/layerize-PHY25VNC.js +190 -0
  282. package/dist/lead-routes-ZMKRNL57.js +733 -0
  283. package/dist/leads-SEEJ3KRR.js +541 -0
  284. package/dist/leads-TPMLYLBH.js +115 -0
  285. package/dist/learn-KK3AJS3N.js +207 -0
  286. package/dist/library-5YJCCEFL.js +212 -0
  287. package/dist/lighthouse-W3KAVW2G.js +75 -0
  288. package/dist/line-item-writes-ONKDXKOM.js +211 -0
  289. package/dist/line-items-ILJYVUHX.js +107 -0
  290. package/dist/link-YDHTMDC5.js +67 -0
  291. package/dist/linkedin-N3NGCE5N.js +1344 -0
  292. package/dist/linkedin-person-6F3YJHXM.js +139 -0
  293. package/dist/list-2EJ3XZ6I.js +93 -0
  294. package/dist/list-BQWHFEWY.js +65 -0
  295. package/dist/list-E7JG27WS.js +50 -0
  296. package/dist/list-EKL5HIR7.js +306 -0
  297. package/dist/list-ERCPPED6.js +76 -0
  298. package/dist/list-F7UDUU7C.js +67 -0
  299. package/dist/list-HYZL4576.js +57 -0
  300. package/dist/list-IKQFAJP7.js +51 -0
  301. package/dist/list-WDTPTY2T.js +154 -0
  302. package/dist/locations-5SLLGWZO.js +69 -0
  303. package/dist/locations-DNRK7DY4.js +40 -0
  304. package/dist/log-BZBRXB5P.js +95 -0
  305. package/dist/logo-ODONF6N7.js +19 -0
  306. package/dist/lookup-OU6CLATK.js +23 -0
  307. package/dist/make-W27CB5X4.js +1367 -0
  308. package/dist/map-FNB7IWDY.js +436 -0
  309. package/dist/mcp-QSDCAWMU.js +729 -0
  310. package/dist/media-DGV2AMZI.js +89 -0
  311. package/dist/media-YKCCMLXL.js +18 -0
  312. package/dist/media-sources-NMT4G45B.js +35 -0
  313. package/dist/members-2XQ6E33F.js +47 -0
  314. package/dist/meme-3QYKC4BF.js +108 -0
  315. package/dist/meta-5KQ6CQBT.js +122 -0
  316. package/dist/metrics-P4QDFCVB.js +152 -0
  317. package/dist/normalize-5AU7SKYY.js +144 -0
  318. package/dist/options-CH52EP5K.js +125 -0
  319. package/dist/organization-6T4Q6XYI.js +949 -0
  320. package/dist/output-7X5WPPCA.js +24 -0
  321. package/dist/page-GBLVAKU3.js +105 -0
  322. package/dist/page-photos-VYJU4RNQ.js +118 -0
  323. package/dist/pages-6YMPZDEY.js +67 -0
  324. package/dist/performance-2SCAQSQK.js +27 -0
  325. package/dist/performance-4DMGJCN7.js +5565 -0
  326. package/dist/pinterest-235S7E6H.js +105 -0
  327. package/dist/pixels-DZDVNIVL.js +109 -0
  328. package/dist/pixels-WTTLC4O5.js +62 -0
  329. package/dist/plan-JAWESWJN.js +208 -0
  330. package/dist/posts-TRQCRLYZ.js +36 -0
  331. package/dist/preview-ICZR3SGB.js +101 -0
  332. package/dist/preview-JZXGR4KN.js +245 -0
  333. package/dist/profile-MKKJT2UF.js +159 -0
  334. package/dist/promoted-tweet-writes-DR6V7MHW.js +183 -0
  335. package/dist/promoted-tweets-IRECARIO.js +119 -0
  336. package/dist/properties-Z5S3LRJ5.js +101 -0
  337. package/dist/publish-4HM2CJVF.js +350 -0
  338. package/dist/query-AQ6HNKW7.js +62 -0
  339. package/dist/query-KKXCMH3Q.js +236 -0
  340. package/dist/query-QXKGVHZL.js +231 -0
  341. package/dist/questionnaire-U7UYICEA.js +94 -0
  342. package/dist/read-ENUS7P3L.js +141 -0
  343. package/dist/reddit-KOC7KLYS.js +29 -0
  344. package/dist/refresh-2KEQLXRK.js +97 -0
  345. package/dist/refresh-JSCYTM4B.js +42 -0
  346. package/dist/release-X3Q3RFQC.js +63 -0
  347. package/dist/relevant-pages-NZKXWMNA.js +99 -0
  348. package/dist/remove-6FXTPEB6.js +49 -0
  349. package/dist/remove-RYR6EAJY.js +53 -0
  350. package/dist/reopen-PIKLC5OW.js +66 -0
  351. package/dist/rerun-2HBMXJ55.js +97 -0
  352. package/dist/research-ZBZONY3D.js +75 -0
  353. package/dist/research-ZTA4XKNA.js +265 -0
  354. package/dist/reset-7YTMXVNX.js +57 -0
  355. package/dist/reset-Q3XSD4WI.js +57 -0
  356. package/dist/resolve-P3AT2S6A.js +124 -0
  357. package/dist/retry-CEZLEN7Z.js +63 -0
  358. package/dist/retry-YNNFUDWI.js +65 -0
  359. package/dist/retry-failed-FCS6PNUZ.js +45 -0
  360. package/dist/revenue-6PR3BJFJ.js +91 -0
  361. package/dist/rule-writes-WT6DQZZE.js +530 -0
  362. package/dist/rules-R7NK5X4Z.js +99 -0
  363. package/dist/rules-Y75KR2PC.js +217 -0
  364. package/dist/rules-add-2GIJGODB.js +465 -0
  365. package/dist/run-CDMNDJ7B.js +72 -0
  366. package/dist/run-RORVKARV.js +69 -0
  367. package/dist/scaffold-ad-DDGYTRFK.js +1513 -0
  368. package/dist/scaffold-static-ad-ES5AIQPA.js +1012 -0
  369. package/dist/scaffold-video-NWRJZQ7N.js +885 -0
  370. package/dist/schedule-2ELAAXVW.js +64 -0
  371. package/dist/schedule-XFEPEQTN.js +67 -0
  372. package/dist/scheduled-agents-RRAWQYPE.js +55 -0
  373. package/dist/schema-FHP43TLD.js +135 -0
  374. package/dist/scrape-D3XGARHR.js +2209 -0
  375. package/dist/screenshot-5LWUP5VN.js +103 -0
  376. package/dist/search-4DBP6EH5.js +92 -0
  377. package/dist/search-G6W4LGVZ.js +177 -0
  378. package/dist/search-HNRANK6H.js +51 -0
  379. package/dist/search-KGE3BSSH.js +228 -0
  380. package/dist/search-O3AOWEXC.js +26 -0
  381. package/dist/search-QQDR74KQ.js +91 -0
  382. package/dist/search-copy-EB3TONDS.js +168 -0
  383. package/dist/seeds-RGIFHHYC.js +101 -0
  384. package/dist/select-GFPXXVBU.js +110 -0
  385. package/dist/sends-4ZO6BNZ4.js +349 -0
  386. package/dist/sequences-SSLZ3XTP.js +146 -0
  387. package/dist/set-prompt-TQDOBUFT.js +199 -0
  388. package/dist/setup-links-CK7LBYJK.js +144 -0
  389. package/dist/shared-UPMEBTVP.js +32 -0
  390. package/dist/shopify-SOTGSWXW.js +4009 -0
  391. package/dist/site-IAIGIP3R.js +180 -0
  392. package/dist/sitemaps-P3K5Z4TW.js +77 -0
  393. package/dist/sites-TURWC53D.js +97 -0
  394. package/dist/skills-PDHUHP2T.js +47 -0
  395. package/dist/sources-62MIDG3D.js +457 -0
  396. package/dist/sources-D5XODGIV.js +30 -0
  397. package/dist/stale-4STBM2Z3.js +90 -0
  398. package/dist/stats-XNKAJD2Z.js +34 -0
  399. package/dist/status-BKSOFB53.js +65 -0
  400. package/dist/sticker-MWICUYQM.js +103 -0
  401. package/dist/stock-F5QNFRPM.js +212 -0
  402. package/dist/studies-5G67ODR2.js +250 -0
  403. package/dist/studio-ZRAZ2C25.js +49 -0
  404. package/dist/study-writes-34BJFZAZ.js +471 -0
  405. package/dist/suggest-KCN2NDYE.js +66 -0
  406. package/dist/sync-QVEUQKU5.js +279 -0
  407. package/dist/sync-TANGFXUN.js +55 -0
  408. package/dist/sync-VPE5G6YX.js +57 -0
  409. package/dist/sync-definition-VSNVCRNG.js +70 -0
  410. package/dist/tag-NKAHDL35.js +57 -0
  411. package/dist/tag-manager-3GIW6BPB.js +43 -0
  412. package/dist/tags-CBNWQTFX.js +23 -0
  413. package/dist/tags-IFBIJ7BE.js +23 -0
  414. package/dist/tags-J6IPWIZ5.js +227 -0
  415. package/dist/tags-XPLXA3LV.js +26 -0
  416. package/dist/tags-ZV7JAF6S.js +23 -0
  417. package/dist/targeting-TVZPIUUI.js +762 -0
  418. package/dist/targeting-constants-RJS2STR5.js +118 -0
  419. package/dist/targeting-criteria-VVZQFPNS.js +113 -0
  420. package/dist/targets-EQAZUKT6.js +106 -0
  421. package/dist/terms-AATAGKPT.js +102 -0
  422. package/dist/testimonials-5MA427KH.js +32 -0
  423. package/dist/themes-WMZJWXFT.js +95 -0
  424. package/dist/top-companies-V5FVQMCS.js +111 -0
  425. package/dist/transcript-2TE2R4DH.js +165 -0
  426. package/dist/translate-XIF6VTDN.js +603 -0
  427. package/dist/triggers-ZMNQ6W3M.js +144 -0
  428. package/dist/tweets-MLDLLLDB.js +123 -0
  429. package/dist/unfollow-OEMFPAFS.js +46 -0
  430. package/dist/unlink-HRCAROB3.js +70 -0
  431. package/dist/unstage-5WSEDFNH.js +88 -0
  432. package/dist/unstage-65DUBYNZ.js +96 -0
  433. package/dist/update-A64IC24P.js +101 -0
  434. package/dist/update-BESMEMQU.js +155 -0
  435. package/dist/update-CADTFTYC.js +81 -0
  436. package/dist/update-WU4FAGEA.js +192 -0
  437. package/dist/update-ZUBU5NQP.js +66 -0
  438. package/dist/upload-FR6WRGXI.js +137 -0
  439. package/dist/upload-GXS5CTOR.js +155 -0
  440. package/dist/upscale-BCI42TCP.js +109 -0
  441. package/dist/url-options-QLDSJ7QJ.js +131 -0
  442. package/dist/url-params-YWIBMV3P.js +101 -0
  443. package/dist/use-26VARHJT.js +111 -0
  444. package/dist/validate-5EWYG4QS.js +125 -0
  445. package/dist/variant-F4EEYQJ7.js +338 -0
  446. package/dist/videos-MXEQHDMN.js +41 -0
  447. package/dist/view-X65GETAV.js +133 -0
  448. package/dist/viewer-check-QI4HKF7A.js +83 -0
  449. package/dist/web-DYT5YHEU.js +173 -0
  450. package/dist/winners-5PRDG7GT.js +113 -0
  451. package/dist/winning-ads-YKBB2UZC.js +86 -0
  452. package/dist/write-commands-OBQPQUIE.js +721 -0
  453. package/dist/write-commands-SIOVTRHH.js +1169 -0
  454. package/dist/write-commands-USXHGCVT.js +1524 -0
  455. package/dist/write-commands-XLZCRVTU.js +206 -0
  456. package/dist/x-OIDZY7DM.js +47 -0
  457. package/package.json +1 -1
  458. package/dist/account-DUGYQJEM.js +0 -82
  459. package/dist/account-NSRT5KE6.js +0 -139
  460. package/dist/account-OXD426YD.js +0 -82
  461. package/dist/account-assets-QMKT5AT7.js +0 -290
  462. package/dist/account-level-BELF6JHB.js +0 -611
  463. package/dist/account-reads-GQWTMLTY.js +0 -219
  464. package/dist/account-users-BXJQ4XZV.js +0 -64
  465. package/dist/account-writes-VRRLT356.js +0 -68
  466. package/dist/accounts-45MUDNOM.js +0 -76
  467. package/dist/accounts-DXQ3DHMB.js +0 -80
  468. package/dist/accounts-KQ7NCM4L.js +0 -115
  469. package/dist/accounts-KXQY6WKR.js +0 -701
  470. package/dist/accounts-ZFQYZT3J.js +0 -119
  471. package/dist/actions-LI43PTFN.js +0 -55
  472. package/dist/active-entities-3266UJYN.js +0 -103
  473. package/dist/activecampaign-5A6YHDJW.js +0 -938
  474. package/dist/activities-ORMACIG2.js +0 -75
  475. package/dist/ad-group-writes-Y6CCMPCM.js +0 -172
  476. package/dist/ad-groups-TW2UKDVU.js +0 -70
  477. package/dist/ad-writes-J3UVUH7D.js +0 -176
  478. package/dist/add-CKJXQUVI.js +0 -97
  479. package/dist/add-NJUG3IQ2.js +0 -81
  480. package/dist/add-TJHGYZYH.js +0 -85
  481. package/dist/add-W4HEMTFL.js +0 -107
  482. package/dist/add-XYSUKZSU.js +0 -148
  483. package/dist/add-ZSKEB3CI.js +0 -305
  484. package/dist/add-accounts-IRHBFNNC.js +0 -91
  485. package/dist/ads-5CJQRTUN.js +0 -79
  486. package/dist/ads-DI3J3KCQ.js +0 -128
  487. package/dist/ads-H5AEYIY3.js +0 -120
  488. package/dist/ads-XXSBCX4B.js +0 -48
  489. package/dist/adsets-BUIT7HF2.js +0 -182
  490. package/dist/advertisers-5XCIZ7WS.js +0 -125
  491. package/dist/advertisers-KPVUVXZZ.js +0 -123
  492. package/dist/analytics-4WBRNSUC.js +0 -447
  493. package/dist/analytics-XT4ANMLP.js +0 -2437
  494. package/dist/animate-Q43SOWB4.js +0 -480
  495. package/dist/approved-RP5ADN7E.js +0 -73
  496. package/dist/asset-writes-JVFE457M.js +0 -50
  497. package/dist/assign-SQK4UF3I.js +0 -80
  498. package/dist/audience-size-5Y5Q6UVA.js +0 -76
  499. package/dist/audience-writes-DWSCHYQF.js +0 -327
  500. package/dist/audiences-4MYDTY74.js +0 -280
  501. package/dist/audiences-5TOTVZMK.js +0 -85
  502. package/dist/audiences-PYBJU2GV.js +0 -106
  503. package/dist/audit-GOZNIXNM.js +0 -154
  504. package/dist/audit-SACXTAIP.js +0 -88
  505. package/dist/autocomplete-36S76BGA.js +0 -114
  506. package/dist/avatars-SDQ5LCNG.js +0 -38
  507. package/dist/bid-pricing-6DFGC6YC.js +0 -103
  508. package/dist/brief-2UXKUTFC.js +0 -543
  509. package/dist/businesses-F6PN34WK.js +0 -54
  510. package/dist/campaign-groups-32LDB42N.js +0 -99
  511. package/dist/campaign-writes-62V55CNW.js +0 -168
  512. package/dist/campaign-writes-BHS3POAH.js +0 -176
  513. package/dist/campaigns-2Z6WXIVA.js +0 -130
  514. package/dist/campaigns-I5GSGZDJ.js +0 -111
  515. package/dist/campaigns-IRMLPW6N.js +0 -78
  516. package/dist/campaigns-OGNE4XHM.js +0 -113
  517. package/dist/canvas-HGU7FJ34.js +0 -46
  518. package/dist/capabilities-EDXVGZXC.js +0 -147
  519. package/dist/cards-HUXBNMEM.js +0 -85
  520. package/dist/catalogs-OEUNVE4N.js +0 -782
  521. package/dist/catalogs-WYRRTRCM.js +0 -130
  522. package/dist/changes-MVCX3GLE.js +0 -148
  523. package/dist/changes-MVCX3GLE.js.map +0 -1
  524. package/dist/chatgpt-6KBW7F5S.js +0 -47
  525. package/dist/chats-HFKSZWZD.js +0 -449
  526. package/dist/check-GRVUI3LI.js +0 -107
  527. package/dist/chunk-26UW2GMK.js +0 -8954
  528. package/dist/chunk-2L24FULD.js +0 -134
  529. package/dist/chunk-2L24FULD.js.map +0 -1
  530. package/dist/chunk-2LGDWOD7.js +0 -170
  531. package/dist/chunk-37QHT7J4.js +0 -91
  532. package/dist/chunk-3J52GJAY.js +0 -46
  533. package/dist/chunk-4ICSKDI7.js +0 -454
  534. package/dist/chunk-5G6R3WYN.js +0 -58
  535. package/dist/chunk-5HPKYRTE.js +0 -45
  536. package/dist/chunk-5NJQXV4K.js +0 -142
  537. package/dist/chunk-65CQYRMK.js +0 -98
  538. package/dist/chunk-6KEVNO5O.js +0 -191
  539. package/dist/chunk-6MZFOMLU.js +0 -225
  540. package/dist/chunk-724E32DM.js +0 -399
  541. package/dist/chunk-72JEATZ5.js +0 -51
  542. package/dist/chunk-7SNNQCDD.js +0 -274
  543. package/dist/chunk-AL4MRNYI.js +0 -709
  544. package/dist/chunk-AQ6LJ7EI.js +0 -23
  545. package/dist/chunk-BS4PRGEJ.js +0 -73
  546. package/dist/chunk-BU7W7MKF.js +0 -42
  547. package/dist/chunk-CQMAR4BH.js +0 -69
  548. package/dist/chunk-CXYX6G3I.js +0 -98
  549. package/dist/chunk-CZESYOCC.js +0 -94
  550. package/dist/chunk-CZTKRP6M.js +0 -103
  551. package/dist/chunk-D7FJ5KHG.js +0 -39
  552. package/dist/chunk-DSDI5DY3.js +0 -115
  553. package/dist/chunk-DYWKYP7Z.js +0 -203
  554. package/dist/chunk-EDWW3THE.js +0 -344
  555. package/dist/chunk-EENYLJUN.js +0 -225
  556. package/dist/chunk-EHNORFUW.js +0 -225
  557. package/dist/chunk-EJMPKO6V.js +0 -287
  558. package/dist/chunk-FAV6GUOZ.js +0 -24026
  559. package/dist/chunk-G3ZUMNLG.js +0 -66
  560. package/dist/chunk-G4JTXVLA.js +0 -74
  561. package/dist/chunk-GAP7SOGA.js +0 -188
  562. package/dist/chunk-GFWWHCBF.js +0 -229
  563. package/dist/chunk-GFWWHCBF.js.map +0 -1
  564. package/dist/chunk-H6GTG665.js +0 -106
  565. package/dist/chunk-HHMBHLX6.js +0 -910
  566. package/dist/chunk-HNELOMY2.js +0 -1239
  567. package/dist/chunk-HNELOMY2.js.map +0 -1
  568. package/dist/chunk-IIK4WNWV.js +0 -84
  569. package/dist/chunk-J6KCVW6N.js +0 -207
  570. package/dist/chunk-KDTSXLY7.js +0 -685
  571. package/dist/chunk-KE5TI23P.js +0 -430
  572. package/dist/chunk-KV4E4KGE.js +0 -831
  573. package/dist/chunk-KY6Q4WLC.js +0 -224
  574. package/dist/chunk-LBJ2CLRT.js +0 -106
  575. package/dist/chunk-LIBSSGE4.js +0 -275
  576. package/dist/chunk-LK5OKVCM.js +0 -544
  577. package/dist/chunk-NPDZ4EO6.js +0 -297
  578. package/dist/chunk-NPGPRZW2.js +0 -1313
  579. package/dist/chunk-NPGPRZW2.js.map +0 -1
  580. package/dist/chunk-OEH7ANJJ.js +0 -91
  581. package/dist/chunk-OVC2PIOP.js +0 -111
  582. package/dist/chunk-P5HG6WDH.js +0 -152
  583. package/dist/chunk-PBKUESJD.js +0 -191
  584. package/dist/chunk-PGAYESXE.js +0 -25
  585. package/dist/chunk-PZSOJYER.js +0 -604
  586. package/dist/chunk-QBCZLD3A.js +0 -2209
  587. package/dist/chunk-QFODAMYR.js +0 -69
  588. package/dist/chunk-QY7EK6Q4.js +0 -217
  589. package/dist/chunk-QYH2UZAK.js +0 -324
  590. package/dist/chunk-RIVHJC6L.js +0 -35
  591. package/dist/chunk-SKVQRTDO.js +0 -197
  592. package/dist/chunk-SNSLYZIT.js +0 -64
  593. package/dist/chunk-TLNYAZX5.js +0 -76
  594. package/dist/chunk-TWFZIHKK.js +0 -219
  595. package/dist/chunk-UB34H4VD.js +0 -547
  596. package/dist/chunk-UZEKIMLY.js +0 -163
  597. package/dist/chunk-VAQOSV3I.js +0 -138
  598. package/dist/chunk-VIRPAJEF.js +0 -97
  599. package/dist/chunk-VKYDHIBT.js +0 -169
  600. package/dist/chunk-WLD443MX.js +0 -19
  601. package/dist/chunk-WQIHLJAO.js +0 -1902
  602. package/dist/chunk-XGN3BGSL.js +0 -930
  603. package/dist/chunk-XZMO52BP.js +0 -56
  604. package/dist/chunk-YS7T735Q.js +0 -89
  605. package/dist/chunk-YXUIVOUL.js +0 -139
  606. package/dist/chunk-ZSZ76MUL.js +0 -125
  607. package/dist/chunk-ZU6JW3ZB.js +0 -26
  608. package/dist/chunk-ZW2CN6L6.js +0 -288
  609. package/dist/cite-TRNZYG4W.js +0 -191
  610. package/dist/claim-NUUED375.js +0 -200
  611. package/dist/client-45COYUUH.js +0 -19
  612. package/dist/code-K4YTLOPA.js +0 -76
  613. package/dist/companies-3EKQ6PBV.js +0 -198
  614. package/dist/company-35ZI77NI.js +0 -308
  615. package/dist/complete-V2HNULPO.js +0 -84
  616. package/dist/config-TCAHWE6T.js +0 -88
  617. package/dist/connect-77K3A6WK.js +0 -45
  618. package/dist/content-MKJP7T7L.js +0 -85
  619. package/dist/conversation-MWBPIT4W.js +0 -96
  620. package/dist/conversion-report-OFV4EKTA.js +0 -127
  621. package/dist/conversion-upload-command-U36QYHUT.js +0 -439
  622. package/dist/conversion-writes-B3H6VLA2.js +0 -122
  623. package/dist/conversions-RXNIACU5.js +0 -140
  624. package/dist/conversions-UGRVDRWU.js +0 -78
  625. package/dist/copy-writes-2B36QJUY.js +0 -170
  626. package/dist/countries-6ST54UGJ.js +0 -82
  627. package/dist/create-AE52ZZMG.js +0 -239
  628. package/dist/create-K2EUYE54.js +0 -218
  629. package/dist/create-L53KW6GN.js +0 -62
  630. package/dist/create-RJHGT2S4.js +0 -135
  631. package/dist/creatives-22BYP5VN.js +0 -118
  632. package/dist/creatives-2JP24JNL.js +0 -229
  633. package/dist/creatives-UPZU7BLY.js +0 -58
  634. package/dist/credentials-WRC7ERSS.js +0 -290
  635. package/dist/critique-VTNN6A5I.js +0 -232
  636. package/dist/crm-2MZLMSEV.js +0 -323
  637. package/dist/crm-VO6ZBW64.js +0 -227
  638. package/dist/crm-VO6ZBW64.js.map +0 -1
  639. package/dist/currency-XFY2EX72.js +0 -88
  640. package/dist/custom-conversions-V7QPZIB4.js +0 -128
  641. package/dist/customers-MHQ72YBY.js +0 -65
  642. package/dist/decide-JZXG6LZR.js +0 -199
  643. package/dist/delete-5NEAIDA4.js +0 -85
  644. package/dist/delete-6WKVGKRF.js +0 -57
  645. package/dist/delete-POHL3TKX.js +0 -69
  646. package/dist/delete-Q7J734W2.js +0 -71
  647. package/dist/delete-QFASUSVU.js +0 -67
  648. package/dist/delete-ULI3MVAD.js +0 -69
  649. package/dist/demographics-5SXTDRFU.js +0 -141
  650. package/dist/describe-MA54W67X.js +0 -97
  651. package/dist/describe-MJ5SOVWY.js +0 -97
  652. package/dist/discard-P4PGGYYO.js +0 -69
  653. package/dist/discover-J5344ATV.js +0 -172
  654. package/dist/discover-PPMLFJMU.js +0 -93
  655. package/dist/domain-RINRCQ5G.js +0 -101
  656. package/dist/download-H3ZDQTFG.js +0 -337
  657. package/dist/download-HPYGPNHN.js +0 -172
  658. package/dist/draft-2JVWCYRF.js +0 -134
  659. package/dist/draft-4WMYCA7I.js +0 -315
  660. package/dist/draft-4WPWILSX.js +0 -220
  661. package/dist/draft-7VGBJIJU.js +0 -260
  662. package/dist/draft-DR5BJK7V.js +0 -138
  663. package/dist/draft-FWCF4Y6P.js +0 -332
  664. package/dist/draft-M7XINDQU.js +0 -374
  665. package/dist/draft-OIGJUFOH.js +0 -557
  666. package/dist/experiment-O6726OBP.js +0 -1397
  667. package/dist/experiments-NULZPBF2.js +0 -236
  668. package/dist/export-6WWVO4O6.js +0 -168
  669. package/dist/extract-Y3OZG5DZ.js +0 -143
  670. package/dist/facets-HIADYZQQ.js +0 -117
  671. package/dist/favorites-54Z7PTYR.js +0 -178
  672. package/dist/feed-TAGQWMRK.js +0 -177
  673. package/dist/feedback-WEZEKTCH.js +0 -115
  674. package/dist/feedback-Y4AXR354.js +0 -136
  675. package/dist/feedback-record-YZNGRSNR.js +0 -269
  676. package/dist/fetch-T6WPGAWP.js +0 -204
  677. package/dist/find-TTJH5NVJ.js +0 -144
  678. package/dist/fit-MLDFA4ZK.js +0 -65
  679. package/dist/flows-XWU2XNYP.js +0 -250
  680. package/dist/follow-SX6BV6VZ.js +0 -94
  681. package/dist/follow-competitors-UBJJHX36.js +0 -112
  682. package/dist/following-L7WUEMZ2.js +0 -113
  683. package/dist/forecast-E5QXQFKQ.js +0 -121
  684. package/dist/forecast-HFCRTFIF.js +0 -169
  685. package/dist/funding-7M4TJ3MW.js +0 -85
  686. package/dist/funnel-NMC3JWTF.js +0 -397
  687. package/dist/ga4-XFJO7VK2.js +0 -55
  688. package/dist/generate-22HT24SA.js +0 -263
  689. package/dist/get-AKTMYS57.js +0 -82
  690. package/dist/get-JIB6PMGI.js +0 -59
  691. package/dist/get-JQE7XWKL.js +0 -62
  692. package/dist/get-MK6M4DKF.js +0 -62
  693. package/dist/get-Q4M6G7YN.js +0 -92
  694. package/dist/get-QS2A6YVM.js +0 -56
  695. package/dist/get-UFCNLDE2.js +0 -74
  696. package/dist/get-X44ZCIFN.js +0 -38
  697. package/dist/gif-TBKH7VSP.js +0 -111
  698. package/dist/google-TOO3FDZ6.js +0 -3285
  699. package/dist/google-TOO3FDZ6.js.map +0 -1
  700. package/dist/google-YDGZ2Q3M.js +0 -163
  701. package/dist/google-ads-AFJV5ZJO.js +0 -198
  702. package/dist/group-45M7V46T.js +0 -43
  703. package/dist/group-RAXOR36M.js +0 -43
  704. package/dist/gsc-ILEIJYWP.js +0 -30
  705. package/dist/history-6RCRBB4Q.js +0 -153
  706. package/dist/history-BEEREY26.js +0 -69
  707. package/dist/history-T6Y5IR4V.js +0 -102
  708. package/dist/hubspot-SNLOCDPF.js +0 -782
  709. package/dist/hubspot-SNLOCDPF.js.map +0 -1
  710. package/dist/icon-CYUIAFTE.js +0 -138
  711. package/dist/ideas-VTBVERCN.js +0 -45
  712. package/dist/images-36DGQZMH.js +0 -92
  713. package/dist/improve-PHFWWTOL.js +0 -86
  714. package/dist/ingest-MLIOEHL3.js +0 -131
  715. package/dist/ingest-OJV3CYYK.js +0 -28
  716. package/dist/insights-A5BKVXFQ.js +0 -132
  717. package/dist/insights-U6QAA77O.js +0 -658
  718. package/dist/inspect-6P2WNFAC.js +0 -192
  719. package/dist/inspiration-WGUU7W5Z.js +0 -53
  720. package/dist/instant-experiences-U6U3FYIH.js +0 -264
  721. package/dist/intent-PU3XUDLL.js +0 -95
  722. package/dist/job-RCEPBGZC.js +0 -202
  723. package/dist/job-create-MDVJ3E7K.js +0 -109
  724. package/dist/job-status-53FJIFYR.js +0 -74
  725. package/dist/keep-ZIHW5OEQ.js +0 -78
  726. package/dist/keyword-gap-B6T7ZFTZ.js +0 -130
  727. package/dist/keyword-metrics-IDMR3ES2.js +0 -200
  728. package/dist/keywords-for-site-V3SGYZDW.js +0 -131
  729. package/dist/knowledge-PN3FAZJ2.js +0 -195
  730. package/dist/landing-7PZPYD3M.js +0 -28
  731. package/dist/landings-FBRB3FF5.js +0 -151
  732. package/dist/languages-ETKG5WM3.js +0 -40
  733. package/dist/languages-Q5RMPGI4.js +0 -55
  734. package/dist/launches-EQ4VS2OR.js +0 -19
  735. package/dist/layerize-SX6LQK35.js +0 -190
  736. package/dist/lead-routes-RLYGO47M.js +0 -733
  737. package/dist/leads-IG3IIHXG.js +0 -541
  738. package/dist/leads-TWABHSJH.js +0 -115
  739. package/dist/learn-MXJSGDVI.js +0 -207
  740. package/dist/library-F4GB5X6G.js +0 -212
  741. package/dist/lighthouse-D3BJGHLO.js +0 -75
  742. package/dist/line-item-writes-2R7VSOWO.js +0 -211
  743. package/dist/line-items-MY6JP2W6.js +0 -107
  744. package/dist/link-LR5LSFTA.js +0 -67
  745. package/dist/linkedin-UJEBBO7G.js +0 -1344
  746. package/dist/linkedin-person-5LJEMW54.js +0 -139
  747. package/dist/list-2NWMHKTR.js +0 -93
  748. package/dist/list-5H6UAX6T.js +0 -57
  749. package/dist/list-5O5NB56G.js +0 -306
  750. package/dist/list-6AAKH6UV.js +0 -67
  751. package/dist/list-ACJBOHPS.js +0 -50
  752. package/dist/list-COWCCJ4F.js +0 -65
  753. package/dist/list-EEQJSTLN.js +0 -51
  754. package/dist/list-OTZB7DOX.js +0 -76
  755. package/dist/list-UYQOLFPN.js +0 -154
  756. package/dist/locations-VPZYTFVK.js +0 -40
  757. package/dist/locations-ZO7F75KT.js +0 -69
  758. package/dist/log-LPY5KYGP.js +0 -95
  759. package/dist/logo-SBIDRBA2.js +0 -19
  760. package/dist/lookup-BGNLEZMU.js +0 -23
  761. package/dist/make-UK2OYKCZ.js +0 -1367
  762. package/dist/map-XEJOI63E.js +0 -436
  763. package/dist/mcp-Y43SKNHV.js +0 -729
  764. package/dist/media-422INJCD.js +0 -89
  765. package/dist/media-AT3VV3PU.js +0 -18
  766. package/dist/media-sources-POL5DMD4.js +0 -35
  767. package/dist/members-5EJVXTE7.js +0 -47
  768. package/dist/meme-VR3IHBRW.js +0 -108
  769. package/dist/meta-XUHI3E3L.js +0 -122
  770. package/dist/metrics-J3WD2CUD.js +0 -152
  771. package/dist/normalize-IOW2V6E7.js +0 -144
  772. package/dist/options-YD6XFRZV.js +0 -125
  773. package/dist/organization-KORFOK7Q.js +0 -949
  774. package/dist/output-2MGOSPDE.js +0 -24
  775. package/dist/page-WKWRKLTC.js +0 -105
  776. package/dist/page-photos-ABK4CJME.js +0 -118
  777. package/dist/pages-LT3KCVC3.js +0 -67
  778. package/dist/performance-BXSNPNC3.js +0 -27
  779. package/dist/performance-Z353JXHB.js +0 -5565
  780. package/dist/pinterest-42NLOZW4.js +0 -105
  781. package/dist/pixels-3BHTXTDV.js +0 -62
  782. package/dist/pixels-IGJFC2XC.js +0 -109
  783. package/dist/plan-ATH2VCVA.js +0 -208
  784. package/dist/posts-K3QTBX2B.js +0 -36
  785. package/dist/preview-3UGPTK44.js +0 -101
  786. package/dist/preview-OV2EZ6YF.js +0 -245
  787. package/dist/profile-OWDBNPNI.js +0 -159
  788. package/dist/promoted-tweet-writes-3D6GG6K4.js +0 -183
  789. package/dist/promoted-tweets-BGQJDEQ2.js +0 -119
  790. package/dist/properties-VSOMFI5V.js +0 -101
  791. package/dist/publish-DBUBFV5R.js +0 -350
  792. package/dist/query-5OS6M4ON.js +0 -231
  793. package/dist/query-NTWXOWPZ.js +0 -236
  794. package/dist/query-ZYG5RCCW.js +0 -62
  795. package/dist/questionnaire-HUNGUZNQ.js +0 -94
  796. package/dist/read-DXZJ7UOJ.js +0 -141
  797. package/dist/reddit-GPSRX4TI.js +0 -29
  798. package/dist/refresh-3X45Q6ZM.js +0 -97
  799. package/dist/refresh-BKYZXXRF.js +0 -42
  800. package/dist/release-PE7KBFGK.js +0 -63
  801. package/dist/relevant-pages-7U6I2WPM.js +0 -99
  802. package/dist/remove-2A3XDOKA.js +0 -53
  803. package/dist/remove-MX2FV44C.js +0 -49
  804. package/dist/reopen-LHMLXG6G.js +0 -66
  805. package/dist/rerun-S4VWOIKE.js +0 -97
  806. package/dist/research-55XA4Z2O.js +0 -265
  807. package/dist/research-JN3JGEEL.js +0 -75
  808. package/dist/reset-C5SDRQTX.js +0 -57
  809. package/dist/reset-IY7GNRLF.js +0 -57
  810. package/dist/resolve-PCN7BR7U.js +0 -124
  811. package/dist/retry-2KYMH2IV.js +0 -63
  812. package/dist/retry-KUWJ4GGA.js +0 -65
  813. package/dist/retry-failed-T6PK5SKL.js +0 -45
  814. package/dist/revenue-CRZRJJ7H.js +0 -91
  815. package/dist/rule-writes-HUBHHYEO.js +0 -530
  816. package/dist/rules-47LFGCPW.js +0 -217
  817. package/dist/rules-EKOXAK2O.js +0 -99
  818. package/dist/rules-add-IC3SXNYW.js +0 -465
  819. package/dist/run-WUD5U5GY.js +0 -72
  820. package/dist/run-Y4SEFETX.js +0 -69
  821. package/dist/scaffold-ad-OJ4WOJM6.js +0 -1513
  822. package/dist/scaffold-static-ad-EXUKKYSD.js +0 -1012
  823. package/dist/scaffold-video-7PDZZSKD.js +0 -885
  824. package/dist/schedule-ANIYXLG6.js +0 -67
  825. package/dist/schedule-VCL2OPIL.js +0 -64
  826. package/dist/scheduled-agents-YAHYCFDA.js +0 -55
  827. package/dist/schema-L6DGAUB5.js +0 -135
  828. package/dist/scrape-O4X6VGV2.js +0 -2209
  829. package/dist/screenshot-RR6RA6CN.js +0 -103
  830. package/dist/search-6XKFFDMJ.js +0 -228
  831. package/dist/search-E75B5APM.js +0 -92
  832. package/dist/search-EKTUTXVN.js +0 -51
  833. package/dist/search-OUJUEORX.js +0 -177
  834. package/dist/search-OW3E2Z7Z.js +0 -91
  835. package/dist/search-YARSBZ6D.js +0 -26
  836. package/dist/search-copy-2KO3VR6R.js +0 -168
  837. package/dist/seeds-E64JKXWS.js +0 -101
  838. package/dist/select-R3NT7OI4.js +0 -110
  839. package/dist/sends-DEVRKO4M.js +0 -349
  840. package/dist/sequences-YIQSLKV5.js +0 -146
  841. package/dist/set-prompt-F3SYRT22.js +0 -199
  842. package/dist/setup-links-AHWFGUAO.js +0 -144
  843. package/dist/shared-V5ZS25EO.js +0 -32
  844. package/dist/shopify-BPQCUFFX.js +0 -4009
  845. package/dist/site-KYB2EL72.js +0 -180
  846. package/dist/sitemaps-ZSISKT6L.js +0 -77
  847. package/dist/sites-XMZ3HPHT.js +0 -97
  848. package/dist/skills-6MJC6CSZ.js +0 -47
  849. package/dist/sources-JYOOLCOU.js +0 -30
  850. package/dist/sources-X4URMRLY.js +0 -457
  851. package/dist/stale-KFVY7LSB.js +0 -90
  852. package/dist/stats-FSAXWTSE.js +0 -34
  853. package/dist/status-YVRZBK56.js +0 -65
  854. package/dist/sticker-HMHR7QM7.js +0 -103
  855. package/dist/stock-IAQBUPGQ.js +0 -212
  856. package/dist/studies-QLSKON6M.js +0 -250
  857. package/dist/studio-ZLBBYHNY.js +0 -49
  858. package/dist/study-writes-GBUUKX4O.js +0 -471
  859. package/dist/suggest-DSMKK4FP.js +0 -66
  860. package/dist/sync-KJEXXD3P.js +0 -57
  861. package/dist/sync-WKV3N3LD.js +0 -279
  862. package/dist/sync-XFK4U6TA.js +0 -55
  863. package/dist/sync-definition-BQUVWLCC.js +0 -70
  864. package/dist/tag-L2H5TSFJ.js +0 -57
  865. package/dist/tag-manager-5WZPX2FJ.js +0 -43
  866. package/dist/tags-7CEVWFEZ.js +0 -23
  867. package/dist/tags-BU4KLB37.js +0 -26
  868. package/dist/tags-HKR2GWXV.js +0 -227
  869. package/dist/tags-SKGPECNG.js +0 -23
  870. package/dist/tags-ZLPLHP2G.js +0 -23
  871. package/dist/targeting-DAUTJDUB.js +0 -762
  872. package/dist/targeting-constants-ZS422W5A.js +0 -118
  873. package/dist/targeting-criteria-4C4M3XLJ.js +0 -113
  874. package/dist/targets-C5K2OH3B.js +0 -106
  875. package/dist/terms-NX5CAJXT.js +0 -102
  876. package/dist/testimonials-OJV7EFGS.js +0 -32
  877. package/dist/themes-C4PPU427.js +0 -95
  878. package/dist/top-companies-IZQOKMBU.js +0 -111
  879. package/dist/transcript-K6W7VRA5.js +0 -165
  880. package/dist/translate-M6W6KZZS.js +0 -603
  881. package/dist/triggers-CQFQSODZ.js +0 -144
  882. package/dist/tweets-33OCH74J.js +0 -123
  883. package/dist/unfollow-G26NHR5X.js +0 -46
  884. package/dist/unlink-ITGOP2YH.js +0 -70
  885. package/dist/unstage-EAUF74PI.js +0 -88
  886. package/dist/unstage-OAPP6Z5V.js +0 -96
  887. package/dist/update-GX26VDM4.js +0 -66
  888. package/dist/update-HOFM27UT.js +0 -192
  889. package/dist/update-KXTP3VPI.js +0 -81
  890. package/dist/update-N5NA3JTW.js +0 -101
  891. package/dist/update-PCVDM7HO.js +0 -155
  892. package/dist/upload-3ZGL4WHA.js +0 -155
  893. package/dist/upload-SPCZNAUN.js +0 -137
  894. package/dist/upscale-X3B5CHG3.js +0 -109
  895. package/dist/url-options-C3ZOWN2L.js +0 -131
  896. package/dist/url-params-H4LQAYXG.js +0 -101
  897. package/dist/use-HYK67YKZ.js +0 -111
  898. package/dist/validate-XHQ4MIW5.js +0 -125
  899. package/dist/variant-MEHXEXFK.js +0 -338
  900. package/dist/videos-GY6YCGFH.js +0 -41
  901. package/dist/view-HTCYEBXN.js +0 -133
  902. package/dist/viewer-check-UCNIAY7X.js +0 -83
  903. package/dist/web-E7XDCTVJ.js +0 -173
  904. package/dist/winners-CGLS7SZ3.js +0 -113
  905. package/dist/winning-ads-L7FHCD75.js +0 -86
  906. package/dist/write-commands-F5XPPLOO.js +0 -1169
  907. package/dist/write-commands-HQQOJGP4.js +0 -721
  908. package/dist/write-commands-JESAYUEQ.js +0 -1524
  909. package/dist/write-commands-QNXR5ENS.js +0 -206
  910. package/dist/x-ROAUMBHA.js +0 -47
  911. /package/dist/{account-DUGYQJEM.js.map → account-B77TBYMN.js.map} +0 -0
  912. /package/dist/{account-NSRT5KE6.js.map → account-OCFXNHG7.js.map} +0 -0
  913. /package/dist/{account-OXD426YD.js.map → account-U6DFMD2V.js.map} +0 -0
  914. /package/dist/{account-assets-QMKT5AT7.js.map → account-assets-W7K2PUYB.js.map} +0 -0
  915. /package/dist/{account-level-BELF6JHB.js.map → account-level-Z2JEIJ3X.js.map} +0 -0
  916. /package/dist/{account-reads-GQWTMLTY.js.map → account-reads-X35O4MCA.js.map} +0 -0
  917. /package/dist/{account-users-BXJQ4XZV.js.map → account-users-UKKABT5U.js.map} +0 -0
  918. /package/dist/{account-writes-VRRLT356.js.map → account-writes-QSJ74QFR.js.map} +0 -0
  919. /package/dist/{accounts-45MUDNOM.js.map → accounts-55PDBEDN.js.map} +0 -0
  920. /package/dist/{accounts-KQ7NCM4L.js.map → accounts-AK4QIG24.js.map} +0 -0
  921. /package/dist/{accounts-ZFQYZT3J.js.map → accounts-HGCR3WFZ.js.map} +0 -0
  922. /package/dist/{accounts-DXQ3DHMB.js.map → accounts-QYNZXW2E.js.map} +0 -0
  923. /package/dist/{accounts-KXQY6WKR.js.map → accounts-XL2TMLGE.js.map} +0 -0
  924. /package/dist/{actions-LI43PTFN.js.map → actions-CVTRCHPG.js.map} +0 -0
  925. /package/dist/{active-entities-3266UJYN.js.map → active-entities-HR7NJJLU.js.map} +0 -0
  926. /package/dist/{activecampaign-5A6YHDJW.js.map → activecampaign-UNNM6J7M.js.map} +0 -0
  927. /package/dist/{activities-ORMACIG2.js.map → activities-DEWHKBID.js.map} +0 -0
  928. /package/dist/{ad-group-writes-Y6CCMPCM.js.map → ad-group-writes-QBHOPTT5.js.map} +0 -0
  929. /package/dist/{ad-groups-TW2UKDVU.js.map → ad-groups-JZDUFT6J.js.map} +0 -0
  930. /package/dist/{ad-writes-J3UVUH7D.js.map → ad-writes-QYJO4IB3.js.map} +0 -0
  931. /package/dist/{add-W4HEMTFL.js.map → add-3GOSW7LW.js.map} +0 -0
  932. /package/dist/{add-ZSKEB3CI.js.map → add-DPCBGUA5.js.map} +0 -0
  933. /package/dist/{add-TJHGYZYH.js.map → add-IMKVYDQV.js.map} +0 -0
  934. /package/dist/{add-NJUG3IQ2.js.map → add-PZEVRQ7Z.js.map} +0 -0
  935. /package/dist/{add-XYSUKZSU.js.map → add-QXI627AS.js.map} +0 -0
  936. /package/dist/{add-CKJXQUVI.js.map → add-SPQ4MOCQ.js.map} +0 -0
  937. /package/dist/{add-accounts-IRHBFNNC.js.map → add-accounts-D4V5K7SO.js.map} +0 -0
  938. /package/dist/{ads-XXSBCX4B.js.map → ads-LDCZ65B5.js.map} +0 -0
  939. /package/dist/{ads-H5AEYIY3.js.map → ads-QKVNPHBH.js.map} +0 -0
  940. /package/dist/{ads-DI3J3KCQ.js.map → ads-RTRWWEP5.js.map} +0 -0
  941. /package/dist/{ads-5CJQRTUN.js.map → ads-UMSWEI5X.js.map} +0 -0
  942. /package/dist/{adsets-BUIT7HF2.js.map → adsets-FEVYHKAQ.js.map} +0 -0
  943. /package/dist/{advertisers-5XCIZ7WS.js.map → advertisers-2GKICB23.js.map} +0 -0
  944. /package/dist/{advertisers-KPVUVXZZ.js.map → advertisers-3D36UJTQ.js.map} +0 -0
  945. /package/dist/{analytics-XT4ANMLP.js.map → analytics-YHOXWFBI.js.map} +0 -0
  946. /package/dist/{analytics-4WBRNSUC.js.map → analytics-ZPPZJETP.js.map} +0 -0
  947. /package/dist/{animate-Q43SOWB4.js.map → animate-WS63CZ3Y.js.map} +0 -0
  948. /package/dist/{approved-RP5ADN7E.js.map → approved-3XFZNRJR.js.map} +0 -0
  949. /package/dist/{asset-writes-JVFE457M.js.map → asset-writes-7RFZZYU7.js.map} +0 -0
  950. /package/dist/{assign-SQK4UF3I.js.map → assign-5P7OJBAH.js.map} +0 -0
  951. /package/dist/{audience-size-5Y5Q6UVA.js.map → audience-size-PHFJ22TX.js.map} +0 -0
  952. /package/dist/{audience-writes-DWSCHYQF.js.map → audience-writes-RUGU6KEC.js.map} +0 -0
  953. /package/dist/{audiences-PYBJU2GV.js.map → audiences-6GVUZUCN.js.map} +0 -0
  954. /package/dist/{audiences-5TOTVZMK.js.map → audiences-7OS2ZJYO.js.map} +0 -0
  955. /package/dist/{audiences-4MYDTY74.js.map → audiences-RSAUXKHR.js.map} +0 -0
  956. /package/dist/{audit-GOZNIXNM.js.map → audit-3GRXRDLR.js.map} +0 -0
  957. /package/dist/{audit-SACXTAIP.js.map → audit-4L7IKIRY.js.map} +0 -0
  958. /package/dist/{autocomplete-36S76BGA.js.map → autocomplete-GQLXBG5V.js.map} +0 -0
  959. /package/dist/{avatars-SDQ5LCNG.js.map → avatars-I73KFB3F.js.map} +0 -0
  960. /package/dist/{bid-pricing-6DFGC6YC.js.map → bid-pricing-6MZ7SC72.js.map} +0 -0
  961. /package/dist/{brief-2UXKUTFC.js.map → brief-MI4RLV4N.js.map} +0 -0
  962. /package/dist/{businesses-F6PN34WK.js.map → businesses-42NZP6FP.js.map} +0 -0
  963. /package/dist/{campaign-groups-32LDB42N.js.map → campaign-groups-QZ2NW5AW.js.map} +0 -0
  964. /package/dist/{campaign-writes-62V55CNW.js.map → campaign-writes-BGS53O4B.js.map} +0 -0
  965. /package/dist/{campaign-writes-BHS3POAH.js.map → campaign-writes-GKNH2EHV.js.map} +0 -0
  966. /package/dist/{campaigns-IRMLPW6N.js.map → campaigns-7RV65SXR.js.map} +0 -0
  967. /package/dist/{campaigns-OGNE4XHM.js.map → campaigns-FGIVPEVA.js.map} +0 -0
  968. /package/dist/{campaigns-2Z6WXIVA.js.map → campaigns-TO74Z7UH.js.map} +0 -0
  969. /package/dist/{campaigns-I5GSGZDJ.js.map → campaigns-YBPXM6B3.js.map} +0 -0
  970. /package/dist/{canvas-HGU7FJ34.js.map → canvas-YTSJAEOF.js.map} +0 -0
  971. /package/dist/{capabilities-EDXVGZXC.js.map → capabilities-YFXCTUJJ.js.map} +0 -0
  972. /package/dist/{cards-HUXBNMEM.js.map → cards-CAOGPPG4.js.map} +0 -0
  973. /package/dist/{catalogs-WYRRTRCM.js.map → catalogs-5LWEXG5X.js.map} +0 -0
  974. /package/dist/{catalogs-OEUNVE4N.js.map → catalogs-7IEXGLSR.js.map} +0 -0
  975. /package/dist/{chatgpt-6KBW7F5S.js.map → chatgpt-HLIQ7OJZ.js.map} +0 -0
  976. /package/dist/{chats-HFKSZWZD.js.map → chats-D5W2UWD4.js.map} +0 -0
  977. /package/dist/{check-GRVUI3LI.js.map → check-FFMWUB72.js.map} +0 -0
  978. /package/dist/{chunk-DSDI5DY3.js.map → chunk-2DAWUWA4.js.map} +0 -0
  979. /package/dist/{chunk-37QHT7J4.js.map → chunk-2DVFPCH3.js.map} +0 -0
  980. /package/dist/{chunk-TLNYAZX5.js.map → chunk-2LBQNTTH.js.map} +0 -0
  981. /package/dist/{chunk-PBKUESJD.js.map → chunk-2VHYY4RU.js.map} +0 -0
  982. /package/dist/{chunk-ZW2CN6L6.js.map → chunk-3E74OM2E.js.map} +0 -0
  983. /package/dist/{chunk-EDWW3THE.js.map → chunk-3FLSRUID.js.map} +0 -0
  984. /package/dist/{chunk-BU7W7MKF.js.map → chunk-3LYT3NQX.js.map} +0 -0
  985. /package/dist/{chunk-LBJ2CLRT.js.map → chunk-4UNJ4ENA.js.map} +0 -0
  986. /package/dist/{chunk-KY6Q4WLC.js.map → chunk-533R4P5O.js.map} +0 -0
  987. /package/dist/{chunk-XZMO52BP.js.map → chunk-5E4Y6RVY.js.map} +0 -0
  988. /package/dist/{chunk-QY7EK6Q4.js.map → chunk-5H6N36LS.js.map} +0 -0
  989. /package/dist/{chunk-HHMBHLX6.js.map → chunk-6I7GJDBX.js.map} +0 -0
  990. /package/dist/{chunk-CQMAR4BH.js.map → chunk-6IR7IQPV.js.map} +0 -0
  991. /package/dist/{chunk-VIRPAJEF.js.map → chunk-6PO3WSFJ.js.map} +0 -0
  992. /package/dist/{chunk-J6KCVW6N.js.map → chunk-6QNXBEIN.js.map} +0 -0
  993. /package/dist/{chunk-ZSZ76MUL.js.map → chunk-BESCYH3K.js.map} +0 -0
  994. /package/dist/{chunk-SNSLYZIT.js.map → chunk-BGMIO2FR.js.map} +0 -0
  995. /package/dist/{chunk-CZTKRP6M.js.map → chunk-BVGRKVHL.js.map} +0 -0
  996. /package/dist/{chunk-GAP7SOGA.js.map → chunk-C3EX5OKN.js.map} +0 -0
  997. /package/dist/{chunk-OEH7ANJJ.js.map → chunk-CHVLFACB.js.map} +0 -0
  998. /package/dist/{chunk-QFODAMYR.js.map → chunk-CP6RFWLW.js.map} +0 -0
  999. /package/dist/{chunk-72JEATZ5.js.map → chunk-D2GDHVZP.js.map} +0 -0
  1000. /package/dist/{chunk-CXYX6G3I.js.map → chunk-D3YAFC6K.js.map} +0 -0
  1001. /package/dist/{chunk-AL4MRNYI.js.map → chunk-DFDV42NY.js.map} +0 -0
  1002. /package/dist/{chunk-3J52GJAY.js.map → chunk-EFTYCX5C.js.map} +0 -0
  1003. /package/dist/{chunk-YXUIVOUL.js.map → chunk-F62BW6DJ.js.map} +0 -0
  1004. /package/dist/{chunk-IIK4WNWV.js.map → chunk-FLQNIFG2.js.map} +0 -0
  1005. /package/dist/{chunk-VAQOSV3I.js.map → chunk-FWHEAR7F.js.map} +0 -0
  1006. /package/dist/{chunk-4ICSKDI7.js.map → chunk-FXZGRP3F.js.map} +0 -0
  1007. /package/dist/{chunk-26UW2GMK.js.map → chunk-GQ4DMO5Q.js.map} +0 -0
  1008. /package/dist/{chunk-G3ZUMNLG.js.map → chunk-GUH2A5R5.js.map} +0 -0
  1009. /package/dist/{chunk-5G6R3WYN.js.map → chunk-HJ3Q4NOM.js.map} +0 -0
  1010. /package/dist/{chunk-D7FJ5KHG.js.map → chunk-IDDG4QKO.js.map} +0 -0
  1011. /package/dist/{chunk-EJMPKO6V.js.map → chunk-ILGRC7LJ.js.map} +0 -0
  1012. /package/dist/{chunk-65CQYRMK.js.map → chunk-JTIWQLY5.js.map} +0 -0
  1013. /package/dist/{chunk-RIVHJC6L.js.map → chunk-KDVYI4LC.js.map} +0 -0
  1014. /package/dist/{chunk-724E32DM.js.map → chunk-LAP23AND.js.map} +0 -0
  1015. /package/dist/{chunk-UZEKIMLY.js.map → chunk-LFPBZL2X.js.map} +0 -0
  1016. /package/dist/{chunk-LIBSSGE4.js.map → chunk-MSGIF4EC.js.map} +0 -0
  1017. /package/dist/{chunk-EHNORFUW.js.map → chunk-MYIOR35H.js.map} +0 -0
  1018. /package/dist/{chunk-ZU6JW3ZB.js.map → chunk-NTFNLVZG.js.map} +0 -0
  1019. /package/dist/{chunk-KE5TI23P.js.map → chunk-OAJ6LVL2.js.map} +0 -0
  1020. /package/dist/{chunk-FAV6GUOZ.js.map → chunk-OASXBRXQ.js.map} +0 -0
  1021. /package/dist/{chunk-PGAYESXE.js.map → chunk-OFMFBRSL.js.map} +0 -0
  1022. /package/dist/{chunk-6MZFOMLU.js.map → chunk-ORQ3WBM6.js.map} +0 -0
  1023. /package/dist/{chunk-G4JTXVLA.js.map → chunk-OSQTSS27.js.map} +0 -0
  1024. /package/dist/{chunk-TWFZIHKK.js.map → chunk-OTRKBCUB.js.map} +0 -0
  1025. /package/dist/{chunk-LK5OKVCM.js.map → chunk-PH3FZZIT.js.map} +0 -0
  1026. /package/dist/{chunk-DYWKYP7Z.js.map → chunk-PXLBPOI3.js.map} +0 -0
  1027. /package/dist/{chunk-KDTSXLY7.js.map → chunk-QLXVHWAC.js.map} +0 -0
  1028. /package/dist/{chunk-5NJQXV4K.js.map → chunk-QPTYTM2X.js.map} +0 -0
  1029. /package/dist/{chunk-NPDZ4EO6.js.map → chunk-R2Z5L5CF.js.map} +0 -0
  1030. /package/dist/{chunk-P5HG6WDH.js.map → chunk-R4RWQ6YX.js.map} +0 -0
  1031. /package/dist/{chunk-QYH2UZAK.js.map → chunk-RBCO3C3Q.js.map} +0 -0
  1032. /package/dist/{chunk-WQIHLJAO.js.map → chunk-RHSKKWPO.js.map} +0 -0
  1033. /package/dist/{chunk-BS4PRGEJ.js.map → chunk-RJ2ETGAQ.js.map} +0 -0
  1034. /package/dist/{chunk-PZSOJYER.js.map → chunk-S37ZZSNM.js.map} +0 -0
  1035. /package/dist/{chunk-KV4E4KGE.js.map → chunk-SJIEU3VG.js.map} +0 -0
  1036. /package/dist/{chunk-2LGDWOD7.js.map → chunk-SKI7QMDT.js.map} +0 -0
  1037. /package/dist/{chunk-VKYDHIBT.js.map → chunk-SLLY4ZTT.js.map} +0 -0
  1038. /package/dist/{chunk-AQ6LJ7EI.js.map → chunk-UKDILXEA.js.map} +0 -0
  1039. /package/dist/{chunk-7SNNQCDD.js.map → chunk-ULIQNJ5J.js.map} +0 -0
  1040. /package/dist/{chunk-UB34H4VD.js.map → chunk-UR7ENZ3F.js.map} +0 -0
  1041. /package/dist/{chunk-EENYLJUN.js.map → chunk-UYZ4FUC7.js.map} +0 -0
  1042. /package/dist/{chunk-6KEVNO5O.js.map → chunk-WBWEKZQ2.js.map} +0 -0
  1043. /package/dist/{chunk-WLD443MX.js.map → chunk-WYXYAKUP.js.map} +0 -0
  1044. /package/dist/{chunk-QBCZLD3A.js.map → chunk-X7XFAFU4.js.map} +0 -0
  1045. /package/dist/{chunk-YS7T735Q.js.map → chunk-Y43FKOED.js.map} +0 -0
  1046. /package/dist/{chunk-OVC2PIOP.js.map → chunk-Y6XWO4V4.js.map} +0 -0
  1047. /package/dist/{chunk-5HPKYRTE.js.map → chunk-YB6G3B3L.js.map} +0 -0
  1048. /package/dist/{chunk-H6GTG665.js.map → chunk-YD6OZSSY.js.map} +0 -0
  1049. /package/dist/{chunk-SKVQRTDO.js.map → chunk-YFBHZ57K.js.map} +0 -0
  1050. /package/dist/{chunk-XGN3BGSL.js.map → chunk-ZD5MNBLA.js.map} +0 -0
  1051. /package/dist/{chunk-CZESYOCC.js.map → chunk-ZZ5B2ZRM.js.map} +0 -0
  1052. /package/dist/{cite-TRNZYG4W.js.map → cite-AJ5ZQWD2.js.map} +0 -0
  1053. /package/dist/{claim-NUUED375.js.map → claim-G4TW75Z2.js.map} +0 -0
  1054. /package/dist/{client-45COYUUH.js.map → client-F6KOC77S.js.map} +0 -0
  1055. /package/dist/{code-K4YTLOPA.js.map → code-NV4ARLFS.js.map} +0 -0
  1056. /package/dist/{companies-3EKQ6PBV.js.map → companies-TYDUEKET.js.map} +0 -0
  1057. /package/dist/{company-35ZI77NI.js.map → company-V5WKGDGU.js.map} +0 -0
  1058. /package/dist/{complete-V2HNULPO.js.map → complete-QEKKP7YL.js.map} +0 -0
  1059. /package/dist/{config-TCAHWE6T.js.map → config-NDL2YP37.js.map} +0 -0
  1060. /package/dist/{connect-77K3A6WK.js.map → connect-5Q2HQ7LT.js.map} +0 -0
  1061. /package/dist/{content-MKJP7T7L.js.map → content-EQZKKIST.js.map} +0 -0
  1062. /package/dist/{conversation-MWBPIT4W.js.map → conversation-JIVOIZ5E.js.map} +0 -0
  1063. /package/dist/{conversion-report-OFV4EKTA.js.map → conversion-report-76S5JOVT.js.map} +0 -0
  1064. /package/dist/{conversion-upload-command-U36QYHUT.js.map → conversion-upload-command-WNHVNVMW.js.map} +0 -0
  1065. /package/dist/{conversion-writes-B3H6VLA2.js.map → conversion-writes-6HX665JT.js.map} +0 -0
  1066. /package/dist/{conversions-UGRVDRWU.js.map → conversions-A524MH5C.js.map} +0 -0
  1067. /package/dist/{conversions-RXNIACU5.js.map → conversions-PSXVU4JL.js.map} +0 -0
  1068. /package/dist/{copy-writes-2B36QJUY.js.map → copy-writes-X2LM5I4Z.js.map} +0 -0
  1069. /package/dist/{countries-6ST54UGJ.js.map → countries-GZSBGSVT.js.map} +0 -0
  1070. /package/dist/{create-RJHGT2S4.js.map → create-7QGB33HI.js.map} +0 -0
  1071. /package/dist/{create-AE52ZZMG.js.map → create-AV7UY4N5.js.map} +0 -0
  1072. /package/dist/{create-L53KW6GN.js.map → create-CHBC745Y.js.map} +0 -0
  1073. /package/dist/{create-K2EUYE54.js.map → create-SBQU7B3S.js.map} +0 -0
  1074. /package/dist/{creatives-2JP24JNL.js.map → creatives-LNUSBQXQ.js.map} +0 -0
  1075. /package/dist/{creatives-22BYP5VN.js.map → creatives-SFPNXJ6Z.js.map} +0 -0
  1076. /package/dist/{creatives-UPZU7BLY.js.map → creatives-XQILGK6P.js.map} +0 -0
  1077. /package/dist/{credentials-WRC7ERSS.js.map → credentials-IWF37PAQ.js.map} +0 -0
  1078. /package/dist/{critique-VTNN6A5I.js.map → critique-ETRQP3QZ.js.map} +0 -0
  1079. /package/dist/{crm-2MZLMSEV.js.map → crm-IDN55BIC.js.map} +0 -0
  1080. /package/dist/{currency-XFY2EX72.js.map → currency-VQMZZXSS.js.map} +0 -0
  1081. /package/dist/{custom-conversions-V7QPZIB4.js.map → custom-conversions-UHRBVUD2.js.map} +0 -0
  1082. /package/dist/{customers-MHQ72YBY.js.map → customers-XANEOEW6.js.map} +0 -0
  1083. /package/dist/{decide-JZXG6LZR.js.map → decide-AM6B7WIL.js.map} +0 -0
  1084. /package/dist/{delete-ULI3MVAD.js.map → delete-2WL6K24W.js.map} +0 -0
  1085. /package/dist/{delete-Q7J734W2.js.map → delete-46B7DSQV.js.map} +0 -0
  1086. /package/dist/{delete-QFASUSVU.js.map → delete-6K7EZXNR.js.map} +0 -0
  1087. /package/dist/{delete-6WKVGKRF.js.map → delete-SCAVFYZL.js.map} +0 -0
  1088. /package/dist/{delete-POHL3TKX.js.map → delete-WAPC4XC2.js.map} +0 -0
  1089. /package/dist/{delete-5NEAIDA4.js.map → delete-YYIM564B.js.map} +0 -0
  1090. /package/dist/{demographics-5SXTDRFU.js.map → demographics-JJKL7MZC.js.map} +0 -0
  1091. /package/dist/{describe-MJ5SOVWY.js.map → describe-5OC7XX2U.js.map} +0 -0
  1092. /package/dist/{describe-MA54W67X.js.map → describe-EAPKNUUU.js.map} +0 -0
  1093. /package/dist/{discard-P4PGGYYO.js.map → discard-FQDZ5GKN.js.map} +0 -0
  1094. /package/dist/{discover-J5344ATV.js.map → discover-4F4USNHE.js.map} +0 -0
  1095. /package/dist/{discover-PPMLFJMU.js.map → discover-P7PBB3IV.js.map} +0 -0
  1096. /package/dist/{domain-RINRCQ5G.js.map → domain-AFWPUOI7.js.map} +0 -0
  1097. /package/dist/{download-HPYGPNHN.js.map → download-MXKBJPPF.js.map} +0 -0
  1098. /package/dist/{download-H3ZDQTFG.js.map → download-YB2DVMRS.js.map} +0 -0
  1099. /package/dist/{draft-2JVWCYRF.js.map → draft-44KTLX4P.js.map} +0 -0
  1100. /package/dist/{draft-7VGBJIJU.js.map → draft-CKFSZDVI.js.map} +0 -0
  1101. /package/dist/{draft-M7XINDQU.js.map → draft-EKJQGNFT.js.map} +0 -0
  1102. /package/dist/{draft-FWCF4Y6P.js.map → draft-OJHTFELQ.js.map} +0 -0
  1103. /package/dist/{draft-DR5BJK7V.js.map → draft-RSKZSUOS.js.map} +0 -0
  1104. /package/dist/{draft-OIGJUFOH.js.map → draft-VIZTQ6W4.js.map} +0 -0
  1105. /package/dist/{draft-4WMYCA7I.js.map → draft-WOE7KQ7T.js.map} +0 -0
  1106. /package/dist/{draft-4WPWILSX.js.map → draft-Z5IVHUHR.js.map} +0 -0
  1107. /package/dist/{experiment-O6726OBP.js.map → experiment-EFLKDQ3C.js.map} +0 -0
  1108. /package/dist/{experiments-NULZPBF2.js.map → experiments-YUBVWNB5.js.map} +0 -0
  1109. /package/dist/{export-6WWVO4O6.js.map → export-RPNRPTDK.js.map} +0 -0
  1110. /package/dist/{extract-Y3OZG5DZ.js.map → extract-VHM2UNIE.js.map} +0 -0
  1111. /package/dist/{facets-HIADYZQQ.js.map → facets-5GLKSHTA.js.map} +0 -0
  1112. /package/dist/{favorites-54Z7PTYR.js.map → favorites-536I3GZD.js.map} +0 -0
  1113. /package/dist/{feed-TAGQWMRK.js.map → feed-W3ECHUEX.js.map} +0 -0
  1114. /package/dist/{feedback-WEZEKTCH.js.map → feedback-36TL4GPS.js.map} +0 -0
  1115. /package/dist/{feedback-Y4AXR354.js.map → feedback-VCYIVDO2.js.map} +0 -0
  1116. /package/dist/{feedback-record-YZNGRSNR.js.map → feedback-record-QGAP4HA4.js.map} +0 -0
  1117. /package/dist/{fetch-T6WPGAWP.js.map → fetch-X4RIDS7N.js.map} +0 -0
  1118. /package/dist/{find-TTJH5NVJ.js.map → find-57WYB4V3.js.map} +0 -0
  1119. /package/dist/{fit-MLDFA4ZK.js.map → fit-V4CRDVQV.js.map} +0 -0
  1120. /package/dist/{flows-XWU2XNYP.js.map → flows-YPBWZR4P.js.map} +0 -0
  1121. /package/dist/{follow-SX6BV6VZ.js.map → follow-5VX5JWAQ.js.map} +0 -0
  1122. /package/dist/{follow-competitors-UBJJHX36.js.map → follow-competitors-D7I33T5C.js.map} +0 -0
  1123. /package/dist/{following-L7WUEMZ2.js.map → following-6DI4IZ7P.js.map} +0 -0
  1124. /package/dist/{forecast-HFCRTFIF.js.map → forecast-E2HJSD6E.js.map} +0 -0
  1125. /package/dist/{forecast-E5QXQFKQ.js.map → forecast-LMYMZHZE.js.map} +0 -0
  1126. /package/dist/{funding-7M4TJ3MW.js.map → funding-BSAHWU35.js.map} +0 -0
  1127. /package/dist/{funnel-NMC3JWTF.js.map → funnel-MF2KFXEX.js.map} +0 -0
  1128. /package/dist/{ga4-XFJO7VK2.js.map → ga4-FCMTGV4S.js.map} +0 -0
  1129. /package/dist/{generate-22HT24SA.js.map → generate-VGGXTZBP.js.map} +0 -0
  1130. /package/dist/{get-JIB6PMGI.js.map → get-42V7UTNF.js.map} +0 -0
  1131. /package/dist/{get-X44ZCIFN.js.map → get-5SCYUC4G.js.map} +0 -0
  1132. /package/dist/{get-AKTMYS57.js.map → get-7NI64G6K.js.map} +0 -0
  1133. /package/dist/{get-UFCNLDE2.js.map → get-BQBLPGFE.js.map} +0 -0
  1134. /package/dist/{get-QS2A6YVM.js.map → get-JHOH74X5.js.map} +0 -0
  1135. /package/dist/{get-JQE7XWKL.js.map → get-MVZWQ4BE.js.map} +0 -0
  1136. /package/dist/{get-MK6M4DKF.js.map → get-TBMTBGHJ.js.map} +0 -0
  1137. /package/dist/{get-Q4M6G7YN.js.map → get-V4NJXKUR.js.map} +0 -0
  1138. /package/dist/{gif-TBKH7VSP.js.map → gif-M2GMVWM4.js.map} +0 -0
  1139. /package/dist/{google-YDGZ2Q3M.js.map → google-YNVTLX5E.js.map} +0 -0
  1140. /package/dist/{google-ads-AFJV5ZJO.js.map → google-ads-UER2CSQN.js.map} +0 -0
  1141. /package/dist/{group-RAXOR36M.js.map → group-PLTVV7UZ.js.map} +0 -0
  1142. /package/dist/{group-45M7V46T.js.map → group-THZPJALS.js.map} +0 -0
  1143. /package/dist/{gsc-ILEIJYWP.js.map → gsc-A3KB36WH.js.map} +0 -0
  1144. /package/dist/{history-T6Y5IR4V.js.map → history-3GRRZSWW.js.map} +0 -0
  1145. /package/dist/{history-6RCRBB4Q.js.map → history-LBIA45H3.js.map} +0 -0
  1146. /package/dist/{history-BEEREY26.js.map → history-LXRFZNW7.js.map} +0 -0
  1147. /package/dist/{icon-CYUIAFTE.js.map → icon-7WND6UPY.js.map} +0 -0
  1148. /package/dist/{ideas-VTBVERCN.js.map → ideas-LDQMFMJM.js.map} +0 -0
  1149. /package/dist/{images-36DGQZMH.js.map → images-2FDXHKMR.js.map} +0 -0
  1150. /package/dist/{improve-PHFWWTOL.js.map → improve-NWFQI63B.js.map} +0 -0
  1151. /package/dist/{ingest-MLIOEHL3.js.map → ingest-OJDK7AGH.js.map} +0 -0
  1152. /package/dist/{ingest-OJV3CYYK.js.map → ingest-PS2LOYBM.js.map} +0 -0
  1153. /package/dist/{insights-A5BKVXFQ.js.map → insights-H6M6VI43.js.map} +0 -0
  1154. /package/dist/{insights-U6QAA77O.js.map → insights-LZJZGNJZ.js.map} +0 -0
  1155. /package/dist/{inspect-6P2WNFAC.js.map → inspect-ALSHVHUP.js.map} +0 -0
  1156. /package/dist/{inspiration-WGUU7W5Z.js.map → inspiration-TQHQNILK.js.map} +0 -0
  1157. /package/dist/{instant-experiences-U6U3FYIH.js.map → instant-experiences-J4GSS3Y6.js.map} +0 -0
  1158. /package/dist/{intent-PU3XUDLL.js.map → intent-ZKLT4DAW.js.map} +0 -0
  1159. /package/dist/{job-RCEPBGZC.js.map → job-UFGGBDG7.js.map} +0 -0
  1160. /package/dist/{job-create-MDVJ3E7K.js.map → job-create-XM4NH322.js.map} +0 -0
  1161. /package/dist/{job-status-53FJIFYR.js.map → job-status-47L5Z57J.js.map} +0 -0
  1162. /package/dist/{keep-ZIHW5OEQ.js.map → keep-I6FLGJH4.js.map} +0 -0
  1163. /package/dist/{keyword-gap-B6T7ZFTZ.js.map → keyword-gap-QC3ITLNG.js.map} +0 -0
  1164. /package/dist/{keyword-metrics-IDMR3ES2.js.map → keyword-metrics-PERWGH54.js.map} +0 -0
  1165. /package/dist/{keywords-for-site-V3SGYZDW.js.map → keywords-for-site-CCCB6KHE.js.map} +0 -0
  1166. /package/dist/{knowledge-PN3FAZJ2.js.map → knowledge-H5PJ6LZB.js.map} +0 -0
  1167. /package/dist/{landing-7PZPYD3M.js.map → landing-VE3MHOA3.js.map} +0 -0
  1168. /package/dist/{landings-FBRB3FF5.js.map → landings-AELJXEYN.js.map} +0 -0
  1169. /package/dist/{languages-Q5RMPGI4.js.map → languages-GCRI2PI3.js.map} +0 -0
  1170. /package/dist/{languages-ETKG5WM3.js.map → languages-QMLC4QWZ.js.map} +0 -0
  1171. /package/dist/{launches-EQ4VS2OR.js.map → launches-CKPZFVMQ.js.map} +0 -0
  1172. /package/dist/{layerize-SX6LQK35.js.map → layerize-PHY25VNC.js.map} +0 -0
  1173. /package/dist/{lead-routes-RLYGO47M.js.map → lead-routes-ZMKRNL57.js.map} +0 -0
  1174. /package/dist/{leads-IG3IIHXG.js.map → leads-SEEJ3KRR.js.map} +0 -0
  1175. /package/dist/{leads-TWABHSJH.js.map → leads-TPMLYLBH.js.map} +0 -0
  1176. /package/dist/{learn-MXJSGDVI.js.map → learn-KK3AJS3N.js.map} +0 -0
  1177. /package/dist/{library-F4GB5X6G.js.map → library-5YJCCEFL.js.map} +0 -0
  1178. /package/dist/{lighthouse-D3BJGHLO.js.map → lighthouse-W3KAVW2G.js.map} +0 -0
  1179. /package/dist/{line-item-writes-2R7VSOWO.js.map → line-item-writes-ONKDXKOM.js.map} +0 -0
  1180. /package/dist/{line-items-MY6JP2W6.js.map → line-items-ILJYVUHX.js.map} +0 -0
  1181. /package/dist/{link-LR5LSFTA.js.map → link-YDHTMDC5.js.map} +0 -0
  1182. /package/dist/{linkedin-UJEBBO7G.js.map → linkedin-N3NGCE5N.js.map} +0 -0
  1183. /package/dist/{linkedin-person-5LJEMW54.js.map → linkedin-person-6F3YJHXM.js.map} +0 -0
  1184. /package/dist/{list-2NWMHKTR.js.map → list-2EJ3XZ6I.js.map} +0 -0
  1185. /package/dist/{list-COWCCJ4F.js.map → list-BQWHFEWY.js.map} +0 -0
  1186. /package/dist/{list-ACJBOHPS.js.map → list-E7JG27WS.js.map} +0 -0
  1187. /package/dist/{list-5O5NB56G.js.map → list-EKL5HIR7.js.map} +0 -0
  1188. /package/dist/{list-OTZB7DOX.js.map → list-ERCPPED6.js.map} +0 -0
  1189. /package/dist/{list-6AAKH6UV.js.map → list-F7UDUU7C.js.map} +0 -0
  1190. /package/dist/{list-5H6UAX6T.js.map → list-HYZL4576.js.map} +0 -0
  1191. /package/dist/{list-EEQJSTLN.js.map → list-IKQFAJP7.js.map} +0 -0
  1192. /package/dist/{list-UYQOLFPN.js.map → list-WDTPTY2T.js.map} +0 -0
  1193. /package/dist/{locations-ZO7F75KT.js.map → locations-5SLLGWZO.js.map} +0 -0
  1194. /package/dist/{locations-VPZYTFVK.js.map → locations-DNRK7DY4.js.map} +0 -0
  1195. /package/dist/{log-LPY5KYGP.js.map → log-BZBRXB5P.js.map} +0 -0
  1196. /package/dist/{logo-SBIDRBA2.js.map → logo-ODONF6N7.js.map} +0 -0
  1197. /package/dist/{lookup-BGNLEZMU.js.map → lookup-OU6CLATK.js.map} +0 -0
  1198. /package/dist/{make-UK2OYKCZ.js.map → make-W27CB5X4.js.map} +0 -0
  1199. /package/dist/{map-XEJOI63E.js.map → map-FNB7IWDY.js.map} +0 -0
  1200. /package/dist/{mcp-Y43SKNHV.js.map → mcp-QSDCAWMU.js.map} +0 -0
  1201. /package/dist/{media-422INJCD.js.map → media-DGV2AMZI.js.map} +0 -0
  1202. /package/dist/{media-AT3VV3PU.js.map → media-YKCCMLXL.js.map} +0 -0
  1203. /package/dist/{media-sources-POL5DMD4.js.map → media-sources-NMT4G45B.js.map} +0 -0
  1204. /package/dist/{members-5EJVXTE7.js.map → members-2XQ6E33F.js.map} +0 -0
  1205. /package/dist/{meme-VR3IHBRW.js.map → meme-3QYKC4BF.js.map} +0 -0
  1206. /package/dist/{meta-XUHI3E3L.js.map → meta-5KQ6CQBT.js.map} +0 -0
  1207. /package/dist/{metrics-J3WD2CUD.js.map → metrics-P4QDFCVB.js.map} +0 -0
  1208. /package/dist/{normalize-IOW2V6E7.js.map → normalize-5AU7SKYY.js.map} +0 -0
  1209. /package/dist/{options-YD6XFRZV.js.map → options-CH52EP5K.js.map} +0 -0
  1210. /package/dist/{organization-KORFOK7Q.js.map → organization-6T4Q6XYI.js.map} +0 -0
  1211. /package/dist/{output-2MGOSPDE.js.map → output-7X5WPPCA.js.map} +0 -0
  1212. /package/dist/{page-WKWRKLTC.js.map → page-GBLVAKU3.js.map} +0 -0
  1213. /package/dist/{page-photos-ABK4CJME.js.map → page-photos-VYJU4RNQ.js.map} +0 -0
  1214. /package/dist/{pages-LT3KCVC3.js.map → pages-6YMPZDEY.js.map} +0 -0
  1215. /package/dist/{performance-BXSNPNC3.js.map → performance-2SCAQSQK.js.map} +0 -0
  1216. /package/dist/{performance-Z353JXHB.js.map → performance-4DMGJCN7.js.map} +0 -0
  1217. /package/dist/{pinterest-42NLOZW4.js.map → pinterest-235S7E6H.js.map} +0 -0
  1218. /package/dist/{pixels-IGJFC2XC.js.map → pixels-DZDVNIVL.js.map} +0 -0
  1219. /package/dist/{pixels-3BHTXTDV.js.map → pixels-WTTLC4O5.js.map} +0 -0
  1220. /package/dist/{plan-ATH2VCVA.js.map → plan-JAWESWJN.js.map} +0 -0
  1221. /package/dist/{posts-K3QTBX2B.js.map → posts-TRQCRLYZ.js.map} +0 -0
  1222. /package/dist/{preview-3UGPTK44.js.map → preview-ICZR3SGB.js.map} +0 -0
  1223. /package/dist/{preview-OV2EZ6YF.js.map → preview-JZXGR4KN.js.map} +0 -0
  1224. /package/dist/{profile-OWDBNPNI.js.map → profile-MKKJT2UF.js.map} +0 -0
  1225. /package/dist/{promoted-tweet-writes-3D6GG6K4.js.map → promoted-tweet-writes-DR6V7MHW.js.map} +0 -0
  1226. /package/dist/{promoted-tweets-BGQJDEQ2.js.map → promoted-tweets-IRECARIO.js.map} +0 -0
  1227. /package/dist/{properties-VSOMFI5V.js.map → properties-Z5S3LRJ5.js.map} +0 -0
  1228. /package/dist/{publish-DBUBFV5R.js.map → publish-4HM2CJVF.js.map} +0 -0
  1229. /package/dist/{query-ZYG5RCCW.js.map → query-AQ6HNKW7.js.map} +0 -0
  1230. /package/dist/{query-NTWXOWPZ.js.map → query-KKXCMH3Q.js.map} +0 -0
  1231. /package/dist/{query-5OS6M4ON.js.map → query-QXKGVHZL.js.map} +0 -0
  1232. /package/dist/{questionnaire-HUNGUZNQ.js.map → questionnaire-U7UYICEA.js.map} +0 -0
  1233. /package/dist/{read-DXZJ7UOJ.js.map → read-ENUS7P3L.js.map} +0 -0
  1234. /package/dist/{reddit-GPSRX4TI.js.map → reddit-KOC7KLYS.js.map} +0 -0
  1235. /package/dist/{refresh-3X45Q6ZM.js.map → refresh-2KEQLXRK.js.map} +0 -0
  1236. /package/dist/{refresh-BKYZXXRF.js.map → refresh-JSCYTM4B.js.map} +0 -0
  1237. /package/dist/{release-PE7KBFGK.js.map → release-X3Q3RFQC.js.map} +0 -0
  1238. /package/dist/{relevant-pages-7U6I2WPM.js.map → relevant-pages-NZKXWMNA.js.map} +0 -0
  1239. /package/dist/{remove-MX2FV44C.js.map → remove-6FXTPEB6.js.map} +0 -0
  1240. /package/dist/{remove-2A3XDOKA.js.map → remove-RYR6EAJY.js.map} +0 -0
  1241. /package/dist/{reopen-LHMLXG6G.js.map → reopen-PIKLC5OW.js.map} +0 -0
  1242. /package/dist/{rerun-S4VWOIKE.js.map → rerun-2HBMXJ55.js.map} +0 -0
  1243. /package/dist/{research-JN3JGEEL.js.map → research-ZBZONY3D.js.map} +0 -0
  1244. /package/dist/{research-55XA4Z2O.js.map → research-ZTA4XKNA.js.map} +0 -0
  1245. /package/dist/{reset-IY7GNRLF.js.map → reset-7YTMXVNX.js.map} +0 -0
  1246. /package/dist/{reset-C5SDRQTX.js.map → reset-Q3XSD4WI.js.map} +0 -0
  1247. /package/dist/{resolve-PCN7BR7U.js.map → resolve-P3AT2S6A.js.map} +0 -0
  1248. /package/dist/{retry-2KYMH2IV.js.map → retry-CEZLEN7Z.js.map} +0 -0
  1249. /package/dist/{retry-KUWJ4GGA.js.map → retry-YNNFUDWI.js.map} +0 -0
  1250. /package/dist/{retry-failed-T6PK5SKL.js.map → retry-failed-FCS6PNUZ.js.map} +0 -0
  1251. /package/dist/{revenue-CRZRJJ7H.js.map → revenue-6PR3BJFJ.js.map} +0 -0
  1252. /package/dist/{rule-writes-HUBHHYEO.js.map → rule-writes-WT6DQZZE.js.map} +0 -0
  1253. /package/dist/{rules-EKOXAK2O.js.map → rules-R7NK5X4Z.js.map} +0 -0
  1254. /package/dist/{rules-47LFGCPW.js.map → rules-Y75KR2PC.js.map} +0 -0
  1255. /package/dist/{rules-add-IC3SXNYW.js.map → rules-add-2GIJGODB.js.map} +0 -0
  1256. /package/dist/{run-WUD5U5GY.js.map → run-CDMNDJ7B.js.map} +0 -0
  1257. /package/dist/{run-Y4SEFETX.js.map → run-RORVKARV.js.map} +0 -0
  1258. /package/dist/{scaffold-ad-OJ4WOJM6.js.map → scaffold-ad-DDGYTRFK.js.map} +0 -0
  1259. /package/dist/{scaffold-static-ad-EXUKKYSD.js.map → scaffold-static-ad-ES5AIQPA.js.map} +0 -0
  1260. /package/dist/{scaffold-video-7PDZZSKD.js.map → scaffold-video-NWRJZQ7N.js.map} +0 -0
  1261. /package/dist/{schedule-VCL2OPIL.js.map → schedule-2ELAAXVW.js.map} +0 -0
  1262. /package/dist/{schedule-ANIYXLG6.js.map → schedule-XFEPEQTN.js.map} +0 -0
  1263. /package/dist/{scheduled-agents-YAHYCFDA.js.map → scheduled-agents-RRAWQYPE.js.map} +0 -0
  1264. /package/dist/{schema-L6DGAUB5.js.map → schema-FHP43TLD.js.map} +0 -0
  1265. /package/dist/{scrape-O4X6VGV2.js.map → scrape-D3XGARHR.js.map} +0 -0
  1266. /package/dist/{screenshot-RR6RA6CN.js.map → screenshot-5LWUP5VN.js.map} +0 -0
  1267. /package/dist/{search-E75B5APM.js.map → search-4DBP6EH5.js.map} +0 -0
  1268. /package/dist/{search-OUJUEORX.js.map → search-G6W4LGVZ.js.map} +0 -0
  1269. /package/dist/{search-EKTUTXVN.js.map → search-HNRANK6H.js.map} +0 -0
  1270. /package/dist/{search-6XKFFDMJ.js.map → search-KGE3BSSH.js.map} +0 -0
  1271. /package/dist/{search-YARSBZ6D.js.map → search-O3AOWEXC.js.map} +0 -0
  1272. /package/dist/{search-OW3E2Z7Z.js.map → search-QQDR74KQ.js.map} +0 -0
  1273. /package/dist/{search-copy-2KO3VR6R.js.map → search-copy-EB3TONDS.js.map} +0 -0
  1274. /package/dist/{seeds-E64JKXWS.js.map → seeds-RGIFHHYC.js.map} +0 -0
  1275. /package/dist/{select-R3NT7OI4.js.map → select-GFPXXVBU.js.map} +0 -0
  1276. /package/dist/{sends-DEVRKO4M.js.map → sends-4ZO6BNZ4.js.map} +0 -0
  1277. /package/dist/{sequences-YIQSLKV5.js.map → sequences-SSLZ3XTP.js.map} +0 -0
  1278. /package/dist/{set-prompt-F3SYRT22.js.map → set-prompt-TQDOBUFT.js.map} +0 -0
  1279. /package/dist/{setup-links-AHWFGUAO.js.map → setup-links-CK7LBYJK.js.map} +0 -0
  1280. /package/dist/{shared-V5ZS25EO.js.map → shared-UPMEBTVP.js.map} +0 -0
  1281. /package/dist/{shopify-BPQCUFFX.js.map → shopify-SOTGSWXW.js.map} +0 -0
  1282. /package/dist/{site-KYB2EL72.js.map → site-IAIGIP3R.js.map} +0 -0
  1283. /package/dist/{sitemaps-ZSISKT6L.js.map → sitemaps-P3K5Z4TW.js.map} +0 -0
  1284. /package/dist/{sites-XMZ3HPHT.js.map → sites-TURWC53D.js.map} +0 -0
  1285. /package/dist/{skills-6MJC6CSZ.js.map → skills-PDHUHP2T.js.map} +0 -0
  1286. /package/dist/{sources-X4URMRLY.js.map → sources-62MIDG3D.js.map} +0 -0
  1287. /package/dist/{sources-JYOOLCOU.js.map → sources-D5XODGIV.js.map} +0 -0
  1288. /package/dist/{stale-KFVY7LSB.js.map → stale-4STBM2Z3.js.map} +0 -0
  1289. /package/dist/{stats-FSAXWTSE.js.map → stats-XNKAJD2Z.js.map} +0 -0
  1290. /package/dist/{status-YVRZBK56.js.map → status-BKSOFB53.js.map} +0 -0
  1291. /package/dist/{sticker-HMHR7QM7.js.map → sticker-MWICUYQM.js.map} +0 -0
  1292. /package/dist/{stock-IAQBUPGQ.js.map → stock-F5QNFRPM.js.map} +0 -0
  1293. /package/dist/{studies-QLSKON6M.js.map → studies-5G67ODR2.js.map} +0 -0
  1294. /package/dist/{studio-ZLBBYHNY.js.map → studio-ZRAZ2C25.js.map} +0 -0
  1295. /package/dist/{study-writes-GBUUKX4O.js.map → study-writes-34BJFZAZ.js.map} +0 -0
  1296. /package/dist/{suggest-DSMKK4FP.js.map → suggest-KCN2NDYE.js.map} +0 -0
  1297. /package/dist/{sync-WKV3N3LD.js.map → sync-QVEUQKU5.js.map} +0 -0
  1298. /package/dist/{sync-XFK4U6TA.js.map → sync-TANGFXUN.js.map} +0 -0
  1299. /package/dist/{sync-KJEXXD3P.js.map → sync-VPE5G6YX.js.map} +0 -0
  1300. /package/dist/{sync-definition-BQUVWLCC.js.map → sync-definition-VSNVCRNG.js.map} +0 -0
  1301. /package/dist/{tag-L2H5TSFJ.js.map → tag-NKAHDL35.js.map} +0 -0
  1302. /package/dist/{tag-manager-5WZPX2FJ.js.map → tag-manager-3GIW6BPB.js.map} +0 -0
  1303. /package/dist/{tags-7CEVWFEZ.js.map → tags-CBNWQTFX.js.map} +0 -0
  1304. /package/dist/{tags-ZLPLHP2G.js.map → tags-IFBIJ7BE.js.map} +0 -0
  1305. /package/dist/{tags-HKR2GWXV.js.map → tags-J6IPWIZ5.js.map} +0 -0
  1306. /package/dist/{tags-BU4KLB37.js.map → tags-XPLXA3LV.js.map} +0 -0
  1307. /package/dist/{tags-SKGPECNG.js.map → tags-ZV7JAF6S.js.map} +0 -0
  1308. /package/dist/{targeting-DAUTJDUB.js.map → targeting-TVZPIUUI.js.map} +0 -0
  1309. /package/dist/{targeting-constants-ZS422W5A.js.map → targeting-constants-RJS2STR5.js.map} +0 -0
  1310. /package/dist/{targeting-criteria-4C4M3XLJ.js.map → targeting-criteria-VVZQFPNS.js.map} +0 -0
  1311. /package/dist/{targets-C5K2OH3B.js.map → targets-EQAZUKT6.js.map} +0 -0
  1312. /package/dist/{terms-NX5CAJXT.js.map → terms-AATAGKPT.js.map} +0 -0
  1313. /package/dist/{testimonials-OJV7EFGS.js.map → testimonials-5MA427KH.js.map} +0 -0
  1314. /package/dist/{themes-C4PPU427.js.map → themes-WMZJWXFT.js.map} +0 -0
  1315. /package/dist/{top-companies-IZQOKMBU.js.map → top-companies-V5FVQMCS.js.map} +0 -0
  1316. /package/dist/{transcript-K6W7VRA5.js.map → transcript-2TE2R4DH.js.map} +0 -0
  1317. /package/dist/{translate-M6W6KZZS.js.map → translate-XIF6VTDN.js.map} +0 -0
  1318. /package/dist/{triggers-CQFQSODZ.js.map → triggers-ZMNQ6W3M.js.map} +0 -0
  1319. /package/dist/{tweets-33OCH74J.js.map → tweets-MLDLLLDB.js.map} +0 -0
  1320. /package/dist/{unfollow-G26NHR5X.js.map → unfollow-OEMFPAFS.js.map} +0 -0
  1321. /package/dist/{unlink-ITGOP2YH.js.map → unlink-HRCAROB3.js.map} +0 -0
  1322. /package/dist/{unstage-EAUF74PI.js.map → unstage-5WSEDFNH.js.map} +0 -0
  1323. /package/dist/{unstage-OAPP6Z5V.js.map → unstage-65DUBYNZ.js.map} +0 -0
  1324. /package/dist/{update-N5NA3JTW.js.map → update-A64IC24P.js.map} +0 -0
  1325. /package/dist/{update-PCVDM7HO.js.map → update-BESMEMQU.js.map} +0 -0
  1326. /package/dist/{update-KXTP3VPI.js.map → update-CADTFTYC.js.map} +0 -0
  1327. /package/dist/{update-HOFM27UT.js.map → update-WU4FAGEA.js.map} +0 -0
  1328. /package/dist/{update-GX26VDM4.js.map → update-ZUBU5NQP.js.map} +0 -0
  1329. /package/dist/{upload-SPCZNAUN.js.map → upload-FR6WRGXI.js.map} +0 -0
  1330. /package/dist/{upload-3ZGL4WHA.js.map → upload-GXS5CTOR.js.map} +0 -0
  1331. /package/dist/{upscale-X3B5CHG3.js.map → upscale-BCI42TCP.js.map} +0 -0
  1332. /package/dist/{url-options-C3ZOWN2L.js.map → url-options-QLDSJ7QJ.js.map} +0 -0
  1333. /package/dist/{url-params-H4LQAYXG.js.map → url-params-YWIBMV3P.js.map} +0 -0
  1334. /package/dist/{use-HYK67YKZ.js.map → use-26VARHJT.js.map} +0 -0
  1335. /package/dist/{validate-XHQ4MIW5.js.map → validate-5EWYG4QS.js.map} +0 -0
  1336. /package/dist/{variant-MEHXEXFK.js.map → variant-F4EEYQJ7.js.map} +0 -0
  1337. /package/dist/{videos-GY6YCGFH.js.map → videos-MXEQHDMN.js.map} +0 -0
  1338. /package/dist/{view-HTCYEBXN.js.map → view-X65GETAV.js.map} +0 -0
  1339. /package/dist/{viewer-check-UCNIAY7X.js.map → viewer-check-QI4HKF7A.js.map} +0 -0
  1340. /package/dist/{web-E7XDCTVJ.js.map → web-DYT5YHEU.js.map} +0 -0
  1341. /package/dist/{winners-CGLS7SZ3.js.map → winners-5PRDG7GT.js.map} +0 -0
  1342. /package/dist/{winning-ads-L7FHCD75.js.map → winning-ads-YKBB2UZC.js.map} +0 -0
  1343. /package/dist/{write-commands-HQQOJGP4.js.map → write-commands-OBQPQUIE.js.map} +0 -0
  1344. /package/dist/{write-commands-F5XPPLOO.js.map → write-commands-SIOVTRHH.js.map} +0 -0
  1345. /package/dist/{write-commands-JESAYUEQ.js.map → write-commands-USXHGCVT.js.map} +0 -0
  1346. /package/dist/{write-commands-QNXR5ENS.js.map → write-commands-XLZCRVTU.js.map} +0 -0
  1347. /package/dist/{x-ROAUMBHA.js.map → x-OIDZY7DM.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/ads/google/during-literals.ts","../src/commands/ads/google/changes-window.ts","../src/commands/ads/google/presets.ts","../src/commands/ads/google/list-fields.ts","../src/commands/ads/google/correction-table.ts","../src/commands/ads/google/error-parser.ts"],"sourcesContent":["/**\n * The date literals GAQL's `DURING` accepts — Google's grammar, verbatim. Anything else is refused by\n * Google with \"Invalid date literal supplied for DURING operator\", so it is refused here first.\n * https://developers.google.com/google-ads/api/docs/query/grammar\n */\nexport const GAQL_DURING_LITERALS = [\n \"TODAY\",\n \"YESTERDAY\",\n \"LAST_7_DAYS\",\n \"LAST_14_DAYS\",\n \"LAST_30_DAYS\",\n \"LAST_BUSINESS_WEEK\",\n \"THIS_MONTH\",\n \"LAST_MONTH\",\n \"THIS_WEEK_SUN_TODAY\",\n \"THIS_WEEK_MON_TODAY\",\n \"LAST_WEEK_SUN_SAT\",\n \"LAST_WEEK_MON_SUN\",\n] as const;\n\nexport function isDuringLiteral(value: string): boolean {\n return (GAQL_DURING_LITERALS as readonly string[]).includes(value.toUpperCase());\n}\n\nfunction isoDay(date: Date): string {\n return date.toISOString().slice(0, 10);\n}\n\nfunction utcDate(year: number, month: number, day: number): Date {\n return new Date(Date.UTC(year, month, day));\n}\n\n/** `months` calendar months before `date`, on the same day or the target month's last day if shorter. */\nfunction monthsBefore(date: Date, months: number): Date {\n const lastDayOfTarget = utcDate(date.getUTCFullYear(), date.getUTCMonth() - months + 1, 0).getUTCDate();\n return utcDate(date.getUTCFullYear(), date.getUTCMonth() - months, Math.min(date.getUTCDate(), lastDayOfTarget));\n}\n\n/**\n * The BETWEEN range an unsupported literal means, or null when it names no fixed window (ALL_TIME).\n * Rolling windows end yesterday, as Google's own LAST_30_DAYS does; calendar periods run to their end,\n * or to today for the current one.\n */\nexport function equivalentBetween(literal: string, now: Date): string | null {\n const upper = literal.toUpperCase();\n const today = utcDate(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());\n const yesterday = utcDate(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate() - 1);\n const range = (from: Date, to: Date) => `BETWEEN '${isoDay(from)}' AND '${isoDay(to)}'`;\n const year = today.getUTCFullYear();\n const quarterStart = Math.floor(today.getUTCMonth() / 3) * 3;\n\n const rolling = upper.match(/^LAST_(\\d+)_(DAYS|WEEKS|MONTHS|YEARS)$/);\n if (rolling) {\n const n = Number(rolling[1]);\n const unit = rolling[2];\n if (n < 1) return null;\n if (unit === \"DAYS\" || unit === \"WEEKS\") {\n const days = unit === \"DAYS\" ? n : n * 7;\n return range(utcDate(year, today.getUTCMonth(), today.getUTCDate() - days), yesterday);\n }\n const months = unit === \"MONTHS\" ? n : n * 12;\n return range(monthsBefore(today, months), yesterday);\n }\n\n switch (upper) {\n case \"THIS_YEAR\":\n return range(utcDate(year, 0, 1), today);\n case \"LAST_YEAR\":\n return range(utcDate(year - 1, 0, 1), utcDate(year - 1, 11, 31));\n case \"THIS_QUARTER\":\n return range(utcDate(year, quarterStart, 1), today);\n case \"LAST_QUARTER\":\n return range(utcDate(year, quarterStart - 3, 1), utcDate(year, quarterStart, 0));\n default:\n return null;\n }\n}\n\nexport function duringLiteralExplanation(literal: string, between: string | null): string {\n const accepted = GAQL_DURING_LITERALS.join(\", \");\n const lead = between\n ? `Google does not accept ${literal} after DURING. The same window as explicit dates is ${between}.`\n : `Google does not accept ${literal} after DURING, and it names no fixed window — use BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD', or drop the date filter.`;\n return `${lead} DURING accepts only: ${accepted}. Any other window needs BETWEEN.`;\n}\n","import {\n CHANGE_RESOURCE_TYPES,\n CHANGE_SCOPE_MAX_DAYS,\n CHANGE_SCOPES,\n CHANGES_MAX_LIMIT,\n type ChangeScope,\n DEFAULT_CHANGE_DAYS,\n isChangeLookbackWithinReach,\n} from \"@baker/api/ads-google\";\nimport type { QueryFix } from \"../types.ts\";\nimport { equivalentBetween } from \"./during-literals.ts\";\n\nexport { CHANGE_RESOURCE_TYPES, CHANGE_SCOPE_MAX_DAYS, CHANGES_MAX_LIMIT, DEFAULT_CHANGE_DAYS };\n\n/**\n * A year of monthly spend per campaign — what to read when a change is older than any history\n * resource reaches. Dates are spelled out: GAQL has no LAST_12_MONTHS literal.\n */\nexport function monthlySpendTrendQuery(now: Date = new Date()): string {\n return `SELECT campaign.name, segments.month, metrics.cost_micros, metrics.conversions FROM campaign WHERE segments.date ${equivalentBetween(\"LAST_12_MONTHS\", now)}`;\n}\n\nexport type ChangesWindowResolution =\n | { ok: true; scope: ChangeScope; days: number; hints: string[] }\n | { ok: false; error: { code: string; message: string; fix: QueryFix } };\n\nfunction isChangeScope(value: string): value is ChangeScope {\n return (CHANGE_SCOPES as readonly string[]).includes(value);\n}\n\nexport function resolveChangesWindow(input: {\n days?: number;\n scope?: string;\n limit?: number;\n resourceType?: string;\n}): ChangesWindowResolution {\n const refusal = changesFilterRefusal(input);\n if (refusal) return { ok: false, error: refusal };\n const scope = input.scope ?? \"detail\";\n if (!isChangeScope(scope)) {\n return {\n ok: false,\n error: {\n code: \"INVALID_SCOPE\",\n message: `Unknown scope '${scope}'. Use 'detail' (field-level changes, 30 days) or 'summary' (which resources changed, 90 days).`,\n fix: {\n action: \"retry_with_flag\",\n explanation: \"Pass --scope detail or --scope summary.\",\n },\n },\n };\n }\n\n const days = input.days ?? DEFAULT_CHANGE_DAYS;\n if (!Number.isInteger(days) || days < 1) {\n return {\n ok: false,\n error: {\n code: \"INVALID_LOOKBACK\",\n message: `--days must be a whole number of days, got '${days}'.`,\n fix: {\n action: \"retry_with_flag\",\n explanation: `Pass --days as a positive integer, e.g. --days ${DEFAULT_CHANGE_DAYS}.`,\n },\n },\n };\n }\n\n if (!isChangeLookbackWithinReach(days, scope)) {\n return { ok: false, error: lookbackTooLong(scope, days, CHANGE_SCOPE_MAX_DAYS[scope]) };\n }\n\n return { ok: true, scope, days, hints: hintsFor(scope, days) };\n}\n\ntype ChangesRefusal = { code: string; message: string; fix: QueryFix };\n\n/**\n * `--limit` and `--resource-type` checked before the call, against the bounds the route enforces.\n * Left to the route, a bad value came back as an unclassified error whose fix told the agent to\n * check its GAQL — and `changes` takes none.\n */\nexport function changesFilterRefusal(input: { limit?: number; resourceType?: string }): ChangesRefusal | null {\n const { limit, resourceType } = input;\n if (limit !== undefined && (!Number.isInteger(limit) || limit < 1 || limit > CHANGES_MAX_LIMIT)) {\n return {\n code: \"INVALID_LIMIT\",\n message: `--limit must be a whole number from 1 to ${CHANGES_MAX_LIMIT}, got '${limit}'.`,\n fix: {\n action: \"retry_with_flag\",\n explanation: `Pass --limit ${CHANGES_MAX_LIMIT} at most. To see further back than one full read reaches, narrow with --resource-type or shorten --days and read again.`,\n },\n };\n }\n if (resourceType && !(CHANGE_RESOURCE_TYPES as readonly string[]).includes(resourceType)) {\n return {\n code: \"INVALID_RESOURCE_TYPE\",\n message: `--resource-type '${resourceType}' is not one the change history can be filtered by.`,\n fix: {\n action: \"retry_with_flag\",\n explanation: `Use one of ${CHANGE_RESOURCE_TYPES.join(\", \")}, or drop --resource-type and filter the rows by their resource type.`,\n },\n };\n }\n return null;\n}\n\nfunction lookbackTooLong(\n scope: ChangeScope,\n days: number,\n max: number,\n): {\n code: string;\n message: string;\n fix: QueryFix;\n} {\n if (scope === \"detail\" && days <= CHANGE_SCOPE_MAX_DAYS.summary) {\n return {\n code: \"LOOKBACK_TOO_LONG\",\n message: `Google keeps field-level change detail for ${max} days only; ${days} days is outside that window.`,\n fix: {\n action: \"narrow_date_range\",\n explanation: `Re-run with --scope summary --days ${days} to reach back ${CHANGE_SCOPE_MAX_DAYS.summary} days. Summary tells you which campaigns, ad groups, ads and criteria changed and when, but not the old and new values — read the resource itself for current values.`,\n },\n };\n }\n\n return {\n code: \"LOOKBACK_TOO_LONG\",\n message: `Google's account history API reaches back ${CHANGE_SCOPE_MAX_DAYS.summary} days at most; ${days} days is outside that window.`,\n fix: {\n action: \"use_different_resource\",\n explanation: `Do not abort — infer the change from performance instead. Query monthly metrics per campaign (${monthlySpendTrendQuery()}) to see which campaigns stopped or started spending. That shows what changed and when, though not who changed it. Older history exists only in the Google Ads web UI, which has no API — ask the user to check it if the 'who' matters.`,\n },\n };\n}\n\nfunction hintsFor(scope: ChangeScope, days: number): string[] {\n const hints: string[] = [];\n\n if (scope === \"detail\") {\n hints.push(\n `Detailed history covers the last ${CHANGE_SCOPE_MAX_DAYS.detail} days. For anything older use --scope summary (reaches ${CHANGE_SCOPE_MAX_DAYS.summary} days, reports which resources changed but not their values).`,\n );\n } else {\n hints.push(\n \"Summary history reports which resources changed and when, not old and new values. To see what a changed resource looks like now, query it by resource_name.\",\n );\n if (days > CHANGE_SCOPE_MAX_DAYS.detail) {\n hints.push(\n `Changes inside the last ${CHANGE_SCOPE_MAX_DAYS.detail} days also have field-level detail — re-run with --scope detail for those.`,\n );\n }\n }\n\n return hints;\n}\n\nconst CHANGE_TIME_FIELDS = [\"change_event.change_date_time\", \"change_status.last_change_date_time\"];\n\n/**\n * A read that came back exactly at --limit has, as far as anyone can tell, more\n * behind it: Google returns the newest first, so the window the caller asked for\n * is covered only back to the oldest row. Said in words, because a capped read\n * looks like a complete one and \"nobody touched it in 30 days\" is the conclusion\n * an agent draws from it.\n */\nexport function cappedChangesHint(rows: Array<Record<string, unknown>>, limit: number, days: number): string | null {\n if (rows.length < limit) return null;\n const oldest = rows[rows.length - 1];\n const at = CHANGE_TIME_FIELDS.map((field) => oldest?.[field]).find((value) => typeof value === \"string\");\n const reached = typeof at === \"string\" ? `reaching back only to ${at}` : \"not the whole window\";\n const more =\n limit < CHANGES_MAX_LIMIT\n ? `re-run with --limit ${Math.min(limit * 2, CHANGES_MAX_LIMIT)}, or narrow with --resource-type`\n : \"narrow with --resource-type\";\n return `This read came back full at --limit ${limit}, ${reached}, not the ${days} days asked for: older changes almost certainly exist and are NOT shown. Do not conclude nothing changed before then — ${more}.`;\n}\n","import type { PresetDefinition } from \"../types.ts\";\nimport { duringLiteralExplanation, equivalentBetween, isDuringLiteral } from \"./during-literals.ts\";\n\nconst BETWEEN_RE = /^BETWEEN\\s+'[0-9]{4}-[0-9]{2}-[0-9]{2}'\\s+AND\\s+'[0-9]{4}-[0-9]{2}-[0-9]{2}'$/i;\n\n/** What `{dateRange}` may expand to: a literal Google accepts after DURING, or a BETWEEN range. */\nexport function isValidDateRange(value: string): boolean {\n const trimmed = value.trim();\n return isDuringLiteral(trimmed) || BETWEEN_RE.test(trimmed);\n}\n\nfunction dateRangeError(dateRange: string, now: Date): string {\n if (/^[A-Za-z0-9_]+$/.test(dateRange.trim())) {\n return `Invalid date range: \"${dateRange}\". ${duringLiteralExplanation(dateRange, equivalentBetween(dateRange, now))} Pass it as --date-range \"BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'\".`;\n }\n return `Invalid date range: \"${dateRange}\". Use a GAQL date literal (e.g. LAST_30_DAYS, TODAY) or BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'.`;\n}\n\n/**\n * The status columns that decide whether a row of each resource is actually serving, outermost\n * first. Google Ads has no single serving flag: an entity runs only when every level of its chain\n * is ENABLED, so an ENABLED keyword under a paused ad group is not live.\n *\n * Only resources with **two or more** rungs are listed. A one-rung resource (campaign,\n * campaign_criterion, shopping_performance_view) carries its own status on the row and has no\n * ancestor to forget, which is the whole failure this table exists to catch.\n *\n * Presets expand `{statusScope}` from their own `statusFields`; hand-written GAQL is checked\n * against this table in preflight. `presets.test.ts` asserts the two never drift apart.\n */\nexport const SERVING_CHAINS: Record<string, string[]> = {\n keyword_view: [\"campaign.status\", \"ad_group.status\", \"ad_group_criterion.status\"],\n ad_group_criterion: [\"campaign.status\", \"ad_group.status\", \"ad_group_criterion.status\"],\n ad_group_ad: [\"campaign.status\", \"ad_group.status\", \"ad_group_ad.status\"],\n search_term_view: [\"campaign.status\", \"ad_group.status\"],\n ad_group: [\"campaign.status\", \"ad_group.status\"],\n asset_group: [\"campaign.status\", \"asset_group.status\"],\n // An asset link carries its own status, and it is not the campaign's, the ad group's or the asset\n // group's. Google returns a REMOVED link like any other row, so a read scoped only to its owners\n // lists extensions that are no longer attached to anything — which is what 74 detaches were planned\n // from on a live account, every one of them refused at publish as `RESOURCE_NOT_FOUND`.\n // `customer_asset` is deliberately absent: one rung, no ancestor to forget.\n asset_group_asset: [\"campaign.status\", \"asset_group.status\", \"asset_group_asset.status\"],\n campaign_asset: [\"campaign.status\", \"campaign_asset.status\"],\n ad_group_asset: [\"campaign.status\", \"ad_group.status\", \"ad_group_asset.status\"],\n};\n\nconst CORE_PRESETS: PresetDefinition[] = [\n {\n name: \"campaign-performance\",\n description: \"Campaign-level metrics overview\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, campaign.advertising_channel_type, campaign.bidding_strategy_type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.all_conversions, metrics.conversions_value, metrics.ctr, metrics.average_cpc FROM campaign WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\"],\n },\n {\n name: \"budget-limited\",\n description:\n \"Campaigns Google reports as limited by budget, with each one's bid target next to its actual cost per conversion — the state where a target above actual now drives delivery up to the target instead of holding recent cost\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, campaign.advertising_channel_type, campaign.bidding_strategy_type, campaign.primary_status, campaign.primary_status_reasons, campaign.target_cpa.target_cpa_micros, campaign.maximize_conversions.target_cpa_micros, campaign.target_roas.target_roas, campaign.maximize_conversion_value.target_roas, campaign.target_cpc.target_cpc_micros, campaign_budget.amount_micros, metrics.cost_micros, metrics.conversions, metrics.conversions_value, metrics.cost_per_conversion, metrics.search_budget_lost_impression_share FROM campaign WHERE campaign.primary_status_reasons CONTAINS ANY (BUDGET_CONSTRAINED) AND segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\"],\n },\n {\n name: \"conversions-by-action\",\n description:\n \"Which conversion action each campaign's conversions actually are — the read that says whether two campaigns' conversion rates are measuring the same event\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, segments.conversion_action_name, segments.conversion_action_category, metrics.conversions, metrics.all_conversions FROM campaign WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.conversions DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\"],\n },\n {\n name: \"keyword-analysis\",\n description:\n \"Keyword performance with match type, quality and the first-page, top-of-page and first-position CPC estimates\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_criterion.criterion_id, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.status, ad_group_criterion.quality_info.quality_score, ad_group_criterion.position_estimates.first_page_cpc_micros, ad_group_criterion.position_estimates.top_of_page_cpc_micros, ad_group_criterion.position_estimates.first_position_cpc_micros, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.all_conversions, metrics.ctr FROM keyword_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.impressions DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\", \"ad_group.status\", \"ad_group_criterion.status\"],\n },\n {\n name: \"keyword-serving\",\n description:\n \"Why a keyword is limited — Google Ads' 'Eligible (Limited) / Below first page bid' column, with the first-page bid estimate, the current max CPC and quality score\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, ad_group.id, ad_group.name, ad_group_criterion.criterion_id, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.status, ad_group_criterion.primary_status, ad_group_criterion.primary_status_reasons, ad_group_criterion.system_serving_status, ad_group_criterion.approval_status, ad_group_criterion.effective_cpc_bid_micros, ad_group_criterion.effective_cpc_bid_source, ad_group_criterion.position_estimates.first_page_cpc_micros, ad_group_criterion.position_estimates.top_of_page_cpc_micros, ad_group_criterion.quality_info.quality_score, ad_group_criterion.quality_info.creative_quality_score, ad_group_criterion.quality_info.post_click_quality_score, ad_group_criterion.quality_info.search_predicted_ctr FROM ad_group_criterion WHERE ad_group_criterion.type = 'KEYWORD' AND ad_group_criterion.negative = FALSE{statusScope} ORDER BY campaign.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n statusFields: [\"campaign.status\", \"ad_group.status\", \"ad_group_criterion.status\"],\n },\n {\n name: \"positive-keywords\",\n description: \"Positive (targeting) keywords only — excludes negatives\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_criterion.criterion_id, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.status, ad_group_criterion.negative FROM ad_group_criterion WHERE ad_group_criterion.type = 'KEYWORD' AND ad_group_criterion.negative = FALSE{statusScope} ORDER BY campaign.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n statusFields: [\"campaign.status\", \"ad_group.status\", \"ad_group_criterion.status\"],\n },\n {\n name: \"negative-keywords\",\n description: \"Negative keywords only — campaign and ad group level\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, ad_group.name, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.negative FROM ad_group_criterion WHERE ad_group_criterion.type = 'KEYWORD' AND ad_group_criterion.negative = TRUE AND campaign.status != 'REMOVED' ORDER BY campaign.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n },\n {\n name: \"negative-keyword-lists\",\n description:\n \"Shared negative keyword lists and the terms inside them (SharedSet members), with each member's resource name — what `negative-keywords remove` / a list-member removal takes\",\n gaqlTemplate: `SELECT shared_set.id, shared_set.name, shared_criterion.resource_name, shared_criterion.criterion_id, shared_criterion.keyword.text, shared_criterion.keyword.match_type FROM shared_criterion WHERE shared_set.type = 'NEGATIVE_KEYWORDS' AND shared_set.status = 'ENABLED' ORDER BY shared_set.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n },\n {\n name: \"negative-list-attachments\",\n description: \"Which campaigns each shared negative keyword list is attached to\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, shared_set.id, shared_set.name FROM campaign_shared_set WHERE shared_set.type = 'NEGATIVE_KEYWORDS' AND campaign_shared_set.status = 'ENABLED' ORDER BY campaign.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n },\n {\n name: \"search-terms\",\n description: \"Actual user search queries triggering ads, with the match type that matched them\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.name, ad_group.status, search_term_view.search_term, segments.search_term_match_type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM search_term_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.impressions DESC`,\n defaultDateRange: \"LAST_7_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\", \"ad_group.status\"],\n },\n {\n name: \"ad-copy-performance\",\n description: \"Every ad's metrics, with its headlines and descriptions when it is a responsive search ad\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_ad.ad.id, ad_group_ad.ad.type, ad_group_ad.status, ad_group_ad.ad.responsive_search_ad.headlines, ad_group_ad.ad.responsive_search_ad.descriptions, ad_group_ad.ad.final_urls, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.all_conversions, metrics.ctr FROM ad_group_ad WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.impressions DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\", \"ad_group.status\", \"ad_group_ad.status\"],\n },\n {\n name: \"asset-performance\",\n // `asset_group_asset.performance_label` is gone (v25 answers UNRECOGNIZED_FIELD): Google retired\n // the BEST/GOOD/LOW label, so the read is each asset's serving status and its own metrics.\n description: \"Performance Max assets: serving status and metrics per asset\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, asset_group.name, asset_group.status, asset_group_asset.status, asset_group_asset.field_type, asset_group_asset.primary_status, asset_group_asset.primary_status_reasons, asset.type, asset.text_asset.text, asset.image_asset.full_size.url, metrics.impressions, metrics.clicks, metrics.conversions, metrics.cost_micros FROM asset_group_asset WHERE campaign.advertising_channel_type = 'PERFORMANCE_MAX' AND segments.date DURING {dateRange}{statusScope}`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\", \"asset_group.status\", \"asset_group_asset.status\"],\n },\n {\n name: \"shopping-products\",\n description: \"Product-level shopping performance metrics\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, segments.product_title, segments.product_item_id, segments.product_brand, segments.product_type_l1, metrics.clicks, metrics.impressions, metrics.cost_micros, metrics.conversions FROM shopping_performance_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\"],\n },\n {\n name: \"account-summary\",\n description: \"Account-level totals for a date range\",\n gaqlTemplate: `SELECT customer.id, customer.descriptive_name, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.all_conversions, metrics.conversions_value FROM customer WHERE segments.date DURING {dateRange} LIMIT 1`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 1,\n },\n];\n\n/**\n * Reports the account read most often asks for beyond the core presets: where Performance Max\n * spends, where display ads showed, which RSA assets serve, landing pages, geography, demographics,\n * AI Max matches, the account budget, Google's recommendations and its bid/budget simulations.\n * Every GAQL here was run against a live v25 account before it was added.\n */\nexport const REPORT_PRESETS: PresetDefinition[] = [\n {\n name: \"pmax-channels\",\n description:\n \"Performance Max spend and results split by channel (Search, YouTube, Display, Discover, Gmail, Maps…) — segments.ad_network_type per campaign\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, segments.ad_network_type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.conversions_value FROM campaign WHERE campaign.advertising_channel_type = 'PERFORMANCE_MAX' AND segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\"],\n },\n {\n name: \"pmax-placements\",\n description:\n \"Where Performance Max ads showed on Display / YouTube / apps (Google reports impressions only for these)\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, performance_max_placement_view.display_name, performance_max_placement_view.placement, performance_max_placement_view.placement_type, performance_max_placement_view.target_url, metrics.impressions FROM performance_max_placement_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.impressions DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\"],\n },\n {\n name: \"placements\",\n description:\n \"Where Display, Video and Demand Gen ads showed — each website, app or YouTube video, with cost and conversions (exclusion candidates)\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, detail_placement_view.display_name, detail_placement_view.placement, detail_placement_view.placement_type, detail_placement_view.target_url, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM detail_placement_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\", \"ad_group.status\"],\n },\n {\n name: \"rsa-assets\",\n description:\n \"Each responsive search ad headline and description: its text, pin, whether it is enabled, its approval and its own impressions/clicks/conversions\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_ad.ad.id, ad_group_ad.status, ad_group_ad_asset_view.field_type, ad_group_ad_asset_view.pinned_field, ad_group_ad_asset_view.enabled, ad_group_ad_asset_view.policy_summary, asset.id, asset.text_asset.text, metrics.impressions, metrics.clicks, metrics.conversions FROM ad_group_ad_asset_view WHERE ad_group_ad.ad.type = 'RESPONSIVE_SEARCH_AD' AND segments.date DURING {dateRange}{statusScope} ORDER BY metrics.impressions DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 500,\n statusFields: [\"campaign.status\", \"ad_group.status\", \"ad_group_ad.status\"],\n },\n {\n name: \"landing-pages\",\n description:\n \"Final URLs as written on the ads, with clicks, cost, conversions, mobile-friendly click share and speed score\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, landing_page_view.unexpanded_final_url, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.mobile_friendly_clicks_percentage, metrics.speed_score FROM landing_page_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.clicks DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\"],\n },\n {\n name: \"geo-performance\",\n description:\n \"Results by country and location type (people IN vs INTERESTED IN the place) per campaign — the read behind a Presence vs Presence-or-interest decision\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, geographic_view.country_criterion_id, geographic_view.location_type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM geographic_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\"],\n },\n {\n name: \"age-performance\",\n description: \"Results by age range per ad group\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_criterion.age_range.type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM age_range_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\", \"ad_group.status\"],\n },\n {\n name: \"gender-performance\",\n description: \"Results by gender per ad group\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_criterion.gender.type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM gender_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\", \"ad_group.status\"],\n },\n {\n name: \"ai-max-search-terms\",\n description:\n \"AI Max for Search: each search term with the headline and landing page Google generated or chose for it, with results\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ai_max_search_term_ad_combination_view.search_term, ai_max_search_term_ad_combination_view.headline, ai_max_search_term_ad_combination_view.landing_page, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM ai_max_search_term_ad_combination_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.impressions DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\", \"ad_group.status\"],\n },\n {\n name: \"bidding-strategy-performance\",\n description: \"Each portfolio bidding strategy's type, status, targets and metrics\",\n gaqlTemplate: `SELECT bidding_strategy.id, bidding_strategy.name, bidding_strategy.type, bidding_strategy.status, bidding_strategy.campaign_count, bidding_strategy.target_cpa.target_cpa_micros, bidding_strategy.target_roas.target_roas, bidding_strategy.maximize_conversions.target_cpa_micros, bidding_strategy.maximize_conversion_value.target_roas, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.all_conversions, metrics.conversions_value FROM bidding_strategy WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n statusFields: [\"bidding_strategy.status\"],\n },\n {\n name: \"conversion-tags\",\n description:\n \"The tracking code of each website and call conversion action: the Google tag and the event snippet to put on the site\",\n gaqlTemplate: `SELECT conversion_action.id, conversion_action.name, conversion_action.type, conversion_action.status, conversion_action.tag_snippets FROM conversion_action WHERE conversion_action.type IN ('WEBPAGE', 'WEBPAGE_CODELESS', 'WEBSITE_CALL') AND conversion_action.status != 'REMOVED' ORDER BY conversion_action.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 50,\n },\n {\n name: \"account-budget\",\n description:\n \"The account budget (invoiced billing): approved spending limit, served amount, dates and any pending change — read-only\",\n gaqlTemplate: `SELECT account_budget.id, account_budget.name, account_budget.status, account_budget.billing_setup, account_budget.approved_spending_limit_micros, account_budget.approved_spending_limit_type, account_budget.amount_served_micros, account_budget.total_adjustments_micros, account_budget.approved_start_date_time, account_budget.approved_end_date_time, account_budget.pending_proposal.proposal_type, account_budget.pending_proposal.spending_limit_micros FROM account_budget ORDER BY account_budget.approved_start_date_time DESC`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 50,\n },\n {\n name: \"recommendations\",\n description:\n \"Google's open recommendations (not dismissed): type, the campaign/ad group it targets, and its estimated impact\",\n gaqlTemplate: `SELECT recommendation.resource_name, recommendation.type, recommendation.campaign, recommendation.ad_group, recommendation.impact FROM recommendation WHERE recommendation.dismissed = FALSE`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 200,\n },\n {\n name: \"campaign-simulations\",\n description:\n \"Google's what-if curves per campaign — budget, target CPA / ROAS, CPC bid or target impression share against the clicks, cost and conversions Google predicts\",\n gaqlTemplate: `SELECT campaign_simulation.campaign_id, campaign_simulation.type, campaign_simulation.modification_method, campaign_simulation.start_date, campaign_simulation.end_date, campaign_simulation.budget_point_list.points, campaign_simulation.target_cpa_point_list.points, campaign_simulation.target_roas_point_list.points, campaign_simulation.cpc_bid_point_list.points, campaign_simulation.target_impression_share_point_list.points FROM campaign_simulation`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 200,\n },\n {\n name: \"keyword-bid-simulations\",\n description: \"Google's what-if curve per keyword: CPC bid against predicted clicks, cost and impressions\",\n gaqlTemplate: `SELECT ad_group_criterion_simulation.ad_group_id, ad_group_criterion_simulation.criterion_id, ad_group_criterion_simulation.type, ad_group_criterion_simulation.start_date, ad_group_criterion_simulation.end_date, ad_group_criterion_simulation.cpc_bid_point_list.points FROM ad_group_criterion_simulation`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 200,\n },\n];\n\n/**\n * What each `<thing> list` command reads: every entity of that kind that is not removed, with the\n * id or resource name its write commands take. Read through `query`, so they page like any read.\n * Run as `query --preset <name>` they are serving-only like every preset; `<thing> list` widens the\n * chain to everything not removed, because the thing you came to edit is often paused.\n */\nexport const INVENTORY_PRESETS: PresetDefinition[] = [\n {\n name: \"campaigns\",\n description: \"Every campaign: id, name, status, channel, bidding, budget and dates\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, campaign.primary_status, campaign.advertising_channel_type, campaign.advertising_channel_sub_type, campaign.bidding_strategy_type, campaign.bidding_strategy, campaign.campaign_budget, campaign_budget.amount_micros, campaign.start_date_time, campaign.end_date_time FROM campaign{statusWhere} ORDER BY campaign.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\"],\n },\n {\n name: \"budgets\",\n description:\n \"Every campaign budget: id, name, daily amount, delivery, whether it is shared and how many campaigns use it\",\n gaqlTemplate: `SELECT campaign_budget.id, campaign_budget.name, campaign_budget.status, campaign_budget.amount_micros, campaign_budget.delivery_method, campaign_budget.explicitly_shared, campaign_budget.reference_count FROM campaign_budget WHERE campaign_budget.status != 'REMOVED' ORDER BY campaign_budget.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 200,\n },\n {\n name: \"ad-groups\",\n description: \"Every ad group: id, name, status, type and default CPC bid, under its campaign\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group.type, ad_group.cpc_bid_micros FROM ad_group{statusWhere} ORDER BY campaign.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n statusFields: [\"campaign.status\", \"ad_group.status\"],\n },\n {\n name: \"keywords\",\n description:\n \"Every positive keyword: resource name, text, match type, status, bid and final URL — `keywords update|remove` take the resource name\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_criterion.resource_name, ad_group_criterion.criterion_id, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.status, ad_group_criterion.negative, ad_group_criterion.cpc_bid_micros, ad_group_criterion.final_urls FROM ad_group_criterion WHERE ad_group_criterion.type = 'KEYWORD' AND ad_group_criterion.negative = FALSE{statusScope} ORDER BY campaign.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n statusFields: [\"campaign.status\", \"ad_group.status\", \"ad_group_criterion.status\"],\n },\n {\n name: \"campaign-negative-keywords\",\n description: \"Campaign-level negative keywords with the resource name `negative-keywords remove` takes\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, campaign_criterion.resource_name, campaign_criterion.keyword.text, campaign_criterion.keyword.match_type FROM campaign_criterion WHERE campaign_criterion.type = 'KEYWORD' AND campaign_criterion.negative = TRUE AND campaign_criterion.status != 'REMOVED' AND campaign.status != 'REMOVED' ORDER BY campaign.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n },\n {\n name: \"ad-group-negative-keywords\",\n description: \"Ad-group-level negative keywords with the resource name `negative-keywords remove` takes\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, ad_group.id, ad_group.name, ad_group_criterion.resource_name, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.negative FROM ad_group_criterion WHERE ad_group_criterion.type = 'KEYWORD' AND ad_group_criterion.negative = TRUE AND ad_group_criterion.status != 'REMOVED' AND ad_group.status != 'REMOVED' AND campaign.status != 'REMOVED' ORDER BY campaign.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n },\n {\n name: \"shared-sets\",\n description:\n \"Every shared list (negative keyword / placement lists): id, name, type, member count and how many campaigns use it\",\n gaqlTemplate: `SELECT shared_set.id, shared_set.name, shared_set.type, shared_set.status, shared_set.member_count, shared_set.reference_count FROM shared_set WHERE shared_set.status != 'REMOVED' ORDER BY shared_set.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 200,\n },\n {\n name: \"ads\",\n description: \"Every ad: id, type, name, status, approval and final URLs, under its ad group\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_ad.resource_name, ad_group_ad.ad.id, ad_group_ad.ad.type, ad_group_ad.ad.name, ad_group_ad.status, ad_group_ad.policy_summary.approval_status, ad_group_ad.ad.final_urls FROM ad_group_ad{statusWhere} ORDER BY campaign.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n statusFields: [\"campaign.status\", \"ad_group.status\", \"ad_group_ad.status\"],\n },\n {\n name: \"assets\",\n description: \"Every asset in the account library: id, name, type, text and final URLs\",\n gaqlTemplate: `SELECT asset.id, asset.name, asset.type, asset.text_asset.text, asset.sitelink_asset.link_text, asset.callout_asset.callout_text, asset.image_asset.full_size.url, asset.youtube_video_asset.youtube_video_id, asset.final_urls FROM asset ORDER BY asset.type`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n },\n {\n name: \"asset-groups\",\n description: \"Every Performance Max asset group: id, name, status, final URLs and strength, under its campaign\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, asset_group.resource_name, asset_group.id, asset_group.name, asset_group.status, asset_group.final_urls, asset_group.ad_strength FROM asset_group{statusWhere} ORDER BY campaign.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 200,\n statusFields: [\"campaign.status\", \"asset_group.status\"],\n },\n {\n name: \"audiences\",\n description:\n \"Every audience (user list): id, name, type, membership status, size on search and display, membership duration\",\n gaqlTemplate: `SELECT user_list.id, user_list.name, user_list.type, user_list.membership_status, user_list.size_for_search, user_list.size_for_display, user_list.membership_life_span, user_list.eligible_for_search, user_list.eligible_for_display FROM user_list ORDER BY user_list.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 200,\n },\n {\n name: \"conversion-actions\",\n description: \"Every conversion action: id, name, type, category, origin, status, primary or secondary, counting\",\n gaqlTemplate: `SELECT conversion_action.id, conversion_action.name, conversion_action.type, conversion_action.category, conversion_action.origin, conversion_action.status, conversion_action.primary_for_goal, conversion_action.counting_type FROM conversion_action WHERE conversion_action.status != 'REMOVED' ORDER BY conversion_action.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 200,\n },\n {\n name: \"bidding-strategies\",\n description: \"Every portfolio bidding strategy: id, name, type, status and how many campaigns use it\",\n gaqlTemplate: `SELECT bidding_strategy.id, bidding_strategy.name, bidding_strategy.type, bidding_strategy.status, bidding_strategy.campaign_count FROM bidding_strategy WHERE bidding_strategy.status != 'REMOVED' ORDER BY bidding_strategy.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 200,\n },\n {\n name: \"labels\",\n description: \"Every label: id, name, colour and description\",\n gaqlTemplate: `SELECT label.id, label.name, label.status, label.text_label.background_color, label.text_label.description FROM label WHERE label.status != 'REMOVED' ORDER BY label.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 200,\n },\n {\n name: \"merchant-center\",\n description:\n \"Merchant Center accounts linked to this Google Ads account — the merchantId a Shopping or retail Performance Max campaign names\",\n gaqlTemplate: `SELECT product_link.resource_name, product_link.product_link_id, product_link.type, product_link.merchant_center.merchant_center_id FROM product_link WHERE product_link.type = 'MERCHANT_CENTER'`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 200,\n },\n {\n name: \"campaign-criteria\",\n description:\n \"Every campaign targeting criterion and exclusion — locations, languages, devices, ad schedules, radius, carriers, operating systems, placements, topics, demographics, content types, IP addresses, web pages, brand lists, audiences — with the resource name `campaign-criteria update|remove` takes\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, campaign.advertising_channel_type, campaign_criterion.resource_name, campaign_criterion.type, campaign_criterion.negative, campaign_criterion.bid_modifier, campaign_criterion.location.geo_target_constant, campaign_criterion.language.language_constant, campaign_criterion.device.type, campaign_criterion.ad_schedule.day_of_week, campaign_criterion.ad_schedule.start_hour, campaign_criterion.ad_schedule.end_hour, campaign_criterion.proximity.radius, campaign_criterion.placement.url, campaign_criterion.mobile_application.app_id, campaign_criterion.youtube_channel.channel_id, campaign_criterion.youtube_video.video_id, campaign_criterion.topic.topic_constant, campaign_criterion.age_range.type, campaign_criterion.gender.type, campaign_criterion.income_range.type, campaign_criterion.parental_status.type, campaign_criterion.content_label.type, campaign_criterion.ip_block.ip_address, campaign_criterion.webpage.criterion_name, campaign_criterion.brand_list.shared_set, campaign_criterion.carrier.carrier_constant, campaign_criterion.operating_system_version.operating_system_version_constant, campaign_criterion.user_list.user_list, campaign_criterion.user_interest.user_interest_category FROM campaign_criterion WHERE campaign_criterion.type != 'KEYWORD' AND campaign_criterion.status != 'REMOVED' AND campaign.status != 'REMOVED' ORDER BY campaign.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n },\n {\n name: \"ad-group-criteria\",\n description:\n \"Every ad group targeting criterion and exclusion other than keywords — placements, apps, YouTube, topics, demographics, web pages, Demand Gen locations, languages and audience, audiences — with its bid adjustment, max CPC, status and the resource name `ad-group-criteria update|remove` takes\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, campaign.advertising_channel_type, ad_group.id, ad_group.name, ad_group.status, ad_group_criterion.resource_name, ad_group_criterion.type, ad_group_criterion.negative, ad_group_criterion.status, ad_group_criterion.bid_modifier, ad_group_criterion.cpc_bid_micros, ad_group_criterion.placement.url, ad_group_criterion.mobile_application.app_id, ad_group_criterion.youtube_channel.channel_id, ad_group_criterion.youtube_video.video_id, ad_group_criterion.topic.topic_constant, ad_group_criterion.age_range.type, ad_group_criterion.gender.type, ad_group_criterion.parental_status.type, ad_group_criterion.income_range.type, ad_group_criterion.webpage.criterion_name, ad_group_criterion.location.geo_target_constant, ad_group_criterion.language.language_constant, ad_group_criterion.audience.audience, ad_group_criterion.brand_list.shared_set, ad_group_criterion.user_list.user_list, ad_group_criterion.user_interest.user_interest_category FROM ad_group_criterion WHERE ad_group_criterion.type NOT IN ('KEYWORD', 'LISTING_GROUP'){statusScope} ORDER BY campaign.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n statusFields: [\"campaign.status\", \"ad_group.status\", \"ad_group_criterion.status\"],\n },\n {\n name: \"account-exclusions\",\n description:\n \"Every account-wide exclusion — sites, apps, app categories, YouTube, content types, IP addresses, account negative keyword lists — with the resource name `account-exclusions remove` takes\",\n gaqlTemplate: `SELECT customer_negative_criterion.resource_name, customer_negative_criterion.type, customer_negative_criterion.placement.url, customer_negative_criterion.mobile_application.app_id, customer_negative_criterion.mobile_app_category.mobile_app_category_constant, customer_negative_criterion.youtube_channel.channel_id, customer_negative_criterion.youtube_video.video_id, customer_negative_criterion.content_label.type, customer_negative_criterion.ip_block.ip_address, customer_negative_criterion.negative_keyword_list.shared_set FROM customer_negative_criterion`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n },\n {\n name: \"asset-group-signals\",\n description:\n \"Every Performance Max asset group's signals — search themes and the combined audience — under its campaign and group, with the resource name `asset-group-signals remove` takes\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, asset_group.id, asset_group.name, asset_group_signal.resource_name, asset_group_signal.search_theme.text, asset_group_signal.audience.audience, asset_group_signal.approval_status FROM asset_group_signal WHERE campaign.status != 'REMOVED' AND asset_group.status != 'REMOVED' ORDER BY campaign.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n },\n {\n name: \"ad-group-bid-modifiers\",\n description:\n \"Every ad group's own device bid adjustment, with the resource name `ad-group-bid-modifiers update|remove` takes\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, ad_group.id, ad_group.name, ad_group_bid_modifier.resource_name, ad_group_bid_modifier.device.type, ad_group_bid_modifier.bid_modifier FROM ad_group_bid_modifier WHERE campaign.status != 'REMOVED' AND ad_group.status != 'REMOVED' ORDER BY campaign.name`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n },\n];\n\nexport const PRESETS: PresetDefinition[] = [...CORE_PRESETS, ...REPORT_PRESETS, ...INVENTORY_PRESETS];\n\nexport function isInventoryPreset(name: string): boolean {\n return INVENTORY_PRESETS.some((preset) => preset.name === name);\n}\n\nexport function getPreset(name: string): PresetDefinition | undefined {\n return PRESETS.find((p) => p.name === name);\n}\n\n/**\n * Build the chained status predicate a preset's `{statusScope}` placeholder expands to.\n * Serving-only (default) requires every level `= 'ENABLED'`; includePaused widens to\n * `!= 'REMOVED'` (keeps paused, still drops removed). Returns a leading-AND fragment so it\n * appends cleanly onto an existing WHERE clause, or \"\" when the preset has no serving chain.\n */\nexport function buildStatusScope(statusFields: string[] | undefined, includePaused: boolean): string {\n if (!statusFields || statusFields.length === 0) return \"\";\n const predicate = includePaused ? \"!= 'REMOVED'\" : \"= 'ENABLED'\";\n return statusFields.map((field) => ` AND ${field} ${predicate}`).join(\"\");\n}\n\nexport function expandPreset(\n preset: PresetDefinition,\n params: { dateRange?: string; includePaused?: boolean },\n now: Date = new Date(),\n): { query: string; dateRangeError?: string } {\n const dateRange = params.dateRange ?? preset.defaultDateRange;\n\n // A preset with no date filter (default ALL_TIME) never expands the range, so there is nothing to check.\n if (preset.gaqlTemplate.includes(\"{dateRange}\") && !isValidDateRange(dateRange)) {\n return { query: \"\", dateRangeError: dateRangeError(dateRange, now) };\n }\n\n const statusScope = buildStatusScope(preset.statusFields, params.includePaused ?? false);\n // A literal follows DURING; a range replaces it — \"DURING BETWEEN …\" is a statement Google refuses.\n const range = dateRange.trim();\n const query = preset.gaqlTemplate\n .replace(/DURING\\s+\\{dateRange\\}/g, BETWEEN_RE.test(range) ? range : `DURING ${range}`)\n .replace(/\\{dateRange\\}/g, range)\n .replace(/\\{statusScope\\}/g, statusScope)\n // A template with no WHERE of its own takes the chain as its whole WHERE clause.\n .replace(/\\{statusWhere\\}/g, statusScope ? ` WHERE${statusScope.replace(/^ AND/, \"\")}` : \"\");\n return { query };\n}\n","// Every filterable list (repeated) field in Google Ads API v25 — 92 of them. Google filters a list\n// field only with CONTAINS ALL / ANY / NONE and refuses anything else (=, IN, LIKE, IS NULL …) with\n// OPERATOR_FIELD_MISMATCH; 88 were probed live on v23 and each answered exactly that, and v25 added\n// the four `lift_measurement_config.*` lists (regenerated 2026-10-08, none removed). Regenerate\n// on an API version bump (list-fields.test.ts fails until you do) from GoogleAdsFieldService:\n// POST /v<N>/googleAdsFields:search\n// {\"query\": \"SELECT name WHERE is_repeated = true AND filterable = true\"}\nexport const LIST_FIELDS_API_VERSION = \"v25\";\n\nexport const LIST_FIELDS: ReadonlySet<string> = new Set([\n \"ad.final_mobile_urls\",\n \"ad.final_urls\",\n \"ad_group.excluded_parent_asset_field_types\",\n \"ad_group.excluded_parent_asset_set_types\",\n \"ad_group.labels\",\n \"ad_group.primary_status_reasons\",\n \"ad_group_ad.ad.final_mobile_urls\",\n \"ad_group_ad.ad.final_urls\",\n \"ad_group_ad.labels\",\n \"ad_group_ad.primary_status_reasons\",\n \"ad_group_asset.primary_status_reasons\",\n \"ad_group_criterion.disapproval_reasons\",\n \"ad_group_criterion.final_mobile_urls\",\n \"ad_group_criterion.final_urls\",\n \"ad_group_criterion.labels\",\n \"ad_group_criterion.primary_status_reasons\",\n \"ad_group_criterion.topic.path\",\n \"ad_group_criterion.webpage.sample.sample_urls\",\n \"asset.dynamic_custom_asset.contextual_keywords\",\n \"asset.dynamic_custom_asset.similar_ids\",\n \"asset.dynamic_education_asset.contextual_keywords\",\n \"asset.dynamic_education_asset.similar_program_ids\",\n \"asset.dynamic_flights_asset.similar_destination_ids\",\n \"asset.dynamic_hotels_and_rentals_asset.contextual_keywords\",\n \"asset.dynamic_hotels_and_rentals_asset.similar_property_ids\",\n \"asset.dynamic_jobs_asset.contextual_keywords\",\n \"asset.dynamic_jobs_asset.similar_job_ids\",\n \"asset.dynamic_local_asset.contextual_keywords\",\n \"asset.dynamic_local_asset.similar_deal_ids\",\n \"asset.dynamic_real_estate_asset.contextual_keywords\",\n \"asset.dynamic_real_estate_asset.similar_listing_ids\",\n \"asset.dynamic_travel_asset.contextual_keywords\",\n \"asset.dynamic_travel_asset.similar_destination_ids\",\n \"asset.final_mobile_urls\",\n \"asset.final_urls\",\n \"asset.page_feed_asset.labels\",\n \"asset.structured_snippet_asset.values\",\n \"asset_group.final_mobile_urls\",\n \"asset_group.final_urls\",\n \"asset_group.primary_status_reasons\",\n \"asset_group_asset.primary_status_reasons\",\n \"asset_group_signal.disapproval_reasons\",\n \"asset_set.business_profile_location_group.dynamic_business_profile_location_group_filter.label_filters\",\n \"asset_set.business_profile_location_group.dynamic_business_profile_location_group_filter.listing_id_filters\",\n \"asset_set.location_set.business_profile_location_set.label_filters\",\n \"asset_set.location_set.business_profile_location_set.listing_id_filters\",\n \"bidding_data_exclusion.advertising_channel_types\",\n \"bidding_data_exclusion.campaigns\",\n \"bidding_data_exclusion.devices\",\n \"bidding_seasonality_adjustment.advertising_channel_types\",\n \"bidding_seasonality_adjustment.campaigns\",\n \"bidding_seasonality_adjustment.devices\",\n \"campaign.excluded_parent_asset_field_types\",\n \"campaign.excluded_parent_asset_set_types\",\n \"campaign.feed_types\",\n \"campaign.labels\",\n \"campaign.optimization_goal_setting.optimization_goal_types\",\n \"campaign.primary_status_reasons\",\n \"campaign.selective_optimization.conversion_actions\",\n \"campaign.shopping_setting.advertising_partner_ids\",\n \"campaign.text_guidelines.term_exclusions\",\n \"campaign_asset.primary_status_reasons\",\n \"campaign_criterion.location_group.geo_target_constants\",\n \"campaign_criterion.topic.path\",\n \"campaign_criterion.webpage.sample.sample_urls\",\n \"conversion_value_rule.audience_condition.user_interests\",\n \"conversion_value_rule.audience_condition.user_lists\",\n \"conversion_value_rule.device_condition.device_types\",\n \"conversion_value_rule.geo_location_condition.excluded_geo_target_constants\",\n \"conversion_value_rule.geo_location_condition.geo_target_constants\",\n \"conversion_value_rule_set.conversion_value_rules\",\n \"conversion_value_rule_set.dimensions\",\n \"custom_conversion_goal.conversion_actions\",\n \"customer.pay_per_conversion_eligibility_failure_reasons\",\n \"customer_asset.primary_status_reasons\",\n \"customer_client.applied_labels\",\n \"experiment_arm.campaigns\",\n \"experiment_arm.in_design_campaigns\",\n \"keyword_plan_campaign.language_constants\",\n \"lift_measurement_config.campaigns\",\n \"lift_measurement_config.conversion_actions\",\n \"lift_measurement_config.single_measurement_question_set.competitor_choices\",\n \"lift_measurement_config.single_measurement_question_set.question_measurements\",\n \"local_services_employee.category_ids\",\n \"local_services_employee.languages_spoken\",\n \"metrics.interaction_event_types\",\n \"recommendation.campaigns\",\n \"shared_criterion.webpage.sample.sample_urls\",\n \"shopping_product.target_countries\",\n \"topic_constant.path\",\n \"user_list.lookalike_user_list.country_codes\",\n \"user_list.lookalike_user_list.seed_user_list_ids\",\n]);\n\nexport const LIST_FIELD_OPERATORS = \"CONTAINS ALL, CONTAINS ANY, CONTAINS NONE\";\n\n/** Why a list field refused an operator, and the read that works instead. */\nexport function listFieldGuidance(field: string): string {\n return `${field} is a list field: it takes only ${LIST_FIELD_OPERATORS} — no comparison (=, !=, IN), pattern match or null test. To find rows that have it, drop that condition, keep ${field} in SELECT and filter the rows (rows without it omit the key); to match values, use ${field} CONTAINS ANY ('value')`;\n}\n","import type { CorrectionContext, CorrectionRule, QueryFix } from \"../types.ts\";\nimport { monthlySpendTrendQuery } from \"./changes-window.ts\";\nimport { LIST_FIELDS, listFieldGuidance } from \"./list-fields.ts\";\nimport { PRESETS } from \"./presets.ts\";\n\nfunction buildCommand(query: string, ctx: CorrectionContext): string {\n return `baker ads google query \"${query}\" --customer-id ${ctx.customerId}`;\n}\n\n/** GAQL joins WHERE conditions with AND only — what to write instead of an OR. */\nexport const NO_OR_EXPLANATION =\n \"GAQL has no OR: WHERE conditions combine only with AND, and cannot be grouped in parentheses. For several values of one field use IN: field IN ('a', 'b'). For several patterns on one text field use REGEXP_MATCH: field REGEXP_MATCH '(?i).*(a|b).*'. For alternatives on different fields, run one query per condition and merge the rows.\";\n\n/** Every field a shipped preset or the list-field catalogue names — each one read live against this API version. */\nconst KNOWN_FIELDS: ReadonlySet<string> = new Set([\n ...PRESETS.flatMap((preset) => preset.gaqlTemplate.match(/\\b[a-z_]+(?:\\.[a-z0-9_]+)+/g) ?? []),\n ...LIST_FIELDS,\n]);\n\nfunction sharedPrefixLength(a: string, b: string): number {\n let i = 0;\n while (i < a.length && i < b.length && a[i] === b[i]) i++;\n return i;\n}\n\n/**\n * Known fields of the same resource whose name starts with the same word as `field`, closest first:\n * `campaign.start_date` → `campaign.start_date_time`. Google answers an unknown field with its name\n * only, so this is the one place a renamed field's current name can come from.\n */\nexport function similarKnownFields(field: string): string[] {\n const [resource = \"\", attribute = \"\"] = field.split(/\\.(.*)/s);\n const firstWord = attribute.split(/[_.]/)[0];\n if (!firstWord) return [];\n const stem = `${resource}.${firstWord}`;\n return [...KNOWN_FIELDS]\n .filter((known) => known !== field && known.startsWith(stem))\n .sort((a, b) => sharedPrefixLength(b, field) - sharedPrefixLength(a, field) || a.localeCompare(b))\n .slice(0, 3);\n}\n\n/** Fields Google moved onto another resource: no same-resource search can find where they went. */\nconst MOVED_FIELDS: Readonly<Record<string, string>> = {\n \"campaign.conversion_goal_config.goal_config_level\": \"conversion_goal_campaign_config.goal_config_level\",\n};\n\nfunction unknownFieldFix(field: string, ctx: CorrectionContext): QueryFix {\n const similar = similarKnownFields(field);\n const gone = `${field} does not exist in this Google Ads API version (removed, renamed or misspelled).`;\n const moved = MOVED_FIELDS[field];\n if (moved) {\n const resource = moved.split(\".\")[0];\n return {\n action: \"retry_with_modified_query\",\n explanation: `${gone} It moved to ${moved}: select it FROM ${resource} (campaign fields such as campaign.name can be selected alongside).`,\n };\n }\n if (similar.length === 0) {\n return {\n action: \"retry_with_modified_query\",\n explanation: `${gone} Drop it, or find its replacement in Google's field reference for that resource.`,\n };\n }\n // A known field that only extends the name (`start_date` → `start_date_time`) is the rename itself.\n const renamed = similar.filter((known) => known.startsWith(`${field}_`));\n const [replacement] = renamed;\n if (renamed.length === 1 && replacement) {\n const corrected = ctx.originalQuery.replace(\n new RegExp(`(?<![\\\\w.])${field.replace(/\\./g, \"\\\\.\")}(?![\\\\w.])`, \"g\"),\n replacement,\n );\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: `${gone} Its current name is ${replacement} — swapped in.`,\n };\n }\n return {\n action: \"retry_with_modified_query\",\n explanation: `${gone} Fields with a similar name on this resource: ${similar.join(\", \")}. Use the one you meant, or drop it.`,\n };\n}\n\nexport const CORRECTION_RULES: CorrectionRule[] = [\n // 0. EXPECTED_REFERENCED_FIELD_IN_SELECT_CLAUSE — some resources (e.g. campaign_budget)\n // require fields filtered in WHERE to also be selected. The error names the exact field,\n // so add it to SELECT and retry. Kept first: field-specific rules below must not shadow\n // this with an unrelated rewrite when the named field happens to match their pattern.\n {\n matchApiError: /must be present in SELECT clause:\\s*'([\\w.]+)'/i,\n fix: (ctx) => {\n const field = ctx.apiErrorMessage?.match(/must be present in SELECT clause:\\s*'([\\w.]+)'/i)?.[1];\n if (!field) {\n return {\n action: \"add_required_field\",\n explanation: \"Add the field named in the error to the SELECT clause and retry\",\n };\n }\n const corrected = ctx.originalQuery.replace(/SELECT\\s+/i, `SELECT ${field}, `);\n return {\n action: \"add_required_field\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: `${field} is used in WHERE but this resource requires it in SELECT too — added it`,\n };\n },\n },\n\n // 0b. OPERATOR_FIELD_MISMATCH — the field refuses this operator, and Google names the\n // ones it takes. Kept ahead of the field-specific rules for the same reason as rule 0.\n // A repeated field (final_urls, labels, …) takes only CONTAINS ALL/ANY/NONE, so it has\n // no null test at all: read it unfiltered and filter the rows instead.\n {\n matchApiError: /OPERATOR_FIELD_MISMATCH|is not a valid operator to use with/i,\n fix: (ctx) => {\n const message = ctx.apiErrorMessage ?? \"\";\n const field = message.match(/valid operator to use with '([\\w.]+)'/i)?.[1] ?? \"this field\";\n // Case-sensitive on purpose: Google writes operators uppercase, and with /i the capture would\n // also swallow any lowercase words just before the operator (\"the operator IS NULL\").\n const operator = message.match(/([A-Z=!<>][A-Z_ =!<>]*?) is not a valid operator/)?.[1]?.trim();\n const valid = message.match(/Valid operators: (.+?)\\.?(?:\"|$)/i)?.[1]?.trim();\n const refused = operator ? `${operator} cannot be used on ${field}` : `${field} does not take that operator`;\n const allowed = valid ? `; its valid operators are ${valid}` : \"\";\n const repeated = valid?.split(\",\").every((op) => /^CONTAINS (ALL|ANY|NONE)$/i.test(op.trim())) ?? false;\n const guidance = repeated\n ? `. ${listFieldGuidance(field)}`\n : \". Rewrite that condition with one of them, or drop it and filter the rows\";\n return {\n action: \"change_operator\",\n explanation: `${refused}${allowed}${guidance}`,\n };\n },\n },\n\n // 0c. An OR, or a parenthesised group, in WHERE. Google names the token it choked on\n // (\"unexpected input OR\", \"invalid field name '('\"), never the reason, so without this the\n // \"invalid … field\" wording fell through to the bare-resource rule below.\n {\n matchApiError: /unexpected input (?:OR|\\()|invalid field name \\\\?'\\(/i,\n fix: () => ({ action: \"retry_with_modified_query\", explanation: NO_OR_EXPLANATION }),\n },\n\n // 0d. An enum value this field does not have in this API version.\n {\n matchApiError: /BAD_ENUM_CONSTANT|Invalid enum value/i,\n fix: (ctx) => {\n const value = ctx.apiErrorMessage?.match(/Invalid enum value[^']*\\\\?'([\\w]+)/i)?.[1];\n return {\n action: \"retry_with_modified_query\",\n explanation: `${value ? `'${value}' is` : \"A value in this query is\"} not one of the values Google accepts for the field it filters, in this API version. Use one the field's reference lists, or drop that condition and filter the rows.`,\n };\n },\n },\n\n // 1. bare keyword.text → ad_group_criterion.keyword.text (leaves <resource>.keyword.text untouched)\n {\n matchApiError: /keyword\\.text/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/(?<![\\w.])keyword\\.text\\b/g, \"ad_group_criterion.keyword.text\");\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Use ad_group_criterion.keyword.text — keywords are accessed through the criterion resource\",\n };\n },\n },\n\n // 2. bare keyword.match_type → ad_group_criterion.keyword.match_type (leaves <resource>.keyword.match_type untouched)\n {\n matchApiError: /keyword\\.match_type/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(\n /(?<![\\w.])keyword\\.match_type\\b/g,\n \"ad_group_criterion.keyword.match_type\",\n );\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Use ad_group_criterion.keyword.match_type for keyword match type\",\n };\n },\n },\n\n // 3. campaign_budget.* queried FROM campaign\n {\n matchApiError: /campaign_budget.*not.*valid.*campaign|cannot.*select.*campaign_budget/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/FROM\\s+campaign\\b/i, \"FROM campaign_budget\");\n return {\n action: \"use_different_resource\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"campaign_budget fields must be queried FROM campaign_budget, not FROM campaign\",\n };\n },\n },\n\n // 6. Missing campaign.id in ad_group queries\n {\n matchApiError: /campaign\\.id.*required|must.*include.*campaign\\.id/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/SELECT\\s+/i, \"SELECT campaign.id, \");\n return {\n action: \"add_required_field\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Ad group queries require campaign.id in SELECT for parent context\",\n };\n },\n },\n\n // 6. Missing campaign.id in keyword_view queries\n {\n matchApiError: /campaign\\.id.*required.*keyword/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/SELECT\\s+/i, \"SELECT campaign.id, \");\n return {\n action: \"add_required_field\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Keyword view queries require campaign.id in SELECT\",\n };\n },\n },\n\n // 7. shopping_performance_view.product_* → segments.product_*\n {\n matchApiError: /shopping_performance_view\\.product/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/shopping_performance_view\\.product_(\\w+)/g, \"segments.product_$1\");\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Product fields are segments (segments.product_*), not fields on shopping_performance_view\",\n };\n },\n },\n\n // 8. Open-ended date range\n {\n matchApiError: /date.*range.*must.*finite|open.*ended/i,\n fix: (ctx) => {\n const match = ctx.originalQuery.match(/segments\\.date\\s*>=\\s*'(\\d{4}-\\d{2}-\\d{2})'/i);\n const startDate = match?.[1] ?? \"2024-01-01\";\n const today = new Date().toISOString().slice(0, 10);\n const corrected = ctx.originalQuery.replace(\n /segments\\.date\\s*>=\\s*'(\\d{4}-\\d{2}-\\d{2})'/i,\n `segments.date BETWEEN '${startDate}' AND '${today}'`,\n );\n return {\n action: \"narrow_date_range\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Use BETWEEN with explicit end date — open-ended ranges are not supported\",\n };\n },\n },\n\n // 10a. Customer not found (wrong customer ID)\n {\n matchApiError: /CUSTOMER_NOT_FOUND|not.*found.*customer/i,\n fix: () => ({\n action: \"reject\",\n explanation:\n \"Customer ID not found. Run 'baker ads google accounts' to list valid customer IDs, then retry with a valid --customer-id.\",\n }),\n },\n\n // 10b. Not accessible / login-customer-id required\n {\n matchApiError: /not.*accessible|login.customer.id/i,\n fix: (ctx) => ({\n action: \"reject\",\n correctedCommand: buildCommand(ctx.originalQuery, ctx),\n explanation:\n \"Account not accessible — may need a manager (MCC) login-customer-id. Run 'baker ads google accounts' to refresh the accounts cache, then retry.\",\n }),\n },\n\n // 12. Incompatible fields\n {\n matchApiError: /incompatible|mutually.*exclusive|cannot.*select.*together/i,\n fix: () => ({\n action: \"split_query\",\n explanation: \"These fields cannot be in the same query — split into separate queries and join client-side\",\n }),\n },\n\n // 15. ad.final_urls → ad_group_ad.ad.final_urls\n {\n matchApiError: /ad\\.final_urls/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/\\bad\\.final_urls\\b/g, \"ad_group_ad.ad.final_urls\");\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Use the full path: ad_group_ad.ad.final_urls\",\n };\n },\n },\n\n // 15b. asset.<type>_asset.final_urls → asset.final_urls (final URLs live on the asset\n // itself; the typed sub-message only carries type-specific fields like link_text)\n {\n matchApiError: /asset\\.\\w+_asset\\.final_(mobile_)?urls/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/asset\\.\\w+_asset\\.final_(mobile_)?urls\\b/g, \"asset.final_$1urls\");\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Final URLs are on the asset itself — use asset.final_urls, not asset.<type>_asset.final_urls\",\n };\n },\n },\n\n // 16. Rate limit / quota\n {\n matchApiError: /RESOURCE_EXHAUSTED|quota.*exceeded|rate.*limit/i,\n fix: () => ({\n action: \"wait_and_retry\",\n explanation: \"API quota exceeded — wait 30 seconds before retrying\",\n }),\n },\n\n // 17. WHERE on metrics\n {\n matchApiError: /cannot.*filter.*metric|WHERE.*metrics|prohibited.*where/i,\n fix: () => ({\n action: \"reject\",\n explanation:\n \"Cannot filter on metrics in WHERE clause — remove the metrics filter and filter results client-side\",\n }),\n },\n\n // 18. ORDER BY field not in SELECT\n {\n matchApiError: /order.*by.*field.*not.*selected|must.*select.*field.*order/i,\n fix: (ctx) => {\n const orderMatch = ctx.originalQuery.match(/ORDER\\s+BY\\s+([\\w.]+)/i);\n const field = orderMatch?.[1] ?? \"field\";\n const corrected = ctx.originalQuery.replace(/SELECT\\s+/i, `SELECT ${field}, `);\n return {\n action: \"add_required_field\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: `Add ${field} to SELECT — ORDER BY fields must be selected`,\n };\n },\n },\n\n // The change-history rules must stay ahead of rule 19: its `status.*filter`\n // pattern also matches Google's change_status errors (\"the change_status request\n // is missing filters on ...\"), and the first matching rule wins.\n // 18a. change_event past its 30-day reach → change_status, which reaches 90 days.\n // These three rules match on the error code only, never on the resource in the query:\n // keyed on the query, they would answer every unrelated failure on a history query with\n // \"switch resources\", which is never the real fix. The backend forwards the\n // code as JSON (`\"changeEventError\":\"START_DATE_TOO_OLD\"`), so match that shape as well\n // as the dotted enum spelling.\n {\n matchApiError: /changeEventError\\W{0,4}START_DATE_TOO_OLD/i,\n fix: (ctx) => {\n const limit = ctx.originalQuery.match(/LIMIT\\s+(\\d+)/i)?.[1] ?? \"50\";\n const requested = ctx.originalQuery.match(/change_date_time\\s*>=\\s*'([^']+)'/i)?.[1]?.slice(0, 10);\n // 89, not 90: the window includes today, so counting back a full 90 days would put\n // the start one day outside what change_status accepts.\n const oldestStart = new Date(Date.now() - 89 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10);\n const start = requested && requested > oldestStart ? requested : oldestStart;\n const corrected = `SELECT change_status.last_change_date_time, change_status.resource_type, change_status.resource_status, change_status.resource_name, change_status.campaign, change_status.ad_group FROM change_status WHERE change_status.last_change_date_time >= '${start}' ORDER BY change_status.last_change_date_time DESC LIMIT ${limit}`;\n return {\n action: \"use_different_resource\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: `change_event only reaches back 30 days. change_status reaches 90 (from ${start}) but reports only which resources changed and whether they were added, changed or removed — no old/new values and no user email. Read a changed resource by its resource_name to see its current values.`,\n };\n },\n },\n\n // 18b. Past 90 days no history resource reaches — infer the change from spend instead.\n {\n matchApiError: /changeStatusError\\W{0,4}START_DATE_TOO_OLD/i,\n fix: () => ({\n action: \"use_different_resource\",\n explanation: `Google's account history reaches back 90 days at most, and this query asks for more. Do not abort — infer the change from performance: ${monthlySpendTrendQuery()} shows which campaigns started or stopped spending and when, though not who changed them. Anything older with attribution exists only in the Google Ads web UI, which has no API.`,\n }),\n },\n\n // 18c. change_status rejects a date range it cannot bound. Google raises this both for\n // a half-open range and for no date filter at all, so supply whichever end is missing.\n {\n matchApiError: /CHANGE_DATE_RANGE_INFINITE/i,\n fix: (ctx) => {\n const today = new Date().toISOString().slice(0, 10);\n const oldestStart = new Date(Date.now() - 89 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10);\n const hasLowerBound = /last_change_date_time\\s*>=?/i.test(ctx.originalQuery);\n const hasUpperBound = /last_change_date_time\\s*<=?/i.test(ctx.originalQuery);\n const bounds = [\n ...(hasLowerBound ? [] : [`change_status.last_change_date_time >= '${oldestStart}'`]),\n ...(hasUpperBound ? [] : [`change_status.last_change_date_time <= '${today}'`]),\n ];\n const hasWhere = /\\bWHERE\\b/i.test(ctx.originalQuery);\n const clause = hasWhere ? ` AND ${bounds.join(\" AND \")}` : ` WHERE ${bounds.join(\" AND \")}`;\n const corrected = /\\s+(ORDER\\s+BY|LIMIT)\\b/i.test(ctx.originalQuery)\n ? ctx.originalQuery.replace(/(\\s+)(ORDER\\s+BY|LIMIT)\\b/i, `${clause}$1$2`)\n : ctx.originalQuery.trimEnd() + clause;\n return {\n action: \"add_required_field\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation:\n \"change_status needs a date range bounded at both ends — added the missing bound(s) on last_change_date_time.\",\n };\n },\n },\n\n // 19. Results include REMOVED entities\n {\n matchApiError: /REMOVED.*entities|status.*filter/i,\n fix: (ctx) => {\n const resourceMatch = ctx.originalQuery.match(/FROM\\s+(\\w+)/i);\n const resource = resourceMatch?.[1] ?? \"campaign\";\n const hasWhere = /WHERE/i.test(ctx.originalQuery);\n const suffix = hasWhere ? ` AND ${resource}.status != 'REMOVED'` : ` WHERE ${resource}.status != 'REMOVED'`;\n const limitMatch = ctx.originalQuery.match(/(\\s+LIMIT\\s+\\d+)/i);\n let corrected: string;\n if (limitMatch) {\n corrected = ctx.originalQuery.replace(/(\\s+LIMIT\\s+\\d+)/i, `${suffix}$1`);\n } else {\n corrected = ctx.originalQuery.trimEnd() + suffix;\n }\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: `Add status filter to exclude REMOVED ${resource}s`,\n };\n },\n },\n\n // 20. change_event without date constraint\n {\n matchApiError: /change_event.*date|date.*required.*change/i,\n fix: (ctx) => {\n const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10);\n const hasWhere = /WHERE/i.test(ctx.originalQuery);\n const suffix = hasWhere\n ? ` AND change_event.change_date_time >= '${sevenDaysAgo}'`\n : ` WHERE change_event.change_date_time >= '${sevenDaysAgo}'`;\n const corrected = ctx.originalQuery.trimEnd() + suffix;\n return {\n action: \"add_required_field\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"change_event queries require a date constraint on change_date_time\",\n };\n },\n },\n\n // 22. segments.click_type incompatibility\n {\n matchApiError: /click_type.*incompatible|cannot.*click_type/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/,?\\s*segments\\.click_type/g, \"\");\n return {\n action: \"split_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"segments.click_type is incompatible with other segments — remove it or query separately\",\n };\n },\n },\n\n // 22b. A field this API version does not have (removed, renamed, or misspelled). The rules above\n // rewrite the known renames; anything left is named back so the agent drops or replaces it —\n // without this, \"invalid argument … field\" fell through to the bare-resource rule below.\n {\n matchApiError: /UNRECOGNIZED_FIELD|Unrecognized field in the query/i,\n fix: (ctx) => {\n const field = ctx.apiErrorMessage?.match(/Unrecognized field in the query:\\s*\\\\?'([\\w.]+)/i)?.[1];\n return field\n ? unknownFieldFix(field, ctx)\n : {\n action: \"retry_with_modified_query\",\n explanation:\n \"A field in this query does not exist in this Google Ads API version. Drop it, or find its replacement in Google's field reference.\",\n };\n },\n },\n\n // 22c. A field that exists but cannot be SELECTed (only filtered on, or read through another resource).\n {\n matchApiError: /PROHIBITED_FIELD_IN_SELECT_CLAUSE|may not be used in SELECT clause/i,\n fix: (ctx) => {\n const field = ctx.apiErrorMessage?.match(/may not be used in SELECT clause:\\s*\\\\?'([\\w.]+)/i)?.[1];\n return {\n action: \"retry_with_modified_query\",\n explanation: `${field ?? \"A field in this query\"} cannot be selected — Google allows it only in WHERE, or not at all on this resource. Drop it from SELECT.`,\n };\n },\n },\n\n // 23. Bare resource in SELECT\n {\n matchApiError: /cannot.*select.*bare.*resource|invalid.*field/i,\n fix: () => ({\n action: \"retry_with_modified_query\",\n explanation: \"Cannot SELECT a bare resource name — use resource.id, resource.name, or resource.resource_name\",\n }),\n },\n\n // 24. Authentication error\n {\n matchApiError: /unauthenticated|authentication.*required|invalid.*credentials/i,\n fix: () => ({\n action: \"authenticate\",\n explanation: \"Google Ads authentication failed — reconnect Google Ads in dashboard settings\",\n }),\n },\n\n // 25. Timeout / deadline exceeded\n {\n matchApiError: /timeout|deadline.*exceeded|DEADLINE_EXCEEDED/i,\n fix: (ctx) => ({\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(ctx.originalQuery, ctx),\n explanation: \"Query timed out — narrow the date range, add more WHERE filters, or reduce LIMIT\",\n }),\n },\n];\n","import { connectionFixExplanation, isNotConnectedError } from \"../../../error-handler.ts\";\nimport type { AdsErrorEnvelope, CorrectionContext } from \"../types.ts\";\nimport { CORRECTION_RULES } from \"./correction-table.ts\";\n\nfunction mapErrorCode(message: string): string {\n if (/must be present in SELECT clause/i.test(message)) return \"MISSING_SELECT_FIELD\";\n if (/unexpected input (?:OR|\\()|invalid field name \\\\?'\\(/i.test(message)) return \"INVALID_SYNTAX\";\n if (/BAD_ENUM_CONSTANT|Invalid enum value/i.test(message)) return \"INVALID_ENUM_VALUE\";\n if (/field.*not.*found|unrecognized.*field|not.*valid.*field/i.test(message)) return \"FIELD_NOT_FOUND\";\n if (/not.*valid.*resource|cannot.*select.*from/i.test(message)) return \"WRONG_RESOURCE\";\n if (/operator|CONTAINS|LIKE/i.test(message)) return \"INVALID_OPERATOR\";\n if (/CUSTOMER_NOT_FOUND/i.test(message)) return \"CUSTOMER_NOT_FOUND\";\n if (/login.customer.id|not.*accessible/i.test(message)) return \"MISSING_MANAGER_ID\";\n if (/incompatible|mutually.*exclusive|PROHIBITED_SEGMENT_WITH_METRIC/i.test(message)) return \"INCOMPATIBLE_FIELDS\";\n if (/unauthenticated|authentication/i.test(message)) return \"AUTH_ERROR\";\n if (/permission/i.test(message)) return \"PERMISSION_DENIED\";\n if (/RESOURCE_EXHAUSTED|quota|rate.*limit/i.test(message)) return \"QUOTA_EXCEEDED\";\n if (/timeout|DEADLINE_EXCEEDED/i.test(message)) return \"TIMEOUT\";\n return \"API_ERROR\";\n}\n\nfunction isRetryable(code: string): boolean {\n return code === \"QUOTA_EXCEEDED\" || code === \"TIMEOUT\";\n}\n\nfunction getRetryDelay(code: string): number | undefined {\n if (code === \"QUOTA_EXCEEDED\") return 30000;\n if (code === \"TIMEOUT\") return 5000;\n return undefined;\n}\n\n/** What a `query` call can drop when the same read fails twice — the other commands have no such flags. */\nconst QUERY_NARROWING =\n \" If it fails again, ask for less in one call — a shorter date range, or a lower --limit instead of --all.\";\n\n/**\n * A failure on Google's or Baker's side (a 5xx), where nothing was refused: the same request can\n * succeed when asked again. `narrowing` is what this command can ask for less with, if anything.\n * Null for anything else.\n */\nexport function serverFailure(apiCode: string | undefined, message: string, narrowing = \"\"): AdsErrorEnvelope | null {\n if (apiCode !== \"INTERNAL_ERROR\" && apiCode !== \"UNAVAILABLE\") return null;\n return {\n ok: false,\n error: {\n code: apiCode,\n message,\n fix: {\n action: \"wait_and_retry\",\n explanation: `Google Ads or Baker failed on its own side; nothing in the request was refused. Retry it once as it is.${narrowing}`,\n },\n retryable: true,\n retryAfterMs: 5000,\n },\n };\n}\n\n/** Google throttled the account or spent the day's allowance: waiting is the fix, the request was fine. */\nfunction rateLimited(message: string): AdsErrorEnvelope {\n return {\n ok: false,\n error: {\n code: \"RATE_LIMITED\",\n message,\n fix: {\n action: \"wait_and_retry\",\n explanation:\n \"Google Ads is limiting how often Baker can ask for this account; nothing in the request was refused. Wait as the message says, then retry it as it is.\",\n },\n retryable: true,\n retryAfterMs: 60000,\n },\n };\n}\n\n/**\n * `apiCode` is the client's HTTP mapping (`ApiError.code`). Without it a missing\n * connection is indistinguishable from a GAQL error, and the agent gets told to\n * fix its query when the real answer is \"connect the account\".\n */\nexport function parseApiError(\n errorMessage: string,\n originalQuery: string,\n customerId: string,\n apiCode?: string,\n): AdsErrorEnvelope {\n const ctx: CorrectionContext = {\n originalQuery,\n customerId,\n apiErrorMessage: errorMessage,\n };\n\n // Checked ahead of the correction rules: no query rewrite can fix a missing connection.\n if (apiCode && isNotConnectedError(apiCode, errorMessage)) {\n return {\n ok: false,\n error: {\n code: \"NO_GOOGLE_ADS_CONNECTION\",\n message: errorMessage,\n fix: { action: \"request_connection\", explanation: connectionFixExplanation(\"google_ads\") },\n retryable: false,\n },\n };\n }\n\n // Ahead of the rules too: a server failure, a throttle or a page conflict says nothing about the query.\n const failure = serverFailure(apiCode, errorMessage, originalQuery ? QUERY_NARROWING : \"\");\n if (failure) return failure;\n if (apiCode === \"RATE_LIMITED\") return rateLimited(errorMessage);\n if (apiCode === \"CONFLICT\") {\n return {\n ok: false,\n error: {\n code: \"CONFLICT\",\n message: errorMessage,\n fix: {\n action: \"retry_with_modified_query\",\n explanation:\n \"The rows moved between two pages. Read again from the first page (no --cursor), with a unique field last in the ORDER BY (e.g. ORDER BY metrics.cost_micros DESC, campaign.id) so pages stay stable.\",\n },\n retryable: true,\n },\n };\n }\n\n for (const rule of CORRECTION_RULES) {\n if (rule.matchApiError.test(errorMessage)) {\n const fix = rule.fix(ctx);\n const code = mapErrorCode(errorMessage);\n return {\n ok: false,\n error: {\n code,\n message: errorMessage,\n fix,\n retryable: isRetryable(code),\n retryAfterMs: getRetryDelay(code),\n },\n };\n }\n }\n\n // No rule recognised it, so the fix claims no cause: the message is the only thing that knows.\n const mapped = mapErrorCode(errorMessage);\n const code = mapped === \"API_ERROR\" && apiCode ? apiCode : mapped;\n return {\n ok: false,\n error: {\n code,\n message: errorMessage,\n fix: {\n action: \"reject\",\n explanation:\n \"Baker has no specific fix for this error. The message says what was refused: change that, and do not retry the same request unchanged.\",\n },\n retryable: isRetryable(code),\n retryAfterMs: getRetryDelay(code),\n },\n };\n}\n"],"mappings":"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","names":["code"]}
@@ -1,91 +0,0 @@
1
- import {
2
- leadVersion,
3
- writeSeriesMemberCanvas
4
- } from "./chunk-XGN3BGSL.js";
5
- import {
6
- definitionFieldsOf,
7
- setDefinitionFields,
8
- setSpecMessage
9
- } from "./chunk-X3YYZLBH.js";
10
- import {
11
- IDEAS_DIR
12
- } from "./chunk-Q5DFEVLE.js";
13
-
14
- // src/commands/creatives/make-series.ts
15
- import { mkdir, readFile, writeFile } from "fs/promises";
16
- import path from "path";
17
- import { parseDocument } from "yaml";
18
- var LEAD_ONLY = ["idea", "message", "evidence", "angle", "persona", "awareness", "hypothesis", "series", "title"];
19
- function withoutFields(raw, keys) {
20
- const match = raw.match(/^---\r?\n([\s\S]*?\r?\n)?---/);
21
- if (!match) return raw;
22
- const doc = parseDocument(match[1] ?? "");
23
- if (doc.errors.length > 0) return raw;
24
- for (const key of keys) doc.delete(key);
25
- return `---
26
- ${doc.toString()}---${raw.slice(match[0].length)}`;
27
- }
28
- async function makeSeriesAd(root, idea, slug, lead, evidence, deps) {
29
- if (slug === lead) {
30
- return {
31
- code: "series_of_itself",
32
- message: `"${slug}" is the lead itself.`,
33
- fix: "Give the new ad its own --slug."
34
- };
35
- }
36
- const version = await leadVersion(root, lead);
37
- if ("refused" in version) return version.refused;
38
- const dir = path.join(root, "src", "creatives", slug);
39
- const definitionPath = path.join(dir, "_definition.md");
40
- await mkdir(dir, { recursive: true });
41
- await writeFile(path.join(dir, "prompt.json"), setSpecMessage(JSON.stringify(version.spec), idea.message), "utf8");
42
- const leadDefinition = await readFile(path.join(root, "src", "creatives", lead, "_definition.md"), "utf8").catch(
43
- () => "---\nkind: static\n---\n"
44
- );
45
- const definition = setDefinitionFields(withoutFields(leadDefinition, LEAD_ONLY), {
46
- title: idea.message.slice(0, 120),
47
- series: lead,
48
- status: "draft",
49
- ...definitionFieldsOf(idea, evidence)
50
- });
51
- await writeFile(definitionPath, definition, "utf8");
52
- const made = await writeSeriesMemberCanvas(root, slug, { leadWords: true });
53
- if (made === null || "refused" in made) {
54
- return made?.refused ?? { code: "series_not_made", message: `"${slug}" could not be made in the series of "${lead}".` };
55
- }
56
- if (idea.status === "idea") {
57
- const ideaPath = path.join(root, IDEAS_DIR, `${idea.id}.md`);
58
- const raw = await readFile(ideaPath, "utf8").catch(() => null);
59
- if (raw !== null) await writeFile(ideaPath, setDefinitionFields(raw, { status: "built" }), "utf8");
60
- }
61
- await deps.sync(dir);
62
- return { slug, lead, leadRunId: version.lead.runId, canvasPath: made.canvasPath };
63
- }
64
- function seriesMadeEnvelope(made, idea) {
65
- const lead = made.leadPlatforms ?? [];
66
- const elsewhere = (idea.platforms ?? []).some((p) => !lead.includes(p));
67
- return {
68
- ok: true,
69
- data: {
70
- creative: made.slug,
71
- idea: idea.id,
72
- message: idea.message,
73
- series: made.lead,
74
- canvas_path: made.canvasPath
75
- },
76
- hints: [
77
- `Write this ad's words in src/creatives/${made.slug}/prompt.json \`copy\`: one line for each of the lead's, in the same roles and about as long, saying this idea's message. Change nothing else: the picture, layout and colours are the lead's (${made.lead}), and every word you write replaces the lead's line in its place.`,
78
- `When every ad of the series has its words: baker canvas run --series ${made.lead} (renders them all at once, each reviewed and corrected on its own).`,
79
- ...elsewhere && lead.length > 0 ? [
80
- `A series ad runs where its lead runs (${lead.join(", ")}), in its sizes; the idea names ${idea.platforms?.join(", ")}. To run it there, make it on its own: baker creatives make ${idea.id} --platforms ${idea.platforms?.join(",")}.`
81
- ] : []
82
- ]
83
- };
84
- }
85
-
86
- export {
87
- withoutFields,
88
- makeSeriesAd,
89
- seriesMadeEnvelope
90
- };
91
- //# sourceMappingURL=chunk-OEH7ANJJ.js.map
@@ -1,111 +0,0 @@
1
- import {
2
- reportError,
3
- splitList
4
- } from "./chunk-RIVHJC6L.js";
5
- import {
6
- apiGet
7
- } from "./chunk-GFWWHCBF.js";
8
- import {
9
- registerSchema,
10
- writeJson
11
- } from "./chunk-CCYZJMZ7.js";
12
-
13
- // src/commands/winning-ads/launches.ts
14
- import { defineCommand } from "citty";
15
- registerSchema({
16
- command: "winning-ads.launches",
17
- description: 'What the brands you follow (or the ones named) launched in the last N days and which of those ads still run, each with its stage (new, testing, killed_early\u2026), and the tests each brand decided in that window (the version kept, what differed). The "what did competitors launch last week" report. Compact by default; --full lists every launch.',
18
- args: {
19
- since: { type: "number", description: "Days to look back, 1-90 (default 7)", required: false, default: 7 },
20
- advertiser: {
21
- type: "string",
22
- description: "Comma list of advertiser ids instead of every followed brand",
23
- required: false
24
- },
25
- platform: { type: "string", description: "Only this platform: meta|linkedin|tiktok|google", required: false },
26
- full: { type: "boolean", description: "List every launch", required: false, default: false }
27
- }
28
- });
29
- var COMPACT_LAUNCHES = 10;
30
- function compactLaunches(report, full) {
31
- return {
32
- since_days: report.since_days,
33
- advertisers: report.advertisers.map((b) => ({
34
- advertiser_id: b.advertiser_id,
35
- label: b.label,
36
- launched: b.launched,
37
- still_running: b.still_running,
38
- launches: (full ? b.launches : b.launches.slice(0, COMPACT_LAUNCHES)).map((l) => ({
39
- ad_id: l.ad_id,
40
- platform: l.platform,
41
- format: l.format,
42
- headline: l.headline,
43
- first_seen_at: l.first_seen_at,
44
- stage: l.stage,
45
- idea: l.idea ?? null,
46
- ...full ? { media_url: l.media_url } : {}
47
- })),
48
- tests_decided: (b.tests_decided ?? []).map((t) => ({
49
- concept: t.concept,
50
- versions: t.versions,
51
- kept_ad_id: t.winner_ad_id,
52
- decided_at: t.decided_at ?? null,
53
- what_differed: t.what_differed
54
- }))
55
- }))
56
- };
57
- }
58
- var IDEA_HINT = "Idea: whether each launch was a `new` idea (the first day of its concept), another version of one the brand was still `testing`, or a version built on a `winner` it had already kept. Many launches and no new idea means the brand is iterating on what works, not testing new directions: say so.";
59
- function launchesHints(report, named) {
60
- if (!named && report.following_count === 0) {
61
- return ["You follow no brands yet: `baker winning-ads follow <domain>` adds one, or pass --advertiser <id>."];
62
- }
63
- if (report.advertisers.length === 0) {
64
- return [`No launches in the last ${report.since_days} days. Widen the window with --since 30.`];
65
- }
66
- const withIdeas = report.advertisers.some((b) => b.launches.some((l) => l.idea));
67
- return [
68
- ...withIdeas ? [IDEA_HINT] : [],
69
- "Stages: new \u22647 days, testing \u226421 days, proven \u226460 days, evergreen beyond, killed_early = stopped within 2 weeks (a lost test). tests_decided is what each brand learned in the window: the version it kept (kept_ad_id) and what differed. `baker winning-ads search --survived-test` finds the versions brands kept across the library."
70
- ];
71
- }
72
- var launchesCommand = defineCommand({
73
- meta: {
74
- name: "launches",
75
- description: "What competitors launched lately and what still runs. Start here: baker winning-ads launches --since 7 (every followed brand), or --advertiser adv_1,adv_2"
76
- },
77
- args: {
78
- since: { type: "string", description: "Days to look back, 1-90 (default 7)", required: false },
79
- advertiser: { type: "string", description: "Comma list of advertiser ids", required: false },
80
- platform: { type: "string", description: "Only this platform: meta|linkedin|tiktok|google", required: false },
81
- full: { type: "boolean", description: "List every launch", required: false, default: false }
82
- },
83
- run: async ({ args }) => {
84
- try {
85
- const named = splitList(args.advertiser);
86
- const params = { since_days: String(args.since ?? 7) };
87
- if (named.length > 0) {
88
- params.advertiser = named.join(",");
89
- }
90
- if (args.platform) {
91
- params.platform = String(args.platform);
92
- }
93
- const report = await apiGet("/api/ad-library/launches", params);
94
- writeJson({
95
- ok: true,
96
- data: compactLaunches(report, Boolean(args.full)),
97
- hints: launchesHints(report, named.length > 0)
98
- });
99
- } catch (err) {
100
- reportError(err);
101
- }
102
- }
103
- });
104
-
105
- export {
106
- compactLaunches,
107
- IDEA_HINT,
108
- launchesHints,
109
- launchesCommand
110
- };
111
- //# sourceMappingURL=chunk-OVC2PIOP.js.map
@@ -1,152 +0,0 @@
1
- import {
2
- hintLines,
3
- splitHints
4
- } from "./chunk-D5FY4FAK.js";
5
- import {
6
- isNotConnectedError,
7
- writeJsonEnvelope
8
- } from "./chunk-QYH2UZAK.js";
9
- import {
10
- ApiError,
11
- apiPost
12
- } from "./chunk-GFWWHCBF.js";
13
- import {
14
- requireChatId,
15
- resolveChatId
16
- } from "./chunk-45D6WRCJ.js";
17
-
18
- // src/commands/tag-manager/shared.ts
19
- import { readFileSync } from "fs";
20
- function failValidation(message) {
21
- writeJsonEnvelope({ ok: false, error: { code: "VALIDATION_ERROR", message } });
22
- process.exit(1);
23
- }
24
- function requireTarget(args, entity) {
25
- const positional = Array.isArray(args._) ? args._[0] : void 0;
26
- const target = args.id ?? args.target ?? positional;
27
- if (typeof target !== "string" || target.length === 0) {
28
- failValidation(`pass the ${entity} id or path as the positional argument`);
29
- }
30
- return target;
31
- }
32
- function loadJsonArg(args, flag = "json") {
33
- const inline = args[flag];
34
- const file = args.file;
35
- const raw = typeof file === "string" && file.length > 0 ? readFileSync(file, "utf8") : typeof inline === "string" && inline.length > 0 ? inline : void 0;
36
- if (raw === void 0) {
37
- failValidation(`pass --${flag} with inline JSON or --file with a path to a JSON file`);
38
- }
39
- try {
40
- const parsed = JSON.parse(raw);
41
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
42
- failValidation(`--${flag} must be a JSON object`);
43
- }
44
- return parsed;
45
- } catch {
46
- return failValidation(`--${flag} is not valid JSON`);
47
- }
48
- }
49
- var RETRYABLE_CODES = /* @__PURE__ */ new Set(["RATE_LIMITED", "UNAVAILABLE", "INTERNAL_ERROR", "NETWORK_ERROR", "TIMEOUT"]);
50
- function handleError(err) {
51
- if (err instanceof ApiError) {
52
- writeJsonEnvelope({
53
- ok: false,
54
- error: {
55
- code: err.code,
56
- message: err.message,
57
- ...err.code === "UNAUTHORIZED" || err.code === "FORBIDDEN" && isNotConnectedError(err.code, err.message) ? {
58
- fix: {
59
- action: "request_connection",
60
- explanation: 'Tag Manager is not connected for this company yet, or no container has been picked. Don\'t send the user to Settings \u2014 call the `request_connection` tool with { platform: "google-tag-manager", reason } and they connect and pick their containers (they can pick more than one) from inside the chat. `request_tag_input` is not the route: that form manages the container snippet on the site, not what runs inside the container, and it cannot pick a container. If the `request_connection` call fails, say so plainly and give the exact route: dashboard \u2192 Brain \u2192 Integrations \u2192 Platforms \u2192 Google Tag Manager, where they also pick the container. Then carry on with the rest of the task.'
61
- }
62
- } : {},
63
- retryable: RETRYABLE_CODES.has(err.code)
64
- }
65
- });
66
- process.exit(1);
67
- }
68
- writeJsonEnvelope({ ok: false, error: { code: "NETWORK_ERROR", message: "Unexpected error", retryable: true } });
69
- process.exit(1);
70
- }
71
- var TAG_MANAGER_TIMEOUT_MS = 18e4;
72
- var STAGE_HINTS = [
73
- "Staged only \u2014 nothing has changed in Tag Manager yet. These apply when the chat completes, in dependency order, and close as a Tag Manager version that is then published, so they do go live on the user's site. Say the changes are ready and go live when they publish \u2014 not that they are live already."
74
- ];
75
- async function stageOp(op) {
76
- const chatId = requireChatId();
77
- try {
78
- const { data, hints } = splitHints(
79
- await apiPost(
80
- "/api/tag-manager/draft/stage",
81
- { chatId, op },
82
- { timeoutMs: TAG_MANAGER_TIMEOUT_MS }
83
- )
84
- );
85
- writeJsonEnvelope({ ok: true, data, hints: [...hints, ...STAGE_HINTS] });
86
- } catch (err) {
87
- handleError(err);
88
- }
89
- }
90
- async function draftAction(path, body, chat) {
91
- const chatId = resolveChatId(chat);
92
- try {
93
- const { data, hints } = splitHints(
94
- await apiPost(path, { chatId, ...body }, { timeoutMs: TAG_MANAGER_TIMEOUT_MS })
95
- );
96
- writeJsonEnvelope({ ok: true, data, ...hints.length > 0 ? { hints } : {} });
97
- return data;
98
- } catch (err) {
99
- handleError(err);
100
- }
101
- }
102
- function renderDraft(response) {
103
- if (response.count === 0) {
104
- return "No Tag Manager changes staged on this chat.";
105
- }
106
- const lines = [
107
- response.status === "discarded" ? `${response.count} Tag Manager change(s) discarded with their chat \u2014 none will apply` : `${response.count} staged Tag Manager change(s)`,
108
- ...response.ops.flatMap((op) => {
109
- const status = op.result ? ` [${op.result.status}]` : "";
110
- return [` ${op.ref} ${op.summary}${status}`, ...(op.warnings ?? []).map((warning) => ` \u26A0 ${warning}`)];
111
- })
112
- ];
113
- if (response.versionId) {
114
- lines.push(
115
- "",
116
- response.published ? `Applied and published as Tag Manager version ${response.versionId}. These changes are live on the site.` : `Applied into Tag Manager version ${response.versionId}. It is NOT published \u2014 publish it in Tag Manager to go live.`
117
- );
118
- }
119
- if (response.compilerError) {
120
- lines.push("", `Tag Manager reported a problem building the version: ${response.compilerError}`);
121
- }
122
- return lines.join("\n");
123
- }
124
- async function draftList(json, chat, full = false) {
125
- const chatId = resolveChatId(chat);
126
- try {
127
- const response = await apiPost("/api/tag-manager/draft", {
128
- chatId,
129
- ...full ? { full: true } : {}
130
- });
131
- const { data, hints } = splitHints(response);
132
- if (json || full) {
133
- writeJsonEnvelope({ ok: true, data, ...hints.length > 0 ? { hints } : {} });
134
- return;
135
- }
136
- process.stdout.write(`${renderDraft(data)}${hintLines(response)}
137
- `);
138
- } catch (err) {
139
- handleError(err);
140
- }
141
- }
142
-
143
- export {
144
- requireTarget,
145
- loadJsonArg,
146
- handleError,
147
- TAG_MANAGER_TIMEOUT_MS,
148
- stageOp,
149
- draftAction,
150
- draftList
151
- };
152
- //# sourceMappingURL=chunk-P5HG6WDH.js.map