@koda-sl/baker-cli 0.384.0-dev.4699b7308 → 0.384.0-dev.557795bef

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 (964) hide show
  1. package/README.md +1098 -217
  2. package/canvas/tiktok-captions-composition/index.html +5 -6
  3. package/canvas/tiktok-captions-composition/meta.json +5 -0
  4. package/dist/account-4UEZAY5T.js +49 -0
  5. package/dist/account-4UEZAY5T.js.map +1 -0
  6. package/dist/account-OINZG6UP.js +80 -0
  7. package/dist/account-OINZG6UP.js.map +1 -0
  8. package/dist/account-QMDCUUSG.js +79 -0
  9. package/dist/account-QMDCUUSG.js.map +1 -0
  10. package/dist/account-reads-ZKKDYHK5.js +218 -0
  11. package/dist/account-reads-ZKKDYHK5.js.map +1 -0
  12. package/dist/account-writes-N4JDIDRB.js +66 -0
  13. package/dist/account-writes-N4JDIDRB.js.map +1 -0
  14. package/dist/accounts-AEBQFCNH.js +114 -0
  15. package/dist/accounts-AEBQFCNH.js.map +1 -0
  16. package/dist/accounts-EBGJ2YO7.js +611 -0
  17. package/dist/accounts-EBGJ2YO7.js.map +1 -0
  18. package/dist/accounts-HP4BLKK5.js +75 -0
  19. package/dist/accounts-HP4BLKK5.js.map +1 -0
  20. package/dist/accounts-YE2SQ3UQ.js +77 -0
  21. package/dist/accounts-YE2SQ3UQ.js.map +1 -0
  22. package/dist/accounts-Z4CLGQXJ.js +115 -0
  23. package/dist/accounts-Z4CLGQXJ.js.map +1 -0
  24. package/dist/actions-ADRIEQZX.js +55 -0
  25. package/dist/actions-ADRIEQZX.js.map +1 -0
  26. package/dist/active-entities-YB46ADQN.js +103 -0
  27. package/dist/active-entities-YB46ADQN.js.map +1 -0
  28. package/dist/activities-DUAIQJLN.js +74 -0
  29. package/dist/activities-DUAIQJLN.js.map +1 -0
  30. package/dist/ad-group-writes-HL3EZ3BT.js +170 -0
  31. package/dist/ad-group-writes-HL3EZ3BT.js.map +1 -0
  32. package/dist/ad-groups-FGS5JJGN.js +68 -0
  33. package/dist/ad-groups-FGS5JJGN.js.map +1 -0
  34. package/dist/ad-writes-LX4ACUHB.js +174 -0
  35. package/dist/ad-writes-LX4ACUHB.js.map +1 -0
  36. package/dist/add-5CUXNOUM.js +97 -0
  37. package/dist/add-5CUXNOUM.js.map +1 -0
  38. package/dist/add-6OXOQNET.js +302 -0
  39. package/dist/add-6OXOQNET.js.map +1 -0
  40. package/dist/add-E66HBIZV.js +105 -0
  41. package/dist/add-E66HBIZV.js.map +1 -0
  42. package/dist/add-ROK3ETQC.js +104 -0
  43. package/dist/add-ROK3ETQC.js.map +1 -0
  44. package/dist/add-accounts-YME5SCXD.js +91 -0
  45. package/dist/add-accounts-YME5SCXD.js.map +1 -0
  46. package/dist/ads-65R3WMDU.js +128 -0
  47. package/dist/ads-65R3WMDU.js.map +1 -0
  48. package/dist/ads-O63J7BDF.js +113 -0
  49. package/dist/ads-O63J7BDF.js.map +1 -0
  50. package/dist/ads-TFZ5PXKS.js +77 -0
  51. package/dist/ads-TFZ5PXKS.js.map +1 -0
  52. package/dist/ads-XSVRH45E.js +40 -0
  53. package/dist/ads-XSVRH45E.js.map +1 -0
  54. package/dist/adsets-Y62JOOTV.js +176 -0
  55. package/dist/adsets-Y62JOOTV.js.map +1 -0
  56. package/dist/advertisers-AIC4QPEK.js +120 -0
  57. package/dist/advertisers-AIC4QPEK.js.map +1 -0
  58. package/dist/advertisers-LJ2HKJ4W.js +125 -0
  59. package/dist/advertisers-LJ2HKJ4W.js.map +1 -0
  60. package/dist/analytics-N4PGXXEQ.js +1976 -0
  61. package/dist/analytics-N4PGXXEQ.js.map +1 -0
  62. package/dist/analytics-X3DR3UVG.js +433 -0
  63. package/dist/analytics-X3DR3UVG.js.map +1 -0
  64. package/dist/animate-E3SKQ6SI.js +480 -0
  65. package/dist/animate-E3SKQ6SI.js.map +1 -0
  66. package/dist/assign-Y7HGSQVJ.js +77 -0
  67. package/dist/assign-Y7HGSQVJ.js.map +1 -0
  68. package/dist/audience-size-SWX5YJQF.js +94 -0
  69. package/dist/audience-size-SWX5YJQF.js.map +1 -0
  70. package/dist/audiences-5A6BCWSA.js +268 -0
  71. package/dist/audiences-5A6BCWSA.js.map +1 -0
  72. package/dist/audiences-6QOCASVV.js +78 -0
  73. package/dist/audiences-6QOCASVV.js.map +1 -0
  74. package/dist/audiences-O67NGIP5.js +85 -0
  75. package/dist/audiences-O67NGIP5.js.map +1 -0
  76. package/dist/audit-2KVLWSAI.js +151 -0
  77. package/dist/audit-2KVLWSAI.js.map +1 -0
  78. package/dist/audit-HWK24VXI.js +88 -0
  79. package/dist/audit-HWK24VXI.js.map +1 -0
  80. package/dist/autocomplete-JJSGC5WU.js +111 -0
  81. package/dist/autocomplete-JJSGC5WU.js.map +1 -0
  82. package/dist/avatars-XIEKQ77J.js +38 -0
  83. package/dist/avatars-XIEKQ77J.js.map +1 -0
  84. package/dist/bid-pricing-D2HGRWZL.js +99 -0
  85. package/dist/bid-pricing-D2HGRWZL.js.map +1 -0
  86. package/dist/brand-AYYWRGIE.js +22 -0
  87. package/dist/brand-AYYWRGIE.js.map +1 -0
  88. package/dist/brief-3HUIDK5F.js +490 -0
  89. package/dist/brief-3HUIDK5F.js.map +1 -0
  90. package/dist/businesses-65EWTK5E.js +53 -0
  91. package/dist/businesses-65EWTK5E.js.map +1 -0
  92. package/dist/campaign-groups-6HCYR2JX.js +95 -0
  93. package/dist/campaign-groups-6HCYR2JX.js.map +1 -0
  94. package/dist/campaign-writes-M6JLF5AC.js +170 -0
  95. package/dist/campaign-writes-M6JLF5AC.js.map +1 -0
  96. package/dist/campaign-writes-Y6QPRQ4E.js +165 -0
  97. package/dist/campaign-writes-Y6QPRQ4E.js.map +1 -0
  98. package/dist/campaigns-6SM2ZSIH.js +76 -0
  99. package/dist/campaigns-6SM2ZSIH.js.map +1 -0
  100. package/dist/campaigns-7RKJZRY2.js +107 -0
  101. package/dist/campaigns-7RKJZRY2.js.map +1 -0
  102. package/dist/campaigns-KRI25JDZ.js +109 -0
  103. package/dist/campaigns-KRI25JDZ.js.map +1 -0
  104. package/dist/campaigns-TD7ZB5DG.js +110 -0
  105. package/dist/campaigns-TD7ZB5DG.js.map +1 -0
  106. package/dist/canvas-DMYY2DWI.js +46 -0
  107. package/dist/canvas-DMYY2DWI.js.map +1 -0
  108. package/dist/capabilities-3WJTXS2O.js +144 -0
  109. package/dist/capabilities-3WJTXS2O.js.map +1 -0
  110. package/dist/cards-7HRC4UQQ.js +85 -0
  111. package/dist/cards-7HRC4UQQ.js.map +1 -0
  112. package/dist/catalog-N6MDMIVL.js +64 -0
  113. package/dist/catalog-N6MDMIVL.js.map +1 -0
  114. package/dist/catalogs-PB46L7FH.js +128 -0
  115. package/dist/catalogs-PB46L7FH.js.map +1 -0
  116. package/dist/changes-SASUQK62.js +135 -0
  117. package/dist/changes-SASUQK62.js.map +1 -0
  118. package/dist/chatgpt-JKBSAG25.js +47 -0
  119. package/dist/chatgpt-JKBSAG25.js.map +1 -0
  120. package/dist/chats-WRVSQQB2.js +262 -0
  121. package/dist/chats-WRVSQQB2.js.map +1 -0
  122. package/dist/chunk-2FGKJY63.js +455 -0
  123. package/dist/chunk-2FGKJY63.js.map +1 -0
  124. package/dist/chunk-2GVXNKAE.js +42 -0
  125. package/dist/chunk-2GVXNKAE.js.map +1 -0
  126. package/dist/chunk-2J3PTIQB.js +479 -0
  127. package/dist/chunk-2J3PTIQB.js.map +1 -0
  128. package/dist/chunk-2J7XC2NO.js +346 -0
  129. package/dist/chunk-2J7XC2NO.js.map +1 -0
  130. package/dist/{chunk-VLUGGVJL.js → chunk-2UFRHW3T.js} +12 -4
  131. package/dist/chunk-2UFRHW3T.js.map +1 -0
  132. package/dist/chunk-2Y5V23PU.js +29 -0
  133. package/dist/chunk-2Y5V23PU.js.map +1 -0
  134. package/dist/chunk-3ACMDRSE.js +39 -0
  135. package/dist/chunk-3ACMDRSE.js.map +1 -0
  136. package/dist/chunk-3EWF7VII.js +1079 -0
  137. package/dist/chunk-3EWF7VII.js.map +1 -0
  138. package/dist/chunk-3LYMIKKN.js +625 -0
  139. package/dist/chunk-3LYMIKKN.js.map +1 -0
  140. package/dist/chunk-3M6RNCDD.js +26 -0
  141. package/dist/chunk-3M6RNCDD.js.map +1 -0
  142. package/dist/chunk-3MDO4RR2.js +310 -0
  143. package/dist/chunk-3MDO4RR2.js.map +1 -0
  144. package/dist/chunk-3NPOIHSX.js +6667 -0
  145. package/dist/chunk-3NPOIHSX.js.map +1 -0
  146. package/dist/chunk-3SK7TWGP.js +103 -0
  147. package/dist/chunk-3SK7TWGP.js.map +1 -0
  148. package/dist/chunk-3VXQYDJN.js +1743 -0
  149. package/dist/chunk-3VXQYDJN.js.map +1 -0
  150. package/dist/chunk-44VXKO65.js +106 -0
  151. package/dist/chunk-44VXKO65.js.map +1 -0
  152. package/dist/chunk-4NZ47VXO.js +137 -0
  153. package/dist/chunk-4NZ47VXO.js.map +1 -0
  154. package/dist/chunk-4X3UR372.js +225 -0
  155. package/dist/chunk-4X3UR372.js.map +1 -0
  156. package/dist/chunk-553XSIFW.js +304 -0
  157. package/dist/chunk-553XSIFW.js.map +1 -0
  158. package/dist/chunk-5FEBUCJU.js +25 -0
  159. package/dist/chunk-5FEBUCJU.js.map +1 -0
  160. package/dist/chunk-5HYSKH77.js +315 -0
  161. package/dist/chunk-5HYSKH77.js.map +1 -0
  162. package/dist/chunk-5MBPIONY.js +29 -0
  163. package/dist/chunk-5MBPIONY.js.map +1 -0
  164. package/dist/chunk-5UCP4EEQ.js +111 -0
  165. package/dist/chunk-5UCP4EEQ.js.map +1 -0
  166. package/dist/chunk-5VPJNNJL.js +494 -0
  167. package/dist/chunk-5VPJNNJL.js.map +1 -0
  168. package/dist/{chunk-VZEDAFAR.js → chunk-6YYSUISH.js} +47 -8
  169. package/dist/chunk-6YYSUISH.js.map +1 -0
  170. package/dist/chunk-7OHWEF3I.js +98 -0
  171. package/dist/chunk-7OHWEF3I.js.map +1 -0
  172. package/dist/chunk-A636XRD7.js +159 -0
  173. package/dist/chunk-A636XRD7.js.map +1 -0
  174. package/dist/chunk-A76FRBSF.js +297 -0
  175. package/dist/chunk-A76FRBSF.js.map +1 -0
  176. package/dist/chunk-AADVCEL4.js +817 -0
  177. package/dist/chunk-AADVCEL4.js.map +1 -0
  178. package/dist/chunk-AG62YO7C.js +96 -0
  179. package/dist/chunk-AG62YO7C.js.map +1 -0
  180. package/dist/chunk-AIRIT4GF.js +75 -0
  181. package/dist/chunk-AIRIT4GF.js.map +1 -0
  182. package/dist/chunk-AMCY5YCB.js +206 -0
  183. package/dist/chunk-AMCY5YCB.js.map +1 -0
  184. package/dist/chunk-AP3TP6VG.js +139 -0
  185. package/dist/chunk-AP3TP6VG.js.map +1 -0
  186. package/dist/chunk-APP475IQ.js +474 -0
  187. package/dist/chunk-APP475IQ.js.map +1 -0
  188. package/dist/chunk-AR7PU7BB.js +76 -0
  189. package/dist/chunk-AR7PU7BB.js.map +1 -0
  190. package/dist/chunk-B4S72KSS.js +172 -0
  191. package/dist/chunk-B4S72KSS.js.map +1 -0
  192. package/dist/chunk-BIPIL4QA.js +486 -0
  193. package/dist/chunk-BIPIL4QA.js.map +1 -0
  194. package/dist/chunk-BPUSL5Y2.js +58 -0
  195. package/dist/chunk-BPUSL5Y2.js.map +1 -0
  196. package/dist/chunk-BR32GHYD.js +65 -0
  197. package/dist/chunk-BR32GHYD.js.map +1 -0
  198. package/dist/chunk-CAMX6OHF.js +3182 -0
  199. package/dist/chunk-CAMX6OHF.js.map +1 -0
  200. package/dist/{chunk-MF7YA62W.js → chunk-CUL3VB4L.js} +10 -5
  201. package/dist/chunk-CUL3VB4L.js.map +1 -0
  202. package/dist/chunk-CVEY353K.js +66 -0
  203. package/dist/chunk-CVEY353K.js.map +1 -0
  204. package/dist/chunk-CWXADUKL.js +1599 -0
  205. package/dist/chunk-CWXADUKL.js.map +1 -0
  206. package/dist/chunk-D5FY4FAK.js +24 -0
  207. package/dist/chunk-D5FY4FAK.js.map +1 -0
  208. package/dist/chunk-DGCUPJZD.js +39 -0
  209. package/dist/chunk-DGCUPJZD.js.map +1 -0
  210. package/dist/chunk-DNCLWSHO.js +41 -0
  211. package/dist/chunk-DNCLWSHO.js.map +1 -0
  212. package/dist/chunk-DUPURL26.js +97 -0
  213. package/dist/chunk-DUPURL26.js.map +1 -0
  214. package/dist/chunk-E2ZOSNF5.js +96 -0
  215. package/dist/chunk-E2ZOSNF5.js.map +1 -0
  216. package/dist/chunk-E3HYHT7C.js +274 -0
  217. package/dist/chunk-E3HYHT7C.js.map +1 -0
  218. package/dist/chunk-EDLZGTGN.js +216 -0
  219. package/dist/chunk-EDLZGTGN.js.map +1 -0
  220. package/dist/chunk-EI5QN4UO.js +363 -0
  221. package/dist/chunk-EI5QN4UO.js.map +1 -0
  222. package/dist/{chunk-XHC4LMK4.js → chunk-EIGXX6KI.js} +16 -8
  223. package/dist/chunk-EIGXX6KI.js.map +1 -0
  224. package/dist/chunk-EPDE7ZRU.js +174 -0
  225. package/dist/chunk-EPDE7ZRU.js.map +1 -0
  226. package/dist/chunk-ERSX3MKH.js +34 -0
  227. package/dist/chunk-ERSX3MKH.js.map +1 -0
  228. package/dist/chunk-EVDRF4CI.js +509 -0
  229. package/dist/chunk-EVDRF4CI.js.map +1 -0
  230. package/dist/chunk-F4IEILTR.js +382 -0
  231. package/dist/chunk-F4IEILTR.js.map +1 -0
  232. package/dist/chunk-F7HRLPR5.js +67 -0
  233. package/dist/chunk-F7HRLPR5.js.map +1 -0
  234. package/dist/chunk-FEG6MN4H.js +84 -0
  235. package/dist/chunk-FEG6MN4H.js.map +1 -0
  236. package/dist/chunk-FKOECEVC.js +126 -0
  237. package/dist/chunk-FKOECEVC.js.map +1 -0
  238. package/dist/chunk-FMGW2NZI.js +106 -0
  239. package/dist/chunk-FMGW2NZI.js.map +1 -0
  240. package/dist/chunk-FPZKKNDK.js +98 -0
  241. package/dist/chunk-FPZKKNDK.js.map +1 -0
  242. package/dist/chunk-FUVCY63N.js +169 -0
  243. package/dist/chunk-FUVCY63N.js.map +1 -0
  244. package/dist/chunk-GBNJQNDS.js +19 -0
  245. package/dist/chunk-GBNJQNDS.js.map +1 -0
  246. package/dist/chunk-GIWHHCD6.js +145 -0
  247. package/dist/chunk-GIWHHCD6.js.map +1 -0
  248. package/dist/chunk-GOJXKIFQ.js +1605 -0
  249. package/dist/chunk-GOJXKIFQ.js.map +1 -0
  250. package/dist/chunk-GRQ2AXDX.js +9 -0
  251. package/dist/chunk-GRQ2AXDX.js.map +1 -0
  252. package/dist/chunk-GXDLWBOY.js +73 -0
  253. package/dist/chunk-GXDLWBOY.js.map +1 -0
  254. package/dist/chunk-HAE4WWFQ.js +455 -0
  255. package/dist/chunk-HAE4WWFQ.js.map +1 -0
  256. package/dist/chunk-I2DNBEV6.js +4227 -0
  257. package/dist/chunk-I2DNBEV6.js.map +1 -0
  258. package/dist/chunk-I4FTS5EE.js +455 -0
  259. package/dist/chunk-I4FTS5EE.js.map +1 -0
  260. package/dist/chunk-IELPT4K2.js +74 -0
  261. package/dist/chunk-IELPT4K2.js.map +1 -0
  262. package/dist/chunk-IJMWEO4P.js +57 -0
  263. package/dist/chunk-IJMWEO4P.js.map +1 -0
  264. package/dist/chunk-IREMSVKW.js +175 -0
  265. package/dist/chunk-IREMSVKW.js.map +1 -0
  266. package/dist/chunk-IVIJJXXT.js +62 -0
  267. package/dist/chunk-IVIJJXXT.js.map +1 -0
  268. package/dist/chunk-JD3W3ON7.js +188 -0
  269. package/dist/chunk-JD3W3ON7.js.map +1 -0
  270. package/dist/chunk-JLWBK3VC.js +5187 -0
  271. package/dist/chunk-JLWBK3VC.js.map +1 -0
  272. package/dist/chunk-JPK34QPS.js +134 -0
  273. package/dist/chunk-JPK34QPS.js.map +1 -0
  274. package/dist/chunk-JUY47NZ2.js +183 -0
  275. package/dist/chunk-JUY47NZ2.js.map +1 -0
  276. package/dist/chunk-JXMZEOHV.js +333 -0
  277. package/dist/chunk-JXMZEOHV.js.map +1 -0
  278. package/dist/chunk-K37K447U.js +51 -0
  279. package/dist/chunk-K37K447U.js.map +1 -0
  280. package/dist/chunk-K6TDB2KV.js +1442 -0
  281. package/dist/chunk-K6TDB2KV.js.map +1 -0
  282. package/dist/chunk-KIGGMKAE.js +66 -0
  283. package/dist/chunk-KIGGMKAE.js.map +1 -0
  284. package/dist/chunk-KKJ4KJCW.js +29 -0
  285. package/dist/chunk-KKJ4KJCW.js.map +1 -0
  286. package/dist/chunk-KONA5PSR.js +55 -0
  287. package/dist/chunk-KONA5PSR.js.map +1 -0
  288. package/dist/chunk-KVHRW7KO.js +60 -0
  289. package/dist/chunk-KVHRW7KO.js.map +1 -0
  290. package/dist/chunk-LA6PPSNA.js +65 -0
  291. package/dist/chunk-LA6PPSNA.js.map +1 -0
  292. package/dist/chunk-LKPJADL2.js +74 -0
  293. package/dist/chunk-LKPJADL2.js.map +1 -0
  294. package/dist/chunk-LWAEHLKV.js +74 -0
  295. package/dist/chunk-LWAEHLKV.js.map +1 -0
  296. package/dist/chunk-M6UNISGO.js +66 -0
  297. package/dist/chunk-M6UNISGO.js.map +1 -0
  298. package/dist/chunk-MIJAGBEP.js +23992 -0
  299. package/dist/chunk-MIJAGBEP.js.map +1 -0
  300. package/dist/chunk-MP4EXZ45.js +3151 -0
  301. package/dist/chunk-MP4EXZ45.js.map +1 -0
  302. package/dist/chunk-MYTDK3AL.js +2102 -0
  303. package/dist/chunk-MYTDK3AL.js.map +1 -0
  304. package/dist/chunk-MZQ5DX6S.js +125 -0
  305. package/dist/chunk-MZQ5DX6S.js.map +1 -0
  306. package/dist/chunk-NFSLRRIE.js +77 -0
  307. package/dist/chunk-NFSLRRIE.js.map +1 -0
  308. package/dist/chunk-NOK7MSVJ.js +533 -0
  309. package/dist/chunk-NOK7MSVJ.js.map +1 -0
  310. package/dist/chunk-NR5RZDAW.js +592 -0
  311. package/dist/chunk-NR5RZDAW.js.map +1 -0
  312. package/dist/chunk-O2EVJALZ.js +133 -0
  313. package/dist/chunk-O2EVJALZ.js.map +1 -0
  314. package/dist/chunk-O6UM5WWH.js +275 -0
  315. package/dist/chunk-O6UM5WWH.js.map +1 -0
  316. package/dist/chunk-O6XZIQXZ.js +6212 -0
  317. package/dist/chunk-O6XZIQXZ.js.map +1 -0
  318. package/dist/chunk-OIL6PU5W.js +35 -0
  319. package/dist/chunk-OIL6PU5W.js.map +1 -0
  320. package/dist/chunk-P4NSJS54.js +20 -0
  321. package/dist/chunk-P4NSJS54.js.map +1 -0
  322. package/dist/chunk-P5T7OZKV.js +26 -0
  323. package/dist/chunk-P5T7OZKV.js.map +1 -0
  324. package/dist/chunk-PFBQERWX.js +10 -0
  325. package/dist/chunk-PFBQERWX.js.map +1 -0
  326. package/dist/chunk-PSWVSLJU.js +56 -0
  327. package/dist/chunk-PSWVSLJU.js.map +1 -0
  328. package/dist/chunk-PY2NJ6XZ.js +191 -0
  329. package/dist/chunk-PY2NJ6XZ.js.map +1 -0
  330. package/dist/chunk-PZ4OM2LK.js +45 -0
  331. package/dist/chunk-PZ4OM2LK.js.map +1 -0
  332. package/dist/chunk-PZNOJ76W.js +541 -0
  333. package/dist/chunk-PZNOJ76W.js.map +1 -0
  334. package/dist/chunk-Q6ULQMWG.js +41 -0
  335. package/dist/chunk-Q6ULQMWG.js.map +1 -0
  336. package/dist/chunk-QKFD6PPX.js +57 -0
  337. package/dist/chunk-QKFD6PPX.js.map +1 -0
  338. package/dist/chunk-QMLGJ5OW.js +2891 -0
  339. package/dist/chunk-QMLGJ5OW.js.map +1 -0
  340. package/dist/chunk-R4TPDVBD.js +207 -0
  341. package/dist/chunk-R4TPDVBD.js.map +1 -0
  342. package/dist/chunk-R7QV5N2S.js +846 -0
  343. package/dist/chunk-R7QV5N2S.js.map +1 -0
  344. package/dist/chunk-RR3KT2E7.js +665 -0
  345. package/dist/chunk-RR3KT2E7.js.map +1 -0
  346. package/dist/chunk-SEPPFM5S.js +228 -0
  347. package/dist/chunk-SEPPFM5S.js.map +1 -0
  348. package/dist/chunk-SQ7DRYCC.js +150 -0
  349. package/dist/chunk-SQ7DRYCC.js.map +1 -0
  350. package/dist/chunk-SYULM665.js +610 -0
  351. package/dist/chunk-SYULM665.js.map +1 -0
  352. package/dist/chunk-TKT3OHZ6.js +170 -0
  353. package/dist/chunk-TKT3OHZ6.js.map +1 -0
  354. package/dist/chunk-TNOSX3PJ.js +136 -0
  355. package/dist/chunk-TNOSX3PJ.js.map +1 -0
  356. package/dist/chunk-TTVKI54A.js +160 -0
  357. package/dist/chunk-TTVKI54A.js.map +1 -0
  358. package/dist/chunk-U7ZVXFS3.js +23 -0
  359. package/dist/chunk-U7ZVXFS3.js.map +1 -0
  360. package/dist/chunk-UI6BKYQD.js +225 -0
  361. package/dist/chunk-UI6BKYQD.js.map +1 -0
  362. package/dist/chunk-UKLDW4UW.js +46 -0
  363. package/dist/chunk-UKLDW4UW.js.map +1 -0
  364. package/dist/chunk-V6XXXEXZ.js +76 -0
  365. package/dist/chunk-V6XXXEXZ.js.map +1 -0
  366. package/dist/chunk-V7BW2CIQ.js +92 -0
  367. package/dist/chunk-V7BW2CIQ.js.map +1 -0
  368. package/dist/chunk-VSU5R34H.js +76 -0
  369. package/dist/chunk-VSU5R34H.js.map +1 -0
  370. package/dist/chunk-W4SA4CMR.js +296 -0
  371. package/dist/chunk-W4SA4CMR.js.map +1 -0
  372. package/dist/chunk-WFUMNDCE.js +111 -0
  373. package/dist/chunk-WFUMNDCE.js.map +1 -0
  374. package/dist/chunk-WHWNXLTD.js +166 -0
  375. package/dist/chunk-WHWNXLTD.js.map +1 -0
  376. package/dist/chunk-WN4KX7GE.js +25 -0
  377. package/dist/chunk-WN4KX7GE.js.map +1 -0
  378. package/dist/chunk-XIY7P54H.js +84 -0
  379. package/dist/chunk-XIY7P54H.js.map +1 -0
  380. package/dist/chunk-YFPLNMPZ.js +337 -0
  381. package/dist/chunk-YFPLNMPZ.js.map +1 -0
  382. package/dist/chunk-YMBB4JBD.js +1830 -0
  383. package/dist/chunk-YMBB4JBD.js.map +1 -0
  384. package/dist/chunk-YQFM2P5W.js +197 -0
  385. package/dist/chunk-YQFM2P5W.js.map +1 -0
  386. package/dist/chunk-YQSBHWOI.js +41 -0
  387. package/dist/chunk-YTF3IVMF.js +149 -0
  388. package/dist/chunk-YTF3IVMF.js.map +1 -0
  389. package/dist/chunk-Z3ENMCFE.js +94 -0
  390. package/dist/chunk-Z3ENMCFE.js.map +1 -0
  391. package/dist/chunk-Z7MWSXLG.js +94 -0
  392. package/dist/chunk-Z7MWSXLG.js.map +1 -0
  393. package/dist/chunk-ZIXHS6AM.js +42 -0
  394. package/dist/chunk-ZIXHS6AM.js.map +1 -0
  395. package/dist/chunk-ZJ7TQUCU.js +4410 -0
  396. package/dist/chunk-ZJ7TQUCU.js.map +1 -0
  397. package/dist/chunk-ZNQRDLSS.js +52 -0
  398. package/dist/chunk-ZNQRDLSS.js.map +1 -0
  399. package/dist/claim-ROWH6JVB.js +197 -0
  400. package/dist/claim-ROWH6JVB.js.map +1 -0
  401. package/dist/cli.js +104 -69986
  402. package/dist/cli.js.map +1 -1
  403. package/dist/client-EURRWXPW.js +19 -0
  404. package/dist/code-FKQW7V7N.js +76 -0
  405. package/dist/code-FKQW7V7N.js.map +1 -0
  406. package/dist/companies-MD2MZKU6.js +195 -0
  407. package/dist/companies-MD2MZKU6.js.map +1 -0
  408. package/dist/complete-FCAJM6Z4.js +81 -0
  409. package/dist/complete-FCAJM6Z4.js.map +1 -0
  410. package/dist/config-OZOHIAOJ.js +88 -0
  411. package/dist/config-OZOHIAOJ.js.map +1 -0
  412. package/dist/connect-4YXFMXYX.js +42 -0
  413. package/dist/content-PCGSX2QU.js +85 -0
  414. package/dist/content-PCGSX2QU.js.map +1 -0
  415. package/dist/conversation-UX5NZ3IO.js +93 -0
  416. package/dist/conversation-UX5NZ3IO.js.map +1 -0
  417. package/dist/conversion-report-7QSWB2FY.js +125 -0
  418. package/dist/conversion-report-7QSWB2FY.js.map +1 -0
  419. package/dist/conversion-upload-command-XESIAQPU.js +438 -0
  420. package/dist/conversion-upload-command-XESIAQPU.js.map +1 -0
  421. package/dist/conversion-writes-BGOVLBS5.js +120 -0
  422. package/dist/conversion-writes-BGOVLBS5.js.map +1 -0
  423. package/dist/conversions-IYIWW4O7.js +76 -0
  424. package/dist/conversions-IYIWW4O7.js.map +1 -0
  425. package/dist/conversions-RLIJAE7E.js +135 -0
  426. package/dist/conversions-RLIJAE7E.js.map +1 -0
  427. package/dist/countries-5OBUVLLD.js +82 -0
  428. package/dist/countries-5OBUVLLD.js.map +1 -0
  429. package/dist/create-CUJLJUAQ.js +138 -0
  430. package/dist/create-CUJLJUAQ.js.map +1 -0
  431. package/dist/create-FENOT6DX.js +236 -0
  432. package/dist/create-FENOT6DX.js.map +1 -0
  433. package/dist/create-OFZQMOWO.js +59 -0
  434. package/dist/create-OFZQMOWO.js.map +1 -0
  435. package/dist/create-Z5SS2AWB.js +207 -0
  436. package/dist/create-Z5SS2AWB.js.map +1 -0
  437. package/dist/creatives-UJW2QBLH.js +182 -0
  438. package/dist/creatives-UJW2QBLH.js.map +1 -0
  439. package/dist/creatives-XI2DGQUZ.js +87 -0
  440. package/dist/creatives-XI2DGQUZ.js.map +1 -0
  441. package/dist/creatives-YLXQSROD.js +51 -0
  442. package/dist/creatives-YLXQSROD.js.map +1 -0
  443. package/dist/credentials-CH73QMD2.js +287 -0
  444. package/dist/credentials-CH73QMD2.js.map +1 -0
  445. package/dist/critique-C4WRQ4AJ.js +1449 -0
  446. package/dist/critique-C4WRQ4AJ.js.map +1 -0
  447. package/dist/critique-ZBNJ6MQ3.js +213 -0
  448. package/dist/critique-ZBNJ6MQ3.js.map +1 -0
  449. package/dist/crm-MJTT6GOJ.js +224 -0
  450. package/dist/crm-MJTT6GOJ.js.map +1 -0
  451. package/dist/crm-ZXHSEFYI.js +318 -0
  452. package/dist/crm-ZXHSEFYI.js.map +1 -0
  453. package/dist/crop-B52KIQ4O.js +113 -0
  454. package/dist/crop-B52KIQ4O.js.map +1 -0
  455. package/dist/currency-GGWF5DMU.js +88 -0
  456. package/dist/currency-GGWF5DMU.js.map +1 -0
  457. package/dist/custom-conversions-7WDBTC4X.js +125 -0
  458. package/dist/custom-conversions-7WDBTC4X.js.map +1 -0
  459. package/dist/customers-7E4HBSEY.js +56 -0
  460. package/dist/decide-PK7WNSQ2.js +199 -0
  461. package/dist/decide-PK7WNSQ2.js.map +1 -0
  462. package/dist/delete-56LKNEGA.js +71 -0
  463. package/dist/delete-56LKNEGA.js.map +1 -0
  464. package/dist/delete-DQY4ZSFN.js +54 -0
  465. package/dist/delete-DQY4ZSFN.js.map +1 -0
  466. package/dist/delete-EZ7HHOOD.js +69 -0
  467. package/dist/delete-EZ7HHOOD.js.map +1 -0
  468. package/dist/delete-JV4KAA6Y.js +66 -0
  469. package/dist/delete-JV4KAA6Y.js.map +1 -0
  470. package/dist/delete-YONJW4UZ.js +63 -0
  471. package/dist/delete-YONJW4UZ.js.map +1 -0
  472. package/dist/delete-YSYVFL6W.js +71 -0
  473. package/dist/delete-YSYVFL6W.js.map +1 -0
  474. package/dist/demographics-6N3TTYWC.js +138 -0
  475. package/dist/demographics-6N3TTYWC.js.map +1 -0
  476. package/dist/describe-AAVYIFE3.js +97 -0
  477. package/dist/describe-AAVYIFE3.js.map +1 -0
  478. package/dist/describe-UQFLWVFR.js +97 -0
  479. package/dist/describe-UQFLWVFR.js.map +1 -0
  480. package/dist/dimensions-QDXBG2XC.js +101 -0
  481. package/dist/dimensions-QDXBG2XC.js.map +1 -0
  482. package/dist/discard-S3NGGUSK.js +66 -0
  483. package/dist/discard-S3NGGUSK.js.map +1 -0
  484. package/dist/discover-6TEBPVNC.js +93 -0
  485. package/dist/discover-6TEBPVNC.js.map +1 -0
  486. package/dist/discover-SBZPB7T2.js +172 -0
  487. package/dist/discover-SBZPB7T2.js.map +1 -0
  488. package/dist/domain-AMAR76PB.js +98 -0
  489. package/dist/domain-AMAR76PB.js.map +1 -0
  490. package/dist/download-LV3GPOWV.js +299 -0
  491. package/dist/download-LV3GPOWV.js.map +1 -0
  492. package/dist/draft-6QZ7WMWM.js +217 -0
  493. package/dist/draft-6QZ7WMWM.js.map +1 -0
  494. package/dist/draft-DDFFTZ43.js +233 -0
  495. package/dist/draft-DDFFTZ43.js.map +1 -0
  496. package/dist/draft-FIKJXNIQ.js +281 -0
  497. package/dist/draft-FIKJXNIQ.js.map +1 -0
  498. package/dist/draft-GYGWTMBU.js +307 -0
  499. package/dist/draft-GYGWTMBU.js.map +1 -0
  500. package/dist/draft-KXL62WFS.js +328 -0
  501. package/dist/draft-KXL62WFS.js.map +1 -0
  502. package/dist/draft-N4LFPKTA.js +100 -0
  503. package/dist/draft-N4LFPKTA.js.map +1 -0
  504. package/dist/draft-POSLJCWG.js +306 -0
  505. package/dist/draft-POSLJCWG.js.map +1 -0
  506. package/dist/draft-XPO5RWST.js +103 -0
  507. package/dist/draft-XPO5RWST.js.map +1 -0
  508. package/dist/engine/index.d.ts +213 -127
  509. package/dist/engine/index.js +18 -4
  510. package/dist/{env-4P5HOGNA.js → env-TQ2XS2KY.js} +12 -2
  511. package/dist/env-TQ2XS2KY.js.map +1 -0
  512. package/dist/experiment-FQNKMORZ.js +1397 -0
  513. package/dist/experiment-FQNKMORZ.js.map +1 -0
  514. package/dist/export-4IZQZAPF.js +168 -0
  515. package/dist/export-4IZQZAPF.js.map +1 -0
  516. package/dist/extract-DZMGVQ7D.js +113 -0
  517. package/dist/extract-DZMGVQ7D.js.map +1 -0
  518. package/dist/facets-223V5P47.js +114 -0
  519. package/dist/facets-223V5P47.js.map +1 -0
  520. package/dist/favorites-DD2LNSTG.js +178 -0
  521. package/dist/favorites-DD2LNSTG.js.map +1 -0
  522. package/dist/feed-TUVFNX2U.js +177 -0
  523. package/dist/feed-TUVFNX2U.js.map +1 -0
  524. package/dist/feedback-MIW23MI2.js +66 -0
  525. package/dist/feedback-MIW23MI2.js.map +1 -0
  526. package/dist/feedback-record-RGKRKPGZ.js +175 -0
  527. package/dist/feedback-record-RGKRKPGZ.js.map +1 -0
  528. package/dist/fetch-O6UHNXWB.js +139 -0
  529. package/dist/fetch-O6UHNXWB.js.map +1 -0
  530. package/dist/fetch-TZ4UCMJK.js +176 -0
  531. package/dist/fetch-TZ4UCMJK.js.map +1 -0
  532. package/dist/find-4XKIBF4D.js +134 -0
  533. package/dist/find-4XKIBF4D.js.map +1 -0
  534. package/dist/fit-ODVVXV2Q.js +45 -0
  535. package/dist/fit-ODVVXV2Q.js.map +1 -0
  536. package/dist/flows-HVWBFZ7T.js +247 -0
  537. package/dist/flows-HVWBFZ7T.js.map +1 -0
  538. package/dist/follow-RCOXTZGY.js +94 -0
  539. package/dist/follow-RCOXTZGY.js.map +1 -0
  540. package/dist/follow-competitors-SQ5XBFTK.js +112 -0
  541. package/dist/follow-competitors-SQ5XBFTK.js.map +1 -0
  542. package/dist/following-VDU3BHC4.js +113 -0
  543. package/dist/following-VDU3BHC4.js.map +1 -0
  544. package/dist/fonts-NBIQAVQN.js +34 -0
  545. package/dist/fonts-NBIQAVQN.js.map +1 -0
  546. package/dist/forecast-2GJKBNBM.js +168 -0
  547. package/dist/forecast-2GJKBNBM.js.map +1 -0
  548. package/dist/forecast-76MUJBPO.js +104 -0
  549. package/dist/forecast-76MUJBPO.js.map +1 -0
  550. package/dist/funding-HTFVZLLG.js +85 -0
  551. package/dist/funding-HTFVZLLG.js.map +1 -0
  552. package/dist/funnel-FE2HIRVQ.js +394 -0
  553. package/dist/funnel-FE2HIRVQ.js.map +1 -0
  554. package/dist/ga4-2RC4EH7V.js +55 -0
  555. package/dist/ga4-2RC4EH7V.js.map +1 -0
  556. package/dist/generate-TPDOBCKQ.js +262 -0
  557. package/dist/generate-TPDOBCKQ.js.map +1 -0
  558. package/dist/get-6JNOVI27.js +56 -0
  559. package/dist/get-6JNOVI27.js.map +1 -0
  560. package/dist/get-FH2LIEYL.js +63 -0
  561. package/dist/get-FH2LIEYL.js.map +1 -0
  562. package/dist/get-GZLCDXXW.js +61 -0
  563. package/dist/get-GZLCDXXW.js.map +1 -0
  564. package/dist/get-KVAOPAQW.js +78 -0
  565. package/dist/get-KVAOPAQW.js.map +1 -0
  566. package/dist/get-TSPQYEKC.js +59 -0
  567. package/dist/get-TSPQYEKC.js.map +1 -0
  568. package/dist/get-TY3RXYNZ.js +63 -0
  569. package/dist/get-TY3RXYNZ.js.map +1 -0
  570. package/dist/get-VPW33XTN.js +92 -0
  571. package/dist/get-VPW33XTN.js.map +1 -0
  572. package/dist/gif-JFEYPFFI.js +94 -0
  573. package/dist/gif-JFEYPFFI.js.map +1 -0
  574. package/dist/google-R6RD4L6Z.js +136 -0
  575. package/dist/google-R6RD4L6Z.js.map +1 -0
  576. package/dist/google-VPQNRVIB.js +3190 -0
  577. package/dist/google-VPQNRVIB.js.map +1 -0
  578. package/dist/google-ads-JEQMNNMN.js +195 -0
  579. package/dist/google-ads-JEQMNNMN.js.map +1 -0
  580. package/dist/group-7AV6UL26.js +43 -0
  581. package/dist/group-7AV6UL26.js.map +1 -0
  582. package/dist/group-BVQZEZIC.js +43 -0
  583. package/dist/group-BVQZEZIC.js.map +1 -0
  584. package/dist/gsc-SQ42WAQE.js +30 -0
  585. package/dist/gsc-SQ42WAQE.js.map +1 -0
  586. package/dist/history-BNNHFURR.js +67 -0
  587. package/dist/history-BNNHFURR.js.map +1 -0
  588. package/dist/history-EHUQG4CE.js +133 -0
  589. package/dist/history-EHUQG4CE.js.map +1 -0
  590. package/dist/hubspot-JABE4USC.js +779 -0
  591. package/dist/hubspot-JABE4USC.js.map +1 -0
  592. package/dist/icon-OYTTSNSL.js +137 -0
  593. package/dist/icon-OYTTSNSL.js.map +1 -0
  594. package/dist/ideas-OD76WOQ3.js +32 -0
  595. package/dist/ideas-OD76WOQ3.js.map +1 -0
  596. package/dist/images-LY7AWWBK.js +90 -0
  597. package/dist/images-LY7AWWBK.js.map +1 -0
  598. package/dist/improve-W6GZNT2A.js +86 -0
  599. package/dist/improve-W6GZNT2A.js.map +1 -0
  600. package/dist/ingest-47WON6HT.js +23 -0
  601. package/dist/ingest-47WON6HT.js.map +1 -0
  602. package/dist/ingest-HDGGHBSJ.js +107 -0
  603. package/dist/ingest-HDGGHBSJ.js.map +1 -0
  604. package/dist/insights-IW7LGAWU.js +423 -0
  605. package/dist/insights-IW7LGAWU.js.map +1 -0
  606. package/dist/insights-QH54F56A.js +122 -0
  607. package/dist/insights-QH54F56A.js.map +1 -0
  608. package/dist/inspect-AJLG2HGL.js +189 -0
  609. package/dist/inspect-AJLG2HGL.js.map +1 -0
  610. package/dist/inspiration-RDQ3Y3N3.js +53 -0
  611. package/dist/inspiration-RDQ3Y3N3.js.map +1 -0
  612. package/dist/intent-5GSSCFZ2.js +95 -0
  613. package/dist/intent-5GSSCFZ2.js.map +1 -0
  614. package/dist/job-URVXJP75.js +202 -0
  615. package/dist/job-URVXJP75.js.map +1 -0
  616. package/dist/job-create-S4SECUVF.js +109 -0
  617. package/dist/job-create-S4SECUVF.js.map +1 -0
  618. package/dist/job-status-253SUCTJ.js +74 -0
  619. package/dist/job-status-253SUCTJ.js.map +1 -0
  620. package/dist/keep-GPSYDIGJ.js +78 -0
  621. package/dist/keep-GPSYDIGJ.js.map +1 -0
  622. package/dist/keyword-gap-NTFDX43B.js +130 -0
  623. package/dist/keyword-gap-NTFDX43B.js.map +1 -0
  624. package/dist/keyword-metrics-XSFLMBZX.js +197 -0
  625. package/dist/keyword-metrics-XSFLMBZX.js.map +1 -0
  626. package/dist/keywords-for-site-U4JLYXVE.js +128 -0
  627. package/dist/keywords-for-site-U4JLYXVE.js.map +1 -0
  628. package/dist/landing-AO72EGJ6.js +28 -0
  629. package/dist/landing-AO72EGJ6.js.map +1 -0
  630. package/dist/landings-NEF4PQL2.js +151 -0
  631. package/dist/landings-NEF4PQL2.js.map +1 -0
  632. package/dist/languages-3RDPPPTE.js +55 -0
  633. package/dist/languages-3RDPPPTE.js.map +1 -0
  634. package/dist/languages-CQX3YOIT.js +40 -0
  635. package/dist/languages-CQX3YOIT.js.map +1 -0
  636. package/dist/launches-GBHLJH5S.js +19 -0
  637. package/dist/launches-GBHLJH5S.js.map +1 -0
  638. package/dist/layerize-Q56C6LFG.js +190 -0
  639. package/dist/layerize-Q56C6LFG.js.map +1 -0
  640. package/dist/leads-JHUM6FYR.js +293 -0
  641. package/dist/leads-JHUM6FYR.js.map +1 -0
  642. package/dist/leads-UYZM2XQX.js +90 -0
  643. package/dist/leads-UYZM2XQX.js.map +1 -0
  644. package/dist/learn-D2KBGJHZ.js +203 -0
  645. package/dist/learn-D2KBGJHZ.js.map +1 -0
  646. package/dist/library-6VUFHTEK.js +109 -0
  647. package/dist/library-6VUFHTEK.js.map +1 -0
  648. package/dist/lighthouse-57U2GMPV.js +75 -0
  649. package/dist/lighthouse-57U2GMPV.js.map +1 -0
  650. package/dist/line-item-writes-R5GO6GTL.js +208 -0
  651. package/dist/line-item-writes-R5GO6GTL.js.map +1 -0
  652. package/dist/line-items-RBMH6YBZ.js +103 -0
  653. package/dist/line-items-RBMH6YBZ.js.map +1 -0
  654. package/dist/link-WS2RMCOP.js +64 -0
  655. package/dist/link-WS2RMCOP.js.map +1 -0
  656. package/dist/linkedin-FSIALZTS.js +1008 -0
  657. package/dist/linkedin-FSIALZTS.js.map +1 -0
  658. package/dist/list-2AE2Q4ZD.js +151 -0
  659. package/dist/list-2AE2Q4ZD.js.map +1 -0
  660. package/dist/list-E635Y6M4.js +303 -0
  661. package/dist/list-E635Y6M4.js.map +1 -0
  662. package/dist/list-G57ZO4PG.js +50 -0
  663. package/dist/list-G57ZO4PG.js.map +1 -0
  664. package/dist/list-JCSWZWDI.js +57 -0
  665. package/dist/list-JCSWZWDI.js.map +1 -0
  666. package/dist/list-KT6NXVLV.js +63 -0
  667. package/dist/list-KT6NXVLV.js.map +1 -0
  668. package/dist/list-RINCJOAC.js +76 -0
  669. package/dist/list-RINCJOAC.js.map +1 -0
  670. package/dist/list-SRNXHS6L.js +51 -0
  671. package/dist/list-SRNXHS6L.js.map +1 -0
  672. package/dist/list-YJSO4M5Q.js +65 -0
  673. package/dist/list-YJSO4M5Q.js.map +1 -0
  674. package/dist/locations-HW2Y5OJO.js +67 -0
  675. package/dist/locations-HW2Y5OJO.js.map +1 -0
  676. package/dist/locations-XOHI3VWI.js +40 -0
  677. package/dist/locations-XOHI3VWI.js.map +1 -0
  678. package/dist/log-3HX5BIO6.js +92 -0
  679. package/dist/log-3HX5BIO6.js.map +1 -0
  680. package/dist/logo-KXTGIYBI.js +18 -0
  681. package/dist/logo-KXTGIYBI.js.map +1 -0
  682. package/dist/lookup-X6O5UNJH.js +22 -0
  683. package/dist/lookup-X6O5UNJH.js.map +1 -0
  684. package/dist/make-QH77XOWM.js +633 -0
  685. package/dist/make-QH77XOWM.js.map +1 -0
  686. package/dist/map-QABBPYZM.js +404 -0
  687. package/dist/map-QABBPYZM.js.map +1 -0
  688. package/dist/mcp-HSD3W3OB.js +463 -0
  689. package/dist/mcp-HSD3W3OB.js.map +1 -0
  690. package/dist/media-MI4EE7L4.js +89 -0
  691. package/dist/media-MI4EE7L4.js.map +1 -0
  692. package/dist/media-QUTQOBA7.js +15 -0
  693. package/dist/media-QUTQOBA7.js.map +1 -0
  694. package/dist/media-sources-HO4DXRX5.js +32 -0
  695. package/dist/media-sources-HO4DXRX5.js.map +1 -0
  696. package/dist/members-YEYYJGY6.js +44 -0
  697. package/dist/members-YEYYJGY6.js.map +1 -0
  698. package/dist/meta-E3JOUOSS.js +69 -0
  699. package/dist/meta-E3JOUOSS.js.map +1 -0
  700. package/dist/metrics-HQ7XJAYQ.js +152 -0
  701. package/dist/metrics-HQ7XJAYQ.js.map +1 -0
  702. package/dist/models-PGX3FBHU.js +155 -0
  703. package/dist/models-PGX3FBHU.js.map +1 -0
  704. package/dist/normalize-FPJ6GSOY.js +806 -0
  705. package/dist/normalize-FPJ6GSOY.js.map +1 -0
  706. package/dist/normalize-GSQWN77S.js +141 -0
  707. package/dist/normalize-GSQWN77S.js.map +1 -0
  708. package/dist/options-F5XZMQLK.js +121 -0
  709. package/dist/options-F5XZMQLK.js.map +1 -0
  710. package/dist/output-GQFJ2T5B.js +24 -0
  711. package/dist/output-GQFJ2T5B.js.map +1 -0
  712. package/dist/page-VTTSBC6Y.js +105 -0
  713. package/dist/page-VTTSBC6Y.js.map +1 -0
  714. package/dist/pages-PMZVNVQM.js +66 -0
  715. package/dist/pages-PMZVNVQM.js.map +1 -0
  716. package/dist/performance-G67JQE5J.js +24 -0
  717. package/dist/performance-G67JQE5J.js.map +1 -0
  718. package/dist/pinterest-UDNGOWDM.js +96 -0
  719. package/dist/pinterest-UDNGOWDM.js.map +1 -0
  720. package/dist/pixels-OYZDGCH3.js +108 -0
  721. package/dist/pixels-OYZDGCH3.js.map +1 -0
  722. package/dist/pixels-XKGNTCFX.js +60 -0
  723. package/dist/pixels-XKGNTCFX.js.map +1 -0
  724. package/dist/plan-DZS3TVIJ.js +207 -0
  725. package/dist/plan-DZS3TVIJ.js.map +1 -0
  726. package/dist/preview-DR6MXOGI.js +169 -0
  727. package/dist/preview-DR6MXOGI.js.map +1 -0
  728. package/dist/profile-VOVZG44G.js +159 -0
  729. package/dist/profile-VOVZG44G.js.map +1 -0
  730. package/dist/promoted-tweet-writes-VCK2ADVJ.js +180 -0
  731. package/dist/promoted-tweet-writes-VCK2ADVJ.js.map +1 -0
  732. package/dist/promoted-tweets-4ACBP2RV.js +119 -0
  733. package/dist/promoted-tweets-4ACBP2RV.js.map +1 -0
  734. package/dist/properties-MKVF7MUK.js +101 -0
  735. package/dist/properties-MKVF7MUK.js.map +1 -0
  736. package/dist/publish-6XVA35T6.js +322 -0
  737. package/dist/publish-6XVA35T6.js.map +1 -0
  738. package/dist/query-CNWQ6STR.js +61 -0
  739. package/dist/query-CNWQ6STR.js.map +1 -0
  740. package/dist/query-DBSBZ73C.js +247 -0
  741. package/dist/query-DBSBZ73C.js.map +1 -0
  742. package/dist/query-QK4U4TEL.js +236 -0
  743. package/dist/query-QK4U4TEL.js.map +1 -0
  744. package/dist/questionnaire-OVJWNUVV.js +93 -0
  745. package/dist/questionnaire-OVJWNUVV.js.map +1 -0
  746. package/dist/read-L2QIVJTL.js +141 -0
  747. package/dist/read-L2QIVJTL.js.map +1 -0
  748. package/dist/reddit-SCEB2JQL.js +26 -0
  749. package/dist/reddit-SCEB2JQL.js.map +1 -0
  750. package/dist/refresh-TIH5Y3NP.js +94 -0
  751. package/dist/refresh-TIH5Y3NP.js.map +1 -0
  752. package/dist/release-LKMUKVXM.js +60 -0
  753. package/dist/release-LKMUKVXM.js.map +1 -0
  754. package/dist/relevant-pages-CRI2NLWG.js +99 -0
  755. package/dist/relevant-pages-CRI2NLWG.js.map +1 -0
  756. package/dist/remove-6ABOB7TZ.js +50 -0
  757. package/dist/remove-6ABOB7TZ.js.map +1 -0
  758. package/dist/remove-JKSCGKQG.js +48 -0
  759. package/dist/remove-JKSCGKQG.js.map +1 -0
  760. package/dist/reopen-27TDNXFP.js +63 -0
  761. package/dist/reopen-27TDNXFP.js.map +1 -0
  762. package/dist/rerun-XHECBJD5.js +84 -0
  763. package/dist/rerun-XHECBJD5.js.map +1 -0
  764. package/dist/research-4MOXIMDX.js +62 -0
  765. package/dist/research-4MOXIMDX.js.map +1 -0
  766. package/dist/research-XYXP7D4R.js +262 -0
  767. package/dist/research-XYXP7D4R.js.map +1 -0
  768. package/dist/reset-NLYEBPLX.js +54 -0
  769. package/dist/reset-NLYEBPLX.js.map +1 -0
  770. package/dist/reset-RDQOYBXX.js +54 -0
  771. package/dist/reset-RDQOYBXX.js.map +1 -0
  772. package/dist/resolve-VHKWC5KW.js +121 -0
  773. package/dist/resolve-VHKWC5KW.js.map +1 -0
  774. package/dist/retry-MTQSHXKH.js +60 -0
  775. package/dist/retry-MTQSHXKH.js.map +1 -0
  776. package/dist/retry-ZI5ECSFD.js +62 -0
  777. package/dist/retry-ZI5ECSFD.js.map +1 -0
  778. package/dist/retry-failed-2OYMCB55.js +45 -0
  779. package/dist/retry-failed-2OYMCB55.js.map +1 -0
  780. package/dist/run-BMJJRJL2.js +65 -0
  781. package/dist/run-BMJJRJL2.js.map +1 -0
  782. package/dist/run-IHXS6F5V.js +59 -0
  783. package/dist/run-IHXS6F5V.js.map +1 -0
  784. package/dist/scaffold-ad-QEADKYPL.js +1548 -0
  785. package/dist/scaffold-ad-QEADKYPL.js.map +1 -0
  786. package/dist/scaffold-static-ad-PTJ73ZNF.js +971 -0
  787. package/dist/scaffold-static-ad-PTJ73ZNF.js.map +1 -0
  788. package/dist/scaffold-video-ZQEZRVD6.js +872 -0
  789. package/dist/scaffold-video-ZQEZRVD6.js.map +1 -0
  790. package/dist/schedule-JD2EQJCT.js +61 -0
  791. package/dist/schedule-JD2EQJCT.js.map +1 -0
  792. package/dist/schedule-TLYT5UXM.js +66 -0
  793. package/dist/schedule-TLYT5UXM.js.map +1 -0
  794. package/dist/scheduled-agents-GIVKWTXX.js +49 -0
  795. package/dist/scheduled-agents-GIVKWTXX.js.map +1 -0
  796. package/dist/schema-MZTVCNP4.js +63 -0
  797. package/dist/schema-MZTVCNP4.js.map +1 -0
  798. package/dist/schema-RYTVKPLZ.js +132 -0
  799. package/dist/schema-RYTVKPLZ.js.map +1 -0
  800. package/dist/scrape-T3DA7ER7.js +2241 -0
  801. package/dist/scrape-T3DA7ER7.js.map +1 -0
  802. package/dist/screenshot-EIGC6SZB.js +102 -0
  803. package/dist/screenshot-EIGC6SZB.js.map +1 -0
  804. package/dist/search-2SVUDZIX.js +224 -0
  805. package/dist/search-2SVUDZIX.js.map +1 -0
  806. package/dist/search-34NFJ5F6.js +26 -0
  807. package/dist/search-34NFJ5F6.js.map +1 -0
  808. package/dist/search-AOFAN5NB.js +174 -0
  809. package/dist/search-AOFAN5NB.js.map +1 -0
  810. package/dist/search-BWE3OPOY.js +91 -0
  811. package/dist/search-BWE3OPOY.js.map +1 -0
  812. package/dist/search-EYYAOZND.js +92 -0
  813. package/dist/search-EYYAOZND.js.map +1 -0
  814. package/dist/search-copy-VKQ2OOBM.js +168 -0
  815. package/dist/search-copy-VKQ2OOBM.js.map +1 -0
  816. package/dist/seeds-HQYSVFIX.js +101 -0
  817. package/dist/seeds-HQYSVFIX.js.map +1 -0
  818. package/dist/select-HJMOAWAU.js +94 -0
  819. package/dist/select-HJMOAWAU.js.map +1 -0
  820. package/dist/sends-I7VQFE4S.js +309 -0
  821. package/dist/sends-I7VQFE4S.js.map +1 -0
  822. package/dist/sequences-JHSEJJGN.js +146 -0
  823. package/dist/sequences-JHSEJJGN.js.map +1 -0
  824. package/dist/set-prompt-TSS33JQZ.js +185 -0
  825. package/dist/set-prompt-TSS33JQZ.js.map +1 -0
  826. package/dist/setup-links-IW4BUANK.js +141 -0
  827. package/dist/setup-links-IW4BUANK.js.map +1 -0
  828. package/dist/{shared-J7DQZ2ED.js → shared-AT3FXPAG.js} +8 -6
  829. package/dist/shared-AT3FXPAG.js.map +1 -0
  830. package/dist/shopify-RQKO5TMR.js +3819 -0
  831. package/dist/shopify-RQKO5TMR.js.map +1 -0
  832. package/dist/site-3NU2BDAR.js +177 -0
  833. package/dist/site-3NU2BDAR.js.map +1 -0
  834. package/dist/sitemaps-FG37N5EB.js +87 -0
  835. package/dist/sitemaps-FG37N5EB.js.map +1 -0
  836. package/dist/sites-FIXK4Y3O.js +101 -0
  837. package/dist/sites-FIXK4Y3O.js.map +1 -0
  838. package/dist/skills-OKVCVQVD.js +47 -0
  839. package/dist/skills-OKVCVQVD.js.map +1 -0
  840. package/dist/sources-SEODRUIC.js +30 -0
  841. package/dist/sources-SEODRUIC.js.map +1 -0
  842. package/dist/sources-Z6BGTBGO.js +421 -0
  843. package/dist/sources-Z6BGTBGO.js.map +1 -0
  844. package/dist/stale-SWPDWXG7.js +63 -0
  845. package/dist/stale-SWPDWXG7.js.map +1 -0
  846. package/dist/stats-ZWZ7BAHV.js +34 -0
  847. package/dist/stats-ZWZ7BAHV.js.map +1 -0
  848. package/dist/status-7Y7UNSO6.js +62 -0
  849. package/dist/status-7Y7UNSO6.js.map +1 -0
  850. package/dist/sticker-FLRZM3BI.js +94 -0
  851. package/dist/sticker-FLRZM3BI.js.map +1 -0
  852. package/dist/stock-2CSMWRWV.js +179 -0
  853. package/dist/stock-2CSMWRWV.js.map +1 -0
  854. package/dist/studio-TTTR6N7D.js +49 -0
  855. package/dist/studio-TTTR6N7D.js.map +1 -0
  856. package/dist/sync-FH773IFH.js +54 -0
  857. package/dist/sync-FH773IFH.js.map +1 -0
  858. package/dist/sync-G5CS2RYV.js +54 -0
  859. package/dist/sync-G5CS2RYV.js.map +1 -0
  860. package/dist/sync-UADA6M33.js +265 -0
  861. package/dist/sync-UADA6M33.js.map +1 -0
  862. package/dist/sync-definition-77KLGPMA.js +52 -0
  863. package/dist/sync-definition-77KLGPMA.js.map +1 -0
  864. package/dist/tag-manager-NK3ZHSJB.js +43 -0
  865. package/dist/tag-manager-NK3ZHSJB.js.map +1 -0
  866. package/dist/tags-ANGHHLAC.js +20 -0
  867. package/dist/tags-ANGHHLAC.js.map +1 -0
  868. package/dist/tags-DKPUSQTJ.js +20 -0
  869. package/dist/tags-DKPUSQTJ.js.map +1 -0
  870. package/dist/tags-HSCV4ZAQ.js +20 -0
  871. package/dist/tags-HSCV4ZAQ.js.map +1 -0
  872. package/dist/tags-J3RMQEQM.js +26 -0
  873. package/dist/tags-J3RMQEQM.js.map +1 -0
  874. package/dist/tags-VZGTR3VJ.js +224 -0
  875. package/dist/tags-VZGTR3VJ.js.map +1 -0
  876. package/dist/targeting-constants-ZGBX3VWU.js +118 -0
  877. package/dist/targeting-constants-ZGBX3VWU.js.map +1 -0
  878. package/dist/targeting-criteria-BSG3CLHU.js +113 -0
  879. package/dist/targeting-criteria-BSG3CLHU.js.map +1 -0
  880. package/dist/targets-DVOAFYZQ.js +102 -0
  881. package/dist/targets-DVOAFYZQ.js.map +1 -0
  882. package/dist/templates-KJ5O44FF.js +178 -0
  883. package/dist/templates-KJ5O44FF.js.map +1 -0
  884. package/dist/testimonials-NB7V3DUO.js +32 -0
  885. package/dist/testimonials-NB7V3DUO.js.map +1 -0
  886. package/dist/themes-3RV3HNNE.js +94 -0
  887. package/dist/themes-3RV3HNNE.js.map +1 -0
  888. package/dist/top-companies-KRB3OZOT.js +108 -0
  889. package/dist/top-companies-KRB3OZOT.js.map +1 -0
  890. package/dist/translate-5FP32BIA.js +598 -0
  891. package/dist/translate-5FP32BIA.js.map +1 -0
  892. package/dist/triggers-EURHTCYC.js +141 -0
  893. package/dist/triggers-EURHTCYC.js.map +1 -0
  894. package/dist/tweets-X64YDEAA.js +123 -0
  895. package/dist/tweets-X64YDEAA.js.map +1 -0
  896. package/dist/unfollow-PIONCSBL.js +46 -0
  897. package/dist/unfollow-PIONCSBL.js.map +1 -0
  898. package/dist/unlink-HVVTZ3MB.js +67 -0
  899. package/dist/unlink-HVVTZ3MB.js.map +1 -0
  900. package/dist/unstage-BJJ5M7MK.js +95 -0
  901. package/dist/unstage-BJJ5M7MK.js.map +1 -0
  902. package/dist/unstage-Y7ZE3NUJ.js +84 -0
  903. package/dist/unstage-Y7ZE3NUJ.js.map +1 -0
  904. package/dist/update-3IP7FB6Y.js +98 -0
  905. package/dist/update-3IP7FB6Y.js.map +1 -0
  906. package/dist/update-CSDSK5NO.js +63 -0
  907. package/dist/update-CSDSK5NO.js.map +1 -0
  908. package/dist/update-FGJXVDB7.js +142 -0
  909. package/dist/update-FGJXVDB7.js.map +1 -0
  910. package/dist/update-MF7LY2OT.js +155 -0
  911. package/dist/update-MF7LY2OT.js.map +1 -0
  912. package/dist/upload-DDPI7KJV.js +126 -0
  913. package/dist/upload-DDPI7KJV.js.map +1 -0
  914. package/dist/upload-IWFYKD7A.js +150 -0
  915. package/dist/upload-IWFYKD7A.js.map +1 -0
  916. package/dist/upscale-EYCEYRWE.js +109 -0
  917. package/dist/upscale-EYCEYRWE.js.map +1 -0
  918. package/dist/url-options-RA3XISLN.js +130 -0
  919. package/dist/url-options-RA3XISLN.js.map +1 -0
  920. package/dist/url-params-SN4APXCK.js +98 -0
  921. package/dist/url-params-SN4APXCK.js.map +1 -0
  922. package/dist/use-E2TA2K6J.js +95 -0
  923. package/dist/use-E2TA2K6J.js.map +1 -0
  924. package/dist/validate-W52JOEXI.js +88 -0
  925. package/dist/validate-W52JOEXI.js.map +1 -0
  926. package/dist/variant-ETHB6XUM.js +338 -0
  927. package/dist/variant-ETHB6XUM.js.map +1 -0
  928. package/dist/videos-653WAFPG.js +39 -0
  929. package/dist/videos-653WAFPG.js.map +1 -0
  930. package/dist/view-BVEZRRV2.js +121 -0
  931. package/dist/view-BVEZRRV2.js.map +1 -0
  932. package/dist/viewer-check-W4ICSBHO.js +68 -0
  933. package/dist/viewer-check-W4ICSBHO.js.map +1 -0
  934. package/dist/web-JWIGFGIU.js +140 -0
  935. package/dist/web-JWIGFGIU.js.map +1 -0
  936. package/dist/winners-MJDKCGEZ.js +113 -0
  937. package/dist/winners-MJDKCGEZ.js.map +1 -0
  938. package/dist/winning-ads-O3IMUGGO.js +84 -0
  939. package/dist/winning-ads-O3IMUGGO.js.map +1 -0
  940. package/dist/write-commands-DA6FIFAO.js +737 -0
  941. package/dist/write-commands-DA6FIFAO.js.map +1 -0
  942. package/dist/write-commands-EMN2WENA.js +1015 -0
  943. package/dist/write-commands-EMN2WENA.js.map +1 -0
  944. package/dist/write-commands-KTPISQRE.js +206 -0
  945. package/dist/write-commands-KTPISQRE.js.map +1 -0
  946. package/dist/write-commands-QBGIWU27.js +713 -0
  947. package/dist/write-commands-QBGIWU27.js.map +1 -0
  948. package/dist/x-BT3SNCTU.js +47 -0
  949. package/dist/x-BT3SNCTU.js.map +1 -0
  950. package/package.json +9 -2
  951. package/dist/chunk-CHJOTJTZ.js +0 -9989
  952. package/dist/chunk-CHJOTJTZ.js.map +0 -1
  953. package/dist/chunk-HJEMOSPH.js +0 -1292
  954. package/dist/chunk-HJEMOSPH.js.map +0 -1
  955. package/dist/chunk-MF7YA62W.js.map +0 -1
  956. package/dist/chunk-VLUGGVJL.js.map +0 -1
  957. package/dist/chunk-VZEDAFAR.js.map +0 -1
  958. package/dist/chunk-XHC4LMK4.js.map +0 -1
  959. package/dist/client-GR6YL3YX.js +0 -17
  960. package/dist/output-NMQXZF3Z.js +0 -18
  961. /package/dist/{client-GR6YL3YX.js.map → chunk-YQSBHWOI.js.map} +0 -0
  962. /package/dist/{env-4P5HOGNA.js.map → client-EURRWXPW.js.map} +0 -0
  963. /package/dist/{output-NMQXZF3Z.js.map → connect-4YXFMXYX.js.map} +0 -0
  964. /package/dist/{shared-J7DQZ2ED.js.map → customers-7E4HBSEY.js.map} +0 -0
@@ -0,0 +1,126 @@
1
+ // src/commands/videos/videoPlatforms.ts
2
+ var PLATFORM_DOMAINS = {
3
+ youtube: ["youtube.com", "youtu.be"],
4
+ instagram: ["instagram.com", "ddinstagram.com"],
5
+ tiktok: ["tiktok.com"],
6
+ twitter: ["twitter.com", "x.com", "vxtwitter.com", "fixvx.com"],
7
+ facebook: ["facebook.com", "fb.watch", "fb.com"],
8
+ linkedin: ["linkedin.com", "lnkd.in"],
9
+ reddit: ["reddit.com", "redd.it"],
10
+ vimeo: ["vimeo.com"],
11
+ dailymotion: ["dailymotion.com", "dai.ly"],
12
+ twitch: ["twitch.tv"],
13
+ bluesky: ["bsky.app"],
14
+ bilibili: ["bilibili.com", "bilibili.tv", "b23.tv"],
15
+ vk: ["vk.com", "vk.ru", "vkvideo.ru"],
16
+ ok: ["ok.ru"],
17
+ pinterest: ["pinterest.com", "pin.it"],
18
+ tumblr: ["tumblr.com"],
19
+ snapchat: ["snapchat.com"],
20
+ loom: ["loom.com"],
21
+ streamable: ["streamable.com"],
22
+ newgrounds: ["newgrounds.com"],
23
+ rutube: ["rutube.ru"]
24
+ };
25
+ var VIDEO_PLATFORMS = Object.keys(PLATFORM_DOMAINS);
26
+ function platformFromUrl(rawUrl) {
27
+ let host;
28
+ try {
29
+ host = new URL(rawUrl).hostname.toLowerCase();
30
+ } catch {
31
+ return "url";
32
+ }
33
+ for (const [platform, domains] of Object.entries(PLATFORM_DOMAINS)) {
34
+ if (domains.some((domain) => host === domain || host.endsWith(`.${domain}`))) {
35
+ return platform;
36
+ }
37
+ }
38
+ return "url";
39
+ }
40
+
41
+ // src/commands/videos/ingestUrl.ts
42
+ var MAX_VIDEO_INGEST_BYTES = 16 * 1024 * 1024 * 1024;
43
+ var MAX_VIDEO_INGEST_SECONDS = 3 * 60 * 60;
44
+ function refuseByDuration(seconds, maxSeconds) {
45
+ if (seconds === void 0 || seconds <= maxSeconds) return null;
46
+ return `That video is ${(seconds / 3600).toFixed(1)} hours long \u2014 the limit is ${Math.round(maxSeconds / 3600)} hours.`;
47
+ }
48
+ var DOWNLOAD_TIMEOUT_FLOOR_MS = 10 * 60 * 1e3;
49
+ var DOWNLOAD_TIMEOUT_CEILING_MS = 15 * 60 * 1e3;
50
+ function downloadTimeoutMs(seconds) {
51
+ if (seconds === void 0) return DOWNLOAD_TIMEOUT_FLOOR_MS;
52
+ const scaled = seconds * 2 * 1e3;
53
+ return Math.min(Math.max(scaled, DOWNLOAD_TIMEOUT_FLOOR_MS), DOWNLOAD_TIMEOUT_CEILING_MS);
54
+ }
55
+ var DIRECT_MEDIA_EXTENSIONS = [".mp4", ".mov", ".webm", ".m4v", ".mkv", ".avi"];
56
+ function isDirectMediaUrl(rawUrl) {
57
+ const pathname = safePathname(rawUrl);
58
+ return DIRECT_MEDIA_EXTENSIONS.some((ext) => pathname.endsWith(ext));
59
+ }
60
+ function resolveIngestSource(explicit, rawUrl) {
61
+ if (explicit) return explicit;
62
+ return platformFromUrl(rawUrl);
63
+ }
64
+ var TOOLING_OR_BLOCK_SIGNATURES = [
65
+ "requested format is not available",
66
+ "only images are available",
67
+ "nsig",
68
+ "sign in to confirm",
69
+ // bot check — distinct from "Private video. Sign in if…"
70
+ "unable to download api page",
71
+ "http error 403",
72
+ // yt-dlp's own "the site changed under me" signature. It prints a GitHub issue
73
+ // link whenever a page parsed nothing like the shape the extractor expects —
74
+ // which is precisely a downloader that has aged out, not a bad link. Observed
75
+ // live on TikTok, which probed fine and then broke ninety minutes later from
76
+ // the same machine, identically through direct, datacenter and residential
77
+ // exits. Without this it fell through to "check the link is public", sending
78
+ // the reader to inspect a video that was never the problem.
79
+ "please report this issue"
80
+ ];
81
+ function isToolingOrBlockFailure(detail) {
82
+ const haystack = detail.toLowerCase();
83
+ return TOOLING_OR_BLOCK_SIGNATURES.some((signature) => haystack.includes(signature));
84
+ }
85
+ var REGION_BLOCK_SIGNATURES = [
86
+ "in your country",
87
+ "geo-restricted",
88
+ "geo restricted",
89
+ "not available from your location",
90
+ "blocked in your country"
91
+ ];
92
+ function isDrmProtected(detail) {
93
+ return detail.toLowerCase().includes("drm protected");
94
+ }
95
+ function isRegionBlocked(detail) {
96
+ const haystack = detail.toLowerCase();
97
+ return REGION_BLOCK_SIGNATURES.some((signature) => haystack.includes(signature));
98
+ }
99
+ function worthDownloadingInstead(errorCode) {
100
+ return errorCode === "VALIDATION_ERROR";
101
+ }
102
+ function directDedupeKey(source, rawUrl) {
103
+ return `${source}:${rawUrl}`;
104
+ }
105
+ function safePathname(rawUrl) {
106
+ try {
107
+ return new URL(rawUrl).pathname.toLowerCase();
108
+ } catch {
109
+ return "";
110
+ }
111
+ }
112
+
113
+ export {
114
+ MAX_VIDEO_INGEST_BYTES,
115
+ MAX_VIDEO_INGEST_SECONDS,
116
+ refuseByDuration,
117
+ downloadTimeoutMs,
118
+ isDirectMediaUrl,
119
+ resolveIngestSource,
120
+ isToolingOrBlockFailure,
121
+ isDrmProtected,
122
+ isRegionBlocked,
123
+ worthDownloadingInstead,
124
+ directDedupeKey
125
+ };
126
+ //# sourceMappingURL=chunk-FKOECEVC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/videos/videoPlatforms.ts","../src/commands/videos/ingestUrl.ts"],"sourcesContent":["/**\n * Which platform a video link came from.\n *\n * This exists for provenance, not for capability. The downloader already reaches\n * far more sites than are named here, so a platform missing from this table\n * still ingests — it is simply recorded as `url`. What the table buys is the\n * ability to answer \"where did this clip come from\" later: a competitor's TikTok,\n * a supplier's Vimeo and the client's own YouTube are different things to a\n * marketer, and collapsing all three into \"url\" throws that away at the only\n * moment it is knowable.\n *\n * Kept deliberately small. Naming every site the downloader supports would be a\n * list nobody can maintain and would still be missing the next one; these are the\n * platforms whose provenance actually changes how a clip gets used.\n */\n\n/** Registrable domains per platform. Subdomains match; lookalikes must not. */\nconst PLATFORM_DOMAINS = {\n youtube: [\"youtube.com\", \"youtu.be\"],\n instagram: [\"instagram.com\", \"ddinstagram.com\"],\n tiktok: [\"tiktok.com\"],\n twitter: [\"twitter.com\", \"x.com\", \"vxtwitter.com\", \"fixvx.com\"],\n facebook: [\"facebook.com\", \"fb.watch\", \"fb.com\"],\n linkedin: [\"linkedin.com\", \"lnkd.in\"],\n reddit: [\"reddit.com\", \"redd.it\"],\n vimeo: [\"vimeo.com\"],\n dailymotion: [\"dailymotion.com\", \"dai.ly\"],\n twitch: [\"twitch.tv\"],\n bluesky: [\"bsky.app\"],\n bilibili: [\"bilibili.com\", \"bilibili.tv\", \"b23.tv\"],\n vk: [\"vk.com\", \"vk.ru\", \"vkvideo.ru\"],\n ok: [\"ok.ru\"],\n pinterest: [\"pinterest.com\", \"pin.it\"],\n tumblr: [\"tumblr.com\"],\n snapchat: [\"snapchat.com\"],\n loom: [\"loom.com\"],\n streamable: [\"streamable.com\"],\n newgrounds: [\"newgrounds.com\"],\n rutube: [\"rutube.ru\"],\n} as const satisfies Record<string, readonly string[]>;\n\nexport type VideoPlatform = keyof typeof PLATFORM_DOMAINS;\n\n/** Every platform this can name; `platformFromUrl` returns one of these or `url`. */\nexport const VIDEO_PLATFORMS = Object.keys(PLATFORM_DOMAINS) as readonly VideoPlatform[];\n\n/**\n * The platform a URL belongs to, or `url` when it is not one we name.\n *\n * Matching is on the host, anchored at a dot boundary — never `includes`. That\n * is the whole security property of this function: `youtube.com.evil.test` and\n * `notyoutube.com` are attacker-controlled hosts that would otherwise inherit\n * YouTube's identity, and provenance that can be spoofed is worse than none,\n * because it is trusted.\n *\n * Pinterest is a deliberate omission from the country-mirror handling: cobalt\n * collapses `pinterest.co.uk` and friends, and doing the same here would mean\n * carrying a list of every ccTLD a platform has ever used. Those links resolve\n * as `url` and still ingest.\n */\nexport function platformFromUrl(rawUrl: string): VideoPlatform | \"url\" {\n let host: string;\n try {\n host = new URL(rawUrl).hostname.toLowerCase();\n } catch {\n return \"url\";\n }\n\n for (const [platform, domains] of Object.entries(PLATFORM_DOMAINS)) {\n if (domains.some((domain) => host === domain || host.endsWith(`.${domain}`))) {\n return platform as VideoPlatform;\n }\n }\n return \"url\";\n}\n","import { platformFromUrl } from \"./videoPlatforms.ts\";\n/**\n * URL classification for `baker videos ingest`. Pure so the routing decision —\n * hand the URL to Baker, or download it here first — is testable without a\n * network, a sandbox, or yt-dlp installed.\n */\n\n/**\n * Ceiling on the download path only. The direct path has no equivalent: Mux\n * fetches the file itself, so nothing is held in the Runtime's memory or disk.\n *\n * This was 2 GB, and it was never really a policy — it was a memory limit\n * wearing a policy's clothes. The upload read the whole file into a Buffer and\n * then copied it again into a `Uint8Array` (measured: that constructor does not\n * alias), so peak RAM was twice the file and an 8 GB Runtime would be OOM-killed\n * before the check ever fired. The file now streams from disk\n * (`lib/streamUpload.ts`), peak memory is one chunk regardless of length, and\n * this bounds the Runtime's *disk* — the last resource a download still spends\n * in proportion to how long the video is.\n *\n * The gate that does the real work is `refuseByDuration`, below: it turns away a\n * too-long video from its metadata, before a single byte is fetched.\n */\nexport const MAX_VIDEO_INGEST_BYTES = 16 * 1024 * 1024 * 1024;\n\n/** The longest video we will pull down, in seconds. */\nexport const MAX_VIDEO_INGEST_SECONDS = 3 * 60 * 60;\n\n/**\n * Whether a video is too long to ingest, phrased for whoever pasted the link.\n *\n * Duration rather than bytes, because duration is knowable *before* downloading\n * and a byte count is not: a watch page carries no `content-length`, an adaptive\n * stream has one per segment, and the merged file does not exist until it has\n * been muxed. So a byte cap can only be enforced after paying for the very\n * download it was supposed to avoid, while a duration cap costs one metadata\n * probe.\n *\n * An unknown duration is accepted, not refused. A live stream, or a site that\n * publishes no metadata, reports nothing — and treating silence as \"too long\"\n * would turn a missing field into a blocked ingest. The byte ceiling still\n * catches those on the way out.\n */\nexport function refuseByDuration(seconds: number | undefined, maxSeconds: number): string | null {\n if (seconds === undefined || seconds <= maxSeconds) return null;\n return `That video is ${(seconds / 3600).toFixed(1)} hours long — the limit is ${Math.round(maxSeconds / 3600)} hours.`;\n}\n\n/** Floor, and what an unknown duration gets: enough for any ordinary clip. */\nconst DOWNLOAD_TIMEOUT_FLOOR_MS = 10 * 60 * 1000;\n/**\n * Ceiling, and the binding constraint in practice.\n *\n * Set by what a person waiting in a chat will tolerate, not by what a download\n * might need: the turn is blocked for this whole time, and a chat that appears\n * frozen for three quarters of an hour is a worse outcome than a clip that did\n * not import. Fifteen minutes covers any ordinary clip even from a slow CDN,\n * and a video that cannot make it says so and points at `upload`.\n */\nconst DOWNLOAD_TIMEOUT_CEILING_MS = 15 * 60 * 1000;\n\n/**\n * How long a download may take, derived from how long the video is.\n *\n * These two numbers have to be related or they quietly contradict each other,\n * which is exactly what happened: the duration gate accepted up to three hours\n * while every download got a flat ten-minute window, so a 33-minute VK video —\n * served slowly, still transferring at 137 MB when the clock ran out — was\n * accepted by one rule and made impossible by another. It surfaced as\n * \"Unexpected error\", because a timeout throws a plain `Error` that the caller\n * discarded.\n *\n * Twice real-time is the budget: generous for a CDN serving faster than\n * playback, and still finite for one that is not. The ceiling matters more than\n * the ratio — without it a three-hour video would license a six-hour download.\n */\nexport function downloadTimeoutMs(seconds: number | undefined): number {\n if (seconds === undefined) return DOWNLOAD_TIMEOUT_FLOOR_MS;\n const scaled = seconds * 2 * 1000;\n return Math.min(Math.max(scaled, DOWNLOAD_TIMEOUT_FLOOR_MS), DOWNLOAD_TIMEOUT_CEILING_MS);\n}\n\nconst DIRECT_MEDIA_EXTENSIONS = [\".mp4\", \".mov\", \".webm\", \".m4v\", \".mkv\", \".avi\"] as const;\n\n/**\n * True when the URL's path ends in a media extension, which is the signal that\n * Mux can pull it directly. Deliberately conservative: a false negative only\n * costs an unnecessary download, while a false positive hands Mux a web page.\n */\nexport function isDirectMediaUrl(rawUrl: string): boolean {\n const pathname = safePathname(rawUrl);\n return DIRECT_MEDIA_EXTENSIONS.some((ext) => pathname.endsWith(ext));\n}\n\n/** Explicit `--source` always wins; otherwise infer provenance from the host. */\nexport function resolveIngestSource(explicit: string | undefined, rawUrl: string): string {\n if (explicit) return explicit;\n return platformFromUrl(rawUrl);\n}\n\n/**\n * Signatures of \"the site wouldn't hand over the video\", as opposed to \"this\n * link is private or gone\".\n *\n * They matter because the remediation is opposite. These all mean the downloader\n * could not read the page — nearly always because it has aged out against a site\n * that changed (YouTube rewrites its player every few weeks) or because the\n * request was blocked. Retrying is useless and the user's link is fine, so\n * telling them to check whether their public video is \"private\" sends them after\n * a problem that isn't theirs.\n */\nconst TOOLING_OR_BLOCK_SIGNATURES = [\n \"requested format is not available\",\n \"only images are available\",\n \"nsig\",\n \"sign in to confirm\", // bot check — distinct from \"Private video. Sign in if…\"\n \"unable to download api page\",\n \"http error 403\",\n // yt-dlp's own \"the site changed under me\" signature. It prints a GitHub issue\n // link whenever a page parsed nothing like the shape the extractor expects —\n // which is precisely a downloader that has aged out, not a bad link. Observed\n // live on TikTok, which probed fine and then broke ninety minutes later from\n // the same machine, identically through direct, datacenter and residential\n // exits. Without this it fell through to \"check the link is public\", sending\n // the reader to inspect a video that was never the problem.\n \"please report this issue\",\n] as const;\n\nexport function isToolingOrBlockFailure(detail: string): boolean {\n const haystack = detail.toLowerCase();\n return TOOLING_OR_BLOCK_SIGNATURES.some((signature) => haystack.includes(signature));\n}\n\n/**\n * Failures a *different country* could plausibly open — the only ones where\n * retrying with `--country` is worth suggesting.\n *\n * Deliberately narrow, and it is the narrowness that matters. Every rung of the\n * ladder already tries a different IP, so \"we were refused\" is not evidence that\n * geography was the reason; it is only evidence that geography *might* be. These\n * phrases are the ones where the site itself named the country.\n *\n * TikTok is the worked counter-example and the reason this is not a loose match\n * on \"blocked\": it answers with \"Your IP address is blocked from accessing this\n * post\", which reads exactly like a geo problem. Measured across six exits in\n * four countries — Spain direct, Spain datacenter, US, DE, SG, BR — that post\n * failed identically from all of them, while a different post succeeded from the\n * plain direct IP. Treating that string as regional would sell the agent a retry\n * that cannot work, once per country it thinks to try.\n */\nconst REGION_BLOCK_SIGNATURES = [\n \"in your country\",\n \"geo-restricted\",\n \"geo restricted\",\n \"not available from your location\",\n \"blocked in your country\",\n] as const;\n\n/**\n * The video's own encryption refusing us — a hard stop, not a hurdle.\n *\n * Kept separate from every other failure because it is the only one where the\n * honest answer is \"no, and no amount of retrying, signing in or changing\n * country will alter that\". Removing DRM is a different act from downloading\n * something published openly, so this never suggests a workaround.\n *\n * Checked *before* the tooling signatures, because a DRM video also emits\n * \"Requested format is not available\" as its second line — and that phrase is\n * read as a stale downloader, which would file a permanent property of the video\n * as a bug in our tooling. Measured: `--check-formats`, the remedy yt-dlp's own\n * message suggests, does not help when the audio track is the encrypted part.\n */\nexport function isDrmProtected(detail: string): boolean {\n return detail.toLowerCase().includes(\"drm protected\");\n}\n\nexport function isRegionBlocked(detail: string): boolean {\n const haystack = detail.toLowerCase();\n return REGION_BLOCK_SIGNATURES.some((signature) => haystack.includes(signature));\n}\n\n/**\n * Whether a failed direct ingest is worth retrying by downloading the file\n * ourselves.\n *\n * The subtlety that makes this necessary: the download route finishes by posting\n * to the *same* endpoint, with the same API key and the same `source`. So a\n * failure about the request rather than about the URL is guaranteed to fail\n * again identically, except now after pulling the whole video down first.\n *\n * An allow-list of one, and it has to be, because the codes here are the CLI's\n * (`mapHttpError`), not the backend's. That distinction was previously missed:\n * this listed backend names, so `apiError(\"BAD_REQUEST\")` — the code the route\n * raises when Mux refuses the source, and the only case this exists for —\n * arrived as `VALIDATION_ERROR` and was refused, while a backend 500 arrived as\n * `INTERNAL_ERROR`, matched nothing, and downloaded a whole video to replay the\n * identical failing request. Naming the outcome we want, rather than the ones we\n * don't, means a code nobody anticipated costs a missed retry instead of a\n * wasted download.\n *\n * `VALIDATION_ERROR` is unambiguous *here* only because the request body is zod\n * validated client-side before it is ever sent, so a 400 from this route is not\n * a malformed request — it is Baker saying it could not fetch that URL.\n */\nexport function worthDownloadingInstead(errorCode: string): boolean {\n return errorCode === \"VALIDATION_ERROR\";\n}\n\n/**\n * The dedupe key for a URL handed straight to Baker.\n *\n * The direct path never probes — that is the whole point of it — so there is no\n * provider id to key on and the URL is the only identifier available. That is\n * the same position the download path's *generic* extractor branch is in, and it\n * resolves it the same way, so a link filed directly and the same link filed via\n * the download fallback agree on one row instead of producing two.\n *\n * Keyed on the full URL rather than the filename: two unrelated clips are very\n * often both called `demo.mp4`, and a collision silently returns the wrong video\n * under a successful-looking response, which is far worse than a missed dedupe.\n * A signed URL carrying an expiring token simply never dedupes, which is the\n * harmless direction to fail in.\n */\nexport function directDedupeKey(source: string, rawUrl: string): string {\n return `${source}:${rawUrl}`;\n}\n\nfunction safePathname(rawUrl: string): string {\n try {\n return new URL(rawUrl).pathname.toLowerCase();\n } catch {\n return \"\";\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,106 @@
1
+ import {
2
+ cacheGet,
3
+ cacheSet,
4
+ handleConnectionError,
5
+ needsConnectionFix,
6
+ writeAdsJson
7
+ } from "./chunk-EIGXX6KI.js";
8
+ import {
9
+ ApiError,
10
+ apiGet
11
+ } from "./chunk-CUL3VB4L.js";
12
+ import {
13
+ getEnv
14
+ } from "./chunk-I4FTS5EE.js";
15
+
16
+ // src/commands/ads/x/output.ts
17
+ var ACCOUNTS_CACHE_TTL_MS = 60 * 60 * 1e3;
18
+ var NO_X_ACCOUNTS_EXPLANATION = "The X Ads connection is live, but X lists no ads accounts for it. That is usually an account X has not activated for advertising yet \u2014 most often one with no billing set up. It does not mean the connection failed, and reconnecting will not change it. An account X omits here still works everywhere else: take its id from the ads.x.com URL (ads.x.com/manager/<id>/\u2026) and pass --account-id <id>, or set BAKER_X_ADS_ACCOUNT_ID.";
19
+ async function fetchXAccounts(useCache) {
20
+ if (useCache) {
21
+ const cached = cacheGet("x-accounts", "list");
22
+ if (cached) return cached.data;
23
+ }
24
+ const params = !useCache ? { "skip-cache": "true" } : void 0;
25
+ const data = await apiGet("/api/ads/x/accounts", params);
26
+ if (useCache) {
27
+ cacheSet("x-accounts", "list", data, ACCOUNTS_CACHE_TTL_MS);
28
+ }
29
+ return data;
30
+ }
31
+ async function resolveXAccountId(args) {
32
+ const fromArgs = args["account-id"];
33
+ const accountId = fromArgs || getEnv().BAKER_X_ADS_ACCOUNT_ID;
34
+ if (accountId) {
35
+ if (!/^[a-z0-9]+$/.test(accountId)) {
36
+ writeAdsJson({
37
+ ok: false,
38
+ error: {
39
+ code: "INVALID_ACCOUNT_ID",
40
+ message: "X Ads account ID must be a base36 string (lowercase letters and digits). Pass --account-id or set BAKER_X_ADS_ACCOUNT_ID."
41
+ }
42
+ });
43
+ process.exit(1);
44
+ }
45
+ return accountId;
46
+ }
47
+ const useCache = !args["no-cache"];
48
+ try {
49
+ const accounts = await fetchXAccounts(useCache);
50
+ const [single] = accounts;
51
+ if (accounts.length === 1 && single) {
52
+ process.stderr.write(`Using account "${single.name}" (${single.id})
53
+ `);
54
+ return single.id;
55
+ }
56
+ if (accounts.length === 0) {
57
+ writeAdsJson({
58
+ ok: false,
59
+ error: {
60
+ code: "INVALID_ACCOUNT_ID",
61
+ message: NO_X_ACCOUNTS_EXPLANATION,
62
+ fix: { action: "reject", explanation: NO_X_ACCOUNTS_EXPLANATION },
63
+ retryable: false
64
+ }
65
+ });
66
+ process.exit(1);
67
+ }
68
+ const list = accounts.map((a) => ` ${a.id} ${a.name}`).join("\n");
69
+ writeAdsJson({
70
+ ok: false,
71
+ error: {
72
+ code: "MULTIPLE_ACCOUNTS",
73
+ message: `Multiple X Ads accounts found. Pass --account-id or set BAKER_X_ADS_ACCOUNT_ID:
74
+ ${list}`
75
+ }
76
+ });
77
+ process.exit(1);
78
+ } catch (err) {
79
+ if (err instanceof ApiError && needsConnectionFix(err.code, err.message)) {
80
+ handleConnectionError("x_ads", err.message);
81
+ }
82
+ writeAdsJson({
83
+ ok: false,
84
+ error: {
85
+ code: "INVALID_ACCOUNT_ID",
86
+ message: "Could not auto-detect account. Pass --account-id or set BAKER_X_ADS_ACCOUNT_ID."
87
+ }
88
+ });
89
+ process.exit(1);
90
+ }
91
+ }
92
+ async function resolveXAccountTimezone(accountId, args) {
93
+ try {
94
+ const accounts = await fetchXAccounts(!args["no-cache"]);
95
+ return accounts.find((a) => a.id === accountId)?.timezone || "UTC";
96
+ } catch {
97
+ return "UTC";
98
+ }
99
+ }
100
+
101
+ export {
102
+ NO_X_ACCOUNTS_EXPLANATION,
103
+ resolveXAccountId,
104
+ resolveXAccountTimezone
105
+ };
106
+ //# sourceMappingURL=chunk-FMGW2NZI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/ads/x/output.ts"],"sourcesContent":["import { ApiError, apiGet } from \"../../../client.ts\";\nimport { getEnv } from \"../../../env.ts\";\nimport { handleConnectionError, needsConnectionFix } from \"../../../error-handler.ts\";\nimport { cacheGet, cacheSet } from \"../cache.ts\";\nimport { writeAdsJson } from \"../output.ts\";\n\nexport interface XAccountInfo {\n id: string;\n name: string;\n approval_status?: string;\n timezone?: string;\n currency?: string;\n}\n\nconst ACCOUNTS_CACHE_TTL_MS = 60 * 60 * 1000;\n\n/**\n * X serves `/accounts` from its own idea of an active advertiser account, and an account it\n * leaves out of that list still answers every child endpoint — campaigns, media, funding and\n * the rest all work when the id is named. So an empty list is a discovery problem, never a\n * broken grant, and telling the user to reconnect sends them round a loop that cannot help.\n */\nexport const NO_X_ACCOUNTS_EXPLANATION =\n \"The X Ads connection is live, but X lists no ads accounts for it. That is usually an account \" +\n \"X has not activated for advertising yet — most often one with no billing set up. It does not \" +\n \"mean the connection failed, and reconnecting will not change it. An account X omits here still \" +\n \"works everywhere else: take its id from the ads.x.com URL (ads.x.com/manager/<id>/…) and pass \" +\n \"--account-id <id>, or set BAKER_X_ADS_ACCOUNT_ID.\";\n\nasync function fetchXAccounts(useCache: boolean): Promise<XAccountInfo[]> {\n if (useCache) {\n const cached = cacheGet<XAccountInfo[]>(\"x-accounts\", \"list\");\n if (cached) return cached.data;\n }\n const params = !useCache ? { \"skip-cache\": \"true\" } : undefined;\n const data = await apiGet<XAccountInfo[]>(\"/api/ads/x/accounts\", params);\n if (useCache) {\n cacheSet(\"x-accounts\", \"list\", data, ACCOUNTS_CACHE_TTL_MS);\n }\n return data;\n}\n\n/**\n * Resolve an X Ads account_id from either --account-id, BAKER_X_ADS_ACCOUNT_ID, or\n * (if exactly one account is connected) auto-detect.\n */\nexport async function resolveXAccountId(args: Record<string, unknown>): Promise<string> {\n const fromArgs = args[\"account-id\"] as string | undefined;\n const accountId = fromArgs || getEnv().BAKER_X_ADS_ACCOUNT_ID;\n if (accountId) {\n if (!/^[a-z0-9]+$/.test(accountId)) {\n writeAdsJson({\n ok: false,\n error: {\n code: \"INVALID_ACCOUNT_ID\",\n message:\n \"X Ads account ID must be a base36 string (lowercase letters and digits). Pass --account-id or set BAKER_X_ADS_ACCOUNT_ID.\",\n },\n });\n process.exit(1);\n }\n return accountId;\n }\n\n const useCache = !args[\"no-cache\"];\n try {\n const accounts = await fetchXAccounts(useCache);\n const [single] = accounts;\n if (accounts.length === 1 && single) {\n process.stderr.write(`Using account \"${single.name}\" (${single.id})\\n`);\n return single.id;\n }\n if (accounts.length === 0) {\n // Not a connection failure — see NO_X_ACCOUNTS_EXPLANATION.\n writeAdsJson({\n ok: false,\n error: {\n code: \"INVALID_ACCOUNT_ID\",\n message: NO_X_ACCOUNTS_EXPLANATION,\n fix: { action: \"reject\", explanation: NO_X_ACCOUNTS_EXPLANATION },\n retryable: false,\n },\n });\n process.exit(1);\n }\n const list = accounts.map((a) => ` ${a.id} ${a.name}`).join(\"\\n\");\n writeAdsJson({\n ok: false,\n error: {\n code: \"MULTIPLE_ACCOUNTS\",\n message: `Multiple X Ads accounts found. Pass --account-id or set BAKER_X_ADS_ACCOUNT_ID:\\n${list}`,\n },\n });\n process.exit(1);\n } catch (err) {\n if (err instanceof ApiError && needsConnectionFix(err.code, err.message)) {\n handleConnectionError(\"x_ads\", err.message);\n }\n writeAdsJson({\n ok: false,\n error: {\n code: \"INVALID_ACCOUNT_ID\",\n message: \"Could not auto-detect account. Pass --account-id or set BAKER_X_ADS_ACCOUNT_ID.\",\n },\n });\n process.exit(1);\n }\n}\n\n/**\n * The account's own timezone, which X Ads measures a DAY-granularity window against.\n * Falls back to UTC when the account cannot be read — X names the mismatch clearly enough.\n */\nexport async function resolveXAccountTimezone(accountId: string, args: Record<string, unknown>): Promise<string> {\n try {\n const accounts = await fetchXAccounts(!args[\"no-cache\"]);\n return accounts.find((a) => a.id === accountId)?.timezone || \"UTC\";\n } catch {\n return \"UTC\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAcA,IAAM,wBAAwB,KAAK,KAAK;AAQjC,IAAM,4BACX;AAMF,eAAe,eAAe,UAA4C;AACxE,MAAI,UAAU;AACZ,UAAM,SAAS,SAAyB,cAAc,MAAM;AAC5D,QAAI,OAAQ,QAAO,OAAO;AAAA,EAC5B;AACA,QAAM,SAAS,CAAC,WAAW,EAAE,cAAc,OAAO,IAAI;AACtD,QAAM,OAAO,MAAM,OAAuB,uBAAuB,MAAM;AACvE,MAAI,UAAU;AACZ,aAAS,cAAc,QAAQ,MAAM,qBAAqB;AAAA,EAC5D;AACA,SAAO;AACT;AAMA,eAAsB,kBAAkB,MAAgD;AACtF,QAAM,WAAW,KAAK,YAAY;AAClC,QAAM,YAAY,YAAY,OAAO,EAAE;AACvC,MAAI,WAAW;AACb,QAAI,CAAC,cAAc,KAAK,SAAS,GAAG;AAClC,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,CAAC,KAAK,UAAU;AACjC,MAAI;AACF,UAAM,WAAW,MAAM,eAAe,QAAQ;AAC9C,UAAM,CAAC,MAAM,IAAI;AACjB,QAAI,SAAS,WAAW,KAAK,QAAQ;AACnC,cAAQ,OAAO,MAAM,kBAAkB,OAAO,IAAI,MAAM,OAAO,EAAE;AAAA,CAAK;AACtE,aAAO,OAAO;AAAA,IAChB;AACA,QAAI,SAAS,WAAW,GAAG;AAEzB,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,KAAK,EAAE,QAAQ,UAAU,aAAa,0BAA0B;AAAA,UAChE,WAAW;AAAA,QACb;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,OAAO,SAAS,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI;AAClE,iBAAa;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,EAAoF,IAAI;AAAA,MACnG;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,KAAK;AACZ,QAAI,eAAe,YAAY,mBAAmB,IAAI,MAAM,IAAI,OAAO,GAAG;AACxE,4BAAsB,SAAS,IAAI,OAAO;AAAA,IAC5C;AACA,iBAAa;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAMA,eAAsB,wBAAwB,WAAmB,MAAgD;AAC/G,MAAI;AACF,UAAM,WAAW,MAAM,eAAe,CAAC,KAAK,UAAU,CAAC;AACvD,WAAO,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,GAAG,YAAY;AAAA,EAC/D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -0,0 +1,98 @@
1
+ import {
2
+ isRemoteUrl
3
+ } from "./chunk-VSU5R34H.js";
4
+ import {
5
+ detectImageContentType,
6
+ uploadLocalImage
7
+ } from "./chunk-AG62YO7C.js";
8
+ import {
9
+ IMAGE_GENERATE_MODELS,
10
+ MODEL_REGISTRY,
11
+ VIDEO_GENERATE_MODELS
12
+ } from "./chunk-CAMX6OHF.js";
13
+ import {
14
+ ApiError,
15
+ apiPost
16
+ } from "./chunk-CUL3VB4L.js";
17
+
18
+ // src/commands/studio/modelOptions.ts
19
+ function unionOfStringEnum(node, models, param) {
20
+ const values = /* @__PURE__ */ new Set();
21
+ for (const model of models) {
22
+ const schema = MODEL_REGISTRY[node][model]?.params[param];
23
+ if (schema?.kind === "string") for (const value of schema.enum ?? []) values.add(value);
24
+ }
25
+ return [...values];
26
+ }
27
+ function unionOfNumberEnum(node, models, param) {
28
+ const values = /* @__PURE__ */ new Set();
29
+ for (const model of models) {
30
+ const schema = MODEL_REGISTRY[node][model]?.params[param];
31
+ if (schema?.kind === "number") for (const value of schema.enum ?? []) values.add(value);
32
+ }
33
+ return [...values].sort((a, b) => a - b);
34
+ }
35
+ var IMAGE_MODEL_IDS = [...IMAGE_GENERATE_MODELS];
36
+ var VIDEO_MODEL_IDS = [...VIDEO_GENERATE_MODELS];
37
+ var IMAGE_SIZES = unionOfStringEnum("image_generate", IMAGE_GENERATE_MODELS, "image_size");
38
+ var IMAGE_QUALITIES = unionOfStringEnum("image_generate", IMAGE_GENERATE_MODELS, "quality");
39
+ var CLIP_RESOLUTIONS = unionOfStringEnum("video_generate", VIDEO_GENERATE_MODELS, "resolution");
40
+ var CLIP_DURATIONS = unionOfNumberEnum("video_generate", VIDEO_GENERATE_MODELS, "duration");
41
+ var CLIP_PERSON_GENERATION = unionOfStringEnum("video_generate", VIDEO_GENERATE_MODELS, "person_generation");
42
+
43
+ // src/commands/studio/references.ts
44
+ var LIBRARY_ID_RE = /^[a-z0-9]{16,}$/i;
45
+ var FILE_EXTENSION_RE = /\.[a-z0-9]{2,5}$/i;
46
+ var PATH_HINT_RE = /[/\\]/;
47
+ function classify(entry) {
48
+ if (isRemoteUrl(entry)) return { kind: "url", value: entry };
49
+ if (PATH_HINT_RE.test(entry) || FILE_EXTENSION_RE.test(entry)) return { kind: "path", value: entry };
50
+ if (LIBRARY_ID_RE.test(entry)) return { kind: "id", value: entry };
51
+ throw new ApiError(
52
+ "VALIDATION_ERROR",
53
+ `"${entry}" is not a library image id, a file path, or an image URL. Pass a comma-separated mix of those.`
54
+ );
55
+ }
56
+ function parseImageRefs(spec) {
57
+ return spec.split(",").map((entry) => entry.trim()).filter(Boolean).map(classify);
58
+ }
59
+ var defaultDeps = {
60
+ ingest: (url) => apiPost("/api/images/ingest", { url, source: "uploaded" }),
61
+ upload: (path) => uploadLocalImage({ file: path, contentType: detectImageContentType(path), source: "uploaded" })
62
+ };
63
+ async function resolveLibraryImageIds(spec, limit, deps = defaultDeps) {
64
+ const refs = parseImageRefs(spec);
65
+ if (limit && refs.length > limit.max) {
66
+ throw new ApiError("VALIDATION_ERROR", limit.refuse(refs.length));
67
+ }
68
+ const imageIds = [];
69
+ const added = [];
70
+ for (const ref of refs) {
71
+ if (ref.kind === "id") {
72
+ imageIds.push(ref.value);
73
+ continue;
74
+ }
75
+ const { imageId } = ref.kind === "url" ? await deps.ingest(ref.value) : await deps.upload(ref.value).catch(uploadFailure(ref.value));
76
+ imageIds.push(imageId);
77
+ added.push(imageId);
78
+ }
79
+ return { imageIds, added };
80
+ }
81
+ function uploadFailure(path) {
82
+ return (error) => {
83
+ if (error instanceof ApiError) throw error;
84
+ throw new ApiError("VALIDATION_ERROR", `Could not read "${path}" as an image.`);
85
+ };
86
+ }
87
+
88
+ export {
89
+ IMAGE_MODEL_IDS,
90
+ VIDEO_MODEL_IDS,
91
+ IMAGE_SIZES,
92
+ IMAGE_QUALITIES,
93
+ CLIP_RESOLUTIONS,
94
+ CLIP_DURATIONS,
95
+ CLIP_PERSON_GENERATION,
96
+ resolveLibraryImageIds
97
+ };
98
+ //# sourceMappingURL=chunk-FPZKKNDK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/studio/modelOptions.ts","../src/commands/studio/references.ts"],"sourcesContent":["import { IMAGE_GENERATE_MODELS, MODEL_REGISTRY, VIDEO_GENERATE_MODELS } from \"@baker/canvas-contract\";\n\n/**\n * What the curated roster accepts for one param, across every model that has it.\n *\n * Derived, never hand-copied: the contract registry is the source of truth for\n * which model takes which value, and a hand-written list in the CLI is a second\n * copy that goes stale the first time a model is added. `baker schema` reads\n * these, so the agent's picture of what is allowed comes from the same place the\n * backend's refusal does.\n *\n * The union is deliberately WIDER than any single model: `--quality 4k` is valid\n * on Seedance and `4K` on Veo (different providers, different casing), and both\n * belong in the advertised set. Whether the chosen model accepts the value the\n * caller picked is settled server-side, per model, with a message that names it.\n */\nfunction unionOfStringEnum(\n node: \"image_generate\" | \"video_generate\",\n models: readonly string[],\n param: string,\n): string[] {\n const values = new Set<string>();\n for (const model of models) {\n const schema = MODEL_REGISTRY[node][model]?.params[param];\n if (schema?.kind === \"string\") for (const value of schema.enum ?? []) values.add(value);\n }\n return [...values];\n}\n\n/** Every number the roster accepts for a param, ascending. */\nfunction unionOfNumberEnum(\n node: \"image_generate\" | \"video_generate\",\n models: readonly string[],\n param: string,\n): number[] {\n const values = new Set<number>();\n for (const model of models) {\n const schema = MODEL_REGISTRY[node][model]?.params[param];\n if (schema?.kind === \"number\") for (const value of schema.enum ?? []) values.add(value);\n }\n return [...values].sort((a, b) => a - b);\n}\n\nexport const IMAGE_MODEL_IDS = [...IMAGE_GENERATE_MODELS];\nexport const VIDEO_MODEL_IDS = [...VIDEO_GENERATE_MODELS];\n\nexport const IMAGE_SIZES = unionOfStringEnum(\"image_generate\", IMAGE_GENERATE_MODELS, \"image_size\");\nexport const IMAGE_QUALITIES = unionOfStringEnum(\"image_generate\", IMAGE_GENERATE_MODELS, \"quality\");\n\nexport const CLIP_RESOLUTIONS = unionOfStringEnum(\"video_generate\", VIDEO_GENERATE_MODELS, \"resolution\");\nexport const CLIP_DURATIONS = unionOfNumberEnum(\"video_generate\", VIDEO_GENERATE_MODELS, \"duration\");\nexport const CLIP_PERSON_GENERATION = unionOfStringEnum(\"video_generate\", VIDEO_GENERATE_MODELS, \"person_generation\");\n","import type { ImagesIngestResponse } from \"@baker/api\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { isRemoteUrl } from \"../../lib/image/io.ts\";\nimport { detectImageContentType, uploadLocalImage } from \"../images/api.ts\";\n\n/**\n * One entry of a `--reference` / `--image` spec, after classification.\n *\n * The studio takes LIBRARY image ids and nothing else: a reference has to be an\n * asset the dashboard can show next to the batch that used it, and inlined bytes\n * would put megabytes of base64 on a row the live feed reads. So the CLI accepts\n * the three things an agent actually has — an id it already knows, a file it just\n * wrote in the workspace, a URL it just found — and turns the last two into\n * library images before starting the batch. That also makes the reference\n * reusable: the next prompt can name the id.\n */\nexport type ImageRef = { kind: \"id\" | \"url\" | \"path\"; value: string };\n\n// Convex ids are long, unpadded alphanumerics with no separators and no\n// extension — distinguishable from both a filename and a prose fragment.\nconst LIBRARY_ID_RE = /^[a-z0-9]{16,}$/i;\nconst FILE_EXTENSION_RE = /\\.[a-z0-9]{2,5}$/i;\nconst PATH_HINT_RE = /[/\\\\]/;\n\nfunction classify(entry: string): ImageRef {\n if (isRemoteUrl(entry)) return { kind: \"url\", value: entry };\n if (PATH_HINT_RE.test(entry) || FILE_EXTENSION_RE.test(entry)) return { kind: \"path\", value: entry };\n if (LIBRARY_ID_RE.test(entry)) return { kind: \"id\", value: entry };\n throw new ApiError(\n \"VALIDATION_ERROR\",\n `\"${entry}\" is not a library image id, a file path, or an image URL. Pass a comma-separated mix of those.`,\n );\n}\n\n/**\n * Split a comma-separated spec and classify each entry. Order is preserved —\n * models read references positionally, and the first image is the frame a clip\n * starts from.\n */\nexport function parseImageRefs(spec: string): ImageRef[] {\n return spec\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean)\n .map(classify);\n}\n\nexport type ResolveLibraryImageDeps = {\n ingest: (url: string) => Promise<ImagesIngestResponse>;\n upload: (path: string) => Promise<{ imageId: string }>;\n};\n\nconst defaultDeps: ResolveLibraryImageDeps = {\n ingest: (url) => apiPost<ImagesIngestResponse>(\"/api/images/ingest\", { url, source: \"uploaded\" }),\n upload: (path) => uploadLocalImage({ file: path, contentType: detectImageContentType(path), source: \"uploaded\" }),\n};\n\n/** How many images the chosen model will take, and what to call them when it won't. */\nexport type ReferenceLimit = { max: number; refuse: (count: number) => string };\n\n/**\n * Turn a `--reference` / `--image` spec into the library image ids the studio\n * takes, adding anything that isn't already in the library.\n *\n * The batch is not started until every entry resolves: half a reference set is\n * a different brief, and paying for it is worse than failing the call.\n *\n * The count is checked FIRST, before a single upload or ingest. The backend\n * checks it too, but by the time it does the CLI has already downloaded and\n * described every image in a set it was always going to refuse — work the\n * caller pays for and then throws away.\n */\nexport async function resolveLibraryImageIds(\n spec: string,\n limit?: ReferenceLimit,\n deps: ResolveLibraryImageDeps = defaultDeps,\n): Promise<{ imageIds: string[]; added: string[] }> {\n const refs = parseImageRefs(spec);\n if (limit && refs.length > limit.max) {\n throw new ApiError(\"VALIDATION_ERROR\", limit.refuse(refs.length));\n }\n const imageIds: string[] = [];\n const added: string[] = [];\n for (const ref of refs) {\n if (ref.kind === \"id\") {\n imageIds.push(ref.value);\n continue;\n }\n const { imageId } =\n ref.kind === \"url\" ? await deps.ingest(ref.value) : await deps.upload(ref.value).catch(uploadFailure(ref.value));\n imageIds.push(imageId);\n added.push(imageId);\n }\n return { imageIds, added };\n}\n\nfunction uploadFailure(path: string): (error: unknown) => never {\n return (error) => {\n if (error instanceof ApiError) throw error;\n throw new ApiError(\"VALIDATION_ERROR\", `Could not read \"${path}\" as an image.`);\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,169 @@
1
+ import {
2
+ parseXApiError
3
+ } from "./chunk-M6UNISGO.js";
4
+ import {
5
+ resolveXAccountId
6
+ } from "./chunk-FMGW2NZI.js";
7
+ import {
8
+ writeAdsJson,
9
+ writeJsonEnvelope
10
+ } from "./chunk-EIGXX6KI.js";
11
+ import {
12
+ X_DRAFT_BATCH_MAX,
13
+ xDraftOpInputSchema
14
+ } from "./chunk-O6XZIQXZ.js";
15
+ import {
16
+ ApiError,
17
+ apiPost
18
+ } from "./chunk-CUL3VB4L.js";
19
+ import {
20
+ requireChatId
21
+ } from "./chunk-I4FTS5EE.js";
22
+
23
+ // src/commands/ads/x/write-shared.ts
24
+ function failWriteValidation(message) {
25
+ writeJsonEnvelope({ ok: false, error: { code: "VALIDATION_ERROR", message } });
26
+ process.exit(1);
27
+ }
28
+ function failPreflight(fields) {
29
+ writeJsonEnvelope({
30
+ ok: false,
31
+ error: {
32
+ code: "VALIDATION_ERROR",
33
+ message: fields.map((f) => f.path ? `${f.path}: ${f.message}` : f.message).join("; "),
34
+ fields,
35
+ fix: {
36
+ action: "reject",
37
+ explanation: "Fix the named fields and stage again. Nothing was staged \u2014 the draft is exactly as it was before this call."
38
+ }
39
+ }
40
+ });
41
+ process.exit(1);
42
+ }
43
+ function handleXWriteError(err, accountId) {
44
+ if (err instanceof ApiError) {
45
+ writeAdsJson(parseXApiError(err.message, accountId));
46
+ process.exit(1);
47
+ }
48
+ writeAdsJson({ ok: false, error: { code: "NETWORK_ERROR", message: "Unexpected error" } });
49
+ process.exit(1);
50
+ }
51
+ function decimalPlaces(value) {
52
+ const [mantissa, exponent] = String(value).trim().split(/e/i);
53
+ const written = (mantissa?.split(".")[1] ?? "").length;
54
+ return Math.max(0, written - (exponent ? Number(exponent) : 0));
55
+ }
56
+ function parseXMoney(value) {
57
+ if (value === void 0 || value === "") {
58
+ return { ok: true, micros: void 0 };
59
+ }
60
+ const amount = Number(value);
61
+ if (!Number.isFinite(amount) || amount <= 0) {
62
+ return { ok: false, reason: "must be a positive amount, for example 12.50" };
63
+ }
64
+ if (decimalPlaces(value) > 6) {
65
+ return { ok: false, reason: "is finer than X can express \u2014 it takes whole micros" };
66
+ }
67
+ return { ok: true, micros: Math.round(amount * 1e6) };
68
+ }
69
+ function microsFromArg(value, flag) {
70
+ const parsed = parseXMoney(value);
71
+ if (!parsed.ok) {
72
+ failWriteValidation(`${flag} ${parsed.reason}`);
73
+ }
74
+ return parsed.micros;
75
+ }
76
+ function csvArg(value) {
77
+ if (typeof value !== "string" || value.length === 0) {
78
+ return void 0;
79
+ }
80
+ const parts = value.split(",").map((s) => s.trim()).filter(Boolean);
81
+ return parts.length > 0 ? parts : void 0;
82
+ }
83
+ function compact(payload) {
84
+ return Object.fromEntries(Object.entries(payload).filter(([, value]) => value !== void 0));
85
+ }
86
+ function batchNudge(data) {
87
+ const count = data?.sameKindStaged;
88
+ if (!count) {
89
+ return [];
90
+ }
91
+ return [
92
+ `${count} other change${count === 1 ? "" : "s"} of this kind and payload ${count === 1 ? "is" : "are"} already staged \u2014 pass every id to one call (\`--ids a,b,c\`) instead of one call each.`
93
+ ];
94
+ }
95
+ async function stageXOp(raw, hints) {
96
+ const preflight = xDraftOpInputSchema.safeParse(raw);
97
+ if (!preflight.success) {
98
+ failPreflight(preflight.error.issues.map((issue) => ({ path: issue.path.join("."), message: issue.message })));
99
+ }
100
+ const accountId = String(raw.accountId ?? "\u2014");
101
+ try {
102
+ const chatId = requireChatId();
103
+ const response = await apiPost("/api/ads/x/draft/stage", { chatId, op: preflight.data });
104
+ const allHints = [...batchNudge(response.data), ...hints ?? []];
105
+ writeJsonEnvelope(allHints.length > 0 ? { ...response, hints: allHints } : response);
106
+ } catch (err) {
107
+ handleXWriteError(err, accountId);
108
+ }
109
+ }
110
+ async function stageXOps(rawOps, hints) {
111
+ if (rawOps.length === 1 && rawOps[0]) {
112
+ await stageXOp(rawOps[0], hints);
113
+ return;
114
+ }
115
+ if (rawOps.length > X_DRAFT_BATCH_MAX) {
116
+ failWriteValidation(`at most ${X_DRAFT_BATCH_MAX} changes can be staged in one call`);
117
+ }
118
+ const ops = [];
119
+ for (const [index, raw] of rawOps.entries()) {
120
+ const preflight = xDraftOpInputSchema.safeParse(raw);
121
+ if (!preflight.success) {
122
+ failPreflight(
123
+ preflight.error.issues.map((issue) => ({
124
+ path: `ops[${index}]${issue.path.length > 0 ? `.${issue.path.join(".")}` : ""}`,
125
+ message: issue.message
126
+ }))
127
+ );
128
+ }
129
+ ops.push(preflight.data);
130
+ }
131
+ const accountId = String(rawOps[0]?.accountId ?? "\u2014");
132
+ try {
133
+ const chatId = requireChatId();
134
+ const response = await apiPost("/api/ads/x/draft/stage-batch", { chatId, ops });
135
+ writeJsonEnvelope(hints && hints.length > 0 ? { ...response, hints } : response);
136
+ } catch (err) {
137
+ handleXWriteError(err, accountId);
138
+ }
139
+ }
140
+ async function stageAccountId(args) {
141
+ return await resolveXAccountId(args);
142
+ }
143
+ function requireTarget(args, name) {
144
+ const value = args[name];
145
+ if (typeof value !== "string" || value.length === 0) {
146
+ failWriteValidation(`${name} is required`);
147
+ }
148
+ return value;
149
+ }
150
+ function requireTargets(args, name) {
151
+ const ids = csvArg(args[name]);
152
+ if (!ids) {
153
+ failWriteValidation(`${name} is required \u2014 pass one or more ids, comma-separated`);
154
+ }
155
+ return ids;
156
+ }
157
+
158
+ export {
159
+ failWriteValidation,
160
+ microsFromArg,
161
+ csvArg,
162
+ compact,
163
+ stageXOp,
164
+ stageXOps,
165
+ stageAccountId,
166
+ requireTarget,
167
+ requireTargets
168
+ };
169
+ //# sourceMappingURL=chunk-FUVCY63N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/ads/x/write-shared.ts"],"sourcesContent":["import {\n X_DRAFT_BATCH_MAX,\n type XDraftStageBatchResponse,\n type XDraftStageResponse,\n xDraftOpInputSchema,\n} from \"@baker/api\";\nimport { ApiError, apiPost } from \"../../../client.ts\";\nimport { requireChatId } from \"../../../env.ts\";\nimport { writeAdsJson, writeJsonEnvelope } from \"../output.ts\";\nimport { parseXApiError } from \"./error-parser.ts\";\nimport { resolveXAccountId } from \"./output.ts\";\n\n/**\n * Shared plumbing for the staged X write commands.\n *\n * Writes NEVER reach X directly: every command stages an op against this chat's\n * draft (`/api/ads/x/draft/stage`), the dashboard shows it as a pending X\n * change, and it applies only when the chat is published.\n */\n\nexport function failWriteValidation(message: string): never {\n writeJsonEnvelope({ ok: false, error: { code: \"VALIDATION_ERROR\", message } });\n process.exit(1);\n}\n\nfunction failPreflight(fields: Array<{ path: string; message: string }>): never {\n writeJsonEnvelope({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: fields.map((f) => (f.path ? `${f.path}: ${f.message}` : f.message)).join(\"; \"),\n fields,\n fix: {\n action: \"reject\",\n explanation:\n \"Fix the named fields and stage again. Nothing was staged — the draft is exactly as it was before this call.\",\n },\n },\n });\n process.exit(1);\n}\n\nexport function handleXWriteError(err: unknown, accountId: string): never {\n if (err instanceof ApiError) {\n writeAdsJson(parseXApiError(err.message, accountId));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n}\n\n/**\n * Digits after the decimal point, read off the written amount rather than\n * measured on the product.\n *\n * Exponent form is what makes this worth a helper: `String(0.0000005)` is\n * `\"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 XMoneyParse = { ok: true; micros: number | undefined } | { ok: false; reason: string };\n\n/**\n * Money on X is integer micros of the account currency, and the CLI takes the\n * human amount so nobody has to count zeros. Rejecting a fraction of a micro\n * here is what keeps the staged payload byte-identical to the request X gets.\n *\n * The precision test counts the decimals the caller wrote instead of comparing\n * `amount * 1e6` against its rounding. That comparison needed a tolerance, and\n * any absolute one is wrong somewhere: `1e-6` is finer than a double's own\n * spacing once the product passes 2^34, so `--total-budget 16384.01` — a whole\n * number of cents — was refused as finer than X can express. Counting decimals\n * is exact at every magnitude and needs no tolerance at all.\n */\nexport function parseXMoney(value: unknown): XMoneyParse {\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 X can express — it takes whole micros\" };\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 = parseXMoney(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.length === 0) {\n return undefined;\n }\n const parts = value\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return parts.length > 0 ? parts : undefined;\n}\n\n/** Drop undefined 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));\n}\n\ninterface StageEnvelope extends Record<string, unknown> {\n ok: true;\n data: XDraftStageResponse;\n}\n\n/**\n * The nudge to pass every id in one call instead of looping. Gated on\n * `sameKindStaged`, which the backend only sets for a command that really does\n * take an id list — a nudge pointed at a single-id command fails when obeyed.\n */\nfunction batchNudge(data: XDraftStageResponse | undefined): string[] {\n const count = data?.sameKindStaged;\n if (!count) {\n return [];\n }\n return [\n `${count} other change${count === 1 ? \"\" : \"s\"} of this kind and payload ${count === 1 ? \"is\" : \"are\"} already staged — pass every id to one call (\\`--ids a,b,c\\`) instead of one call each.`,\n ];\n}\n\nexport async function stageXOp(raw: Record<string, unknown>, hints?: string[]): Promise<void> {\n const preflight = xDraftOpInputSchema.safeParse(raw);\n if (!preflight.success) {\n failPreflight(preflight.error.issues.map((issue) => ({ path: issue.path.join(\".\"), message: issue.message })));\n }\n const accountId = String(raw.accountId ?? \"—\");\n try {\n const chatId = requireChatId();\n const response = await apiPost<StageEnvelope>(\"/api/ads/x/draft/stage\", { chatId, op: preflight.data });\n const allHints = [...batchNudge(response.data), ...(hints ?? [])];\n writeJsonEnvelope(allHints.length > 0 ? { ...response, hints: allHints } : response);\n } catch (err) {\n handleXWriteError(err, accountId);\n }\n}\n\ninterface StageBatchEnvelope extends Record<string, unknown> {\n ok: true;\n data: XDraftStageBatchResponse;\n}\n\n/**\n * Stage several ops as ONE request — all-or-nothing on the backend, one\n * rate-limit hit instead of one per id. A single op falls through to the plain\n * stage path so its envelope, amend behaviour and hints stay identical.\n */\nexport async function stageXOps(rawOps: Array<Record<string, unknown>>, hints?: string[]): Promise<void> {\n if (rawOps.length === 1 && rawOps[0]) {\n await stageXOp(rawOps[0], hints);\n return;\n }\n if (rawOps.length > X_DRAFT_BATCH_MAX) {\n failWriteValidation(`at most ${X_DRAFT_BATCH_MAX} changes can be staged in one call`);\n }\n const ops: unknown[] = [];\n for (const [index, raw] of rawOps.entries()) {\n const preflight = xDraftOpInputSchema.safeParse(raw);\n if (!preflight.success) {\n failPreflight(\n preflight.error.issues.map((issue) => ({\n path: `ops[${index}]${issue.path.length > 0 ? `.${issue.path.join(\".\")}` : \"\"}`,\n message: issue.message,\n })),\n );\n }\n ops.push(preflight.data);\n }\n const accountId = String(rawOps[0]?.accountId ?? \"—\");\n try {\n const chatId = requireChatId();\n const response = await apiPost<StageBatchEnvelope>(\"/api/ads/x/draft/stage-batch\", { chatId, ops });\n writeJsonEnvelope(hints && hints.length > 0 ? { ...response, hints } : response);\n } catch (err) {\n handleXWriteError(err, accountId);\n }\n}\n\n/** The account every staged write is scoped to. */\nexport async function stageAccountId(args: Record<string, unknown>): Promise<string> {\n return await resolveXAccountId(args);\n}\n\n/** One required positional id. */\nexport function requireTarget(args: Record<string, unknown>, name: string): string {\n const value = args[name];\n if (typeof value !== \"string\" || value.length === 0) {\n failWriteValidation(`${name} is required`);\n }\n return value;\n}\n\n/**\n * A comma-separated list of ids, for the commands that apply one payload to\n * many entities. Reading `process.argv` is deliberate for repeated flags\n * elsewhere in this CLI; here a single `--ids a,b,c` is the contract, so the\n * citty value is enough and there is nothing to lose.\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"],"mappings":"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","names":[]}
@@ -0,0 +1,19 @@
1
+ import {
2
+ latestVersion
3
+ } from "./chunk-5UCP4EEQ.js";
4
+ import {
5
+ canvasOutputsRoot
6
+ } from "./chunk-TNOSX3PJ.js";
7
+
8
+ // src/commands/creatives/version-of.ts
9
+ import path from "path";
10
+ async function versionOf(slug, run) {
11
+ if (typeof run === "string" && run.trim()) return run.trim();
12
+ const canvas = path.join("src", "creatives", slug, `${slug}.canvas.json`);
13
+ return await latestVersion(canvasOutputsRoot(canvas), slug) ?? void 0;
14
+ }
15
+
16
+ export {
17
+ versionOf
18
+ };
19
+ //# sourceMappingURL=chunk-GBNJQNDS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/creatives/version-of.ts"],"sourcesContent":["import path from \"node:path\";\nimport { canvasOutputsRoot } from \"../canvas/normalize-paths.ts\";\nimport { latestVersion } from \"../canvas/render-state.ts\";\n\n/** The version a command names: `--run` when given, else the one the creative shows now (`latestVersion`). */\nexport async function versionOf(slug: string, run: unknown): Promise<string | undefined> {\n if (typeof run === \"string\" && run.trim()) return run.trim();\n const canvas = path.join(\"src\", \"creatives\", slug, `${slug}.canvas.json`);\n return (await latestVersion(canvasOutputsRoot(canvas), slug)) ?? undefined;\n}\n"],"mappings":";;;;;;;;AAAA,OAAO,UAAU;AAKjB,eAAsB,UAAU,MAAc,KAA2C;AACvF,MAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,EAAG,QAAO,IAAI,KAAK;AAC3D,QAAM,SAAS,KAAK,KAAK,OAAO,aAAa,MAAM,GAAG,IAAI,cAAc;AACxE,SAAQ,MAAM,cAAc,kBAAkB,MAAM,GAAG,IAAI,KAAM;AACnE;","names":[]}