@koda-sl/baker-cli 0.489.0 → 0.490.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 (311) hide show
  1. package/README.md +169 -7
  2. package/dist/{account-Z65CPOWE.js → account-3H6BZO5H.js} +2 -2
  3. package/dist/account-IKFDY52P.js +138 -0
  4. package/dist/account-IKFDY52P.js.map +1 -0
  5. package/dist/account-assets-LKZVWZAR.js +289 -0
  6. package/dist/account-assets-LKZVWZAR.js.map +1 -0
  7. package/dist/account-level-UJOZDVXY.js +608 -0
  8. package/dist/account-level-UJOZDVXY.js.map +1 -0
  9. package/dist/{account-writes-4N2MA2ZR.js → account-writes-AE5IJGGW.js} +2 -2
  10. package/dist/{accounts-UA2ZWRN4.js → accounts-K4INATCW.js} +2 -2
  11. package/dist/{activities-IQPJPP4B.js → activities-T253KK4Q.js} +4 -4
  12. package/dist/{ad-group-writes-EUTMPBMK.js → ad-group-writes-VRSBI2Z2.js} +2 -2
  13. package/dist/{ad-groups-OVPAI5RM.js → ad-groups-IEBVEAMS.js} +6 -6
  14. package/dist/{ad-writes-DACTYFEO.js → ad-writes-ALV4KFPZ.js} +2 -2
  15. package/dist/{ads-L65JIKCD.js → ads-CQZHD7FC.js} +7 -7
  16. package/dist/{ads-G6AS5L7G.js → ads-QIKZ6O2N.js} +5 -5
  17. package/dist/{ads-HXX2IAFF.js → ads-ZEY72UBN.js} +14 -13
  18. package/dist/ads-ZEY72UBN.js.map +1 -0
  19. package/dist/{adsets-LPN6WFGF.js → adsets-5H3MOT3D.js} +15 -14
  20. package/dist/{adsets-LPN6WFGF.js.map → adsets-5H3MOT3D.js.map} +1 -1
  21. package/dist/{analytics-QKP3A5F3.js → analytics-ALOZ7ZZ4.js} +1 -1
  22. package/dist/asset-writes-L5TMKIZC.js +47 -0
  23. package/dist/audience-writes-X52VG35Y.js +324 -0
  24. package/dist/audience-writes-X52VG35Y.js.map +1 -0
  25. package/dist/{audiences-RPLVMO4H.js → audiences-AAZH56WD.js} +2 -2
  26. package/dist/{audiences-XEZHACKH.js → audiences-X3RLGOVM.js} +12 -6
  27. package/dist/audiences-X3RLGOVM.js.map +1 -0
  28. package/dist/{avatars-MXTI74VC.js → avatars-YSFFRHDK.js} +1 -1
  29. package/dist/{brief-BN4UGUXF.js → brief-7S6XCJIA.js} +15 -15
  30. package/dist/{businesses-PRRYPR7H.js → businesses-H3HIDQX6.js} +2 -2
  31. package/dist/{campaign-writes-BAFB5E7A.js → campaign-writes-7ZF57KLH.js} +3 -3
  32. package/dist/campaign-writes-7ZF57KLH.js.map +1 -0
  33. package/dist/{campaign-writes-U5LTDTYK.js → campaign-writes-U5PUVSMT.js} +2 -2
  34. package/dist/{campaigns-4SOLY7OR.js → campaigns-AV6G3AUU.js} +32 -15
  35. package/dist/campaigns-AV6G3AUU.js.map +1 -0
  36. package/dist/{campaigns-TFEQTSO3.js → campaigns-JEIKY2M4.js} +6 -6
  37. package/dist/{campaigns-NR6TNQFN.js → campaigns-VTRMKSAT.js} +5 -5
  38. package/dist/{canvas-GJAQAVS6.js → canvas-SVJEQO4V.js} +13 -13
  39. package/dist/{catalog-USZL4SGX.js → catalog-S32MX453.js} +5 -5
  40. package/dist/{catalogs-A7XMEEEP.js → catalogs-OCVXZLIF.js} +2 -2
  41. package/dist/catalogs-RXJTZTVX.js +778 -0
  42. package/dist/catalogs-RXJTZTVX.js.map +1 -0
  43. package/dist/{chatgpt-4PEWDJKP.js → chatgpt-QVF2FD3E.js} +12 -12
  44. package/dist/{chats-INN2OHSH.js → chats-QG72JB6Y.js} +22 -8
  45. package/dist/chats-QG72JB6Y.js.map +1 -0
  46. package/dist/{check-MMJGFFZS.js → check-SLNHVYGS.js} +4 -4
  47. package/dist/{chunk-7RBJ2Z7Z.js → chunk-2C7AHPM4.js} +25 -6
  48. package/dist/chunk-2C7AHPM4.js.map +1 -0
  49. package/dist/{chunk-KPYDTIAI.js → chunk-2WZI36D3.js} +2 -2
  50. package/dist/{chunk-FUKDI2UK.js → chunk-3W6G6ARX.js} +2 -2
  51. package/dist/{chunk-JWSEPW7F.js → chunk-46GWHUKN.js} +2 -2
  52. package/dist/{chunk-3TZVZXM6.js → chunk-4KJMLYCD.js} +6 -6
  53. package/dist/{chunk-6JWEGFM5.js → chunk-5C35OW7L.js} +38 -7
  54. package/dist/chunk-5C35OW7L.js.map +1 -0
  55. package/dist/chunk-5GQCN2QZ.js +391 -0
  56. package/dist/chunk-5GQCN2QZ.js.map +1 -0
  57. package/dist/{chunk-KIGGMKAE.js → chunk-65Y3RCWP.js} +4 -2
  58. package/dist/chunk-65Y3RCWP.js.map +1 -0
  59. package/dist/{chunk-R3EKM2P2.js → chunk-6NCJGU6I.js} +5 -5
  60. package/dist/chunk-A4MVVPJ2.js +4204 -0
  61. package/dist/chunk-A4MVVPJ2.js.map +1 -0
  62. package/dist/{chunk-LPXSM2DI.js → chunk-AO45BX6Q.js} +3 -3
  63. package/dist/{chunk-3UXMQ3K2.js → chunk-AQM4JH62.js} +2 -2
  64. package/dist/chunk-AQM4JH62.js.map +1 -0
  65. package/dist/{chunk-NPMAATZG.js → chunk-C7NWUCLQ.js} +2 -2
  66. package/dist/chunk-CP4P6YKM.js +287 -0
  67. package/dist/chunk-CP4P6YKM.js.map +1 -0
  68. package/dist/{chunk-OWA7ZLC4.js → chunk-D4CKCNGW.js} +4 -4
  69. package/dist/{chunk-H5HDZ7IC.js → chunk-DCBZ5CHZ.js} +4 -4
  70. package/dist/{chunk-C6EYCD5J.js → chunk-FVHJCERJ.js} +5 -5
  71. package/dist/{chunk-BITS62MF.js → chunk-G6XKD7QE.js} +2 -2
  72. package/dist/{chunk-QE3JEJXF.js → chunk-GSZZLW5Q.js} +4 -4
  73. package/dist/chunk-HLVRHBKL.js +1078 -0
  74. package/dist/chunk-HLVRHBKL.js.map +1 -0
  75. package/dist/{chunk-TPANP5A2.js → chunk-JKJQWRLO.js} +2 -2
  76. package/dist/{chunk-62JQQUAU.js → chunk-JQH5VG6F.js} +2 -2
  77. package/dist/{chunk-6WXV5GTA.js → chunk-JVH5A3XC.js} +2 -2
  78. package/dist/{chunk-AVNSH2JE.js → chunk-KOXDXSKN.js} +7 -7
  79. package/dist/{chunk-2XRMPSEV.js → chunk-LXQB4ZGE.js} +2 -2
  80. package/dist/{chunk-ZL23HA4N.js → chunk-M6PN3VH6.js} +2 -2
  81. package/dist/{chunk-TZEVD4Q6.js → chunk-P5FRWPG7.js} +2 -2
  82. package/dist/{chunk-CSZFZKVX.js → chunk-PQJXIY64.js} +5 -5
  83. package/dist/{chunk-OP7DNHD2.js → chunk-QTOZ32SU.js} +27 -1
  84. package/dist/chunk-QTOZ32SU.js.map +1 -0
  85. package/dist/chunk-SVAB6KV5.js +219 -0
  86. package/dist/chunk-SVAB6KV5.js.map +1 -0
  87. package/dist/{chunk-LBO2YAZY.js → chunk-UNX6BS4U.js} +15 -15
  88. package/dist/{chunk-UWXDNVS5.js → chunk-ZJSGGJ5R.js} +2 -2
  89. package/dist/cli.js +20 -20
  90. package/dist/{connect-WBGCBBFJ.js → connect-S54TJ6OV.js} +3 -3
  91. package/dist/{conversion-writes-JU7Q2MUO.js → conversion-writes-ECZBVY7D.js} +2 -2
  92. package/dist/{conversions-3ISBR3TS.js → conversions-5QCSCRLI.js} +3 -3
  93. package/dist/copy-writes-D2RTHAL6.js +167 -0
  94. package/dist/copy-writes-D2RTHAL6.js.map +1 -0
  95. package/dist/{creatives-VQO2TKE3.js → creatives-5I3G5YP3.js} +2 -2
  96. package/dist/{creatives-YJ3CXZQC.js → creatives-MZ6ICNSY.js} +5 -4
  97. package/dist/{creatives-YJ3CXZQC.js.map → creatives-MZ6ICNSY.js.map} +1 -1
  98. package/dist/{creatives-S5QUWUL6.js → creatives-PCAGWPW3.js} +10 -10
  99. package/dist/{critique-5LCG5TYF.js → critique-NRHUPIWF.js} +7 -7
  100. package/dist/{custom-conversions-YRYE65PU.js → custom-conversions-FIP6ZS34.js} +5 -3
  101. package/dist/{custom-conversions-YRYE65PU.js.map → custom-conversions-FIP6ZS34.js.map} +1 -1
  102. package/dist/{draft-Y2QJE2NM.js → draft-34CGWUVA.js} +2 -2
  103. package/dist/{draft-GPN3HOAG.js → draft-4P3YO67N.js} +9 -5
  104. package/dist/draft-4P3YO67N.js.map +1 -0
  105. package/dist/{draft-EWDOIXSH.js → draft-L45PGCYZ.js} +7 -3
  106. package/dist/draft-L45PGCYZ.js.map +1 -0
  107. package/dist/engine/index.js +4 -4
  108. package/dist/{experiment-G3FQVAJU.js → experiment-7N4QFRWV.js} +4 -4
  109. package/dist/{feedback-CAOZPGTT.js → feedback-O3H42V4I.js} +10 -10
  110. package/dist/{feedback-record-EXV5H6OS.js → feedback-record-FAPN2GBS.js} +12 -12
  111. package/dist/{find-EVY4XEIQ.js → find-FSQAEGGF.js} +4 -4
  112. package/dist/{flows-Z7355RMD.js → flows-T22B77J3.js} +3 -3
  113. package/dist/{funnel-2B3JXJPX.js → funnel-7OA33VRP.js} +5 -5
  114. package/dist/{ga4-2BL5YAYN.js → ga4-LPDIBNYP.js} +1 -1
  115. package/dist/{google-7STODZQR.js → google-5ESVO76E.js} +5 -5
  116. package/dist/{gsc-UU3T2C6B.js → gsc-FIZTQX3N.js} +1 -1
  117. package/dist/{history-IQ33J5PB.js → history-QKDYBSYM.js} +2 -2
  118. package/dist/{icon-GB7UH5RF.js → icon-CSVAZ7NE.js} +4 -4
  119. package/dist/{ideas-F6CIGTVU.js → ideas-JQT422P7.js} +4 -4
  120. package/dist/{images-WCKTD6Z2.js → images-WBNWK2ZH.js} +6 -6
  121. package/dist/{insights-4HT2NAYP.js → insights-YWVJMATY.js} +4 -3
  122. package/dist/{insights-4HT2NAYP.js.map → insights-YWVJMATY.js.map} +1 -1
  123. package/dist/{inspiration-XQYHBJY2.js → inspiration-IX5N724J.js} +1 -1
  124. package/dist/instant-experiences-NQ2GWIWL.js +257 -0
  125. package/dist/instant-experiences-NQ2GWIWL.js.map +1 -0
  126. package/dist/{landing-WUILAWDS.js → landing-Y6QCTXCZ.js} +2 -2
  127. package/dist/leads-THI37ZMD.js +537 -0
  128. package/dist/leads-THI37ZMD.js.map +1 -0
  129. package/dist/{learn-CC6Q5IK2.js → learn-3BDZUWDT.js} +5 -5
  130. package/dist/{linkedin-XKVPSCLV.js → linkedin-UGMAFSGO.js} +2 -2
  131. package/dist/{locations-YA7NZY44.js → locations-HM56X2MK.js} +2 -2
  132. package/dist/locations-HM56X2MK.js.map +1 -0
  133. package/dist/{logo-YSNUUT33.js → logo-VHXH4J6A.js} +3 -3
  134. package/dist/{make-ED7HBLH3.js → make-W2PYZXYF.js} +39 -39
  135. package/dist/media-H6B7VDON.js +18 -0
  136. package/dist/media-H6B7VDON.js.map +1 -0
  137. package/dist/{media-sources-PEHUMH7C.js → media-sources-EZKAJNVD.js} +1 -1
  138. package/dist/meta-YHDTGJQ6.js +122 -0
  139. package/dist/meta-YHDTGJQ6.js.map +1 -0
  140. package/dist/{options-6FCNFWUF.js → options-NSCZSQ5P.js} +3 -3
  141. package/dist/page-photos-CXRG4AXV.js +115 -0
  142. package/dist/page-photos-CXRG4AXV.js.map +1 -0
  143. package/dist/{pages-FTI44OSH.js → pages-PTWRXAZT.js} +2 -2
  144. package/dist/{pixels-6IUB3Y3H.js → pixels-MYT3TCHZ.js} +2 -2
  145. package/dist/{pixels-MBKR4XPX.js → pixels-ZZCQUS3J.js} +2 -2
  146. package/dist/{preview-V4YBD45S.js → preview-XOXAAPMQ.js} +73 -27
  147. package/dist/preview-XOXAAPMQ.js.map +1 -0
  148. package/dist/{rerun-A2XHGFZS.js → rerun-5THJLQQJ.js} +18 -18
  149. package/dist/{research-BLDY5UWH.js → research-JHDWWFL7.js} +1 -1
  150. package/dist/rule-writes-6ZCAJDYZ.js +522 -0
  151. package/dist/rule-writes-6ZCAJDYZ.js.map +1 -0
  152. package/dist/rules-BMYOY2BM.js +216 -0
  153. package/dist/rules-BMYOY2BM.js.map +1 -0
  154. package/dist/{rules-SK5DFFPY.js → rules-YLLFDZEM.js} +3 -3
  155. package/dist/{rules-add-YQNYSME7.js → rules-add-U2GU4AGP.js} +4 -4
  156. package/dist/{run-KBN5K7LE.js → run-V5YQB6TH.js} +18 -18
  157. package/dist/{scaffold-ad-6BN5LWQH.js → scaffold-ad-H4GJOKAW.js} +12 -12
  158. package/dist/{scaffold-static-ad-VVZRAWBR.js → scaffold-static-ad-2YIFHCTL.js} +25 -25
  159. package/dist/{scaffold-video-LFIYI4GP.js → scaffold-video-3EJLKR2O.js} +14 -14
  160. package/dist/{select-QBU6ED4K.js → select-I22NPSIW.js} +9 -9
  161. package/dist/{set-prompt-TL64CRBQ.js → set-prompt-S75OMQ7L.js} +8 -8
  162. package/dist/{shared-NDRFKAH7.js → shared-3IBNDEFL.js} +2 -2
  163. package/dist/{sources-RMNFV4CA.js → sources-VA23PDND.js} +1 -1
  164. package/dist/{stale-ITFCPOER.js → stale-MHTU2NQJ.js} +8 -8
  165. package/dist/{stats-RCLQE4HJ.js → stats-ZAGJH4AD.js} +1 -1
  166. package/dist/{stock-ECRBD7RP.js → stock-6SHHLSKG.js} +5 -5
  167. package/dist/studies-4NIV4D5Y.js +249 -0
  168. package/dist/studies-4NIV4D5Y.js.map +1 -0
  169. package/dist/{studio-MARZ22J2.js → studio-ZLCGXFAN.js} +1 -1
  170. package/dist/study-writes-L2AA2PGL.js +467 -0
  171. package/dist/study-writes-L2AA2PGL.js.map +1 -0
  172. package/dist/{sync-definition-C6ROLKJ4.js → sync-definition-2EBSQA6A.js} +11 -11
  173. package/dist/{tag-manager-G3LBQZUL.js → tag-manager-3CJ66GKJ.js} +1 -1
  174. package/dist/targeting-LNDQV4EK.js +759 -0
  175. package/dist/targeting-LNDQV4EK.js.map +1 -0
  176. package/dist/{testimonials-YMMA5YWL.js → testimonials-GR6TIS5S.js} +2 -2
  177. package/dist/{translate-OXVIMYHE.js → translate-GEFUP6KQ.js} +18 -18
  178. package/dist/{validate-ZS2M5Q3V.js → validate-NOWIOAHE.js} +11 -11
  179. package/dist/{videos-I6YXFBFT.js → videos-XMTDEHEJ.js} +1 -1
  180. package/dist/{viewer-check-7ZG7KHEN.js → viewer-check-U4XZMMS7.js} +6 -6
  181. package/dist/viewer-check-U4XZMMS7.js.map +1 -0
  182. package/dist/{winning-ads-ABN5OULS.js → winning-ads-QOAYIR5U.js} +1 -1
  183. package/dist/{write-commands-HCQI4Y27.js → write-commands-PEJBTME6.js} +485 -57
  184. package/dist/write-commands-PEJBTME6.js.map +1 -0
  185. package/dist/{x-WK2VQDPF.js → x-VCSMV7T5.js} +4 -4
  186. package/package.json +1 -1
  187. package/dist/account-7LUQWY6Q.js +0 -49
  188. package/dist/account-7LUQWY6Q.js.map +0 -1
  189. package/dist/ads-HXX2IAFF.js.map +0 -1
  190. package/dist/audiences-XEZHACKH.js.map +0 -1
  191. package/dist/campaign-writes-BAFB5E7A.js.map +0 -1
  192. package/dist/campaigns-4SOLY7OR.js.map +0 -1
  193. package/dist/chats-INN2OHSH.js.map +0 -1
  194. package/dist/chunk-3UXMQ3K2.js.map +0 -1
  195. package/dist/chunk-6JWEGFM5.js.map +0 -1
  196. package/dist/chunk-7RBJ2Z7Z.js.map +0 -1
  197. package/dist/chunk-GOJXKIFQ.js +0 -1605
  198. package/dist/chunk-GOJXKIFQ.js.map +0 -1
  199. package/dist/chunk-KIGGMKAE.js.map +0 -1
  200. package/dist/chunk-OP7DNHD2.js.map +0 -1
  201. package/dist/draft-EWDOIXSH.js.map +0 -1
  202. package/dist/draft-GPN3HOAG.js.map +0 -1
  203. package/dist/leads-2XOSAYP4.js +0 -293
  204. package/dist/leads-2XOSAYP4.js.map +0 -1
  205. package/dist/locations-YA7NZY44.js.map +0 -1
  206. package/dist/media-ES2UBGYW.js +0 -15
  207. package/dist/media-ES2UBGYW.js.map +0 -1
  208. package/dist/meta-AOIPEDV5.js +0 -69
  209. package/dist/meta-AOIPEDV5.js.map +0 -1
  210. package/dist/preview-V4YBD45S.js.map +0 -1
  211. package/dist/write-commands-HCQI4Y27.js.map +0 -1
  212. /package/dist/{account-Z65CPOWE.js.map → account-3H6BZO5H.js.map} +0 -0
  213. /package/dist/{account-writes-4N2MA2ZR.js.map → account-writes-AE5IJGGW.js.map} +0 -0
  214. /package/dist/{accounts-UA2ZWRN4.js.map → accounts-K4INATCW.js.map} +0 -0
  215. /package/dist/{activities-IQPJPP4B.js.map → activities-T253KK4Q.js.map} +0 -0
  216. /package/dist/{ad-group-writes-EUTMPBMK.js.map → ad-group-writes-VRSBI2Z2.js.map} +0 -0
  217. /package/dist/{ad-groups-OVPAI5RM.js.map → ad-groups-IEBVEAMS.js.map} +0 -0
  218. /package/dist/{ad-writes-DACTYFEO.js.map → ad-writes-ALV4KFPZ.js.map} +0 -0
  219. /package/dist/{ads-L65JIKCD.js.map → ads-CQZHD7FC.js.map} +0 -0
  220. /package/dist/{ads-G6AS5L7G.js.map → ads-QIKZ6O2N.js.map} +0 -0
  221. /package/dist/{analytics-QKP3A5F3.js.map → analytics-ALOZ7ZZ4.js.map} +0 -0
  222. /package/dist/{connect-WBGCBBFJ.js.map → asset-writes-L5TMKIZC.js.map} +0 -0
  223. /package/dist/{audiences-RPLVMO4H.js.map → audiences-AAZH56WD.js.map} +0 -0
  224. /package/dist/{avatars-MXTI74VC.js.map → avatars-YSFFRHDK.js.map} +0 -0
  225. /package/dist/{brief-BN4UGUXF.js.map → brief-7S6XCJIA.js.map} +0 -0
  226. /package/dist/{businesses-PRRYPR7H.js.map → businesses-H3HIDQX6.js.map} +0 -0
  227. /package/dist/{campaign-writes-U5LTDTYK.js.map → campaign-writes-U5PUVSMT.js.map} +0 -0
  228. /package/dist/{campaigns-TFEQTSO3.js.map → campaigns-JEIKY2M4.js.map} +0 -0
  229. /package/dist/{campaigns-NR6TNQFN.js.map → campaigns-VTRMKSAT.js.map} +0 -0
  230. /package/dist/{canvas-GJAQAVS6.js.map → canvas-SVJEQO4V.js.map} +0 -0
  231. /package/dist/{catalog-USZL4SGX.js.map → catalog-S32MX453.js.map} +0 -0
  232. /package/dist/{catalogs-A7XMEEEP.js.map → catalogs-OCVXZLIF.js.map} +0 -0
  233. /package/dist/{chatgpt-4PEWDJKP.js.map → chatgpt-QVF2FD3E.js.map} +0 -0
  234. /package/dist/{check-MMJGFFZS.js.map → check-SLNHVYGS.js.map} +0 -0
  235. /package/dist/{chunk-KPYDTIAI.js.map → chunk-2WZI36D3.js.map} +0 -0
  236. /package/dist/{chunk-FUKDI2UK.js.map → chunk-3W6G6ARX.js.map} +0 -0
  237. /package/dist/{chunk-JWSEPW7F.js.map → chunk-46GWHUKN.js.map} +0 -0
  238. /package/dist/{chunk-3TZVZXM6.js.map → chunk-4KJMLYCD.js.map} +0 -0
  239. /package/dist/{chunk-R3EKM2P2.js.map → chunk-6NCJGU6I.js.map} +0 -0
  240. /package/dist/{chunk-LPXSM2DI.js.map → chunk-AO45BX6Q.js.map} +0 -0
  241. /package/dist/{chunk-NPMAATZG.js.map → chunk-C7NWUCLQ.js.map} +0 -0
  242. /package/dist/{chunk-OWA7ZLC4.js.map → chunk-D4CKCNGW.js.map} +0 -0
  243. /package/dist/{chunk-H5HDZ7IC.js.map → chunk-DCBZ5CHZ.js.map} +0 -0
  244. /package/dist/{chunk-C6EYCD5J.js.map → chunk-FVHJCERJ.js.map} +0 -0
  245. /package/dist/{chunk-BITS62MF.js.map → chunk-G6XKD7QE.js.map} +0 -0
  246. /package/dist/{chunk-QE3JEJXF.js.map → chunk-GSZZLW5Q.js.map} +0 -0
  247. /package/dist/{chunk-TPANP5A2.js.map → chunk-JKJQWRLO.js.map} +0 -0
  248. /package/dist/{chunk-62JQQUAU.js.map → chunk-JQH5VG6F.js.map} +0 -0
  249. /package/dist/{chunk-6WXV5GTA.js.map → chunk-JVH5A3XC.js.map} +0 -0
  250. /package/dist/{chunk-AVNSH2JE.js.map → chunk-KOXDXSKN.js.map} +0 -0
  251. /package/dist/{chunk-2XRMPSEV.js.map → chunk-LXQB4ZGE.js.map} +0 -0
  252. /package/dist/{chunk-ZL23HA4N.js.map → chunk-M6PN3VH6.js.map} +0 -0
  253. /package/dist/{chunk-TZEVD4Q6.js.map → chunk-P5FRWPG7.js.map} +0 -0
  254. /package/dist/{chunk-CSZFZKVX.js.map → chunk-PQJXIY64.js.map} +0 -0
  255. /package/dist/{chunk-LBO2YAZY.js.map → chunk-UNX6BS4U.js.map} +0 -0
  256. /package/dist/{chunk-UWXDNVS5.js.map → chunk-ZJSGGJ5R.js.map} +0 -0
  257. /package/dist/{ideas-F6CIGTVU.js.map → connect-S54TJ6OV.js.map} +0 -0
  258. /package/dist/{conversion-writes-JU7Q2MUO.js.map → conversion-writes-ECZBVY7D.js.map} +0 -0
  259. /package/dist/{conversions-3ISBR3TS.js.map → conversions-5QCSCRLI.js.map} +0 -0
  260. /package/dist/{creatives-VQO2TKE3.js.map → creatives-5I3G5YP3.js.map} +0 -0
  261. /package/dist/{creatives-S5QUWUL6.js.map → creatives-PCAGWPW3.js.map} +0 -0
  262. /package/dist/{critique-5LCG5TYF.js.map → critique-NRHUPIWF.js.map} +0 -0
  263. /package/dist/{draft-Y2QJE2NM.js.map → draft-34CGWUVA.js.map} +0 -0
  264. /package/dist/{experiment-G3FQVAJU.js.map → experiment-7N4QFRWV.js.map} +0 -0
  265. /package/dist/{feedback-CAOZPGTT.js.map → feedback-O3H42V4I.js.map} +0 -0
  266. /package/dist/{feedback-record-EXV5H6OS.js.map → feedback-record-FAPN2GBS.js.map} +0 -0
  267. /package/dist/{find-EVY4XEIQ.js.map → find-FSQAEGGF.js.map} +0 -0
  268. /package/dist/{flows-Z7355RMD.js.map → flows-T22B77J3.js.map} +0 -0
  269. /package/dist/{funnel-2B3JXJPX.js.map → funnel-7OA33VRP.js.map} +0 -0
  270. /package/dist/{ga4-2BL5YAYN.js.map → ga4-LPDIBNYP.js.map} +0 -0
  271. /package/dist/{google-7STODZQR.js.map → google-5ESVO76E.js.map} +0 -0
  272. /package/dist/{gsc-UU3T2C6B.js.map → gsc-FIZTQX3N.js.map} +0 -0
  273. /package/dist/{history-IQ33J5PB.js.map → history-QKDYBSYM.js.map} +0 -0
  274. /package/dist/{icon-GB7UH5RF.js.map → icon-CSVAZ7NE.js.map} +0 -0
  275. /package/dist/{logo-YSNUUT33.js.map → ideas-JQT422P7.js.map} +0 -0
  276. /package/dist/{images-WCKTD6Z2.js.map → images-WBNWK2ZH.js.map} +0 -0
  277. /package/dist/{inspiration-XQYHBJY2.js.map → inspiration-IX5N724J.js.map} +0 -0
  278. /package/dist/{landing-WUILAWDS.js.map → landing-Y6QCTXCZ.js.map} +0 -0
  279. /package/dist/{learn-CC6Q5IK2.js.map → learn-3BDZUWDT.js.map} +0 -0
  280. /package/dist/{linkedin-XKVPSCLV.js.map → linkedin-UGMAFSGO.js.map} +0 -0
  281. /package/dist/{run-KBN5K7LE.js.map → logo-VHXH4J6A.js.map} +0 -0
  282. /package/dist/{make-ED7HBLH3.js.map → make-W2PYZXYF.js.map} +0 -0
  283. /package/dist/{media-sources-PEHUMH7C.js.map → media-sources-EZKAJNVD.js.map} +0 -0
  284. /package/dist/{options-6FCNFWUF.js.map → options-NSCZSQ5P.js.map} +0 -0
  285. /package/dist/{pages-FTI44OSH.js.map → pages-PTWRXAZT.js.map} +0 -0
  286. /package/dist/{pixels-6IUB3Y3H.js.map → pixels-MYT3TCHZ.js.map} +0 -0
  287. /package/dist/{pixels-MBKR4XPX.js.map → pixels-ZZCQUS3J.js.map} +0 -0
  288. /package/dist/{rerun-A2XHGFZS.js.map → rerun-5THJLQQJ.js.map} +0 -0
  289. /package/dist/{research-BLDY5UWH.js.map → research-JHDWWFL7.js.map} +0 -0
  290. /package/dist/{rules-SK5DFFPY.js.map → rules-YLLFDZEM.js.map} +0 -0
  291. /package/dist/{rules-add-YQNYSME7.js.map → rules-add-U2GU4AGP.js.map} +0 -0
  292. /package/dist/{shared-NDRFKAH7.js.map → run-V5YQB6TH.js.map} +0 -0
  293. /package/dist/{scaffold-ad-6BN5LWQH.js.map → scaffold-ad-H4GJOKAW.js.map} +0 -0
  294. /package/dist/{scaffold-static-ad-VVZRAWBR.js.map → scaffold-static-ad-2YIFHCTL.js.map} +0 -0
  295. /package/dist/{scaffold-video-LFIYI4GP.js.map → scaffold-video-3EJLKR2O.js.map} +0 -0
  296. /package/dist/{select-QBU6ED4K.js.map → select-I22NPSIW.js.map} +0 -0
  297. /package/dist/{set-prompt-TL64CRBQ.js.map → set-prompt-S75OMQ7L.js.map} +0 -0
  298. /package/dist/{sync-definition-C6ROLKJ4.js.map → shared-3IBNDEFL.js.map} +0 -0
  299. /package/dist/{sources-RMNFV4CA.js.map → sources-VA23PDND.js.map} +0 -0
  300. /package/dist/{stale-ITFCPOER.js.map → stale-MHTU2NQJ.js.map} +0 -0
  301. /package/dist/{stats-RCLQE4HJ.js.map → stats-ZAGJH4AD.js.map} +0 -0
  302. /package/dist/{stock-ECRBD7RP.js.map → stock-6SHHLSKG.js.map} +0 -0
  303. /package/dist/{studio-MARZ22J2.js.map → studio-ZLCGXFAN.js.map} +0 -0
  304. /package/dist/{viewer-check-7ZG7KHEN.js.map → sync-definition-2EBSQA6A.js.map} +0 -0
  305. /package/dist/{tag-manager-G3LBQZUL.js.map → tag-manager-3CJ66GKJ.js.map} +0 -0
  306. /package/dist/{testimonials-YMMA5YWL.js.map → testimonials-GR6TIS5S.js.map} +0 -0
  307. /package/dist/{translate-OXVIMYHE.js.map → translate-GEFUP6KQ.js.map} +0 -0
  308. /package/dist/{validate-ZS2M5Q3V.js.map → validate-NOWIOAHE.js.map} +0 -0
  309. /package/dist/{videos-I6YXFBFT.js.map → videos-XMTDEHEJ.js.map} +0 -0
  310. /package/dist/{winning-ads-ABN5OULS.js.map → winning-ads-QOAYIR5U.js.map} +0 -0
  311. /package/dist/{x-WK2VQDPF.js.map → x-VCSMV7T5.js.map} +0 -0
@@ -0,0 +1,324 @@
1
+ import {
2
+ DATE_ORDERS,
3
+ customerListBatches,
4
+ customerListFromFile,
5
+ customerListUploadRefusal
6
+ } from "./chunk-5GQCN2QZ.js";
7
+ import {
8
+ bareAccountId,
9
+ failWriteValidation,
10
+ repeatedListFlag,
11
+ requireTarget,
12
+ stageOp
13
+ } from "./chunk-5C35OW7L.js";
14
+ import {
15
+ CUSTOMER_LIST_BATCH_ROWS,
16
+ CUSTOMER_LIST_MAX_BATCHES,
17
+ brandSafetyTargetingFields
18
+ } from "./chunk-A4MVVPJ2.js";
19
+ import "./chunk-HLVRHBKL.js";
20
+ import {
21
+ csvOrJson,
22
+ handleMetaError,
23
+ resolveAccountIdArg
24
+ } from "./chunk-QTOZ32SU.js";
25
+ import "./chunk-ERSX3MKH.js";
26
+ import "./chunk-SFJW2KED.js";
27
+ import "./chunk-4NZ47VXO.js";
28
+ import "./chunk-D5FY4FAK.js";
29
+ import "./chunk-FNA277HP.js";
30
+ import {
31
+ writeAdsOutput,
32
+ writeJsonEnvelope
33
+ } from "./chunk-SWL4AAPP.js";
34
+ import "./chunk-5WMTPYKT.js";
35
+ import "./chunk-23H4ZJRP.js";
36
+ import "./chunk-DWX44QL6.js";
37
+ import "./chunk-2FSEESJU.js";
38
+ import "./chunk-CVBKW75S.js";
39
+ import "./chunk-BLAHHMPF.js";
40
+ import "./chunk-XQIOCIDO.js";
41
+ import {
42
+ apiGet,
43
+ apiPost
44
+ } from "./chunk-XDZVBX6L.js";
45
+ import "./chunk-N5O67GK5.js";
46
+ import {
47
+ requireChatId
48
+ } from "./chunk-EE72SSB2.js";
49
+ import {
50
+ registerSchema
51
+ } from "./chunk-WNSE7N75.js";
52
+ import "./chunk-YQSBHWOI.js";
53
+
54
+ // src/commands/ads/meta/audience-writes.ts
55
+ import { readFileSync } from "fs";
56
+ import { defineCommand } from "citty";
57
+ var STAGED_NOTE = "Staged until publish \u2014 review with `baker ads meta draft`.";
58
+ var membersArgs = {
59
+ id: {
60
+ type: "positional",
61
+ description: "Customer-list audience id, or a meta_temp_* ref created in this chat",
62
+ required: true
63
+ },
64
+ "account-id": { type: "string", description: "Meta ad account ID (act_123)" },
65
+ file: {
66
+ type: "string",
67
+ description: "CSV (or ;/tab separated) in the workspace with a header row: email, phone, first name, last name, city, state, zip, country, birthday, gender, madid, external id"
68
+ },
69
+ country: {
70
+ type: "string",
71
+ description: "Two-letter country for phones written without their country code (when the row has no country column)"
72
+ },
73
+ "value-column": {
74
+ type: "string",
75
+ description: "Value-based list only: the column with each person's value (e.g. revenue)"
76
+ },
77
+ columns: {
78
+ type: "string",
79
+ description: "For a file without a header row: what each column is, in order (email,phone,country \u2014 comma-separated or repeated)"
80
+ },
81
+ "date-format": {
82
+ type: "string",
83
+ description: "How birthdays like 03/07/1990 are written: DMY (day first) or MDY (month first, US). Needed only when no date in the file shows it"
84
+ }
85
+ };
86
+ function schemaArgs(args) {
87
+ return Object.fromEntries(
88
+ Object.entries(args).map(([key, arg]) => [
89
+ key,
90
+ { type: arg.type, description: arg.description, required: arg.required === true }
91
+ ])
92
+ );
93
+ }
94
+ var ACTION_NOTES = {
95
+ add: "Adds the people in the file to the list; those already in it stay.",
96
+ remove: "Removes the people in the file from the list.",
97
+ replace: "Replaces the whole list with the file \u2014 everyone not in it leaves. Runs alone: not beside another change to the same list in this chat."
98
+ };
99
+ function dateFormatFlag(value) {
100
+ if (value === void 0) return void 0;
101
+ const upperValue = String(value).toUpperCase();
102
+ if (!DATE_ORDERS.includes(upperValue)) {
103
+ failWriteValidation(`--date-format takes ${DATE_ORDERS.join(" or ")}, not ${String(value)}`);
104
+ }
105
+ return upperValue;
106
+ }
107
+ function readList(args, rawArgs) {
108
+ const path = typeof args.file === "string" ? args.file : "";
109
+ if (!path) {
110
+ failWriteValidation("pass --file with the customer list (CSV in the workspace)");
111
+ }
112
+ let content;
113
+ try {
114
+ content = readFileSync(path, "utf8");
115
+ } catch (err) {
116
+ failWriteValidation(`could not read ${path}: ${err instanceof Error ? err.message : String(err)}`);
117
+ }
118
+ try {
119
+ return customerListFromFile(content, {
120
+ defaultCountry: typeof args.country === "string" ? args.country : void 0,
121
+ valueColumn: typeof args["value-column"] === "string" ? args["value-column"] : void 0,
122
+ columns: repeatedListFlag(rawArgs, "columns", args.columns),
123
+ dateFormat: dateFormatFlag(args["date-format"])
124
+ });
125
+ } catch (err) {
126
+ failWriteValidation(err instanceof Error ? err.message : String(err));
127
+ }
128
+ }
129
+ function listHints(list) {
130
+ const hints = [`${list.rows.length.toLocaleString("en-US")} people read from the file, hashed before upload`];
131
+ const unreadable = Object.entries(list.unreadable).map(([key, count]) => `${count} ${key}`);
132
+ if (unreadable.length > 0) {
133
+ hints.push(`values that could not be read and were left out: ${unreadable.join(", ")}`);
134
+ }
135
+ if (list.skippedRows > 0) {
136
+ hints.push(
137
+ `${list.skippedRows} rows had nothing Meta can match on (no readable email, phone or id${list.schema.includes("LOOKALIKE_VALUE") ? ", or no readable value" : ""}) and were left out`
138
+ );
139
+ }
140
+ if (list.ignoredColumns.length > 0) {
141
+ hints.push(`columns not sent (Meta does not match on them): ${list.ignoredColumns.join(", ")}`);
142
+ }
143
+ if (list.rows.length < 100) {
144
+ hints.push("Meta needs about 100 matched people before a list can be used for ads or as a lookalike seed");
145
+ }
146
+ return hints;
147
+ }
148
+ async function stageMembers(action, args, rawArgs) {
149
+ const accountId = bareAccountId(args);
150
+ const audienceId = requireTarget(args, "audience");
151
+ const list = readList(args, rawArgs);
152
+ if (list.rows.length === 0) {
153
+ failWriteValidation("no one in this file can be matched \u2014 check the columns (email, phone, \u2026) and their values");
154
+ }
155
+ const batches = customerListBatches(list.rows);
156
+ if (batches.length > CUSTOMER_LIST_MAX_BATCHES) {
157
+ failWriteValidation(
158
+ `this file holds ${list.rows.length.toLocaleString("en-US")} people; one change carries at most ${(CUSTOMER_LIST_BATCH_ROWS * CUSTOMER_LIST_MAX_BATCHES).toLocaleString("en-US")} \u2014 split the file and stage one add per part`
159
+ );
160
+ }
161
+ const refusal = customerListUploadRefusal(audienceId, action, list);
162
+ if (refusal) {
163
+ failWriteValidation(refusal);
164
+ }
165
+ const stored = [];
166
+ try {
167
+ const chatId = requireChatId();
168
+ for (const rows of batches) {
169
+ const response = await apiPost(
170
+ "/api/ads/meta/draft/customer-list-batch",
171
+ { chatId, accountId, batch: { schema: list.schema, rows } },
172
+ { timeoutMs: 12e4 }
173
+ );
174
+ stored.push(response.data);
175
+ }
176
+ } catch (err) {
177
+ handleMetaError(err);
178
+ }
179
+ await stageOp(
180
+ {
181
+ kind: "customAudience.members",
182
+ accountId,
183
+ payload: { audience_id: audienceId, action, schema: list.schema, batches: stored }
184
+ },
185
+ listHints(list)
186
+ );
187
+ }
188
+ function membersCommand(action) {
189
+ registerSchema({
190
+ command: `ads.meta.audiences.members.${action}`,
191
+ description: `Stage ${action === "add" ? "adding people to" : action === "remove" ? "removing people from" : "replacing everyone in"} a Meta customer list from a CSV in the workspace. ${ACTION_NOTES[action]} Every value is normalized and SHA-256 hashed on this machine before upload, as Meta asks; only counts are printed. Applied at publish; Meta takes up to 24h to match.`,
192
+ args: schemaArgs(membersArgs)
193
+ });
194
+ return defineCommand({
195
+ meta: {
196
+ name: action,
197
+ description: `${ACTION_NOTES[action]} ${STAGED_NOTE}
198
+ Example: baker ads meta audiences members ${action} 120249492603650208 --file customers.csv --country ES`
199
+ },
200
+ args: membersArgs,
201
+ run: async ({ args, rawArgs }) => {
202
+ await stageMembers(action, args, rawArgs);
203
+ }
204
+ });
205
+ }
206
+ var audiencesMembersCommand = defineCommand({
207
+ meta: {
208
+ name: "members",
209
+ description: `Change who is in a customer-list audience, from a CSV in the workspace. Hashed here before upload. ${STAGED_NOTE}
210
+ baker ads meta audiences members add <audienceId|meta_temp_\u2026> --file customers.csv [--country ES]
211
+ baker ads meta audiences members remove <audienceId> --file unsubscribed.csv
212
+ baker ads meta audiences members replace <audienceId> --file customers.csv
213
+ value-based list: add --value-column revenue`
214
+ },
215
+ subCommands: {
216
+ add: membersCommand("add"),
217
+ remove: membersCommand("remove"),
218
+ replace: membersCommand("replace")
219
+ }
220
+ });
221
+ registerSchema({
222
+ command: "ads.meta.audiences.delete",
223
+ description: "Stage deleting a Meta custom audience \u2014 permanent, applied at publish. Every ad that targets it stops and cannot be restarted; Meta refuses while a lookalike is built from it (delete the lookalike first).",
224
+ args: {
225
+ id: { type: "positional", description: "Audience id", required: true },
226
+ "account-id": { type: "string", description: "Meta ad account ID (act_123)", required: false }
227
+ }
228
+ });
229
+ var audiencesDeleteCommand = defineCommand({
230
+ meta: {
231
+ name: "delete",
232
+ description: `Stage deleting an audience \u2014 permanent: ads that target it stop for good. Only when the user asked to delete it. ${STAGED_NOTE}`
233
+ },
234
+ args: {
235
+ id: { type: "positional", description: "Audience id", required: true },
236
+ "account-id": { type: "string", description: "Meta ad account ID (act_123)" }
237
+ },
238
+ run: async ({ args }) => {
239
+ await stageOp({
240
+ kind: "customAudience.update",
241
+ accountId: bareAccountId(args),
242
+ target: requireTarget(args, "audience"),
243
+ payload: { status: "DELETED" }
244
+ });
245
+ }
246
+ });
247
+ registerSchema({
248
+ command: "ads.meta.audiences.saved",
249
+ description: "List the ad account's saved audiences (targeting saved in Ads Manager), or one with --saved-audience-id. Read-only \u2014 Meta's API cannot create or change one. Use one on a new ad set with `adsets create --saved-audience <id>`.",
250
+ args: {
251
+ "account-id": { type: "string", description: "Meta ad account ID (act_123)", required: false },
252
+ "saved-audience-id": {
253
+ type: "string",
254
+ description: "One saved audience, with its full targeting",
255
+ required: false
256
+ },
257
+ full: { type: "boolean", description: "Include each audience's whole targeting spec", required: false },
258
+ output: { type: "string", description: "json|csv|jsonl|md", required: false, default: "json" }
259
+ }
260
+ });
261
+ var savedAudiencesCommand = defineCommand({
262
+ meta: {
263
+ name: "saved",
264
+ description: "Saved audiences on the account (read-only). Example: baker ads meta audiences saved --account-id act_123; use one with `adsets create --saved-audience <id>`"
265
+ },
266
+ args: {
267
+ "account-id": { type: "string", description: "Meta ad account ID (act_123)" },
268
+ "saved-audience-id": { type: "string", description: "One saved audience, with its full targeting" },
269
+ full: { type: "boolean", description: "Include each audience's whole targeting spec" },
270
+ output: { type: "string", description: "json|csv|jsonl|md", default: "json" }
271
+ },
272
+ run: async ({ args }) => {
273
+ const accountId = resolveAccountIdArg(args);
274
+ try {
275
+ const params = { "account-id": accountId };
276
+ if (args["saved-audience-id"]) params["saved-audience-id"] = String(args["saved-audience-id"]);
277
+ const rows = await apiGet("/api/ads/meta/saved-audiences", params);
278
+ const shown = args.full || args["saved-audience-id"] ? rows : rows.map(({ targeting: _targeting, ...row }) => row);
279
+ const hints = rows.length === 0 ? [
280
+ "This account has no saved audiences \u2014 Meta's API cannot create one; build the targeting on the ad set instead."
281
+ ] : [
282
+ "Use one on a new ad set: `baker ads meta adsets create \u2026 --saved-audience <id>` (its targeting is copied)."
283
+ ];
284
+ const fmt = csvOrJson(args);
285
+ if (fmt !== "json") {
286
+ writeAdsOutput(shown, fmt, void 0, hints);
287
+ return;
288
+ }
289
+ writeJsonEnvelope({ ok: true, data: shown, hints });
290
+ } catch (err) {
291
+ handleMetaError(err);
292
+ }
293
+ }
294
+ });
295
+ function targetingFromSavedAudience(saved, flagged) {
296
+ if (flagged === void 0) return { targeting: saved };
297
+ if (!Object.keys(flagged).every((key) => key in brandSafetyTargetingFields)) {
298
+ return { refusal: "--saved-audience brings the targeting \u2014 pass it or --targeting-file, not both" };
299
+ }
300
+ return { targeting: { ...saved, ...flagged } };
301
+ }
302
+ async function savedAudienceTargeting(accountId, savedAudienceId) {
303
+ try {
304
+ const rows = await apiGet("/api/ads/meta/saved-audiences", {
305
+ "account-id": accountId,
306
+ "saved-audience-id": savedAudienceId
307
+ });
308
+ const targeting = rows[0]?.targeting;
309
+ if (!targeting) {
310
+ failWriteValidation(`saved audience ${savedAudienceId} has no targeting to copy`);
311
+ }
312
+ return targeting;
313
+ } catch (err) {
314
+ handleMetaError(err);
315
+ }
316
+ }
317
+ export {
318
+ audiencesDeleteCommand,
319
+ audiencesMembersCommand,
320
+ savedAudienceTargeting,
321
+ savedAudiencesCommand,
322
+ targetingFromSavedAudience
323
+ };
324
+ //# sourceMappingURL=audience-writes-X52VG35Y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/ads/meta/audience-writes.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { brandSafetyTargetingFields } from \"@baker/api/ads-meta/brandSafety\";\nimport {\n CUSTOMER_LIST_BATCH_ROWS,\n CUSTOMER_LIST_MAX_BATCHES,\n type CustomerListAction,\n type CustomerListBatchResponse,\n} from \"@baker/api/ads-meta/customerList\";\nimport { defineCommand } from \"citty\";\nimport { apiGet, apiPost } from \"../../../client.ts\";\nimport { requireChatId } from \"../../../env.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { writeAdsOutput, writeJsonEnvelope } from \"../output.ts\";\nimport {\n customerListBatches,\n customerListFromFile,\n customerListUploadRefusal,\n DATE_ORDERS,\n type DateOrder,\n type HashedCustomerList,\n} from \"./customer-list.ts\";\nimport { csvOrJson, handleMetaError, resolveAccountIdArg } from \"./shared.ts\";\nimport { bareAccountId, failWriteValidation, repeatedListFlag, requireTarget, stageOp } from \"./write-shared.ts\";\n\n/**\n * Staged writes on who is in a customer list, deleting an audience, and the\n * saved audiences an ad set can copy. The people are read from a file in the\n * workspace and hashed here; only their digests are held by Baker until the\n * chat publishes, and only counts are ever printed.\n */\n\nconst STAGED_NOTE = \"Staged until publish — review with `baker ads meta draft`.\";\n\nconst membersArgs = {\n id: {\n type: \"positional\",\n description: \"Customer-list audience id, or a meta_temp_* ref created in this chat\",\n required: true,\n },\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_123)\" },\n file: {\n type: \"string\",\n description:\n \"CSV (or ;/tab separated) in the workspace with a header row: email, phone, first name, last name, city, state, zip, country, birthday, gender, madid, external id\",\n },\n country: {\n type: \"string\",\n description:\n \"Two-letter country for phones written without their country code (when the row has no country column)\",\n },\n \"value-column\": {\n type: \"string\",\n description: \"Value-based list only: the column with each person's value (e.g. revenue)\",\n },\n columns: {\n type: \"string\",\n description:\n \"For a file without a header row: what each column is, in order (email,phone,country — comma-separated or repeated)\",\n },\n \"date-format\": {\n type: \"string\",\n description:\n \"How birthdays like 03/07/1990 are written: DMY (day first) or MDY (month first, US). Needed only when no date in the file shows it\",\n },\n} as const;\n\nfunction schemaArgs<T extends Record<string, { type: string; description: string; required?: boolean }>>(args: T) {\n return Object.fromEntries(\n Object.entries(args).map(([key, arg]) => [\n key,\n { type: arg.type, description: arg.description, required: arg.required === true },\n ]),\n );\n}\n\nconst ACTION_NOTES: Record<CustomerListAction, string> = {\n add: \"Adds the people in the file to the list; those already in it stay.\",\n remove: \"Removes the people in the file from the list.\",\n replace:\n \"Replaces the whole list with the file — everyone not in it leaves. Runs alone: not beside another change to the same list in this chat.\",\n};\n\nfunction dateFormatFlag(value: unknown): DateOrder | undefined {\n if (value === undefined) return undefined;\n const upperValue = String(value).toUpperCase();\n if (!(DATE_ORDERS as readonly string[]).includes(upperValue)) {\n failWriteValidation(`--date-format takes ${DATE_ORDERS.join(\" or \")}, not ${String(value)}`);\n }\n return upperValue as DateOrder;\n}\n\nfunction readList(args: Record<string, unknown>, rawArgs: readonly string[] | undefined): HashedCustomerList {\n const path = typeof args.file === \"string\" ? args.file : \"\";\n if (!path) {\n failWriteValidation(\"pass --file with the customer list (CSV in the workspace)\");\n }\n let content: string;\n try {\n content = readFileSync(path, \"utf8\");\n } catch (err) {\n failWriteValidation(`could not read ${path}: ${err instanceof Error ? err.message : String(err)}`);\n }\n try {\n return customerListFromFile(content, {\n defaultCountry: typeof args.country === \"string\" ? args.country : undefined,\n valueColumn: typeof args[\"value-column\"] === \"string\" ? args[\"value-column\"] : undefined,\n columns: repeatedListFlag(rawArgs, \"columns\", args.columns),\n dateFormat: dateFormatFlag(args[\"date-format\"]),\n });\n } catch (err) {\n failWriteValidation(err instanceof Error ? err.message : String(err));\n }\n}\n\n/** What the agent learns about the file: counts only. */\nfunction listHints(list: HashedCustomerList): string[] {\n const hints = [`${list.rows.length.toLocaleString(\"en-US\")} people read from the file, hashed before upload`];\n const unreadable = Object.entries(list.unreadable).map(([key, count]) => `${count} ${key}`);\n if (unreadable.length > 0) {\n hints.push(`values that could not be read and were left out: ${unreadable.join(\", \")}`);\n }\n if (list.skippedRows > 0) {\n hints.push(\n `${list.skippedRows} rows had nothing Meta can match on (no readable email, phone or id${list.schema.includes(\"LOOKALIKE_VALUE\") ? \", or no readable value\" : \"\"}) and were left out`,\n );\n }\n if (list.ignoredColumns.length > 0) {\n hints.push(`columns not sent (Meta does not match on them): ${list.ignoredColumns.join(\", \")}`);\n }\n if (list.rows.length < 100) {\n hints.push(\"Meta needs about 100 matched people before a list can be used for ads or as a lookalike seed\");\n }\n return hints;\n}\n\nasync function stageMembers(\n action: CustomerListAction,\n args: Record<string, unknown>,\n rawArgs: readonly string[] | undefined,\n): Promise<void> {\n const accountId = bareAccountId(args);\n const audienceId = requireTarget(args, \"audience\");\n const list = readList(args, rawArgs);\n if (list.rows.length === 0) {\n failWriteValidation(\"no one in this file can be matched — check the columns (email, phone, …) and their values\");\n }\n const batches = customerListBatches(list.rows);\n if (batches.length > CUSTOMER_LIST_MAX_BATCHES) {\n failWriteValidation(\n `this file holds ${list.rows.length.toLocaleString(\"en-US\")} people; one change carries at most ${(CUSTOMER_LIST_BATCH_ROWS * CUSTOMER_LIST_MAX_BATCHES).toLocaleString(\"en-US\")} — split the file and stage one add per part`,\n );\n }\n const refusal = customerListUploadRefusal(audienceId, action, list);\n if (refusal) {\n failWriteValidation(refusal);\n }\n const stored: CustomerListBatchResponse[] = [];\n try {\n const chatId = requireChatId();\n for (const rows of batches) {\n const response = await apiPost<{ ok: true; data: CustomerListBatchResponse }>(\n \"/api/ads/meta/draft/customer-list-batch\",\n { chatId, accountId, batch: { schema: list.schema, rows } },\n { timeoutMs: 120_000 },\n );\n stored.push(response.data);\n }\n } catch (err) {\n handleMetaError(err);\n }\n await stageOp(\n {\n kind: \"customAudience.members\",\n accountId,\n payload: { audience_id: audienceId, action, schema: list.schema, batches: stored },\n },\n listHints(list),\n );\n}\n\nfunction membersCommand(action: CustomerListAction) {\n registerSchema({\n command: `ads.meta.audiences.members.${action}`,\n description: `Stage ${action === \"add\" ? \"adding people to\" : action === \"remove\" ? \"removing people from\" : \"replacing everyone in\"} a Meta customer list from a CSV in the workspace. ${ACTION_NOTES[action]} Every value is normalized and SHA-256 hashed on this machine before upload, as Meta asks; only counts are printed. Applied at publish; Meta takes up to 24h to match.`,\n args: schemaArgs(membersArgs),\n });\n return defineCommand({\n meta: {\n name: action,\n description: `${ACTION_NOTES[action]} ${STAGED_NOTE}\nExample: baker ads meta audiences members ${action} 120249492603650208 --file customers.csv --country ES`,\n },\n args: membersArgs,\n run: async ({ args, rawArgs }) => {\n await stageMembers(action, args as Record<string, unknown>, rawArgs);\n },\n });\n}\n\nexport const audiencesMembersCommand = defineCommand({\n meta: {\n name: \"members\",\n description: `Change who is in a customer-list audience, from a CSV in the workspace. Hashed here before upload. ${STAGED_NOTE}\n baker ads meta audiences members add <audienceId|meta_temp_…> --file customers.csv [--country ES]\n baker ads meta audiences members remove <audienceId> --file unsubscribed.csv\n baker ads meta audiences members replace <audienceId> --file customers.csv\n value-based list: add --value-column revenue`,\n },\n subCommands: {\n add: membersCommand(\"add\"),\n remove: membersCommand(\"remove\"),\n replace: membersCommand(\"replace\"),\n },\n});\n\n// --- Delete ---\n\nregisterSchema({\n command: \"ads.meta.audiences.delete\",\n description:\n \"Stage deleting a Meta custom audience — permanent, applied at publish. Every ad that targets it stops and cannot be restarted; Meta refuses while a lookalike is built from it (delete the lookalike first).\",\n args: {\n id: { type: \"positional\", description: \"Audience id\", required: true },\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_123)\", required: false },\n },\n});\n\nexport const audiencesDeleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description: `Stage deleting an audience — permanent: ads that target it stop for good. Only when the user asked to delete it. ${STAGED_NOTE}`,\n },\n args: {\n id: { type: \"positional\", description: \"Audience id\", required: true },\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_123)\" },\n },\n run: async ({ args }) => {\n await stageOp({\n kind: \"customAudience.update\",\n accountId: bareAccountId(args as Record<string, unknown>),\n target: requireTarget(args as Record<string, unknown>, \"audience\"),\n payload: { status: \"DELETED\" },\n });\n },\n});\n\n// --- Saved audiences ---\n\nregisterSchema({\n command: \"ads.meta.audiences.saved\",\n description:\n \"List the ad account's saved audiences (targeting saved in Ads Manager), or one with --saved-audience-id. Read-only — Meta's API cannot create or change one. Use one on a new ad set with `adsets create --saved-audience <id>`.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_123)\", required: false },\n \"saved-audience-id\": {\n type: \"string\",\n description: \"One saved audience, with its full targeting\",\n required: false,\n },\n full: { type: \"boolean\", description: \"Include each audience's whole targeting spec\", required: false },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nexport const savedAudiencesCommand = defineCommand({\n meta: {\n name: \"saved\",\n description:\n \"Saved audiences on the account (read-only). Example: baker ads meta audiences saved --account-id act_123; use one with `adsets create --saved-audience <id>`\",\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_123)\" },\n \"saved-audience-id\": { type: \"string\", description: \"One saved audience, with its full targeting\" },\n full: { type: \"boolean\", description: \"Include each audience's whole targeting spec\" },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"saved-audience-id\"]) params[\"saved-audience-id\"] = String(args[\"saved-audience-id\"]);\n const rows = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/saved-audiences\", params);\n const shown =\n args.full || args[\"saved-audience-id\"] ? rows : rows.map(({ targeting: _targeting, ...row }) => row);\n const hints =\n rows.length === 0\n ? [\n \"This account has no saved audiences — Meta's API cannot create one; build the targeting on the ad set instead.\",\n ]\n : [\n \"Use one on a new ad set: `baker ads meta adsets create … --saved-audience <id>` (its targeting is copied).\",\n ];\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(shown, fmt, undefined, hints);\n return;\n }\n writeJsonEnvelope({ ok: true, data: shown, hints });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\n/**\n * A saved audience's targeting with the command's own targeting laid over it:\n * the brand-safety flags (`--block-list`, …) join it, while a targeting file\n * would replace it whole, so the two are refused together.\n */\nexport function targetingFromSavedAudience(\n saved: Record<string, unknown>,\n flagged: Record<string, unknown> | undefined,\n): { targeting: Record<string, unknown> } | { refusal: string } {\n if (flagged === undefined) return { targeting: saved };\n if (!Object.keys(flagged).every((key) => key in brandSafetyTargetingFields)) {\n return { refusal: \"--saved-audience brings the targeting — pass it or --targeting-file, not both\" };\n }\n return { targeting: { ...saved, ...flagged } };\n}\n\n/** A saved audience's targeting, to start an ad set from. */\nexport async function savedAudienceTargeting(\n accountId: string,\n savedAudienceId: string,\n): Promise<Record<string, unknown>> {\n try {\n const rows = await apiGet<Array<{ targeting?: Record<string, unknown> }>>(\"/api/ads/meta/saved-audiences\", {\n \"account-id\": accountId,\n \"saved-audience-id\": savedAudienceId,\n });\n const targeting = rows[0]?.targeting;\n if (!targeting) {\n failWriteValidation(`saved audience ${savedAudienceId} has no targeting to copy`);\n }\n return targeting;\n } catch (err) {\n handleMetaError(err);\n }\n}\n"],"mappings":"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","names":[]}
@@ -6,7 +6,7 @@ import {
6
6
  schemaArgs,
7
7
  stageChatgptOp,
8
8
  stageChatgptOps
9
- } from "./chunk-3UXMQ3K2.js";
9
+ } from "./chunk-AQM4JH62.js";
10
10
  import {
11
11
  CHATGPT_ADS_REFERENCE,
12
12
  CHATGPT_AUDIENCE_USES,
@@ -265,4 +265,4 @@ export {
265
265
  audiencesCommand,
266
266
  membersFromArgs
267
267
  };
268
- //# sourceMappingURL=audiences-RPLVMO4H.js.map
268
+ //# sourceMappingURL=audiences-AAZH56WD.js.map
@@ -2,7 +2,7 @@ import {
2
2
  csvOrJson,
3
3
  handleMetaError,
4
4
  resolveAccountIdArg
5
- } from "./chunk-OP7DNHD2.js";
5
+ } from "./chunk-QTOZ32SU.js";
6
6
  import {
7
7
  writeAdsJson,
8
8
  writeAdsOutput
@@ -53,17 +53,23 @@ var listCommand = defineCommand({
53
53
  var audiencesCommand = defineCommand({
54
54
  meta: {
55
55
  name: "audiences",
56
- description: `List custom audiences, or stage writes (create/update). Write subcommands stage ops on this chat's draft.
56
+ description: `List custom audiences, or stage writes (create/update/delete, members add|remove|replace). Write subcommands stage ops on this chat's draft.
57
57
  Includes lookalikes, website-pixel audiences, customer-file audiences. Meta hides exact size when count < 1000.
58
58
 
59
59
  Examples:
60
60
  baker ads meta audiences --account-id act_123
61
- baker ads meta audiences create --name "Site 30d" --subtype WEBSITE --file rule.json`
61
+ baker ads meta audiences create --name "Site 30d" --subtype WEBSITE --file rule.json
62
+ baker ads meta audiences create --name "Customers" --subtype CUSTOM --customer-file-source USER_PROVIDED_ONLY
63
+ baker ads meta audiences members add meta_temp_ab12 --file customers.csv --country ES
64
+ baker ads meta audiences saved --account-id act_123 \u2014 saved audiences (read-only)`
62
65
  },
63
66
  subCommands: {
64
67
  list: listCommand,
65
- create: () => import("./write-commands-HCQI4Y27.js").then((m) => m.audiencesCreateCommand),
66
- update: () => import("./write-commands-HCQI4Y27.js").then((m) => m.audiencesUpdateCommand)
68
+ create: () => import("./write-commands-PEJBTME6.js").then((m) => m.audiencesCreateCommand),
69
+ update: () => import("./write-commands-PEJBTME6.js").then((m) => m.audiencesUpdateCommand),
70
+ delete: () => import("./audience-writes-X52VG35Y.js").then((m) => m.audiencesDeleteCommand),
71
+ members: () => import("./audience-writes-X52VG35Y.js").then((m) => m.audiencesMembersCommand),
72
+ saved: () => import("./audience-writes-X52VG35Y.js").then((m) => m.savedAudiencesCommand)
67
73
  },
68
74
  // `args` stays even though the parent has no `run`: citty scans rawArgs for the
69
75
  // subcommand name using THIS command's arg defs, so without them `--account-id act_1`
@@ -75,4 +81,4 @@ Examples:
75
81
  export {
76
82
  audiencesCommand
77
83
  };
78
- //# sourceMappingURL=audiences-XEZHACKH.js.map
84
+ //# sourceMappingURL=audiences-X3RLGOVM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/ads/meta/audiences.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleMetaError, resolveAccountIdArg } from \"./shared.ts\";\n\nconst listArgs = {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID\" },\n limit: { type: \"string\", description: \"Max rows\" },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"Output format\", default: \"json\" },\n} as const;\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List custom audiences. Runs by default when no subcommand is given. Example: baker ads meta audiences --account-id act_123\",\n },\n args: listArgs,\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args.limit) params.limit = args.limit as string;\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/audiences\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nexport const audiencesCommand = defineCommand({\n meta: {\n name: \"audiences\",\n description: `List custom audiences, or stage writes (create/update/delete, members add|remove|replace). Write subcommands stage ops on this chat's draft.\nIncludes lookalikes, website-pixel audiences, customer-file audiences. Meta hides exact size when count < 1000.\n\nExamples:\n baker ads meta audiences --account-id act_123\n baker ads meta audiences create --name \"Site 30d\" --subtype WEBSITE --file rule.json\n baker ads meta audiences create --name \"Customers\" --subtype CUSTOM --customer-file-source USER_PROVIDED_ONLY\n baker ads meta audiences members add meta_temp_ab12 --file customers.csv --country ES\n baker ads meta audiences saved --account-id act_123 — saved audiences (read-only)`,\n },\n subCommands: {\n list: listCommand,\n create: () => import(\"./write-commands.ts\").then((m) => m.audiencesCreateCommand),\n update: () => import(\"./write-commands.ts\").then((m) => m.audiencesUpdateCommand),\n delete: () => import(\"./audience-writes.ts\").then((m) => m.audiencesDeleteCommand),\n members: () => import(\"./audience-writes.ts\").then((m) => m.audiencesMembersCommand),\n saved: () => import(\"./audience-writes.ts\").then((m) => m.savedAudiencesCommand),\n },\n // `args` stays even though the parent has no `run`: citty scans rawArgs for the\n // subcommand name using THIS command's arg defs, so without them `--account-id act_1`\n // would read `act_1` as a subcommand. `default` (not `run`) dispatches the bare\n // invocation — citty falls through to `run` after a subcommand, double-executing it.\n args: listArgs,\n default: \"list\",\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAM9B,IAAM,WAAW;AAAA,EACf,cAAc,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,EAClE,OAAO,EAAE,MAAM,UAAU,aAAa,WAAW;AAAA,EACjD,YAAY;AAAA,EACZ,QAAQ,EAAE,MAAM,UAAU,aAAa,iBAAiB,SAAS,OAAO;AAC1E;AAEA,IAAM,cAAc,cAAc;AAAA,EAChC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,EACN,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,MAAO,QAAO,QAAQ,KAAK;AACpC,UAAI,KAAK,UAAU,EAAG,QAAO,YAAY,IAAI;AAC7C,YAAM,OAAO,MAAM,OAAuC,2BAA2B,MAAM;AAC3F,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAM,GAAG;AACxB;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;AAEM,IAAM,mBAAmB,cAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASf;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,QAAQ,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,sBAAsB;AAAA,IAChF,QAAQ,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,sBAAsB;AAAA,IAChF,QAAQ,MAAM,OAAO,+BAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,sBAAsB;AAAA,IACjF,SAAS,MAAM,OAAO,+BAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,uBAAuB;AAAA,IACnF,OAAO,MAAM,OAAO,+BAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,qBAAqB;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM;AAAA,EACN,SAAS;AACX,CAAC;","names":[]}
@@ -35,4 +35,4 @@ Full guide: __tooling__/docs/tools/baker/avatars.md`
35
35
  export {
36
36
  avatarsCommand
37
37
  };
38
- //# sourceMappingURL=avatars-MXTI74VC.js.map
38
+ //# sourceMappingURL=avatars-YSFFRHDK.js.map
@@ -5,26 +5,23 @@ import {
5
5
  waiverCounts
6
6
  } from "./chunk-QVQKCVP7.js";
7
7
  import {
8
- buildNext,
9
- ideasReport
10
- } from "./chunk-TZEVD4Q6.js";
8
+ liveViewerLookups
9
+ } from "./chunk-GSZZLW5Q.js";
10
+ import "./chunk-LXQB4ZGE.js";
11
+ import "./chunk-PTGYM4J6.js";
12
+ import "./chunk-LCW3U4EA.js";
11
13
  import {
12
14
  buildSearchBody
13
15
  } from "./chunk-MXWOYFI2.js";
14
16
  import "./chunk-D7KR6KXR.js";
15
17
  import "./chunk-I5VZVQBZ.js";
16
18
  import {
17
- withDefinitions
18
- } from "./chunk-NXZCCGES.js";
19
+ buildNext,
20
+ ideasReport
21
+ } from "./chunk-P5FRWPG7.js";
19
22
  import {
20
23
  readInsights
21
24
  } from "./chunk-EOY6BK4C.js";
22
- import {
23
- liveViewerLookups
24
- } from "./chunk-QE3JEJXF.js";
25
- import "./chunk-2XRMPSEV.js";
26
- import "./chunk-PTGYM4J6.js";
27
- import "./chunk-LCW3U4EA.js";
28
25
  import {
29
26
  readAllRules,
30
27
  readCompanyReading
@@ -34,6 +31,9 @@ import {
34
31
  IDEA_ANGLES,
35
32
  IDEA_FORMATS
36
33
  } from "./chunk-G2LGMWNG.js";
34
+ import {
35
+ withDefinitions
36
+ } from "./chunk-NXZCCGES.js";
37
37
  import {
38
38
  researchCustomers
39
39
  } from "./chunk-MVB32GPI.js";
@@ -41,7 +41,7 @@ import "./chunk-D5CUAOQX.js";
41
41
  import "./chunk-NEIUVSDK.js";
42
42
  import "./chunk-BFRIRZRZ.js";
43
43
  import "./chunk-JYALBYN7.js";
44
- import "./chunk-BITS62MF.js";
44
+ import "./chunk-G6XKD7QE.js";
45
45
  import "./chunk-ERSX3MKH.js";
46
46
  import "./chunk-FNA277HP.js";
47
47
  import "./chunk-5WMTPYKT.js";
@@ -55,8 +55,8 @@ import {
55
55
  import "./chunk-MCJ5I5LR.js";
56
56
  import {
57
57
  viewerFromKnowledge
58
- } from "./chunk-KPYDTIAI.js";
59
- import "./chunk-KIGGMKAE.js";
58
+ } from "./chunk-2WZI36D3.js";
59
+ import "./chunk-65Y3RCWP.js";
60
60
  import "./chunk-DWX44QL6.js";
61
61
  import "./chunk-2FSEESJU.js";
62
62
  import "./chunk-CVBKW75S.js";
@@ -535,4 +535,4 @@ export {
535
535
  tastePart,
536
536
  whatWorks
537
537
  };
538
- //# sourceMappingURL=brief-BN4UGUXF.js.map
538
+ //# sourceMappingURL=brief-7S6XCJIA.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  csvOrJson,
3
3
  handleMetaError
4
- } from "./chunk-OP7DNHD2.js";
4
+ } from "./chunk-QTOZ32SU.js";
5
5
  import {
6
6
  writeAdsJson,
7
7
  writeAdsOutput
@@ -50,4 +50,4 @@ Examples:
50
50
  export {
51
51
  businessesCommand
52
52
  };
53
- //# sourceMappingURL=businesses-PRRYPR7H.js.map
53
+ //# sourceMappingURL=businesses-H3HIDQX6.js.map
@@ -78,7 +78,7 @@ registerSchema({
78
78
  command: "ads.x.campaigns.update",
79
79
  description: "Stage a change to an existing X campaign. Staging the same campaign twice amends the staged change in place rather than queueing two writes.",
80
80
  args: {
81
- id: { type: "string", description: "Campaign id", required: true },
81
+ id: { type: "positional", description: "Campaign id", required: true },
82
82
  "account-id": { type: "string", description: "X Ads account ID", required: false },
83
83
  name: { type: "string", description: "New name", required: false },
84
84
  status: { type: "string", description: "ACTIVE | PAUSED", required: false },
@@ -125,7 +125,7 @@ function statusCommand(name, status) {
125
125
  command: `ads.x.campaigns.${name}`,
126
126
  description: `Stage ${name === "pause" ? "a pause" : "a resume"} for one or more X campaigns. Pass every id in one call.`,
127
127
  args: {
128
- ids: { type: "string", description: "Campaign ids, comma-separated", required: true },
128
+ ids: { type: "positional", description: "Campaign ids, comma-separated", required: true },
129
129
  "account-id": { type: "string", description: "X Ads account ID", required: false }
130
130
  }
131
131
  });
@@ -162,4 +162,4 @@ export {
162
162
  campaignsResumeCommand,
163
163
  campaignsUpdateCommand
164
164
  };
165
- //# sourceMappingURL=campaign-writes-BAFB5E7A.js.map
165
+ //# sourceMappingURL=campaign-writes-7ZF57KLH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/ads/x/campaign-writes.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport {\n compact,\n microsFromArg,\n requireTarget,\n requireTargets,\n stageAccountId,\n stageXOp,\n stageXOps,\n} from \"./write-shared.ts\";\n\n/**\n * Staged campaign writes. Nothing here calls X: each command appends an op to\n * this chat's draft, which applies when the chat publishes.\n */\n\nconst BUDGET_ARGS = {\n \"daily-budget\": { type: \"string\", description: \"Daily budget in account currency, e.g. 12.50\" },\n \"total-budget\": { type: \"string\", description: \"Lifetime budget in account currency — must exceed the daily budget\" },\n} as const;\n\nregisterSchema({\n command: \"ads.x.campaigns.create\",\n description:\n \"Stage a new X campaign on this chat's draft. Needs a funding instrument (`baker ads x funding`). Defaults to PAUSED — an ACTIVE campaign starts spending the moment the chat publishes.\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n name: { type: \"string\", description: \"Campaign name\", required: true },\n \"funding-instrument-id\": { type: \"string\", description: \"From `baker ads x funding`\", required: true },\n status: { type: \"string\", description: \"ACTIVE | PAUSED | DRAFT (default PAUSED)\", required: false },\n \"daily-budget\": { type: \"string\", description: \"Daily budget in account currency\", required: false },\n \"total-budget\": { type: \"string\", description: \"Lifetime budget in account currency\", required: false },\n \"budget-optimization\": { type: \"string\", description: \"CAMPAIGN | LINE_ITEM\", required: false },\n },\n});\n\nexport const campaignsCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new campaign (applies when the chat is published).\n\nExamples:\n baker ads x campaigns create --name \"zz-baker-harness\" --funding-instrument-id vtbot --daily-budget 5`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\" },\n name: { type: \"string\", description: \"Campaign name\", required: true },\n \"funding-instrument-id\": { type: \"string\", description: \"Funding instrument id\", required: true },\n status: { type: \"string\", description: \"ACTIVE | PAUSED | DRAFT (default PAUSED)\" },\n ...BUDGET_ARGS,\n \"budget-optimization\": { type: \"string\", description: \"CAMPAIGN | LINE_ITEM\" },\n },\n run: async ({ args }) => {\n const accountId = await stageAccountId(args);\n await stageXOp({\n kind: \"campaign.create\",\n accountId,\n payload: compact({\n name: args.name,\n fundingInstrumentId: args[\"funding-instrument-id\"],\n entityStatus: args.status,\n budgetOptimization: args[\"budget-optimization\"],\n dailyBudgetAmountLocalMicro: microsFromArg(args[\"daily-budget\"], \"--daily-budget\"),\n totalBudgetAmountLocalMicro: microsFromArg(args[\"total-budget\"], \"--total-budget\"),\n }),\n });\n },\n});\n\nregisterSchema({\n command: \"ads.x.campaigns.update\",\n description:\n \"Stage a change to an existing X campaign. Staging the same campaign twice amends the staged change in place rather than queueing two writes.\",\n args: {\n id: { type: \"positional\", description: \"Campaign id\", required: true },\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n name: { type: \"string\", description: \"New name\", required: false },\n status: { type: \"string\", description: \"ACTIVE | PAUSED\", required: false },\n \"daily-budget\": { type: \"string\", description: \"Daily budget in account currency\", required: false },\n \"total-budget\": { type: \"string\", description: \"Lifetime budget in account currency\", required: false },\n \"budget-optimization\": { type: \"string\", description: \"CAMPAIGN | LINE_ITEM\", required: false },\n },\n});\n\nexport const campaignsUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: `Stage a change to a campaign.\n\nExamples:\n baker ads x campaigns update oilf0 --daily-budget 20\n baker ads x campaigns update oilf0 --name \"Spring push\"`,\n },\n args: {\n id: { type: \"positional\", description: \"Campaign id\", required: true },\n \"account-id\": { type: \"string\", description: \"X Ads account ID\" },\n name: { type: \"string\", description: \"New name\" },\n status: { type: \"string\", description: \"ACTIVE | PAUSED\" },\n ...BUDGET_ARGS,\n \"budget-optimization\": { type: \"string\", description: \"CAMPAIGN | LINE_ITEM\" },\n },\n run: async ({ args }) => {\n const accountId = await stageAccountId(args);\n await stageXOp({\n kind: \"campaign.update\",\n accountId,\n target: requireTarget(args, \"id\"),\n payload: compact({\n name: args.name,\n entityStatus: args.status,\n budgetOptimization: args[\"budget-optimization\"],\n dailyBudgetAmountLocalMicro: microsFromArg(args[\"daily-budget\"], \"--daily-budget\"),\n totalBudgetAmountLocalMicro: microsFromArg(args[\"total-budget\"], \"--total-budget\"),\n }),\n });\n },\n});\n\nfunction statusCommand(name: \"pause\" | \"resume\", status: \"PAUSED\" | \"ACTIVE\") {\n registerSchema({\n command: `ads.x.campaigns.${name}`,\n description: `Stage ${name === \"pause\" ? \"a pause\" : \"a resume\"} for one or more X campaigns. Pass every id in one call.`,\n args: {\n ids: { type: \"positional\", description: \"Campaign ids, comma-separated\", required: true },\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n },\n });\n return defineCommand({\n meta: {\n name,\n description: `Stage ${name === \"pause\" ? \"pausing\" : \"resuming\"} campaigns.\n\nExample:\n baker ads x campaigns ${name} oilf0,omyq3`,\n },\n args: {\n ids: { type: \"positional\", description: \"Campaign ids, comma-separated\", required: true },\n \"account-id\": { type: \"string\", description: \"X Ads account ID\" },\n },\n run: async ({ args }) => {\n const accountId = await stageAccountId(args);\n await stageXOps(\n requireTargets(args, \"ids\").map((id) => ({\n kind: \"campaign.update\",\n accountId,\n target: id,\n payload: { entityStatus: status },\n })),\n );\n },\n });\n}\n\nexport const campaignsPauseCommand = statusCommand(\"pause\", \"PAUSED\");\nexport const campaignsResumeCommand = statusCommand(\"resume\", \"ACTIVE\");\n"],"mappings":"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","names":[]}
@@ -10,7 +10,7 @@ import {
10
10
  schemaArgs,
11
11
  stageChatgptOp,
12
12
  statusCommand
13
- } from "./chunk-3UXMQ3K2.js";
13
+ } from "./chunk-AQM4JH62.js";
14
14
  import {
15
15
  CHATGPT_ADS_REFERENCE
16
16
  } from "./chunk-IG627WWY.js";
@@ -167,4 +167,4 @@ export {
167
167
  campaignsResumeCommand,
168
168
  campaignsUpdateCommand
169
169
  };
170
- //# sourceMappingURL=campaign-writes-U5LTDTYK.js.map
170
+ //# sourceMappingURL=campaign-writes-U5PUVSMT.js.map