@koda-sl/baker-cli 0.386.0 → 0.387.0-dev.3bafd569e

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 (967) hide show
  1. package/README.md +1090 -211
  2. package/canvas/tiktok-captions-composition/index.html +5 -6
  3. package/canvas/tiktok-captions-composition/meta.json +5 -0
  4. package/dist/account-CLOKMTTC.js +49 -0
  5. package/dist/account-CLOKMTTC.js.map +1 -0
  6. package/dist/account-V5Y2QHAK.js +79 -0
  7. package/dist/account-V5Y2QHAK.js.map +1 -0
  8. package/dist/account-XFK6VX2R.js +80 -0
  9. package/dist/account-XFK6VX2R.js.map +1 -0
  10. package/dist/account-reads-S5VXX2QU.js +218 -0
  11. package/dist/account-reads-S5VXX2QU.js.map +1 -0
  12. package/dist/account-writes-Y7EQXDXF.js +66 -0
  13. package/dist/account-writes-Y7EQXDXF.js.map +1 -0
  14. package/dist/accounts-7YD457YN.js +114 -0
  15. package/dist/accounts-7YD457YN.js.map +1 -0
  16. package/dist/accounts-BJ3X5JQT.js +115 -0
  17. package/dist/accounts-BJ3X5JQT.js.map +1 -0
  18. package/dist/accounts-LOJ4WLIX.js +77 -0
  19. package/dist/accounts-LOJ4WLIX.js.map +1 -0
  20. package/dist/accounts-RYBDLQ6H.js +75 -0
  21. package/dist/accounts-RYBDLQ6H.js.map +1 -0
  22. package/dist/accounts-UO4XBWM2.js +611 -0
  23. package/dist/accounts-UO4XBWM2.js.map +1 -0
  24. package/dist/actions-3AW3R63U.js +55 -0
  25. package/dist/actions-3AW3R63U.js.map +1 -0
  26. package/dist/active-entities-R6GZIO6Z.js +103 -0
  27. package/dist/active-entities-R6GZIO6Z.js.map +1 -0
  28. package/dist/activities-ESBF3GFS.js +74 -0
  29. package/dist/activities-ESBF3GFS.js.map +1 -0
  30. package/dist/ad-group-writes-I225OYDZ.js +170 -0
  31. package/dist/ad-group-writes-I225OYDZ.js.map +1 -0
  32. package/dist/ad-groups-O35MWNF6.js +68 -0
  33. package/dist/ad-groups-O35MWNF6.js.map +1 -0
  34. package/dist/ad-writes-SS5YZO5W.js +174 -0
  35. package/dist/ad-writes-SS5YZO5W.js.map +1 -0
  36. package/dist/add-43DUOVNR.js +104 -0
  37. package/dist/add-43DUOVNR.js.map +1 -0
  38. package/dist/add-IE5WDELB.js +302 -0
  39. package/dist/add-IE5WDELB.js.map +1 -0
  40. package/dist/add-QZHAWUBA.js +97 -0
  41. package/dist/add-QZHAWUBA.js.map +1 -0
  42. package/dist/add-TGQIVVXH.js +105 -0
  43. package/dist/add-TGQIVVXH.js.map +1 -0
  44. package/dist/add-accounts-6QYPOPR2.js +91 -0
  45. package/dist/add-accounts-6QYPOPR2.js.map +1 -0
  46. package/dist/ads-AUSRB4GU.js +128 -0
  47. package/dist/ads-AUSRB4GU.js.map +1 -0
  48. package/dist/ads-COYOTEKE.js +77 -0
  49. package/dist/ads-COYOTEKE.js.map +1 -0
  50. package/dist/ads-DZ4N5INZ.js +40 -0
  51. package/dist/ads-DZ4N5INZ.js.map +1 -0
  52. package/dist/ads-XZCMSPM5.js +113 -0
  53. package/dist/ads-XZCMSPM5.js.map +1 -0
  54. package/dist/adsets-AKR75THA.js +176 -0
  55. package/dist/adsets-AKR75THA.js.map +1 -0
  56. package/dist/advertisers-52FMMBTQ.js +120 -0
  57. package/dist/advertisers-52FMMBTQ.js.map +1 -0
  58. package/dist/advertisers-BCGKUMEH.js +125 -0
  59. package/dist/advertisers-BCGKUMEH.js.map +1 -0
  60. package/dist/analytics-JPDBKETM.js +1980 -0
  61. package/dist/analytics-JPDBKETM.js.map +1 -0
  62. package/dist/analytics-YVQ6H4BG.js +433 -0
  63. package/dist/analytics-YVQ6H4BG.js.map +1 -0
  64. package/dist/animate-JXIT77Y5.js +480 -0
  65. package/dist/animate-JXIT77Y5.js.map +1 -0
  66. package/dist/assign-66NTWTR2.js +77 -0
  67. package/dist/assign-66NTWTR2.js.map +1 -0
  68. package/dist/audience-size-LVQJWQAS.js +94 -0
  69. package/dist/audience-size-LVQJWQAS.js.map +1 -0
  70. package/dist/audiences-DC3IOG34.js +85 -0
  71. package/dist/audiences-DC3IOG34.js.map +1 -0
  72. package/dist/audiences-NEW3LLQR.js +268 -0
  73. package/dist/audiences-NEW3LLQR.js.map +1 -0
  74. package/dist/audiences-NYGMBGQ3.js +79 -0
  75. package/dist/audiences-NYGMBGQ3.js.map +1 -0
  76. package/dist/audit-UIPMTI5C.js +88 -0
  77. package/dist/audit-UIPMTI5C.js.map +1 -0
  78. package/dist/audit-XGN2OFLN.js +151 -0
  79. package/dist/audit-XGN2OFLN.js.map +1 -0
  80. package/dist/autocomplete-LVPDV3JE.js +111 -0
  81. package/dist/autocomplete-LVPDV3JE.js.map +1 -0
  82. package/dist/avatars-S6NSLMJK.js +38 -0
  83. package/dist/avatars-S6NSLMJK.js.map +1 -0
  84. package/dist/bid-pricing-2LYULXU2.js +99 -0
  85. package/dist/bid-pricing-2LYULXU2.js.map +1 -0
  86. package/dist/brand-WWHUZ72R.js +22 -0
  87. package/dist/brand-WWHUZ72R.js.map +1 -0
  88. package/dist/brief-K3FILESK.js +492 -0
  89. package/dist/brief-K3FILESK.js.map +1 -0
  90. package/dist/businesses-J7OP7MSK.js +53 -0
  91. package/dist/businesses-J7OP7MSK.js.map +1 -0
  92. package/dist/campaign-groups-N4TZ2F3L.js +95 -0
  93. package/dist/campaign-groups-N4TZ2F3L.js.map +1 -0
  94. package/dist/campaign-writes-5XA727KI.js +170 -0
  95. package/dist/campaign-writes-5XA727KI.js.map +1 -0
  96. package/dist/campaign-writes-7YFRQIQT.js +165 -0
  97. package/dist/campaign-writes-7YFRQIQT.js.map +1 -0
  98. package/dist/campaigns-JPYNVFQI.js +76 -0
  99. package/dist/campaigns-JPYNVFQI.js.map +1 -0
  100. package/dist/campaigns-L43ZUKAI.js +107 -0
  101. package/dist/campaigns-L43ZUKAI.js.map +1 -0
  102. package/dist/campaigns-OD7Z332M.js +109 -0
  103. package/dist/campaigns-OD7Z332M.js.map +1 -0
  104. package/dist/campaigns-R4DXIR2Q.js +110 -0
  105. package/dist/campaigns-R4DXIR2Q.js.map +1 -0
  106. package/dist/canvas-57K7AGAP.js +46 -0
  107. package/dist/canvas-57K7AGAP.js.map +1 -0
  108. package/dist/capabilities-FVTZAFPV.js +144 -0
  109. package/dist/capabilities-FVTZAFPV.js.map +1 -0
  110. package/dist/cards-7H32TNMO.js +85 -0
  111. package/dist/cards-7H32TNMO.js.map +1 -0
  112. package/dist/catalog-OTICZPJA.js +64 -0
  113. package/dist/catalog-OTICZPJA.js.map +1 -0
  114. package/dist/catalogs-ABCQLCDU.js +128 -0
  115. package/dist/catalogs-ABCQLCDU.js.map +1 -0
  116. package/dist/changes-7ZIGNUW6.js +135 -0
  117. package/dist/changes-7ZIGNUW6.js.map +1 -0
  118. package/dist/chatgpt-B3NHRJUE.js +47 -0
  119. package/dist/chatgpt-B3NHRJUE.js.map +1 -0
  120. package/dist/chats-E7DBRHBF.js +262 -0
  121. package/dist/chats-E7DBRHBF.js.map +1 -0
  122. package/dist/chunk-2CV7LX23.js +474 -0
  123. package/dist/chunk-2CV7LX23.js.map +1 -0
  124. package/dist/chunk-2HCI5BXB.js +479 -0
  125. package/dist/chunk-2HCI5BXB.js.map +1 -0
  126. package/dist/chunk-2SQJL7ZN.js +56 -0
  127. package/dist/chunk-2SQJL7ZN.js.map +1 -0
  128. package/dist/chunk-2Y5V23PU.js +29 -0
  129. package/dist/chunk-2Y5V23PU.js.map +1 -0
  130. package/dist/chunk-32CPGJPL.js +149 -0
  131. package/dist/chunk-32CPGJPL.js.map +1 -0
  132. package/dist/chunk-3ACMDRSE.js +39 -0
  133. package/dist/chunk-3ACMDRSE.js.map +1 -0
  134. package/dist/chunk-3N4PZIIV.js +304 -0
  135. package/dist/chunk-3N4PZIIV.js.map +1 -0
  136. package/dist/chunk-3U7TDBIB.js +275 -0
  137. package/dist/chunk-3U7TDBIB.js.map +1 -0
  138. package/dist/chunk-3UDSYYND.js +42 -0
  139. package/dist/chunk-3UDSYYND.js.map +1 -0
  140. package/dist/chunk-3ZWWXAQZ.js +150 -0
  141. package/dist/chunk-3ZWWXAQZ.js.map +1 -0
  142. package/dist/chunk-4MH6LONO.js +274 -0
  143. package/dist/chunk-4MH6LONO.js.map +1 -0
  144. package/dist/chunk-4NZ47VXO.js +137 -0
  145. package/dist/chunk-4NZ47VXO.js.map +1 -0
  146. package/dist/chunk-564AEU2Q.js +541 -0
  147. package/dist/chunk-564AEU2Q.js.map +1 -0
  148. package/dist/chunk-5HYSKH77.js +315 -0
  149. package/dist/chunk-5HYSKH77.js.map +1 -0
  150. package/dist/chunk-5MBPIONY.js +29 -0
  151. package/dist/chunk-5MBPIONY.js.map +1 -0
  152. package/dist/chunk-5OVOLYY3.js +74 -0
  153. package/dist/chunk-5OVOLYY3.js.map +1 -0
  154. package/dist/chunk-5SJ3JNNY.js +6683 -0
  155. package/dist/chunk-5SJ3JNNY.js.map +1 -0
  156. package/dist/chunk-66USKCVY.js +4410 -0
  157. package/dist/chunk-66USKCVY.js.map +1 -0
  158. package/dist/chunk-6I7SYEYN.js +166 -0
  159. package/dist/chunk-6I7SYEYN.js.map +1 -0
  160. package/dist/chunk-6O7ISBC7.js +65 -0
  161. package/dist/chunk-6O7ISBC7.js.map +1 -0
  162. package/dist/chunk-752S7JF6.js +35 -0
  163. package/dist/chunk-752S7JF6.js.map +1 -0
  164. package/dist/chunk-77DN7R35.js +228 -0
  165. package/dist/chunk-77DN7R35.js.map +1 -0
  166. package/dist/chunk-7F7MFMLI.js +175 -0
  167. package/dist/chunk-7F7MFMLI.js.map +1 -0
  168. package/dist/chunk-7THBBTJJ.js +183 -0
  169. package/dist/chunk-7THBBTJJ.js.map +1 -0
  170. package/dist/chunk-7XU3HKMX.js +1599 -0
  171. package/dist/chunk-7XU3HKMX.js.map +1 -0
  172. package/dist/chunk-AEA5JV2X.js +92 -0
  173. package/dist/chunk-AEA5JV2X.js.map +1 -0
  174. package/dist/chunk-AFJGYJ7Z.js +45 -0
  175. package/dist/chunk-AFJGYJ7Z.js.map +1 -0
  176. package/dist/chunk-AR7PU7BB.js +76 -0
  177. package/dist/chunk-AR7PU7BB.js.map +1 -0
  178. package/dist/chunk-ASL7JFBD.js +96 -0
  179. package/dist/chunk-ASL7JFBD.js.map +1 -0
  180. package/dist/chunk-AUSKKFVH.js +84 -0
  181. package/dist/chunk-AUSKKFVH.js.map +1 -0
  182. package/dist/chunk-B52DCYL2.js +159 -0
  183. package/dist/chunk-B52DCYL2.js.map +1 -0
  184. package/dist/{chunk-XHC4LMK4.js → chunk-BVM5IRZW.js} +16 -8
  185. package/dist/chunk-BVM5IRZW.js.map +1 -0
  186. package/dist/chunk-CAMX6OHF.js +3182 -0
  187. package/dist/chunk-CAMX6OHF.js.map +1 -0
  188. package/dist/chunk-CYBLKMXQ.js +310 -0
  189. package/dist/chunk-CYBLKMXQ.js.map +1 -0
  190. package/dist/chunk-CZENWCBS.js +333 -0
  191. package/dist/chunk-CZENWCBS.js.map +1 -0
  192. package/dist/chunk-D5FY4FAK.js +24 -0
  193. package/dist/chunk-D5FY4FAK.js.map +1 -0
  194. package/dist/chunk-DGCUPJZD.js +39 -0
  195. package/dist/chunk-DGCUPJZD.js.map +1 -0
  196. package/dist/chunk-DNCLWSHO.js +41 -0
  197. package/dist/chunk-DNCLWSHO.js.map +1 -0
  198. package/dist/chunk-DX4GIDO7.js +296 -0
  199. package/dist/chunk-DX4GIDO7.js.map +1 -0
  200. package/dist/chunk-EDLZGTGN.js +216 -0
  201. package/dist/chunk-EDLZGTGN.js.map +1 -0
  202. package/dist/chunk-EDNX3AOS.js +76 -0
  203. package/dist/chunk-EDNX3AOS.js.map +1 -0
  204. package/dist/chunk-EF5DP6EB.js +52 -0
  205. package/dist/chunk-EF5DP6EB.js.map +1 -0
  206. package/dist/chunk-ERSX3MKH.js +34 -0
  207. package/dist/chunk-ERSX3MKH.js.map +1 -0
  208. package/dist/chunk-F3IJSR7O.js +346 -0
  209. package/dist/chunk-F3IJSR7O.js.map +1 -0
  210. package/dist/chunk-FKOECEVC.js +126 -0
  211. package/dist/chunk-FKOECEVC.js.map +1 -0
  212. package/dist/chunk-FYWWTMXP.js +2902 -0
  213. package/dist/chunk-FYWWTMXP.js.map +1 -0
  214. package/dist/chunk-G7AFVTUS.js +106 -0
  215. package/dist/chunk-G7AFVTUS.js.map +1 -0
  216. package/dist/chunk-GIW7ABMM.js +74 -0
  217. package/dist/chunk-GIW7ABMM.js.map +1 -0
  218. package/dist/chunk-GIWHHCD6.js +145 -0
  219. package/dist/chunk-GIWHHCD6.js.map +1 -0
  220. package/dist/chunk-GPZH5ASB.js +3151 -0
  221. package/dist/chunk-GPZH5ASB.js.map +1 -0
  222. package/dist/chunk-GRQ2AXDX.js +9 -0
  223. package/dist/chunk-GRQ2AXDX.js.map +1 -0
  224. package/dist/chunk-GXDLWBOY.js +73 -0
  225. package/dist/chunk-GXDLWBOY.js.map +1 -0
  226. package/dist/chunk-GYABNLWW.js +629 -0
  227. package/dist/chunk-GYABNLWW.js.map +1 -0
  228. package/dist/chunk-H7MLHG2I.js +94 -0
  229. package/dist/chunk-H7MLHG2I.js.map +1 -0
  230. package/dist/chunk-H7XVKLIY.js +206 -0
  231. package/dist/chunk-H7XVKLIY.js.map +1 -0
  232. package/dist/chunk-HAE4WWFQ.js +455 -0
  233. package/dist/chunk-HAE4WWFQ.js.map +1 -0
  234. package/dist/chunk-HDHWIEJJ.js +136 -0
  235. package/dist/chunk-HDHWIEJJ.js.map +1 -0
  236. package/dist/chunk-HJTIBTF7.js +98 -0
  237. package/dist/chunk-HJTIBTF7.js.map +1 -0
  238. package/dist/{chunk-VZEDAFAR.js → chunk-HLXWKMTK.js} +47 -8
  239. package/dist/chunk-HLXWKMTK.js.map +1 -0
  240. package/dist/{chunk-MF7YA62W.js → chunk-HREWXNTO.js} +10 -5
  241. package/dist/chunk-HREWXNTO.js.map +1 -0
  242. package/dist/chunk-HYXKRNRV.js +176 -0
  243. package/dist/chunk-HYXKRNRV.js.map +1 -0
  244. package/dist/chunk-I3DIZWN5.js +97 -0
  245. package/dist/chunk-I3DIZWN5.js.map +1 -0
  246. package/dist/chunk-IJMWEO4P.js +57 -0
  247. package/dist/chunk-IJMWEO4P.js.map +1 -0
  248. package/dist/chunk-IOCSDFF2.js +23992 -0
  249. package/dist/chunk-IOCSDFF2.js.map +1 -0
  250. package/dist/chunk-IVIJJXXT.js +62 -0
  251. package/dist/chunk-IVIJJXXT.js.map +1 -0
  252. package/dist/chunk-J57GWTPK.js +106 -0
  253. package/dist/chunk-J57GWTPK.js.map +1 -0
  254. package/dist/chunk-JPK34QPS.js +134 -0
  255. package/dist/chunk-JPK34QPS.js.map +1 -0
  256. package/dist/chunk-JRCFCIE3.js +188 -0
  257. package/dist/chunk-JRCFCIE3.js.map +1 -0
  258. package/dist/chunk-JUAIGJ2A.js +76 -0
  259. package/dist/chunk-JUAIGJ2A.js.map +1 -0
  260. package/dist/chunk-K5OQES4V.js +58 -0
  261. package/dist/chunk-K5OQES4V.js.map +1 -0
  262. package/dist/chunk-KBS5GH4T.js +1626 -0
  263. package/dist/chunk-KBS5GH4T.js.map +1 -0
  264. package/dist/chunk-KIGGMKAE.js +66 -0
  265. package/dist/chunk-KIGGMKAE.js.map +1 -0
  266. package/dist/chunk-KKJ4KJCW.js +29 -0
  267. package/dist/chunk-KKJ4KJCW.js.map +1 -0
  268. package/dist/chunk-KLK6KQLQ.js +55 -0
  269. package/dist/chunk-KLK6KQLQ.js.map +1 -0
  270. package/dist/chunk-KUZFWMJN.js +207 -0
  271. package/dist/chunk-KUZFWMJN.js.map +1 -0
  272. package/dist/chunk-KXGG6EQM.js +382 -0
  273. package/dist/chunk-KXGG6EQM.js.map +1 -0
  274. package/dist/chunk-KXRKPZZY.js +169 -0
  275. package/dist/chunk-KXRKPZZY.js.map +1 -0
  276. package/dist/chunk-KZUHRZ2C.js +5187 -0
  277. package/dist/chunk-KZUHRZ2C.js.map +1 -0
  278. package/dist/chunk-L45A3IYV.js +1079 -0
  279. package/dist/chunk-L45A3IYV.js.map +1 -0
  280. package/dist/chunk-LA6PPSNA.js +65 -0
  281. package/dist/chunk-LA6PPSNA.js.map +1 -0
  282. package/dist/chunk-LEIQAHWF.js +25 -0
  283. package/dist/chunk-LEIQAHWF.js.map +1 -0
  284. package/dist/chunk-LERWCRY5.js +297 -0
  285. package/dist/chunk-LERWCRY5.js.map +1 -0
  286. package/dist/chunk-M6UNISGO.js +66 -0
  287. package/dist/chunk-M6UNISGO.js.map +1 -0
  288. package/dist/chunk-MGKHFGLV.js +75 -0
  289. package/dist/chunk-MGKHFGLV.js.map +1 -0
  290. package/dist/chunk-MZWC6HHA.js +455 -0
  291. package/dist/chunk-MZWC6HHA.js.map +1 -0
  292. package/dist/chunk-N3XJ434P.js +197 -0
  293. package/dist/chunk-N3XJ434P.js.map +1 -0
  294. package/dist/chunk-NFSLRRIE.js +77 -0
  295. package/dist/chunk-NFSLRRIE.js.map +1 -0
  296. package/dist/chunk-NHU33T2S.js +60 -0
  297. package/dist/chunk-NHU33T2S.js.map +1 -0
  298. package/dist/chunk-NJEZM4OB.js +51 -0
  299. package/dist/chunk-NJEZM4OB.js.map +1 -0
  300. package/dist/chunk-O6QKCJE4.js +455 -0
  301. package/dist/chunk-O6QKCJE4.js.map +1 -0
  302. package/dist/chunk-OFFAMC5H.js +225 -0
  303. package/dist/chunk-OFFAMC5H.js.map +1 -0
  304. package/dist/chunk-OHGTCFFE.js +57 -0
  305. package/dist/chunk-OHGTCFFE.js.map +1 -0
  306. package/dist/chunk-P4NSJS54.js +20 -0
  307. package/dist/chunk-P4NSJS54.js.map +1 -0
  308. package/dist/chunk-P5T7OZKV.js +26 -0
  309. package/dist/chunk-P5T7OZKV.js.map +1 -0
  310. package/dist/chunk-PFBQERWX.js +10 -0
  311. package/dist/chunk-PFBQERWX.js.map +1 -0
  312. package/dist/chunk-PKTLHYH4.js +509 -0
  313. package/dist/chunk-PKTLHYH4.js.map +1 -0
  314. package/dist/chunk-PUPEGICD.js +103 -0
  315. package/dist/chunk-PUPEGICD.js.map +1 -0
  316. package/dist/chunk-Q6ULQMWG.js +41 -0
  317. package/dist/chunk-Q6ULQMWG.js.map +1 -0
  318. package/dist/chunk-QO23YHLK.js +84 -0
  319. package/dist/chunk-QO23YHLK.js.map +1 -0
  320. package/dist/chunk-QSGIWV4P.js +337 -0
  321. package/dist/chunk-QSGIWV4P.js.map +1 -0
  322. package/dist/chunk-R5OQM7FF.js +179 -0
  323. package/dist/chunk-R5OQM7FF.js.map +1 -0
  324. package/dist/chunk-RFB6RYKA.js +111 -0
  325. package/dist/chunk-RFB6RYKA.js.map +1 -0
  326. package/dist/chunk-RGIXQEGJ.js +502 -0
  327. package/dist/chunk-RGIXQEGJ.js.map +1 -0
  328. package/dist/chunk-RODLBWIR.js +592 -0
  329. package/dist/chunk-RODLBWIR.js.map +1 -0
  330. package/dist/chunk-S4LZ7KTG.js +160 -0
  331. package/dist/chunk-S4LZ7KTG.js.map +1 -0
  332. package/dist/chunk-SHTESUB6.js +1442 -0
  333. package/dist/chunk-SHTESUB6.js.map +1 -0
  334. package/dist/chunk-SJH4EOZH.js +23 -0
  335. package/dist/chunk-SJH4EOZH.js.map +1 -0
  336. package/dist/chunk-SLB46MSS.js +64 -0
  337. package/dist/chunk-SLB46MSS.js.map +1 -0
  338. package/dist/chunk-SMIENBNX.js +6212 -0
  339. package/dist/chunk-SMIENBNX.js.map +1 -0
  340. package/dist/chunk-T7GT22KA.js +494 -0
  341. package/dist/chunk-T7GT22KA.js.map +1 -0
  342. package/dist/chunk-T7M4WFNV.js +172 -0
  343. package/dist/chunk-T7M4WFNV.js.map +1 -0
  344. package/dist/chunk-TLQ23DDW.js +19 -0
  345. package/dist/chunk-TLQ23DDW.js.map +1 -0
  346. package/dist/chunk-TMIDUSOR.js +665 -0
  347. package/dist/chunk-TMIDUSOR.js.map +1 -0
  348. package/dist/{chunk-WLDM2TRF.js → chunk-TPXI2GCW.js} +4 -4
  349. package/dist/chunk-U6VRBDNQ.js +1830 -0
  350. package/dist/chunk-U6VRBDNQ.js.map +1 -0
  351. package/dist/chunk-U7BBXM67.js +1743 -0
  352. package/dist/chunk-U7BBXM67.js.map +1 -0
  353. package/dist/chunk-UI6BKYQD.js +225 -0
  354. package/dist/chunk-UI6BKYQD.js.map +1 -0
  355. package/dist/chunk-UOI5S62H.js +846 -0
  356. package/dist/chunk-UOI5S62H.js.map +1 -0
  357. package/dist/chunk-USL5ARRE.js +26 -0
  358. package/dist/chunk-USL5ARRE.js.map +1 -0
  359. package/dist/chunk-UYC45JNS.js +139 -0
  360. package/dist/chunk-UYC45JNS.js.map +1 -0
  361. package/dist/chunk-VNKVBY54.js +363 -0
  362. package/dist/chunk-VNKVBY54.js.map +1 -0
  363. package/dist/chunk-VS4C7VAR.js +533 -0
  364. package/dist/chunk-VS4C7VAR.js.map +1 -0
  365. package/dist/chunk-W4W4ZRBP.js +191 -0
  366. package/dist/chunk-W4W4ZRBP.js.map +1 -0
  367. package/dist/chunk-WN4KX7GE.js +25 -0
  368. package/dist/chunk-WN4KX7GE.js.map +1 -0
  369. package/dist/chunk-WNFTXSGR.js +111 -0
  370. package/dist/chunk-WNFTXSGR.js.map +1 -0
  371. package/dist/chunk-WOTDHRNF.js +2109 -0
  372. package/dist/chunk-WOTDHRNF.js.map +1 -0
  373. package/dist/chunk-XGWKTYXQ.js +67 -0
  374. package/dist/chunk-XGWKTYXQ.js.map +1 -0
  375. package/dist/chunk-XIGIJJSF.js +66 -0
  376. package/dist/chunk-XIGIJJSF.js.map +1 -0
  377. package/dist/chunk-XNUXB63I.js +817 -0
  378. package/dist/chunk-XNUXB63I.js.map +1 -0
  379. package/dist/chunk-XQ3CCNJD.js +610 -0
  380. package/dist/chunk-XQ3CCNJD.js.map +1 -0
  381. package/dist/chunk-XX6ZMCY5.js +4227 -0
  382. package/dist/chunk-XX6ZMCY5.js.map +1 -0
  383. package/dist/chunk-Y362QH54.js +98 -0
  384. package/dist/chunk-Y362QH54.js.map +1 -0
  385. package/dist/chunk-Y4T6ATDQ.js +74 -0
  386. package/dist/chunk-Y4T6ATDQ.js.map +1 -0
  387. package/dist/chunk-YQSBHWOI.js +41 -0
  388. package/dist/chunk-YU26SDNT.js +46 -0
  389. package/dist/chunk-YU26SDNT.js.map +1 -0
  390. package/dist/chunk-YULENNA7.js +501 -0
  391. package/dist/chunk-YULENNA7.js.map +1 -0
  392. package/dist/chunk-YYSZYSAG.js +150 -0
  393. package/dist/chunk-YYSZYSAG.js.map +1 -0
  394. package/dist/chunk-Z3ENMCFE.js +94 -0
  395. package/dist/chunk-Z3ENMCFE.js.map +1 -0
  396. package/dist/chunk-ZH7ZM3ZM.js +125 -0
  397. package/dist/chunk-ZH7ZM3ZM.js.map +1 -0
  398. package/dist/chunk-ZIXHS6AM.js +42 -0
  399. package/dist/chunk-ZIXHS6AM.js.map +1 -0
  400. package/dist/chunk-ZLLJKSNS.js +96 -0
  401. package/dist/chunk-ZLLJKSNS.js.map +1 -0
  402. package/dist/claim-LF6VQ7OR.js +197 -0
  403. package/dist/claim-LF6VQ7OR.js.map +1 -0
  404. package/dist/cli.js +104 -70026
  405. package/dist/cli.js.map +1 -1
  406. package/dist/client-26SAJ46D.js +19 -0
  407. package/dist/code-MOWYJMDH.js +76 -0
  408. package/dist/code-MOWYJMDH.js.map +1 -0
  409. package/dist/companies-6HSK5BLK.js +195 -0
  410. package/dist/companies-6HSK5BLK.js.map +1 -0
  411. package/dist/complete-2PUAFQEC.js +81 -0
  412. package/dist/complete-2PUAFQEC.js.map +1 -0
  413. package/dist/config-X6GKOVQ6.js +88 -0
  414. package/dist/config-X6GKOVQ6.js.map +1 -0
  415. package/dist/connect-RXPMAJQI.js +42 -0
  416. package/dist/content-UYZC4AKN.js +85 -0
  417. package/dist/content-UYZC4AKN.js.map +1 -0
  418. package/dist/conversation-Y3NB2VDI.js +93 -0
  419. package/dist/conversation-Y3NB2VDI.js.map +1 -0
  420. package/dist/conversion-report-R4GJWWTK.js +125 -0
  421. package/dist/conversion-report-R4GJWWTK.js.map +1 -0
  422. package/dist/conversion-upload-command-YP4DGTPP.js +438 -0
  423. package/dist/conversion-upload-command-YP4DGTPP.js.map +1 -0
  424. package/dist/conversion-writes-WHFFUWWL.js +120 -0
  425. package/dist/conversion-writes-WHFFUWWL.js.map +1 -0
  426. package/dist/conversions-K7C32DPW.js +135 -0
  427. package/dist/conversions-K7C32DPW.js.map +1 -0
  428. package/dist/conversions-OXJAX5GB.js +76 -0
  429. package/dist/conversions-OXJAX5GB.js.map +1 -0
  430. package/dist/countries-PBXNB3BR.js +82 -0
  431. package/dist/countries-PBXNB3BR.js.map +1 -0
  432. package/dist/create-AJ4KPSJ4.js +59 -0
  433. package/dist/create-AJ4KPSJ4.js.map +1 -0
  434. package/dist/create-ALKOAD5J.js +138 -0
  435. package/dist/create-ALKOAD5J.js.map +1 -0
  436. package/dist/create-HTKZMXKB.js +207 -0
  437. package/dist/create-HTKZMXKB.js.map +1 -0
  438. package/dist/create-TZMAOFBR.js +236 -0
  439. package/dist/create-TZMAOFBR.js.map +1 -0
  440. package/dist/creatives-BJYJFVXJ.js +51 -0
  441. package/dist/creatives-BJYJFVXJ.js.map +1 -0
  442. package/dist/creatives-OZHVU4WB.js +182 -0
  443. package/dist/creatives-OZHVU4WB.js.map +1 -0
  444. package/dist/creatives-VMGY5SU4.js +87 -0
  445. package/dist/creatives-VMGY5SU4.js.map +1 -0
  446. package/dist/credentials-FY4UH6TF.js +287 -0
  447. package/dist/credentials-FY4UH6TF.js.map +1 -0
  448. package/dist/critique-B3H7QFM2.js +1449 -0
  449. package/dist/critique-B3H7QFM2.js.map +1 -0
  450. package/dist/critique-YZBOA27H.js +216 -0
  451. package/dist/critique-YZBOA27H.js.map +1 -0
  452. package/dist/crm-2IBLUHDB.js +318 -0
  453. package/dist/crm-2IBLUHDB.js.map +1 -0
  454. package/dist/crm-YMYO4U53.js +224 -0
  455. package/dist/crm-YMYO4U53.js.map +1 -0
  456. package/dist/crop-U3AD4DDR.js +113 -0
  457. package/dist/crop-U3AD4DDR.js.map +1 -0
  458. package/dist/currency-S6KWZSZ6.js +88 -0
  459. package/dist/currency-S6KWZSZ6.js.map +1 -0
  460. package/dist/custom-conversions-FABS6YVT.js +125 -0
  461. package/dist/custom-conversions-FABS6YVT.js.map +1 -0
  462. package/dist/customers-P6LLLJHK.js +56 -0
  463. package/dist/decide-YTHCBKM6.js +199 -0
  464. package/dist/decide-YTHCBKM6.js.map +1 -0
  465. package/dist/delete-B2TDEW7H.js +63 -0
  466. package/dist/delete-B2TDEW7H.js.map +1 -0
  467. package/dist/delete-DZUDLYPC.js +69 -0
  468. package/dist/delete-DZUDLYPC.js.map +1 -0
  469. package/dist/delete-NZGZP4YP.js +71 -0
  470. package/dist/delete-NZGZP4YP.js.map +1 -0
  471. package/dist/delete-SDOZNDWQ.js +54 -0
  472. package/dist/delete-SDOZNDWQ.js.map +1 -0
  473. package/dist/delete-VQMU56OH.js +71 -0
  474. package/dist/delete-VQMU56OH.js.map +1 -0
  475. package/dist/delete-WKQPMVAM.js +66 -0
  476. package/dist/delete-WKQPMVAM.js.map +1 -0
  477. package/dist/demographics-Q3DCXULY.js +138 -0
  478. package/dist/demographics-Q3DCXULY.js.map +1 -0
  479. package/dist/describe-JNTCQZNL.js +97 -0
  480. package/dist/describe-JNTCQZNL.js.map +1 -0
  481. package/dist/describe-MT4334NG.js +97 -0
  482. package/dist/describe-MT4334NG.js.map +1 -0
  483. package/dist/dimensions-FEZUJRAG.js +101 -0
  484. package/dist/dimensions-FEZUJRAG.js.map +1 -0
  485. package/dist/discard-NEZM5CHF.js +66 -0
  486. package/dist/discard-NEZM5CHF.js.map +1 -0
  487. package/dist/discover-4GD7QSF5.js +93 -0
  488. package/dist/discover-4GD7QSF5.js.map +1 -0
  489. package/dist/discover-6K3IOYXR.js +172 -0
  490. package/dist/discover-6K3IOYXR.js.map +1 -0
  491. package/dist/domain-7Y256IDR.js +98 -0
  492. package/dist/domain-7Y256IDR.js.map +1 -0
  493. package/dist/download-L27HWEOE.js +299 -0
  494. package/dist/download-L27HWEOE.js.map +1 -0
  495. package/dist/draft-25G2P2TE.js +281 -0
  496. package/dist/draft-25G2P2TE.js.map +1 -0
  497. package/dist/draft-F6TUGXAY.js +307 -0
  498. package/dist/draft-F6TUGXAY.js.map +1 -0
  499. package/dist/draft-KLULNBWP.js +233 -0
  500. package/dist/draft-KLULNBWP.js.map +1 -0
  501. package/dist/draft-LY5ZPF73.js +217 -0
  502. package/dist/draft-LY5ZPF73.js.map +1 -0
  503. package/dist/draft-M4ZHDQ46.js +306 -0
  504. package/dist/draft-M4ZHDQ46.js.map +1 -0
  505. package/dist/draft-MI7RWY2K.js +100 -0
  506. package/dist/draft-MI7RWY2K.js.map +1 -0
  507. package/dist/draft-P4IVYTY3.js +103 -0
  508. package/dist/draft-P4IVYTY3.js.map +1 -0
  509. package/dist/draft-QQMCVDDS.js +328 -0
  510. package/dist/draft-QQMCVDDS.js.map +1 -0
  511. package/dist/engine/index.d.ts +213 -127
  512. package/dist/engine/index.js +18 -4
  513. package/dist/{env-4P5HOGNA.js → env-FBTHZKGN.js} +12 -2
  514. package/dist/env-FBTHZKGN.js.map +1 -0
  515. package/dist/experiment-HDYTJPUY.js +1397 -0
  516. package/dist/experiment-HDYTJPUY.js.map +1 -0
  517. package/dist/export-TS5GYEMA.js +168 -0
  518. package/dist/export-TS5GYEMA.js.map +1 -0
  519. package/dist/extract-QVQFUOIK.js +113 -0
  520. package/dist/extract-QVQFUOIK.js.map +1 -0
  521. package/dist/facets-7MBSM7BP.js +114 -0
  522. package/dist/facets-7MBSM7BP.js.map +1 -0
  523. package/dist/favorites-7QP7BY5K.js +178 -0
  524. package/dist/favorites-7QP7BY5K.js.map +1 -0
  525. package/dist/feed-EETRO2FG.js +177 -0
  526. package/dist/feed-EETRO2FG.js.map +1 -0
  527. package/dist/feedback-ZOUL22TP.js +66 -0
  528. package/dist/feedback-ZOUL22TP.js.map +1 -0
  529. package/dist/feedback-record-XFFJRKS6.js +177 -0
  530. package/dist/feedback-record-XFFJRKS6.js.map +1 -0
  531. package/dist/fetch-QE3EB756.js +176 -0
  532. package/dist/fetch-QE3EB756.js.map +1 -0
  533. package/dist/fetch-Z7O3ZL4D.js +139 -0
  534. package/dist/fetch-Z7O3ZL4D.js.map +1 -0
  535. package/dist/find-KAQ6JDMO.js +134 -0
  536. package/dist/find-KAQ6JDMO.js.map +1 -0
  537. package/dist/fit-MY5GVZZZ.js +45 -0
  538. package/dist/fit-MY5GVZZZ.js.map +1 -0
  539. package/dist/flows-C67KEMDU.js +247 -0
  540. package/dist/flows-C67KEMDU.js.map +1 -0
  541. package/dist/follow-IX4XVK5Y.js +94 -0
  542. package/dist/follow-IX4XVK5Y.js.map +1 -0
  543. package/dist/follow-competitors-UZBUOYTH.js +112 -0
  544. package/dist/follow-competitors-UZBUOYTH.js.map +1 -0
  545. package/dist/following-VGOIUCIZ.js +113 -0
  546. package/dist/following-VGOIUCIZ.js.map +1 -0
  547. package/dist/fonts-UR7XZ5XZ.js +34 -0
  548. package/dist/fonts-UR7XZ5XZ.js.map +1 -0
  549. package/dist/forecast-3F4SZNAK.js +104 -0
  550. package/dist/forecast-3F4SZNAK.js.map +1 -0
  551. package/dist/forecast-K5E7CTKX.js +168 -0
  552. package/dist/forecast-K5E7CTKX.js.map +1 -0
  553. package/dist/funding-H5YO37OW.js +85 -0
  554. package/dist/funding-H5YO37OW.js.map +1 -0
  555. package/dist/funnel-2PPEPAMY.js +394 -0
  556. package/dist/funnel-2PPEPAMY.js.map +1 -0
  557. package/dist/ga4-YHJ2XMLC.js +55 -0
  558. package/dist/ga4-YHJ2XMLC.js.map +1 -0
  559. package/dist/generate-M2ZX5DMI.js +262 -0
  560. package/dist/generate-M2ZX5DMI.js.map +1 -0
  561. package/dist/get-4EYKCZ6F.js +59 -0
  562. package/dist/get-4EYKCZ6F.js.map +1 -0
  563. package/dist/get-637GALM2.js +63 -0
  564. package/dist/get-637GALM2.js.map +1 -0
  565. package/dist/get-AZARFR6O.js +61 -0
  566. package/dist/get-AZARFR6O.js.map +1 -0
  567. package/dist/get-BPMEHRUG.js +56 -0
  568. package/dist/get-BPMEHRUG.js.map +1 -0
  569. package/dist/get-MQ6MMIZ7.js +78 -0
  570. package/dist/get-MQ6MMIZ7.js.map +1 -0
  571. package/dist/get-N4BPOQCB.js +63 -0
  572. package/dist/get-N4BPOQCB.js.map +1 -0
  573. package/dist/get-RPZHLQ56.js +92 -0
  574. package/dist/get-RPZHLQ56.js.map +1 -0
  575. package/dist/gif-6PRTB2VR.js +94 -0
  576. package/dist/gif-6PRTB2VR.js.map +1 -0
  577. package/dist/google-4XAYE4OI.js +3190 -0
  578. package/dist/google-4XAYE4OI.js.map +1 -0
  579. package/dist/google-52JRH7X3.js +136 -0
  580. package/dist/google-52JRH7X3.js.map +1 -0
  581. package/dist/google-ads-PWX7OF5Z.js +195 -0
  582. package/dist/google-ads-PWX7OF5Z.js.map +1 -0
  583. package/dist/group-AAZ5QKC3.js +43 -0
  584. package/dist/group-AAZ5QKC3.js.map +1 -0
  585. package/dist/group-GSYCZORC.js +43 -0
  586. package/dist/group-GSYCZORC.js.map +1 -0
  587. package/dist/gsc-TS5T7ML2.js +30 -0
  588. package/dist/gsc-TS5T7ML2.js.map +1 -0
  589. package/dist/history-EW6LFFCX.js +67 -0
  590. package/dist/history-EW6LFFCX.js.map +1 -0
  591. package/dist/history-XI5ABCFO.js +133 -0
  592. package/dist/history-XI5ABCFO.js.map +1 -0
  593. package/dist/hubspot-AVUOILRE.js +779 -0
  594. package/dist/hubspot-AVUOILRE.js.map +1 -0
  595. package/dist/icon-K75KI6BV.js +137 -0
  596. package/dist/icon-K75KI6BV.js.map +1 -0
  597. package/dist/ideas-UCPV3KTM.js +35 -0
  598. package/dist/ideas-UCPV3KTM.js.map +1 -0
  599. package/dist/images-CD53I2W5.js +90 -0
  600. package/dist/images-CD53I2W5.js.map +1 -0
  601. package/dist/improve-L3BW4EQG.js +86 -0
  602. package/dist/improve-L3BW4EQG.js.map +1 -0
  603. package/dist/ingest-KRJOYTCQ.js +107 -0
  604. package/dist/ingest-KRJOYTCQ.js.map +1 -0
  605. package/dist/ingest-WE3SPPND.js +23 -0
  606. package/dist/ingest-WE3SPPND.js.map +1 -0
  607. package/dist/insights-PELVD4RY.js +122 -0
  608. package/dist/insights-PELVD4RY.js.map +1 -0
  609. package/dist/insights-XCA4BUJW.js +423 -0
  610. package/dist/insights-XCA4BUJW.js.map +1 -0
  611. package/dist/inspect-QKETG5UJ.js +189 -0
  612. package/dist/inspect-QKETG5UJ.js.map +1 -0
  613. package/dist/inspiration-Y2J2PUPC.js +53 -0
  614. package/dist/inspiration-Y2J2PUPC.js.map +1 -0
  615. package/dist/intent-YJOJGNVJ.js +95 -0
  616. package/dist/intent-YJOJGNVJ.js.map +1 -0
  617. package/dist/job-E2U4FS5P.js +202 -0
  618. package/dist/job-E2U4FS5P.js.map +1 -0
  619. package/dist/job-create-DFYCHVQ7.js +109 -0
  620. package/dist/job-create-DFYCHVQ7.js.map +1 -0
  621. package/dist/job-status-FFPMTSHB.js +74 -0
  622. package/dist/job-status-FFPMTSHB.js.map +1 -0
  623. package/dist/keep-GYZS2UTL.js +78 -0
  624. package/dist/keep-GYZS2UTL.js.map +1 -0
  625. package/dist/keyword-gap-QU7O7UKC.js +130 -0
  626. package/dist/keyword-gap-QU7O7UKC.js.map +1 -0
  627. package/dist/keyword-metrics-HLCM3QU7.js +197 -0
  628. package/dist/keyword-metrics-HLCM3QU7.js.map +1 -0
  629. package/dist/keywords-for-site-BDKPQKWB.js +128 -0
  630. package/dist/keywords-for-site-BDKPQKWB.js.map +1 -0
  631. package/dist/landing-4K6XYNFM.js +28 -0
  632. package/dist/landing-4K6XYNFM.js.map +1 -0
  633. package/dist/landings-F7LOAEJE.js +151 -0
  634. package/dist/landings-F7LOAEJE.js.map +1 -0
  635. package/dist/languages-P3ZM6R2A.js +40 -0
  636. package/dist/languages-P3ZM6R2A.js.map +1 -0
  637. package/dist/languages-XEJKTIFP.js +55 -0
  638. package/dist/languages-XEJKTIFP.js.map +1 -0
  639. package/dist/launches-TCFAYUA5.js +19 -0
  640. package/dist/launches-TCFAYUA5.js.map +1 -0
  641. package/dist/layerize-ZSKFIPZA.js +190 -0
  642. package/dist/layerize-ZSKFIPZA.js.map +1 -0
  643. package/dist/leads-GDF4S2AM.js +90 -0
  644. package/dist/leads-GDF4S2AM.js.map +1 -0
  645. package/dist/leads-TPB5OFSQ.js +293 -0
  646. package/dist/leads-TPB5OFSQ.js.map +1 -0
  647. package/dist/learn-NMFEA5H5.js +203 -0
  648. package/dist/learn-NMFEA5H5.js.map +1 -0
  649. package/dist/library-IP2UKNRU.js +109 -0
  650. package/dist/library-IP2UKNRU.js.map +1 -0
  651. package/dist/lighthouse-57XBJRCO.js +75 -0
  652. package/dist/lighthouse-57XBJRCO.js.map +1 -0
  653. package/dist/line-item-writes-O6SSS5NQ.js +208 -0
  654. package/dist/line-item-writes-O6SSS5NQ.js.map +1 -0
  655. package/dist/line-items-ZZAKH3YZ.js +103 -0
  656. package/dist/line-items-ZZAKH3YZ.js.map +1 -0
  657. package/dist/link-CRY57R3E.js +64 -0
  658. package/dist/link-CRY57R3E.js.map +1 -0
  659. package/dist/linkedin-WC7LGYPP.js +1008 -0
  660. package/dist/linkedin-WC7LGYPP.js.map +1 -0
  661. package/dist/list-6IKPWQGG.js +57 -0
  662. package/dist/list-6IKPWQGG.js.map +1 -0
  663. package/dist/list-CAUH3BMG.js +65 -0
  664. package/dist/list-CAUH3BMG.js.map +1 -0
  665. package/dist/list-CWAKX5TH.js +63 -0
  666. package/dist/list-CWAKX5TH.js.map +1 -0
  667. package/dist/list-FJ5FSVL6.js +151 -0
  668. package/dist/list-FJ5FSVL6.js.map +1 -0
  669. package/dist/list-GTOSN7DP.js +50 -0
  670. package/dist/list-GTOSN7DP.js.map +1 -0
  671. package/dist/list-HLJP4NVE.js +51 -0
  672. package/dist/list-HLJP4NVE.js.map +1 -0
  673. package/dist/list-LCUPF7EF.js +76 -0
  674. package/dist/list-LCUPF7EF.js.map +1 -0
  675. package/dist/list-NH4ZRZTL.js +303 -0
  676. package/dist/list-NH4ZRZTL.js.map +1 -0
  677. package/dist/locations-2BYWKIYA.js +67 -0
  678. package/dist/locations-2BYWKIYA.js.map +1 -0
  679. package/dist/locations-LVVDOSXO.js +40 -0
  680. package/dist/locations-LVVDOSXO.js.map +1 -0
  681. package/dist/log-6JOWOY5G.js +92 -0
  682. package/dist/log-6JOWOY5G.js.map +1 -0
  683. package/dist/logo-AJK2TDQU.js +18 -0
  684. package/dist/logo-AJK2TDQU.js.map +1 -0
  685. package/dist/lookup-H5GEM77H.js +22 -0
  686. package/dist/lookup-H5GEM77H.js.map +1 -0
  687. package/dist/make-Q2AMLCWE.js +640 -0
  688. package/dist/make-Q2AMLCWE.js.map +1 -0
  689. package/dist/map-4KOYFHAN.js +404 -0
  690. package/dist/map-4KOYFHAN.js.map +1 -0
  691. package/dist/mcp-LSS2DHYL.js +463 -0
  692. package/dist/mcp-LSS2DHYL.js.map +1 -0
  693. package/dist/media-JBCN6V4X.js +15 -0
  694. package/dist/media-JBCN6V4X.js.map +1 -0
  695. package/dist/media-RAGEJTZX.js +89 -0
  696. package/dist/media-RAGEJTZX.js.map +1 -0
  697. package/dist/media-sources-GSPAV7HT.js +32 -0
  698. package/dist/media-sources-GSPAV7HT.js.map +1 -0
  699. package/dist/members-GUUVEK2Y.js +44 -0
  700. package/dist/members-GUUVEK2Y.js.map +1 -0
  701. package/dist/meta-Z37ZR3PJ.js +69 -0
  702. package/dist/meta-Z37ZR3PJ.js.map +1 -0
  703. package/dist/metrics-KW6SDULI.js +152 -0
  704. package/dist/metrics-KW6SDULI.js.map +1 -0
  705. package/dist/models-5J4WFUD3.js +155 -0
  706. package/dist/models-5J4WFUD3.js.map +1 -0
  707. package/dist/normalize-DSFVTRXN.js +806 -0
  708. package/dist/normalize-DSFVTRXN.js.map +1 -0
  709. package/dist/normalize-EUDI5HEM.js +141 -0
  710. package/dist/normalize-EUDI5HEM.js.map +1 -0
  711. package/dist/options-P4PPJQH4.js +121 -0
  712. package/dist/options-P4PPJQH4.js.map +1 -0
  713. package/dist/output-DTCLVPUF.js +24 -0
  714. package/dist/output-DTCLVPUF.js.map +1 -0
  715. package/dist/page-N2ZO3O7F.js +105 -0
  716. package/dist/page-N2ZO3O7F.js.map +1 -0
  717. package/dist/pages-FQ4CBAJ2.js +66 -0
  718. package/dist/pages-FQ4CBAJ2.js.map +1 -0
  719. package/dist/performance-A66LYIZX.js +24 -0
  720. package/dist/performance-A66LYIZX.js.map +1 -0
  721. package/dist/pinterest-NV5XTNJE.js +96 -0
  722. package/dist/pinterest-NV5XTNJE.js.map +1 -0
  723. package/dist/pixels-CTJ43FZ4.js +108 -0
  724. package/dist/pixels-CTJ43FZ4.js.map +1 -0
  725. package/dist/pixels-HKINGZCH.js +60 -0
  726. package/dist/pixels-HKINGZCH.js.map +1 -0
  727. package/dist/plan-ZYTWLGWK.js +207 -0
  728. package/dist/plan-ZYTWLGWK.js.map +1 -0
  729. package/dist/preview-5ROBOQG7.js +169 -0
  730. package/dist/preview-5ROBOQG7.js.map +1 -0
  731. package/dist/profile-Q3PHR6FU.js +159 -0
  732. package/dist/profile-Q3PHR6FU.js.map +1 -0
  733. package/dist/promoted-tweet-writes-AEOUK2LK.js +180 -0
  734. package/dist/promoted-tweet-writes-AEOUK2LK.js.map +1 -0
  735. package/dist/promoted-tweets-L2CEC2BJ.js +119 -0
  736. package/dist/promoted-tweets-L2CEC2BJ.js.map +1 -0
  737. package/dist/properties-WLL6M2P6.js +101 -0
  738. package/dist/properties-WLL6M2P6.js.map +1 -0
  739. package/dist/publish-KHNR5ARF.js +322 -0
  740. package/dist/publish-KHNR5ARF.js.map +1 -0
  741. package/dist/query-A34J7BGX.js +61 -0
  742. package/dist/query-A34J7BGX.js.map +1 -0
  743. package/dist/query-IYZN5KHO.js +236 -0
  744. package/dist/query-IYZN5KHO.js.map +1 -0
  745. package/dist/query-UN2P6DBA.js +247 -0
  746. package/dist/query-UN2P6DBA.js.map +1 -0
  747. package/dist/questionnaire-Z2ZIKNBV.js +93 -0
  748. package/dist/questionnaire-Z2ZIKNBV.js.map +1 -0
  749. package/dist/read-GM7PQYJA.js +141 -0
  750. package/dist/read-GM7PQYJA.js.map +1 -0
  751. package/dist/reddit-5NPFULGD.js +26 -0
  752. package/dist/reddit-5NPFULGD.js.map +1 -0
  753. package/dist/refresh-FGXW4Y4X.js +94 -0
  754. package/dist/refresh-FGXW4Y4X.js.map +1 -0
  755. package/dist/release-OKZMC73N.js +60 -0
  756. package/dist/release-OKZMC73N.js.map +1 -0
  757. package/dist/relevant-pages-J76ZKNKF.js +99 -0
  758. package/dist/relevant-pages-J76ZKNKF.js.map +1 -0
  759. package/dist/remove-CA2J6ACH.js +50 -0
  760. package/dist/remove-CA2J6ACH.js.map +1 -0
  761. package/dist/remove-GOYW2G4R.js +48 -0
  762. package/dist/remove-GOYW2G4R.js.map +1 -0
  763. package/dist/reopen-XPKSOE6O.js +63 -0
  764. package/dist/reopen-XPKSOE6O.js.map +1 -0
  765. package/dist/rerun-2ERJV4WC.js +86 -0
  766. package/dist/rerun-2ERJV4WC.js.map +1 -0
  767. package/dist/research-FZ63UZTE.js +62 -0
  768. package/dist/research-FZ63UZTE.js.map +1 -0
  769. package/dist/research-YGQQ6CNG.js +262 -0
  770. package/dist/research-YGQQ6CNG.js.map +1 -0
  771. package/dist/reset-BGPZ4HMA.js +54 -0
  772. package/dist/reset-BGPZ4HMA.js.map +1 -0
  773. package/dist/reset-HTD6LCIT.js +54 -0
  774. package/dist/reset-HTD6LCIT.js.map +1 -0
  775. package/dist/resolve-NRDZ6N2B.js +121 -0
  776. package/dist/resolve-NRDZ6N2B.js.map +1 -0
  777. package/dist/retry-PF4BGKJV.js +60 -0
  778. package/dist/retry-PF4BGKJV.js.map +1 -0
  779. package/dist/retry-XL26JDAV.js +62 -0
  780. package/dist/retry-XL26JDAV.js.map +1 -0
  781. package/dist/retry-failed-BEFWRV4Z.js +45 -0
  782. package/dist/retry-failed-BEFWRV4Z.js.map +1 -0
  783. package/dist/run-EMJLI7LR.js +65 -0
  784. package/dist/run-EMJLI7LR.js.map +1 -0
  785. package/dist/run-L5K44UEA.js +61 -0
  786. package/dist/run-L5K44UEA.js.map +1 -0
  787. package/dist/scaffold-ad-AY2OL7RI.js +1550 -0
  788. package/dist/scaffold-ad-AY2OL7RI.js.map +1 -0
  789. package/dist/scaffold-static-ad-FXYE46MT.js +973 -0
  790. package/dist/scaffold-static-ad-FXYE46MT.js.map +1 -0
  791. package/dist/scaffold-video-533BT6RX.js +874 -0
  792. package/dist/scaffold-video-533BT6RX.js.map +1 -0
  793. package/dist/schedule-KQ7UIR3N.js +66 -0
  794. package/dist/schedule-KQ7UIR3N.js.map +1 -0
  795. package/dist/schedule-PKPNSISL.js +61 -0
  796. package/dist/schedule-PKPNSISL.js.map +1 -0
  797. package/dist/scheduled-agents-LP5LITA3.js +49 -0
  798. package/dist/scheduled-agents-LP5LITA3.js.map +1 -0
  799. package/dist/schema-B6J6VPTO.js +132 -0
  800. package/dist/schema-B6J6VPTO.js.map +1 -0
  801. package/dist/schema-QXTDLZVC.js +63 -0
  802. package/dist/schema-QXTDLZVC.js.map +1 -0
  803. package/dist/scrape-7YKJWFZE.js +2241 -0
  804. package/dist/scrape-7YKJWFZE.js.map +1 -0
  805. package/dist/screenshot-ZHBSG3SI.js +102 -0
  806. package/dist/screenshot-ZHBSG3SI.js.map +1 -0
  807. package/dist/search-332KFYZ6.js +224 -0
  808. package/dist/search-332KFYZ6.js.map +1 -0
  809. package/dist/search-4PBMXXUY.js +91 -0
  810. package/dist/search-4PBMXXUY.js.map +1 -0
  811. package/dist/search-6WNUKCMP.js +174 -0
  812. package/dist/search-6WNUKCMP.js.map +1 -0
  813. package/dist/search-AVNUU6TJ.js +26 -0
  814. package/dist/search-AVNUU6TJ.js.map +1 -0
  815. package/dist/search-F5INRFFK.js +92 -0
  816. package/dist/search-F5INRFFK.js.map +1 -0
  817. package/dist/search-copy-DZVBYG2B.js +168 -0
  818. package/dist/search-copy-DZVBYG2B.js.map +1 -0
  819. package/dist/seeds-5JTQN5WI.js +101 -0
  820. package/dist/seeds-5JTQN5WI.js.map +1 -0
  821. package/dist/select-RSGLDQ5Z.js +96 -0
  822. package/dist/select-RSGLDQ5Z.js.map +1 -0
  823. package/dist/sends-3L6QBS46.js +309 -0
  824. package/dist/sends-3L6QBS46.js.map +1 -0
  825. package/dist/sequences-YKFV7BDH.js +146 -0
  826. package/dist/sequences-YKFV7BDH.js.map +1 -0
  827. package/dist/set-prompt-7WWJI6XW.js +188 -0
  828. package/dist/set-prompt-7WWJI6XW.js.map +1 -0
  829. package/dist/setup-links-6H5ONDCQ.js +141 -0
  830. package/dist/setup-links-6H5ONDCQ.js.map +1 -0
  831. package/dist/{shared-6762QE6R.js → shared-QAMP7FZV.js} +8 -6
  832. package/dist/shared-QAMP7FZV.js.map +1 -0
  833. package/dist/shopify-2OY3J3OY.js +3692 -0
  834. package/dist/shopify-2OY3J3OY.js.map +1 -0
  835. package/dist/site-TBPERLY3.js +177 -0
  836. package/dist/site-TBPERLY3.js.map +1 -0
  837. package/dist/sitemaps-XPGLW24S.js +87 -0
  838. package/dist/sitemaps-XPGLW24S.js.map +1 -0
  839. package/dist/sites-WMBY2HJV.js +101 -0
  840. package/dist/sites-WMBY2HJV.js.map +1 -0
  841. package/dist/skills-3HEILQCU.js +47 -0
  842. package/dist/skills-3HEILQCU.js.map +1 -0
  843. package/dist/sources-JFQKTK2L.js +421 -0
  844. package/dist/sources-JFQKTK2L.js.map +1 -0
  845. package/dist/sources-Q3I6DDV7.js +30 -0
  846. package/dist/sources-Q3I6DDV7.js.map +1 -0
  847. package/dist/stale-CAXBLZKJ.js +66 -0
  848. package/dist/stale-CAXBLZKJ.js.map +1 -0
  849. package/dist/stats-GNILHSKK.js +34 -0
  850. package/dist/stats-GNILHSKK.js.map +1 -0
  851. package/dist/status-LIZWJYS4.js +62 -0
  852. package/dist/status-LIZWJYS4.js.map +1 -0
  853. package/dist/sticker-KCV3VZHY.js +94 -0
  854. package/dist/sticker-KCV3VZHY.js.map +1 -0
  855. package/dist/stock-VTORKR4C.js +179 -0
  856. package/dist/stock-VTORKR4C.js.map +1 -0
  857. package/dist/studio-QCRA6BY5.js +49 -0
  858. package/dist/studio-QCRA6BY5.js.map +1 -0
  859. package/dist/sync-455DB46Y.js +54 -0
  860. package/dist/sync-455DB46Y.js.map +1 -0
  861. package/dist/sync-A4KKQ3B6.js +265 -0
  862. package/dist/sync-A4KKQ3B6.js.map +1 -0
  863. package/dist/sync-ULKWDFXM.js +54 -0
  864. package/dist/sync-ULKWDFXM.js.map +1 -0
  865. package/dist/sync-definition-P6QTHJJ6.js +55 -0
  866. package/dist/sync-definition-P6QTHJJ6.js.map +1 -0
  867. package/dist/tag-manager-E7QTXBWQ.js +43 -0
  868. package/dist/tag-manager-E7QTXBWQ.js.map +1 -0
  869. package/dist/tags-4Q4I5GQJ.js +20 -0
  870. package/dist/tags-4Q4I5GQJ.js.map +1 -0
  871. package/dist/tags-AMEVAQZ4.js +26 -0
  872. package/dist/tags-AMEVAQZ4.js.map +1 -0
  873. package/dist/tags-DPLOLH3E.js +20 -0
  874. package/dist/tags-DPLOLH3E.js.map +1 -0
  875. package/dist/tags-LDHXONR3.js +224 -0
  876. package/dist/tags-LDHXONR3.js.map +1 -0
  877. package/dist/tags-UW3WJTAQ.js +20 -0
  878. package/dist/tags-UW3WJTAQ.js.map +1 -0
  879. package/dist/targeting-constants-D64YO3E7.js +118 -0
  880. package/dist/targeting-constants-D64YO3E7.js.map +1 -0
  881. package/dist/targeting-criteria-BP6VJA7X.js +113 -0
  882. package/dist/targeting-criteria-BP6VJA7X.js.map +1 -0
  883. package/dist/targets-CQWO2UXD.js +102 -0
  884. package/dist/targets-CQWO2UXD.js.map +1 -0
  885. package/dist/templates-WZSTNRNZ.js +178 -0
  886. package/dist/templates-WZSTNRNZ.js.map +1 -0
  887. package/dist/testimonials-ETHSNWUH.js +32 -0
  888. package/dist/testimonials-ETHSNWUH.js.map +1 -0
  889. package/dist/themes-YU663LQH.js +94 -0
  890. package/dist/themes-YU663LQH.js.map +1 -0
  891. package/dist/top-companies-KTXHS472.js +108 -0
  892. package/dist/top-companies-KTXHS472.js.map +1 -0
  893. package/dist/translate-A7LYHUW3.js +600 -0
  894. package/dist/translate-A7LYHUW3.js.map +1 -0
  895. package/dist/triggers-4EDFLNGH.js +141 -0
  896. package/dist/triggers-4EDFLNGH.js.map +1 -0
  897. package/dist/tweets-ZUKQAAUQ.js +123 -0
  898. package/dist/tweets-ZUKQAAUQ.js.map +1 -0
  899. package/dist/unfollow-A4JVCJBF.js +46 -0
  900. package/dist/unfollow-A4JVCJBF.js.map +1 -0
  901. package/dist/unlink-KY2OEKMD.js +67 -0
  902. package/dist/unlink-KY2OEKMD.js.map +1 -0
  903. package/dist/unstage-FHUG67RI.js +84 -0
  904. package/dist/unstage-FHUG67RI.js.map +1 -0
  905. package/dist/unstage-ZRLLCSQF.js +95 -0
  906. package/dist/unstage-ZRLLCSQF.js.map +1 -0
  907. package/dist/update-27LGM65V.js +63 -0
  908. package/dist/update-27LGM65V.js.map +1 -0
  909. package/dist/update-AIY46I2Q.js +155 -0
  910. package/dist/update-AIY46I2Q.js.map +1 -0
  911. package/dist/update-QYD2XZFM.js +142 -0
  912. package/dist/update-QYD2XZFM.js.map +1 -0
  913. package/dist/update-W2OSRNFO.js +98 -0
  914. package/dist/update-W2OSRNFO.js.map +1 -0
  915. package/dist/upload-JGBTSKGH.js +126 -0
  916. package/dist/upload-JGBTSKGH.js.map +1 -0
  917. package/dist/upload-XEHWYMJG.js +150 -0
  918. package/dist/upload-XEHWYMJG.js.map +1 -0
  919. package/dist/upscale-I5P2OHTN.js +109 -0
  920. package/dist/upscale-I5P2OHTN.js.map +1 -0
  921. package/dist/url-options-QHGA42RP.js +130 -0
  922. package/dist/url-options-QHGA42RP.js.map +1 -0
  923. package/dist/url-params-NWSUHWRE.js +98 -0
  924. package/dist/url-params-NWSUHWRE.js.map +1 -0
  925. package/dist/use-U4HG2NF3.js +95 -0
  926. package/dist/use-U4HG2NF3.js.map +1 -0
  927. package/dist/validate-VKL3XKQ2.js +91 -0
  928. package/dist/validate-VKL3XKQ2.js.map +1 -0
  929. package/dist/variant-FOVE6URJ.js +338 -0
  930. package/dist/variant-FOVE6URJ.js.map +1 -0
  931. package/dist/videos-DP3VCSYG.js +39 -0
  932. package/dist/videos-DP3VCSYG.js.map +1 -0
  933. package/dist/view-HRI3FHCH.js +121 -0
  934. package/dist/view-HRI3FHCH.js.map +1 -0
  935. package/dist/viewer-check-JYUE24M6.js +68 -0
  936. package/dist/viewer-check-JYUE24M6.js.map +1 -0
  937. package/dist/web-AFUIWPFU.js +140 -0
  938. package/dist/web-AFUIWPFU.js.map +1 -0
  939. package/dist/winners-SMMDN6LW.js +113 -0
  940. package/dist/winners-SMMDN6LW.js.map +1 -0
  941. package/dist/winning-ads-PCIJUYVA.js +84 -0
  942. package/dist/winning-ads-PCIJUYVA.js.map +1 -0
  943. package/dist/write-commands-7Z34WG2J.js +206 -0
  944. package/dist/write-commands-7Z34WG2J.js.map +1 -0
  945. package/dist/write-commands-BLT2SEC4.js +713 -0
  946. package/dist/write-commands-BLT2SEC4.js.map +1 -0
  947. package/dist/write-commands-N4FSGRVQ.js +743 -0
  948. package/dist/write-commands-N4FSGRVQ.js.map +1 -0
  949. package/dist/write-commands-Q4MQ3BGM.js +1015 -0
  950. package/dist/write-commands-Q4MQ3BGM.js.map +1 -0
  951. package/dist/x-AUOZJNWE.js +47 -0
  952. package/dist/x-AUOZJNWE.js.map +1 -0
  953. package/package.json +9 -2
  954. package/dist/chunk-FGHMWBUD.js +0 -9989
  955. package/dist/chunk-FGHMWBUD.js.map +0 -1
  956. package/dist/chunk-HJEMOSPH.js +0 -1292
  957. package/dist/chunk-HJEMOSPH.js.map +0 -1
  958. package/dist/chunk-MF7YA62W.js.map +0 -1
  959. package/dist/chunk-VZEDAFAR.js.map +0 -1
  960. package/dist/chunk-XHC4LMK4.js.map +0 -1
  961. package/dist/client-GR6YL3YX.js +0 -17
  962. package/dist/output-NMQXZF3Z.js +0 -18
  963. /package/dist/{chunk-WLDM2TRF.js.map → chunk-TPXI2GCW.js.map} +0 -0
  964. /package/dist/{client-GR6YL3YX.js.map → chunk-YQSBHWOI.js.map} +0 -0
  965. /package/dist/{env-4P5HOGNA.js.map → client-26SAJ46D.js.map} +0 -0
  966. /package/dist/{output-NMQXZF3Z.js.map → connect-RXPMAJQI.js.map} +0 -0
  967. /package/dist/{shared-6762QE6R.js.map → customers-P6LLLJHK.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engine/landing/lib/brand-tokens.ts","../src/engine/brand/brand-doc.ts","../src/engine/landing/lib/color.ts"],"sourcesContent":["/**\n * Landing anti-slop detector — brand allowlist.\n *\n * The client's committed brand is the allowlist: a value that matches a brand\n * token is a decision, not a tell, so the detector downgrades it to advisory\n * (mirrors impeccable's DESIGN.md drift model). The canonical source is\n * `src/brand/tokens.json` (validated with the shared `@baker/api` schema); a\n * workspace that predates it falls back to the legacy scan of the global.css\n * `@theme` block plus the faces and colours BRAND.md says the brand uses, read\n * in any language by the brand reader (`brand/brand-doc.ts`). A value BRAND.md\n * bans is never allowlisted.\n *\n * Empty/TODO brand (a fresh scaffold) → no allowlist, full strictness.\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { brandTokensSchema, type BrandTokens as CanonicalBrandTokens } from \"@baker/api\";\nimport { type BrandDocReading, type ReadBrandDocs, readWorkspaceBrandDoc } from \"../../brand/brand-doc.ts\";\nimport type { ReviewUsage } from \"../../nodes/local/lib/render-review.ts\";\nimport { getHue, hasChroma, isAiPurpleHue, isCreamColor, parseColor, type Rgb } from \"./color.ts\";\n\nexport type BrandTokens = {\n /** Lowercased committed font-family names (e.g. \"inter\", \"geist\"). */\n fonts: Set<string>;\n /** Parsed committed colors. */\n colors: Rgb[];\n /** True once any real token was found — distinguishes \"branded\" from \"blank\". */\n hasTokens: boolean;\n};\n\nconst EMPTY: BrandTokens = { fonts: new Set(), colors: [], hasTokens: false };\n\n/**\n * A token value that is a weight, a length, or a style keyword — never a family.\n *\n * Deliberately narrow, and the same predicate as `isNotAFamily` in the\n * scaffold's `__tooling__/checks/sdk/theme-css.mjs`. \"Anything starting with a\n * digit\" also swallows the real families that are named with digits — SAP's\n * \"72\", the \"3270\" monospace face — and because the scaffold keeps those,\n * dropping them here made `baker brand fonts check` clear a brand the client's\n * verify then rejected. `__tests__/theme-css-contract.test.ts` pins the two.\n */\nexport function isNotAFamily(value: string): boolean {\n return (\n /^[1-9]00$/.test(value) ||\n /^\\d+(?:\\.\\d+)?(?:px|rem|em|%|pt|vw|vh|ch|ex)$/i.test(value) ||\n /^(?:normal|bold|bolder|lighter|italic|oblique|none|auto|inherit|initial|unset)$/i.test(value)\n );\n}\n\n/** Pure parse of the two legacy brand sources: the theme, and what BRAND.md says it uses. */\nexport function parseBrandTokens(globalCss: string, brandDoc?: BrandDocReading | null): BrandTokens {\n const fonts = new Set<string>();\n const colors: Rgb[] = [];\n parseGlobalCss(globalCss, fonts, colors);\n for (const font of brandDoc?.fonts ?? []) if (font.use) fonts.add(font.family.toLowerCase());\n for (const color of brandDoc?.colors ?? []) {\n const parsed = color.use ? parseColor(color.hex) : null;\n if (parsed) colors.push(parsed);\n }\n return { fonts, colors, hasTokens: fonts.size > 0 || colors.length > 0 };\n}\n\n/** global.css `@theme` tokens: `--font-*` families and `--color-*` values.\n * Comments are stripped first — a commented-out legacy token is not a\n * commitment, and one stale purple would defang the color rules page-wide.\n *\n * The `--font-` match is anchored with a lookbehind and its value is checked:\n * `--text-h1--font-weight: 700` is a Tailwind v4 sub-property, and reading its\n * `--font-weight: 700` substring as a family called \"700\" put a 3-character\n * numeric string into the committed set — which `brandCommitsFont` then\n * substring-matched against every snippet containing \"700\", silently\n * whitelisting off-brand fonts. Mirrors\n * `apps/scaffold-template/__tooling__/checks/sdk/theme-css.mjs`. */\nfunction parseGlobalCss(rawCss: string, fonts: Set<string>, colors: Rgb[]): void {\n const globalCss = rawCss.replace(/\\/\\*[\\s\\S]*?\\*\\//g, (block) => block.replace(/[^\\n]/g, \" \"));\n for (const m of globalCss.matchAll(/(?<![\\w-])--font-([\\w-]*)\\s*:\\s*([^;]+);/gi)) {\n const slug = m[1] ?? \"\";\n if (slug.includes(\"--\") || /^weight(?:$|[-\\s])/i.test(slug)) continue;\n const first = (m[2] ?? \"\")\n .split(\",\")[0]\n ?.trim()\n .replace(/^['\"]|['\"]$/g, \"\")\n .toLowerCase();\n if (!first || isNotAFamily(first)) continue;\n fonts.add(first);\n }\n for (const m of globalCss.matchAll(\n /--color-[\\w-]*\\s*:\\s*(#[0-9a-f]{3,8}\\b|rgba?\\([^)]+\\)|oklch\\([^)]+\\)|hsla?\\([^)]+\\))/gi,\n )) {\n const c = parseColor(m[1] ?? \"\");\n if (c) colors.push(c);\n }\n}\n\n/** Canonical tokens.json → allowlist shape — exported for tests. */\nexport function brandTokensFromCanonical(tokens: CanonicalBrandTokens): BrandTokens {\n const fonts = new Set<string>(tokens.fonts.map((f) => f.family.toLowerCase()));\n const colors: Rgb[] = [];\n for (const color of tokens.colors) {\n const parsed = parseColor(color.value);\n if (parsed) colors.push(parsed);\n }\n return { fonts, colors, hasTokens: fonts.size > 0 || colors.length > 0 };\n}\n\n/**\n * Load brand tokens from a project root; degrades to empty when absent.\n * `src/brand/tokens.json` (canonical) wins; an absent or invalid file falls\n * back to the legacy global.css/BRAND.md scan — invalid is the drift\n * validator's finding to report, not a reason to run blind here.\n */\nexport async function loadBrandTokens(\n projectRoot: string,\n opts: { readBrandDoc?: ReadBrandDocs; onSpend?: (usage: ReviewUsage) => void } = {},\n): Promise<BrandTokens> {\n const tokensRaw = await safeRead(path.join(projectRoot, \"src\", \"brand\", \"tokens.json\"));\n if (tokensRaw) {\n try {\n const canonical = brandTokensSchema.safeParse(JSON.parse(tokensRaw));\n if (canonical.success) return brandTokensFromCanonical(canonical.data);\n } catch {\n // fall through to the legacy scan\n }\n }\n const globalCss = await safeRead(path.join(projectRoot, \"src\", \"styles\", \"global.css\"));\n const brandDoc = await readWorkspaceBrandDoc(projectRoot, {\n ...(opts.readBrandDoc ? { read: opts.readBrandDoc } : {}),\n ...(opts.onSpend ? { onSpend: opts.onSpend } : {}),\n });\n if (!globalCss && !brandDoc) return EMPTY;\n return parseBrandTokens(globalCss, brandDoc);\n}\n\nasync function safeRead(file: string): Promise<string> {\n try {\n return await readFile(file, \"utf8\");\n } catch {\n return \"\";\n }\n}\n\n/** Does the brand commit this font name (as it appears in a finding snippet)? */\nexport function brandCommitsFont(brand: BrandTokens, snippet: string): boolean {\n if (brand.fonts.size === 0) return false;\n const lower = snippet.toLowerCase();\n for (const f of brand.fonts) if (f.length >= 3 && lower.includes(f)) return true;\n return false;\n}\n\n/** Does the brand commit a purple/indigo hue (so the AI-palette tell is a choice)? */\nexport function brandCommitsAiHue(brand: BrandTokens): boolean {\n return brand.colors.some((c) => hasChroma(c, 40) && isAiPurpleHue(getHue(c)));\n}\n\n/** Does the brand commit a cream ground (so the cream tell is a choice)? */\nexport function brandCommitsCream(brand: BrandTokens): boolean {\n return brand.colors.some((c) => isCreamColor(c));\n}\n","/**\n * What the brand's own documents state about it, read by a text model in whatever language they\n * are written: its name, the words its logo prints, the typefaces and colours it uses and the ones\n * it bans. BRAND.md is prose, and every reader that scraped it with English words got it wrong\n * the moment it was written otherwise: \"nunca uses Inter\" read as a face to use.\n *\n * `src/brand/tokens.json` stays the canonical machine source; this is what the documents add or\n * what a workspace that predates tokens.json has. The model only extracts, pinned to one provider\n * at temperature 0, and each reading is kept by the documents' content, so the same documents\n * read the same on every run and cost one call per edit. Measured on scripts/brand-doc-evals.\n */\nimport { createHash } from \"node:crypto\";\nimport { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport { holdUnbilledSpend } from \"../../commands/canvas/unbilled-spend.ts\";\nimport { askAboutText, type ReviewUsage } from \"../nodes/local/lib/render-review.ts\";\n\nconst BRAND_DOC_MODEL = \"google/gemini-2.5-flash-lite\";\nconst REQUEST = {\n provider: { order: [\"google-vertex\"], allow_fallbacks: false },\n temperature: 0,\n response_format: { type: \"json_object\" },\n};\nconst PROMPT_VERSION = 2;\nconst TIMEOUT_MS = 30_000;\n/** About 8k tokens of guidelines: a brand document is shorter, and a runaway one is cut. */\nconst BRAND_MD_CHARS = 32_000;\n/** A company profile states its name at the top. */\nconst COMPANY_MD_CHARS = 4_000;\n\nconst Font = z.object({\n family: z.string().trim().min(1).max(60),\n role: z.enum([\"heading\", \"body\", \"any\"]).catch(\"any\"),\n use: z.boolean(),\n});\nconst Color = z.object({\n hex: z\n .string()\n .trim()\n .regex(/^#?[0-9a-fA-F]{6}$/)\n .transform((h) => `#${h.replace(/^#/, \"\").toLowerCase()}`),\n use: z.boolean(),\n});\nconst Reading = z.object({\n name: z.string().trim().min(1).max(80).nullable().catch(null),\n wordmark: z.array(z.string().trim().min(1).max(40)).catch([]),\n logoNames: z.array(z.string().trim().min(1).max(40)).catch([]),\n fonts: z.array(z.unknown()).catch([]),\n colors: z.array(z.unknown()).catch([]),\n});\n\nexport type BrandDocReading = {\n name?: string;\n /** The words the brand's logo prints, as the documents quote them or a logo file names a product. */\n wordmark: string[];\n fonts: Array<z.infer<typeof Font>>;\n colors: Array<z.infer<typeof Color>>;\n};\n\nexport type BrandDocs = { brandMd?: string | null; companyMd?: string | null; logoFiles?: readonly string[] };\n\nfunction brandDocPrompt(docs: BrandDocs): string {\n return [\n \"You read a company's brand guidelines (BRAND.md), the start of its company profile (COMPANY.md) and the file names of its logos. They may be written in any language, or several. Extract only what they state; never invent a value.\",\n \"\",\n \"Return JSON only, in this shape:\",\n '{\"name\": string | null, \"wordmark\": string[], \"logoNames\": string[], \"fonts\": [{\"family\": string, \"role\": \"heading\" | \"body\" | \"any\", \"use\": boolean}], \"colors\": [{\"hex\": \"#rrggbb\", \"use\": boolean}]}',\n \"\",\n '- name: the brand\\'s name exactly as written (\"# Zernio Brand Guidelines\" names Zernio). null when neither document states one, as in an unfilled template (\"# Brand Guidelines\", \"# Company\", TODO).',\n '- wordmark: every word the documents say the logo prints, as they quote it (\"Wordmark: \\\\\"permut\\\\\"\" gives \"permut\"; \\'symbol plus \"Cubbo\" wordmark\\' gives \"Cubbo\"), even when it is also the name. [] when they quote none.',\n '- logoNames: a product or brand name a logo file name carries (\"logo-engage-blue.png\" gives \"Engage\"). Colours, variants, sizes and formats (dark, white, icon, isotype, png) are not names. [] when none.',\n '- fonts: every typeface the guidelines name, by its family name exactly, the banned ones included. role is heading, body, or any when they do not say. use is false when the guidelines ban it, forbid it or say to avoid it or never use it, in any wording or language; true when the brand uses it. Only a named typeface counts: a generic family (sans-serif, serif, monospace, system-ui) or the operating system\\'s own fonts (\"system stack\", \"system fonts\") is not one, so leave it out.',\n \"- colors: every hex colour the guidelines give. use is false when they ban it or say to avoid it, true when it is a brand colour.\",\n \"\",\n \"<brand_md>\",\n (docs.brandMd ?? \"\").slice(0, BRAND_MD_CHARS),\n \"</brand_md>\",\n \"<company_md>\",\n (docs.companyMd ?? \"\").slice(0, COMPANY_MD_CHARS),\n \"</company_md>\",\n \"<logo_files>\",\n (docs.logoFiles ?? []).join(\"\\n\"),\n \"</logo_files>\",\n ].join(\"\\n\");\n}\n\n/** The model's answer as a reading, every entry it got wrong dropped; null when it is not one. Pure. */\nfunction parseBrandDoc(answer: unknown): BrandDocReading | null {\n const parsed = Reading.safeParse(answer);\n if (!parsed.success) return null;\n const fonts = parsed.data.fonts.flatMap((f) => {\n const font = Font.safeParse(f);\n return font.success ? [font.data] : [];\n });\n const colors = parsed.data.colors.flatMap((c) => {\n const color = Color.safeParse(c);\n return color.success ? [color.data] : [];\n });\n return {\n ...(parsed.data.name ? { name: parsed.data.name } : {}),\n wordmark: [...new Set([...parsed.data.wordmark, ...parsed.data.logoNames])],\n fonts,\n colors,\n };\n}\n\n/** Reads the documents with the model, or null when it could not answer. */\nexport type ReadBrandDocs = (docs: BrandDocs) => Promise<BrandDocReading | null>;\n\n/**\n * The real reader: each reading kept in `cacheDir` by the documents, the model and the prompt.\n * Spend goes to `onSpend`, or, without one, waits in `cacheDir` for the workspace's next run\n * record to bill it.\n */\nexport function brandDocReader(cacheDir: string, onSpend?: (usage: ReviewUsage) => void): ReadBrandDocs {\n return async (docs) => {\n const prompt = brandDocPrompt(docs);\n const key = createHash(\"sha256\")\n .update(JSON.stringify([PROMPT_VERSION, BRAND_DOC_MODEL, prompt]))\n .digest(\"hex\");\n const file = path.join(cacheDir, \"brand-doc\", `${key}.json`);\n const cached = parseBrandDoc(await readFile(file, \"utf8\").then(JSON.parse, () => null));\n if (cached) return cached;\n const spent: ReviewUsage[] = [];\n const answer = await askAboutText(BRAND_DOC_MODEL, prompt, (u) => (onSpend ? onSpend(u) : spent.push(u)), {\n timeoutMs: TIMEOUT_MS,\n request: REQUEST,\n }).catch(() => null);\n await holdUnbilledSpend(cacheDir, spent).catch(() => undefined);\n const reading = parseBrandDoc(answer);\n if (reading) {\n await mkdir(path.dirname(file), { recursive: true }).catch(() => undefined);\n await writeFile(file, JSON.stringify(reading), \"utf8\").catch(() => undefined);\n }\n return reading;\n };\n}\n\n/** A file named as the brand's own logo; a partner's or a tool's icon (`python-icon.png`) is not. */\nexport const LOGO_FILE = /logo|lockup|wordmark|isotype|isologo/i;\n\n/** BRAND.md, COMPANY.md and the brand's own logo file names in a workspace. Never throws. */\nasync function workspaceBrandDocs(root: string): Promise<BrandDocs> {\n const read = (rel: string) => readFile(path.join(root, rel), \"utf8\").catch(() => null);\n const logoFiles = ((await readdir(path.join(root, \"src\", \"brand\", \"logos\")).catch(() => [])) as string[])\n .filter((f) => /\\.(png|jpe?g|webp|svg)$/i.test(f) && LOGO_FILE.test(f))\n .sort();\n return { brandMd: await read(\"src/brand/BRAND.md\"), companyMd: await read(\"COMPANY.md\"), logoFiles };\n}\n\n/**\n * What the workspace's brand documents state, read once per edit. Null when there is nothing to\n * read, or no model could read it: every caller then uses what code can read without one.\n */\nexport async function readWorkspaceBrandDoc(\n root: string,\n opts: { read?: ReadBrandDocs; onSpend?: (usage: ReviewUsage) => void } = {},\n): Promise<BrandDocReading | null> {\n const docs = await workspaceBrandDocs(root);\n if (!docs.brandMd?.trim() && !docs.companyMd?.trim()) return null;\n const read = opts.read ?? brandDocReader(path.join(root, \"canvas\", \".cache\"), opts.onSpend);\n return await read(docs).catch(() => null);\n}\n","/**\n * Landing anti-slop detector — color utilities.\n *\n * Ported (with sense) from impeccable's `cli/engine/shared/color.mjs` +\n * `isNeutralAuthoredColor` from `detect-text.mjs`. These parse colors as WRITTEN\n * in authored CSS (hex, named, rgb/hsl/oklch), not just the computed forms a\n * browser emits — because we scan `.astro` source, not a rendered DOM.\n */\n\nexport type Rgb = { r: number; g: number; b: number; a: number };\n\n/** CSS named colors whose channels are equal (achromatic). */\nconst NEUTRAL_COLOR_KEYWORDS = new Set<string>([\n \"transparent\",\n \"currentcolor\",\n \"black\",\n \"white\",\n \"gray\",\n \"grey\",\n \"silver\",\n \"dimgray\",\n \"dimgrey\",\n \"darkgray\",\n \"darkgrey\",\n \"lightgray\",\n \"lightgrey\",\n \"gainsboro\",\n \"whitesmoke\",\n]);\n\nfunction hexChannels(color: string): [number, number, number] | null {\n const long = color.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})(?:[0-9a-f]{2})?$/i);\n if (long)\n return [\n Number.parseInt(long[1] ?? \"0\", 16),\n Number.parseInt(long[2] ?? \"0\", 16),\n Number.parseInt(long[3] ?? \"0\", 16),\n ];\n const short = color.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])(?:[0-9a-f])?$/i);\n if (short) {\n const dup = (s: string | undefined) => Number.parseInt(`${s ?? \"0\"}${s ?? \"0\"}`, 16);\n return [dup(short[1]), dup(short[2]), dup(short[3])];\n }\n return null;\n}\n\n/** Parse any authored hex / rgb() / oklch() color to {r,g,b,a}. Null if unknown. */\nexport function parseColor(raw: string): Rgb | null {\n const c = String(raw || \"\")\n .trim()\n .toLowerCase();\n if (!c || c === \"transparent\") return null;\n const rgb = c.match(/rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)(?:[\\s,/]+([\\d.]+%?))?\\s*\\)/i);\n if (rgb) {\n const alpha = rgb[4];\n const a = alpha === undefined ? 1 : alpha.endsWith(\"%\") ? Number.parseFloat(alpha) / 100 : Number.parseFloat(alpha);\n return { r: Number(rgb[1]), g: Number(rgb[2]), b: Number(rgb[3]), a };\n }\n const oklch = parseOklch(c);\n if (oklch) return oklch;\n const hex = hexChannels(c);\n if (hex) return { r: hex[0], g: hex[1], b: hex[2], a: 1 };\n return null;\n}\n\n/** `oklch(L C H)` / `oklch(L% C H / a)` → Rgb, or null when not oklch. */\nfunction parseOklch(c: string): Rgb | null {\n const m = c.match(/oklch\\(\\s*([\\d.]+%?)\\s+([\\d.]+%?)\\s+([\\d.]+)(?:deg)?(?:\\s*\\/\\s*([\\d.]+%?))?\\s*\\)/i);\n if (!m) return null;\n const pct = (s: string, scale: number) =>\n s.endsWith(\"%\") ? (Number.parseFloat(s) / 100) * scale : Number.parseFloat(s);\n const alpha = m[4];\n const a = alpha === undefined ? 1 : pct(alpha, 1);\n return { ...oklchToRgb(pct(m[1] ?? \"0\", 1), pct(m[2] ?? \"0\", 0.4), Number.parseFloat(m[3] ?? \"0\")), a };\n}\n\n/** oklch(L C H) → sRGB via OKLab (Björn Ottosson's reference constants), so\n * Tailwind v4-idiomatic `@theme` colors participate in the brand allowlist. */\nfunction oklchToRgb(L: number, C: number, H: number): { r: number; g: number; b: number } {\n const hRad = (H * Math.PI) / 180;\n const a = C * Math.cos(hRad);\n const b = C * Math.sin(hRad);\n const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s = (L - 0.0894841775 * a - 1.291485548 * b) ** 3;\n const lin = [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n ].map((v) => {\n const g = v <= 0.0031308 ? 12.92 * v : 1.055 * Math.sign(v) * Math.abs(v) ** (1 / 2.4) - 0.055;\n return Math.round(Math.max(0, Math.min(1, g)) * 255);\n });\n return { r: lin[0] ?? 0, g: lin[1] ?? 0, b: lin[2] ?? 0 };\n}\n\n/**\n * Neutrality test for colors as written in source CSS. Handles hex and named\n * neutrals directly; for rgb()/hsl()/oklch() etc. uses the channel/component\n * spread. An unrecognized spelling stays chromatic so a real accent is never\n * silently skipped (impeccable's fail-toward-detection default).\n */\nexport function isNeutralAuthoredColor(rawColor: string): boolean {\n const c = String(rawColor || \"\")\n .trim()\n .toLowerCase();\n if (!c) return false;\n if (NEUTRAL_COLOR_KEYWORDS.has(c)) return true;\n if (/^rgba?\\(/i.test(c)) {\n const channels = c.match(/^rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)/i);\n if (channels) {\n const values = [1, 2, 3].map((i) => Number(channels[i]));\n return Math.max(...values) - Math.min(...values) < 30;\n }\n return false;\n }\n // oklch/lch chroma is the second component; hsl saturation is the second.\n const oklch = c.match(/oklch\\(\\s*[\\d.]+%?\\s+([\\d.-]+)/i);\n if (oklch) return Number.parseFloat(oklch[1] ?? \"0\") < 0.02;\n const lch = c.match(/lch\\(\\s*[\\d.]+%?\\s+([\\d.-]+)/i);\n if (lch) return Number.parseFloat(lch[1] ?? \"0\") < 3;\n const hsl = c.match(/hsla?\\(\\s*[\\d.-]+\\s*,?\\s*([\\d.]+)%/i);\n if (hsl) return Number.parseFloat(hsl[1] ?? \"0\") < 10;\n const channels = hexChannels(c);\n if (channels) return Math.max(...channels) - Math.min(...channels) < 30;\n return false;\n}\n\nexport function hasChroma(c: Rgb | null, threshold = 30): boolean {\n if (!c) return false;\n return Math.max(c.r, c.g, c.b) - Math.min(c.r, c.g, c.b) >= threshold;\n}\n\n/** Hue in degrees (0–360) for an rgb color. */\nexport function getHue(c: Rgb | null): number {\n if (!c) return 0;\n const r = c.r / 255;\n const g = c.g / 255;\n const b = c.b / 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n if (max === min) return 0;\n const d = max - min;\n let h: number;\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n else if (max === g) h = ((b - r) / d + 2) / 6;\n else h = ((r - g) / d + 4) / 6;\n return Math.round(h * 360);\n}\n\n/** Is this hue in the purple/violet/indigo band the AI-palette rule flags?\n * 225–310 covers everything the detection side bans: Tailwind indigo (~239°),\n * the indigo hero hexes (#667eea 229°, #6366f1 239°), violet (#8b5cf6 258°),\n * and purple (#7c3aed 262°+). Keep in lockstep with `AI_PURPLE_HEXES`. */\nexport function isAiPurpleHue(hue: number): boolean {\n return hue >= 225 && hue <= 310;\n}\n\n/** Is this a warm cream/parchment ground (light, r≥g≥b, small warmth)? */\nexport function isCreamColor(c: Rgb): boolean {\n if (Math.min(c.r, c.g, c.b) < 209) return false;\n if (!(c.r >= c.g && c.g >= c.b)) return false;\n const warmth = c.r - c.b;\n return warmth >= 6 && warmth <= 48;\n}\n"],"mappings":"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","names":["readFile","path","channels","path","readFile"]}
@@ -0,0 +1,179 @@
1
+ import {
2
+ CHECKOUT_RECORD_REFUSAL,
3
+ CONVERSION_COUNT_MODES,
4
+ findNameCollision,
5
+ isCheckoutRecordKey,
6
+ isLandingViewKey,
7
+ parseEventKey
8
+ } from "./chunk-FYWWTMXP.js";
9
+
10
+ // src/commands/analytics/conversionArgs.ts
11
+ var ConversionArgsError = class extends Error {
12
+ constructor(message, fix) {
13
+ super(message);
14
+ this.fix = fix;
15
+ }
16
+ };
17
+ function allValues(flag, argv) {
18
+ const values = [];
19
+ for (let i = 0; i < argv.length; i += 1) {
20
+ const arg = argv[i];
21
+ if (arg === flag) {
22
+ const next = argv[i + 1];
23
+ if (next !== void 0 && !next.startsWith("--")) values.push(next);
24
+ continue;
25
+ }
26
+ if (arg.startsWith(`${flag}=`)) values.push(arg.slice(flag.length + 1));
27
+ }
28
+ return values.map((value) => value.trim()).filter((value) => value !== "");
29
+ }
30
+ function onlyOnce(value, flag, argv) {
31
+ if (value === void 0) return void 0;
32
+ const given = argv.filter((arg) => arg === flag || arg.startsWith(`${flag}=`)).length;
33
+ if (given > 1) {
34
+ throw new ConversionArgsError(
35
+ `${flag} was given ${given} times and only the last would have been used. It takes one value.`
36
+ );
37
+ }
38
+ const trimmed = String(value).trim();
39
+ return trimmed === "" ? void 0 : trimmed;
40
+ }
41
+ function repeatable(flag, cittyValue, argv) {
42
+ const fromArgv = allValues(flag, argv);
43
+ if (fromArgv.length > 0) return fromArgv;
44
+ if (cittyValue === void 0) return [];
45
+ const trimmed = String(cittyValue).trim();
46
+ return trimmed === "" ? [] : [trimmed];
47
+ }
48
+ function checkFlagShape(args) {
49
+ if (args.eventKeys.length > 0 && args.name === void 0 && args.countMode === void 0) {
50
+ throw new ConversionArgsError(
51
+ "--event needs --name: a conversion nobody named is a row labelled with a UUID. (--event with only --count-mode changes how an event already counted is counted.)"
52
+ );
53
+ }
54
+ if (args.name !== void 0 && args.eventKeys.length === 0 && args.renameTo === void 0) {
55
+ throw new ConversionArgsError("--name needs --event, naming which event to count.");
56
+ }
57
+ if (args.renameFrom !== void 0 && args.renameTo === void 0) {
58
+ throw new ConversionArgsError('--rename needs --to: `--rename "Lead form" --to "Lead"`.');
59
+ }
60
+ if (args.renameTo !== void 0 && args.renameFrom === void 0) {
61
+ throw new ConversionArgsError(
62
+ '--to needs --rename, naming which outcome to rename: `--rename "Lead form" --to "Lead"`.'
63
+ );
64
+ }
65
+ }
66
+ function checkEventKeys(eventKeys) {
67
+ for (const eventKey of eventKeys) {
68
+ if (parseEventKey(eventKey) === null) {
69
+ throw new ConversionArgsError(
70
+ `"${eventKey}" is not an event key. Run with --candidates (or --flow <slug> for one Form) and copy one; they look like form:<form>:<step>:<trigger>, submit:<form>, page:<name> or exit:<host>.`
71
+ );
72
+ }
73
+ if (isLandingViewKey(eventKey)) {
74
+ throw new ConversionArgsError(
75
+ `"${eventKey}" is a landing being viewed \u2014 a funnel step, never a conversion. Add it as a step with \`baker funnel\` instead.`
76
+ );
77
+ }
78
+ if (isCheckoutRecordKey(eventKey)) {
79
+ throw new ConversionArgsError(CHECKOUT_RECORD_REFUSAL.message, CHECKOUT_RECORD_REFUSAL.fix);
80
+ }
81
+ }
82
+ }
83
+ function readDays(raw) {
84
+ if (raw === void 0) return void 0;
85
+ const days = Number(raw);
86
+ if (!Number.isFinite(days) || days <= 0) {
87
+ throw new ConversionArgsError("--days must be a positive number of days.");
88
+ }
89
+ return days;
90
+ }
91
+ function parseConversionsArgs(raw, argv) {
92
+ const countMode = onlyOnce(raw["count-mode"], "--count-mode", argv);
93
+ if (countMode !== void 0 && !CONVERSION_COUNT_MODES.includes(countMode)) {
94
+ throw new ConversionArgsError(`--count-mode must be one of ${CONVERSION_COUNT_MODES.join(", ")}.`);
95
+ }
96
+ const args = {
97
+ eventKeys: repeatable("--event", raw.event, argv),
98
+ removeKeys: repeatable("--remove", raw.remove, argv),
99
+ name: onlyOnce(raw.name, "--name", argv),
100
+ countMode,
101
+ renameFrom: onlyOnce(raw.rename, "--rename", argv),
102
+ renameTo: onlyOnce(raw.to, "--to", argv),
103
+ removeName: onlyOnce(raw["remove-name"], "--remove-name", argv),
104
+ flowSlug: onlyOnce(raw.flow, "--flow", argv),
105
+ candidates: raw.candidates === true,
106
+ full: raw.full === true,
107
+ days: readDays(raw.days)
108
+ };
109
+ checkFlagShape(args);
110
+ checkEventKeys(args.eventKeys);
111
+ return args;
112
+ }
113
+ function existingNames(existing) {
114
+ return [...new Set(existing.map((row) => row.name))];
115
+ }
116
+ function checkNameCollision(name, existing) {
117
+ const collision = findNameCollision(name, existingNames(existing));
118
+ if (collision === null) return;
119
+ throw new ConversionArgsError(
120
+ `This company already counts "${collision}", and "${name}" would be a second row for the same outcome \u2014 Baker groups by exact name, so the number would be split in two. Use "${collision}" to make them one number, or pick a name that means something different.`
121
+ );
122
+ }
123
+ function under(name, existing) {
124
+ const rows = existing.filter((row) => row.name === name);
125
+ if (rows.length === 0) {
126
+ throw new ConversionArgsError(
127
+ `Nothing is counted under "${name}". This company counts: ${existingNames(existing).join(", ") || "nothing yet"}.`
128
+ );
129
+ }
130
+ return rows;
131
+ }
132
+ function setFromEvents(args, existing) {
133
+ if (args.eventKeys.length === 0) return [];
134
+ if (args.name !== void 0) {
135
+ checkNameCollision(args.name, existing);
136
+ const name = args.name;
137
+ return args.eventKeys.map((eventKey) => ({
138
+ eventKey,
139
+ name,
140
+ ...args.countMode ? { countMode: args.countMode } : {}
141
+ }));
142
+ }
143
+ return args.eventKeys.map((eventKey) => {
144
+ const current = existing.find((row) => row.eventKey === eventKey);
145
+ if (!current) {
146
+ throw new ConversionArgsError(
147
+ `"${eventKey}" is not counted, so there is no count mode to change. Add it with --event "${eventKey}" --name "<what a person calls it>" --count-mode ${args.countMode}.`
148
+ );
149
+ }
150
+ return { eventKey, name: current.name, countMode: args.countMode };
151
+ });
152
+ }
153
+ function setFromRename(args, existing) {
154
+ if (args.renameFrom === void 0 || args.renameTo === void 0) return [];
155
+ const renameTo = args.renameTo;
156
+ checkNameCollision(renameTo, existing);
157
+ return under(args.renameFrom, existing).map((row) => ({
158
+ eventKey: row.eventKey,
159
+ name: renameTo,
160
+ countMode: row.countMode
161
+ }));
162
+ }
163
+ function conversionsWrite(args, existing) {
164
+ const set = [...setFromEvents(args, existing), ...setFromRename(args, existing)];
165
+ const remove = [
166
+ ...args.removeKeys,
167
+ ...args.removeName === void 0 ? [] : under(args.removeName, existing).map((row) => row.eventKey)
168
+ ];
169
+ if (set.length === 0 && remove.length === 0) return null;
170
+ return { ...set.length > 0 ? { set } : {}, ...remove.length > 0 ? { remove } : {} };
171
+ }
172
+
173
+ export {
174
+ ConversionArgsError,
175
+ onlyOnce,
176
+ parseConversionsArgs,
177
+ conversionsWrite
178
+ };
179
+ //# sourceMappingURL=chunk-R5OQM7FF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/analytics/conversionArgs.ts"],"sourcesContent":["/**\n * Reading the flags of `baker analytics conversions`, and refusing the shapes\n * that would otherwise count the wrong thing in silence.\n *\n * Its own module because every refusal here is cheap and every one it misses is\n * expensive: a conversion definition that never matches anything does not\n * error, it counts zero forever, and the company reports a rate that is quietly\n * too low. The same is true of the other direction — a name that splits one\n * outcome into two rows makes both numbers too low and neither of them wrong\n * enough to notice.\n *\n * The write is built against what the company **already counts**, which is why\n * `conversionsWrite` takes the current definitions: renaming, re-moding and the\n * near-duplicate refusal are all questions about the existing set, and a CLI\n * that could not see it could only add.\n */\n\nimport {\n CHECKOUT_RECORD_REFUSAL,\n CONVERSION_COUNT_MODES,\n findNameCollision,\n isCheckoutRecordKey,\n isLandingViewKey,\n parseEventKey,\n} from \"@baker/api/analytics\";\n\nexport interface ConversionsArgs {\n /** Every `--event` given. Several under one `--name` is how they become one number. */\n eventKeys: string[];\n name?: string;\n countMode?: string;\n /** Every `--remove` given. */\n removeKeys: string[];\n renameFrom?: string;\n renameTo?: string;\n removeName?: string;\n /** A Form to read its own endings from, whether or not any of them has fired. */\n flowSlug?: string;\n candidates: boolean;\n /** Every field of every candidate, instead of one short line each. */\n full: boolean;\n days?: number;\n}\n\n/** One definition as this module needs to read it. */\nexport interface ExistingConversion {\n eventKey: string;\n name: string;\n countMode: string;\n}\n\n/** Thrown for anything the caller can fix by re-running with different flags; `fix` says how when the message alone does not. */\nexport class ConversionArgsError extends Error {\n constructor(\n message: string,\n readonly fix?: string,\n ) {\n super(message);\n }\n}\n\n/**\n * Every value given for a flag, in the order they were typed.\n *\n * Read out of the raw argv rather than out of citty's parsed args, because\n * citty keeps only the LAST value of a repeated flag and hands it over as a\n * plain string: `--event a --event b` arrives as `\"b\"` with nothing recording\n * that `a` was ever there. By the time the handler runs, the evidence is gone.\n *\n * The identical shape has cost this repo before: `--param a=1 --param b=2`\n * staged only `b=2` against a write that replaces an entity's whole set, and\n * two of three UTM parameters were silently deleted on publish. Here the flags\n * that can legitimately repeat are collected, and the ones that cannot are\n * refused by {@link onlyOnce} — never quietly resolved to one of them.\n */\nexport function allValues(flag: string, argv: readonly string[]): string[] {\n const values: string[] = [];\n for (let i = 0; i < argv.length; i += 1) {\n const arg = argv[i] as string;\n if (arg === flag) {\n const next = argv[i + 1];\n if (next !== undefined && !next.startsWith(\"--\")) values.push(next);\n continue;\n }\n if (arg.startsWith(`${flag}=`)) values.push(arg.slice(flag.length + 1));\n }\n return values.map((value) => value.trim()).filter((value) => value !== \"\");\n}\n\n/** One value for a flag, or a refusal — never the last of several. */\nexport function onlyOnce(value: unknown, flag: string, argv: readonly string[]): string | undefined {\n if (value === undefined) return undefined;\n const given = argv.filter((arg) => arg === flag || arg.startsWith(`${flag}=`)).length;\n if (given > 1) {\n throw new ConversionArgsError(\n `${flag} was given ${given} times and only the last would have been used. It takes one value.`,\n );\n }\n const trimmed = String(value).trim();\n return trimmed === \"\" ? undefined : trimmed;\n}\n\n/**\n * The repeatable flags, read from argv with citty's value as the fallback.\n *\n * The fallback matters for the single-value case: a test — and any caller that\n * builds the args itself — passes the parsed object without an argv, and\n * dropping the value there would make every one of those calls a silent read.\n */\nfunction repeatable(flag: string, cittyValue: unknown, argv: readonly string[]): string[] {\n const fromArgv = allValues(flag, argv);\n if (fromArgv.length > 0) return fromArgv;\n if (cittyValue === undefined) return [];\n const trimmed = String(cittyValue).trim();\n return trimmed === \"\" ? [] : [trimmed];\n}\n\n/**\n * The four ways a set of flags can fail to say anything, each named.\n *\n * Split out of the parser for the reason the linter gives: a run of unrelated\n * refusals is the shape that grows one branch per flag until nobody can see\n * which combinations are legal.\n */\nfunction checkFlagShape(args: {\n eventKeys: string[];\n name?: string;\n countMode?: string;\n renameFrom?: string;\n renameTo?: string;\n}): void {\n // An event with no name and no mode change says which event and nothing about\n // it; a name with no event names an outcome with nothing to count.\n if (args.eventKeys.length > 0 && args.name === undefined && args.countMode === undefined) {\n throw new ConversionArgsError(\n \"--event needs --name: a conversion nobody named is a row labelled with a UUID. (--event with only --count-mode changes how an event already counted is counted.)\",\n );\n }\n if (args.name !== undefined && args.eventKeys.length === 0 && args.renameTo === undefined) {\n throw new ConversionArgsError(\"--name needs --event, naming which event to count.\");\n }\n if (args.renameFrom !== undefined && args.renameTo === undefined) {\n throw new ConversionArgsError('--rename needs --to: `--rename \"Lead form\" --to \"Lead\"`.');\n }\n if (args.renameTo !== undefined && args.renameFrom === undefined) {\n throw new ConversionArgsError(\n '--to needs --rename, naming which outcome to rename: `--rename \"Lead form\" --to \"Lead\"`.',\n );\n }\n}\n\n/**\n * Refuse a key that cannot parse, here rather than at the backend.\n *\n * This is the mistake that costs a turn: an event key nothing can produce never\n * matches anything, so it does not error — it counts zero forever.\n */\nfunction checkEventKeys(eventKeys: readonly string[]): void {\n for (const eventKey of eventKeys) {\n if (parseEventKey(eventKey) === null) {\n throw new ConversionArgsError(\n `\"${eventKey}\" is not an event key. Run with --candidates (or --flow <slug> for one Form) and copy one; they look like form:<form>:<step>:<trigger>, submit:<form>, page:<name> or exit:<host>.`,\n );\n }\n // The one readable key that is not an outcome. It exists so a funnel can\n // begin at \"saw the page\"; marked as a conversion it would make the rate a\n // ratio of the traffic to itself.\n if (isLandingViewKey(eventKey)) {\n throw new ConversionArgsError(\n `\"${eventKey}\" is a landing being viewed — a funnel step, never a conversion. Add it as a step with \\`baker funnel\\` instead.`,\n );\n }\n if (isCheckoutRecordKey(eventKey)) {\n throw new ConversionArgsError(CHECKOUT_RECORD_REFUSAL.message, CHECKOUT_RECORD_REFUSAL.fix);\n }\n }\n}\n\nfunction readDays(raw: unknown): number | undefined {\n if (raw === undefined) return undefined;\n const days = Number(raw);\n if (!Number.isFinite(days) || days <= 0) {\n throw new ConversionArgsError(\"--days must be a positive number of days.\");\n }\n return days;\n}\n\nexport function parseConversionsArgs(raw: Record<string, unknown>, argv: readonly string[]): ConversionsArgs {\n const countMode = onlyOnce(raw[\"count-mode\"], \"--count-mode\", argv);\n if (countMode !== undefined && !(CONVERSION_COUNT_MODES as readonly string[]).includes(countMode)) {\n throw new ConversionArgsError(`--count-mode must be one of ${CONVERSION_COUNT_MODES.join(\", \")}.`);\n }\n\n const args: ConversionsArgs = {\n eventKeys: repeatable(\"--event\", raw.event, argv),\n removeKeys: repeatable(\"--remove\", raw.remove, argv),\n name: onlyOnce(raw.name, \"--name\", argv),\n countMode,\n renameFrom: onlyOnce(raw.rename, \"--rename\", argv),\n renameTo: onlyOnce(raw.to, \"--to\", argv),\n removeName: onlyOnce(raw[\"remove-name\"], \"--remove-name\", argv),\n flowSlug: onlyOnce(raw.flow, \"--flow\", argv),\n candidates: raw.candidates === true,\n full: raw.full === true,\n days: readDays(raw.days),\n };\n\n checkFlagShape(args);\n checkEventKeys(args.eventKeys);\n return args;\n}\n\nexport interface ConversionsWrite {\n set?: { eventKey: string; name: string; countMode?: string }[];\n remove?: string[];\n}\n\n/**\n * The names this company already counts, in the order they were defined.\n *\n * Exported because it is what every hint about reuse is built from: the first\n * thing an agent naming an outcome should see is what this company calls its\n * outcomes already.\n */\nexport function existingNames(existing: readonly ExistingConversion[]): string[] {\n return [...new Set(existing.map((row) => row.name))];\n}\n\n/**\n * Refuse a name that reads the same as one already counted but stores\n * differently.\n *\n * Baker groups by exact name, so \"Booked a call\" and \"Booked a Call\" are two\n * rows and two numbers — a headline quietly split in half, with both halves\n * plausible. Nothing else in the system can catch it: both names are valid,\n * both keys are real, and every report is correct about the wrong grouping.\n *\n * A refusal rather than a hint because the fix is one character and the damage\n * is permanent-looking: nobody re-reads a conversion list to check for two rows\n * that mean the same thing.\n */\nfunction checkNameCollision(name: string, existing: readonly ExistingConversion[]): void {\n const collision = findNameCollision(name, existingNames(existing));\n if (collision === null) return;\n throw new ConversionArgsError(\n `This company already counts \"${collision}\", and \"${name}\" would be a second row for the same outcome — Baker groups by exact name, so the number would be split in two. Use \"${collision}\" to make them one number, or pick a name that means something different.`,\n );\n}\n\n/** The definitions counted under a name, or a refusal naming what is. */\nfunction under(name: string, existing: readonly ExistingConversion[]): ExistingConversion[] {\n const rows = existing.filter((row) => row.name === name);\n if (rows.length === 0) {\n throw new ConversionArgsError(\n `Nothing is counted under \"${name}\". This company counts: ${existingNames(existing).join(\", \") || \"nothing yet\"}.`,\n );\n }\n return rows;\n}\n\n/** `--event …` — each key set to the given name, or re-moded keeping the one it has. */\nfunction setFromEvents(args: ConversionsArgs, existing: readonly ExistingConversion[]) {\n if (args.eventKeys.length === 0) return [];\n if (args.name !== undefined) {\n checkNameCollision(args.name, existing);\n const name = args.name;\n return args.eventKeys.map((eventKey) => ({\n eventKey,\n name,\n ...(args.countMode ? { countMode: args.countMode } : {}),\n }));\n }\n // `--count-mode` alone. The store needs a name on every write, and the only\n // honest one is the name it already has: inventing one here would rename an\n // outcome somebody chose, as a side effect of changing how it counts.\n return args.eventKeys.map((eventKey) => {\n const current = existing.find((row) => row.eventKey === eventKey);\n if (!current) {\n throw new ConversionArgsError(\n `\"${eventKey}\" is not counted, so there is no count mode to change. Add it with --event \"${eventKey}\" --name \"<what a person calls it>\" --count-mode ${args.countMode}.`,\n );\n }\n return { eventKey, name: current.name, countMode: args.countMode };\n });\n}\n\n/**\n * `--rename … --to …` — every event under one name moved to another.\n *\n * Collision-checked like every other name, and that is not in tension with the\n * merge: renaming ONTO an existing name is the main thing the flag is for, and\n * `findNameCollision` returns `null` for an exact match precisely so that stays\n * free. What it refuses is the near-miss — renaming onto \"Booked a Call\" when\n * the company counts \"Booked a call\" — which is the split the whole rule exists\n * to prevent, arriving through the one flag that used to be exempt.\n */\nfunction setFromRename(args: ConversionsArgs, existing: readonly ExistingConversion[]) {\n if (args.renameFrom === undefined || args.renameTo === undefined) return [];\n const renameTo = args.renameTo;\n checkNameCollision(renameTo, existing);\n return under(args.renameFrom, existing).map((row) => ({\n eventKey: row.eventKey,\n name: renameTo,\n countMode: row.countMode,\n }));\n}\n\n/**\n * The write this call makes, or `null` when it is only a read. *\n * Every operation is expressed as `set` / `remove` over event keys, because\n * that is the only vocabulary the store has: a name is a property of a\n * definition, not a row of its own, so renaming an outcome is re-setting every\n * key underneath it and dropping one is removing them all.\n */\nexport function conversionsWrite(\n args: ConversionsArgs,\n existing: readonly ExistingConversion[],\n): ConversionsWrite | null {\n const set = [...setFromEvents(args, existing), ...setFromRename(args, existing)];\n const remove = [\n ...args.removeKeys,\n ...(args.removeName === undefined ? [] : under(args.removeName, existing).map((row) => row.eventKey)),\n ];\n\n if (set.length === 0 && remove.length === 0) return null;\n return { ...(set.length > 0 ? { set } : {}), ...(remove.length > 0 ? { remove } : {}) };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,111 @@
1
+ import {
2
+ prepareCanvas,
3
+ unsuppliedPlaceholderAssets
4
+ } from "./chunk-5SJ3JNNY.js";
5
+ import {
6
+ isSourceStale
7
+ } from "./chunk-SMIENBNX.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-RFB6RYKA.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":[]}