@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
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  recordIdeaLines
3
- } from "./chunk-FUKDI2UK.js";
3
+ } from "./chunk-3W6G6ARX.js";
4
4
  import {
5
5
  anchorLines,
6
6
  readIdeaAnchor
7
- } from "./chunk-AVNSH2JE.js";
7
+ } from "./chunk-KOXDXSKN.js";
8
8
  import {
9
9
  findWorkspaceRoot
10
10
  } from "./chunk-23H4ZJRP.js";
@@ -63,4 +63,4 @@ export {
63
63
  withAnchor,
64
64
  readCreativeIdea
65
65
  };
66
- //# sourceMappingURL=chunk-LPXSM2DI.js.map
66
+ //# sourceMappingURL=chunk-AO45BX6Q.js.map
@@ -87,7 +87,7 @@ function schemaArgs(args) {
87
87
  Object.entries(args).map(([name, arg]) => [
88
88
  name,
89
89
  {
90
- type: arg.type === "positional" ? "string" : arg.type,
90
+ type: arg.type,
91
91
  description: arg.description,
92
92
  required: arg.required === true
93
93
  }
@@ -271,4 +271,4 @@ export {
271
271
  statusCommand,
272
272
  productFiltersArg
273
273
  };
274
- //# sourceMappingURL=chunk-3UXMQ3K2.js.map
274
+ //# sourceMappingURL=chunk-AQM4JH62.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/ads/chatgpt/write-shared.ts"],"sourcesContent":["import { type ChatgptDraftStageResponse, chatgptDraftOpInputSchema } from \"@baker/api/ads-chatgpt\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../../client.ts\";\nimport { requireChatId } from \"../../../env.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { writeJsonEnvelope } from \"../output.ts\";\nimport type { AdsErrorEnvelope } from \"../types.ts\";\nimport { chatgptFailure } from \"./shared.ts\";\n\n/**\n * Shared plumbing for the staged ChatGPT Ads write commands.\n *\n * Writes never reach ChatGPT Ads from here: every command stages an op on this\n * chat's draft (`/api/ads/chatgpt/draft/stage`), the dashboard shows it as a\n * pending change, and it applies only when the chat is published.\n */\n\nfunction fail(envelope: AdsErrorEnvelope): never {\n writeJsonEnvelope({ ...envelope });\n process.exit(1);\n}\n\nexport function failWriteValidation(message: string): never {\n fail({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message,\n fix: { action: \"add_required_field\", explanation: `${message}. Nothing was staged.` },\n retryable: false,\n },\n });\n}\n\n/** A write failure, as the agent should act on it; a missing chat is not a network error. */\nfunction writeFailure(err: unknown, reference: string): AdsErrorEnvelope {\n if (!(err instanceof ApiError) && err instanceof Error && err.message.includes(\"BAKER_CHAT_ID\")) {\n return {\n ok: false,\n error: {\n code: \"NO_CHAT\",\n message: err.message,\n fix: {\n action: \"reject\",\n explanation:\n \"ChatGPT Ads changes are staged on a chat and apply when it is published; run this from the chat.\",\n },\n retryable: false,\n },\n };\n }\n return chatgptFailure(err, reference);\n}\n\n/**\n * Digits after the decimal point, read off the written amount: `String(0.0000005)`\n * is `\"5e-7\"`, whose mantissa has no decimals at all.\n */\nfunction decimalPlaces(value: unknown): number {\n const [mantissa, exponent] = String(value).trim().split(/e/i);\n const written = (mantissa?.split(\".\")[1] ?? \"\").length;\n return Math.max(0, written - (exponent ? Number(exponent) : 0));\n}\n\nexport type ChatgptMoneyParse = { ok: true; micros: number | undefined } | { ok: false; reason: string };\n\n/**\n * ChatGPT Ads takes money as integer micros of the account currency; the CLI\n * takes the amount a person writes. Counting decimals instead of comparing\n * `amount * 1e6` with its rounding is exact at every magnitude.\n */\nexport function parseChatgptMoney(value: unknown): ChatgptMoneyParse {\n if (value === undefined || value === \"\") {\n return { ok: true, micros: undefined };\n }\n const amount = Number(value);\n if (!Number.isFinite(amount) || amount <= 0) {\n return { ok: false, reason: \"must be a positive amount, for example 12.50\" };\n }\n if (decimalPlaces(value) > 6) {\n return { ok: false, reason: \"is finer than ChatGPT Ads can express\" };\n }\n return { ok: true, micros: Math.round(amount * 1_000_000) };\n}\n\nexport function microsFromArg(value: unknown, flag: string): number | undefined {\n const parsed = parseChatgptMoney(value);\n if (!parsed.ok) {\n failWriteValidation(`${flag} ${parsed.reason}`);\n }\n return parsed.micros;\n}\n\nexport function csvArg(value: unknown): string[] | undefined {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n return undefined;\n }\n const parts = value\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n return parts.length > 0 ? parts : undefined;\n}\n\ninterface CliArg {\n type: string;\n description: string;\n required?: boolean;\n}\n\n/**\n * The `baker schema` entry for a command, read off the flags it really takes,\n * so the introspection an agent plans from cannot drift from the command.\n */\nexport function schemaArgs(args: Record<string, CliArg>) {\n return Object.fromEntries(\n Object.entries(args).map(([name, arg]) => [\n name,\n {\n type: arg.type,\n description: arg.description,\n required: arg.required === true,\n },\n ]),\n );\n}\n\n/** A flag naming one of ChatGPT Ads' lowercase values, taken in whatever case it was typed. */\nexport function lowerArg(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() !== \"\" ? value.trim().toLowerCase() : undefined;\n}\n\n/** A comma-separated list of those values. */\nexport function lowerCsvArg(value: unknown): string[] | undefined {\n return csvArg(value)?.map((part) => part.toLowerCase());\n}\n\n/** Drop unset keys so an omitted flag never stages as an explicit value. */\nexport function compact(payload: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(payload).filter(([, value]) => value !== undefined && value !== \"\"));\n}\n\nexport function requireTarget(args: Record<string, unknown>, name: string): string {\n const value = args[name];\n if (typeof value !== \"string\" || value.trim().length === 0) {\n failWriteValidation(`${name} is required`);\n }\n return value.trim();\n}\n\nexport function requireTargets(args: Record<string, unknown>, name: string): string[] {\n const ids = csvArg(args[name]);\n if (!ids) {\n failWriteValidation(`${name} is required — pass one or more ids, comma-separated`);\n }\n return ids;\n}\n\n/** The op, checked against the same schema the backend applies, before anything is sent. */\nfunction preflight(raw: Record<string, unknown>) {\n const parsed = chatgptDraftOpInputSchema.safeParse(raw);\n if (parsed.success) {\n return parsed.data;\n }\n const fields = parsed.error.issues.map((issue) => ({ path: issue.path.join(\".\"), message: issue.message }));\n const message = fields.map((field) => (field.path ? `${field.path}: ${field.message}` : field.message)).join(\"; \");\n return fail({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message,\n fix: {\n action: \"retry_with_modified_query\",\n explanation:\n \"Fix the named fields and stage again. Nothing was staged — the draft is as it was before this call.\",\n },\n retryable: false,\n },\n });\n}\n\n/** The ChatGPT Ads routes answer with the payload itself; the envelope is the CLI's to add. */\nasync function postStage(chatId: string, op: ReturnType<typeof preflight>): Promise<ChatgptDraftStageResponse> {\n return await apiPost<ChatgptDraftStageResponse>(\"/api/ads/chatgpt/draft/stage\", { chatId, op });\n}\n\n/** Stage one op and print what was staged; `hintsFor` names the obvious next step. */\nexport async function stageChatgptOp(\n raw: Record<string, unknown>,\n reference: string,\n hintsFor?: (staged: ChatgptDraftStageResponse) => string[],\n): Promise<void> {\n const op = preflight(raw);\n try {\n const staged = await postStage(requireChatId(), op);\n const hints = hintsFor?.(staged) ?? [];\n writeJsonEnvelope({ ok: true, data: staged, ...(hints.length > 0 ? { hints } : {}) });\n } catch (err) {\n fail(writeFailure(err, reference));\n }\n}\n\n/**\n * Stage the same change on several entities (a pause across campaigns). Each is\n * its own op; when one is refused, the ones already staged are named so the\n * agent neither re-stages nor loses them.\n */\nexport async function stageChatgptOps(raws: Array<Record<string, unknown>>, reference: string): Promise<void> {\n if (raws.length === 1 && raws[0]) {\n await stageChatgptOp(raws[0], reference);\n return;\n }\n const ops = raws.map(preflight);\n const staged: ChatgptDraftStageResponse[] = [];\n try {\n const chatId = requireChatId();\n for (const op of ops) {\n staged.push(await postStage(chatId, op));\n }\n writeJsonEnvelope({ ok: true, data: staged });\n } catch (err) {\n const failure = writeFailure(err, reference);\n if (staged.length > 0) {\n failure.error.message = `${failure.error.message} (already staged: ${staged.map((s) => s.summary).join(\"; \")})`;\n }\n fail(failure);\n }\n}\n\n/** On an update, `none` empties a list — ChatGPT Ads' way to clear exclusions, audiences or regions. */\nexport function clearableCsvArg(value: unknown): string[] | undefined {\n return typeof value === \"string\" && value.trim().toLowerCase() === \"none\" ? [] : csvArg(value);\n}\n\n/** On an update, `none` removes the value — a tracking template. */\nexport function clearableArg(value: unknown): string | null | undefined {\n if (typeof value !== \"string\" || value.trim() === \"\") {\n return undefined;\n }\n return value.trim().toLowerCase() === \"none\" ? null : value.trim();\n}\n\n/** A crop as `x,y,width,height`, each a share of the image from 0 to 1. */\nexport function cropArg(\n value: unknown,\n flag: string,\n): { x: number; y: number; width: number; height: number } | undefined {\n const parts = csvArg(value);\n if (!parts) {\n return undefined;\n }\n const numbers = parts.map(Number);\n const [x, y, width, height] = numbers;\n if (\n numbers.length !== 4 ||\n numbers.some(Number.isNaN) ||\n x === undefined ||\n y === undefined ||\n width === undefined ||\n height === undefined\n ) {\n failWriteValidation(`${flag} takes four shares of the image, x,y,width,height — e.g. 0.1,0,0.8,0.8`);\n }\n return { x, y, width, height };\n}\n\ntype StatusEntity = \"campaign\" | \"adGroup\" | \"ad\";\ntype StatusVerb = \"pause\" | \"resume\" | \"archive\";\n\nconst STATUS_OF: Record<StatusVerb, \"paused\" | \"active\" | \"archived\"> = {\n pause: \"paused\",\n resume: \"active\",\n archive: \"archived\",\n};\n\nexport function statusOps(entity: StatusEntity, ids: readonly string[], status: \"paused\" | \"active\" | \"archived\") {\n return ids.map((id) => ({ kind: `${entity}.update`, target: id, payload: { status } }));\n}\n\nconst STATUS_NOUN: Record<StatusEntity, { command: string; plural: string; example: string }> = {\n campaign: { command: \"campaigns\", plural: \"campaigns\", example: \"cmpn_123,cmpn_456\" },\n adGroup: { command: \"ad-groups\", plural: \"ad groups\", example: \"adgrp_123,adgrp_456\" },\n ad: { command: \"ads\", plural: \"cards\", example: \"ad_123,ad_456\" },\n};\n\nconst STATUS_DOING: Record<StatusVerb, string> = { pause: \"pausing\", resume: \"resuming\", archive: \"archiving\" };\n\n/** `pause`, `resume` or `archive` for every id passed, staged as one change each. */\nexport function statusCommand(entity: StatusEntity, verb: StatusVerb, reference: string) {\n const noun = STATUS_NOUN[entity];\n const args = {\n ids: { type: \"positional\", description: `${noun.plural} ids, comma-separated`, required: true },\n } as const;\n const forGood =\n verb === \"archive\"\n ? ` Archiving is for good: ChatGPT Ads cannot bring archived ${noun.plural} back, and their results stay in reports. Pause instead unless the user asked to archive.`\n : \"\";\n registerSchema({\n command: `ads.chatgpt.${noun.command}.${verb}`,\n description: `Stage ${STATUS_DOING[verb]} one or more ChatGPT Ads ${noun.plural}. Pass every id in one call.${forGood}`,\n args: schemaArgs(args),\n });\n return defineCommand({\n meta: {\n name: verb,\n description: `Stage ${STATUS_DOING[verb]} ${noun.plural}.${forGood}\n\nExample:\n baker ads chatgpt ${noun.command} ${verb} ${noun.example}`,\n },\n args,\n run: async ({ args: parsed }) => {\n await stageChatgptOps(statusOps(entity, requireTargets(parsed, \"ids\"), STATUS_OF[verb]), reference);\n },\n });\n}\n\n/**\n * Product filters as a marketer writes them: `brand in Acme|Baker; price lte 5000`\n * — conditions split by `;`, each field, operator and values (several joined\n * with `|`). `none` is no filter: the whole catalog.\n */\nexport function productFiltersArg(\n value: unknown,\n): Array<{ field: string; operator: string; values: string[] }> | undefined {\n if (typeof value !== \"string\" || value.trim() === \"\") {\n return undefined;\n }\n if (value.trim().toLowerCase() === \"none\") {\n return [];\n }\n return value\n .split(\";\")\n .map((condition) => condition.trim())\n .filter(Boolean)\n .map((condition) => {\n const match = /^(\\S+)\\s+(\\S+)\\s+(.+)$/.exec(condition);\n if (!match?.[1] || !match[2] || !match[3]) {\n failWriteValidation(\n `\"${condition}\" is not a product filter — write field operator values, e.g. price lte 5000`,\n );\n }\n return {\n field: match[1],\n operator: match[2].toLowerCase(),\n values: match[3]\n .split(\"|\")\n .map((part) => part.trim())\n .filter(Boolean),\n };\n });\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  REF_PREFIX
3
- } from "./chunk-62JQQUAU.js";
3
+ } from "./chunk-JQH5VG6F.js";
4
4
 
5
5
  // src/commands/canvas/node-preview.ts
6
6
  var MAX_PARAMS_PREVIEW_LENGTH = 4e3;
@@ -61,4 +61,4 @@ ${body}` : header || body || compactJson(record);
61
61
  export {
62
62
  nodeParamsPreview
63
63
  };
64
- //# sourceMappingURL=chunk-NPMAATZG.js.map
64
+ //# sourceMappingURL=chunk-C7NWUCLQ.js.map
@@ -0,0 +1,287 @@
1
+ import {
2
+ failWriteValidation,
3
+ parseDateFlag,
4
+ parseMoneyFlag
5
+ } from "./chunk-5C35OW7L.js";
6
+ import {
7
+ repeatedValues
8
+ } from "./chunk-ERSX3MKH.js";
9
+
10
+ // src/commands/ads/meta/delivery-flags.ts
11
+ function text(value) {
12
+ return typeof value === "string" && value.length > 0 ? value : void 0;
13
+ }
14
+ function frequencyCapFlag(value) {
15
+ const raw = text(value);
16
+ if (raw === void 0) {
17
+ return void 0;
18
+ }
19
+ const match = /^(\d+)\s*\/\s*(\d+)\s*d?$/i.exec(raw.trim());
20
+ if (!match) {
21
+ failWriteValidation(
22
+ `--frequency-cap takes N/D \u2014 at most N impressions per person every D days, e.g. 2/7 (got "${raw}")`
23
+ );
24
+ }
25
+ return [{ event: "IMPRESSIONS", interval_days: Number(match[2]), max_frequency: Number(match[1]) }];
26
+ }
27
+ var DAY_INDEX = { sun: 0, mon: 1, tue: 2, wed: 3, thu: 4, fri: 5, sat: 6 };
28
+ function dayIndex(name, flag) {
29
+ const index = DAY_INDEX[name.slice(0, 3).toLowerCase()];
30
+ if (index === void 0) {
31
+ failWriteValidation(`${flag}: "${name}" is not a day \u2014 use Mon, Tue, \u2026 Sun`);
32
+ }
33
+ return index;
34
+ }
35
+ function scheduleDays(spec) {
36
+ if (/^(daily|every ?day|all)$/i.test(spec)) {
37
+ return [0, 1, 2, 3, 4, 5, 6];
38
+ }
39
+ return spec.split(",").flatMap((part) => {
40
+ const [from, to] = part.split("-").map((day) => day.trim());
41
+ if (!from) {
42
+ return [];
43
+ }
44
+ const start = dayIndex(from, "--schedule");
45
+ if (!to) {
46
+ return [start];
47
+ }
48
+ const end = dayIndex(to, "--schedule");
49
+ const days = [];
50
+ for (let day = start; days.length < 7; day = (day + 1) % 7) {
51
+ days.push(day);
52
+ if (day === end) break;
53
+ }
54
+ return days;
55
+ });
56
+ }
57
+ function hourMinute(value) {
58
+ const [hours = "", minutes = "0"] = value.split(":");
59
+ return Number(hours) * 60 + Number(minutes);
60
+ }
61
+ function scheduleBlock(raw, timezone) {
62
+ const match = /^(.+?)\s+(\d{1,2}(?::\d{2})?)\s*-\s*(\d{1,2}(?::\d{2})?)$/.exec(raw.trim());
63
+ if (!match?.[1] || !match[2] || !match[3]) {
64
+ failWriteValidation(
65
+ `--schedule takes "<days> <from>-<to>", e.g. "Mon-Fri 09-18" or "sat,sun 10:00-14:00" (got "${raw}")`
66
+ );
67
+ }
68
+ return {
69
+ days: scheduleDays(match[1]),
70
+ start_minute: hourMinute(match[2]),
71
+ end_minute: hourMinute(match[3]),
72
+ timezone_type: timezone
73
+ };
74
+ }
75
+ function dayPartingFromFlags(args, rawArgs) {
76
+ const blocks = repeatedValues(rawArgs, "schedule", args.schedule).map((block) => {
77
+ const { timezone_type: _clock, ...rest } = scheduleBlock(block, "USER");
78
+ return rest;
79
+ });
80
+ return blocks.length > 0 ? blocks : void 0;
81
+ }
82
+ function scheduleTimezone(value) {
83
+ const raw = text(value)?.toLowerCase();
84
+ if (raw === void 0 || raw === "viewer" || raw === "user") {
85
+ return "USER";
86
+ }
87
+ if (raw === "account" || raw === "advertiser") {
88
+ return "ADVERTISER";
89
+ }
90
+ failWriteValidation(`--schedule-timezone takes viewer or account (got "${raw}")`);
91
+ }
92
+ var ATTRIBUTION_EVENTS = {
93
+ click: "CLICK_THROUGH",
94
+ view: "VIEW_THROUGH",
95
+ engaged_view: "ENGAGED_VIDEO_VIEW",
96
+ engaged_video_view: "ENGAGED_VIDEO_VIEW"
97
+ };
98
+ function attributionFlag(value) {
99
+ const raw = text(value);
100
+ if (raw === void 0) {
101
+ return void 0;
102
+ }
103
+ return raw.split(",").map((window) => {
104
+ const match = /^(\d+)d_([a-z_]+)$/i.exec(window.trim());
105
+ const event = match?.[2] ? ATTRIBUTION_EVENTS[match[2].toLowerCase()] : void 0;
106
+ if (!match || !event) {
107
+ failWriteValidation(`--attribution takes windows like 7d_click,1d_view,1d_engaged_view (got "${window}")`);
108
+ }
109
+ return { event_type: event, window_days: Number(match[1]) };
110
+ });
111
+ }
112
+ function numberArg(value, flag) {
113
+ const raw = text(value);
114
+ if (raw === void 0) {
115
+ return void 0;
116
+ }
117
+ const n = Number(raw);
118
+ if (!Number.isFinite(n)) {
119
+ failWriteValidation(`${flag} must be a number`);
120
+ }
121
+ return n;
122
+ }
123
+ function adSetDeliveryFromFlags(args, rawArgs) {
124
+ const timezone = scheduleTimezone(args["schedule-timezone"]);
125
+ const blocks = repeatedValues(rawArgs, "schedule", args.schedule).map((block) => scheduleBlock(block, timezone));
126
+ if (args["schedule-timezone"] !== void 0 && blocks.length === 0) {
127
+ failWriteValidation(
128
+ "--schedule-timezone says whose clock --schedule follows, so it goes with --schedule \u2014 pass the hours again with it"
129
+ );
130
+ }
131
+ const delivery = {
132
+ minRoas: numberArg(args["min-roas"], "--min-roas"),
133
+ frequency_control_specs: frequencyCapFlag(args["frequency-cap"]),
134
+ adset_schedule: blocks.length > 0 ? blocks : void 0,
135
+ pacing: text(args.pacing)?.toLowerCase(),
136
+ dailyMinSpendTarget: parseMoneyFlag(args["daily-min-spend"], args.currency, "--daily-min-spend"),
137
+ dailySpendCap: parseMoneyFlag(args["daily-spend-cap"], args.currency, "--daily-spend-cap"),
138
+ lifetimeMinSpendTarget: parseMoneyFlag(args["lifetime-min-spend"], args.currency, "--lifetime-min-spend"),
139
+ lifetimeSpendCap: parseMoneyFlag(args["lifetime-spend-cap"], args.currency, "--lifetime-spend-cap"),
140
+ is_dynamic_creative: args["dynamic-creative"] === void 0 ? void 0 : Boolean(args["dynamic-creative"]),
141
+ attribution_spec: attributionFlag(args.attribution)
142
+ };
143
+ return Object.fromEntries(Object.entries(delivery).filter(([, value]) => value !== void 0));
144
+ }
145
+ function budgetBoost(raw, currency) {
146
+ const match = /^(.+?)\.\.(.+?)=\+?(\d+(?:\.\d{1,3})?)(%?)$/.exec(raw.trim());
147
+ if (!match?.[1] || !match[2] || !match[3]) {
148
+ failWriteValidation(
149
+ `--budget-boost takes START..END=+AMOUNT or START..END=+PERCENT%, e.g. 2027-11-27T00:00Z..2027-11-28T00:00Z=+50% (got "${raw}")`
150
+ );
151
+ }
152
+ const period = {
153
+ time_start: parseDateFlag(match[1], "--budget-boost start"),
154
+ time_end: parseDateFlag(match[2], "--budget-boost end")
155
+ };
156
+ return match[4] === "%" ? { ...period, increasePercent: Number(match[3]) } : { ...period, increase: parseMoneyFlag(match[3], currency, "--budget-boost") };
157
+ }
158
+ function budgetBoostsFromFlags(args, rawArgs) {
159
+ const boosts = repeatedValues(rawArgs, "budget-boost", args["budget-boost"]);
160
+ return boosts.length > 0 ? boosts.map((boost) => budgetBoost(boost, args.currency)) : void 0;
161
+ }
162
+ function boostMove(raw) {
163
+ const match = /^(\d+)=(.+?)\.\.(.+)$/.exec(raw.trim());
164
+ if (!match?.[1] || !match[2] || !match[3]) {
165
+ failWriteValidation(
166
+ `--move-boost takes ID=START..END, e.g. 1633135568548763=2027-11-27T06:00Z..2027-11-27T12:00Z (got "${raw}")`
167
+ );
168
+ }
169
+ return {
170
+ id: match[1],
171
+ time_start: parseDateFlag(match[2], "--move-boost start"),
172
+ time_end: parseDateFlag(match[3], "--move-boost end")
173
+ };
174
+ }
175
+ function boostEditsFromFlags(args, rawArgs) {
176
+ const removed = repeatedValues(rawArgs, "remove-boost", args["remove-boost"]).flatMap((value) => value.split(",")).map((value) => value.trim()).filter(Boolean);
177
+ const moved = repeatedValues(rawArgs, "move-boost", args["move-boost"]);
178
+ return {
179
+ ...removed.length > 0 ? { removeBoosts: removed } : {},
180
+ ...moved.length > 0 ? { moveBoosts: moved.map(boostMove) } : {}
181
+ };
182
+ }
183
+ var boostEditArgs = {
184
+ "remove-boost": {
185
+ type: "string",
186
+ description: "Take one budget boost away, by its id from `baker ads meta high-demand-periods --campaign-id <id>` \u2014 repeatable or comma-separated. The others stay."
187
+ },
188
+ "move-boost": {
189
+ type: "string",
190
+ description: "Move one budget boost to another window, keeping its raise: ID=START..END, repeatable, at least 3 hours, on quarter hours. Meta has no boost update, so publish adds the same raise on the new window, then deletes the old boost. Example: --move-boost 1633135568548763=2027-11-27T06:00Z..2027-11-27T12:00Z"
191
+ }
192
+ };
193
+ var adSetDeliveryArgs = {
194
+ "min-roas": {
195
+ type: "string",
196
+ description: "Minimum ROAS for LOWEST_COST_WITH_MIN_ROAS bidding, as a multiple of spend: 2.5 = 250%. Needs --optimization-goal VALUE. Under a min-ROAS campaign budget every ad set needs its own. Example: --bid-strategy LOWEST_COST_WITH_MIN_ROAS --min-roas 2.5"
197
+ },
198
+ "frequency-cap": {
199
+ type: "string",
200
+ description: "At most N impressions per person every D days, as N/D \u2014 REACH and THRUPLAY goals only. Example: --frequency-cap 2/7"
201
+ },
202
+ schedule: {
203
+ type: "string",
204
+ description: 'Run ads only in these hours (dayparting), repeatable: "<days> <from>-<to>", whole hours. Needs --lifetime-budget and --end. Example: --schedule "Mon-Fri 09-18" --schedule "Sat 10-14"'
205
+ },
206
+ "schedule-timezone": {
207
+ type: "string",
208
+ description: "Whose clock --schedule follows: viewer (default) or account"
209
+ },
210
+ pacing: {
211
+ type: "string",
212
+ description: "standard (default) | no_pacing (accelerated \u2014 spends as fast as it can; LOWEST_COST_WITH_BID_CAP only) | day_parting (set by --schedule)"
213
+ },
214
+ "daily-min-spend": {
215
+ type: "string",
216
+ description: "Ad set spend limit under a DAILY campaign budget: spend at least this per day (best effort)"
217
+ },
218
+ "daily-spend-cap": {
219
+ type: "string",
220
+ description: "Ad set spend limit under a DAILY campaign budget: spend at most this per day. Example: --daily-spend-cap 15"
221
+ },
222
+ "lifetime-min-spend": {
223
+ type: "string",
224
+ description: "Ad set spend limit under a LIFETIME campaign budget: spend at least this in total"
225
+ },
226
+ "lifetime-spend-cap": {
227
+ type: "string",
228
+ description: "Ad set spend limit under a LIFETIME campaign budget: spend at most this in total"
229
+ },
230
+ attribution: {
231
+ type: "string",
232
+ description: "Attribution windows Meta optimizes on: 1d_click or 7d_click, plus 1d_view and/or 1d_engaged_view \u2014 conversion goals only; LINK_CLICKS, LANDING_PAGE_VIEWS and REACH take 1d_click alone. Fixed when the ad set is created: Meta refuses a change on a live ad set. Example: --attribution 7d_click,1d_view"
233
+ }
234
+ };
235
+ var budgetBoostArg = {
236
+ "budget-boost": {
237
+ type: "string",
238
+ description: "Raise the daily budget for a high-demand period, repeatable: START..END=+AMOUNT or START..END=+PERCENT% (max 800%), at least 3 hours, on quarter hours, all amounts or all percentages. Needs --daily-budget in the same command (the current one, on update). Example: --budget-boost 2027-11-27T00:00Z..2027-11-28T00:00Z=+50%"
239
+ }
240
+ };
241
+ var CLEAR_FLAGS = {
242
+ "daily-min-spend": "dailyMinSpendTarget",
243
+ "daily-spend-cap": "dailySpendCap",
244
+ "lifetime-min-spend": "lifetimeMinSpendTarget",
245
+ "lifetime-spend-cap": "lifetimeSpendCap",
246
+ schedule: "adset_schedule",
247
+ boosts: "budgetSchedules",
248
+ "budget-boost": "budgetSchedules"
249
+ };
250
+ var NOT_CLEARABLE = {
251
+ "min-roas": "a ROAS floor goes with ROAS goal bidding \u2014 switch --bid-strategy (e.g. LOWEST_COST_WITHOUT_CAP) and Baker drops the floor",
252
+ "frequency-cap": "Meta keeps a frequency cap on a reach ad set whatever is sent (an empty cap is accepted and ignored) \u2014 set another with --frequency-cap"
253
+ };
254
+ function clearFromFlags(rawArgs, entity) {
255
+ const names = repeatedValues(rawArgs, "clear", void 0).flatMap((value) => value.split(",")).map((value) => value.trim().toLowerCase()).filter(Boolean);
256
+ if (names.length === 0) return void 0;
257
+ const fields = names.map((name) => {
258
+ const why = NOT_CLEARABLE[name];
259
+ if (why) throw new Error(`--clear ${name}: ${why}`);
260
+ const field = CLEAR_FLAGS[name];
261
+ if (!field || entity === "campaign" && field !== "budgetSchedules") {
262
+ const takes = entity === "campaign" ? "boosts" : Object.keys(CLEAR_FLAGS).join(", ");
263
+ throw new Error(`--clear takes ${takes} \u2014 not "${name}"`);
264
+ }
265
+ return field;
266
+ });
267
+ return [...new Set(fields)];
268
+ }
269
+ var clearArg = {
270
+ clear: {
271
+ type: "string",
272
+ description: "Take a delivery control away (repeatable or comma-separated): daily-min-spend, daily-spend-cap, lifetime-min-spend, lifetime-spend-cap, schedule (back to standard pacing), boosts (every budget boost it has now). A ROAS floor goes by switching --bid-strategy; Meta keeps a reach ad set's frequency cap."
273
+ }
274
+ };
275
+
276
+ export {
277
+ dayPartingFromFlags,
278
+ adSetDeliveryFromFlags,
279
+ budgetBoostsFromFlags,
280
+ boostEditsFromFlags,
281
+ boostEditArgs,
282
+ adSetDeliveryArgs,
283
+ budgetBoostArg,
284
+ clearFromFlags,
285
+ clearArg
286
+ };
287
+ //# sourceMappingURL=chunk-CP4P6YKM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/ads/meta/delivery-flags.ts"],"sourcesContent":["import { repeatedValues } from \"../../../lib/repeatedFlags.ts\";\nimport { failWriteValidation, parseDateFlag, parseMoneyFlag } from \"./write-shared.ts\";\n\n/**\n * The delivery-control flags of `campaigns`/`adsets create|update`, read into\n * the staged payload: a minimum ROAS, a frequency cap, an ad schedule and\n * pacing, ad set spend limits, Dynamic Creative, attribution windows and\n * budget boosts (high-demand periods). Each flag is a compact spelling of one\n * Meta field; `--file` still takes Meta's own shapes for anything these miss.\n */\n\ntype Args = Record<string, unknown>;\n\nfunction text(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\n/** `2/7` → at most 2 impressions per person every 7 days. */\nfunction frequencyCapFlag(value: unknown): Record<string, unknown>[] | undefined {\n const raw = text(value);\n if (raw === undefined) {\n return undefined;\n }\n const match = /^(\\d+)\\s*\\/\\s*(\\d+)\\s*d?$/i.exec(raw.trim());\n if (!match) {\n failWriteValidation(\n `--frequency-cap takes N/D — at most N impressions per person every D days, e.g. 2/7 (got \"${raw}\")`,\n );\n }\n return [{ event: \"IMPRESSIONS\", interval_days: Number(match[2]), max_frequency: Number(match[1]) }];\n}\n\nconst DAY_INDEX: Record<string, number> = { sun: 0, mon: 1, tue: 2, wed: 3, thu: 4, fri: 5, sat: 6 };\n\nfunction dayIndex(name: string, flag: string): number {\n const index = DAY_INDEX[name.slice(0, 3).toLowerCase()];\n if (index === undefined) {\n failWriteValidation(`${flag}: \"${name}\" is not a day — use Mon, Tue, … Sun`);\n }\n return index;\n}\n\n/** `Mon-Fri`, `sat,sun`, `daily` → Meta's day numbers (0 = Sunday). */\nfunction scheduleDays(spec: string): number[] {\n if (/^(daily|every ?day|all)$/i.test(spec)) {\n return [0, 1, 2, 3, 4, 5, 6];\n }\n return spec.split(\",\").flatMap((part) => {\n const [from, to] = part.split(\"-\").map((day) => day.trim());\n if (!from) {\n return [];\n }\n const start = dayIndex(from, \"--schedule\");\n if (!to) {\n return [start];\n }\n const end = dayIndex(to, \"--schedule\");\n const days: number[] = [];\n for (let day = start; days.length < 7; day = (day + 1) % 7) {\n days.push(day);\n if (day === end) break;\n }\n return days;\n });\n}\n\nfunction hourMinute(value: string): number {\n const [hours = \"\", minutes = \"0\"] = value.split(\":\");\n return Number(hours) * 60 + Number(minutes);\n}\n\n/** `Mon-Fri 09-18` → one ad schedule block. */\nfunction scheduleBlock(raw: string, timezone: string): Record<string, unknown> {\n const match = /^(.+?)\\s+(\\d{1,2}(?::\\d{2})?)\\s*-\\s*(\\d{1,2}(?::\\d{2})?)$/.exec(raw.trim());\n if (!match?.[1] || !match[2] || !match[3]) {\n failWriteValidation(\n `--schedule takes \"<days> <from>-<to>\", e.g. \"Mon-Fri 09-18\" or \"sat,sun 10:00-14:00\" (got \"${raw}\")`,\n );\n }\n return {\n days: scheduleDays(match[1]),\n start_minute: hourMinute(match[2]),\n end_minute: hourMinute(match[3]),\n timezone_type: timezone,\n };\n}\n\n/** Every `--schedule` as Meta's day-parting blocks with no clock named — a reach-and-frequency quote takes them so. */\nexport function dayPartingFromFlags(args: Args, rawArgs: readonly string[] | undefined): unknown[] | undefined {\n const blocks = repeatedValues(rawArgs, \"schedule\", args.schedule).map((block) => {\n const { timezone_type: _clock, ...rest } = scheduleBlock(block, \"USER\");\n return rest;\n });\n return blocks.length > 0 ? blocks : undefined;\n}\n\nfunction scheduleTimezone(value: unknown): string {\n const raw = text(value)?.toLowerCase();\n if (raw === undefined || raw === \"viewer\" || raw === \"user\") {\n return \"USER\";\n }\n if (raw === \"account\" || raw === \"advertiser\") {\n return \"ADVERTISER\";\n }\n failWriteValidation(`--schedule-timezone takes viewer or account (got \"${raw}\")`);\n}\n\nconst ATTRIBUTION_EVENTS: Record<string, string> = {\n click: \"CLICK_THROUGH\",\n view: \"VIEW_THROUGH\",\n engaged_view: \"ENGAGED_VIDEO_VIEW\",\n engaged_video_view: \"ENGAGED_VIDEO_VIEW\",\n};\n\n/** `7d_click,1d_view` → Meta's attribution_spec. */\nfunction attributionFlag(value: unknown): Record<string, unknown>[] | undefined {\n const raw = text(value);\n if (raw === undefined) {\n return undefined;\n }\n return raw.split(\",\").map((window) => {\n const match = /^(\\d+)d_([a-z_]+)$/i.exec(window.trim());\n const event = match?.[2] ? ATTRIBUTION_EVENTS[match[2].toLowerCase()] : undefined;\n if (!match || !event) {\n failWriteValidation(`--attribution takes windows like 7d_click,1d_view,1d_engaged_view (got \"${window}\")`);\n }\n return { event_type: event, window_days: Number(match[1]) };\n });\n}\n\nfunction numberArg(value: unknown, flag: string): number | undefined {\n const raw = text(value);\n if (raw === undefined) {\n return undefined;\n }\n const n = Number(raw);\n if (!Number.isFinite(n)) {\n failWriteValidation(`${flag} must be a number`);\n }\n return n;\n}\n\n/** The ad set delivery controls the flags name; keys a flag left unset stay undefined. */\nexport function adSetDeliveryFromFlags(args: Args, rawArgs: readonly string[] | undefined): Record<string, unknown> {\n const timezone = scheduleTimezone(args[\"schedule-timezone\"]);\n const blocks = repeatedValues(rawArgs, \"schedule\", args.schedule).map((block) => scheduleBlock(block, timezone));\n if (args[\"schedule-timezone\"] !== undefined && blocks.length === 0) {\n failWriteValidation(\n \"--schedule-timezone says whose clock --schedule follows, so it goes with --schedule — pass the hours again with it\",\n );\n }\n const delivery: Record<string, unknown> = {\n minRoas: numberArg(args[\"min-roas\"], \"--min-roas\"),\n frequency_control_specs: frequencyCapFlag(args[\"frequency-cap\"]),\n adset_schedule: blocks.length > 0 ? blocks : undefined,\n pacing: text(args.pacing)?.toLowerCase(),\n dailyMinSpendTarget: parseMoneyFlag(args[\"daily-min-spend\"], args.currency, \"--daily-min-spend\"),\n dailySpendCap: parseMoneyFlag(args[\"daily-spend-cap\"], args.currency, \"--daily-spend-cap\"),\n lifetimeMinSpendTarget: parseMoneyFlag(args[\"lifetime-min-spend\"], args.currency, \"--lifetime-min-spend\"),\n lifetimeSpendCap: parseMoneyFlag(args[\"lifetime-spend-cap\"], args.currency, \"--lifetime-spend-cap\"),\n is_dynamic_creative: args[\"dynamic-creative\"] === undefined ? undefined : Boolean(args[\"dynamic-creative\"]),\n attribution_spec: attributionFlag(args.attribution),\n };\n return Object.fromEntries(Object.entries(delivery).filter(([, value]) => value !== undefined));\n}\n\n/** `START..END=+25` (an amount) or `START..END=+50%` (a percentage) → one high-demand period. */\nfunction budgetBoost(raw: string, currency: unknown): Record<string, unknown> {\n const match = /^(.+?)\\.\\.(.+?)=\\+?(\\d+(?:\\.\\d{1,3})?)(%?)$/.exec(raw.trim());\n if (!match?.[1] || !match[2] || !match[3]) {\n failWriteValidation(\n `--budget-boost takes START..END=+AMOUNT or START..END=+PERCENT%, e.g. 2027-11-27T00:00Z..2027-11-28T00:00Z=+50% (got \"${raw}\")`,\n );\n }\n const period = {\n time_start: parseDateFlag(match[1], \"--budget-boost start\"),\n time_end: parseDateFlag(match[2], \"--budget-boost end\"),\n };\n return match[4] === \"%\"\n ? { ...period, increasePercent: Number(match[3]) }\n : { ...period, increase: parseMoneyFlag(match[3], currency, \"--budget-boost\") };\n}\n\n/** Every `--budget-boost`, or undefined when none was given. */\nexport function budgetBoostsFromFlags(args: Args, rawArgs: readonly string[] | undefined): unknown[] | undefined {\n const boosts = repeatedValues(rawArgs, \"budget-boost\", args[\"budget-boost\"]);\n return boosts.length > 0 ? boosts.map((boost) => budgetBoost(boost, args.currency)) : undefined;\n}\n\n/** `ID=START..END` → one live boost moved to a new window. */\nfunction boostMove(raw: string): Record<string, unknown> {\n const match = /^(\\d+)=(.+?)\\.\\.(.+)$/.exec(raw.trim());\n if (!match?.[1] || !match[2] || !match[3]) {\n failWriteValidation(\n `--move-boost takes ID=START..END, e.g. 1633135568548763=2027-11-27T06:00Z..2027-11-27T12:00Z (got \"${raw}\")`,\n );\n }\n return {\n id: match[1],\n time_start: parseDateFlag(match[2], \"--move-boost start\"),\n time_end: parseDateFlag(match[3], \"--move-boost end\"),\n };\n}\n\n/** Every `--remove-boost` and `--move-boost` on a live campaign or ad set. */\nexport function boostEditsFromFlags(args: Args, rawArgs: readonly string[] | undefined): Record<string, unknown> {\n const removed = repeatedValues(rawArgs, \"remove-boost\", args[\"remove-boost\"])\n .flatMap((value) => value.split(\",\"))\n .map((value) => value.trim())\n .filter(Boolean);\n const moved = repeatedValues(rawArgs, \"move-boost\", args[\"move-boost\"]);\n return {\n ...(removed.length > 0 ? { removeBoosts: removed } : {}),\n ...(moved.length > 0 ? { moveBoosts: moved.map(boostMove) } : {}),\n };\n}\n\nexport const boostEditArgs = {\n \"remove-boost\": {\n type: \"string\",\n description:\n \"Take one budget boost away, by its id from `baker ads meta high-demand-periods --campaign-id <id>` — repeatable or comma-separated. The others stay.\",\n },\n \"move-boost\": {\n type: \"string\",\n description:\n \"Move one budget boost to another window, keeping its raise: ID=START..END, repeatable, at least 3 hours, on quarter hours. Meta has no boost update, so publish adds the same raise on the new window, then deletes the old boost. Example: --move-boost 1633135568548763=2027-11-27T06:00Z..2027-11-27T12:00Z\",\n },\n} as const;\n\n/** Arg definitions for the ad set delivery-control flags, shared by create and update. */\nexport const adSetDeliveryArgs = {\n \"min-roas\": {\n type: \"string\",\n description:\n \"Minimum ROAS for LOWEST_COST_WITH_MIN_ROAS bidding, as a multiple of spend: 2.5 = 250%. Needs --optimization-goal VALUE. Under a min-ROAS campaign budget every ad set needs its own. Example: --bid-strategy LOWEST_COST_WITH_MIN_ROAS --min-roas 2.5\",\n },\n \"frequency-cap\": {\n type: \"string\",\n description:\n \"At most N impressions per person every D days, as N/D — REACH and THRUPLAY goals only. Example: --frequency-cap 2/7\",\n },\n schedule: {\n type: \"string\",\n description:\n 'Run ads only in these hours (dayparting), repeatable: \"<days> <from>-<to>\", whole hours. Needs --lifetime-budget and --end. Example: --schedule \"Mon-Fri 09-18\" --schedule \"Sat 10-14\"',\n },\n \"schedule-timezone\": {\n type: \"string\",\n description: \"Whose clock --schedule follows: viewer (default) or account\",\n },\n pacing: {\n type: \"string\",\n description:\n \"standard (default) | no_pacing (accelerated — spends as fast as it can; LOWEST_COST_WITH_BID_CAP only) | day_parting (set by --schedule)\",\n },\n \"daily-min-spend\": {\n type: \"string\",\n description: \"Ad set spend limit under a DAILY campaign budget: spend at least this per day (best effort)\",\n },\n \"daily-spend-cap\": {\n type: \"string\",\n description:\n \"Ad set spend limit under a DAILY campaign budget: spend at most this per day. Example: --daily-spend-cap 15\",\n },\n \"lifetime-min-spend\": {\n type: \"string\",\n description: \"Ad set spend limit under a LIFETIME campaign budget: spend at least this in total\",\n },\n \"lifetime-spend-cap\": {\n type: \"string\",\n description: \"Ad set spend limit under a LIFETIME campaign budget: spend at most this in total\",\n },\n attribution: {\n type: \"string\",\n description:\n \"Attribution windows Meta optimizes on: 1d_click or 7d_click, plus 1d_view and/or 1d_engaged_view — conversion goals only; LINK_CLICKS, LANDING_PAGE_VIEWS and REACH take 1d_click alone. Fixed when the ad set is created: Meta refuses a change on a live ad set. Example: --attribution 7d_click,1d_view\",\n },\n} as const;\n\nexport const budgetBoostArg = {\n \"budget-boost\": {\n type: \"string\",\n description:\n \"Raise the daily budget for a high-demand period, repeatable: START..END=+AMOUNT or START..END=+PERCENT% (max 800%), at least 3 hours, on quarter hours, all amounts or all percentages. Needs --daily-budget in the same command (the current one, on update). Example: --budget-boost 2027-11-27T00:00Z..2027-11-28T00:00Z=+50%\",\n },\n} as const;\n\nconst CLEAR_FLAGS: Readonly<Record<string, string>> = {\n \"daily-min-spend\": \"dailyMinSpendTarget\",\n \"daily-spend-cap\": \"dailySpendCap\",\n \"lifetime-min-spend\": \"lifetimeMinSpendTarget\",\n \"lifetime-spend-cap\": \"lifetimeSpendCap\",\n schedule: \"adset_schedule\",\n boosts: \"budgetSchedules\",\n \"budget-boost\": \"budgetSchedules\",\n};\n\nconst NOT_CLEARABLE: Readonly<Record<string, string>> = {\n \"min-roas\":\n \"a ROAS floor goes with ROAS goal bidding — switch --bid-strategy (e.g. LOWEST_COST_WITHOUT_CAP) and Baker drops the floor\",\n \"frequency-cap\":\n \"Meta keeps a frequency cap on a reach ad set whatever is sent (an empty cap is accepted and ignored) — set another with --frequency-cap\",\n};\n\n/**\n * What `--clear` takes away (repeatable or comma-separated), named by the\n * flag that set it. A campaign clears only its budget boosts.\n */\nexport function clearFromFlags(\n rawArgs: readonly string[] | undefined,\n entity: \"adSet\" | \"campaign\",\n): string[] | undefined {\n const names = repeatedValues(rawArgs, \"clear\", undefined)\n .flatMap((value) => value.split(\",\"))\n .map((value) => value.trim().toLowerCase())\n .filter(Boolean);\n if (names.length === 0) return undefined;\n const fields = names.map((name) => {\n const why = NOT_CLEARABLE[name];\n if (why) throw new Error(`--clear ${name}: ${why}`);\n const field = CLEAR_FLAGS[name];\n if (!field || (entity === \"campaign\" && field !== \"budgetSchedules\")) {\n const takes = entity === \"campaign\" ? \"boosts\" : Object.keys(CLEAR_FLAGS).join(\", \");\n throw new Error(`--clear takes ${takes} — not \"${name}\"`);\n }\n return field;\n });\n return [...new Set(fields)];\n}\n\nexport const clearArg = {\n clear: {\n type: \"string\",\n description:\n \"Take a delivery control away (repeatable or comma-separated): daily-min-spend, daily-spend-cap, lifetime-min-spend, lifetime-spend-cap, schedule (back to standard pacing), boosts (every budget boost it has now). A ROAS floor goes by switching --bid-strategy; Meta keeps a reach ad set's frequency cap.\",\n },\n} as const;\n"],"mappings":";;;;;;;;;;AAaA,SAAS,KAAK,OAAoC;AAChD,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAGA,SAAS,iBAAiB,OAAuD;AAC/E,QAAM,MAAM,KAAK,KAAK;AACtB,MAAI,QAAQ,QAAW;AACrB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,6BAA6B,KAAK,IAAI,KAAK,CAAC;AAC1D,MAAI,CAAC,OAAO;AACV;AAAA,MACE,kGAA6F,GAAG;AAAA,IAClG;AAAA,EACF;AACA,SAAO,CAAC,EAAE,OAAO,eAAe,eAAe,OAAO,MAAM,CAAC,CAAC,GAAG,eAAe,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC;AACpG;AAEA,IAAM,YAAoC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE;AAEnG,SAAS,SAAS,MAAc,MAAsB;AACpD,QAAM,QAAQ,UAAU,KAAK,MAAM,GAAG,CAAC,EAAE,YAAY,CAAC;AACtD,MAAI,UAAU,QAAW;AACvB,wBAAoB,GAAG,IAAI,MAAM,IAAI,gDAAsC;AAAA,EAC7E;AACA,SAAO;AACT;AAGA,SAAS,aAAa,MAAwB;AAC5C,MAAI,4BAA4B,KAAK,IAAI,GAAG;AAC1C,WAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAC7B;AACA,SAAO,KAAK,MAAM,GAAG,EAAE,QAAQ,CAAC,SAAS;AACvC,UAAM,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;AAC1D,QAAI,CAAC,MAAM;AACT,aAAO,CAAC;AAAA,IACV;AACA,UAAM,QAAQ,SAAS,MAAM,YAAY;AACzC,QAAI,CAAC,IAAI;AACP,aAAO,CAAC,KAAK;AAAA,IACf;AACA,UAAM,MAAM,SAAS,IAAI,YAAY;AACrC,UAAM,OAAiB,CAAC;AACxB,aAAS,MAAM,OAAO,KAAK,SAAS,GAAG,OAAO,MAAM,KAAK,GAAG;AAC1D,WAAK,KAAK,GAAG;AACb,UAAI,QAAQ,IAAK;AAAA,IACnB;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,WAAW,OAAuB;AACzC,QAAM,CAAC,QAAQ,IAAI,UAAU,GAAG,IAAI,MAAM,MAAM,GAAG;AACnD,SAAO,OAAO,KAAK,IAAI,KAAK,OAAO,OAAO;AAC5C;AAGA,SAAS,cAAc,KAAa,UAA2C;AAC7E,QAAM,QAAQ,4DAA4D,KAAK,IAAI,KAAK,CAAC;AACzF,MAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG;AACzC;AAAA,MACE,8FAA8F,GAAG;AAAA,IACnG;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM,aAAa,MAAM,CAAC,CAAC;AAAA,IAC3B,cAAc,WAAW,MAAM,CAAC,CAAC;AAAA,IACjC,YAAY,WAAW,MAAM,CAAC,CAAC;AAAA,IAC/B,eAAe;AAAA,EACjB;AACF;AAGO,SAAS,oBAAoB,MAAY,SAA+D;AAC7G,QAAM,SAAS,eAAe,SAAS,YAAY,KAAK,QAAQ,EAAE,IAAI,CAAC,UAAU;AAC/E,UAAM,EAAE,eAAe,QAAQ,GAAG,KAAK,IAAI,cAAc,OAAO,MAAM;AACtE,WAAO;AAAA,EACT,CAAC;AACD,SAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AAEA,SAAS,iBAAiB,OAAwB;AAChD,QAAM,MAAM,KAAK,KAAK,GAAG,YAAY;AACrC,MAAI,QAAQ,UAAa,QAAQ,YAAY,QAAQ,QAAQ;AAC3D,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,aAAa,QAAQ,cAAc;AAC7C,WAAO;AAAA,EACT;AACA,sBAAoB,qDAAqD,GAAG,IAAI;AAClF;AAEA,IAAM,qBAA6C;AAAA,EACjD,OAAO;AAAA,EACP,MAAM;AAAA,EACN,cAAc;AAAA,EACd,oBAAoB;AACtB;AAGA,SAAS,gBAAgB,OAAuD;AAC9E,QAAM,MAAM,KAAK,KAAK;AACtB,MAAI,QAAQ,QAAW;AACrB,WAAO;AAAA,EACT;AACA,SAAO,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,WAAW;AACpC,UAAM,QAAQ,sBAAsB,KAAK,OAAO,KAAK,CAAC;AACtD,UAAM,QAAQ,QAAQ,CAAC,IAAI,mBAAmB,MAAM,CAAC,EAAE,YAAY,CAAC,IAAI;AACxE,QAAI,CAAC,SAAS,CAAC,OAAO;AACpB,0BAAoB,2EAA2E,MAAM,IAAI;AAAA,IAC3G;AACA,WAAO,EAAE,YAAY,OAAO,aAAa,OAAO,MAAM,CAAC,CAAC,EAAE;AAAA,EAC5D,CAAC;AACH;AAEA,SAAS,UAAU,OAAgB,MAAkC;AACnE,QAAM,MAAM,KAAK,KAAK;AACtB,MAAI,QAAQ,QAAW;AACrB,WAAO;AAAA,EACT;AACA,QAAM,IAAI,OAAO,GAAG;AACpB,MAAI,CAAC,OAAO,SAAS,CAAC,GAAG;AACvB,wBAAoB,GAAG,IAAI,mBAAmB;AAAA,EAChD;AACA,SAAO;AACT;AAGO,SAAS,uBAAuB,MAAY,SAAiE;AAClH,QAAM,WAAW,iBAAiB,KAAK,mBAAmB,CAAC;AAC3D,QAAM,SAAS,eAAe,SAAS,YAAY,KAAK,QAAQ,EAAE,IAAI,CAAC,UAAU,cAAc,OAAO,QAAQ,CAAC;AAC/G,MAAI,KAAK,mBAAmB,MAAM,UAAa,OAAO,WAAW,GAAG;AAClE;AAAA,MACE;AAAA,IACF;AAAA,EACF;AACA,QAAM,WAAoC;AAAA,IACxC,SAAS,UAAU,KAAK,UAAU,GAAG,YAAY;AAAA,IACjD,yBAAyB,iBAAiB,KAAK,eAAe,CAAC;AAAA,IAC/D,gBAAgB,OAAO,SAAS,IAAI,SAAS;AAAA,IAC7C,QAAQ,KAAK,KAAK,MAAM,GAAG,YAAY;AAAA,IACvC,qBAAqB,eAAe,KAAK,iBAAiB,GAAG,KAAK,UAAU,mBAAmB;AAAA,IAC/F,eAAe,eAAe,KAAK,iBAAiB,GAAG,KAAK,UAAU,mBAAmB;AAAA,IACzF,wBAAwB,eAAe,KAAK,oBAAoB,GAAG,KAAK,UAAU,sBAAsB;AAAA,IACxG,kBAAkB,eAAe,KAAK,oBAAoB,GAAG,KAAK,UAAU,sBAAsB;AAAA,IAClG,qBAAqB,KAAK,kBAAkB,MAAM,SAAY,SAAY,QAAQ,KAAK,kBAAkB,CAAC;AAAA,IAC1G,kBAAkB,gBAAgB,KAAK,WAAW;AAAA,EACpD;AACA,SAAO,OAAO,YAAY,OAAO,QAAQ,QAAQ,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS,CAAC;AAC/F;AAGA,SAAS,YAAY,KAAa,UAA4C;AAC5E,QAAM,QAAQ,8CAA8C,KAAK,IAAI,KAAK,CAAC;AAC3E,MAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG;AACzC;AAAA,MACE,yHAAyH,GAAG;AAAA,IAC9H;AAAA,EACF;AACA,QAAM,SAAS;AAAA,IACb,YAAY,cAAc,MAAM,CAAC,GAAG,sBAAsB;AAAA,IAC1D,UAAU,cAAc,MAAM,CAAC,GAAG,oBAAoB;AAAA,EACxD;AACA,SAAO,MAAM,CAAC,MAAM,MAChB,EAAE,GAAG,QAAQ,iBAAiB,OAAO,MAAM,CAAC,CAAC,EAAE,IAC/C,EAAE,GAAG,QAAQ,UAAU,eAAe,MAAM,CAAC,GAAG,UAAU,gBAAgB,EAAE;AAClF;AAGO,SAAS,sBAAsB,MAAY,SAA+D;AAC/G,QAAM,SAAS,eAAe,SAAS,gBAAgB,KAAK,cAAc,CAAC;AAC3E,SAAO,OAAO,SAAS,IAAI,OAAO,IAAI,CAAC,UAAU,YAAY,OAAO,KAAK,QAAQ,CAAC,IAAI;AACxF;AAGA,SAAS,UAAU,KAAsC;AACvD,QAAM,QAAQ,wBAAwB,KAAK,IAAI,KAAK,CAAC;AACrD,MAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG;AACzC;AAAA,MACE,sGAAsG,GAAG;AAAA,IAC3G;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI,MAAM,CAAC;AAAA,IACX,YAAY,cAAc,MAAM,CAAC,GAAG,oBAAoB;AAAA,IACxD,UAAU,cAAc,MAAM,CAAC,GAAG,kBAAkB;AAAA,EACtD;AACF;AAGO,SAAS,oBAAoB,MAAY,SAAiE;AAC/G,QAAM,UAAU,eAAe,SAAS,gBAAgB,KAAK,cAAc,CAAC,EACzE,QAAQ,CAAC,UAAU,MAAM,MAAM,GAAG,CAAC,EACnC,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO;AACjB,QAAM,QAAQ,eAAe,SAAS,cAAc,KAAK,YAAY,CAAC;AACtE,SAAO;AAAA,IACL,GAAI,QAAQ,SAAS,IAAI,EAAE,cAAc,QAAQ,IAAI,CAAC;AAAA,IACtD,GAAI,MAAM,SAAS,IAAI,EAAE,YAAY,MAAM,IAAI,SAAS,EAAE,IAAI,CAAC;AAAA,EACjE;AACF;AAEO,IAAM,gBAAgB;AAAA,EAC3B,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AACF;AAGO,IAAM,oBAAoB;AAAA,EAC/B,YAAY;AAAA,IACV,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,qBAAqB;AAAA,IACnB,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,sBAAsB;AAAA,IACpB,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,sBAAsB;AAAA,IACpB,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AACF;AAEO,IAAM,iBAAiB;AAAA,EAC5B,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AACF;AAEA,IAAM,cAAgD;AAAA,EACpD,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,gBAAgB;AAClB;AAEA,IAAM,gBAAkD;AAAA,EACtD,YACE;AAAA,EACF,iBACE;AACJ;AAMO,SAAS,eACd,SACA,QACsB;AACtB,QAAM,QAAQ,eAAe,SAAS,SAAS,MAAS,EACrD,QAAQ,CAAC,UAAU,MAAM,MAAM,GAAG,CAAC,EACnC,IAAI,CAAC,UAAU,MAAM,KAAK,EAAE,YAAY,CAAC,EACzC,OAAO,OAAO;AACjB,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,SAAS,MAAM,IAAI,CAAC,SAAS;AACjC,UAAM,MAAM,cAAc,IAAI;AAC9B,QAAI,IAAK,OAAM,IAAI,MAAM,WAAW,IAAI,KAAK,GAAG,EAAE;AAClD,UAAM,QAAQ,YAAY,IAAI;AAC9B,QAAI,CAAC,SAAU,WAAW,cAAc,UAAU,mBAAoB;AACpE,YAAM,QAAQ,WAAW,aAAa,WAAW,OAAO,KAAK,WAAW,EAAE,KAAK,IAAI;AACnF,YAAM,IAAI,MAAM,iBAAiB,KAAK,gBAAW,IAAI,GAAG;AAAA,IAC1D;AACA,WAAO;AAAA,EACT,CAAC;AACD,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;AAC5B;AAEO,IAAM,WAAW;AAAA,EACtB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AACF;","names":[]}
@@ -1,3 +1,6 @@
1
+ import {
2
+ hubspotRefusal
3
+ } from "./chunk-MXH35PJ5.js";
1
4
  import {
2
5
  collectSideEffects,
3
6
  readFlowTree,
@@ -5,9 +8,6 @@ import {
5
8
  walkNodes,
6
9
  writeFlowTree
7
10
  } from "./chunk-IJ22WP3G.js";
8
- import {
9
- hubspotRefusal
10
- } from "./chunk-MXH35PJ5.js";
11
11
  import {
12
12
  failApi
13
13
  } from "./chunk-TP7HKSBX.js";
@@ -544,4 +544,4 @@ export {
544
544
  destinationRefusal,
545
545
  connectCommand
546
546
  };
547
- //# sourceMappingURL=chunk-OWA7ZLC4.js.map
547
+ //# sourceMappingURL=chunk-D4CKCNGW.js.map
@@ -5,13 +5,13 @@ import {
5
5
  OUTPUT_ARGS,
6
6
  writeProviderHits
7
7
  } from "./chunk-MJQBXFW6.js";
8
- import {
9
- emptyResultHints
10
- } from "./chunk-Q6ULQMWG.js";
11
8
  import {
12
9
  AUTO_INGEST_MAX,
13
10
  parseAutoIngest
14
11
  } from "./chunk-KKJ4KJCW.js";
12
+ import {
13
+ emptyResultHints
14
+ } from "./chunk-Q6ULQMWG.js";
15
15
  import {
16
16
  ApiError,
17
17
  apiPost
@@ -136,4 +136,4 @@ export {
136
136
  logoCommand,
137
137
  fetchBrandLogo
138
138
  };
139
- //# sourceMappingURL=chunk-H5HDZ7IC.js.map
139
+ //# sourceMappingURL=chunk-DCBZ5CHZ.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  finalOutputLabelsFromCanvas
3
- } from "./chunk-UWXDNVS5.js";
3
+ } from "./chunk-ZJSGGJ5R.js";
4
4
  import {
5
5
  readRenderState
6
- } from "./chunk-FUKDI2UK.js";
6
+ } from "./chunk-3W6G6ARX.js";
7
7
  import {
8
8
  STATIC_AD_ROLE,
9
9
  fixBriefNode,
@@ -14,7 +14,7 @@ import {
14
14
  plateFixPrompt,
15
15
  sameTag,
16
16
  seriesMemberAd
17
- } from "./chunk-AVNSH2JE.js";
17
+ } from "./chunk-KOXDXSKN.js";
18
18
  import {
19
19
  fetchRunRecord
20
20
  } from "./chunk-PA4W7BCQ.js";
@@ -42,7 +42,7 @@ import {
42
42
  relaidPictureRole,
43
43
  rolesById,
44
44
  staticMasterFormat
45
- } from "./chunk-62JQQUAU.js";
45
+ } from "./chunk-JQH5VG6F.js";
46
46
  import {
47
47
  isAdSpec,
48
48
  readAdSpec
@@ -939,4 +939,4 @@ export {
939
939
  writeSeriesMemberCanvas,
940
940
  seriesRunHints
941
941
  };
942
- //# sourceMappingURL=chunk-C6EYCD5J.js.map
942
+ //# sourceMappingURL=chunk-FVHJCERJ.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  classifyAudience
3
- } from "./chunk-KPYDTIAI.js";
3
+ } from "./chunk-2WZI36D3.js";
4
4
 
5
5
  // src/audience-names.ts
6
6
  var BUYERS_QUESTION = `\`name\` is the name an advertiser gave a custom audience in their Meta ad account, in any language. Is it made of people who have already bought from the brand: purchasers, paying customers, clients, a customer list? People who only visited, engaged, signed up, started a checkout or are leads or prospects have not bought. A lookalike of buyers is not buyers.`;
@@ -74,4 +74,4 @@ export {
74
74
  flattenViewerRows,
75
75
  audienceNamesOf
76
76
  };
77
- //# sourceMappingURL=chunk-BITS62MF.js.map
77
+ //# sourceMappingURL=chunk-G6XKD7QE.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  heldRules
3
- } from "./chunk-2XRMPSEV.js";
3
+ } from "./chunk-LXQB4ZGE.js";
4
4
  import {
5
5
  companyLine,
6
6
  readCompanyReading
@@ -9,7 +9,7 @@ import {
9
9
  adSetViewerRows,
10
10
  audienceNamesOf,
11
11
  readAudienceNames
12
- } from "./chunk-BITS62MF.js";
12
+ } from "./chunk-G6XKD7QE.js";
13
13
  import {
14
14
  rememberedJev,
15
15
  updateLockedFile
@@ -39,7 +39,7 @@ import {
39
39
  describeMarket,
40
40
  marketFromCompanyDoc,
41
41
  viewerFromKnowledge
42
- } from "./chunk-KPYDTIAI.js";
42
+ } from "./chunk-2WZI36D3.js";
43
43
  import {
44
44
  askJev
45
45
  } from "./chunk-DWX44QL6.js";
@@ -828,4 +828,4 @@ export {
828
828
  viewerCheckBeforeRender,
829
829
  viewerCheckCommand
830
830
  };
831
- //# sourceMappingURL=chunk-QE3JEJXF.js.map
831
+ //# sourceMappingURL=chunk-GSZZLW5Q.js.map