@koda-sl/baker-cli 0.513.0 → 0.515.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1231) hide show
  1. package/README.md +3 -3
  2. package/dist/account-BA3IO3AN.js +139 -0
  3. package/dist/account-LVJFHDA3.js +82 -0
  4. package/dist/account-LVJFHDA3.js.map +1 -0
  5. package/dist/account-PTJ6OK6Z.js +82 -0
  6. package/dist/account-PTJ6OK6Z.js.map +1 -0
  7. package/dist/account-assets-T3VVNBUG.js +290 -0
  8. package/dist/account-level-MPFWRPEK.js +611 -0
  9. package/dist/account-level-MPFWRPEK.js.map +1 -0
  10. package/dist/account-reads-5CXFLJ5Q.js +219 -0
  11. package/dist/account-users-B7DCJEFD.js +64 -0
  12. package/dist/account-users-B7DCJEFD.js.map +1 -0
  13. package/dist/account-writes-W5EOTS7P.js +68 -0
  14. package/dist/account-writes-W5EOTS7P.js.map +1 -0
  15. package/dist/accounts-4R3MBNJG.js +76 -0
  16. package/dist/accounts-5WF7VE7J.js +115 -0
  17. package/dist/accounts-IQTEH4BX.js +701 -0
  18. package/dist/accounts-IQTEH4BX.js.map +1 -0
  19. package/dist/accounts-SV7JZUCC.js +80 -0
  20. package/dist/accounts-SV7JZUCC.js.map +1 -0
  21. package/dist/accounts-VPWCLF6X.js +114 -0
  22. package/dist/actions-D7OWCP36.js +55 -0
  23. package/dist/active-entities-WDPW7652.js +103 -0
  24. package/dist/activecampaign-LBS4M4C4.js +938 -0
  25. package/dist/activecampaign-LBS4M4C4.js.map +1 -0
  26. package/dist/activities-WGPHYSFU.js +75 -0
  27. package/dist/ad-group-writes-JL56DPC4.js +172 -0
  28. package/dist/ad-group-writes-JL56DPC4.js.map +1 -0
  29. package/dist/ad-groups-62JPLIK3.js +70 -0
  30. package/dist/ad-groups-62JPLIK3.js.map +1 -0
  31. package/dist/ad-writes-WSKLRGB7.js +176 -0
  32. package/dist/ad-writes-WSKLRGB7.js.map +1 -0
  33. package/dist/add-HFQB2NTU.js +107 -0
  34. package/dist/add-HFQB2NTU.js.map +1 -0
  35. package/dist/add-IUYE5H6A.js +305 -0
  36. package/dist/add-IUYE5H6A.js.map +1 -0
  37. package/dist/ads-F7AUJWK7.js +115 -0
  38. package/dist/ads-JFI56MZL.js +79 -0
  39. package/dist/ads-JFI56MZL.js.map +1 -0
  40. package/dist/ads-OV3SMLKA.js +48 -0
  41. package/dist/adsets-XH2ULWPM.js +182 -0
  42. package/dist/advertisers-XXM6POO5.js +123 -0
  43. package/dist/advertisers-XXM6POO5.js.map +1 -0
  44. package/dist/analytics-MJT6DS3L.js +447 -0
  45. package/dist/analytics-MJT6DS3L.js.map +1 -0
  46. package/dist/analytics-W7EUOI2Q.js +2437 -0
  47. package/dist/analytics-W7EUOI2Q.js.map +1 -0
  48. package/dist/asset-writes-4X3AJQ4Q.js +50 -0
  49. package/dist/assign-2GQVQKKO.js +80 -0
  50. package/dist/assign-2GQVQKKO.js.map +1 -0
  51. package/dist/audience-size-VHXBNNIB.js +76 -0
  52. package/dist/audience-size-VHXBNNIB.js.map +1 -0
  53. package/dist/audience-writes-TXWPDJ2F.js +327 -0
  54. package/dist/audience-writes-TXWPDJ2F.js.map +1 -0
  55. package/dist/audiences-B2LFKWIS.js +280 -0
  56. package/dist/audiences-B2LFKWIS.js.map +1 -0
  57. package/dist/audiences-MBBXWEOI.js +86 -0
  58. package/dist/audiences-YUG5JLL4.js +85 -0
  59. package/dist/audit-VT2WSZWM.js +154 -0
  60. package/dist/audit-VT2WSZWM.js.map +1 -0
  61. package/dist/audit-WFXS5ELM.js +88 -0
  62. package/dist/autocomplete-ZYMHHV7E.js +114 -0
  63. package/dist/autocomplete-ZYMHHV7E.js.map +1 -0
  64. package/dist/avatars-WZ2JDMHH.js +38 -0
  65. package/dist/bid-pricing-5F3GBSAI.js +103 -0
  66. package/dist/bid-pricing-5F3GBSAI.js.map +1 -0
  67. package/dist/brand-IZTTBZII.js +22 -0
  68. package/dist/brief-OPQ7ICOY.js +543 -0
  69. package/dist/brief-OPQ7ICOY.js.map +1 -0
  70. package/dist/businesses-24JNY46Z.js +54 -0
  71. package/dist/campaign-groups-BDCDTMBF.js +99 -0
  72. package/dist/campaign-groups-BDCDTMBF.js.map +1 -0
  73. package/dist/campaign-writes-73H7G3JM.js +168 -0
  74. package/dist/campaign-writes-73H7G3JM.js.map +1 -0
  75. package/dist/campaign-writes-FNVOHONL.js +176 -0
  76. package/dist/campaign-writes-FNVOHONL.js.map +1 -0
  77. package/dist/campaigns-FUDZUVHN.js +78 -0
  78. package/dist/campaigns-FUDZUVHN.js.map +1 -0
  79. package/dist/campaigns-J65Q4WAZ.js +113 -0
  80. package/dist/campaigns-J65Q4WAZ.js.map +1 -0
  81. package/dist/campaigns-KXYGSH27.js +130 -0
  82. package/dist/campaigns-U5FQ2VWL.js +111 -0
  83. package/dist/canvas-IQ753Q2O.js +46 -0
  84. package/dist/capabilities-ZITW4RF7.js +147 -0
  85. package/dist/capabilities-ZITW4RF7.js.map +1 -0
  86. package/dist/cards-NSNAFTEB.js +85 -0
  87. package/dist/catalogs-OWQGGCIO.js +130 -0
  88. package/dist/catalogs-OWQGGCIO.js.map +1 -0
  89. package/dist/catalogs-VZYAATUR.js +781 -0
  90. package/dist/catalogs-VZYAATUR.js.map +1 -0
  91. package/dist/changes-RDWMNSTK.js +135 -0
  92. package/dist/chatgpt-27NEJVGF.js +47 -0
  93. package/dist/chats-AL2SYBJO.js +279 -0
  94. package/dist/chats-AL2SYBJO.js.map +1 -0
  95. package/dist/check-U2YLRD6H.js +107 -0
  96. package/dist/check-U2YLRD6H.js.map +1 -0
  97. package/dist/chunk-2F4DELSV.js +200 -0
  98. package/dist/chunk-2GYCWRF3.js +170 -0
  99. package/dist/chunk-2L7F7KR4.js +61 -0
  100. package/dist/chunk-44ZRCSR7.js +228 -0
  101. package/dist/chunk-46YLDIQG.js +4254 -0
  102. package/dist/chunk-4EDWXZ3I.js +363 -0
  103. package/dist/chunk-4FFBGR5L.js +66 -0
  104. package/dist/chunk-4UZUUSVL.js +592 -0
  105. package/dist/chunk-4XHCEYHI.js +831 -0
  106. package/dist/chunk-4Z6PVR3M.js +479 -0
  107. package/dist/chunk-5Y5FZV2W.js +122 -0
  108. package/dist/chunk-6DPSWLGY.js +324 -0
  109. package/dist/chunk-6DPSWLGY.js.map +1 -0
  110. package/dist/chunk-6HJXLGDV.js +392 -0
  111. package/dist/chunk-6S5CWGDA.js +429 -0
  112. package/dist/chunk-6VYROVWO.js +494 -0
  113. package/dist/chunk-AQRXXC6E.js +319 -0
  114. package/dist/chunk-ARBXT73X.js +387 -0
  115. package/dist/chunk-BEZHQIEI.js +97 -0
  116. package/dist/chunk-BFURWHVR.js +547 -0
  117. package/dist/chunk-EZSPVWLQ.js +169 -0
  118. package/dist/chunk-FCHZ5TNG.js +26 -0
  119. package/dist/chunk-FLWDFPXE.js +23 -0
  120. package/dist/chunk-FQMEX3GX.js +846 -0
  121. package/dist/chunk-G4FG5EQO.js +110 -0
  122. package/dist/chunk-G4FG5EQO.js.map +1 -0
  123. package/dist/chunk-GE3VT3CA.js +51 -0
  124. package/dist/chunk-GGK2CX6B.js +24026 -0
  125. package/dist/chunk-GGK2CX6B.js.map +1 -0
  126. package/dist/chunk-GHZ6HP2X.js +358 -0
  127. package/dist/chunk-GHZ6HP2X.js.map +1 -0
  128. package/dist/chunk-HCQJYI6X.js +74 -0
  129. package/dist/chunk-HGBJQGO5.js +142 -0
  130. package/dist/chunk-HHVWV5BJ.js +191 -0
  131. package/dist/chunk-I3WGTSDY.js +76 -0
  132. package/dist/chunk-I7AYMJZA.js +783 -0
  133. package/dist/chunk-IDSDJHRS.js +106 -0
  134. package/dist/chunk-ILPHIYAL.js +207 -0
  135. package/dist/chunk-IWKD56AY.js +156 -0
  136. package/dist/chunk-JLAQWMVF.js +3868 -0
  137. package/dist/chunk-JOE42ZW6.js +2984 -0
  138. package/dist/chunk-JOE42ZW6.js.map +1 -0
  139. package/dist/chunk-K6NULQN7.js +57 -0
  140. package/dist/chunk-L2BRAC2J.js +19 -0
  141. package/dist/chunk-LGMI4LSY.js +455 -0
  142. package/dist/chunk-LNODLR7W.js +149 -0
  143. package/dist/chunk-LQ2BRGMX.js +274 -0
  144. package/dist/chunk-M7QZSEHF.js +175 -0
  145. package/dist/chunk-NB2FU6EZ.js +179 -0
  146. package/dist/chunk-NFII3MTG.js +207 -0
  147. package/dist/chunk-NKQWDEB7.js +115 -0
  148. package/dist/chunk-NKQWDEB7.js.map +1 -0
  149. package/dist/chunk-OG47L5GG.js +275 -0
  150. package/dist/chunk-PC3FJEZH.js +7211 -0
  151. package/dist/chunk-PC3FJEZH.js.map +1 -0
  152. package/dist/chunk-Q3GSVLE5.js +4274 -0
  153. package/dist/chunk-Q3GSVLE5.js.map +1 -0
  154. package/dist/chunk-QIOFOD4K.js +344 -0
  155. package/dist/chunk-R2SYF5FC.js +249 -0
  156. package/dist/chunk-RTH2I55B.js +942 -0
  157. package/dist/chunk-S6VFDNSQ.js +63 -0
  158. package/dist/chunk-SG2TDQEE.js +150 -0
  159. package/dist/chunk-SOPVIIUW.js +68 -0
  160. package/dist/chunk-SOPVIIUW.js.map +1 -0
  161. package/dist/chunk-T3P6O2VU.js +89 -0
  162. package/dist/chunk-TU5LQUJM.js +74 -0
  163. package/dist/chunk-TU7DWSTW.js +69 -0
  164. package/dist/chunk-TXDE2QJ3.js +604 -0
  165. package/dist/chunk-TYXZ2SRW.js +287 -0
  166. package/dist/chunk-UDIEKCIR.js +203 -0
  167. package/dist/chunk-UQHHGT67.js +676 -0
  168. package/dist/chunk-USCADMM3.js +163 -0
  169. package/dist/chunk-UUGISMNE.js +910 -0
  170. package/dist/chunk-VDPOCAQ2.js +197 -0
  171. package/dist/chunk-VEJ3QX6M.js +103 -0
  172. package/dist/chunk-VFJB7OG6.js +91 -0
  173. package/dist/chunk-VPABGAN4.js +188 -0
  174. package/dist/chunk-VRIPVLE7.js +8954 -0
  175. package/dist/chunk-WLESMH4J.js +45 -0
  176. package/dist/chunk-XOQNM7I4.js +396 -0
  177. package/dist/chunk-XOQNM7I4.js.map +1 -0
  178. package/dist/chunk-YILZR3XI.js +224 -0
  179. package/dist/chunk-YJFLXOH4.js +191 -0
  180. package/dist/chunk-YWHZYR6S.js +297 -0
  181. package/dist/chunk-Z35KUMBW.js +219 -0
  182. package/dist/chunk-Z7I2ZFXS.js +1646 -0
  183. package/dist/claim-GOLUTAJ3.js +200 -0
  184. package/dist/claim-GOLUTAJ3.js.map +1 -0
  185. package/dist/cli.js +34 -34
  186. package/dist/companies-CSN7DPYW.js +198 -0
  187. package/dist/companies-CSN7DPYW.js.map +1 -0
  188. package/dist/company-MOSPLRZJ.js +308 -0
  189. package/dist/company-MOSPLRZJ.js.map +1 -0
  190. package/dist/complete-777BDV45.js +84 -0
  191. package/dist/complete-777BDV45.js.map +1 -0
  192. package/dist/config-55WGRLY3.js +88 -0
  193. package/dist/connect-3YY7MF3I.js +45 -0
  194. package/dist/conversation-6K2TNYBQ.js +96 -0
  195. package/dist/conversation-6K2TNYBQ.js.map +1 -0
  196. package/dist/conversion-report-WYYB3BK2.js +127 -0
  197. package/dist/conversion-report-WYYB3BK2.js.map +1 -0
  198. package/dist/conversion-upload-command-VM2P57K6.js +439 -0
  199. package/dist/conversion-writes-DHOPMA7X.js +122 -0
  200. package/dist/conversion-writes-DHOPMA7X.js.map +1 -0
  201. package/dist/conversions-KWY7BNDN.js +78 -0
  202. package/dist/conversions-KWY7BNDN.js.map +1 -0
  203. package/dist/conversions-MLRK35ZV.js +140 -0
  204. package/dist/conversions-MLRK35ZV.js.map +1 -0
  205. package/dist/copy-writes-E3V5TUVU.js +170 -0
  206. package/dist/copy-writes-E3V5TUVU.js.map +1 -0
  207. package/dist/create-3WOZO2XT.js +239 -0
  208. package/dist/create-3WOZO2XT.js.map +1 -0
  209. package/dist/create-7IFYLX7P.js +210 -0
  210. package/dist/create-7IFYLX7P.js.map +1 -0
  211. package/dist/create-FOHIQC3E.js +62 -0
  212. package/dist/create-FOHIQC3E.js.map +1 -0
  213. package/dist/create-UWQSQTK6.js +135 -0
  214. package/dist/create-UWQSQTK6.js.map +1 -0
  215. package/dist/creatives-2DR3QHJW.js +58 -0
  216. package/dist/creatives-DUR5Z5AN.js +89 -0
  217. package/dist/creatives-KN3MT533.js +223 -0
  218. package/dist/creatives-KN3MT533.js.map +1 -0
  219. package/dist/credentials-IP4L37XP.js +290 -0
  220. package/dist/credentials-IP4L37XP.js.map +1 -0
  221. package/dist/critique-LGDNMLBL.js +232 -0
  222. package/dist/critique-LGDNMLBL.js.map +1 -0
  223. package/dist/critique-LJMFAURK.js +1451 -0
  224. package/dist/critique-LJMFAURK.js.map +1 -0
  225. package/dist/crm-BNYW7PF7.js +323 -0
  226. package/dist/crm-BNYW7PF7.js.map +1 -0
  227. package/dist/crm-DMADHALO.js +227 -0
  228. package/dist/crm-DMADHALO.js.map +1 -0
  229. package/dist/currency-X4KEACEP.js +88 -0
  230. package/dist/custom-conversions-OIA5Y2GX.js +128 -0
  231. package/dist/customers-663K2OCP.js +59 -0
  232. package/dist/delete-5W3YVA4L.js +67 -0
  233. package/dist/delete-5W3YVA4L.js.map +1 -0
  234. package/dist/delete-6U7E6YUW.js +57 -0
  235. package/dist/delete-6U7E6YUW.js.map +1 -0
  236. package/dist/delete-G4NY6ZG6.js +69 -0
  237. package/dist/delete-G4NY6ZG6.js.map +1 -0
  238. package/dist/demographics-UZ7BCQ7K.js +141 -0
  239. package/dist/demographics-UZ7BCQ7K.js.map +1 -0
  240. package/dist/discard-RKCZNKMN.js +69 -0
  241. package/dist/discard-RKCZNKMN.js.map +1 -0
  242. package/dist/discover-2W42JB56.js +172 -0
  243. package/dist/domain-PLA2O4FW.js +101 -0
  244. package/dist/domain-PLA2O4FW.js.map +1 -0
  245. package/dist/download-4EFLVSA4.js +172 -0
  246. package/dist/download-4EFLVSA4.js.map +1 -0
  247. package/dist/draft-2ZX73IRO.js +238 -0
  248. package/dist/draft-6XMZYSMR.js +283 -0
  249. package/dist/draft-6XMZYSMR.js.map +1 -0
  250. package/dist/draft-CKLIIWXZ.js +308 -0
  251. package/dist/draft-IUEULQDT.js +310 -0
  252. package/dist/draft-IUEULQDT.js.map +1 -0
  253. package/dist/draft-JMNAGW7C.js +220 -0
  254. package/dist/draft-JMNAGW7C.js.map +1 -0
  255. package/dist/draft-L5Q6KEER.js +100 -0
  256. package/dist/draft-MJRMZGMP.js +103 -0
  257. package/dist/draft-WPMVLRME.js +335 -0
  258. package/dist/draft-WPMVLRME.js.map +1 -0
  259. package/dist/experiment-3VRHCQN5.js +1397 -0
  260. package/dist/experiments-S4TSXCK6.js +236 -0
  261. package/dist/experiments-S4TSXCK6.js.map +1 -0
  262. package/dist/facets-D3JG7OSO.js +117 -0
  263. package/dist/facets-D3JG7OSO.js.map +1 -0
  264. package/dist/feedback-IRSRPXV6.js +111 -0
  265. package/dist/feedback-IRSRPXV6.js.map +1 -0
  266. package/dist/feedback-record-DT3R4NA3.js +265 -0
  267. package/dist/feedback-record-DT3R4NA3.js.map +1 -0
  268. package/dist/fetch-YLQP5VQL.js +179 -0
  269. package/dist/fetch-YLQP5VQL.js.map +1 -0
  270. package/dist/fit-BEFCY2B4.js +65 -0
  271. package/dist/flows-FDMF3F3P.js +250 -0
  272. package/dist/flows-FDMF3F3P.js.map +1 -0
  273. package/dist/fonts-C6XN5667.js +39 -0
  274. package/dist/forecast-4YHMKO54.js +121 -0
  275. package/dist/forecast-4YHMKO54.js.map +1 -0
  276. package/dist/forecast-LYN6ZGQC.js +169 -0
  277. package/dist/funding-TCEPQXRQ.js +85 -0
  278. package/dist/funnel-CQIT3F23.js +397 -0
  279. package/dist/funnel-CQIT3F23.js.map +1 -0
  280. package/dist/ga4-JE3HS36B.js +55 -0
  281. package/dist/get-KBSKPTAV.js +59 -0
  282. package/dist/get-KBSKPTAV.js.map +1 -0
  283. package/dist/get-OSVQVMP6.js +82 -0
  284. package/dist/get-OSVQVMP6.js.map +1 -0
  285. package/dist/google-24FDG4C4.js +3267 -0
  286. package/dist/google-ads-XCJVAXWF.js +198 -0
  287. package/dist/google-ads-XCJVAXWF.js.map +1 -0
  288. package/dist/gsc-RMVOYIM3.js +30 -0
  289. package/dist/history-4TN2A6BL.js +136 -0
  290. package/dist/history-4TN2A6BL.js.map +1 -0
  291. package/dist/history-5IWW2X33.js +102 -0
  292. package/dist/history-5IWW2X33.js.map +1 -0
  293. package/dist/history-GIXIG276.js +69 -0
  294. package/dist/history-GIXIG276.js.map +1 -0
  295. package/dist/hubspot-5WB7TQBG.js +782 -0
  296. package/dist/hubspot-5WB7TQBG.js.map +1 -0
  297. package/dist/ideas-M66FU45H.js +45 -0
  298. package/dist/images-MM5OPUKV.js +92 -0
  299. package/dist/ingest-GU3WEBN3.js +110 -0
  300. package/dist/ingest-GU3WEBN3.js.map +1 -0
  301. package/dist/ingest-KMLYCFF4.js +26 -0
  302. package/dist/insights-HATH3IC6.js +439 -0
  303. package/dist/insights-HATH3IC6.js.map +1 -0
  304. package/dist/insights-VKPIVJMK.js +132 -0
  305. package/dist/insights-VKPIVJMK.js.map +1 -0
  306. package/dist/inspect-4JO2J3D6.js +192 -0
  307. package/dist/inspect-4JO2J3D6.js.map +1 -0
  308. package/dist/instant-experiences-A2SIQNB5.js +260 -0
  309. package/dist/instant-experiences-A2SIQNB5.js.map +1 -0
  310. package/dist/intent-YCQCUCV3.js +95 -0
  311. package/dist/job-SM2OQ2LO.js +202 -0
  312. package/dist/job-create-ECZHPVKH.js +109 -0
  313. package/dist/job-status-QSYDKIIV.js +74 -0
  314. package/dist/keyword-gap-PUSF7EKY.js +130 -0
  315. package/dist/keyword-metrics-JXBM22ZD.js +200 -0
  316. package/dist/keyword-metrics-JXBM22ZD.js.map +1 -0
  317. package/dist/keywords-for-site-OAYA7KP7.js +131 -0
  318. package/dist/keywords-for-site-OAYA7KP7.js.map +1 -0
  319. package/dist/landing-OZU5RRFV.js +28 -0
  320. package/dist/languages-Q5SKO4AM.js +40 -0
  321. package/dist/leads-QAYS7AJO.js +540 -0
  322. package/dist/leads-QAYS7AJO.js.map +1 -0
  323. package/dist/leads-VOSFVNUK.js +115 -0
  324. package/dist/leads-VOSFVNUK.js.map +1 -0
  325. package/dist/learn-NBBJRMVZ.js +207 -0
  326. package/dist/learn-NBBJRMVZ.js.map +1 -0
  327. package/dist/line-item-writes-VBBB3TRS.js +211 -0
  328. package/dist/line-item-writes-VBBB3TRS.js.map +1 -0
  329. package/dist/line-items-2V5FY33R.js +107 -0
  330. package/dist/link-WZSNUQQ2.js +67 -0
  331. package/dist/link-WZSNUQQ2.js.map +1 -0
  332. package/dist/linkedin-CDFCOHKI.js +1316 -0
  333. package/dist/linkedin-CDFCOHKI.js.map +1 -0
  334. package/dist/linkedin-person-MVRI7LLC.js +139 -0
  335. package/dist/linkedin-person-MVRI7LLC.js.map +1 -0
  336. package/dist/list-6S54IAUX.js +67 -0
  337. package/dist/list-6S54IAUX.js.map +1 -0
  338. package/dist/list-QRJ4E3SC.js +154 -0
  339. package/dist/list-QRJ4E3SC.js.map +1 -0
  340. package/dist/list-RZUDFLJN.js +306 -0
  341. package/dist/list-RZUDFLJN.js.map +1 -0
  342. package/dist/locations-RFTE42OS.js +69 -0
  343. package/dist/locations-RFTE42OS.js.map +1 -0
  344. package/dist/locations-VQYREHYI.js +40 -0
  345. package/dist/log-53SAPZZ3.js +95 -0
  346. package/dist/log-53SAPZZ3.js.map +1 -0
  347. package/dist/lookup-MELV3RUL.js +23 -0
  348. package/dist/make-ZF3YIMKW.js +1370 -0
  349. package/dist/make-ZF3YIMKW.js.map +1 -0
  350. package/dist/map-J37QFJSV.js +436 -0
  351. package/dist/map-J37QFJSV.js.map +1 -0
  352. package/dist/mcp-B7WSZQFD.js +729 -0
  353. package/dist/mcp-B7WSZQFD.js.map +1 -0
  354. package/dist/media-BPI2VE6A.js +89 -0
  355. package/dist/media-EEWZZU3P.js +18 -0
  356. package/dist/media-sources-EQI3U4TC.js +35 -0
  357. package/dist/members-GYVMSCKL.js +47 -0
  358. package/dist/members-GYVMSCKL.js.map +1 -0
  359. package/dist/meta-SMJUQP37.js +122 -0
  360. package/dist/metrics-EMAP7ESR.js +152 -0
  361. package/dist/normalize-MFN3WCH5.js +144 -0
  362. package/dist/normalize-MFN3WCH5.js.map +1 -0
  363. package/dist/options-DLHDHO7H.js +125 -0
  364. package/dist/options-DLHDHO7H.js.map +1 -0
  365. package/dist/organization-C2VOA2SD.js +949 -0
  366. package/dist/organization-C2VOA2SD.js.map +1 -0
  367. package/dist/output-4QBQEM4C.js +24 -0
  368. package/dist/page-photos-HRKPDQBM.js +118 -0
  369. package/dist/page-photos-HRKPDQBM.js.map +1 -0
  370. package/dist/pages-DTQWQUKP.js +67 -0
  371. package/dist/performance-NIF3CESZ.js +27 -0
  372. package/dist/performance-T6TBVHVU.js +5541 -0
  373. package/dist/performance-T6TBVHVU.js.map +1 -0
  374. package/dist/pixels-2BKADWE6.js +109 -0
  375. package/dist/pixels-F6BZNTDD.js +62 -0
  376. package/dist/pixels-F6BZNTDD.js.map +1 -0
  377. package/dist/plan-A6VC3ZO7.js +208 -0
  378. package/dist/plan-A6VC3ZO7.js.map +1 -0
  379. package/dist/preview-GGIGXPJW.js +218 -0
  380. package/dist/preview-GGIGXPJW.js.map +1 -0
  381. package/dist/promoted-tweet-writes-WU2SKKZF.js +183 -0
  382. package/dist/promoted-tweet-writes-WU2SKKZF.js.map +1 -0
  383. package/dist/promoted-tweets-653Q5AC6.js +119 -0
  384. package/dist/properties-VWKO3AAK.js +101 -0
  385. package/dist/publish-IOTMJCCY.js +344 -0
  386. package/dist/publish-IOTMJCCY.js.map +1 -0
  387. package/dist/query-CXIOL7WI.js +62 -0
  388. package/dist/query-OOP63DJF.js +236 -0
  389. package/dist/query-RBZFAIDK.js +247 -0
  390. package/dist/questionnaire-7SHYRTMJ.js +94 -0
  391. package/dist/questionnaire-7SHYRTMJ.js.map +1 -0
  392. package/dist/read-GOULD7YL.js +141 -0
  393. package/dist/reddit-JIHMAKAQ.js +29 -0
  394. package/dist/refresh-OQZ263CS.js +97 -0
  395. package/dist/refresh-OQZ263CS.js.map +1 -0
  396. package/dist/release-4CHFURO3.js +63 -0
  397. package/dist/release-4CHFURO3.js.map +1 -0
  398. package/dist/relevant-pages-FS7GBVXK.js +99 -0
  399. package/dist/remove-IJQPHPDI.js +53 -0
  400. package/dist/remove-IJQPHPDI.js.map +1 -0
  401. package/dist/reopen-YTLPVKUR.js +66 -0
  402. package/dist/reopen-YTLPVKUR.js.map +1 -0
  403. package/dist/rerun-C7NB7B35.js +95 -0
  404. package/dist/rerun-C7NB7B35.js.map +1 -0
  405. package/dist/research-PNBACCCP.js +72 -0
  406. package/dist/research-TLHNPK3O.js +265 -0
  407. package/dist/research-TLHNPK3O.js.map +1 -0
  408. package/dist/reset-JVLW7HA2.js +57 -0
  409. package/dist/reset-JVLW7HA2.js.map +1 -0
  410. package/dist/reset-Y6FXLAQE.js +57 -0
  411. package/dist/reset-Y6FXLAQE.js.map +1 -0
  412. package/dist/resolve-RCFAYPWR.js +124 -0
  413. package/dist/resolve-RCFAYPWR.js.map +1 -0
  414. package/dist/retry-3V3IGDRR.js +65 -0
  415. package/dist/retry-3V3IGDRR.js.map +1 -0
  416. package/dist/retry-AEKQLQMP.js +63 -0
  417. package/dist/retry-AEKQLQMP.js.map +1 -0
  418. package/dist/revenue-3R6JLYCQ.js +91 -0
  419. package/dist/revenue-3R6JLYCQ.js.map +1 -0
  420. package/dist/rule-writes-K4P3XBJW.js +525 -0
  421. package/dist/rule-writes-K4P3XBJW.js.map +1 -0
  422. package/dist/rules-34BQAWU3.js +99 -0
  423. package/dist/rules-34BQAWU3.js.map +1 -0
  424. package/dist/rules-HY7S2YTD.js +217 -0
  425. package/dist/rules-add-CM5XUYNS.js +465 -0
  426. package/dist/rules-add-CM5XUYNS.js.map +1 -0
  427. package/dist/run-MD64RDHZ.js +69 -0
  428. package/dist/run-MD64RDHZ.js.map +1 -0
  429. package/dist/run-QCNRR3CA.js +70 -0
  430. package/dist/scaffold-ad-NADPY3CB.js +1516 -0
  431. package/dist/scaffold-ad-NADPY3CB.js.map +1 -0
  432. package/dist/scaffold-static-ad-5YEYYVYH.js +1015 -0
  433. package/dist/scaffold-static-ad-5YEYYVYH.js.map +1 -0
  434. package/dist/scaffold-video-W7DF2CBJ.js +888 -0
  435. package/dist/scaffold-video-W7DF2CBJ.js.map +1 -0
  436. package/dist/schedule-CTRRF6TS.js +64 -0
  437. package/dist/schedule-CTRRF6TS.js.map +1 -0
  438. package/dist/scheduled-agents-OXYAVSIE.js +55 -0
  439. package/dist/schema-BEUYOGSW.js +135 -0
  440. package/dist/schema-BEUYOGSW.js.map +1 -0
  441. package/dist/search-GFJKWPKN.js +177 -0
  442. package/dist/search-GFJKWPKN.js.map +1 -0
  443. package/dist/select-S72CCL57.js +106 -0
  444. package/dist/select-S72CCL57.js.map +1 -0
  445. package/dist/sends-WBYTALR7.js +349 -0
  446. package/dist/sends-WBYTALR7.js.map +1 -0
  447. package/dist/set-prompt-YYFDRXRI.js +198 -0
  448. package/dist/set-prompt-YYFDRXRI.js.map +1 -0
  449. package/dist/setup-links-D4JJLESN.js +144 -0
  450. package/dist/setup-links-D4JJLESN.js.map +1 -0
  451. package/dist/shared-CGEJI2RB.js +32 -0
  452. package/dist/shopify-DQWEYPDX.js +3958 -0
  453. package/dist/shopify-DQWEYPDX.js.map +1 -0
  454. package/dist/site-BBZAUZA3.js +180 -0
  455. package/dist/site-BBZAUZA3.js.map +1 -0
  456. package/dist/sitemaps-5SP7PVQ6.js +87 -0
  457. package/dist/sites-YZDPHBST.js +101 -0
  458. package/dist/sources-7FIBHL6A.js +457 -0
  459. package/dist/sources-7FIBHL6A.js.map +1 -0
  460. package/dist/sources-FLUGHSVP.js +30 -0
  461. package/dist/stale-HP54JS5X.js +76 -0
  462. package/dist/stale-HP54JS5X.js.map +1 -0
  463. package/dist/stats-EGGNFTKI.js +34 -0
  464. package/dist/status-CLSWQFCQ.js +65 -0
  465. package/dist/status-CLSWQFCQ.js.map +1 -0
  466. package/dist/studies-6VUUOMZD.js +250 -0
  467. package/dist/study-writes-IR7RSSTK.js +470 -0
  468. package/dist/study-writes-IR7RSSTK.js.map +1 -0
  469. package/dist/sync-4YTVVEVC.js +57 -0
  470. package/dist/sync-4YTVVEVC.js.map +1 -0
  471. package/dist/sync-SCM6JGJP.js +279 -0
  472. package/dist/sync-definition-OGQ5XTQE.js +69 -0
  473. package/dist/tag-manager-REKD4WGU.js +43 -0
  474. package/dist/tags-CZTRQNXV.js +26 -0
  475. package/dist/tags-FDQXWTCQ.js +23 -0
  476. package/dist/tags-FDQXWTCQ.js.map +1 -0
  477. package/dist/tags-R67DKRZ6.js +23 -0
  478. package/dist/tags-R67DKRZ6.js.map +1 -0
  479. package/dist/tags-SA2LU6AW.js +227 -0
  480. package/dist/tags-SA2LU6AW.js.map +1 -0
  481. package/dist/tags-ZOXX6VRE.js +23 -0
  482. package/dist/tags-ZOXX6VRE.js.map +1 -0
  483. package/dist/targeting-BQUD54MF.js +762 -0
  484. package/dist/targeting-BQUD54MF.js.map +1 -0
  485. package/dist/targeting-constants-MRQB4N5I.js +118 -0
  486. package/dist/targeting-criteria-HSAESZIR.js +113 -0
  487. package/dist/targets-UUVCEG3F.js +106 -0
  488. package/dist/targets-UUVCEG3F.js.map +1 -0
  489. package/dist/terms-D2KAFHKJ.js +102 -0
  490. package/dist/testimonials-G3OCNPBY.js +32 -0
  491. package/dist/themes-X56KIX3Z.js +95 -0
  492. package/dist/top-companies-2RLNCSVS.js +111 -0
  493. package/dist/top-companies-2RLNCSVS.js.map +1 -0
  494. package/dist/transcript-U46AEOEI.js +165 -0
  495. package/dist/transcript-U46AEOEI.js.map +1 -0
  496. package/dist/translate-AS7JVKYM.js +609 -0
  497. package/dist/translate-AS7JVKYM.js.map +1 -0
  498. package/dist/triggers-ECRBPYYF.js +144 -0
  499. package/dist/triggers-ECRBPYYF.js.map +1 -0
  500. package/dist/tweets-JN6ARKF6.js +123 -0
  501. package/dist/unlink-VDNCSRJV.js +70 -0
  502. package/dist/unlink-VDNCSRJV.js.map +1 -0
  503. package/dist/unstage-5C27F2LZ.js +96 -0
  504. package/dist/unstage-5C27F2LZ.js.map +1 -0
  505. package/dist/unstage-ATDXUYP2.js +88 -0
  506. package/dist/unstage-ATDXUYP2.js.map +1 -0
  507. package/dist/update-FJ6TBV3E.js +101 -0
  508. package/dist/update-FJ6TBV3E.js.map +1 -0
  509. package/dist/update-HDBJCSTI.js +66 -0
  510. package/dist/update-HDBJCSTI.js.map +1 -0
  511. package/dist/update-U43DJRGV.js +155 -0
  512. package/dist/update-U43DJRGV.js.map +1 -0
  513. package/dist/update-Z7TIUBMJ.js +192 -0
  514. package/dist/update-Z7TIUBMJ.js.map +1 -0
  515. package/dist/upload-LXCFSRIU.js +129 -0
  516. package/dist/upload-LXCFSRIU.js.map +1 -0
  517. package/dist/url-options-C543MY7L.js +131 -0
  518. package/dist/url-options-C543MY7L.js.map +1 -0
  519. package/dist/url-params-TEFCXQ5N.js +101 -0
  520. package/dist/url-params-TEFCXQ5N.js.map +1 -0
  521. package/dist/validate-VR3HEOMJ.js +122 -0
  522. package/dist/validate-VR3HEOMJ.js.map +1 -0
  523. package/dist/videos-36AXDUGZ.js +41 -0
  524. package/dist/viewer-check-6HL4OUQY.js +83 -0
  525. package/dist/web-7BRJRQX7.js +143 -0
  526. package/dist/web-7BRJRQX7.js.map +1 -0
  527. package/dist/winning-ads-GMM5W2O4.js +86 -0
  528. package/dist/write-commands-B25W4FP5.js +713 -0
  529. package/dist/write-commands-DO2YUOMG.js +1502 -0
  530. package/dist/write-commands-DO2YUOMG.js.map +1 -0
  531. package/dist/write-commands-GNNEUVDW.js +206 -0
  532. package/dist/write-commands-NXJQQ62W.js +1172 -0
  533. package/dist/write-commands-NXJQQ62W.js.map +1 -0
  534. package/dist/x-JNR5SO6F.js +47 -0
  535. package/package.json +1 -1
  536. package/dist/account-UUAEQWO3.js +0 -80
  537. package/dist/account-UUAEQWO3.js.map +0 -1
  538. package/dist/account-WLQBAQMD.js +0 -80
  539. package/dist/account-WLQBAQMD.js.map +0 -1
  540. package/dist/account-ZY655BIU.js +0 -139
  541. package/dist/account-assets-O7IA37RE.js +0 -290
  542. package/dist/account-level-EU7BWCO7.js +0 -609
  543. package/dist/account-level-EU7BWCO7.js.map +0 -1
  544. package/dist/account-reads-SNOWDHHF.js +0 -219
  545. package/dist/account-users-NV37Z2XJ.js +0 -62
  546. package/dist/account-users-NV37Z2XJ.js.map +0 -1
  547. package/dist/account-writes-TU3WJRSI.js +0 -66
  548. package/dist/account-writes-TU3WJRSI.js.map +0 -1
  549. package/dist/accounts-FT2SRKMD.js +0 -76
  550. package/dist/accounts-K5XLEO6W.js +0 -114
  551. package/dist/accounts-MZ6SETJJ.js +0 -78
  552. package/dist/accounts-MZ6SETJJ.js.map +0 -1
  553. package/dist/accounts-SNB65ZEW.js +0 -115
  554. package/dist/accounts-U7ZBEAY6.js +0 -699
  555. package/dist/accounts-U7ZBEAY6.js.map +0 -1
  556. package/dist/actions-4JYHXRFH.js +0 -55
  557. package/dist/active-entities-3BAPHE4P.js +0 -103
  558. package/dist/activecampaign-IDBV26HH.js +0 -936
  559. package/dist/activecampaign-IDBV26HH.js.map +0 -1
  560. package/dist/activities-LKLPORDI.js +0 -75
  561. package/dist/ad-group-writes-HLBWN4E4.js +0 -170
  562. package/dist/ad-group-writes-HLBWN4E4.js.map +0 -1
  563. package/dist/ad-groups-33NZD6J3.js +0 -68
  564. package/dist/ad-groups-33NZD6J3.js.map +0 -1
  565. package/dist/ad-writes-7ZDNDZ2E.js +0 -174
  566. package/dist/ad-writes-7ZDNDZ2E.js.map +0 -1
  567. package/dist/add-AF42LQQQ.js +0 -105
  568. package/dist/add-AF42LQQQ.js.map +0 -1
  569. package/dist/add-LJRZYJ7I.js +0 -303
  570. package/dist/add-LJRZYJ7I.js.map +0 -1
  571. package/dist/ads-KBE5JXCH.js +0 -115
  572. package/dist/ads-LXWXOQHX.js +0 -48
  573. package/dist/ads-X3AM6M7L.js +0 -77
  574. package/dist/ads-X3AM6M7L.js.map +0 -1
  575. package/dist/adsets-YWBJFPAZ.js +0 -182
  576. package/dist/advertisers-6FOCN2W3.js +0 -121
  577. package/dist/advertisers-6FOCN2W3.js.map +0 -1
  578. package/dist/analytics-64HBRJJE.js +0 -2435
  579. package/dist/analytics-64HBRJJE.js.map +0 -1
  580. package/dist/analytics-VY5NL2GL.js +0 -445
  581. package/dist/analytics-VY5NL2GL.js.map +0 -1
  582. package/dist/asset-writes-72DEVXGO.js +0 -48
  583. package/dist/assign-N2I2BM67.js +0 -78
  584. package/dist/assign-N2I2BM67.js.map +0 -1
  585. package/dist/audience-size-H5DEZXJN.js +0 -74
  586. package/dist/audience-size-H5DEZXJN.js.map +0 -1
  587. package/dist/audience-writes-KCHLNFSI.js +0 -325
  588. package/dist/audience-writes-KCHLNFSI.js.map +0 -1
  589. package/dist/audiences-34IQKOGS.js +0 -85
  590. package/dist/audiences-QAH42HIM.js +0 -86
  591. package/dist/audiences-WCDWN64L.js +0 -268
  592. package/dist/audiences-WCDWN64L.js.map +0 -1
  593. package/dist/audit-2AAF6AOX.js +0 -152
  594. package/dist/audit-2AAF6AOX.js.map +0 -1
  595. package/dist/audit-7ED6CUTQ.js +0 -88
  596. package/dist/autocomplete-3GSKRNCZ.js +0 -112
  597. package/dist/autocomplete-3GSKRNCZ.js.map +0 -1
  598. package/dist/avatars-N6W6HUPP.js +0 -38
  599. package/dist/bid-pricing-IMITXHXN.js +0 -101
  600. package/dist/bid-pricing-IMITXHXN.js.map +0 -1
  601. package/dist/brand-ITWQVZD2.js +0 -22
  602. package/dist/brief-JJNEYPYB.js +0 -541
  603. package/dist/brief-JJNEYPYB.js.map +0 -1
  604. package/dist/businesses-MGP2YCEU.js +0 -54
  605. package/dist/campaign-groups-TTQLP32Q.js +0 -97
  606. package/dist/campaign-groups-TTQLP32Q.js.map +0 -1
  607. package/dist/campaign-writes-MAKPHQ3V.js +0 -166
  608. package/dist/campaign-writes-MAKPHQ3V.js.map +0 -1
  609. package/dist/campaign-writes-XO74BALZ.js +0 -174
  610. package/dist/campaign-writes-XO74BALZ.js.map +0 -1
  611. package/dist/campaigns-5BIDXYSR.js +0 -111
  612. package/dist/campaigns-LS65QM6W.js +0 -76
  613. package/dist/campaigns-LS65QM6W.js.map +0 -1
  614. package/dist/campaigns-XZOQ2VTK.js +0 -130
  615. package/dist/campaigns-XZPXCS7I.js +0 -111
  616. package/dist/campaigns-XZPXCS7I.js.map +0 -1
  617. package/dist/canvas-SL3RMOY5.js +0 -46
  618. package/dist/capabilities-LSR5GCE6.js +0 -145
  619. package/dist/capabilities-LSR5GCE6.js.map +0 -1
  620. package/dist/cards-A7GQVC7B.js +0 -85
  621. package/dist/catalogs-JLCSFZYC.js +0 -779
  622. package/dist/catalogs-JLCSFZYC.js.map +0 -1
  623. package/dist/catalogs-T23RKYFC.js +0 -128
  624. package/dist/catalogs-T23RKYFC.js.map +0 -1
  625. package/dist/changes-36C754R4.js +0 -135
  626. package/dist/chatgpt-3WFOPURY.js +0 -47
  627. package/dist/chats-GGYTXNJS.js +0 -277
  628. package/dist/chats-GGYTXNJS.js.map +0 -1
  629. package/dist/check-P7UPBBG7.js +0 -105
  630. package/dist/check-P7UPBBG7.js.map +0 -1
  631. package/dist/chunk-2TOIY2WN.js +0 -4254
  632. package/dist/chunk-3GAR4AZK.js +0 -149
  633. package/dist/chunk-4D46PS6J.js +0 -344
  634. package/dist/chunk-4GAEB6NK.js +0 -228
  635. package/dist/chunk-5XTGG4PV.js +0 -274
  636. package/dist/chunk-6JCX3YLM.js +0 -249
  637. package/dist/chunk-7J3NZBPV.js +0 -2982
  638. package/dist/chunk-7J3NZBPV.js.map +0 -1
  639. package/dist/chunk-7NF73SCB.js +0 -106
  640. package/dist/chunk-ALMYGH5U.js +0 -479
  641. package/dist/chunk-AQKRSEBQ.js +0 -103
  642. package/dist/chunk-B2POVFR2.js +0 -175
  643. package/dist/chunk-BL6RTOK3.js +0 -297
  644. package/dist/chunk-C6CBBZBO.js +0 -203
  645. package/dist/chunk-CCEDZTP7.js +0 -391
  646. package/dist/chunk-CCEDZTP7.js.map +0 -1
  647. package/dist/chunk-CKQTJ2LV.js +0 -89
  648. package/dist/chunk-D3KLDIPQ.js +0 -45
  649. package/dist/chunk-DL2UJNJ7.js +0 -8954
  650. package/dist/chunk-DM3Q6F5F.js +0 -26
  651. package/dist/chunk-DQ54POZN.js +0 -363
  652. package/dist/chunk-EDLZGTGN.js +0 -216
  653. package/dist/chunk-EDLZGTGN.js.map +0 -1
  654. package/dist/chunk-EXSHBYNQ.js +0 -349
  655. package/dist/chunk-EXSHBYNQ.js.map +0 -1
  656. package/dist/chunk-FFFJBNHA.js +0 -63
  657. package/dist/chunk-FKQK22IX.js +0 -51
  658. package/dist/chunk-FLK6QHOY.js +0 -142
  659. package/dist/chunk-GACSA5A6.js +0 -1646
  660. package/dist/chunk-GU5MXV2Y.js +0 -191
  661. package/dist/chunk-HGUYC5K6.js +0 -76
  662. package/dist/chunk-HJKYTNAZ.js +0 -61
  663. package/dist/chunk-HMIROUFV.js +0 -74
  664. package/dist/chunk-INUU3752.js +0 -392
  665. package/dist/chunk-IQHO2ABF.js +0 -197
  666. package/dist/chunk-J3UWMBOP.js +0 -547
  667. package/dist/chunk-JDR3HUEL.js +0 -191
  668. package/dist/chunk-JI77AKT6.js +0 -19
  669. package/dist/chunk-JNURZHZJ.js +0 -942
  670. package/dist/chunk-JSNMKTFM.js +0 -592
  671. package/dist/chunk-K4FLWDEX.js +0 -122
  672. package/dist/chunk-KBRJSPIM.js +0 -676
  673. package/dist/chunk-KUY26RCF.js +0 -200
  674. package/dist/chunk-LAC6YHHX.js +0 -97
  675. package/dist/chunk-M7HD42M6.js +0 -24017
  676. package/dist/chunk-M7HD42M6.js.map +0 -1
  677. package/dist/chunk-MGYC2IRC.js +0 -783
  678. package/dist/chunk-MI4HXE7M.js +0 -23
  679. package/dist/chunk-MJ7RNDD4.js +0 -910
  680. package/dist/chunk-OBJCNGZL.js +0 -207
  681. package/dist/chunk-OJGYYH6K.js +0 -179
  682. package/dist/chunk-OLBLXJNI.js +0 -224
  683. package/dist/chunk-PFTYKINE.js +0 -207
  684. package/dist/chunk-PLBITHV6.js +0 -846
  685. package/dist/chunk-Q6JMMBSQ.js +0 -831
  686. package/dist/chunk-RAQHUMKS.js +0 -169
  687. package/dist/chunk-RCJKABOS.js +0 -74
  688. package/dist/chunk-SA22KXWT.js +0 -163
  689. package/dist/chunk-SIXU5PDF.js +0 -66
  690. package/dist/chunk-SXMK5AEJ.js +0 -494
  691. package/dist/chunk-TLQOMWLQ.js +0 -69
  692. package/dist/chunk-TTLD66NI.js +0 -319
  693. package/dist/chunk-TVAIOC77.js +0 -287
  694. package/dist/chunk-TVTSA4EN.js +0 -188
  695. package/dist/chunk-V5NHJU3M.js +0 -604
  696. package/dist/chunk-VIPKDXGU.js +0 -4229
  697. package/dist/chunk-VIPKDXGU.js.map +0 -1
  698. package/dist/chunk-W4D7C74B.js +0 -387
  699. package/dist/chunk-WF25CCLD.js +0 -170
  700. package/dist/chunk-WQPUX3BA.js +0 -275
  701. package/dist/chunk-WR3FR3K3.js +0 -156
  702. package/dist/chunk-XDNJC62G.js +0 -91
  703. package/dist/chunk-XE6N4SZI.js +0 -429
  704. package/dist/chunk-XGPU2VDU.js +0 -219
  705. package/dist/chunk-XUJZO7MZ.js +0 -57
  706. package/dist/chunk-Y67LUJBE.js +0 -455
  707. package/dist/chunk-Y7XSDJEA.js +0 -3868
  708. package/dist/chunk-ZNNQK366.js +0 -7198
  709. package/dist/chunk-ZNNQK366.js.map +0 -1
  710. package/dist/chunk-ZNRGH4NS.js +0 -150
  711. package/dist/chunk-ZRP7Y2DM.js +0 -320
  712. package/dist/chunk-ZRP7Y2DM.js.map +0 -1
  713. package/dist/claim-4KUETSW3.js +0 -198
  714. package/dist/claim-4KUETSW3.js.map +0 -1
  715. package/dist/companies-XFO6WPVT.js +0 -196
  716. package/dist/companies-XFO6WPVT.js.map +0 -1
  717. package/dist/company-OJGISG7K.js +0 -306
  718. package/dist/company-OJGISG7K.js.map +0 -1
  719. package/dist/complete-CXOST5J3.js +0 -82
  720. package/dist/complete-CXOST5J3.js.map +0 -1
  721. package/dist/config-SMVIY6RW.js +0 -88
  722. package/dist/connect-HPQ32KGV.js +0 -43
  723. package/dist/conversation-D5HKCTDA.js +0 -94
  724. package/dist/conversation-D5HKCTDA.js.map +0 -1
  725. package/dist/conversion-report-DKXFHLLX.js +0 -125
  726. package/dist/conversion-report-DKXFHLLX.js.map +0 -1
  727. package/dist/conversion-upload-command-KTYAY7IG.js +0 -439
  728. package/dist/conversion-writes-7ODJDAUP.js +0 -120
  729. package/dist/conversion-writes-7ODJDAUP.js.map +0 -1
  730. package/dist/conversions-BKVGNNC6.js +0 -76
  731. package/dist/conversions-BKVGNNC6.js.map +0 -1
  732. package/dist/conversions-SYNDEB6D.js +0 -138
  733. package/dist/conversions-SYNDEB6D.js.map +0 -1
  734. package/dist/copy-writes-P4WK6OPM.js +0 -168
  735. package/dist/copy-writes-P4WK6OPM.js.map +0 -1
  736. package/dist/create-7D4VD4TC.js +0 -208
  737. package/dist/create-7D4VD4TC.js.map +0 -1
  738. package/dist/create-7QDEAWZS.js +0 -133
  739. package/dist/create-7QDEAWZS.js.map +0 -1
  740. package/dist/create-IQSYEC4M.js +0 -60
  741. package/dist/create-IQSYEC4M.js.map +0 -1
  742. package/dist/create-TQSCM7MG.js +0 -237
  743. package/dist/create-TQSCM7MG.js.map +0 -1
  744. package/dist/creatives-JPKA2RHU.js +0 -89
  745. package/dist/creatives-RNOL4F4E.js +0 -58
  746. package/dist/creatives-RXI27T2D.js +0 -221
  747. package/dist/creatives-RXI27T2D.js.map +0 -1
  748. package/dist/credentials-PYW55B52.js +0 -288
  749. package/dist/credentials-PYW55B52.js.map +0 -1
  750. package/dist/critique-2SYHNAW5.js +0 -1449
  751. package/dist/critique-2SYHNAW5.js.map +0 -1
  752. package/dist/critique-72GFZSHA.js +0 -230
  753. package/dist/critique-72GFZSHA.js.map +0 -1
  754. package/dist/crm-EATDSXXB.js +0 -225
  755. package/dist/crm-EATDSXXB.js.map +0 -1
  756. package/dist/crm-XXP3VBYD.js +0 -321
  757. package/dist/crm-XXP3VBYD.js.map +0 -1
  758. package/dist/currency-R4ORE2U3.js +0 -88
  759. package/dist/custom-conversions-5HJBB5XL.js +0 -128
  760. package/dist/customers-OFZTEXST.js +0 -57
  761. package/dist/delete-FGVZIK4R.js +0 -55
  762. package/dist/delete-FGVZIK4R.js.map +0 -1
  763. package/dist/delete-HBZZL4UA.js +0 -67
  764. package/dist/delete-HBZZL4UA.js.map +0 -1
  765. package/dist/delete-JOUXMRIX.js +0 -65
  766. package/dist/delete-JOUXMRIX.js.map +0 -1
  767. package/dist/demographics-SB7NBYOI.js +0 -139
  768. package/dist/demographics-SB7NBYOI.js.map +0 -1
  769. package/dist/discard-YYGIRDII.js +0 -67
  770. package/dist/discard-YYGIRDII.js.map +0 -1
  771. package/dist/discover-GSJRZUOC.js +0 -172
  772. package/dist/domain-3KRAJAUH.js +0 -99
  773. package/dist/domain-3KRAJAUH.js.map +0 -1
  774. package/dist/download-QCBKJ6OR.js +0 -170
  775. package/dist/download-QCBKJ6OR.js.map +0 -1
  776. package/dist/draft-7CGFFZTH.js +0 -333
  777. package/dist/draft-7CGFFZTH.js.map +0 -1
  778. package/dist/draft-BI4NW6AU.js +0 -308
  779. package/dist/draft-BI4NW6AU.js.map +0 -1
  780. package/dist/draft-DJIYEMZU.js +0 -103
  781. package/dist/draft-LPVK6YHI.js +0 -281
  782. package/dist/draft-LPVK6YHI.js.map +0 -1
  783. package/dist/draft-QF5JEUTH.js +0 -218
  784. package/dist/draft-QF5JEUTH.js.map +0 -1
  785. package/dist/draft-RIR2V6A2.js +0 -238
  786. package/dist/draft-WYDMLNYA.js +0 -308
  787. package/dist/draft-ZCL7FVBH.js +0 -100
  788. package/dist/experiment-I5CRLOVN.js +0 -1397
  789. package/dist/experiments-ZCEYRP3H.js +0 -234
  790. package/dist/experiments-ZCEYRP3H.js.map +0 -1
  791. package/dist/facets-G7ZDPI5Q.js +0 -115
  792. package/dist/facets-G7ZDPI5Q.js.map +0 -1
  793. package/dist/feedback-3U3CL2VB.js +0 -109
  794. package/dist/feedback-3U3CL2VB.js.map +0 -1
  795. package/dist/feedback-record-4ZHPENIP.js +0 -263
  796. package/dist/feedback-record-4ZHPENIP.js.map +0 -1
  797. package/dist/fetch-PNVNNWTP.js +0 -177
  798. package/dist/fetch-PNVNNWTP.js.map +0 -1
  799. package/dist/fit-53DGYRFD.js +0 -63
  800. package/dist/flows-JXLQBP5Q.js +0 -248
  801. package/dist/flows-JXLQBP5Q.js.map +0 -1
  802. package/dist/fonts-LFMBUT4R.js +0 -37
  803. package/dist/forecast-4AG5F7YC.js +0 -169
  804. package/dist/forecast-VZAXI74O.js +0 -119
  805. package/dist/forecast-VZAXI74O.js.map +0 -1
  806. package/dist/funding-5W4LX6DU.js +0 -85
  807. package/dist/funnel-EACC35UD.js +0 -395
  808. package/dist/funnel-EACC35UD.js.map +0 -1
  809. package/dist/ga4-BWVCDVIR.js +0 -55
  810. package/dist/get-AXBVYGAC.js +0 -57
  811. package/dist/get-AXBVYGAC.js.map +0 -1
  812. package/dist/get-D6A27Q4E.js +0 -80
  813. package/dist/get-D6A27Q4E.js.map +0 -1
  814. package/dist/google-NAA4BASO.js +0 -3267
  815. package/dist/google-ads-OIYUNDXQ.js +0 -196
  816. package/dist/google-ads-OIYUNDXQ.js.map +0 -1
  817. package/dist/gsc-2MPE4N32.js +0 -30
  818. package/dist/history-5MRLNTCI.js +0 -67
  819. package/dist/history-5MRLNTCI.js.map +0 -1
  820. package/dist/history-IDYNIB6R.js +0 -134
  821. package/dist/history-IDYNIB6R.js.map +0 -1
  822. package/dist/history-IOUKN3WD.js +0 -100
  823. package/dist/history-IOUKN3WD.js.map +0 -1
  824. package/dist/hubspot-HL6WGC4G.js +0 -780
  825. package/dist/hubspot-HL6WGC4G.js.map +0 -1
  826. package/dist/ideas-NK3KQHAK.js +0 -43
  827. package/dist/images-2XS3JT7E.js +0 -92
  828. package/dist/ingest-DHXWZZX4.js +0 -24
  829. package/dist/ingest-FGTJRCWK.js +0 -108
  830. package/dist/ingest-FGTJRCWK.js.map +0 -1
  831. package/dist/insights-M3CYB22P.js +0 -437
  832. package/dist/insights-M3CYB22P.js.map +0 -1
  833. package/dist/insights-XCT3ONC7.js +0 -130
  834. package/dist/insights-XCT3ONC7.js.map +0 -1
  835. package/dist/inspect-53GGYRC4.js +0 -190
  836. package/dist/inspect-53GGYRC4.js.map +0 -1
  837. package/dist/instant-experiences-HT3HB4QZ.js +0 -258
  838. package/dist/instant-experiences-HT3HB4QZ.js.map +0 -1
  839. package/dist/intent-NSHW7EJT.js +0 -95
  840. package/dist/job-DRFCQ27M.js +0 -202
  841. package/dist/job-create-2EC25Y3J.js +0 -109
  842. package/dist/job-status-UNVZRPIA.js +0 -74
  843. package/dist/keyword-gap-ITTWKBWZ.js +0 -130
  844. package/dist/keyword-metrics-LWPE3HHW.js +0 -198
  845. package/dist/keyword-metrics-LWPE3HHW.js.map +0 -1
  846. package/dist/keywords-for-site-5K25VJ35.js +0 -129
  847. package/dist/keywords-for-site-5K25VJ35.js.map +0 -1
  848. package/dist/landing-QONUUP3C.js +0 -28
  849. package/dist/languages-MEFQQBJ2.js +0 -40
  850. package/dist/leads-FSSISJGL.js +0 -113
  851. package/dist/leads-FSSISJGL.js.map +0 -1
  852. package/dist/leads-SZOGCQFK.js +0 -538
  853. package/dist/leads-SZOGCQFK.js.map +0 -1
  854. package/dist/learn-FWWJWBDN.js +0 -205
  855. package/dist/learn-FWWJWBDN.js.map +0 -1
  856. package/dist/line-item-writes-A3UQ44NG.js +0 -209
  857. package/dist/line-item-writes-A3UQ44NG.js.map +0 -1
  858. package/dist/line-items-OH426JGT.js +0 -107
  859. package/dist/link-67E4NVEX.js +0 -65
  860. package/dist/link-67E4NVEX.js.map +0 -1
  861. package/dist/linkedin-CT2OSQ2I.js +0 -1314
  862. package/dist/linkedin-CT2OSQ2I.js.map +0 -1
  863. package/dist/linkedin-person-OSNLPLJJ.js +0 -137
  864. package/dist/linkedin-person-OSNLPLJJ.js.map +0 -1
  865. package/dist/list-J4OUXAKN.js +0 -65
  866. package/dist/list-J4OUXAKN.js.map +0 -1
  867. package/dist/list-L2OQK4W3.js +0 -304
  868. package/dist/list-L2OQK4W3.js.map +0 -1
  869. package/dist/list-LHMDAA2D.js +0 -152
  870. package/dist/list-LHMDAA2D.js.map +0 -1
  871. package/dist/locations-RLWAS6AC.js +0 -40
  872. package/dist/locations-UKBOT6SB.js +0 -67
  873. package/dist/locations-UKBOT6SB.js.map +0 -1
  874. package/dist/log-4EIV54V4.js +0 -93
  875. package/dist/log-4EIV54V4.js.map +0 -1
  876. package/dist/lookup-ZJIP2M4X.js +0 -22
  877. package/dist/make-MFU3CSN7.js +0 -1368
  878. package/dist/make-MFU3CSN7.js.map +0 -1
  879. package/dist/map-VWWWMQLK.js +0 -434
  880. package/dist/map-VWWWMQLK.js.map +0 -1
  881. package/dist/mcp-EKLO2VD7.js +0 -715
  882. package/dist/mcp-EKLO2VD7.js.map +0 -1
  883. package/dist/media-XCTZJIW4.js +0 -89
  884. package/dist/media-ZWN7E777.js +0 -18
  885. package/dist/media-sources-7L622UTF.js +0 -35
  886. package/dist/members-QK5M5NCJ.js +0 -45
  887. package/dist/members-QK5M5NCJ.js.map +0 -1
  888. package/dist/meta-EHKXH257.js +0 -122
  889. package/dist/metrics-K6FDCMK7.js +0 -152
  890. package/dist/normalize-WI4OGKH5.js +0 -142
  891. package/dist/normalize-WI4OGKH5.js.map +0 -1
  892. package/dist/options-FKJ2QXI6.js +0 -123
  893. package/dist/options-FKJ2QXI6.js.map +0 -1
  894. package/dist/organization-7A7MPUDG.js +0 -947
  895. package/dist/organization-7A7MPUDG.js.map +0 -1
  896. package/dist/output-WTEPRUPE.js +0 -24
  897. package/dist/page-photos-HWKQOSCU.js +0 -116
  898. package/dist/page-photos-HWKQOSCU.js.map +0 -1
  899. package/dist/pages-J6AF5NDU.js +0 -67
  900. package/dist/performance-K4VB6L6Z.js +0 -25
  901. package/dist/performance-LHAL53YO.js +0 -5539
  902. package/dist/performance-LHAL53YO.js.map +0 -1
  903. package/dist/pixels-Z7ZGXAGB.js +0 -60
  904. package/dist/pixels-Z7ZGXAGB.js.map +0 -1
  905. package/dist/pixels-ZZTB6NWF.js +0 -109
  906. package/dist/plan-TVQSEKYL.js +0 -207
  907. package/dist/plan-TVQSEKYL.js.map +0 -1
  908. package/dist/preview-CWRGDFCP.js +0 -216
  909. package/dist/preview-CWRGDFCP.js.map +0 -1
  910. package/dist/promoted-tweet-writes-V4ZVJOJU.js +0 -181
  911. package/dist/promoted-tweet-writes-V4ZVJOJU.js.map +0 -1
  912. package/dist/promoted-tweets-KPG4IUVD.js +0 -119
  913. package/dist/properties-RBLJCVSG.js +0 -101
  914. package/dist/publish-Y465CVUD.js +0 -342
  915. package/dist/publish-Y465CVUD.js.map +0 -1
  916. package/dist/query-BJJYUGQZ.js +0 -247
  917. package/dist/query-KQ675KJZ.js +0 -236
  918. package/dist/query-QM7MBQD7.js +0 -62
  919. package/dist/questionnaire-LEZJLMAV.js +0 -93
  920. package/dist/questionnaire-LEZJLMAV.js.map +0 -1
  921. package/dist/read-QME7JYVF.js +0 -141
  922. package/dist/reddit-Z7DOVIGR.js +0 -27
  923. package/dist/refresh-A6TW2Z2F.js +0 -95
  924. package/dist/refresh-A6TW2Z2F.js.map +0 -1
  925. package/dist/release-UFESJ4TM.js +0 -61
  926. package/dist/release-UFESJ4TM.js.map +0 -1
  927. package/dist/relevant-pages-VOICMQ7U.js +0 -99
  928. package/dist/remove-YONNYA4G.js +0 -51
  929. package/dist/remove-YONNYA4G.js.map +0 -1
  930. package/dist/reopen-FYJU2IPO.js +0 -64
  931. package/dist/reopen-FYJU2IPO.js.map +0 -1
  932. package/dist/rerun-B5SBG6ZE.js +0 -93
  933. package/dist/rerun-B5SBG6ZE.js.map +0 -1
  934. package/dist/research-HW4EVOZU.js +0 -72
  935. package/dist/research-OV53DIBX.js +0 -263
  936. package/dist/research-OV53DIBX.js.map +0 -1
  937. package/dist/reset-R4SIQXFH.js +0 -55
  938. package/dist/reset-R4SIQXFH.js.map +0 -1
  939. package/dist/reset-X6ODAKYH.js +0 -55
  940. package/dist/reset-X6ODAKYH.js.map +0 -1
  941. package/dist/resolve-DNRJCLCR.js +0 -122
  942. package/dist/resolve-DNRJCLCR.js.map +0 -1
  943. package/dist/retry-D5MKBHUB.js +0 -63
  944. package/dist/retry-D5MKBHUB.js.map +0 -1
  945. package/dist/retry-DVFLE7JY.js +0 -61
  946. package/dist/retry-DVFLE7JY.js.map +0 -1
  947. package/dist/revenue-QGI6XWSK.js +0 -89
  948. package/dist/revenue-QGI6XWSK.js.map +0 -1
  949. package/dist/rule-writes-S3RN47OG.js +0 -523
  950. package/dist/rule-writes-S3RN47OG.js.map +0 -1
  951. package/dist/rules-KTJ2ZZ62.js +0 -217
  952. package/dist/rules-TR6BAC23.js +0 -97
  953. package/dist/rules-TR6BAC23.js.map +0 -1
  954. package/dist/rules-add-T5ZO5RLR.js +0 -463
  955. package/dist/rules-add-T5ZO5RLR.js.map +0 -1
  956. package/dist/run-WZ5IXWA4.js +0 -67
  957. package/dist/run-WZ5IXWA4.js.map +0 -1
  958. package/dist/run-YRR3KOUU.js +0 -68
  959. package/dist/scaffold-ad-DNUCGCIH.js +0 -1514
  960. package/dist/scaffold-ad-DNUCGCIH.js.map +0 -1
  961. package/dist/scaffold-static-ad-VR65EZAG.js +0 -1013
  962. package/dist/scaffold-static-ad-VR65EZAG.js.map +0 -1
  963. package/dist/scaffold-video-JLMKCCWE.js +0 -886
  964. package/dist/scaffold-video-JLMKCCWE.js.map +0 -1
  965. package/dist/schedule-VRHCVBZA.js +0 -62
  966. package/dist/schedule-VRHCVBZA.js.map +0 -1
  967. package/dist/scheduled-agents-DG7FTCUZ.js +0 -55
  968. package/dist/schema-WZKDWF5N.js +0 -133
  969. package/dist/schema-WZKDWF5N.js.map +0 -1
  970. package/dist/search-MN66QIKJ.js +0 -175
  971. package/dist/search-MN66QIKJ.js.map +0 -1
  972. package/dist/select-IPSM2BF2.js +0 -104
  973. package/dist/select-IPSM2BF2.js.map +0 -1
  974. package/dist/sends-6FI7WELX.js +0 -348
  975. package/dist/sends-6FI7WELX.js.map +0 -1
  976. package/dist/set-prompt-N6BD3DME.js +0 -196
  977. package/dist/set-prompt-N6BD3DME.js.map +0 -1
  978. package/dist/setup-links-GTA2AROS.js +0 -142
  979. package/dist/setup-links-GTA2AROS.js.map +0 -1
  980. package/dist/shared-ZFULUOPQ.js +0 -32
  981. package/dist/shopify-S4TG6WJH.js +0 -3956
  982. package/dist/shopify-S4TG6WJH.js.map +0 -1
  983. package/dist/site-NY622E3H.js +0 -178
  984. package/dist/site-NY622E3H.js.map +0 -1
  985. package/dist/sitemaps-F3HYH5ZP.js +0 -87
  986. package/dist/sites-JSMF72BY.js +0 -101
  987. package/dist/sources-4F2XO7Z6.js +0 -455
  988. package/dist/sources-4F2XO7Z6.js.map +0 -1
  989. package/dist/sources-562ITR77.js +0 -30
  990. package/dist/stale-JKM6MXJF.js +0 -74
  991. package/dist/stale-JKM6MXJF.js.map +0 -1
  992. package/dist/stats-QP4LFQZJ.js +0 -34
  993. package/dist/status-AUWMUDA4.js +0 -63
  994. package/dist/status-AUWMUDA4.js.map +0 -1
  995. package/dist/studies-ZOEUY6YP.js +0 -250
  996. package/dist/study-writes-DTGMCNFP.js +0 -468
  997. package/dist/study-writes-DTGMCNFP.js.map +0 -1
  998. package/dist/sync-76MCGHX4.js +0 -55
  999. package/dist/sync-76MCGHX4.js.map +0 -1
  1000. package/dist/sync-PHH65JFS.js +0 -279
  1001. package/dist/sync-definition-NJPT6ABG.js +0 -67
  1002. package/dist/tag-manager-F7PVTDBB.js +0 -43
  1003. package/dist/tags-5KBOJJ5R.js +0 -26
  1004. package/dist/tags-CSMLTHTU.js +0 -21
  1005. package/dist/tags-CSMLTHTU.js.map +0 -1
  1006. package/dist/tags-IFRZYM3G.js +0 -21
  1007. package/dist/tags-IFRZYM3G.js.map +0 -1
  1008. package/dist/tags-S44ADJ75.js +0 -21
  1009. package/dist/tags-S44ADJ75.js.map +0 -1
  1010. package/dist/tags-WR7IY3OT.js +0 -225
  1011. package/dist/tags-WR7IY3OT.js.map +0 -1
  1012. package/dist/targeting-VBQY3HUN.js +0 -760
  1013. package/dist/targeting-VBQY3HUN.js.map +0 -1
  1014. package/dist/targeting-constants-236ES5HE.js +0 -118
  1015. package/dist/targeting-criteria-FJWNK53T.js +0 -113
  1016. package/dist/targets-2EHMMXD4.js +0 -104
  1017. package/dist/targets-2EHMMXD4.js.map +0 -1
  1018. package/dist/terms-O6ODXEOK.js +0 -102
  1019. package/dist/testimonials-WAPFIGFJ.js +0 -32
  1020. package/dist/themes-B4LCQUXB.js +0 -95
  1021. package/dist/top-companies-DJ2XQKMW.js +0 -109
  1022. package/dist/top-companies-DJ2XQKMW.js.map +0 -1
  1023. package/dist/transcript-J3LGOHCM.js +0 -163
  1024. package/dist/transcript-J3LGOHCM.js.map +0 -1
  1025. package/dist/translate-6RXO4C6Z.js +0 -607
  1026. package/dist/translate-6RXO4C6Z.js.map +0 -1
  1027. package/dist/triggers-CYXPNHQB.js +0 -142
  1028. package/dist/triggers-CYXPNHQB.js.map +0 -1
  1029. package/dist/tweets-IUINLOXF.js +0 -123
  1030. package/dist/unlink-5FJI7XZB.js +0 -68
  1031. package/dist/unlink-5FJI7XZB.js.map +0 -1
  1032. package/dist/unstage-54ZE2SZK.js +0 -86
  1033. package/dist/unstage-54ZE2SZK.js.map +0 -1
  1034. package/dist/unstage-MDSSPUKV.js +0 -95
  1035. package/dist/unstage-MDSSPUKV.js.map +0 -1
  1036. package/dist/update-BVBFNFMO.js +0 -99
  1037. package/dist/update-BVBFNFMO.js.map +0 -1
  1038. package/dist/update-GV3T7ZRC.js +0 -190
  1039. package/dist/update-GV3T7ZRC.js.map +0 -1
  1040. package/dist/update-PUQWUGPJ.js +0 -64
  1041. package/dist/update-PUQWUGPJ.js.map +0 -1
  1042. package/dist/update-YQBK6C3L.js +0 -153
  1043. package/dist/update-YQBK6C3L.js.map +0 -1
  1044. package/dist/upload-PXT5JAEV.js +0 -127
  1045. package/dist/upload-PXT5JAEV.js.map +0 -1
  1046. package/dist/url-options-IHL4OU4C.js +0 -130
  1047. package/dist/url-options-IHL4OU4C.js.map +0 -1
  1048. package/dist/url-params-IYUI6SFJ.js +0 -99
  1049. package/dist/url-params-IYUI6SFJ.js.map +0 -1
  1050. package/dist/validate-AD7F7LQ5.js +0 -120
  1051. package/dist/validate-AD7F7LQ5.js.map +0 -1
  1052. package/dist/videos-ZJCTODEB.js +0 -41
  1053. package/dist/viewer-check-GWZNGWCO.js +0 -81
  1054. package/dist/web-76CWAZNW.js +0 -141
  1055. package/dist/web-76CWAZNW.js.map +0 -1
  1056. package/dist/winning-ads-W7GTXTX7.js +0 -86
  1057. package/dist/write-commands-5J47ZNO4.js +0 -206
  1058. package/dist/write-commands-K6M3RTVK.js +0 -1170
  1059. package/dist/write-commands-K6M3RTVK.js.map +0 -1
  1060. package/dist/write-commands-OTWH6BKZ.js +0 -713
  1061. package/dist/write-commands-VPU53DLB.js +0 -1498
  1062. package/dist/write-commands-VPU53DLB.js.map +0 -1
  1063. package/dist/x-V4NNNWRU.js +0 -47
  1064. /package/dist/{account-ZY655BIU.js.map → account-BA3IO3AN.js.map} +0 -0
  1065. /package/dist/{account-assets-O7IA37RE.js.map → account-assets-T3VVNBUG.js.map} +0 -0
  1066. /package/dist/{account-reads-SNOWDHHF.js.map → account-reads-5CXFLJ5Q.js.map} +0 -0
  1067. /package/dist/{accounts-FT2SRKMD.js.map → accounts-4R3MBNJG.js.map} +0 -0
  1068. /package/dist/{accounts-SNB65ZEW.js.map → accounts-5WF7VE7J.js.map} +0 -0
  1069. /package/dist/{accounts-K5XLEO6W.js.map → accounts-VPWCLF6X.js.map} +0 -0
  1070. /package/dist/{actions-4JYHXRFH.js.map → actions-D7OWCP36.js.map} +0 -0
  1071. /package/dist/{active-entities-3BAPHE4P.js.map → active-entities-WDPW7652.js.map} +0 -0
  1072. /package/dist/{activities-LKLPORDI.js.map → activities-WGPHYSFU.js.map} +0 -0
  1073. /package/dist/{ads-KBE5JXCH.js.map → ads-F7AUJWK7.js.map} +0 -0
  1074. /package/dist/{ads-LXWXOQHX.js.map → ads-OV3SMLKA.js.map} +0 -0
  1075. /package/dist/{adsets-YWBJFPAZ.js.map → adsets-XH2ULWPM.js.map} +0 -0
  1076. /package/dist/{asset-writes-72DEVXGO.js.map → asset-writes-4X3AJQ4Q.js.map} +0 -0
  1077. /package/dist/{audiences-QAH42HIM.js.map → audiences-MBBXWEOI.js.map} +0 -0
  1078. /package/dist/{audiences-34IQKOGS.js.map → audiences-YUG5JLL4.js.map} +0 -0
  1079. /package/dist/{audit-7ED6CUTQ.js.map → audit-WFXS5ELM.js.map} +0 -0
  1080. /package/dist/{avatars-N6W6HUPP.js.map → avatars-WZ2JDMHH.js.map} +0 -0
  1081. /package/dist/{brand-ITWQVZD2.js.map → brand-IZTTBZII.js.map} +0 -0
  1082. /package/dist/{businesses-MGP2YCEU.js.map → businesses-24JNY46Z.js.map} +0 -0
  1083. /package/dist/{campaigns-XZOQ2VTK.js.map → campaigns-KXYGSH27.js.map} +0 -0
  1084. /package/dist/{campaigns-5BIDXYSR.js.map → campaigns-U5FQ2VWL.js.map} +0 -0
  1085. /package/dist/{canvas-SL3RMOY5.js.map → canvas-IQ753Q2O.js.map} +0 -0
  1086. /package/dist/{cards-A7GQVC7B.js.map → cards-NSNAFTEB.js.map} +0 -0
  1087. /package/dist/{changes-36C754R4.js.map → changes-RDWMNSTK.js.map} +0 -0
  1088. /package/dist/{chatgpt-3WFOPURY.js.map → chatgpt-27NEJVGF.js.map} +0 -0
  1089. /package/dist/{chunk-KUY26RCF.js.map → chunk-2F4DELSV.js.map} +0 -0
  1090. /package/dist/{chunk-WF25CCLD.js.map → chunk-2GYCWRF3.js.map} +0 -0
  1091. /package/dist/{chunk-HJKYTNAZ.js.map → chunk-2L7F7KR4.js.map} +0 -0
  1092. /package/dist/{chunk-4GAEB6NK.js.map → chunk-44ZRCSR7.js.map} +0 -0
  1093. /package/dist/{chunk-2TOIY2WN.js.map → chunk-46YLDIQG.js.map} +0 -0
  1094. /package/dist/{chunk-DQ54POZN.js.map → chunk-4EDWXZ3I.js.map} +0 -0
  1095. /package/dist/{chunk-SIXU5PDF.js.map → chunk-4FFBGR5L.js.map} +0 -0
  1096. /package/dist/{chunk-JSNMKTFM.js.map → chunk-4UZUUSVL.js.map} +0 -0
  1097. /package/dist/{chunk-Q6JMMBSQ.js.map → chunk-4XHCEYHI.js.map} +0 -0
  1098. /package/dist/{chunk-ALMYGH5U.js.map → chunk-4Z6PVR3M.js.map} +0 -0
  1099. /package/dist/{chunk-K4FLWDEX.js.map → chunk-5Y5FZV2W.js.map} +0 -0
  1100. /package/dist/{chunk-INUU3752.js.map → chunk-6HJXLGDV.js.map} +0 -0
  1101. /package/dist/{chunk-XE6N4SZI.js.map → chunk-6S5CWGDA.js.map} +0 -0
  1102. /package/dist/{chunk-SXMK5AEJ.js.map → chunk-6VYROVWO.js.map} +0 -0
  1103. /package/dist/{chunk-TTLD66NI.js.map → chunk-AQRXXC6E.js.map} +0 -0
  1104. /package/dist/{chunk-W4D7C74B.js.map → chunk-ARBXT73X.js.map} +0 -0
  1105. /package/dist/{chunk-LAC6YHHX.js.map → chunk-BEZHQIEI.js.map} +0 -0
  1106. /package/dist/{chunk-J3UWMBOP.js.map → chunk-BFURWHVR.js.map} +0 -0
  1107. /package/dist/{chunk-RAQHUMKS.js.map → chunk-EZSPVWLQ.js.map} +0 -0
  1108. /package/dist/{chunk-DM3Q6F5F.js.map → chunk-FCHZ5TNG.js.map} +0 -0
  1109. /package/dist/{chunk-MI4HXE7M.js.map → chunk-FLWDFPXE.js.map} +0 -0
  1110. /package/dist/{chunk-PLBITHV6.js.map → chunk-FQMEX3GX.js.map} +0 -0
  1111. /package/dist/{chunk-FKQK22IX.js.map → chunk-GE3VT3CA.js.map} +0 -0
  1112. /package/dist/{chunk-HMIROUFV.js.map → chunk-HCQJYI6X.js.map} +0 -0
  1113. /package/dist/{chunk-FLK6QHOY.js.map → chunk-HGBJQGO5.js.map} +0 -0
  1114. /package/dist/{chunk-GU5MXV2Y.js.map → chunk-HHVWV5BJ.js.map} +0 -0
  1115. /package/dist/{chunk-HGUYC5K6.js.map → chunk-I3WGTSDY.js.map} +0 -0
  1116. /package/dist/{chunk-MGYC2IRC.js.map → chunk-I7AYMJZA.js.map} +0 -0
  1117. /package/dist/{chunk-7NF73SCB.js.map → chunk-IDSDJHRS.js.map} +0 -0
  1118. /package/dist/{chunk-OBJCNGZL.js.map → chunk-ILPHIYAL.js.map} +0 -0
  1119. /package/dist/{chunk-WR3FR3K3.js.map → chunk-IWKD56AY.js.map} +0 -0
  1120. /package/dist/{chunk-Y7XSDJEA.js.map → chunk-JLAQWMVF.js.map} +0 -0
  1121. /package/dist/{chunk-XUJZO7MZ.js.map → chunk-K6NULQN7.js.map} +0 -0
  1122. /package/dist/{chunk-JI77AKT6.js.map → chunk-L2BRAC2J.js.map} +0 -0
  1123. /package/dist/{chunk-Y67LUJBE.js.map → chunk-LGMI4LSY.js.map} +0 -0
  1124. /package/dist/{chunk-3GAR4AZK.js.map → chunk-LNODLR7W.js.map} +0 -0
  1125. /package/dist/{chunk-5XTGG4PV.js.map → chunk-LQ2BRGMX.js.map} +0 -0
  1126. /package/dist/{chunk-B2POVFR2.js.map → chunk-M7QZSEHF.js.map} +0 -0
  1127. /package/dist/{chunk-OJGYYH6K.js.map → chunk-NB2FU6EZ.js.map} +0 -0
  1128. /package/dist/{chunk-PFTYKINE.js.map → chunk-NFII3MTG.js.map} +0 -0
  1129. /package/dist/{chunk-WQPUX3BA.js.map → chunk-OG47L5GG.js.map} +0 -0
  1130. /package/dist/{chunk-4D46PS6J.js.map → chunk-QIOFOD4K.js.map} +0 -0
  1131. /package/dist/{chunk-6JCX3YLM.js.map → chunk-R2SYF5FC.js.map} +0 -0
  1132. /package/dist/{chunk-JNURZHZJ.js.map → chunk-RTH2I55B.js.map} +0 -0
  1133. /package/dist/{chunk-FFFJBNHA.js.map → chunk-S6VFDNSQ.js.map} +0 -0
  1134. /package/dist/{chunk-ZNRGH4NS.js.map → chunk-SG2TDQEE.js.map} +0 -0
  1135. /package/dist/{chunk-CKQTJ2LV.js.map → chunk-T3P6O2VU.js.map} +0 -0
  1136. /package/dist/{chunk-RCJKABOS.js.map → chunk-TU5LQUJM.js.map} +0 -0
  1137. /package/dist/{chunk-TLQOMWLQ.js.map → chunk-TU7DWSTW.js.map} +0 -0
  1138. /package/dist/{chunk-V5NHJU3M.js.map → chunk-TXDE2QJ3.js.map} +0 -0
  1139. /package/dist/{chunk-TVAIOC77.js.map → chunk-TYXZ2SRW.js.map} +0 -0
  1140. /package/dist/{chunk-C6CBBZBO.js.map → chunk-UDIEKCIR.js.map} +0 -0
  1141. /package/dist/{chunk-KBRJSPIM.js.map → chunk-UQHHGT67.js.map} +0 -0
  1142. /package/dist/{chunk-SA22KXWT.js.map → chunk-USCADMM3.js.map} +0 -0
  1143. /package/dist/{chunk-MJ7RNDD4.js.map → chunk-UUGISMNE.js.map} +0 -0
  1144. /package/dist/{chunk-IQHO2ABF.js.map → chunk-VDPOCAQ2.js.map} +0 -0
  1145. /package/dist/{chunk-AQKRSEBQ.js.map → chunk-VEJ3QX6M.js.map} +0 -0
  1146. /package/dist/{chunk-XDNJC62G.js.map → chunk-VFJB7OG6.js.map} +0 -0
  1147. /package/dist/{chunk-TVTSA4EN.js.map → chunk-VPABGAN4.js.map} +0 -0
  1148. /package/dist/{chunk-DL2UJNJ7.js.map → chunk-VRIPVLE7.js.map} +0 -0
  1149. /package/dist/{chunk-D3KLDIPQ.js.map → chunk-WLESMH4J.js.map} +0 -0
  1150. /package/dist/{chunk-OLBLXJNI.js.map → chunk-YILZR3XI.js.map} +0 -0
  1151. /package/dist/{chunk-JDR3HUEL.js.map → chunk-YJFLXOH4.js.map} +0 -0
  1152. /package/dist/{chunk-BL6RTOK3.js.map → chunk-YWHZYR6S.js.map} +0 -0
  1153. /package/dist/{chunk-XGPU2VDU.js.map → chunk-Z35KUMBW.js.map} +0 -0
  1154. /package/dist/{chunk-GACSA5A6.js.map → chunk-Z7I2ZFXS.js.map} +0 -0
  1155. /package/dist/{config-SMVIY6RW.js.map → config-55WGRLY3.js.map} +0 -0
  1156. /package/dist/{connect-HPQ32KGV.js.map → connect-3YY7MF3I.js.map} +0 -0
  1157. /package/dist/{conversion-upload-command-KTYAY7IG.js.map → conversion-upload-command-VM2P57K6.js.map} +0 -0
  1158. /package/dist/{creatives-RNOL4F4E.js.map → creatives-2DR3QHJW.js.map} +0 -0
  1159. /package/dist/{creatives-JPKA2RHU.js.map → creatives-DUR5Z5AN.js.map} +0 -0
  1160. /package/dist/{currency-R4ORE2U3.js.map → currency-X4KEACEP.js.map} +0 -0
  1161. /package/dist/{custom-conversions-5HJBB5XL.js.map → custom-conversions-OIA5Y2GX.js.map} +0 -0
  1162. /package/dist/{customers-OFZTEXST.js.map → customers-663K2OCP.js.map} +0 -0
  1163. /package/dist/{discover-GSJRZUOC.js.map → discover-2W42JB56.js.map} +0 -0
  1164. /package/dist/{draft-RIR2V6A2.js.map → draft-2ZX73IRO.js.map} +0 -0
  1165. /package/dist/{draft-WYDMLNYA.js.map → draft-CKLIIWXZ.js.map} +0 -0
  1166. /package/dist/{draft-ZCL7FVBH.js.map → draft-L5Q6KEER.js.map} +0 -0
  1167. /package/dist/{draft-DJIYEMZU.js.map → draft-MJRMZGMP.js.map} +0 -0
  1168. /package/dist/{experiment-I5CRLOVN.js.map → experiment-3VRHCQN5.js.map} +0 -0
  1169. /package/dist/{fit-53DGYRFD.js.map → fit-BEFCY2B4.js.map} +0 -0
  1170. /package/dist/{fonts-LFMBUT4R.js.map → fonts-C6XN5667.js.map} +0 -0
  1171. /package/dist/{forecast-4AG5F7YC.js.map → forecast-LYN6ZGQC.js.map} +0 -0
  1172. /package/dist/{funding-5W4LX6DU.js.map → funding-TCEPQXRQ.js.map} +0 -0
  1173. /package/dist/{ga4-BWVCDVIR.js.map → ga4-JE3HS36B.js.map} +0 -0
  1174. /package/dist/{google-NAA4BASO.js.map → google-24FDG4C4.js.map} +0 -0
  1175. /package/dist/{gsc-2MPE4N32.js.map → gsc-RMVOYIM3.js.map} +0 -0
  1176. /package/dist/{ideas-NK3KQHAK.js.map → ideas-M66FU45H.js.map} +0 -0
  1177. /package/dist/{images-2XS3JT7E.js.map → images-MM5OPUKV.js.map} +0 -0
  1178. /package/dist/{ingest-DHXWZZX4.js.map → ingest-KMLYCFF4.js.map} +0 -0
  1179. /package/dist/{intent-NSHW7EJT.js.map → intent-YCQCUCV3.js.map} +0 -0
  1180. /package/dist/{job-DRFCQ27M.js.map → job-SM2OQ2LO.js.map} +0 -0
  1181. /package/dist/{job-create-2EC25Y3J.js.map → job-create-ECZHPVKH.js.map} +0 -0
  1182. /package/dist/{job-status-UNVZRPIA.js.map → job-status-QSYDKIIV.js.map} +0 -0
  1183. /package/dist/{keyword-gap-ITTWKBWZ.js.map → keyword-gap-PUSF7EKY.js.map} +0 -0
  1184. /package/dist/{landing-QONUUP3C.js.map → landing-OZU5RRFV.js.map} +0 -0
  1185. /package/dist/{languages-MEFQQBJ2.js.map → languages-Q5SKO4AM.js.map} +0 -0
  1186. /package/dist/{line-items-OH426JGT.js.map → line-items-2V5FY33R.js.map} +0 -0
  1187. /package/dist/{locations-RLWAS6AC.js.map → locations-VQYREHYI.js.map} +0 -0
  1188. /package/dist/{lookup-ZJIP2M4X.js.map → lookup-MELV3RUL.js.map} +0 -0
  1189. /package/dist/{media-XCTZJIW4.js.map → media-BPI2VE6A.js.map} +0 -0
  1190. /package/dist/{media-ZWN7E777.js.map → media-EEWZZU3P.js.map} +0 -0
  1191. /package/dist/{media-sources-7L622UTF.js.map → media-sources-EQI3U4TC.js.map} +0 -0
  1192. /package/dist/{meta-EHKXH257.js.map → meta-SMJUQP37.js.map} +0 -0
  1193. /package/dist/{metrics-K6FDCMK7.js.map → metrics-EMAP7ESR.js.map} +0 -0
  1194. /package/dist/{output-WTEPRUPE.js.map → output-4QBQEM4C.js.map} +0 -0
  1195. /package/dist/{pages-J6AF5NDU.js.map → pages-DTQWQUKP.js.map} +0 -0
  1196. /package/dist/{performance-K4VB6L6Z.js.map → performance-NIF3CESZ.js.map} +0 -0
  1197. /package/dist/{pixels-ZZTB6NWF.js.map → pixels-2BKADWE6.js.map} +0 -0
  1198. /package/dist/{promoted-tweets-KPG4IUVD.js.map → promoted-tweets-653Q5AC6.js.map} +0 -0
  1199. /package/dist/{properties-RBLJCVSG.js.map → properties-VWKO3AAK.js.map} +0 -0
  1200. /package/dist/{query-QM7MBQD7.js.map → query-CXIOL7WI.js.map} +0 -0
  1201. /package/dist/{query-KQ675KJZ.js.map → query-OOP63DJF.js.map} +0 -0
  1202. /package/dist/{query-BJJYUGQZ.js.map → query-RBZFAIDK.js.map} +0 -0
  1203. /package/dist/{read-QME7JYVF.js.map → read-GOULD7YL.js.map} +0 -0
  1204. /package/dist/{reddit-Z7DOVIGR.js.map → reddit-JIHMAKAQ.js.map} +0 -0
  1205. /package/dist/{relevant-pages-VOICMQ7U.js.map → relevant-pages-FS7GBVXK.js.map} +0 -0
  1206. /package/dist/{research-HW4EVOZU.js.map → research-PNBACCCP.js.map} +0 -0
  1207. /package/dist/{rules-KTJ2ZZ62.js.map → rules-HY7S2YTD.js.map} +0 -0
  1208. /package/dist/{run-YRR3KOUU.js.map → run-QCNRR3CA.js.map} +0 -0
  1209. /package/dist/{scheduled-agents-DG7FTCUZ.js.map → scheduled-agents-OXYAVSIE.js.map} +0 -0
  1210. /package/dist/{shared-ZFULUOPQ.js.map → shared-CGEJI2RB.js.map} +0 -0
  1211. /package/dist/{sitemaps-F3HYH5ZP.js.map → sitemaps-5SP7PVQ6.js.map} +0 -0
  1212. /package/dist/{sites-JSMF72BY.js.map → sites-YZDPHBST.js.map} +0 -0
  1213. /package/dist/{sources-562ITR77.js.map → sources-FLUGHSVP.js.map} +0 -0
  1214. /package/dist/{stats-QP4LFQZJ.js.map → stats-EGGNFTKI.js.map} +0 -0
  1215. /package/dist/{studies-ZOEUY6YP.js.map → studies-6VUUOMZD.js.map} +0 -0
  1216. /package/dist/{sync-PHH65JFS.js.map → sync-SCM6JGJP.js.map} +0 -0
  1217. /package/dist/{sync-definition-NJPT6ABG.js.map → sync-definition-OGQ5XTQE.js.map} +0 -0
  1218. /package/dist/{tag-manager-F7PVTDBB.js.map → tag-manager-REKD4WGU.js.map} +0 -0
  1219. /package/dist/{tags-5KBOJJ5R.js.map → tags-CZTRQNXV.js.map} +0 -0
  1220. /package/dist/{targeting-constants-236ES5HE.js.map → targeting-constants-MRQB4N5I.js.map} +0 -0
  1221. /package/dist/{targeting-criteria-FJWNK53T.js.map → targeting-criteria-HSAESZIR.js.map} +0 -0
  1222. /package/dist/{terms-O6ODXEOK.js.map → terms-D2KAFHKJ.js.map} +0 -0
  1223. /package/dist/{testimonials-WAPFIGFJ.js.map → testimonials-G3OCNPBY.js.map} +0 -0
  1224. /package/dist/{themes-B4LCQUXB.js.map → themes-X56KIX3Z.js.map} +0 -0
  1225. /package/dist/{tweets-IUINLOXF.js.map → tweets-JN6ARKF6.js.map} +0 -0
  1226. /package/dist/{videos-ZJCTODEB.js.map → videos-36AXDUGZ.js.map} +0 -0
  1227. /package/dist/{viewer-check-GWZNGWCO.js.map → viewer-check-6HL4OUQY.js.map} +0 -0
  1228. /package/dist/{winning-ads-W7GTXTX7.js.map → winning-ads-GMM5W2O4.js.map} +0 -0
  1229. /package/dist/{write-commands-OTWH6BKZ.js.map → write-commands-B25W4FP5.js.map} +0 -0
  1230. /package/dist/{write-commands-5J47ZNO4.js.map → write-commands-GNNEUVDW.js.map} +0 -0
  1231. /package/dist/{x-V4NNNWRU.js.map → x-JNR5SO6F.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/landing/critique.ts","../src/engine/landing/lib/constants.ts","../src/engine/landing/lib/copy-questions.ts","../src/engine/copy-tells/detect.ts","../src/engine/landing/lib/rules.ts","../src/engine/landing/lib/copy-judgments.ts","../src/engine/landing/lib/critique.ts","../src/commands/landing/snapshot.ts","../src/commands/landing/source-version.ts"],"sourcesContent":["import { readdir, readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { loadBrandTokens } from \"../../engine/landing/lib/brand-tokens.ts\";\nimport { critiqueLanding, type LandingFinding } from \"../../engine/landing/lib/critique.ts\";\nimport { type AskNouls, rememberedJev } from \"../../engine/lib/remembered-nouls.ts\";\nimport type { ReviewUsage } from \"../../engine/nodes/local/lib/render-review.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { holdUnbilledSpend } from \"../canvas/unbilled-spend.ts\";\nimport { CRITIC_VERSION, critiqueCacheDir, writeCritiqueSnapshot } from \"./snapshot.ts\";\nimport { computeLandingSourceSha, computeLegacyLandingSourceSha, readLandingSources } from \"./source-version.ts\";\n\nregisterSchema({\n command: \"landing.critique\",\n description:\n \"Start here: `baker landing critique my-landing` after building or editing a landing. Design-quality critic (ADVISORY — findings never fail it). Flags the known AI 'slop' tells (gradient text, overused fonts, side-tab borders, cream palettes, broken images…) in code, and reads the copy in any language for buzzwords, AI copy tells and a rival named in a comparison, tiered block/warn/advisory, and records the critique the publish quality gate requires.\",\n args: {\n slug: {\n type: \"string\",\n description:\n \"Landing slug (folder under src/pages/). Pass several, space-separated, to critique them in one call.\",\n required: true,\n },\n full: {\n type: \"boolean\",\n description: \"Also print advisory-tier findings (default: block + warn only)\",\n required: false,\n },\n },\n});\n\n/** One path segment, no traversal, not a `_`-private folder — the slug is the\n * snapshot's filename, so it is parsed here at the boundary. */\nconst SLUG_RE = /^[a-z0-9][a-z0-9._-]*$/i;\n\n/**\n * Every slug the caller asked for, first-seen order, deduped.\n *\n * citty copies EVERY positional onto `_` (not just the ones past the first) and\n * additionally binds the first to `slug`, so `critique a b c` arrives as\n * `slug: \"a\"`, `_: [\"a\", \"b\", \"c\"]`. Deduping is therefore load-bearing, not a\n * nicety — without it the first landing would be critiqued twice.\n *\n * Batching matters because the critic is local and takes milliseconds: the cost\n * of critiquing three landings was three agent round-trips, not three analyses.\n */\nexport function parseCritiqueSlugs(args: { slug?: unknown; _?: unknown }): string[] {\n const rest = Array.isArray(args._) ? args._ : [];\n const all = [args.slug, ...rest].filter((s): s is string => typeof s === \"string\" && s.length > 0);\n return [...new Set(all.map(String))];\n}\n\nfunction fail(code: string, message: string, fix?: Record<string, unknown>): never {\n process.stderr.write(\n `${JSON.stringify({ ok: false, error: { code, message, ...(fix ? { fix } : {}) } }, null, 2)}\\n`,\n );\n process.exit(2);\n}\n\nexport const critiqueCommand = defineCommand({\n meta: {\n name: \"critique\",\n description:\n \"Start here: `baker landing critique <slug>` after building or editing a landing. Design-quality critic (ADVISORY — findings never fail it). Flags the known AI design tells (gradient text, overused fonts, side-tab borders, cream palettes, broken images) and reads the copy in any language for buzzwords, AI copy tells and a rival named in a comparison, tiered block/warn/advisory, respecting the client's brand as the allowlist. Also records the critique that publishing requires — run it before finishing a landing.\",\n },\n args: {\n slug: {\n type: \"positional\",\n required: true,\n description: \"Landing slug (folder under src/pages/). Space-separate several to critique them in one call.\",\n },\n full: { type: \"boolean\", description: \"Also print advisory-tier findings\", default: false },\n },\n async run({ args }) {\n const slugs = parseCritiqueSlugs(args);\n const projectRoot = process.cwd();\n\n for (const slug of slugs) {\n if (!SLUG_RE.test(slug) || slug.includes(\"..\")) {\n fail(\n \"INVALID_SLUG\",\n `\"${slug}\" is not a landing slug — use the folder name directly under src/pages/ (letters, digits, dashes; not a path, not a _-private folder).`,\n { availableSlugs: await listLandingSlugs(projectRoot) },\n );\n }\n if (!(await isDir(path.resolve(projectRoot, \"src\", \"pages\", slug)))) {\n fail(\"NOT_FOUND\", `No landing at src/pages/${slug}/`, {\n availableSlugs: await listLandingSlugs(projectRoot),\n });\n }\n }\n\n // Brand tokens are the same for every landing in the call — read once.\n const spent: ReviewUsage[] = [];\n const onSpend = (u: ReviewUsage) => spent.push(u);\n const brand = await loadBrandTokens(projectRoot, { onSpend });\n const competitors = await readCompetitorNames(projectRoot);\n // The copy rules' answers are kept by sentence, so a re-run scores unchanged copy the same.\n const ask = rememberedJev(path.join(critiqueCacheDir(projectRoot), \".copy-answers.json\"), onSpend);\n const results = await Promise.all(slugs.map((slug) => critiqueOne(projectRoot, slug, brand, competitors, ask)));\n // No run record carries these calls: the next render of this workspace bills them.\n await holdUnbilledSpend(path.join(projectRoot, \"canvas\", \".cache\"), spent).catch(() => undefined);\n\n const landings = results.map(({ slug, report }) => ({\n slug,\n overall: report.overall,\n copyChecked: report.copyChecked,\n counts: report.counts,\n dimensions: report.dimensions,\n findings: report.findings.filter((f) => (args.full ? true : f.severity !== \"advisory\")).map(present),\n }));\n\n const blocked = results.filter((r) => r.report.counts.block > 0).map((r) => r.slug);\n const snapshotFailures = results.filter((r) => r.snapshotFailed).map((r) => r.slug);\n const copyUnchecked = results.filter((r) => !r.report.copyChecked).map((r) => r.slug);\n const hints = [\n blocked.length > 0\n ? `Block-tier tells are held at publish — fix them (${blocked.join(\", \")}). Warn/advisory are guidance. Scores are 0–1 (higher is better).`\n : copyUnchecked.length > 0\n ? \"No block-tier tells in what was checked.\"\n : \"No block-tier tells. Warn/advisory findings are guidance, not gates. Re-run after edits so the publish gate stays fresh.\",\n ...(copyUnchecked.length > 0\n ? [\n `The copy of ${copyUnchecked.join(\", \")} could not be checked just now (rivals named, buzzwords and AI copy tells are unchecked, so none is reported), and this critique was not recorded for publishing. Run \\`baker landing critique ${copyUnchecked.join(\" \")}\\` again before publishing.`,\n ]\n : []),\n ...(snapshotFailures.length > 0\n ? [\n `Could not record the critique snapshot for ${snapshotFailures.join(\", \")} (.cache/ not writable?) — the publish quality gate will still report ${snapshotFailures.length === 1 ? \"this landing\" : \"these landings\"} as un-critiqued.`,\n ]\n : []),\n ];\n\n // One landing keeps the original top-level shape so existing readers (docs,\n // skills, the agent's own habits) are unaffected; `landings` is always there.\n const single = landings.length === 1 ? landings[0] : null;\n\n process.stdout.write(\n `${JSON.stringify(\n {\n ok: true,\n data: { advisory: true, ...(single ?? {}), landings },\n hints,\n },\n null,\n 2,\n )}\\n`,\n );\n // Advisory: findings never fail the command. Blocking is the verify/publish\n // gate's job (it reads the snapshot, not this output).\n },\n});\n\n/** Critique one landing and, when its copy was read, record its freshness snapshot. */\nexport async function critiqueOne(\n projectRoot: string,\n slug: string,\n brand: Awaited<ReturnType<typeof loadBrandTokens>>,\n competitors: string[],\n ask: AskNouls,\n) {\n // `projectRoot` + slug rather than the page's own directory: both of these\n // follow the import graph now, so a landing that renders a section from\n // another page's folder is critiqued on what it actually renders.\n //\n // The legacy sha is recorded alongside for a gate that predates the\n // composition one — see `CritiqueSnapshot`. It reads the landing's own folder\n // and nothing else, so it costs one small walk.\n const [sources, compositionSha, sourceSha] = await Promise.all([\n readLandingSources(projectRoot, slug),\n computeLandingSourceSha(projectRoot, slug),\n computeLegacyLandingSourceSha(path.resolve(projectRoot, \"src\", \"pages\", slug)),\n ]);\n\n const report = await critiqueLanding({ slug, sources, brand, competitors, ask });\n\n // Unread copy records nothing: the gate takes a snapshot hashed to this source\n // as the answer, and copy it never read would publish as clean.\n if (!report.copyChecked) return { slug, report, snapshotFailed: false };\n\n // Record the freshness snapshot the publish gate reads. Best-effort — but a\n // failed write is SAID (as a hint), never swallowed: silence here would send\n // the agent into a loop where critique \"succeeds\" yet the gate keeps failing.\n let snapshotFailed = false;\n try {\n await writeCritiqueSnapshot(projectRoot, {\n slug,\n compositionSha,\n sourceSha,\n criticVersion: CRITIC_VERSION,\n at: new Date().toISOString(),\n blockCount: report.counts.block,\n warnCount: report.counts.warn,\n });\n } catch {\n snapshotFailed = true;\n }\n\n return { slug, report, snapshotFailed };\n}\n\n/**\n * Competitor names from the vault, for the \"named in a comparison\" rule.\n *\n * The entry's `title:`/`name:` frontmatter is the brand as it would be written\n * on the page; the slug is the fallback. Best-effort by design — a client with\n * no `competitors/` collection yet simply gets an empty list and one fewer\n * rule, never an error.\n */\nasync function readCompetitorNames(projectRoot: string): Promise<string[]> {\n const dir = path.join(projectRoot, \"src\", \"content\", \"competitors\");\n let entries: string[];\n try {\n entries = (await readdir(dir)).filter((f) => f.endsWith(\".md\"));\n } catch {\n return [];\n }\n const names: string[] = [];\n for (const entry of entries) {\n names.push(path.basename(entry, \".md\").replace(/[-_]+/g, \" \"));\n try {\n const head = (await readFile(path.join(dir, entry), \"utf8\")).slice(0, 2000);\n const titled = /^\\s*(?:title|name)\\s*:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/im.exec(head);\n if (titled?.[1]) names.push(titled[1].trim());\n } catch {\n // Unreadable entry — the slug already covers it.\n }\n }\n return names;\n}\n\n/** Landing folders under src/pages/ (for error.fix on a wrong slug). */\nasync function listLandingSlugs(projectRoot: string): Promise<string[]> {\n try {\n const entries = await readdir(path.join(projectRoot, \"src\", \"pages\"), { withFileTypes: true });\n return entries\n .filter((e) => e.isDirectory() && !e.name.startsWith(\"_\") && !e.name.startsWith(\".\"))\n .map((e) => e.name)\n .sort();\n } catch {\n return [];\n }\n}\n\nfunction present(f: LandingFinding) {\n return {\n id: f.id,\n severity: f.severity,\n family: f.family,\n where: f.line ? `${f.file}:${f.line}` : f.file,\n snippet: f.snippet,\n note: f.note,\n ...(f.brandDrift ? { brandDrift: true } : {}),\n };\n}\n\nasync function isDir(p: string): Promise<boolean> {\n try {\n return (await stat(p)).isDirectory();\n } catch {\n return false;\n }\n}\n","/**\n * Landing anti-slop detector — constants.\n *\n * Reimplemented (with sense) from impeccable's deterministic detector\n * (Apache-2.0, github.com/pbakaus/impeccable — `cli/engine/shared/constants.mjs`\n * + `cli/engine/engines/regex/detect-text.mjs`). The thresholds and word lists\n * are the load-bearing facts; the code is Baker-native TypeScript and folds into\n * our landing/brand model (BRAND.md is the allowlist — see `brand-tokens.ts`).\n *\n * Everything here is a plain constant so the rules stay pure and testable.\n */\n\n/** Rendered severity of a finding. `block` fails the verify gate; `warn` prints\n * a non-blocking WARNING; `advisory` is taste-level (and where brand-matched\n * values land after the allowlist downgrades them). */\nexport type Severity = \"block\" | \"warn\" | \"advisory\";\n\n/** The design family a rule belongs to — rolled up into the report's dimensions\n * so the score reads like the canvas critic (one 0–1 score per family). */\nexport type Family = \"typography\" | \"color\" | \"borders_depth\" | \"motion\" | \"spacing\" | \"copy\" | \"integrity\";\n\n/**\n * Faces that signal \"a model made this\" — the training-data monoculture. Naming\n * one requires a reason no other face could satisfy; a subject association\n * (books→serif, tech→mono) is never that reason. Suppressed when the client's\n * BRAND.md commits the face (then it's a decision, not a tell).\n *\n * Entries match a declared family exactly OR as a word-boundary prefix (via\n * `isOverusedFont`), so \"crimson\" covers Crimson Text/Pro and \"ibm plex\" covers\n * every IBM Plex cut.\n */\nexport const OVERUSED_FONTS = new Set<string>([\n // Older monoculture (still ubiquitous):\n \"inter\",\n \"roboto\",\n \"open sans\",\n \"lato\",\n \"montserrat\",\n \"arial\",\n \"helvetica\",\n // Newer monoculture (the Anthropic-skill / Vercel / GitHub default wave):\n \"fraunces\",\n \"instrument sans\",\n \"instrument serif\",\n \"geist\",\n \"geist sans\",\n \"geist mono\",\n \"mona sans\",\n \"plus jakarta sans\",\n \"space grotesk\",\n \"space mono\",\n \"recoleta\",\n \"dm sans\",\n \"dm serif display\",\n \"dm serif text\",\n \"outfit\",\n \"syne\",\n \"cormorant\",\n \"playfair display\",\n \"lora\",\n \"crimson\",\n \"newsreader\",\n \"ibm plex\",\n \"ibm plex sans\",\n \"ibm plex serif\",\n]);\n\n/** Exact or word-boundary-prefix match against `OVERUSED_FONTS` (\"crimson\" hits\n * \"crimson text\"; \"inter\" does NOT hit \"interstate\"). */\nexport function isOverusedFont(family: string): boolean {\n if (OVERUSED_FONTS.has(family)) return true;\n for (const entry of OVERUSED_FONTS) if (family.startsWith(`${entry} `)) return true;\n return false;\n}\n\n/** Generic / system tokens that never count as a \"font choice\". */\nexport const GENERIC_FONTS = new Set<string>([\n \"serif\",\n \"sans-serif\",\n \"monospace\",\n \"cursive\",\n \"fantasy\",\n \"system-ui\",\n \"ui-serif\",\n \"ui-sans-serif\",\n \"ui-monospace\",\n \"ui-rounded\",\n \"-apple-system\",\n \"blinkmacsystemfont\",\n \"segoe ui\",\n \"inherit\",\n \"initial\",\n \"unset\",\n \"revert\",\n]);\n\n/** Em-dash overuse: two gates — an absolute floor AND a density (one dash per\n * N chars of body text). A long article with a few dashes never fires. */\nexport const EM_DASH_FLOOR = 8;\nexport const EM_DASH_CHARS_PER_DASH = 500;\n\n/** Tailwind text-size → px, so the flat-hierarchy analyzer sees utility sizing. */\nexport const TAILWIND_TEXT_PX: Record<string, number> = {\n \"text-xs\": 12,\n \"text-sm\": 14,\n \"text-base\": 16,\n \"text-lg\": 18,\n \"text-xl\": 20,\n \"text-2xl\": 24,\n \"text-3xl\": 30,\n \"text-4xl\": 36,\n \"text-5xl\": 48,\n \"text-6xl\": 60,\n \"text-7xl\": 72,\n \"text-8xl\": 96,\n \"text-9xl\": 128,\n};\n\n/**\n * AI copy tells (see `engine/copy-tells/`) promoted into landing findings, with\n * the count each needs before it fires and the severity it carries.\n *\n * The gates are the load-bearing part. Wikipedia's guide — and the `humanizer`\n * skill built on it — is explicit that isolated tells prove nothing and only\n * CLUSTERS are evidence, so almost everything here needs ≥2 occurrences on the\n * page. Two exceptions, in opposite directions:\n * - `chat-artifact` fires at 1. \"Here is an overview… let me know if\" is never\n * legitimate shipped copy; it means the agent pasted its own conversational\n * frame into the page.\n * - `curly-quote` is absent on purpose. macOS, Word, Google Docs and most\n * CMSes auto-curl by default, so it carries no signal on its own and would\n * fire on almost every page a human touched.\n *\n * Nothing here is `block`: these are strong-but-fallible prose tells, and the\n * pre-commit gate only fails on block-tier findings. Copy judgment stays with\n * the agent and the finish reviewer; this layer just makes the tell visible.\n */\nexport const COPY_TELL_GATES: Record<string, { minCount: number; severity: Severity }> = {\n \"chat-artifact\": { minCount: 1, severity: \"warn\" },\n \"rhetorical-opener\": { minCount: 2, severity: \"warn\" },\n \"negation-pivot\": { minCount: 2, severity: \"warn\" },\n \"vague-attribution\": { minCount: 2, severity: \"warn\" },\n \"participle-tail\": { minCount: 2, severity: \"advisory\" },\n \"copula-avoidance\": { minCount: 2, severity: \"advisory\" },\n \"authority-trope\": { minCount: 2, severity: \"advisory\" },\n signposting: { minCount: 2, severity: \"advisory\" },\n \"hollow-conclusion\": { minCount: 2, severity: \"advisory\" },\n \"filler-phrase\": { minCount: 2, severity: \"advisory\" },\n \"aphorism-formula\": { minCount: 2, severity: \"advisory\" },\n \"false-range\": { minCount: 2, severity: \"advisory\" },\n \"staccato-drama\": { minCount: 2, severity: \"advisory\" },\n \"title-case-heading\": { minCount: 2, severity: \"advisory\" },\n \"inline-header-list\": { minCount: 3, severity: \"advisory\" },\n emoji: { minCount: 3, severity: \"advisory\" },\n};\n\n/** The banned purple/indigo hero hex literals from the \"AI palette\" cluster. */\nexport const AI_PURPLE_HEXES = new Set<string>([\n \"#7c3aed\",\n \"#8b5cf6\",\n \"#a855f7\",\n \"#9333ea\",\n \"#7e22ce\",\n \"#6d28d9\",\n \"#6366f1\",\n \"#764ba2\",\n \"#667eea\",\n]);\n\n/** Tailwind background utilities that render the cream/parchment AI ground. */\nexport const CREAM_TAILWIND_BG = new Set<string>([\n \"bg-amber-50\",\n \"bg-amber-100\",\n \"bg-orange-50\",\n \"bg-orange-100\",\n \"bg-yellow-50\",\n \"bg-stone-50\",\n \"bg-stone-100\",\n \"bg-stone-200\",\n]);\n\n/**\n * Per-rule metadata: the family it rolls up into, its default severity, and the\n * one-line fix nudge shown to the agent. Severity is per the plan's placement\n * matrix — unambiguous tells `block`, strong-but-fallible tells `warn`, taste\n * `advisory`. Brand-matched values are downgraded to `advisory` in critique.ts.\n */\nexport const RULE_META: Record<\n string,\n { family: Family; severity: Severity; note: string; brandAware?: \"font\" | \"color\" | \"gradient\" }\n> = {\n \"gradient-text\": {\n family: \"color\",\n severity: \"block\",\n note: \"Gradient text is a top AI tell. Emphasis comes from weight or size, not a clipped gradient fill.\",\n brandAware: \"gradient\",\n },\n \"broken-image\": {\n family: \"integrity\",\n severity: \"block\",\n note: \"An <img> with an empty or placeholder src ships a broken image. Source a real asset via `baker images`.\",\n },\n \"competitor-named-in-comparison\": {\n family: \"integrity\",\n severity: \"warn\",\n note: \"A competitor from the vault is named in a comparative sentence outside a comparison table. Naming a rival on paid traffic sells their brand and is the client's decision, not yours — cite the capability, not the company.\",\n },\n \"side-tab\": {\n family: \"borders_depth\",\n severity: \"warn\",\n note: \"A thick colored border on one edge is the 'side-tab' AI tell. Use full borders, a background, or spacing instead.\",\n },\n \"border-accent-on-rounded\": {\n family: \"borders_depth\",\n severity: \"warn\",\n note: \"A colored top/bottom accent bar on a rounded card is an AI tell. Let the card's own surface carry the accent.\",\n },\n \"overused-font\": {\n family: \"typography\",\n severity: \"warn\",\n brandAware: \"font\",\n note: \"This face is a training-data default. Pick a face with a point of view — unless BRAND.md commits it.\",\n },\n \"single-font\": {\n family: \"typography\",\n severity: \"advisory\",\n note: \"Only one face across the page flattens hierarchy. A display/body pair usually reads richer.\",\n },\n \"flat-type-hierarchy\": {\n family: \"typography\",\n severity: \"warn\",\n note: \"Type steps are too close (<2× span). Widen the scale so the primary, secondary, and body are obvious at a glance.\",\n },\n \"ai-color-palette\": {\n family: \"color\",\n severity: \"warn\",\n brandAware: \"color\",\n note: \"Purple/indigo-on-heading or purple→cyan gradients are the AI palette cluster. Commit to the brand's own hues.\",\n },\n \"cream-palette\": {\n family: \"color\",\n severity: \"warn\",\n brandAware: \"color\",\n note: \"Cream/parchment ground is the 'measured rendition' AI default. Rework from the brand's saturated materials.\",\n },\n \"gray-on-color\": {\n family: \"color\",\n severity: \"warn\",\n note: \"Gray text on a colored surface reads muddy. Tint secondary text from the surface hue, never neutral gray.\",\n },\n \"bounce-easing\": {\n family: \"motion\",\n severity: \"warn\",\n note: \"Bounce/elastic easing feels dated. Use natural deceleration (e.g. cubic-bezier(0.16, 1, 0.3, 1)).\",\n },\n \"layout-transition\": {\n family: \"motion\",\n severity: \"advisory\",\n note: \"Transitioning width/height/padding/margin janks. Animate transform/opacity, or clip-path/max-height with care.\",\n },\n \"monotonous-spacing\": {\n family: \"spacing\",\n severity: \"warn\",\n note: \"One spacing value dominates. Create rhythm — tight groups, generous separation, more space above a heading than below.\",\n },\n \"marketing-buzzword\": {\n family: \"copy\",\n severity: \"warn\",\n note: \"SaaS filler ('supercharge your…') is generic. Name names, use numbers, say the specific thing only this product proves.\",\n },\n \"agent-washing\": {\n family: \"copy\",\n severity: \"warn\",\n note: \"The page claims autonomy but never says what the buyer controls. Name what it does on its own, what waits for approval, and what happens when it's wrong.\",\n },\n \"em-dash-overuse\": {\n family: \"copy\",\n severity: \"warn\",\n note: \"Dense em-dashes are an AI cadence tell (and brand copy bans them). Recast with commas, colons, or full stops.\",\n },\n \"chat-artifact\": {\n family: \"copy\",\n severity: \"warn\",\n note: \"Chatbot framing ('Here is an overview…', 'avísame si') leaked into the page. Delete it and state the claim directly.\",\n },\n \"rhetorical-opener\": {\n family: \"copy\",\n severity: \"warn\",\n note: \"Fake-candid openers ('Honestly?', 'La verdad es que') manufacture intimacy before an ordinary claim. Just say the thing.\",\n },\n \"negation-pivot\": {\n family: \"copy\",\n severity: \"warn\",\n note: \"'It's not just X, it's Y' / 'no se trata solo de' is now a louder AI tell than any single word. Cut the setup, keep the claim.\",\n },\n \"vague-attribution\": {\n family: \"copy\",\n severity: \"warn\",\n note: \"'Experts agree' / 'los estudios demuestran' attributes to nobody. Name the source and the year, or drop the claim.\",\n },\n \"participle-tail\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"Participles hung off a comma (', ensuring…', ', permitiendo…') fake depth. End the sentence, or make it a real clause.\",\n },\n \"copula-avoidance\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"'serves as' / 'cuenta con' dodges plain 'is' and 'has'. Use the simple verb — it reads as confidence, not flatness.\",\n },\n \"authority-trope\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"'At its core' / 'en el fondo' pretends to reach a deeper truth before restating an ordinary point. Make the point once.\",\n },\n signposting: {\n family: \"copy\",\n severity: \"advisory\",\n note: \"Announcing the writing ('Let's dive in', 'vamos a ver') instead of doing it. Delete the announcement, keep the content.\",\n },\n \"hollow-conclusion\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"'The future looks bright' / 'las posibilidades son infinitas' asserts nothing. End on a concrete next step or a number.\",\n },\n \"filler-phrase\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"Filler ('in order to', 'cabe destacar que') costs words and says nothing. Cut to the verb.\",\n },\n \"aphorism-formula\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"'X is the currency of Y' sounds profound without adding precision. Replace it with the concrete claim it gestures at.\",\n },\n \"false-range\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"'From onboarding to retention' pairs ends that aren't on a scale. List what you actually cover.\",\n },\n \"staccato-drama\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"A run of very short sentences manufactures drama. One clipped line lands; three in a row read as engineered.\",\n },\n \"title-case-heading\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"Title Case headings are an AI tell — and in Spanish the convention doesn't exist at all. Use sentence case.\",\n },\n \"inline-header-list\": {\n family: \"copy\",\n severity: \"advisory\",\n note: \"'**Speed:** it is fast' bullets are AI list shape. Write the sentence, or let the bullet carry the content directly.\",\n },\n emoji: {\n family: \"copy\",\n severity: \"advisory\",\n note: \"Emoji-decorated copy is a chatbot habit. Let the words and the layout carry the emphasis.\",\n },\n \"dark-glow\": {\n family: \"borders_depth\",\n severity: \"warn\",\n note: \"A zero-offset colored glow is decoration, not depth. Shadows carry an offset and a soft blur.\",\n },\n marquee: {\n family: \"motion\",\n severity: \"warn\",\n note: \"Auto-scrolling marquees are a dated tell. Let the visitor control the pace, or drop the motion.\",\n },\n};\n\n/** Weight subtracted from a family's 1.0 score per finding, by severity. */\nexport const SEVERITY_WEIGHT: Record<Severity, number> = {\n block: 0.5,\n warn: 0.2,\n advisory: 0.05,\n};\n","/**\n * The landing critique's questions about what the copy SAYS, asked of the decision model (Jev)\n * in whatever language the page is written. They replaced phrase lists in English, Spanish and\n * Portuguese (`BUZZWORDS`, `AUTONOMY_CLAIMS`, `AI_CONTROL_SIGNALS`, `COMPARISON_MARKERS`), which a German or French page walked past and a paraphrase did too.\n * Thresholds were measured on scripts/landing-copy-evals (docs/decision-model.md).\n */\nimport type { NoulQuestion } from \"../../lib/remembered-nouls.ts\";\n\nconst ANY_LANGUAGE = \"The page may be in any language.\";\n\nexport const BUZZWORD_QUESTION = `Does \\`sentence\\` lean on generic marketing buzzwords that could describe any company, such as \"supercharge your workflow\", \"revolutionize\", \"seamless\", \"best-in-class\", \"cutting-edge\", \"unleash the power\", \"lleva tu negocio al siguiente nivel\", instead of saying something specific? ${ANY_LANGUAGE}`;\nexport const BUZZWORD_HELD = 0.8;\n\n/**\n * Naming a rival on paid traffic sells their brand. An integration or a partner named is not a\n * comparison; a comparison table is where one belongs (code exempts it before asking).\n */\nexport function comparisonQuestion(competitor: string): string {\n return `\\`sentence\\` is copy on a company's own sales page, and it names ${JSON.stringify(competitor)}, another company. Does it compare the two (better, worse, versus, cheaper than, an alternative to, switching from)? Naming it as something the product connects to, works with or imports from is not a comparison. ${ANY_LANGUAGE}`;\n}\nexport const COMPARISON_HELD = 0.5;\n\n/** Asked of each sentence: the claim lives in one, and the rest of the page argues with it. */\nexport const AUTONOMY_QUESTION = `Does \\`sentence\\` claim the product does the work by itself, with no person involved: fully autonomous agents, it runs while you sleep, set it and forget it, no human input needed? ${ANY_LANGUAGE}`;\nexport const AUTONOMY_HELD = 0.3;\n\n/**\n * What clears an autonomy claim is oversight of the agent's own actions. Privacy boilerplate rides\n * along in every footer and says nothing about who is in charge; a bare accuracy number is the\n * defect `references/ai-trust.md` names, not the remedy.\n */\nexport const CONTROL_QUESTION = `Does \\`page\\` tell the buyer how they stay in control of what the product does on its own: what waits for their approval, what they review before it happens, what they can override, undo or roll back, an audit log of what ran, or when it escalates to a person? Privacy or security statements (GDPR, encryption, \"your data is safe\") and accuracy figures do not count. ${ANY_LANGUAGE}`;\nexport const CONTROL_HELD = 0.3;\n\nexport function sentenceQuestion(question: string, sentence: string): NoulQuestion {\n return { instructions: { sentence, question } };\n}\n\nexport function pageQuestion(question: string, page: string): NoulQuestion {\n return { instructions: { page, question } };\n}\n","/**\n * AI copy tells — pure detection over a piece of copy.\n *\n * Shared by two real callers with different stakes: `baker landing critique`\n * (rolls findings into the `copy` family and the pre-commit gate) and the\n * `baker ads` staged writes (emit `hints[]`, never block — a false positive that\n * refuses an ad is worse than a tell that ships). So this module reports RAW\n * COUNTS and never decides severity. Thresholds belong to the caller.\n *\n * Every function is pure and total: text in, findings out, never throws.\n *\n * Only the tells that are a shape live here. The ones that read the words (an opener, a pivot,\n * a vague attribution…) are asked of the decision model in any language: `questions.ts`.\n */\n\nimport { type CopyTellId, STACCATO_MAX_WORDS, STACCATO_RUN } from \"./patterns.ts\";\nimport { rawSentences, wordCount } from \"./sentences.ts\";\n\nexport type CopyTell = {\n id: CopyTellId;\n /** How many times the tell fired. Callers gate on this. */\n count: number;\n /** The first match, trimmed for display in a hint or a critique snippet. */\n sample: string;\n};\n\nconst SAMPLE_MAX = 60;\n\nfunction sample(text: string): string {\n const clean = text.replace(/\\s+/g, \" \").trim();\n return clean.length <= SAMPLE_MAX ? clean : `${clean.slice(0, SAMPLE_MAX)}…`;\n}\n\n/** Staccato drama (§31): a run of very short sentences manufacturing weight. */\nfunction countStaccato(text: string): { count: number; first: string } {\n // Headings are labels, not sentences: a run of section titles is not drama.\n const prose = text\n .split(\"\\n\")\n .filter((line) => !/^\\s{0,3}#{1,6}\\s/.test(line))\n .join(\" \");\n const sentences = rawSentences(prose);\n let run = 0;\n let count = 0;\n let first = \"\";\n let runStart = 0;\n for (const [i, s] of sentences.entries()) {\n const words = wordCount(s);\n if (words > 0 && words <= STACCATO_MAX_WORDS) {\n if (run === 0) runStart = i;\n run++;\n if (run === STACCATO_RUN) {\n count++;\n if (!first) first = sentences.slice(runStart, i + 1).join(\" \");\n }\n } else {\n run = 0;\n }\n }\n return { count, first };\n}\n\n/** Title Case in a heading (§17). A stronger tell in Spanish, where the\n * convention does not exist at all. Needs ≥4 words so \"Cómo Funciona\" and\n * proper nouns in a short heading don't fire. */\nfunction countTitleCaseHeadings(text: string): { count: number; first: string } {\n let count = 0;\n let first = \"\";\n for (const m of text.matchAll(/^\\s{0,3}#{1,6}\\s+(.+)$/gm)) {\n const heading = (m[1] ?? \"\").trim();\n const words = heading.split(/\\s+/).filter((w) => /\\p{L}/u.test(w));\n if (words.length < 4) continue;\n const capitalized = words.filter((w) => /^\\p{Lu}/u.test(w)).length;\n if (capitalized / words.length < 0.8) continue;\n count++;\n if (!first) first = heading;\n }\n return { count, first };\n}\n\n/** Inline-header vertical lists (§16): `- **Speed:** it is fast.` */\nfunction countInlineHeaderList(text: string): { count: number; first: string } {\n const matches = [...text.matchAll(/^\\s*(?:[-*+]|\\d+\\.)\\s+\\*\\*[^*\\n]{2,40}:?\\*\\*:?\\s/gm)];\n if (matches.length < 3) return { count: 0, first: \"\" };\n return { count: matches.length, first: (matches[0]?.[0] ?? \"\").trim() };\n}\n\n// Written as an alternation rather than one class: U+FE0F is a combining\n// variation selector, and a class that mixes it with base characters matches\n// the pair as one character, undercounting a page's emoji.\nconst EMOJI = /[\\u{1F300}-\\u{1FAFF}]|[\\u{2600}-\\u{27BF}]|[\\u{1F000}-\\u{1F2FF}]|\\u{FE0F}/gu;\nconst CURLY = /[‘’“”]/g;\n\nfunction countPattern(text: string, re: RegExp): { count: number; first: string } {\n const matches = text.match(re) ?? [];\n return { count: matches.length, first: matches.join(\"\") };\n}\n\n/**\n * The AI copy tells that are a SHAPE of the copy rather than a reading of its words: a run of\n * very short sentences, Title Case in a heading, an inline-header list, curly quotes, emoji. Each\n * holds in any language. The tells that read the words are the decision model's\n * (`questions.ts`). One entry per tell that fired, with a raw count and a sample.\n *\n * `text` should already be plain copy — the landing caller strips markup first.\n */\nexport function structuralCopyTells(text: string): CopyTell[] {\n if (!text.trim()) return [];\n\n const results: Array<[CopyTellId, { count: number; first: string }]> = [\n [\"staccato-drama\", countStaccato(text)],\n [\"title-case-heading\", countTitleCaseHeadings(text)],\n [\"inline-header-list\", countInlineHeaderList(text)],\n [\"curly-quote\", countPattern(text, CURLY)],\n [\"emoji\", countPattern(text, EMOJI)],\n ];\n\n return results\n .filter(([, result]) => result.count > 0)\n .map(([id, result]) => ({ id, count: result.count, sample: sample(result.first) }));\n}\n","/**\n * Landing anti-slop detector — pure detection rules.\n *\n * Reimplemented (with sense) from impeccable's `cli/engine/engines/regex/\n * detect-text.mjs` (Apache-2.0). Two kinds of rule:\n * - line matchers: per-line regex tells (side-tab, gradient-text, fonts…)\n * - analyzers: aggregate tells, each `scope`d \"file\" or \"page\" (see below).\n *\n * SCOPE matters for Baker specifically. A landing here is always componentized —\n * `index.astro` + several small `_components/*.astro` — so a count-threshold tell\n * (a single font, a flat type scale, monotonous spacing, em-dash density) would\n * slip through if measured per small file. Those analyzers are `scope: \"page\"`\n * and run on the concatenated page. The `scope: \"file\"` analyzers are the ones\n * that fire at ≥1 or carry a line number (overused-font, glow), so\n * they stay per file for accurate `file:line` attribution.\n *\n * Every rule is pure and total — it takes source text and returns findings, and\n * never throws. None of them reads what the copy SAYS: that is the decision\n * model's job (`copy-judgments.ts`), over the sentences `landingCopy` returns. Severity/notes come from `RULE_META`; the caller (critique.ts)\n * assembles them and applies the BRAND.md allowlist.\n */\n\nimport { structuralCopyTells } from \"../../copy-tells/detect.ts\";\nimport { copySentences } from \"../../copy-tells/sentences.ts\";\nimport { hasChroma, isCreamColor, isNeutralAuthoredColor, parseColor } from \"./color.ts\";\nimport {\n AI_PURPLE_HEXES,\n COPY_TELL_GATES,\n CREAM_TAILWIND_BG,\n EM_DASH_CHARS_PER_DASH,\n EM_DASH_FLOOR,\n GENERIC_FONTS,\n isOverusedFont,\n TAILWIND_TEXT_PX,\n} from \"./constants.ts\";\n\nexport type RawFinding = { id: string; snippet: string; file: string; line?: number };\n\n/** Regex capture-group accessors that satisfy `noUncheckedIndexedAccess`. */\nconst cap = (m: RegExpMatchArray, i: number): string => m[i] ?? \"\";\nconst num = (m: RegExpMatchArray, i: number): number => Number(m[i] ?? 0);\n\nconst hasRounded = (line: string): boolean => /\\brounded(?:-\\w+)?\\b/.test(line) || /border-radius/i.test(line);\nconst isSafeElement = (line: string): boolean =>\n /<(?:blockquote|nav[\\s>]|pre[\\s>]|code[\\s>]|a\\s|input[\\s>]|span[\\s>])/i.test(line);\n/** A Tailwind border colored with a neutral scale is a hairline, not an accent. */\nconst hasNeutralTailwindBorder = (line: string): boolean =>\n /\\bborder-(?:gray|slate|zinc|neutral|stone|white|black|transparent|current|inherit)\\b|\\bborder-(?:gray|slate|zinc|neutral|stone)-\\d+\\b/.test(\n line,\n );\n\nfunction isNeutralBorderColor(str: string): boolean {\n const m = str.match(/solid\\s+((?:rgba?|hsla?|oklch|oklab|lab|lch|hwb|color)\\([^)]*\\)|#[0-9a-f]{3,8}\\b|[a-z]+)/i);\n if (!m) return false;\n return isNeutralAuthoredColor(m[1] ?? \"\");\n}\n\ntype LineMatcher = {\n id: string;\n regex: RegExp;\n test: (m: RegExpMatchArray, line: string) => boolean;\n fmt: (m: RegExpMatchArray, line: string) => string;\n};\n\nconst LINE_MATCHERS: LineMatcher[] = [\n // ── Side-tab: a thick colored border on one edge ──────────────────────────\n {\n id: \"side-tab\",\n regex: /\\bborder-[lrse]-(\\d+)\\b/g,\n test: (m, line) => {\n if (isSafeElement(line) || hasNeutralTailwindBorder(line)) return false;\n return hasRounded(line) ? num(m, 1) >= 2 : num(m, 1) >= 4;\n },\n fmt: (m) => cap(m, 0),\n },\n {\n id: \"side-tab\",\n regex: /border-(?:left|right)\\s*:\\s*(\\d+)px\\s+solid[^;]*/gi,\n test: (m, line) => {\n if (isSafeElement(line)) return false;\n if (isNeutralBorderColor(cap(m, 0))) return false;\n return hasRounded(line) ? num(m, 1) >= 2 : num(m, 1) >= 3;\n },\n fmt: (m) => cap(m, 0).replace(/\\s*;?\\s*$/, \"\"),\n },\n {\n id: \"side-tab\",\n regex: /border-(?:left|right)-width\\s*:\\s*(\\d+)px/gi,\n test: (m, line) => !isSafeElement(line) && num(m, 1) >= 3,\n fmt: (m) => cap(m, 0),\n },\n {\n id: \"side-tab\",\n regex: /border-inline-(?:start|end)(?:-width)?\\s*:\\s*(\\d+)px/gi,\n test: (m, line) => !isSafeElement(line) && num(m, 1) >= 3,\n fmt: (m) => cap(m, 0),\n },\n // ── Border accent on a rounded card (top/bottom colored bar) ──────────────\n {\n id: \"border-accent-on-rounded\",\n regex: /\\bborder-[tb]-(\\d+)\\b/g,\n test: (m, line) => hasRounded(line) && num(m, 1) >= 1 && !hasNeutralTailwindBorder(line),\n fmt: (m) => cap(m, 0),\n },\n {\n id: \"border-accent-on-rounded\",\n regex: /border-(?:top|bottom)\\s*:\\s*(\\d+)px\\s+solid/gi,\n test: (m, line) => num(m, 1) >= 3 && hasRounded(line),\n fmt: (m) => cap(m, 0),\n },\n // ── Gradient text (Tailwind class form; authored-CSS form is the window\n // analyzer below, so a multi-line rule block is still caught) ──────────────\n {\n id: \"gradient-text\",\n regex: /\\bbg-clip-text\\b/g,\n test: (_m, line) =>\n // v3 `bg-gradient-to-*`, v4 `bg-linear-to-*` / `bg-radial*` / `bg-conic*`,\n // and arbitrary-value `bg-[linear-gradient(…)]` spellings.\n /\\bbg-gradient-to-|\\bbg-linear-to-|\\bbg-(?:radial|conic)\\b|\\bbg-\\[(?:linear|radial|conic)-gradient/i.test(line),\n // The stops ride in the snippet so the brand allowlist can read them.\n fmt: (_m, line) => {\n const stops = line.match(/\\b(?:from|via|to)-\\[[^\\]\\s]+\\]|\\bbg-\\[(?:linear|radial|conic)-gradient[^\\]\\s]*\\]/g);\n return stops ? `bg-clip-text + ${stops.join(\" \")}` : \"bg-clip-text + gradient\";\n },\n },\n // ── Gray text on a colored background (Tailwind). Shade ≥ 300 only: a pale\n // tint panel (bg-blue-50 info box) is a normal light ground, not \"on color\". ──\n {\n id: \"gray-on-color\",\n regex: /\\btext-(?:gray|slate|zinc|neutral|stone)-(\\d+)\\b/g,\n test: (_m, line) => {\n const bg = line.match(\n /\\bbg-(?:red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(\\d+)\\b/,\n );\n return bg !== null && Number(bg[1] ?? 0) >= 300;\n },\n fmt: (m, line) => {\n const bg = line.match(\n /\\bbg-(?:red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-\\d+\\b/,\n );\n return `${cap(m, 0)} on ${bg?.[0] || \"?\"}`;\n },\n },\n // ── AI color palette (Tailwind purple/indigo + banned hero hexes) ─────────\n {\n id: \"ai-color-palette\",\n regex: /\\btext-(?:purple|violet|indigo)-(\\d+)\\b/g,\n test: (_m, line) => /\\btext-(?:[2-9]xl)\\b|<h[1-3]/i.test(line),\n fmt: (m) => `${cap(m, 0)} on heading`,\n },\n {\n id: \"ai-color-palette\",\n regex: /\\bfrom-(?:purple|violet|indigo)-(\\d+)\\b/g,\n test: (_m, line) => /\\bto-(?:purple|violet|indigo|blue|cyan|pink|fuchsia)-\\d+\\b/.test(line),\n fmt: (m) => `${cap(m, 0)} gradient`,\n },\n {\n id: \"ai-color-palette\",\n regex: /#[0-9a-f]{6}\\b/gi,\n test: (m) => AI_PURPLE_HEXES.has(cap(m, 0).toLowerCase()),\n fmt: (m) => `${cap(m, 0)} (AI-cluster purple)`,\n },\n // ── Cream/parchment ground (Tailwind + authored background hex) ───────────\n {\n id: \"cream-palette\",\n regex: /\\bbg-(?:amber|orange|yellow|stone)-(?:50|100|200)\\b/g,\n test: (m) => CREAM_TAILWIND_BG.has(cap(m, 0)),\n fmt: (m) => `${cap(m, 0)} (cream ground)`,\n },\n {\n id: \"cream-palette\",\n regex: /background(?:-color)?\\s*:\\s*(#[0-9a-f]{6}\\b|rgba?\\([^)]+\\))/gi,\n test: (m) => {\n const c = parseColor(cap(m, 1));\n return c !== null && isCreamColor(c);\n },\n fmt: (m) => `${cap(m, 1)} (cream ground)`,\n },\n // ── Bounce / elastic easing ───────────────────────────────────────────────\n {\n id: \"bounce-easing\",\n regex: /\\banimate-bounce\\b/g,\n test: () => true,\n fmt: () => \"animate-bounce (Tailwind)\",\n },\n {\n id: \"bounce-easing\",\n regex: /animation(?:-name)?\\s*:\\s*([^;{}]*(?:bounce|elastic|wobble|jiggle|spring)[^;{}]*)/gi,\n test: () => true,\n fmt: (m) => `animation: ${cap(m, 1).trim()}`,\n },\n {\n id: \"bounce-easing\",\n regex: /cubic-bezier\\(\\s*([\\d.-]+)\\s*,\\s*([\\d.-]+)\\s*,\\s*([\\d.-]+)\\s*,\\s*([\\d.-]+)\\s*\\)/g,\n test: (m) => {\n const y1 = Number.parseFloat(cap(m, 2));\n const y2 = Number.parseFloat(cap(m, 4));\n return y1 < -0.1 || y1 > 1.1 || y2 < -0.1 || y2 > 1.1;\n },\n fmt: (m) => `cubic-bezier(${cap(m, 1)}, ${cap(m, 2)}, ${cap(m, 3)}, ${cap(m, 4)})`,\n },\n // ── Transitioning layout properties (jank) ────────────────────────────────\n {\n id: \"layout-transition\",\n // The lookahead skips Astro's view-transition directives (transition:name=,\n // transition:animate=, transition:persist) — markup idiom, not CSS.\n regex: /transition(?:-property)?\\s*:\\s*(?!name\\s*=|animate\\s*=|persist\\b)([^;{}]+)/gi,\n test: (m) => {\n const val = cap(m, 1).toLowerCase();\n if (/\\ball\\b/.test(val)) return false;\n return /\\b(?:(?:max|min)-)?(?:width|height)\\b|\\bpadding\\b|\\bmargin\\b/.test(val);\n },\n fmt: (m) => {\n const found = cap(m, 1).match(\n /\\b(?:(?:max|min)-)?(?:width|height)\\b|\\bpadding(?:-(?:top|right|bottom|left))?\\b|\\bmargin(?:-(?:top|right|bottom|left))?\\b/gi,\n );\n return `transition: ${found ? found.join(\", \") : cap(m, 1).trim()}`;\n },\n },\n // ── Broken image ──────────────────────────────────────────────────────────\n {\n id: \"broken-image\",\n regex: /<img\\b[^>]*?\\bsrc\\s*=\\s*(?:\"\"|''|\"\\s+\"|'\\s+'|\"#\"|'#')/gi,\n test: () => true,\n fmt: (m) => cap(m, 0).slice(0, 100),\n },\n {\n id: \"broken-image\",\n regex: /<img\\b(?:(?!\\bsrc\\s*=)[^>])*>/gi,\n test: (m) => !/\\bsrc\\s*=/i.test(cap(m, 0)),\n fmt: (m) => cap(m, 0).slice(0, 100),\n },\n];\n\n/**\n * Lowercase and strip diacritics, so one pattern covers \"más\" and \"mas\",\n * \"não\" and \"nao\". Length is preserved (NFD marks are dropped, not the letters\n * they sit on), which keeps match offsets usable for line attribution.\n */\nfunction foldForCopy(text: string): string {\n return text\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\");\n}\n\n/** Strip tags/script/style/comments so copy analyzers don't read code. */\nfunction stripHtmlToText(html: string): string {\n return html\n .replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, \" \")\n .replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, \" \")\n .replace(/<!--[\\s\\S]*?-->/g, \" \")\n .replace(/<[^>]+>/g, \" \")\n .replace(/\\s+/g, \" \");\n}\n\n/**\n * Like `stripHtmlToText`, but rewrites `<h1>…<h6>` as markdown headings and\n * keeps block boundaries as newlines. The shared copy-tell detector reads\n * headings in markdown shape (it also serves markdown surfaces), and heading\n * *form* carries two tells — Title Case and, in Spanish, capitalization that\n * the language has no convention for. Flattening the page to one line the way\n * `stripHtmlToText` does would erase both, and would also let a run of short\n * sentences across three sections read as one staccato passage.\n */\nfunction stripHtmlPreservingHeadings(html: string): string {\n return html\n .replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, \" \")\n .replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, \" \")\n .replace(/<!--[\\s\\S]*?-->/g, \" \")\n .replace(\n /<h([1-6])\\b[^>]*>([\\s\\S]*?)<\\/h\\1>/gi,\n (_all, _lvl, inner) =>\n `\\n## ${String(inner)\n .replace(/<[^>]+>/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()}\\n`,\n )\n .replace(/<\\/(?:p|div|section|li|tr|br)>|<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<[^>]+>/g, \" \")\n .replace(/[ \\t]+/g, \" \")\n .replace(/\\n{3,}/g, \"\\n\\n\");\n}\n\n/**\n * Does this string literal read as copy a visitor will see, rather than code?\n *\n * The bar is deliberately high. A false negative costs one missed tell; a false\n * positive puts an import path or a Tailwind class list in front of every copy\n * rule on the page, and those rules are what the publish gate reads.\n */\nfunction isProseLiteral(value: string): boolean {\n const text = value.trim();\n if (text.length < 12) return false;\n if (/^(?:https?:\\/\\/|\\/|\\.{1,2}\\/|#|@|[a-z]+:)/i.test(text)) return false;\n if (!/\\p{L}/u.test(text)) return false;\n const words = text.split(/\\s+/).filter(Boolean);\n if (words.length < 4) return false;\n // A utility-class list is 4+ \"words\" of pure lowercase tokens carrying dashes\n // or variant colons — the one non-prose shape that reliably clears the word\n // count (\"flex items-center gap-4 rounded-lg border border-slate-200 px-6\").\n const classy = words.filter((w) => /^-?[a-z][a-z0-9]*(?:[-.:/][a-z0-9.[\\]%-]+)+$/.test(w)).length;\n if (classy >= 3 && classy / words.length > 0.5) return false;\n return true;\n}\n\n/**\n * Blank an Astro frontmatter block (leading `---` … `---`) so rules never read\n * component JS — imports, props, config — while KEEPING the string literals\n * that hold visible copy. Every character is replaced by a space rather than\n * removed, so `file:line` attribution and `indexOf` offsets stay exact against\n * the original source. The `---` fences are blanked too: they'd otherwise count\n * as em-dashes.\n *\n * The rewrite walks CODE UNITS (`split(\"\")`), not code points: `stringLiterals`\n * indexes with `source[i]`, so a spread by code point would collapse each emoji\n * to one slot and slide every offset past it — silently shifting the line of\n * every finding in the file, this rule's and the others'. Feature-card icons\n * are exactly where that emoji lives.\n *\n * Keeping the prose is not a refinement, it is the point. Astro components hold\n * FAQ pairs, testimonial quotes, feature cards and pricing rows as a\n * `const items = [{ q, a }]` array in the frontmatter and render them in a\n * `.map()`, so blanking the block wholesale hid a large share of every\n * landing's actual copy from the critic. It shipped an FAQ answer conceding a\n * competitor was better, dense with em-dashes, past a clean run.\n */\nfunction blankAstroFrontmatter(text: string): string {\n const cut = frontmatterLength(text);\n if (cut === 0) return text;\n const head = text.slice(0, cut);\n const kept: string[] = head.split(\"\").map((ch) => (ch === \"\\n\" ? \"\\n\" : \" \"));\n for (const literal of stringLiterals(head)) {\n if (!isProseLiteral(literal.value)) continue;\n for (let i = 0; i < literal.value.length; i++) {\n const at = literal.start + i;\n if (head[at] !== \"\\n\") kept[at] = head[at] ?? \" \";\n }\n }\n return kept.join(\"\") + text.slice(cut);\n}\n\n/**\n * An `.astro` source with everything a visitor never sees blanked out — the\n * frontmatter's component JS (minus its prose literals) and every template\n * comment. Every character is replaced by a space rather than removed, so\n * `file:line` attribution stays exact. This is what every rule reads.\n */\nfunction blankUnrenderedSource(text: string): string {\n return blankTemplateComments(blankAstroFrontmatter(text));\n}\n\n/**\n * Blank Astro expression comments (`{/* … *\\/}`) and HTML comments\n * (`<!-- … -->`), preserving length and newlines.\n *\n * A comment is commentary about the markup, not markup, and no rule may read\n * one. The cost of that being false was a fleet-wide publish block: the shared\n * `Video.astro` wrapper explains its `preconnect` in prose that spells `<img>`\n * twice, the block-tier `broken-image` rule matched the prose, and every landing\n * rendering a video failed the publish gate — on a scaffold-protected file the\n * client's agent is forbidden to edit, so there was no fix from inside the\n * sandbox. Comment prose is also where a component's reasoning lives, em-dashes\n * and buzzwords and hexes included, so leaving it readable inflates every\n * count-threshold tell on top of that.\n *\n * The `{…}` fences are blanked with the comment: a bare `{` left behind would\n * read as an expression opening, and the `*\\/` would count as punctuation copy.\n * Walks CODE UNITS, like `blankAstroFrontmatter`, for the same reason — a spread\n * by code point collapses an emoji to one slot and slides every later offset.\n */\nfunction blankTemplateComments(text: string): string {\n const out = text.split(\"\");\n const pattern = /\\{\\s*\\/\\*[\\s\\S]*?\\*\\/\\s*\\}|<!--[\\s\\S]*?-->/g;\n for (const m of text.matchAll(pattern)) {\n const start = m.index ?? 0;\n for (let i = start; i < start + m[0].length && i < out.length; i++) {\n if (out[i] !== \"\\n\") out[i] = \" \";\n }\n }\n return out.join(\"\");\n}\n\n/** Characters covered by a leading `---` … `---` block, or 0 when there is none. */\nfunction frontmatterLength(text: string): number {\n if (!text.startsWith(\"---\")) return 0;\n const lines = text.split(\"\\n\");\n if (!/^---\\s*$/.test(lines[0] ?? \"\")) return 0;\n const end = lines.findIndex((line, i) => i > 0 && /^---\\s*$/.test(line));\n return end === -1 ? 0 : lines.slice(0, end + 1).join(\"\\n\").length;\n}\n\n/**\n * String literals in a block of component JS, skipping comments so a `//` line\n * mentioning a quote cannot open one. Returns the literal body and where it\n * starts in the input, which is what keeps offsets exact.\n */\nfunction stringLiterals(source: string): Array<{ start: number; value: string }> {\n const out: Array<{ start: number; value: string }> = [];\n for (let i = 0; i < source.length; i++) {\n const commentEnd = skipComment(source, i);\n if (commentEnd !== -1) {\n i = commentEnd;\n continue;\n }\n const quote = source[i];\n if (quote !== '\"' && quote !== \"'\" && quote !== \"`\") continue;\n const close = closingQuote(source, i + 1, quote);\n if (close === -1) break;\n out.push({ start: i + 1, value: source.slice(i + 1, close) });\n i = close;\n }\n return out;\n}\n\n/** Index of the last character of a comment opening at `i`, or -1 if none does.\n * An unterminated block comment consumes the rest of the source. */\nfunction skipComment(source: string, i: number): number {\n if (source[i] !== \"/\") return -1;\n if (source[i + 1] === \"/\") {\n const nl = source.indexOf(\"\\n\", i);\n return nl === -1 ? source.length : nl;\n }\n if (source[i + 1] === \"*\") {\n const close = source.indexOf(\"*/\", i + 2);\n return close === -1 ? source.length : close + 1;\n }\n return -1;\n}\n\n/** Index of the quote closing a literal that opened at `from`, honoring\n * backslash escapes; -1 when the literal never closes. */\nfunction closingQuote(source: string, from: number, quote: string): number {\n for (let j = from; j < source.length; j++) {\n if (source[j] === \"\\\\\") {\n j++;\n continue;\n }\n if (source[j] === quote) return j;\n }\n return -1;\n}\n\ntype Analyzer = {\n /** \"file\" → run per source file (line-attributed / ≥1-count tells). \"page\" →\n * run once on the concatenated page (count-threshold tells a componentized\n * landing would otherwise dodge). */\n scope: \"file\" | \"page\";\n run: (text: string, file: string) => RawFinding[];\n};\n\nconst ANALYZERS: Analyzer[] = [\n // Overused primary font (font-family declarations + Google Fonts URLs). Fires\n // at ≥1 and carries a line number → per file.\n {\n scope: \"file\",\n run: (text, file) => {\n const out: RawFinding[] = [];\n const seen = new Set<string>();\n for (const m of text.matchAll(/font-family\\s*:\\s*([^;}{]+)/gi)) {\n const first = firstFamily(cap(m, 1));\n if (first && !GENERIC_FONTS.has(first) && isOverusedFont(first) && !seen.has(first)) {\n seen.add(first);\n out.push({ id: \"overused-font\", snippet: `font-family: ${first}`, file, line: lineOf(text, m.index ?? 0) });\n }\n }\n for (const m of text.matchAll(/fonts\\.googleapis\\.com\\/css2?\\?[^\"'\\s)<>]*/gi)) {\n for (const fam of googleFontFamilies(cap(m, 0))) {\n if (isOverusedFont(fam) && !seen.has(fam)) {\n seen.add(fam);\n out.push({ id: \"overused-font\", snippet: `Google Fonts: ${fam}`, file, line: lineOf(text, m.index ?? 0) });\n }\n }\n }\n return out;\n },\n },\n // Single font across a substantial page — needs the whole page's font set.\n // Counts only the FIRST family of each stack (like overused-font): fallbacks\n // aren't choices, so `'Inter', 'Helvetica Neue'` everywhere is still one font.\n {\n scope: \"page\",\n run: (text, file) => {\n const fonts = new Set<string>();\n for (const m of text.matchAll(/font-family\\s*:\\s*([^;}{]+)/gi)) {\n const first = firstFamily(cap(m, 1));\n if (first && !GENERIC_FONTS.has(first)) fonts.add(first);\n }\n for (const f of allGoogleFontFamilies(text)) fonts.add(f);\n if (fonts.size !== 1 || text.split(\"\\n\").length < 20) return [];\n const only = [...fonts][0] ?? \"\";\n return [{ id: \"single-font\", snippet: `only font used across the page is ${only}`, file }];\n },\n },\n // Flat type hierarchy (all sizes span <2×) — needs every size on the page.\n {\n scope: \"page\",\n run: (text, file) => {\n const sizes = new Set<number>();\n const REM = 16;\n for (const m of text.matchAll(/font-size\\s*:\\s*([\\d.]+)(px|rem|em)\\b/gi)) {\n const px = cap(m, 2) === \"px\" ? num(m, 1) : num(m, 1) * REM;\n if (px > 0 && px < 200) sizes.add(Math.round(px * 10) / 10);\n }\n for (const [cls, px] of Object.entries(TAILWIND_TEXT_PX)) {\n if (new RegExp(`\\\\b${cls}\\\\b`).test(text)) sizes.add(px);\n }\n if (sizes.size < 3) return [];\n const sorted = [...sizes].sort((a, b) => a - b);\n const min = sorted[0] ?? 1;\n const max = sorted[sorted.length - 1] ?? 1;\n const ratio = max / min;\n if (ratio >= 2.0) return [];\n return [\n {\n id: \"flat-type-hierarchy\",\n snippet: `sizes ${sorted.map((s) => `${s}px`).join(\", \")} (ratio ${ratio.toFixed(1)}:1)`,\n file,\n },\n ];\n },\n },\n // Monotonous spacing (one value dominates) — needs every spacing value.\n {\n scope: \"page\",\n run: (text, file) => {\n const rounded = collectSpacingPx(text).map((v) => Math.round(v / 4) * 4);\n if (rounded.length < 10) return [];\n const counts: Record<number, number> = {};\n for (const v of rounded) counts[v] = (counts[v] || 0) + 1;\n const maxCount = Math.max(...Object.values(counts));\n const pct = maxCount / rounded.length;\n const unique = [...new Set(rounded)].filter((v) => v > 0);\n if (pct <= 0.6 || unique.length > 3) return [];\n const dominant = Object.entries(counts).sort((a, b) => b[1] - a[1])[0]?.[0] ?? \"?\";\n return [\n {\n id: \"monotonous-spacing\",\n snippet: `~${dominant}px used ${maxCount}/${rounded.length} times (${Math.round(pct * 100)}%)`,\n file,\n },\n ];\n },\n },\n // Em-dash overuse (density-gated) — density is measured over the page's copy.\n {\n scope: \"page\",\n run: (text, file) => {\n const body = stripHtmlToText(text).replace(/&mdash;|&#0*8212;|&#x0*2014;/gi, \"—\");\n // `(?<!-)--(?!-)` refuses `---` runs (frontmatter fences, hr markers) so\n // only a writer's double-hyphen counts as an em-dash stand-in.\n const count = (body.match(/[—]|(?<!-)--(?!-)(?=\\S)/g) ?? []).length;\n if (count < EM_DASH_FLOOR) return [];\n if (body.length > count * EM_DASH_CHARS_PER_DASH) return [];\n return [{ id: \"em-dash-overuse\", snippet: `${count} em-dashes in body copy`, file }];\n },\n },\n // The AI copy tells that are a shape, not a reading (engine/copy-tells):\n // the ones that read the words are asked of the decision model in\n // `copy-judgments.ts`. Page-scope: every gate here is a count threshold, and\n // a landing is always split across small components, so measuring per file\n // would dilute a page-wide habit into nothing.\n {\n scope: \"page\",\n run: (text, file) => {\n const body = stripHtmlPreservingHeadings(text);\n const out: RawFinding[] = [];\n for (const tell of structuralCopyTells(body)) {\n const gate = COPY_TELL_GATES[tell.id];\n if (!gate || tell.count < gate.minCount) continue;\n out.push({ id: tell.id, snippet: `${tell.count}× — \"${tell.sample}\"`, file });\n }\n return out;\n },\n },\n // Gradient text in authored CSS. A rule block spans lines, so this scans a\n // ±6-line window around each `background-clip: text` instead of one line\n // (the Tailwind class form stays a line matcher above).\n {\n scope: \"file\",\n run: (text, file) => {\n const out: RawFinding[] = [];\n const lines = text.split(\"\\n\");\n for (const m of text.matchAll(/(?:-webkit-)?background-clip\\s*:\\s*text/gi)) {\n const line = lineOf(text, m.index ?? 0);\n const window = lines.slice(Math.max(0, line - 7), Math.min(lines.length, line + 6)).join(\"\\n\");\n const gradient = window.match(/(?:repeating-)?(?:linear|radial|conic)-gradient\\((?:[^()]|\\([^()]*\\))*\\)/i);\n if (gradient) {\n out.push({ id: \"gradient-text\", snippet: `background-clip: text + ${gradient[0]}`, file, line });\n }\n }\n return out;\n },\n },\n // Dark glow: a zero-offset chromatic shadow used as decoration. Line-attributed\n // → per file.\n {\n scope: \"file\",\n run: (text, file) => {\n const out: RawFinding[] = [];\n for (const m of text.matchAll(/(?:box|text)-shadow\\s*:\\s*([^;{}]+)/gi)) {\n if (shadowIsGlow(cap(m, 1))) {\n out.push({\n id: \"dark-glow\",\n snippet: `shadow: ${cap(m, 1).trim().slice(0, 60)}`,\n file,\n line: lineOf(text, m.index ?? 0),\n });\n }\n }\n return out;\n },\n },\n // Marquee (<marquee> element). Fires at ≥1 → per file.\n {\n scope: \"file\",\n run: (text, file) => (/<marquee\\b/i.test(text) ? [{ id: \"marquee\", snippet: \"<marquee> element\", file }] : []),\n },\n];\n\n/** Authored spacing values in px — CSS px/rem declarations plus Tailwind\n * utilities (incl. gap-x/y, space-x/y, and decimals like p-1.5). Zero values\n * are resets, not spacing choices, so they never count. */\nfunction collectSpacingPx(text: string): number[] {\n const vals: number[] = [];\n const push = (v: number) => {\n if (v > 0 && v < 200) vals.push(v);\n };\n for (const m of text.matchAll(/(?:padding|margin)(?:-(?:top|right|bottom|left))?\\s*:\\s*(\\d+)px/gi)) push(num(m, 1));\n for (const m of text.matchAll(/(?:padding|margin)(?:-(?:top|right|bottom|left))?\\s*:\\s*([\\d.]+)rem/gi))\n push(Math.round(Number.parseFloat(cap(m, 1)) * 16));\n for (const m of text.matchAll(/\\b(?:p|px|py|pt|pb|pl|pr|m|mx|my|mt|mb|ml|mr|gap(?:-[xy])?|space-[xy])-([\\d.]+)\\b/g))\n push(Number.parseFloat(cap(m, 1)) * 4);\n return vals;\n}\n\n/** Zero-offset chromatic blur = a decorative halo, not depth. */\nfunction shadowIsGlow(value: string): boolean {\n const first = (value.split(/,(?![^(]*\\))/)[0] ?? \"\").trim();\n const colorMatch = first.match(/#[0-9a-f]{3,8}\\b|rgba?\\([^)]+\\)|hsla?\\([^)]+\\)/i);\n if (!colorMatch) return false;\n // Strip the color before reading offsets so its digits aren't parsed as lengths.\n const lengthsPart = first.replace(colorMatch[0], \" \").replace(/\\binset\\b/gi, \" \");\n const offsets = lengthsPart.match(/-?\\d*\\.?\\d+(?:px|rem|em)?/g);\n if (!offsets || offsets.length < 3) return false;\n const x = Number.parseFloat(offsets[0] ?? \"0\");\n const y = Number.parseFloat(offsets[1] ?? \"0\");\n const blur = Number.parseFloat(offsets[2] ?? \"0\");\n if (!(x === 0 && y === 0 && blur > 4)) return false;\n const c = parseColor(colorMatch[0]);\n return c !== null && hasChroma(c, 30);\n}\n\nfunction firstFamily(decl: string): string {\n return (decl.split(\",\")[0] ?? \"\")\n .trim()\n .replace(/^['\"]|['\"]$/g, \"\")\n .toLowerCase();\n}\n\nfunction googleFontFamilies(url: string): string[] {\n const q = url.indexOf(\"?\");\n if (q === -1) return [];\n const params = new URLSearchParams(url.slice(q + 1).replace(/&amp;/g, \"&\"));\n const out: string[] = [];\n for (const value of params.getAll(\"family\")) {\n for (const part of value.split(\"|\")) out.push((part.split(\":\")[0] ?? \"\").trim().toLowerCase());\n }\n return out.filter(Boolean);\n}\n\nfunction allGoogleFontFamilies(text: string): string[] {\n const out: string[] = [];\n for (const m of text.matchAll(/fonts\\.googleapis\\.com\\/css2?\\?[^\"'\\s)<>]*/gi))\n out.push(...googleFontFamilies(cap(m, 0)));\n return out;\n}\n\nfunction lineOf(text: string, index: number): number {\n let line = 1;\n for (let i = 0; i < index && i < text.length; i++) if (text[i] === \"\\n\") line++;\n return line;\n}\n\n/** Character ranges covered by a `<table>` — where a comparison belongs, and\n * where naming a competitor is the section doing its job. */\nfunction tableRanges(text: string): Array<[number, number]> {\n const out: Array<[number, number]> = [];\n for (const m of text.matchAll(/<table\\b[\\s\\S]*?<\\/table>/gi)) {\n const start = m.index ?? 0;\n out.push([start, start + m[0].length]);\n }\n return out;\n}\n\n/**\n * One entry per competitor, however many spellings the vault yields — it gives\n * both the file slug and the entry's `title:`, and a single mention reporting\n * twice reads as two defects. The capitalized spelling wins, being the one that\n * would appear on a page. Names under 4 characters are dropped: too short to\n * match a brand without catching ordinary words.\n */\nfunction distinctCompetitorNames(competitors: string[]): string[] {\n const byFold = new Map<string, string>();\n for (const raw of competitors) {\n if (typeof raw !== \"string\") continue;\n const name = raw.trim();\n if (name.length < 4) continue;\n const key = foldForCopy(name);\n if (!byFold.has(key) || /\\p{Lu}/u.test(name)) byFold.set(key, name);\n }\n return [...byFold.values()];\n}\n\n/** Elements that only style a run of words: everything else ends a block of copy. */\nconst INLINE_TAGS =\n /^<\\/?(?:a|abbr|b|bdi|bdo|cite|code|data|dfn|em|i|kbd|mark|q|s|samp|small|span|strong|sub|sup|time|u|var|wbr)\\b/i;\n\n/**\n * A source's visible copy with every offset kept: like `blankHtmlKeepingOffsets`, but a block\n * element (a heading, a paragraph, a cell, a button) starts a new line, so a heading and the\n * paragraph under it are never read as one sentence.\n */\nfunction visibleCopyKeepingOffsets(text: string): string {\n const out = text.split(\"\");\n const pattern = /<script\\b[^>]*>[\\s\\S]*?<\\/script>|<style\\b[^>]*>[\\s\\S]*?<\\/style>|<!--[\\s\\S]*?-->|<[^>]+>/gi;\n for (const m of text.matchAll(pattern)) {\n const start = m.index ?? 0;\n for (let i = start; i < start + m[0].length && i < out.length; i++) {\n if (out[i] !== \"\\n\") out[i] = \" \";\n }\n if (!INLINE_TAGS.test(m[0])) out[start] = \"\\n\";\n }\n return out.join(\"\");\n}\n\nexport type CopySentence = { file: string; line: number; text: string; before?: string; inTable: boolean };\nexport type CompetitorMention = { file: string; line: number; sentence: string; competitor: string };\n\n/**\n * Every sentence a visitor reads on the page, file by file and line by line (frontmatter prose\n * included, comments and code not), and each sentence that names a competitor outside a\n * comparison table. Pure: what the copy rules ask the decision model about.\n */\nexport function landingCopy(\n sources: Array<{ path: string; text: string }>,\n competitors: string[] = [],\n): { sentences: CopySentence[]; mentions: CompetitorMention[] } {\n const names = distinctCompetitorNames(competitors).map((name) => ({\n name,\n pattern: new RegExp(`(?<![\\\\p{L}\\\\p{N}])${escapeRegExp(name)}(?![\\\\p{L}\\\\p{N}])`, \"iu\"),\n }));\n const sentences = sources.flatMap(sourceSentences);\n const mentions = sentences.flatMap((s) =>\n s.inTable\n ? []\n : names\n .filter(({ pattern }) => pattern.test(s.text))\n .map(({ name }) => ({ file: s.file, line: s.line, sentence: s.text, competitor: name })),\n );\n return { sentences, mentions };\n}\n\n/** One source's visible sentences, each with its line and whether a `<table>` holds it. */\nfunction sourceSentences(source: { path: string; text: string }): CopySentence[] {\n const text = blankUnrenderedSource(source.text);\n const tables = tableRanges(text);\n return copySentences(visibleCopyKeepingOffsets(text)).map((s) => ({\n file: source.path,\n line: lineOf(text, s.start),\n text: s.text,\n ...(s.before ? { before: s.before } : {}),\n inTable: tables.some(([from, to]) => s.start >= from && s.start < to),\n }));\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/** Run the per-file rules over one source file (line matchers + file-scope\n * analyzers). Pure; never throws. Page-scope tells are handled by `detectPage`. */\nexport function detectSource(source: { path: string; text: string }): RawFinding[] {\n const file = source.path;\n // Frontmatter is component JS (imports, props) and a comment is commentary —\n // neither is design source. Blanked line-preservingly so no rule reads them\n // and attribution stays exact.\n const text = blankUnrenderedSource(source.text);\n const findings: RawFinding[] = [];\n const lines = text.split(\"\\n\");\n for (const matcher of LINE_MATCHERS) {\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n for (const m of line.matchAll(matcher.regex)) {\n if (matcher.test(m, line)) findings.push({ id: matcher.id, snippet: matcher.fmt(m, line), file, line: i + 1 });\n }\n }\n }\n for (const analyzer of ANALYZERS) {\n if (analyzer.scope === \"file\") findings.push(...analyzer.run(text, file));\n }\n return dedupe(findings);\n}\n\n/** Run the page-scope analyzers over the ASSEMBLED page (all sources joined),\n * so count-threshold tells aren't diluted across small components. Page-level\n * findings have no single line; they attribute to the page's `index.astro`. */\nexport function detectPage(sources: Array<{ path: string; text: string }>): RawFinding[] {\n if (sources.length === 0) return [];\n const combined = sources.map((s) => blankUnrenderedSource(s.text)).join(\"\\n\");\n const pageFile =\n sources.find((s) => s.path === \"index.astro\" || s.path.endsWith(\"/index.astro\"))?.path ??\n sources[0]?.path ??\n \"index.astro\";\n const findings: RawFinding[] = [];\n for (const analyzer of ANALYZERS) {\n if (analyzer.scope === \"page\") findings.push(...analyzer.run(combined, pageFile));\n }\n return dedupe(findings);\n}\n\nexport function dedupe(findings: RawFinding[]): RawFinding[] {\n const out: RawFinding[] = [];\n for (const f of findings) {\n const dupe = out.some(\n (d) => d.id === f.id && d.snippet === f.snippet && Math.abs((d.line ?? 0) - (f.line ?? 0)) <= 2,\n );\n if (!dupe) out.push(f);\n }\n return out;\n}\n","/**\n * The landing critique's copy rules: what the page SAYS, read by the decision model (Jev) one\n * sentence at a time, in whatever language it is written, in one fanned-out set of requests.\n *\n * - `competitor-named-in-comparison` (warn): a vault competitor compared outside a table.\n * - `marketing-buzzword` (warn): copy that could describe any company.\n * - `agent-washing` (warn): an autonomy claim the page never pairs with what the buyer controls.\n * - the AI copy tells (`copy-tells/questions.ts`), counted over the page and gated in\n * `COPY_TELL_GATES`.\n *\n * When Jev cannot answer, none of these is reported and `judged` is false: the critique never\n * blocks a publish on a guess, and it never falls back to a word list that only knows the\n * languages someone typed in.\n */\nimport { TELL_QUESTIONS, tellQuestionsFor } from \"../../copy-tells/questions.ts\";\nimport type { AskNouls, NoulQuestion } from \"../../lib/remembered-nouls.ts\";\nimport { COPY_TELL_GATES } from \"./constants.ts\";\nimport {\n AUTONOMY_HELD,\n AUTONOMY_QUESTION,\n BUZZWORD_HELD,\n BUZZWORD_QUESTION,\n COMPARISON_HELD,\n CONTROL_HELD,\n CONTROL_QUESTION,\n comparisonQuestion,\n pageQuestion,\n sentenceQuestion,\n} from \"./copy-questions.ts\";\nimport { type CopySentence, dedupe, landingCopy, type RawFinding } from \"./rules.ts\";\n\n/** About 15k tokens: the page fits Jev's context with room for the question. */\nconst PAGE_CHARS = 60_000;\nconst SNIPPET_CHARS = 70;\n\n/** The questions asked of every distinct sentence, in this order. */\nconst PER_SENTENCE = [\"buzzword\", \"autonomy\", ...TELL_QUESTIONS.map((t) => t.id)] as const;\n\nfunction questionsFor(sentence: CopySentence): NoulQuestion[] {\n return [\n sentenceQuestion(BUZZWORD_QUESTION, sentence.text),\n sentenceQuestion(AUTONOMY_QUESTION, sentence.text),\n ...tellQuestionsFor({ text: sentence.text, ...(sentence.before ? { before: sentence.before } : {}) }),\n ];\n}\n\nconst snippet = (text: string) => `\"${text.slice(0, SNIPPET_CHARS)}\"`;\n\n/** The page-level file a finding with no single line is reported on, as `detectPage` does. */\nfunction pageFile(sources: ReadonlyArray<{ path: string }>): string {\n return (\n sources.find((s) => s.path === \"index.astro\" || s.path.endsWith(\"/index.astro\"))?.path ??\n sources[0]?.path ??\n \"index.astro\"\n );\n}\n\ntype Said = (s: CopySentence, id: (typeof PER_SENTENCE)[number], held: number) => boolean;\n\n/** The per-sentence findings: each file's buzzword sentences, on the first one's line. */\nfunction sentenceFindings(sentences: readonly CopySentence[], said: Said): RawFinding[] {\n return [...new Set(sentences.map((s) => s.file))].flatMap((file) => {\n const buzz = sentences.filter((s) => s.file === file && !s.inTable && said(s, \"buzzword\", BUZZWORD_HELD));\n const first = buzz[0];\n if (!first) return [];\n return [\n {\n id: \"marketing-buzzword\",\n snippet: `${buzz.length} buzzword sentence${buzz.length === 1 ? \"\" : \"s\"}: ${snippet(first.text)}`,\n file,\n line: first.line,\n },\n ];\n });\n}\n\n/** The page-level findings: an unscaffolded autonomy claim, and every AI copy tell past its gate. */\nfunction pageFindings(sentences: readonly CopySentence[], said: Said, controlled: boolean, file: string): RawFinding[] {\n const out: RawFinding[] = [];\n const claim = sentences.find((s) => said(s, \"autonomy\", AUTONOMY_HELD));\n if (claim && !controlled) {\n out.push({\n id: \"agent-washing\",\n snippet: `${snippet(claim.text)} with no control or oversight signal on the page`,\n file,\n });\n }\n for (const tell of TELL_QUESTIONS) {\n const hits = sentences.filter((s) => !s.inTable && said(s, tell.id, tell.threshold));\n const gate = COPY_TELL_GATES[tell.id];\n if (!gate || hits.length < gate.minCount) continue;\n out.push({ id: tell.id, snippet: `${hits.length}× — ${snippet(hits[0]?.text ?? \"\")}`, file });\n }\n return out;\n}\n\nexport async function judgeLandingCopy(\n input: { sources: Array<{ path: string; text: string }>; competitors?: string[] },\n ask: AskNouls,\n): Promise<{ findings: RawFinding[]; judged: boolean }> {\n const { sentences, mentions } = landingCopy(input.sources, input.competitors ?? []);\n if (sentences.length === 0) return { findings: [], judged: true };\n\n // One entry per distinct sentence (and its lead-in): the same line in two components is one question.\n const keyOf = (s: CopySentence) => `${s.before ?? \"\"}\\u0000${s.text}`;\n const distinct = [...new Map(sentences.map((s) => [keyOf(s), s])).values()];\n const page = [...new Set(sentences.map((s) => s.text))].join(\"\\n\").slice(0, PAGE_CHARS);\n const answers = await ask([\n ...distinct.flatMap(questionsFor),\n ...mentions.map((m) => sentenceQuestion(comparisonQuestion(m.competitor), m.sentence)),\n pageQuestion(CONTROL_QUESTION, page),\n ]);\n if (answers === null) return { findings: [], judged: false };\n\n const answerOf = new Map(\n distinct.map((s, i) => [\n keyOf(s),\n Object.fromEntries(PER_SENTENCE.map((id, q) => [id, answers[i * PER_SENTENCE.length + q] ?? 0])),\n ]),\n );\n const said: Said = (s, id, held) => (answerOf.get(keyOf(s))?.[id] ?? 0) >= held;\n const comparedAt = distinct.length * PER_SENTENCE.length;\n const comparisons = mentions\n .filter((_, i) => (answers[comparedAt + i] ?? 0) >= COMPARISON_HELD)\n .map((m) => ({\n id: \"competitor-named-in-comparison\",\n snippet: `${snippet(m.sentence)} names ${m.competitor}`,\n file: m.file,\n line: m.line,\n }));\n const controlled = (answers[comparedAt + mentions.length] ?? 0) >= CONTROL_HELD;\n return {\n findings: dedupe([\n ...sentenceFindings(sentences, said),\n ...comparisons,\n ...pageFindings(sentences, said, controlled, pageFile(input.sources)),\n ]),\n judged: true,\n };\n}\n","/**\n * Landing anti-slop critic — the engine entry (pure + offline).\n *\n * Our answer for landing pages to the \"every model ships the same AI tells\"\n * problem, grounded in the doctrine the `landing` skill already teaches. It\n * scans a landing's `.astro` source, scores it on design families, and returns\n * findings tiered block/warn/advisory — BEFORE publish, so tells get fixed.\n *\n * Two kinds of rule. The design rules read the source's shape in code. The copy\n * rules read what the page SAYS, in whatever language it is written, through the\n * decision model (`copy-judgments.ts`); when it cannot answer, `copyChecked` is\n * false and no copy finding is reported, never a guess.\n *\n * ADVISORY as a value object: it returns scores + findings and never throws.\n * The CLI that wraps it always exits 0; blocking is the verify gate's job (it\n * reads the block-tier count from the freshness snapshot). Brand-matched values\n * are downgraded to advisory `brandDrift` so we never fight a committed brand.\n *\n * It takes the already-read source text, parsed brand tokens and the decision\n * model as an argument, so it has no fs surface and tests hand it a fake model.\n */\n\nimport type { AskNouls } from \"../../lib/remembered-nouls.ts\";\nimport type { BrandTokens } from \"./brand-tokens.ts\";\nimport { brandCommitsAiHue, brandCommitsCream, brandCommitsFont, brandCommitsGradient } from \"./brand-tokens.ts\";\nimport { type Family, RULE_META, SEVERITY_WEIGHT, type Severity } from \"./constants.ts\";\nimport { judgeLandingCopy } from \"./copy-judgments.ts\";\nimport { detectPage, detectSource, type RawFinding } from \"./rules.ts\";\n\nexport type LandingFinding = {\n id: string;\n severity: Severity;\n family: Family;\n snippet: string;\n file?: string;\n line?: number;\n note: string;\n brandDrift?: boolean;\n};\n\nexport type LandingDimension = {\n dimension: Family;\n /** 0–1, higher is better. */\n score: number;\n note: string;\n};\n\nexport type LandingSource = { path: string; text: string };\n\nexport type CritiqueLandingInput = {\n slug: string;\n sources: LandingSource[];\n brand: BrandTokens;\n /** Competitor names from `src/content/competitors/`. Absent for a client with\n * no competitor entries yet, which is normal and simply skips that rule. */\n competitors?: string[];\n /** The decision model the copy rules ask; absent, the copy is not checked. */\n ask?: AskNouls;\n};\n\nexport type CritiqueLandingReport = {\n advisory: true;\n overall: number;\n dimensions: LandingDimension[];\n findings: LandingFinding[];\n counts: { block: number; warn: number; advisory: number };\n /** False when the copy rules could not ask the decision model, so none of them reported. */\n copyChecked: boolean;\n};\n\nconst FAMILIES: Family[] = [\"typography\", \"color\", \"borders_depth\", \"motion\", \"spacing\", \"copy\", \"integrity\"];\n\nfunction round(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nfunction clamp01(n: number): number {\n return Math.max(0, Math.min(1, n));\n}\n\n/**\n * Apply the BRAND.md allowlist: a font/color/gradient tell whose value the brand commits\n * is a decision, not slop — downgrade it to advisory and mark it `brandDrift`.\n */\nfunction applyBrand(\n id: string,\n snippet: string,\n severity: Severity,\n brand: BrandTokens,\n): { severity: Severity; brandDrift: boolean } {\n const meta = RULE_META[id];\n if (!meta?.brandAware || !brand.hasTokens) return { severity, brandDrift: false };\n const matched =\n (meta.brandAware === \"font\" && brandCommitsFont(brand, snippet)) ||\n (meta.brandAware === \"color\" && id === \"ai-color-palette\" && brandCommitsAiHue(brand)) ||\n (meta.brandAware === \"color\" && id === \"cream-palette\" && brandCommitsCream(brand)) ||\n (meta.brandAware === \"gradient\" && brandCommitsGradient(brand, snippet));\n return matched ? { severity: \"advisory\", brandDrift: true } : { severity, brandDrift: false };\n}\n\n/** Score a landing. Branches nowhere — every family is always reported so the\n * output reads like a stable scorecard. Every heuristic degrades gracefully. */\nexport async function critiqueLanding(input: CritiqueLandingInput): Promise<CritiqueLandingReport> {\n const sources = Array.isArray(input.sources) ? input.sources : [];\n const findings: LandingFinding[] = [];\n\n // Per-file tells (line-attributed) plus page-scope tells over the assembled\n // page (count-threshold tells a componentized landing would otherwise dodge).\n const raws: RawFinding[] = [];\n for (const source of sources) raws.push(...detectSource(source));\n raws.push(...detectPage(sources));\n const copy = input.ask\n ? await judgeLandingCopy({ sources, competitors: input.competitors ?? [] }, input.ask)\n : { findings: [], judged: false };\n raws.push(...copy.findings);\n\n for (const raw of raws) {\n const meta = RULE_META[raw.id];\n if (!meta) continue;\n const { severity, brandDrift } = applyBrand(raw.id, raw.snippet, meta.severity, input.brand);\n findings.push({\n id: raw.id,\n severity,\n family: meta.family,\n snippet: raw.snippet,\n file: raw.file,\n line: raw.line,\n note: meta.note,\n ...(brandDrift ? { brandDrift: true } : {}),\n });\n }\n\n const dimensions: LandingDimension[] = FAMILIES.map((family) => {\n const fam = findings.filter((f) => f.family === family);\n const penalty = fam.reduce((s, f) => s + SEVERITY_WEIGHT[f.severity], 0);\n const score = round(clamp01(1 - penalty));\n const note = fam.length === 0 ? \"clean\" : `${fam.length} finding(s): ${describeCounts(fam)}`;\n return { dimension: family, score, note };\n });\n\n const overall = round(dimensions.reduce((s, d) => s + d.score, 0) / dimensions.length);\n const counts = {\n block: findings.filter((f) => f.severity === \"block\").length,\n warn: findings.filter((f) => f.severity === \"warn\").length,\n advisory: findings.filter((f) => f.severity === \"advisory\").length,\n };\n\n return { advisory: true, overall, dimensions, findings, counts, copyChecked: copy.judged };\n}\n\nfunction describeCounts(findings: LandingFinding[]): string {\n const b = findings.filter((f) => f.severity === \"block\").length;\n const w = findings.filter((f) => f.severity === \"warn\").length;\n const a = findings.filter((f) => f.severity === \"advisory\").length;\n return [b ? `${b} block` : \"\", w ? `${w} warn` : \"\", a ? `${a} advisory` : \"\"].filter(Boolean).join(\", \");\n}\n","import { mkdir, rename, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\n/**\n * The freshness snapshot the critique CLI writes and the verify gate reads.\n * Lives under the gitignored `.cache/` so it never creates a diff. The gate\n * proves \"the critiqued source == the shipping source\" by recomputing the\n * landing's source hash and comparing it to the one recorded here.\n *\n * TWO fingerprints, for one release. `compositionSha` is the current one — every\n * `.astro` in the landing's import graph, so a section the page borrows counts.\n * `sourceSha` is the older, folder-shaped one, and it is written for a gate that\n * predates the composition fingerprint: this CLI and the gate reach a workspace\n * on different tracks (the E2B image vs the per-repo scaffold sync), so for a\n * while after the change each half meets the other's. A gate that cannot read\n * the fingerprint it is given calls every landing stale forever and blocks the\n * commit. Both fields, and both readers, go away together — see\n * `computeLegacyLandingSourceSha`.\n */\n\n/** Bump when a rule change should invalidate old snapshots (informational; the\n * gate keys off the source hash, this just lets the agent know it's re-scored). */\nexport const CRITIC_VERSION = \"6\";\n\nexport type CritiqueSnapshot = {\n slug: string;\n /** The composition fingerprint — what the current gate compares. */\n compositionSha: string;\n /** The folder-shaped fingerprint, for a gate older than the one above. */\n sourceSha: string;\n criticVersion: string;\n at: string;\n blockCount: number;\n warnCount: number;\n};\n\nexport function critiqueCacheDir(projectRoot: string): string {\n return path.join(projectRoot, \".cache\", \"landing-critique\");\n}\n\nfunction snapshotPath(projectRoot: string, slug: string): string {\n return path.join(critiqueCacheDir(projectRoot), `${slug}.json`);\n}\n\nexport async function writeCritiqueSnapshot(projectRoot: string, snapshot: CritiqueSnapshot): Promise<void> {\n await mkdir(critiqueCacheDir(projectRoot), { recursive: true });\n // Write-then-rename so a concurrent gate read never parses a half-written file.\n const dest = snapshotPath(projectRoot, snapshot.slug);\n const tmp = `${dest}.tmp`;\n await writeFile(tmp, `${JSON.stringify(snapshot, null, 2)}\\n`, \"utf8\");\n await rename(tmp, dest);\n}\n","import type { Dirent } from \"node:fs\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { sha256Hex } from \"../../engine/storage/sha256.ts\";\nimport { landingGraphFiles } from \"./import-graph.ts\";\n\n/**\n * A content fingerprint of a landing's editable source — the files an agent\n * edits. It is the bridge the quality gate uses to tell \"this critique is\n * current\" from \"the source was edited since the last critique\":\n *\n * - `baker landing critique <slug>` records the fingerprint it SCORED, and\n * - the `validate-landing-critique` verify gate recompares against the CURRENT\n * source. Equal → the critique is fresh; different (or missing) → the landing\n * changed and must be re-critiqued before it can publish.\n *\n * ## The file set follows the imports, not the folder\n *\n * It used to be `index.astro` plus this landing's own `_components/**\\/*.astro`.\n * Pages share components since A/B tests shipped — a variant borrows the\n * control's sections and forks only the one under test — so that set stopped\n * describing the page. Two things broke at once: an edit to a shared section\n * left the borrowing page's sha unchanged, so the gate passed a page it had\n * never scored in the shape it ships; and the critic was handed a page whose\n * sections it could not read, then asked to judge its composition.\n *\n * So the set is every `.astro` file in the landing's import graph, with\n * repo-relative paths because a shared section does not live under the landing.\n * Bounded to `src/pages/**` and `src/components/**` — the composition the critic\n * judges. The layout and the flow engine are reached by every page and are not\n * compositional; hashing them would restate \"the scaffold changed\" as \"every\n * landing is stale\".\n *\n * Content-addressed (not mtime), so a clone at a different path or clock skew\n * never produces a false \"edited\". The gate's `.mjs`\n * (`apps/scaffold-template/__tooling__/checks/sdk/landing-critique-freshness.mjs`)\n * reimplements this exact ordering + length-prefixed concat — it can't import the\n * CLI — so keep the two in lockstep: repo-relative POSIX paths, ascending\n * codepoint sort, `${len}\\0` prefix. `scripts/__tests__/landing-source-version-parity.test.ts`\n * runs both over one fixture tree and fails when they disagree.\n */\n\n/** Roots whose `.astro` files count as this landing's composition. */\nconst CRITIQUED_ROOTS = [\"src/pages/\", \"src/components/\"];\n\n/** Ordered repo-relative POSIX paths of a landing's source files (sorted, stable). */\nasync function landingSourceRelPaths(root: string, slug: string): Promise<string[]> {\n const files = await landingGraphFiles(root, slug);\n return [...files]\n .filter((rel) => rel.endsWith(\".astro\") && CRITIQUED_ROOTS.some((r) => rel.startsWith(r)))\n .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n}\n\n/** Read the landing's source files as {path, text} for the critic. */\nexport async function readLandingSources(root: string, slug: string): Promise<Array<{ path: string; text: string }>> {\n const rel = await landingSourceRelPaths(root, slug);\n const out: Array<{ path: string; text: string }> = [];\n for (const r of rel) out.push({ path: r, text: await readFile(path.join(root, r), \"utf8\") });\n return out;\n}\n\n/** Length-prefixed concat SHA over the landing's source files, in sorted order. */\nexport async function computeLandingSourceSha(root: string, slug: string): Promise<string> {\n const rel = await landingSourceRelPaths(root, slug);\n const parts: Buffer[] = [];\n for (const r of rel) {\n let bytes: Buffer;\n try {\n bytes = await readFile(path.join(root, r));\n } catch {\n bytes = Buffer.alloc(0);\n }\n // Length-prefix by both the path and the bytes so moving content across\n // files can't collide, mirroring canvas source-version.ts.\n parts.push(Buffer.from(`${r}\\0${bytes.length}\\0`), bytes);\n }\n return sha256Hex(Buffer.concat(parts));\n}\n\n/**\n * The fingerprint as it was BEFORE the composition one above: `index.astro`\n * plus this landing's own `_components/**\\/*.astro`, paths relative to the\n * landing folder.\n *\n * Written into every snapshot beside the composition sha, and read by nothing\n * here. It is there for a gate that predates the composition fingerprint: this\n * CLI reaches a workspace through the E2B image (`@koda-sl/baker-cli@latest`,\n * baked at build) and the gate reaches the same workspace through the per-repo\n * scaffold sync — two tracks with no ordering between them, and a repo whose\n * sync is frozen keeps the old gate indefinitely. An old gate handed only a\n * composition sha recomputes its own, calls every landing stale, re-runs this\n * command, gets the same snapshot back, and blocks the commit citing an\n * unwritable `.cache/`.\n *\n * Delete together with the scaffold's `computeLegacySourceSha` once the fleet\n * and the template both carry the composition fingerprint.\n */\nexport async function computeLegacyLandingSourceSha(landingDir: string): Promise<string> {\n const rel: string[] = [];\n if (await isFile(path.join(landingDir, \"index.astro\"))) rel.push(\"index.astro\");\n for (const abs of await walkAstro(path.join(landingDir, \"_components\"))) {\n rel.push(path.relative(landingDir, abs).split(path.sep).join(\"/\"));\n }\n rel.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n\n const parts: Buffer[] = [];\n for (const r of rel) {\n let bytes: Buffer;\n try {\n bytes = await readFile(path.join(landingDir, r));\n } catch {\n bytes = Buffer.alloc(0);\n }\n parts.push(Buffer.from(`${r}\\0${bytes.length}\\0`), bytes);\n }\n return sha256Hex(Buffer.concat(parts));\n}\n\nasync function isFile(p: string): Promise<boolean> {\n try {\n return (await stat(p)).isFile();\n } catch {\n return false;\n }\n}\n\nasync function walkAstro(dir: string): Promise<string[]> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return [];\n }\n const out: string[] = [];\n for (const entry of entries) {\n const abs = path.join(dir, entry.name);\n if (entry.isDirectory()) out.push(...(await walkAstro(abs)));\n else if (entry.isFile() && entry.name.endsWith(\".astro\")) out.push(abs);\n }\n return out;\n}\n"],"mappings":"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","names":["readdir","readFile","stat","path","pageFile","snippet","path","path","path","readdir","readFile","stat"]}
@@ -1,230 +0,0 @@
1
- import {
2
- FRAME_PLACEHOLDER_NOTE,
3
- exitOnPrepareError,
4
- prepareCanvas
5
- } from "./chunk-DL2UJNJ7.js";
6
- import "./chunk-FLK6QHOY.js";
7
- import "./chunk-CKQTJ2LV.js";
8
- import "./chunk-WHBFXR6F.js";
9
- import "./chunk-DQVI7GCX.js";
10
- import "./chunk-EKX37C3T.js";
11
- import "./chunk-SWN6OHXG.js";
12
- import "./chunk-4D46PS6J.js";
13
- import "./chunk-A3IQAONL.js";
14
- import "./chunk-Y67LUJBE.js";
15
- import "./chunk-6JCX3YLM.js";
16
- import "./chunk-3YJNSUNF.js";
17
- import "./chunk-QPESDKZC.js";
18
- import "./chunk-E44NXCTL.js";
19
- import "./chunk-EJGAJHLB.js";
20
- import {
21
- briefCopyLines,
22
- frameDescriptionOf,
23
- nativeDialogueOf
24
- } from "./chunk-TX7CQTD4.js";
25
- import "./chunk-F4YQ5PVR.js";
26
- import "./chunk-DGCUPJZD.js";
27
- import "./chunk-MVD7QIXI.js";
28
- import {
29
- COPY_DIRECTIVE_HEADER
30
- } from "./chunk-LRV6M2WB.js";
31
- import "./chunk-7HZSORAB.js";
32
- import "./chunk-MCJ5I5LR.js";
33
- import "./chunk-2WZI36D3.js";
34
- import "./chunk-65Y3RCWP.js";
35
- import "./chunk-LNNTHEL7.js";
36
- import "./chunk-FOMFU2RX.js";
37
- import "./chunk-PSGIHSNC.js";
38
- import "./chunk-PONLPYD7.js";
39
- import "./chunk-ZNNQK366.js";
40
- import "./chunk-CAZGM2NX.js";
41
- import "./chunk-NZS3KEQ2.js";
42
- import "./chunk-GIWHHCD6.js";
43
- import "./chunk-NSBNIPIW.js";
44
- import "./chunk-2TOIY2WN.js";
45
- import "./chunk-X7VQFLHI.js";
46
- import "./chunk-LU4HI4KI.js";
47
- import "./chunk-LGK7UWBN.js";
48
- import "./chunk-Q7US4OOA.js";
49
- import "./chunk-YQSBHWOI.js";
50
-
51
- // src/commands/canvas/critique.ts
52
- import path from "path";
53
- import { defineCommand } from "citty";
54
-
55
- // src/engine/scaffold/lib/critique.ts
56
- var VIBE_CUE = /\b(light|lighting|golden|moody|warm|cool|tone|grade|contrast|shadow|glow|rim|backlit|neon|soft)\b/i;
57
- var MECHANISM_CUE = /\b(because|works by|so that|mechanism|proof|guarantee|clinically|backed by|the reason|that's why)\b/i;
58
- function promptOf(node) {
59
- const p = node?.params?.prompt;
60
- return typeof p === "string" ? p : "";
61
- }
62
- function round(n) {
63
- return Math.round(n * 100) / 100;
64
- }
65
- function frameLook(node) {
66
- const description = frameDescriptionOf(promptOf(node)).trim();
67
- return description.endsWith(FRAME_PLACEHOLDER_NOTE) ? "" : description;
68
- }
69
- function creativeText(nodes) {
70
- return nodes.flatMap((n) => {
71
- if (n.type === "image_generate") return [frameLook(n)];
72
- if (n.type === "video_generate") return [nativeDialogueOf(promptOf(n)) ?? ""];
73
- if (n.type === "tts" && typeof n.params?.text === "string") return [n.params.text];
74
- return [];
75
- }).join("\n");
76
- }
77
- function scoreHookStrength(nodes, scene0, hasOverlay) {
78
- const scene0Text = scene0.map((n) => promptOf(n)).join("\n");
79
- const frames = scene0.filter((n) => n.type === "image_generate");
80
- const look = (frames.length > 0 ? frames.map(frameLook) : scene0.map((n) => promptOf(n))).join("\n");
81
- const hookClip = scene0.find((n) => n.type === "video_generate");
82
- const hasSound = hookClip?.params?.generate_audio === true || /Dialogue:|Audio:/.test(scene0Text) || nodes.some((n) => n.type === "tts" || n.type === "dialogue");
83
- const layers = [hasOverlay, hasSound, look.trim().length > 40, VIBE_CUE.test(look)];
84
- const layerCount = layers.filter(Boolean).length;
85
- return {
86
- dimension: "hook_strength",
87
- score: round(hookClip ? layerCount / 4 : 0.5),
88
- note: hookClip ? `hook works on ${layerCount}/4 layers (text/sound/visual/vibe)` : "no scene-0 clip found \u2014 is this a video creative?"
89
- };
90
- }
91
- function scoreFirstFrameLegibility(hasOverlay) {
92
- return {
93
- dimension: "first_frame_legibility",
94
- score: hasOverlay ? 1 : 0.4,
95
- note: hasOverlay ? "a designed overlay layer carries the sound-off message" : "footage-only \u2014 the first frame may not read with sound off; consider an overlay hook"
96
- };
97
- }
98
- function scoreRetentionRisk(videoNodes) {
99
- let saggy = 0;
100
- for (const n of videoNodes) {
101
- const dur = typeof n.params?.duration === "number" ? n.params.duration : 0;
102
- const spoken = /Dialogue:/.test(promptOf(n)) || n.params?.generate_audio === true;
103
- if (dur >= 8 && !spoken) saggy += 1;
104
- }
105
- return {
106
- dimension: "retention_risk",
107
- score: round(videoNodes.length > 0 ? 1 - Math.min(1, saggy / videoNodes.length) : 0.7),
108
- note: saggy > 0 ? `${saggy} long clip(s) with no spoken line may sag` : "no obvious sag points"
109
- };
110
- }
111
- function scoreMechanismClarity(allPromptText) {
112
- const clear = MECHANISM_CUE.test(allPromptText);
113
- return {
114
- dimension: "mechanism_clarity",
115
- score: clear ? 1 : 0.4,
116
- note: clear ? "states a mechanism/proof" : "no clear 'why it works' \u2014 add the mechanism"
117
- };
118
- }
119
- function clamp01(n) {
120
- return Math.max(0, Math.min(1, n));
121
- }
122
- function staticCopyLines(nodes) {
123
- const sized = nodes.find((n) => n.type === "static_format")?.params?.copy;
124
- if (Array.isArray(sized)) {
125
- return sized.flatMap(
126
- (l) => typeof l?.text === "string" ? [l.text] : []
127
- );
128
- }
129
- const gen = nodes.find((n) => n.type === "image_generate");
130
- const prompt = promptOf(gen);
131
- const compiled = briefCopyLines(prompt);
132
- if (compiled.length > 0) return compiled;
133
- const start = prompt.indexOf(COPY_DIRECTIVE_HEADER);
134
- if (start === -1) return [];
135
- const bodyStart = start + COPY_DIRECTIVE_HEADER.length;
136
- const end = prompt.indexOf("\n\n", bodyStart);
137
- const block = prompt.slice(bodyStart, end === -1 ? void 0 : end);
138
- const quoted = block.match(/"[^"]+"/g);
139
- return quoted ? quoted.map((s) => s.slice(1, -1)) : [];
140
- }
141
- function scoreTextLegibilityRisk(copy) {
142
- const lines = copy.length;
143
- return {
144
- dimension: "text_legibility_risk",
145
- score: round(clamp01(1 - Math.max(0, lines - 6) / 12)),
146
- note: lines > 6 ? `${lines} copy blocks \u2014 dense; trim or split so type stays legible` : `${lines} copy block(s) \u2014 reads cleanly`
147
- };
148
- }
149
- function scoreIdentityGrounding(nodes) {
150
- const grounded = nodes.filter((n) => n.type === "image_reference_sheet").length + nodes.filter((n) => n.type === "ingest" && typeof n.id === "string" && /^el_/.test(n.id)).length;
151
- return {
152
- dimension: "identity_grounding",
153
- // 0 grounded is fine for a pure-type ad, so it's a soft nudge, not a failure.
154
- score: grounded > 0 ? 1 : 0.6,
155
- note: grounded > 0 ? `${grounded} subject(s) grounded in a real reference` : "no grounded subject \u2014 fine for a type-only ad; otherwise ground the hero in a real reference"
156
- };
157
- }
158
- function scoreTypeFidelity(nodes) {
159
- const hasSpecimen = nodes.some((n) => n.type === "font_specimen");
160
- return {
161
- dimension: "type_fidelity",
162
- score: hasSpecimen ? 1 : 0.5,
163
- note: hasSpecimen ? "brand type biased by a font specimen" : "no font specimen \u2014 brand type may drift; wire the brand font"
164
- };
165
- }
166
- function critiqueVideo(nodes, videoNodes) {
167
- const scene0 = nodes.filter((n) => typeof n.id === "string" && /^s0(?:[_a-z0-9])*_/.test(n.id));
168
- const hasOverlay = nodes.some((n) => typeof n.type === "string" && /hyperframe/.test(n.type));
169
- return [
170
- scoreHookStrength(nodes, scene0, hasOverlay),
171
- scoreFirstFrameLegibility(hasOverlay),
172
- scoreRetentionRisk(videoNodes),
173
- scoreMechanismClarity(creativeText(nodes))
174
- ];
175
- }
176
- function critiqueStatic(nodes) {
177
- const copy = staticCopyLines(nodes);
178
- const copyText = copy.join("\n");
179
- return [
180
- scoreTextLegibilityRisk(copy),
181
- scoreIdentityGrounding(nodes),
182
- scoreTypeFidelity(nodes),
183
- scoreMechanismClarity(copyText)
184
- ];
185
- }
186
- function critiqueCanvas(canvas) {
187
- const nodes = Array.isArray(canvas.nodes) ? canvas.nodes : [];
188
- const videoNodes = nodes.filter((n) => n.type === "video_generate");
189
- const dimensions = videoNodes.length > 0 ? critiqueVideo(nodes, videoNodes) : critiqueStatic(nodes);
190
- const overall = round(dimensions.reduce((s, d) => s + d.score, 0) / dimensions.length);
191
- return { advisory: true, overall, dimensions };
192
- }
193
-
194
- // src/commands/canvas/critique.ts
195
- var critiqueCommand = defineCommand({
196
- meta: {
197
- name: "critique",
198
- description: "Pre-spend creative critic (ADVISORY \u2014 never blocks). Scores a scaffolded creative BEFORE the billed render, so weak spots get fixed for free. It scores what will render: prompt.json and scenes/*.json edits are brought into the canvas first, exactly as `run` does. A VIDEO creative is scored on hook strength, sound-off first-frame legibility, retention risk, and mechanism clarity; a STATIC ad on baked-text legibility risk, identity grounding, brand-type fidelity, and mechanism clarity. Ground a video hook against `baker winning-ads hooks` for a proven pattern."
199
- },
200
- args: { file: { type: "positional", required: true, description: "Path to canvas JSON" } },
201
- async run({ args }) {
202
- const filePath = path.resolve(String(args.file));
203
- let prepared;
204
- try {
205
- prepared = await prepareCanvas(filePath, { log: (line) => process.stderr.write(`${line}
206
- `) });
207
- } catch (e) {
208
- exitOnPrepareError(e);
209
- }
210
- const report = critiqueCanvas(prepared.canvas);
211
- process.stdout.write(
212
- `${JSON.stringify(
213
- {
214
- ok: true,
215
- advisory: true,
216
- overall: report.overall,
217
- dimensions: report.dimensions,
218
- hint: "Scores are 0\u20131 (higher is better). This never blocks a render \u2014 strengthen weak dimensions or proceed."
219
- },
220
- null,
221
- 2
222
- )}
223
- `
224
- );
225
- }
226
- });
227
- export {
228
- critiqueCommand
229
- };
230
- //# sourceMappingURL=critique-72GFZSHA.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/canvas/critique.ts","../src/engine/scaffold/lib/critique.ts"],"sourcesContent":["import path from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { critiqueCanvas } from \"../../engine/scaffold/lib/critique.ts\";\nimport { exitOnPrepareError, type PreparedCanvas, prepareCanvas } from \"./prepare-canvas.ts\";\n\nexport const critiqueCommand = defineCommand({\n meta: {\n name: \"critique\",\n description:\n \"Pre-spend creative critic (ADVISORY — never blocks). Scores a scaffolded creative BEFORE the billed render, so weak spots get fixed for free. It scores what will render: prompt.json and scenes/*.json edits are brought into the canvas first, exactly as `run` does. A VIDEO creative is scored on hook strength, sound-off first-frame legibility, retention risk, and mechanism clarity; a STATIC ad on baked-text legibility risk, identity grounding, brand-type fidelity, and mechanism clarity. Ground a video hook against `baker winning-ads hooks` for a proven pattern.\",\n },\n args: { file: { type: \"positional\", required: true, description: \"Path to canvas JSON\" } },\n async run({ args }) {\n const filePath = path.resolve(String(args.file));\n // Scored on the graph the render will run: every projection applied (the static copy\n // from prompt.json, each scene's frame and clip prompts from scenes/*.json), not the\n // canvas as it was scaffolded.\n let prepared: PreparedCanvas;\n try {\n prepared = await prepareCanvas(filePath, { log: (line) => process.stderr.write(`${line}\\n`) });\n } catch (e) {\n exitOnPrepareError(e);\n }\n const report = critiqueCanvas(prepared.canvas as Parameters<typeof critiqueCanvas>[0]);\n // Advisory: always exit 0. A low score is guidance, not a gate — the operator\n // decides whether to strengthen the creative or render as-is.\n process.stdout.write(\n `${JSON.stringify(\n {\n ok: true,\n advisory: true,\n overall: report.overall,\n dimensions: report.dimensions,\n hint: \"Scores are 0–1 (higher is better). This never blocks a render — strengthen weak dimensions or proceed.\",\n },\n null,\n 2,\n )}\\n`,\n );\n },\n});\n","/**\n * Pre-spend creative critic (T4.1) — our answer to Higgsfield's Virality Predictor,\n * grounded in the doctrine we already enforce. It scores a scaffolded creative on\n * the dimensions that decide whether an ad stops the scroll, BEFORE the billed\n * render, so the operator can strengthen a weak hook for free.\n *\n * ADVISORY ONLY. It never blocks a render or publish — it returns scores + notes;\n * the operator decides. This mirrors our validator philosophy (advisory warnings\n * steer, they don't gate).\n *\n * Pure + offline: it reads the parsed canvas and reasons from the node graph. The\n * deeper \"is this hook a proven winner for the segment\" question is answered by\n * grounding against `baker winning-ads hooks` (see references/critique.md) — kept\n * out of this function so the critic can't fail on a network hiccup.\n */\n\nimport { frameDescriptionOf } from \"../../engine/lint/rules/video-prompt.ts\";\nimport { nativeDialogueOf } from \"../../lib/prompt-profiles.ts\";\nimport { briefCopyLines } from \"../static-brief.ts\";\nimport { COPY_DIRECTIVE_HEADER } from \"../static-copy.ts\";\nimport { FRAME_PLACEHOLDER_NOTE } from \"../video/prompts/frame.ts\";\n\nexport type CritiqueCanvasInput = {\n nodes?: Array<{ id?: string; type?: string; params?: Record<string, unknown>; inputs?: unknown }>;\n metadata?: { video?: { duration_s?: number; vo_segments?: unknown[]; talking_scenes?: unknown[] } };\n};\n\nexport type CritiqueDimension = {\n dimension: // Video creative dimensions.\n | \"hook_strength\"\n | \"first_frame_legibility\"\n | \"retention_risk\"\n // Static-ad dimensions.\n | \"text_legibility_risk\"\n | \"identity_grounding\"\n | \"type_fidelity\"\n // Shared.\n | \"mechanism_clarity\";\n /** 0–1, higher is better (for the *_risk dimensions, higher = LOWER risk). */\n score: number;\n note: string;\n};\n\nexport type CritiqueReport = {\n advisory: true;\n overall: number;\n dimensions: CritiqueDimension[];\n};\n\nconst VIBE_CUE = /\\b(light|lighting|golden|moody|warm|cool|tone|grade|contrast|shadow|glow|rim|backlit|neon|soft)\\b/i;\nconst MECHANISM_CUE =\n /\\b(because|works by|so that|mechanism|proof|guarantee|clinically|backed by|the reason|that's why)\\b/i;\n\nfunction promptOf(node: { params?: Record<string, unknown> } | undefined): string {\n const p = node?.params?.prompt;\n return typeof p === \"string\" ? p : \"\";\n}\n\nfunction round(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\ntype CanvasNode = NonNullable<CritiqueCanvasInput[\"nodes\"]>[number];\n\n/**\n * What a frame node says about its own picture: the FRAME DESCRIPTION a scaffolded frame\n * wraps in fixed instructions (the same slice the validator reads), or a hand-authored\n * prompt whole. The fixed instructions are the same on every frame — scoring them is how\n * every hook read as having a mood, because they name \"lighting\" — and a frame still\n * waiting for its description has none.\n */\nfunction frameLook(node: CanvasNode): string {\n const description = frameDescriptionOf(promptOf(node)).trim();\n return description.endsWith(FRAME_PLACEHOLDER_NOTE) ? \"\" : description;\n}\n\n/** The words the creative itself says: every frame's own description and every spoken line. */\nfunction creativeText(nodes: CanvasNode[]): string {\n return nodes\n .flatMap((n) => {\n if (n.type === \"image_generate\") return [frameLook(n)];\n if (n.type === \"video_generate\") return [nativeDialogueOf(promptOf(n)) ?? \"\"];\n if (n.type === \"tts\" && typeof n.params?.text === \"string\") return [n.params.text];\n return [];\n })\n .join(\"\\n\");\n}\n\n/**\n * HOOK STRENGTH — the four hook layers present on scene 0 (text/sound/visual/vibe). The\n * visual and vibe layers are read off the opening frames' own descriptions (a canvas with\n * no generated frame: its scene-0 prompts, whole).\n */\nfunction scoreHookStrength(nodes: CanvasNode[], scene0: CanvasNode[], hasOverlay: boolean): CritiqueDimension {\n const scene0Text = scene0.map((n) => promptOf(n)).join(\"\\n\");\n const frames = scene0.filter((n) => n.type === \"image_generate\");\n const look = (frames.length > 0 ? frames.map(frameLook) : scene0.map((n) => promptOf(n))).join(\"\\n\");\n const hookClip = scene0.find((n) => n.type === \"video_generate\");\n const hasSound =\n hookClip?.params?.generate_audio === true ||\n /Dialogue:|Audio:/.test(scene0Text) ||\n nodes.some((n) => n.type === \"tts\" || n.type === \"dialogue\");\n const layers = [hasOverlay, hasSound, look.trim().length > 40, VIBE_CUE.test(look)];\n const layerCount = layers.filter(Boolean).length;\n return {\n dimension: \"hook_strength\",\n score: round(hookClip ? layerCount / 4 : 0.5),\n note: hookClip\n ? `hook works on ${layerCount}/4 layers (text/sound/visual/vibe)`\n : \"no scene-0 clip found — is this a video creative?\",\n };\n}\n\n/** FIRST-FRAME LEGIBILITY (sound-off) — feeds autoplay muted, so the first frame\n * must read without audio. A designed overlay text layer is the strongest signal. */\nfunction scoreFirstFrameLegibility(hasOverlay: boolean): CritiqueDimension {\n return {\n dimension: \"first_frame_legibility\",\n score: hasOverlay ? 1 : 0.4,\n note: hasOverlay\n ? \"a designed overlay layer carries the sound-off message\"\n : \"footage-only — the first frame may not read with sound off; consider an overlay hook\",\n };\n}\n\n/** RETENTION RISK (higher = lower risk) — long clips with no spoken line sag. */\nfunction scoreRetentionRisk(videoNodes: CanvasNode[]): CritiqueDimension {\n let saggy = 0;\n for (const n of videoNodes) {\n const dur = typeof n.params?.duration === \"number\" ? n.params.duration : 0;\n const spoken = /Dialogue:/.test(promptOf(n)) || n.params?.generate_audio === true;\n if (dur >= 8 && !spoken) saggy += 1;\n }\n return {\n dimension: \"retention_risk\",\n score: round(videoNodes.length > 0 ? 1 - Math.min(1, saggy / videoNodes.length) : 0.7),\n note: saggy > 0 ? `${saggy} long clip(s) with no spoken line may sag` : \"no obvious sag points\",\n };\n}\n\n/** MECHANISM CLARITY — does the creative state WHY it works, not just what it is? */\nfunction scoreMechanismClarity(allPromptText: string): CritiqueDimension {\n const clear = MECHANISM_CUE.test(allPromptText);\n return {\n dimension: \"mechanism_clarity\",\n score: clear ? 1 : 0.4,\n note: clear ? \"states a mechanism/proof\" : \"no clear 'why it works' — add the mechanism\",\n };\n}\n\nfunction clamp01(n: number): number {\n return Math.max(0, Math.min(1, n));\n}\n\n/**\n * The copy a static ad carries: on one picture the designed lines every size sets\n * (`static_format`'s `copy`, its picture carrying none); else the numbered lines its compiled\n * brief quotes (`static-brief.ts`), or, on a canvas no run has compiled yet, the strings of the\n * older prompt's copy block (from its header to the next blank line).\n */\nfunction staticCopyLines(nodes: CanvasNode[]): string[] {\n const sized = nodes.find((n) => n.type === \"static_format\")?.params?.copy;\n if (Array.isArray(sized)) {\n return sized.flatMap((l) =>\n typeof (l as { text?: unknown })?.text === \"string\" ? [(l as { text: string }).text] : [],\n );\n }\n const gen = nodes.find((n) => n.type === \"image_generate\");\n const prompt = promptOf(gen);\n const compiled = briefCopyLines(prompt);\n if (compiled.length > 0) return compiled;\n const start = prompt.indexOf(COPY_DIRECTIVE_HEADER);\n if (start === -1) return [];\n const bodyStart = start + COPY_DIRECTIVE_HEADER.length;\n const end = prompt.indexOf(\"\\n\\n\", bodyStart);\n const block = prompt.slice(bodyStart, end === -1 ? undefined : end);\n const quoted = block.match(/\"[^\"]+\"/g);\n return quoted ? quoted.map((s) => s.slice(1, -1)) : [];\n}\n\n/** TEXT LEGIBILITY RISK (higher = lower risk) — baked copy is the #1 static-ad defect,\n * and it crowds fast: past ~6 distinct copy blocks the render garbles and duplicates. */\nfunction scoreTextLegibilityRisk(copy: string[]): CritiqueDimension {\n const lines = copy.length;\n return {\n dimension: \"text_legibility_risk\",\n score: round(clamp01(1 - Math.max(0, lines - 6) / 12)),\n note:\n lines > 6\n ? `${lines} copy blocks — dense; trim or split so type stays legible`\n : `${lines} copy block(s) — reads cleanly`,\n };\n}\n\n/** IDENTITY GROUNDING — Rule 1: every real subject grounds on a real reference (a\n * dropped `el_*` asset or its fused reference sheet), never free-generated. */\nfunction scoreIdentityGrounding(nodes: CanvasNode[]): CritiqueDimension {\n const grounded =\n nodes.filter((n) => n.type === \"image_reference_sheet\").length +\n nodes.filter((n) => n.type === \"ingest\" && typeof n.id === \"string\" && /^el_/.test(n.id)).length;\n return {\n dimension: \"identity_grounding\",\n // 0 grounded is fine for a pure-type ad, so it's a soft nudge, not a failure.\n score: grounded > 0 ? 1 : 0.6,\n note:\n grounded > 0\n ? `${grounded} subject(s) grounded in a real reference`\n : \"no grounded subject — fine for a type-only ad; otherwise ground the hero in a real reference\",\n };\n}\n\n/** TYPE FIDELITY — \"the big one\": image models don't hold a brand font, so a wired\n * font specimen that biases the render toward the real face is the strongest lever. */\nfunction scoreTypeFidelity(nodes: CanvasNode[]): CritiqueDimension {\n const hasSpecimen = nodes.some((n) => n.type === \"font_specimen\");\n return {\n dimension: \"type_fidelity\",\n score: hasSpecimen ? 1 : 0.5,\n note: hasSpecimen\n ? \"brand type biased by a font specimen\"\n : \"no font specimen — brand type may drift; wire the brand font\",\n };\n}\n\n/** VIDEO creative dimensions (hook / legibility / retention / mechanism). */\nfunction critiqueVideo(nodes: CanvasNode[], videoNodes: CanvasNode[]): CritiqueDimension[] {\n const scene0 = nodes.filter((n) => typeof n.id === \"string\" && /^s0(?:[_a-z0-9])*_/.test(n.id));\n const hasOverlay = nodes.some((n) => typeof n.type === \"string\" && /hyperframe/.test(n.type));\n return [\n scoreHookStrength(nodes, scene0, hasOverlay),\n scoreFirstFrameLegibility(hasOverlay),\n scoreRetentionRisk(videoNodes),\n scoreMechanismClarity(creativeText(nodes)),\n ];\n}\n\n/** STATIC-ad dimensions (legibility / grounding / type / mechanism). */\nfunction critiqueStatic(nodes: CanvasNode[]): CritiqueDimension[] {\n // Only the ad's own copy: every other prompt on the canvas is the scaffold's boilerplate,\n // and the judge's rubric alone (\"the reason the reference ad works\") read as a stated\n // mechanism on every multi-take ad.\n const copy = staticCopyLines(nodes);\n const copyText = copy.join(\"\\n\");\n return [\n scoreTextLegibilityRisk(copy),\n scoreIdentityGrounding(nodes),\n scoreTypeFidelity(nodes),\n scoreMechanismClarity(copyText),\n ];\n}\n\n/**\n * Score a scaffolded creative. Branches on modality — a canvas with `video_generate`\n * nodes is a video creative; anything else (an `image_generate` static ad, or an empty\n * canvas) is scored on the static dimensions. All heuristics degrade gracefully rather\n * than throwing, and every dimension is advisory only.\n */\nexport function critiqueCanvas(canvas: CritiqueCanvasInput): CritiqueReport {\n const nodes = Array.isArray(canvas.nodes) ? canvas.nodes : [];\n const videoNodes = nodes.filter((n) => n.type === \"video_generate\");\n const dimensions = videoNodes.length > 0 ? critiqueVideo(nodes, videoNodes) : critiqueStatic(nodes);\n const overall = round(dimensions.reduce((s, d) => s + d.score, 0) / dimensions.length);\n return { advisory: true, overall, dimensions };\n}\n"],"mappings":"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","names":[]}