@koda-sl/baker-cli 0.447.0-dev.f5788a631 → 0.448.0-dev.0d67e41b9

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 (500) hide show
  1. package/README.md +12 -8
  2. package/dist/{account-PCEZQUK7.js → account-DTHGTZCN.js} +6 -6
  3. package/dist/{accounts-5AXLYU7P.js → accounts-5RLG6BBA.js} +5 -5
  4. package/dist/{accounts-OSXDZZLY.js → accounts-6LSBBXKA.js} +7 -7
  5. package/dist/{actions-HM4VVTGW.js → actions-WH5C6Q7I.js} +18 -18
  6. package/dist/{add-4J2EF54O.js → add-BZ4QPLK4.js} +4 -4
  7. package/dist/{add-VZAY57M4.js → add-TRSKOIO6.js} +32 -7
  8. package/dist/add-TRSKOIO6.js.map +1 -0
  9. package/dist/{ads-NUME2UXH.js → ads-6UG66KA5.js} +4 -4
  10. package/dist/{advertisers-WSNHNCBQ.js → advertisers-OABQDELT.js} +12 -8
  11. package/dist/advertisers-OABQDELT.js.map +1 -0
  12. package/dist/{analytics-QTR2ZITZ.js → analytics-3YAWQF5K.js} +8 -8
  13. package/dist/{analytics-PHU7H5VY.js → analytics-BCZGSSXP.js} +5 -5
  14. package/dist/{animate-3Z7HXOLE.js → animate-AIZ3GS4J.js} +4 -4
  15. package/dist/{assign-IIAVNATI.js → assign-O6QNAZD5.js} +5 -5
  16. package/dist/{audience-size-2L7XMYJL.js → audience-size-CXPWERR3.js} +5 -5
  17. package/dist/{audit-ZCUFJLUG.js → audit-MNOQK3U4.js} +5 -5
  18. package/dist/{autocomplete-6PYFCOMX.js → autocomplete-TRCMPNW4.js} +10 -6
  19. package/dist/{autocomplete-6PYFCOMX.js.map → autocomplete-TRCMPNW4.js.map} +1 -1
  20. package/dist/{avatars-OEK3FYKK.js → avatars-P3WX5TQP.js} +4 -4
  21. package/dist/{bid-pricing-FDW3IY6G.js → bid-pricing-6XXSM7C2.js} +5 -5
  22. package/dist/{brand-OXYFSNA5.js → brand-LXU7YNCF.js} +2 -2
  23. package/dist/{brief-TBSXPEXI.js → brief-Y4F37TH5.js} +21 -22
  24. package/dist/{brief-TBSXPEXI.js.map → brief-Y4F37TH5.js.map} +1 -1
  25. package/dist/{campaign-groups-5GCFQT2W.js → campaign-groups-CEAM3WRO.js} +10 -10
  26. package/dist/{campaign-writes-3SJQSCUK.js → campaign-writes-D6BJAULL.js} +5 -5
  27. package/dist/{campaigns-SYEOFKFV.js → campaigns-CXOKBCPS.js} +13 -13
  28. package/dist/{campaigns-7QDDWZ76.js → campaigns-V3SWBM4E.js} +5 -5
  29. package/dist/{canvas-B6DPRQGN.js → canvas-VH3Q26TK.js} +14 -14
  30. package/dist/{capabilities-GVHPHH2G.js → capabilities-NZPSSS6T.js} +5 -5
  31. package/dist/{catalog-TNNG66MH.js → catalog-GWN3WT7J.js} +6 -7
  32. package/dist/{catalog-TNNG66MH.js.map → catalog-GWN3WT7J.js.map} +1 -1
  33. package/dist/{changes-6QBJMGJC.js → changes-TP7ZZHB3.js} +4 -4
  34. package/dist/{chats-54CWM7DL.js → chats-GN3PBFX4.js} +5 -5
  35. package/dist/{chunk-SKT3SAHG.js → chunk-2BKVVCCV.js} +2 -2
  36. package/dist/{chunk-YUPRCOEN.js → chunk-2GTYAHDN.js} +2 -2
  37. package/dist/{chunk-E5IFTZJ3.js → chunk-3OFVFHKT.js} +2 -2
  38. package/dist/{chunk-5EEDEVOR.js → chunk-4QEY2L6U.js} +2 -2
  39. package/dist/{chunk-7JUUKYKG.js → chunk-4Z7DEN75.js} +2 -2
  40. package/dist/{chunk-RCQJHKK5.js → chunk-6Y7SIP2D.js} +33 -24
  41. package/dist/chunk-6Y7SIP2D.js.map +1 -0
  42. package/dist/{chunk-GTK46DE3.js → chunk-7ED5TAFP.js} +3 -3
  43. package/dist/{chunk-654U6NU6.js → chunk-BNCW67EM.js} +2 -2
  44. package/dist/{chunk-OBDAYP2P.js → chunk-CAMX6OHF.js} +30 -3
  45. package/dist/chunk-CAMX6OHF.js.map +1 -0
  46. package/dist/{chunk-J5IU4OX2.js → chunk-CFHIW5QZ.js} +4 -4
  47. package/dist/{chunk-V2X3KK52.js → chunk-D6744YSX.js} +26 -6
  48. package/dist/chunk-D6744YSX.js.map +1 -0
  49. package/dist/{chunk-FGH4Z5K5.js → chunk-DQMZXK27.js} +2 -2
  50. package/dist/{chunk-XV6XCFF7.js → chunk-E4NCRGY3.js} +2 -2
  51. package/dist/{chunk-IH4UQ2OK.js → chunk-EAEOPERX.js} +18 -19
  52. package/dist/chunk-EAEOPERX.js.map +1 -0
  53. package/dist/{chunk-7FVWIZHM.js → chunk-ESB5DLIP.js} +2 -2
  54. package/dist/{chunk-NK2UFFVH.js → chunk-FVF5SXTZ.js} +2 -2
  55. package/dist/{chunk-KWAOTV7F.js → chunk-GX6VAHY7.js} +2 -2
  56. package/dist/{chunk-6TCDQSM7.js → chunk-GYU7BWEN.js} +3 -3
  57. package/dist/{chunk-HYCIBVDW.js → chunk-HZUDRKGR.js} +2 -2
  58. package/dist/{chunk-FYQPB2SS.js → chunk-IGQZ5U3C.js} +6 -6
  59. package/dist/{chunk-OAQPHP6V.js → chunk-IYU4X5A7.js} +3 -3
  60. package/dist/{chunk-HYUUH4BE.js → chunk-JVLAV62J.js} +27 -29
  61. package/dist/{chunk-HYUUH4BE.js.map → chunk-JVLAV62J.js.map} +1 -1
  62. package/dist/{chunk-6HJAHLLA.js → chunk-K6WVV74H.js} +96 -4
  63. package/dist/chunk-K6WVV74H.js.map +1 -0
  64. package/dist/{chunk-EPMN4BK7.js → chunk-L5J3S6B6.js} +47 -4
  65. package/dist/chunk-L5J3S6B6.js.map +1 -0
  66. package/dist/{chunk-2SCPDSFN.js → chunk-LIQ4SQ2T.js} +2 -2
  67. package/dist/{chunk-KMEMA7AZ.js → chunk-LLOOWRBB.js} +2 -2
  68. package/dist/{chunk-NSA6HRG6.js → chunk-ND5MJ3AA.js} +2 -2
  69. package/dist/{chunk-XML7AJM3.js → chunk-NE4F3FHN.js} +1 -1
  70. package/dist/chunk-NE4F3FHN.js.map +1 -0
  71. package/dist/{chunk-PIWMNKWI.js → chunk-NECTN6N7.js} +45 -3
  72. package/dist/{chunk-PIWMNKWI.js.map → chunk-NECTN6N7.js.map} +1 -1
  73. package/dist/{chunk-ACFWVULZ.js → chunk-NIJSXVFT.js} +3 -3
  74. package/dist/{chunk-H2QNBOPS.js → chunk-NJXNU2G6.js} +3 -3
  75. package/dist/{chunk-XDNEG2H6.js → chunk-OKJWBB2K.js} +11 -11
  76. package/dist/{chunk-XDNEG2H6.js.map → chunk-OKJWBB2K.js.map} +1 -1
  77. package/dist/{chunk-AO5UQQLJ.js → chunk-ORO7VAXB.js} +2 -2
  78. package/dist/{chunk-V5WSJP5A.js → chunk-OUTF5JFG.js} +3 -3
  79. package/dist/{chunk-XG3XCHN6.js → chunk-P5T7OZKV.js} +2 -2
  80. package/dist/{chunk-DE6ANJLU.js → chunk-PTCIM35Y.js} +2 -2
  81. package/dist/{chunk-VJZHVOA4.js → chunk-PVUZWHNQ.js} +7 -7
  82. package/dist/{chunk-CLMM6P6B.js → chunk-PZXCWSKV.js} +85 -6
  83. package/dist/chunk-PZXCWSKV.js.map +1 -0
  84. package/dist/{chunk-CKU4WYTF.js → chunk-QVJDPOEB.js} +2 -2
  85. package/dist/{chunk-KV5BCSUR.js → chunk-R5RIH3N5.js} +2 -2
  86. package/dist/{chunk-RB5DB3WN.js → chunk-RB5CVIK6.js} +2 -2
  87. package/dist/{chunk-EAHP7L2R.js → chunk-RZT263H7.js} +2 -2
  88. package/dist/{chunk-WYCVJIHD.js → chunk-TEINLN64.js} +13 -2
  89. package/dist/{chunk-WYCVJIHD.js.map → chunk-TEINLN64.js.map} +1 -1
  90. package/dist/{chunk-HDWKLFF5.js → chunk-TUB34FVS.js} +4 -4
  91. package/dist/{chunk-4SJDDGPV.js → chunk-TX7LZWZD.js} +3 -3
  92. package/dist/{chunk-6YYEBLYI.js → chunk-V7CTQOHG.js} +4 -4
  93. package/dist/{chunk-IKYNOT57.js → chunk-VNUNE5AB.js} +36 -7
  94. package/dist/chunk-VNUNE5AB.js.map +1 -0
  95. package/dist/{chunk-TBEUMOEL.js → chunk-WNFIJAUO.js} +5 -2
  96. package/dist/chunk-WNFIJAUO.js.map +1 -0
  97. package/dist/{chunk-EVYXTT7V.js → chunk-XCM6XWOB.js} +2 -2
  98. package/dist/{chunk-ZNBDKK4Y.js → chunk-XFGAUP5B.js} +2 -2
  99. package/dist/{chunk-4SNOWJV7.js → chunk-XQIKDODN.js} +2 -2
  100. package/dist/{chunk-WRIC2RPQ.js → chunk-XTRAI6CL.js} +2 -2
  101. package/dist/{chunk-3X3446TG.js → chunk-XVOI4BIS.js} +2 -2
  102. package/dist/{chunk-NTPXZU3V.js → chunk-ZDNOCKKY.js} +12 -3
  103. package/dist/{chunk-NTPXZU3V.js.map → chunk-ZDNOCKKY.js.map} +1 -1
  104. package/dist/{chunk-F46KAIBS.js → chunk-ZGTCZ6H4.js} +3 -3
  105. package/dist/{chunk-5VC6IK7B.js → chunk-ZJLETAOO.js} +106 -12
  106. package/dist/chunk-ZJLETAOO.js.map +1 -0
  107. package/dist/{claim-CIASHKMC.js → claim-25JJM4AG.js} +5 -5
  108. package/dist/cli.js +29 -29
  109. package/dist/{companies-ECVMO24S.js → companies-VR5M5PAN.js} +5 -5
  110. package/dist/{complete-32CPBFIG.js → complete-DRMOTC2W.js} +5 -5
  111. package/dist/{connect-OJSOM6PY.js → connect-WUDJR2GH.js} +12 -8
  112. package/dist/{conversation-7FHN5ESN.js → conversation-K6LYF2ZP.js} +5 -5
  113. package/dist/{conversion-upload-command-BBUXLFT3.js → conversion-upload-command-AUF3LNTH.js} +4 -4
  114. package/dist/{conversions-7YJDNZ7Y.js → conversions-GF32XOWY.js} +9 -9
  115. package/dist/{countries-FYHM3IMJ.js → countries-ESAKTQAE.js} +2 -2
  116. package/dist/{create-OYT76OMJ.js → create-2D7AIFJI.js} +5 -5
  117. package/dist/{create-ZGRL7YCV.js → create-4TFAD6HY.js} +5 -5
  118. package/dist/{create-FE5QLW7V.js → create-IXYXYLLE.js} +4 -4
  119. package/dist/{create-2TBDXHAM.js → create-PKJVFJMO.js} +5 -5
  120. package/dist/{creatives-IUB57I3T.js → creatives-OHCFHRZ5.js} +10 -10
  121. package/dist/{creatives-5MUTX4DQ.js → creatives-QLSZFOMB.js} +10 -10
  122. package/dist/{credentials-AETHKP5T.js → credentials-WSLR5VU4.js} +5 -5
  123. package/dist/{critique-T7HJ42D4.js → critique-5PCQ2CJH.js} +5 -5
  124. package/dist/{critique-C53EJDPA.js → critique-WDO6SKK2.js} +13 -14
  125. package/dist/{critique-C53EJDPA.js.map → critique-WDO6SKK2.js.map} +1 -1
  126. package/dist/{crm-KH6XX2TT.js → crm-HNUOHXAN.js} +6 -6
  127. package/dist/{crm-JP4UOPMN.js → crm-SNIUADNK.js} +6 -6
  128. package/dist/{currency-DJDVIR3C.js → currency-XCGKQ7FE.js} +4 -4
  129. package/dist/{customers-7I7UY5PS.js → customers-72L2KZHO.js} +9 -9
  130. package/dist/{delete-6IOUDEWY.js → delete-EVGM5B36.js} +5 -5
  131. package/dist/{delete-ODFKNHAI.js → delete-PA2GY5EC.js} +5 -5
  132. package/dist/{delete-RAETUVO2.js → delete-YNNFTFYV.js} +4 -4
  133. package/dist/{demographics-2FTDKPBD.js → demographics-SYS2E7QC.js} +5 -5
  134. package/dist/{discard-ZX5TLFYH.js → discard-JS2YJUIM.js} +5 -5
  135. package/dist/{discover-M3ZKKFEL.js → discover-BJPZNXUQ.js} +4 -4
  136. package/dist/{domain-TH7KIC2T.js → domain-XKKH5NCL.js} +5 -5
  137. package/dist/{draft-YHUIFDDR.js → draft-4AO4YH3V.js} +6 -6
  138. package/dist/{draft-SH25PKST.js → draft-5YAYCEYY.js} +4 -4
  139. package/dist/{draft-S2FSQOJN.js → draft-GCUXNPVH.js} +5 -5
  140. package/dist/{draft-CRE2Y24G.js → draft-WWWKSEEE.js} +5 -5
  141. package/dist/engine/index.js +5 -6
  142. package/dist/{facets-6B2U4BSM.js → facets-NVBX5WDT.js} +5 -5
  143. package/dist/{feedback-QGSAJJVC.js → feedback-OGAPR45R.js} +3 -3
  144. package/dist/feedback-OGAPR45R.js.map +1 -0
  145. package/dist/{feedback-record-NUAJ6UBL.js → feedback-record-GVXGDY5Y.js} +15 -16
  146. package/dist/feedback-record-GVXGDY5Y.js.map +1 -0
  147. package/dist/{fetch-UTTJAOLC.js → fetch-U4TJIHZU.js} +8 -3
  148. package/dist/{fetch-UTTJAOLC.js.map → fetch-U4TJIHZU.js.map} +1 -1
  149. package/dist/{fit-FJ5CLQS4.js → fit-BOQL6OK3.js} +7 -5
  150. package/dist/{flows-OGGSWWGT.js → flows-XVZJ6GOI.js} +39 -19
  151. package/dist/flows-XVZJ6GOI.js.map +1 -0
  152. package/dist/{follow-DUIEGDVK.js → follow-FN7LV3WV.js} +2 -2
  153. package/dist/{follow-competitors-IT5ZVJPE.js → follow-competitors-MKXFHLXB.js} +2 -2
  154. package/dist/{fonts-GCJRLEGD.js → fonts-64T6KRZS.js} +7 -7
  155. package/dist/{forecast-2AGTFMXH.js → forecast-YIIGTHRM.js} +5 -5
  156. package/dist/{funnel-7U55LNJ4.js → funnel-XHDCXXQ5.js} +6 -6
  157. package/dist/{generate-DMQUS665.js → generate-3XYYITU6.js} +3 -3
  158. package/dist/{get-N7FR6NFX.js → get-6RQFDAIN.js} +8 -6
  159. package/dist/get-6RQFDAIN.js.map +1 -0
  160. package/dist/{get-IRJIHOQK.js → get-XJ3AZX35.js} +5 -5
  161. package/dist/{google-NYRI2NDZ.js → google-M7KEXVK5.js} +18 -18
  162. package/dist/{google-NYRI2NDZ.js.map → google-M7KEXVK5.js.map} +1 -1
  163. package/dist/google-ads-7XAGJVNJ.js +195 -0
  164. package/dist/google-ads-7XAGJVNJ.js.map +1 -0
  165. package/dist/{history-PSNJAUTW.js → history-EUG4LE44.js} +5 -5
  166. package/dist/{hubspot-2NHL47R2.js → hubspot-UULVEYVO.js} +9 -9
  167. package/dist/{ideas-22MRXKT7.js → ideas-7LXYXS5G.js} +6 -6
  168. package/dist/{images-LXFWEON7.js → images-3SOTFMJV.js} +4 -4
  169. package/dist/{ingest-W7VEDEYD.js → ingest-HQUXSBWA.js} +4 -4
  170. package/dist/{ingest-ZN3DEZHY.js → ingest-HYSZC3EX.js} +5 -5
  171. package/dist/{inspect-3LBIHMMP.js → inspect-HZQ7GSVM.js} +5 -5
  172. package/dist/{inspiration-I4MMKAWA.js → inspiration-P265QJ2H.js} +1 -1
  173. package/dist/{intent-ICKFJRT2.js → intent-E3UIVZBN.js} +5 -5
  174. package/dist/{keyword-gap-NGPH32FN.js → keyword-gap-BG6M665A.js} +5 -5
  175. package/dist/{keyword-metrics-PZXFB4NG.js → keyword-metrics-YG3K7MQZ.js} +8 -8
  176. package/dist/{keywords-for-site-RH47P4GJ.js → keywords-for-site-V4K744TF.js} +10 -6
  177. package/dist/{keywords-for-site-RH47P4GJ.js.map → keywords-for-site-V4K744TF.js.map} +1 -1
  178. package/dist/{landing-D7QS42GK.js → landing-3SSX6WK6.js} +3 -3
  179. package/dist/{languages-JDYL2N5F.js → languages-HORKPDNH.js} +4 -4
  180. package/dist/{languages-JMVNOHMG.js → languages-JSGWCC7Z.js} +2 -2
  181. package/dist/{leads-E22XFSX2.js → leads-FAHQ6KJX.js} +5 -5
  182. package/dist/{learn-Y4KIZNRF.js → learn-XNHGNQE5.js} +13 -14
  183. package/dist/{learn-Y4KIZNRF.js.map → learn-XNHGNQE5.js.map} +1 -1
  184. package/dist/{lighthouse-NQBUCHTW.js → lighthouse-6ZC45E53.js} +2 -2
  185. package/dist/{line-item-writes-KA5PVKFO.js → line-item-writes-A6BPZQPL.js} +5 -5
  186. package/dist/{line-items-3ZFFZCNH.js → line-items-J7PXJHMD.js} +5 -5
  187. package/dist/{link-AEU6BV75.js → link-4GGAQAVH.js} +5 -5
  188. package/dist/{linkedin-WCB2H5NH.js → linkedin-I6JDSTRB.js} +28 -28
  189. package/dist/{list-OLX7AI3O.js → list-22HZ2S4W.js} +5 -5
  190. package/dist/{list-TOUUGHMS.js → list-AQMGXI4N.js} +5 -5
  191. package/dist/{list-PAMYQS4X.js → list-KAJZFHMN.js} +4 -4
  192. package/dist/{locations-S4U6IJIS.js → locations-J4G5RNPH.js} +4 -4
  193. package/dist/{log-UGVWSK7Z.js → log-MUPKKYSJ.js} +5 -5
  194. package/dist/{make-3PZLTEXT.js → make-3FO76LA7.js} +131 -54
  195. package/dist/make-3FO76LA7.js.map +1 -0
  196. package/dist/{map-BW4CHSIO.js → map-F4LXTAJV.js} +6 -6
  197. package/dist/{mcp-JOXKA5HY.js → mcp-NLAQJWG6.js} +4 -4
  198. package/dist/{media-sources-SJZUOMI2.js → media-sources-W2CQFSVQ.js} +2 -2
  199. package/dist/{members-VAX6KAFN.js → members-3U6GINDF.js} +5 -5
  200. package/dist/{metrics-AY4RP54F.js → metrics-SQDJ5NQO.js} +4 -4
  201. package/dist/{models-5NTC7A5G.js → models-3Z6MDHQW.js} +2 -2
  202. package/dist/{normalize-IVQ7I54Z.js → normalize-FQ6WP5E4.js} +5 -5
  203. package/dist/{options-V7C6CU6M.js → options-K6FNT5A3.js} +8 -8
  204. package/dist/{performance-L6RJZPXX.js → performance-ZA7VCHOU.js} +6 -6
  205. package/dist/{promoted-tweet-writes-DBATH765.js → promoted-tweet-writes-4H3ZFD6O.js} +5 -5
  206. package/dist/{promoted-tweets-AU3XF3JD.js → promoted-tweets-MCMKPIHM.js} +3 -3
  207. package/dist/{publish-G6DYVT4S.js → publish-CW5YSAAL.js} +5 -5
  208. package/dist/{query-CPZZNMDY.js → query-IEZRY6HV.js} +4 -4
  209. package/dist/{reddit-S2S6C4RT.js → reddit-P7LLO4TK.js} +7 -7
  210. package/dist/{refresh-ARJ2SOMY.js → refresh-IGHEOA6Y.js} +4 -4
  211. package/dist/{release-3WCBAHPO.js → release-C74JOYDA.js} +5 -5
  212. package/dist/{relevant-pages-MTMFMBPD.js → relevant-pages-OWMNUCP7.js} +5 -5
  213. package/dist/{remove-FUAARCSC.js → remove-HPN62MPQ.js} +4 -4
  214. package/dist/{reopen-PZI5H4X2.js → reopen-XI53RP7R.js} +5 -5
  215. package/dist/{rerun-AUP4XT6T.js → rerun-2ITYGAIT.js} +21 -22
  216. package/dist/{rerun-AUP4XT6T.js.map → rerun-2ITYGAIT.js.map} +1 -1
  217. package/dist/{research-SY3QRGOC.js → research-HAHUTFVJ.js} +4 -4
  218. package/dist/{research-TISR736S.js → research-O6QXFCD7.js} +18 -15
  219. package/dist/research-O6QXFCD7.js.map +1 -0
  220. package/dist/{reset-ZWM7DDD7.js → reset-BISRUHT4.js} +4 -4
  221. package/dist/{reset-E6F5NXOI.js → reset-YMKVEOS4.js} +4 -4
  222. package/dist/{resolve-I5R5ELMZ.js → resolve-D2VESQ45.js} +5 -5
  223. package/dist/{retry-JO3JXXT2.js → retry-CGBATPQX.js} +4 -4
  224. package/dist/{retry-7CFZTKWI.js → retry-SUKRXBHX.js} +4 -4
  225. package/dist/{run-UKB647DI.js → run-BFERU46Q.js} +5 -5
  226. package/dist/{run-JR6SILHL.js → run-HSZFWRYZ.js} +21 -22
  227. package/dist/{scaffold-ad-BYGVU7MT.js → scaffold-ad-BYQYVB2C.js} +21 -22
  228. package/dist/{scaffold-ad-BYGVU7MT.js.map → scaffold-ad-BYQYVB2C.js.map} +1 -1
  229. package/dist/{scaffold-static-ad-U57V5UV3.js → scaffold-static-ad-5MXVTMEE.js} +70 -52
  230. package/dist/scaffold-static-ad-5MXVTMEE.js.map +1 -0
  231. package/dist/{scaffold-video-POZTINEV.js → scaffold-video-KEIHX3UD.js} +17 -18
  232. package/dist/{scaffold-video-POZTINEV.js.map → scaffold-video-KEIHX3UD.js.map} +1 -1
  233. package/dist/{schedule-SOAHLZZF.js → schedule-XJ24PL3K.js} +4 -4
  234. package/dist/{scheduled-agents-K5WU7SVJ.js → scheduled-agents-HWEKBANT.js} +11 -11
  235. package/dist/{schema-SOPL6GJP.js → schema-TAAAJHOJ.js} +6 -6
  236. package/dist/{search-5VUDFOHI.js → search-NVCIIGQS.js} +4 -4
  237. package/dist/{search-XUIVHGAY.js → search-UO5KJTYS.js} +3 -3
  238. package/dist/{select-T36UH4HL.js → select-K3EMTTI3.js} +14 -15
  239. package/dist/{select-T36UH4HL.js.map → select-K3EMTTI3.js.map} +1 -1
  240. package/dist/{set-prompt-Y4X7GV2Q.js → set-prompt-PY7FWYX6.js} +14 -15
  241. package/dist/{set-prompt-Y4X7GV2Q.js.map → set-prompt-PY7FWYX6.js.map} +1 -1
  242. package/dist/{setup-links-KFROCISS.js → setup-links-5ZCASHAL.js} +5 -5
  243. package/dist/{site-MXPKMRQT.js → site-7PSCHITE.js} +6 -6
  244. package/dist/{sources-MLDLMEDT.js → sources-GEB6OEGY.js} +8 -8
  245. package/dist/{sources-FFHNWVLV.js → sources-ICMUQMCJ.js} +6 -6
  246. package/dist/{stale-UXL4X4AD.js → stale-KBY5WARW.js} +13 -14
  247. package/dist/{stale-UXL4X4AD.js.map → stale-KBY5WARW.js.map} +1 -1
  248. package/dist/{status-M47G5HD4.js → status-ZX5WM5PJ.js} +5 -5
  249. package/dist/{studio-HUEBE6DS.js → studio-RA7QQH4O.js} +4 -4
  250. package/dist/{sync-HS7VZJ2H.js → sync-TZNIPZRX.js} +4 -4
  251. package/dist/{sync-definition-PY6REQ4J.js → sync-definition-ADXXWWV5.js} +16 -17
  252. package/dist/{tag-manager-HREEYGVM.js → tag-manager-DYZUOIAS.js} +1 -1
  253. package/dist/{tags-WAW6MQAY.js → tags-4OZCALA3.js} +5 -5
  254. package/dist/{tags-MRG56YOE.js → tags-4PXXFIPU.js} +4 -4
  255. package/dist/{tags-DYRZTYHD.js → tags-KFVUEPL6.js} +5 -5
  256. package/dist/{tags-DIXLYB5P.js → tags-TESETZGC.js} +4 -4
  257. package/dist/{tags-Y4HHJJGE.js → tags-WIMUIZHU.js} +5 -5
  258. package/dist/{targeting-criteria-5UUESFWC.js → targeting-criteria-VRI7V6C5.js} +3 -3
  259. package/dist/{targets-COZPVG52.js → targets-ERVS2VEU.js} +5 -5
  260. package/dist/{templates-75VFYZ3E.js → templates-TE6LBUIP.js} +5 -5
  261. package/dist/{testimonials-WJBRWLNW.js → testimonials-FV7KPAPK.js} +6 -6
  262. package/dist/{top-companies-C2R4FG6H.js → top-companies-B5M43KGJ.js} +5 -5
  263. package/dist/{translate-RYAJAFV7.js → translate-OKADZCBC.js} +19 -20
  264. package/dist/{translate-RYAJAFV7.js.map → translate-OKADZCBC.js.map} +1 -1
  265. package/dist/{triggers-5UHVJPBV.js → triggers-JLJQOSKI.js} +5 -5
  266. package/dist/{unlink-PLOOAGM3.js → unlink-KMWDKVIC.js} +5 -5
  267. package/dist/{unstage-JIIOTBTF.js → unstage-M4IQKJIO.js} +5 -5
  268. package/dist/{update-RGVNTA5X.js → update-5MBR4TPK.js} +4 -4
  269. package/dist/{update-QYM6U7LL.js → update-AHDGHOCP.js} +5 -5
  270. package/dist/{update-G6R5ZHUI.js → update-K6LFJHNI.js} +5 -5
  271. package/dist/{update-RCP7F5L5.js → update-PNRNYXUW.js} +5 -5
  272. package/dist/{upload-EEJ34Q3Y.js → upload-KAQC4AH7.js} +5 -5
  273. package/dist/{url-options-QEWKRKZ3.js → url-options-GGXAL3J4.js} +4 -4
  274. package/dist/{url-params-2G5M2B3J.js → url-params-SM32OOXZ.js} +5 -5
  275. package/dist/{validate-M33VLUG4.js → validate-NCTK5BXD.js} +14 -15
  276. package/dist/{validate-M33VLUG4.js.map → validate-NCTK5BXD.js.map} +1 -1
  277. package/dist/{videos-FVVID55J.js → videos-A32DPGHD.js} +5 -5
  278. package/dist/{viewer-check-2Q3WHSEL.js → viewer-check-L4B4LIAX.js} +4 -5
  279. package/dist/{web-WUGLSULO.js → web-TZEIFUYY.js} +8 -3
  280. package/dist/{web-WUGLSULO.js.map → web-TZEIFUYY.js.map} +1 -1
  281. package/dist/{winning-ads-OSRFHVLV.js → winning-ads-THIR7E5S.js} +6 -6
  282. package/dist/{write-commands-CLJOD2XF.js → write-commands-CE4FIQ6Y.js} +6 -6
  283. package/dist/{x-EBKLJJPJ.js → x-YXABYM5U.js} +6 -6
  284. package/package.json +1 -1
  285. package/dist/add-VZAY57M4.js.map +0 -1
  286. package/dist/advertisers-WSNHNCBQ.js.map +0 -1
  287. package/dist/chunk-5VC6IK7B.js.map +0 -1
  288. package/dist/chunk-6HJAHLLA.js.map +0 -1
  289. package/dist/chunk-CLMM6P6B.js.map +0 -1
  290. package/dist/chunk-EPMN4BK7.js.map +0 -1
  291. package/dist/chunk-HO3IUJ4K.js +0 -70
  292. package/dist/chunk-HO3IUJ4K.js.map +0 -1
  293. package/dist/chunk-IH4UQ2OK.js.map +0 -1
  294. package/dist/chunk-IKYNOT57.js.map +0 -1
  295. package/dist/chunk-OBDAYP2P.js.map +0 -1
  296. package/dist/chunk-RCQJHKK5.js.map +0 -1
  297. package/dist/chunk-TBEUMOEL.js.map +0 -1
  298. package/dist/chunk-V2X3KK52.js.map +0 -1
  299. package/dist/chunk-XML7AJM3.js.map +0 -1
  300. package/dist/feedback-QGSAJJVC.js.map +0 -1
  301. package/dist/feedback-record-NUAJ6UBL.js.map +0 -1
  302. package/dist/flows-OGGSWWGT.js.map +0 -1
  303. package/dist/get-N7FR6NFX.js.map +0 -1
  304. package/dist/make-3PZLTEXT.js.map +0 -1
  305. package/dist/research-TISR736S.js.map +0 -1
  306. package/dist/scaffold-static-ad-U57V5UV3.js.map +0 -1
  307. /package/dist/{account-PCEZQUK7.js.map → account-DTHGTZCN.js.map} +0 -0
  308. /package/dist/{accounts-5AXLYU7P.js.map → accounts-5RLG6BBA.js.map} +0 -0
  309. /package/dist/{accounts-OSXDZZLY.js.map → accounts-6LSBBXKA.js.map} +0 -0
  310. /package/dist/{actions-HM4VVTGW.js.map → actions-WH5C6Q7I.js.map} +0 -0
  311. /package/dist/{add-4J2EF54O.js.map → add-BZ4QPLK4.js.map} +0 -0
  312. /package/dist/{ads-NUME2UXH.js.map → ads-6UG66KA5.js.map} +0 -0
  313. /package/dist/{analytics-QTR2ZITZ.js.map → analytics-3YAWQF5K.js.map} +0 -0
  314. /package/dist/{analytics-PHU7H5VY.js.map → analytics-BCZGSSXP.js.map} +0 -0
  315. /package/dist/{animate-3Z7HXOLE.js.map → animate-AIZ3GS4J.js.map} +0 -0
  316. /package/dist/{assign-IIAVNATI.js.map → assign-O6QNAZD5.js.map} +0 -0
  317. /package/dist/{audience-size-2L7XMYJL.js.map → audience-size-CXPWERR3.js.map} +0 -0
  318. /package/dist/{audit-ZCUFJLUG.js.map → audit-MNOQK3U4.js.map} +0 -0
  319. /package/dist/{avatars-OEK3FYKK.js.map → avatars-P3WX5TQP.js.map} +0 -0
  320. /package/dist/{bid-pricing-FDW3IY6G.js.map → bid-pricing-6XXSM7C2.js.map} +0 -0
  321. /package/dist/{brand-OXYFSNA5.js.map → brand-LXU7YNCF.js.map} +0 -0
  322. /package/dist/{campaign-groups-5GCFQT2W.js.map → campaign-groups-CEAM3WRO.js.map} +0 -0
  323. /package/dist/{campaign-writes-3SJQSCUK.js.map → campaign-writes-D6BJAULL.js.map} +0 -0
  324. /package/dist/{campaigns-SYEOFKFV.js.map → campaigns-CXOKBCPS.js.map} +0 -0
  325. /package/dist/{campaigns-7QDDWZ76.js.map → campaigns-V3SWBM4E.js.map} +0 -0
  326. /package/dist/{canvas-B6DPRQGN.js.map → canvas-VH3Q26TK.js.map} +0 -0
  327. /package/dist/{capabilities-GVHPHH2G.js.map → capabilities-NZPSSS6T.js.map} +0 -0
  328. /package/dist/{changes-6QBJMGJC.js.map → changes-TP7ZZHB3.js.map} +0 -0
  329. /package/dist/{chats-54CWM7DL.js.map → chats-GN3PBFX4.js.map} +0 -0
  330. /package/dist/{chunk-SKT3SAHG.js.map → chunk-2BKVVCCV.js.map} +0 -0
  331. /package/dist/{chunk-YUPRCOEN.js.map → chunk-2GTYAHDN.js.map} +0 -0
  332. /package/dist/{chunk-E5IFTZJ3.js.map → chunk-3OFVFHKT.js.map} +0 -0
  333. /package/dist/{chunk-5EEDEVOR.js.map → chunk-4QEY2L6U.js.map} +0 -0
  334. /package/dist/{chunk-7JUUKYKG.js.map → chunk-4Z7DEN75.js.map} +0 -0
  335. /package/dist/{chunk-GTK46DE3.js.map → chunk-7ED5TAFP.js.map} +0 -0
  336. /package/dist/{chunk-654U6NU6.js.map → chunk-BNCW67EM.js.map} +0 -0
  337. /package/dist/{chunk-J5IU4OX2.js.map → chunk-CFHIW5QZ.js.map} +0 -0
  338. /package/dist/{chunk-FGH4Z5K5.js.map → chunk-DQMZXK27.js.map} +0 -0
  339. /package/dist/{chunk-XV6XCFF7.js.map → chunk-E4NCRGY3.js.map} +0 -0
  340. /package/dist/{chunk-7FVWIZHM.js.map → chunk-ESB5DLIP.js.map} +0 -0
  341. /package/dist/{chunk-NK2UFFVH.js.map → chunk-FVF5SXTZ.js.map} +0 -0
  342. /package/dist/{chunk-KWAOTV7F.js.map → chunk-GX6VAHY7.js.map} +0 -0
  343. /package/dist/{chunk-6TCDQSM7.js.map → chunk-GYU7BWEN.js.map} +0 -0
  344. /package/dist/{chunk-HYCIBVDW.js.map → chunk-HZUDRKGR.js.map} +0 -0
  345. /package/dist/{chunk-FYQPB2SS.js.map → chunk-IGQZ5U3C.js.map} +0 -0
  346. /package/dist/{chunk-OAQPHP6V.js.map → chunk-IYU4X5A7.js.map} +0 -0
  347. /package/dist/{chunk-2SCPDSFN.js.map → chunk-LIQ4SQ2T.js.map} +0 -0
  348. /package/dist/{chunk-KMEMA7AZ.js.map → chunk-LLOOWRBB.js.map} +0 -0
  349. /package/dist/{chunk-NSA6HRG6.js.map → chunk-ND5MJ3AA.js.map} +0 -0
  350. /package/dist/{chunk-ACFWVULZ.js.map → chunk-NIJSXVFT.js.map} +0 -0
  351. /package/dist/{chunk-H2QNBOPS.js.map → chunk-NJXNU2G6.js.map} +0 -0
  352. /package/dist/{chunk-AO5UQQLJ.js.map → chunk-ORO7VAXB.js.map} +0 -0
  353. /package/dist/{chunk-V5WSJP5A.js.map → chunk-OUTF5JFG.js.map} +0 -0
  354. /package/dist/{chunk-XG3XCHN6.js.map → chunk-P5T7OZKV.js.map} +0 -0
  355. /package/dist/{chunk-DE6ANJLU.js.map → chunk-PTCIM35Y.js.map} +0 -0
  356. /package/dist/{chunk-VJZHVOA4.js.map → chunk-PVUZWHNQ.js.map} +0 -0
  357. /package/dist/{chunk-CKU4WYTF.js.map → chunk-QVJDPOEB.js.map} +0 -0
  358. /package/dist/{chunk-KV5BCSUR.js.map → chunk-R5RIH3N5.js.map} +0 -0
  359. /package/dist/{chunk-RB5DB3WN.js.map → chunk-RB5CVIK6.js.map} +0 -0
  360. /package/dist/{chunk-EAHP7L2R.js.map → chunk-RZT263H7.js.map} +0 -0
  361. /package/dist/{chunk-HDWKLFF5.js.map → chunk-TUB34FVS.js.map} +0 -0
  362. /package/dist/{chunk-4SJDDGPV.js.map → chunk-TX7LZWZD.js.map} +0 -0
  363. /package/dist/{chunk-6YYEBLYI.js.map → chunk-V7CTQOHG.js.map} +0 -0
  364. /package/dist/{chunk-EVYXTT7V.js.map → chunk-XCM6XWOB.js.map} +0 -0
  365. /package/dist/{chunk-ZNBDKK4Y.js.map → chunk-XFGAUP5B.js.map} +0 -0
  366. /package/dist/{chunk-4SNOWJV7.js.map → chunk-XQIKDODN.js.map} +0 -0
  367. /package/dist/{chunk-WRIC2RPQ.js.map → chunk-XTRAI6CL.js.map} +0 -0
  368. /package/dist/{chunk-3X3446TG.js.map → chunk-XVOI4BIS.js.map} +0 -0
  369. /package/dist/{chunk-F46KAIBS.js.map → chunk-ZGTCZ6H4.js.map} +0 -0
  370. /package/dist/{claim-CIASHKMC.js.map → claim-25JJM4AG.js.map} +0 -0
  371. /package/dist/{companies-ECVMO24S.js.map → companies-VR5M5PAN.js.map} +0 -0
  372. /package/dist/{complete-32CPBFIG.js.map → complete-DRMOTC2W.js.map} +0 -0
  373. /package/dist/{connect-OJSOM6PY.js.map → connect-WUDJR2GH.js.map} +0 -0
  374. /package/dist/{conversation-7FHN5ESN.js.map → conversation-K6LYF2ZP.js.map} +0 -0
  375. /package/dist/{conversion-upload-command-BBUXLFT3.js.map → conversion-upload-command-AUF3LNTH.js.map} +0 -0
  376. /package/dist/{conversions-7YJDNZ7Y.js.map → conversions-GF32XOWY.js.map} +0 -0
  377. /package/dist/{countries-FYHM3IMJ.js.map → countries-ESAKTQAE.js.map} +0 -0
  378. /package/dist/{create-OYT76OMJ.js.map → create-2D7AIFJI.js.map} +0 -0
  379. /package/dist/{create-ZGRL7YCV.js.map → create-4TFAD6HY.js.map} +0 -0
  380. /package/dist/{create-FE5QLW7V.js.map → create-IXYXYLLE.js.map} +0 -0
  381. /package/dist/{create-2TBDXHAM.js.map → create-PKJVFJMO.js.map} +0 -0
  382. /package/dist/{creatives-IUB57I3T.js.map → creatives-OHCFHRZ5.js.map} +0 -0
  383. /package/dist/{creatives-5MUTX4DQ.js.map → creatives-QLSZFOMB.js.map} +0 -0
  384. /package/dist/{credentials-AETHKP5T.js.map → credentials-WSLR5VU4.js.map} +0 -0
  385. /package/dist/{critique-T7HJ42D4.js.map → critique-5PCQ2CJH.js.map} +0 -0
  386. /package/dist/{crm-KH6XX2TT.js.map → crm-HNUOHXAN.js.map} +0 -0
  387. /package/dist/{crm-JP4UOPMN.js.map → crm-SNIUADNK.js.map} +0 -0
  388. /package/dist/{currency-DJDVIR3C.js.map → currency-XCGKQ7FE.js.map} +0 -0
  389. /package/dist/{customers-7I7UY5PS.js.map → customers-72L2KZHO.js.map} +0 -0
  390. /package/dist/{delete-6IOUDEWY.js.map → delete-EVGM5B36.js.map} +0 -0
  391. /package/dist/{delete-ODFKNHAI.js.map → delete-PA2GY5EC.js.map} +0 -0
  392. /package/dist/{delete-RAETUVO2.js.map → delete-YNNFTFYV.js.map} +0 -0
  393. /package/dist/{demographics-2FTDKPBD.js.map → demographics-SYS2E7QC.js.map} +0 -0
  394. /package/dist/{discard-ZX5TLFYH.js.map → discard-JS2YJUIM.js.map} +0 -0
  395. /package/dist/{discover-M3ZKKFEL.js.map → discover-BJPZNXUQ.js.map} +0 -0
  396. /package/dist/{domain-TH7KIC2T.js.map → domain-XKKH5NCL.js.map} +0 -0
  397. /package/dist/{draft-YHUIFDDR.js.map → draft-4AO4YH3V.js.map} +0 -0
  398. /package/dist/{draft-SH25PKST.js.map → draft-5YAYCEYY.js.map} +0 -0
  399. /package/dist/{draft-S2FSQOJN.js.map → draft-GCUXNPVH.js.map} +0 -0
  400. /package/dist/{draft-CRE2Y24G.js.map → draft-WWWKSEEE.js.map} +0 -0
  401. /package/dist/{facets-6B2U4BSM.js.map → facets-NVBX5WDT.js.map} +0 -0
  402. /package/dist/{fit-FJ5CLQS4.js.map → fit-BOQL6OK3.js.map} +0 -0
  403. /package/dist/{follow-DUIEGDVK.js.map → follow-FN7LV3WV.js.map} +0 -0
  404. /package/dist/{follow-competitors-IT5ZVJPE.js.map → follow-competitors-MKXFHLXB.js.map} +0 -0
  405. /package/dist/{fonts-GCJRLEGD.js.map → fonts-64T6KRZS.js.map} +0 -0
  406. /package/dist/{forecast-2AGTFMXH.js.map → forecast-YIIGTHRM.js.map} +0 -0
  407. /package/dist/{funnel-7U55LNJ4.js.map → funnel-XHDCXXQ5.js.map} +0 -0
  408. /package/dist/{generate-DMQUS665.js.map → generate-3XYYITU6.js.map} +0 -0
  409. /package/dist/{get-IRJIHOQK.js.map → get-XJ3AZX35.js.map} +0 -0
  410. /package/dist/{history-PSNJAUTW.js.map → history-EUG4LE44.js.map} +0 -0
  411. /package/dist/{hubspot-2NHL47R2.js.map → hubspot-UULVEYVO.js.map} +0 -0
  412. /package/dist/{ideas-22MRXKT7.js.map → ideas-7LXYXS5G.js.map} +0 -0
  413. /package/dist/{images-LXFWEON7.js.map → images-3SOTFMJV.js.map} +0 -0
  414. /package/dist/{ingest-W7VEDEYD.js.map → ingest-HQUXSBWA.js.map} +0 -0
  415. /package/dist/{ingest-ZN3DEZHY.js.map → ingest-HYSZC3EX.js.map} +0 -0
  416. /package/dist/{inspect-3LBIHMMP.js.map → inspect-HZQ7GSVM.js.map} +0 -0
  417. /package/dist/{inspiration-I4MMKAWA.js.map → inspiration-P265QJ2H.js.map} +0 -0
  418. /package/dist/{intent-ICKFJRT2.js.map → intent-E3UIVZBN.js.map} +0 -0
  419. /package/dist/{keyword-gap-NGPH32FN.js.map → keyword-gap-BG6M665A.js.map} +0 -0
  420. /package/dist/{keyword-metrics-PZXFB4NG.js.map → keyword-metrics-YG3K7MQZ.js.map} +0 -0
  421. /package/dist/{landing-D7QS42GK.js.map → landing-3SSX6WK6.js.map} +0 -0
  422. /package/dist/{languages-JDYL2N5F.js.map → languages-HORKPDNH.js.map} +0 -0
  423. /package/dist/{languages-JMVNOHMG.js.map → languages-JSGWCC7Z.js.map} +0 -0
  424. /package/dist/{leads-E22XFSX2.js.map → leads-FAHQ6KJX.js.map} +0 -0
  425. /package/dist/{lighthouse-NQBUCHTW.js.map → lighthouse-6ZC45E53.js.map} +0 -0
  426. /package/dist/{line-item-writes-KA5PVKFO.js.map → line-item-writes-A6BPZQPL.js.map} +0 -0
  427. /package/dist/{line-items-3ZFFZCNH.js.map → line-items-J7PXJHMD.js.map} +0 -0
  428. /package/dist/{link-AEU6BV75.js.map → link-4GGAQAVH.js.map} +0 -0
  429. /package/dist/{linkedin-WCB2H5NH.js.map → linkedin-I6JDSTRB.js.map} +0 -0
  430. /package/dist/{list-OLX7AI3O.js.map → list-22HZ2S4W.js.map} +0 -0
  431. /package/dist/{list-TOUUGHMS.js.map → list-AQMGXI4N.js.map} +0 -0
  432. /package/dist/{list-PAMYQS4X.js.map → list-KAJZFHMN.js.map} +0 -0
  433. /package/dist/{locations-S4U6IJIS.js.map → locations-J4G5RNPH.js.map} +0 -0
  434. /package/dist/{log-UGVWSK7Z.js.map → log-MUPKKYSJ.js.map} +0 -0
  435. /package/dist/{map-BW4CHSIO.js.map → map-F4LXTAJV.js.map} +0 -0
  436. /package/dist/{mcp-JOXKA5HY.js.map → mcp-NLAQJWG6.js.map} +0 -0
  437. /package/dist/{media-sources-SJZUOMI2.js.map → media-sources-W2CQFSVQ.js.map} +0 -0
  438. /package/dist/{members-VAX6KAFN.js.map → members-3U6GINDF.js.map} +0 -0
  439. /package/dist/{metrics-AY4RP54F.js.map → metrics-SQDJ5NQO.js.map} +0 -0
  440. /package/dist/{models-5NTC7A5G.js.map → models-3Z6MDHQW.js.map} +0 -0
  441. /package/dist/{normalize-IVQ7I54Z.js.map → normalize-FQ6WP5E4.js.map} +0 -0
  442. /package/dist/{options-V7C6CU6M.js.map → options-K6FNT5A3.js.map} +0 -0
  443. /package/dist/{performance-L6RJZPXX.js.map → performance-ZA7VCHOU.js.map} +0 -0
  444. /package/dist/{promoted-tweet-writes-DBATH765.js.map → promoted-tweet-writes-4H3ZFD6O.js.map} +0 -0
  445. /package/dist/{promoted-tweets-AU3XF3JD.js.map → promoted-tweets-MCMKPIHM.js.map} +0 -0
  446. /package/dist/{publish-G6DYVT4S.js.map → publish-CW5YSAAL.js.map} +0 -0
  447. /package/dist/{query-CPZZNMDY.js.map → query-IEZRY6HV.js.map} +0 -0
  448. /package/dist/{reddit-S2S6C4RT.js.map → reddit-P7LLO4TK.js.map} +0 -0
  449. /package/dist/{refresh-ARJ2SOMY.js.map → refresh-IGHEOA6Y.js.map} +0 -0
  450. /package/dist/{release-3WCBAHPO.js.map → release-C74JOYDA.js.map} +0 -0
  451. /package/dist/{relevant-pages-MTMFMBPD.js.map → relevant-pages-OWMNUCP7.js.map} +0 -0
  452. /package/dist/{remove-FUAARCSC.js.map → remove-HPN62MPQ.js.map} +0 -0
  453. /package/dist/{reopen-PZI5H4X2.js.map → reopen-XI53RP7R.js.map} +0 -0
  454. /package/dist/{research-SY3QRGOC.js.map → research-HAHUTFVJ.js.map} +0 -0
  455. /package/dist/{reset-ZWM7DDD7.js.map → reset-BISRUHT4.js.map} +0 -0
  456. /package/dist/{reset-E6F5NXOI.js.map → reset-YMKVEOS4.js.map} +0 -0
  457. /package/dist/{resolve-I5R5ELMZ.js.map → resolve-D2VESQ45.js.map} +0 -0
  458. /package/dist/{retry-JO3JXXT2.js.map → retry-CGBATPQX.js.map} +0 -0
  459. /package/dist/{retry-7CFZTKWI.js.map → retry-SUKRXBHX.js.map} +0 -0
  460. /package/dist/{run-UKB647DI.js.map → run-BFERU46Q.js.map} +0 -0
  461. /package/dist/{run-JR6SILHL.js.map → run-HSZFWRYZ.js.map} +0 -0
  462. /package/dist/{schedule-SOAHLZZF.js.map → schedule-XJ24PL3K.js.map} +0 -0
  463. /package/dist/{scheduled-agents-K5WU7SVJ.js.map → scheduled-agents-HWEKBANT.js.map} +0 -0
  464. /package/dist/{schema-SOPL6GJP.js.map → schema-TAAAJHOJ.js.map} +0 -0
  465. /package/dist/{search-5VUDFOHI.js.map → search-NVCIIGQS.js.map} +0 -0
  466. /package/dist/{search-XUIVHGAY.js.map → search-UO5KJTYS.js.map} +0 -0
  467. /package/dist/{setup-links-KFROCISS.js.map → setup-links-5ZCASHAL.js.map} +0 -0
  468. /package/dist/{site-MXPKMRQT.js.map → site-7PSCHITE.js.map} +0 -0
  469. /package/dist/{sources-MLDLMEDT.js.map → sources-GEB6OEGY.js.map} +0 -0
  470. /package/dist/{sources-FFHNWVLV.js.map → sources-ICMUQMCJ.js.map} +0 -0
  471. /package/dist/{status-M47G5HD4.js.map → status-ZX5WM5PJ.js.map} +0 -0
  472. /package/dist/{studio-HUEBE6DS.js.map → studio-RA7QQH4O.js.map} +0 -0
  473. /package/dist/{sync-HS7VZJ2H.js.map → sync-TZNIPZRX.js.map} +0 -0
  474. /package/dist/{sync-definition-PY6REQ4J.js.map → sync-definition-ADXXWWV5.js.map} +0 -0
  475. /package/dist/{tag-manager-HREEYGVM.js.map → tag-manager-DYZUOIAS.js.map} +0 -0
  476. /package/dist/{tags-WAW6MQAY.js.map → tags-4OZCALA3.js.map} +0 -0
  477. /package/dist/{tags-MRG56YOE.js.map → tags-4PXXFIPU.js.map} +0 -0
  478. /package/dist/{tags-DYRZTYHD.js.map → tags-KFVUEPL6.js.map} +0 -0
  479. /package/dist/{tags-DIXLYB5P.js.map → tags-TESETZGC.js.map} +0 -0
  480. /package/dist/{tags-Y4HHJJGE.js.map → tags-WIMUIZHU.js.map} +0 -0
  481. /package/dist/{targeting-criteria-5UUESFWC.js.map → targeting-criteria-VRI7V6C5.js.map} +0 -0
  482. /package/dist/{targets-COZPVG52.js.map → targets-ERVS2VEU.js.map} +0 -0
  483. /package/dist/{templates-75VFYZ3E.js.map → templates-TE6LBUIP.js.map} +0 -0
  484. /package/dist/{testimonials-WJBRWLNW.js.map → testimonials-FV7KPAPK.js.map} +0 -0
  485. /package/dist/{top-companies-C2R4FG6H.js.map → top-companies-B5M43KGJ.js.map} +0 -0
  486. /package/dist/{triggers-5UHVJPBV.js.map → triggers-JLJQOSKI.js.map} +0 -0
  487. /package/dist/{unlink-PLOOAGM3.js.map → unlink-KMWDKVIC.js.map} +0 -0
  488. /package/dist/{unstage-JIIOTBTF.js.map → unstage-M4IQKJIO.js.map} +0 -0
  489. /package/dist/{update-RGVNTA5X.js.map → update-5MBR4TPK.js.map} +0 -0
  490. /package/dist/{update-QYM6U7LL.js.map → update-AHDGHOCP.js.map} +0 -0
  491. /package/dist/{update-G6R5ZHUI.js.map → update-K6LFJHNI.js.map} +0 -0
  492. /package/dist/{update-RCP7F5L5.js.map → update-PNRNYXUW.js.map} +0 -0
  493. /package/dist/{upload-EEJ34Q3Y.js.map → upload-KAQC4AH7.js.map} +0 -0
  494. /package/dist/{url-options-QEWKRKZ3.js.map → url-options-GGXAL3J4.js.map} +0 -0
  495. /package/dist/{url-params-2G5M2B3J.js.map → url-params-SM32OOXZ.js.map} +0 -0
  496. /package/dist/{videos-FVVID55J.js.map → videos-A32DPGHD.js.map} +0 -0
  497. /package/dist/{viewer-check-2Q3WHSEL.js.map → viewer-check-L4B4LIAX.js.map} +0 -0
  498. /package/dist/{winning-ads-OSRFHVLV.js.map → winning-ads-THIR7E5S.js.map} +0 -0
  499. /package/dist/{write-commands-CLJOD2XF.js.map → write-commands-CE4FIQ6Y.js.map} +0 -0
  500. /package/dist/{x-EBKLJJPJ.js.map → x-YXABYM5U.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../api/src/ad-library/wire.ts"],"sourcesContent":["/**\n * Wire contract for `/api/ad-library/*` — the Baker-side surface over the ad-dna\n * \"winners\" service (`apps/ad-dna-service`, ads.withbaker.com).\n *\n * Two kinds of schema live here:\n * - **Request** schemas are strict: they validate CLI/dashboard input at the\n * backend boundary (`schema.parse(...)`).\n * - **Lean response** schemas describe the shape *our* routes/actions emit. The\n * raw ad-dna envelope is large and occasionally messy, so the backend client\n * coerces it into these lean shapes by hand (see `adLibrary/client.ts`); the\n * schemas are the contract the CLI + dashboard bind to, not a parser for the\n * upstream payload.\n *\n * Pure + zod-only (no `convex` import), like the rest of `@baker/api`.\n */\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Platforms. The ad-dna corpus has a discovery connector per platform, so the\n// surfaces we expose are limited to the ones with a connector. (Result rows may\n// still carry a legacy platform string from older data, so result `platform`\n// stays a plain string; only *inputs* are constrained.)\n// ---------------------------------------------------------------------------\n\nexport const adLibraryPlatformSchema = z.enum([\"meta\", \"linkedin\", \"tiktok\"]);\nexport type AdLibraryPlatform = z.infer<typeof adLibraryPlatformSchema>;\n\n/**\n * Whether a corpus row's platform is one Baker can follow. Corpus rows carry a\n * free-text platform (legacy data, and platforms the DNA schema knows about\n * before a connector exists), so a membership test — not a cast — is what\n * decides which of an advertiser's platform identities we subscribe to.\n */\nexport function isFollowablePlatform(platform: string | null | undefined): platform is AdLibraryPlatform {\n return adLibraryPlatformSchema.safeParse(platform).success;\n}\n\n// ---------------------------------------------------------------------------\n// Winner search — `/api/ad-library/winners/search`\n// ---------------------------------------------------------------------------\n\nexport const winnersHardFiltersSchema = z.object({\n platform: z.array(z.string()).optional(),\n format: z.array(z.string()).optional(),\n winner_category: z.array(z.string()).optional(),\n awareness_stage: z.array(z.string()).optional(),\n country: z.array(z.string()).optional(),\n language: z.array(z.string()).optional(),\n advertiser_ids: z.array(z.string()).optional(),\n exclude_advertiser_ids: z.array(z.string()).optional(),\n industry_cluster_ids: z.array(z.string()).optional(),\n business_model_cluster_ids: z.array(z.string()).optional(),\n // Proven HOOK seeds (from the `/api/ad-library/seed-catalog` rollup) — narrows\n // a find-similar search to ads on a chosen winning hook pattern, no cluster\n // lookup. Forwarded verbatim to ad-dna's `hard_filters.hook_archetype_seeds`;\n // must live in this schema or the strict boundary parse would drop it.\n hook_archetype_seeds: z.array(z.string()).optional(),\n // A static's container (comparison_table, before_after_split, …), the values\n // `/api/ad-library/seed-catalog` ranks as formats: the best proven example of\n // a container whatever category it sells.\n static_format_patterns: z.array(z.string()).optional(),\n // Who the ad was made for, as the library judged it from the creative: pick\n // references whose audience matches ours (a cold brief, cold references).\n audience_temperature: z.array(z.string()).optional(),\n funnel_stage: z.array(z.string()).optional(),\n advertiser_size: z.array(z.string()).optional(),\n // `false` drops the ads known to work only on viewers who already know the\n // brand (an ad not judged yet is kept); `true` keeps only those.\n presumes_brand_knowledge: z.boolean().optional(),\n first_seen_after: z.string().optional(),\n first_seen_before: z.string().optional(),\n});\nexport type WinnersHardFilters = z.infer<typeof winnersHardFiltersSchema>;\n\n/**\n * A first-seen bound as ad-dna requires it (an ISO datetime in UTC). A bare\n * date reads as the start of that day; an offset is converted to UTC.\n */\nconst firstSeenBoundSchema = z\n .union([z.iso.date(), z.iso.datetime({ offset: true })], {\n error: \"first_seen_after/first_seen_before must be an ISO date (2026-01-01) or datetime (2026-01-01T00:00:00Z)\",\n })\n .transform((value) => new Date(value.length === 10 ? `${value}T00:00:00Z` : value).toISOString());\n\n// ad-dna's closed vocabularies for the search filters, mirrored here so a typo\n// is refused with the valid values before a paid search. Sources:\n// apps/ad-dna-service/src/schema/enums.ts (format, winner category, awareness\n// stage) and packages/ad-dna/src/schema/enums.ts (`staticFormatPatternEnum`,\n// and the stored audience temperature, funnel stage and advertiser size).\n// Platform is the connector set above, not every platform the DNA knows.\nexport const adFormatSchema = z.enum([\"video\", \"static\", \"carousel\"]);\nexport const winnerCategorySchema = z.enum([\n \"winner\",\n \"grand_slam_winner\",\n \"scaled_winner\",\n \"low_profile_winner\",\n \"rising\",\n \"evergreen\",\n \"low_traction_dud\",\n \"thrash_iteration\",\n \"thrash_family\",\n \"false_winner\",\n \"untested\",\n \"dud\",\n]);\nexport const awarenessStageSchema = z.enum([\n \"unaware\",\n \"problem_aware\",\n \"solution_aware\",\n \"product_aware\",\n \"most_aware\",\n]);\nexport const audienceTemperatureSchema = z.enum([\"0_cold\", \"1_warm_engaged\", \"2_hot_visited\", \"3_customer\"]);\nexport const funnelStageSchema = z.enum([\"TOF\", \"MOF\", \"BOF\"]);\nexport const advertiserSizeSchema = z.enum([\"solo\", \"smb\", \"mid\", \"enterprise\"]);\nexport const staticFormatPatternSchema = z.enum([\n \"clean_product\",\n \"lifestyle_photo\",\n \"headline_card\",\n \"infographic\",\n \"chat_screenshot\",\n \"tweet_screenshot\",\n \"review_screenshot\",\n \"before_after_split\",\n \"comparison_table\",\n \"list_card\",\n \"meme_template\",\n \"native_post_lookalike\",\n \"stock_photo_overlay\",\n \"founder_portrait\",\n \"testimonial_quote\",\n \"packshot_minimalist\",\n \"four_panel_lifestyle_grid\",\n \"two_panel_split\",\n \"notes_app_screenshot\",\n \"founder_letter_textonly\",\n \"us_vs_them_grid\",\n \"benefit_callout_grid\",\n \"create_your_own_adventure_meme\",\n \"quad_split\",\n \"stories_style_casual_static\",\n]);\n\n/** The filters as a caller's input is checked where it enters Baker, before a paid search. */\nconst validatedHardFiltersSchema = winnersHardFiltersSchema.extend({\n platform: z.array(adLibraryPlatformSchema).optional(),\n format: z.array(adFormatSchema).optional(),\n winner_category: z.array(winnerCategorySchema).optional(),\n awareness_stage: z.array(awarenessStageSchema).optional(),\n static_format_patterns: z.array(staticFormatPatternSchema).optional(),\n audience_temperature: z.array(audienceTemperatureSchema).optional(),\n funnel_stage: z.array(funnelStageSchema).optional(),\n advertiser_size: z.array(advertiserSizeSchema).optional(),\n first_seen_after: firstSeenBoundSchema.optional(),\n first_seen_before: firstSeenBoundSchema.optional(),\n});\n\nexport const winnersSortSchema = z.enum([\"winner\", \"longest_running\", \"newest\"]);\nexport type WinnersSort = z.infer<typeof winnersSortSchema>;\n\nconst winnersSearchFields = z.object({\n free_text_query: z.string().max(500).optional(),\n ref_ad_id: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n // Pagination offset for infinite scroll. The browse view (no query) scrolls\n // the whole library; a text/similar search scrolls its bounded ranked pool.\n offset: z.number().int().min(0).optional(),\n // Per-advertiser cap: past it a brand's ads are dropped. `0` = no cap (the\n // library browse view sends it so a facet-filtered slice shows every winner\n // and matches the facet-rail count); omit it to spread the brands instead,\n // three each at the top and none dropped.\n max_per_advertiser: z.number().int().min(0).max(50).optional(),\n // ad-dna reads one advertiser in `advertiser_ids` as browsing that brand, and\n // keeps its measured failures. `false` keeps it a reference search: what\n // Baker sends when it narrowed to the company's followed brands itself.\n brand_browse: z.boolean().optional(),\n min_relevance: z.number().min(0).max(1).optional(),\n // One page picked for variety (different brands, containers and hooks)\n // instead of rank order: a reference set for N concepts. Ignores offset.\n diverse: z.boolean().optional(),\n // The order of a browse (no query): by winner score (default), by how long\n // the ad has run, or by when it was first seen. A query ranks by relevance\n // blended with winner score, so `sort` only means something without one.\n sort: winnersSortSchema.optional(),\n hard_filters: winnersHardFiltersSchema.optional(),\n // `score_breakdown` surfaces the \"why it ranked\" panel; facets drive the\n // filter rail. thumbnails/full_dna_url are opt-in extras.\n include: z.array(z.enum([\"score_breakdown\", \"facets\", \"full_dna_url\", \"thumbnails\"])).optional(),\n});\n\nconst hasSearchInput = (b: { free_text_query?: string; ref_ad_id?: string; hard_filters?: unknown }): boolean =>\n b.free_text_query !== undefined || b.ref_ad_id !== undefined || b.hard_filters !== undefined;\nconst SEARCH_INPUT_MESSAGE = \"Provide free_text_query, ref_ad_id, or hard_filters\";\n\n/** The request ad-dna's `/v1/search` answers, forwarded verbatim. */\nexport type WinnersSearchRequest = z.infer<typeof winnersSearchFields>;\n\n/**\n * Which brands a reference search draws from. The corpus is shared by every\n * Baker company, so `all` can surface a brand some other client follows.\n * - `followed-first` (default): followed brands first, topped up from the\n * whole library when fewer than `limit` of them clear the relevance floor.\n * A company that follows nobody gets the whole library, as `all` would.\n * - `followed`: only brands this company follows.\n * - `all`: the whole library.\n */\nexport const winnerSearchScopeSchema = z.enum([\"all\", \"followed\", \"followed-first\"]);\nexport type WinnerSearchScope = z.infer<typeof winnerSearchScopeSchema>;\n\n/** `/api/ad-library/winners/search`: the ad-dna request plus a scope Baker resolves from the API key's company. */\nexport const scopedWinnersSearchRequestSchema = winnersSearchFields\n .extend({\n scope: winnerSearchScopeSchema.default(\"followed-first\"),\n hard_filters: validatedHardFiltersSchema.optional(),\n })\n .refine(hasSearchInput, { message: SEARCH_INPUT_MESSAGE })\n // Paging a merged two-phase answer has no stable meaning: page 2 of \"followed\n // first\" depends on how many followed ads page 1 happened to hold.\n .refine((b) => b.scope !== \"followed-first\" || !b.offset, {\n message: \"offset is not supported with scope followed-first; raise limit instead\",\n });\nexport type ScopedWinnersSearchRequest = z.infer<typeof scopedWinnersSearchRequestSchema>;\n\n/** DNA \"why it works\" summary — every field nullable (ad-dna omits freely). */\nexport const winningAdDnaSchema = z.object({\n creative_concept: z.string().nullable(),\n angle: z.string().nullable(),\n awareness_stage: z.string().nullable(),\n // How many claims the ad's market has already heard (s1 first to say it … s5 tired of claims).\n // Optional while an older ad-dna does not send it.\n sophistication_stage: z.string().nullable().optional(),\n audience_temperature: z.string().nullable(),\n // Who else the ad was made for, and whether its copy only works on viewers who\n // already know the brand (null: not judged yet). Optional while an older\n // ad-dna does not send them.\n funnel_stage: z.string().nullable().optional(),\n advertiser_size: z.string().nullable().optional(),\n presumes_brand_knowledge: z.boolean().nullable().optional(),\n brand_knowledge_reason: z.string().nullable().optional(),\n target_persona: z.string().nullable(),\n hook_archetype: z.string().nullable(),\n // The proven hook pattern (`winning-ads hooks` seed) the free-text\n // `hook_archetype` matches: the value two ads can share. Optional while an\n // older ad-dna does not send it.\n hook_seed: z.string().nullable().optional(),\n creator_type: z.string().nullable(),\n industry: z.string().nullable(),\n business_model: z.string().nullable(),\n // What the viewer sees, the static's container (comparison_table, …) and why\n // it works: pick a reference on its move, not on its angle label.\n visual: z.string().nullable(),\n container: z.string().nullable(),\n mechanism: z.string().nullable(),\n});\nexport type WinningAdDna = z.infer<typeof winningAdDnaSchema>;\n\n/** The \"why it ranked\" breakdown — present only when include=score_breakdown. */\nexport const winningAdScoreBreakdownSchema = z.object({\n relevance: z.number().nullable(),\n judge_reason: z.string().nullable(),\n winner_score: z.number().nullable(),\n final_score: z.number().nullable(),\n});\nexport type WinningAdScoreBreakdown = z.infer<typeof winningAdScoreBreakdownSchema>;\n\n/** One winner card. Search returns one row per *creative family*. */\nexport const winningAdSchema = z.object({\n ad_id: z.string().nullable(),\n advertiser_id: z.string().nullable(),\n advertiser: z.string().nullable(),\n platform: z.string().nullable(),\n format: z.string().nullable(),\n media_url: z.string().nullable(),\n media_kind: z.string().nullable(),\n thumbnail_url: z.string().nullable(),\n // Query match ∈ [0,1]; null on pure winner browse (no query).\n relevance: z.number().nullable(),\n // How proven in-market (global creative strength).\n winner_score: z.number().nullable(),\n winner_category: z.string().nullable(),\n // The score ad-dna ranked the result by (relevance blended with winner\n // score, or the winner score on a browse). Search results only.\n final_score: z.number().nullable().optional(),\n days_active: z.number().nullable(),\n reach: z.number().nullable(),\n // Null when the brand hasn't been checked recently enough to say.\n active: z.boolean().nullable(),\n // When the brand's ads were last checked: the date `active` was observed.\n active_checked_at: z.string().nullable(),\n // Creative family grouping (search dedups launches into one card).\n creative_id: z.string().nullable(),\n family_id: z.string().nullable(),\n member_count: z.number().nullable(),\n sibling_ad_ids: z.array(z.string()),\n dna: winningAdDnaSchema,\n score_breakdown: winningAdScoreBreakdownSchema.nullable(),\n});\nexport type WinningAd = z.infer<typeof winningAdSchema>;\n\n// `value` is the token the filter matches on (a cluster id, or the raw text\n// when a value has no cluster). `label` is the human-readable name to show;\n// absent when it's identical to `value`.\nexport const facetCountSchema = z.object({ value: z.string(), label: z.string().optional(), count: z.number() });\nexport type FacetCount = z.infer<typeof facetCountSchema>;\n\nexport const winnersFacetsSchema = z.object({\n industry: z.array(facetCountSchema),\n creator_type: z.array(facetCountSchema),\n winner_category: z.array(facetCountSchema),\n format: z.array(facetCountSchema),\n business_model: z.array(facetCountSchema),\n});\nexport type WinnersFacets = z.infer<typeof winnersFacetsSchema>;\n\nexport const winnersSearchResponseSchema = z.object({\n results: z.array(winningAdSchema),\n facets: winnersFacetsSchema.nullable(),\n pool_size: z.number().nullable(),\n // Bucketed confidence of the top match; null on pure browse.\n match_confidence: z.enum([\"high\", \"medium\", \"low\"]).nullable(),\n below_floor_count: z.number().nullable(),\n query_id: z.string().nullable(),\n // Pagination window for infinite scroll. `offset` echoes the request; `total`\n // is how many winners this query+filters can scroll through; `has_more` is\n // true when more pages exist. Null on an older ad-dna that predates paging —\n // the dashboard then falls back to a single non-paged page.\n offset: z.number().nullable(),\n total: z.number().nullable(),\n has_more: z.boolean().nullable(),\n // Ads the corpus holds for each requested `country`; null when the search did\n // not filter by country. Tells \"no winners matched\" apart from \"unsupported\"\n // (an unknown code is refused outright).\n country_coverage: z.array(z.object({ code: z.string(), ads: z.number() })).nullable(),\n});\nexport type WinnersSearchResponse = z.infer<typeof winnersSearchResponseSchema>;\n\n/** Where a scoped search result came from: a brand this company follows, or the shared library. */\nexport const winnerSourceSchema = z.enum([\"followed\", \"library\"]);\nexport type WinnerSource = z.infer<typeof winnerSourceSchema>;\n\n/**\n * What Baker knows about a reference beyond the library: how many companies\n * turned it into a creative that reached their Workspace, whether this company\n * already did (such results are listed last), and how the creatives adapted\n * from it were judged: `approved` and `rejected` count the review verdicts\n * across every company's creatives with this source ad, counts only.\n */\nexport const referenceUsesSchema = z.object({\n companies: z.number(),\n ours: z.boolean(),\n approved: z.number(),\n rejected: z.number(),\n});\nexport type ReferenceUses = z.infer<typeof referenceUsesSchema>;\n\nexport const scopedWinningAdSchema = winningAdSchema.extend({\n source: winnerSourceSchema,\n baker_uses: referenceUsesSchema.optional(),\n});\nexport type ScopedWinningAd = z.infer<typeof scopedWinningAdSchema>;\n\nexport const scopedWinnersSearchResponseSchema = winnersSearchResponseSchema.extend({\n results: z.array(scopedWinningAdSchema),\n scope: winnerSearchScopeSchema,\n // How many brands the company follows; 0 means `followed` answers empty and\n // `followed-first` is the whole library.\n following_count: z.number(),\n});\nexport type ScopedWinnersSearchResponse = z.infer<typeof scopedWinnersSearchResponseSchema>;\n\n// ---------------------------------------------------------------------------\n// Advertisers (corpus) — `/api/ad-library/advertisers`\n// ---------------------------------------------------------------------------\n\nexport const advertiserPlatformSchema = z.object({\n platform: z.string(),\n external_id: z.string().nullable(),\n region: z.string().nullable(),\n});\nexport type AdvertiserPlatform = z.infer<typeof advertiserPlatformSchema>;\n\n/** A brand as it exists in the shared ad-dna corpus. */\nexport const corpusAdvertiserSchema = z.object({\n advertiser_id: z.string(),\n label: z.string().nullable(),\n scraped_name: z.string().nullable(),\n image_url: z.string().nullable(),\n platforms: z.array(advertiserPlatformSchema),\n platform_count: z.number().nullable(),\n family_count: z.number().nullable(),\n active_ad_count: z.number().nullable(),\n total_ad_count: z.number().nullable(),\n total_reach: z.number().nullable(),\n last_synced_at: z.string().nullable(),\n});\nexport type CorpusAdvertiser = z.infer<typeof corpusAdvertiserSchema>;\n\nexport const advertiserSearchRequestSchema = z.object({\n q: z.string().optional(),\n platform: adLibraryPlatformSchema.optional(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n});\nexport type AdvertiserSearchRequest = z.infer<typeof advertiserSearchRequestSchema>;\n\nexport const advertiserSearchResponseSchema = z.object({\n advertisers: z.array(corpusAdvertiserSchema),\n total: z.number().nullable(),\n});\nexport type AdvertiserSearchResponse = z.infer<typeof advertiserSearchResponseSchema>;\n\n/** Convergence: is the brand still exploring angles or has it converged? */\nexport const advertiserConvergenceSchema = z.object({\n convergence_state: z.string().nullable(),\n dimension_summary: z.unknown().nullable(),\n iteration_velocity_30d: z.number().nullable(),\n last_refresh_completed_at: z.string().nullable(),\n});\nexport type AdvertiserConvergence = z.infer<typeof advertiserConvergenceSchema>;\n\n// ---------------------------------------------------------------------------\n// Resolve + preview — turn a domain / URL / brand into a platform identity\n// ---------------------------------------------------------------------------\n\n/** The confirmation-modal card: who we resolved + the id we'd ingest. */\nexport const resolvePreviewSchema = z.object({\n platform: adLibraryPlatformSchema,\n external_id: z.string(),\n name: z.string(),\n image_url: z.string().nullable(),\n category: z.string().nullable(),\n industry: z.string().nullable(),\n website: z.string().nullable(),\n followers: z.number().nullable(),\n});\nexport type ResolvePreview = z.infer<typeof resolvePreviewSchema>;\n\n// ---------------------------------------------------------------------------\n// Followed advertisers (Baker-side subscriptions)\n// ---------------------------------------------------------------------------\n\n/**\n * `discovering` = still enumerating the brand's ads upstream.\n * `ingesting` = enumeration done, the ads it found are still being processed.\n * `ready` = there is something to look at.\n *\n * The middle state exists because enumeration finishes long before the ads it\n * queued actually land. Without it a brand with a thousand pending ads reported\n * a confident zero the moment its spinner stopped.\n */\nexport const followedStatusSchema = z.enum([\"discovering\", \"ingesting\", \"ready\"]);\nexport type FollowedStatus = z.infer<typeof followedStatusSchema>;\n\nexport const followedAdvertiserSchema = z.object({\n // Baker subscription row id (used to unfollow).\n followed_id: z.string(),\n advertiser_id: z.string(),\n label: z.string(),\n image_url: z.string().nullable(),\n platforms: z.array(z.object({ platform: adLibraryPlatformSchema, external_id: z.string() })),\n status: followedStatusSchema,\n active_ad_count: z.number().nullable(),\n total_ad_count: z.number().nullable(),\n family_count: z.number().nullable(),\n // Progress while status is \"discovering\" or \"ingesting\". `adding_ingested`\n // and `adding_enqueued` are both counts for the CURRENT run, so they read as\n // a fraction; `total_ad_count` is the brand's whole corpus and is not.\n adding_discovered: z.number().nullable(),\n adding_enqueued: z.number().nullable(),\n adding_ingested: z.number().nullable(),\n // A discovery job ended in failure, so this brand's ads are under-counted.\n // Distinguishes \"we couldn't finish looking\" from \"this brand runs no ads\".\n discovery_failed: z.boolean().nullable(),\n});\nexport type FollowedAdvertiser = z.infer<typeof followedAdvertiserSchema>;\n\nexport const followingListResponseSchema = z.object({\n following: z.array(followedAdvertiserSchema),\n});\nexport type FollowingListResponse = z.infer<typeof followingListResponseSchema>;\n\n// --- Follow (composite: search-first → subscribe, else resolve + enqueue) ---\n\nexport const followRequestSchema = z.object({\n input: z.string().min(1),\n platform: adLibraryPlatformSchema,\n // Optional override for the display label; defaults to the resolved name.\n label: z.string().optional(),\n});\nexport type FollowRequest = z.infer<typeof followRequestSchema>;\n\nexport const followResponseSchema = z.object({\n // \"following\" = subscribed to an advertiser already in the corpus (no\n // ingestion). \"added\" = a new advertiser was enqueued for discovery.\n // \"ambiguous\" = the identity mapped to multiple corpus advertisers; the\n // caller must pick one of `candidates`.\n status: z.enum([\"following\", \"added\", \"ambiguous\"]),\n advertiser: followedAdvertiserSchema.nullable(),\n preview: resolvePreviewSchema.nullable(),\n candidates: z.array(corpusAdvertiserSchema).nullable(),\n});\nexport type FollowResponse = z.infer<typeof followResponseSchema>;\n\n// --- Batch follow (add many brands at once, e.g. every competitor domain) ---\n\n// Cap the batch so one call can't fan out into an unbounded number of paid\n// resolve lookups + ad-dna adds. A competitor set is ~7-20 brands in practice.\nexport const FOLLOW_BATCH_MAX = 50;\n\nexport const followBatchRequestSchema = z.object({\n // One entry per brand — a domain (best; resolves both Meta + LinkedIn), a\n // profile / ad-library URL, or a brand name.\n inputs: z.array(z.string().min(1)).min(1).max(FOLLOW_BATCH_MAX),\n // How to read every input (not a tracking limit — a domain still resolves\n // every platform we can). Defaults to reading inputs as Meta identities.\n platform: adLibraryPlatformSchema.default(\"meta\"),\n});\nexport type FollowBatchRequest = z.infer<typeof followBatchRequestSchema>;\n\nexport const followBatchResultSchema = z.object({\n // Echoes the input so the caller can line results up with what it sent.\n input: z.string(),\n // \"following\"/\"added\" mirror the single-follow statuses; \"ambiguous\" needs a\n // manual pick; \"failed\" = we couldn't resolve or add it (see `error`).\n status: z.enum([\"following\", \"added\", \"ambiguous\", \"failed\"]),\n advertiser: followedAdvertiserSchema.nullable(),\n // Present only when status is \"failed\" — a plain-language reason.\n error: z.string().nullable(),\n});\nexport type FollowBatchResult = z.infer<typeof followBatchResultSchema>;\n\nexport const followBatchResponseSchema = z.object({\n results: z.array(followBatchResultSchema),\n // Rollup counts across the batch for a one-glance summary.\n followed_count: z.number(),\n added_count: z.number(),\n ambiguous_count: z.number(),\n failed_count: z.number(),\n});\nexport type FollowBatchResponse = z.infer<typeof followBatchResponseSchema>;\n\nexport const unfollowRequestSchema = z.object({\n // Accept either the Baker subscription id or the corpus advertiser id.\n followed_id: z.string().optional(),\n advertiser_id: z.string().optional(),\n});\nexport type UnfollowRequest = z.infer<typeof unfollowRequestSchema>;\n\nexport const unfollowResponseSchema = z.object({ removed: z.boolean() });\nexport type UnfollowResponse = z.infer<typeof unfollowResponseSchema>;\n\n// --- Winners for one advertiser ---\n\nexport const advertiserWinnersResponseSchema = z.object({\n advertiser_id: z.string(),\n winners: z.array(winningAdSchema),\n});\nexport type AdvertiserWinnersResponse = z.infer<typeof advertiserWinnersResponseSchema>;\n\n// --- Feed: winners across every followed advertiser (browse + trim) ---\n\nexport const feedRequestSchema = z.object({\n // Optional subset of your followed advertiser ids to narrow to (\"trim down\n // per advertiser\"). Ids you don't follow are ignored and echoed back in\n // `unknown_requested`. Omit to browse winners across every brand you follow.\n advertiser_ids: z.array(z.string()).optional(),\n platform: adLibraryPlatformSchema.optional(),\n winner_category: z.array(z.string()).optional(),\n format: z.array(z.string()).optional(),\n // Winners kept per advertiser so no single brand floods the feed. `0` = no\n // cap. Default applied by the route.\n per_advertiser: z.number().int().min(0).max(50).optional(),\n // Total winners returned across all followed advertisers.\n limit: z.number().int().min(1).max(200).optional(),\n});\nexport type FeedRequest = z.infer<typeof feedRequestSchema>;\n\nexport const feedResponseSchema = z.object({\n // The feed only ever reads followed brands, so every winner is `followed`:\n // the same `source` a scoped search carries, so the surfaces agree.\n winners: z.array(winningAdSchema.extend({ source: winnerSourceSchema })),\n // How many brands the company follows (regardless of the trim).\n following_count: z.number(),\n // The advertiser ids actually queried (follows ∩ requested subset).\n advertiser_ids: z.array(z.string()),\n // Requested ids that aren't followed — a hint the caller mistyped or hasn't\n // followed them yet.\n unknown_requested: z.array(z.string()),\n});\nexport type FeedResponse = z.infer<typeof feedResponseSchema>;\n\n// ---------------------------------------------------------------------------\n// Seed catalog — `/api/ad-library/seed-catalog`\n//\n// Reads ad-dna's corpus-wide `pattern_stats` rollup: the top winner-weighted\n// enum SEEDS for one taxonomy field (hook archetype, persuasion mechanism, or\n// static-ad format), optionally narrowed to a platform / awareness / industry\n// segment. Grounds a creative in a PROVEN pattern for the exact segment before\n// it grounds in a real reference.\n// ---------------------------------------------------------------------------\n\nexport const seedCatalogFieldSchema = z.enum([\"hook_archetype\", \"mechanism_type\", \"static_format_pattern\"]);\nexport type SeedCatalogField = z.infer<typeof seedCatalogFieldSchema>;\n\nexport const seedCatalogRequestSchema = z.object({\n field: seedCatalogFieldSchema,\n platform: z.string().optional(),\n awareness_stage: z.string().optional(),\n industry: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n});\nexport type SeedCatalogRequest = z.infer<typeof seedCatalogRequestSchema>;\n\nexport const patternSeedSchema = z.object({\n key: z.string(),\n count: z.number(),\n sum_winner_score: z.number(),\n mean_winner_score: z.number(),\n winner_share: z.number(),\n // How the seed did inside the brands that used it, the order of the catalog:\n // the mean, over brands, of how much more often their creatives with the seed\n // ran 60 days than their others (0 until five brands have a verdict), and\n // how many brands it won and lost inside.\n lift: z.number(),\n brands_for: z.number(),\n brands_against: z.number(),\n // Per-segment counts (platform/awareness_stage/industry → value → n); present\n // only on `--full`, so the response can stay lean by default.\n breakdown_by: z.record(z.string(), z.unknown()).nullable(),\n});\nexport type PatternSeed = z.infer<typeof patternSeedSchema>;\n\nexport const seedCatalogSegmentSchema = z.object({\n platform: z.string().nullable(),\n awareness_stage: z.string().nullable(),\n industry: z.string().nullable(),\n});\nexport type SeedCatalogSegment = z.infer<typeof seedCatalogSegmentSchema>;\n\nexport const seedCatalogResponseSchema = z.object({\n field: z.string(),\n segment: seedCatalogSegmentSchema.nullable(),\n patterns: z.array(patternSeedSchema),\n});\nexport type SeedCatalogResponse = z.infer<typeof seedCatalogResponseSchema>;\n\n// ---------------------------------------------------------------------------\n// Ad content — `/api/ad-library/ad-content`\n//\n// Per-ad drill-down for *reading what's inside* one winning creative: the spoken\n// transcript, the on-screen text, the ad copy, and (with --full) the speech,\n// pacing, and soundtrack detail. `search`/`winners`/`feed` return a lean\n// shortlist to pick from; this is the deliberate \"open this one and understand\n// it\" step, keyed by the `ad_id` those surfaces return. Sourced from ad-dna\n// `GET /v1/ads/:id`, which returns the whole `full_dna`; the backend client\n// projects it down to this lean shape (transcript/overlays live only there).\n// ---------------------------------------------------------------------------\n\nexport const adContentRequestSchema = z.object({\n ad_id: z.string().min(1),\n platform: adLibraryPlatformSchema.optional(),\n});\nexport type AdContentRequest = z.infer<typeof adContentRequestSchema>;\n\n/**\n * One piece of on-screen text: the words shown on the frame, when + where, and\n * the job they do (headline, benefit, cta…). A video overlay carries its time;\n * a static ad's in-image text has none; a carousel card's text carries `card`.\n */\nexport const adContentOverlaySchema = z.object({\n text: z.string(),\n appears_at_s: z.number().nullable(),\n position: z.string().nullable(),\n role: z.string().nullable(),\n card: z.number().nullable(),\n});\nexport type AdContentOverlay = z.infer<typeof adContentOverlaySchema>;\n\n/** Voiceover detail — how the ad speaks, not just what it says. --full only. */\nexport const adContentSpeechSchema = z.object({\n speech_pct_of_runtime: z.number().nullable(),\n speaker_count: z.number().nullable(),\n voiceover_vs_sync: z.string().nullable(),\n is_direct_address: z.boolean().nullable(),\n speech_emotion_dominant: z.string().nullable(),\n});\nexport type AdContentSpeech = z.infer<typeof adContentSpeechSchema>;\n\n/** Shot pacing + key timeline moments. --full only. */\nexport const adContentPacingSchema = z.object({\n scene_count: z.number().nullable(),\n avg_shot_length_s: z.number().nullable(),\n pacing_shape: z.string().nullable(),\n hook_ends_at_s: z.number().nullable(),\n cta_first_shown_at_s: z.number().nullable(),\n product_first_appears_at_s: z.number().nullable(),\n});\nexport type AdContentPacing = z.infer<typeof adContentPacingSchema>;\n\n/** Recognised soundtrack (AudD), when matched. --full only. */\nexport const adContentMusicSchema = z.object({\n track_title: z.string().nullable(),\n track_artist: z.string().nullable(),\n});\nexport type AdContentMusic = z.infer<typeof adContentMusicSchema>;\n\n/**\n * How a static ad (or carousel) is built: what to reproduce when it is the\n * reference: its container, composition, colours, the CTA drawn into it and the\n * attention markers on it. A carousel is read from its first card and has no\n * `format_pattern`. Video ads fill only the format-neutral fields.\n */\nexport const adContentLayoutSchema = z.object({\n format_pattern: z.string().nullable(),\n composition: z.string().nullable(),\n focal_subject: z.string().nullable(),\n aspect_ratio: z.string().nullable(),\n background: z.string().nullable(),\n palette_mood: z.string().nullable(),\n colors: z.array(z.string()),\n production: z.string().nullable(),\n aesthetic: z.array(z.string()),\n cta_in_image: z.string().nullable(),\n markers: z.array(z.string()),\n card_roles: z.array(z.string()),\n});\nexport type AdContentLayout = z.infer<typeof adContentLayoutSchema>;\n\n/** The persuasion an ad carries: who it speaks to and how it convinces them. */\nexport const adContentMessageSchema = z.object({\n awareness_stage: z.string().nullable(),\n sophistication: z.string().nullable(),\n mechanism: z.string().nullable(),\n pain_points: z.array(z.string()),\n desires: z.array(z.string()),\n value_props: z.array(z.string()),\n objections_handled: z.array(z.string()),\n proof: z.array(z.string()),\n risk_reversal: z.array(z.string()),\n});\nexport type AdContentMessage = z.infer<typeof adContentMessageSchema>;\n\n/**\n * The offer the ad makes. The extractor fills absent parts with \"none\" / \"n_a\";\n * those arrive as null or empty, so a filled field is always a real finding.\n */\nexport const adContentOfferSchema = z.object({\n offer_type: z.string().nullable(),\n pricing_model: z.string().nullable(),\n entry_price: z.string().nullable(),\n no_credit_card: z.boolean().nullable(),\n guarantee: z.array(z.string()),\n guarantee_days: z.number().nullable(),\n urgency: z.string().nullable(),\n bonus: z.string().nullable(),\n});\nexport type AdContentOffer = z.infer<typeof adContentOfferSchema>;\n\n/**\n * The readable content of one ad. `transcript`, `has_speech`, `speech`, `pacing`,\n * and `music` describe a *video*; they're null/empty for a static or carousel ad.\n * `on_screen_text` holds a video's timed overlays, or the text drawn into a\n * static or carousel image. The copy fields (`primary_text`, `headline`, `cta`)\n * apply to every format.\n */\nexport const adContentSchema = z.object({\n ad_id: z.string().nullable(),\n advertiser: z.string().nullable(),\n advertiser_id: z.string().nullable(),\n platform: z.string().nullable(),\n format: z.string().nullable(),\n media_kind: z.string().nullable(),\n media_url: z.string().nullable(),\n winner_score: z.number().nullable(),\n winner_category: z.string().nullable(),\n summary: z.string().nullable(),\n angle: z.string().nullable(),\n hook_archetype: z.string().nullable(),\n // Spoken words (video only; null when the ad has no speech track).\n transcript: z.string().nullable(),\n has_speech: z.boolean().nullable(),\n speech: adContentSpeechSchema,\n // On-screen text / captions.\n has_captions: z.boolean().nullable(),\n caption_style: z.string().nullable(),\n on_screen_text: z.array(adContentOverlaySchema),\n // Copy the viewer reads outside the media.\n primary_text: z.string().nullable(),\n headline: z.string().nullable(),\n cta: z.string().nullable(),\n // Structure + soundtrack.\n pacing: adContentPacingSchema,\n music: adContentMusicSchema,\n layout: adContentLayoutSchema,\n message: adContentMessageSchema,\n offer: adContentOfferSchema,\n});\nexport type AdContent = z.infer<typeof adContentSchema>;\n\nexport const adContentResponseSchema = z.object({ ad: adContentSchema });\nexport type AdContentResponse = z.infer<typeof adContentResponseSchema>;\n\n// ---------------------------------------------------------------------------\n// Ad DNA detail — the dashboard's reference-ad panel only.\n//\n// Everything in one ad's `full_dna` that `AdContent` does not already carry:\n// the colours with their share of the frame, the video's story beat by beat,\n// each carousel card, where it ran and to whom, and every other extracted\n// trait grouped by what it describes. Not on the CLI: the agent reads the lean\n// `AdContent`, and this is the depth a person browses.\n// ---------------------------------------------------------------------------\n\n/** One colour of the ad and the share of the frame it covers (0–1). */\nexport const adDnaColorSchema = z.object({\n hex: z.string(),\n share: z.number().nullable(),\n});\nexport type AdDnaColor = z.infer<typeof adDnaColorSchema>;\n\n/** One beat of a video as the watch saw and heard it, in order. */\nexport const adDnaSceneSchema = z.object({\n start_s: z.number(),\n end_s: z.number(),\n role: z.string().nullable(),\n visual: z.string(),\n speech: z.string().nullable(),\n on_screen_text: z.string().nullable(),\n sound: z.string().nullable(),\n});\nexport type AdDnaScene = z.infer<typeof adDnaSceneSchema>;\n\n/** A moment on a video's timeline: when the hook ends, the product, price or CTA first shows, the logo. */\nexport const adDnaMomentSchema = z.object({\n kind: z.enum([\"hook_ends\", \"product\", \"price\", \"cta\", \"logo\"]),\n at_s: z.number(),\n});\nexport type AdDnaMoment = z.infer<typeof adDnaMomentSchema>;\n\nexport const adDnaStorySchema = z.object({\n duration_s: z.number().nullable(),\n summary: z.string().nullable(),\n hook: z.string().nullable(),\n scenes: z.array(adDnaSceneSchema),\n moments: z.array(adDnaMomentSchema),\n});\nexport type AdDnaStory = z.infer<typeof adDnaStorySchema>;\n\n/** One carousel card: its job in the sequence, how it is laid out and coloured, and how it leads on. */\nexport const adDnaCardSchema = z.object({\n index: z.number(),\n role: z.string().nullable(),\n layout: z.string().nullable(),\n colors: z.array(adDnaColorSchema),\n open_loop: z.string().nullable(),\n transition: z.string().nullable(),\n});\nexport type AdDnaCard = z.infer<typeof adDnaCardSchema>;\n\n/** People reached in one age band (Meta's EU transparency breakdown, summed over countries). */\nexport const adDnaAgeReachSchema = z.object({\n age_range: z.string(),\n female: z.number(),\n male: z.number(),\n unknown: z.number(),\n});\nexport type AdDnaAgeReach = z.infer<typeof adDnaAgeReachSchema>;\n\n/** Where the ad ran and who saw it, as the platform discloses it. */\nexport const adDnaReachSchema = z.object({\n total: z.number().nullable(),\n eu_total: z.number().nullable(),\n ages: z.object({ min: z.number(), max: z.number() }).nullable(),\n gender: z.string().nullable(),\n locations: z.array(z.string()),\n excluded_locations: z.array(z.string()),\n channels: z.array(z.string()),\n by_age: z.array(adDnaAgeReachSchema),\n});\nexport type AdDnaReach = z.infer<typeof adDnaReachSchema>;\n\n/** One extracted trait. `key` is the DNA field name; a yes/no trait is kept only when true. */\nexport const adDnaTraitSchema = z.object({\n key: z.string(),\n value: z.union([z.string(), z.number(), z.boolean(), z.array(z.string())]),\n});\nexport type AdDnaTrait = z.infer<typeof adDnaTraitSchema>;\n\nexport const adDnaTraitGroupKeySchema = z.enum([\n \"audience\",\n \"business\",\n \"message\",\n \"copy\",\n \"look\",\n \"cast\",\n \"pacing\",\n \"sound\",\n \"on_screen_text\",\n \"branding\",\n \"subject\",\n \"cta_visual\",\n \"markers\",\n \"carousel\",\n \"offer\",\n \"delivery\",\n]);\nexport type AdDnaTraitGroupKey = z.infer<typeof adDnaTraitGroupKeySchema>;\n\nexport const adDnaTraitGroupSchema = z.object({\n key: adDnaTraitGroupKeySchema,\n traits: z.array(adDnaTraitSchema),\n});\nexport type AdDnaTraitGroup = z.infer<typeof adDnaTraitGroupSchema>;\n\nexport const adDnaDetailSchema = z.object({\n palette: z.array(adDnaColorSchema),\n background_hex: z.string().nullable(),\n button_hex: z.string().nullable(),\n story: adDnaStorySchema.nullable(),\n cards: z.array(adDnaCardSchema),\n reach: adDnaReachSchema.nullable(),\n groups: z.array(adDnaTraitGroupSchema),\n extracted_at: z.string().nullable(),\n});\nexport type AdDnaDetail = z.infer<typeof adDnaDetailSchema>;\n\n/** One stored carousel card's media: `index` from 0, matching the DNA's `card_index`. */\nexport const adCardMediaSchema = z.object({\n index: z.number(),\n url: z.string(),\n kind: z.enum([\"image\", \"video\"]).nullable(),\n});\nexport type AdCardMedia = z.infer<typeof adCardMediaSchema>;\n\n/**\n * What the reference-ad panel loads when an ad opens: its readable content, the\n * rest of its DNA, and every carousel card's media (empty for other formats and\n * for carousels whose other cards were never stored — they show their first).\n */\nexport const adDetailSchema = z.object({\n content: adContentSchema,\n dna: adDnaDetailSchema,\n card_media: z.array(adCardMediaSchema),\n});\nexport type AdDetail = z.infer<typeof adDetailSchema>;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../api/src/ad-library/wire.ts"],"sourcesContent":["/**\n * Wire contract for `/api/ad-library/*` — the Baker-side surface over the ad-dna\n * \"winners\" service (`apps/ad-dna-service`, ads.withbaker.com).\n *\n * Two kinds of schema live here:\n * - **Request** schemas are strict: they validate CLI/dashboard input at the\n * backend boundary (`schema.parse(...)`).\n * - **Lean response** schemas describe the shape *our* routes/actions emit. The\n * raw ad-dna envelope is large and occasionally messy, so the backend client\n * coerces it into these lean shapes by hand (see `adLibrary/client.ts`); the\n * schemas are the contract the CLI + dashboard bind to, not a parser for the\n * upstream payload.\n *\n * Pure + zod-only (no `convex` import), like the rest of `@baker/api`.\n */\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Platforms. The ad-dna corpus has a discovery connector per platform, so the\n// surfaces we expose are limited to the ones with a connector. (Result rows may\n// still carry a legacy platform string from older data, so result `platform`\n// stays a plain string; only *inputs* are constrained.)\n// ---------------------------------------------------------------------------\n\nexport const adLibraryPlatformSchema = z.enum([\"meta\", \"linkedin\", \"tiktok\"]);\nexport type AdLibraryPlatform = z.infer<typeof adLibraryPlatformSchema>;\n\n/**\n * Whether a corpus row's platform is one Baker can follow. Corpus rows carry a\n * free-text platform (legacy data, and platforms the DNA schema knows about\n * before a connector exists), so a membership test — not a cast — is what\n * decides which of an advertiser's platform identities we subscribe to.\n */\nexport function isFollowablePlatform(platform: string | null | undefined): platform is AdLibraryPlatform {\n return adLibraryPlatformSchema.safeParse(platform).success;\n}\n\n// ---------------------------------------------------------------------------\n// Winner search — `/api/ad-library/winners/search`\n// ---------------------------------------------------------------------------\n\nexport const winnersHardFiltersSchema = z.object({\n platform: z.array(z.string()).optional(),\n format: z.array(z.string()).optional(),\n winner_category: z.array(z.string()).optional(),\n awareness_stage: z.array(z.string()).optional(),\n country: z.array(z.string()).optional(),\n language: z.array(z.string()).optional(),\n advertiser_ids: z.array(z.string()).optional(),\n exclude_advertiser_ids: z.array(z.string()).optional(),\n industry_cluster_ids: z.array(z.string()).optional(),\n business_model_cluster_ids: z.array(z.string()).optional(),\n // Proven HOOK seeds (from the `/api/ad-library/seed-catalog` rollup) — narrows\n // a find-similar search to ads on a chosen winning hook pattern, no cluster\n // lookup. Forwarded verbatim to ad-dna's `hard_filters.hook_archetype_seeds`;\n // must live in this schema or the strict boundary parse would drop it.\n hook_archetype_seeds: z.array(z.string()).optional(),\n // A static's container (comparison_table, before_after_split, …), the values\n // `/api/ad-library/seed-catalog` ranks as formats: the best proven example of\n // a container whatever category it sells.\n static_format_patterns: z.array(z.string()).optional(),\n // Who the ad was made for, as the library judged it from the creative: pick\n // references whose audience matches ours (a cold brief, cold references).\n audience_temperature: z.array(z.string()).optional(),\n funnel_stage: z.array(z.string()).optional(),\n advertiser_size: z.array(z.string()).optional(),\n // `false` drops the ads known to work only on viewers who already know the\n // brand (an ad not judged yet is kept); `true` keeps only those.\n presumes_brand_knowledge: z.boolean().optional(),\n first_seen_after: z.string().optional(),\n first_seen_before: z.string().optional(),\n});\nexport type WinnersHardFilters = z.infer<typeof winnersHardFiltersSchema>;\n\n/**\n * A first-seen bound as ad-dna requires it (an ISO datetime in UTC). A bare\n * date reads as the start of that day; an offset is converted to UTC.\n */\nconst firstSeenBoundSchema = z\n .union([z.iso.date(), z.iso.datetime({ offset: true })], {\n error: \"first_seen_after/first_seen_before must be an ISO date (2026-01-01) or datetime (2026-01-01T00:00:00Z)\",\n })\n .transform((value) => new Date(value.length === 10 ? `${value}T00:00:00Z` : value).toISOString());\n\n// ad-dna's closed vocabularies for the search filters, mirrored here so a typo\n// is refused with the valid values before a paid search. Sources:\n// apps/ad-dna-service/src/schema/enums.ts (format, winner category, awareness\n// stage) and packages/ad-dna/src/schema/enums.ts (`staticFormatPatternEnum`,\n// and the stored audience temperature, funnel stage and advertiser size).\n// Platform is the connector set above, not every platform the DNA knows.\nexport const adFormatSchema = z.enum([\"video\", \"static\", \"carousel\"]);\nexport const winnerCategorySchema = z.enum([\n \"winner\",\n \"grand_slam_winner\",\n \"scaled_winner\",\n \"low_profile_winner\",\n \"rising\",\n \"evergreen\",\n \"low_traction_dud\",\n \"thrash_iteration\",\n \"thrash_family\",\n \"false_winner\",\n \"untested\",\n \"dud\",\n]);\nexport const awarenessStageSchema = z.enum([\n \"unaware\",\n \"problem_aware\",\n \"solution_aware\",\n \"product_aware\",\n \"most_aware\",\n]);\nexport const audienceTemperatureSchema = z.enum([\"0_cold\", \"1_warm_engaged\", \"2_hot_visited\", \"3_customer\"]);\nexport const funnelStageSchema = z.enum([\"TOF\", \"MOF\", \"BOF\"]);\nexport const advertiserSizeSchema = z.enum([\"solo\", \"smb\", \"mid\", \"enterprise\"]);\nexport const staticFormatPatternSchema = z.enum([\n \"clean_product\",\n \"lifestyle_photo\",\n \"headline_card\",\n \"infographic\",\n \"chat_screenshot\",\n \"tweet_screenshot\",\n \"review_screenshot\",\n \"before_after_split\",\n \"comparison_table\",\n \"list_card\",\n \"meme_template\",\n \"native_post_lookalike\",\n \"stock_photo_overlay\",\n \"founder_portrait\",\n \"testimonial_quote\",\n \"packshot_minimalist\",\n \"four_panel_lifestyle_grid\",\n \"two_panel_split\",\n \"notes_app_screenshot\",\n \"founder_letter_textonly\",\n \"us_vs_them_grid\",\n \"benefit_callout_grid\",\n \"create_your_own_adventure_meme\",\n \"quad_split\",\n \"stories_style_casual_static\",\n]);\n\n/** The filters as a caller's input is checked where it enters Baker, before a paid search. */\nconst validatedHardFiltersSchema = winnersHardFiltersSchema.extend({\n platform: z.array(adLibraryPlatformSchema).optional(),\n format: z.array(adFormatSchema).optional(),\n winner_category: z.array(winnerCategorySchema).optional(),\n awareness_stage: z.array(awarenessStageSchema).optional(),\n static_format_patterns: z.array(staticFormatPatternSchema).optional(),\n audience_temperature: z.array(audienceTemperatureSchema).optional(),\n funnel_stage: z.array(funnelStageSchema).optional(),\n advertiser_size: z.array(advertiserSizeSchema).optional(),\n first_seen_after: firstSeenBoundSchema.optional(),\n first_seen_before: firstSeenBoundSchema.optional(),\n});\n\nexport const winnersSortSchema = z.enum([\"winner\", \"longest_running\", \"newest\"]);\nexport type WinnersSort = z.infer<typeof winnersSortSchema>;\n\nconst winnersSearchFields = z.object({\n free_text_query: z.string().max(500).optional(),\n ref_ad_id: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n // Pagination offset for infinite scroll. The browse view (no query) scrolls\n // the whole library; a text/similar search scrolls its bounded ranked pool.\n offset: z.number().int().min(0).optional(),\n // Per-advertiser cap: past it a brand's ads are dropped. `0` = no cap (the\n // library browse view sends it so a facet-filtered slice shows every winner\n // and matches the facet-rail count); omit it to spread the brands instead,\n // three each at the top and none dropped.\n max_per_advertiser: z.number().int().min(0).max(50).optional(),\n // ad-dna reads one advertiser in `advertiser_ids` as browsing that brand, and\n // keeps its measured failures. `false` keeps it a reference search: what\n // Baker sends when it narrowed to the company's followed brands itself.\n brand_browse: z.boolean().optional(),\n min_relevance: z.number().min(0).max(1).optional(),\n // One page picked for variety (different brands, containers and hooks)\n // instead of rank order: a reference set for N concepts. Ignores offset.\n diverse: z.boolean().optional(),\n // The order of a browse (no query): by winner score (default), by how long\n // the ad has run, or by when it was first seen. A query ranks by relevance\n // blended with winner score, so `sort` only means something without one.\n sort: winnersSortSchema.optional(),\n hard_filters: winnersHardFiltersSchema.optional(),\n // `score_breakdown` surfaces the \"why it ranked\" panel; facets drive the\n // filter rail. thumbnails/full_dna_url are opt-in extras.\n include: z.array(z.enum([\"score_breakdown\", \"facets\", \"full_dna_url\", \"thumbnails\"])).optional(),\n});\n\nconst hasSearchInput = (b: { free_text_query?: string; ref_ad_id?: string; hard_filters?: unknown }): boolean =>\n b.free_text_query !== undefined || b.ref_ad_id !== undefined || b.hard_filters !== undefined;\nconst SEARCH_INPUT_MESSAGE = \"Provide free_text_query, ref_ad_id, or hard_filters\";\n\n/** The request ad-dna's `/v1/search` answers, forwarded verbatim. */\nexport type WinnersSearchRequest = z.infer<typeof winnersSearchFields>;\n\n/**\n * Which brands a reference search draws from. The corpus is shared by every\n * Baker company, so `all` can surface a brand some other client follows.\n * - `followed-first` (default): followed brands first, topped up from the\n * whole library when fewer than `limit` of them clear the relevance floor.\n * A company that follows nobody gets the whole library, as `all` would.\n * - `followed`: only brands this company follows.\n * - `all`: the whole library.\n */\nexport const winnerSearchScopeSchema = z.enum([\"all\", \"followed\", \"followed-first\"]);\nexport type WinnerSearchScope = z.infer<typeof winnerSearchScopeSchema>;\n\n/** `/api/ad-library/winners/search`: the ad-dna request plus a scope Baker resolves from the API key's company. */\nexport const scopedWinnersSearchRequestSchema = winnersSearchFields\n .extend({\n scope: winnerSearchScopeSchema.default(\"followed-first\"),\n hard_filters: validatedHardFiltersSchema.optional(),\n })\n .refine(hasSearchInput, { message: SEARCH_INPUT_MESSAGE })\n // Paging a merged two-phase answer has no stable meaning: page 2 of \"followed\n // first\" depends on how many followed ads page 1 happened to hold.\n .refine((b) => b.scope !== \"followed-first\" || !b.offset, {\n message: \"offset is not supported with scope followed-first; raise limit instead\",\n });\nexport type ScopedWinnersSearchRequest = z.infer<typeof scopedWinnersSearchRequestSchema>;\n\n/** DNA \"why it works\" summary — every field nullable (ad-dna omits freely). */\nexport const winningAdDnaSchema = z.object({\n creative_concept: z.string().nullable(),\n angle: z.string().nullable(),\n awareness_stage: z.string().nullable(),\n // How many claims the ad's market has already heard (s1 first to say it … s5 tired of claims).\n // Optional while an older ad-dna does not send it.\n sophistication_stage: z.string().nullable().optional(),\n audience_temperature: z.string().nullable(),\n // Who else the ad was made for, and whether its copy only works on viewers who\n // already know the brand (null: not judged yet). Optional while an older\n // ad-dna does not send them.\n funnel_stage: z.string().nullable().optional(),\n advertiser_size: z.string().nullable().optional(),\n presumes_brand_knowledge: z.boolean().nullable().optional(),\n brand_knowledge_reason: z.string().nullable().optional(),\n target_persona: z.string().nullable(),\n hook_archetype: z.string().nullable(),\n // The proven hook pattern (`winning-ads hooks` seed) the free-text\n // `hook_archetype` matches: the value two ads can share. Optional while an\n // older ad-dna does not send it.\n hook_seed: z.string().nullable().optional(),\n creator_type: z.string().nullable(),\n industry: z.string().nullable(),\n business_model: z.string().nullable(),\n // What the viewer sees, the static's container (comparison_table, …) and why\n // it works: pick a reference on its move, not on its angle label.\n visual: z.string().nullable(),\n container: z.string().nullable(),\n mechanism: z.string().nullable(),\n});\nexport type WinningAdDna = z.infer<typeof winningAdDnaSchema>;\n\n/** The \"why it ranked\" breakdown — present only when include=score_breakdown. */\nexport const winningAdScoreBreakdownSchema = z.object({\n relevance: z.number().nullable(),\n judge_reason: z.string().nullable(),\n winner_score: z.number().nullable(),\n final_score: z.number().nullable(),\n});\nexport type WinningAdScoreBreakdown = z.infer<typeof winningAdScoreBreakdownSchema>;\n\n/** One winner card. Search returns one row per *creative family*. */\nexport const winningAdSchema = z.object({\n ad_id: z.string().nullable(),\n advertiser_id: z.string().nullable(),\n advertiser: z.string().nullable(),\n platform: z.string().nullable(),\n format: z.string().nullable(),\n media_url: z.string().nullable(),\n media_kind: z.string().nullable(),\n thumbnail_url: z.string().nullable(),\n // Query match ∈ [0,1]; null on pure winner browse (no query).\n relevance: z.number().nullable(),\n // How proven in-market (global creative strength).\n winner_score: z.number().nullable(),\n winner_category: z.string().nullable(),\n // The score ad-dna ranked the result by (relevance blended with winner\n // score, or the winner score on a browse). Search results only.\n final_score: z.number().nullable().optional(),\n days_active: z.number().nullable(),\n reach: z.number().nullable(),\n // Null when the brand hasn't been checked recently enough to say.\n active: z.boolean().nullable(),\n // When the brand's ads were last checked: the date `active` was observed.\n active_checked_at: z.string().nullable(),\n // Creative family grouping (search dedups launches into one card).\n creative_id: z.string().nullable(),\n family_id: z.string().nullable(),\n member_count: z.number().nullable(),\n sibling_ad_ids: z.array(z.string()),\n dna: winningAdDnaSchema,\n score_breakdown: winningAdScoreBreakdownSchema.nullable(),\n});\nexport type WinningAd = z.infer<typeof winningAdSchema>;\n\n// `value` is the token the filter matches on (a cluster id, or the raw text\n// when a value has no cluster). `label` is the human-readable name to show;\n// absent when it's identical to `value`.\nexport const facetCountSchema = z.object({ value: z.string(), label: z.string().optional(), count: z.number() });\nexport type FacetCount = z.infer<typeof facetCountSchema>;\n\nexport const winnersFacetsSchema = z.object({\n industry: z.array(facetCountSchema),\n creator_type: z.array(facetCountSchema),\n winner_category: z.array(facetCountSchema),\n format: z.array(facetCountSchema),\n business_model: z.array(facetCountSchema),\n});\nexport type WinnersFacets = z.infer<typeof winnersFacetsSchema>;\n\nexport const winnersSearchResponseSchema = z.object({\n results: z.array(winningAdSchema),\n facets: winnersFacetsSchema.nullable(),\n pool_size: z.number().nullable(),\n // Bucketed confidence of the top match; null on pure browse.\n match_confidence: z.enum([\"high\", \"medium\", \"low\"]).nullable(),\n below_floor_count: z.number().nullable(),\n query_id: z.string().nullable(),\n // Pagination window for infinite scroll. `offset` echoes the request; `total`\n // is how many winners this query+filters can scroll through; `has_more` is\n // true when more pages exist. Null on an older ad-dna that predates paging —\n // the dashboard then falls back to a single non-paged page.\n offset: z.number().nullable(),\n total: z.number().nullable(),\n has_more: z.boolean().nullable(),\n // Ads the corpus holds for each requested `country`; null when the search did\n // not filter by country. Tells \"no winners matched\" apart from \"unsupported\"\n // (an unknown code is refused outright).\n country_coverage: z.array(z.object({ code: z.string(), ads: z.number() })).nullable(),\n});\nexport type WinnersSearchResponse = z.infer<typeof winnersSearchResponseSchema>;\n\n/** Where a scoped search result came from: a brand this company follows, or the shared library. */\nexport const winnerSourceSchema = z.enum([\"followed\", \"library\"]);\nexport type WinnerSource = z.infer<typeof winnerSourceSchema>;\n\n/**\n * What Baker knows about a reference beyond the library: how many companies\n * turned it into a creative that reached their Workspace, whether this company\n * already did (such results are listed last), and how the creatives adapted\n * from it were judged: `approved` and `rejected` count the review verdicts\n * across every company's creatives with this source ad, counts only.\n */\nexport const referenceUsesSchema = z.object({\n companies: z.number(),\n ours: z.boolean(),\n approved: z.number(),\n rejected: z.number(),\n});\nexport type ReferenceUses = z.infer<typeof referenceUsesSchema>;\n\nexport const scopedWinningAdSchema = winningAdSchema.extend({\n source: winnerSourceSchema,\n baker_uses: referenceUsesSchema.optional(),\n});\nexport type ScopedWinningAd = z.infer<typeof scopedWinningAdSchema>;\n\nexport const scopedWinnersSearchResponseSchema = winnersSearchResponseSchema.extend({\n results: z.array(scopedWinningAdSchema),\n scope: winnerSearchScopeSchema,\n // How many brands the company follows; 0 means `followed` answers empty and\n // `followed-first` is the whole library.\n following_count: z.number(),\n});\nexport type ScopedWinnersSearchResponse = z.infer<typeof scopedWinnersSearchResponseSchema>;\n\n// ---------------------------------------------------------------------------\n// Advertisers (corpus) — `/api/ad-library/advertisers`\n// ---------------------------------------------------------------------------\n\nexport const advertiserPlatformSchema = z.object({\n platform: z.string(),\n external_id: z.string().nullable(),\n region: z.string().nullable(),\n});\nexport type AdvertiserPlatform = z.infer<typeof advertiserPlatformSchema>;\n\n/** A brand as it exists in the shared ad-dna corpus. */\nexport const corpusAdvertiserSchema = z.object({\n advertiser_id: z.string(),\n label: z.string().nullable(),\n scraped_name: z.string().nullable(),\n image_url: z.string().nullable(),\n platforms: z.array(advertiserPlatformSchema),\n platform_count: z.number().nullable(),\n family_count: z.number().nullable(),\n active_ad_count: z.number().nullable(),\n total_ad_count: z.number().nullable(),\n total_reach: z.number().nullable(),\n last_synced_at: z.string().nullable(),\n});\nexport type CorpusAdvertiser = z.infer<typeof corpusAdvertiserSchema>;\n\nexport const advertiserSearchRequestSchema = z.object({\n q: z.string().optional(),\n platform: adLibraryPlatformSchema.optional(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n});\nexport type AdvertiserSearchRequest = z.infer<typeof advertiserSearchRequestSchema>;\n\nexport const advertiserSearchResponseSchema = z.object({\n advertisers: z.array(corpusAdvertiserSchema),\n total: z.number().nullable(),\n});\nexport type AdvertiserSearchResponse = z.infer<typeof advertiserSearchResponseSchema>;\n\n/** Convergence: is the brand still exploring angles or has it converged? */\nexport const advertiserConvergenceSchema = z.object({\n convergence_state: z.string().nullable(),\n dimension_summary: z.unknown().nullable(),\n iteration_velocity_30d: z.number().nullable(),\n last_refresh_completed_at: z.string().nullable(),\n});\nexport type AdvertiserConvergence = z.infer<typeof advertiserConvergenceSchema>;\n\n// ---------------------------------------------------------------------------\n// Resolve + preview — turn a domain / URL / brand into a platform identity\n// ---------------------------------------------------------------------------\n\n/** The confirmation-modal card: who we resolved + the id we'd ingest. */\nexport const resolvePreviewSchema = z.object({\n platform: adLibraryPlatformSchema,\n external_id: z.string(),\n name: z.string(),\n image_url: z.string().nullable(),\n category: z.string().nullable(),\n industry: z.string().nullable(),\n website: z.string().nullable(),\n followers: z.number().nullable(),\n});\nexport type ResolvePreview = z.infer<typeof resolvePreviewSchema>;\n\n// ---------------------------------------------------------------------------\n// Followed advertisers (Baker-side subscriptions)\n// ---------------------------------------------------------------------------\n\n/**\n * `discovering` = still enumerating the brand's ads upstream.\n * `ingesting` = enumeration done, the ads it found are still being processed.\n * `ready` = there is something to look at.\n *\n * The middle state exists because enumeration finishes long before the ads it\n * queued actually land. Without it a brand with a thousand pending ads reported\n * a confident zero the moment its spinner stopped.\n */\nexport const followedStatusSchema = z.enum([\"discovering\", \"ingesting\", \"ready\"]);\nexport type FollowedStatus = z.infer<typeof followedStatusSchema>;\n\nexport const followedAdvertiserSchema = z.object({\n // Baker subscription row id (used to unfollow).\n followed_id: z.string(),\n advertiser_id: z.string(),\n label: z.string(),\n image_url: z.string().nullable(),\n platforms: z.array(z.object({ platform: adLibraryPlatformSchema, external_id: z.string() })),\n status: followedStatusSchema,\n active_ad_count: z.number().nullable(),\n total_ad_count: z.number().nullable(),\n family_count: z.number().nullable(),\n // Progress while status is \"discovering\" or \"ingesting\". `adding_ingested`\n // and `adding_enqueued` are both counts for the CURRENT run, so they read as\n // a fraction; `total_ad_count` is the brand's whole corpus and is not.\n adding_discovered: z.number().nullable(),\n adding_enqueued: z.number().nullable(),\n adding_ingested: z.number().nullable(),\n // A discovery job ended in failure, so this brand's ads are under-counted.\n // Distinguishes \"we couldn't finish looking\" from \"this brand runs no ads\".\n discovery_failed: z.boolean().nullable(),\n});\nexport type FollowedAdvertiser = z.infer<typeof followedAdvertiserSchema>;\n\nexport const followingListResponseSchema = z.object({\n following: z.array(followedAdvertiserSchema),\n});\nexport type FollowingListResponse = z.infer<typeof followingListResponseSchema>;\n\n// --- Follow (composite: search-first → subscribe, else resolve + enqueue) ---\n\nexport const followRequestSchema = z.object({\n input: z.string().min(1),\n platform: adLibraryPlatformSchema,\n // Optional override for the display label; defaults to the resolved name.\n label: z.string().optional(),\n});\nexport type FollowRequest = z.infer<typeof followRequestSchema>;\n\nexport const followResponseSchema = z.object({\n // \"following\" = subscribed to an advertiser already in the corpus (no\n // ingestion). \"added\" = a new advertiser was enqueued for discovery.\n // \"ambiguous\" = the identity mapped to multiple corpus advertisers; the\n // caller must pick one of `candidates`.\n status: z.enum([\"following\", \"added\", \"ambiguous\"]),\n advertiser: followedAdvertiserSchema.nullable(),\n preview: resolvePreviewSchema.nullable(),\n candidates: z.array(corpusAdvertiserSchema).nullable(),\n});\nexport type FollowResponse = z.infer<typeof followResponseSchema>;\n\n// --- Batch follow (add many brands at once, e.g. every competitor domain) ---\n\n// Cap the batch so one call can't fan out into an unbounded number of paid\n// resolve lookups + ad-dna adds. A competitor set is ~7-20 brands in practice.\nexport const FOLLOW_BATCH_MAX = 50;\n\nexport const followBatchRequestSchema = z.object({\n // One entry per brand — a domain (best; resolves both Meta + LinkedIn), a\n // profile / ad-library URL, or a brand name.\n inputs: z.array(z.string().min(1)).min(1).max(FOLLOW_BATCH_MAX),\n // How to read every input (not a tracking limit — a domain still resolves\n // every platform we can). Defaults to reading inputs as Meta identities.\n platform: adLibraryPlatformSchema.default(\"meta\"),\n});\nexport type FollowBatchRequest = z.infer<typeof followBatchRequestSchema>;\n\nexport const followBatchResultSchema = z.object({\n // Echoes the input so the caller can line results up with what it sent.\n input: z.string(),\n // \"following\"/\"added\" mirror the single-follow statuses; \"ambiguous\" needs a\n // manual pick; \"failed\" = we couldn't resolve or add it (see `error`).\n status: z.enum([\"following\", \"added\", \"ambiguous\", \"failed\"]),\n advertiser: followedAdvertiserSchema.nullable(),\n // Present only when status is \"failed\" — a plain-language reason.\n error: z.string().nullable(),\n});\nexport type FollowBatchResult = z.infer<typeof followBatchResultSchema>;\n\nexport const followBatchResponseSchema = z.object({\n results: z.array(followBatchResultSchema),\n // Rollup counts across the batch for a one-glance summary.\n followed_count: z.number(),\n added_count: z.number(),\n ambiguous_count: z.number(),\n failed_count: z.number(),\n});\nexport type FollowBatchResponse = z.infer<typeof followBatchResponseSchema>;\n\nexport const unfollowRequestSchema = z.object({\n // Accept either the Baker subscription id or the corpus advertiser id.\n followed_id: z.string().optional(),\n advertiser_id: z.string().optional(),\n});\nexport type UnfollowRequest = z.infer<typeof unfollowRequestSchema>;\n\nexport const unfollowResponseSchema = z.object({ removed: z.boolean() });\nexport type UnfollowResponse = z.infer<typeof unfollowResponseSchema>;\n\n// --- Winners for one advertiser ---\n\nexport const advertiserWinnersResponseSchema = z.object({\n advertiser_id: z.string(),\n winners: z.array(winningAdSchema),\n});\nexport type AdvertiserWinnersResponse = z.infer<typeof advertiserWinnersResponseSchema>;\n\n// --- Feed: winners across every followed advertiser (browse + trim) ---\n\nexport const feedRequestSchema = z.object({\n // Optional subset of your followed advertiser ids to narrow to (\"trim down\n // per advertiser\"). Ids you don't follow are ignored and echoed back in\n // `unknown_requested`. Omit to browse winners across every brand you follow.\n advertiser_ids: z.array(z.string()).optional(),\n platform: adLibraryPlatformSchema.optional(),\n winner_category: z.array(z.string()).optional(),\n format: z.array(z.string()).optional(),\n // Winners kept per advertiser so no single brand floods the feed. `0` = no\n // cap. Default applied by the route.\n per_advertiser: z.number().int().min(0).max(50).optional(),\n // Total winners returned across all followed advertisers.\n limit: z.number().int().min(1).max(200).optional(),\n});\nexport type FeedRequest = z.infer<typeof feedRequestSchema>;\n\nexport const feedResponseSchema = z.object({\n // The feed only ever reads followed brands, so every winner is `followed`:\n // the same `source` a scoped search carries, so the surfaces agree.\n winners: z.array(winningAdSchema.extend({ source: winnerSourceSchema })),\n // How many brands the company follows (regardless of the trim).\n following_count: z.number(),\n // The advertiser ids actually queried (follows ∩ requested subset).\n advertiser_ids: z.array(z.string()),\n // Requested ids that aren't followed — a hint the caller mistyped or hasn't\n // followed them yet.\n unknown_requested: z.array(z.string()),\n});\nexport type FeedResponse = z.infer<typeof feedResponseSchema>;\n\n// ---------------------------------------------------------------------------\n// Seed catalog — `/api/ad-library/seed-catalog`\n//\n// Reads ad-dna's corpus-wide `pattern_stats` rollup: the top winner-weighted\n// enum SEEDS for one taxonomy field (hook archetype, persuasion mechanism, or\n// static-ad format), optionally narrowed to a platform / awareness / industry\n// segment. Grounds a creative in a PROVEN pattern for the exact segment before\n// it grounds in a real reference.\n// ---------------------------------------------------------------------------\n\nexport const seedCatalogFieldSchema = z.enum([\"hook_archetype\", \"mechanism_type\", \"static_format_pattern\"]);\nexport type SeedCatalogField = z.infer<typeof seedCatalogFieldSchema>;\n\nexport const seedCatalogRequestSchema = z.object({\n field: seedCatalogFieldSchema,\n platform: z.string().optional(),\n awareness_stage: z.string().optional(),\n industry: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n});\nexport type SeedCatalogRequest = z.infer<typeof seedCatalogRequestSchema>;\n\nexport const patternSeedSchema = z.object({\n key: z.string(),\n count: z.number(),\n sum_winner_score: z.number(),\n mean_winner_score: z.number(),\n winner_share: z.number(),\n // How the seed did inside the brands that used it, the order of the catalog:\n // the mean, over brands, of how much more often their creatives with the seed\n // ran 60 days than their others (0 until five brands have a verdict), and\n // how many brands it won and lost inside.\n lift: z.number(),\n brands_for: z.number(),\n brands_against: z.number(),\n // Per-segment counts (platform/awareness_stage/industry → value → n); present\n // only on `--full`, so the response can stay lean by default.\n breakdown_by: z.record(z.string(), z.unknown()).nullable(),\n});\nexport type PatternSeed = z.infer<typeof patternSeedSchema>;\n\nexport const seedCatalogSegmentSchema = z.object({\n platform: z.string().nullable(),\n awareness_stage: z.string().nullable(),\n industry: z.string().nullable(),\n});\nexport type SeedCatalogSegment = z.infer<typeof seedCatalogSegmentSchema>;\n\nexport const seedCatalogResponseSchema = z.object({\n field: z.string(),\n segment: seedCatalogSegmentSchema.nullable(),\n patterns: z.array(patternSeedSchema),\n});\nexport type SeedCatalogResponse = z.infer<typeof seedCatalogResponseSchema>;\n\n// ---------------------------------------------------------------------------\n// Ad content — `/api/ad-library/ad-content`\n//\n// Per-ad drill-down for *reading what's inside* one winning creative: the spoken\n// transcript, the on-screen text, the ad copy, and (with --full) the speech,\n// pacing, and soundtrack detail. `search`/`winners`/`feed` return a lean\n// shortlist to pick from; this is the deliberate \"open this one and understand\n// it\" step, keyed by the `ad_id` those surfaces return. Sourced from ad-dna\n// `GET /v1/ads/:id`, which returns the whole `full_dna`; the backend client\n// projects it down to this lean shape (transcript/overlays live only there).\n// ---------------------------------------------------------------------------\n\nexport const adContentRequestSchema = z.object({\n ad_id: z.string().min(1),\n platform: adLibraryPlatformSchema.optional(),\n});\nexport type AdContentRequest = z.infer<typeof adContentRequestSchema>;\n\n/**\n * `POST /api/ad-library/reference-read`: one library ad's picture read as a static ad built on\n * it needs it (the describe blueprint and the identity-critical elements), made once by the\n * backend and shared by every company. `reused` is a read another build already paid for.\n */\nexport const referenceReadRequestSchema = z.object({\n ad_id: z.string().min(1),\n platform: adLibraryPlatformSchema.default(\"meta\"),\n});\nexport type ReferenceReadRequest = z.input<typeof referenceReadRequestSchema>;\n\nexport const referenceReadResponseSchema = z.object({\n blueprint: z.record(z.string(), z.unknown()),\n elements: z.array(z.unknown()),\n credits_charged: z.number(),\n reused: z.boolean(),\n});\nexport type ReferenceReadResponse = z.infer<typeof referenceReadResponseSchema>;\n\n/**\n * One piece of on-screen text: the words shown on the frame, when + where, and\n * the job they do (headline, benefit, cta…). A video overlay carries its time;\n * a static ad's in-image text has none; a carousel card's text carries `card`.\n */\nexport const adContentOverlaySchema = z.object({\n text: z.string(),\n appears_at_s: z.number().nullable(),\n position: z.string().nullable(),\n role: z.string().nullable(),\n card: z.number().nullable(),\n});\nexport type AdContentOverlay = z.infer<typeof adContentOverlaySchema>;\n\n/** Voiceover detail — how the ad speaks, not just what it says. --full only. */\nexport const adContentSpeechSchema = z.object({\n speech_pct_of_runtime: z.number().nullable(),\n speaker_count: z.number().nullable(),\n voiceover_vs_sync: z.string().nullable(),\n is_direct_address: z.boolean().nullable(),\n speech_emotion_dominant: z.string().nullable(),\n});\nexport type AdContentSpeech = z.infer<typeof adContentSpeechSchema>;\n\n/** Shot pacing + key timeline moments. --full only. */\nexport const adContentPacingSchema = z.object({\n scene_count: z.number().nullable(),\n avg_shot_length_s: z.number().nullable(),\n pacing_shape: z.string().nullable(),\n hook_ends_at_s: z.number().nullable(),\n cta_first_shown_at_s: z.number().nullable(),\n product_first_appears_at_s: z.number().nullable(),\n});\nexport type AdContentPacing = z.infer<typeof adContentPacingSchema>;\n\n/** Recognised soundtrack (AudD), when matched. --full only. */\nexport const adContentMusicSchema = z.object({\n track_title: z.string().nullable(),\n track_artist: z.string().nullable(),\n});\nexport type AdContentMusic = z.infer<typeof adContentMusicSchema>;\n\n/**\n * How a static ad (or carousel) is built: what to reproduce when it is the\n * reference: its container, composition, colours, the CTA drawn into it and the\n * attention markers on it. A carousel is read from its first card and has no\n * `format_pattern`. Video ads fill only the format-neutral fields.\n */\nexport const adContentLayoutSchema = z.object({\n format_pattern: z.string().nullable(),\n composition: z.string().nullable(),\n focal_subject: z.string().nullable(),\n aspect_ratio: z.string().nullable(),\n background: z.string().nullable(),\n palette_mood: z.string().nullable(),\n colors: z.array(z.string()),\n production: z.string().nullable(),\n aesthetic: z.array(z.string()),\n cta_in_image: z.string().nullable(),\n markers: z.array(z.string()),\n card_roles: z.array(z.string()),\n});\nexport type AdContentLayout = z.infer<typeof adContentLayoutSchema>;\n\n/** The persuasion an ad carries: who it speaks to and how it convinces them. */\nexport const adContentMessageSchema = z.object({\n awareness_stage: z.string().nullable(),\n sophistication: z.string().nullable(),\n mechanism: z.string().nullable(),\n pain_points: z.array(z.string()),\n desires: z.array(z.string()),\n value_props: z.array(z.string()),\n objections_handled: z.array(z.string()),\n proof: z.array(z.string()),\n risk_reversal: z.array(z.string()),\n});\nexport type AdContentMessage = z.infer<typeof adContentMessageSchema>;\n\n/**\n * The offer the ad makes. The extractor fills absent parts with \"none\" / \"n_a\";\n * those arrive as null or empty, so a filled field is always a real finding.\n */\nexport const adContentOfferSchema = z.object({\n offer_type: z.string().nullable(),\n pricing_model: z.string().nullable(),\n entry_price: z.string().nullable(),\n no_credit_card: z.boolean().nullable(),\n guarantee: z.array(z.string()),\n guarantee_days: z.number().nullable(),\n urgency: z.string().nullable(),\n bonus: z.string().nullable(),\n});\nexport type AdContentOffer = z.infer<typeof adContentOfferSchema>;\n\n/**\n * The readable content of one ad. `transcript`, `has_speech`, `speech`, `pacing`,\n * and `music` describe a *video*; they're null/empty for a static or carousel ad.\n * `on_screen_text` holds a video's timed overlays, or the text drawn into a\n * static or carousel image. The copy fields (`primary_text`, `headline`, `cta`)\n * apply to every format.\n */\nexport const adContentSchema = z.object({\n ad_id: z.string().nullable(),\n advertiser: z.string().nullable(),\n advertiser_id: z.string().nullable(),\n platform: z.string().nullable(),\n format: z.string().nullable(),\n media_kind: z.string().nullable(),\n media_url: z.string().nullable(),\n winner_score: z.number().nullable(),\n winner_category: z.string().nullable(),\n summary: z.string().nullable(),\n angle: z.string().nullable(),\n hook_archetype: z.string().nullable(),\n // Spoken words (video only; null when the ad has no speech track).\n transcript: z.string().nullable(),\n has_speech: z.boolean().nullable(),\n speech: adContentSpeechSchema,\n // On-screen text / captions.\n has_captions: z.boolean().nullable(),\n caption_style: z.string().nullable(),\n on_screen_text: z.array(adContentOverlaySchema),\n // Copy the viewer reads outside the media.\n primary_text: z.string().nullable(),\n headline: z.string().nullable(),\n cta: z.string().nullable(),\n // Structure + soundtrack.\n pacing: adContentPacingSchema,\n music: adContentMusicSchema,\n layout: adContentLayoutSchema,\n message: adContentMessageSchema,\n offer: adContentOfferSchema,\n});\nexport type AdContent = z.infer<typeof adContentSchema>;\n\nexport const adContentResponseSchema = z.object({ ad: adContentSchema });\nexport type AdContentResponse = z.infer<typeof adContentResponseSchema>;\n\n// ---------------------------------------------------------------------------\n// Ad DNA detail — the dashboard's reference-ad panel only.\n//\n// Everything in one ad's `full_dna` that `AdContent` does not already carry:\n// the colours with their share of the frame, the video's story beat by beat,\n// each carousel card, where it ran and to whom, and every other extracted\n// trait grouped by what it describes. Not on the CLI: the agent reads the lean\n// `AdContent`, and this is the depth a person browses.\n// ---------------------------------------------------------------------------\n\n/** One colour of the ad and the share of the frame it covers (0–1). */\nexport const adDnaColorSchema = z.object({\n hex: z.string(),\n share: z.number().nullable(),\n});\nexport type AdDnaColor = z.infer<typeof adDnaColorSchema>;\n\n/** One beat of a video as the watch saw and heard it, in order. */\nexport const adDnaSceneSchema = z.object({\n start_s: z.number(),\n end_s: z.number(),\n role: z.string().nullable(),\n visual: z.string(),\n speech: z.string().nullable(),\n on_screen_text: z.string().nullable(),\n sound: z.string().nullable(),\n});\nexport type AdDnaScene = z.infer<typeof adDnaSceneSchema>;\n\n/** A moment on a video's timeline: when the hook ends, the product, price or CTA first shows, the logo. */\nexport const adDnaMomentSchema = z.object({\n kind: z.enum([\"hook_ends\", \"product\", \"price\", \"cta\", \"logo\"]),\n at_s: z.number(),\n});\nexport type AdDnaMoment = z.infer<typeof adDnaMomentSchema>;\n\nexport const adDnaStorySchema = z.object({\n duration_s: z.number().nullable(),\n summary: z.string().nullable(),\n hook: z.string().nullable(),\n scenes: z.array(adDnaSceneSchema),\n moments: z.array(adDnaMomentSchema),\n});\nexport type AdDnaStory = z.infer<typeof adDnaStorySchema>;\n\n/** One carousel card: its job in the sequence, how it is laid out and coloured, and how it leads on. */\nexport const adDnaCardSchema = z.object({\n index: z.number(),\n role: z.string().nullable(),\n layout: z.string().nullable(),\n colors: z.array(adDnaColorSchema),\n open_loop: z.string().nullable(),\n transition: z.string().nullable(),\n});\nexport type AdDnaCard = z.infer<typeof adDnaCardSchema>;\n\n/** People reached in one age band (Meta's EU transparency breakdown, summed over countries). */\nexport const adDnaAgeReachSchema = z.object({\n age_range: z.string(),\n female: z.number(),\n male: z.number(),\n unknown: z.number(),\n});\nexport type AdDnaAgeReach = z.infer<typeof adDnaAgeReachSchema>;\n\n/** Where the ad ran and who saw it, as the platform discloses it. */\nexport const adDnaReachSchema = z.object({\n total: z.number().nullable(),\n eu_total: z.number().nullable(),\n ages: z.object({ min: z.number(), max: z.number() }).nullable(),\n gender: z.string().nullable(),\n locations: z.array(z.string()),\n excluded_locations: z.array(z.string()),\n channels: z.array(z.string()),\n by_age: z.array(adDnaAgeReachSchema),\n});\nexport type AdDnaReach = z.infer<typeof adDnaReachSchema>;\n\n/** One extracted trait. `key` is the DNA field name; a yes/no trait is kept only when true. */\nexport const adDnaTraitSchema = z.object({\n key: z.string(),\n value: z.union([z.string(), z.number(), z.boolean(), z.array(z.string())]),\n});\nexport type AdDnaTrait = z.infer<typeof adDnaTraitSchema>;\n\nexport const adDnaTraitGroupKeySchema = z.enum([\n \"audience\",\n \"business\",\n \"message\",\n \"copy\",\n \"look\",\n \"cast\",\n \"pacing\",\n \"sound\",\n \"on_screen_text\",\n \"branding\",\n \"subject\",\n \"cta_visual\",\n \"markers\",\n \"carousel\",\n \"offer\",\n \"delivery\",\n]);\nexport type AdDnaTraitGroupKey = z.infer<typeof adDnaTraitGroupKeySchema>;\n\nexport const adDnaTraitGroupSchema = z.object({\n key: adDnaTraitGroupKeySchema,\n traits: z.array(adDnaTraitSchema),\n});\nexport type AdDnaTraitGroup = z.infer<typeof adDnaTraitGroupSchema>;\n\nexport const adDnaDetailSchema = z.object({\n palette: z.array(adDnaColorSchema),\n background_hex: z.string().nullable(),\n button_hex: z.string().nullable(),\n story: adDnaStorySchema.nullable(),\n cards: z.array(adDnaCardSchema),\n reach: adDnaReachSchema.nullable(),\n groups: z.array(adDnaTraitGroupSchema),\n extracted_at: z.string().nullable(),\n});\nexport type AdDnaDetail = z.infer<typeof adDnaDetailSchema>;\n\n/** One stored carousel card's media: `index` from 0, matching the DNA's `card_index`. */\nexport const adCardMediaSchema = z.object({\n index: z.number(),\n url: z.string(),\n kind: z.enum([\"image\", \"video\"]).nullable(),\n});\nexport type AdCardMedia = z.infer<typeof adCardMediaSchema>;\n\n/**\n * What the reference-ad panel loads when an ad opens: its readable content, the\n * rest of its DNA, and every carousel card's media (empty for other formats and\n * for carousels whose other cards were never stored — they show their first).\n */\nexport const adDetailSchema = z.object({\n content: adContentSchema,\n dna: adDnaDetailSchema,\n card_media: z.array(adCardMediaSchema),\n});\nexport type AdDetail = z.infer<typeof adDetailSchema>;\n"],"mappings":"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","names":[]}
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  loadCompositionMeta
3
- } from "./chunk-XDNEG2H6.js";
3
+ } from "./chunk-OKJWBB2K.js";
4
4
  import {
5
5
  parseRefExpr
6
- } from "./chunk-RCQJHKK5.js";
6
+ } from "./chunk-6Y7SIP2D.js";
7
7
  import {
8
8
  resolveAdaptFormats
9
- } from "./chunk-OBDAYP2P.js";
9
+ } from "./chunk-CAMX6OHF.js";
10
10
 
11
11
  // src/commands/canvas/output-ratio.ts
12
12
  import { readFile } from "fs/promises";
@@ -93,4 +93,4 @@ async function outputRatioWarningsFor(canvas, canvasPath) {
93
93
  export {
94
94
  outputRatioWarningsFor
95
95
  };
96
- //# sourceMappingURL=chunk-HDWKLFF5.js.map
96
+ //# sourceMappingURL=chunk-TUB34FVS.js.map
@@ -6,12 +6,12 @@ import {
6
6
  citedPlatforms,
7
7
  jevCitationJudge,
8
8
  namedPlatform
9
- } from "./chunk-HO3IUJ4K.js";
9
+ } from "./chunk-PZXCWSKV.js";
10
10
  import {
11
11
  AD_PLACEMENTS,
12
12
  TEXT_BOX_READER_MODEL,
13
13
  verticalCover
14
- } from "./chunk-OBDAYP2P.js";
14
+ } from "./chunk-CAMX6OHF.js";
15
15
  import {
16
16
  FINDING_DEFECTS,
17
17
  FINDING_ELEMENTS,
@@ -1408,4 +1408,4 @@ export {
1408
1408
  checkStaticImage,
1409
1409
  reviewRenderedStatic
1410
1410
  };
1411
- //# sourceMappingURL=chunk-4SJDDGPV.js.map
1411
+ //# sourceMappingURL=chunk-TX7LZWZD.js.map
@@ -5,15 +5,15 @@ import {
5
5
  import {
6
6
  leadVersion,
7
7
  writeSeriesMemberCanvas
8
- } from "./chunk-VJZHVOA4.js";
8
+ } from "./chunk-PVUZWHNQ.js";
9
9
  import {
10
10
  definitionFieldsOf,
11
11
  setDefinitionFields,
12
12
  setSpecMessage
13
- } from "./chunk-IKYNOT57.js";
13
+ } from "./chunk-VNUNE5AB.js";
14
14
  import {
15
15
  IDEAS_DIR
16
- } from "./chunk-5EEDEVOR.js";
16
+ } from "./chunk-4QEY2L6U.js";
17
17
 
18
18
  // src/commands/creatives/make-series.ts
19
19
  import { mkdir, readFile, writeFile } from "fs/promises";
@@ -89,4 +89,4 @@ export {
89
89
  makeSeriesAd,
90
90
  seriesMadeEnvelope
91
91
  };
92
- //# sourceMappingURL=chunk-6YYEBLYI.js.map
92
+ //# sourceMappingURL=chunk-V7CTQOHG.js.map
@@ -2,10 +2,10 @@ import {
2
2
  IDEA_VIDEO_FORMATS,
3
3
  figuresIn,
4
4
  unsourcedClaims
5
- } from "./chunk-5EEDEVOR.js";
5
+ } from "./chunk-4QEY2L6U.js";
6
6
  import {
7
7
  AD_SPEC_SCHEMA
8
- } from "./chunk-CLMM6P6B.js";
8
+ } from "./chunk-PZXCWSKV.js";
9
9
 
10
10
  // src/commands/creatives/make-model.ts
11
11
  import { parse, parseDocument, Scalar, visit } from "yaml";
@@ -37,11 +37,31 @@ function referenceSearchesFor(idea, temperature, excludeAdvertiser) {
37
37
  const strict = referenceSearchFor(idea, temperature, excludeAdvertiser);
38
38
  const { awareness: _awareness, ...anyStage } = strict;
39
39
  const { audienceTemperature: _temperature, excludeBrandReliant: _reliant, ...anyViewer } = anyStage;
40
- return [strict, anyStage, { ...anyViewer, scope: "all" }];
40
+ const { query: _query, ...winners } = anyStage;
41
+ const { query: _anyQuery, ...anyWinners } = anyViewer;
42
+ return [
43
+ strict,
44
+ anyStage,
45
+ { ...anyViewer, scope: "all" },
46
+ { ...winners, sort: "winner" },
47
+ { ...anyWinners, scope: "all", sort: "winner" }
48
+ ];
49
+ }
50
+ function pooledCandidates(searches, limit) {
51
+ const seen = /* @__PURE__ */ new Set();
52
+ const pooled = [];
53
+ for (const candidate of searches.flat()) {
54
+ if (!candidate.ad_id || seen.has(candidate.ad_id)) continue;
55
+ seen.add(candidate.ad_id);
56
+ pooled.push(candidate);
57
+ }
58
+ return pooled.slice(0, limit);
41
59
  }
42
60
  function fitsIdea(fit) {
43
- if (fit.verdict === "reject") return false;
44
- return !fit.load_bearing.some((l) => l.have === "missing" && !l.ours?.trim());
61
+ return fit.verdict !== "reject" && missingElements(fit).length === 0;
62
+ }
63
+ function missingElements(fit) {
64
+ return fit.load_bearing.filter((l) => l.have === "missing" && !l.ours?.trim()).map((l) => l.element);
45
65
  }
46
66
  function definitionFieldsOf(idea, evidence) {
47
67
  return {
@@ -87,6 +107,13 @@ function setSpecMessage(specJson, message) {
87
107
  return `${JSON.stringify({ ...spec, message }, null, 2)}
88
108
  `;
89
109
  }
110
+ function withFitConcept(specJson, seeded) {
111
+ const spec = JSON.parse(specJson);
112
+ const held = spec.concept;
113
+ if (held?.reference_ad_id) return specJson;
114
+ return `${JSON.stringify({ ...spec, ...seeded }, null, 2)}
115
+ `;
116
+ }
90
117
  function unsourcedCopyLines(specJson, corpus) {
91
118
  const spec = JSON.parse(specJson);
92
119
  const figures = figuresIn(corpus);
@@ -118,14 +145,16 @@ function ideaSpec(idea, who) {
118
145
  }
119
146
 
120
147
  export {
121
- REFERENCE_CANDIDATES,
122
148
  isVideoIdea,
123
149
  referenceSearchesFor,
150
+ pooledCandidates,
124
151
  fitsIdea,
152
+ missingElements,
125
153
  definitionFieldsOf,
126
154
  setDefinitionFields,
127
155
  setSpecMessage,
156
+ withFitConcept,
128
157
  unsourcedCopyLines,
129
158
  ideaSpec
130
159
  };
131
- //# sourceMappingURL=chunk-IKYNOT57.js.map
160
+ //# sourceMappingURL=chunk-VNUNE5AB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/creatives/make-model.ts"],"sourcesContent":["/**\n * The rules `baker creatives make` applies to turn an idea into a creative: which reference to\n * look for, which one fits, and what the creative records about the idea it carries. Pure.\n */\nimport { parse, parseDocument, Scalar, visit } from \"yaml\";\nimport { AD_SPEC_SCHEMA, type AdSpec } from \"../../engine/scaffold/static-ad-spec.ts\";\nimport type { ViewerTemperature } from \"../../viewer-profile.ts\";\nimport type { FitAnswer } from \"../winning-ads/fit.ts\";\nimport type { WinningAdsSearchArgs } from \"../winning-ads/search.ts\";\nimport { type EvidenceLevel, figuresIn, IDEA_VIDEO_FORMATS, type Idea, unsourcedClaims } from \"./ideas-model.ts\";\n\nexport const REFERENCE_CANDIDATES = 6;\n\n/** Whether the idea is a video, built from beats, rather than a static from a reference. */\nexport function isVideoIdea(idea: Pick<Idea, \"format\">): boolean {\n return (IDEA_VIDEO_FORMATS as readonly string[]).includes(idea.format);\n}\n\n/** Who a reference was made for, by our viewer: a stranger's ad never leans on its own brand. */\nconst BY_TEMPERATURE: Record<ViewerTemperature, { audienceTemperature: string; excludeBrandReliant?: true }> = {\n cold: { audienceTemperature: \"0_cold\", excludeBrandReliant: true },\n warm: { audienceTemperature: \"1_warm_engaged,2_hot_visited\", excludeBrandReliant: true },\n hot: { audienceTemperature: \"3_customer\" },\n};\n\n/** The library search for a static idea's reference: its container, made for our viewer. */\nexport function referenceSearchFor(\n idea: Idea,\n temperature: ViewerTemperature,\n excludeAdvertiser?: string,\n): WinningAdsSearchArgs {\n return {\n query: idea.message,\n scope: \"followed-first\",\n platform: \"meta\",\n format: \"static\",\n formatPattern: idea.format,\n awareness: idea.awareness,\n ...BY_TEMPERATURE[temperature],\n ...(excludeAdvertiser ? { excludeAdvertiser } : {}),\n maxPerAdvertiser: 1,\n limit: REFERENCE_CANDIDATES,\n diverse: true,\n };\n}\n\n/**\n * The searches whose candidates are tried, best first: the idea's format always holds, since the\n * format is part of the idea. First the idea's message (awareness, then who the ad was made for,\n * then the company's own market loosened in turn), then the container's proven winners with no\n * query, for our viewer and then for anyone. Prod, Oct 2026: the library's judge scores an ad\n * against the query, so a customer's sentence about one product matched no ad of another category\n * and 13 of 15 ideas found nothing, while every container held proven winners whose move transfers.\n */\nexport function referenceSearchesFor(\n idea: Idea,\n temperature: ViewerTemperature,\n excludeAdvertiser?: string,\n): WinningAdsSearchArgs[] {\n const strict = referenceSearchFor(idea, temperature, excludeAdvertiser);\n const { awareness: _awareness, ...anyStage } = strict;\n const { audienceTemperature: _temperature, excludeBrandReliant: _reliant, ...anyViewer } = anyStage;\n const { query: _query, ...winners } = anyStage;\n const { query: _anyQuery, ...anyWinners } = anyViewer;\n return [\n strict,\n anyStage,\n { ...anyViewer, scope: \"all\" },\n { ...winners, sort: \"winner\" },\n { ...anyWinners, scope: \"all\", sort: \"winner\" },\n ];\n}\n\n/** Every search's candidates in one list, the better search's first, each ad once, at most `limit`. Pure. */\nexport function pooledCandidates<T extends { ad_id?: string | null }>(searches: readonly T[][], limit: number): T[] {\n const seen = new Set<string>();\n const pooled: T[] = [];\n for (const candidate of searches.flat()) {\n if (!candidate.ad_id || seen.has(candidate.ad_id)) continue;\n seen.add(candidate.ad_id);\n pooled.push(candidate);\n }\n return pooled.slice(0, limit);\n}\n\n/** A reference fits when what it wins on is something we can supply. */\nexport function fitsIdea(fit: Pick<FitAnswer, \"verdict\" | \"load_bearing\">): boolean {\n return fit.verdict !== \"reject\" && missingElements(fit).length === 0;\n}\n\n/** The load-bearing elements a reference wins on that we have nothing for. Pure. */\nexport function missingElements(fit: Pick<FitAnswer, \"load_bearing\">): string[] {\n return fit.load_bearing.filter((l) => l.have === \"missing\" && !l.ours?.trim()).map((l) => l.element);\n}\n\nexport type DefinitionStrategyFields = {\n idea: string;\n message: string;\n evidence?: EvidenceLevel;\n angle: string;\n persona: string;\n awareness: string;\n hypothesis: string;\n};\n\n/** What a creative records about the idea it executes. */\nexport function definitionFieldsOf(idea: Idea, evidence: EvidenceLevel | \"explore\"): DefinitionStrategyFields {\n return {\n idea: idea.id,\n message: idea.message,\n ...(evidence !== \"explore\" ? { evidence } : {}),\n angle: idea.angle,\n persona: idea.who,\n awareness: idea.awareness,\n hypothesis: idea.why,\n };\n}\n\nconst FRONTMATTER = /^---\\r?\\n([\\s\\S]*?\\r?\\n)?---/;\n\n/** Whether a bare string reads back as the same text under YAML 1.1. */\nfunction readsAsText11(text: string): boolean {\n try {\n return parse(text, { version: \"1.1\" }) === text;\n } catch {\n return false;\n }\n}\n\n/** Set fields in a markdown file's frontmatter, keeping every other field and the body. */\nexport function setDefinitionFields(raw: string, fields: Record<string, unknown>): string {\n const match = raw.match(FRONTMATTER);\n if (!match) return raw;\n const doc = parseDocument(match[1] ?? \"\");\n if (doc.errors.length > 0) return raw;\n for (const [key, value] of Object.entries(fields)) {\n if (value === undefined) continue;\n const node = doc.createNode(value);\n // The site reads frontmatter as YAML 1.1, where a bare 2026-10-04 is a date, not text.\n visit(node, {\n Scalar(_, scalar) {\n if (typeof scalar.value === \"string\" && !readsAsText11(scalar.value)) {\n scalar.type = Scalar.QUOTE_DOUBLE;\n }\n },\n });\n doc.set(key, node);\n }\n return `---\\n${doc.toString()}---${raw.slice(match[0].length)}`;\n}\n\n/** The ad spec with the idea's message as the one thing it tells the viewer. */\nexport function setSpecMessage(specJson: string, message: string): string {\n const spec = JSON.parse(specJson) as Record<string, unknown>;\n return `${JSON.stringify({ ...spec, message }, null, 2)}\\n`;\n}\n\n/**\n * The ad spec with the concept the reference's fit read (`conceptFromFit`): a build started before\n * the fit answered has none, or only the one the scaffold drafted from its describe, which names no\n * reference and nothing of what we have; without the fit's, the render never sees the reference at\n * the level that won. A concept a fit already seeded (it names its reference) stays. Pure.\n */\nexport function withFitConcept(specJson: string, seeded: Record<string, unknown>): string {\n const spec = JSON.parse(specJson) as Record<string, unknown>;\n const held = spec.concept as { reference_ad_id?: unknown } | undefined;\n if (held?.reference_ad_id) return specJson;\n return `${JSON.stringify({ ...spec, ...seeded }, null, 2)}\\n`;\n}\n\n/**\n * The copy lines the scaffold drafted that claim a figure the company never wrote: a draft written\n * beside a competitor's ad can carry the competitor's promise. `corpus` is what the company wrote.\n */\nexport function unsourcedCopyLines(specJson: string, corpus: string): string[] {\n const spec = JSON.parse(specJson) as { copy?: unknown };\n const figures = figuresIn(corpus);\n const lines = Array.isArray(spec.copy) ? spec.copy : [];\n return lines.flatMap((line) => {\n const text = typeof line === \"object\" && line !== null ? (line as { text?: unknown }).text : undefined;\n return typeof text === \"string\" && unsourcedClaims(text, figures).length > 0 ? [text] : [];\n });\n}\n\n/** Containers shown as a photograph; every other container is a designed graphic or a screen. */\nconst PHOTO_FORMATS = /photo|lifestyle|before_after|ugc|product|selfie|street/;\n\n/**\n * The ad spec an idea starts from when no proven ad fits it: the message and who it is for are\n * the idea's; the scene and the copy are placeholders the agent writes before anything renders\n * (`canvas run` refuses a placeholder). Pure.\n */\nexport function ideaSpec(idea: Idea, who: string): AdSpec {\n const container = idea.format.replace(/_/g, \" \");\n return {\n schema: AD_SPEC_SCHEMA,\n viewer: { who },\n message: idea.message,\n copy: [{ text: \"[TODO: the headline, in the customer's words]\", lettering: \"designed\", role: \"headline\" }],\n scene: {\n description: `[TODO: what the viewer sees, as a ${container}, that shows: ${idea.message}]`,\n look: PHOTO_FORMATS.test(idea.format) ? \"photo\" : \"designed\",\n },\n colors: [],\n references: [],\n logo: false,\n third_party_brands: [],\n scene_text: [],\n mechanism: [],\n };\n}\n"],"mappings":"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","names":[]}
@@ -49,10 +49,13 @@ function writeMd(data, fields) {
49
49
  `);
50
50
  for (const row of data) {
51
51
  const flat = flattenRow(row);
52
- process.stdout.write(`| ${cols.map((f) => flat[f] ?? "").join(" | ")} |
52
+ process.stdout.write(`| ${cols.map((f) => markdownCell(flat[f] ?? "")).join(" | ")} |
53
53
  `);
54
54
  }
55
55
  }
56
+ function markdownCell(value) {
57
+ return value.replace(/\|/g, "\\|").replace(/\r?\n/g, " ");
58
+ }
56
59
  function writeResearchOutput(data, format, fields) {
57
60
  switch (format) {
58
61
  case "csv":
@@ -92,4 +95,4 @@ export {
92
95
  writeResearchHints,
93
96
  handleResearchError
94
97
  };
95
- //# sourceMappingURL=chunk-TBEUMOEL.js.map
98
+ //# sourceMappingURL=chunk-WNFIJAUO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/research/output.ts"],"sourcesContent":["import { ApiError } from \"../../client.ts\";\n\nexport const RESEARCH_DATA_NOTE =\n \"Estimates based on third-party SERP data — not exact figures. Use for directional insights, not precise measurement.\";\n\ninterface PaginationInfo {\n offset: number;\n limit: number;\n has_more: boolean;\n next_offset?: number;\n}\n\ninterface ResearchSuccessEnvelope<T> {\n ok: true;\n data: T;\n fields?: Record<string, string>;\n note?: string;\n hints?: string[];\n total_count?: number;\n pagination?: PaginationInfo;\n [key: string]: unknown;\n}\n\n/**\n * Structured remediation. A research call that fails is almost never worth\n * aborting the whole job over, so the fix says what to do *instead* of retrying\n * blindly — usually finish the rest and name the gap.\n */\nexport interface ResearchFix {\n action: \"retry_with_changes\" | \"continue_without\" | \"reject\";\n explanation: string;\n correctedCommand?: string;\n}\n\ninterface ResearchErrorEnvelope {\n ok: false;\n error: {\n code: string;\n message: string;\n fix?: ResearchFix;\n };\n}\n\ntype ResearchOutput = ResearchSuccessEnvelope<unknown> | ResearchErrorEnvelope;\n\nexport function writeResearchJson(envelope: ResearchOutput): void {\n process.stdout.write(`${JSON.stringify(envelope, null, 2)}\\n`);\n}\n\nfunction toCsvRow(values: string[]): string {\n return values\n .map((v) => {\n if (v.includes(\",\") || v.includes('\"') || v.includes(\"\\n\")) {\n return `\"${v.replace(/\"/g, '\"\"')}\"`;\n }\n return v;\n })\n .join(\",\");\n}\n\nfunction flattenRow(row: Record<string, unknown>): Record<string, string> {\n const flat: Record<string, string> = {};\n for (const [key, val] of Object.entries(row)) {\n flat[key] = typeof val === \"object\" && val !== null ? JSON.stringify(val) : String(val ?? \"\");\n }\n return flat;\n}\n\nfunction writeCsv(data: Array<Record<string, unknown>>, fields?: string[]): void {\n if (data.length === 0) return;\n const cols = fields ?? Object.keys(data[0] ?? {});\n process.stdout.write(`${toCsvRow(cols)}\\n`);\n for (const row of data) {\n const flat = flattenRow(row);\n process.stdout.write(`${toCsvRow(cols.map((f) => flat[f] ?? \"\"))}\\n`);\n }\n}\n\nfunction writeJsonl(data: Array<Record<string, unknown>>): void {\n for (const row of data) {\n process.stdout.write(`${JSON.stringify(row)}\\n`);\n }\n}\n\nfunction writeMd(data: Array<Record<string, unknown>>, fields?: string[]): void {\n if (data.length === 0) return;\n const cols = fields ?? Object.keys(data[0] ?? {});\n process.stdout.write(`| ${cols.join(\" | \")} |\\n`);\n process.stdout.write(`| ${cols.map(() => \"---\").join(\" | \")} |\\n`);\n for (const row of data) {\n const flat = flattenRow(row);\n process.stdout.write(`| ${cols.map((f) => markdownCell(flat[f] ?? \"\")).join(\" | \")} |\\n`);\n }\n}\n\n/** A `|` or a line break inside a cell would end it, shifting every column after it. */\nfunction markdownCell(value: string): string {\n return value.replace(/\\|/g, \"\\\\|\").replace(/\\r?\\n/g, \" \");\n}\n\nexport function writeResearchOutput(data: Array<Record<string, unknown>>, format: string, fields?: string[]): void {\n switch (format) {\n case \"csv\":\n writeCsv(data, fields);\n break;\n case \"jsonl\":\n writeJsonl(data);\n break;\n case \"md\":\n writeMd(data, fields);\n break;\n default:\n writeResearchJson({ ok: true, data });\n }\n}\n\n/**\n * csv/md/jsonl render rows and nothing else, so a hint carried in the JSON\n * envelope disappears in exactly the case it matters most — an empty result,\n * where the output is a header line or nothing at all. Send it to stderr instead.\n */\nexport function writeResearchHints(hints: string[], format: string): void {\n if (format === \"json\") {\n return;\n }\n for (const hint of hints) {\n process.stderr.write(`${hint}\\n`);\n }\n}\n\nexport function handleResearchError(err: unknown, fixFor?: (code: string) => ResearchFix | undefined): never {\n const code = err instanceof ApiError ? err.code : \"NETWORK_ERROR\";\n const message = err instanceof ApiError ? err.message : err instanceof Error ? err.message : \"Unexpected error\";\n const fix = fixFor?.(code);\n writeResearchJson({ ok: false, error: { code, message, ...(fix ? { fix } : {}) } });\n process.exit(1);\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  NUMERIC_ID_REGEX
3
- } from "./chunk-XML7AJM3.js";
3
+ } from "./chunk-NE4F3FHN.js";
4
4
 
5
5
  // ../api/src/ads-google/change-history.ts
6
6
  var CHANGE_SCOPES = ["detail", "summary"];
@@ -414,4 +414,4 @@ export {
414
414
  ACCOUNT_URL_OPTIONS_NOT_STAGEABLE,
415
415
  urlOptionsHints
416
416
  };
417
- //# sourceMappingURL=chunk-EVYXTT7V.js.map
417
+ //# sourceMappingURL=chunk-XCM6XWOB.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  MODEL_REGISTRY,
3
3
  isRegisteredModel
4
- } from "./chunk-OBDAYP2P.js";
4
+ } from "./chunk-CAMX6OHF.js";
5
5
 
6
6
  // src/commands/canvas/scaffold-common.ts
7
7
  import { access, readFile } from "fs/promises";
@@ -73,4 +73,4 @@ export {
73
73
  fail,
74
74
  fileExists
75
75
  };
76
- //# sourceMappingURL=chunk-ZNBDKK4Y.js.map
76
+ //# sourceMappingURL=chunk-XFGAUP5B.js.map
@@ -2,7 +2,7 @@ import {
2
2
  SITE_COLLECTION_MODES,
3
3
  SITE_CONSENT_MODES,
4
4
  SITE_HOME_MODES
5
- } from "./chunk-6HJAHLLA.js";
5
+ } from "./chunk-K6WVV74H.js";
6
6
  import {
7
7
  ApiError
8
8
  } from "./chunk-XBOK23HI.js";
@@ -100,4 +100,4 @@ export {
100
100
  parseSetArgs,
101
101
  failSite
102
102
  };
103
- //# sourceMappingURL=chunk-4SNOWJV7.js.map
103
+ //# sourceMappingURL=chunk-XQIKDODN.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  creativesRunResponseSchema
3
- } from "./chunk-6HJAHLLA.js";
3
+ } from "./chunk-K6WVV74H.js";
4
4
  import {
5
5
  ApiError,
6
6
  apiPost
@@ -20,4 +20,4 @@ async function fetchRunRecord(runId, post = apiPost) {
20
20
  export {
21
21
  fetchRunRecord
22
22
  };
23
- //# sourceMappingURL=chunk-WRIC2RPQ.js.map
23
+ //# sourceMappingURL=chunk-XTRAI6CL.js.map
@@ -11,7 +11,7 @@ import {
11
11
  import {
12
12
  X_DRAFT_BATCH_MAX,
13
13
  xDraftOpInputSchema
14
- } from "./chunk-6HJAHLLA.js";
14
+ } from "./chunk-K6WVV74H.js";
15
15
  import {
16
16
  ApiError,
17
17
  apiPost
@@ -166,4 +166,4 @@ export {
166
166
  requireTarget,
167
167
  requireTargets
168
168
  };
169
- //# sourceMappingURL=chunk-3X3446TG.js.map
169
+ //# sourceMappingURL=chunk-XVOI4BIS.js.map