@koda-sl/baker-cli 0.385.0-dev.ec7b0e42b → 0.385.0-dev.f7ef4c7e1

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 (963) hide show
  1. package/README.md +1082 -210
  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-G6QK2VXQ.js +79 -0
  7. package/dist/account-G6QK2VXQ.js.map +1 -0
  8. package/dist/account-OINZG6UP.js +80 -0
  9. package/dist/account-OINZG6UP.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-7KRRRVLB.js +611 -0
  15. package/dist/accounts-7KRRRVLB.js.map +1 -0
  16. package/dist/accounts-AEBQFCNH.js +114 -0
  17. package/dist/accounts-AEBQFCNH.js.map +1 -0
  18. package/dist/accounts-CNTOHRQ2.js +77 -0
  19. package/dist/accounts-CNTOHRQ2.js.map +1 -0
  20. package/dist/accounts-HP4BLKK5.js +75 -0
  21. package/dist/accounts-HP4BLKK5.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-QO7VQ6UV.js +55 -0
  25. package/dist/actions-QO7VQ6UV.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-5JBMJHNW.js +302 -0
  39. package/dist/add-5JBMJHNW.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-O76R2SPE.js +104 -0
  43. package/dist/add-O76R2SPE.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-T5JWNFSA.js +40 -0
  51. package/dist/ads-T5JWNFSA.js.map +1 -0
  52. package/dist/ads-TFZ5PXKS.js +77 -0
  53. package/dist/ads-TFZ5PXKS.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-LJ2HKJ4W.js +125 -0
  57. package/dist/advertisers-LJ2HKJ4W.js.map +1 -0
  58. package/dist/advertisers-WJW5DK3Q.js +120 -0
  59. package/dist/advertisers-WJW5DK3Q.js.map +1 -0
  60. package/dist/analytics-HIOC3TUK.js +1976 -0
  61. package/dist/analytics-HIOC3TUK.js.map +1 -0
  62. package/dist/analytics-U2NLDV2V.js +433 -0
  63. package/dist/analytics-U2NLDV2V.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-V7EAR7VD.js +77 -0
  67. package/dist/assign-V7EAR7VD.js.map +1 -0
  68. package/dist/audience-size-GS7EDBDP.js +94 -0
  69. package/dist/audience-size-GS7EDBDP.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-HWK24VXI.js +88 -0
  77. package/dist/audit-HWK24VXI.js.map +1 -0
  78. package/dist/audit-WMZERUAA.js +151 -0
  79. package/dist/audit-WMZERUAA.js.map +1 -0
  80. package/dist/autocomplete-KQSTLQFS.js +111 -0
  81. package/dist/autocomplete-KQSTLQFS.js.map +1 -0
  82. package/dist/avatars-HAFQZD63.js +38 -0
  83. package/dist/avatars-HAFQZD63.js.map +1 -0
  84. package/dist/bid-pricing-5SORFAPE.js +99 -0
  85. package/dist/bid-pricing-5SORFAPE.js.map +1 -0
  86. package/dist/brand-EBG436YV.js +22 -0
  87. package/dist/brand-EBG436YV.js.map +1 -0
  88. package/dist/brief-AYXXPTHC.js +490 -0
  89. package/dist/brief-AYXXPTHC.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-U7723BBE.js +95 -0
  93. package/dist/campaign-groups-U7723BBE.js.map +1 -0
  94. package/dist/campaign-writes-CXS4KYB5.js +165 -0
  95. package/dist/campaign-writes-CXS4KYB5.js.map +1 -0
  96. package/dist/campaign-writes-M6JLF5AC.js +170 -0
  97. package/dist/campaign-writes-M6JLF5AC.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-7DWD2A5U.js +109 -0
  101. package/dist/campaigns-7DWD2A5U.js.map +1 -0
  102. package/dist/campaigns-F66OYA6N.js +107 -0
  103. package/dist/campaigns-F66OYA6N.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-3NYM5Y7G.js +46 -0
  107. package/dist/canvas-3NYM5Y7G.js.map +1 -0
  108. package/dist/capabilities-JNFYSGRD.js +144 -0
  109. package/dist/capabilities-JNFYSGRD.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-TUZANLQH.js +262 -0
  121. package/dist/chats-TUZANLQH.js.map +1 -0
  122. package/dist/chunk-25E6SC3F.js +363 -0
  123. package/dist/chunk-25E6SC3F.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-WLDM2TRF.js → chunk-2UFRHW3T.js} +4 -4
  127. package/dist/chunk-2Y5V23PU.js +29 -0
  128. package/dist/chunk-2Y5V23PU.js.map +1 -0
  129. package/dist/chunk-35NYNRRB.js +111 -0
  130. package/dist/chunk-35NYNRRB.js.map +1 -0
  131. package/dist/chunk-3ACMDRSE.js +39 -0
  132. package/dist/chunk-3ACMDRSE.js.map +1 -0
  133. package/dist/chunk-3M6RNCDD.js +26 -0
  134. package/dist/chunk-3M6RNCDD.js.map +1 -0
  135. package/dist/chunk-3VXQYDJN.js +1743 -0
  136. package/dist/chunk-3VXQYDJN.js.map +1 -0
  137. package/dist/chunk-42DF5DF3.js +304 -0
  138. package/dist/chunk-42DF5DF3.js.map +1 -0
  139. package/dist/chunk-44VXKO65.js +106 -0
  140. package/dist/chunk-44VXKO65.js.map +1 -0
  141. package/dist/chunk-4NZ47VXO.js +137 -0
  142. package/dist/chunk-4NZ47VXO.js.map +1 -0
  143. package/dist/chunk-4X3UR372.js +225 -0
  144. package/dist/chunk-4X3UR372.js.map +1 -0
  145. package/dist/chunk-5FEBUCJU.js +25 -0
  146. package/dist/chunk-5FEBUCJU.js.map +1 -0
  147. package/dist/chunk-5HYSKH77.js +315 -0
  148. package/dist/chunk-5HYSKH77.js.map +1 -0
  149. package/dist/chunk-5LBGFQWF.js +310 -0
  150. package/dist/chunk-5LBGFQWF.js.map +1 -0
  151. package/dist/chunk-5MBPIONY.js +29 -0
  152. package/dist/chunk-5MBPIONY.js.map +1 -0
  153. package/dist/chunk-6YMHGIHP.js +346 -0
  154. package/dist/chunk-6YMHGIHP.js.map +1 -0
  155. package/dist/{chunk-VZEDAFAR.js → chunk-6YYSUISH.js} +47 -8
  156. package/dist/chunk-6YYSUISH.js.map +1 -0
  157. package/dist/chunk-7GNU3P7X.js +175 -0
  158. package/dist/chunk-7GNU3P7X.js.map +1 -0
  159. package/dist/chunk-7OHWEF3I.js +98 -0
  160. package/dist/chunk-7OHWEF3I.js.map +1 -0
  161. package/dist/chunk-7TR3QVWM.js +57 -0
  162. package/dist/chunk-7TR3QVWM.js.map +1 -0
  163. package/dist/chunk-AADVCEL4.js +817 -0
  164. package/dist/chunk-AADVCEL4.js.map +1 -0
  165. package/dist/chunk-AG62YO7C.js +96 -0
  166. package/dist/chunk-AG62YO7C.js.map +1 -0
  167. package/dist/chunk-AIRIT4GF.js +75 -0
  168. package/dist/chunk-AIRIT4GF.js.map +1 -0
  169. package/dist/chunk-AP3TP6VG.js +139 -0
  170. package/dist/chunk-AP3TP6VG.js.map +1 -0
  171. package/dist/chunk-APP475IQ.js +474 -0
  172. package/dist/chunk-APP475IQ.js.map +1 -0
  173. package/dist/chunk-AR7PU7BB.js +76 -0
  174. package/dist/chunk-AR7PU7BB.js.map +1 -0
  175. package/dist/chunk-B4S72KSS.js +172 -0
  176. package/dist/chunk-B4S72KSS.js.map +1 -0
  177. package/dist/chunk-BIPIL4QA.js +486 -0
  178. package/dist/chunk-BIPIL4QA.js.map +1 -0
  179. package/dist/chunk-BPUSL5Y2.js +58 -0
  180. package/dist/chunk-BPUSL5Y2.js.map +1 -0
  181. package/dist/chunk-BR32GHYD.js +65 -0
  182. package/dist/chunk-BR32GHYD.js.map +1 -0
  183. package/dist/chunk-CAMX6OHF.js +3182 -0
  184. package/dist/chunk-CAMX6OHF.js.map +1 -0
  185. package/dist/chunk-CE7RTOX6.js +494 -0
  186. package/dist/chunk-CE7RTOX6.js.map +1 -0
  187. package/dist/{chunk-MF7YA62W.js → chunk-CUL3VB4L.js} +10 -5
  188. package/dist/chunk-CUL3VB4L.js.map +1 -0
  189. package/dist/chunk-CVEY353K.js +66 -0
  190. package/dist/chunk-CVEY353K.js.map +1 -0
  191. package/dist/chunk-CWXADUKL.js +1599 -0
  192. package/dist/chunk-CWXADUKL.js.map +1 -0
  193. package/dist/chunk-D46NOXRY.js +6212 -0
  194. package/dist/chunk-D46NOXRY.js.map +1 -0
  195. package/dist/chunk-D5FY4FAK.js +24 -0
  196. package/dist/chunk-D5FY4FAK.js.map +1 -0
  197. package/dist/chunk-DGCUPJZD.js +39 -0
  198. package/dist/chunk-DGCUPJZD.js.map +1 -0
  199. package/dist/chunk-DNCLWSHO.js +41 -0
  200. package/dist/chunk-DNCLWSHO.js.map +1 -0
  201. package/dist/chunk-DUPURL26.js +97 -0
  202. package/dist/chunk-DUPURL26.js.map +1 -0
  203. package/dist/chunk-DXJYQ5P2.js +625 -0
  204. package/dist/chunk-DXJYQ5P2.js.map +1 -0
  205. package/dist/chunk-E2ZOSNF5.js +96 -0
  206. package/dist/chunk-E2ZOSNF5.js.map +1 -0
  207. package/dist/chunk-E3HYHT7C.js +274 -0
  208. package/dist/chunk-E3HYHT7C.js.map +1 -0
  209. package/dist/chunk-EDLZGTGN.js +216 -0
  210. package/dist/chunk-EDLZGTGN.js.map +1 -0
  211. package/dist/{chunk-XHC4LMK4.js → chunk-EIGXX6KI.js} +16 -8
  212. package/dist/chunk-EIGXX6KI.js.map +1 -0
  213. package/dist/chunk-EPDE7ZRU.js +174 -0
  214. package/dist/chunk-EPDE7ZRU.js.map +1 -0
  215. package/dist/chunk-ERSX3MKH.js +34 -0
  216. package/dist/chunk-ERSX3MKH.js.map +1 -0
  217. package/dist/chunk-F7HRLPR5.js +67 -0
  218. package/dist/chunk-F7HRLPR5.js.map +1 -0
  219. package/dist/chunk-FEG6MN4H.js +84 -0
  220. package/dist/chunk-FEG6MN4H.js.map +1 -0
  221. package/dist/chunk-FKOECEVC.js +126 -0
  222. package/dist/chunk-FKOECEVC.js.map +1 -0
  223. package/dist/chunk-FMGW2NZI.js +106 -0
  224. package/dist/chunk-FMGW2NZI.js.map +1 -0
  225. package/dist/chunk-FPZKKNDK.js +98 -0
  226. package/dist/chunk-FPZKKNDK.js.map +1 -0
  227. package/dist/chunk-G3ZDLPNZ.js +206 -0
  228. package/dist/chunk-G3ZDLPNZ.js.map +1 -0
  229. package/dist/chunk-GIWHHCD6.js +145 -0
  230. package/dist/chunk-GIWHHCD6.js.map +1 -0
  231. package/dist/chunk-GOJXKIFQ.js +1605 -0
  232. package/dist/chunk-GOJXKIFQ.js.map +1 -0
  233. package/dist/chunk-GRQ2AXDX.js +9 -0
  234. package/dist/chunk-GRQ2AXDX.js.map +1 -0
  235. package/dist/chunk-GXDLWBOY.js +73 -0
  236. package/dist/chunk-GXDLWBOY.js.map +1 -0
  237. package/dist/chunk-HAE4WWFQ.js +455 -0
  238. package/dist/chunk-HAE4WWFQ.js.map +1 -0
  239. package/dist/chunk-HEEAC2YG.js +541 -0
  240. package/dist/chunk-HEEAC2YG.js.map +1 -0
  241. package/dist/chunk-I2DNBEV6.js +4227 -0
  242. package/dist/chunk-I2DNBEV6.js.map +1 -0
  243. package/dist/chunk-I4FTS5EE.js +455 -0
  244. package/dist/chunk-I4FTS5EE.js.map +1 -0
  245. package/dist/chunk-IA4KJU7O.js +3151 -0
  246. package/dist/chunk-IA4KJU7O.js.map +1 -0
  247. package/dist/chunk-IELPT4K2.js +74 -0
  248. package/dist/chunk-IELPT4K2.js.map +1 -0
  249. package/dist/chunk-IJMWEO4P.js +57 -0
  250. package/dist/chunk-IJMWEO4P.js.map +1 -0
  251. package/dist/chunk-IVIJJXXT.js +62 -0
  252. package/dist/chunk-IVIJJXXT.js.map +1 -0
  253. package/dist/chunk-JAU6OAFK.js +455 -0
  254. package/dist/chunk-JAU6OAFK.js.map +1 -0
  255. package/dist/chunk-JD3W3ON7.js +188 -0
  256. package/dist/chunk-JD3W3ON7.js.map +1 -0
  257. package/dist/chunk-JLWBK3VC.js +5187 -0
  258. package/dist/chunk-JLWBK3VC.js.map +1 -0
  259. package/dist/chunk-JPK34QPS.js +134 -0
  260. package/dist/chunk-JPK34QPS.js.map +1 -0
  261. package/dist/chunk-JXJD6RC5.js +169 -0
  262. package/dist/chunk-JXJD6RC5.js.map +1 -0
  263. package/dist/chunk-JXMZEOHV.js +333 -0
  264. package/dist/chunk-JXMZEOHV.js.map +1 -0
  265. package/dist/chunk-K6TDB2KV.js +1442 -0
  266. package/dist/chunk-K6TDB2KV.js.map +1 -0
  267. package/dist/chunk-KIGGMKAE.js +66 -0
  268. package/dist/chunk-KIGGMKAE.js.map +1 -0
  269. package/dist/chunk-KKJ4KJCW.js +29 -0
  270. package/dist/chunk-KKJ4KJCW.js.map +1 -0
  271. package/dist/chunk-KONA5PSR.js +55 -0
  272. package/dist/chunk-KONA5PSR.js.map +1 -0
  273. package/dist/chunk-KVHRW7KO.js +60 -0
  274. package/dist/chunk-KVHRW7KO.js.map +1 -0
  275. package/dist/chunk-LA6PPSNA.js +65 -0
  276. package/dist/chunk-LA6PPSNA.js.map +1 -0
  277. package/dist/chunk-LKPJADL2.js +74 -0
  278. package/dist/chunk-LKPJADL2.js.map +1 -0
  279. package/dist/chunk-LM7N7IQR.js +297 -0
  280. package/dist/chunk-LM7N7IQR.js.map +1 -0
  281. package/dist/chunk-LWAEHLKV.js +74 -0
  282. package/dist/chunk-LWAEHLKV.js.map +1 -0
  283. package/dist/chunk-M6UNISGO.js +66 -0
  284. package/dist/chunk-M6UNISGO.js.map +1 -0
  285. package/dist/chunk-MFSIACRB.js +207 -0
  286. package/dist/chunk-MFSIACRB.js.map +1 -0
  287. package/dist/chunk-MIJAGBEP.js +23992 -0
  288. package/dist/chunk-MIJAGBEP.js.map +1 -0
  289. package/dist/chunk-MYTDK3AL.js +2102 -0
  290. package/dist/chunk-MYTDK3AL.js.map +1 -0
  291. package/dist/chunk-MYURCD23.js +6667 -0
  292. package/dist/chunk-MYURCD23.js.map +1 -0
  293. package/dist/chunk-MZQ5DX6S.js +125 -0
  294. package/dist/chunk-MZQ5DX6S.js.map +1 -0
  295. package/dist/chunk-NFSLRRIE.js +77 -0
  296. package/dist/chunk-NFSLRRIE.js.map +1 -0
  297. package/dist/chunk-NMDP7FZP.js +479 -0
  298. package/dist/chunk-NMDP7FZP.js.map +1 -0
  299. package/dist/chunk-NMGELUIA.js +183 -0
  300. package/dist/chunk-NMGELUIA.js.map +1 -0
  301. package/dist/chunk-NOK7MSVJ.js +533 -0
  302. package/dist/chunk-NOK7MSVJ.js.map +1 -0
  303. package/dist/chunk-O2EVJALZ.js +133 -0
  304. package/dist/chunk-O2EVJALZ.js.map +1 -0
  305. package/dist/chunk-OIL6PU5W.js +35 -0
  306. package/dist/chunk-OIL6PU5W.js.map +1 -0
  307. package/dist/chunk-P4NSJS54.js +20 -0
  308. package/dist/chunk-P4NSJS54.js.map +1 -0
  309. package/dist/chunk-P5T7OZKV.js +26 -0
  310. package/dist/chunk-P5T7OZKV.js.map +1 -0
  311. package/dist/chunk-PFBQERWX.js +10 -0
  312. package/dist/chunk-PFBQERWX.js.map +1 -0
  313. package/dist/chunk-PSWVSLJU.js +56 -0
  314. package/dist/chunk-PSWVSLJU.js.map +1 -0
  315. package/dist/chunk-PY2NJ6XZ.js +191 -0
  316. package/dist/chunk-PY2NJ6XZ.js.map +1 -0
  317. package/dist/chunk-PZ4OM2LK.js +45 -0
  318. package/dist/chunk-PZ4OM2LK.js.map +1 -0
  319. package/dist/chunk-Q2EKN7NI.js +1079 -0
  320. package/dist/chunk-Q2EKN7NI.js.map +1 -0
  321. package/dist/chunk-Q6ULQMWG.js +41 -0
  322. package/dist/chunk-Q6ULQMWG.js.map +1 -0
  323. package/dist/chunk-QMLGJ5OW.js +2891 -0
  324. package/dist/chunk-QMLGJ5OW.js.map +1 -0
  325. package/dist/chunk-R7QV5N2S.js +846 -0
  326. package/dist/chunk-R7QV5N2S.js.map +1 -0
  327. package/dist/chunk-RCS4JKUD.js +23 -0
  328. package/dist/chunk-RCS4JKUD.js.map +1 -0
  329. package/dist/chunk-RR3KT2E7.js +665 -0
  330. package/dist/chunk-RR3KT2E7.js.map +1 -0
  331. package/dist/chunk-SEPPFM5S.js +228 -0
  332. package/dist/chunk-SEPPFM5S.js.map +1 -0
  333. package/dist/chunk-SQ7DRYCC.js +150 -0
  334. package/dist/chunk-SQ7DRYCC.js.map +1 -0
  335. package/dist/chunk-SYULM665.js +610 -0
  336. package/dist/chunk-SYULM665.js.map +1 -0
  337. package/dist/chunk-TKT3OHZ6.js +170 -0
  338. package/dist/chunk-TKT3OHZ6.js.map +1 -0
  339. package/dist/chunk-TNOSX3PJ.js +136 -0
  340. package/dist/chunk-TNOSX3PJ.js.map +1 -0
  341. package/dist/chunk-TTVKI54A.js +160 -0
  342. package/dist/chunk-TTVKI54A.js.map +1 -0
  343. package/dist/chunk-U55UZRIB.js +592 -0
  344. package/dist/chunk-U55UZRIB.js.map +1 -0
  345. package/dist/chunk-UI6BKYQD.js +225 -0
  346. package/dist/chunk-UI6BKYQD.js.map +1 -0
  347. package/dist/chunk-UKE4IZSA.js +337 -0
  348. package/dist/chunk-UKE4IZSA.js.map +1 -0
  349. package/dist/chunk-UKLDW4UW.js +46 -0
  350. package/dist/chunk-UKLDW4UW.js.map +1 -0
  351. package/dist/chunk-V6XXXEXZ.js +76 -0
  352. package/dist/chunk-V6XXXEXZ.js.map +1 -0
  353. package/dist/chunk-VCZSZCXY.js +197 -0
  354. package/dist/chunk-VCZSZCXY.js.map +1 -0
  355. package/dist/chunk-VJQWUF66.js +92 -0
  356. package/dist/chunk-VJQWUF66.js.map +1 -0
  357. package/dist/chunk-VSU5R34H.js +76 -0
  358. package/dist/chunk-VSU5R34H.js.map +1 -0
  359. package/dist/chunk-W4SA4CMR.js +296 -0
  360. package/dist/chunk-W4SA4CMR.js.map +1 -0
  361. package/dist/chunk-WFUMNDCE.js +111 -0
  362. package/dist/chunk-WFUMNDCE.js.map +1 -0
  363. package/dist/chunk-WGCGKU3M.js +51 -0
  364. package/dist/chunk-WGCGKU3M.js.map +1 -0
  365. package/dist/chunk-WHWNXLTD.js +166 -0
  366. package/dist/chunk-WHWNXLTD.js.map +1 -0
  367. package/dist/chunk-WN42X2OE.js +509 -0
  368. package/dist/chunk-WN42X2OE.js.map +1 -0
  369. package/dist/chunk-WN4KX7GE.js +25 -0
  370. package/dist/chunk-WN4KX7GE.js.map +1 -0
  371. package/dist/chunk-XIY7P54H.js +84 -0
  372. package/dist/chunk-XIY7P54H.js.map +1 -0
  373. package/dist/chunk-XPLTWUMN.js +103 -0
  374. package/dist/chunk-XPLTWUMN.js.map +1 -0
  375. package/dist/chunk-Y6T5ZKBK.js +19 -0
  376. package/dist/chunk-Y6T5ZKBK.js.map +1 -0
  377. package/dist/chunk-YGGRQXDP.js +382 -0
  378. package/dist/chunk-YGGRQXDP.js.map +1 -0
  379. package/dist/chunk-YMBB4JBD.js +1830 -0
  380. package/dist/chunk-YMBB4JBD.js.map +1 -0
  381. package/dist/chunk-YNWM426O.js +159 -0
  382. package/dist/chunk-YNWM426O.js.map +1 -0
  383. package/dist/chunk-YQSBHWOI.js +41 -0
  384. package/dist/chunk-YTF3IVMF.js +149 -0
  385. package/dist/chunk-YTF3IVMF.js.map +1 -0
  386. package/dist/chunk-Z3ENMCFE.js +94 -0
  387. package/dist/chunk-Z3ENMCFE.js.map +1 -0
  388. package/dist/chunk-Z7MWSXLG.js +94 -0
  389. package/dist/chunk-Z7MWSXLG.js.map +1 -0
  390. package/dist/chunk-ZIXHS6AM.js +42 -0
  391. package/dist/chunk-ZIXHS6AM.js.map +1 -0
  392. package/dist/chunk-ZJ7TQUCU.js +4410 -0
  393. package/dist/chunk-ZJ7TQUCU.js.map +1 -0
  394. package/dist/chunk-ZNQRDLSS.js +52 -0
  395. package/dist/chunk-ZNQRDLSS.js.map +1 -0
  396. package/dist/chunk-ZPGGSXU3.js +275 -0
  397. package/dist/chunk-ZPGGSXU3.js.map +1 -0
  398. package/dist/claim-NXYQZEMC.js +197 -0
  399. package/dist/claim-NXYQZEMC.js.map +1 -0
  400. package/dist/cli.js +104 -70061
  401. package/dist/cli.js.map +1 -1
  402. package/dist/client-EURRWXPW.js +19 -0
  403. package/dist/code-FKQW7V7N.js +76 -0
  404. package/dist/code-FKQW7V7N.js.map +1 -0
  405. package/dist/companies-5ZH47E4H.js +195 -0
  406. package/dist/companies-5ZH47E4H.js.map +1 -0
  407. package/dist/complete-62OQPRHW.js +81 -0
  408. package/dist/complete-62OQPRHW.js.map +1 -0
  409. package/dist/config-OZOHIAOJ.js +88 -0
  410. package/dist/config-OZOHIAOJ.js.map +1 -0
  411. package/dist/connect-6DQFYKGN.js +42 -0
  412. package/dist/content-PCGSX2QU.js +85 -0
  413. package/dist/content-PCGSX2QU.js.map +1 -0
  414. package/dist/conversation-NS7JHTPK.js +93 -0
  415. package/dist/conversation-NS7JHTPK.js.map +1 -0
  416. package/dist/conversion-report-7QSWB2FY.js +125 -0
  417. package/dist/conversion-report-7QSWB2FY.js.map +1 -0
  418. package/dist/conversion-upload-command-XESIAQPU.js +438 -0
  419. package/dist/conversion-upload-command-XESIAQPU.js.map +1 -0
  420. package/dist/conversion-writes-BGOVLBS5.js +120 -0
  421. package/dist/conversion-writes-BGOVLBS5.js.map +1 -0
  422. package/dist/conversions-46MI57VC.js +135 -0
  423. package/dist/conversions-46MI57VC.js.map +1 -0
  424. package/dist/conversions-IYIWW4O7.js +76 -0
  425. package/dist/conversions-IYIWW4O7.js.map +1 -0
  426. package/dist/countries-5OBUVLLD.js +82 -0
  427. package/dist/countries-5OBUVLLD.js.map +1 -0
  428. package/dist/create-BEDPXUB7.js +236 -0
  429. package/dist/create-BEDPXUB7.js.map +1 -0
  430. package/dist/create-LLTMBBGV.js +207 -0
  431. package/dist/create-LLTMBBGV.js.map +1 -0
  432. package/dist/create-VNJ2VH3A.js +59 -0
  433. package/dist/create-VNJ2VH3A.js.map +1 -0
  434. package/dist/create-ZYKG2XOP.js +138 -0
  435. package/dist/create-ZYKG2XOP.js.map +1 -0
  436. package/dist/creatives-2LL66X4E.js +51 -0
  437. package/dist/creatives-2LL66X4E.js.map +1 -0
  438. package/dist/creatives-3MEMSUKJ.js +182 -0
  439. package/dist/creatives-3MEMSUKJ.js.map +1 -0
  440. package/dist/creatives-XI2DGQUZ.js +87 -0
  441. package/dist/creatives-XI2DGQUZ.js.map +1 -0
  442. package/dist/credentials-63PRTM3K.js +287 -0
  443. package/dist/credentials-63PRTM3K.js.map +1 -0
  444. package/dist/critique-IQI7CCTT.js +213 -0
  445. package/dist/critique-IQI7CCTT.js.map +1 -0
  446. package/dist/critique-UV7FPG45.js +1449 -0
  447. package/dist/critique-UV7FPG45.js.map +1 -0
  448. package/dist/crm-OERYUOBS.js +224 -0
  449. package/dist/crm-OERYUOBS.js.map +1 -0
  450. package/dist/crm-VNO3QTQG.js +318 -0
  451. package/dist/crm-VNO3QTQG.js.map +1 -0
  452. package/dist/crop-B52KIQ4O.js +113 -0
  453. package/dist/crop-B52KIQ4O.js.map +1 -0
  454. package/dist/currency-GGWF5DMU.js +88 -0
  455. package/dist/currency-GGWF5DMU.js.map +1 -0
  456. package/dist/custom-conversions-7WDBTC4X.js +125 -0
  457. package/dist/custom-conversions-7WDBTC4X.js.map +1 -0
  458. package/dist/customers-FOPXEGCB.js +56 -0
  459. package/dist/decide-PK7WNSQ2.js +199 -0
  460. package/dist/decide-PK7WNSQ2.js.map +1 -0
  461. package/dist/delete-56LKNEGA.js +71 -0
  462. package/dist/delete-56LKNEGA.js.map +1 -0
  463. package/dist/delete-EZ7HHOOD.js +69 -0
  464. package/dist/delete-EZ7HHOOD.js.map +1 -0
  465. package/dist/delete-JSYM7QKN.js +54 -0
  466. package/dist/delete-JSYM7QKN.js.map +1 -0
  467. package/dist/delete-NOUWBNZM.js +66 -0
  468. package/dist/delete-NOUWBNZM.js.map +1 -0
  469. package/dist/delete-T33AWV63.js +63 -0
  470. package/dist/delete-T33AWV63.js.map +1 -0
  471. package/dist/delete-YSYVFL6W.js +71 -0
  472. package/dist/delete-YSYVFL6W.js.map +1 -0
  473. package/dist/demographics-LQGFUS4F.js +138 -0
  474. package/dist/demographics-LQGFUS4F.js.map +1 -0
  475. package/dist/describe-AAVYIFE3.js +97 -0
  476. package/dist/describe-AAVYIFE3.js.map +1 -0
  477. package/dist/describe-UQFLWVFR.js +97 -0
  478. package/dist/describe-UQFLWVFR.js.map +1 -0
  479. package/dist/dimensions-QDXBG2XC.js +101 -0
  480. package/dist/dimensions-QDXBG2XC.js.map +1 -0
  481. package/dist/discard-V4LQ7ZGA.js +66 -0
  482. package/dist/discard-V4LQ7ZGA.js.map +1 -0
  483. package/dist/discover-6TEBPVNC.js +93 -0
  484. package/dist/discover-6TEBPVNC.js.map +1 -0
  485. package/dist/discover-SBZPB7T2.js +172 -0
  486. package/dist/discover-SBZPB7T2.js.map +1 -0
  487. package/dist/domain-65J2DEDB.js +98 -0
  488. package/dist/domain-65J2DEDB.js.map +1 -0
  489. package/dist/download-LV3GPOWV.js +299 -0
  490. package/dist/download-LV3GPOWV.js.map +1 -0
  491. package/dist/draft-DDFFTZ43.js +233 -0
  492. package/dist/draft-DDFFTZ43.js.map +1 -0
  493. package/dist/draft-FIKJXNIQ.js +281 -0
  494. package/dist/draft-FIKJXNIQ.js.map +1 -0
  495. package/dist/draft-GYGWTMBU.js +307 -0
  496. package/dist/draft-GYGWTMBU.js.map +1 -0
  497. package/dist/draft-KNXVZAZV.js +217 -0
  498. package/dist/draft-KNXVZAZV.js.map +1 -0
  499. package/dist/draft-N4LFPKTA.js +100 -0
  500. package/dist/draft-N4LFPKTA.js.map +1 -0
  501. package/dist/draft-NG2DPL2X.js +306 -0
  502. package/dist/draft-NG2DPL2X.js.map +1 -0
  503. package/dist/draft-QILZ7M7N.js +328 -0
  504. package/dist/draft-QILZ7M7N.js.map +1 -0
  505. package/dist/draft-XPO5RWST.js +103 -0
  506. package/dist/draft-XPO5RWST.js.map +1 -0
  507. package/dist/engine/index.d.ts +213 -127
  508. package/dist/engine/index.js +18 -4
  509. package/dist/{env-4P5HOGNA.js → env-TQ2XS2KY.js} +12 -2
  510. package/dist/env-TQ2XS2KY.js.map +1 -0
  511. package/dist/experiment-FQNKMORZ.js +1397 -0
  512. package/dist/experiment-FQNKMORZ.js.map +1 -0
  513. package/dist/export-4IZQZAPF.js +168 -0
  514. package/dist/export-4IZQZAPF.js.map +1 -0
  515. package/dist/extract-DZMGVQ7D.js +113 -0
  516. package/dist/extract-DZMGVQ7D.js.map +1 -0
  517. package/dist/facets-FAAOFHBF.js +114 -0
  518. package/dist/facets-FAAOFHBF.js.map +1 -0
  519. package/dist/favorites-DD2LNSTG.js +178 -0
  520. package/dist/favorites-DD2LNSTG.js.map +1 -0
  521. package/dist/feed-TUVFNX2U.js +177 -0
  522. package/dist/feed-TUVFNX2U.js.map +1 -0
  523. package/dist/feedback-NWOOZOFW.js +66 -0
  524. package/dist/feedback-NWOOZOFW.js.map +1 -0
  525. package/dist/feedback-record-CFPUKLMY.js +175 -0
  526. package/dist/feedback-record-CFPUKLMY.js.map +1 -0
  527. package/dist/fetch-LEY77E7V.js +176 -0
  528. package/dist/fetch-LEY77E7V.js.map +1 -0
  529. package/dist/fetch-O6UHNXWB.js +139 -0
  530. package/dist/fetch-O6UHNXWB.js.map +1 -0
  531. package/dist/find-4XKIBF4D.js +134 -0
  532. package/dist/find-4XKIBF4D.js.map +1 -0
  533. package/dist/fit-ODVVXV2Q.js +45 -0
  534. package/dist/fit-ODVVXV2Q.js.map +1 -0
  535. package/dist/flows-QKPC63AF.js +247 -0
  536. package/dist/flows-QKPC63AF.js.map +1 -0
  537. package/dist/follow-RCOXTZGY.js +94 -0
  538. package/dist/follow-RCOXTZGY.js.map +1 -0
  539. package/dist/follow-competitors-SQ5XBFTK.js +112 -0
  540. package/dist/follow-competitors-SQ5XBFTK.js.map +1 -0
  541. package/dist/following-VDU3BHC4.js +113 -0
  542. package/dist/following-VDU3BHC4.js.map +1 -0
  543. package/dist/fonts-WM2MJDVJ.js +34 -0
  544. package/dist/fonts-WM2MJDVJ.js.map +1 -0
  545. package/dist/forecast-2GJKBNBM.js +168 -0
  546. package/dist/forecast-2GJKBNBM.js.map +1 -0
  547. package/dist/forecast-7K3TAHDL.js +104 -0
  548. package/dist/forecast-7K3TAHDL.js.map +1 -0
  549. package/dist/funding-HTFVZLLG.js +85 -0
  550. package/dist/funding-HTFVZLLG.js.map +1 -0
  551. package/dist/funnel-CSPK5SPZ.js +394 -0
  552. package/dist/funnel-CSPK5SPZ.js.map +1 -0
  553. package/dist/ga4-2RC4EH7V.js +55 -0
  554. package/dist/ga4-2RC4EH7V.js.map +1 -0
  555. package/dist/generate-TPDOBCKQ.js +262 -0
  556. package/dist/generate-TPDOBCKQ.js.map +1 -0
  557. package/dist/get-4YZ4PI3B.js +56 -0
  558. package/dist/get-4YZ4PI3B.js.map +1 -0
  559. package/dist/get-FH2LIEYL.js +63 -0
  560. package/dist/get-FH2LIEYL.js.map +1 -0
  561. package/dist/get-GZLCDXXW.js +61 -0
  562. package/dist/get-GZLCDXXW.js.map +1 -0
  563. package/dist/get-HFU6ZJPX.js +78 -0
  564. package/dist/get-HFU6ZJPX.js.map +1 -0
  565. package/dist/get-TSPQYEKC.js +59 -0
  566. package/dist/get-TSPQYEKC.js.map +1 -0
  567. package/dist/get-TY3RXYNZ.js +63 -0
  568. package/dist/get-TY3RXYNZ.js.map +1 -0
  569. package/dist/get-VPW33XTN.js +92 -0
  570. package/dist/get-VPW33XTN.js.map +1 -0
  571. package/dist/gif-JFEYPFFI.js +94 -0
  572. package/dist/gif-JFEYPFFI.js.map +1 -0
  573. package/dist/google-R6RD4L6Z.js +136 -0
  574. package/dist/google-R6RD4L6Z.js.map +1 -0
  575. package/dist/google-VPQNRVIB.js +3190 -0
  576. package/dist/google-VPQNRVIB.js.map +1 -0
  577. package/dist/google-ads-WWM5KIRS.js +195 -0
  578. package/dist/google-ads-WWM5KIRS.js.map +1 -0
  579. package/dist/group-7AV6UL26.js +43 -0
  580. package/dist/group-7AV6UL26.js.map +1 -0
  581. package/dist/group-BVQZEZIC.js +43 -0
  582. package/dist/group-BVQZEZIC.js.map +1 -0
  583. package/dist/gsc-SQ42WAQE.js +30 -0
  584. package/dist/gsc-SQ42WAQE.js.map +1 -0
  585. package/dist/history-BNNHFURR.js +67 -0
  586. package/dist/history-BNNHFURR.js.map +1 -0
  587. package/dist/history-KBK5TP65.js +133 -0
  588. package/dist/history-KBK5TP65.js.map +1 -0
  589. package/dist/hubspot-GAAWWVLL.js +779 -0
  590. package/dist/hubspot-GAAWWVLL.js.map +1 -0
  591. package/dist/icon-OYTTSNSL.js +137 -0
  592. package/dist/icon-OYTTSNSL.js.map +1 -0
  593. package/dist/ideas-CELMD3BL.js +32 -0
  594. package/dist/ideas-CELMD3BL.js.map +1 -0
  595. package/dist/images-QHV4ECAP.js +90 -0
  596. package/dist/images-QHV4ECAP.js.map +1 -0
  597. package/dist/improve-W6GZNT2A.js +86 -0
  598. package/dist/improve-W6GZNT2A.js.map +1 -0
  599. package/dist/ingest-SH35YX6X.js +23 -0
  600. package/dist/ingest-SH35YX6X.js.map +1 -0
  601. package/dist/ingest-UWCGJZXV.js +107 -0
  602. package/dist/ingest-UWCGJZXV.js.map +1 -0
  603. package/dist/insights-IW7LGAWU.js +423 -0
  604. package/dist/insights-IW7LGAWU.js.map +1 -0
  605. package/dist/insights-QH54F56A.js +122 -0
  606. package/dist/insights-QH54F56A.js.map +1 -0
  607. package/dist/inspect-6Z6HEMBI.js +189 -0
  608. package/dist/inspect-6Z6HEMBI.js.map +1 -0
  609. package/dist/inspiration-RDQ3Y3N3.js +53 -0
  610. package/dist/inspiration-RDQ3Y3N3.js.map +1 -0
  611. package/dist/intent-5GSSCFZ2.js +95 -0
  612. package/dist/intent-5GSSCFZ2.js.map +1 -0
  613. package/dist/job-URVXJP75.js +202 -0
  614. package/dist/job-URVXJP75.js.map +1 -0
  615. package/dist/job-create-S4SECUVF.js +109 -0
  616. package/dist/job-create-S4SECUVF.js.map +1 -0
  617. package/dist/job-status-253SUCTJ.js +74 -0
  618. package/dist/job-status-253SUCTJ.js.map +1 -0
  619. package/dist/keep-GPSYDIGJ.js +78 -0
  620. package/dist/keep-GPSYDIGJ.js.map +1 -0
  621. package/dist/keyword-gap-NTFDX43B.js +130 -0
  622. package/dist/keyword-gap-NTFDX43B.js.map +1 -0
  623. package/dist/keyword-metrics-NKZRCF4L.js +197 -0
  624. package/dist/keyword-metrics-NKZRCF4L.js.map +1 -0
  625. package/dist/keywords-for-site-NQUPJNUR.js +128 -0
  626. package/dist/keywords-for-site-NQUPJNUR.js.map +1 -0
  627. package/dist/landing-AHNZSZHY.js +28 -0
  628. package/dist/landing-AHNZSZHY.js.map +1 -0
  629. package/dist/landings-NEF4PQL2.js +151 -0
  630. package/dist/landings-NEF4PQL2.js.map +1 -0
  631. package/dist/languages-3RDPPPTE.js +55 -0
  632. package/dist/languages-3RDPPPTE.js.map +1 -0
  633. package/dist/languages-CQX3YOIT.js +40 -0
  634. package/dist/languages-CQX3YOIT.js.map +1 -0
  635. package/dist/launches-GBHLJH5S.js +19 -0
  636. package/dist/launches-GBHLJH5S.js.map +1 -0
  637. package/dist/layerize-Q56C6LFG.js +190 -0
  638. package/dist/layerize-Q56C6LFG.js.map +1 -0
  639. package/dist/leads-5MUVPXA2.js +90 -0
  640. package/dist/leads-5MUVPXA2.js.map +1 -0
  641. package/dist/leads-JHUM6FYR.js +293 -0
  642. package/dist/leads-JHUM6FYR.js.map +1 -0
  643. package/dist/learn-EMV7RWTB.js +203 -0
  644. package/dist/learn-EMV7RWTB.js.map +1 -0
  645. package/dist/library-6VUFHTEK.js +109 -0
  646. package/dist/library-6VUFHTEK.js.map +1 -0
  647. package/dist/lighthouse-57U2GMPV.js +75 -0
  648. package/dist/lighthouse-57U2GMPV.js.map +1 -0
  649. package/dist/line-item-writes-GMIZYHLB.js +208 -0
  650. package/dist/line-item-writes-GMIZYHLB.js.map +1 -0
  651. package/dist/line-items-B5HAC47U.js +103 -0
  652. package/dist/line-items-B5HAC47U.js.map +1 -0
  653. package/dist/link-B6ZJFGFE.js +64 -0
  654. package/dist/link-B6ZJFGFE.js.map +1 -0
  655. package/dist/linkedin-FJ3OUYT2.js +1008 -0
  656. package/dist/linkedin-FJ3OUYT2.js.map +1 -0
  657. package/dist/list-2MBSU4ZX.js +63 -0
  658. package/dist/list-2MBSU4ZX.js.map +1 -0
  659. package/dist/list-EFUPHLG3.js +303 -0
  660. package/dist/list-EFUPHLG3.js.map +1 -0
  661. package/dist/list-G57ZO4PG.js +50 -0
  662. package/dist/list-G57ZO4PG.js.map +1 -0
  663. package/dist/list-JCSWZWDI.js +57 -0
  664. package/dist/list-JCSWZWDI.js.map +1 -0
  665. package/dist/list-QOSPRCH4.js +151 -0
  666. package/dist/list-QOSPRCH4.js.map +1 -0
  667. package/dist/list-RINCJOAC.js +76 -0
  668. package/dist/list-RINCJOAC.js.map +1 -0
  669. package/dist/list-SRNXHS6L.js +51 -0
  670. package/dist/list-SRNXHS6L.js.map +1 -0
  671. package/dist/list-YJSO4M5Q.js +65 -0
  672. package/dist/list-YJSO4M5Q.js.map +1 -0
  673. package/dist/locations-HW2Y5OJO.js +67 -0
  674. package/dist/locations-HW2Y5OJO.js.map +1 -0
  675. package/dist/locations-XOHI3VWI.js +40 -0
  676. package/dist/locations-XOHI3VWI.js.map +1 -0
  677. package/dist/log-SZDYUMM3.js +92 -0
  678. package/dist/log-SZDYUMM3.js.map +1 -0
  679. package/dist/logo-KXTGIYBI.js +18 -0
  680. package/dist/logo-KXTGIYBI.js.map +1 -0
  681. package/dist/lookup-X6O5UNJH.js +22 -0
  682. package/dist/lookup-X6O5UNJH.js.map +1 -0
  683. package/dist/make-SGCBJTRR.js +633 -0
  684. package/dist/make-SGCBJTRR.js.map +1 -0
  685. package/dist/map-ZK46VVL3.js +404 -0
  686. package/dist/map-ZK46VVL3.js.map +1 -0
  687. package/dist/mcp-NCM5TQUG.js +463 -0
  688. package/dist/mcp-NCM5TQUG.js.map +1 -0
  689. package/dist/media-MI4EE7L4.js +89 -0
  690. package/dist/media-MI4EE7L4.js.map +1 -0
  691. package/dist/media-QUTQOBA7.js +15 -0
  692. package/dist/media-QUTQOBA7.js.map +1 -0
  693. package/dist/media-sources-MS3RMQ6A.js +32 -0
  694. package/dist/media-sources-MS3RMQ6A.js.map +1 -0
  695. package/dist/members-IGHLTQKW.js +44 -0
  696. package/dist/members-IGHLTQKW.js.map +1 -0
  697. package/dist/meta-E3JOUOSS.js +69 -0
  698. package/dist/meta-E3JOUOSS.js.map +1 -0
  699. package/dist/metrics-HQ7XJAYQ.js +152 -0
  700. package/dist/metrics-HQ7XJAYQ.js.map +1 -0
  701. package/dist/models-PGX3FBHU.js +155 -0
  702. package/dist/models-PGX3FBHU.js.map +1 -0
  703. package/dist/normalize-FPJ6GSOY.js +806 -0
  704. package/dist/normalize-FPJ6GSOY.js.map +1 -0
  705. package/dist/normalize-LHD5LVFK.js +141 -0
  706. package/dist/normalize-LHD5LVFK.js.map +1 -0
  707. package/dist/options-CPHN3RMO.js +121 -0
  708. package/dist/options-CPHN3RMO.js.map +1 -0
  709. package/dist/output-GQFJ2T5B.js +24 -0
  710. package/dist/output-GQFJ2T5B.js.map +1 -0
  711. package/dist/page-VTTSBC6Y.js +105 -0
  712. package/dist/page-VTTSBC6Y.js.map +1 -0
  713. package/dist/pages-PMZVNVQM.js +66 -0
  714. package/dist/pages-PMZVNVQM.js.map +1 -0
  715. package/dist/performance-ECIJJEFV.js +24 -0
  716. package/dist/performance-ECIJJEFV.js.map +1 -0
  717. package/dist/pinterest-UDNGOWDM.js +96 -0
  718. package/dist/pinterest-UDNGOWDM.js.map +1 -0
  719. package/dist/pixels-OYZDGCH3.js +108 -0
  720. package/dist/pixels-OYZDGCH3.js.map +1 -0
  721. package/dist/pixels-XKGNTCFX.js +60 -0
  722. package/dist/pixels-XKGNTCFX.js.map +1 -0
  723. package/dist/plan-DZS3TVIJ.js +207 -0
  724. package/dist/plan-DZS3TVIJ.js.map +1 -0
  725. package/dist/preview-DR6MXOGI.js +169 -0
  726. package/dist/preview-DR6MXOGI.js.map +1 -0
  727. package/dist/profile-VOVZG44G.js +159 -0
  728. package/dist/profile-VOVZG44G.js.map +1 -0
  729. package/dist/promoted-tweet-writes-UJJI5SQL.js +180 -0
  730. package/dist/promoted-tweet-writes-UJJI5SQL.js.map +1 -0
  731. package/dist/promoted-tweets-O5RCETPX.js +119 -0
  732. package/dist/promoted-tweets-O5RCETPX.js.map +1 -0
  733. package/dist/properties-MKVF7MUK.js +101 -0
  734. package/dist/properties-MKVF7MUK.js.map +1 -0
  735. package/dist/publish-RRYU3NNX.js +322 -0
  736. package/dist/publish-RRYU3NNX.js.map +1 -0
  737. package/dist/query-CNWQ6STR.js +61 -0
  738. package/dist/query-CNWQ6STR.js.map +1 -0
  739. package/dist/query-DBSBZ73C.js +247 -0
  740. package/dist/query-DBSBZ73C.js.map +1 -0
  741. package/dist/query-QK4U4TEL.js +236 -0
  742. package/dist/query-QK4U4TEL.js.map +1 -0
  743. package/dist/questionnaire-OVJWNUVV.js +93 -0
  744. package/dist/questionnaire-OVJWNUVV.js.map +1 -0
  745. package/dist/read-L2QIVJTL.js +141 -0
  746. package/dist/read-L2QIVJTL.js.map +1 -0
  747. package/dist/reddit-K6CKJZRF.js +26 -0
  748. package/dist/reddit-K6CKJZRF.js.map +1 -0
  749. package/dist/refresh-IF4P57JJ.js +94 -0
  750. package/dist/refresh-IF4P57JJ.js.map +1 -0
  751. package/dist/release-H4EL3J6R.js +60 -0
  752. package/dist/release-H4EL3J6R.js.map +1 -0
  753. package/dist/relevant-pages-CRI2NLWG.js +99 -0
  754. package/dist/relevant-pages-CRI2NLWG.js.map +1 -0
  755. package/dist/remove-DKSHQRNS.js +50 -0
  756. package/dist/remove-DKSHQRNS.js.map +1 -0
  757. package/dist/remove-JKSCGKQG.js +48 -0
  758. package/dist/remove-JKSCGKQG.js.map +1 -0
  759. package/dist/reopen-B26V2GEJ.js +63 -0
  760. package/dist/reopen-B26V2GEJ.js.map +1 -0
  761. package/dist/rerun-6WKE4MPY.js +84 -0
  762. package/dist/rerun-6WKE4MPY.js.map +1 -0
  763. package/dist/research-O3IVF3MM.js +62 -0
  764. package/dist/research-O3IVF3MM.js.map +1 -0
  765. package/dist/research-SC7S6IPV.js +262 -0
  766. package/dist/research-SC7S6IPV.js.map +1 -0
  767. package/dist/reset-7HMOB2KE.js +54 -0
  768. package/dist/reset-7HMOB2KE.js.map +1 -0
  769. package/dist/reset-THPEXZDK.js +54 -0
  770. package/dist/reset-THPEXZDK.js.map +1 -0
  771. package/dist/resolve-HX5R52A3.js +121 -0
  772. package/dist/resolve-HX5R52A3.js.map +1 -0
  773. package/dist/retry-4ENRUJOJ.js +62 -0
  774. package/dist/retry-4ENRUJOJ.js.map +1 -0
  775. package/dist/retry-ELIMI7U5.js +60 -0
  776. package/dist/retry-ELIMI7U5.js.map +1 -0
  777. package/dist/retry-failed-2OYMCB55.js +45 -0
  778. package/dist/retry-failed-2OYMCB55.js.map +1 -0
  779. package/dist/run-CY4BAIQI.js +65 -0
  780. package/dist/run-CY4BAIQI.js.map +1 -0
  781. package/dist/run-GXPPPDGI.js +59 -0
  782. package/dist/run-GXPPPDGI.js.map +1 -0
  783. package/dist/scaffold-ad-X6VPBVTB.js +1548 -0
  784. package/dist/scaffold-ad-X6VPBVTB.js.map +1 -0
  785. package/dist/scaffold-static-ad-LKOOZSDP.js +971 -0
  786. package/dist/scaffold-static-ad-LKOOZSDP.js.map +1 -0
  787. package/dist/scaffold-video-NAOIFIM4.js +872 -0
  788. package/dist/scaffold-video-NAOIFIM4.js.map +1 -0
  789. package/dist/schedule-TLYT5UXM.js +66 -0
  790. package/dist/schedule-TLYT5UXM.js.map +1 -0
  791. package/dist/schedule-V654LLZ2.js +61 -0
  792. package/dist/schedule-V654LLZ2.js.map +1 -0
  793. package/dist/scheduled-agents-MJNUZYEK.js +49 -0
  794. package/dist/scheduled-agents-MJNUZYEK.js.map +1 -0
  795. package/dist/schema-DN4WKWUM.js +132 -0
  796. package/dist/schema-DN4WKWUM.js.map +1 -0
  797. package/dist/schema-MZTVCNP4.js +63 -0
  798. package/dist/schema-MZTVCNP4.js.map +1 -0
  799. package/dist/scrape-T3DA7ER7.js +2241 -0
  800. package/dist/scrape-T3DA7ER7.js.map +1 -0
  801. package/dist/screenshot-EIGC6SZB.js +102 -0
  802. package/dist/screenshot-EIGC6SZB.js.map +1 -0
  803. package/dist/search-2SVUDZIX.js +224 -0
  804. package/dist/search-2SVUDZIX.js.map +1 -0
  805. package/dist/search-34NFJ5F6.js +26 -0
  806. package/dist/search-34NFJ5F6.js.map +1 -0
  807. package/dist/search-BWE3OPOY.js +91 -0
  808. package/dist/search-BWE3OPOY.js.map +1 -0
  809. package/dist/search-EYYAOZND.js +92 -0
  810. package/dist/search-EYYAOZND.js.map +1 -0
  811. package/dist/search-EZZMYU4Y.js +174 -0
  812. package/dist/search-EZZMYU4Y.js.map +1 -0
  813. package/dist/search-copy-VKQ2OOBM.js +168 -0
  814. package/dist/search-copy-VKQ2OOBM.js.map +1 -0
  815. package/dist/seeds-HQYSVFIX.js +101 -0
  816. package/dist/seeds-HQYSVFIX.js.map +1 -0
  817. package/dist/select-3SIBANY6.js +94 -0
  818. package/dist/select-3SIBANY6.js.map +1 -0
  819. package/dist/sends-I7VQFE4S.js +309 -0
  820. package/dist/sends-I7VQFE4S.js.map +1 -0
  821. package/dist/sequences-JHSEJJGN.js +146 -0
  822. package/dist/sequences-JHSEJJGN.js.map +1 -0
  823. package/dist/set-prompt-RAG7RJOD.js +185 -0
  824. package/dist/set-prompt-RAG7RJOD.js.map +1 -0
  825. package/dist/setup-links-TNRBFS5Z.js +141 -0
  826. package/dist/setup-links-TNRBFS5Z.js.map +1 -0
  827. package/dist/{shared-6762QE6R.js → shared-AT3FXPAG.js} +8 -6
  828. package/dist/shared-AT3FXPAG.js.map +1 -0
  829. package/dist/shopify-LUETQ5NT.js +3819 -0
  830. package/dist/shopify-LUETQ5NT.js.map +1 -0
  831. package/dist/site-SDL6LF6D.js +177 -0
  832. package/dist/site-SDL6LF6D.js.map +1 -0
  833. package/dist/sitemaps-FG37N5EB.js +87 -0
  834. package/dist/sitemaps-FG37N5EB.js.map +1 -0
  835. package/dist/sites-FIXK4Y3O.js +101 -0
  836. package/dist/sites-FIXK4Y3O.js.map +1 -0
  837. package/dist/skills-OKVCVQVD.js +47 -0
  838. package/dist/skills-OKVCVQVD.js.map +1 -0
  839. package/dist/sources-ISAUZFRN.js +30 -0
  840. package/dist/sources-ISAUZFRN.js.map +1 -0
  841. package/dist/sources-LQTJXAJG.js +421 -0
  842. package/dist/sources-LQTJXAJG.js.map +1 -0
  843. package/dist/stale-2L7NTLC6.js +63 -0
  844. package/dist/stale-2L7NTLC6.js.map +1 -0
  845. package/dist/stats-ZWZ7BAHV.js +34 -0
  846. package/dist/stats-ZWZ7BAHV.js.map +1 -0
  847. package/dist/status-4QBSIHO7.js +62 -0
  848. package/dist/status-4QBSIHO7.js.map +1 -0
  849. package/dist/sticker-FLRZM3BI.js +94 -0
  850. package/dist/sticker-FLRZM3BI.js.map +1 -0
  851. package/dist/stock-2CSMWRWV.js +179 -0
  852. package/dist/stock-2CSMWRWV.js.map +1 -0
  853. package/dist/studio-TTTR6N7D.js +49 -0
  854. package/dist/studio-TTTR6N7D.js.map +1 -0
  855. package/dist/sync-DH7FTPGG.js +54 -0
  856. package/dist/sync-DH7FTPGG.js.map +1 -0
  857. package/dist/sync-G5CS2RYV.js +54 -0
  858. package/dist/sync-G5CS2RYV.js.map +1 -0
  859. package/dist/sync-UADA6M33.js +265 -0
  860. package/dist/sync-UADA6M33.js.map +1 -0
  861. package/dist/sync-definition-ATMMOJ37.js +52 -0
  862. package/dist/sync-definition-ATMMOJ37.js.map +1 -0
  863. package/dist/tag-manager-NK3ZHSJB.js +43 -0
  864. package/dist/tag-manager-NK3ZHSJB.js.map +1 -0
  865. package/dist/tags-4RBZWDHS.js +20 -0
  866. package/dist/tags-4RBZWDHS.js.map +1 -0
  867. package/dist/tags-M7ATU2R7.js +26 -0
  868. package/dist/tags-M7ATU2R7.js.map +1 -0
  869. package/dist/tags-MXJKIBL4.js +20 -0
  870. package/dist/tags-MXJKIBL4.js.map +1 -0
  871. package/dist/tags-YG5EGPBW.js +20 -0
  872. package/dist/tags-YG5EGPBW.js.map +1 -0
  873. package/dist/tags-ZP4O3I2F.js +224 -0
  874. package/dist/tags-ZP4O3I2F.js.map +1 -0
  875. package/dist/targeting-constants-ZGBX3VWU.js +118 -0
  876. package/dist/targeting-constants-ZGBX3VWU.js.map +1 -0
  877. package/dist/targeting-criteria-BTB2RVI4.js +113 -0
  878. package/dist/targeting-criteria-BTB2RVI4.js.map +1 -0
  879. package/dist/targets-DEGJD2N6.js +102 -0
  880. package/dist/targets-DEGJD2N6.js.map +1 -0
  881. package/dist/templates-FZDWQSTV.js +178 -0
  882. package/dist/templates-FZDWQSTV.js.map +1 -0
  883. package/dist/testimonials-TI5EDABS.js +32 -0
  884. package/dist/testimonials-TI5EDABS.js.map +1 -0
  885. package/dist/themes-3RV3HNNE.js +94 -0
  886. package/dist/themes-3RV3HNNE.js.map +1 -0
  887. package/dist/top-companies-OKH7UNKX.js +108 -0
  888. package/dist/top-companies-OKH7UNKX.js.map +1 -0
  889. package/dist/translate-IUQBBVE6.js +598 -0
  890. package/dist/translate-IUQBBVE6.js.map +1 -0
  891. package/dist/triggers-2NWMXQ5P.js +141 -0
  892. package/dist/triggers-2NWMXQ5P.js.map +1 -0
  893. package/dist/tweets-X64YDEAA.js +123 -0
  894. package/dist/tweets-X64YDEAA.js.map +1 -0
  895. package/dist/unfollow-PIONCSBL.js +46 -0
  896. package/dist/unfollow-PIONCSBL.js.map +1 -0
  897. package/dist/unlink-UAPLQMK6.js +67 -0
  898. package/dist/unlink-UAPLQMK6.js.map +1 -0
  899. package/dist/unstage-BJJ5M7MK.js +95 -0
  900. package/dist/unstage-BJJ5M7MK.js.map +1 -0
  901. package/dist/unstage-X2BYGH2S.js +84 -0
  902. package/dist/unstage-X2BYGH2S.js.map +1 -0
  903. package/dist/update-7YK3VSOK.js +142 -0
  904. package/dist/update-7YK3VSOK.js.map +1 -0
  905. package/dist/update-BHG7BTK3.js +155 -0
  906. package/dist/update-BHG7BTK3.js.map +1 -0
  907. package/dist/update-CDJXKEVA.js +63 -0
  908. package/dist/update-CDJXKEVA.js.map +1 -0
  909. package/dist/update-RZXDAMAG.js +98 -0
  910. package/dist/update-RZXDAMAG.js.map +1 -0
  911. package/dist/upload-DSZEXNHH.js +126 -0
  912. package/dist/upload-DSZEXNHH.js.map +1 -0
  913. package/dist/upload-IWFYKD7A.js +150 -0
  914. package/dist/upload-IWFYKD7A.js.map +1 -0
  915. package/dist/upscale-EYCEYRWE.js +109 -0
  916. package/dist/upscale-EYCEYRWE.js.map +1 -0
  917. package/dist/url-options-RA3XISLN.js +130 -0
  918. package/dist/url-options-RA3XISLN.js.map +1 -0
  919. package/dist/url-params-OGZXF6MT.js +98 -0
  920. package/dist/url-params-OGZXF6MT.js.map +1 -0
  921. package/dist/use-E2TA2K6J.js +95 -0
  922. package/dist/use-E2TA2K6J.js.map +1 -0
  923. package/dist/validate-C6HWDI6K.js +88 -0
  924. package/dist/validate-C6HWDI6K.js.map +1 -0
  925. package/dist/variant-ETHB6XUM.js +338 -0
  926. package/dist/variant-ETHB6XUM.js.map +1 -0
  927. package/dist/videos-A2X5AARB.js +39 -0
  928. package/dist/videos-A2X5AARB.js.map +1 -0
  929. package/dist/view-BVEZRRV2.js +121 -0
  930. package/dist/view-BVEZRRV2.js.map +1 -0
  931. package/dist/viewer-check-W4ICSBHO.js +68 -0
  932. package/dist/viewer-check-W4ICSBHO.js.map +1 -0
  933. package/dist/web-GJSFDBBE.js +140 -0
  934. package/dist/web-GJSFDBBE.js.map +1 -0
  935. package/dist/winners-MJDKCGEZ.js +113 -0
  936. package/dist/winners-MJDKCGEZ.js.map +1 -0
  937. package/dist/winning-ads-NNU5MM75.js +84 -0
  938. package/dist/winning-ads-NNU5MM75.js.map +1 -0
  939. package/dist/write-commands-5I5KY6ZS.js +1015 -0
  940. package/dist/write-commands-5I5KY6ZS.js.map +1 -0
  941. package/dist/write-commands-DA6FIFAO.js +737 -0
  942. package/dist/write-commands-DA6FIFAO.js.map +1 -0
  943. package/dist/write-commands-KTPISQRE.js +206 -0
  944. package/dist/write-commands-KTPISQRE.js.map +1 -0
  945. package/dist/write-commands-QBGIWU27.js +713 -0
  946. package/dist/write-commands-QBGIWU27.js.map +1 -0
  947. package/dist/x-VCL5VRXC.js +47 -0
  948. package/dist/x-VCL5VRXC.js.map +1 -0
  949. package/package.json +9 -2
  950. package/dist/chunk-HJEMOSPH.js +0 -1292
  951. package/dist/chunk-HJEMOSPH.js.map +0 -1
  952. package/dist/chunk-JHKW6IDX.js +0 -9989
  953. package/dist/chunk-JHKW6IDX.js.map +0 -1
  954. package/dist/chunk-MF7YA62W.js.map +0 -1
  955. package/dist/chunk-VZEDAFAR.js.map +0 -1
  956. package/dist/chunk-XHC4LMK4.js.map +0 -1
  957. package/dist/client-GR6YL3YX.js +0 -17
  958. package/dist/output-NMQXZF3Z.js +0 -18
  959. /package/dist/{chunk-WLDM2TRF.js.map → chunk-2UFRHW3T.js.map} +0 -0
  960. /package/dist/{client-GR6YL3YX.js.map → chunk-YQSBHWOI.js.map} +0 -0
  961. /package/dist/{env-4P5HOGNA.js.map → client-EURRWXPW.js.map} +0 -0
  962. /package/dist/{output-NMQXZF3Z.js.map → connect-6DQFYKGN.js.map} +0 -0
  963. /package/dist/{shared-6762QE6R.js.map → customers-FOPXEGCB.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/videos/ingest.ts","../src/lib/streamUpload.ts"],"sourcesContent":["import { mkdtemp, rm, stat } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { type VideosIngestRequest, type VideosIngestResponse, videosIngestRequestSchema } from \"@baker/api\";\nimport { isProxyFailure } from \"@baker/proxy\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { captureVimeoCookie } from \"../../env.ts\";\nimport { hashFile, putFileStreamed } from \"../../lib/streamUpload.ts\";\nimport { isVimeoAuthFailure } from \"../../lib/vimeoCookie.ts\";\nimport {\n canonicalUrl,\n durationSeconds,\n isAudioOnly,\n probeYtDlp,\n runYtDlp,\n YtDlpError,\n type YtDlpInfo,\n} from \"../../lib/ytDlp.ts\";\nimport { ytDlpBlockSignal } from \"../../lib/ytDlpSignal.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport {\n directDedupeKey,\n downloadTimeoutMs,\n isDirectMediaUrl,\n isDrmProtected,\n isRegionBlocked,\n isToolingOrBlockFailure,\n MAX_VIDEO_INGEST_BYTES,\n MAX_VIDEO_INGEST_SECONDS,\n refuseByDuration,\n resolveIngestSource,\n worthDownloadingInstead,\n} from \"./ingestUrl.ts\";\n\nregisterSchema({\n command: \"videos.ingest\",\n description: \"Add a video to the library from a URL — a direct file, or a YouTube/TikTok/Vimeo page.\",\n args: {\n url: { type: \"string\", description: \"Video URL (direct file or a watch/post page)\", required: true },\n source: { type: \"string\", description: \"Provenance: url | youtube\", required: false },\n \"external-id\": { type: \"string\", description: \"Provider asset id (deduped on)\", required: false },\n \"external-url\": { type: \"string\", description: \"Canonical page URL\", required: false },\n download: {\n type: \"boolean\",\n description: \"Force the download path instead of letting Baker fetch the URL directly\",\n required: false,\n default: false,\n },\n country: {\n type: \"string\",\n description: \"Two-letter country to fetch from (e.g. US, DE, JP) — use when a video is blocked in your region\",\n required: false,\n },\n context: {\n type: \"string\",\n description:\n \"What you know that the video cannot show — the campaign, whether the person on camera is a real customer, what it is for. Highest-leverage flag here: it is what makes the clip findable later.\",\n required: false,\n },\n \"dry-run\": { type: \"boolean\", description: \"Preview the operation without executing\", required: false },\n },\n});\n\nexport const ingestCommand = defineCommand({\n meta: {\n name: \"ingest\",\n description:\n \"Add a video to the library from a URL. A direct file URL is handed straight to Baker, which fetches it. A page URL (YouTube, TikTok, Vimeo, Instagram) is downloaded here first, then uploaded — and a direct URL that Baker cannot fetch falls back to that same path automatically.\\n\\nExample: baker videos ingest https://www.youtube.com/watch?v=abc123\",\n },\n args: {\n url: { type: \"positional\", description: \"Video URL\", required: false },\n source: { type: \"string\", description: \"Provenance: url | youtube\", required: false },\n \"external-id\": { type: \"string\", description: \"Provider asset id\", required: false },\n \"external-url\": { type: \"string\", description: \"Canonical page URL\", required: false },\n download: { type: \"boolean\", description: \"Force the download path\", required: false, default: false },\n country: { type: \"string\", description: \"Two-letter country to fetch from, e.g. US\", required: false },\n context: {\n type: \"string\",\n description: \"Context for the analysis — campaign, who is on camera, intended use\",\n required: false,\n },\n \"dry-run\": { type: \"boolean\", description: \"Preview without executing\", required: false, default: false },\n },\n run: ({ args }) =>\n runVideoIngest({\n url: args.url as string | undefined,\n source: args.source as string | undefined,\n externalId: args[\"external-id\"] as string | undefined,\n externalUrl: args[\"external-url\"] as string | undefined,\n forceDownload: args.download === true,\n country: args.country as string | undefined,\n context: args.context as string | undefined,\n dryRun: args[\"dry-run\"] === true,\n }),\n});\n\nexport type VideoIngestOptions = {\n url: string | undefined;\n source?: string;\n externalId?: string;\n externalUrl?: string;\n forceDownload?: boolean;\n country?: string;\n /** What the adder knew that the frames cannot show. Feeds the analysis. */\n context?: string;\n dryRun?: boolean;\n};\n\n/**\n * The ingest flow itself, callable from `videos ingest` and from the URL branch\n * of `videos upload` — one implementation, so the two verbs cannot drift.\n */\nexport async function runVideoIngest(opts: VideoIngestOptions): Promise<void> {\n const url = opts.url;\n if (!url) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"URL is required\" } });\n process.exit(1);\n }\n\n const direct = !opts.forceDownload && isDirectMediaUrl(url);\n const country = opts.country?.trim() || undefined;\n const args: IngestArgs = {\n url,\n source: resolveIngestSource(opts.source, url),\n externalId: opts.externalId,\n // Deliberately NOT pre-filled with the pasted URL. Doing so shadowed the\n // canonical URL the probe resolves (`?? canonicalUrl(...)` below could never\n // run), so the same video filed under a different `externalUrl` depending on\n // whether the link was copied from a share sheet, a shorts page or the\n // address bar. `downloadThenIngest` falls back to `args.url` when the probe\n // resolves nothing, which is the value this used to hard-code.\n externalUrl: opts.externalUrl,\n descriptionContext: opts.context?.trim() || undefined,\n };\n\n // Checked here as well as at the route, because the download path ends by\n // posting this same body: a bad `--source` caught only server-side would\n // otherwise be discovered twice, the second time after downloading the video.\n const validation = videosIngestRequestSchema.safeParse({ ...args, url });\n if (!validation.success) {\n const problem = validation.error.issues[0];\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: problem ? `${problem.path.join(\".\") || \"request\"}: ${problem.message}` : \"Invalid request\",\n },\n });\n process.exit(1);\n }\n\n if (opts.dryRun) {\n reportDryRun(args, direct, country);\n return;\n }\n\n try {\n const data = await ingestByRoute(args, direct, country);\n writeJson({ ok: true, data, hints: ingestHints(data) });\n } catch (err) {\n reportIngestFailure(err);\n }\n}\n\n/**\n * The successful ingest as the caller receives it.\n *\n * Named rather than left as a `Record<string, unknown>` so the fields that only\n * *sometimes* appear are still a checked contract. `reducedQuality` is the one\n * that needs it: nothing else reads it, `ingestHints` is the only thing that\n * acts on it, and an untyped bag would let either side be renamed with the\n * tests still green and the hint silently never firing again.\n */\nexport type IngestReport = VideosIngestResponse & {\n via: \"direct\" | \"download\";\n egress?: string;\n country?: string;\n reducedQuality?: true;\n fallbackFrom?: string;\n};\n\n/**\n * What the caller has to be told about a download that already succeeded.\n *\n * The recovery itself is deliberately invisible — nobody asks for a retry, and\n * a video that arrives is a video that arrived. What must not be invisible is\n * the price the recovery paid, because it is the one thing looking at the\n * result cannot reveal: a 360p clip and a 1080p clip are the same successful\n * envelope. Written for whoever reads the JSON to repeat to a marketer, so it\n * says \"standard quality\", not which player answered.\n */\nexport function ingestHints(data: IngestReport): string[] | undefined {\n if (data.reducedQuality !== true) return undefined;\n return [\n \"Added, but at standard quality (360p): the site refused to release the full-quality file and this was the best it would hand over. Tell the user — the clip is in the library and usable, it is just not high-resolution. If they need the crisp version, ask them for the original file and use `baker videos upload <file>`.\",\n ];\n}\n\nfunction reportDryRun(args: IngestArgs, direct: boolean, country?: string): void {\n writeJson({\n ok: true,\n dryRun: true,\n operation: \"videos.ingest\",\n params: {\n url: args.url,\n source: args.source,\n // Known up front on the direct route, because it is derived from the URL\n // alone. The download route's key comes from the probe, which a dry run\n // does not perform, so there it stays null rather than becoming a guess.\n externalId: args.externalId ?? (direct ? directDedupeKey(args.source, args.url) : null),\n // A page URL's canonical form is only known after the probe, which a dry\n // run does not perform — so this is null rather than a guess.\n externalUrl: args.externalUrl ?? null,\n direct,\n country: country ?? null,\n descriptionContext: args.descriptionContext ?? null,\n },\n });\n}\n\n/**\n * A direct media URL is handed straight over: Baker asks Mux to pull it, so no\n * bytes cross this machine and there is no size ceiling to hit. Only when that\n * is refused do we pay to download and re-upload the file ourselves.\n */\nasync function ingestByRoute(args: IngestArgs, direct: boolean, country?: string): Promise<IngestReport> {\n if (!direct) {\n return { ...(await downloadThenIngest(args, country)), via: \"download\" };\n }\n try {\n // Defaulted here rather than on `args`, so that the fallback below still\n // derives its key from the probe: a URL that turns out to be a page carries\n // a real provider id, which dedupes better than the link it was pasted as.\n const externalId = args.externalId ?? directDedupeKey(args.source, args.url);\n return { ...(await ingestUrl({ ...args, externalId })), via: \"direct\" };\n } catch (err) {\n if (!(err instanceof ApiError) || !worthDownloadingInstead(err.code)) throw err;\n return { ...(await downloadThenIngest(args, country)), via: \"download\", fallbackFrom: err.message };\n }\n}\n\n/**\n * Turn a yt-dlp failure into the one sentence that names its actual cause.\n *\n * Split out from `reportIngestFailure` because the list of distinguishable\n * causes kept growing — proxy, DRM, Vimeo login, region, stale extractor — and\n * each one exists because the generic message sent the reader somewhere useless.\n * Order matters and is not alphabetical: DRM and region both also emit phrases\n * the stale-extractor branch would match, so the specific cases are asked first.\n */\nfunction reportYtDlpFailure(err: YtDlpError): never {\n const detail = `${err.stderrTail} ${err.message}`;\n\n // Our own egress failing is not the site's fault and not the link's. Saying\n // otherwise sends whoever reads this to check a video that was never the\n // problem, while the real cause — a rotated proxy credential — stays hidden.\n if (isProxyFailure(ytDlpBlockSignal(detail))) {\n fail(\n \"Couldn't download that video: our connection to the internet was refused.\",\n \"This is Baker's egress proxy, not the link — its credentials look wrong or expired. The link is probably fine. Report it; retrying won't help until the proxy is fixed.\",\n );\n }\n if (isDrmProtected(detail)) {\n fail(\n \"That video is copy-protected, so it can't be added to the library.\",\n \"The publisher encrypted this one against downloading. Nothing will change that — not retrying, not a different region. Ask whoever owns the video for the original file and add it with `baker videos upload <file>`.\",\n );\n }\n if (isVimeoAuthFailure(detail)) {\n fail(\n \"Vimeo wouldn't hand over that video — Baker isn't signed in to Vimeo.\",\n \"Vimeo now refuses anonymous downloads entirely, so this needs a signed-in session and the one Baker holds has either expired or was never set. Nothing is wrong with the link. Report it so the Vimeo cookie can be refreshed; meanwhile download the file and use `baker videos upload <file>`.\",\n );\n }\n if (isRegionBlocked(detail)) {\n fail(\n `That video isn't available in the region we're fetching from. ${err.stderrTail || err.message}`,\n \"Re-run with `--country <two-letter code>` for a country where the video plays — e.g. `--country US`. Pick the one the video belongs to (the uploader's country is the usual answer); each attempt costs a paid connection, so choose rather than work through the list.\",\n );\n }\n fail(\n `Couldn't download that video. ${err.stderrTail || err.message}`,\n isToolingOrBlockFailure(detail)\n ? \"The site wouldn't hand over the video — usually the downloader being out of date against a site that changed, or the request being blocked. Retrying won't help, and the link is probably fine. Report it so the tool can be updated; meanwhile download the file and use `baker videos upload <file>`.\"\n : \"Check the link is public and playable. Private or age-restricted videos can't be downloaded — download the file yourself and use `baker videos upload <file>`.\",\n );\n}\n\n/** Emit an ingest failure envelope and stop. */\nfunction fail(message: string, fix: string, code = \"INGEST_FAILED\"): never {\n writeJson({ ok: false, error: { code, message, fix } });\n process.exit(1);\n}\n\nfunction reportIngestFailure(err: unknown): never {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n if (err instanceof YtDlpError) reportYtDlpFailure(err);\n\n // Say what actually went wrong. \"Unexpected error\" was worse than unhelpful:\n // a download that outran its leash throws a plain `Error`, lands here, and had\n // its only diagnostic thrown away — so a predictable timeout on a long video\n // was indistinguishable from a genuine crash.\n const detail = err instanceof Error ? err.message : String(err);\n if (detail.includes(\"timed out after\")) {\n fail(\n \"That video took too long to download and was stopped part-way.\",\n \"Long or slow-serving videos can outrun the download window. Try a shorter clip, or download this one yourself and use `baker videos upload <file>`.\",\n \"INTERNAL_ERROR\",\n );\n }\n fail(\n `Couldn't add that video. ${detail}`,\n \"This is a fault on Baker's side, not a problem with the link. Report it.\",\n \"INTERNAL_ERROR\",\n );\n}\n\ntype IngestArgs = {\n url: string;\n source: string;\n externalId?: string;\n externalUrl?: string;\n descriptionContext?: string;\n};\n\n/**\n * A dedupe key that identifies this exact video and nothing else.\n *\n * yt-dlp's per-platform extractors return a real provider id, which is what we\n * want: the same YouTube clip pasted three ways dedupes to one row. Its\n * *generic* extractor does not — it returns the URL's basename, so two unrelated\n * files both named `demo.mp4` would produce `url:demo` and the second ingest\n * would \"succeed\" by handing back the first one's clip. A wrong hit is worse\n * than a missed one here: a duplicate costs a transcode, while a collision\n * silently returns the wrong video under a successful-looking response.\n *\n * So the generic case is keyed on the canonical URL, which is unique by\n * construction and still dedupes re-pastes of the same link exactly as intended.\n */\nfunction dedupeKey(args: IngestArgs, info: YtDlpInfo): string | undefined {\n const id = typeof info.id === \"string\" ? info.id : undefined;\n if (!id) return undefined;\n if (info.extractor === \"generic\") return `${args.source}:${canonicalUrl(info) ?? args.url}`;\n return `${args.source}:${id}`;\n}\n\nfunction ingestUrl(args: IngestArgs): Promise<VideosIngestResponse> {\n const body: VideosIngestRequest = {\n url: args.url,\n source: args.source as VideosIngestRequest[\"source\"],\n };\n if (args.externalId) body.externalId = args.externalId;\n if (args.externalUrl) body.externalUrl = args.externalUrl;\n if (args.descriptionContext) body.descriptionContext = args.descriptionContext;\n return apiPost<VideosIngestResponse>(\"/api/videos/ingest\", body);\n}\n\n/**\n * Download the media with yt-dlp, park it in R2, then ingest that URL.\n *\n * The extra hop is what makes a page URL work at all: Mux can only pull a media\n * file, and a watch page is not one. It is also the only route for a CDN that\n * serves us but refuses Mux — YouTube's file URLs, for instance, are bound to\n * the IP that requested them, so handing one to Mux would 403.\n */\nasync function downloadThenIngest(\n args: IngestArgs,\n country?: string,\n): Promise<VideosIngestResponse & { egress: string; country?: string; reducedQuality?: true }> {\n const vimeoCookie = captureVimeoCookie();\n // The work dir is created before the probe, not after, because the probe needs\n // somewhere to put the cookie jar — Vimeo refuses metadata anonymously too.\n const workDir = await mkdtemp(path.join(tmpdir(), \"videos-ingest-\"));\n\n try {\n // Metadata first, because both of the decisions it settles are decisions we\n // used to make only after paying for the download.\n const probe = await probeYtDlp({ url: args.url, country, vimeoCookie, cookieDir: workDir });\n\n if (isAudioOnly(probe.info)) {\n throw new ApiError(\n \"VALIDATION_ERROR\",\n \"That link is audio, not video, so it can't go in the video library. Music and podcast links have no picture to store.\",\n );\n }\n\n const tooLong = refuseByDuration(durationSeconds(probe.info), MAX_VIDEO_INGEST_SECONDS);\n if (tooLong) {\n throw new ApiError(\"VALIDATION_ERROR\", tooLong);\n }\n\n // Prefer yt-dlp's own id: re-pasting the same link then dedupes instead of\n // paying Mux to transcode and transcribe the same video twice. Read from the\n // probe rather than from the download's info.json only because the probe has\n // already run — the dedupe itself still happens at the route, after the file\n // has been fetched. Skipping the download on a known id needs a lookup the\n // API does not expose yet; `ingestFromUrlInternal` short-circuits on\n // `externalId` before calling Mux, so the hook for it exists.\n const externalId = args.externalId ?? dedupeKey(args, probe.info);\n\n const { filePath, tier, reducedQuality } = await runYtDlp({\n url: args.url,\n audioOnly: false,\n workDir,\n // Deliberately uncapped: take the best the site will release and let Mux\n // decide what to serve. The 1080p ceiling this replaces was reasoning\n // about the wrong cost — it saved download bytes by throwing away source\n // pixels *before* the one system that can make renditions from them ever\n // saw them, so a 4K master became a 1080p master permanently, for\n // everything the library is ever asked to do with that clip afterwards.\n // Downscaling is Mux's job and it is cheap; re-acquiring a master is not.\n country,\n vimeoCookie,\n // Budgeted from the probed length, so the duration we accept and the time\n // we allow to fetch it cannot drift apart.\n timeoutMs: downloadTimeoutMs(durationSeconds(probe.info)),\n });\n\n const stats = await stat(filePath);\n if (stats.size > MAX_VIDEO_INGEST_BYTES) {\n throw new ApiError(\n \"VALIDATION_ERROR\",\n `That video is ${(stats.size / 1024 ** 3).toFixed(1)} GB, over the ${Math.round(MAX_VIDEO_INGEST_BYTES / 1024 ** 3)} GB limit for this route.`,\n );\n }\n\n const publicUrl = await uploadToAssetStore(filePath, stats.size);\n\n // `url` becomes the stored copy, so the original has to survive as\n // `externalUrl` — otherwise a direct link that fell back to this route\n // leaves the library with no record of where the clip came from.\n // `egress` names the rung that produced the bytes. A paid exit costing real\n // money must never be spent invisibly — without this the only difference\n // between a free download and a residential one is the wall clock.\n return {\n ...(await ingestUrl({\n ...args,\n url: publicUrl,\n externalId,\n externalUrl: args.externalUrl ?? canonicalUrl(probe.info) ?? args.url,\n })),\n egress: tier,\n // Named in the result for the same reason `egress` is: a geo-targeted exit\n // is a deliberate, billable choice and must not be invisible afterwards.\n ...(country ? { country } : {}),\n // Third member of the same family. The site refused the good formats and\n // the download quietly took the one it would release, which is the right\n // call — but a clip that is 360p because of that must say so here, or the\n // only way to find out is to watch it.\n ...(reducedQuality ? { reducedQuality: true } : {}),\n };\n } finally {\n await rm(workDir, { recursive: true, force: true }).catch(() => {\n // best-effort cleanup — the sandbox is disposable\n });\n }\n}\n\n/**\n * Park a downloaded file in R2 via the canvas asset presign route and return the\n * public URL.\n *\n * Streamed from disk in both passes — hashing and uploading — so a long video\n * costs one buffer rather than twice its own length in RAM. It reads the file\n * twice because the presign needs the sha before the PUT can start, which is a\n * cheap trade against holding gigabytes in memory to avoid the second read.\n */\nasync function uploadToAssetStore(filePath: string, sizeBytes: number): Promise<string> {\n const sha256 = await hashFile(filePath);\n const { putUrl, publicUrl } = await apiPost<{ putUrl: string; publicUrl: string }>(\"/api/canvas/assets/presign\", {\n sha256,\n mime: \"video/mp4\",\n purpose: \"source\",\n });\n\n const putRes = await putFileStreamed({ putUrl, filePath, contentType: \"video/mp4\", sizeBytes });\n if (!putRes.ok) {\n throw new ApiError(\"INTERNAL_ERROR\", `Storing the downloaded video failed: HTTP ${putRes.status}`);\n }\n return publicUrl;\n}\n","import { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\n\n/**\n * Move a file to object storage without ever holding it in memory.\n *\n * The reason this exists rather than `readFile` + `fetch`: a video is the one\n * asset whose size is set by someone else. Reading it into a Buffer costs its\n * full length in RAM, and handing that Buffer to `new Uint8Array(...)` copies it\n * again — measured, not assumed: `new Uint8Array(buf)` does not alias, so peak\n * usage was twice the file. On an 8 GB Runtime that puts the real ceiling near\n * 3-4 GB of *video*, well under the size a 4K master or a long recording\n * reaches, and the failure mode is an OOM kill with no error to report.\n *\n * Streaming makes peak memory a fixed chunk regardless of length, which is what\n * lets the size limit be a policy decision instead of a memory one.\n */\n\n/** sha256 of a file's contents, read in chunks. */\nexport async function hashFile(filePath: string): Promise<string> {\n const hash = createHash(\"sha256\");\n await pipeline(createReadStream(filePath), hash);\n return hash.digest(\"hex\");\n}\n\n/**\n * PUT a file to a presigned URL, streaming from disk.\n *\n * `content-length` is mandatory and comes from the caller's `stat`: a stream\n * body would otherwise be sent chunked, which S3-compatible presigned PUTs\n * reject. `duplex: \"half\"` is required by undici whenever the body is a stream.\n */\nexport async function putFileStreamed(args: {\n putUrl: string;\n filePath: string;\n contentType: string;\n sizeBytes: number;\n}): Promise<Response> {\n // `toWeb` rather than handing `fetch` the Node stream directly: undici accepts\n // both, but only the web stream is a `BodyInit`, so this stays type-safe\n // instead of needing a cast that would hide a real mistake later.\n const body = Readable.toWeb(createReadStream(args.filePath)) as ReadableStream<Uint8Array>;\n\n return await fetch(args.putUrl, {\n method: \"PUT\",\n body,\n headers: {\n \"Content-Type\": args.contentType,\n \"Content-Length\": String(args.sizeBytes),\n },\n duplex: \"half\",\n } as RequestInit & { duplex: \"half\" });\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,42 @@
1
+ import {
2
+ ApiError
3
+ } from "./chunk-CUL3VB4L.js";
4
+ import {
5
+ writeJson
6
+ } from "./chunk-MYTDK3AL.js";
7
+
8
+ // src/commands/studio/errors.ts
9
+ var CREDIT_HINTS = ["credit", "top up", "billing", "quota"];
10
+ function studioStartFix(message) {
11
+ const lower = message.toLowerCase();
12
+ if (CREDIT_HINTS.some((hint) => lower.includes(hint))) {
13
+ return {
14
+ action: "Stop generating and finish the task with assets that already exist",
15
+ explanation: "No generation will run until the plan is topped up, so retrying costs time and changes nothing. Source or reuse an image instead, complete the rest of the work, and tell the user the new artwork could not be produced."
16
+ };
17
+ }
18
+ return {
19
+ action: "Drop or correct the setting the message names, then run the command once more",
20
+ explanation: "The message says which model was chosen and what it accepts. If the setting is not essential to the brief, leave it out rather than switching model. Do not abort the wider job over one refused setting."
21
+ };
22
+ }
23
+ function failStudioCommand(error, opts = {}) {
24
+ if (error instanceof ApiError) {
25
+ writeJson({
26
+ ok: false,
27
+ error: {
28
+ code: error.code,
29
+ message: error.message,
30
+ ...opts.withFix ? { fix: studioStartFix(error.message) } : {}
31
+ }
32
+ });
33
+ process.exit(1);
34
+ }
35
+ writeJson({ ok: false, error: { code: "INTERNAL_ERROR", message: "Unexpected error" } });
36
+ process.exit(1);
37
+ }
38
+
39
+ export {
40
+ failStudioCommand
41
+ };
42
+ //# sourceMappingURL=chunk-2GVXNKAE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/studio/errors.ts"],"sourcesContent":["import { ApiError } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\n\nconst CREDIT_HINTS = [\"credit\", \"top up\", \"billing\", \"quota\"];\n\n/**\n * Structured remediation for a refused start.\n *\n * Both cases are recoverable and neither is a reason to abandon a multi-step job:\n * a knob the model does not take is one flag away from working, and an empty\n * balance means no generation in this Session will run, so the rest of the task\n * should finish with existing assets and say so.\n */\nexport function studioStartFix(message: string): { action: string; explanation: string } {\n const lower = message.toLowerCase();\n if (CREDIT_HINTS.some((hint) => lower.includes(hint))) {\n return {\n action: \"Stop generating and finish the task with assets that already exist\",\n explanation:\n \"No generation will run until the plan is topped up, so retrying costs time and changes nothing. Source or reuse an image instead, complete the rest of the work, and tell the user the new artwork could not be produced.\",\n };\n }\n return {\n action: \"Drop or correct the setting the message names, then run the command once more\",\n explanation:\n \"The message says which model was chosen and what it accepts. If the setting is not essential to the brief, leave it out rather than switching model. Do not abort the wider job over one refused setting.\",\n };\n}\n\n/** Every studio subcommand fails the same way: envelope, fix, non-zero exit. */\nexport function failStudioCommand(error: unknown, opts: { withFix?: boolean } = {}): never {\n if (error instanceof ApiError) {\n writeJson({\n ok: false,\n error: {\n code: error.code,\n message: error.message,\n ...(opts.withFix ? { fix: studioStartFix(error.message) } : {}),\n },\n });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n}\n"],"mappings":";;;;;;;;AAGA,IAAM,eAAe,CAAC,UAAU,UAAU,WAAW,OAAO;AAUrD,SAAS,eAAe,SAA0D;AACvF,QAAM,QAAQ,QAAQ,YAAY;AAClC,MAAI,aAAa,KAAK,CAAC,SAAS,MAAM,SAAS,IAAI,CAAC,GAAG;AACrD,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,aACE;AAAA,IACJ;AAAA,EACF;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,aACE;AAAA,EACJ;AACF;AAGO,SAAS,kBAAkB,OAAgB,OAA8B,CAAC,GAAU;AACzF,MAAI,iBAAiB,UAAU;AAC7B,cAAU;AAAA,MACR,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,GAAI,KAAK,UAAU,EAAE,KAAK,eAAe,MAAM,OAAO,EAAE,IAAI,CAAC;AAAA,MAC/D;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,YAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,UAAQ,KAAK,CAAC;AAChB;","names":[]}
@@ -2,13 +2,13 @@ import {
2
2
  handleConnectionError,
3
3
  needsConnectionFix,
4
4
  writeAdsJson
5
- } from "./chunk-XHC4LMK4.js";
5
+ } from "./chunk-EIGXX6KI.js";
6
6
  import {
7
7
  ApiError
8
- } from "./chunk-MF7YA62W.js";
8
+ } from "./chunk-CUL3VB4L.js";
9
9
  import {
10
10
  getEnv
11
- } from "./chunk-HJEMOSPH.js";
11
+ } from "./chunk-I4FTS5EE.js";
12
12
 
13
13
  // src/commands/ads/meta/shared.ts
14
14
  var DAY_MS = 864e5;
@@ -133,4 +133,4 @@ export {
133
133
  resolveEffectiveStatus,
134
134
  statusFilterHints
135
135
  };
136
- //# sourceMappingURL=chunk-WLDM2TRF.js.map
136
+ //# sourceMappingURL=chunk-2UFRHW3T.js.map
@@ -0,0 +1,29 @@
1
+ // src/commands/ads/google/keywords/provenance.ts
2
+ var PLANNER_SOURCE = "keyword_planner_estimate";
3
+ var IDENTITY_FIELDS = /* @__PURE__ */ new Set(["keyword"]);
4
+ function stampPlannerRows(rows) {
5
+ return rows.map((row) => {
6
+ const stamped = { source: PLANNER_SOURCE };
7
+ for (const [key, value] of Object.entries(row)) {
8
+ stamped[IDENTITY_FIELDS.has(key) || key.startsWith("planner_") ? key : `planner_${key}`] = value;
9
+ }
10
+ return stamped;
11
+ });
12
+ }
13
+ var PLANNER_FIELD_DESCRIPTIONS = {
14
+ source: `Always "${PLANNER_SOURCE}". These rows are Keyword Planner ESTIMATES of total market search volume, NOT this account's data. Never report them as impressions, clicks or any account metric \u2014 read those from a query against the account.`,
15
+ keyword: "The keyword this estimate is for",
16
+ planner_avg_monthly_searches: "ESTIMATE: average monthly searches across the whole market (string), last 12 months",
17
+ planner_competition: "ESTIMATE: competition level \u2014 LOW, MEDIUM, HIGH",
18
+ planner_competition_index: "ESTIMATE: competition index 0-100 as string (higher = more competitive)",
19
+ planner_low_top_of_page_bid_micros: "ESTIMATE: low-range top-of-page CPC bid in micros (\xF7 1,000,000 for currency)",
20
+ planner_high_top_of_page_bid_micros: "ESTIMATE: high-range top-of-page CPC bid in micros (\xF7 1,000,000 for currency)",
21
+ planner_monthly_search_volumes: "ESTIMATE: monthly market search volume breakdown (array of {year, month, monthly_searches})"
22
+ };
23
+
24
+ export {
25
+ PLANNER_SOURCE,
26
+ stampPlannerRows,
27
+ PLANNER_FIELD_DESCRIPTIONS
28
+ };
29
+ //# sourceMappingURL=chunk-2Y5V23PU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/ads/google/keywords/provenance.ts"],"sourcesContent":["/**\n * Keyword Planner numbers are estimates of what the whole market searches. Account numbers are what\n * this advertiser actually got. They are different quantities with similar shapes, they end up in\n * neighbouring CSVs in /tmp, and a session once reported the first as the second — \"we already show\n * on shipbob (88 impressions)\" against an account that had never shown there once.\n *\n * A header banner does not survive `--output csv > file`, a `python3 -c` pass or 150 tool calls of\n * distance. A column name does: the only way to read one of these numbers is to name its source\n * while doing it. Every row also carries a constant `source` column, which survives any transform\n * that copies rows rather than picking fields.\n */\nexport const PLANNER_SOURCE = \"keyword_planner_estimate\";\n\n/** The one field that is not an estimate — it is the term itself, so it keeps its plain name. */\nconst IDENTITY_FIELDS = new Set([\"keyword\"]);\n\nexport type PlannerRow = Record<string, unknown>;\n\nexport function stampPlannerRows(rows: readonly PlannerRow[]): PlannerRow[] {\n return rows.map((row) => {\n const stamped: PlannerRow = { source: PLANNER_SOURCE };\n for (const [key, value] of Object.entries(row)) {\n stamped[IDENTITY_FIELDS.has(key) || key.startsWith(\"planner_\") ? key : `planner_${key}`] = value;\n }\n return stamped;\n });\n}\n\n/** Field docs for the stamped shape, stated so the estimate can never be mistaken for account data. */\nexport const PLANNER_FIELD_DESCRIPTIONS: Record<string, string> = {\n source: `Always \"${PLANNER_SOURCE}\". These rows are Keyword Planner ESTIMATES of total market search volume, NOT this account's data. Never report them as impressions, clicks or any account metric — read those from a query against the account.`,\n keyword: \"The keyword this estimate is for\",\n planner_avg_monthly_searches: \"ESTIMATE: average monthly searches across the whole market (string), last 12 months\",\n planner_competition: \"ESTIMATE: competition level — LOW, MEDIUM, HIGH\",\n planner_competition_index: \"ESTIMATE: competition index 0-100 as string (higher = more competitive)\",\n planner_low_top_of_page_bid_micros: \"ESTIMATE: low-range top-of-page CPC bid in micros (÷ 1,000,000 for currency)\",\n planner_high_top_of_page_bid_micros: \"ESTIMATE: high-range top-of-page CPC bid in micros (÷ 1,000,000 for currency)\",\n planner_monthly_search_volumes:\n \"ESTIMATE: monthly market search volume breakdown (array of {year, month, monthly_searches})\",\n};\n"],"mappings":";AAWO,IAAM,iBAAiB;AAG9B,IAAM,kBAAkB,oBAAI,IAAI,CAAC,SAAS,CAAC;AAIpC,SAAS,iBAAiB,MAA2C;AAC1E,SAAO,KAAK,IAAI,CAAC,QAAQ;AACvB,UAAM,UAAsB,EAAE,QAAQ,eAAe;AACrD,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,cAAQ,gBAAgB,IAAI,GAAG,KAAK,IAAI,WAAW,UAAU,IAAI,MAAM,WAAW,GAAG,EAAE,IAAI;AAAA,IAC7F;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAGO,IAAM,6BAAqD;AAAA,EAChE,QAAQ,WAAW,cAAc;AAAA,EACjC,SAAS;AAAA,EACT,8BAA8B;AAAA,EAC9B,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,oCAAoC;AAAA,EACpC,qCAAqC;AAAA,EACrC,gCACE;AACJ;","names":[]}
@@ -0,0 +1,111 @@
1
+ import {
2
+ prepareCanvas,
3
+ unsuppliedPlaceholderAssets
4
+ } from "./chunk-MYURCD23.js";
5
+ import {
6
+ isSourceStale
7
+ } from "./chunk-D46NOXRY.js";
8
+
9
+ // src/commands/canvas/render-state.ts
10
+ import { mkdir, readdir, readFile, rm, writeFile } from "fs/promises";
11
+ import path from "path";
12
+ var RENDER_STATE_DIR = ".rendered";
13
+ function statePath(canvasRoot, slug) {
14
+ return path.join(canvasRoot, RENDER_STATE_DIR, `${slug}.json`);
15
+ }
16
+ async function readRenderState(canvasRoot, slug) {
17
+ try {
18
+ const parsed = JSON.parse(await readFile(statePath(canvasRoot, slug), "utf8"));
19
+ return parsed && typeof parsed === "object" ? parsed : {};
20
+ } catch {
21
+ return {};
22
+ }
23
+ }
24
+ async function latestVersion(canvasRoot, slug) {
25
+ return (await readRenderState(canvasRoot, slug)).rendered?.runId ?? null;
26
+ }
27
+ async function updateRenderState(canvasRoot, slug, patch) {
28
+ try {
29
+ const next = { ...await readRenderState(canvasRoot, slug), ...patch };
30
+ await mkdir(path.join(canvasRoot, RENDER_STATE_DIR), { recursive: true });
31
+ await writeFile(statePath(canvasRoot, slug), `${JSON.stringify(next, null, 2)}
32
+ `, "utf8");
33
+ } catch {
34
+ }
35
+ }
36
+ async function recordRenderAttempt(canvasRoot, slug, sourceSha) {
37
+ if (!sourceSha) return;
38
+ await updateRenderState(canvasRoot, slug, { attempted: { sourceSha, at: Date.now() } });
39
+ }
40
+ async function recordRendered(canvasRoot, slug, sourceSha, runId, drawn = {}) {
41
+ if (!sourceSha) return;
42
+ await updateRenderState(canvasRoot, slug, {
43
+ rendered: { sourceSha, runId, at: Date.now() },
44
+ ...drawn.prompt !== void 0 ? { prompt: drawn.prompt } : {},
45
+ lastFix: drawn.lastFix,
46
+ picture: drawn.picture,
47
+ ...drawn.seriesLeadRun ? { seriesLeadRun: drawn.seriesLeadRun } : {}
48
+ });
49
+ }
50
+ async function recordReviewOutcome(canvasRoot, slug, outcome) {
51
+ await updateRenderState(canvasRoot, slug, outcome);
52
+ }
53
+ async function recordSeriesLeadRun(canvasRoot, slug, leadRunId) {
54
+ await updateRenderState(canvasRoot, slug, { seriesLeadRun: leadRunId });
55
+ }
56
+ async function recordSnapshot(canvasRoot, slug, snapshot) {
57
+ await updateRenderState(canvasRoot, slug, { snapshot });
58
+ }
59
+ function isRenderStale(state, currentSourceSha) {
60
+ if (!state.rendered) return false;
61
+ if (!isSourceStale(currentSourceSha, state.rendered.sourceSha)) return false;
62
+ return state.attempted?.sourceSha !== currentSourceSha;
63
+ }
64
+ async function staleCreatives(workspaceRoot) {
65
+ const creativesDir = path.join(workspaceRoot, "src", "creatives");
66
+ const canvasRoot = path.join(workspaceRoot, "canvas");
67
+ let slugs;
68
+ try {
69
+ slugs = (await readdir(creativesDir, { withFileTypes: true })).filter((d) => d.isDirectory()).map((d) => d.name);
70
+ } catch {
71
+ return [];
72
+ }
73
+ const stale = [];
74
+ for (const slug of slugs.sort()) {
75
+ const state = await readRenderState(canvasRoot, slug);
76
+ if (!state.rendered) continue;
77
+ const canvasPath = path.join(creativesDir, slug, `${slug}.canvas.json`);
78
+ let prepared;
79
+ try {
80
+ prepared = await prepareCanvas(canvasPath, { write: false });
81
+ } catch {
82
+ continue;
83
+ }
84
+ if (unsuppliedPlaceholderAssets(prepared.fileGraph).length > 0) continue;
85
+ const current = prepared.sourceSha;
86
+ if (!current || !isRenderStale(state, current)) continue;
87
+ stale.push({
88
+ slug,
89
+ canvasPath: path.relative(workspaceRoot, canvasPath).split(path.sep).join("/"),
90
+ renderedRunId: state.rendered.runId,
91
+ sourceSha: current
92
+ });
93
+ }
94
+ return stale;
95
+ }
96
+ async function clearLegacyDirtyMarker(canvasRoot, slug) {
97
+ await rm(path.join(canvasRoot, ".dirty", `${slug}.json`), { force: true }).catch(() => void 0);
98
+ }
99
+
100
+ export {
101
+ readRenderState,
102
+ latestVersion,
103
+ recordRenderAttempt,
104
+ recordRendered,
105
+ recordReviewOutcome,
106
+ recordSeriesLeadRun,
107
+ recordSnapshot,
108
+ staleCreatives,
109
+ clearLegacyDirtyMarker
110
+ };
111
+ //# sourceMappingURL=chunk-35NYNRRB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/canvas/render-state.ts"],"sourcesContent":["import { mkdir, readdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { isSourceStale } from \"@baker/api\";\nimport type { LastFix } from \"./static-edit.ts\";\nimport type { PictureRecord } from \"./static-fix.ts\";\nimport { unsuppliedPlaceholderAssets } from \"./placeholders.ts\";\nimport { type PreparedCanvas, prepareCanvas } from \"./prepare-canvas.ts\";\n\n/**\n * What this workspace last rendered, per creative: `canvas/.rendered/<slug>.json`.\n *\n * \"Edited since its last render\" is the source fingerprint (`computeSourceSha`) now,\n * compared with the fingerprint the last completed render recorded here. It replaces the\n * `canvas/.dirty` marker a PostToolUse hook used to drop, which only saw the Write and\n * Edit tools touching `*.canvas.json` / `prompt.json`: an edit to a scene file, a\n * composition, or anything made through the shell slipped past it, and the Stop hook and\n * the `validate-creative-renders` gate let a stale preview ship.\n *\n * Two facts are kept apart:\n * - `rendered`: the source a COMPLETED render drew, and its run id;\n * - `attempted`: the source the last `baker canvas run` started on, whatever came of it.\n * A render that fails on exactly this source is not asked for again until the source\n * moves, so a canvas that cannot render never loops the agent.\n *\n * Lives under the gitignored `canvas/` outputs root of the workspace the canvas belongs\n * to (never `--outputs-dir`), so the CLI and the scaffold hooks always agree on the path.\n * A fresh workspace has no record, and a creative with none is not stale: there is no\n * preview of it in this workspace to be out of date.\n */\nexport const RENDER_STATE_DIR = \".rendered\";\n\nexport type RenderState = {\n rendered?: { sourceSha: string; runId: string; at: number };\n attempted?: { sourceSha: string; at: number };\n /** The last portable run snapshot uploaded for this creative (see `run-snapshot.ts`). */\n snapshot?: { identity: string; url: string };\n /** A static ad's prompt.json as the completed render drew it: a later edit of only its words or colours renders as an edit of that version (`static-edit.ts`). */\n prompt?: unknown;\n /** The `--fix` (or edit) the completed render ran, and the blocking defects it left: the same fix is never run again. */\n lastFix?: LastFix;\n /** The blocking defects the review of the completed render named: what a fix of it is measured against. */\n blocking?: string[];\n /** How the completed render's picture came to be, where its canvas would not say (`static-fix.ts`). */\n picture?: PictureRecord;\n /**\n * An ad of a series: the version of its lead its last registered run was made from, finished or not\n * (`series-member.ts`). A run that fails after it is registered is not a new ask when retried.\n */\n seriesLeadRun?: string;\n};\n\nfunction statePath(canvasRoot: string, slug: string): string {\n return path.join(canvasRoot, RENDER_STATE_DIR, `${slug}.json`);\n}\n\nexport async function readRenderState(canvasRoot: string, slug: string): Promise<RenderState> {\n try {\n const parsed = JSON.parse(await readFile(statePath(canvasRoot, slug), \"utf8\")) as RenderState;\n return parsed && typeof parsed === \"object\" ? parsed : {};\n } catch {\n return {};\n }\n}\n\n/** The version (run id) a creative shows in this workspace: its last completed render; null before one. */\nexport async function latestVersion(canvasRoot: string, slug: string): Promise<string | null> {\n return (await readRenderState(canvasRoot, slug)).rendered?.runId ?? null;\n}\n\n/** Merge `patch` into the record. Best-effort: freshness is advisory, a render never fails over it. */\nasync function updateRenderState(canvasRoot: string, slug: string, patch: Partial<RenderState>): Promise<void> {\n try {\n const next = { ...(await readRenderState(canvasRoot, slug)), ...patch };\n await mkdir(path.join(canvasRoot, RENDER_STATE_DIR), { recursive: true });\n await writeFile(statePath(canvasRoot, slug), `${JSON.stringify(next, null, 2)}\\n`, \"utf8\");\n } catch {\n // Ignore: at worst the Stop hook asks for one render too many or too few.\n }\n}\n\nexport async function recordRenderAttempt(canvasRoot: string, slug: string, sourceSha: string | undefined): Promise<void> {\n if (!sourceSha) return;\n await updateRenderState(canvasRoot, slug, { attempted: { sourceSha, at: Date.now() } });\n}\n\nexport async function recordRendered(\n canvasRoot: string,\n slug: string,\n sourceSha: string | undefined,\n runId: string,\n drawn: { prompt?: unknown; lastFix?: LastFix; picture?: PictureRecord; seriesLeadRun?: string } = {},\n): Promise<void> {\n if (!sourceSha) return;\n await updateRenderState(canvasRoot, slug, {\n rendered: { sourceSha, runId, at: Date.now() },\n ...(drawn.prompt !== undefined ? { prompt: drawn.prompt } : {}),\n lastFix: drawn.lastFix,\n picture: drawn.picture,\n ...(drawn.seriesLeadRun ? { seriesLeadRun: drawn.seriesLeadRun } : {}),\n });\n}\n\n/** What the review of a completed render found blocking, and the fix the render ran, if one. */\nexport async function recordReviewOutcome(\n canvasRoot: string,\n slug: string,\n outcome: { blocking: string[]; lastFix?: LastFix },\n): Promise<void> {\n await updateRenderState(canvasRoot, slug, outcome);\n}\n\n/** The version of its lead a series ad's run was registered from: written before the run renders. */\nexport async function recordSeriesLeadRun(canvasRoot: string, slug: string, leadRunId: string): Promise<void> {\n await updateRenderState(canvasRoot, slug, { seriesLeadRun: leadRunId });\n}\n\nexport async function recordSnapshot(canvasRoot: string, slug: string, snapshot: RenderState[\"snapshot\"]): Promise<void> {\n await updateRenderState(canvasRoot, slug, { snapshot });\n}\n\n/**\n * Whether the preview in this workspace no longer shows the source: it was rendered, the\n * source has moved since (`isSourceStale`: a render fingerprinted by an older rule never\n * is), and no render of the source as it is now was attempted yet.\n */\nexport function isRenderStale(state: RenderState, currentSourceSha: string): boolean {\n if (!state.rendered) return false;\n if (!isSourceStale(currentSourceSha, state.rendered.sourceSha)) return false;\n return state.attempted?.sourceSha !== currentSourceSha;\n}\n\n/** `sourceSha` is the source as it stands now: what a render of it would record. */\nexport type StaleCreative = { slug: string; canvasPath: string; renderedRunId: string; sourceSha: string };\n\n/**\n * Every renderable creative in the workspace whose preview is stale. A canvas that still\n * has an unfilled `[TODO]` asset slot is skipped: the agent is mid-build, and a half-built\n * creative must never be pushed to render. The source is fingerprinted the way a render\n * and the dashboard sync fingerprint it (`prepareCanvas`, read-only), so the three never\n * disagree about what is stale. `canvasPath` is workspace-relative.\n */\nexport async function staleCreatives(workspaceRoot: string): Promise<StaleCreative[]> {\n const creativesDir = path.join(workspaceRoot, \"src\", \"creatives\");\n const canvasRoot = path.join(workspaceRoot, \"canvas\");\n let slugs: string[];\n try {\n slugs = (await readdir(creativesDir, { withFileTypes: true })).filter((d) => d.isDirectory()).map((d) => d.name);\n } catch {\n return [];\n }\n const stale: StaleCreative[] = [];\n for (const slug of slugs.sort()) {\n const state = await readRenderState(canvasRoot, slug);\n if (!state.rendered) continue;\n const canvasPath = path.join(creativesDir, slug, `${slug}.canvas.json`);\n let prepared: PreparedCanvas;\n try {\n prepared = await prepareCanvas(canvasPath, { write: false });\n } catch {\n continue; // Gone, renamed, or mid-edit invalid JSON: the next check reads it again.\n }\n if (unsuppliedPlaceholderAssets(prepared.fileGraph).length > 0) continue;\n const current = prepared.sourceSha;\n if (!current || !isRenderStale(state, current)) continue;\n stale.push({\n slug,\n canvasPath: path.relative(workspaceRoot, canvasPath).split(path.sep).join(\"/\"),\n renderedRunId: state.rendered.runId,\n sourceSha: current,\n });\n }\n return stale;\n}\n\n/**\n * Remove the `canvas/.dirty/<slug>.json` marker an older scaffold's PostToolUse hook wrote.\n * Nothing in a current scaffold reads it, but a client repo can run this CLI before its\n * scaffold sync lands, and there the old Stop hook and verify gate still read the marker:\n * clearing it on a render attempt, as the CLI always did, keeps that gate from blocking\n * forever. Delete once every client runs a scaffold without `nudge-canvas-rerender`.\n */\nexport async function clearLegacyDirtyMarker(canvasRoot: string, slug: string): Promise<void> {\n await rm(path.join(canvasRoot, \".dirty\", `${slug}.json`), { force: true }).catch(() => undefined);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,39 @@
1
+ // src/commands/canvas/definition-status.ts
2
+ import { readFile, writeFile } from "fs/promises";
3
+ import path from "path";
4
+ import { parseDocument } from "yaml";
5
+ var ORDER = { draft: 0, rendered: 1, published: 2 };
6
+ async function advanceDefinitionStatus(definitionPath, to) {
7
+ let raw;
8
+ try {
9
+ raw = await readFile(definitionPath, "utf8");
10
+ } catch {
11
+ return "missing";
12
+ }
13
+ const match = raw.match(/^---\r?\n([\s\S]*?\r?\n)?---/);
14
+ if (!match) return "unchanged";
15
+ const frontmatter = match[1] ?? "";
16
+ const doc = parseDocument(frontmatter);
17
+ if (doc.errors.length > 0) return "unchanged";
18
+ const current = doc.get("status");
19
+ if (typeof current === "string") {
20
+ const from = ORDER[current];
21
+ if (from === void 0 || from >= ORDER[to]) return "unchanged";
22
+ }
23
+ const statusLine = /^status:[^\n\r]*$/m;
24
+ const nextFrontmatter = statusLine.test(frontmatter) ? frontmatter.replace(statusLine, `status: ${to}`) : `${frontmatter}status: ${to}
25
+ `;
26
+ if (nextFrontmatter === frontmatter) return "unchanged";
27
+ await writeFile(definitionPath, `---
28
+ ${nextFrontmatter}---${raw.slice(match[0].length)}`, "utf8");
29
+ return "updated";
30
+ }
31
+ function definitionPathFor(workspaceRoot, slug) {
32
+ return path.join(workspaceRoot, "src", "creatives", slug, "_definition.md");
33
+ }
34
+
35
+ export {
36
+ advanceDefinitionStatus,
37
+ definitionPathFor
38
+ };
39
+ //# sourceMappingURL=chunk-3ACMDRSE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/canvas/definition-status.ts"],"sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseDocument } from \"yaml\";\n\n/**\n * A creative's lifecycle in its `_definition.md`, moved by the commands that cause it\n * rather than by hand: `baker canvas run` marks a creative `rendered` when the review\n * calls the render ready, and `baker creatives publish --run-id` marks it `published`.\n * The agent used to edit the field itself and often did not, so the committed status\n * drifted from what had happened and the backend had to guess around it.\n *\n * Only forward: draft, then rendered, then published. A published creative that is\n * rendered again stays published (what is live has not changed), and an archived one is\n * never touched. Only the `status` line changes; the rest of the file keeps its bytes.\n */\nexport type LifecycleStatus = \"rendered\" | \"published\";\n\nconst ORDER: Record<string, number | undefined> & Record<LifecycleStatus, number> = { draft: 0, rendered: 1, published: 2 };\n\nexport async function advanceDefinitionStatus(\n definitionPath: string,\n to: LifecycleStatus,\n): Promise<\"updated\" | \"unchanged\" | \"missing\"> {\n let raw: string;\n try {\n raw = await readFile(definitionPath, \"utf8\");\n } catch {\n return \"missing\";\n }\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?\\r?\\n)?---/);\n if (!match) return \"unchanged\";\n const frontmatter = match[1] ?? \"\";\n const doc = parseDocument(frontmatter);\n if (doc.errors.length > 0) return \"unchanged\";\n const current = doc.get(\"status\");\n if (typeof current === \"string\") {\n const from = ORDER[current];\n // Archived (or a status this CLI does not know) is never moved, and nothing moves back.\n if (from === undefined || from >= ORDER[to]) return \"unchanged\";\n }\n const statusLine = /^status:[^\\n\\r]*$/m;\n const nextFrontmatter = statusLine.test(frontmatter)\n ? frontmatter.replace(statusLine, `status: ${to}`)\n : `${frontmatter}status: ${to}\\n`;\n if (nextFrontmatter === frontmatter) return \"unchanged\";\n await writeFile(definitionPath, `---\\n${nextFrontmatter}---${raw.slice(match[0].length)}`, \"utf8\");\n return \"updated\";\n}\n\n/** `src/creatives/<slug>/_definition.md` under the workspace root. */\nexport function definitionPathFor(workspaceRoot: string, slug: string): string {\n return path.join(workspaceRoot, \"src\", \"creatives\", slug, \"_definition.md\");\n}\n"],"mappings":";AAAA,SAAS,UAAU,iBAAiB;AACpC,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAe9B,IAAM,QAA8E,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,EAAE;AAE1H,eAAsB,wBACpB,gBACA,IAC8C;AAC9C,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,SAAS,gBAAgB,MAAM;AAAA,EAC7C,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,IAAI,MAAM,8BAA8B;AACtD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,cAAc,MAAM,CAAC,KAAK;AAChC,QAAM,MAAM,cAAc,WAAW;AACrC,MAAI,IAAI,OAAO,SAAS,EAAG,QAAO;AAClC,QAAM,UAAU,IAAI,IAAI,QAAQ;AAChC,MAAI,OAAO,YAAY,UAAU;AAC/B,UAAM,OAAO,MAAM,OAAO;AAE1B,QAAI,SAAS,UAAa,QAAQ,MAAM,EAAE,EAAG,QAAO;AAAA,EACtD;AACA,QAAM,aAAa;AACnB,QAAM,kBAAkB,WAAW,KAAK,WAAW,IAC/C,YAAY,QAAQ,YAAY,WAAW,EAAE,EAAE,IAC/C,GAAG,WAAW,WAAW,EAAE;AAAA;AAC/B,MAAI,oBAAoB,YAAa,QAAO;AAC5C,QAAM,UAAU,gBAAgB;AAAA,EAAQ,eAAe,MAAM,IAAI,MAAM,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,MAAM;AACjG,SAAO;AACT;AAGO,SAAS,kBAAkB,eAAuB,MAAsB;AAC7E,SAAO,KAAK,KAAK,eAAe,OAAO,aAAa,MAAM,gBAAgB;AAC5E;","names":[]}
@@ -0,0 +1,26 @@
1
+ import {
2
+ writeJsonEnvelope
3
+ } from "./chunk-EIGXX6KI.js";
4
+ import {
5
+ apiGet
6
+ } from "./chunk-CUL3VB4L.js";
7
+
8
+ // src/available-accounts.ts
9
+ var AVAILABLE_ARG = {
10
+ type: "boolean",
11
+ description: "List everything the connected login reaches, each marked selected: true|false. Use it when the account, property, site or container the user means is not in the plain list.",
12
+ required: false
13
+ };
14
+ async function writeAvailableAccounts(platform, onError) {
15
+ try {
16
+ writeJsonEnvelope(await apiGet("/api/connections/available", { platform }));
17
+ } catch (err) {
18
+ onError(err);
19
+ }
20
+ }
21
+
22
+ export {
23
+ AVAILABLE_ARG,
24
+ writeAvailableAccounts
25
+ };
26
+ //# sourceMappingURL=chunk-3M6RNCDD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/available-accounts.ts"],"sourcesContent":["import type { AvailableAccountPlatform, AvailableAccountsResponse } from \"@baker/api\";\nimport { apiGet } from \"./client.ts\";\nimport { writeJsonEnvelope } from \"./commands/ads/output.ts\";\n\n/**\n * `--available` on every accounts command: what the connected login reaches,\n * each marked `selected`. The plain list shows only what the company selected,\n * so an account the user names but never ticked looks like one that does not\n * exist — this is how the agent tells the two apart before opening the picker.\n */\nexport const AVAILABLE_ARG = {\n type: \"boolean\",\n description:\n \"List everything the connected login reaches, each marked selected: true|false. Use it when the account, property, site or container the user means is not in the plain list.\",\n required: false,\n} as const;\n\n/** The `--available` answer, passed through as the backend shapes it; errors go to the command's own handler. */\nexport async function writeAvailableAccounts(\n platform: AvailableAccountPlatform,\n onError: (err: unknown) => never,\n): Promise<void> {\n try {\n writeJsonEnvelope(await apiGet<AvailableAccountsResponse>(\"/api/connections/available\", { platform }));\n } catch (err) {\n onError(err);\n }\n}\n"],"mappings":";;;;;;;;AAUO,IAAM,gBAAgB;AAAA,EAC3B,MAAM;AAAA,EACN,aACE;AAAA,EACF,UAAU;AACZ;AAGA,eAAsB,uBACpB,UACA,SACe;AACf,MAAI;AACF,sBAAkB,MAAM,OAAkC,8BAA8B,EAAE,SAAS,CAAC,CAAC;AAAA,EACvG,SAAS,KAAK;AACZ,YAAQ,GAAG;AAAA,EACb;AACF;","names":[]}