@koda-sl/baker-cli 0.481.0-dev.2d33e194f → 0.495.0-dev.c2b64ccca

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 (1417) hide show
  1. package/README.md +66 -131
  2. package/canvas/avocado-tutorial.json +3 -3
  3. package/canvas/hello-world-overlay.json +1 -1
  4. package/dist/account-5VPZ3XQ3.js +79 -0
  5. package/dist/account-SYUEXERA.js +49 -0
  6. package/dist/account-ZQH535IP.js +80 -0
  7. package/dist/account-reads-GUYNJEZA.js +218 -0
  8. package/dist/account-writes-DLCRTL6Y.js +66 -0
  9. package/dist/accounts-3TNEMLLC.js +115 -0
  10. package/dist/accounts-GBRGCLE3.js +611 -0
  11. package/dist/accounts-IPOCFAKK.js +114 -0
  12. package/dist/accounts-QBWYIJ7D.js +77 -0
  13. package/dist/accounts-TSM5EHRD.js +75 -0
  14. package/dist/actions-XZMLYLTK.js +55 -0
  15. package/dist/active-entities-MFWTN4VJ.js +103 -0
  16. package/dist/activecampaign-77V5X3FQ.js +935 -0
  17. package/dist/activecampaign-77V5X3FQ.js.map +1 -0
  18. package/dist/activities-ZXA53KY7.js +74 -0
  19. package/dist/ad-group-writes-2JBCTSJY.js +170 -0
  20. package/dist/ad-groups-6JQSO32O.js +68 -0
  21. package/dist/ad-writes-P34Z3ZTX.js +174 -0
  22. package/dist/add-F2BF2HAK.js +105 -0
  23. package/dist/add-JAXBNDLC.js +97 -0
  24. package/dist/add-KAMQP5RM.js +302 -0
  25. package/dist/add-Y6QCWI6Q.js +104 -0
  26. package/dist/add-accounts-M4R7ZVHN.js +91 -0
  27. package/dist/ads-6MIIAUFS.js +40 -0
  28. package/dist/ads-6MIIAUFS.js.map +1 -0
  29. package/dist/ads-KPUP4WG4.js +128 -0
  30. package/dist/ads-UVQN4BTT.js +113 -0
  31. package/dist/ads-VPSHNIWG.js +77 -0
  32. package/dist/adsets-JAQKFDLX.js +176 -0
  33. package/dist/advertisers-2ETFYRKA.js +120 -0
  34. package/dist/advertisers-6ONURKP2.js +125 -0
  35. package/dist/analytics-AVDCFCGF.js +433 -0
  36. package/dist/analytics-AVDCFCGF.js.map +1 -0
  37. package/dist/analytics-XZ56777C.js +1976 -0
  38. package/dist/animate-KZQCCL65.js +480 -0
  39. package/dist/assign-DDXB7A6W.js +77 -0
  40. package/dist/audience-size-5QQAABZQ.js +94 -0
  41. package/dist/audiences-I4KJ6DZ7.js +85 -0
  42. package/dist/audiences-IFBZCTME.js +78 -0
  43. package/dist/audiences-THTWZOMA.js +268 -0
  44. package/dist/audit-2KOD4YCF.js +151 -0
  45. package/dist/audit-MFTERSQZ.js +88 -0
  46. package/dist/autocomplete-JC46QNHQ.js +111 -0
  47. package/dist/avatars-ZXQRZJM2.js +38 -0
  48. package/dist/bid-pricing-46W7LSU5.js +99 -0
  49. package/dist/brand-XROP2WL2.js +22 -0
  50. package/dist/brief-B7C3SYDP.js +537 -0
  51. package/dist/brief-B7C3SYDP.js.map +1 -0
  52. package/dist/businesses-JWOIY3OR.js +53 -0
  53. package/dist/campaign-groups-5O3SR5X2.js +95 -0
  54. package/dist/campaign-writes-4D4256DP.js +170 -0
  55. package/dist/campaign-writes-5BEK2QBJ.js +165 -0
  56. package/dist/campaigns-6DX2MACO.js +76 -0
  57. package/dist/campaigns-EJT7IMDT.js +109 -0
  58. package/dist/campaigns-OKU4HN5Q.js +107 -0
  59. package/dist/campaigns-QVPLPTH3.js +110 -0
  60. package/dist/canvas-XCP2WPYO.js +46 -0
  61. package/dist/capabilities-W4XDJVDW.js +144 -0
  62. package/dist/cards-2QCVG77U.js +85 -0
  63. package/dist/catalog-LTH6SDYM.js +65 -0
  64. package/dist/catalog-LTH6SDYM.js.map +1 -0
  65. package/dist/catalogs-RVW4L6C6.js +128 -0
  66. package/dist/changes-XRPDY2K4.js +135 -0
  67. package/dist/chatgpt-RNGSOVHP.js +47 -0
  68. package/dist/chats-JKCUA26S.js +262 -0
  69. package/dist/check-NDPR32FH.js +102 -0
  70. package/dist/check-NDPR32FH.js.map +1 -0
  71. package/dist/chunk-2C36DHQH.js +96 -0
  72. package/dist/chunk-2LIAXB3W.js +1079 -0
  73. package/dist/chunk-2MT3AWDE.js +125 -0
  74. package/dist/chunk-2WRK44LZ.js +296 -0
  75. package/dist/chunk-34NQKHKY.js +1599 -0
  76. package/dist/chunk-34NQKHKY.js.map +1 -0
  77. package/dist/chunk-35WKYJQY.js +382 -0
  78. package/dist/chunk-35WKYJQY.js.map +1 -0
  79. package/dist/chunk-3AOMKBDC.js +3194 -0
  80. package/dist/chunk-3AOMKBDC.js.map +1 -0
  81. package/dist/chunk-3FDGC2UH.js +846 -0
  82. package/dist/chunk-3FFJYMKM.js +333 -0
  83. package/dist/chunk-3PL2QRF2.js +96 -0
  84. package/dist/chunk-3XDZMLX6.js +139 -0
  85. package/dist/chunk-4R7H4RV6.js +35 -0
  86. package/dist/chunk-4TBDEV7X.js +75 -0
  87. package/dist/chunk-4WYEGE4N.js +2123 -0
  88. package/dist/chunk-4WYEGE4N.js.map +1 -0
  89. package/dist/chunk-5IGQ6IQO.js +1837 -0
  90. package/dist/chunk-5IGQ6IQO.js.map +1 -0
  91. package/dist/chunk-5VD5GK6A.js +58 -0
  92. package/dist/chunk-5ZIGEHQQ.js +166 -0
  93. package/dist/chunk-66ZIZ7QP.js +26 -0
  94. package/dist/chunk-6DSLFOKJ.js +74 -0
  95. package/dist/chunk-6EV5MXLQ.js +66 -0
  96. package/dist/chunk-6EV5MXLQ.js.map +1 -0
  97. package/dist/chunk-6FHP2HIK.js +84 -0
  98. package/dist/chunk-6VI2DDGZ.js +106 -0
  99. package/dist/chunk-72QBQS63.js +111 -0
  100. package/dist/chunk-7DBOLSUL.js +51 -0
  101. package/dist/chunk-7FDDOOM4.js +19 -0
  102. package/dist/chunk-7XH4UQWS.js +302 -0
  103. package/dist/chunk-7XH4UQWS.js.map +1 -0
  104. package/dist/chunk-AN7CMLYY.js +25 -0
  105. package/dist/chunk-B2SAOVMU.js +148 -0
  106. package/dist/chunk-B2SAOVMU.js.map +1 -0
  107. package/dist/chunk-BC2BXRXY.js +2887 -0
  108. package/dist/chunk-BC2BXRXY.js.map +1 -0
  109. package/dist/chunk-BDMZRWQI.js +433 -0
  110. package/dist/chunk-BITS62MF.js +77 -0
  111. package/dist/chunk-BVMXTD4B.js +169 -0
  112. package/dist/chunk-BVMXTD4B.js.map +1 -0
  113. package/dist/chunk-CCFZB42B.js +76 -0
  114. package/dist/chunk-CKRSSMRT.js +191 -0
  115. package/dist/chunk-D53AAUG4.js +215 -0
  116. package/dist/chunk-DGUYFROS.js +76 -0
  117. package/dist/chunk-DS2ZRTAL.js +136 -0
  118. package/dist/chunk-EIJDXZW5.js +1743 -0
  119. package/dist/chunk-EJH2JOVG.js +98 -0
  120. package/dist/chunk-EJWFD6T3.js +188 -0
  121. package/dist/chunk-ELNN4SNW.js +52 -0
  122. package/dist/chunk-ELYP6BOS.js +156 -0
  123. package/dist/chunk-ELYP6BOS.js.map +1 -0
  124. package/dist/chunk-EUB327FC.js +57 -0
  125. package/dist/chunk-EWRGZZLS.js +159 -0
  126. package/dist/chunk-EWRGZZLS.js.map +1 -0
  127. package/dist/chunk-FBF5XDJX.js +106 -0
  128. package/dist/chunk-FP3GNJN2.js +98 -0
  129. package/dist/chunk-FZKUUI3F.js +455 -0
  130. package/dist/chunk-FZKUUI3F.js.map +1 -0
  131. package/dist/chunk-G2AZCDX4.js +216 -0
  132. package/dist/chunk-G2AZCDX4.js.map +1 -0
  133. package/dist/chunk-G373L4GL.js +45 -0
  134. package/dist/chunk-GFFV6YS7.js +903 -0
  135. package/dist/chunk-GFFV6YS7.js.map +1 -0
  136. package/dist/chunk-GN6WIZDD.js +392 -0
  137. package/dist/chunk-GN6WIZDD.js.map +1 -0
  138. package/dist/chunk-GTOHNTTI.js +274 -0
  139. package/dist/chunk-HDNZSVJJ.js +665 -0
  140. package/dist/chunk-HLAAGGDS.js +346 -0
  141. package/dist/chunk-HX7PM34O.js +197 -0
  142. package/dist/chunk-IGOOLUE2.js +821 -0
  143. package/dist/chunk-IGOOLUE2.js.map +1 -0
  144. package/dist/chunk-IKTKWXP6.js +172 -0
  145. package/dist/chunk-IOGKJZ4Z.js +74 -0
  146. package/dist/chunk-IVRXPYQ7.js +60 -0
  147. package/dist/chunk-JIJJCU6E.js +363 -0
  148. package/dist/chunk-JOCKYH6U.js +297 -0
  149. package/dist/chunk-KPYDTIAI.js +317 -0
  150. package/dist/chunk-KPYDTIAI.js.map +1 -0
  151. package/dist/chunk-L44WSWSZ.js +23 -0
  152. package/dist/chunk-LF3MFO2N.js +23992 -0
  153. package/dist/chunk-LF3MFO2N.js.map +1 -0
  154. package/dist/chunk-M525HJTA.js +275 -0
  155. package/dist/chunk-M6UNISGO.js +66 -0
  156. package/dist/chunk-M6UNISGO.js.map +1 -0
  157. package/dist/chunk-MBYTIGZE.js +111 -0
  158. package/dist/chunk-MBYTIGZE.js.map +1 -0
  159. package/dist/chunk-MMU6XHCH.js +97 -0
  160. package/dist/chunk-MNPBPU3G.js +225 -0
  161. package/dist/chunk-MNPBPU3G.js.map +1 -0
  162. package/dist/chunk-MRRSKRZZ.js +84 -0
  163. package/dist/chunk-MV2J73HP.js +6238 -0
  164. package/dist/chunk-MV2J73HP.js.map +1 -0
  165. package/dist/chunk-NEHQGYZS.js +5181 -0
  166. package/dist/chunk-NEHQGYZS.js.map +1 -0
  167. package/dist/chunk-NFHUJRDE.js +136 -0
  168. package/dist/chunk-NG2DMLU6.js +175 -0
  169. package/dist/chunk-NG2DMLU6.js.map +1 -0
  170. package/dist/chunk-NSHJ6OOK.js +67 -0
  171. package/dist/chunk-OCBAKPHH.js +76 -0
  172. package/dist/chunk-OFTU5XBQ.js +92 -0
  173. package/dist/chunk-OSWCEDFE.js +216 -0
  174. package/dist/chunk-OTNGMKI6.js +309 -0
  175. package/dist/chunk-PAJJXZ3Z.js +170 -0
  176. package/dist/chunk-PALFKSJV.js +237 -0
  177. package/dist/chunk-PALFKSJV.js.map +1 -0
  178. package/dist/chunk-PGSXR5UM.js +206 -0
  179. package/dist/chunk-PPMSWLQC.js +158 -0
  180. package/dist/chunk-PPMSWLQC.js.map +1 -0
  181. package/dist/chunk-QAOEVZYY.js +509 -0
  182. package/dist/chunk-QEW64BBR.js +777 -0
  183. package/dist/chunk-QEW64BBR.js.map +1 -0
  184. package/dist/chunk-QK5PEHFX.js +3088 -0
  185. package/dist/chunk-QK5PEHFX.js.map +1 -0
  186. package/dist/chunk-QVQKCVP7.js +85 -0
  187. package/dist/chunk-QVQKCVP7.js.map +1 -0
  188. package/dist/chunk-QW2Q4C2X.js +547 -0
  189. package/dist/chunk-QW2Q4C2X.js.map +1 -0
  190. package/dist/chunk-R5HMAIZM.js +169 -0
  191. package/dist/chunk-RPRLCIHB.js +103 -0
  192. package/dist/chunk-RV4GIY23.js +149 -0
  193. package/dist/chunk-RVXN2YTM.js +544 -0
  194. package/dist/chunk-RVXN2YTM.js.map +1 -0
  195. package/dist/chunk-RXUEYD2S.js +592 -0
  196. package/dist/chunk-S4ROJTDY.js +580 -0
  197. package/dist/chunk-S4ROJTDY.js.map +1 -0
  198. package/dist/chunk-SJOWZKNB.js +56 -0
  199. package/dist/chunk-SQQ4VBNI.js +304 -0
  200. package/dist/chunk-SQQ4VBNI.js.map +1 -0
  201. package/dist/chunk-SYED65QF.js +46 -0
  202. package/dist/chunk-SYED65QF.js.map +1 -0
  203. package/dist/chunk-T5HB6R4I.js +518 -0
  204. package/dist/chunk-T5HB6R4I.js.map +1 -0
  205. package/dist/chunk-TE3N5AGN.js +94 -0
  206. package/dist/chunk-TPQH4UXJ.js +174 -0
  207. package/dist/chunk-TQUNJFGF.js +225 -0
  208. package/dist/chunk-TYSN5VVJ.js +55 -0
  209. package/dist/chunk-UKMG6YWX.js +26 -0
  210. package/dist/chunk-WDAWTHQK.js +66 -0
  211. package/dist/chunk-WJNLQEOZ.js +131 -0
  212. package/dist/chunk-WJNLQEOZ.js.map +1 -0
  213. package/dist/chunk-WZDKROPU.js +6995 -0
  214. package/dist/chunk-WZDKROPU.js.map +1 -0
  215. package/dist/chunk-X3PCCHP2.js +74 -0
  216. package/dist/chunk-XQ4KKF5E.js +1448 -0
  217. package/dist/chunk-XQ4KKF5E.js.map +1 -0
  218. package/dist/chunk-XXU7XRMM.js +4434 -0
  219. package/dist/chunk-XXU7XRMM.js.map +1 -0
  220. package/dist/chunk-YJAQWTS6.js +455 -0
  221. package/dist/chunk-YNOJN5Z6.js +42 -0
  222. package/dist/chunk-YTV5VW7S.js +494 -0
  223. package/dist/chunk-ZO4GMUO3.js +172 -0
  224. package/dist/chunk-ZSRLDTDC.js +46 -0
  225. package/dist/claim-JBNO7M6J.js +197 -0
  226. package/dist/cli.js +39 -38
  227. package/dist/cli.js.map +1 -1
  228. package/dist/client-CPAPILIF.js +19 -0
  229. package/dist/code-GHOVETWX.js +76 -0
  230. package/dist/companies-47T2PCRZ.js +195 -0
  231. package/dist/complete-T3PKN4B7.js +81 -0
  232. package/dist/config-AFNXR5FA.js +88 -0
  233. package/dist/connect-T7R43GIH.js +42 -0
  234. package/dist/content-M3U2SCFJ.js +85 -0
  235. package/dist/conversation-BG7WEMXQ.js +93 -0
  236. package/dist/conversion-report-URDTPXQ7.js +125 -0
  237. package/dist/conversion-upload-command-BWF6MAOK.js +438 -0
  238. package/dist/conversion-writes-7MGIFJ3H.js +120 -0
  239. package/dist/conversions-QY6COYPP.js +76 -0
  240. package/dist/conversions-UTXG5YEO.js +135 -0
  241. package/dist/countries-MUZPFSYZ.js +82 -0
  242. package/dist/create-6QASIASQ.js +235 -0
  243. package/dist/create-FIHEJRAF.js +59 -0
  244. package/dist/create-JXZBMXUS.js +207 -0
  245. package/dist/create-LN23WUB5.js +126 -0
  246. package/dist/create-LN23WUB5.js.map +1 -0
  247. package/dist/creatives-6FG6VAB4.js +87 -0
  248. package/dist/creatives-NJ7SZ3S4.js +58 -0
  249. package/dist/creatives-NJ7SZ3S4.js.map +1 -0
  250. package/dist/creatives-UD6TFATS.js +182 -0
  251. package/dist/credentials-ECPD2A7X.js +287 -0
  252. package/dist/critique-LINKOKOE.js +220 -0
  253. package/dist/critique-LINKOKOE.js.map +1 -0
  254. package/dist/critique-WQ3EP6E5.js +1450 -0
  255. package/dist/critique-WQ3EP6E5.js.map +1 -0
  256. package/dist/crm-4EWUWZNZ.js +318 -0
  257. package/dist/crm-ASWKMKF3.js +224 -0
  258. package/dist/crop-MIVSA2YF.js +113 -0
  259. package/dist/currency-5LU3D62R.js +88 -0
  260. package/dist/custom-conversions-3QGJQRYS.js +125 -0
  261. package/dist/customers-EEBZXQ4J.js +56 -0
  262. package/dist/decide-ZODJU7DY.js +199 -0
  263. package/dist/delete-CTH3TGNM.js +71 -0
  264. package/dist/delete-D6GNTBYI.js +54 -0
  265. package/dist/delete-IWIDUJNS.js +69 -0
  266. package/dist/delete-TLVYBVRP.js +71 -0
  267. package/dist/delete-XPHIQY5Z.js +63 -0
  268. package/dist/delete-XZEPLAKT.js +66 -0
  269. package/dist/demographics-L3TJJAFF.js +138 -0
  270. package/dist/describe-5PM5OSYK.js +97 -0
  271. package/dist/describe-KQLRHGFX.js +97 -0
  272. package/dist/dimensions-6H24D7CM.js +101 -0
  273. package/dist/discard-74I3M2DF.js +66 -0
  274. package/dist/discover-6LGIHWVP.js +93 -0
  275. package/dist/discover-HBQO4RSF.js +172 -0
  276. package/dist/domain-E5DTPAZI.js +98 -0
  277. package/dist/download-ED52W77T.js +299 -0
  278. package/dist/draft-3XYF2L4K.js +306 -0
  279. package/dist/draft-5IEMZ4W3.js +103 -0
  280. package/dist/draft-6UVGEERY.js +281 -0
  281. package/dist/draft-FDBE36CP.js +233 -0
  282. package/dist/draft-PE4DN44Y.js +307 -0
  283. package/dist/draft-QBR22TG2.js +328 -0
  284. package/dist/draft-VZYSJVF5.js +217 -0
  285. package/dist/draft-YWTLO2ON.js +100 -0
  286. package/dist/engine/index.js +15 -14
  287. package/dist/env-GS2TUVCM.js +43 -0
  288. package/dist/experiment-XDJHSOBC.js +1397 -0
  289. package/dist/export-GV5CF5UM.js +168 -0
  290. package/dist/extract-4OXK7L7R.js +113 -0
  291. package/dist/facets-XPB2ELM2.js +114 -0
  292. package/dist/favorites-VKPXGTK6.js +178 -0
  293. package/dist/feed-B2YLZQNU.js +177 -0
  294. package/dist/feedback-HT2M63QW.js +66 -0
  295. package/dist/feedback-record-V7UU6CG3.js +246 -0
  296. package/dist/feedback-record-V7UU6CG3.js.map +1 -0
  297. package/dist/fetch-2O7EUCCZ.js +139 -0
  298. package/dist/fetch-GMNE6KOJ.js +176 -0
  299. package/dist/find-LZZNPFJH.js +134 -0
  300. package/dist/find-LZZNPFJH.js.map +1 -0
  301. package/dist/fit-S5ZGPNE3.js +56 -0
  302. package/dist/flows-5SXT5F22.js +247 -0
  303. package/dist/flows-5SXT5F22.js.map +1 -0
  304. package/dist/follow-UNIHLZKA.js +94 -0
  305. package/dist/follow-competitors-CQL2B55H.js +112 -0
  306. package/dist/following-GMXZIEDZ.js +113 -0
  307. package/dist/fonts-GPJQLNQL.js +35 -0
  308. package/dist/forecast-6AHSHRDJ.js +168 -0
  309. package/dist/forecast-V6BCMR4Y.js +104 -0
  310. package/dist/funding-WPREDQVA.js +85 -0
  311. package/dist/funnel-QDYX3UH5.js +394 -0
  312. package/dist/ga4-6AUOX2UW.js +55 -0
  313. package/dist/generate-LWSAKRIT.js +263 -0
  314. package/dist/generate-LWSAKRIT.js.map +1 -0
  315. package/dist/get-5OEDAT2Q.js +63 -0
  316. package/dist/get-7WEE5V7M.js +56 -0
  317. package/dist/get-DXGJSEZZ.js +63 -0
  318. package/dist/get-GQWOLALT.js +59 -0
  319. package/dist/get-W7F4FOAR.js +92 -0
  320. package/dist/get-WY6JXFP6.js +61 -0
  321. package/dist/get-X6DSFXN6.js +78 -0
  322. package/dist/gif-JXWSR2TC.js +94 -0
  323. package/dist/google-44QA3M4N.js +3190 -0
  324. package/dist/google-44QA3M4N.js.map +1 -0
  325. package/dist/google-6QFL6GV3.js +136 -0
  326. package/dist/google-ads-ZG3BDUEG.js +195 -0
  327. package/dist/group-7ADT2GWA.js +43 -0
  328. package/dist/group-VD3UIBKE.js +43 -0
  329. package/dist/gsc-WHMPFTYA.js +30 -0
  330. package/dist/history-33JKOKAV.js +133 -0
  331. package/dist/history-M3IKDCEO.js +67 -0
  332. package/dist/hubspot-B4IUIOYX.js +779 -0
  333. package/dist/icon-R2K27DKI.js +137 -0
  334. package/dist/ideas-HHTLPC6Y.js +39 -0
  335. package/dist/images-PV6TZQLL.js +90 -0
  336. package/dist/improve-TVFAR27Q.js +86 -0
  337. package/dist/ingest-25ZX36RL.js +23 -0
  338. package/dist/ingest-MFIT3L23.js +107 -0
  339. package/dist/insights-CE3GICP7.js +423 -0
  340. package/dist/insights-CE3GICP7.js.map +1 -0
  341. package/dist/insights-TGAQLNHO.js +122 -0
  342. package/dist/insights-TGAQLNHO.js.map +1 -0
  343. package/dist/inspect-2IASA5YV.js +189 -0
  344. package/dist/inspiration-O56SOIQP.js +53 -0
  345. package/dist/intent-JOW24MTF.js +95 -0
  346. package/dist/job-QUO6KULI.js +202 -0
  347. package/dist/job-create-JTOG5M3Q.js +109 -0
  348. package/dist/job-status-3B4X5IPG.js +74 -0
  349. package/dist/keep-5TVGX7EG.js +78 -0
  350. package/dist/keyword-gap-SHLXRIHO.js +130 -0
  351. package/dist/keyword-metrics-NYH6DXKJ.js +197 -0
  352. package/dist/keywords-for-site-JTK64W4I.js +128 -0
  353. package/dist/landing-4V7HMYCZ.js +28 -0
  354. package/dist/landings-LZZO4VVW.js +151 -0
  355. package/dist/languages-TINK472E.js +55 -0
  356. package/dist/languages-ZIGJHY2T.js +40 -0
  357. package/dist/launches-C5XXNF7C.js +19 -0
  358. package/dist/layerize-YVCA4JO7.js +190 -0
  359. package/dist/leads-2WTL7F24.js +90 -0
  360. package/dist/leads-QUO3YNHO.js +293 -0
  361. package/dist/learn-RL66WKHT.js +204 -0
  362. package/dist/learn-RL66WKHT.js.map +1 -0
  363. package/dist/library-EEHRR7WX.js +109 -0
  364. package/dist/library-EEHRR7WX.js.map +1 -0
  365. package/dist/lighthouse-QLFI7PSQ.js +75 -0
  366. package/dist/line-item-writes-SYSYGV3L.js +208 -0
  367. package/dist/line-items-H3M6T7P2.js +103 -0
  368. package/dist/link-EHSSSV6K.js +64 -0
  369. package/dist/linkedin-BGZIR43P.js +1008 -0
  370. package/dist/list-2IAOPMQC.js +76 -0
  371. package/dist/list-BGT2BEWD.js +57 -0
  372. package/dist/list-G2VYAKYF.js +151 -0
  373. package/dist/list-IFXQWBBE.js +65 -0
  374. package/dist/list-LK3CVZ3B.js +50 -0
  375. package/dist/list-X2TMGY7C.js +303 -0
  376. package/dist/list-X3SEZDKE.js +51 -0
  377. package/dist/list-ZFS7XBD7.js +63 -0
  378. package/dist/locations-JC2H5JMY.js +67 -0
  379. package/dist/locations-M4L7FUOB.js +40 -0
  380. package/dist/log-4EINR63D.js +92 -0
  381. package/dist/logo-7GDRTSLI.js +18 -0
  382. package/dist/lookup-SJXNPUXG.js +22 -0
  383. package/dist/make-4XCSN76S.js +1137 -0
  384. package/dist/make-4XCSN76S.js.map +1 -0
  385. package/dist/map-EFEKUPNJ.js +433 -0
  386. package/dist/map-EFEKUPNJ.js.map +1 -0
  387. package/dist/mcp-RQJAEJCJ.js +463 -0
  388. package/dist/media-FYGHJAEG.js +89 -0
  389. package/dist/media-YYYCKXMZ.js +15 -0
  390. package/dist/media-sources-ZLBIC4RM.js +32 -0
  391. package/dist/members-SXATNT7V.js +44 -0
  392. package/dist/meta-OGB3NB2W.js +69 -0
  393. package/dist/metrics-52ZARN6M.js +152 -0
  394. package/dist/models-LSEMO4XH.js +155 -0
  395. package/dist/normalize-3HI26S34.js +806 -0
  396. package/dist/normalize-SOFYZQSJ.js +141 -0
  397. package/dist/options-GKSCCFM7.js +122 -0
  398. package/dist/options-GKSCCFM7.js.map +1 -0
  399. package/dist/output-YJ4YBUU4.js +24 -0
  400. package/dist/page-ZGCK6MOQ.js +105 -0
  401. package/dist/pages-QMP3W2R3.js +66 -0
  402. package/dist/performance-BQSWGNFO.js +24 -0
  403. package/dist/pinterest-LCVUB2ZL.js +96 -0
  404. package/dist/pixels-UQGAPBLG.js +60 -0
  405. package/dist/pixels-YM2DX7EN.js +108 -0
  406. package/dist/plan-Z5TZRRCH.js +207 -0
  407. package/dist/preview-DZQUUQGD.js +169 -0
  408. package/dist/profile-SXX36XVS.js +159 -0
  409. package/dist/profile-SXX36XVS.js.map +1 -0
  410. package/dist/promoted-tweet-writes-VUNJIUA3.js +180 -0
  411. package/dist/promoted-tweets-55X4H7NG.js +119 -0
  412. package/dist/properties-CSW67FJG.js +101 -0
  413. package/dist/publish-U73OR33K.js +322 -0
  414. package/dist/query-UQQNESTT.js +236 -0
  415. package/dist/query-V4I3VCJ7.js +61 -0
  416. package/dist/query-XPCC7OUP.js +247 -0
  417. package/dist/questionnaire-UQNRYZK7.js +93 -0
  418. package/dist/read-RXAOLPG5.js +141 -0
  419. package/dist/reddit-C2B7NT7X.js +26 -0
  420. package/dist/refresh-JN4HKE4H.js +94 -0
  421. package/dist/release-HSAOBN5K.js +60 -0
  422. package/dist/relevant-pages-XBWFEHHE.js +99 -0
  423. package/dist/remove-G5UXVQ2W.js +50 -0
  424. package/dist/remove-Q4TL5ZFS.js +48 -0
  425. package/dist/reopen-D26VSRRL.js +63 -0
  426. package/dist/rerun-NWOGRYHU.js +89 -0
  427. package/dist/rerun-NWOGRYHU.js.map +1 -0
  428. package/dist/research-CRYX2CAR.js +262 -0
  429. package/dist/research-XRVD2GSG.js +62 -0
  430. package/dist/reset-2VVN4CY7.js +54 -0
  431. package/dist/reset-FWDPBHYO.js +54 -0
  432. package/dist/resolve-D4PCGIWO.js +121 -0
  433. package/dist/retry-AHZFHMTH.js +60 -0
  434. package/dist/retry-FV6ASVO5.js +62 -0
  435. package/dist/retry-failed-AENQRGML.js +45 -0
  436. package/dist/rules-DSLE6LVU.js +95 -0
  437. package/dist/rules-DSLE6LVU.js.map +1 -0
  438. package/dist/rules-add-NBOMKFAI.js +446 -0
  439. package/dist/rules-add-NBOMKFAI.js.map +1 -0
  440. package/dist/run-AGSHZQND.js +65 -0
  441. package/dist/run-IRJWKZ3K.js +64 -0
  442. package/dist/scaffold-ad-3BSA7BWT.js +1553 -0
  443. package/dist/scaffold-ad-3BSA7BWT.js.map +1 -0
  444. package/dist/scaffold-static-ad-Q26LLBWQ.js +976 -0
  445. package/dist/scaffold-static-ad-Q26LLBWQ.js.map +1 -0
  446. package/dist/scaffold-video-WE52C7YZ.js +877 -0
  447. package/dist/scaffold-video-WE52C7YZ.js.map +1 -0
  448. package/dist/schedule-DTKBBIEH.js +66 -0
  449. package/dist/schedule-ESHQ4II7.js +61 -0
  450. package/dist/scheduled-agents-AREYFW23.js +50 -0
  451. package/dist/scheduled-agents-AREYFW23.js.map +1 -0
  452. package/dist/schema-OBF4T2QN.js +63 -0
  453. package/dist/schema-SWG2WKYX.js +132 -0
  454. package/dist/scrape-AGGDUPPD.js +2241 -0
  455. package/dist/screenshot-6GGCQCIV.js +102 -0
  456. package/dist/search-FRSFGJLZ.js +92 -0
  457. package/dist/search-I64WW2QC.js +174 -0
  458. package/dist/search-L2KHX5DO.js +224 -0
  459. package/dist/search-MBDEQ6EE.js +26 -0
  460. package/dist/search-UCDN4TOT.js +91 -0
  461. package/dist/search-copy-HX3FYZGT.js +168 -0
  462. package/dist/seeds-VFEFE4AK.js +101 -0
  463. package/dist/select-4IQQNKLN.js +100 -0
  464. package/dist/select-4IQQNKLN.js.map +1 -0
  465. package/dist/sends-WDSOXBSS.js +309 -0
  466. package/dist/sequences-NMJ55HS5.js +146 -0
  467. package/dist/set-prompt-DE4TD2V7.js +192 -0
  468. package/dist/set-prompt-DE4TD2V7.js.map +1 -0
  469. package/dist/setup-links-NAAUQD7O.js +141 -0
  470. package/dist/shared-3GVQQQNL.js +31 -0
  471. package/dist/site-VTJU5CRE.js +177 -0
  472. package/dist/sitemaps-KS57YDGB.js +87 -0
  473. package/dist/sites-PUEEVW7H.js +101 -0
  474. package/dist/skills-N6NRI2LC.js +47 -0
  475. package/dist/sources-CMUU4FER.js +454 -0
  476. package/dist/sources-CMUU4FER.js.map +1 -0
  477. package/dist/sources-YUMNEFK5.js +30 -0
  478. package/dist/stale-E34H24C3.js +70 -0
  479. package/dist/stale-E34H24C3.js.map +1 -0
  480. package/dist/stats-SY6GRHKB.js +34 -0
  481. package/dist/status-PVW64CLX.js +62 -0
  482. package/dist/sticker-YS6W5TSZ.js +94 -0
  483. package/dist/stock-DWL5E6K4.js +179 -0
  484. package/dist/studio-SXBK2IJJ.js +49 -0
  485. package/dist/sync-FOLYGQDI.js +54 -0
  486. package/dist/sync-NORMNZEE.js +54 -0
  487. package/dist/sync-XHJDCWWP.js +265 -0
  488. package/dist/sync-XHJDCWWP.js.map +1 -0
  489. package/dist/sync-definition-DTWEW6ZC.js +61 -0
  490. package/dist/tag-manager-ARFZU46G.js +43 -0
  491. package/dist/tags-77JUO75W.js +20 -0
  492. package/dist/tags-DOJUSHJB.js +224 -0
  493. package/dist/tags-IESRRMGW.js +20 -0
  494. package/dist/tags-MRTUBMRD.js +20 -0
  495. package/dist/tags-SP6GW4R7.js +26 -0
  496. package/dist/targeting-constants-DVGRIRKD.js +118 -0
  497. package/dist/targeting-criteria-SOK3HUE2.js +113 -0
  498. package/dist/targets-V2HNKVUL.js +102 -0
  499. package/dist/testimonials-PA2FUV4H.js +32 -0
  500. package/dist/themes-IDB7YPHW.js +94 -0
  501. package/dist/top-companies-XDP4SZN7.js +108 -0
  502. package/dist/translate-V6XPDX4M.js +604 -0
  503. package/dist/translate-V6XPDX4M.js.map +1 -0
  504. package/dist/triggers-QDXCA5P4.js +141 -0
  505. package/dist/tweets-AISMWXM3.js +123 -0
  506. package/dist/unfollow-PHLMILG2.js +46 -0
  507. package/dist/unlink-GDZV5GVL.js +67 -0
  508. package/dist/unstage-WCC2TI5Z.js +95 -0
  509. package/dist/unstage-WDJXHSAV.js +84 -0
  510. package/dist/update-KBF35KYV.js +63 -0
  511. package/dist/update-MRG5MPHR.js +98 -0
  512. package/dist/update-XNNQGZBO.js +155 -0
  513. package/dist/update-ZGDQJPDL.js +142 -0
  514. package/dist/upload-ID35OCCY.js +126 -0
  515. package/dist/upload-R7YJORED.js +150 -0
  516. package/dist/upscale-XPGVJWW2.js +109 -0
  517. package/dist/url-options-6X7M2J7D.js +130 -0
  518. package/dist/url-params-WRLCJRJQ.js +98 -0
  519. package/dist/use-VCL3PRCB.js +95 -0
  520. package/dist/validate-VTAKQGD5.js +95 -0
  521. package/dist/validate-VTAKQGD5.js.map +1 -0
  522. package/dist/variant-2NADVT6Q.js +338 -0
  523. package/dist/videos-M6VK66NI.js +39 -0
  524. package/dist/view-Q5B57K42.js +121 -0
  525. package/dist/viewer-check-3T2EZOSH.js +79 -0
  526. package/dist/viewer-check-3T2EZOSH.js.map +1 -0
  527. package/dist/web-GOD7BF7X.js +140 -0
  528. package/dist/winners-PK6EMR6B.js +113 -0
  529. package/dist/winning-ads-F765TFLS.js +84 -0
  530. package/dist/write-commands-4KWMNH6A.js +1015 -0
  531. package/dist/write-commands-7ECRGXLK.js +737 -0
  532. package/dist/write-commands-GL2PHXSU.js +713 -0
  533. package/dist/write-commands-NMV65XXB.js +206 -0
  534. package/dist/x-MDENBZ3X.js +47 -0
  535. package/package.json +1 -1
  536. package/dist/account-67PZBEP6.js +0 -79
  537. package/dist/account-HZC6X2PH.js +0 -49
  538. package/dist/account-TQUV64XP.js +0 -80
  539. package/dist/account-reads-IRBTERTY.js +0 -218
  540. package/dist/account-writes-ALDSHAEV.js +0 -66
  541. package/dist/accounts-4P54UY6F.js +0 -115
  542. package/dist/accounts-6UNBLIUH.js +0 -75
  543. package/dist/accounts-GVTZN4VE.js +0 -114
  544. package/dist/accounts-NJ6TF6WH.js +0 -611
  545. package/dist/accounts-WTB737BM.js +0 -77
  546. package/dist/actions-D3BOWDEB.js +0 -55
  547. package/dist/active-entities-J2O76SRP.js +0 -103
  548. package/dist/activities-2J7FTZMN.js +0 -74
  549. package/dist/ad-group-writes-PQKDCMQF.js +0 -170
  550. package/dist/ad-groups-NGYEJMV4.js +0 -68
  551. package/dist/ad-writes-77FVHJTS.js +0 -174
  552. package/dist/add-2FHPLALV.js +0 -105
  553. package/dist/add-2XJYOGKW.js +0 -104
  554. package/dist/add-62JPGFD4.js +0 -302
  555. package/dist/add-JP76KCCY.js +0 -97
  556. package/dist/add-accounts-M5Y4DQFM.js +0 -91
  557. package/dist/ads-DB5NDHX5.js +0 -128
  558. package/dist/ads-J2F7BSHR.js +0 -45
  559. package/dist/ads-J2F7BSHR.js.map +0 -1
  560. package/dist/ads-LYNA2I7B.js +0 -77
  561. package/dist/ads-W2IPUWHQ.js +0 -113
  562. package/dist/adsets-PY5ZKGBO.js +0 -176
  563. package/dist/advertisers-BVAZ4XUX.js +0 -125
  564. package/dist/advertisers-NZPJQF7W.js +0 -120
  565. package/dist/analytics-K2QIWKBN.js +0 -444
  566. package/dist/analytics-K2QIWKBN.js.map +0 -1
  567. package/dist/analytics-NTPZKMYK.js +0 -1976
  568. package/dist/animate-EIV2OHXT.js +0 -480
  569. package/dist/assign-UNIA5YDC.js +0 -77
  570. package/dist/audience-size-4NN6ENP5.js +0 -94
  571. package/dist/audiences-45ZCY2VZ.js +0 -268
  572. package/dist/audiences-UUIYQFS6.js +0 -78
  573. package/dist/audiences-VYFX7OFS.js +0 -85
  574. package/dist/audit-NSVHNA5J.js +0 -151
  575. package/dist/audit-OWXTLQC4.js +0 -88
  576. package/dist/autocomplete-EHWAQYVB.js +0 -111
  577. package/dist/avatars-7WZPW7BV.js +0 -38
  578. package/dist/bid-pricing-F5NDMS6W.js +0 -99
  579. package/dist/brand-QAJ5VWFM.js +0 -22
  580. package/dist/brief-V2OB5OJW.js +0 -490
  581. package/dist/brief-V2OB5OJW.js.map +0 -1
  582. package/dist/businesses-ZH67AXR6.js +0 -53
  583. package/dist/campaign-groups-KFJKLNNU.js +0 -95
  584. package/dist/campaign-writes-BDGQ6XB3.js +0 -170
  585. package/dist/campaign-writes-FNMAGCKB.js +0 -165
  586. package/dist/campaigns-66OOGMDW.js +0 -110
  587. package/dist/campaigns-6HMHOXXY.js +0 -109
  588. package/dist/campaigns-HJTGX5WW.js +0 -76
  589. package/dist/campaigns-KT3J2O7S.js +0 -107
  590. package/dist/canvas-MQ6ZE5CZ.js +0 -46
  591. package/dist/capabilities-RVUMPP7C.js +0 -144
  592. package/dist/cards-I4BZIYUV.js +0 -85
  593. package/dist/catalog-NLL5VDRK.js +0 -64
  594. package/dist/catalog-NLL5VDRK.js.map +0 -1
  595. package/dist/catalogs-B2NKQO24.js +0 -128
  596. package/dist/changes-FX3TPYGT.js +0 -135
  597. package/dist/chatgpt-3NS2R442.js +0 -47
  598. package/dist/chats-72L7U4ML.js +0 -262
  599. package/dist/chunk-2KIF3U2C.js +0 -51
  600. package/dist/chunk-35ENAFJX.js +0 -46
  601. package/dist/chunk-3ZWHAIMU.js +0 -207
  602. package/dist/chunk-3ZWHAIMU.js.map +0 -1
  603. package/dist/chunk-4DM6OAQ6.js +0 -2065
  604. package/dist/chunk-4DM6OAQ6.js.map +0 -1
  605. package/dist/chunk-4TU2MWBJ.js +0 -275
  606. package/dist/chunk-57UECM77.js +0 -98
  607. package/dist/chunk-5HYSKH77.js +0 -315
  608. package/dist/chunk-5HYSKH77.js.map +0 -1
  609. package/dist/chunk-65BQAJMH.js +0 -136
  610. package/dist/chunk-6GFJFTG6.js +0 -75
  611. package/dist/chunk-6HPIWZHS.js +0 -76
  612. package/dist/chunk-73B3RQJC.js +0 -610
  613. package/dist/chunk-73B3RQJC.js.map +0 -1
  614. package/dist/chunk-7GYM4I5I.js +0 -206
  615. package/dist/chunk-7NTION5F.js +0 -26
  616. package/dist/chunk-7SX73SH2.js +0 -2902
  617. package/dist/chunk-7SX73SH2.js.map +0 -1
  618. package/dist/chunk-AFDPISNJ.js +0 -111
  619. package/dist/chunk-AIDXJHZ4.js +0 -433
  620. package/dist/chunk-AR7PU7BB.js +0 -76
  621. package/dist/chunk-AXVOBRQT.js +0 -1442
  622. package/dist/chunk-AXVOBRQT.js.map +0 -1
  623. package/dist/chunk-BBBZR7MF.js +0 -160
  624. package/dist/chunk-BBBZR7MF.js.map +0 -1
  625. package/dist/chunk-BVYPRGPG.js +0 -92
  626. package/dist/chunk-CAMX6OHF.js +0 -3182
  627. package/dist/chunk-CAMX6OHF.js.map +0 -1
  628. package/dist/chunk-CBCGVPHB.js +0 -125
  629. package/dist/chunk-CECS3DHZ.js +0 -333
  630. package/dist/chunk-CZYUZL6R.js +0 -3151
  631. package/dist/chunk-CZYUZL6R.js.map +0 -1
  632. package/dist/chunk-D5MF337I.js +0 -97
  633. package/dist/chunk-DDTILZXI.js +0 -103
  634. package/dist/chunk-DL2W4N7J.js +0 -52
  635. package/dist/chunk-DLUWHZCE.js +0 -225
  636. package/dist/chunk-EOGPNV25.js +0 -509
  637. package/dist/chunk-F3FSD6BO.js +0 -96
  638. package/dist/chunk-FDG2LLX7.js +0 -494
  639. package/dist/chunk-FE7T32YL.js +0 -163
  640. package/dist/chunk-FE7T32YL.js.map +0 -1
  641. package/dist/chunk-FIN4ZXGJ.js +0 -70
  642. package/dist/chunk-FIN4ZXGJ.js.map +0 -1
  643. package/dist/chunk-FO5EP6DA.js +0 -24008
  644. package/dist/chunk-FO5EP6DA.js.map +0 -1
  645. package/dist/chunk-FSGTITIW.js +0 -622
  646. package/dist/chunk-FSGTITIW.js.map +0 -1
  647. package/dist/chunk-FSPV2DUG.js +0 -310
  648. package/dist/chunk-FSPV2DUG.js.map +0 -1
  649. package/dist/chunk-FYAWA3FO.js +0 -1830
  650. package/dist/chunk-FYAWA3FO.js.map +0 -1
  651. package/dist/chunk-G3KO2HFZ.js +0 -35
  652. package/dist/chunk-GKXMIXEV.js +0 -166
  653. package/dist/chunk-GT4UFORX.js +0 -296
  654. package/dist/chunk-GZ6YS7TG.js +0 -106
  655. package/dist/chunk-H7JOVRHO.js +0 -106
  656. package/dist/chunk-IJDF7D4U.js +0 -139
  657. package/dist/chunk-INJHF7AF.js +0 -172
  658. package/dist/chunk-IZFGTGFR.js +0 -67
  659. package/dist/chunk-J2QOKD2F.js +0 -76
  660. package/dist/chunk-J5WZ7SAD.js +0 -346
  661. package/dist/chunk-JC6GNMA7.js +0 -297
  662. package/dist/chunk-KB5HBQEK.js +0 -25
  663. package/dist/chunk-KB5XJHQX.js +0 -216
  664. package/dist/chunk-KM4AAAHZ.js +0 -5187
  665. package/dist/chunk-KM4AAAHZ.js.map +0 -1
  666. package/dist/chunk-LFZTGIPJ.js +0 -384
  667. package/dist/chunk-LFZTGIPJ.js.map +0 -1
  668. package/dist/chunk-LHNL6JM2.js +0 -309
  669. package/dist/chunk-LMHVLUD4.js +0 -175
  670. package/dist/chunk-LMHVLUD4.js.map +0 -1
  671. package/dist/chunk-NAMEFVWL.js +0 -1743
  672. package/dist/chunk-NFSLRRIE.js +0 -77
  673. package/dist/chunk-NORAJYUI.js +0 -172
  674. package/dist/chunk-NQTSHC7Z.js +0 -304
  675. package/dist/chunk-NQTSHC7Z.js.map +0 -1
  676. package/dist/chunk-O3LHCQ7Q.js +0 -136
  677. package/dist/chunk-O4ABJ352.js +0 -4410
  678. package/dist/chunk-O4ABJ352.js.map +0 -1
  679. package/dist/chunk-O5XLQUDS.js +0 -846
  680. package/dist/chunk-OI7KSXZM.js +0 -6265
  681. package/dist/chunk-OI7KSXZM.js.map +0 -1
  682. package/dist/chunk-OO67YTPM.js +0 -35
  683. package/dist/chunk-OO67YTPM.js.map +0 -1
  684. package/dist/chunk-OXBPKBSK.js +0 -6667
  685. package/dist/chunk-OXBPKBSK.js.map +0 -1
  686. package/dist/chunk-P3XJUOWT.js +0 -474
  687. package/dist/chunk-P3XJUOWT.js.map +0 -1
  688. package/dist/chunk-P3ZJIIDS.js +0 -57
  689. package/dist/chunk-P5T7OZKV.js +0 -26
  690. package/dist/chunk-P66JWKAL.js +0 -533
  691. package/dist/chunk-P66JWKAL.js.map +0 -1
  692. package/dist/chunk-PA5MYVQY.js +0 -66
  693. package/dist/chunk-PELW56D7.js +0 -45
  694. package/dist/chunk-PGVF4SB7.js +0 -169
  695. package/dist/chunk-Q676JHJA.js +0 -58
  696. package/dist/chunk-QDOVBGKZ.js +0 -149
  697. package/dist/chunk-QHIUJXU7.js +0 -363
  698. package/dist/chunk-QJPPPQPD.js +0 -98
  699. package/dist/chunk-QNEX7FEC.js +0 -174
  700. package/dist/chunk-QTL4NJ5I.js +0 -65
  701. package/dist/chunk-QTL4NJ5I.js.map +0 -1
  702. package/dist/chunk-QWX3QJNM.js +0 -170
  703. package/dist/chunk-QXDEZKAR.js +0 -455
  704. package/dist/chunk-QXDEZKAR.js.map +0 -1
  705. package/dist/chunk-RG7OMI5W.js +0 -1621
  706. package/dist/chunk-RG7OMI5W.js.map +0 -1
  707. package/dist/chunk-RUHMLPH5.js +0 -455
  708. package/dist/chunk-SJLIV6PF.js +0 -19
  709. package/dist/chunk-SLCSLVGS.js +0 -274
  710. package/dist/chunk-THU74XR6.js +0 -96
  711. package/dist/chunk-TY7TEU3T.js +0 -1079
  712. package/dist/chunk-UXTZ5MBE.js +0 -56
  713. package/dist/chunk-V43RLLZE.js +0 -55
  714. package/dist/chunk-V7PMSMPF.js +0 -817
  715. package/dist/chunk-V7PMSMPF.js.map +0 -1
  716. package/dist/chunk-VFSLIDXA.js +0 -42
  717. package/dist/chunk-VHMNSO2B.js +0 -84
  718. package/dist/chunk-VKH6LSC2.js +0 -188
  719. package/dist/chunk-VTCBPYGE.js +0 -592
  720. package/dist/chunk-W6ASM6UP.js +0 -197
  721. package/dist/chunk-W7KB3LJE.js +0 -60
  722. package/dist/chunk-WESRVXFS.js +0 -133
  723. package/dist/chunk-WESRVXFS.js.map +0 -1
  724. package/dist/chunk-WILN7TD6.js +0 -84
  725. package/dist/chunk-YGK7ZHNI.js +0 -337
  726. package/dist/chunk-YGK7ZHNI.js.map +0 -1
  727. package/dist/chunk-YGL5LTEA.js +0 -665
  728. package/dist/chunk-YONSWWCF.js +0 -215
  729. package/dist/chunk-Z5KBRTB2.js +0 -191
  730. package/dist/chunk-Z62XZCBE.js +0 -541
  731. package/dist/chunk-Z62XZCBE.js.map +0 -1
  732. package/dist/chunk-ZBKBTTHD.js +0 -74
  733. package/dist/chunk-ZJR5E53N.js +0 -23
  734. package/dist/chunk-ZLU5QDLU.js +0 -486
  735. package/dist/chunk-ZLU5QDLU.js.map +0 -1
  736. package/dist/chunk-ZNNC6B75.js +0 -94
  737. package/dist/chunk-ZO2YLHRW.js +0 -74
  738. package/dist/chunk-ZPJE6D7W.js +0 -74
  739. package/dist/claim-DIITRUIN.js +0 -197
  740. package/dist/client-LY2JCQS2.js +0 -19
  741. package/dist/code-7CBNYUPU.js +0 -76
  742. package/dist/companies-HHSYHL74.js +0 -195
  743. package/dist/complete-M3TURPU5.js +0 -81
  744. package/dist/config-7COTFJWK.js +0 -88
  745. package/dist/connect-TQL5EVVE.js +0 -42
  746. package/dist/content-OXMONMHJ.js +0 -85
  747. package/dist/conversation-GE273GC4.js +0 -93
  748. package/dist/conversion-report-BH4HH2Q3.js +0 -125
  749. package/dist/conversion-upload-command-QWWYCTNV.js +0 -438
  750. package/dist/conversion-writes-HG2O6JI7.js +0 -120
  751. package/dist/conversions-DP6ZF57D.js +0 -135
  752. package/dist/conversions-XPSN7SOW.js +0 -76
  753. package/dist/countries-UXAUGSBR.js +0 -82
  754. package/dist/create-ENQWVWGB.js +0 -59
  755. package/dist/create-NVXJP477.js +0 -207
  756. package/dist/create-PITWGVAS.js +0 -130
  757. package/dist/create-PITWGVAS.js.map +0 -1
  758. package/dist/create-XLZYNFKN.js +0 -235
  759. package/dist/creatives-O3444SBT.js +0 -182
  760. package/dist/creatives-ONKKGW5T.js +0 -87
  761. package/dist/creatives-U6IKIQBT.js +0 -51
  762. package/dist/creatives-U6IKIQBT.js.map +0 -1
  763. package/dist/credentials-3UY7RVUL.js +0 -287
  764. package/dist/critique-3LMW73QJ.js +0 -1449
  765. package/dist/critique-3LMW73QJ.js.map +0 -1
  766. package/dist/critique-KB32Y4AW.js +0 -213
  767. package/dist/critique-KB32Y4AW.js.map +0 -1
  768. package/dist/crm-OX67TBWD.js +0 -224
  769. package/dist/crm-XXU5XZIQ.js +0 -318
  770. package/dist/crop-3ZV5BFCA.js +0 -113
  771. package/dist/currency-XP4EMU4M.js +0 -88
  772. package/dist/custom-conversions-TV23XQHW.js +0 -125
  773. package/dist/customers-EJ7FVCTC.js +0 -56
  774. package/dist/decide-EGQ3CRHI.js +0 -199
  775. package/dist/delete-55IHV25V.js +0 -63
  776. package/dist/delete-GXLPIGTC.js +0 -54
  777. package/dist/delete-MUPTLWHI.js +0 -71
  778. package/dist/delete-OW2N4WIA.js +0 -66
  779. package/dist/delete-R2SEUSLV.js +0 -69
  780. package/dist/delete-ZGBBWFAW.js +0 -71
  781. package/dist/demographics-K6DEWUE5.js +0 -138
  782. package/dist/describe-4O3VCV6L.js +0 -97
  783. package/dist/describe-FCTM53MM.js +0 -97
  784. package/dist/dimensions-AD4VS5AH.js +0 -101
  785. package/dist/discard-NZ7FQJEE.js +0 -66
  786. package/dist/discover-OISU5EJF.js +0 -172
  787. package/dist/discover-UQXQUPNO.js +0 -93
  788. package/dist/domain-DXBHNZLO.js +0 -98
  789. package/dist/download-IE6XLFHM.js +0 -299
  790. package/dist/draft-DB6KMBCH.js +0 -306
  791. package/dist/draft-ENA7S4Y7.js +0 -103
  792. package/dist/draft-HJBAG3SN.js +0 -307
  793. package/dist/draft-ICEVLF4E.js +0 -328
  794. package/dist/draft-MGKJ5RYI.js +0 -100
  795. package/dist/draft-OBFKQEPK.js +0 -281
  796. package/dist/draft-OOHU6NMA.js +0 -217
  797. package/dist/draft-S6VPKZYY.js +0 -233
  798. package/dist/env-YLOVBOAE.js +0 -43
  799. package/dist/experiment-PHFP6IBM.js +0 -1397
  800. package/dist/export-R2IMUCQO.js +0 -168
  801. package/dist/extract-OQP3TSQG.js +0 -113
  802. package/dist/facets-NUKR7I57.js +0 -114
  803. package/dist/favorites-NS73FDG5.js +0 -178
  804. package/dist/feed-SQPOB7SP.js +0 -177
  805. package/dist/feedback-SQAAAKOQ.js +0 -66
  806. package/dist/feedback-record-7W7WBHSQ.js +0 -175
  807. package/dist/feedback-record-7W7WBHSQ.js.map +0 -1
  808. package/dist/fetch-PQ3NOPIE.js +0 -139
  809. package/dist/fetch-PTSAVQW5.js +0 -176
  810. package/dist/find-Y22AANDE.js +0 -134
  811. package/dist/find-Y22AANDE.js.map +0 -1
  812. package/dist/fit-IITU6UWC.js +0 -45
  813. package/dist/flows-ZLF3QJ76.js +0 -247
  814. package/dist/flows-ZLF3QJ76.js.map +0 -1
  815. package/dist/follow-N3DQZV7M.js +0 -94
  816. package/dist/follow-competitors-BZPCBGIB.js +0 -112
  817. package/dist/following-KESWTEBR.js +0 -113
  818. package/dist/fonts-FG6XMK5A.js +0 -34
  819. package/dist/forecast-43XBSHJR.js +0 -168
  820. package/dist/forecast-MAFZQ4UF.js +0 -104
  821. package/dist/funding-HYSCYS62.js +0 -85
  822. package/dist/funnel-32CNV57L.js +0 -394
  823. package/dist/ga4-J2KTNCD4.js +0 -55
  824. package/dist/generate-G3I5BLLW.js +0 -262
  825. package/dist/generate-G3I5BLLW.js.map +0 -1
  826. package/dist/get-3P2EQLP3.js +0 -63
  827. package/dist/get-FJB3X44Z.js +0 -61
  828. package/dist/get-GDF5V3RN.js +0 -78
  829. package/dist/get-MBGO4VJD.js +0 -63
  830. package/dist/get-NOKSZPIV.js +0 -59
  831. package/dist/get-W7MKBMQ3.js +0 -56
  832. package/dist/get-WHC4SRYK.js +0 -92
  833. package/dist/gif-SFYVDLCU.js +0 -94
  834. package/dist/google-THWFDDHJ.js +0 -3191
  835. package/dist/google-THWFDDHJ.js.map +0 -1
  836. package/dist/google-XRAMIES5.js +0 -136
  837. package/dist/google-ads-N55SE2CB.js +0 -195
  838. package/dist/group-6RDJTWVN.js +0 -43
  839. package/dist/group-TZJCKHKS.js +0 -43
  840. package/dist/gsc-HD6UFRYM.js +0 -30
  841. package/dist/history-4RWCE7WW.js +0 -67
  842. package/dist/history-IROFQ6LA.js +0 -133
  843. package/dist/hubspot-75N4AI43.js +0 -779
  844. package/dist/icon-BMCDFGMN.js +0 -137
  845. package/dist/ideas-7UQMXLI5.js +0 -32
  846. package/dist/images-OFR3S2U4.js +0 -90
  847. package/dist/improve-P6F2HXYQ.js +0 -86
  848. package/dist/ingest-HGR7KSG4.js +0 -107
  849. package/dist/ingest-XU4WXE4U.js +0 -23
  850. package/dist/insights-7SI2TB72.js +0 -128
  851. package/dist/insights-7SI2TB72.js.map +0 -1
  852. package/dist/insights-P5VIDOZN.js +0 -432
  853. package/dist/insights-P5VIDOZN.js.map +0 -1
  854. package/dist/inspect-TL2VZBN7.js +0 -189
  855. package/dist/inspiration-7WTS3AVI.js +0 -53
  856. package/dist/intent-OCZE4O7R.js +0 -95
  857. package/dist/job-XMPQ27SJ.js +0 -202
  858. package/dist/job-create-HTDQHPEF.js +0 -109
  859. package/dist/job-status-L7WUTZ2C.js +0 -74
  860. package/dist/keep-42SLV4CR.js +0 -78
  861. package/dist/keyword-gap-323NE4AK.js +0 -130
  862. package/dist/keyword-metrics-V6DGO7U5.js +0 -197
  863. package/dist/keywords-for-site-ANSLXBHB.js +0 -128
  864. package/dist/landing-K25GUBLZ.js +0 -28
  865. package/dist/landings-5IYXHA5Z.js +0 -151
  866. package/dist/languages-SRFGW6Z3.js +0 -55
  867. package/dist/languages-US6JUATO.js +0 -40
  868. package/dist/launches-7U4TPNO3.js +0 -108
  869. package/dist/launches-7U4TPNO3.js.map +0 -1
  870. package/dist/layerize-U672AXED.js +0 -190
  871. package/dist/leads-MXUQISOC.js +0 -293
  872. package/dist/leads-UJVKPRXX.js +0 -90
  873. package/dist/learn-XTEU4K66.js +0 -203
  874. package/dist/learn-XTEU4K66.js.map +0 -1
  875. package/dist/library-RPFXNER4.js +0 -109
  876. package/dist/library-RPFXNER4.js.map +0 -1
  877. package/dist/lighthouse-SJ4QNLUS.js +0 -75
  878. package/dist/line-item-writes-NURRHJ7P.js +0 -208
  879. package/dist/line-items-PC6QWV5J.js +0 -103
  880. package/dist/link-ZSXKCLQD.js +0 -64
  881. package/dist/linkedin-EZJJBKY3.js +0 -1008
  882. package/dist/list-ECF3RA26.js +0 -303
  883. package/dist/list-GQ65MC2N.js +0 -65
  884. package/dist/list-K56J7FZW.js +0 -51
  885. package/dist/list-M4Z3WYPM.js +0 -76
  886. package/dist/list-N7ZLO2LE.js +0 -63
  887. package/dist/list-Q5ZZRPHO.js +0 -151
  888. package/dist/list-SXYVDDMU.js +0 -57
  889. package/dist/list-XFIOXFB2.js +0 -50
  890. package/dist/locations-LZUHWKZY.js +0 -40
  891. package/dist/locations-NG4YXIBT.js +0 -67
  892. package/dist/log-EEBJQ6X2.js +0 -92
  893. package/dist/logo-4JOWGJ5A.js +0 -18
  894. package/dist/lookup-7NBZ64TE.js +0 -22
  895. package/dist/make-3J5EK52U.js +0 -633
  896. package/dist/make-3J5EK52U.js.map +0 -1
  897. package/dist/map-JVVNH2RI.js +0 -404
  898. package/dist/map-JVVNH2RI.js.map +0 -1
  899. package/dist/mcp-DAKGMA2Z.js +0 -463
  900. package/dist/media-2SWDJDA6.js +0 -15
  901. package/dist/media-R64YP7T2.js +0 -89
  902. package/dist/media-sources-L2X3KRDU.js +0 -32
  903. package/dist/members-22BOEGQS.js +0 -44
  904. package/dist/meta-RBHF2RG3.js +0 -69
  905. package/dist/metrics-IXRQZVSM.js +0 -152
  906. package/dist/models-BDXZ56GI.js +0 -155
  907. package/dist/normalize-JAE3NVOX.js +0 -141
  908. package/dist/normalize-P5Q3F7FU.js +0 -806
  909. package/dist/options-YTIU3BDC.js +0 -121
  910. package/dist/options-YTIU3BDC.js.map +0 -1
  911. package/dist/output-ZL62UZHQ.js +0 -24
  912. package/dist/page-FZ7IZ5CV.js +0 -105
  913. package/dist/pages-SS7TZTHV.js +0 -66
  914. package/dist/performance-FOOV624A.js +0 -24
  915. package/dist/performance-VYEANYQ5.js +0 -4707
  916. package/dist/performance-VYEANYQ5.js.map +0 -1
  917. package/dist/pinterest-UETS7U7U.js +0 -96
  918. package/dist/pixels-LCTMLKGP.js +0 -108
  919. package/dist/pixels-MPZYWGFD.js +0 -60
  920. package/dist/plan-V74EVXTW.js +0 -207
  921. package/dist/preview-RU54Z4EM.js +0 -169
  922. package/dist/profile-NQOIBLJL.js +0 -150
  923. package/dist/profile-NQOIBLJL.js.map +0 -1
  924. package/dist/promoted-tweet-writes-FQRFU7PB.js +0 -180
  925. package/dist/promoted-tweets-L2L3V5SF.js +0 -119
  926. package/dist/properties-ZUDQH3LE.js +0 -101
  927. package/dist/publish-5XTAHTM4.js +0 -322
  928. package/dist/query-26T7XATH.js +0 -236
  929. package/dist/query-SHUOHXTO.js +0 -247
  930. package/dist/query-XISUHMBR.js +0 -62
  931. package/dist/questionnaire-UG55JLVW.js +0 -93
  932. package/dist/read-UYSQAXRV.js +0 -141
  933. package/dist/reddit-BCB4FT6J.js +0 -26
  934. package/dist/refresh-WY5NPNLX.js +0 -94
  935. package/dist/release-JBSPPNQE.js +0 -60
  936. package/dist/relevant-pages-OU5H56KY.js +0 -99
  937. package/dist/remove-2KACTXKP.js +0 -48
  938. package/dist/remove-M5P7M5JU.js +0 -50
  939. package/dist/reopen-J3VW5766.js +0 -63
  940. package/dist/rerun-5MRYJG6U.js +0 -84
  941. package/dist/rerun-5MRYJG6U.js.map +0 -1
  942. package/dist/research-4CAA5CA2.js +0 -262
  943. package/dist/research-7LBTJ2B2.js +0 -62
  944. package/dist/reset-DBWWGCXY.js +0 -54
  945. package/dist/reset-DJSSXC4Y.js +0 -54
  946. package/dist/resolve-BNRUYS56.js +0 -121
  947. package/dist/retry-TMRIFGVT.js +0 -62
  948. package/dist/retry-WRBGLB7O.js +0 -60
  949. package/dist/retry-failed-NWLH6WHK.js +0 -45
  950. package/dist/run-TA3DP6QG.js +0 -59
  951. package/dist/run-VVTLDRRW.js +0 -65
  952. package/dist/scaffold-ad-7DSV6XDB.js +0 -1548
  953. package/dist/scaffold-ad-7DSV6XDB.js.map +0 -1
  954. package/dist/scaffold-static-ad-BEZ37QWN.js +0 -971
  955. package/dist/scaffold-static-ad-BEZ37QWN.js.map +0 -1
  956. package/dist/scaffold-video-SPCMTYK3.js +0 -872
  957. package/dist/scaffold-video-SPCMTYK3.js.map +0 -1
  958. package/dist/schedule-BQQGYGT7.js +0 -61
  959. package/dist/schedule-S547HPUT.js +0 -66
  960. package/dist/scheduled-agents-4Q6WS333.js +0 -49
  961. package/dist/scheduled-agents-4Q6WS333.js.map +0 -1
  962. package/dist/schema-DDEWM5ZX.js +0 -132
  963. package/dist/schema-SQIP75WG.js +0 -63
  964. package/dist/scrape-TI6S2W7I.js +0 -2241
  965. package/dist/screenshot-XFAYY4WW.js +0 -102
  966. package/dist/search-4HIOKYFR.js +0 -26
  967. package/dist/search-D2IV7KFJ.js +0 -92
  968. package/dist/search-IZPDHRJ4.js +0 -224
  969. package/dist/search-KFDL2IGG.js +0 -91
  970. package/dist/search-VJBKRD2U.js +0 -174
  971. package/dist/search-copy-QZXCAGK4.js +0 -168
  972. package/dist/seeds-VUNZMHZH.js +0 -101
  973. package/dist/select-U5TPAXGY.js +0 -94
  974. package/dist/select-U5TPAXGY.js.map +0 -1
  975. package/dist/sends-7HWLIOUO.js +0 -309
  976. package/dist/sequences-5RAGZE7L.js +0 -146
  977. package/dist/set-prompt-MHU4WI3Q.js +0 -185
  978. package/dist/set-prompt-MHU4WI3Q.js.map +0 -1
  979. package/dist/setup-links-SPIGXQTY.js +0 -141
  980. package/dist/shared-3CGGKICB.js +0 -31
  981. package/dist/site-FW6K6L6M.js +0 -177
  982. package/dist/sitemaps-3WDYQHYR.js +0 -87
  983. package/dist/sites-G4DQ2Z2X.js +0 -101
  984. package/dist/skills-PA26HXEP.js +0 -47
  985. package/dist/sources-4NAC6HV6.js +0 -421
  986. package/dist/sources-4NAC6HV6.js.map +0 -1
  987. package/dist/sources-PMBWG4KO.js +0 -30
  988. package/dist/stale-5IMY6MWC.js +0 -63
  989. package/dist/stale-5IMY6MWC.js.map +0 -1
  990. package/dist/stats-Q35I5DRW.js +0 -34
  991. package/dist/status-62SUXUWW.js +0 -62
  992. package/dist/sticker-MC2IAIQB.js +0 -94
  993. package/dist/stock-B7LKMKUK.js +0 -179
  994. package/dist/studio-BB2EVW5I.js +0 -49
  995. package/dist/sync-CLZDZL5F.js +0 -54
  996. package/dist/sync-XCHBEBZG.js +0 -279
  997. package/dist/sync-XCHBEBZG.js.map +0 -1
  998. package/dist/sync-YTHNOAAM.js +0 -54
  999. package/dist/sync-definition-DYSVT7BJ.js +0 -52
  1000. package/dist/tag-manager-EAREWVYR.js +0 -43
  1001. package/dist/tags-53AG3FYG.js +0 -20
  1002. package/dist/tags-7TH7TVR6.js +0 -224
  1003. package/dist/tags-EB4RE3ML.js +0 -20
  1004. package/dist/tags-EUEWDTTN.js +0 -20
  1005. package/dist/tags-ICAWBCOR.js +0 -26
  1006. package/dist/targeting-constants-IFE72XKL.js +0 -118
  1007. package/dist/targeting-criteria-WZDGJKOI.js +0 -113
  1008. package/dist/targets-OKJ6A4YL.js +0 -102
  1009. package/dist/templates-IA5TDCCZ.js +0 -178
  1010. package/dist/templates-IA5TDCCZ.js.map +0 -1
  1011. package/dist/testimonials-THHR5JH5.js +0 -32
  1012. package/dist/themes-ZFRM6AVO.js +0 -94
  1013. package/dist/top-companies-63Q475IA.js +0 -108
  1014. package/dist/translate-XKUWIIOS.js +0 -598
  1015. package/dist/translate-XKUWIIOS.js.map +0 -1
  1016. package/dist/triggers-XLKO2QXQ.js +0 -141
  1017. package/dist/tweets-7EZRFG3Y.js +0 -123
  1018. package/dist/unfollow-WBBTVEHE.js +0 -46
  1019. package/dist/unlink-P7KU54YU.js +0 -67
  1020. package/dist/unstage-EG7AUE5X.js +0 -84
  1021. package/dist/unstage-GHXGDOT2.js +0 -95
  1022. package/dist/update-7EWDO32L.js +0 -98
  1023. package/dist/update-BVYGB4YL.js +0 -142
  1024. package/dist/update-KVMQOVQK.js +0 -63
  1025. package/dist/update-N74F5KXB.js +0 -155
  1026. package/dist/upload-6PYPHPCZ.js +0 -126
  1027. package/dist/upload-NA62W5RS.js +0 -150
  1028. package/dist/upscale-RXJUBHXN.js +0 -109
  1029. package/dist/url-options-EUDXLDBD.js +0 -130
  1030. package/dist/url-params-DBJSM2LP.js +0 -98
  1031. package/dist/use-MHPNS4V4.js +0 -95
  1032. package/dist/validate-TTAGVGM2.js +0 -88
  1033. package/dist/validate-TTAGVGM2.js.map +0 -1
  1034. package/dist/variant-ZFCWILPG.js +0 -338
  1035. package/dist/videos-DUG7JYUA.js +0 -39
  1036. package/dist/view-PYCGDGT2.js +0 -121
  1037. package/dist/viewer-check-HIMNCZGY.js +0 -68
  1038. package/dist/web-SDG42OBC.js +0 -140
  1039. package/dist/winners-AI4PVSOI.js +0 -113
  1040. package/dist/winning-ads-KGAYAIPG.js +0 -84
  1041. package/dist/write-commands-34L5LJIB.js +0 -713
  1042. package/dist/write-commands-5TJ3LQ5F.js +0 -737
  1043. package/dist/write-commands-OYMWOFEY.js +0 -1015
  1044. package/dist/write-commands-R3UCCBUI.js +0 -206
  1045. package/dist/x-VNRVGVLI.js +0 -47
  1046. /package/dist/{account-67PZBEP6.js.map → account-5VPZ3XQ3.js.map} +0 -0
  1047. /package/dist/{account-HZC6X2PH.js.map → account-SYUEXERA.js.map} +0 -0
  1048. /package/dist/{account-TQUV64XP.js.map → account-ZQH535IP.js.map} +0 -0
  1049. /package/dist/{account-reads-IRBTERTY.js.map → account-reads-GUYNJEZA.js.map} +0 -0
  1050. /package/dist/{account-writes-ALDSHAEV.js.map → account-writes-DLCRTL6Y.js.map} +0 -0
  1051. /package/dist/{accounts-4P54UY6F.js.map → accounts-3TNEMLLC.js.map} +0 -0
  1052. /package/dist/{accounts-NJ6TF6WH.js.map → accounts-GBRGCLE3.js.map} +0 -0
  1053. /package/dist/{accounts-GVTZN4VE.js.map → accounts-IPOCFAKK.js.map} +0 -0
  1054. /package/dist/{accounts-WTB737BM.js.map → accounts-QBWYIJ7D.js.map} +0 -0
  1055. /package/dist/{accounts-6UNBLIUH.js.map → accounts-TSM5EHRD.js.map} +0 -0
  1056. /package/dist/{actions-D3BOWDEB.js.map → actions-XZMLYLTK.js.map} +0 -0
  1057. /package/dist/{active-entities-J2O76SRP.js.map → active-entities-MFWTN4VJ.js.map} +0 -0
  1058. /package/dist/{activities-2J7FTZMN.js.map → activities-ZXA53KY7.js.map} +0 -0
  1059. /package/dist/{ad-group-writes-PQKDCMQF.js.map → ad-group-writes-2JBCTSJY.js.map} +0 -0
  1060. /package/dist/{ad-groups-NGYEJMV4.js.map → ad-groups-6JQSO32O.js.map} +0 -0
  1061. /package/dist/{ad-writes-77FVHJTS.js.map → ad-writes-P34Z3ZTX.js.map} +0 -0
  1062. /package/dist/{add-2FHPLALV.js.map → add-F2BF2HAK.js.map} +0 -0
  1063. /package/dist/{add-JP76KCCY.js.map → add-JAXBNDLC.js.map} +0 -0
  1064. /package/dist/{add-62JPGFD4.js.map → add-KAMQP5RM.js.map} +0 -0
  1065. /package/dist/{add-2XJYOGKW.js.map → add-Y6QCWI6Q.js.map} +0 -0
  1066. /package/dist/{add-accounts-M5Y4DQFM.js.map → add-accounts-M4R7ZVHN.js.map} +0 -0
  1067. /package/dist/{ads-DB5NDHX5.js.map → ads-KPUP4WG4.js.map} +0 -0
  1068. /package/dist/{ads-W2IPUWHQ.js.map → ads-UVQN4BTT.js.map} +0 -0
  1069. /package/dist/{ads-LYNA2I7B.js.map → ads-VPSHNIWG.js.map} +0 -0
  1070. /package/dist/{adsets-PY5ZKGBO.js.map → adsets-JAQKFDLX.js.map} +0 -0
  1071. /package/dist/{advertisers-NZPJQF7W.js.map → advertisers-2ETFYRKA.js.map} +0 -0
  1072. /package/dist/{advertisers-BVAZ4XUX.js.map → advertisers-6ONURKP2.js.map} +0 -0
  1073. /package/dist/{analytics-NTPZKMYK.js.map → analytics-XZ56777C.js.map} +0 -0
  1074. /package/dist/{animate-EIV2OHXT.js.map → animate-KZQCCL65.js.map} +0 -0
  1075. /package/dist/{assign-UNIA5YDC.js.map → assign-DDXB7A6W.js.map} +0 -0
  1076. /package/dist/{audience-size-4NN6ENP5.js.map → audience-size-5QQAABZQ.js.map} +0 -0
  1077. /package/dist/{audiences-VYFX7OFS.js.map → audiences-I4KJ6DZ7.js.map} +0 -0
  1078. /package/dist/{audiences-UUIYQFS6.js.map → audiences-IFBZCTME.js.map} +0 -0
  1079. /package/dist/{audiences-45ZCY2VZ.js.map → audiences-THTWZOMA.js.map} +0 -0
  1080. /package/dist/{audit-NSVHNA5J.js.map → audit-2KOD4YCF.js.map} +0 -0
  1081. /package/dist/{audit-OWXTLQC4.js.map → audit-MFTERSQZ.js.map} +0 -0
  1082. /package/dist/{autocomplete-EHWAQYVB.js.map → autocomplete-JC46QNHQ.js.map} +0 -0
  1083. /package/dist/{avatars-7WZPW7BV.js.map → avatars-ZXQRZJM2.js.map} +0 -0
  1084. /package/dist/{bid-pricing-F5NDMS6W.js.map → bid-pricing-46W7LSU5.js.map} +0 -0
  1085. /package/dist/{brand-QAJ5VWFM.js.map → brand-XROP2WL2.js.map} +0 -0
  1086. /package/dist/{businesses-ZH67AXR6.js.map → businesses-JWOIY3OR.js.map} +0 -0
  1087. /package/dist/{campaign-groups-KFJKLNNU.js.map → campaign-groups-5O3SR5X2.js.map} +0 -0
  1088. /package/dist/{campaign-writes-BDGQ6XB3.js.map → campaign-writes-4D4256DP.js.map} +0 -0
  1089. /package/dist/{campaign-writes-FNMAGCKB.js.map → campaign-writes-5BEK2QBJ.js.map} +0 -0
  1090. /package/dist/{campaigns-HJTGX5WW.js.map → campaigns-6DX2MACO.js.map} +0 -0
  1091. /package/dist/{campaigns-6HMHOXXY.js.map → campaigns-EJT7IMDT.js.map} +0 -0
  1092. /package/dist/{campaigns-KT3J2O7S.js.map → campaigns-OKU4HN5Q.js.map} +0 -0
  1093. /package/dist/{campaigns-66OOGMDW.js.map → campaigns-QVPLPTH3.js.map} +0 -0
  1094. /package/dist/{canvas-MQ6ZE5CZ.js.map → canvas-XCP2WPYO.js.map} +0 -0
  1095. /package/dist/{capabilities-RVUMPP7C.js.map → capabilities-W4XDJVDW.js.map} +0 -0
  1096. /package/dist/{cards-I4BZIYUV.js.map → cards-2QCVG77U.js.map} +0 -0
  1097. /package/dist/{catalogs-B2NKQO24.js.map → catalogs-RVW4L6C6.js.map} +0 -0
  1098. /package/dist/{changes-FX3TPYGT.js.map → changes-XRPDY2K4.js.map} +0 -0
  1099. /package/dist/{chatgpt-3NS2R442.js.map → chatgpt-RNGSOVHP.js.map} +0 -0
  1100. /package/dist/{chats-72L7U4ML.js.map → chats-JKCUA26S.js.map} +0 -0
  1101. /package/dist/{chunk-F3FSD6BO.js.map → chunk-2C36DHQH.js.map} +0 -0
  1102. /package/dist/{chunk-TY7TEU3T.js.map → chunk-2LIAXB3W.js.map} +0 -0
  1103. /package/dist/{chunk-CBCGVPHB.js.map → chunk-2MT3AWDE.js.map} +0 -0
  1104. /package/dist/{chunk-GT4UFORX.js.map → chunk-2WRK44LZ.js.map} +0 -0
  1105. /package/dist/{chunk-O5XLQUDS.js.map → chunk-3FDGC2UH.js.map} +0 -0
  1106. /package/dist/{chunk-CECS3DHZ.js.map → chunk-3FFJYMKM.js.map} +0 -0
  1107. /package/dist/{chunk-THU74XR6.js.map → chunk-3PL2QRF2.js.map} +0 -0
  1108. /package/dist/{chunk-IJDF7D4U.js.map → chunk-3XDZMLX6.js.map} +0 -0
  1109. /package/dist/{chunk-G3KO2HFZ.js.map → chunk-4R7H4RV6.js.map} +0 -0
  1110. /package/dist/{chunk-6GFJFTG6.js.map → chunk-4TBDEV7X.js.map} +0 -0
  1111. /package/dist/{chunk-Q676JHJA.js.map → chunk-5VD5GK6A.js.map} +0 -0
  1112. /package/dist/{chunk-GKXMIXEV.js.map → chunk-5ZIGEHQQ.js.map} +0 -0
  1113. /package/dist/{chunk-P5T7OZKV.js.map → chunk-66ZIZ7QP.js.map} +0 -0
  1114. /package/dist/{chunk-ZO2YLHRW.js.map → chunk-6DSLFOKJ.js.map} +0 -0
  1115. /package/dist/{chunk-VHMNSO2B.js.map → chunk-6FHP2HIK.js.map} +0 -0
  1116. /package/dist/{chunk-H7JOVRHO.js.map → chunk-6VI2DDGZ.js.map} +0 -0
  1117. /package/dist/{chunk-AFDPISNJ.js.map → chunk-72QBQS63.js.map} +0 -0
  1118. /package/dist/{chunk-2KIF3U2C.js.map → chunk-7DBOLSUL.js.map} +0 -0
  1119. /package/dist/{chunk-SJLIV6PF.js.map → chunk-7FDDOOM4.js.map} +0 -0
  1120. /package/dist/{chunk-KB5HBQEK.js.map → chunk-AN7CMLYY.js.map} +0 -0
  1121. /package/dist/{chunk-AIDXJHZ4.js.map → chunk-BDMZRWQI.js.map} +0 -0
  1122. /package/dist/{chunk-NFSLRRIE.js.map → chunk-BITS62MF.js.map} +0 -0
  1123. /package/dist/{chunk-AR7PU7BB.js.map → chunk-CCFZB42B.js.map} +0 -0
  1124. /package/dist/{chunk-Z5KBRTB2.js.map → chunk-CKRSSMRT.js.map} +0 -0
  1125. /package/dist/{chunk-YONSWWCF.js.map → chunk-D53AAUG4.js.map} +0 -0
  1126. /package/dist/{chunk-6HPIWZHS.js.map → chunk-DGUYFROS.js.map} +0 -0
  1127. /package/dist/{chunk-65BQAJMH.js.map → chunk-DS2ZRTAL.js.map} +0 -0
  1128. /package/dist/{chunk-NAMEFVWL.js.map → chunk-EIJDXZW5.js.map} +0 -0
  1129. /package/dist/{chunk-57UECM77.js.map → chunk-EJH2JOVG.js.map} +0 -0
  1130. /package/dist/{chunk-VKH6LSC2.js.map → chunk-EJWFD6T3.js.map} +0 -0
  1131. /package/dist/{chunk-DL2W4N7J.js.map → chunk-ELNN4SNW.js.map} +0 -0
  1132. /package/dist/{chunk-P3ZJIIDS.js.map → chunk-EUB327FC.js.map} +0 -0
  1133. /package/dist/{chunk-GZ6YS7TG.js.map → chunk-FBF5XDJX.js.map} +0 -0
  1134. /package/dist/{chunk-QJPPPQPD.js.map → chunk-FP3GNJN2.js.map} +0 -0
  1135. /package/dist/{chunk-PELW56D7.js.map → chunk-G373L4GL.js.map} +0 -0
  1136. /package/dist/{chunk-SLCSLVGS.js.map → chunk-GTOHNTTI.js.map} +0 -0
  1137. /package/dist/{chunk-YGL5LTEA.js.map → chunk-HDNZSVJJ.js.map} +0 -0
  1138. /package/dist/{chunk-J5WZ7SAD.js.map → chunk-HLAAGGDS.js.map} +0 -0
  1139. /package/dist/{chunk-W6ASM6UP.js.map → chunk-HX7PM34O.js.map} +0 -0
  1140. /package/dist/{chunk-INJHF7AF.js.map → chunk-IKTKWXP6.js.map} +0 -0
  1141. /package/dist/{chunk-ZBKBTTHD.js.map → chunk-IOGKJZ4Z.js.map} +0 -0
  1142. /package/dist/{chunk-W7KB3LJE.js.map → chunk-IVRXPYQ7.js.map} +0 -0
  1143. /package/dist/{chunk-QHIUJXU7.js.map → chunk-JIJJCU6E.js.map} +0 -0
  1144. /package/dist/{chunk-JC6GNMA7.js.map → chunk-JOCKYH6U.js.map} +0 -0
  1145. /package/dist/{chunk-ZJR5E53N.js.map → chunk-L44WSWSZ.js.map} +0 -0
  1146. /package/dist/{chunk-4TU2MWBJ.js.map → chunk-M525HJTA.js.map} +0 -0
  1147. /package/dist/{chunk-D5MF337I.js.map → chunk-MMU6XHCH.js.map} +0 -0
  1148. /package/dist/{chunk-WILN7TD6.js.map → chunk-MRRSKRZZ.js.map} +0 -0
  1149. /package/dist/{chunk-O3LHCQ7Q.js.map → chunk-NFHUJRDE.js.map} +0 -0
  1150. /package/dist/{chunk-IZFGTGFR.js.map → chunk-NSHJ6OOK.js.map} +0 -0
  1151. /package/dist/{chunk-J2QOKD2F.js.map → chunk-OCBAKPHH.js.map} +0 -0
  1152. /package/dist/{chunk-BVYPRGPG.js.map → chunk-OFTU5XBQ.js.map} +0 -0
  1153. /package/dist/{chunk-KB5XJHQX.js.map → chunk-OSWCEDFE.js.map} +0 -0
  1154. /package/dist/{chunk-LHNL6JM2.js.map → chunk-OTNGMKI6.js.map} +0 -0
  1155. /package/dist/{chunk-QWX3QJNM.js.map → chunk-PAJJXZ3Z.js.map} +0 -0
  1156. /package/dist/{chunk-7GYM4I5I.js.map → chunk-PGSXR5UM.js.map} +0 -0
  1157. /package/dist/{chunk-EOGPNV25.js.map → chunk-QAOEVZYY.js.map} +0 -0
  1158. /package/dist/{chunk-PGVF4SB7.js.map → chunk-R5HMAIZM.js.map} +0 -0
  1159. /package/dist/{chunk-DDTILZXI.js.map → chunk-RPRLCIHB.js.map} +0 -0
  1160. /package/dist/{chunk-QDOVBGKZ.js.map → chunk-RV4GIY23.js.map} +0 -0
  1161. /package/dist/{chunk-VTCBPYGE.js.map → chunk-RXUEYD2S.js.map} +0 -0
  1162. /package/dist/{chunk-UXTZ5MBE.js.map → chunk-SJOWZKNB.js.map} +0 -0
  1163. /package/dist/{chunk-ZNNC6B75.js.map → chunk-TE3N5AGN.js.map} +0 -0
  1164. /package/dist/{chunk-QNEX7FEC.js.map → chunk-TPQH4UXJ.js.map} +0 -0
  1165. /package/dist/{chunk-DLUWHZCE.js.map → chunk-TQUNJFGF.js.map} +0 -0
  1166. /package/dist/{chunk-V43RLLZE.js.map → chunk-TYSN5VVJ.js.map} +0 -0
  1167. /package/dist/{chunk-7NTION5F.js.map → chunk-UKMG6YWX.js.map} +0 -0
  1168. /package/dist/{chunk-PA5MYVQY.js.map → chunk-WDAWTHQK.js.map} +0 -0
  1169. /package/dist/{chunk-ZPJE6D7W.js.map → chunk-X3PCCHP2.js.map} +0 -0
  1170. /package/dist/{chunk-RUHMLPH5.js.map → chunk-YJAQWTS6.js.map} +0 -0
  1171. /package/dist/{chunk-VFSLIDXA.js.map → chunk-YNOJN5Z6.js.map} +0 -0
  1172. /package/dist/{chunk-FDG2LLX7.js.map → chunk-YTV5VW7S.js.map} +0 -0
  1173. /package/dist/{chunk-NORAJYUI.js.map → chunk-ZO4GMUO3.js.map} +0 -0
  1174. /package/dist/{chunk-35ENAFJX.js.map → chunk-ZSRLDTDC.js.map} +0 -0
  1175. /package/dist/{claim-DIITRUIN.js.map → claim-JBNO7M6J.js.map} +0 -0
  1176. /package/dist/{client-LY2JCQS2.js.map → client-CPAPILIF.js.map} +0 -0
  1177. /package/dist/{code-7CBNYUPU.js.map → code-GHOVETWX.js.map} +0 -0
  1178. /package/dist/{companies-HHSYHL74.js.map → companies-47T2PCRZ.js.map} +0 -0
  1179. /package/dist/{complete-M3TURPU5.js.map → complete-T3PKN4B7.js.map} +0 -0
  1180. /package/dist/{config-7COTFJWK.js.map → config-AFNXR5FA.js.map} +0 -0
  1181. /package/dist/{connect-TQL5EVVE.js.map → connect-T7R43GIH.js.map} +0 -0
  1182. /package/dist/{content-OXMONMHJ.js.map → content-M3U2SCFJ.js.map} +0 -0
  1183. /package/dist/{conversation-GE273GC4.js.map → conversation-BG7WEMXQ.js.map} +0 -0
  1184. /package/dist/{conversion-report-BH4HH2Q3.js.map → conversion-report-URDTPXQ7.js.map} +0 -0
  1185. /package/dist/{conversion-upload-command-QWWYCTNV.js.map → conversion-upload-command-BWF6MAOK.js.map} +0 -0
  1186. /package/dist/{conversion-writes-HG2O6JI7.js.map → conversion-writes-7MGIFJ3H.js.map} +0 -0
  1187. /package/dist/{conversions-XPSN7SOW.js.map → conversions-QY6COYPP.js.map} +0 -0
  1188. /package/dist/{conversions-DP6ZF57D.js.map → conversions-UTXG5YEO.js.map} +0 -0
  1189. /package/dist/{countries-UXAUGSBR.js.map → countries-MUZPFSYZ.js.map} +0 -0
  1190. /package/dist/{create-XLZYNFKN.js.map → create-6QASIASQ.js.map} +0 -0
  1191. /package/dist/{create-ENQWVWGB.js.map → create-FIHEJRAF.js.map} +0 -0
  1192. /package/dist/{create-NVXJP477.js.map → create-JXZBMXUS.js.map} +0 -0
  1193. /package/dist/{creatives-ONKKGW5T.js.map → creatives-6FG6VAB4.js.map} +0 -0
  1194. /package/dist/{creatives-O3444SBT.js.map → creatives-UD6TFATS.js.map} +0 -0
  1195. /package/dist/{credentials-3UY7RVUL.js.map → credentials-ECPD2A7X.js.map} +0 -0
  1196. /package/dist/{crm-XXU5XZIQ.js.map → crm-4EWUWZNZ.js.map} +0 -0
  1197. /package/dist/{crm-OX67TBWD.js.map → crm-ASWKMKF3.js.map} +0 -0
  1198. /package/dist/{crop-3ZV5BFCA.js.map → crop-MIVSA2YF.js.map} +0 -0
  1199. /package/dist/{currency-XP4EMU4M.js.map → currency-5LU3D62R.js.map} +0 -0
  1200. /package/dist/{custom-conversions-TV23XQHW.js.map → custom-conversions-3QGJQRYS.js.map} +0 -0
  1201. /package/dist/{customers-EJ7FVCTC.js.map → customers-EEBZXQ4J.js.map} +0 -0
  1202. /package/dist/{decide-EGQ3CRHI.js.map → decide-ZODJU7DY.js.map} +0 -0
  1203. /package/dist/{delete-MUPTLWHI.js.map → delete-CTH3TGNM.js.map} +0 -0
  1204. /package/dist/{delete-GXLPIGTC.js.map → delete-D6GNTBYI.js.map} +0 -0
  1205. /package/dist/{delete-R2SEUSLV.js.map → delete-IWIDUJNS.js.map} +0 -0
  1206. /package/dist/{delete-ZGBBWFAW.js.map → delete-TLVYBVRP.js.map} +0 -0
  1207. /package/dist/{delete-55IHV25V.js.map → delete-XPHIQY5Z.js.map} +0 -0
  1208. /package/dist/{delete-OW2N4WIA.js.map → delete-XZEPLAKT.js.map} +0 -0
  1209. /package/dist/{demographics-K6DEWUE5.js.map → demographics-L3TJJAFF.js.map} +0 -0
  1210. /package/dist/{describe-FCTM53MM.js.map → describe-5PM5OSYK.js.map} +0 -0
  1211. /package/dist/{describe-4O3VCV6L.js.map → describe-KQLRHGFX.js.map} +0 -0
  1212. /package/dist/{dimensions-AD4VS5AH.js.map → dimensions-6H24D7CM.js.map} +0 -0
  1213. /package/dist/{discard-NZ7FQJEE.js.map → discard-74I3M2DF.js.map} +0 -0
  1214. /package/dist/{discover-UQXQUPNO.js.map → discover-6LGIHWVP.js.map} +0 -0
  1215. /package/dist/{discover-OISU5EJF.js.map → discover-HBQO4RSF.js.map} +0 -0
  1216. /package/dist/{domain-DXBHNZLO.js.map → domain-E5DTPAZI.js.map} +0 -0
  1217. /package/dist/{download-IE6XLFHM.js.map → download-ED52W77T.js.map} +0 -0
  1218. /package/dist/{draft-DB6KMBCH.js.map → draft-3XYF2L4K.js.map} +0 -0
  1219. /package/dist/{draft-ENA7S4Y7.js.map → draft-5IEMZ4W3.js.map} +0 -0
  1220. /package/dist/{draft-OBFKQEPK.js.map → draft-6UVGEERY.js.map} +0 -0
  1221. /package/dist/{draft-S6VPKZYY.js.map → draft-FDBE36CP.js.map} +0 -0
  1222. /package/dist/{draft-HJBAG3SN.js.map → draft-PE4DN44Y.js.map} +0 -0
  1223. /package/dist/{draft-ICEVLF4E.js.map → draft-QBR22TG2.js.map} +0 -0
  1224. /package/dist/{draft-OOHU6NMA.js.map → draft-VZYSJVF5.js.map} +0 -0
  1225. /package/dist/{draft-MGKJ5RYI.js.map → draft-YWTLO2ON.js.map} +0 -0
  1226. /package/dist/{env-YLOVBOAE.js.map → env-GS2TUVCM.js.map} +0 -0
  1227. /package/dist/{experiment-PHFP6IBM.js.map → experiment-XDJHSOBC.js.map} +0 -0
  1228. /package/dist/{export-R2IMUCQO.js.map → export-GV5CF5UM.js.map} +0 -0
  1229. /package/dist/{extract-OQP3TSQG.js.map → extract-4OXK7L7R.js.map} +0 -0
  1230. /package/dist/{facets-NUKR7I57.js.map → facets-XPB2ELM2.js.map} +0 -0
  1231. /package/dist/{favorites-NS73FDG5.js.map → favorites-VKPXGTK6.js.map} +0 -0
  1232. /package/dist/{feed-SQPOB7SP.js.map → feed-B2YLZQNU.js.map} +0 -0
  1233. /package/dist/{feedback-SQAAAKOQ.js.map → feedback-HT2M63QW.js.map} +0 -0
  1234. /package/dist/{fetch-PQ3NOPIE.js.map → fetch-2O7EUCCZ.js.map} +0 -0
  1235. /package/dist/{fetch-PTSAVQW5.js.map → fetch-GMNE6KOJ.js.map} +0 -0
  1236. /package/dist/{fit-IITU6UWC.js.map → fit-S5ZGPNE3.js.map} +0 -0
  1237. /package/dist/{follow-N3DQZV7M.js.map → follow-UNIHLZKA.js.map} +0 -0
  1238. /package/dist/{follow-competitors-BZPCBGIB.js.map → follow-competitors-CQL2B55H.js.map} +0 -0
  1239. /package/dist/{following-KESWTEBR.js.map → following-GMXZIEDZ.js.map} +0 -0
  1240. /package/dist/{fonts-FG6XMK5A.js.map → fonts-GPJQLNQL.js.map} +0 -0
  1241. /package/dist/{forecast-43XBSHJR.js.map → forecast-6AHSHRDJ.js.map} +0 -0
  1242. /package/dist/{forecast-MAFZQ4UF.js.map → forecast-V6BCMR4Y.js.map} +0 -0
  1243. /package/dist/{funding-HYSCYS62.js.map → funding-WPREDQVA.js.map} +0 -0
  1244. /package/dist/{funnel-32CNV57L.js.map → funnel-QDYX3UH5.js.map} +0 -0
  1245. /package/dist/{ga4-J2KTNCD4.js.map → ga4-6AUOX2UW.js.map} +0 -0
  1246. /package/dist/{get-MBGO4VJD.js.map → get-5OEDAT2Q.js.map} +0 -0
  1247. /package/dist/{get-W7MKBMQ3.js.map → get-7WEE5V7M.js.map} +0 -0
  1248. /package/dist/{get-3P2EQLP3.js.map → get-DXGJSEZZ.js.map} +0 -0
  1249. /package/dist/{get-NOKSZPIV.js.map → get-GQWOLALT.js.map} +0 -0
  1250. /package/dist/{get-WHC4SRYK.js.map → get-W7F4FOAR.js.map} +0 -0
  1251. /package/dist/{get-FJB3X44Z.js.map → get-WY6JXFP6.js.map} +0 -0
  1252. /package/dist/{get-GDF5V3RN.js.map → get-X6DSFXN6.js.map} +0 -0
  1253. /package/dist/{gif-SFYVDLCU.js.map → gif-JXWSR2TC.js.map} +0 -0
  1254. /package/dist/{google-XRAMIES5.js.map → google-6QFL6GV3.js.map} +0 -0
  1255. /package/dist/{google-ads-N55SE2CB.js.map → google-ads-ZG3BDUEG.js.map} +0 -0
  1256. /package/dist/{group-TZJCKHKS.js.map → group-7ADT2GWA.js.map} +0 -0
  1257. /package/dist/{group-6RDJTWVN.js.map → group-VD3UIBKE.js.map} +0 -0
  1258. /package/dist/{gsc-HD6UFRYM.js.map → gsc-WHMPFTYA.js.map} +0 -0
  1259. /package/dist/{history-IROFQ6LA.js.map → history-33JKOKAV.js.map} +0 -0
  1260. /package/dist/{history-4RWCE7WW.js.map → history-M3IKDCEO.js.map} +0 -0
  1261. /package/dist/{hubspot-75N4AI43.js.map → hubspot-B4IUIOYX.js.map} +0 -0
  1262. /package/dist/{icon-BMCDFGMN.js.map → icon-R2K27DKI.js.map} +0 -0
  1263. /package/dist/{ideas-7UQMXLI5.js.map → ideas-HHTLPC6Y.js.map} +0 -0
  1264. /package/dist/{images-OFR3S2U4.js.map → images-PV6TZQLL.js.map} +0 -0
  1265. /package/dist/{improve-P6F2HXYQ.js.map → improve-TVFAR27Q.js.map} +0 -0
  1266. /package/dist/{ingest-XU4WXE4U.js.map → ingest-25ZX36RL.js.map} +0 -0
  1267. /package/dist/{ingest-HGR7KSG4.js.map → ingest-MFIT3L23.js.map} +0 -0
  1268. /package/dist/{inspect-TL2VZBN7.js.map → inspect-2IASA5YV.js.map} +0 -0
  1269. /package/dist/{inspiration-7WTS3AVI.js.map → inspiration-O56SOIQP.js.map} +0 -0
  1270. /package/dist/{intent-OCZE4O7R.js.map → intent-JOW24MTF.js.map} +0 -0
  1271. /package/dist/{job-XMPQ27SJ.js.map → job-QUO6KULI.js.map} +0 -0
  1272. /package/dist/{job-create-HTDQHPEF.js.map → job-create-JTOG5M3Q.js.map} +0 -0
  1273. /package/dist/{job-status-L7WUTZ2C.js.map → job-status-3B4X5IPG.js.map} +0 -0
  1274. /package/dist/{keep-42SLV4CR.js.map → keep-5TVGX7EG.js.map} +0 -0
  1275. /package/dist/{keyword-gap-323NE4AK.js.map → keyword-gap-SHLXRIHO.js.map} +0 -0
  1276. /package/dist/{keyword-metrics-V6DGO7U5.js.map → keyword-metrics-NYH6DXKJ.js.map} +0 -0
  1277. /package/dist/{keywords-for-site-ANSLXBHB.js.map → keywords-for-site-JTK64W4I.js.map} +0 -0
  1278. /package/dist/{landing-K25GUBLZ.js.map → landing-4V7HMYCZ.js.map} +0 -0
  1279. /package/dist/{landings-5IYXHA5Z.js.map → landings-LZZO4VVW.js.map} +0 -0
  1280. /package/dist/{languages-SRFGW6Z3.js.map → languages-TINK472E.js.map} +0 -0
  1281. /package/dist/{languages-US6JUATO.js.map → languages-ZIGJHY2T.js.map} +0 -0
  1282. /package/dist/{logo-4JOWGJ5A.js.map → launches-C5XXNF7C.js.map} +0 -0
  1283. /package/dist/{layerize-U672AXED.js.map → layerize-YVCA4JO7.js.map} +0 -0
  1284. /package/dist/{leads-UJVKPRXX.js.map → leads-2WTL7F24.js.map} +0 -0
  1285. /package/dist/{leads-MXUQISOC.js.map → leads-QUO3YNHO.js.map} +0 -0
  1286. /package/dist/{lighthouse-SJ4QNLUS.js.map → lighthouse-QLFI7PSQ.js.map} +0 -0
  1287. /package/dist/{line-item-writes-NURRHJ7P.js.map → line-item-writes-SYSYGV3L.js.map} +0 -0
  1288. /package/dist/{line-items-PC6QWV5J.js.map → line-items-H3M6T7P2.js.map} +0 -0
  1289. /package/dist/{link-ZSXKCLQD.js.map → link-EHSSSV6K.js.map} +0 -0
  1290. /package/dist/{linkedin-EZJJBKY3.js.map → linkedin-BGZIR43P.js.map} +0 -0
  1291. /package/dist/{list-M4Z3WYPM.js.map → list-2IAOPMQC.js.map} +0 -0
  1292. /package/dist/{list-SXYVDDMU.js.map → list-BGT2BEWD.js.map} +0 -0
  1293. /package/dist/{list-Q5ZZRPHO.js.map → list-G2VYAKYF.js.map} +0 -0
  1294. /package/dist/{list-GQ65MC2N.js.map → list-IFXQWBBE.js.map} +0 -0
  1295. /package/dist/{list-XFIOXFB2.js.map → list-LK3CVZ3B.js.map} +0 -0
  1296. /package/dist/{list-ECF3RA26.js.map → list-X2TMGY7C.js.map} +0 -0
  1297. /package/dist/{list-K56J7FZW.js.map → list-X3SEZDKE.js.map} +0 -0
  1298. /package/dist/{list-N7ZLO2LE.js.map → list-ZFS7XBD7.js.map} +0 -0
  1299. /package/dist/{locations-NG4YXIBT.js.map → locations-JC2H5JMY.js.map} +0 -0
  1300. /package/dist/{locations-LZUHWKZY.js.map → locations-M4L7FUOB.js.map} +0 -0
  1301. /package/dist/{log-EEBJQ6X2.js.map → log-4EINR63D.js.map} +0 -0
  1302. /package/dist/{lookup-7NBZ64TE.js.map → logo-7GDRTSLI.js.map} +0 -0
  1303. /package/dist/{output-ZL62UZHQ.js.map → lookup-SJXNPUXG.js.map} +0 -0
  1304. /package/dist/{mcp-DAKGMA2Z.js.map → mcp-RQJAEJCJ.js.map} +0 -0
  1305. /package/dist/{media-R64YP7T2.js.map → media-FYGHJAEG.js.map} +0 -0
  1306. /package/dist/{media-2SWDJDA6.js.map → media-YYYCKXMZ.js.map} +0 -0
  1307. /package/dist/{media-sources-L2X3KRDU.js.map → media-sources-ZLBIC4RM.js.map} +0 -0
  1308. /package/dist/{members-22BOEGQS.js.map → members-SXATNT7V.js.map} +0 -0
  1309. /package/dist/{meta-RBHF2RG3.js.map → meta-OGB3NB2W.js.map} +0 -0
  1310. /package/dist/{metrics-IXRQZVSM.js.map → metrics-52ZARN6M.js.map} +0 -0
  1311. /package/dist/{models-BDXZ56GI.js.map → models-LSEMO4XH.js.map} +0 -0
  1312. /package/dist/{normalize-P5Q3F7FU.js.map → normalize-3HI26S34.js.map} +0 -0
  1313. /package/dist/{normalize-JAE3NVOX.js.map → normalize-SOFYZQSJ.js.map} +0 -0
  1314. /package/dist/{performance-FOOV624A.js.map → output-YJ4YBUU4.js.map} +0 -0
  1315. /package/dist/{page-FZ7IZ5CV.js.map → page-ZGCK6MOQ.js.map} +0 -0
  1316. /package/dist/{pages-SS7TZTHV.js.map → pages-QMP3W2R3.js.map} +0 -0
  1317. /package/dist/{query-XISUHMBR.js.map → performance-BQSWGNFO.js.map} +0 -0
  1318. /package/dist/{pinterest-UETS7U7U.js.map → pinterest-LCVUB2ZL.js.map} +0 -0
  1319. /package/dist/{pixels-MPZYWGFD.js.map → pixels-UQGAPBLG.js.map} +0 -0
  1320. /package/dist/{pixels-LCTMLKGP.js.map → pixels-YM2DX7EN.js.map} +0 -0
  1321. /package/dist/{plan-V74EVXTW.js.map → plan-Z5TZRRCH.js.map} +0 -0
  1322. /package/dist/{preview-RU54Z4EM.js.map → preview-DZQUUQGD.js.map} +0 -0
  1323. /package/dist/{promoted-tweet-writes-FQRFU7PB.js.map → promoted-tweet-writes-VUNJIUA3.js.map} +0 -0
  1324. /package/dist/{promoted-tweets-L2L3V5SF.js.map → promoted-tweets-55X4H7NG.js.map} +0 -0
  1325. /package/dist/{properties-ZUDQH3LE.js.map → properties-CSW67FJG.js.map} +0 -0
  1326. /package/dist/{publish-5XTAHTM4.js.map → publish-U73OR33K.js.map} +0 -0
  1327. /package/dist/{query-26T7XATH.js.map → query-UQQNESTT.js.map} +0 -0
  1328. /package/dist/{reddit-BCB4FT6J.js.map → query-V4I3VCJ7.js.map} +0 -0
  1329. /package/dist/{query-SHUOHXTO.js.map → query-XPCC7OUP.js.map} +0 -0
  1330. /package/dist/{questionnaire-UG55JLVW.js.map → questionnaire-UQNRYZK7.js.map} +0 -0
  1331. /package/dist/{read-UYSQAXRV.js.map → read-RXAOLPG5.js.map} +0 -0
  1332. /package/dist/{run-TA3DP6QG.js.map → reddit-C2B7NT7X.js.map} +0 -0
  1333. /package/dist/{refresh-WY5NPNLX.js.map → refresh-JN4HKE4H.js.map} +0 -0
  1334. /package/dist/{release-JBSPPNQE.js.map → release-HSAOBN5K.js.map} +0 -0
  1335. /package/dist/{relevant-pages-OU5H56KY.js.map → relevant-pages-XBWFEHHE.js.map} +0 -0
  1336. /package/dist/{remove-M5P7M5JU.js.map → remove-G5UXVQ2W.js.map} +0 -0
  1337. /package/dist/{remove-2KACTXKP.js.map → remove-Q4TL5ZFS.js.map} +0 -0
  1338. /package/dist/{reopen-J3VW5766.js.map → reopen-D26VSRRL.js.map} +0 -0
  1339. /package/dist/{research-4CAA5CA2.js.map → research-CRYX2CAR.js.map} +0 -0
  1340. /package/dist/{research-7LBTJ2B2.js.map → research-XRVD2GSG.js.map} +0 -0
  1341. /package/dist/{reset-DJSSXC4Y.js.map → reset-2VVN4CY7.js.map} +0 -0
  1342. /package/dist/{reset-DBWWGCXY.js.map → reset-FWDPBHYO.js.map} +0 -0
  1343. /package/dist/{resolve-BNRUYS56.js.map → resolve-D4PCGIWO.js.map} +0 -0
  1344. /package/dist/{retry-WRBGLB7O.js.map → retry-AHZFHMTH.js.map} +0 -0
  1345. /package/dist/{retry-TMRIFGVT.js.map → retry-FV6ASVO5.js.map} +0 -0
  1346. /package/dist/{retry-failed-NWLH6WHK.js.map → retry-failed-AENQRGML.js.map} +0 -0
  1347. /package/dist/{run-VVTLDRRW.js.map → run-AGSHZQND.js.map} +0 -0
  1348. /package/dist/{search-4HIOKYFR.js.map → run-IRJWKZ3K.js.map} +0 -0
  1349. /package/dist/{schedule-S547HPUT.js.map → schedule-DTKBBIEH.js.map} +0 -0
  1350. /package/dist/{schedule-BQQGYGT7.js.map → schedule-ESHQ4II7.js.map} +0 -0
  1351. /package/dist/{schema-SQIP75WG.js.map → schema-OBF4T2QN.js.map} +0 -0
  1352. /package/dist/{schema-DDEWM5ZX.js.map → schema-SWG2WKYX.js.map} +0 -0
  1353. /package/dist/{scrape-TI6S2W7I.js.map → scrape-AGGDUPPD.js.map} +0 -0
  1354. /package/dist/{screenshot-XFAYY4WW.js.map → screenshot-6GGCQCIV.js.map} +0 -0
  1355. /package/dist/{search-D2IV7KFJ.js.map → search-FRSFGJLZ.js.map} +0 -0
  1356. /package/dist/{search-VJBKRD2U.js.map → search-I64WW2QC.js.map} +0 -0
  1357. /package/dist/{search-IZPDHRJ4.js.map → search-L2KHX5DO.js.map} +0 -0
  1358. /package/dist/{shared-3CGGKICB.js.map → search-MBDEQ6EE.js.map} +0 -0
  1359. /package/dist/{search-KFDL2IGG.js.map → search-UCDN4TOT.js.map} +0 -0
  1360. /package/dist/{search-copy-QZXCAGK4.js.map → search-copy-HX3FYZGT.js.map} +0 -0
  1361. /package/dist/{seeds-VUNZMHZH.js.map → seeds-VFEFE4AK.js.map} +0 -0
  1362. /package/dist/{sends-7HWLIOUO.js.map → sends-WDSOXBSS.js.map} +0 -0
  1363. /package/dist/{sequences-5RAGZE7L.js.map → sequences-NMJ55HS5.js.map} +0 -0
  1364. /package/dist/{setup-links-SPIGXQTY.js.map → setup-links-NAAUQD7O.js.map} +0 -0
  1365. /package/dist/{sync-definition-DYSVT7BJ.js.map → shared-3GVQQQNL.js.map} +0 -0
  1366. /package/dist/{site-FW6K6L6M.js.map → site-VTJU5CRE.js.map} +0 -0
  1367. /package/dist/{sitemaps-3WDYQHYR.js.map → sitemaps-KS57YDGB.js.map} +0 -0
  1368. /package/dist/{sites-G4DQ2Z2X.js.map → sites-PUEEVW7H.js.map} +0 -0
  1369. /package/dist/{skills-PA26HXEP.js.map → skills-N6NRI2LC.js.map} +0 -0
  1370. /package/dist/{sources-PMBWG4KO.js.map → sources-YUMNEFK5.js.map} +0 -0
  1371. /package/dist/{stats-Q35I5DRW.js.map → stats-SY6GRHKB.js.map} +0 -0
  1372. /package/dist/{status-62SUXUWW.js.map → status-PVW64CLX.js.map} +0 -0
  1373. /package/dist/{sticker-MC2IAIQB.js.map → sticker-YS6W5TSZ.js.map} +0 -0
  1374. /package/dist/{stock-B7LKMKUK.js.map → stock-DWL5E6K4.js.map} +0 -0
  1375. /package/dist/{studio-BB2EVW5I.js.map → studio-SXBK2IJJ.js.map} +0 -0
  1376. /package/dist/{sync-YTHNOAAM.js.map → sync-FOLYGQDI.js.map} +0 -0
  1377. /package/dist/{sync-CLZDZL5F.js.map → sync-NORMNZEE.js.map} +0 -0
  1378. /package/dist/{viewer-check-HIMNCZGY.js.map → sync-definition-DTWEW6ZC.js.map} +0 -0
  1379. /package/dist/{tag-manager-EAREWVYR.js.map → tag-manager-ARFZU46G.js.map} +0 -0
  1380. /package/dist/{tags-53AG3FYG.js.map → tags-77JUO75W.js.map} +0 -0
  1381. /package/dist/{tags-7TH7TVR6.js.map → tags-DOJUSHJB.js.map} +0 -0
  1382. /package/dist/{tags-EUEWDTTN.js.map → tags-IESRRMGW.js.map} +0 -0
  1383. /package/dist/{tags-EB4RE3ML.js.map → tags-MRTUBMRD.js.map} +0 -0
  1384. /package/dist/{tags-ICAWBCOR.js.map → tags-SP6GW4R7.js.map} +0 -0
  1385. /package/dist/{targeting-constants-IFE72XKL.js.map → targeting-constants-DVGRIRKD.js.map} +0 -0
  1386. /package/dist/{targeting-criteria-WZDGJKOI.js.map → targeting-criteria-SOK3HUE2.js.map} +0 -0
  1387. /package/dist/{targets-OKJ6A4YL.js.map → targets-V2HNKVUL.js.map} +0 -0
  1388. /package/dist/{testimonials-THHR5JH5.js.map → testimonials-PA2FUV4H.js.map} +0 -0
  1389. /package/dist/{themes-ZFRM6AVO.js.map → themes-IDB7YPHW.js.map} +0 -0
  1390. /package/dist/{top-companies-63Q475IA.js.map → top-companies-XDP4SZN7.js.map} +0 -0
  1391. /package/dist/{triggers-XLKO2QXQ.js.map → triggers-QDXCA5P4.js.map} +0 -0
  1392. /package/dist/{tweets-7EZRFG3Y.js.map → tweets-AISMWXM3.js.map} +0 -0
  1393. /package/dist/{unfollow-WBBTVEHE.js.map → unfollow-PHLMILG2.js.map} +0 -0
  1394. /package/dist/{unlink-P7KU54YU.js.map → unlink-GDZV5GVL.js.map} +0 -0
  1395. /package/dist/{unstage-GHXGDOT2.js.map → unstage-WCC2TI5Z.js.map} +0 -0
  1396. /package/dist/{unstage-EG7AUE5X.js.map → unstage-WDJXHSAV.js.map} +0 -0
  1397. /package/dist/{update-KVMQOVQK.js.map → update-KBF35KYV.js.map} +0 -0
  1398. /package/dist/{update-7EWDO32L.js.map → update-MRG5MPHR.js.map} +0 -0
  1399. /package/dist/{update-N74F5KXB.js.map → update-XNNQGZBO.js.map} +0 -0
  1400. /package/dist/{update-BVYGB4YL.js.map → update-ZGDQJPDL.js.map} +0 -0
  1401. /package/dist/{upload-6PYPHPCZ.js.map → upload-ID35OCCY.js.map} +0 -0
  1402. /package/dist/{upload-NA62W5RS.js.map → upload-R7YJORED.js.map} +0 -0
  1403. /package/dist/{upscale-RXJUBHXN.js.map → upscale-XPGVJWW2.js.map} +0 -0
  1404. /package/dist/{url-options-EUDXLDBD.js.map → url-options-6X7M2J7D.js.map} +0 -0
  1405. /package/dist/{url-params-DBJSM2LP.js.map → url-params-WRLCJRJQ.js.map} +0 -0
  1406. /package/dist/{use-MHPNS4V4.js.map → use-VCL3PRCB.js.map} +0 -0
  1407. /package/dist/{variant-ZFCWILPG.js.map → variant-2NADVT6Q.js.map} +0 -0
  1408. /package/dist/{videos-DUG7JYUA.js.map → videos-M6VK66NI.js.map} +0 -0
  1409. /package/dist/{view-PYCGDGT2.js.map → view-Q5B57K42.js.map} +0 -0
  1410. /package/dist/{web-SDG42OBC.js.map → web-GOD7BF7X.js.map} +0 -0
  1411. /package/dist/{winners-AI4PVSOI.js.map → winners-PK6EMR6B.js.map} +0 -0
  1412. /package/dist/{winning-ads-KGAYAIPG.js.map → winning-ads-F765TFLS.js.map} +0 -0
  1413. /package/dist/{write-commands-OYMWOFEY.js.map → write-commands-4KWMNH6A.js.map} +0 -0
  1414. /package/dist/{write-commands-5TJ3LQ5F.js.map → write-commands-7ECRGXLK.js.map} +0 -0
  1415. /package/dist/{write-commands-34L5LJIB.js.map → write-commands-GL2PHXSU.js.map} +0 -0
  1416. /package/dist/{write-commands-R3UCCBUI.js.map → write-commands-NMV65XXB.js.map} +0 -0
  1417. /package/dist/{x-VNRVGVLI.js.map → x-MDENBZ3X.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engine/creative-rules/schema.ts","../src/engine/copy-tells/rule-tells.ts","../src/commands/creatives/ideas-model.ts","../src/engine/creative-rules/read.ts"],"sourcesContent":["/**\n * A creative rule: a standing must, never or prefer about every ad a company makes. Declared ones\n * are the brand's own (BRAND.md, read by `brand-doc.ts`); learned ones are what a person taught in a\n * chat, one file each in `src/content/creative-rules/<slug>.md`, saved only after they said yes.\n * Read when a call runs, never copied into an ad's own files.\n */\nimport { z } from \"zod\";\n\nexport const RULE_STRENGTHS = [\"never\", \"must\", \"prefer\"] as const;\nexport type RuleStrength = (typeof RULE_STRENGTHS)[number];\n\n/** What of the ad a rule is about, and so which check holds it. */\nexport const RULE_APPLIES = [\"copy\", \"picture\", \"cast\", \"logo\", \"voice\", \"sound\", \"subtitles\", \"any\"] as const;\nexport type RuleApplies = (typeof RULE_APPLIES)[number];\n\nexport const RULE_KINDS = [\"static\", \"video\"] as const;\n\n/** Where a rule holds; absent parts hold everywhere. */\nexport type RuleScope = {\n kinds?: Array<(typeof RULE_KINDS)[number]>;\n /** Product slugs (`src/content/products/<slug>.md`) a business unit's rule is about. */\n products?: string[];\n platforms?: string[];\n /** The language its phrases are in (\"es\"): its wording checks hold only in ads in that language. */\n language?: string;\n};\n\n/**\n * The part of a rule code can decide on the ad's words: phrases it bans (`forbid`, except where they\n * sit inside an `allow`), phrases every ad must say (`require`), and that only real people may appear.\n */\nexport type RuleCheck = {\n forbid?: string[];\n require?: string[];\n allow?: string[];\n people?: \"real\";\n};\n\nexport const RULE_SOURCE_KINDS = [\"feedback\", \"user\", \"brand-import\", \"brand\"] as const;\n\nexport type RuleSource = {\n kind: (typeof RULE_SOURCE_KINDS)[number];\n feedbackId?: string;\n runId?: string;\n slug?: string;\n /** The person's own words the rule came from. */\n quote?: string;\n /** When it was taught (YYYY-MM-DD). */\n date?: string;\n};\n\nexport type CreativeRule = {\n /** The file's slug for a learned rule; `brand-<hash>` for one BRAND.md states. */\n id: string;\n origin: \"learned\" | \"declared\";\n strength: RuleStrength;\n applies: RuleApplies;\n scope: RuleScope;\n check?: RuleCheck;\n /** The rule, in the words it was given in. */\n text: string;\n why?: string;\n source: RuleSource;\n status: \"active\" | \"retired\";\n retiredBy?: string;\n};\n\nconst phrase = z.string().trim().min(1).max(120);\n\n/** A list of phrases, each trimmed, the empty and malformed ones dropped. */\nexport const Phrases = z\n .array(z.unknown())\n .transform((list) => list.flatMap((p) => (phrase.safeParse(p).success ? [String(p).trim()] : [])));\n","/**\n * The company's wording rules, checked on an ad's words without a model: a phrase a rule bans\n * (except inside a phrase it allows) and a phrase every ad must say. Whole phrases only, read the\n * way a person reads them: accents, case and spacing folded (\"100 % online\" is \"100% Online\"), ß as\n * ss. A rule whose phrases differ only in case is about spelling, and keeps case (\"PontIA\", never\n * \"Pontia\"). A rule in one language holds only in ads in that language. Never and must rules only:\n * a prefer is the reviewers' to weigh. Pure and total.\n */\nimport type { CreativeRule } from \"../creative-rules/schema.ts\";\n\nexport type RuleTell = {\n rule: string;\n strength: CreativeRule[\"strength\"];\n /** A phrase the rule bans was found, or none of the lines says one it requires. */\n kind: \"forbidden\" | \"missing\";\n phrase: string;\n /** The line it was found in (a forbidden phrase only). */\n line?: string;\n /** The rule's words. */\n text: string;\n /** The person's own words, when they taught it. */\n quote?: string;\n};\n\n/** Marks that separate words rather than say anything: never part of a phrase unless it is only marks. */\nconst SOFT = new Set([\n \".\",\n \",\",\n \";\",\n \":\",\n \"!\",\n \"?\",\n \"¡\",\n \"¿\",\n '\"',\n \"'\",\n \"“\",\n \"”\",\n \"‘\",\n \"’\",\n \"«\",\n \"»\",\n \"(\",\n \")\",\n \"[\",\n \"]\",\n \"{\",\n \"}\",\n \"…\",\n \"-\",\n \"/\",\n \"*\",\n \"_\",\n]);\n\n/** Accents off, ß as ss, and case folded unless the rule is about case. Pure. */\nfunction fold(text: string, keepCase: boolean): string {\n const plain = text.normalize(\"NFKD\").replace(/\\p{M}/gu, \"\").replace(/ß/g, \"ss\").replace(/ẞ/g, \"SS\");\n return keepCase ? plain : plain.toLowerCase();\n}\n\n/** The words and marks of a text, as phrases are matched on. Pure. */\nfunction tokens(text: string, keepCase: boolean): string[] {\n return (fold(text, keepCase).match(/[\\p{L}\\p{N}]+|[^\\s\\p{L}\\p{N}]/gu) ?? []).filter((t) => !SOFT.has(t));\n}\n\n/** Where `phrase` starts in `words`, every place. Pure. */\nfunction positions(words: readonly string[], phrase: readonly string[]): number[] {\n if (phrase.length === 0) return [];\n const at: number[] = [];\n for (let i = 0; i + phrase.length <= words.length; i++) {\n if (phrase.every((w, j) => words[i + j] === w)) at.push(i);\n }\n return at;\n}\n\n/** A rule is about case when two of its phrases are the same word but for case. Pure. */\nfunction aboutCase(check: NonNullable<CreativeRule[\"check\"]>): boolean {\n const phrases = [...(check.forbid ?? []), ...(check.allow ?? []), ...(check.require ?? [])];\n return phrases.some((a, i) =>\n phrases.some((b, j) => i !== j && a !== b && fold(a, false) === fold(b, false) && fold(a, true) !== fold(b, true)),\n );\n}\n\n/** Whether a rule in one language holds for an ad in `language`: the same primary tag, or a rule in none. Pure. */\nfunction sameLanguage(rule: CreativeRule, language: string | undefined): boolean {\n const ruleLanguage = rule.scope.language;\n if (!ruleLanguage) return true;\n if (!language) return false;\n const primary = (tag: string) => tag.toLowerCase().split(/[-_]/)[0];\n return primary(ruleLanguage) === primary(language);\n}\n\n/** The first phrase of `forbid` a line says outside every `allow`, or null. Pure. */\nfunction forbiddenIn(line: string, check: NonNullable<CreativeRule[\"check\"]>, keepCase: boolean): string | null {\n const words = tokens(line, keepCase);\n const allowed = (check.allow ?? []).flatMap((a) => {\n const phrase = tokens(a, keepCase);\n return positions(words, phrase).map((start) => [start, start + phrase.length] as const);\n });\n for (const banned of check.forbid ?? []) {\n const phrase = tokens(banned, keepCase);\n const free = positions(words, phrase).some(\n (start) => !allowed.some(([from, to]) => start >= from && start + phrase.length <= to),\n );\n if (free) return banned;\n }\n return null;\n}\n\n/** What one rule finds in the lines: each line saying a phrase it bans, each phrase it requires none says. Pure. */\nfunction tellsOf(rule: CreativeRule, lines: readonly string[]): RuleTell[] {\n const check = rule.check;\n if (!check) return [];\n const keepCase = aboutCase(check);\n const base = {\n rule: rule.id,\n strength: rule.strength,\n text: rule.text,\n ...(rule.source.quote ? { quote: rule.source.quote } : {}),\n };\n const forbidden = lines.flatMap((line) => {\n const phrase = forbiddenIn(line, check, keepCase);\n return phrase ? [{ ...base, kind: \"forbidden\" as const, phrase, line }] : [];\n });\n const missing = (check.require ?? []).flatMap((required) => {\n const phrase = tokens(required, keepCase);\n const said = lines.some((line) => positions(tokens(line, keepCase), phrase).length > 0);\n return said ? [] : [{ ...base, kind: \"missing\" as const, phrase: required }];\n });\n return [...forbidden, ...missing];\n}\n\n/** Every wording rule the lines break, the line it is broken in first. Pure. */\nexport function ruleTells(\n lines: readonly string[],\n rules: readonly CreativeRule[],\n language: string | undefined,\n): RuleTell[] {\n return rules\n .filter((rule) => rule.strength !== \"prefer\" && sameLanguage(rule, language))\n .flatMap((rule) => tellsOf(rule, lines));\n}\n","/**\n * Ideas and the customer truths they stand on.\n *\n * An idea (src/creatives/_ideas/<id>.md) is one bet: who it is for, the one thing it says, the\n * customer evidence behind it and how it says it. An insight (src/content/insights/<id>.md) is\n * one customer truth, a quote with its source. `checkIdeas` is the judgment the agent used to\n * carry in prose: is each idea backed by something a customer said, does it claim only what the\n * Knowledge holds, is it a different ad from the others, does it fill a gap. Pure.\n */\nimport { staticFormatPatternSchema } from \"@baker/api\";\nimport { parse as parseYaml, YAMLParseError } from \"yaml\";\nimport { ruleTells } from \"../../engine/copy-tells/rule-tells.ts\";\nimport type { CreativeRule } from \"../../engine/creative-rules/schema.ts\";\n\n/** How an idea persuades, in the ads library's own angle vocabulary, so ours and theirs compare. */\nexport const IDEA_ANGLES = [\n \"pain_relief\",\n \"aspiration\",\n \"status\",\n \"fear\",\n \"FOMO\",\n \"identity\",\n \"contrarian\",\n \"education\",\n \"novelty\",\n \"authority\",\n \"community\",\n \"transformation\",\n \"convenience\",\n \"save_money\",\n \"save_time\",\n \"save_effort\",\n \"named_enemy\",\n \"objection_crusher\",\n \"villain_democratization\",\n \"commiseration\",\n \"recognition_mirror\",\n \"flipped_idiom\",\n] as const;\n\n/** Video formats an idea may take; every other format is a static container from the library. */\nexport const IDEA_VIDEO_FORMATS = [\n \"video_ugc\",\n \"video_founder\",\n \"video_testimonial\",\n \"video_demo\",\n \"video_screen_recording\",\n \"video_explainer\",\n \"video_motion_graphics\",\n] as const;\n\nexport const IDEA_FORMATS: readonly string[] = [...staticFormatPatternSchema.options, ...IDEA_VIDEO_FORMATS];\n\nexport const AWARENESS_STAGES = [\"unaware\", \"problem_aware\", \"solution_aware\", \"product_aware\", \"most_aware\"] as const;\nexport type AwarenessStage = (typeof AWARENESS_STAGES)[number];\n\nexport const EVIDENCE_LEVELS = [\"observed\", \"interpreted\", \"hypothesized\", \"generated\"] as const;\nexport type EvidenceLevel = (typeof EVIDENCE_LEVELS)[number];\n\nexport const IDEA_STATUSES = [\"idea\", \"built\", \"testing\", \"winner\", \"failed\", \"inconclusive\", \"retired\"] as const;\nexport type IdeaStatus = (typeof IDEA_STATUSES)[number];\n\nexport type Insight = {\n id: string;\n type: string;\n quote: string;\n source: string;\n status: EvidenceLevel;\n sourceKind?: string;\n force?: string;\n persona?: string;\n /** Who said it, as the research wrote it (\"A 5★ Trustpilot review by Lena Fischer.\"). */\n author?: string;\n};\n\nexport type Idea = {\n id: string;\n who: string;\n message: string;\n evidence: string[];\n awareness: AwarenessStage;\n angle: string;\n format: string;\n job: \"opener\" | \"closer\";\n why: string;\n status: IdeaStatus;\n};\n\nconst FRONTMATTER = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/;\n\n/** A markdown file's frontmatter as an object, or null when it has none or it does not parse. */\nexport function frontmatterOf(markdown: string): Record<string, unknown> | null {\n const block = FRONTMATTER.exec(markdown)?.[1];\n if (block === undefined) return null;\n try {\n const parsed: unknown = parseYaml(block);\n return parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Why a file's frontmatter does not parse, naming the line, or null when it parses (or has none).\n * Dev, Oct 2026: an unquoted `why: \"a minefield\" with quotes` read as every field missing. Pure.\n */\nexport function frontmatterError(markdown: string): string | null {\n const block = FRONTMATTER.exec(markdown)?.[1];\n if (block === undefined) return null;\n try {\n parseYaml(block);\n return null;\n } catch (e) {\n const line = e instanceof YAMLParseError ? e.linePos?.[0]?.line : undefined;\n const at = line ? ` at line ${line} (\\`${block.split(/\\r?\\n/)[line - 1]?.trim() ?? \"\"}\\`)` : \"\";\n return `the frontmatter is not valid YAML${at}: put each text value wholly in double quotes, with any quote inside it as \\\\\" or as single quotes`;\n }\n}\n\nfunction text(value: unknown): string | undefined {\n if (typeof value === \"string\") return value.trim() || undefined;\n if (typeof value === \"number\") return String(value);\n return undefined;\n}\n\nfunction oneOf<T extends string>(values: readonly T[], value: unknown): T | undefined {\n return typeof value === \"string\" && (values as readonly string[]).includes(value) ? (value as T) : undefined;\n}\n\n/** A source a reader can open: a link, or a library entry (`testimonials:t1`). */\nconst CHECKABLE_SOURCE = /^(?:https?:\\/\\/\\S+|[a-z_]+:[\\w-]+)$/i;\n\n/**\n * How strong an insight really is: one filed as observed is read as interpreted when its source\n * cannot be checked. Audited live Oct 2026: article lines, sourced \"an article (referenced in …)\",\n * filed as what customers said. A quote that is a statistic about people rather than someone's\n * words is the other half of that audit, and a reading of the words: `ideas-judgments.ts`.\n */\nfunction evidenceStatus(stated: EvidenceLevel, source: string): EvidenceLevel {\n if (stated !== \"observed\") return stated;\n return CHECKABLE_SOURCE.test(source) ? \"observed\" : \"interpreted\";\n}\n\n/** One customer truth, or null when it carries no quote or source to stand on. */\nexport function parseInsight(id: string, markdown: string): Insight | null {\n const fm = frontmatterOf(markdown);\n const quote = text(fm?.quote);\n const source = text(fm?.source);\n if (!fm || !quote || !source) return null;\n const force = text(fm.force);\n const persona = text(fm.persona);\n const sourceKind = text(fm.sourceKind);\n const author = markdown\n .replace(/^---[\\s\\S]*?\\n---/, \"\")\n .match(/\\bby ([\\p{Lu}][\\p{L}'’-]*\\.?(?: [\\p{Lu}][\\p{L}'’-]*\\.?)?)/u)?.[1]\n // The sentence's full stop, never an initial's (\"Marta G.\").\n ?.replace(/(\\p{L}{2,})\\.$/u, \"$1\");\n return {\n id,\n type: text(fm.type) ?? \"other\",\n quote,\n source,\n status: evidenceStatus(oneOf(EVIDENCE_LEVELS, fm.status) ?? \"observed\", source),\n ...(sourceKind ? { sourceKind } : {}),\n ...(force ? { force } : {}),\n ...(persona ? { persona } : {}),\n ...(author ? { author } : {}),\n };\n}\n\nfunction evidenceList(value: unknown): string[] {\n if (Array.isArray(value)) return value.flatMap((e) => (text(e) ? [String(text(e))] : []));\n const single = text(value);\n return single ? [single] : [];\n}\n\ntype IdeaFields = {\n who?: string;\n message?: string;\n why?: string;\n angle?: string;\n format?: string;\n awareness?: AwarenessStage;\n /** The awareness as written, to quote back when it is not a stage. */\n awarenessWritten?: string;\n};\n\nfunction fieldProblems(f: IdeaFields): string[] {\n const problems: string[] = [];\n if (!f.who) problems.push(\"who is missing: the persona it is for\");\n if (!f.message)\n problems.push(\n \"message is missing: the one promise a stranger should get, what is offered and what changes for them\",\n );\n if (!f.why) problems.push(\"why is missing: the brief finding it answers\");\n if (!f.awareness) {\n const written = f.awarenessWritten ? `\"${f.awarenessWritten}\" ` : \"\";\n problems.push(`awareness ${written}must be one of ${AWARENESS_STAGES.join(\", \")}`);\n }\n if (!(f.angle && (IDEA_ANGLES as readonly string[]).includes(f.angle)))\n problems.push(`angle ${f.angle ? `\"${f.angle}\" ` : \"\"}must be one of ${IDEA_ANGLES.join(\", \")}`);\n if (!(f.format && IDEA_FORMATS.includes(f.format)))\n problems.push(`format ${f.format ? `\"${f.format}\" ` : \"\"}must be one of ${IDEA_FORMATS.join(\", \")}`);\n return problems;\n}\n\n/** One idea file, or every problem that keeps it from being one. */\nexport function parseIdea(id: string, markdown: string): { idea?: Idea; problems: string[] } {\n const unparsable = frontmatterError(markdown);\n if (unparsable) return { problems: [unparsable] };\n const fm = frontmatterOf(markdown) ?? {};\n const f: IdeaFields = {\n who: text(fm.who),\n message: text(fm.message),\n why: text(fm.why),\n angle: text(fm.angle),\n format: text(fm.format),\n awareness: oneOf(AWARENESS_STAGES, fm.awareness),\n awarenessWritten: text(fm.awareness),\n };\n const problems = fieldProblems(f);\n const { who, message, why, angle, format, awareness } = f;\n if (problems.length > 0 || !who || !message || !why || !awareness || !angle || !format) return { problems };\n return {\n idea: {\n id,\n who,\n message,\n evidence: evidenceList(fm.evidence),\n awareness,\n angle,\n format,\n job: fm.job === \"closer\" ? \"closer\" : \"opener\",\n why,\n status: oneOf(IDEA_STATUSES, fm.status) ?? \"idea\",\n },\n problems,\n };\n}\n\nexport type IdeaCheck = {\n id: string;\n status: IdeaStatus;\n message: string;\n /** The strongest evidence behind it; `explore` when no insight backs it. */\n evidence: EvidenceLevel | \"explore\";\n /** The customer's own words it stands on, when it has some. */\n quote?: string;\n awareness: AwarenessStage;\n angle: string;\n format: string;\n /** Blocks building it until fixed. */\n problems: string[];\n /** Worth fixing; never blocks. */\n warnings: string[];\n /** What it adds that the live ads do not have. */\n gaps: string[];\n score: number;\n};\n\nexport type CheckIdeasInput = {\n ideas: readonly Idea[];\n insights: readonly Insight[];\n /** Everything the company's documents say (COMPANY.md, the Knowledge): the claims an ad may make. */\n knowledge: string;\n /** Persona entry ids in the Knowledge; empty when there are none to check against. */\n personas: readonly string[];\n /** Awareness stages the company's live or built ads already speak to. */\n coveredAwareness: readonly string[];\n /** How many live or built ideas close (`job: closer`). */\n closersLive: number;\n /** Whether two messages say the same thing (`ideas-judgments.ts`); the same words, without it. */\n sameMessage?: SameMessage;\n /** The company's rules for its ads: a message that breaks a wording rule is not an idea to build. */\n rules?: readonly CreativeRule[];\n /** The language the ideas' messages are in (the company's market's), for the wording rules. */\n language?: string;\n};\n\nconst EVIDENCE_WEIGHT: Record<EvidenceLevel | \"explore\", number> = {\n observed: 3,\n interpreted: 2,\n hypothesized: 1,\n generated: 0,\n explore: 0,\n};\n\nconst LIVE_STATUSES: readonly IdeaStatus[] = [\"built\", \"testing\", \"winner\"];\n\n/** Numbers, percentages and prices a message states: each must be found in what the company wrote. */\nfunction claimsOf(message: string): string[] {\n return [...message.matchAll(/\\d[\\d.,]*\\s?(?:%|€|\\$|£|x\\b|k\\b)?/gi)].map((m) => m[0].trim());\n}\n\n/** A figure as written anywhere, separators dropped: \"4.990 €\", \"4990€\" and \"4,990\" are one number. */\nfunction figureOf(claim: string): string {\n return claim.replace(/[^\\d]/g, \"\");\n}\n\n/** Every whole number a text states, so \"4\" is never found inside \"4.990\". Pure. */\nexport function figuresIn(text: string): Set<string> {\n return new Set([...text.matchAll(/\\d(?:[\\d.,]*\\d)?/g)].map((m) => figureOf(m[0])));\n}\n\nfunction normalize(value: string): string {\n return value.toLowerCase().replace(/\\s+/g, \" \").trim();\n}\n\nfunction sentencesOf(message: string): number {\n return message.split(/[.!?]+(?:\\s|$)/).filter((s) => s.trim().length > 0).length;\n}\n\ntype CheckContext = {\n insights: ReadonlyMap<string, Insight>;\n corpusFigures: ReadonlySet<string>;\n covered: ReadonlySet<string>;\n duplicateOf: ReadonlyMap<string, string>;\n personas: readonly string[];\n closersLive: number;\n failed: readonly Idea[];\n sameMessage: SameMessage;\n rules: readonly CreativeRule[];\n language: string | undefined;\n};\n\n/** Whether two ad messages say the same thing, however reworded. */\nexport type SameMessage = (a: string, b: string) => boolean;\n\n/** Without a reading of the words, only the same message written the same way is one. Pure. */\nexport const SAME_WORDS: SameMessage = (a, b) => normalize(a) === normalize(b);\n\n/** A failed idea this one repeats: the same message (reworded or not), or the same angle in the same format. */\nfunction repeatedFailure(idea: Idea, failed: readonly Idea[], sameMessage: SameMessage): string[] {\n const lost = failed.find(\n (f) =>\n f.id !== idea.id &&\n (sameMessage(f.message, idea.message) || (f.angle === idea.angle && f.format === idea.format)),\n );\n return lost\n ? [`says what \"${lost.id}\" said, and that idea failed in the account: change the message, not just the picture`]\n : [];\n}\n\n/** The insight on file whose id and quote share the most words with `id`, an id written from memory. */\nfunction likelyMeant(id: string, insights: ReadonlyMap<string, Insight>): string | undefined {\n const words = (text: string) =>\n new Set(\n text\n .toLowerCase()\n .split(/[^\\p{L}\\p{N}]+/u)\n .filter((w) => w.length >= 3),\n );\n const wanted = words(id);\n let best: { id: string; shared: number } | undefined;\n for (const insight of insights.values()) {\n const said = words(`${insight.id} ${insight.quote}`);\n const shared = [...wanted].filter((w) => said.has(w)).length;\n if (shared > 0 && shared > (best?.shared ?? 0)) best = { id: insight.id, shared };\n }\n return best?.id;\n}\n\nfunction backingOf(idea: Idea, insights: ReadonlyMap<string, Insight>, problems: string[]) {\n const backing = idea.evidence.flatMap((id) => {\n const insight = insights.get(id);\n if (!insight) {\n const meant = likelyMeant(id, insights);\n problems.push(\n `evidence \"${id}\" is not in src/content/insights/: ${meant ? `did you mean \"${meant}\"? ` : \"\"}name an insight on file by its id, or leave it out`,\n );\n }\n return insight ? [insight] : [];\n });\n return [...backing].sort((a, b) => EVIDENCE_WEIGHT[b.status] - EVIDENCE_WEIGHT[a.status])[0];\n}\n\n/** The figures a text claims that nothing the company wrote holds. Pure. */\nexport function unsourcedClaims(text: string, corpusFigures: ReadonlySet<string>): string[] {\n return claimsOf(text).filter((claim) => {\n const figure = figureOf(claim);\n return figure !== \"\" && !corpusFigures.has(figure);\n });\n}\n\nfunction claimProblems(message: string, corpusFigures: ReadonlySet<string>): string[] {\n return unsourcedClaims(message, corpusFigures).map(\n (claim) => `\"${claim}\" is in no customer quote, COMPANY.md or Knowledge entry: source it or drop it`,\n );\n}\n\n/** Where people in the market speak, as opposed to our own customers (reviews, testimonials, calls…). */\nexport const MARKET_SOURCES: readonly string[] = [\"reddit\", \"forum\", \"web\"];\nconst TESTIMONIAL_FORMATS = [\"review_screenshot\", \"testimonial_quote\", \"video_testimonial\"];\n\nfunction fromMarket(insight: Insight | undefined): boolean {\n return insight?.sourceKind !== undefined && MARKET_SOURCES.includes(insight.sourceKind);\n}\n\n/** An insight whose figures may stand behind our claim: our own customer's words, as written. */\nexport function sourcesClaims(insight: Insight): boolean {\n return insight.status === \"observed\" && !fromMarket(insight);\n}\n\n/** A cited result someone in the market reported, which an ad could pass off as ours. */\nfunction borrowedProof(idea: Idea, insights: ReadonlyMap<string, Insight>): string | undefined {\n return idea.evidence.find((id) => {\n const insight = insights.get(id);\n return fromMarket(insight) && insight?.type === \"proof\";\n });\n}\n\n/** A review or testimonial format with no quote from our own customers: it could only be a fake review. */\nfunction fakeReviewProblem(idea: Idea, insights: ReadonlyMap<string, Insight>): string[] {\n if (!TESTIMONIAL_FORMATS.includes(idea.format)) return [];\n const cited = idea.evidence.flatMap((id) => insights.get(id) ?? []);\n if (cited.length === 0 || !cited.every(fromMarket)) return [];\n return [\n `${idea.format} needs a quote from our own customer (a review, testimonial, call or survey); every one cited was said by someone in the market. Pick another format, or cite our own customer`,\n ];\n}\n\nfunction warningsOf(\n idea: Idea,\n evidence: EvidenceLevel | \"explore\",\n personas: readonly string[],\n insights: ReadonlyMap<string, Insight>,\n): string[] {\n const warnings: string[] = [];\n const borrowed = borrowedProof(idea, insights);\n if (borrowed) {\n warnings.push(\n `\"${borrowed}\" was said by someone in the market, not a customer of ours: use their words for the problem, never show it as our review, testimonial or result`,\n );\n }\n if (sentencesOf(idea.message) > 1 || idea.message.split(/\\s+/).length > 25) {\n warnings.push(\n 'the message says more than one thing: keep one promise that still names what is offered (\"a free roof survey that shows your real saving\", never a slogan like \"the numbers, explained\"), the rest goes to the ad text',\n );\n }\n if (personas.length > 0 && !personas.includes(idea.who)) {\n warnings.push(`who \"${idea.who}\" is not a persona in the Knowledge (${personas.join(\", \")})`);\n }\n if (evidence === \"explore\") {\n warnings.push(\"no customer evidence: an explore bet. `baker research customers` may find some\");\n }\n return warnings;\n}\n\nfunction checkOne(idea: Idea, ctx: CheckContext): IdeaCheck {\n const problems: string[] = [];\n const best = backingOf(idea, ctx.insights, problems);\n const evidence = best?.status ?? \"explore\";\n problems.push(\n ...claimProblems(idea.message, ctx.corpusFigures),\n ...fakeReviewProblem(idea, ctx.insights),\n // The message is one line of the ad: a phrase a rule requires may sit in another.\n ...ruleTells([idea.message], ctx.rules, ctx.language)\n .filter((t) => t.kind === \"forbidden\")\n .map((t) => `The message says \"${t.phrase}\": ${t.rule} (${t.strength}) — ${t.text}`),\n );\n const duplicate = ctx.duplicateOf.get(idea.id);\n if (duplicate) {\n problems.push(\n `same angle and format, or the same message, as \"${duplicate}\": to the platform it is the same ad. Change the angle or the format`,\n );\n }\n const gaps: string[] = [];\n if (!ctx.covered.has(idea.awareness)) gaps.push(`no live ad speaks to ${idea.awareness} people`);\n if (idea.job === \"closer\" && ctx.closersLive === 0) gaps.push(\"no live ad closes warm people\");\n return {\n id: idea.id,\n status: idea.status,\n message: idea.message,\n evidence,\n ...(best ? { quote: best.quote } : {}),\n awareness: idea.awareness,\n angle: idea.angle,\n format: idea.format,\n problems,\n warnings: [\n ...warningsOf(idea, evidence, ctx.personas, ctx.insights),\n ...repeatedFailure(idea, ctx.failed, ctx.sameMessage),\n ],\n gaps,\n score: EVIDENCE_WEIGHT[evidence] + gaps.length - (problems.length > 0 ? 10 : 0),\n };\n}\n\n/** Which idea repeats an earlier one: a built idea, then the better-evidenced, then the first written keeps it. */\nfunction duplicatesOf(ideas: readonly Idea[], insights: ReadonlyMap<string, Insight>): Map<string, string> {\n const active = ideas.filter((i) => i.status !== \"retired\" && i.status !== \"failed\");\n const strength = (idea: Idea) =>\n Math.max(0, ...idea.evidence.map((id) => EVIDENCE_WEIGHT[insights.get(id)?.status ?? \"explore\"]));\n const position = new Map(ideas.map((idea, index) => [idea.id, index]));\n const order = [...active].sort(\n (a, b) =>\n Number(LIVE_STATUSES.includes(b.status)) - Number(LIVE_STATUSES.includes(a.status)) ||\n strength(b) - strength(a) ||\n (position.get(a.id) ?? 0) - (position.get(b.id) ?? 0),\n );\n const seenPairs = new Map<string, string>();\n const seenMessages = new Map<string, string>();\n const duplicateOf = new Map<string, string>();\n for (const idea of order) {\n const pair = `${idea.angle}×${idea.format}`;\n const message = normalize(idea.message);\n const earlier = seenPairs.get(pair) ?? seenMessages.get(message);\n if (earlier) duplicateOf.set(idea.id, earlier);\n if (!seenPairs.has(pair)) seenPairs.set(pair, idea.id);\n if (!seenMessages.has(message)) seenMessages.set(message, idea.id);\n }\n return duplicateOf;\n}\n\n/**\n * Check and rank every idea. Ideas still to build come first, best first: the strongest customer\n * evidence, then a gap the live ads leave; anything with a problem sinks. Built ideas follow.\n */\nexport function checkIdeas(input: CheckIdeasInput): IdeaCheck[] {\n const insights = new Map(input.insights.map((insight) => [insight.id, insight]));\n // What our own customers said, word for word, can source a claim; a stranger's number or a reading never can.\n const ownQuotes = input.insights.filter(sourcesClaims).map((i) => i.quote);\n const corpusFigures = figuresIn(`${input.knowledge}\\n${ownQuotes.join(\"\\n\")}`);\n const covered = new Set(input.coveredAwareness);\n const duplicateOf = duplicatesOf(input.ideas, insights);\n const checks = input.ideas.map((idea) =>\n checkOne(idea, {\n insights,\n corpusFigures,\n covered,\n duplicateOf,\n personas: input.personas,\n closersLive: input.closersLive,\n failed: input.ideas.filter((i) => i.status === \"failed\"),\n sameMessage: input.sameMessage ?? SAME_WORDS,\n rules: input.rules ?? [],\n language: input.language,\n }),\n );\n\n const toBuild = (c: IdeaCheck) => c.status === \"idea\";\n return checks.sort(\n (a, b) => Number(toBuild(b)) - Number(toBuild(a)) || b.score - a.score || a.id.localeCompare(b.id),\n );\n}\n","/**\n * Where a company's creative rules come from: the brand's own (BRAND.md, through its reading) and\n * the ones a person taught in a chat (`src/content/creative-rules/<slug>.md`, one per file). Each is\n * read as it stands when a call runs; nothing is copied into an ad's files.\n */\nimport { createHash } from \"node:crypto\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport { frontmatterOf } from \"../../commands/creatives/ideas-model.ts\";\nimport type { BrandRule } from \"../brand/brand-rules.ts\";\nimport {\n type CreativeRule,\n Phrases,\n RULE_APPLIES,\n RULE_KINDS,\n RULE_SOURCE_KINDS,\n RULE_STRENGTHS,\n type RuleCheck,\n} from \"./schema.ts\";\n\n/** Where the learned rules live in a workspace. */\nexport const RULES_DIR = path.join(\"src\", \"content\", \"creative-rules\");\n\nconst optionalText = z.string().trim().min(1).max(2000).optional().catch(undefined);\nconst optionalPhrases = Phrases.optional().catch(undefined);\nconst dateText = z\n .union([z.string(), z.date().transform((d) => d.toISOString().slice(0, 10))])\n .pipe(z.string().trim().min(1))\n .optional()\n .catch(undefined);\n\nconst Frontmatter = z.object({\n strength: z.enum(RULE_STRENGTHS).catch(\"must\"),\n applies: z.enum(RULE_APPLIES).catch(\"any\"),\n scope: z\n .object({\n kinds: z.array(z.enum(RULE_KINDS)).optional().catch(undefined),\n products: optionalPhrases,\n platforms: optionalPhrases,\n language: z.string().trim().min(2).max(10).optional().catch(undefined),\n })\n .catch({}),\n check: z\n .object({\n forbid: optionalPhrases,\n require: optionalPhrases,\n allow: optionalPhrases,\n people: z.literal(\"real\").optional().catch(undefined),\n })\n .optional()\n .catch(undefined),\n source: z\n .object({\n kind: z.enum(RULE_SOURCE_KINDS).catch(\"user\"),\n feedbackId: optionalText,\n runId: optionalText,\n slug: optionalText,\n quote: optionalText,\n date: dateText,\n })\n .catch({ kind: \"user\" }),\n status: z.enum([\"active\", \"retired\"]).catch(\"active\"),\n retiredBy: optionalText,\n});\n\n/** An object with its undefined and empty-list entries left out. Pure. */\nfunction defined<T extends object>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, v]) => v !== undefined && !(Array.isArray(v) && v.length === 0)),\n ) as T;\n}\n\n/** The rule's words (the body's first paragraph) and its why (a `Why:` paragraph). Pure. */\nfunction bodyOf(markdown: string): { text?: string; why?: string } {\n const body = markdown.replace(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/, \"\").trim();\n const paragraphs = body\n .split(/\\r?\\n\\s*\\r?\\n/)\n .map((p) => p.trim())\n .filter(Boolean);\n const why = paragraphs.find((p) => /^(?:why|por qué|porque)\\s*:/i.test(p));\n const text = paragraphs.find((p) => p !== why && !p.startsWith(\"#\"));\n return { ...(text ? { text } : {}), ...(why ? { why: why.replace(/^[^:]+:\\s*/, \"\") } : {}) };\n}\n\n/** A rule file as a rule, read leniently (a hand edit still teaches it); null without words. Pure. */\nexport function parseRuleFile(id: string, markdown: string): CreativeRule | null {\n const { text, why } = bodyOf(markdown);\n if (!text) return null;\n const fm = Frontmatter.parse(frontmatterOf(markdown) ?? {});\n const check = fm.check ? defined<RuleCheck>(fm.check) : undefined;\n return {\n id,\n origin: \"learned\",\n strength: fm.strength,\n applies: fm.applies,\n scope: defined(fm.scope),\n ...(check && Object.keys(check).length > 0 ? { check } : {}),\n text,\n ...(why ? { why } : {}),\n source: defined(fm.source),\n status: fm.status,\n ...(fm.retiredBy ? { retiredBy: fm.retiredBy } : {}),\n };\n}\n\n/** Every rule file in the workspace, by its slug; none when there is no folder. */\nexport async function readLearnedRules(root: string): Promise<CreativeRule[]> {\n const dir = path.join(root, RULES_DIR);\n const files = (await readdir(dir).catch(() => [] as string[])).filter((f) => f.endsWith(\".md\")).sort();\n const rules = await Promise.all(\n files.map(async (file) =>\n parseRuleFile(file.replace(/\\.md$/, \"\"), await readFile(path.join(dir, file), \"utf8\").catch(() => \"\")),\n ),\n );\n return rules.filter((r): r is CreativeRule => r !== null);\n}\n\n/** A declared rule's id: its words decide it, so the same rule keeps it across readings. Pure. */\nconst declaredId = (text: string) => `brand-${createHash(\"sha256\").update(text.trim()).digest(\"hex\").slice(0, 8)}`;\n\n/**\n * A ban the rule's own words show as both right and wrong, no allowed phrase telling them apart:\n * \"'£640 a year, at 24p a unit', never '£640 a year'\" bans a bare figure, not the words, so code\n * cannot check it (live, Oct 2026: read as banning \"£640 a year\", which the right form says too).\n */\nfunction shownBothWays(text: string, phrase: string, allow: readonly string[] | undefined): boolean {\n const fold = (s: string) => s.normalize(\"NFKD\").replace(/\\p{M}/gu, \"\").toLowerCase();\n const said = fold(text).split(fold(phrase)).length - 1;\n return said > 1 && !(allow ?? []).some((a) => fold(a).includes(fold(phrase)));\n}\n\n/** A bare word of one or two letters (\"IA\", \"DS\"): an acronym a brand bans reads as an ordinary word too. */\nconst BARE_SHORT_WORD = /^\\p{L}{1,2}$/u;\n\n/**\n * The rules the brand's documents state, as creative rules. Code holds only the words a brand bans,\n * never the ones it says to use: a brand document's \"must\" depends on the piece (prod, Oct 2026: its\n * taglines and CTAs fired on 28 of 66 approved ads), and the reviewers weigh those. Pure.\n */\nexport function declaredRules(rules: readonly BrandRule[]): CreativeRule[] {\n return rules.map(({ text, strength, applies, forbid, allow }) => {\n const checked = forbid?.filter((p) => !BARE_SHORT_WORD.test(p.trim()) && !shownBothWays(text, p, allow));\n const check = defined<RuleCheck>({ forbid: checked, ...(checked?.length ? { allow } : {}) });\n return {\n id: declaredId(text),\n origin: \"declared\",\n strength,\n applies,\n scope: {},\n ...(Object.keys(check).length > 0 ? { check } : {}),\n text,\n source: { kind: \"brand\" },\n status: \"active\",\n };\n });\n}\n"],"mappings":"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","names":["text","phrase","text","z","z","text","phrase","fold"]}
@@ -0,0 +1,56 @@
1
+ import {
2
+ ApiError,
3
+ apiGet
4
+ } from "./chunk-OSWCEDFE.js";
5
+ import {
6
+ compactImage,
7
+ compactVideo,
8
+ writeJson
9
+ } from "./chunk-4WYEGE4N.js";
10
+
11
+ // src/commands/mediaGroup.ts
12
+ async function runMediaGroupLookup(input) {
13
+ if (!input.id && !input.groupKey) {
14
+ writeJson({
15
+ ok: false,
16
+ error: { code: "VALIDATION_ERROR", message: `Pass ${input.idLabel} or --group-key` }
17
+ });
18
+ process.exit(1);
19
+ }
20
+ try {
21
+ const query = new URLSearchParams();
22
+ if (input.id) query.set("id", input.id);
23
+ if (input.groupKey) query.set("groupKey", input.groupKey);
24
+ const data = await apiGet(`${input.path}?${query.toString()}`);
25
+ const images = data.images.map((image) => compactImage(image));
26
+ const videos = (data.videos ?? []).map((video) => compactVideo(video));
27
+ const count = images.length + videos.length;
28
+ writeJson({
29
+ ok: true,
30
+ data: {
31
+ groupKey: data.groupKey,
32
+ groupKind: data.groupKind ?? null,
33
+ // The caption or page title the whole set shares — often the only
34
+ // place the campaign is named.
35
+ groupTitle: data.groupTitle ?? null,
36
+ groupUrl: data.groupUrl ?? null,
37
+ count,
38
+ images,
39
+ videos
40
+ },
41
+ hints: count > 1 ? ["These arrived together and are ordered. Read them in sequence before using any one of them alone."] : void 0
42
+ });
43
+ } catch (err) {
44
+ if (err instanceof ApiError) {
45
+ writeJson({ ok: false, error: { code: err.code, message: err.message } });
46
+ process.exit(1);
47
+ }
48
+ writeJson({ ok: false, error: { code: "INTERNAL_ERROR", message: "Unexpected error" } });
49
+ process.exit(1);
50
+ }
51
+ }
52
+
53
+ export {
54
+ runMediaGroupLookup
55
+ };
56
+ //# sourceMappingURL=chunk-SJOWZKNB.js.map
@@ -0,0 +1,304 @@
1
+ import {
2
+ languageTag
3
+ } from "./chunk-WZDKROPU.js";
4
+ import {
5
+ parseRefExpr
6
+ } from "./chunk-XXU7XRMM.js";
7
+ import {
8
+ AWARENESS_VALUES
9
+ } from "./chunk-KPYDTIAI.js";
10
+ import {
11
+ collectAssetRefLikes,
12
+ isPersistedAssetRef
13
+ } from "./chunk-EIJDXZW5.js";
14
+
15
+ // src/commands/canvas/creative-definition.ts
16
+ import { parseDocument } from "yaml";
17
+ var PLATFORM_VALUES = ["meta", "google", "linkedin", "tiktok", "youtube", "x", "other"];
18
+ var FORMAT_VALUES = ["1:1", "4:5", "9:16", "16:9", "1.91:1"];
19
+ var EVIDENCE_VALUES = ["observed", "interpreted", "hypothesized", "generated"];
20
+ function titleFromSlug(slug) {
21
+ const title = slug.split("-").filter(Boolean).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
22
+ return title || slug;
23
+ }
24
+ function resolvePlatform(platform) {
25
+ const value = platform?.trim();
26
+ return value && PLATFORM_VALUES.includes(value) ? value : "meta";
27
+ }
28
+ function resolveFormats(aspect) {
29
+ const value = aspect?.trim();
30
+ return value && FORMAT_VALUES.includes(value) ? [value] : ["4:5"];
31
+ }
32
+ function resolveFormatList(formats) {
33
+ const valid = [...new Set(formats.map((f) => f.trim()))].filter(
34
+ (f) => FORMAT_VALUES.includes(f)
35
+ );
36
+ return valid.length > 0 ? valid : ["4:5"];
37
+ }
38
+ function describeBlueprintIntent(blueprint) {
39
+ const intent = blueprint?.ad_intent;
40
+ if (typeof intent === "string" && intent.trim()) return intent.trim();
41
+ if (intent && typeof intent === "object") {
42
+ const summary = intent.summary ?? intent.feeling;
43
+ if (typeof summary === "string" && summary.trim()) return summary.trim();
44
+ }
45
+ return void 0;
46
+ }
47
+ function yamlScalar(value) {
48
+ return JSON.stringify(value);
49
+ }
50
+ function buildCreativeDefinition(input) {
51
+ const lines = ["---", `title: ${yamlScalar(input.title)}`, `kind: ${input.kind}`, `platform: ${input.platform}`];
52
+ lines.push(`formats: [${input.formats.map(yamlScalar).join(", ")}]`);
53
+ lines.push(`status: ${input.status ?? "draft"}`);
54
+ if (input.sourceReferenceUrl) lines.push(`sourceReferenceUrl: ${yamlScalar(input.sourceReferenceUrl)}`);
55
+ if (input.sourceAdvertiser) lines.push(`sourceAdvertiser: ${yamlScalar(input.sourceAdvertiser)}`);
56
+ if (input.sourceAdvertiserId) lines.push(`sourceAdvertiserId: ${yamlScalar(input.sourceAdvertiserId)}`);
57
+ if (input.sourceAdId) lines.push(`sourceAdId: ${yamlScalar(input.sourceAdId)}`);
58
+ if (input.sourcePlatform) lines.push(`sourcePlatform: ${input.sourcePlatform}`);
59
+ if (input.sourceKind) lines.push(`sourceKind: ${input.sourceKind}`);
60
+ if (input.sourcePath) lines.push(`sourcePath: ${yamlScalar(input.sourcePath)}`);
61
+ if (input.targetAdSet) lines.push(`targetAdSet: ${yamlScalar(input.targetAdSet)}`);
62
+ if (input.viewer) lines.push(`viewer: ${JSON.stringify(input.viewer)}`);
63
+ lines.push("---", "");
64
+ lines.push(input.description?.trim() || `${input.title} \u2014 canvas-built ${input.kind} ad for ${input.platform}.`);
65
+ lines.push("");
66
+ return lines.join("\n");
67
+ }
68
+ var SOURCE_FIELD_KEYS = ["sourceAdId", "sourcePlatform", "sourceAdvertiserId"];
69
+ function parseDefinitionSourceFields(raw) {
70
+ const match = raw.match(/^---\r?\n([\s\S]*?\r?\n)?---/);
71
+ if (!match) return {};
72
+ const doc = parseDocument(match[1] ?? "");
73
+ if (doc.errors.length > 0) return {};
74
+ const fields = {};
75
+ for (const key of SOURCE_FIELD_KEYS) {
76
+ const value = doc.get(key);
77
+ if (typeof value === "string" && value.trim()) fields[key] = value.trim();
78
+ }
79
+ return fields;
80
+ }
81
+ function oneOf(values, value) {
82
+ return values.find((allowed) => allowed === value);
83
+ }
84
+ function parseDefinitionStrategyFields(raw) {
85
+ const match = raw.match(/^---\r?\n([\s\S]*?\r?\n)?---/);
86
+ if (!match) return {};
87
+ const doc = parseDocument(match[1] ?? "");
88
+ if (doc.errors.length > 0) return {};
89
+ const text = (key) => {
90
+ const value = doc.get(key);
91
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
92
+ };
93
+ const ideaSlug = text("idea");
94
+ const message = text("message");
95
+ const evidence = oneOf(EVIDENCE_VALUES, text("evidence"));
96
+ const angle = text("angle");
97
+ const persona = text("persona");
98
+ const awareness = oneOf(AWARENESS_VALUES, text("awareness"));
99
+ const hypothesis = text("hypothesis");
100
+ const seriesLead = text("series");
101
+ const language = languageTag(text("language") ?? "");
102
+ return {
103
+ ...seriesLead ? { seriesLead } : {},
104
+ ...language ? { language } : {},
105
+ ...ideaSlug ? { ideaSlug } : {},
106
+ ...message ? { message } : {},
107
+ ...evidence ? { evidence } : {},
108
+ ...angle ? { angle } : {},
109
+ ...persona ? { persona } : {},
110
+ ...awareness ? { awareness } : {},
111
+ ...hypothesis ? { hypothesis } : {}
112
+ };
113
+ }
114
+ function parseDefinitionSeriesPlace(raw) {
115
+ const match = raw.match(/^---\r?\n([\s\S]*?\r?\n)?---/);
116
+ if (!match || parseDocument(match[1] ?? "").errors.length > 0) return null;
117
+ const { seriesLead, language } = parseDefinitionStrategyFields(raw);
118
+ return { seriesLead: seriesLead ?? null, language: language ?? null };
119
+ }
120
+ function parseDefinitionViewerFields(raw) {
121
+ const match = raw.match(/^---\r?\n([\s\S]*?\r?\n)?---/);
122
+ if (!match) return {};
123
+ const doc = parseDocument(match[1] ?? "");
124
+ if (doc.errors.length > 0) return {};
125
+ const data = doc.toJS();
126
+ const adSet = data?.targetAdSet;
127
+ const targetAdSet = typeof adSet === "string" || typeof adSet === "number" ? String(adSet).trim() : "";
128
+ return {
129
+ ...targetAdSet ? { targetAdSet } : {},
130
+ ...data?.viewer !== void 0 ? { viewer: data.viewer } : {}
131
+ };
132
+ }
133
+ function setDefinitionViewer(raw, fields) {
134
+ const match = raw.match(/^---\r?\n([\s\S]*?\r?\n)?---/);
135
+ if (!match) return raw;
136
+ const doc = parseDocument(match[1] ?? "");
137
+ if (doc.errors.length > 0) return raw;
138
+ if (fields.targetAdSet) doc.set("targetAdSet", fields.targetAdSet);
139
+ if (fields.viewer) doc.set("viewer", doc.createNode(fields.viewer, { flow: true }));
140
+ return `---
141
+ ${doc.toString()}---${raw.slice(match[0].length)}`;
142
+ }
143
+
144
+ // src/commands/canvas/run-record.ts
145
+ import path from "path";
146
+ var MAX_RUN_NODES = 200;
147
+ var MAX_OUTPUTS_PER_NODE = 10;
148
+ var MAX_FINAL_OUTPUTS = 10;
149
+ var MAX_CREATIVE_SLUG_LENGTH = 100;
150
+ function creativeSlugFromCanvasPath(filePath) {
151
+ const normalized = filePath.split(path.sep).join("/");
152
+ const match = normalized.match(/(?:^|\/)src\/creatives\/([a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\//);
153
+ const slug = match?.[1] ?? null;
154
+ return slug && slug.length <= MAX_CREATIVE_SLUG_LENGTH ? slug : null;
155
+ }
156
+ function finalOutputLabelsFromCanvas(parsed) {
157
+ const canvas = parsed;
158
+ const outputNodeId = canvas?.output?.node;
159
+ if (typeof outputNodeId !== "string" || !Array.isArray(canvas?.nodes)) return null;
160
+ const node = canvas.nodes.find((n) => n?.id === outputNodeId);
161
+ if (node?.type !== "collect") return null;
162
+ const explicit = node.params?.labels;
163
+ if (Array.isArray(explicit) && explicit.every((l) => typeof l === "string")) {
164
+ return { nodeId: outputNodeId, labels: explicit };
165
+ }
166
+ const images = node.inputs?.images;
167
+ if (!Array.isArray(images)) return null;
168
+ const labels = images.map((entry) => {
169
+ if (typeof entry !== "string") return void 0;
170
+ return parseRefExpr(entry)?.nodeId;
171
+ });
172
+ return { nodeId: outputNodeId, labels };
173
+ }
174
+ var OUTPUT_KINDS = /* @__PURE__ */ new Set(["image", "video", "audio", "json", "text", "font"]);
175
+ function toRecordOutput(slot, value, label) {
176
+ const refs = collectAssetRefLikes(value);
177
+ const ref = refs.length === 1 ? refs[0] : null;
178
+ if (!ref || !isPersistedAssetRef(ref)) return null;
179
+ const kind = typeof ref.kind === "string" && OUTPUT_KINDS.has(ref.kind) ? ref.kind : null;
180
+ if (!kind) return null;
181
+ return {
182
+ slot,
183
+ label,
184
+ kind,
185
+ sha256: ref.sha256,
186
+ url: ref.url,
187
+ mime: ref.mime,
188
+ width: typeof ref.width === "number" ? ref.width : void 0,
189
+ height: typeof ref.height === "number" ? ref.height : void 0,
190
+ durationMs: typeof ref.duration_ms === "number" ? ref.duration_ms : void 0
191
+ };
192
+ }
193
+ function nodeOutputsToRecord(nodeOutputs, labels) {
194
+ const out = [];
195
+ for (const [slot, value] of Object.entries(nodeOutputs)) {
196
+ if (Array.isArray(value)) {
197
+ value.forEach((item, i) => {
198
+ const rec = toRecordOutput(`${slot}#${i}`, item, labels?.[i]);
199
+ if (rec) out.push(rec);
200
+ });
201
+ } else {
202
+ const rec = toRecordOutput(slot, value);
203
+ if (rec) out.push(rec);
204
+ }
205
+ }
206
+ return out.slice(0, MAX_OUTPUTS_PER_NODE);
207
+ }
208
+ function finalOutputsToRecord(output, labels) {
209
+ if (Array.isArray(output)) {
210
+ return output.map((item, i) => toRecordOutput(`final#${i}`, item, labels?.[i])).filter((rec2) => rec2 !== null).slice(0, MAX_FINAL_OUTPUTS);
211
+ }
212
+ const rec = toRecordOutput("final", output);
213
+ return rec ? [rec] : [];
214
+ }
215
+ function finalFiles(output, labels) {
216
+ const items = Array.isArray(output) ? output : [output];
217
+ const files = {};
218
+ items.forEach((item, i) => {
219
+ const ref = collectAssetRefLikes(item)[0];
220
+ if (ref && typeof ref.path === "string") files[labels?.[i] ?? `final#${i}`] = ref.path;
221
+ });
222
+ return files;
223
+ }
224
+ function buildRunRecord(result, meta, plan, finalLabels) {
225
+ const nodes = result.node_runs.slice(0, MAX_RUN_NODES).map((run) => {
226
+ const planned = plan?.get(run.node_id);
227
+ return {
228
+ nodeId: run.node_id,
229
+ nodeType: run.node_type,
230
+ cached: run.cached,
231
+ credits: run.credits,
232
+ durationMs: run.duration_ms,
233
+ outputs: nodeOutputsToRecord(
234
+ result.outputs_by_node[run.node_id] ?? {},
235
+ run.node_id === finalLabels?.nodeId ? finalLabels.labels : void 0
236
+ ),
237
+ deps: planned?.deps,
238
+ status: plan ? "completed" : void 0,
239
+ paramsPreview: planned?.paramsPreview,
240
+ ...planned?.role !== void 0 ? { role: planned.role } : {}
241
+ };
242
+ });
243
+ const finalOutputs = finalOutputsToRecord(result.output, finalLabels?.labels);
244
+ return {
245
+ runId: result.run_id,
246
+ ...meta,
247
+ status: "completed",
248
+ stats: {
249
+ totalNodes: result.stats.total_nodes,
250
+ cachedNodes: result.stats.cached_nodes,
251
+ totalCredits: result.stats.total_credits,
252
+ durationMs: result.stats.duration_ms
253
+ },
254
+ nodes,
255
+ finalOutputs: finalOutputs.length > 0 ? finalOutputs : void 0,
256
+ // Sent whenever the review RAN, empty list included. Sending it only when there
257
+ // were findings makes a clean render and an unreviewed one look identical in the
258
+ // record — which is the exact ambiguity this field was added to remove: proving a
259
+ // review had happened once meant re-running a cached canvas and reading raw JSON.
260
+ // Only the fields the backend keeps: a static review's typed fields (`kind`) stay in the CLI.
261
+ ...meta.review ? { review: meta.review.slice(0, 40).map(({ severity, what, scene }) => ({ severity, what, ...scene ? { scene } : {} })) } : {}
262
+ };
263
+ }
264
+ function buildInitialRunRecord(runId, meta) {
265
+ return {
266
+ runId,
267
+ ...meta,
268
+ status: "running",
269
+ stats: { totalNodes: 0, cachedNodes: 0, totalCredits: 0, durationMs: 0 },
270
+ nodes: []
271
+ };
272
+ }
273
+ function buildFailedRunRecord(runId, errorMessage, meta) {
274
+ return {
275
+ runId,
276
+ ...meta,
277
+ status: "failed",
278
+ errorMessage: errorMessage.slice(0, 2e3),
279
+ stats: { totalNodes: 0, cachedNodes: 0, totalCredits: 0, durationMs: 0 },
280
+ nodes: []
281
+ };
282
+ }
283
+
284
+ export {
285
+ titleFromSlug,
286
+ resolvePlatform,
287
+ resolveFormats,
288
+ resolveFormatList,
289
+ describeBlueprintIntent,
290
+ buildCreativeDefinition,
291
+ parseDefinitionSourceFields,
292
+ parseDefinitionStrategyFields,
293
+ parseDefinitionSeriesPlace,
294
+ parseDefinitionViewerFields,
295
+ setDefinitionViewer,
296
+ creativeSlugFromCanvasPath,
297
+ finalOutputLabelsFromCanvas,
298
+ nodeOutputsToRecord,
299
+ finalFiles,
300
+ buildRunRecord,
301
+ buildInitialRunRecord,
302
+ buildFailedRunRecord
303
+ };
304
+ //# sourceMappingURL=chunk-SQQ4VBNI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/canvas/creative-definition.ts","../src/commands/canvas/run-record.ts"],"sourcesContent":["import { parseDocument } from \"yaml\";\nimport { AWARENESS_VALUES, type ViewerProfile } from \"../../viewer-profile.ts\";\nimport { languageTag } from \"../../language.ts\";\n\n// The scaffold's `creatives` collection (src/collections/creatives.ts) accepts exactly these;\n// `creative-definition.parity.test.ts` fails when the two lists drift. An unknown platform or\n// format degrades to the default rather than emitting a definition the collection would reject.\nexport const PLATFORM_VALUES = [\"meta\", \"google\", \"linkedin\", \"tiktok\", \"youtube\", \"x\", \"other\"] as const;\nexport const FORMAT_VALUES = [\"1:1\", \"4:5\", \"9:16\", \"16:9\", \"1.91:1\"] as const;\nexport const CREATIVE_KIND_VALUES = [\"static\", \"video\"] as const;\nexport const CREATIVE_STATUS_VALUES = [\"draft\", \"rendered\", \"published\", \"archived\"] as const;\nexport const SOURCE_KIND_VALUES = [\"image\", \"video\"] as const;\nexport const EVIDENCE_VALUES = [\"observed\", \"interpreted\", \"hypothesized\", \"generated\"] as const;\n\n/** Frontmatter + body for a creative's `_definition.md`, mirroring the scaffold `creatives` collection schema. */\nexport type CreativeSourceKind = (typeof SOURCE_KIND_VALUES)[number];\n\nexport type CreativeDefinitionInput = {\n title: string;\n kind: (typeof CREATIVE_KIND_VALUES)[number];\n platform: string;\n formats: string[];\n status?: (typeof CREATIVE_STATUS_VALUES)[number];\n sourceReferenceUrl?: string;\n sourceAdvertiser?: string;\n /** The library ad it adapted (`baker winning-ads` ids): what `baker_uses` in reference search counts. */\n sourceAdId?: string;\n sourcePlatform?: string;\n sourceAdvertiserId?: string;\n sourceKind?: CreativeSourceKind;\n /** Repo-relative path to the committed source asset (e.g. \"references/original.jpg\"). */\n sourcePath?: string;\n /** The Meta ad set the ad is made for (`baker ads meta adsets`). */\n targetAdSet?: string;\n /** Who that ad set reaches (`baker ads meta adsets --audience`), or the viewer read from the Knowledge. */\n viewer?: ViewerProfile;\n description?: string;\n};\n\n/** Title-case a slug: \"factorial-hr-4x5\" -> \"Factorial Hr 4x5\". Falls back to the slug when empty. */\nexport function titleFromSlug(slug: string): string {\n const title = slug\n .split(\"-\")\n .filter(Boolean)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n return title || slug;\n}\n\n/** Coerce a platform flag to a collection-valid value (default \"meta\"). */\nexport function resolvePlatform(platform: string | undefined): string {\n const value = platform?.trim();\n return value && (PLATFORM_VALUES as readonly string[]).includes(value) ? value : \"meta\";\n}\n\n/** A single-format array from the resolved aspect ratio (default [\"4:5\"] when unknown). */\nexport function resolveFormats(aspect: string | undefined): string[] {\n const value = aspect?.trim();\n return value && (FORMAT_VALUES as readonly string[]).includes(value) ? [value] : [\"4:5\"];\n}\n\n/** A deduped list of collection-valid formats (default [\"4:5\"] when none are recognized). */\nexport function resolveFormatList(formats: readonly string[]): string[] {\n const valid = [...new Set(formats.map((f) => f.trim()))].filter((f) =>\n (FORMAT_VALUES as readonly string[]).includes(f),\n );\n return valid.length > 0 ? valid : [\"4:5\"];\n}\n\n/** Best-effort human summary from an image_describe blueprint's ad_intent (for the definition body). */\nexport function describeBlueprintIntent(blueprint: unknown): string | undefined {\n const intent = (blueprint as { ad_intent?: unknown } | null)?.ad_intent;\n if (typeof intent === \"string\" && intent.trim()) return intent.trim();\n if (intent && typeof intent === \"object\") {\n const summary = (intent as { summary?: unknown }).summary ?? (intent as { feeling?: unknown }).feeling;\n if (typeof summary === \"string\" && summary.trim()) return summary.trim();\n }\n return undefined;\n}\n\n// Double-quoted YAML scalar via JSON.stringify — valid YAML that survives colons, quotes, and unicode.\nfunction yamlScalar(value: string): string {\n return JSON.stringify(value);\n}\n\n/** Render `_definition.md` (YAML frontmatter + body) for a creative. */\nexport function buildCreativeDefinition(input: CreativeDefinitionInput): string {\n const lines = [\"---\", `title: ${yamlScalar(input.title)}`, `kind: ${input.kind}`, `platform: ${input.platform}`];\n lines.push(`formats: [${input.formats.map(yamlScalar).join(\", \")}]`);\n lines.push(`status: ${input.status ?? \"draft\"}`);\n if (input.sourceReferenceUrl) lines.push(`sourceReferenceUrl: ${yamlScalar(input.sourceReferenceUrl)}`);\n if (input.sourceAdvertiser) lines.push(`sourceAdvertiser: ${yamlScalar(input.sourceAdvertiser)}`);\n if (input.sourceAdvertiserId) lines.push(`sourceAdvertiserId: ${yamlScalar(input.sourceAdvertiserId)}`);\n if (input.sourceAdId) lines.push(`sourceAdId: ${yamlScalar(input.sourceAdId)}`);\n if (input.sourcePlatform) lines.push(`sourcePlatform: ${input.sourcePlatform}`);\n if (input.sourceKind) lines.push(`sourceKind: ${input.sourceKind}`);\n if (input.sourcePath) lines.push(`sourcePath: ${yamlScalar(input.sourcePath)}`);\n if (input.targetAdSet) lines.push(`targetAdSet: ${yamlScalar(input.targetAdSet)}`);\n // A JSON object is a YAML flow mapping: one line, and every string in it quoted.\n if (input.viewer) lines.push(`viewer: ${JSON.stringify(input.viewer)}`);\n lines.push(\"---\", \"\");\n lines.push(input.description?.trim() || `${input.title} — canvas-built ${input.kind} ad for ${input.platform}.`);\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n/** The library ids a `_definition.md` names, as `DefinitionSourceFields`. */\nexport type DefinitionSourceFields = {\n sourceAdId?: string;\n sourcePlatform?: string;\n sourceAdvertiserId?: string;\n};\n\nconst SOURCE_FIELD_KEYS = [\"sourceAdId\", \"sourcePlatform\", \"sourceAdvertiserId\"] as const;\n\n/**\n * Read the library ids back out of a `_definition.md`, so a sync after the agent edited the\n * file still carries them. Tolerant: no frontmatter, a mid-edit parse error, or a non-string\n * value yields nothing for that field rather than a failed sync.\n */\nexport function parseDefinitionSourceFields(raw: string): DefinitionSourceFields {\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?\\r?\\n)?---/);\n if (!match) return {};\n const doc = parseDocument(match[1] ?? \"\");\n if (doc.errors.length > 0) return {};\n const fields: DefinitionSourceFields = {};\n for (const key of SOURCE_FIELD_KEYS) {\n const value = doc.get(key);\n if (typeof value === \"string\" && value.trim()) fields[key] = value.trim();\n }\n return fields;\n}\n\n/** Why the creative exists, as a `_definition.md` states it (its `idea` sent as `ideaSlug`). */\nexport type DefinitionStrategyFields = {\n ideaSlug?: string;\n message?: string;\n evidence?: (typeof EVIDENCE_VALUES)[number];\n angle?: string;\n persona?: string;\n awareness?: (typeof AWARENESS_VALUES)[number];\n hypothesis?: string;\n /** The lead ad of the series this creative is one of (`series`): its picture is the lead's with other words. */\n seriesLead?: string;\n /** The language its words are in (`language`), as a canonical BCP-47 tag (`es-MX`): a translation's. */\n language?: string;\n};\n\nfunction oneOf<T extends string>(values: readonly T[], value: string | undefined): T | undefined {\n return values.find((allowed) => allowed === value);\n}\n\n/**\n * Read the creative's strategy back out of a `_definition.md`, so the dashboard holds it from the\n * first sync rather than from Publish. Tolerant like `parseDefinitionSourceFields`; an `evidence`\n * or `awareness` the collection would reject is dropped rather than sent.\n */\nexport function parseDefinitionStrategyFields(raw: string): DefinitionStrategyFields {\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?\\r?\\n)?---/);\n if (!match) return {};\n const doc = parseDocument(match[1] ?? \"\");\n if (doc.errors.length > 0) return {};\n const text = (key: string): string | undefined => {\n const value = doc.get(key);\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n };\n const ideaSlug = text(\"idea\");\n const message = text(\"message\");\n const evidence = oneOf(EVIDENCE_VALUES, text(\"evidence\"));\n const angle = text(\"angle\");\n const persona = text(\"persona\");\n const awareness = oneOf(AWARENESS_VALUES, text(\"awareness\"));\n const hypothesis = text(\"hypothesis\");\n const seriesLead = text(\"series\");\n const language = languageTag(text(\"language\") ?? \"\");\n return {\n ...(seriesLead ? { seriesLead } : {}),\n ...(language ? { language } : {}),\n ...(ideaSlug ? { ideaSlug } : {}),\n ...(message ? { message } : {}),\n ...(evidence ? { evidence } : {}),\n ...(angle ? { angle } : {}),\n ...(persona ? { persona } : {}),\n ...(awareness ? { awareness } : {}),\n ...(hypothesis ? { hypothesis } : {}),\n };\n}\n\n/** Where a definition places its creative in a series: null for a field it does not name. */\nexport type DefinitionSeriesPlace = { seriesLead: string | null; language: string | null };\n\n/**\n * The series lead and language a `_definition.md` names, each null when it names none, so a\n * sync can tell the backend the creative left its series. Null when the front matter cannot be\n * read (none, or mid-edit invalid YAML): the sync then says nothing and the backend keeps what it has.\n */\nexport function parseDefinitionSeriesPlace(raw: string): DefinitionSeriesPlace | null {\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?\\r?\\n)?---/);\n if (!match || parseDocument(match[1] ?? \"\").errors.length > 0) return null;\n const { seriesLead, language } = parseDefinitionStrategyFields(raw);\n return { seriesLead: seriesLead ?? null, language: language ?? null };\n}\n\n/** Who a `_definition.md` says the ad is for: its `targetAdSet` and its recorded `viewer`, unchecked. */\nexport type DefinitionViewerFields = { targetAdSet?: string; viewer?: unknown };\n\n/** Read `targetAdSet` and `viewer` back out of a `_definition.md`; tolerant like `parseDefinitionSourceFields`. */\nexport function parseDefinitionViewerFields(raw: string): DefinitionViewerFields {\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?\\r?\\n)?---/);\n if (!match) return {};\n const doc = parseDocument(match[1] ?? \"\");\n if (doc.errors.length > 0) return {};\n const data = doc.toJS() as { targetAdSet?: unknown; viewer?: unknown } | null;\n const adSet = data?.targetAdSet;\n const targetAdSet = typeof adSet === \"string\" || typeof adSet === \"number\" ? String(adSet).trim() : \"\";\n return {\n ...(targetAdSet ? { targetAdSet } : {}),\n ...(data?.viewer !== undefined ? { viewer: data.viewer } : {}),\n };\n}\n\n/**\n * Record the ad set an ad is for and the viewer it reaches in an existing `_definition.md`,\n * keeping every other field and the body. A file without frontmatter, or one mid-edit, is\n * returned as it is: the viewer is then read again from the ad set on the next run.\n */\nexport function setDefinitionViewer(raw: string, fields: { targetAdSet?: string; viewer?: ViewerProfile }): string {\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?\\r?\\n)?---/);\n if (!match) return raw;\n const doc = parseDocument(match[1] ?? \"\");\n if (doc.errors.length > 0) return raw;\n if (fields.targetAdSet) doc.set(\"targetAdSet\", fields.targetAdSet);\n if (fields.viewer) doc.set(\"viewer\", doc.createNode(fields.viewer, { flow: true }));\n return `---\\n${doc.toString()}---${raw.slice(match[0].length)}`;\n}\n","import path from \"node:path\";\nimport type { CanvasRunVerdict } from \"@baker/api\";\nimport type { NodeRunRecord, RunResult } from \"../../engine/engine/executor.ts\";\nimport { parseRefExpr } from \"../../engine/schema/canvas.ts\";\nimport { collectAssetRefLikes, isPersistedAssetRef } from \"../../engine/storage/remote-cache-store.ts\";\n\n// Mirrors of the backend intake caps (canvas/runRecords.ts) so an in-bounds\n// payload is sent even for pathological runs; the server re-caps defensively.\nconst MAX_RUN_NODES = 200;\nconst MAX_OUTPUTS_PER_NODE = 10;\nconst MAX_FINAL_OUTPUTS = 10;\n\nexport type RunRecordOutput = {\n slot: string;\n /** Variant identity from the collect terminal (branch/scene name) — slot stays the stable key. */\n label?: string;\n kind: \"image\" | \"video\" | \"audio\" | \"json\" | \"text\" | \"font\";\n sha256: string;\n url: string;\n mime: string;\n width?: number;\n height?: number;\n durationMs?: number;\n};\n\n/** Labels for a collect-terminated canvas: the collector's node id + one label per collected image. */\nexport type FinalOutputLabels = { nodeId: string; labels: (string | undefined)[] };\n\nexport type RunNodeStatus = \"pending\" | \"running\" | \"completed\" | \"failed\";\n\nexport type RunRecordNode = {\n nodeId: string;\n nodeType: string;\n cached: boolean;\n credits: number;\n durationMs: number;\n outputs: RunRecordOutput[];\n /** Upstream node ids ($ref edges) — lets the dashboard render the workflow graph. */\n deps?: string[];\n status?: RunNodeStatus;\n /** Compact params excerpt (prompt text preferred) for graph-node legibility. */\n paramsPreview?: string;\n /** Why this node failed — the real upstream status/provider — set only on `status: \"failed\"`. */\n error?: RunNodeError;\n /** The node's job, from its `tags.role` (e.g. `static_variants`), so readers never parse node ids. */\n role?: string;\n};\n\n/** Display-ready per-node failure detail. Mirrors the engine's `NodeFailureDetail`. */\nexport type RunNodeError = {\n message: string;\n code?: string;\n provider?: string;\n retryable?: boolean;\n};\n\n/** Run attribution stamped on every record post (progress, terminal, initial). */\nexport type RunRecordMeta = {\n creativeSlug?: string;\n canvasPath?: string;\n canvasSha?: string;\n /** Content sha of the rendered source (canvas.json + prompt.json) — powers the dashboard staleness signal. */\n sourceSha?: string;\n chatId?: string;\n /** R2 manifest of the executed canvas + its local file refs — first-write-wins server-side. */\n canvasSnapshotUrl?: string;\n /** R2 copy of the graph this run executes (every node's declaration): what a correction elsewhere grows on. */\n graphUrl?: string;\n /** What the render review found, so it outlives the terminal it was printed to. */\n review?: { severity: \"blocking\" | \"warning\"; what: string; scene?: string }[];\n /**\n * What the review's own model calls cost, as the gateway reported them.\n *\n * The review calls OpenRouter from the Runtime — that is where the finished video is,\n * and shipping 60MB through Convex to reach the same gateway would buy nothing — so\n * this record is what carries the spend back to where it is billed. `costUsd` is\n * OpenRouter's own `usage.cost`, relayed rather than computed: the sandbox never\n * prices anything, which is what makes it safe for the model id to float.\n */\n reviewUsage?: { model: string; inputTokens: number; outputTokens: number; costUsd: number }[];\n /** What the render review said (`@baker/api` CANVAS_RUN_VERDICTS), and whether the run may be shown as a version. */\n verdict?: CanvasRunVerdict;\n presentable?: boolean;\n /** An ad of a series made again from a new version of its lead: a new version of the ad, not a retry. */\n newAsk?: boolean;\n /** The company's creative rules this run was made and checked against (`rulesDigest`, and their ids). */\n rules?: { digest: string; ids: string[] };\n};\n\nexport type RunRecordPayload = {\n runId: string;\n /** `awaiting_approval`: stopped on purpose at a `--until` checkpoint, resumable with the same run id. */\n status: \"running\" | \"completed\" | \"failed\" | \"awaiting_approval\";\n errorMessage?: string;\n stats: { totalNodes: number; cachedNodes: number; totalCredits: number; durationMs: number };\n nodes: RunRecordNode[];\n finalOutputs?: RunRecordOutput[];\n /**\n * What the render review found, sent with the run that produced it.\n *\n * Without this the findings existed only in the CLI's stdout — visible to the agent\n * for one turn and to nobody afterwards. A check whose result leaves no trace cannot\n * be read back, compared between runs, or shown to the person the ad is for, and is\n * indistinguishable from a check that never ran.\n */\n review?: { severity: \"blocking\" | \"warning\"; what: string; scene?: string }[];\n /** Graceful-abort flush (SIGINT/SIGTERM): terminal but resumable — the backend keeps the row adoptable. */\n interrupted?: boolean;\n} & RunRecordMeta;\n\n/** Per-node plan facts (edges + params preview) captured from the engine's plan event. */\nexport type RunPlanInfo = Map<string, { deps: string[]; paramsPreview?: string; role?: string }>;\n\n// Mirrors the backend's CREATIVE_SLUG_MAX_LENGTH — an over-long slug would\n// 400 the whole run record, so attribution is dropped instead.\nconst MAX_CREATIVE_SLUG_LENGTH = 100;\n\n/**\n * A canvas under the repo convention `src/creatives/{slug}/` belongs to that\n * creative; its runs become the creative's generation history. Returns null\n * for canvases anywhere else (and for slugs the backend would reject).\n */\nexport function creativeSlugFromCanvasPath(filePath: string): string | null {\n const normalized = filePath.split(path.sep).join(\"/\");\n const match = normalized.match(/(?:^|\\/)src\\/creatives\\/([a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\\//);\n const slug = match?.[1] ?? null;\n return slug && slug.length <= MAX_CREATIVE_SLUG_LENGTH ? slug : null;\n}\n\n/**\n * Best-effort variant labels from a not-yet-validated canvas: when the declared\n * output is a `collect` node, each final inherits the node's explicit\n * `params.labels[i]`, else the producer node id parsed from the raw `$ref` it\n * collects (`$ref:gen_billboard_03.images#0` → `gen_billboard_03`). Null for\n * every other canvas shape — single-output runs stay unlabeled.\n */\nexport function finalOutputLabelsFromCanvas(parsed: unknown): FinalOutputLabels | null {\n const canvas = parsed as { nodes?: unknown; output?: { node?: unknown } } | null;\n const outputNodeId = canvas?.output?.node;\n if (typeof outputNodeId !== \"string\" || !Array.isArray(canvas?.nodes)) return null;\n const node = canvas.nodes.find((n) => (n as { id?: unknown })?.id === outputNodeId) as\n | { type?: unknown; inputs?: { images?: unknown }; params?: { labels?: unknown } }\n | undefined;\n if (node?.type !== \"collect\") return null;\n const explicit = node.params?.labels;\n if (Array.isArray(explicit) && explicit.every((l) => typeof l === \"string\")) {\n return { nodeId: outputNodeId, labels: explicit };\n }\n const images = node.inputs?.images;\n if (!Array.isArray(images)) return null;\n const labels = images.map((entry) => {\n if (typeof entry !== \"string\") return undefined;\n return parseRefExpr(entry)?.nodeId;\n });\n return { nodeId: outputNodeId, labels };\n}\n\nconst OUTPUT_KINDS = new Set([\"image\", \"video\", \"audio\", \"json\", \"text\", \"font\"]);\n\nfunction toRecordOutput(slot: string, value: unknown, label?: string): RunRecordOutput | null {\n const refs = collectAssetRefLikes(value);\n const ref = refs.length === 1 ? refs[0] : null;\n if (!ref || !isPersistedAssetRef(ref)) return null;\n const kind = typeof ref.kind === \"string\" && OUTPUT_KINDS.has(ref.kind) ? ref.kind : null;\n if (!kind) return null;\n return {\n slot,\n label,\n kind: kind as RunRecordOutput[\"kind\"],\n sha256: ref.sha256,\n url: ref.url,\n mime: ref.mime,\n width: typeof ref.width === \"number\" ? ref.width : undefined,\n height: typeof ref.height === \"number\" ? ref.height : undefined,\n durationMs: typeof ref.duration_ms === \"number\" ? ref.duration_ms : undefined,\n };\n}\n\n/**\n * Flatten one node's outputs into record entries. Single refs keep their slot\n * name; arrays become `slot#i`. Values without a persisted ref (plain JSON\n * manifests, refs whose upload failed) are dropped — every stored output must\n * be renderable from R2.\n */\nexport function nodeOutputsToRecord(\n nodeOutputs: Record<string, unknown>,\n labels?: (string | undefined)[],\n): RunRecordOutput[] {\n const out: RunRecordOutput[] = [];\n for (const [slot, value] of Object.entries(nodeOutputs)) {\n if (Array.isArray(value)) {\n value.forEach((item, i) => {\n const rec = toRecordOutput(`${slot}#${i}`, item, labels?.[i]);\n if (rec) out.push(rec);\n });\n } else {\n const rec = toRecordOutput(slot, value);\n if (rec) out.push(rec);\n }\n }\n return out.slice(0, MAX_OUTPUTS_PER_NODE);\n}\n\nfunction finalOutputsToRecord(output: unknown, labels?: (string | undefined)[]): RunRecordOutput[] {\n if (Array.isArray(output)) {\n return output\n .map((item, i) => toRecordOutput(`final#${i}`, item, labels?.[i]))\n .filter((rec): rec is RunRecordOutput => rec !== null)\n .slice(0, MAX_FINAL_OUTPUTS);\n }\n const rec = toRecordOutput(\"final\", output);\n return rec ? [rec] : [];\n}\n\n/** Each delivered size's local file, keyed by its label (or `final#i`), so the agent opens it with Read. */\nexport function finalFiles(output: unknown, labels?: (string | undefined)[]): Record<string, string> {\n const items = Array.isArray(output) ? output : [output];\n const files: Record<string, string> = {};\n items.forEach((item, i) => {\n const ref = collectAssetRefLikes(item)[0];\n if (ref && typeof ref.path === \"string\") files[labels?.[i] ?? `final#${i}`] = ref.path;\n });\n return files;\n}\n\nexport function buildRunRecord(\n result: Pick<RunResult, \"run_id\" | \"output\" | \"outputs_by_node\" | \"stats\"> & { node_runs: NodeRunRecord[] },\n meta: RunRecordMeta,\n plan?: RunPlanInfo,\n finalLabels?: FinalOutputLabels,\n): RunRecordPayload {\n const nodes = result.node_runs.slice(0, MAX_RUN_NODES).map((run): RunRecordNode => {\n const planned = plan?.get(run.node_id);\n return {\n nodeId: run.node_id,\n nodeType: run.node_type,\n cached: run.cached,\n credits: run.credits,\n durationMs: run.duration_ms,\n outputs: nodeOutputsToRecord(\n result.outputs_by_node[run.node_id] ?? {},\n run.node_id === finalLabels?.nodeId ? finalLabels.labels : undefined,\n ),\n deps: planned?.deps,\n status: plan ? \"completed\" : undefined,\n paramsPreview: planned?.paramsPreview,\n ...(planned?.role !== undefined ? { role: planned.role } : {}),\n };\n });\n const finalOutputs = finalOutputsToRecord(result.output, finalLabels?.labels);\n return {\n runId: result.run_id,\n ...meta,\n status: \"completed\",\n stats: {\n totalNodes: result.stats.total_nodes,\n cachedNodes: result.stats.cached_nodes,\n totalCredits: result.stats.total_credits,\n durationMs: result.stats.duration_ms,\n },\n nodes,\n finalOutputs: finalOutputs.length > 0 ? finalOutputs : undefined,\n // Sent whenever the review RAN, empty list included. Sending it only when there\n // were findings makes a clean render and an unreviewed one look identical in the\n // record — which is the exact ambiguity this field was added to remove: proving a\n // review had happened once meant re-running a cached canvas and reading raw JSON.\n // Only the fields the backend keeps: a static review's typed fields (`kind`) stay in the CLI.\n ...(meta.review\n ? { review: meta.review.slice(0, 40).map(({ severity, what, scene }) => ({ severity, what, ...(scene ? { scene } : {}) })) }\n : {}),\n };\n}\n\n/**\n * The empty `running` record posted BEFORE layer 1 executes. This row is the\n * Convex-side in-flight marker: the reconciliation sweep and cross-sandbox\n * resume both key off it, so unlike the fire-and-forget progress stream it is\n * posted synchronously (with retries) at run start.\n */\nexport function buildInitialRunRecord(runId: string, meta: RunRecordMeta): RunRecordPayload {\n return {\n runId,\n ...meta,\n status: \"running\",\n stats: { totalNodes: 0, cachedNodes: 0, totalCredits: 0, durationMs: 0 },\n nodes: [],\n };\n}\n\nexport function buildFailedRunRecord(runId: string, errorMessage: string, meta: RunRecordMeta): RunRecordPayload {\n return {\n runId,\n ...meta,\n status: \"failed\",\n errorMessage: errorMessage.slice(0, 2000),\n stats: { totalNodes: 0, cachedNodes: 0, totalCredits: 0, durationMs: 0 },\n nodes: [],\n };\n}\n"],"mappings":"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","names":["rec"]}
@@ -0,0 +1,46 @@
1
+ import {
2
+ RENDER_REVIEW_MODEL,
3
+ askAboutImages,
4
+ buildRulesReviewPrompt,
5
+ classifyRuleFindings,
6
+ reviewedRules,
7
+ rulesSystem
8
+ } from "./chunk-QEW64BBR.js";
9
+
10
+ // src/engine/nodes/local/lib/confirm-blocking.ts
11
+ var cutByFrame = (f) => f.kind?.defect === "cut";
12
+ async function confirmBlocking(findings, stills, formats, ask) {
13
+ const claims = findings.filter((f) => f.severity === "blocking" && !cutByFrame(f));
14
+ if (claims.length === 0 || stills.length === 0) return [...findings];
15
+ const prompt = [
16
+ `These are the finished sizes of one ad, in order: ${formats.map((f, i) => `Image ${i + 1} is the ${f}`).join("; ")}.`,
17
+ "A reviewer reported each claim below. Look again at the size each one names (and, for a claim comparing sizes, at the others) and answer true only when the defect is plainly there for someone looking at it on a phone.",
18
+ "Answer false when the thing is not there, when it is an ordinary part of the scene (a second house, a neighbour's roof, a reflection), or when the sizes it compares show the same thing.",
19
+ ...claims.map((c, i) => `${i + 1}. ${c.what}`),
20
+ `Reply with only this JSON: {"answers":[true|false, ...]}, one answer per claim, in order.`
21
+ ].join("\n");
22
+ const answer = await ask([...stills], prompt).catch(() => null);
23
+ const answers = answer?.answers;
24
+ if (!Array.isArray(answers) || answers.length !== claims.length) return [...findings];
25
+ const unconfirmed = new Set(claims.filter((_, i) => answers[i] === false));
26
+ return findings.map((f) => unconfirmed.has(f) ? { ...f, severity: "warning" } : f);
27
+ }
28
+
29
+ // src/engine/nodes/local/lib/rules-review.ts
30
+ var RULES_REVIEW_TIMEOUT_MS = 12e4;
31
+ async function reviewAgainstRules(opts) {
32
+ const rules = reviewedRules(opts.rules);
33
+ if (rules.length === 0 || opts.stills.length === 0) return [];
34
+ const system = rulesSystem(rules);
35
+ const ask = (images, prompt) => askAboutImages(RENDER_REVIEW_MODEL, images, prompt, opts.onSpend, RULES_REVIEW_TIMEOUT_MS, void 0, system);
36
+ const answer = await ask([...opts.stills], buildRulesReviewPrompt({ formats: opts.formats, rules }));
37
+ if (answer === null) return null;
38
+ return await confirmBlocking(classifyRuleFindings(answer, rules), opts.stills, opts.formats, ask);
39
+ }
40
+
41
+ export {
42
+ cutByFrame,
43
+ confirmBlocking,
44
+ reviewAgainstRules
45
+ };
46
+ //# sourceMappingURL=chunk-SYED65QF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engine/nodes/local/lib/confirm-blocking.ts","../src/engine/nodes/local/lib/rules-review.ts"],"sourcesContent":["/**\n * The second look every review gives a blocking defect it judged by eye, before the defect costs a\n * correction round: the static review's and the rules review's alike.\n */\nimport type { RenderFinding } from \"./render-review.ts\";\n\n/** A finding about something the frame's edge cuts: the measured boxes corroborate it, not a second look. */\nexport const cutByFrame = (f: RenderFinding): boolean => f.kind?.defect === \"cut\";\n\n/** One model question about the delivered stills, as `askAboutStills` asks it. */\nexport type AskStills = (images: string[], prompt: string) => Promise<unknown>;\n\n/**\n * A second, direct look at each blocking defect the review judged by eye: one question, each claim\n * answered true only when plainly visible on the size it names. An unconfirmed one stays as a note.\n * The review's own judgement is the first look; a correction round is ~2 minutes, the look a few\n * seconds (Dev, Oct 2026: a neighbour's roof read as \"duplicated\", a card both sizes show read as\n * \"missing from the 9:16\"). No answer leaves the findings as they were.\n */\nexport async function confirmBlocking(\n findings: readonly RenderFinding[],\n stills: readonly string[],\n formats: readonly string[],\n ask: AskStills,\n): Promise<RenderFinding[]> {\n // A cut or clipped element is corroborated by the measured boxes (`corroborateEdgeClaims`), and a\n // second look answers its edges one by one: one wrong edge of three read a cut button as fine.\n const claims = findings.filter((f) => f.severity === \"blocking\" && !cutByFrame(f));\n if (claims.length === 0 || stills.length === 0) return [...findings];\n const prompt = [\n `These are the finished sizes of one ad, in order: ${formats.map((f, i) => `Image ${i + 1} is the ${f}`).join(\"; \")}.`,\n \"A reviewer reported each claim below. Look again at the size each one names (and, for a claim comparing sizes, at the others) and answer true only when the defect is plainly there for someone looking at it on a phone.\",\n \"Answer false when the thing is not there, when it is an ordinary part of the scene (a second house, a neighbour's roof, a reflection), or when the sizes it compares show the same thing.\",\n ...claims.map((c, i) => `${i + 1}. ${c.what}`),\n `Reply with only this JSON: {\"answers\":[true|false, ...]}, one answer per claim, in order.`,\n ].join(\"\\n\");\n const answer = await ask([...stills], prompt).catch(() => null);\n const answers = (answer as { answers?: unknown } | null)?.answers;\n if (!Array.isArray(answers) || answers.length !== claims.length) return [...findings];\n const unconfirmed = new Set(claims.filter((_, i) => answers[i] === false));\n return findings.map((f) => (unconfirmed.has(f) ? { ...f, severity: \"warning\" as const } : f));\n}\n","/**\n * The company's rules, checked on a finished ad's stills by a vision model (`reviewedRules`): one\n * owner for that look, which the static run review, a video's sampled frames, the admission test\n * of a new rule (`baker creatives rules add`) and the evals all ask the same way. A never or a must\n * broken blocks; a prefer is a note. Each blocking break gets a second look (`confirmBlocking`)\n * before it costs a correction round. The rules ride first, as a system message the same for every\n * review of the company's ads, so the provider can cache them.\n */\nimport type { CreativeRule } from \"../../../creative-rules/schema.ts\";\nimport { confirmBlocking } from \"./confirm-blocking.ts\";\nimport { askAboutImages, RENDER_REVIEW_MODEL, type RenderFinding, type ReviewUsage } from \"./render-review.ts\";\nimport { buildRulesReviewPrompt, classifyRuleFindings, reviewedRules, rulesSystem } from \"./rules-findings.ts\";\n\n/** How long the look may take: a few pictures and one list. */\nconst RULES_REVIEW_TIMEOUT_MS = 120_000;\n\n/**\n * The finished ad (its sizes as base64 JPEG, in `formats` order) against the rules a picture can\n * break. None when no such rule holds; null when no model answered.\n */\nexport async function reviewAgainstRules(opts: {\n stills: readonly string[];\n formats: readonly string[];\n rules: readonly CreativeRule[];\n onSpend?: (usage: ReviewUsage) => void;\n}): Promise<RenderFinding[] | null> {\n const rules = reviewedRules(opts.rules);\n if (rules.length === 0 || opts.stills.length === 0) return [];\n const system = rulesSystem(rules);\n const ask = (images: string[], prompt: string) =>\n askAboutImages(RENDER_REVIEW_MODEL, images, prompt, opts.onSpend, RULES_REVIEW_TIMEOUT_MS, undefined, system);\n const answer = await ask([...opts.stills], buildRulesReviewPrompt({ formats: opts.formats, rules }));\n if (answer === null) return null;\n return await confirmBlocking(classifyRuleFindings(answer, rules), opts.stills, opts.formats, ask);\n}\n"],"mappings":";;;;;;;;;;AAOO,IAAM,aAAa,CAAC,MAA8B,EAAE,MAAM,WAAW;AAY5E,eAAsB,gBACpB,UACA,QACA,SACA,KAC0B;AAG1B,QAAM,SAAS,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,cAAc,CAAC,WAAW,CAAC,CAAC;AACjF,MAAI,OAAO,WAAW,KAAK,OAAO,WAAW,EAAG,QAAO,CAAC,GAAG,QAAQ;AACnE,QAAM,SAAS;AAAA,IACb,qDAAqD,QAAQ,IAAI,CAAC,GAAG,MAAM,SAAS,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IACnH;AAAA,IACA;AAAA,IACA,GAAG,OAAO,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAAA,IAC7C;AAAA,EACF,EAAE,KAAK,IAAI;AACX,QAAM,SAAS,MAAM,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,MAAM,MAAM,IAAI;AAC9D,QAAM,UAAW,QAAyC;AAC1D,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,OAAO,OAAQ,QAAO,CAAC,GAAG,QAAQ;AACpF,QAAM,cAAc,IAAI,IAAI,OAAO,OAAO,CAAC,GAAG,MAAM,QAAQ,CAAC,MAAM,KAAK,CAAC;AACzE,SAAO,SAAS,IAAI,CAAC,MAAO,YAAY,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,UAAU,UAAmB,IAAI,CAAE;AAC9F;;;AC3BA,IAAM,0BAA0B;AAMhC,eAAsB,mBAAmB,MAKL;AAClC,QAAM,QAAQ,cAAc,KAAK,KAAK;AACtC,MAAI,MAAM,WAAW,KAAK,KAAK,OAAO,WAAW,EAAG,QAAO,CAAC;AAC5D,QAAM,SAAS,YAAY,KAAK;AAChC,QAAM,MAAM,CAAC,QAAkB,WAC7B,eAAe,qBAAqB,QAAQ,QAAQ,KAAK,SAAS,yBAAyB,QAAW,MAAM;AAC9G,QAAM,SAAS,MAAM,IAAI,CAAC,GAAG,KAAK,MAAM,GAAG,uBAAuB,EAAE,SAAS,KAAK,SAAS,MAAM,CAAC,CAAC;AACnG,MAAI,WAAW,KAAM,QAAO;AAC5B,SAAO,MAAM,gBAAgB,qBAAqB,QAAQ,KAAK,GAAG,KAAK,QAAQ,KAAK,SAAS,GAAG;AAClG;","names":[]}