@koda-sl/baker-cli 0.445.0-dev.a2eb3621e → 0.445.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (495) hide show
  1. package/README.md +9 -7
  2. package/dist/{account-4H7QVBRK.js → account-F6MHQ64I.js} +3 -3
  3. package/dist/{account-RDRK7NOE.js → account-S2PX5JOR.js} +5 -5
  4. package/dist/{account-writes-AK42HGRM.js → account-writes-ISE4U2FQ.js} +3 -3
  5. package/dist/{accounts-4TYIUVWY.js → accounts-2D6D4MTX.js} +4 -4
  6. package/dist/{accounts-6COLJJHM.js → accounts-TC3LBWNF.js} +6 -6
  7. package/dist/{actions-PEI6ZQAG.js → actions-WEZT4Z6N.js} +18 -18
  8. package/dist/{ad-group-writes-QQS4223F.js → ad-group-writes-UU5NNKSO.js} +3 -3
  9. package/dist/{ad-groups-WGPDPUI2.js → ad-groups-CGFXZNIA.js} +7 -7
  10. package/dist/{ad-writes-XE2IE4DS.js → ad-writes-NALDYWOR.js} +3 -3
  11. package/dist/{add-XDOQQCHS.js → add-IJ6DDZFU.js} +3 -3
  12. package/dist/{add-XEDSBYLM.js → add-N7SAQT4W.js} +4 -4
  13. package/dist/{ads-BCOSQALY.js → ads-PV7GZXPR.js} +8 -8
  14. package/dist/{ads-TJ7ACFHG.js → ads-R4VOYYCQ.js} +5 -5
  15. package/dist/{advertisers-WSNHNCBQ.js → advertisers-OVPF7MPT.js} +4 -4
  16. package/dist/{analytics-PT2GKCFU.js → analytics-AIT5OTZU.js} +7 -7
  17. package/dist/{analytics-ZVWUY66X.js → analytics-UQZHJ73K.js} +4 -4
  18. package/dist/{animate-3Z7HXOLE.js → animate-37ZVC3Q5.js} +4 -4
  19. package/dist/{assign-B26AJLGN.js → assign-HTM32ZU7.js} +4 -4
  20. package/dist/{audience-size-ZX565D5P.js → audience-size-34FBOXDD.js} +4 -4
  21. package/dist/{audiences-TGD5US2M.js → audiences-VEKGLWBG.js} +3 -3
  22. package/dist/{audit-SAXVPGWS.js → audit-VLOHMKZS.js} +4 -4
  23. package/dist/{autocomplete-6PYFCOMX.js → autocomplete-COT2XIF2.js} +4 -4
  24. package/dist/{avatars-2UQJXHPV.js → avatars-3OFDMP7K.js} +4 -4
  25. package/dist/{bid-pricing-WSHACGX4.js → bid-pricing-5RJI4XRY.js} +4 -4
  26. package/dist/{brand-XBABUT52.js → brand-HEG34BBE.js} +2 -2
  27. package/dist/{brief-KKNC32TA.js → brief-X3DWOXZB.js} +10 -10
  28. package/dist/{campaign-groups-G35366AW.js → campaign-groups-VSPY3PGK.js} +9 -9
  29. package/dist/{campaign-writes-SXLZFYF6.js → campaign-writes-SX52CJYW.js} +3 -3
  30. package/dist/{campaign-writes-ZQGN7FQ3.js → campaign-writes-UXSPJHNL.js} +4 -4
  31. package/dist/{campaigns-WECN54WV.js → campaigns-K4MWUORA.js} +5 -5
  32. package/dist/{campaigns-GXUCHQ2S.js → campaigns-UB7QCJUT.js} +12 -12
  33. package/dist/{campaigns-YS3OGQXO.js → campaigns-X3DPCCSN.js} +7 -7
  34. package/dist/{canvas-DNIREYCF.js → canvas-WBQKGYOB.js} +14 -14
  35. package/dist/{capabilities-74I5AQ36.js → capabilities-3W5CZZFQ.js} +4 -4
  36. package/dist/{catalog-IQEQ5TGQ.js → catalog-E62VZ4QC.js} +6 -6
  37. package/dist/{catalogs-BRXEDE56.js → catalogs-G3YEVG6S.js} +3 -3
  38. package/dist/{changes-6QBJMGJC.js → changes-TP7ZZHB3.js} +4 -4
  39. package/dist/{chatgpt-7W75X3ER.js → chatgpt-QNUN63YS.js} +13 -13
  40. package/dist/{chats-DWHF64IU.js → chats-5JUHCYQ7.js} +4 -4
  41. package/dist/{chunk-JM73NDCM.js → chunk-2HZN4CJD.js} +2 -2
  42. package/dist/{chunk-OC5IJSIW.js → chunk-2LY4RW5O.js} +3 -3
  43. package/dist/{chunk-7J6EHOH6.js → chunk-35XWJEWH.js} +2 -2
  44. package/dist/{chunk-7QJVPMVB.js → chunk-3EEOCPPI.js} +3 -3
  45. package/dist/{chunk-7GPDUS3P.js → chunk-5XQEA7RP.js} +2 -2
  46. package/dist/{chunk-RSW6QJPH.js → chunk-6VAAU2DJ.js} +2 -2
  47. package/dist/{chunk-LL2CD5WU.js → chunk-6W37TO6U.js} +2 -2
  48. package/dist/{chunk-CLMM6P6B.js → chunk-76KTC7RD.js} +2 -2
  49. package/dist/{chunk-OKG6GX2F.js → chunk-AQ7UIRZ3.js} +2 -2
  50. package/dist/{chunk-HMEFD2CG.js → chunk-AQYRPO4R.js} +5 -5
  51. package/dist/{chunk-NPE7EWBE.js → chunk-CC7IKR36.js} +2 -2
  52. package/dist/{chunk-QJE6ZYGI.js → chunk-CWX4PPOK.js} +2 -2
  53. package/dist/{chunk-SBMIQDCX.js → chunk-ER322F6V.js} +2 -2
  54. package/dist/{chunk-5CGZ54YS.js → chunk-ERFFZYCK.js} +3 -3
  55. package/dist/{chunk-VWCELTQE.js → chunk-FQOBCTMF.js} +2 -2
  56. package/dist/{chunk-4SJDDGPV.js → chunk-GTRZUWT2.js} +2 -2
  57. package/dist/{chunk-73QKIIIR.js → chunk-GWZCWUUQ.js} +2 -2
  58. package/dist/{chunk-KWAOTV7F.js → chunk-GX6VAHY7.js} +2 -2
  59. package/dist/{chunk-XG3XCHN6.js → chunk-HA5D6US2.js} +2 -2
  60. package/dist/{chunk-ZNBDKK4Y.js → chunk-HWB5DN32.js} +2 -2
  61. package/dist/{chunk-UKJNLP4A.js → chunk-I2Z3Q436.js} +3 -3
  62. package/dist/{chunk-HSTEQ3RF.js → chunk-J6QVRNHE.js} +7 -7
  63. package/dist/{chunk-XWH7CCBL.js → chunk-KFKZHKGZ.js} +23 -8
  64. package/dist/chunk-KFKZHKGZ.js.map +1 -0
  65. package/dist/{chunk-IXKEWS7X.js → chunk-KIAD2YRA.js} +2 -2
  66. package/dist/{chunk-FTWJFDIN.js → chunk-KLBTXETO.js} +169 -169
  67. package/dist/chunk-KLBTXETO.js.map +1 -0
  68. package/dist/{chunk-FEXDI4NM.js → chunk-KSTGP67A.js} +2 -2
  69. package/dist/{chunk-OBDAYP2P.js → chunk-KY4MPR6R.js} +4 -4
  70. package/dist/chunk-KY4MPR6R.js.map +1 -0
  71. package/dist/{chunk-2SCPDSFN.js → chunk-LIQ4SQ2T.js} +2 -2
  72. package/dist/{chunk-AN447DQB.js → chunk-LTGKIBVX.js} +3 -3
  73. package/dist/{chunk-RRUJQVWA.js → chunk-MF5WL2MP.js} +4 -4
  74. package/dist/{chunk-HXTGYOQC.js → chunk-MO7XF4HR.js} +3 -3
  75. package/dist/{chunk-XML7AJM3.js → chunk-NE4F3FHN.js} +1 -1
  76. package/dist/chunk-NE4F3FHN.js.map +1 -0
  77. package/dist/{chunk-MRLT6YQM.js → chunk-NX6U2JSE.js} +13 -13
  78. package/dist/{chunk-FHXIEMCG.js → chunk-O7NR6OPL.js} +2 -2
  79. package/dist/{chunk-DIY6QR3E.js → chunk-OTDS56OQ.js} +4 -4
  80. package/dist/{chunk-SJDPHVGE.js → chunk-PQEPGP2M.js} +2 -2
  81. package/dist/{chunk-QXZYAIWS.js → chunk-Q4XTRXJV.js} +5 -5
  82. package/dist/{chunk-BYDF22T4.js → chunk-QEGHWJXC.js} +3 -3
  83. package/dist/{chunk-XYMPS526.js → chunk-QKBO6QD2.js} +2 -2
  84. package/dist/{chunk-3RJ3VGJP.js → chunk-R3OD5PVZ.js} +2 -2
  85. package/dist/{chunk-ZJ47BR6X.js → chunk-RNNIKAR7.js} +2 -2
  86. package/dist/{chunk-HYCIBVDW.js → chunk-RWPQW73R.js} +2 -2
  87. package/dist/{chunk-LO72ZSRR.js → chunk-STIQPSLZ.js} +3 -3
  88. package/dist/{chunk-EIP4PYCL.js → chunk-TIOQ7ZFQ.js} +2 -2
  89. package/dist/{chunk-VBHDZSI5.js → chunk-UQFAYC2Y.js} +2 -2
  90. package/dist/{chunk-OKJYCCHY.js → chunk-V47L5CNH.js} +7 -7
  91. package/dist/{chunk-IPAETHU2.js → chunk-VTGEGDKW.js} +2 -2
  92. package/dist/{chunk-EVYXTT7V.js → chunk-XCM6XWOB.js} +2 -2
  93. package/dist/{chunk-EZUG6WE2.js → chunk-YDJMV7BC.js} +2 -2
  94. package/dist/{chunk-KXRXS6BZ.js → chunk-YPKSJRSF.js} +6 -6
  95. package/dist/{chunk-75VNSKS3.js → chunk-Z65HNXZ2.js} +2 -2
  96. package/dist/{chunk-LO6GEJ4Z.js → chunk-ZFKL7UYS.js} +3 -3
  97. package/dist/{claim-EIL4ZBSN.js → claim-GPKFFPWC.js} +4 -4
  98. package/dist/cli.js +28 -28
  99. package/dist/{companies-2UG7RDYN.js → companies-2PQ2BXQO.js} +4 -4
  100. package/dist/{complete-I4KRFYMD.js → complete-LT6PYTQA.js} +4 -4
  101. package/dist/{connect-TA5W6YGW.js → connect-6LR75R2A.js} +7 -7
  102. package/dist/{conversation-BJI54MI6.js → conversation-4DI5N62Z.js} +4 -4
  103. package/dist/{conversion-report-XQBJ6LG4.js → conversion-report-N4HANYOB.js} +2 -2
  104. package/dist/{conversion-upload-command-JULHGVIR.js → conversion-upload-command-TZTHU2CD.js} +4 -4
  105. package/dist/{conversion-writes-UBCVXP2E.js → conversion-writes-LW4HQKK5.js} +3 -3
  106. package/dist/{conversions-VJOJ5S4U.js → conversions-3I2L4J5V.js} +8 -8
  107. package/dist/{conversions-D236RTUK.js → conversions-TS723AZV.js} +5 -5
  108. package/dist/{create-VY3RQXOY.js → create-CDEXO5TQ.js} +4 -4
  109. package/dist/{create-JLQCXAT2.js → create-DCFRBBRW.js} +3 -3
  110. package/dist/{create-E7BIZNUC.js → create-JOJ7PTHG.js} +4 -4
  111. package/dist/{create-HKOO7O5L.js → create-JUSUZ6AH.js} +4 -4
  112. package/dist/{creatives-KM2XH4G7.js → creatives-HFG6KSLV.js} +10 -10
  113. package/dist/{creatives-VXQQUH2F.js → creatives-ODCZ3C2H.js} +9 -9
  114. package/dist/{credentials-G5BJK7OR.js → credentials-AYMSKYFV.js} +17 -17
  115. package/dist/credentials-AYMSKYFV.js.map +1 -0
  116. package/dist/{critique-CMLAPVUB.js → critique-4BFUFNZQ.js} +4 -4
  117. package/dist/{critique-6MIZLNCN.js → critique-X5N53OCQ.js} +10 -10
  118. package/dist/{crm-CL7R67FT.js → crm-GGKMNFLI.js} +5 -5
  119. package/dist/{crm-GJCAM3DI.js → crm-GXLDR5RP.js} +5 -5
  120. package/dist/{currency-DJDVIR3C.js → currency-XCGKQ7FE.js} +4 -4
  121. package/dist/{customers-4RJGRR2Y.js → customers-4D6MXGCQ.js} +6 -6
  122. package/dist/{delete-IJNJTAGW.js → delete-2SBGGQDG.js} +4 -4
  123. package/dist/{delete-4QXLTL24.js → delete-7RI3657I.js} +4 -4
  124. package/dist/{delete-R57JFJ3A.js → delete-L2I54O3F.js} +3 -3
  125. package/dist/{demographics-VMARSTTE.js → demographics-SXCT2YZA.js} +4 -4
  126. package/dist/{discard-Y2BKPW4Z.js → discard-5DCAWO7J.js} +4 -4
  127. package/dist/{discover-M3ZKKFEL.js → discover-BJPZNXUQ.js} +4 -4
  128. package/dist/{domain-YTHDTRWN.js → domain-XD5HZMA3.js} +4 -4
  129. package/dist/{draft-ABGQYDHP.js → draft-B44SVA7P.js} +4 -4
  130. package/dist/{draft-U6CT6LCC.js → draft-BV2QRPZ4.js} +4 -4
  131. package/dist/{draft-MNFJ4G3C.js → draft-THPZFASM.js} +3 -3
  132. package/dist/{draft-KOLU5BRR.js → draft-XNUD2ZX3.js} +4 -4
  133. package/dist/{draft-ZVVUAMMQ.js → draft-XZ2UXMUK.js} +5 -5
  134. package/dist/engine/index.js +5 -5
  135. package/dist/{facets-UXN4MYPO.js → facets-FGRPLNHJ.js} +4 -4
  136. package/dist/{feedback-C4VDRNUM.js → feedback-NZDBN3MD.js} +3 -3
  137. package/dist/feedback-NZDBN3MD.js.map +1 -0
  138. package/dist/{feedback-record-KNIYAUTC.js → feedback-record-3ZLSSBOI.js} +13 -13
  139. package/dist/feedback-record-3ZLSSBOI.js.map +1 -0
  140. package/dist/{fit-KXHYKIA4.js → fit-275H7ETA.js} +4 -4
  141. package/dist/{flows-PB4K66NJ.js → flows-DTJHR2HD.js} +11 -11
  142. package/dist/{fonts-NTOQS2KU.js → fonts-SEC67SFN.js} +6 -6
  143. package/dist/{forecast-RWDIDDWP.js → forecast-ZZ7FWJST.js} +4 -4
  144. package/dist/{funnel-XCKPRYTV.js → funnel-ILNHRWXJ.js} +5 -5
  145. package/dist/{generate-DMQUS665.js → generate-6DDI42Y2.js} +3 -3
  146. package/dist/{get-67IG7SZI.js → get-6MJRBEGP.js} +4 -4
  147. package/dist/{get-WO22OCMZ.js → get-CQFJWZSM.js} +4 -4
  148. package/dist/{google-KIBLORXX.js → google-35GDU3G3.js} +18 -18
  149. package/dist/{google-KIBLORXX.js.map → google-35GDU3G3.js.map} +1 -1
  150. package/dist/{history-Q3QCT64S.js → history-DBIEYQHY.js} +3 -3
  151. package/dist/{history-PBFRKLU6.js → history-DBR2D4DC.js} +4 -4
  152. package/dist/{hubspot-PMOZST7W.js → hubspot-YPG2W5UP.js} +8 -8
  153. package/dist/{ideas-PU7IAX6F.js → ideas-AV7CYETD.js} +3 -3
  154. package/dist/{images-QI2HTX6B.js → images-F54P6D3N.js} +4 -4
  155. package/dist/{ingest-ZQM47NVZ.js → ingest-G5OVGZUO.js} +3 -3
  156. package/dist/{ingest-BYJNFOOT.js → ingest-RUC3EPHJ.js} +4 -4
  157. package/dist/{insights-LNAXV2CG.js → insights-ZIU6FJMS.js} +2 -2
  158. package/dist/{inspect-CQH55Q6G.js → inspect-6PCX234P.js} +4 -4
  159. package/dist/{intent-ICKFJRT2.js → intent-HG637ISN.js} +4 -4
  160. package/dist/{keyword-gap-NGPH32FN.js → keyword-gap-MBZ4T6PS.js} +4 -4
  161. package/dist/{keyword-metrics-E3NJUSEQ.js → keyword-metrics-C7TN7WVV.js} +5 -5
  162. package/dist/{keywords-for-site-RH47P4GJ.js → keywords-for-site-RXYG74EH.js} +4 -4
  163. package/dist/{landing-4PA7GCPM.js → landing-EPYJ2TYC.js} +2 -2
  164. package/dist/{languages-JDYL2N5F.js → languages-HORKPDNH.js} +4 -4
  165. package/dist/{leads-I7BO5V7P.js → leads-5E3MULCF.js} +4 -4
  166. package/dist/{learn-HZU3QWNN.js → learn-EC73LWRX.js} +8 -8
  167. package/dist/{line-item-writes-JSR53MID.js → line-item-writes-OWDX5TF4.js} +4 -4
  168. package/dist/{line-items-2WFLKOOR.js → line-items-LF4IZCVD.js} +5 -5
  169. package/dist/{link-AYXOJQDV.js → link-D2ZPRSGD.js} +4 -4
  170. package/dist/{linkedin-M2PVZYLV.js → linkedin-3LUIRE76.js} +27 -27
  171. package/dist/{list-3OKEMUFD.js → list-5LXT3MMM.js} +3 -3
  172. package/dist/{list-4MQC23JH.js → list-PYRY2HPB.js} +4 -4
  173. package/dist/{list-QGLIL7J6.js → list-QTFE6CJ2.js} +4 -4
  174. package/dist/{locations-2NKBJKBT.js → locations-74TPQWAT.js} +2 -2
  175. package/dist/{locations-S4U6IJIS.js → locations-J4G5RNPH.js} +4 -4
  176. package/dist/{log-QHR2JNKW.js → log-YOEMOLDG.js} +4 -4
  177. package/dist/{make-HRCWP2C6.js → make-2EK4E4BB.js} +18 -18
  178. package/dist/{map-3BVFAP33.js → map-XMWYNJZI.js} +5 -5
  179. package/dist/{mcp-LH5KR6RO.js → mcp-6HL4CR5E.js} +3 -3
  180. package/dist/{media-sources-3D246I3O.js → media-sources-WFTHXYMZ.js} +2 -2
  181. package/dist/{members-4DUQHLZH.js → members-6FKD5KZ2.js} +4 -4
  182. package/dist/{metrics-AY4RP54F.js → metrics-SQDJ5NQO.js} +4 -4
  183. package/dist/{models-5NTC7A5G.js → models-6T2XV2KB.js} +2 -2
  184. package/dist/{normalize-CD4PQRYY.js → normalize-3JLFCOWS.js} +4 -4
  185. package/dist/{options-6TE5E34Z.js → options-RAHLATMR.js} +7 -7
  186. package/dist/{performance-7LQQCEAW.js → performance-FKL2KHHX.js} +5 -5
  187. package/dist/{pixels-TZPF746S.js → pixels-45A55MOP.js} +3 -3
  188. package/dist/{promoted-tweet-writes-F76YIMB6.js → promoted-tweet-writes-DMFVG63W.js} +4 -4
  189. package/dist/{promoted-tweets-EJL37P7K.js → promoted-tweets-KJYCL6J5.js} +3 -3
  190. package/dist/{publish-H5S2IKZP.js → publish-Y5PALSEY.js} +4 -4
  191. package/dist/{query-CPZZNMDY.js → query-IEZRY6HV.js} +4 -4
  192. package/dist/{reddit-INGPFGP4.js → reddit-CIJFBT32.js} +4 -4
  193. package/dist/{refresh-MKSKISPX.js → refresh-SWW23DAQ.js} +3 -3
  194. package/dist/{release-J5LIAIZT.js → release-FOBIO5QG.js} +4 -4
  195. package/dist/{relevant-pages-MTMFMBPD.js → relevant-pages-MFJEPBR4.js} +4 -4
  196. package/dist/{remove-LYEK7VFV.js → remove-OXAH3ZKL.js} +3 -3
  197. package/dist/{reopen-FR4UBOG7.js → reopen-JFRI6ZR6.js} +4 -4
  198. package/dist/{rerun-XPWGIVTT.js → rerun-73NGMIM7.js} +19 -19
  199. package/dist/{research-RPJSOWPT.js → research-7N67CM2T.js} +56 -20
  200. package/dist/research-7N67CM2T.js.map +1 -0
  201. package/dist/{research-PA53M335.js → research-SNMF4JOY.js} +10 -10
  202. package/dist/{reset-RCYRE5WO.js → reset-222UFTF6.js} +3 -3
  203. package/dist/{reset-H3ES4WV5.js → reset-B6JRVIIH.js} +3 -3
  204. package/dist/{resolve-QIDQJCE6.js → resolve-XQCGZYTD.js} +4 -4
  205. package/dist/{retry-WLVMR7XP.js → retry-O6BBBGXP.js} +3 -3
  206. package/dist/{retry-PLLCFOJW.js → retry-TQHVMUU4.js} +3 -3
  207. package/dist/{run-WMJPDX6U.js → run-6L3QS4PP.js} +19 -19
  208. package/dist/{run-4D7ZCLMF.js → run-FDSII53R.js} +4 -4
  209. package/dist/{scaffold-ad-VYYZIEQ2.js → scaffold-ad-WRPLC3JR.js} +17 -17
  210. package/dist/{scaffold-static-ad-B3SZ2HLW.js → scaffold-static-ad-HRLKY5WF.js} +23 -23
  211. package/dist/{scaffold-video-2QISC5CW.js → scaffold-video-LSOSZCVF.js} +15 -15
  212. package/dist/{schedule-RXUUCNNI.js → schedule-KNRJAYCK.js} +3 -3
  213. package/dist/{scheduled-agents-2NCGSD76.js → scheduled-agents-IPZ5QA6C.js} +11 -11
  214. package/dist/{schema-SFODURN7.js → schema-H43I3TR4.js} +5 -5
  215. package/dist/{search-7QVZOWSI.js → search-7CMRZNWL.js} +3 -3
  216. package/dist/{select-C6CFCOEM.js → select-OKF5SLAO.js} +12 -12
  217. package/dist/{set-prompt-MIMQYMGM.js → set-prompt-N54XKRGK.js} +11 -11
  218. package/dist/{setup-links-XW4A6L2I.js → setup-links-2MOYMVEY.js} +4 -4
  219. package/dist/{site-6UTQSYIK.js → site-BDTMN6VB.js} +5 -5
  220. package/dist/{sources-QQNWQLUM.js → sources-4XCN3STL.js} +7 -7
  221. package/dist/{sources-UGMZFZ2E.js → sources-TCEHZ5RV.js} +6 -6
  222. package/dist/{stale-NOSV6ONW.js → stale-J5PKAEBW.js} +11 -11
  223. package/dist/{status-NXGKJGH7.js → status-6AN44KXK.js} +4 -4
  224. package/dist/{studio-HUEBE6DS.js → studio-TM3MAAUW.js} +4 -4
  225. package/dist/{sync-RXS6BPLM.js → sync-TPOVAGPK.js} +3 -3
  226. package/dist/{sync-definition-2DQN2KN3.js → sync-definition-A4SIK5VW.js} +14 -14
  227. package/dist/{tags-CMBKEXIZ.js → tags-CN6I22A5.js} +4 -4
  228. package/dist/{tags-C65JB762.js → tags-N6SF24MU.js} +3 -3
  229. package/dist/{tags-R3K35KTL.js → tags-QITCY5QO.js} +4 -4
  230. package/dist/{tags-GFFQLLG2.js → tags-TMUNXXYN.js} +4 -4
  231. package/dist/{tags-IJN2SPSM.js → tags-U4JDAVUH.js} +4 -4
  232. package/dist/{targeting-criteria-IHBPLHSX.js → targeting-criteria-DRA5JGCZ.js} +3 -3
  233. package/dist/{targets-JH37NVJF.js → targets-B3HWHREZ.js} +4 -4
  234. package/dist/{templates-HXSHQ23T.js → templates-53VD5PEV.js} +4 -4
  235. package/dist/{testimonials-5QGCPZ6K.js → testimonials-NOTV6AON.js} +6 -6
  236. package/dist/{top-companies-FJEFKVI7.js → top-companies-NIG3PBD3.js} +4 -4
  237. package/dist/{translate-XQDRDI6P.js → translate-QYBPQSAP.js} +171 -50
  238. package/dist/translate-QYBPQSAP.js.map +1 -0
  239. package/dist/{triggers-SEOAAJSS.js → triggers-IIUPW5LU.js} +4 -4
  240. package/dist/{unlink-UZDVSHBO.js → unlink-WRF3E3AL.js} +4 -4
  241. package/dist/{unstage-CE5RRGM5.js → unstage-GXHKDXA5.js} +4 -4
  242. package/dist/{update-JZ4I6WW7.js → update-4KUD5OH4.js} +4 -4
  243. package/dist/{update-ZXOG2V34.js → update-6CHXJFMF.js} +3 -3
  244. package/dist/{update-DGZKEP6T.js → update-FGTKHBEG.js} +4 -4
  245. package/dist/{update-JOS4ITAV.js → update-R47RJ5NM.js} +4 -4
  246. package/dist/{upload-SSOPA7ZT.js → upload-3IDNWUH7.js} +4 -4
  247. package/dist/{url-options-QEWKRKZ3.js → url-options-GGXAL3J4.js} +4 -4
  248. package/dist/{url-params-OR5N5EWT.js → url-params-EYHAK4TR.js} +4 -4
  249. package/dist/{validate-4YXSJA4S.js → validate-S3S52QNH.js} +12 -12
  250. package/dist/{videos-GIYDCCKR.js → videos-FH4XUXWR.js} +5 -5
  251. package/dist/{viewer-check-VN2JK2LW.js → viewer-check-5TJ7UGMV.js} +4 -4
  252. package/dist/{winning-ads-7QWEIMRU.js → winning-ads-QMTRP7DI.js} +3 -3
  253. package/dist/{write-commands-SVJ43D7G.js → write-commands-N6ZN3B4E.js} +5 -5
  254. package/dist/{x-OEAKQBB7.js → x-W6GJ63OZ.js} +6 -6
  255. package/package.json +1 -1
  256. package/dist/chunk-FTWJFDIN.js.map +0 -1
  257. package/dist/chunk-OBDAYP2P.js.map +0 -1
  258. package/dist/chunk-XML7AJM3.js.map +0 -1
  259. package/dist/chunk-XWH7CCBL.js.map +0 -1
  260. package/dist/credentials-G5BJK7OR.js.map +0 -1
  261. package/dist/feedback-C4VDRNUM.js.map +0 -1
  262. package/dist/feedback-record-KNIYAUTC.js.map +0 -1
  263. package/dist/research-RPJSOWPT.js.map +0 -1
  264. package/dist/translate-XQDRDI6P.js.map +0 -1
  265. /package/dist/{account-4H7QVBRK.js.map → account-F6MHQ64I.js.map} +0 -0
  266. /package/dist/{account-RDRK7NOE.js.map → account-S2PX5JOR.js.map} +0 -0
  267. /package/dist/{account-writes-AK42HGRM.js.map → account-writes-ISE4U2FQ.js.map} +0 -0
  268. /package/dist/{accounts-4TYIUVWY.js.map → accounts-2D6D4MTX.js.map} +0 -0
  269. /package/dist/{accounts-6COLJJHM.js.map → accounts-TC3LBWNF.js.map} +0 -0
  270. /package/dist/{actions-PEI6ZQAG.js.map → actions-WEZT4Z6N.js.map} +0 -0
  271. /package/dist/{ad-group-writes-QQS4223F.js.map → ad-group-writes-UU5NNKSO.js.map} +0 -0
  272. /package/dist/{ad-groups-WGPDPUI2.js.map → ad-groups-CGFXZNIA.js.map} +0 -0
  273. /package/dist/{ad-writes-XE2IE4DS.js.map → ad-writes-NALDYWOR.js.map} +0 -0
  274. /package/dist/{add-XDOQQCHS.js.map → add-IJ6DDZFU.js.map} +0 -0
  275. /package/dist/{add-XEDSBYLM.js.map → add-N7SAQT4W.js.map} +0 -0
  276. /package/dist/{ads-BCOSQALY.js.map → ads-PV7GZXPR.js.map} +0 -0
  277. /package/dist/{ads-TJ7ACFHG.js.map → ads-R4VOYYCQ.js.map} +0 -0
  278. /package/dist/{advertisers-WSNHNCBQ.js.map → advertisers-OVPF7MPT.js.map} +0 -0
  279. /package/dist/{analytics-PT2GKCFU.js.map → analytics-AIT5OTZU.js.map} +0 -0
  280. /package/dist/{analytics-ZVWUY66X.js.map → analytics-UQZHJ73K.js.map} +0 -0
  281. /package/dist/{animate-3Z7HXOLE.js.map → animate-37ZVC3Q5.js.map} +0 -0
  282. /package/dist/{assign-B26AJLGN.js.map → assign-HTM32ZU7.js.map} +0 -0
  283. /package/dist/{audience-size-ZX565D5P.js.map → audience-size-34FBOXDD.js.map} +0 -0
  284. /package/dist/{audiences-TGD5US2M.js.map → audiences-VEKGLWBG.js.map} +0 -0
  285. /package/dist/{audit-SAXVPGWS.js.map → audit-VLOHMKZS.js.map} +0 -0
  286. /package/dist/{autocomplete-6PYFCOMX.js.map → autocomplete-COT2XIF2.js.map} +0 -0
  287. /package/dist/{avatars-2UQJXHPV.js.map → avatars-3OFDMP7K.js.map} +0 -0
  288. /package/dist/{bid-pricing-WSHACGX4.js.map → bid-pricing-5RJI4XRY.js.map} +0 -0
  289. /package/dist/{brand-XBABUT52.js.map → brand-HEG34BBE.js.map} +0 -0
  290. /package/dist/{brief-KKNC32TA.js.map → brief-X3DWOXZB.js.map} +0 -0
  291. /package/dist/{campaign-groups-G35366AW.js.map → campaign-groups-VSPY3PGK.js.map} +0 -0
  292. /package/dist/{campaign-writes-SXLZFYF6.js.map → campaign-writes-SX52CJYW.js.map} +0 -0
  293. /package/dist/{campaign-writes-ZQGN7FQ3.js.map → campaign-writes-UXSPJHNL.js.map} +0 -0
  294. /package/dist/{campaigns-WECN54WV.js.map → campaigns-K4MWUORA.js.map} +0 -0
  295. /package/dist/{campaigns-GXUCHQ2S.js.map → campaigns-UB7QCJUT.js.map} +0 -0
  296. /package/dist/{campaigns-YS3OGQXO.js.map → campaigns-X3DPCCSN.js.map} +0 -0
  297. /package/dist/{canvas-DNIREYCF.js.map → canvas-WBQKGYOB.js.map} +0 -0
  298. /package/dist/{capabilities-74I5AQ36.js.map → capabilities-3W5CZZFQ.js.map} +0 -0
  299. /package/dist/{catalog-IQEQ5TGQ.js.map → catalog-E62VZ4QC.js.map} +0 -0
  300. /package/dist/{catalogs-BRXEDE56.js.map → catalogs-G3YEVG6S.js.map} +0 -0
  301. /package/dist/{changes-6QBJMGJC.js.map → changes-TP7ZZHB3.js.map} +0 -0
  302. /package/dist/{chatgpt-7W75X3ER.js.map → chatgpt-QNUN63YS.js.map} +0 -0
  303. /package/dist/{chats-DWHF64IU.js.map → chats-5JUHCYQ7.js.map} +0 -0
  304. /package/dist/{chunk-JM73NDCM.js.map → chunk-2HZN4CJD.js.map} +0 -0
  305. /package/dist/{chunk-OC5IJSIW.js.map → chunk-2LY4RW5O.js.map} +0 -0
  306. /package/dist/{chunk-7J6EHOH6.js.map → chunk-35XWJEWH.js.map} +0 -0
  307. /package/dist/{chunk-7QJVPMVB.js.map → chunk-3EEOCPPI.js.map} +0 -0
  308. /package/dist/{chunk-7GPDUS3P.js.map → chunk-5XQEA7RP.js.map} +0 -0
  309. /package/dist/{chunk-RSW6QJPH.js.map → chunk-6VAAU2DJ.js.map} +0 -0
  310. /package/dist/{chunk-LL2CD5WU.js.map → chunk-6W37TO6U.js.map} +0 -0
  311. /package/dist/{chunk-CLMM6P6B.js.map → chunk-76KTC7RD.js.map} +0 -0
  312. /package/dist/{chunk-OKG6GX2F.js.map → chunk-AQ7UIRZ3.js.map} +0 -0
  313. /package/dist/{chunk-HMEFD2CG.js.map → chunk-AQYRPO4R.js.map} +0 -0
  314. /package/dist/{chunk-NPE7EWBE.js.map → chunk-CC7IKR36.js.map} +0 -0
  315. /package/dist/{chunk-QJE6ZYGI.js.map → chunk-CWX4PPOK.js.map} +0 -0
  316. /package/dist/{chunk-SBMIQDCX.js.map → chunk-ER322F6V.js.map} +0 -0
  317. /package/dist/{chunk-5CGZ54YS.js.map → chunk-ERFFZYCK.js.map} +0 -0
  318. /package/dist/{chunk-VWCELTQE.js.map → chunk-FQOBCTMF.js.map} +0 -0
  319. /package/dist/{chunk-4SJDDGPV.js.map → chunk-GTRZUWT2.js.map} +0 -0
  320. /package/dist/{chunk-73QKIIIR.js.map → chunk-GWZCWUUQ.js.map} +0 -0
  321. /package/dist/{chunk-KWAOTV7F.js.map → chunk-GX6VAHY7.js.map} +0 -0
  322. /package/dist/{chunk-XG3XCHN6.js.map → chunk-HA5D6US2.js.map} +0 -0
  323. /package/dist/{chunk-ZNBDKK4Y.js.map → chunk-HWB5DN32.js.map} +0 -0
  324. /package/dist/{chunk-UKJNLP4A.js.map → chunk-I2Z3Q436.js.map} +0 -0
  325. /package/dist/{chunk-HSTEQ3RF.js.map → chunk-J6QVRNHE.js.map} +0 -0
  326. /package/dist/{chunk-IXKEWS7X.js.map → chunk-KIAD2YRA.js.map} +0 -0
  327. /package/dist/{chunk-FEXDI4NM.js.map → chunk-KSTGP67A.js.map} +0 -0
  328. /package/dist/{chunk-2SCPDSFN.js.map → chunk-LIQ4SQ2T.js.map} +0 -0
  329. /package/dist/{chunk-AN447DQB.js.map → chunk-LTGKIBVX.js.map} +0 -0
  330. /package/dist/{chunk-RRUJQVWA.js.map → chunk-MF5WL2MP.js.map} +0 -0
  331. /package/dist/{chunk-HXTGYOQC.js.map → chunk-MO7XF4HR.js.map} +0 -0
  332. /package/dist/{chunk-MRLT6YQM.js.map → chunk-NX6U2JSE.js.map} +0 -0
  333. /package/dist/{chunk-FHXIEMCG.js.map → chunk-O7NR6OPL.js.map} +0 -0
  334. /package/dist/{chunk-DIY6QR3E.js.map → chunk-OTDS56OQ.js.map} +0 -0
  335. /package/dist/{chunk-SJDPHVGE.js.map → chunk-PQEPGP2M.js.map} +0 -0
  336. /package/dist/{chunk-QXZYAIWS.js.map → chunk-Q4XTRXJV.js.map} +0 -0
  337. /package/dist/{chunk-BYDF22T4.js.map → chunk-QEGHWJXC.js.map} +0 -0
  338. /package/dist/{chunk-XYMPS526.js.map → chunk-QKBO6QD2.js.map} +0 -0
  339. /package/dist/{chunk-3RJ3VGJP.js.map → chunk-R3OD5PVZ.js.map} +0 -0
  340. /package/dist/{chunk-ZJ47BR6X.js.map → chunk-RNNIKAR7.js.map} +0 -0
  341. /package/dist/{chunk-HYCIBVDW.js.map → chunk-RWPQW73R.js.map} +0 -0
  342. /package/dist/{chunk-LO72ZSRR.js.map → chunk-STIQPSLZ.js.map} +0 -0
  343. /package/dist/{chunk-EIP4PYCL.js.map → chunk-TIOQ7ZFQ.js.map} +0 -0
  344. /package/dist/{chunk-VBHDZSI5.js.map → chunk-UQFAYC2Y.js.map} +0 -0
  345. /package/dist/{chunk-OKJYCCHY.js.map → chunk-V47L5CNH.js.map} +0 -0
  346. /package/dist/{chunk-IPAETHU2.js.map → chunk-VTGEGDKW.js.map} +0 -0
  347. /package/dist/{chunk-EVYXTT7V.js.map → chunk-XCM6XWOB.js.map} +0 -0
  348. /package/dist/{chunk-EZUG6WE2.js.map → chunk-YDJMV7BC.js.map} +0 -0
  349. /package/dist/{chunk-KXRXS6BZ.js.map → chunk-YPKSJRSF.js.map} +0 -0
  350. /package/dist/{chunk-75VNSKS3.js.map → chunk-Z65HNXZ2.js.map} +0 -0
  351. /package/dist/{chunk-LO6GEJ4Z.js.map → chunk-ZFKL7UYS.js.map} +0 -0
  352. /package/dist/{claim-EIL4ZBSN.js.map → claim-GPKFFPWC.js.map} +0 -0
  353. /package/dist/{companies-2UG7RDYN.js.map → companies-2PQ2BXQO.js.map} +0 -0
  354. /package/dist/{complete-I4KRFYMD.js.map → complete-LT6PYTQA.js.map} +0 -0
  355. /package/dist/{connect-TA5W6YGW.js.map → connect-6LR75R2A.js.map} +0 -0
  356. /package/dist/{conversation-BJI54MI6.js.map → conversation-4DI5N62Z.js.map} +0 -0
  357. /package/dist/{conversion-report-XQBJ6LG4.js.map → conversion-report-N4HANYOB.js.map} +0 -0
  358. /package/dist/{conversion-upload-command-JULHGVIR.js.map → conversion-upload-command-TZTHU2CD.js.map} +0 -0
  359. /package/dist/{conversion-writes-UBCVXP2E.js.map → conversion-writes-LW4HQKK5.js.map} +0 -0
  360. /package/dist/{conversions-VJOJ5S4U.js.map → conversions-3I2L4J5V.js.map} +0 -0
  361. /package/dist/{conversions-D236RTUK.js.map → conversions-TS723AZV.js.map} +0 -0
  362. /package/dist/{create-VY3RQXOY.js.map → create-CDEXO5TQ.js.map} +0 -0
  363. /package/dist/{create-JLQCXAT2.js.map → create-DCFRBBRW.js.map} +0 -0
  364. /package/dist/{create-E7BIZNUC.js.map → create-JOJ7PTHG.js.map} +0 -0
  365. /package/dist/{create-HKOO7O5L.js.map → create-JUSUZ6AH.js.map} +0 -0
  366. /package/dist/{creatives-KM2XH4G7.js.map → creatives-HFG6KSLV.js.map} +0 -0
  367. /package/dist/{creatives-VXQQUH2F.js.map → creatives-ODCZ3C2H.js.map} +0 -0
  368. /package/dist/{critique-CMLAPVUB.js.map → critique-4BFUFNZQ.js.map} +0 -0
  369. /package/dist/{critique-6MIZLNCN.js.map → critique-X5N53OCQ.js.map} +0 -0
  370. /package/dist/{crm-CL7R67FT.js.map → crm-GGKMNFLI.js.map} +0 -0
  371. /package/dist/{crm-GJCAM3DI.js.map → crm-GXLDR5RP.js.map} +0 -0
  372. /package/dist/{currency-DJDVIR3C.js.map → currency-XCGKQ7FE.js.map} +0 -0
  373. /package/dist/{customers-4RJGRR2Y.js.map → customers-4D6MXGCQ.js.map} +0 -0
  374. /package/dist/{delete-IJNJTAGW.js.map → delete-2SBGGQDG.js.map} +0 -0
  375. /package/dist/{delete-4QXLTL24.js.map → delete-7RI3657I.js.map} +0 -0
  376. /package/dist/{delete-R57JFJ3A.js.map → delete-L2I54O3F.js.map} +0 -0
  377. /package/dist/{demographics-VMARSTTE.js.map → demographics-SXCT2YZA.js.map} +0 -0
  378. /package/dist/{discard-Y2BKPW4Z.js.map → discard-5DCAWO7J.js.map} +0 -0
  379. /package/dist/{discover-M3ZKKFEL.js.map → discover-BJPZNXUQ.js.map} +0 -0
  380. /package/dist/{domain-YTHDTRWN.js.map → domain-XD5HZMA3.js.map} +0 -0
  381. /package/dist/{draft-ABGQYDHP.js.map → draft-B44SVA7P.js.map} +0 -0
  382. /package/dist/{draft-U6CT6LCC.js.map → draft-BV2QRPZ4.js.map} +0 -0
  383. /package/dist/{draft-MNFJ4G3C.js.map → draft-THPZFASM.js.map} +0 -0
  384. /package/dist/{draft-KOLU5BRR.js.map → draft-XNUD2ZX3.js.map} +0 -0
  385. /package/dist/{draft-ZVVUAMMQ.js.map → draft-XZ2UXMUK.js.map} +0 -0
  386. /package/dist/{facets-UXN4MYPO.js.map → facets-FGRPLNHJ.js.map} +0 -0
  387. /package/dist/{fit-KXHYKIA4.js.map → fit-275H7ETA.js.map} +0 -0
  388. /package/dist/{flows-PB4K66NJ.js.map → flows-DTJHR2HD.js.map} +0 -0
  389. /package/dist/{fonts-NTOQS2KU.js.map → fonts-SEC67SFN.js.map} +0 -0
  390. /package/dist/{forecast-RWDIDDWP.js.map → forecast-ZZ7FWJST.js.map} +0 -0
  391. /package/dist/{funnel-XCKPRYTV.js.map → funnel-ILNHRWXJ.js.map} +0 -0
  392. /package/dist/{generate-DMQUS665.js.map → generate-6DDI42Y2.js.map} +0 -0
  393. /package/dist/{get-67IG7SZI.js.map → get-6MJRBEGP.js.map} +0 -0
  394. /package/dist/{get-WO22OCMZ.js.map → get-CQFJWZSM.js.map} +0 -0
  395. /package/dist/{history-Q3QCT64S.js.map → history-DBIEYQHY.js.map} +0 -0
  396. /package/dist/{history-PBFRKLU6.js.map → history-DBR2D4DC.js.map} +0 -0
  397. /package/dist/{hubspot-PMOZST7W.js.map → hubspot-YPG2W5UP.js.map} +0 -0
  398. /package/dist/{ideas-PU7IAX6F.js.map → ideas-AV7CYETD.js.map} +0 -0
  399. /package/dist/{images-QI2HTX6B.js.map → images-F54P6D3N.js.map} +0 -0
  400. /package/dist/{ingest-ZQM47NVZ.js.map → ingest-G5OVGZUO.js.map} +0 -0
  401. /package/dist/{ingest-BYJNFOOT.js.map → ingest-RUC3EPHJ.js.map} +0 -0
  402. /package/dist/{insights-LNAXV2CG.js.map → insights-ZIU6FJMS.js.map} +0 -0
  403. /package/dist/{inspect-CQH55Q6G.js.map → inspect-6PCX234P.js.map} +0 -0
  404. /package/dist/{intent-ICKFJRT2.js.map → intent-HG637ISN.js.map} +0 -0
  405. /package/dist/{keyword-gap-NGPH32FN.js.map → keyword-gap-MBZ4T6PS.js.map} +0 -0
  406. /package/dist/{keyword-metrics-E3NJUSEQ.js.map → keyword-metrics-C7TN7WVV.js.map} +0 -0
  407. /package/dist/{keywords-for-site-RH47P4GJ.js.map → keywords-for-site-RXYG74EH.js.map} +0 -0
  408. /package/dist/{landing-4PA7GCPM.js.map → landing-EPYJ2TYC.js.map} +0 -0
  409. /package/dist/{languages-JDYL2N5F.js.map → languages-HORKPDNH.js.map} +0 -0
  410. /package/dist/{leads-I7BO5V7P.js.map → leads-5E3MULCF.js.map} +0 -0
  411. /package/dist/{learn-HZU3QWNN.js.map → learn-EC73LWRX.js.map} +0 -0
  412. /package/dist/{line-item-writes-JSR53MID.js.map → line-item-writes-OWDX5TF4.js.map} +0 -0
  413. /package/dist/{line-items-2WFLKOOR.js.map → line-items-LF4IZCVD.js.map} +0 -0
  414. /package/dist/{link-AYXOJQDV.js.map → link-D2ZPRSGD.js.map} +0 -0
  415. /package/dist/{linkedin-M2PVZYLV.js.map → linkedin-3LUIRE76.js.map} +0 -0
  416. /package/dist/{list-3OKEMUFD.js.map → list-5LXT3MMM.js.map} +0 -0
  417. /package/dist/{list-4MQC23JH.js.map → list-PYRY2HPB.js.map} +0 -0
  418. /package/dist/{list-QGLIL7J6.js.map → list-QTFE6CJ2.js.map} +0 -0
  419. /package/dist/{locations-2NKBJKBT.js.map → locations-74TPQWAT.js.map} +0 -0
  420. /package/dist/{locations-S4U6IJIS.js.map → locations-J4G5RNPH.js.map} +0 -0
  421. /package/dist/{log-QHR2JNKW.js.map → log-YOEMOLDG.js.map} +0 -0
  422. /package/dist/{make-HRCWP2C6.js.map → make-2EK4E4BB.js.map} +0 -0
  423. /package/dist/{map-3BVFAP33.js.map → map-XMWYNJZI.js.map} +0 -0
  424. /package/dist/{mcp-LH5KR6RO.js.map → mcp-6HL4CR5E.js.map} +0 -0
  425. /package/dist/{media-sources-3D246I3O.js.map → media-sources-WFTHXYMZ.js.map} +0 -0
  426. /package/dist/{members-4DUQHLZH.js.map → members-6FKD5KZ2.js.map} +0 -0
  427. /package/dist/{metrics-AY4RP54F.js.map → metrics-SQDJ5NQO.js.map} +0 -0
  428. /package/dist/{models-5NTC7A5G.js.map → models-6T2XV2KB.js.map} +0 -0
  429. /package/dist/{normalize-CD4PQRYY.js.map → normalize-3JLFCOWS.js.map} +0 -0
  430. /package/dist/{options-6TE5E34Z.js.map → options-RAHLATMR.js.map} +0 -0
  431. /package/dist/{performance-7LQQCEAW.js.map → performance-FKL2KHHX.js.map} +0 -0
  432. /package/dist/{pixels-TZPF746S.js.map → pixels-45A55MOP.js.map} +0 -0
  433. /package/dist/{promoted-tweet-writes-F76YIMB6.js.map → promoted-tweet-writes-DMFVG63W.js.map} +0 -0
  434. /package/dist/{promoted-tweets-EJL37P7K.js.map → promoted-tweets-KJYCL6J5.js.map} +0 -0
  435. /package/dist/{publish-H5S2IKZP.js.map → publish-Y5PALSEY.js.map} +0 -0
  436. /package/dist/{query-CPZZNMDY.js.map → query-IEZRY6HV.js.map} +0 -0
  437. /package/dist/{reddit-INGPFGP4.js.map → reddit-CIJFBT32.js.map} +0 -0
  438. /package/dist/{refresh-MKSKISPX.js.map → refresh-SWW23DAQ.js.map} +0 -0
  439. /package/dist/{release-J5LIAIZT.js.map → release-FOBIO5QG.js.map} +0 -0
  440. /package/dist/{relevant-pages-MTMFMBPD.js.map → relevant-pages-MFJEPBR4.js.map} +0 -0
  441. /package/dist/{remove-LYEK7VFV.js.map → remove-OXAH3ZKL.js.map} +0 -0
  442. /package/dist/{reopen-FR4UBOG7.js.map → reopen-JFRI6ZR6.js.map} +0 -0
  443. /package/dist/{rerun-XPWGIVTT.js.map → rerun-73NGMIM7.js.map} +0 -0
  444. /package/dist/{research-PA53M335.js.map → research-SNMF4JOY.js.map} +0 -0
  445. /package/dist/{reset-RCYRE5WO.js.map → reset-222UFTF6.js.map} +0 -0
  446. /package/dist/{reset-H3ES4WV5.js.map → reset-B6JRVIIH.js.map} +0 -0
  447. /package/dist/{resolve-QIDQJCE6.js.map → resolve-XQCGZYTD.js.map} +0 -0
  448. /package/dist/{retry-WLVMR7XP.js.map → retry-O6BBBGXP.js.map} +0 -0
  449. /package/dist/{retry-PLLCFOJW.js.map → retry-TQHVMUU4.js.map} +0 -0
  450. /package/dist/{run-WMJPDX6U.js.map → run-6L3QS4PP.js.map} +0 -0
  451. /package/dist/{run-4D7ZCLMF.js.map → run-FDSII53R.js.map} +0 -0
  452. /package/dist/{scaffold-ad-VYYZIEQ2.js.map → scaffold-ad-WRPLC3JR.js.map} +0 -0
  453. /package/dist/{scaffold-static-ad-B3SZ2HLW.js.map → scaffold-static-ad-HRLKY5WF.js.map} +0 -0
  454. /package/dist/{scaffold-video-2QISC5CW.js.map → scaffold-video-LSOSZCVF.js.map} +0 -0
  455. /package/dist/{schedule-RXUUCNNI.js.map → schedule-KNRJAYCK.js.map} +0 -0
  456. /package/dist/{scheduled-agents-2NCGSD76.js.map → scheduled-agents-IPZ5QA6C.js.map} +0 -0
  457. /package/dist/{schema-SFODURN7.js.map → schema-H43I3TR4.js.map} +0 -0
  458. /package/dist/{search-7QVZOWSI.js.map → search-7CMRZNWL.js.map} +0 -0
  459. /package/dist/{select-C6CFCOEM.js.map → select-OKF5SLAO.js.map} +0 -0
  460. /package/dist/{set-prompt-MIMQYMGM.js.map → set-prompt-N54XKRGK.js.map} +0 -0
  461. /package/dist/{setup-links-XW4A6L2I.js.map → setup-links-2MOYMVEY.js.map} +0 -0
  462. /package/dist/{site-6UTQSYIK.js.map → site-BDTMN6VB.js.map} +0 -0
  463. /package/dist/{sources-QQNWQLUM.js.map → sources-4XCN3STL.js.map} +0 -0
  464. /package/dist/{sources-UGMZFZ2E.js.map → sources-TCEHZ5RV.js.map} +0 -0
  465. /package/dist/{stale-NOSV6ONW.js.map → stale-J5PKAEBW.js.map} +0 -0
  466. /package/dist/{status-NXGKJGH7.js.map → status-6AN44KXK.js.map} +0 -0
  467. /package/dist/{studio-HUEBE6DS.js.map → studio-TM3MAAUW.js.map} +0 -0
  468. /package/dist/{sync-RXS6BPLM.js.map → sync-TPOVAGPK.js.map} +0 -0
  469. /package/dist/{sync-definition-2DQN2KN3.js.map → sync-definition-A4SIK5VW.js.map} +0 -0
  470. /package/dist/{tags-CMBKEXIZ.js.map → tags-CN6I22A5.js.map} +0 -0
  471. /package/dist/{tags-C65JB762.js.map → tags-N6SF24MU.js.map} +0 -0
  472. /package/dist/{tags-R3K35KTL.js.map → tags-QITCY5QO.js.map} +0 -0
  473. /package/dist/{tags-GFFQLLG2.js.map → tags-TMUNXXYN.js.map} +0 -0
  474. /package/dist/{tags-IJN2SPSM.js.map → tags-U4JDAVUH.js.map} +0 -0
  475. /package/dist/{targeting-criteria-IHBPLHSX.js.map → targeting-criteria-DRA5JGCZ.js.map} +0 -0
  476. /package/dist/{targets-JH37NVJF.js.map → targets-B3HWHREZ.js.map} +0 -0
  477. /package/dist/{templates-HXSHQ23T.js.map → templates-53VD5PEV.js.map} +0 -0
  478. /package/dist/{testimonials-5QGCPZ6K.js.map → testimonials-NOTV6AON.js.map} +0 -0
  479. /package/dist/{top-companies-FJEFKVI7.js.map → top-companies-NIG3PBD3.js.map} +0 -0
  480. /package/dist/{triggers-SEOAAJSS.js.map → triggers-IIUPW5LU.js.map} +0 -0
  481. /package/dist/{unlink-UZDVSHBO.js.map → unlink-WRF3E3AL.js.map} +0 -0
  482. /package/dist/{unstage-CE5RRGM5.js.map → unstage-GXHKDXA5.js.map} +0 -0
  483. /package/dist/{update-JZ4I6WW7.js.map → update-4KUD5OH4.js.map} +0 -0
  484. /package/dist/{update-ZXOG2V34.js.map → update-6CHXJFMF.js.map} +0 -0
  485. /package/dist/{update-DGZKEP6T.js.map → update-FGTKHBEG.js.map} +0 -0
  486. /package/dist/{update-JOS4ITAV.js.map → update-R47RJ5NM.js.map} +0 -0
  487. /package/dist/{upload-SSOPA7ZT.js.map → upload-3IDNWUH7.js.map} +0 -0
  488. /package/dist/{url-options-QEWKRKZ3.js.map → url-options-GGXAL3J4.js.map} +0 -0
  489. /package/dist/{url-params-OR5N5EWT.js.map → url-params-EYHAK4TR.js.map} +0 -0
  490. /package/dist/{validate-4YXSJA4S.js.map → validate-S3S52QNH.js.map} +0 -0
  491. /package/dist/{videos-GIYDCCKR.js.map → videos-FH4XUXWR.js.map} +0 -0
  492. /package/dist/{viewer-check-VN2JK2LW.js.map → viewer-check-5TJ7UGMV.js.map} +0 -0
  493. /package/dist/{winning-ads-7QWEIMRU.js.map → winning-ads-QMTRP7DI.js.map} +0 -0
  494. /package/dist/{write-commands-SVJ43D7G.js.map → write-commands-N6ZN3B4E.js.map} +0 -0
  495. /package/dist/{x-OEAKQBB7.js.map → x-W6GJ63OZ.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/creatives/feedback.ts"],"sourcesContent":["import type { CreativesFeedbackRequest, CreativesFeedbackResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nconst DESCRIPTION =\n \"Read what this company's reviewers said about creative versions: recent Approve / Not this one verdicts with reasons and notes, the top rejection reasons, what approved versions share (format, platform, option), and hints[] saying what to do differently. Start here before making or changing a creative: baker creatives feedback; then baker creatives feedback --slug <slug> for one creative's history. When the user reacts to a version in the chat, record it with baker creatives feedback record.\";\n\nconst SLUG_DESCRIPTION = \"One creative's feedback (src/creatives/<slug>/). Left out, the whole company's.\";\nconst FULL_DESCRIPTION = \"Every verdict as stored (up to 200), notes whole. Default is a summary plus the 8 latest.\";\n\nregisterSchema({\n command: \"creatives.feedback\",\n description: DESCRIPTION,\n args: {\n slug: { type: \"string\", description: SLUG_DESCRIPTION, required: false },\n full: { type: \"boolean\", description: FULL_DESCRIPTION, required: false },\n },\n});\n\nconst readArgs = {\n slug: { type: \"string\", description: SLUG_DESCRIPTION, required: false },\n full: { type: \"boolean\", description: FULL_DESCRIPTION, required: false, default: false },\n} as const;\n\nconst feedbackReadCommand = defineCommand({\n meta: { name: \"read\", description: `${DESCRIPTION} Runs by default when no subcommand is given.` },\n args: readArgs,\n run: async ({ args }) => {\n try {\n const body: CreativesFeedbackRequest = {\n ...(typeof args.slug === \"string\" && args.slug.length > 0 ? { slug: args.slug } : {}),\n ...(args.full === true ? { full: true } : {}),\n };\n writeJson(await apiPost<CreativesFeedbackResponse>(\"/api/creatives/feedback\", body));\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n\nexport const feedbackCommand = defineCommand({\n meta: { name: \"feedback\", description: DESCRIPTION },\n subCommands: {\n read: feedbackReadCommand,\n record: () => import(\"./feedback-record.ts\").then((m) => m.feedbackRecordCommand),\n },\n // `args` stays although the parent has no `run`: citty finds the subcommand\n // name with THIS command's arg defs, so without them `--slug spring-offer`\n // would read `spring-offer` as a subcommand. `default` (not `run`) serves the\n // bare invocation, since citty runs a parent's `run` after its subcommand too.\n args: readArgs,\n default: \"read\",\n});\n"],"mappings":";;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAK9B,IAAM,cACJ;AAEF,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AAEzB,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,IACvE,MAAM,EAAE,MAAM,WAAW,aAAa,kBAAkB,UAAU,MAAM;AAAA,EAC1E;AACF,CAAC;AAED,IAAM,WAAW;AAAA,EACf,MAAM,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,EACvE,MAAM,EAAE,MAAM,WAAW,aAAa,kBAAkB,UAAU,OAAO,SAAS,MAAM;AAC1F;AAEA,IAAM,sBAAsB,cAAc;AAAA,EACxC,MAAM,EAAE,MAAM,QAAQ,aAAa,GAAG,WAAW,gDAAgD;AAAA,EACjG,MAAM;AAAA,EACN,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,OAAiC;AAAA,QACrC,GAAI,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,IAAI,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,QACnF,GAAI,KAAK,SAAS,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAAA,MAC7C;AACA,gBAAU,MAAM,QAAmC,2BAA2B,IAAI,CAAC;AAAA,IACrF,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;AAEM,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM,EAAE,MAAM,YAAY,aAAa,YAAY;AAAA,EACnD,aAAa;AAAA,IACX,MAAM;AAAA,IACN,QAAQ,MAAM,OAAO,+BAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,qBAAqB;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM;AAAA,EACN,SAAS;AACX,CAAC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/creatives/feedback-record.ts","../src/commands/creatives/agent-option-note.ts"],"sourcesContent":["import {\n CREATIVE_FEEDBACK_REASONS,\n type CreativesFeedbackRecordResponse,\n creativesFeedbackRecordRequestSchema,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { jevNoteJudge, readNoteAuthor } from \"./agent-option-note.ts\";\nimport { versionOf } from \"./version-of.ts\";\n\nconst DESCRIPTION = `Record what the user said about one version of a creative in this chat: Approve, or Not this one with reasons. Saved as their verdict (the person who wrote the latest message here), exactly like reviewing it in Baker, and read back by baker creatives feedback. One verdict per person per version or option: a later one replaces it.\nStart here: baker creatives feedback record --slug spring-offer --verdict rejected --reasons text_mistakes --note \"<their words>\"\nOnly record what the user said, never your own judgment. Picking one of several concepts is not a rejection of the others.`;\n\nconst ARGS = {\n slug: { type: \"string\", description: \"The creative: its folder name under src/creatives/.\", required: true },\n run: {\n type: \"string\",\n description: \"The version: its canvas run id (r_…) Left out, the version the creative shows now (its last render).\",\n required: false,\n },\n option: {\n type: \"string\",\n description:\n 'One option of a version that made several: its label (\"ugc\"), its number (\"2\") or its slot. Left out, the whole version.',\n required: false,\n },\n verdict: { type: \"string\", description: \"approved | rejected\", required: true },\n reasons: {\n type: \"string\",\n description: `Why it was rejected, comma-separated: ${CREATIVE_FEEDBACK_REASONS.join(\", \")}. Map the user's words to these; \"other\" when none fits. On a video, voice_or_sound covers the voiceover, music and mix (\"the voice sounds robotic\", \"music too loud\") and pacing covers the timing (\"too slow\", \"the hook comes too late\").`,\n required: false,\n },\n note: {\n type: \"string\",\n description: \"The user's own words, verbatim (not your summary). Up to 1000 characters.\",\n required: false,\n },\n} as const;\n\nregisterSchema({ command: \"creatives.feedback.record\", description: DESCRIPTION, args: ARGS });\n\nfunction splitList(value: unknown): string[] | undefined {\n if (typeof value !== \"string\" || value.trim() === \"\") return undefined;\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n}\n\nfunction fail(code: string, message: string): never {\n writeJson({ ok: false, error: { code, message } });\n process.exit(1);\n}\n\n/**\n * A rejection whose note only answers the agent's own question, or that says nothing, is not the\n * person's feedback. Returns whether the note could not be confirmed as the person's words.\n */\nasync function refuseNotFeedback(body: {\n verdict: string;\n reasons?: readonly string[];\n note?: string;\n}): Promise<boolean> {\n if (body.verdict === \"rejected\" && !body.reasons?.length && !body.note) {\n fail(\n \"VALIDATION_ERROR\",\n \"A rejection needs --reasons or --note (the user's words), so the next version knows what to change.\",\n );\n }\n if (body.verdict !== \"rejected\" || !body.note) return false;\n const author = await readNoteAuthor(body.note, jevNoteJudge);\n if (author === \"agent_option\") {\n fail(\n \"AGENT_OPTION_NOT_FEEDBACK\",\n `\"${body.note}\" is the answer to your own question, not the person's taste: a defect the checks found is yours to fix inside this version (\\`baker canvas run --fix\\`), never feedback to record. Record only what the person says about the ad in their own words.`,\n );\n }\n return author === \"unconfirmed\";\n}\n\nexport const feedbackRecordCommand = defineCommand({\n meta: { name: \"record\", description: DESCRIPTION },\n args: ARGS,\n run: async ({ args }) => {\n const reasons = splitList(args.reasons);\n const unknown = (reasons ?? []).filter(\n (reason) => !(CREATIVE_FEEDBACK_REASONS as readonly string[]).includes(reason),\n );\n if (unknown.length > 0) {\n fail(\"VALIDATION_ERROR\", `Unknown reason ${unknown.join(\", \")}. Use: ${CREATIVE_FEEDBACK_REASONS.join(\", \")}.`);\n }\n const parsed = creativesFeedbackRecordRequestSchema.safeParse({\n slug: args.slug,\n runId: await versionOf(String(args.slug), args.run).then(\n (run) => run ?? fail(\"VALIDATION_ERROR\", \"--run: this creative has no rendered version here; name one (r_…).\"),\n ),\n ...(typeof args.option === \"string\" && args.option.trim() ? { option: args.option.trim() } : {}),\n verdict: args.verdict,\n ...(reasons ? { reasons } : {}),\n ...(typeof args.note === \"string\" && args.note.trim() ? { note: args.note } : {}),\n });\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n fail(\"VALIDATION_ERROR\", `--${String(issue?.path[0] ?? \"args\")}: ${issue?.message ?? \"invalid\"}`);\n }\n const body = parsed.data;\n const noteUnconfirmed = await refuseNotFeedback(body);\n try {\n const response = await apiPost<CreativesFeedbackRecordResponse>(\n \"/api/creatives/feedback/record\",\n noteUnconfirmed ? { ...body, noteUnconfirmed } : body,\n );\n writeJson(response);\n } catch (err) {\n if (err instanceof ApiError) fail(err.code, err.message);\n fail(\"INTERNAL_ERROR\", \"Unexpected error\");\n }\n },\n});\n","/**\n * Whether a rejection's note is the agent's own words rather than the person's taste: the label\n * of an option the agent offered (\"Sí, corrige todo (Recomendado)\") or the answer to its own\n * \"fix what is pending?\" (\"Fix everything\"). Production Oct 2026: both were recorded as\n * rejections, so every fix became a new version and later chats read the agent's own defects as\n * the company's taste. The agent writes those options in the marketer's language, so the decision\n * model reads the note in whatever language it is in (docs/decision-model.md).\n */\nimport { askJev } from \"../../engine/nodes/local/lib/jev.ts\";\nimport type { ReviewUsage } from \"../../engine/nodes/local/lib/render-review.ts\";\nimport { holdWorkspaceSpend } from \"../canvas/unbilled-spend.ts\";\n\n/**\n * The bands, measured 2026-10-07 on 30 notes in 8 languages (scripts/agent-option-note-evals,\n * three runs). A recommended tag scored 0.92 or more on the agent's labels and 0.03 or less on\n * people's notes. A bare yes to fixing scored 0.59 or more on the agent's untagged answers and\n * 0.31 or less on people's, except \"fix all the typos\" (0.52-0.56), which names its problem\n * (0.86; the agent's answers 0.12 or less).\n */\nexport const NOTE_BANDS = { tagged: 0.5, bareFix: 0.45, namesProblem: 0.5 } as const;\n\nconst TAGGED = \"Does `note` end with a tag marking it as the recommended option, like (Recommended), in any language?\";\nconst BARE_FIX =\n 'Is `note` a bare yes to an offer to fix things, like \"fix everything\" or \"fix what is pending\", naming no particular problem? A note that names what is wrong or what to change (the typos, the price, cut-off text, redo the pieces) is not.';\nconst NAMES_PROBLEM =\n \"Does `note` name a particular problem, element or part of an ad (a typo, the price, the logo, the audio, the text, the colours, a person), apart from a whole format or size?\";\n\n/** Three judgments about one note, each a probability; one judgment per question, combined in code. */\nexport type NoteReading = { tagged: number; bareFix: number; namesProblem: number };\n\n/** The decision model's reading of `note`; null when no judgment came back. */\nexport type NoteJudge = (note: string) => Promise<NoteReading | null>;\n\n/** The decision model as the judge: three Nouls in one request. */\nexport const jevNoteJudge: NoteJudge = async (note) => {\n const spent: ReviewUsage[] = [];\n const answers = await askJev(\n [TAGGED, BARE_FIX, NAMES_PROBLEM].map((question) => ({ instructions: { note, question } })),\n (usage) => spent.push(usage),\n );\n await holdWorkspaceSpend(spent);\n if (answers === null) return null;\n const [tagged = 0, bareFix = 0, namesProblem = 1] = answers;\n return { tagged, bareFix, namesProblem };\n};\n\n/** The agent's option label, or its bare fix answer naming nothing of the ad. Pure. */\nexport function readsAsAgentOption(reading: NoteReading): boolean {\n if (reading.tagged >= NOTE_BANDS.tagged) return true;\n return reading.bareFix >= NOTE_BANDS.bareFix && reading.namesProblem < NOTE_BANDS.namesProblem;\n}\n\n/** Whose words a note is: the agent's own option, the person's, or unconfirmed when no judgment came back. */\nexport type NoteAuthor = \"agent_option\" | \"person\" | \"unconfirmed\";\n\n/**\n * Who wrote `note`, as the decision model reads it. No judgment (no key, a timeout, an outage) is\n * \"unconfirmed\", never the person's: Baker keeps that note but does not read it as taste (B5).\n */\nexport async function readNoteAuthor(note: string, judge: NoteJudge): Promise<NoteAuthor> {\n const text = note.trim();\n if (!text) return \"person\";\n const reading = await judge(text).catch(() => null);\n if (reading === null) return \"unconfirmed\";\n return readsAsAgentOption(reading) ? \"agent_option\" : \"person\";\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/avatars/research.ts","../src/commands/avatars/researchHints.ts"],"sourcesContent":["import { AVATAR_HANDLE_PATTERN, type AvatarsResearchRequest, type AvatarsResearchResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { chatIdFromEnv } from \"./casting.ts\";\nimport { failAvatarApi, failValidation } from \"./failures.ts\";\nimport { type ResearchCall, researchHints } from \"./researchHints.ts\";\nimport { writeAvatars } from \"./transport.ts\";\n\n/** Searches, profile reads, a vision check and the photo ingests — well past the default minute on a slow day. */\nconst RESEARCH_TIMEOUT_MS = 180_000;\n\nregisterSchema({\n command: \"avatars.research\",\n description:\n 'Find a REAL, named person from a description and gather their public photos — and, with --create, build their avatar from them. Start here: `baker avatars research \"Lautaro Suarez, CTO at Vibiz\" --create`. Use it whenever copy shows a real person by name: a testimonial author with their role and company, the company\\'s founder or CEO, a named team member. Describe them, never pass a profile link: \"<name>, <role> at <company>\", or \"the CEO of <company>\" when the copy names a role. Identity is checked in code (name AND company must match a public profile): `found` returns their photos (now in the image library) and a subject description; `possible` returns the half-matches to pick from with --linkedin; `not_found` means fall back to an invented one-off person. The company naming them in its copy is the go-ahead to use their likeness — no confirmation question. A person who already has an avatar comes back with it (`reused: true`) — nothing searched, nothing billed — so run it every time copy names someone.',\n args: {\n who: {\n type: \"string\",\n description: 'How the copy names them, e.g. \"Lautaro Suarez, CTO at Vibiz\" or \"the CEO of Vibiz\"',\n required: true,\n },\n name: {\n type: \"string\",\n description: \"Their full name, when the description leaves it out or reads it wrong\",\n required: false,\n },\n role: { type: \"string\", description: 'Their role, e.g. \"CTO\", \"Founder\"', required: false },\n company: { type: \"string\", description: \"The company they are at\", required: false },\n linkedin: {\n type: \"string\",\n description:\n \"Only to pick one of the candidates a `possible` answer listed. Never go looking for a link yourself.\",\n required: false,\n },\n create: {\n type: \"boolean\",\n description: \"Build their avatar from the photos right away (likeness `licensed`, no face picker)\",\n required: false,\n },\n handle: {\n type: \"string\",\n description: \"Mention handle for the avatar --create builds (derived from the name when omitted)\",\n required: false,\n },\n full: {\n type: \"boolean\",\n description: \"Include their about text, location and every search that was run\",\n required: false,\n },\n },\n});\n\n/**\n * Compact by default: what an agent needs to decide — who, how sure, which photos,\n * which avatar. The about text is paragraphs long and only matters to a reader.\n */\nfunction compact(data: AvatarsResearchResponse, full: boolean): Record<string, unknown> {\n if (full) return data;\n const { searched, person, ...rest } = data;\n const { about: _about, location: _location, ...who } = person ?? { socials: {} };\n return {\n ...rest,\n ...(person ? { person: who } : {}),\n // A `not_found` is only useful with what was tried.\n ...(data.status === \"not_found\" ? { searched } : {}),\n };\n}\n\nexport const researchCommand = defineCommand({\n meta: {\n name: \"research\",\n description:\n 'Find a real, named person from a description and build their avatar from their public photos. Example: baker avatars research \"Lautaro Suarez, CTO at Vibiz\" --create',\n },\n args: {\n who: {\n type: \"positional\",\n description: 'Who: \"<name>, <role> at <company>\" or \"the CEO of <company>\"',\n required: false,\n },\n name: { type: \"string\", description: \"Their full name (overrides the description)\", required: false },\n role: { type: \"string\", description: \"Their role (overrides the description)\", required: false },\n company: { type: \"string\", description: \"Their company (overrides the description)\", required: false },\n linkedin: { type: \"string\", description: \"Pick one candidate from a `possible` answer\", required: false },\n create: { type: \"boolean\", description: \"Build their avatar from the photos\", required: false, default: false },\n handle: { type: \"string\", description: \"Mention handle for the new avatar\", required: false },\n full: {\n type: \"boolean\",\n description: \"Include about, location and the searches run\",\n required: false,\n default: false,\n },\n },\n run: async ({ args }) => {\n const text = (key: string) => {\n const value = (args as Record<string, unknown>)[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n };\n const call = callOf(text, Boolean(args.create));\n const { who, name, company, handle } = call;\n if (!who && !name && !company) {\n failValidation(\n 'Say who to research, e.g. `baker avatars research \"Lautaro Suarez, CTO at Vibiz\"` or `baker avatars research \"the CEO of Vibiz\"`.',\n );\n }\n if (handle && !AVATAR_HANDLE_PATTERN.test(handle)) {\n failValidation(\n `--handle \"${handle}\" is not usable. Use lowercase letters, numbers and dashes, starting with a letter — \"lautaro-suarez\". Leave it off to have one derived from the name.`,\n );\n }\n\n const linkedinUrl = text(\"linkedin\");\n const chatId = chatIdFromEnv();\n const body: AvatarsResearchRequest = {\n ...call,\n ...(linkedinUrl ? { linkedinUrl } : {}),\n ...(chatId ? { chatId } : {}),\n };\n\n try {\n const data = await writeAvatars<AvatarsResearchResponse>(\"/api/avatars/research\", body, {\n timeoutMs: RESEARCH_TIMEOUT_MS,\n });\n writeJson({ ok: true, data: compact(data, Boolean(args.full)), hints: researchHints(data, call) });\n } catch (err) {\n failAvatarApi(err, handle);\n }\n },\n});\n\n/** The call as it was made: the description and the flags given, each only when set. */\nfunction callOf(text: (key: string) => string | undefined, create: boolean): ResearchCall {\n const who = text(\"who\");\n const name = text(\"name\");\n const role = text(\"role\");\n const company = text(\"company\");\n const handle = text(\"handle\")?.toLowerCase();\n const linkedin = text(\"linkedin\");\n return {\n ...(who ? { who } : {}),\n ...(name ? { name } : {}),\n ...(role ? { role } : {}),\n ...(company ? { company } : {}),\n ...(handle ? { handle } : {}),\n ...(linkedin ? { linkedin } : {}),\n create,\n };\n}\n","import type { AvatarsResearchResponse } from \"@baker/api\";\n\n/** How the command was called, so a hint can hand back the exact next command. */\nexport interface ResearchCall {\n who?: string;\n name?: string;\n role?: string;\n company?: string;\n handle?: string;\n linkedin?: string;\n create: boolean;\n}\n\n/** The person as the call described them. */\nfunction described(call: ResearchCall): string {\n return call.who ?? [call.name, call.role, call.company].filter(Boolean).join(\", \");\n}\n\n/** The call again, exactly as it was made (without `--create`, which each hint adds when it applies). */\nfunction rerunOf(call: ResearchCall): string {\n return [\n \"baker avatars research\",\n call.who ? quoted(call.who) : undefined,\n call.name ? `--name ${quoted(call.name)}` : undefined,\n call.role ? `--role ${quoted(call.role)}` : undefined,\n call.company ? `--company ${quoted(call.company)}` : undefined,\n call.handle ? `--handle ${call.handle}` : undefined,\n call.linkedin ? `--linkedin ${call.linkedin}` : undefined,\n ]\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction quoted(text: string): string {\n return `\"${text.replaceAll('\"', '\\\\\"')}\"`;\n}\n\nfunction possibleHints(data: AvatarsResearchResponse, rerun: string, create: string): string[] {\n const lines = (data.candidates ?? []).map((candidate) =>\n [candidate.name, candidate.headline, candidate.linkedin].filter(Boolean).join(\" — \"),\n );\n const example = data.candidates?.[0]?.linkedin ?? \"<profile url>\";\n return [\n `Not sure it is them: these profiles matched only in part, so no photo was taken.\\n${lines.map((line) => ` - ${line}`).join(\"\\n\")}`,\n `If the copy makes clear which one is the person (same company, same role), take it: \\`${rerun} --linkedin ${example}${create}\\`. If none of them clearly is, treat this as not found — never put a face in an ad on a guess.`,\n ];\n}\n\nfunction notFoundHints(data: AvatarsResearchResponse): string[] {\n const searched = data.searched.map((query) => `\"${query}\"`).join(\", \");\n return [\n `No public profile could be tied to this person${searched ? ` (searched ${searched})` : \"\"}, so no photo was taken. Carry on with an invented one-off person drawn from the description, exactly as for anyone unnamed — never a photo of somebody else, and never stall the job over it. If you have their exact name or company and it differs from what was searched, run this again with \\`--name\\` / \\`--company\\`.`,\n ];\n}\n\nfunction avatarHints(avatar: NonNullable<AvatarsResearchResponse[\"avatar\"]>, name: string): string[] {\n const where = avatar.reused\n ? `@${avatar.handle} is already ${name}'s avatar — reused, not built again.`\n : `@${avatar.handle} is ${name}'s avatar, built from their real photos. Its sheet settles in about 30s: if the next thing you do needs it, \\`baker avatars get ${avatar.handle} --wait\\`.`;\n return [\n where,\n `Use it everywhere ${name} appears: \\`--avatar ${avatar.handle}\\` on static ads, video and Studio renders; on a landing, their photo is the avatar's \\`coverUrl\\` from \\`baker avatars get ${avatar.handle}\\` (upscale it when it is shown large). Never invent another face for them.`,\n ];\n}\n\nfunction foundHints(data: AvatarsResearchResponse, call: ResearchCall, rerun: string): string[] {\n const name = data.person?.name ?? described(call);\n if (data.avatar) return avatarHints(data.avatar, name);\n\n const photoIds = (data.photos ?? []).map((photo) => photo.imageId).join(\",\");\n if (!photoIds) {\n return [\n `Found ${name}, but no usable photo of them was public${call.create ? \", so no avatar was built\" : \"\"}. Carry on with an invented one-off person drawn from the description.`,\n ];\n }\n if (call.create) {\n return [\n `Found ${name}, but their avatar could not be built automatically. Build it from the photos yourself: \\`baker avatars create --name ${quoted(name)} --subject \"<one person, plainly: age, build, hair, skin, face>\" --source-image ${photoIds} --likeness-confirmed\\`.`,\n ];\n }\n return [\n `Found ${name}; their photos are in the image library (${photoIds}). Build their avatar from them: \\`${rerun} --create\\`.`,\n ];\n}\n\n/** What the agent should do next with a research answer, keyed off its status. */\nexport function researchHints(data: AvatarsResearchResponse, call: ResearchCall): string[] {\n const rerun = rerunOf(call);\n if (data.status === \"possible\") {\n return possibleHints(data, rerunOf({ ...call, linkedin: undefined }), call.create ? \" --create\" : \"\");\n }\n if (data.status === \"not_found\") return notFoundHints(data);\n return foundHints(data, call, rerun);\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/creatives/translate.ts","../src/commands/creatives/translate-ad.ts","../src/commands/creatives/translate-model.ts"],"sourcesContent":["/**\n * `baker creatives translate --slug <ad> --to es-MX,es-CO`: the command around `translateAd`. Local\n * file work and one text call, so no backend route: the new ads reach the dashboard through\n * `canvas sync-definition`, as `creatives make --series` does, and the call's spend waits in the\n * canvas cache for the next run record to bill (`holdUnbilledSpend`).\n */\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { askJev } from \"../../engine/nodes/local/lib/jev.ts\";\nimport { askAboutImages, RENDER_REVIEW_MODEL, type ReviewUsage } from \"../../engine/nodes/local/lib/render-review.ts\";\nimport { optionalChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { runBaker as baker } from \"../baker-child.ts\";\nimport { findWorkspaceRoot } from \"../canvas/normalize-paths.ts\";\nimport { holdUnbilledSpend } from \"../canvas/unbilled-spend.ts\";\nimport { translateAd, translateEnvelope } from \"./translate-ad.ts\";\nimport { type Failure, quoteLineQuestion } from \"./translate-model.ts\";\n\n/** How long the one call for every language may take. */\nconst TRANSLATE_TIMEOUT_MS = 120_000;\n\nconst DESCRIPTION = `The same static ad in other languages. Each language becomes its own creative, <ad>-<lang>, made as an ad of the series <ad> leads: its ready picture with only the words changed, so the design is never made again per language. Every language is translated in one call (transcreated for the market, same role and length per line, brand names, prices and numbers kept); seconds, nothing rendered. The ad must have a ready version.\n\nStart here:\n baker creatives translate --slug spring-offer --to es-MX,es-CO,pt-BR # one ad per country: Mexico and Colombia are two ads\n baker creatives translate --slug spring-offer --to de,fr # a language with no country: its neutral variety\n baker creatives translate --slug spring-offer --to de --copy-file de.json # your own lines: {\"de\": [\"line 1\", \"line 2\"]}\nTen angle ads in three languages: one design (the lead), the angle ads (creatives make <idea> --series <lead>), then translate each angle ad. Never a new canvas or a new design per language.\nThen: baker canvas run --series spring-offer (renders every language at once). Adding a language later leaves the ones made as they are.`;\n\nconst ARGS = {\n slug: {\n type: \"string\",\n required: true,\n description: \"The ad to translate (its creative slug); it must have a ready version\",\n },\n to: {\n type: \"string\",\n required: true,\n description:\n \"The languages, comma-separated BCP-47 codes: es-MX,es-CO,pt-BR (a country's own variety) or de,fr. One new creative each: <slug>-<tag in lowercase>\",\n },\n \"copy-file\": {\n type: \"string\",\n required: false,\n description:\n 'A JSON file with the lines yourself, no model asked: {\"es\": [\"line 1\", \"line 2\"]}, one line per line of the ad, in its order',\n },\n again: {\n type: \"boolean\",\n required: false,\n default: false,\n description:\n \"Translate a language already made again (after the ad's words changed); without it, a made language is left as it is\",\n },\n} as const;\n\nregisterSchema({ command: \"creatives.translate\", description: DESCRIPTION, args: ARGS });\n\nfunction fail(error: Failure): never {\n writeJson({ ok: false, error });\n process.exit(1);\n}\n\nasync function readCopyFile(file: string): Promise<unknown> {\n try {\n return JSON.parse(await readFile(path.resolve(file), \"utf8\"));\n } catch (e) {\n fail({\n code: \"translate_copy_file_unreadable\",\n message: `The copy file ${file} could not be read as JSON (${e instanceof Error ? e.message : String(e)}).`,\n fix: 'Write it as {\"<lang>\": [\"line 1\", \"line 2\"]}, one array per language.',\n });\n }\n}\n\nexport const translateCommand = defineCommand({\n meta: { name: \"translate\", description: DESCRIPTION },\n args: ARGS,\n async run({ args }) {\n const root = findWorkspaceRoot(process.cwd()) ?? process.cwd();\n const copyFile = typeof args[\"copy-file\"] === \"string\" && args[\"copy-file\"] ? args[\"copy-file\"] : undefined;\n const copy = copyFile ? await readCopyFile(copyFile) : undefined;\n const spent: ReviewUsage[] = [];\n const result = await translateAd(root, String(args.slug), String(args.to), {\n ask: (prompt) =>\n askAboutImages(RENDER_REVIEW_MODEL, [], prompt, (usage) => spent.push(usage), TRANSLATE_TIMEOUT_MS).catch(\n () => null,\n ),\n ...(copy !== undefined ? { copy } : {}),\n again: args.again === true,\n sync: (dir) => baker([\"canvas\", \"sync-definition\", dir, \"--title\"]),\n chatId: optionalChatId() ?? null,\n judgeQuotes: (texts) => askJev(texts.map(quoteLineQuestion), (usage) => spent.push(usage)),\n });\n // No run record carries this call: the next render of this workspace bills it. The ads are made\n // by now, so a cache that cannot be written never costs the command its answer.\n await holdUnbilledSpend(path.join(root, \"canvas\", \".cache\"), spent).catch(() => undefined);\n if (\"code\" in result) fail(result);\n writeJson(translateEnvelope(result));\n },\n});\n","/**\n * `baker creatives translate --slug <ad> --to es,de`: the same ad in other languages. Each\n * language is a new creative, `<ad>-<lang>`, made as an ad of the series `<ad>` leads: the ad's\n * ready picture with only its words changed to theirs, so the design is never made again per\n * language. Every language is translated in one text call (or read from the agent's own file);\n * nothing is rendered here: `baker canvas run --series <ad>` renders them all at once.\n */\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { CreativesRunData } from \"@baker/api\";\nimport { readAdSpec } from \"../../engine/scaffold/static-ad-spec.ts\";\nimport { languageName, languageTag, sameTag, tagSlug } from \"../../language.ts\";\nimport { parseDefinitionStrategyFields } from \"../canvas/creative-definition.ts\";\nimport { claimNewCreativeInWorkspace, creativeLimitRefusal } from \"../canvas/creative-limit.ts\";\nimport { leadVersion, seriesLeadsAbove, writeSeriesMemberCanvas } from \"../canvas/series-member.ts\";\nimport {\n acceptTranslations,\n buildTranslatePrompt,\n customersWordsAmong,\n type Failure,\n MESSAGE_ROLE,\n parseLanguages,\n translatedDefinition,\n translatedSpec,\n} from \"./translate-model.ts\";\n\n/** What became of one language. */\nexport type Translation = {\n language: string;\n creative: string;\n status: \"made\" | \"exists\" | \"refused\";\n error?: Failure;\n};\n\nexport type Translated = { source: string; sourceLanguage?: string; leadsAbove: string[]; translations: Translation[] };\n\ntype Deps = {\n /** The text model, asked once for every language; its parsed JSON answer, or null. */\n ask: (prompt: string) => Promise<unknown>;\n /** The lines the agent wrote itself (`--copy-file`): no model is asked. */\n copy?: unknown;\n /** Translate a language already made again (its words), instead of leaving it as it is. */\n again?: boolean;\n sync: (dir: string) => Promise<unknown>;\n chatId: string | null;\n fetchRecord?: (runId: string) => Promise<CreativesRunData | null>;\n /** Jev: how likely each line is a customer's own words; null when it could not answer. */\n judgeQuotes?: (texts: string[]) => Promise<number[] | null>;\n};\n\n/** The creative a language of `source` is: `<source>-<tag>`, the tag lowercase (`spring-offer-es-mx`). */\nexport const translationSlug = (source: string, language: string) => `${source}-${tagSlug(language)}`;\n\nconst creativeDir = (root: string, slug: string) => path.join(root, \"src\", \"creatives\", slug);\n\nfunction definitionOf(root: string, slug: string): Promise<string | null> {\n return readFile(path.join(creativeDir(root, slug), \"_definition.md\"), \"utf8\").catch(() => null);\n}\n\n/** The language the source is in: its `_definition.md`'s, else its market's. */\nfunction sourceLanguageOf(definition: string, spec: Record<string, unknown>): string | undefined {\n const market = (spec.viewer as { market?: { language?: unknown } } | undefined)?.market?.language;\n return (\n parseDefinitionStrategyFields(definition).language ??\n (typeof market === \"string\" ? (languageTag(market) ?? undefined) : undefined)\n );\n}\n\n/**\n * What each language asked comes to before any words are written: already made (left as it is\n * unless `again`), its slug taken by another creative, or to translate.\n */\nasync function planLanguages(\n root: string,\n source: string,\n languages: readonly string[],\n again: boolean,\n): Promise<{ settled: Translation[]; pending: string[] }> {\n const settled: Translation[] = [];\n const pending: string[] = [];\n for (const language of languages) {\n const creative = translationSlug(source, language);\n const existing = await definitionOf(root, creative);\n const fields = existing === null ? null : parseDefinitionStrategyFields(existing);\n const ours = fields?.seriesLead === source && sameTag(fields.language ?? \"\", language);\n if (!fields || (again && ours)) {\n pending.push(language);\n } else if (ours) {\n settled.push({ language, creative, status: \"exists\" });\n } else {\n settled.push({\n language,\n creative,\n status: \"refused\",\n error: {\n code: \"translate_slug_taken\",\n message: `\"${creative}\" is already another creative, not the ${languageName(language) ?? language} version of \"${source}\".`,\n fix: `Rename or remove src/creatives/${creative}/ if it is a leftover, then translate again.`,\n },\n });\n }\n }\n return { settled, pending };\n}\n\n/** Each pending language's lines: the agent's own (`copy`), else one model call for all of them. */\nasync function wordsFor(\n pending: readonly string[],\n lines: ReadonlyArray<{ text: string; role?: string }>,\n context: { from?: string; brand?: string },\n deps: Pick<Deps, \"ask\" | \"copy\">,\n): Promise<Record<string, string[]>> {\n if (pending.length === 0) return {};\n const answer = deps.copy ?? (await deps.ask(buildTranslatePrompt(lines, pending, context)));\n const full = acceptTranslations(answer, pending, lines.length);\n // An agent's own file may give the printed lines alone: the message then stays the source's.\n const asked = lines.filter((l) => l.role !== MESSAGE_ROLE).length;\n const printedOnly = deps.copy !== undefined && asked < lines.length ? acceptTranslations(answer, pending, asked) : {};\n return { ...printedOnly, ...full };\n}\n\n/** The ad `source` in each language `to` names, or why none could be made. */\nexport async function translateAd(root: string, source: string, to: string, deps: Deps): Promise<Translated | Failure> {\n const version = await leadVersion(root, source, deps.fetchRecord);\n if (\"refused\" in version) return version.refused;\n const spec = version.spec as Record<string, unknown>;\n if (spec.native) {\n return {\n code: \"translate_native_unsupported\",\n message: `\"${source}\" is a copy of a screen people know (a post, a chat, a review wall): its words are not lines of copy to translate.`,\n fix: \"Make it in the other language as its own ad: baker creatives make <idea> with the words written in that language.\",\n };\n }\n const sourceDefinition = (await definitionOf(root, source)) ?? \"---\\nkind: static\\n---\\n\";\n const sourceLanguage = sourceLanguageOf(sourceDefinition, spec);\n const asked = parseLanguages(to, sourceLanguage);\n if (\"code\" in asked) return asked;\n\n const { settled, pending } = await planLanguages(root, source, asked.languages, deps.again === true);\n const lines = version.lead.copy;\n // A customer's words stay theirs: translated, they would be words nobody said under their name.\n const quoted = pending.length > 0 ? await customersWordsAmong(lines, deps.judgeQuotes) : new Set<number>();\n if (pending.length > 0 && lines.every((_, i) => quoted.has(i))) {\n return {\n source,\n ...(sourceLanguage ? { sourceLanguage } : {}),\n leadsAbove: await seriesLeadsAbove(root, source),\n translations: [...settled, ...pending.map((language) => nothingToTranslate(source, language))],\n };\n }\n const brand = readAdSpec(spec).brand?.name;\n // What the ad says is asked in the same call, so the team reads it in the ad's own language.\n const message = parseDefinitionStrategyFields(sourceDefinition).message;\n const marked = lines.map((line, i) => (quoted.has(i) ? { ...line, customersWords: true } : line));\n const asks = message ? [...marked, { text: message, role: MESSAGE_ROLE }] : marked;\n const words = await wordsFor(\n pending,\n asks,\n { ...(sourceLanguage ? { from: sourceLanguage } : {}), ...(brand ? { brand } : {}) },\n deps,\n );\n const translations = [...settled];\n for (const language of pending) {\n translations.push(\n await makeTranslation(\n root,\n { source, language, sourceDefinition, spec, lines, quoted, words: words[language] },\n deps,\n ),\n );\n }\n const order = new Map(asked.languages.map((l, i) => [l, i]));\n translations.sort((a, b) => (order.get(a.language) ?? 0) - (order.get(b.language) ?? 0));\n return {\n source,\n ...(sourceLanguage ? { sourceLanguage } : {}),\n leadsAbove: await seriesLeadsAbove(root, source),\n translations,\n };\n}\n\n/**\n * A language for an ad whose every line is a customer's words, kept as they said them: it would be\n * the same ad, which the series run refuses, and the words left to change are the customer's. Pure.\n */\nfunction nothingToTranslate(source: string, language: string): Translation {\n const name = languageName(language) ?? language;\n return {\n language,\n creative: translationSlug(source, language),\n status: \"refused\",\n error: {\n code: \"translate_nothing_to_translate\",\n message: `Every line of \"${source}\" is a customer's own words, kept as they said them, so in ${name} it would be the same ad.`,\n fix: `Never translate a customer's words yourself: that puts words they never said under their name. To reach ${name} speakers, run \"${source}\" as it is, or give it a line of your own (a headline or a call to action), render it, then translate again.`,\n },\n };\n}\n\n/** One language written as an ad of the source's series: its words, its definition and its canvas. */\nasync function makeTranslation(\n root: string,\n t: {\n source: string;\n language: string;\n sourceDefinition: string;\n spec: Record<string, unknown>;\n lines: ReadonlyArray<{ text: string; role?: string }>;\n quoted: ReadonlySet<number>;\n words: string[] | undefined;\n },\n deps: Deps,\n): Promise<Translation> {\n const creative = translationSlug(t.source, t.language);\n const refused = (error: Failure): Translation => ({ language: t.language, creative, status: \"refused\", error });\n const name = languageName(t.language) ?? t.language;\n if (!t.words) {\n return refused(\n deps.copy !== undefined\n ? {\n code: \"translate_copy_missing\",\n message: `The copy file has no ${name} lines, or not one for each of the ad's ${t.lines.length} lines.`,\n fix: `Give \"${t.language}\" an array of ${t.lines.length} lines in the ad's order in the copy file.`,\n }\n : {\n code: \"translate_failed\",\n message: `The ${name} words could not be written.`,\n fix: `Write them yourself: --copy-file <json> with {\"${t.language}\": [${t.lines.length} lines in the ad's order]}.`,\n },\n );\n }\n const dir = creativeDir(root, creative);\n const definitionPath = path.join(dir, \"_definition.md\");\n const claim = await claimNewCreativeInWorkspace(path.join(root, \"canvas\"), creative, deps.chatId, definitionPath);\n if (!claim.allowed) return refused(creativeLimitRefusal(creative).error);\n await mkdir(dir, { recursive: true });\n await writeFile(\n path.join(dir, \"prompt.json\"),\n `${JSON.stringify(translatedSpec(t.spec, t.words, t.language, t.quoted), null, 2)}\\n`,\n \"utf8\",\n );\n const headline = Math.max(\n 0,\n t.lines.findIndex((l) => l.role === \"headline\"),\n );\n await writeFile(\n definitionPath,\n translatedDefinition(t.sourceDefinition, {\n source: t.source,\n language: t.language,\n title: t.words[headline] ?? creative,\n ...(t.words.length > t.lines.length ? { message: t.words[t.lines.length] } : {}),\n }),\n \"utf8\",\n );\n const made = await writeSeriesMemberCanvas(root, creative, {\n leadWords: true,\n ...(deps.fetchRecord ? { fetchRecord: deps.fetchRecord } : {}),\n });\n if (made === null || \"refused\" in made) {\n return refused(made?.refused ?? { code: \"translate_not_made\", message: `\"${creative}\" could not be made.` });\n }\n // The dashboard learns the translation and its series now, not at Publish.\n await deps.sync(dir);\n return { language: t.language, creative, status: \"made\" };\n}\n\n/** What `translate` prints: each language's ad, then the one series run that renders them all. Pure. */\nexport function translateEnvelope(result: Translated) {\n const made = result.translations.filter((t) => t.status !== \"refused\").map((t) => t.creative);\n const refused = result.translations.filter((t) => t.status === \"refused\");\n const order = [...result.leadsAbove].reverse().concat(result.source);\n return {\n ok: true as const,\n data: {\n source: result.source,\n made,\n translations: result.translations.map((t) => ({ ...t, name: languageName(t.language) ?? t.language })),\n },\n hints: [\n ...(made.length > 0\n ? [\n `Next: baker canvas run --series ${result.source} renders every language at once, each the ${result.source} picture with its own words, reviewed and corrected on its own. A language already rendered from the current version of ${result.source} is not rendered again.`,\n ]\n : []),\n `A later change to ${result.source} (its picture or design) reaches every language on the next ${order.map((slug) => `baker canvas run --series ${slug}`).join(\", then \")}. A change to its words does not: translate again with --again for the languages to update.`,\n ...refused.map((t) => `${t.creative}: ${t.error?.message ?? \"not made\"}${t.error?.fix ? ` ${t.error.fix}` : \"\"}`),\n ],\n };\n}\n","/**\n * `baker creatives translate`, its decisions: which languages, what the model is asked, which\n * answer is kept, and what each translation is on disk (its words in the source's spec, its\n * `_definition.md`). A translation is an ad of the series the source leads: the source's picture\n * with only its words changed, so ten ads in three languages stay one design. Pure.\n */\nimport { z } from \"zod\";\nimport { isAdSpec, readAdSpec } from \"../../engine/scaffold/static-ad-spec.ts\";\nimport { isCustomersWords, isSignatureLine, maybeSigned } from \"../../engine/scaffold/static-proof.ts\";\nimport { languageName, languageRegion, languageTag, sameTag } from \"../../language.ts\";\nimport { setDefinitionFields } from \"./make-model.ts\";\nimport { withoutFields } from \"./make-series.ts\";\n\nexport type Failure = { code: string; message: string; fix?: string };\n\n/** The languages `--to` names, as lowercase tags, once each; refused when one names none or is the ad's own. */\nexport function parseLanguages(raw: string, sourceLanguage: string | undefined): { languages: string[] } | Failure {\n const asked = raw\n .split(\",\")\n .map((code) => code.trim())\n .filter(Boolean);\n if (asked.length === 0) {\n return {\n code: \"translate_language_invalid\",\n message: \"No language was named.\",\n fix: \"Name each language as a code, comma-separated: --to es,de,fr (pt-BR, es-MX for a regional variant).\",\n };\n }\n const languages: string[] = [];\n for (const code of asked) {\n const tag = languageTag(code);\n if (!tag) {\n return {\n code: \"translate_language_invalid\",\n message: `\"${code}\" is not a language code.`,\n fix: \"Name each language as a BCP-47 code: es, de, fr, pt-BR, es-MX.\",\n };\n }\n if (sourceLanguage && sameTag(tag, sourceLanguage)) {\n return {\n code: \"translate_same_language\",\n message: `The ad is already in ${languageName(tag) ?? tag}.`,\n fix: `Leave ${code} out of --to.`,\n };\n }\n if (!languages.some((l) => sameTag(l, tag))) languages.push(tag);\n }\n return { languages };\n}\n\ntype Line = { text: string; role?: string; customersWords?: boolean };\n\n/** Jev's question for one copy line: whether it is a customer's own words, the advertiser's copy aside. */\nexport const quoteLineQuestion = (text: string) => ({\n instructions: {\n question:\n \"Is `line` a customer's or reviewer's own words (a testimonial, or a quote signed with the name of the person who said it), rather than the advertiser's own copy, in whatever language it is written?\",\n line: text,\n },\n});\n\n/** At or above, Jev holds a line to be a customer's own words (scripts/quote-line-evals). */\nexport const CUSTOMERS_WORDS = 0.5;\n\n/**\n * The indexes of `lines` that are a customer's own words: set as a quote, signed by its shape\n * alone or by a signature on the line below it, else held so by `judge` (Jev, one probability per\n * text), a line below that may sign it asked with it. Without a judge only the shape and the role\n * decide: a line nobody can tell is translated, as the advertiser's copy is.\n */\nexport async function customersWordsAmong(\n lines: readonly Line[],\n judge?: (texts: string[]) => Promise<number[] | null>,\n): Promise<Set<number>> {\n const kept = new Set<number>();\n const open: number[] = [];\n lines.forEach((line, i) => {\n if (line.role === MESSAGE_ROLE) return;\n // A signature on a line of its own signs the line right above it: that line is the quote.\n const below = lines[i + 1];\n if (isCustomersWords(line) || (below !== undefined && isSignatureLine(below))) kept.add(i);\n else open.push(i);\n });\n if (!judge || open.length === 0) return kept;\n // A hyphen opening the line below may sign this one or be the advertiser's own: asked together.\n const asked = (i: number) => {\n const text = lines[i]?.text ?? \"\";\n const below = lines[i + 1]?.text;\n return below !== undefined && maybeSigned(below) && !maybeSigned(text) ? `${text}\\n${below}` : text;\n };\n const answers = await judge(open.map(asked));\n if (answers?.length !== open.length) return kept;\n for (const [k, i] of open.entries()) if ((answers[k] ?? 0) >= CUSTOMERS_WORDS) kept.add(i);\n return kept;\n}\n\n/** The role of the extra line a translation asks for: the ad's message, said in the language for the team. */\nexport const MESSAGE_ROLE = \"message\";\n\nconst Answer = z.object({ translations: z.record(z.string(), z.array(z.string()).catch([])) });\n\n/**\n * The languages the model translated fully: each line of the source answered by one non-empty\n * line, in order. A language answered short or blank is left out (refused, never half an ad). Pure.\n */\nexport function acceptTranslations(\n answer: unknown,\n languages: readonly string[],\n lineCount: number,\n): Record<string, string[]> {\n // `--copy-file` may hold the languages bare; a model may answer \"pt-BR\" for \"pt-br\".\n const wrapped =\n answer && typeof answer === \"object\" && !(\"translations\" in answer) ? { translations: answer } : answer;\n const parsed = Answer.safeParse(wrapped);\n if (!parsed.success) return {};\n const byTag = new Map(Object.entries(parsed.data.translations).map(([key, lines]) => [key.toLowerCase(), lines]));\n const kept: Record<string, string[]> = {};\n for (const language of languages) {\n const lines = byTag.get(language.toLowerCase())?.map((line) => line.trim());\n if (lines && lines.length === lineCount && lines.every(Boolean)) kept[language] = lines;\n }\n return kept;\n}\n\n/** What the model is asked: every language at once, line by line, for the same picture. Pure. */\nexport function buildTranslatePrompt(\n lines: readonly Line[],\n languages: readonly string[],\n context: { from?: string; brand?: string },\n): string {\n const from = context.from ? languageName(context.from) : null;\n return [\n `These are the lines of copy printed on a finished static ad${from ? `, written in ${from}` : \"\"}. Translate them${from ? ` from ${from}` : \"\"} into each of these languages: ${languages.map((l) => `${l} (${languageName(l) ?? l})`).join(\", \")}.`,\n \"\",\n ...lines.map(\n (line, i) =>\n `${i + 1}. ${line.role === MESSAGE_ROLE ? \"[not printed: what the ad says, in one sentence, for the team that runs it] \" : line.role ? `[${line.role}] ` : \"\"}${line.customersWords ? \"[a customer's own words: copy it exactly as written, untranslated] \" : \"\"}${JSON.stringify(line.text)}`,\n ),\n \"\",\n \"Rules:\",\n \"- Transcreate as a native copywriter of that market would write the ad, not word for word: the same promise and tone, natural for the people who will see it.\",\n \"- Each line keeps its role: a headline stays a headline, a button stays a short button.\",\n \"- Keep each line about as long as the original: it is set in the same layout, in the same space, so a much longer line will not fit.\",\n `- Keep brand names${context.brand ? ` (${JSON.stringify(context.brand)})` : \"\"}, product names, numbers, prices, currencies, percentages and URLs exactly as they are.`,\n \"- Use the language's own accents and punctuation (¿ ¡ « » ß ç ã).\",\n ...varieties(languages),\n \"\",\n `Reply with only this JSON, one array per language with exactly ${lines.length} lines in the order above: {\"translations\": {${languages.map((l) => `\"${l}\": [\"...\"]`).join(\", \")}}}`,\n ].join(\"\\n\");\n}\n\n/**\n * The translation's spec: the source's as it was drawn, each line's words replaced in place (its\n * role, lettering and placement kept) and, when the source names its market, that market's\n * language set, and its country when the tag names one (es-MX: Mexico). The currency stays the\n * source's: its prices are kept as they are. Everything else is the source's: the design is never the translation's own. Pure.\n */\nexport function translatedSpec(\n source: Record<string, unknown>,\n lines: readonly string[],\n language: string,\n customersWords: ReadonlySet<number> = new Set(),\n): Record<string, unknown> {\n // An older blueprint carries its words in its own shape: it is written as the ad spec it reads as.\n const spec: Record<string, unknown> = isAdSpec(source) ? source : readAdSpec(source);\n const copy = Array.isArray(spec.copy) ? (spec.copy as Array<Record<string, unknown>>) : [];\n const viewer = spec.viewer as { market?: Record<string, unknown> } | undefined;\n return {\n ...spec,\n // A customer's words stay theirs: translated, they would be words nobody said under their name.\n copy: copy.map((line, i) => (customersWords.has(i) ? line : { ...line, text: lines[i] ?? line.text })),\n ...(viewer?.market ? { viewer: { ...viewer, market: { ...viewer.market, ...marketOf(language) } } } : {}),\n };\n}\n\n/** What a translation's `_definition.md` keeps of its source's: everything but these, which are its own. */\nconst OWN_FIELDS = [\"series\", \"language\", \"title\", \"status\"];\n\n/** The translation's `_definition.md`: the source's reasons, as an ad of the source's series in `language`. Pure. */\nexport function translatedDefinition(\n source: string,\n translation: { source: string; language: string; title: string; message?: string },\n): string {\n return setDefinitionFields(withoutFields(source, OWN_FIELDS), {\n title: translation.title.slice(0, 120),\n series: translation.source,\n language: translation.language,\n status: \"draft\",\n ...(translation.message ? { message: translation.message } : {}),\n });\n}\n\n/** For each tag naming a country, the instruction to write as people there write ads. */\nfunction varieties(languages: readonly string[]): string[] {\n const regional = languages.flatMap((tag) => {\n const region = languageRegion(tag);\n return region\n ? [\n `- ${tag}: write it as people in ${region.name} write ads: its own vocabulary, spelling, idioms and form of address (tú, usted or vos as ads there use it), not a neutral one and not a neighbouring country's variety of the same language.`,\n ]\n : [];\n });\n return regional.length > 0 ? [\"\", \"Each regional variant is its own ad:\", ...regional] : [];\n}\n\n/** The market fields a tag decides: its language, and its country when it names one. */\nfunction marketOf(language: string): { language: string; country?: string } {\n const region = languageRegion(language);\n return region ? { language, country: region.code } : { language };\n}\n"],"mappings":"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","names":["readFile","path","readFile","path"]}