@koda-sl/baker-cli 0.446.0-dev.c97e2d09a → 0.447.0-dev.f5788a631

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 (431) hide show
  1. package/README.md +2 -2
  2. package/dist/{account-JYAHNWTU.js → account-PCEZQUK7.js} +4 -4
  3. package/dist/{accounts-YQMXWDQL.js → accounts-5AXLYU7P.js} +3 -3
  4. package/dist/{accounts-IOXUP35Y.js → accounts-OSXDZZLY.js} +5 -5
  5. package/dist/{actions-EGCRZ3ZL.js → actions-HM4VVTGW.js} +18 -18
  6. package/dist/{add-ZFWSN3HT.js → add-4J2EF54O.js} +2 -2
  7. package/dist/{add-ID4XAPM5.js → add-VZAY57M4.js} +3 -3
  8. package/dist/{ads-H7GH7A26.js → ads-6UEDYT3O.js} +9 -9
  9. package/dist/{ads-GL2H5TJE.js → ads-NUME2UXH.js} +5 -5
  10. package/dist/{adsets-H7QT42U6.js → adsets-Q5DWGANV.js} +11 -11
  11. package/dist/{analytics-TTBGPXHL.js → analytics-PHU7H5VY.js} +3 -3
  12. package/dist/{analytics-FDEH3HFH.js → analytics-QTR2ZITZ.js} +6 -6
  13. package/dist/{assign-3ZPQAQWD.js → assign-IIAVNATI.js} +3 -3
  14. package/dist/{audience-size-LRAGY3F5.js → audience-size-2L7XMYJL.js} +3 -3
  15. package/dist/{audiences-JACGRBNN.js → audiences-AMRFZRZ7.js} +3 -3
  16. package/dist/{audit-FQARJWOU.js → audit-ZCUFJLUG.js} +3 -3
  17. package/dist/{avatars-JZSFFUC5.js → avatars-OEK3FYKK.js} +4 -4
  18. package/dist/{bid-pricing-4653K7RN.js → bid-pricing-FDW3IY6G.js} +3 -3
  19. package/dist/{brand-PLQUPMXV.js → brand-OXYFSNA5.js} +2 -2
  20. package/dist/{brief-UVMPQB6T.js → brief-TBSXPEXI.js} +12 -12
  21. package/dist/{campaign-groups-UQ6EZQMA.js → campaign-groups-5GCFQT2W.js} +8 -8
  22. package/dist/{campaign-writes-UK3GMOQK.js → campaign-writes-3SJQSCUK.js} +3 -3
  23. package/dist/{campaigns-5JVA6FCV.js → campaigns-7QDDWZ76.js} +5 -5
  24. package/dist/{campaigns-WBEG5QA4.js → campaigns-D6B6Z67Y.js} +8 -8
  25. package/dist/{campaigns-THNNAQNO.js → campaigns-SYEOFKFV.js} +11 -11
  26. package/dist/{canvas-XT6KSCJH.js → canvas-B6DPRQGN.js} +14 -14
  27. package/dist/{capabilities-ELXIQ4R7.js → capabilities-GVHPHH2G.js} +3 -3
  28. package/dist/{catalog-IQEQ5TGQ.js → catalog-TNNG66MH.js} +4 -4
  29. package/dist/{chats-V3KB5FCU.js → chats-54CWM7DL.js} +3 -3
  30. package/dist/{chunk-ZEYFPIKH.js → chunk-3X3446TG.js} +2 -2
  31. package/dist/{chunk-EO7NHHEZ.js → chunk-4SNOWJV7.js} +2 -2
  32. package/dist/{chunk-27NMXSC3.js → chunk-5EEDEVOR.js} +2 -2
  33. package/dist/{chunk-2YJNBTXE.js → chunk-5VC6IK7B.js} +5 -5
  34. package/dist/{chunk-ASVKZQUU.js → chunk-6HJAHLLA.js} +11 -5
  35. package/dist/{chunk-ASVKZQUU.js.map → chunk-6HJAHLLA.js.map} +1 -1
  36. package/dist/{chunk-ZN63N3EP.js → chunk-6TCDQSM7.js} +3 -3
  37. package/dist/{chunk-GT54GEDT.js → chunk-6YYEBLYI.js} +5 -5
  38. package/dist/{chunk-DXB5YV6S.js → chunk-7FVWIZHM.js} +2 -2
  39. package/dist/{chunk-S42CGOGT.js → chunk-7JUUKYKG.js} +2 -2
  40. package/dist/{chunk-XZPREXCE.js → chunk-ACFWVULZ.js} +4 -4
  41. package/dist/chunk-ACFWVULZ.js.map +1 -0
  42. package/dist/{chunk-ML3ZIQ7K.js → chunk-AO5UQQLJ.js} +2 -2
  43. package/dist/{chunk-3U3RUPKR.js → chunk-CKU4WYTF.js} +2 -2
  44. package/dist/{chunk-7LT6UP2W.js → chunk-DE6ANJLU.js} +2 -2
  45. package/dist/{chunk-HIPDMQZ6.js → chunk-DZSIUEGH.js} +2 -2
  46. package/dist/{chunk-65IJ6BDS.js → chunk-E5IFTZJ3.js} +2 -2
  47. package/dist/{chunk-AST5XJKZ.js → chunk-EAHP7L2R.js} +2 -2
  48. package/dist/{chunk-MJABIGKT.js → chunk-EPMN4BK7.js} +2 -2
  49. package/dist/{chunk-2SMGPLIW.js → chunk-F46KAIBS.js} +3 -3
  50. package/dist/{chunk-X5TFU7ET.js → chunk-FGH4Z5K5.js} +2 -2
  51. package/dist/{chunk-7RUYWECB.js → chunk-FYQPB2SS.js} +6 -6
  52. package/dist/{chunk-W33XBKLZ.js → chunk-GTK46DE3.js} +4 -4
  53. package/dist/{chunk-HXTGYOQC.js → chunk-H2QNBOPS.js} +15 -9
  54. package/dist/{chunk-HXTGYOQC.js.map → chunk-H2QNBOPS.js.map} +1 -1
  55. package/dist/{chunk-DIY6QR3E.js → chunk-HDWKLFF5.js} +3 -3
  56. package/dist/{chunk-OTFHEHIU.js → chunk-HRYOZUSK.js} +9 -4
  57. package/dist/chunk-HRYOZUSK.js.map +1 -0
  58. package/dist/{chunk-JSN6LLHX.js → chunk-HYUUH4BE.js} +314 -47
  59. package/dist/chunk-HYUUH4BE.js.map +1 -0
  60. package/dist/{chunk-NEZLPWD4.js → chunk-IH4UQ2OK.js} +13 -10
  61. package/dist/chunk-IH4UQ2OK.js.map +1 -0
  62. package/dist/{chunk-QJE6ZYGI.js → chunk-IKYNOT57.js} +2 -2
  63. package/dist/{chunk-B3AKIYBA.js → chunk-J5IU4OX2.js} +2 -2
  64. package/dist/{chunk-EIP4PYCL.js → chunk-KMEMA7AZ.js} +2 -2
  65. package/dist/{chunk-ENUZU5LQ.js → chunk-KV5BCSUR.js} +3 -3
  66. package/dist/{chunk-FXED3VZK.js → chunk-L27H2R2N.js} +2 -2
  67. package/dist/{chunk-OWK5WYFZ.js → chunk-NK2UFFVH.js} +3 -3
  68. package/dist/{chunk-EZUG6WE2.js → chunk-NSA6HRG6.js} +2 -2
  69. package/dist/{chunk-DQPTUBCB.js → chunk-NTPXZU3V.js} +2 -2
  70. package/dist/{chunk-P3WRQED4.js → chunk-OAQPHP6V.js} +4 -4
  71. package/dist/{chunk-633BRRZO.js → chunk-RB5DB3WN.js} +2 -2
  72. package/dist/{chunk-RRUJQVWA.js → chunk-RCQJHKK5.js} +4 -2
  73. package/dist/{chunk-ZXTW3TXY.js → chunk-SKT3SAHG.js} +3 -3
  74. package/dist/{chunk-GIJT3A5U.js → chunk-T4DD5YMP.js} +3 -3
  75. package/dist/{chunk-OC5IJSIW.js → chunk-V2X3KK52.js} +3 -3
  76. package/dist/{chunk-YY6CIVRY.js → chunk-V5WSJP5A.js} +3 -3
  77. package/dist/{chunk-7H2VLDYU.js → chunk-VJZHVOA4.js} +71 -8
  78. package/dist/chunk-VJZHVOA4.js.map +1 -0
  79. package/dist/{chunk-GZVZ7CQI.js → chunk-WRIC2RPQ.js} +2 -2
  80. package/dist/{chunk-K3PN7TN5.js → chunk-WTOYCUKH.js} +2 -2
  81. package/dist/{chunk-HMEFD2CG.js → chunk-XDNEG2H6.js} +30 -4
  82. package/dist/chunk-XDNEG2H6.js.map +1 -0
  83. package/dist/{chunk-XL3UIAMJ.js → chunk-XV6XCFF7.js} +2 -2
  84. package/dist/{chunk-676WE6CY.js → chunk-YUPRCOEN.js} +2 -2
  85. package/dist/{chunk-MLU6STIN.js → chunk-ZZQXVYUY.js} +2 -2
  86. package/dist/{claim-Y5ZYM3Y3.js → claim-CIASHKMC.js} +3 -3
  87. package/dist/cli.js +27 -27
  88. package/dist/{companies-2R4QXPSF.js → companies-ECVMO24S.js} +3 -3
  89. package/dist/{complete-SG2VVAGA.js → complete-32CPBFIG.js} +3 -3
  90. package/dist/{connect-A3SJQKSE.js → connect-OJSOM6PY.js} +6 -6
  91. package/dist/{conversation-5WIHZLPU.js → conversation-7FHN5ESN.js} +3 -3
  92. package/dist/{conversion-upload-command-JULHGVIR.js → conversion-upload-command-BBUXLFT3.js} +6 -6
  93. package/dist/{conversions-7PGKDZVN.js → conversions-7YJDNZ7Y.js} +7 -7
  94. package/dist/{create-EYSGANKH.js → create-2TBDXHAM.js} +3 -3
  95. package/dist/{create-UVVII4GB.js → create-FE5QLW7V.js} +2 -2
  96. package/dist/{create-5PKVRJUD.js → create-OYT76OMJ.js} +6 -6
  97. package/dist/{create-XOLEMSB2.js → create-ZGRL7YCV.js} +3 -3
  98. package/dist/{creatives-4DRALRUE.js → creatives-5MUTX4DQ.js} +10 -10
  99. package/dist/{creatives-OB77VU5H.js → creatives-IUB57I3T.js} +8 -8
  100. package/dist/{creatives-PSWCNY7U.js → creatives-UEPLNCPN.js} +3 -3
  101. package/dist/{credentials-IVV3T4JD.js → credentials-AETHKP5T.js} +3 -3
  102. package/dist/{critique-NM6GK2KW.js → critique-C53EJDPA.js} +10 -10
  103. package/dist/{critique-MZBGOV3K.js → critique-T7HJ42D4.js} +6 -6
  104. package/dist/{crm-IYAWE47A.js → crm-JP4UOPMN.js} +7 -7
  105. package/dist/{crm-5GCGLHKD.js → crm-KH6XX2TT.js} +4 -4
  106. package/dist/{custom-conversions-6P555U2K.js → custom-conversions-2VLJGPRV.js} +2 -2
  107. package/dist/{customers-L3D3YCTM.js → customers-7I7UY5PS.js} +7 -7
  108. package/dist/{delete-JYPEYYKM.js → delete-6IOUDEWY.js} +3 -3
  109. package/dist/{delete-WMT2GDDN.js → delete-ODFKNHAI.js} +3 -3
  110. package/dist/{delete-E2IGHOBY.js → delete-RAETUVO2.js} +2 -2
  111. package/dist/{demographics-VTOJJK5E.js → demographics-2FTDKPBD.js} +3 -3
  112. package/dist/{discard-62REOO2E.js → discard-ZX5TLFYH.js} +3 -3
  113. package/dist/{domain-7ACHLP2Y.js → domain-TH7KIC2T.js} +3 -3
  114. package/dist/{draft-ZZQ4GGIG.js → draft-CRE2Y24G.js} +3 -3
  115. package/dist/{draft-MAGMH5FJ.js → draft-S2FSQOJN.js} +3 -3
  116. package/dist/{draft-U6CT6LCC.js → draft-SH25PKST.js} +6 -6
  117. package/dist/{draft-FPD6BOUC.js → draft-YHUIFDDR.js} +8 -8
  118. package/dist/engine/index.d.ts +12 -0
  119. package/dist/engine/index.js +3 -3
  120. package/dist/{facets-DZCAWR32.js → facets-6B2U4BSM.js} +3 -3
  121. package/dist/{feedback-X7RG7PRM.js → feedback-QGSAJJVC.js} +2 -2
  122. package/dist/{feedback-record-JFLBXQWA.js → feedback-record-NUAJ6UBL.js} +12 -12
  123. package/dist/{fit-KXHYKIA4.js → fit-FJ5CLQS4.js} +5 -5
  124. package/dist/{flows-Q454EFMN.js → flows-OGGSWWGT.js} +10 -10
  125. package/dist/{fonts-YWGD2B4N.js → fonts-GCJRLEGD.js} +8 -8
  126. package/dist/{forecast-TQNRU5ZY.js → forecast-2AGTFMXH.js} +3 -3
  127. package/dist/{funnel-YVSYSLT4.js → funnel-7U55LNJ4.js} +4 -4
  128. package/dist/{get-7PZP4HJ3.js → get-IRJIHOQK.js} +3 -3
  129. package/dist/{get-756GD6EF.js → get-N7FR6NFX.js} +3 -3
  130. package/dist/{google-KIBLORXX.js → google-NYRI2NDZ.js} +8 -8
  131. package/dist/{history-MECEOLRV.js → history-PSNJAUTW.js} +3 -3
  132. package/dist/{hubspot-KF5J4AEB.js → hubspot-2NHL47R2.js} +7 -7
  133. package/dist/{ideas-AFJ5U7PK.js → ideas-22MRXKT7.js} +7 -7
  134. package/dist/{images-P4JQZJZW.js → images-LXFWEON7.js} +4 -4
  135. package/dist/{ingest-7LRGIUIK.js → ingest-W7VEDEYD.js} +2 -2
  136. package/dist/{ingest-OLPYRECF.js → ingest-ZN3DEZHY.js} +3 -3
  137. package/dist/{inspect-ETUZZCVT.js → inspect-3LBIHMMP.js} +5 -5
  138. package/dist/{keyword-metrics-6K2LQZVQ.js → keyword-metrics-PZXFB4NG.js} +2 -2
  139. package/dist/{landing-NXZYGBVA.js → landing-D7QS42GK.js} +2 -2
  140. package/dist/{leads-7EVHMNUF.js → leads-ARUWPHBM.js} +6 -6
  141. package/dist/{leads-J5Z3K72L.js → leads-E22XFSX2.js} +3 -3
  142. package/dist/{learn-YK2NNAXT.js → learn-Y4KIZNRF.js} +9 -9
  143. package/dist/{line-item-writes-OQKDQBRR.js → line-item-writes-KA5PVKFO.js} +3 -3
  144. package/dist/{line-items-N32SUQW2.js → line-items-3ZFFZCNH.js} +5 -5
  145. package/dist/{link-YOUYN4HW.js → link-AEU6BV75.js} +3 -3
  146. package/dist/{linkedin-UZX3LTGS.js → linkedin-WCB2H5NH.js} +30 -30
  147. package/dist/{list-NEH7CXA4.js → list-OLX7AI3O.js} +3 -3
  148. package/dist/{list-CXB5L7W3.js → list-PAMYQS4X.js} +2 -2
  149. package/dist/{list-5XOP7RXP.js → list-TOUUGHMS.js} +3 -3
  150. package/dist/{log-Y22VMQMW.js → log-UGVWSK7Z.js} +3 -3
  151. package/dist/{make-AYTOHWHD.js → make-3PZLTEXT.js} +19 -19
  152. package/dist/{map-62RLXP7R.js → map-BW4CHSIO.js} +4 -4
  153. package/dist/{mcp-CNDPFOWE.js → mcp-JOXKA5HY.js} +2 -2
  154. package/dist/{media-M7E6V2XU.js → media-53DJRC4N.js} +2 -2
  155. package/dist/{media-sources-KIM7FTIH.js → media-sources-SJZUOMI2.js} +2 -2
  156. package/dist/{members-I5JNM2PJ.js → members-VAX6KAFN.js} +3 -3
  157. package/dist/{meta-EZ4SY25M.js → meta-A7KM6TF5.js} +10 -10
  158. package/dist/{normalize-YALLU2FS.js → normalize-IVQ7I54Z.js} +3 -3
  159. package/dist/{options-OZGAYIXG.js → options-V7C6CU6M.js} +6 -6
  160. package/dist/{performance-FYV43RZU.js → performance-L6RJZPXX.js} +4 -4
  161. package/dist/{promoted-tweet-writes-DV6W6BRF.js → promoted-tweet-writes-DBATH765.js} +3 -3
  162. package/dist/{promoted-tweets-KD4755XT.js → promoted-tweets-AU3XF3JD.js} +3 -3
  163. package/dist/{publish-A6C6AIDN.js → publish-G6DYVT4S.js} +5 -5
  164. package/dist/{reddit-BRHSTRV3.js → reddit-S2S6C4RT.js} +3 -3
  165. package/dist/{refresh-MDM2AGBY.js → refresh-ARJ2SOMY.js} +2 -2
  166. package/dist/{release-HKAOMV22.js → release-3WCBAHPO.js} +3 -3
  167. package/dist/{remove-JDWMPK2C.js → remove-FUAARCSC.js} +2 -2
  168. package/dist/{reopen-3X47UVTN.js → reopen-PZI5H4X2.js} +3 -3
  169. package/dist/{rerun-SMGRCAVF.js → rerun-AUP4XT6T.js} +19 -19
  170. package/dist/{research-L2R3IXZL.js → research-SY3QRGOC.js} +2 -2
  171. package/dist/{research-BLHRRMIJ.js → research-TISR736S.js} +4 -4
  172. package/dist/{reset-MUR2L6KX.js → reset-E6F5NXOI.js} +2 -2
  173. package/dist/{reset-RC25CNM5.js → reset-ZWM7DDD7.js} +2 -2
  174. package/dist/{resolve-GYFMTEKE.js → resolve-I5R5ELMZ.js} +3 -3
  175. package/dist/{retry-WRJ3G5X2.js → retry-7CFZTKWI.js} +2 -2
  176. package/dist/{retry-BZIV5J4F.js → retry-JO3JXXT2.js} +2 -2
  177. package/dist/{run-6JPWF5S6.js → run-JR6SILHL.js} +19 -19
  178. package/dist/{run-L5J2JKMZ.js → run-UKB647DI.js} +3 -3
  179. package/dist/{scaffold-ad-YKS6BZ47.js → scaffold-ad-BYGVU7MT.js} +16 -16
  180. package/dist/{scaffold-static-ad-EPWJHAYS.js → scaffold-static-ad-U57V5UV3.js} +23 -23
  181. package/dist/{scaffold-video-LKLEA4TM.js → scaffold-video-POZTINEV.js} +15 -15
  182. package/dist/{schedule-B3QDOMSR.js → schedule-SOAHLZZF.js} +2 -2
  183. package/dist/{scheduled-agents-OKXW6GYL.js → scheduled-agents-K5WU7SVJ.js} +11 -11
  184. package/dist/{schema-UW772MB2.js → schema-SOPL6GJP.js} +4 -4
  185. package/dist/{search-36WKJO5Z.js → search-5VUDFOHI.js} +2 -2
  186. package/dist/{select-JJTZNNBZ.js → select-T36UH4HL.js} +12 -12
  187. package/dist/{set-prompt-626I74ZW.js → set-prompt-Y4X7GV2Q.js} +11 -11
  188. package/dist/{setup-links-CZ56WG7K.js → setup-links-KFROCISS.js} +3 -3
  189. package/dist/{site-YGY6IGLQ.js → site-MXPKMRQT.js} +4 -4
  190. package/dist/{sources-DPE7HS2L.js → sources-FFHNWVLV.js} +6 -6
  191. package/dist/{sources-LFKRFJ6E.js → sources-MLDLMEDT.js} +6 -6
  192. package/dist/{stale-HZB4L5VZ.js → stale-UXL4X4AD.js} +11 -11
  193. package/dist/{status-TGMY37OX.js → status-M47G5HD4.js} +3 -3
  194. package/dist/{sync-GY3YWXZ4.js → sync-HS7VZJ2H.js} +2 -2
  195. package/dist/{sync-definition-BREENUVW.js → sync-definition-PY6REQ4J.js} +14 -14
  196. package/dist/{tags-BOXRDIP2.js → tags-DIXLYB5P.js} +2 -2
  197. package/dist/{tags-OEQA35YM.js → tags-DYRZTYHD.js} +3 -3
  198. package/dist/{tags-KDCOIXY5.js → tags-MRG56YOE.js} +4 -4
  199. package/dist/{tags-B6FTBKE7.js → tags-WAW6MQAY.js} +3 -3
  200. package/dist/{tags-MBGOC3C5.js → tags-Y4HHJJGE.js} +3 -3
  201. package/dist/{targeting-criteria-OSIGTYIK.js → targeting-criteria-5UUESFWC.js} +3 -3
  202. package/dist/{targets-EZDJE2BR.js → targets-COZPVG52.js} +3 -3
  203. package/dist/{templates-43CM65YU.js → templates-75VFYZ3E.js} +3 -3
  204. package/dist/{testimonials-TGSG33XN.js → testimonials-WJBRWLNW.js} +6 -6
  205. package/dist/{top-companies-AU2Y2JBL.js → top-companies-C2R4FG6H.js} +3 -3
  206. package/dist/{translate-UAQN3UP6.js → translate-RYAJAFV7.js} +17 -17
  207. package/dist/{triggers-KANOVASP.js → triggers-5UHVJPBV.js} +3 -3
  208. package/dist/{unlink-3O34M3RC.js → unlink-PLOOAGM3.js} +3 -3
  209. package/dist/{unstage-IU3X67HQ.js → unstage-JIIOTBTF.js} +3 -3
  210. package/dist/{update-3T2GI5UT.js → update-G6R5ZHUI.js} +3 -3
  211. package/dist/{update-L575JJ26.js → update-QYM6U7LL.js} +3 -3
  212. package/dist/{update-2MSRC7SF.js → update-RCP7F5L5.js} +3 -3
  213. package/dist/{update-4AKUKIHY.js → update-RGVNTA5X.js} +2 -2
  214. package/dist/{upload-YGKEXFZX.js → upload-EEJ34Q3Y.js} +3 -3
  215. package/dist/{url-params-JO6DMUNT.js → url-params-2G5M2B3J.js} +3 -3
  216. package/dist/{validate-C2AJIWOF.js → validate-M33VLUG4.js} +12 -12
  217. package/dist/{videos-73IKG7QH.js → videos-FVVID55J.js} +5 -5
  218. package/dist/{viewer-check-VN2JK2LW.js → viewer-check-2Q3WHSEL.js} +5 -5
  219. package/dist/{winning-ads-UCDDPWFM.js → winning-ads-OSRFHVLV.js} +3 -3
  220. package/dist/{write-commands-WBBS3C5L.js → write-commands-CLJOD2XF.js} +8 -8
  221. package/dist/{write-commands-TAYGTJEZ.js → write-commands-CT74VHH6.js} +6 -6
  222. package/dist/{x-VOG2EPI6.js → x-EBKLJJPJ.js} +6 -6
  223. package/package.json +1 -1
  224. package/dist/chunk-7H2VLDYU.js.map +0 -1
  225. package/dist/chunk-HMEFD2CG.js.map +0 -1
  226. package/dist/chunk-JSN6LLHX.js.map +0 -1
  227. package/dist/chunk-NEZLPWD4.js.map +0 -1
  228. package/dist/chunk-OTFHEHIU.js.map +0 -1
  229. package/dist/chunk-XZPREXCE.js.map +0 -1
  230. /package/dist/{account-JYAHNWTU.js.map → account-PCEZQUK7.js.map} +0 -0
  231. /package/dist/{accounts-YQMXWDQL.js.map → accounts-5AXLYU7P.js.map} +0 -0
  232. /package/dist/{accounts-IOXUP35Y.js.map → accounts-OSXDZZLY.js.map} +0 -0
  233. /package/dist/{actions-EGCRZ3ZL.js.map → actions-HM4VVTGW.js.map} +0 -0
  234. /package/dist/{add-ZFWSN3HT.js.map → add-4J2EF54O.js.map} +0 -0
  235. /package/dist/{add-ID4XAPM5.js.map → add-VZAY57M4.js.map} +0 -0
  236. /package/dist/{ads-H7GH7A26.js.map → ads-6UEDYT3O.js.map} +0 -0
  237. /package/dist/{ads-GL2H5TJE.js.map → ads-NUME2UXH.js.map} +0 -0
  238. /package/dist/{adsets-H7QT42U6.js.map → adsets-Q5DWGANV.js.map} +0 -0
  239. /package/dist/{analytics-TTBGPXHL.js.map → analytics-PHU7H5VY.js.map} +0 -0
  240. /package/dist/{analytics-FDEH3HFH.js.map → analytics-QTR2ZITZ.js.map} +0 -0
  241. /package/dist/{assign-3ZPQAQWD.js.map → assign-IIAVNATI.js.map} +0 -0
  242. /package/dist/{audience-size-LRAGY3F5.js.map → audience-size-2L7XMYJL.js.map} +0 -0
  243. /package/dist/{audiences-JACGRBNN.js.map → audiences-AMRFZRZ7.js.map} +0 -0
  244. /package/dist/{audit-FQARJWOU.js.map → audit-ZCUFJLUG.js.map} +0 -0
  245. /package/dist/{avatars-JZSFFUC5.js.map → avatars-OEK3FYKK.js.map} +0 -0
  246. /package/dist/{bid-pricing-4653K7RN.js.map → bid-pricing-FDW3IY6G.js.map} +0 -0
  247. /package/dist/{brand-PLQUPMXV.js.map → brand-OXYFSNA5.js.map} +0 -0
  248. /package/dist/{brief-UVMPQB6T.js.map → brief-TBSXPEXI.js.map} +0 -0
  249. /package/dist/{campaign-groups-UQ6EZQMA.js.map → campaign-groups-5GCFQT2W.js.map} +0 -0
  250. /package/dist/{campaign-writes-UK3GMOQK.js.map → campaign-writes-3SJQSCUK.js.map} +0 -0
  251. /package/dist/{campaigns-5JVA6FCV.js.map → campaigns-7QDDWZ76.js.map} +0 -0
  252. /package/dist/{campaigns-WBEG5QA4.js.map → campaigns-D6B6Z67Y.js.map} +0 -0
  253. /package/dist/{campaigns-THNNAQNO.js.map → campaigns-SYEOFKFV.js.map} +0 -0
  254. /package/dist/{canvas-XT6KSCJH.js.map → canvas-B6DPRQGN.js.map} +0 -0
  255. /package/dist/{capabilities-ELXIQ4R7.js.map → capabilities-GVHPHH2G.js.map} +0 -0
  256. /package/dist/{catalog-IQEQ5TGQ.js.map → catalog-TNNG66MH.js.map} +0 -0
  257. /package/dist/{chats-V3KB5FCU.js.map → chats-54CWM7DL.js.map} +0 -0
  258. /package/dist/{chunk-ZEYFPIKH.js.map → chunk-3X3446TG.js.map} +0 -0
  259. /package/dist/{chunk-EO7NHHEZ.js.map → chunk-4SNOWJV7.js.map} +0 -0
  260. /package/dist/{chunk-27NMXSC3.js.map → chunk-5EEDEVOR.js.map} +0 -0
  261. /package/dist/{chunk-2YJNBTXE.js.map → chunk-5VC6IK7B.js.map} +0 -0
  262. /package/dist/{chunk-ZN63N3EP.js.map → chunk-6TCDQSM7.js.map} +0 -0
  263. /package/dist/{chunk-GT54GEDT.js.map → chunk-6YYEBLYI.js.map} +0 -0
  264. /package/dist/{chunk-DXB5YV6S.js.map → chunk-7FVWIZHM.js.map} +0 -0
  265. /package/dist/{chunk-S42CGOGT.js.map → chunk-7JUUKYKG.js.map} +0 -0
  266. /package/dist/{chunk-ML3ZIQ7K.js.map → chunk-AO5UQQLJ.js.map} +0 -0
  267. /package/dist/{chunk-3U3RUPKR.js.map → chunk-CKU4WYTF.js.map} +0 -0
  268. /package/dist/{chunk-7LT6UP2W.js.map → chunk-DE6ANJLU.js.map} +0 -0
  269. /package/dist/{chunk-HIPDMQZ6.js.map → chunk-DZSIUEGH.js.map} +0 -0
  270. /package/dist/{chunk-65IJ6BDS.js.map → chunk-E5IFTZJ3.js.map} +0 -0
  271. /package/dist/{chunk-AST5XJKZ.js.map → chunk-EAHP7L2R.js.map} +0 -0
  272. /package/dist/{chunk-MJABIGKT.js.map → chunk-EPMN4BK7.js.map} +0 -0
  273. /package/dist/{chunk-2SMGPLIW.js.map → chunk-F46KAIBS.js.map} +0 -0
  274. /package/dist/{chunk-X5TFU7ET.js.map → chunk-FGH4Z5K5.js.map} +0 -0
  275. /package/dist/{chunk-7RUYWECB.js.map → chunk-FYQPB2SS.js.map} +0 -0
  276. /package/dist/{chunk-W33XBKLZ.js.map → chunk-GTK46DE3.js.map} +0 -0
  277. /package/dist/{chunk-DIY6QR3E.js.map → chunk-HDWKLFF5.js.map} +0 -0
  278. /package/dist/{chunk-QJE6ZYGI.js.map → chunk-IKYNOT57.js.map} +0 -0
  279. /package/dist/{chunk-B3AKIYBA.js.map → chunk-J5IU4OX2.js.map} +0 -0
  280. /package/dist/{chunk-EIP4PYCL.js.map → chunk-KMEMA7AZ.js.map} +0 -0
  281. /package/dist/{chunk-ENUZU5LQ.js.map → chunk-KV5BCSUR.js.map} +0 -0
  282. /package/dist/{chunk-FXED3VZK.js.map → chunk-L27H2R2N.js.map} +0 -0
  283. /package/dist/{chunk-OWK5WYFZ.js.map → chunk-NK2UFFVH.js.map} +0 -0
  284. /package/dist/{chunk-EZUG6WE2.js.map → chunk-NSA6HRG6.js.map} +0 -0
  285. /package/dist/{chunk-DQPTUBCB.js.map → chunk-NTPXZU3V.js.map} +0 -0
  286. /package/dist/{chunk-P3WRQED4.js.map → chunk-OAQPHP6V.js.map} +0 -0
  287. /package/dist/{chunk-633BRRZO.js.map → chunk-RB5DB3WN.js.map} +0 -0
  288. /package/dist/{chunk-RRUJQVWA.js.map → chunk-RCQJHKK5.js.map} +0 -0
  289. /package/dist/{chunk-ZXTW3TXY.js.map → chunk-SKT3SAHG.js.map} +0 -0
  290. /package/dist/{chunk-GIJT3A5U.js.map → chunk-T4DD5YMP.js.map} +0 -0
  291. /package/dist/{chunk-OC5IJSIW.js.map → chunk-V2X3KK52.js.map} +0 -0
  292. /package/dist/{chunk-YY6CIVRY.js.map → chunk-V5WSJP5A.js.map} +0 -0
  293. /package/dist/{chunk-GZVZ7CQI.js.map → chunk-WRIC2RPQ.js.map} +0 -0
  294. /package/dist/{chunk-K3PN7TN5.js.map → chunk-WTOYCUKH.js.map} +0 -0
  295. /package/dist/{chunk-XL3UIAMJ.js.map → chunk-XV6XCFF7.js.map} +0 -0
  296. /package/dist/{chunk-676WE6CY.js.map → chunk-YUPRCOEN.js.map} +0 -0
  297. /package/dist/{chunk-MLU6STIN.js.map → chunk-ZZQXVYUY.js.map} +0 -0
  298. /package/dist/{claim-Y5ZYM3Y3.js.map → claim-CIASHKMC.js.map} +0 -0
  299. /package/dist/{companies-2R4QXPSF.js.map → companies-ECVMO24S.js.map} +0 -0
  300. /package/dist/{complete-SG2VVAGA.js.map → complete-32CPBFIG.js.map} +0 -0
  301. /package/dist/{connect-A3SJQKSE.js.map → connect-OJSOM6PY.js.map} +0 -0
  302. /package/dist/{conversation-5WIHZLPU.js.map → conversation-7FHN5ESN.js.map} +0 -0
  303. /package/dist/{conversion-upload-command-JULHGVIR.js.map → conversion-upload-command-BBUXLFT3.js.map} +0 -0
  304. /package/dist/{conversions-7PGKDZVN.js.map → conversions-7YJDNZ7Y.js.map} +0 -0
  305. /package/dist/{create-EYSGANKH.js.map → create-2TBDXHAM.js.map} +0 -0
  306. /package/dist/{create-UVVII4GB.js.map → create-FE5QLW7V.js.map} +0 -0
  307. /package/dist/{create-5PKVRJUD.js.map → create-OYT76OMJ.js.map} +0 -0
  308. /package/dist/{create-XOLEMSB2.js.map → create-ZGRL7YCV.js.map} +0 -0
  309. /package/dist/{creatives-4DRALRUE.js.map → creatives-5MUTX4DQ.js.map} +0 -0
  310. /package/dist/{creatives-OB77VU5H.js.map → creatives-IUB57I3T.js.map} +0 -0
  311. /package/dist/{creatives-PSWCNY7U.js.map → creatives-UEPLNCPN.js.map} +0 -0
  312. /package/dist/{credentials-IVV3T4JD.js.map → credentials-AETHKP5T.js.map} +0 -0
  313. /package/dist/{critique-NM6GK2KW.js.map → critique-C53EJDPA.js.map} +0 -0
  314. /package/dist/{critique-MZBGOV3K.js.map → critique-T7HJ42D4.js.map} +0 -0
  315. /package/dist/{crm-IYAWE47A.js.map → crm-JP4UOPMN.js.map} +0 -0
  316. /package/dist/{crm-5GCGLHKD.js.map → crm-KH6XX2TT.js.map} +0 -0
  317. /package/dist/{custom-conversions-6P555U2K.js.map → custom-conversions-2VLJGPRV.js.map} +0 -0
  318. /package/dist/{customers-L3D3YCTM.js.map → customers-7I7UY5PS.js.map} +0 -0
  319. /package/dist/{delete-JYPEYYKM.js.map → delete-6IOUDEWY.js.map} +0 -0
  320. /package/dist/{delete-WMT2GDDN.js.map → delete-ODFKNHAI.js.map} +0 -0
  321. /package/dist/{delete-E2IGHOBY.js.map → delete-RAETUVO2.js.map} +0 -0
  322. /package/dist/{demographics-VTOJJK5E.js.map → demographics-2FTDKPBD.js.map} +0 -0
  323. /package/dist/{discard-62REOO2E.js.map → discard-ZX5TLFYH.js.map} +0 -0
  324. /package/dist/{domain-7ACHLP2Y.js.map → domain-TH7KIC2T.js.map} +0 -0
  325. /package/dist/{draft-ZZQ4GGIG.js.map → draft-CRE2Y24G.js.map} +0 -0
  326. /package/dist/{draft-MAGMH5FJ.js.map → draft-S2FSQOJN.js.map} +0 -0
  327. /package/dist/{draft-U6CT6LCC.js.map → draft-SH25PKST.js.map} +0 -0
  328. /package/dist/{draft-FPD6BOUC.js.map → draft-YHUIFDDR.js.map} +0 -0
  329. /package/dist/{facets-DZCAWR32.js.map → facets-6B2U4BSM.js.map} +0 -0
  330. /package/dist/{feedback-X7RG7PRM.js.map → feedback-QGSAJJVC.js.map} +0 -0
  331. /package/dist/{feedback-record-JFLBXQWA.js.map → feedback-record-NUAJ6UBL.js.map} +0 -0
  332. /package/dist/{fit-KXHYKIA4.js.map → fit-FJ5CLQS4.js.map} +0 -0
  333. /package/dist/{flows-Q454EFMN.js.map → flows-OGGSWWGT.js.map} +0 -0
  334. /package/dist/{fonts-YWGD2B4N.js.map → fonts-GCJRLEGD.js.map} +0 -0
  335. /package/dist/{forecast-TQNRU5ZY.js.map → forecast-2AGTFMXH.js.map} +0 -0
  336. /package/dist/{funnel-YVSYSLT4.js.map → funnel-7U55LNJ4.js.map} +0 -0
  337. /package/dist/{get-7PZP4HJ3.js.map → get-IRJIHOQK.js.map} +0 -0
  338. /package/dist/{get-756GD6EF.js.map → get-N7FR6NFX.js.map} +0 -0
  339. /package/dist/{google-KIBLORXX.js.map → google-NYRI2NDZ.js.map} +0 -0
  340. /package/dist/{history-MECEOLRV.js.map → history-PSNJAUTW.js.map} +0 -0
  341. /package/dist/{hubspot-KF5J4AEB.js.map → hubspot-2NHL47R2.js.map} +0 -0
  342. /package/dist/{ideas-AFJ5U7PK.js.map → ideas-22MRXKT7.js.map} +0 -0
  343. /package/dist/{images-P4JQZJZW.js.map → images-LXFWEON7.js.map} +0 -0
  344. /package/dist/{ingest-7LRGIUIK.js.map → ingest-W7VEDEYD.js.map} +0 -0
  345. /package/dist/{ingest-OLPYRECF.js.map → ingest-ZN3DEZHY.js.map} +0 -0
  346. /package/dist/{inspect-ETUZZCVT.js.map → inspect-3LBIHMMP.js.map} +0 -0
  347. /package/dist/{keyword-metrics-6K2LQZVQ.js.map → keyword-metrics-PZXFB4NG.js.map} +0 -0
  348. /package/dist/{landing-NXZYGBVA.js.map → landing-D7QS42GK.js.map} +0 -0
  349. /package/dist/{leads-7EVHMNUF.js.map → leads-ARUWPHBM.js.map} +0 -0
  350. /package/dist/{leads-J5Z3K72L.js.map → leads-E22XFSX2.js.map} +0 -0
  351. /package/dist/{learn-YK2NNAXT.js.map → learn-Y4KIZNRF.js.map} +0 -0
  352. /package/dist/{line-item-writes-OQKDQBRR.js.map → line-item-writes-KA5PVKFO.js.map} +0 -0
  353. /package/dist/{line-items-N32SUQW2.js.map → line-items-3ZFFZCNH.js.map} +0 -0
  354. /package/dist/{link-YOUYN4HW.js.map → link-AEU6BV75.js.map} +0 -0
  355. /package/dist/{linkedin-UZX3LTGS.js.map → linkedin-WCB2H5NH.js.map} +0 -0
  356. /package/dist/{list-NEH7CXA4.js.map → list-OLX7AI3O.js.map} +0 -0
  357. /package/dist/{list-CXB5L7W3.js.map → list-PAMYQS4X.js.map} +0 -0
  358. /package/dist/{list-5XOP7RXP.js.map → list-TOUUGHMS.js.map} +0 -0
  359. /package/dist/{log-Y22VMQMW.js.map → log-UGVWSK7Z.js.map} +0 -0
  360. /package/dist/{make-AYTOHWHD.js.map → make-3PZLTEXT.js.map} +0 -0
  361. /package/dist/{map-62RLXP7R.js.map → map-BW4CHSIO.js.map} +0 -0
  362. /package/dist/{mcp-CNDPFOWE.js.map → mcp-JOXKA5HY.js.map} +0 -0
  363. /package/dist/{media-M7E6V2XU.js.map → media-53DJRC4N.js.map} +0 -0
  364. /package/dist/{media-sources-KIM7FTIH.js.map → media-sources-SJZUOMI2.js.map} +0 -0
  365. /package/dist/{members-I5JNM2PJ.js.map → members-VAX6KAFN.js.map} +0 -0
  366. /package/dist/{meta-EZ4SY25M.js.map → meta-A7KM6TF5.js.map} +0 -0
  367. /package/dist/{normalize-YALLU2FS.js.map → normalize-IVQ7I54Z.js.map} +0 -0
  368. /package/dist/{options-OZGAYIXG.js.map → options-V7C6CU6M.js.map} +0 -0
  369. /package/dist/{performance-FYV43RZU.js.map → performance-L6RJZPXX.js.map} +0 -0
  370. /package/dist/{promoted-tweet-writes-DV6W6BRF.js.map → promoted-tweet-writes-DBATH765.js.map} +0 -0
  371. /package/dist/{promoted-tweets-KD4755XT.js.map → promoted-tweets-AU3XF3JD.js.map} +0 -0
  372. /package/dist/{publish-A6C6AIDN.js.map → publish-G6DYVT4S.js.map} +0 -0
  373. /package/dist/{reddit-BRHSTRV3.js.map → reddit-S2S6C4RT.js.map} +0 -0
  374. /package/dist/{refresh-MDM2AGBY.js.map → refresh-ARJ2SOMY.js.map} +0 -0
  375. /package/dist/{release-HKAOMV22.js.map → release-3WCBAHPO.js.map} +0 -0
  376. /package/dist/{remove-JDWMPK2C.js.map → remove-FUAARCSC.js.map} +0 -0
  377. /package/dist/{reopen-3X47UVTN.js.map → reopen-PZI5H4X2.js.map} +0 -0
  378. /package/dist/{rerun-SMGRCAVF.js.map → rerun-AUP4XT6T.js.map} +0 -0
  379. /package/dist/{research-L2R3IXZL.js.map → research-SY3QRGOC.js.map} +0 -0
  380. /package/dist/{research-BLHRRMIJ.js.map → research-TISR736S.js.map} +0 -0
  381. /package/dist/{reset-MUR2L6KX.js.map → reset-E6F5NXOI.js.map} +0 -0
  382. /package/dist/{reset-RC25CNM5.js.map → reset-ZWM7DDD7.js.map} +0 -0
  383. /package/dist/{resolve-GYFMTEKE.js.map → resolve-I5R5ELMZ.js.map} +0 -0
  384. /package/dist/{retry-WRJ3G5X2.js.map → retry-7CFZTKWI.js.map} +0 -0
  385. /package/dist/{retry-BZIV5J4F.js.map → retry-JO3JXXT2.js.map} +0 -0
  386. /package/dist/{run-6JPWF5S6.js.map → run-JR6SILHL.js.map} +0 -0
  387. /package/dist/{run-L5J2JKMZ.js.map → run-UKB647DI.js.map} +0 -0
  388. /package/dist/{scaffold-ad-YKS6BZ47.js.map → scaffold-ad-BYGVU7MT.js.map} +0 -0
  389. /package/dist/{scaffold-static-ad-EPWJHAYS.js.map → scaffold-static-ad-U57V5UV3.js.map} +0 -0
  390. /package/dist/{scaffold-video-LKLEA4TM.js.map → scaffold-video-POZTINEV.js.map} +0 -0
  391. /package/dist/{schedule-B3QDOMSR.js.map → schedule-SOAHLZZF.js.map} +0 -0
  392. /package/dist/{scheduled-agents-OKXW6GYL.js.map → scheduled-agents-K5WU7SVJ.js.map} +0 -0
  393. /package/dist/{schema-UW772MB2.js.map → schema-SOPL6GJP.js.map} +0 -0
  394. /package/dist/{search-36WKJO5Z.js.map → search-5VUDFOHI.js.map} +0 -0
  395. /package/dist/{select-JJTZNNBZ.js.map → select-T36UH4HL.js.map} +0 -0
  396. /package/dist/{set-prompt-626I74ZW.js.map → set-prompt-Y4X7GV2Q.js.map} +0 -0
  397. /package/dist/{setup-links-CZ56WG7K.js.map → setup-links-KFROCISS.js.map} +0 -0
  398. /package/dist/{site-YGY6IGLQ.js.map → site-MXPKMRQT.js.map} +0 -0
  399. /package/dist/{sources-DPE7HS2L.js.map → sources-FFHNWVLV.js.map} +0 -0
  400. /package/dist/{sources-LFKRFJ6E.js.map → sources-MLDLMEDT.js.map} +0 -0
  401. /package/dist/{stale-HZB4L5VZ.js.map → stale-UXL4X4AD.js.map} +0 -0
  402. /package/dist/{status-TGMY37OX.js.map → status-M47G5HD4.js.map} +0 -0
  403. /package/dist/{sync-GY3YWXZ4.js.map → sync-HS7VZJ2H.js.map} +0 -0
  404. /package/dist/{sync-definition-BREENUVW.js.map → sync-definition-PY6REQ4J.js.map} +0 -0
  405. /package/dist/{tags-BOXRDIP2.js.map → tags-DIXLYB5P.js.map} +0 -0
  406. /package/dist/{tags-OEQA35YM.js.map → tags-DYRZTYHD.js.map} +0 -0
  407. /package/dist/{tags-KDCOIXY5.js.map → tags-MRG56YOE.js.map} +0 -0
  408. /package/dist/{tags-B6FTBKE7.js.map → tags-WAW6MQAY.js.map} +0 -0
  409. /package/dist/{tags-MBGOC3C5.js.map → tags-Y4HHJJGE.js.map} +0 -0
  410. /package/dist/{targeting-criteria-OSIGTYIK.js.map → targeting-criteria-5UUESFWC.js.map} +0 -0
  411. /package/dist/{targets-EZDJE2BR.js.map → targets-COZPVG52.js.map} +0 -0
  412. /package/dist/{templates-43CM65YU.js.map → templates-75VFYZ3E.js.map} +0 -0
  413. /package/dist/{testimonials-TGSG33XN.js.map → testimonials-WJBRWLNW.js.map} +0 -0
  414. /package/dist/{top-companies-AU2Y2JBL.js.map → top-companies-C2R4FG6H.js.map} +0 -0
  415. /package/dist/{translate-UAQN3UP6.js.map → translate-RYAJAFV7.js.map} +0 -0
  416. /package/dist/{triggers-KANOVASP.js.map → triggers-5UHVJPBV.js.map} +0 -0
  417. /package/dist/{unlink-3O34M3RC.js.map → unlink-PLOOAGM3.js.map} +0 -0
  418. /package/dist/{unstage-IU3X67HQ.js.map → unstage-JIIOTBTF.js.map} +0 -0
  419. /package/dist/{update-3T2GI5UT.js.map → update-G6R5ZHUI.js.map} +0 -0
  420. /package/dist/{update-L575JJ26.js.map → update-QYM6U7LL.js.map} +0 -0
  421. /package/dist/{update-2MSRC7SF.js.map → update-RCP7F5L5.js.map} +0 -0
  422. /package/dist/{update-4AKUKIHY.js.map → update-RGVNTA5X.js.map} +0 -0
  423. /package/dist/{upload-YGKEXFZX.js.map → upload-EEJ34Q3Y.js.map} +0 -0
  424. /package/dist/{url-params-JO6DMUNT.js.map → url-params-2G5M2B3J.js.map} +0 -0
  425. /package/dist/{validate-C2AJIWOF.js.map → validate-M33VLUG4.js.map} +0 -0
  426. /package/dist/{videos-73IKG7QH.js.map → videos-FVVID55J.js.map} +0 -0
  427. /package/dist/{viewer-check-VN2JK2LW.js.map → viewer-check-2Q3WHSEL.js.map} +0 -0
  428. /package/dist/{winning-ads-UCDDPWFM.js.map → winning-ads-OSRFHVLV.js.map} +0 -0
  429. /package/dist/{write-commands-WBBS3C5L.js.map → write-commands-CLJOD2XF.js.map} +0 -0
  430. /package/dist/{write-commands-TAYGTJEZ.js.map → write-commands-CT74VHH6.js.map} +0 -0
  431. /package/dist/{x-VOG2EPI6.js.map → x-EBKLJJPJ.js.map} +0 -0
@@ -2,7 +2,7 @@ import {
2
2
  IDEA_VIDEO_FORMATS,
3
3
  figuresIn,
4
4
  unsourcedClaims
5
- } from "./chunk-27NMXSC3.js";
5
+ } from "./chunk-5EEDEVOR.js";
6
6
  import {
7
7
  AD_SPEC_SCHEMA
8
8
  } from "./chunk-CLMM6P6B.js";
@@ -128,4 +128,4 @@ export {
128
128
  unsourcedCopyLines,
129
129
  ideaSpec
130
130
  };
131
- //# sourceMappingURL=chunk-QJE6ZYGI.js.map
131
+ //# sourceMappingURL=chunk-IKYNOT57.js.map
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-ERSX3MKH.js";
14
14
  import {
15
15
  RESEARCH_REDDIT_THREAD_DEFAULT_COMMENTS
16
- } from "./chunk-ASVKZQUU.js";
16
+ } from "./chunk-6HJAHLLA.js";
17
17
  import {
18
18
  apiPost
19
19
  } from "./chunk-XBOK23HI.js";
@@ -294,4 +294,4 @@ export {
294
294
  subredditsFromArgs,
295
295
  redditCommand
296
296
  };
297
- //# sourceMappingURL=chunk-B3AKIYBA.js.map
297
+ //# sourceMappingURL=chunk-J5IU4OX2.js.map
@@ -5,7 +5,7 @@ import {
5
5
  adCopyHints,
6
6
  booleanWordPositionalError,
7
7
  capabilityFix
8
- } from "./chunk-GIJT3A5U.js";
8
+ } from "./chunk-T4DD5YMP.js";
9
9
  import {
10
10
  hintLines,
11
11
  withHints
@@ -493,4 +493,4 @@ export {
493
493
  draftAction,
494
494
  draftListAction
495
495
  };
496
- //# sourceMappingURL=chunk-EIP4PYCL.js.map
496
+ //# sourceMappingURL=chunk-KMEMA7AZ.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  holdUnbilledSpend
3
- } from "./chunk-K3PN7TN5.js";
3
+ } from "./chunk-WTOYCUKH.js";
4
4
  import {
5
5
  askAboutText
6
6
  } from "./chunk-RX6F3GEA.js";
7
7
  import {
8
8
  brandTokensSchema
9
- } from "./chunk-ASVKZQUU.js";
9
+ } from "./chunk-6HJAHLLA.js";
10
10
 
11
11
  // src/engine/landing/lib/brand-tokens.ts
12
12
  import { readFile as readFile2 } from "fs/promises";
@@ -334,4 +334,4 @@ export {
334
334
  brandCommitsAiHue,
335
335
  brandCommitsCream
336
336
  };
337
- //# sourceMappingURL=chunk-ENUZU5LQ.js.map
337
+ //# sourceMappingURL=chunk-KV5BCSUR.js.map
@@ -9,7 +9,7 @@ import {
9
9
  adCopyHints,
10
10
  booleanWordPositionalError,
11
11
  capabilityFix
12
- } from "./chunk-GIJT3A5U.js";
12
+ } from "./chunk-T4DD5YMP.js";
13
13
  import {
14
14
  withHints
15
15
  } from "./chunk-D5FY4FAK.js";
@@ -171,4 +171,4 @@ export {
171
171
  stageOp,
172
172
  stageStatusChange
173
173
  };
174
- //# sourceMappingURL=chunk-FXED3VZK.js.map
174
+ //# sourceMappingURL=chunk-L27H2R2N.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  latestVersion
3
- } from "./chunk-ZN63N3EP.js";
3
+ } from "./chunk-6TCDQSM7.js";
4
4
  import {
5
5
  canvasOutputsRoot
6
- } from "./chunk-HIPDMQZ6.js";
6
+ } from "./chunk-DZSIUEGH.js";
7
7
 
8
8
  // src/commands/creatives/version-of.ts
9
9
  import path from "path";
@@ -16,4 +16,4 @@ async function versionOf(slug, run) {
16
16
  export {
17
17
  versionOf
18
18
  };
19
- //# sourceMappingURL=chunk-OWK5WYFZ.js.map
19
+ //# sourceMappingURL=chunk-NK2UFFVH.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  REF_PREFIX
3
- } from "./chunk-RRUJQVWA.js";
3
+ } from "./chunk-RCQJHKK5.js";
4
4
 
5
5
  // src/commands/canvas/node-preview.ts
6
6
  var MAX_PARAMS_PREVIEW_LENGTH = 4e3;
@@ -57,4 +57,4 @@ ${body}` : header || body || compactJson(record);
57
57
  export {
58
58
  nodeParamsPreview
59
59
  };
60
- //# sourceMappingURL=chunk-EZUG6WE2.js.map
60
+ //# sourceMappingURL=chunk-NSA6HRG6.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ACTION_TEMP_ID_PREFIX
3
- } from "./chunk-ASVKZQUU.js";
3
+ } from "./chunk-6HJAHLLA.js";
4
4
  import {
5
5
  ApiError
6
6
  } from "./chunk-XBOK23HI.js";
@@ -160,4 +160,4 @@ export {
160
160
  ACTIONS_LIST_DEFAULT_LIMIT,
161
161
  buildListHints
162
162
  };
163
- //# sourceMappingURL=chunk-DQPTUBCB.js.map
163
+ //# sourceMappingURL=chunk-NTPXZU3V.js.map
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  findSubreddits,
3
3
  searchReddit
4
- } from "./chunk-B3AKIYBA.js";
4
+ } from "./chunk-J5IU4OX2.js";
5
5
  import {
6
6
  holdUnbilledSpend
7
- } from "./chunk-K3PN7TN5.js";
7
+ } from "./chunk-WTOYCUKH.js";
8
8
  import {
9
9
  findWorkspaceRoot
10
- } from "./chunk-HIPDMQZ6.js";
10
+ } from "./chunk-DZSIUEGH.js";
11
11
  import {
12
12
  CUSTOMER_INSIGHTS_MODEL
13
13
  } from "./chunk-OBDAYP2P.js";
@@ -589,4 +589,4 @@ export {
589
589
  researchCustomers,
590
590
  customersCommand
591
591
  };
592
- //# sourceMappingURL=chunk-P3WRQED4.js.map
592
+ //# sourceMappingURL=chunk-OAQPHP6V.js.map
@@ -6,7 +6,7 @@ import {
6
6
  calendarDaySchema,
7
7
  todayUtc,
8
8
  windowTooLong
9
- } from "./chunk-ASVKZQUU.js";
9
+ } from "./chunk-6HJAHLLA.js";
10
10
 
11
11
  // ../api/src/accounts/crm.ts
12
12
  import { z } from "zod";
@@ -1076,4 +1076,4 @@ export {
1076
1076
  accountsCampaignsRequestSchema,
1077
1077
  ACCOUNTS_NO_SETTINGS_MESSAGE
1078
1078
  };
1079
- //# sourceMappingURL=chunk-633BRRZO.js.map
1079
+ //# sourceMappingURL=chunk-RB5DB3WN.js.map
@@ -43,7 +43,7 @@ import {
43
43
  isBlocking,
44
44
  looksLikeHttpUrl,
45
45
  resolveOutputKinds
46
- } from "./chunk-OTFHEHIU.js";
46
+ } from "./chunk-HRYOZUSK.js";
47
47
 
48
48
  // src/engine/scaffold/static-brief.ts
49
49
  var wordCount = (s) => s.split(/\s+/).filter(Boolean).length;
@@ -4349,9 +4349,11 @@ export {
4349
4349
  BackendClient,
4350
4350
  REF_PREFIX,
4351
4351
  parseRefExpr,
4352
+ NodeDecl,
4352
4353
  renderTemplate,
4353
4354
  priceNode,
4354
4355
  estimateNodeCredits,
4356
+ sumCredits,
4355
4357
  nodeDependencies,
4356
4358
  buildDependencyGraph,
4357
4359
  elementMentionKeywords,
@@ -4369,4 +4371,4 @@ export {
4369
4371
  canSpellNumbers,
4370
4372
  spellNumber
4371
4373
  };
4372
- //# sourceMappingURL=chunk-RRUJQVWA.js.map
4374
+ //# sourceMappingURL=chunk-RCQJHKK5.js.map
@@ -10,10 +10,10 @@ import {
10
10
  readPersonaIds,
11
11
  sameMessageRead,
12
12
  workspaceIdeasJudge
13
- } from "./chunk-27NMXSC3.js";
13
+ } from "./chunk-5EEDEVOR.js";
14
14
  import {
15
15
  findWorkspaceRoot
16
- } from "./chunk-HIPDMQZ6.js";
16
+ } from "./chunk-DZSIUEGH.js";
17
17
  import {
18
18
  registerSchema,
19
19
  writeJson
@@ -130,4 +130,4 @@ export {
130
130
  ideasReport,
131
131
  ideasCommand
132
132
  };
133
- //# sourceMappingURL=chunk-ZXTW3TXY.js.map
133
+ //# sourceMappingURL=chunk-SKT3SAHG.js.map
@@ -11,10 +11,10 @@ import {
11
11
  } from "./chunk-F2S5BLPE.js";
12
12
  import {
13
13
  holdUnbilledSpend
14
- } from "./chunk-K3PN7TN5.js";
14
+ } from "./chunk-WTOYCUKH.js";
15
15
  import {
16
16
  findWorkspaceRoot
17
- } from "./chunk-HIPDMQZ6.js";
17
+ } from "./chunk-DZSIUEGH.js";
18
18
  import {
19
19
  CAPABILITY_SURFACE_SPECS
20
20
  } from "./chunk-ZJWUBJYQ.js";
@@ -163,4 +163,4 @@ export {
163
163
  capabilityFix,
164
164
  adCopyHints
165
165
  };
166
- //# sourceMappingURL=chunk-GIJT3A5U.js.map
166
+ //# sourceMappingURL=chunk-T4DD5YMP.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  holdUnbilledSpend
3
- } from "./chunk-K3PN7TN5.js";
3
+ } from "./chunk-WTOYCUKH.js";
4
4
  import {
5
5
  findWorkspaceRoot
6
- } from "./chunk-HIPDMQZ6.js";
6
+ } from "./chunk-DZSIUEGH.js";
7
7
  import {
8
8
  bytesOf
9
9
  } from "./chunk-4SJDDGPV.js";
@@ -417,4 +417,4 @@ export {
417
417
  fitReference,
418
418
  fitCommand
419
419
  };
420
- //# sourceMappingURL=chunk-OC5IJSIW.js.map
420
+ //# sourceMappingURL=chunk-V2X3KK52.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  failApi
3
- } from "./chunk-DQPTUBCB.js";
3
+ } from "./chunk-NTPXZU3V.js";
4
4
  import {
5
5
  HUBSPOT_MISSING_GRANT_MARKER,
6
6
  HUBSPOT_NOT_CONNECTED_MESSAGE
7
- } from "./chunk-ASVKZQUU.js";
7
+ } from "./chunk-6HJAHLLA.js";
8
8
  import {
9
9
  ApiError
10
10
  } from "./chunk-XBOK23HI.js";
@@ -48,4 +48,4 @@ export {
48
48
  hubspotRefusal,
49
49
  failNotConnected
50
50
  };
51
- //# sourceMappingURL=chunk-YY6CIVRY.js.map
51
+ //# sourceMappingURL=chunk-V5WSJP5A.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  finalOutputLabelsFromCanvas,
3
3
  parseDefinitionStrategyFields
4
- } from "./chunk-XZPREXCE.js";
4
+ } from "./chunk-ACFWVULZ.js";
5
5
  import {
6
6
  readRenderState
7
- } from "./chunk-ZN63N3EP.js";
7
+ } from "./chunk-6TCDQSM7.js";
8
8
  import {
9
9
  STATIC_AD_ROLE,
10
10
  formatOfAdaptId,
@@ -12,14 +12,15 @@ import {
12
12
  isSignatureLine,
13
13
  sameTag,
14
14
  seriesMemberAd
15
- } from "./chunk-NEZLPWD4.js";
15
+ } from "./chunk-IH4UQ2OK.js";
16
16
  import {
17
17
  fetchRunRecord
18
- } from "./chunk-GZVZ7CQI.js";
18
+ } from "./chunk-WRIC2RPQ.js";
19
19
  import {
20
20
  localPathParam
21
- } from "./chunk-HIPDMQZ6.js";
21
+ } from "./chunk-DZSIUEGH.js";
22
22
  import {
23
+ NodeDecl,
23
24
  STATIC_ADAPT_FORMAT_ROLE,
24
25
  STATIC_FIX_ROLE,
25
26
  STATIC_MASTER_ROLE,
@@ -30,11 +31,15 @@ import {
30
31
  nodesWithRole,
31
32
  relaidPictureRole,
32
33
  rolesById
33
- } from "./chunk-RRUJQVWA.js";
34
+ } from "./chunk-RCQJHKK5.js";
34
35
  import {
35
36
  isAdSpec,
36
37
  readAdSpec
37
38
  } from "./chunk-CLMM6P6B.js";
39
+ import {
40
+ sha256Hex,
41
+ toModelSafeImage
42
+ } from "./chunk-HRYOZUSK.js";
38
43
 
39
44
  // src/commands/baker-child.ts
40
45
  import { execFile } from "child_process";
@@ -81,6 +86,7 @@ function isStaticAdCanvas(parsed) {
81
86
  // src/commands/canvas/static-fix.ts
82
87
  import { readFile } from "fs/promises";
83
88
  import path from "path";
89
+ import { z } from "zod";
84
90
  async function previousAdImage(canvasRoot, runId, fetchRecord = fetchRunRecord, roles = {}) {
85
91
  try {
86
92
  const manifest = JSON.parse(await readFile(path.join(canvasRoot, runId, "manifest.json"), "utf8"));
@@ -140,7 +146,9 @@ function chosenUrl(byNode) {
140
146
  return null;
141
147
  }
142
148
  function correctedUrl(byNode) {
143
- for (const [id, out] of Object.entries(byNode)) {
149
+ const editNumber = (id) => Number(id.match(/^edit_(\d+)$/)?.[1] ?? 0);
150
+ const entries = Object.entries(byNode).sort(([a], [b]) => editNumber(b) - editNumber(a));
151
+ for (const [id, out] of entries) {
144
152
  if (id === "fix" || id === "chosen" || out.role === STATIC_FIX_ROLE) {
145
153
  const url = urlOf(out);
146
154
  if (url) return url;
@@ -148,6 +156,59 @@ function correctedUrl(byNode) {
148
156
  }
149
157
  return null;
150
158
  }
159
+ async function fetchGraph(url) {
160
+ const res = await fetch(url);
161
+ return res.ok ? res.json() : null;
162
+ }
163
+ var HISTORY = { record: fetchRunRecord, graph: fetchGraph };
164
+ var VersionGraph = z.object({ nodes: z.array(NodeDecl) });
165
+ var VersionManifest = z.object({
166
+ canvas: VersionGraph,
167
+ outputs_by_node: z.record(z.string(), z.record(z.string(), z.unknown()))
168
+ });
169
+ async function versionRun(canvasRoot, runId, sources = HISTORY) {
170
+ try {
171
+ const manifest = VersionManifest.safeParse(JSON.parse(await readFile(path.join(canvasRoot, runId, "manifest.json"), "utf8")));
172
+ if (manifest.success) return { canvas: manifest.data.canvas, outputs: manifest.data.outputs_by_node };
173
+ } catch {
174
+ }
175
+ const record = await sources.record(runId).catch(() => null);
176
+ const graph = record?.graphUrl ? await sources.graph(record.graphUrl).catch(() => null) : null;
177
+ const canvas = VersionGraph.safeParse(graph);
178
+ return record && canvas.success ? { canvas: canvas.data, outputs: outputsByNode(record.nodes) } : null;
179
+ }
180
+ async function ingestedNow(files, canvasDir) {
181
+ const entries = await Promise.all(
182
+ files.map(async (file) => {
183
+ const bytes = await readFile(path.resolve(canvasDir, file.path)).catch(() => null);
184
+ if (!bytes) return [file.id, []];
185
+ const own = sha256Hex(bytes);
186
+ if (file.expect !== "image") return [file.id, [own]];
187
+ const raster = await toModelSafeImage(bytes).catch(() => null);
188
+ return [file.id, raster ? [.../* @__PURE__ */ new Set([own, sha256Hex(raster.bytes)])] : [own]];
189
+ })
190
+ );
191
+ return Object.fromEntries(entries);
192
+ }
193
+ function outputsByNode(nodes) {
194
+ const byNode = {};
195
+ for (const node of nodes) {
196
+ const outputs = {};
197
+ for (const out of node.outputs) {
198
+ const [slot = "", index] = String(out.slot ?? "").split("#");
199
+ const { slot: _slot, label: _label, durationMs, ...ref } = out;
200
+ const asset = { ...ref, ...typeof durationMs === "number" ? { duration_ms: durationMs } : {} };
201
+ if (index === void 0) outputs[slot] = asset;
202
+ else {
203
+ const list = Array.isArray(outputs[slot]) ? outputs[slot] : [];
204
+ list[Number(index)] = asset;
205
+ outputs[slot] = list;
206
+ }
207
+ }
208
+ if (Object.keys(outputs).length > 0) byNode[node.nodeId] = outputs;
209
+ }
210
+ return byNode;
211
+ }
151
212
  async function correctedPicture(canvasRoot, runId, fetchRecord = fetchRunRecord) {
152
213
  try {
153
214
  const manifest = JSON.parse(await readFile(path.join(canvasRoot, runId, "manifest.json"), "utf8"));
@@ -432,6 +493,8 @@ export {
432
493
  isStaticAdCanvas,
433
494
  previousAdImage,
434
495
  previousDelivered,
496
+ versionRun,
497
+ ingestedNow,
435
498
  correctedPicture,
436
499
  pictureRecord,
437
500
  keepsChosen,
@@ -443,4 +506,4 @@ export {
443
506
  writeSeriesMemberCanvas,
444
507
  seriesRunHints
445
508
  };
446
- //# sourceMappingURL=chunk-7H2VLDYU.js.map
509
+ //# sourceMappingURL=chunk-VJZHVOA4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/baker-child.ts","../src/commands/canvas/static-ad-canvas.ts","../src/commands/canvas/static-fix.ts","../src/commands/canvas/series-member.ts"],"sourcesContent":["/**\n * Another `baker` command run from this one, as a child process of the same CLI, read back by its\n * JSON answer: `creatives make` scaffolds through it, and `canvas run --series` renders each ad of\n * a series through it, all at once.\n */\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst run = promisify(execFile);\n\n/** The last JSON object a command printed, after any progress lines. Pure. */\nexport function lastJsonObject(stdout: string): Record<string, unknown> | null {\n for (let at = stdout.lastIndexOf(\"{\"); at >= 0; at = stdout.lastIndexOf(\"{\", at - 1)) {\n if (at > 0 && stdout[at - 1] !== \"\\n\") continue;\n try {\n const parsed: unknown = JSON.parse(stdout.slice(at));\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) return parsed as Record<string, unknown>;\n } catch {\n // Not the start of the final object: keep looking further back.\n }\n if (at === 0) break;\n }\n return null;\n}\n\n/** Run another `baker` command in this same CLI and read its JSON answer. */\nexport async function runBaker(args: string[], signal?: AbortSignal): Promise<Record<string, unknown>> {\n const entry = process.argv[1];\n const [file, argv] = entry ? [process.execPath, [...process.execArgv, entry, ...args]] : [\"baker\", args];\n try {\n const { stdout } = await run(file, argv, { maxBuffer: 32 * 1024 * 1024, ...(signal ? { signal } : {}) });\n return lastJsonObject(stdout) ?? { ok: false, error: { code: \"INTERNAL_ERROR\", message: \"no answer\" } };\n } catch (err) {\n // A scaffold reports its failure on stderr, other commands on stdout.\n const { stdout = \"\", stderr = \"\" } = err as { stdout?: string; stderr?: string };\n return (\n lastJsonObject(stdout) ??\n lastJsonObject(stderr) ?? {\n ok: false,\n error: { code: \"INTERNAL_ERROR\", message: err instanceof Error ? err.message.slice(0, 300) : String(err) },\n }\n );\n }\n}\n","import { STATIC_AD_ROLE } from \"../../engine/scaffold/static-render-briefs.ts\";\nimport { STATIC_VARIANTS_ROLE } from \"../../engine/scaffold/static-topology.ts\";\n\n/**\n * A static ad canvas, by role: an ingest tagged as the static ad's blueprint, or a node that\n * renders a static ad's variants. A canvas scaffolded by the overlay engine (a `compose_spec`\n * ingest) still counts, so a creative already in a client workspace reads as one until it is\n * re-scaffolded.\n */\nexport function isStaticAdCanvas(parsed: unknown): boolean {\n const nodes = (parsed as { nodes?: unknown } | null)?.nodes;\n if (!Array.isArray(nodes)) return false;\n return nodes.some((n) => {\n const role = (n as { tags?: { role?: unknown } } | null)?.tags?.role;\n if (role === STATIC_VARIANTS_ROLE) return true;\n return n?.type === \"ingest\" && (role === STATIC_AD_ROLE || n?.id === \"compose_spec\");\n });\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport { toModelSafeImage } from \"../../engine/nodes/ingest.ts\";\nimport type { VariantFile, VersionRun } from \"../../engine/scaffold/static-history.ts\";\nimport { NodeDecl } from \"../../engine/schema/canvas.ts\";\nimport { sha256Hex } from \"../../engine/storage/sha256.ts\";\nimport { fetchRunRecord } from \"./run-history.ts\";\n\nimport {\n rolesById,\n STATIC_ADAPT_FORMAT_ROLE,\n STATIC_FIX_ROLE,\n STATIC_MASTER_ROLE,\n STATIC_PICK_ROLE,\n STATIC_SAFE_FIT_ROLE,\n STATIC_SIZE_ROLE,\n STATIC_VARIANTS_ROLE,\n} from \"../../engine/scaffold/static-topology.ts\";\n\ntype Output = { url?: unknown; slot?: unknown; sha256?: unknown; path?: unknown };\n/** One node's outputs as a run keeps them: a list (`images`) or a single image, and its role when known. */\n/** A node's outputs by slot: a generation's `images`, a tool's `image`, an ingest's `asset`. */\ntype NodeOutputs = { images?: Output[]; image?: Output; asset?: Output; role?: string };\n\n/**\n * The finished ad a run chose, as the durable URL its record holds: its master (the chosen\n * picture before any logo is placed on it), or, on a run of the older graph, the judge's pick\n * or the lone take. Read from the local run folder first (`manifest.json`, outputs by node id,\n * given roles by `roles` — the canvas's), then from the company's run history (whose nodes\n * carry their roles), so a version rendered in another chat can be corrected too. Null when\n * the run is unknown or made no ad.\n */\nexport async function previousAdImage(\n canvasRoot: string,\n runId: string,\n fetchRecord: (\n runId: string,\n ) => Promise<{ nodes: Array<{ nodeId: string; role?: string; outputs: Output[] }> } | null> = fetchRunRecord,\n roles: Readonly<Record<string, string>> = {},\n): Promise<string | null> {\n try {\n const manifest = JSON.parse(await readFile(path.join(canvasRoot, runId, \"manifest.json\"), \"utf8\")) as {\n outputs_by_node?: Record<string, NodeOutputs>;\n };\n const byNode = Object.fromEntries(\n Object.entries(manifest.outputs_by_node ?? {}).map(([id, out]) => [id, { ...out, ...(roles[id] ? { role: roles[id] } : {}) }]),\n );\n const local = chosenUrl(byNode);\n if (local) return local;\n } catch {\n // Not rendered here: ask the run history.\n }\n const record = await fetchRecord(runId).catch(() => null);\n if (!record) return null;\n return chosenUrl(\n Object.fromEntries(\n record.nodes.map((n) => {\n const role = n.role ?? roles[n.nodeId];\n return [n.nodeId, { images: n.outputs, ...(role ? { role } : {}) }];\n }),\n ),\n );\n}\n\n/**\n * The sizes a run delivered (its `output` collect, `finalNode`), each with the format `labels`\n * gives it, from the local run folder: its local file, or its durable URL first (`prefer: \"url\"`).\n * Empty when the run was not rendered here.\n */\nexport async function previousDelivered(\n canvasRoot: string,\n runId: string,\n finalNode: string,\n labels: readonly (string | undefined)[],\n opts: { prefer?: \"url\" } = {},\n): Promise<Array<{ format: string; path: string }>> {\n try {\n const manifest = JSON.parse(await readFile(path.join(canvasRoot, runId, \"manifest.json\"), \"utf8\")) as {\n outputs_by_node?: Record<string, NodeOutputs>;\n };\n const images = manifest.outputs_by_node?.[finalNode]?.images ?? [];\n return images.flatMap((image, i) => {\n const local = typeof image.path === \"string\" ? image.path : null;\n const durable = typeof image.url === \"string\" ? image.url : null;\n const source = opts.prefer === \"url\" ? (durable ?? local) : (local ?? durable);\n const format = labels[i];\n return source && format ? [{ format, path: source }] : [];\n });\n } catch {\n return [];\n }\n}\n\n/** Which node holds the chosen ad, best first: by role on the one-picture graph, by id on an older one. */\nconst CHOSEN: ReadonlyArray<(id: string, out: NodeOutputs) => boolean> = [\n (_, out) => out.role === STATIC_MASTER_ROLE,\n (_, out) => out.role === STATIC_PICK_ROLE,\n (_, out) => out.role === STATIC_FIX_ROLE,\n (id, out) => id === \"pick\" && out.role === undefined,\n (id, out) => id === \"ad\" && out.role === undefined,\n];\n\nfunction urlOf(out: NodeOutputs): string | null {\n const url = out.images?.find((o) => typeof o?.url === \"string\")?.url ?? out.image?.url ?? out.asset?.url;\n return typeof url === \"string\" ? url : null;\n}\n\n/** The chosen ad among a run's node outputs (see `previousAdImage`). Never a variant the judge did not keep. Pure. */\nexport function chosenUrl(byNode: Record<string, NodeOutputs>): string | null {\n const entries = Object.entries(byNode).filter(([, out]) => out.role !== STATIC_VARIANTS_ROLE);\n for (const matches of CHOSEN) {\n for (const [id, out] of entries) {\n if (!matches(id, out)) continue;\n const url = urlOf(out);\n if (url) return url;\n }\n }\n return null;\n}\n\n/**\n * The picture a correction (`--fix`) or a person's choice (`--use-variant`) put in place of the\n * variants, the input its master was made from. Null for a plain render: the scaffolded graph\n * already reaches that picture through its own cache. Ids are the ones `fixStaticAd` and\n * `rederiveFromVariant` give those nodes; a run record also carries the correction's role. Pure.\n */\nexport function correctedUrl(byNode: Record<string, NodeOutputs>): string | null {\n // A version grown on top of others (`static-history.ts`) keeps every correction: it shows its last.\n // `fix` and `chosen` never share a graph with an `edit_<n>`: a chosen variant drops the edits before it.\n const editNumber = (id: string) => Number(id.match(/^edit_(\\d+)$/)?.[1] ?? 0);\n const entries = Object.entries(byNode).sort(([a], [b]) => editNumber(b) - editNumber(a));\n for (const [id, out] of entries) {\n if (id === \"fix\" || id === \"chosen\" || out.role === STATIC_FIX_ROLE) {\n const url = urlOf(out);\n if (url) return url;\n }\n }\n return null;\n}\n\n/** A run as the run history keeps it: each node's recorded outputs, and where the graph it ran is kept. */\ntype RecordedRun = {\n graphUrl?: string;\n nodes: ReadonlyArray<{ nodeId: string; outputs: ReadonlyArray<Record<string, unknown>> }>;\n};\n\ntype VersionSources = {\n record: (runId: string) => Promise<RecordedRun | null>;\n graph: (url: string) => Promise<unknown>;\n};\n\nasync function fetchGraph(url: string): Promise<unknown> {\n const res = await fetch(url);\n return res.ok ? res.json() : null;\n}\n\nconst HISTORY: VersionSources = { record: fetchRunRecord, graph: fetchGraph };\n\n/** The graph a version ran, as its manifest or the run history keeps it. */\nconst VersionGraph = z.object({ nodes: z.array(NodeDecl) });\n/** The part of a run's manifest a version grows from: the graph it ran and every node's outputs. */\nconst VersionManifest = z.object({\n canvas: VersionGraph,\n outputs_by_node: z.record(z.string(), z.record(z.string(), z.unknown())),\n});\n\n/**\n * The graph run `runId` ran and every node's outputs, so the next version can be grown on top of\n * it (`growFromVersion`): from its run folder here, else, for a version rendered in another\n * workspace (\"Edit creative …\" from a new chat), from the run history and the graph it kept. Null\n * when neither has it (a run recorded before graphs were kept): the caller corrects by URL.\n */\nexport async function versionRun(\n canvasRoot: string,\n runId: string,\n sources: VersionSources = HISTORY,\n): Promise<VersionRun | null> {\n try {\n const manifest = VersionManifest.safeParse(JSON.parse(await readFile(path.join(canvasRoot, runId, \"manifest.json\"), \"utf8\")));\n if (manifest.success) return { canvas: manifest.data.canvas, outputs: manifest.data.outputs_by_node };\n } catch {\n // Not rendered here: ask the run history.\n }\n const record = await sources.record(runId).catch(() => null);\n const graph = record?.graphUrl ? await sources.graph(record.graphUrl).catch(() => null) : null;\n const canvas = VersionGraph.safeParse(graph);\n return record && canvas.success ? { canvas: canvas.data, outputs: outputsByNode(record.nodes) } : null;\n}\n\n/**\n * What each workspace file the variants read is ingested as now, by node id (`makesSameVariants`):\n * the sha256 of its bytes, and for a picture also of the raster the ingest makes it into (an SVG\n * logo is ingested as a PNG). A file that cannot be read matches nothing.\n */\nexport async function ingestedNow(files: readonly VariantFile[], canvasDir: string): Promise<Record<string, string[]>> {\n const entries = await Promise.all(\n files.map(async (file): Promise<[string, string[]]> => {\n const bytes = await readFile(path.resolve(canvasDir, file.path)).catch(() => null);\n if (!bytes) return [file.id, []];\n const own = sha256Hex(bytes);\n if (file.expect !== \"image\") return [file.id, [own]];\n const raster = await toModelSafeImage(bytes).catch(() => null);\n return [file.id, raster ? [...new Set([own, sha256Hex(raster.bytes)])] : [own]];\n }),\n );\n return Object.fromEntries(entries);\n}\n\n/**\n * Each node's outputs as the engine hands them on, from the run record's flat list: `images#1`\n * back into `images[1]`, `image` as it is, each an asset ref. A node that recorded none is left out.\n * Pure.\n */\nfunction outputsByNode(nodes: RecordedRun[\"nodes\"]): Record<string, Record<string, unknown>> {\n const byNode: Record<string, Record<string, unknown>> = {};\n for (const node of nodes) {\n const outputs: Record<string, unknown> = {};\n for (const out of node.outputs) {\n const [slot = \"\", index] = String(out.slot ?? \"\").split(\"#\");\n const { slot: _slot, label: _label, durationMs, ...ref } = out;\n const asset = { ...ref, ...(typeof durationMs === \"number\" ? { duration_ms: durationMs } : {}) };\n if (index === undefined) outputs[slot] = asset;\n else {\n const list = (Array.isArray(outputs[slot]) ? outputs[slot] : []) as unknown[];\n list[Number(index)] = asset;\n outputs[slot] = list;\n }\n }\n if (Object.keys(outputs).length > 0) byNode[node.nodeId] = outputs;\n }\n return byNode;\n}\n\n/**\n * `correctedUrl` of a run: the local run folder first, then the company's run history, so a\n * version corrected in another chat is found too. Null for a plain render or an unknown run.\n */\nexport async function correctedPicture(\n canvasRoot: string,\n runId: string,\n fetchRecord: (\n runId: string,\n ) => Promise<{ nodes: Array<{ nodeId: string; role?: string; outputs: Output[] }> } | null> = fetchRunRecord,\n): Promise<string | null> {\n try {\n const manifest = JSON.parse(await readFile(path.join(canvasRoot, runId, \"manifest.json\"), \"utf8\")) as {\n outputs_by_node?: Record<string, NodeOutputs>;\n };\n if (manifest.outputs_by_node) return correctedUrl(manifest.outputs_by_node);\n } catch {\n // Not rendered here: ask the run history.\n }\n const record = await fetchRecord(runId).catch(() => null);\n if (!record) return null;\n return correctedUrl(\n Object.fromEntries(record.nodes.map((n) => [n.nodeId, { images: n.outputs, ...(n.role ? { role: n.role } : {}) }])),\n );\n}\n\n/**\n * How a version's picture came to be, where its canvas alone would not say: `chosen`, the person\n * picked it (`--use-variant`), so it is only ever corrected, never replaced, through every fix and\n * re-layout of it; `redrawn`, a new picture told what the last one got wrong (an autofix round),\n * which the scaffolded graph would not draw again.\n */\nexport type PictureRecord = { runId: string; chosen?: true; redrawn?: true };\n\n/**\n * The record of run `runId`'s picture: `chose`, the person picked it now; `keeps`, the run kept the\n * picture of version `from` (a fix, an edit, a re-layout), whose record `of` is. Pure.\n */\nexport function pictureRecord(\n runId: string,\n opts: { chose?: boolean; of?: PictureRecord | undefined; from?: string | undefined; keeps?: boolean; redrawn?: boolean },\n): PictureRecord {\n const chosen = opts.chose === true || (opts.keeps === true && keepsChosen(opts.of, opts.from));\n return { runId, ...(chosen ? { chosen: true as const } : {}), ...(opts.redrawn ? { redrawn: true as const } : {}) };\n}\n\n/** Whether version `from` shows a picture the person chose. Pure. */\nexport function keepsChosen(picture: PictureRecord | undefined, from: string | undefined): boolean {\n return picture?.chosen === true && from !== undefined && picture.runId === from;\n}\n\n/**\n * Whether `--regenerate` forces only re-laid-out sizes (their fills and safe fits): work that must start\n * from the picture the version already shows, never from new variants. Pure.\n */\nexport function relaysSizesOnly(canvas: unknown, ids: readonly string[]): boolean {\n const roles = rolesById(canvas);\n const sizing = new Set([STATIC_ADAPT_FORMAT_ROLE, STATIC_SIZE_ROLE, STATIC_SAFE_FIT_ROLE]);\n return ids.length > 0 && ids.every((id) => sizing.has(roles[id] ?? \"\"));\n}\n\n/** A sha256 or a unique prefix of one (at least 8 hex characters). */\nconst SHA_PREFIX = /^[0-9a-f]{8,64}$/;\n\n/** The URL of the variant whose sha256 starts with `sha` among one node's outputs; null when none or several match. */\nfunction matchVariant(outputs: readonly Output[], sha: string): string | null {\n const hits = outputs.filter((o) => typeof o?.sha256 === \"string\" && o.sha256.startsWith(sha) && typeof o.url === \"string\");\n const urls = [...new Set(hits.map((o) => o.url as string))];\n return urls.length === 1 ? (urls[0] as string) : null;\n}\n\n/**\n * The durable URL of the variant to make every size from instead of the judge's pick (`--use-variant`),\n * found by its sha256 among the run's variants, never by position: the local run folder first\n * (its outputs keyed by node id, given roles by `roles`), then the run history. Null when the\n * run or the variant is unknown.\n */\nexport async function variantImage(\n canvasRoot: string,\n runId: string,\n sha256: string,\n fetchRecord: (\n runId: string,\n ) => Promise<{ nodes: Array<{ nodeId: string; role?: string; outputs: Output[] }> } | null> = fetchRunRecord,\n roles: Readonly<Record<string, string>> = {},\n): Promise<string | null> {\n const sha = sha256.trim().toLowerCase();\n if (!SHA_PREFIX.test(sha)) return null;\n try {\n const manifest = JSON.parse(await readFile(path.join(canvasRoot, runId, \"manifest.json\"), \"utf8\")) as {\n outputs_by_node?: Record<string, NodeOutputs>;\n };\n for (const [id, out] of Object.entries(manifest.outputs_by_node ?? {})) {\n if (roles[id] !== STATIC_VARIANTS_ROLE) continue;\n const url = matchVariant(out.images ?? [], sha);\n if (url) return url;\n }\n } catch {\n // Not rendered here: ask the run history.\n }\n const record = await fetchRecord(runId).catch(() => null);\n const variants = record?.nodes.find((n) => n.role === STATIC_VARIANTS_ROLE);\n return variants ? matchVariant(variants.outputs, sha) : null;\n}\n","/**\n * An ad of a series, on disk: `src/creatives/<slug>/` holds its own words (`prompt.json`) and a\n * `_definition.md` naming its lead (`series: <lead>`); its canvas is written from the lead's,\n * every run, as an edit of the lead's ready version (`seriesMemberAd`). The ad never designs a\n * picture of its own, so ten messages in one style come out as one ad ten times.\n */\nimport { existsSync } from \"node:fs\";\nimport { readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { CreativesRunData } from \"@baker/api\";\nimport { isAdSpec, readAdSpec } from \"../../engine/scaffold/static-ad-spec.ts\";\nimport { isCustomersWords, isSignatureLine } from \"../../engine/scaffold/static-proof.ts\";\nimport { sameTag } from \"../../language.ts\";\nimport { formatOfAdaptId } from \"../../engine/scaffold/static-adapt-briefs.ts\";\nimport {\n nodesWithRole,\n relaidPictureRole,\n rolesById,\n STATIC_ADAPT_FORMAT_ROLE,\n} from \"../../engine/scaffold/static-topology.ts\";\nimport { type SeriesLead, seriesMemberAd } from \"../../engine/scaffold/staticAd.ts\";\nimport { parseDefinitionStrategyFields } from \"./creative-definition.ts\";\nimport { localPathParam } from \"./resolve-paths.ts\";\nimport { readRenderState } from \"./render-state.ts\";\nimport { fetchRunRecord } from \"./run-history.ts\";\nimport { finalOutputLabelsFromCanvas } from \"./run-record.ts\";\nimport { isStaticAdCanvas } from \"./static-ad-canvas.ts\";\nimport { previousAdImage, previousDelivered } from \"./static-fix.ts\";\n\n/** Why a series ad cannot be made yet: what to tell the agent, and what to do. */\nexport type SeriesRefusal = { refused: { code: string; message: string; fix: string } };\n\ntype Fetch = (runId: string) => Promise<CreativesRunData | null>;\n\nconst creativeDir = (root: string, slug: string) => path.join(root, \"src\", \"creatives\", slug);\nconst canvasFile = (root: string, slug: string) => path.join(creativeDir(root, slug), `${slug}.canvas.json`);\n\n/** What a creative's `_definition.md` says of its series: its lead (`series:`) and the language its words are in. */\nasync function seriesFieldsOf(root: string, slug: string): Promise<{ seriesLead?: string; language?: string }> {\n const raw = await readFile(path.join(creativeDir(root, slug), \"_definition.md\"), \"utf8\").catch(() => null);\n return raw === null ? {} : parseDefinitionStrategyFields(raw);\n}\n\n/** The lead a creative's `_definition.md` names (`series:`); null when it is no ad of a series. */\nexport async function seriesLeadOf(root: string, slug: string): Promise<string | null> {\n return (await seriesFieldsOf(root, slug)).seriesLead ?? null;\n}\n\n/** The language a translation's words are in: its own, when it is not its lead's. Undefined on any other ad. */\nasync function translatedInto(root: string, slug: string, lead: string): Promise<string | undefined> {\n const own = (await seriesFieldsOf(root, slug)).language;\n const leads = (await seriesFieldsOf(root, lead)).language;\n return own && !(leads && sameTag(own, leads)) ? own : undefined;\n}\n\n/** How many leads up a series may chain: a design, its angle ads, their translations. */\nexport const SERIES_DEPTH = 3;\n\n/**\n * The leads above `slug`, nearest first, up to the ad whose design the whole series has (an angle\n * ad, then the design it was made from). Bounded and cycle-safe; empty for an ad in no series.\n */\nexport async function seriesLeadsAbove(root: string, slug: string): Promise<string[]> {\n const leads: string[] = [];\n let at = await seriesLeadOf(root, slug);\n while (at && at !== slug && !leads.includes(at) && leads.length < SERIES_DEPTH) {\n leads.push(at);\n at = await seriesLeadOf(root, at);\n }\n return leads;\n}\n\n/** Every ad of the series led by `lead`, by slug, in folder order. */\nexport async function seriesMembers(root: string, lead: string): Promise<string[]> {\n const slugs = await readdir(path.join(root, \"src\", \"creatives\")).catch(() => [] as string[]);\n const members: string[] = [];\n for (const slug of slugs.sort()) {\n if (slug !== lead && (await seriesLeadOf(root, slug)) === lead) members.push(slug);\n }\n return members;\n}\n\nfunction refusal(code: string, message: string, fix: string): SeriesRefusal {\n return { refused: { code, message, fix } };\n}\n\n/**\n * The lead's ready version: the one this workspace shows (its render state), its words as that\n * render drew them, its chosen picture and every size it delivered. A lead never rendered, or\n * whose version still needs fixes, is refused: every ad of the series copies it.\n */\nexport async function leadVersion(\n root: string,\n lead: string,\n fetchRecord: Fetch = fetchRunRecord,\n): Promise<{ lead: SeriesLead; canvas: unknown; spec: unknown } | SeriesRefusal> {\n const file = canvasFile(root, lead);\n const canvas: unknown = existsSync(file) ? JSON.parse(await readFile(file, \"utf8\")) : null;\n if (!canvas || !isStaticAdCanvas(canvas)) {\n return refusal(\n \"series_lead_not_found\",\n `The lead ad \"${lead}\" is not a static ad in this workspace.`,\n \"Name a static ad of this workspace as the lead: make it with `baker creatives make <idea>` and render it first.\",\n );\n }\n const canvasRoot = path.join(root, \"canvas\");\n const state = await readRenderState(canvasRoot, lead);\n const runId = state.rendered?.runId;\n if (!runId) {\n return refusal(\n \"series_lead_not_rendered\",\n `The lead ad \"${lead}\" has no finished version yet: every ad of its series is made from it.`,\n `Render the lead first and get it ready: baker canvas run --slug ${lead}. Then make the series.`,\n );\n }\n if ((state.blocking ?? []).length > 0) {\n return refusal(\n \"series_lead_not_ready\",\n `The lead ad \"${lead}\" still needs fixes (${(state.blocking ?? []).join(\" | \")}): the series would copy them.`,\n `Correct the lead until its verdict is ready (baker canvas run --slug ${lead}, or --fix \"<what to change>\"), then run the series again.`,\n );\n }\n const record = (): Promise<CreativesRunData | null> => fetchRecord(runId).catch(() => null);\n const picture = await previousAdImage(canvasRoot, runId, record, { ...rolesById(canvas), ...relaidPictureRole(canvas) });\n const sizes = await deliveredSizes(canvasRoot, runId, canvas, record);\n if (!picture) {\n return refusal(\n \"series_lead_not_rendered\",\n `The finished picture of the lead's version (${runId}) is not available.`,\n `Render the lead again (baker canvas run --slug ${lead}), then run the series.`,\n );\n }\n const drawn = state.prompt ?? JSON.parse(await readFile(path.join(creativeDir(root, lead), \"prompt.json\"), \"utf8\"));\n const copy = readAdSpec(drawn).copy.map((l) => ({ text: l.text, ...(l.role ? { role: l.role } : {}) }));\n return { lead: { slug: lead, runId, copy, picture, sizes }, canvas, spec: drawn };\n}\n\n/** Each re-laid-out size the lead's version delivered, by format: its local run folder first, else its record. */\nasync function deliveredSizes(\n canvasRoot: string,\n runId: string,\n canvas: unknown,\n record: () => Promise<CreativesRunData | null>,\n): Promise<Record<string, string>> {\n const wanted = new Set(nodesWithRole(canvas, STATIC_ADAPT_FORMAT_ROLE).flatMap((n) => formatOfAdaptId(n.id) ?? []));\n const labels = finalOutputLabelsFromCanvas(canvas);\n const local = await previousDelivered(canvasRoot, runId, labels?.nodeId ?? \"final\", labels?.labels ?? [], {\n prefer: \"url\",\n });\n const found = local.length > 0 ? local : ((await record())?.finalOutputs ?? []).flatMap((o) =>\n o.label && o.url ? [{ format: o.label, path: o.url }] : [],\n );\n return Object.fromEntries(found.filter((d) => wanted.has(d.format)).map((d) => [d.format, d.path]));\n}\n\n/**\n * The lead's canvas with its local paths read from the member's folder: the brand's font and\n * logo are the same files, the member's own `prompt.json` stays its own. Pure.\n */\nexport function rebaseLeadPaths<T>(canvas: T, leadDir: string, memberDir: string): T {\n const out = structuredClone(canvas) as { nodes?: Array<{ id?: unknown; type?: unknown; params?: Record<string, unknown> }> };\n for (const node of out.nodes ?? []) {\n const key = localPathParam(node);\n const value = key ? node.params?.[key] : undefined;\n if (!key || !node.params || typeof value !== \"string\" || node.id === \"prompt\" || path.isAbsolute(value)) continue;\n const rel = path.relative(memberDir, path.resolve(leadDir, value)).split(path.sep).join(\"/\");\n node.params[key] = rel.startsWith(\".\") ? rel : `./${rel}`;\n }\n return out as T;\n}\n\n/** What every ad of a series shares with its lead: everything in prompt.json but its words and who it speaks to. */\nconst DESIGN_FIELDS = [\n \"scene\",\n \"brand\",\n \"colors\",\n \"references\",\n \"logo\",\n \"logo_position\",\n \"third_party_brands\",\n \"formats\",\n \"direction\",\n] as const;\n\n/** The design a spec draws, as one comparable string; null when it does not read as an ad spec. Pure. */\nexport function seriesDesignOf(spec: unknown): string | null {\n try {\n const read = readAdSpec(spec) as Record<string, unknown>;\n return JSON.stringify(DESIGN_FIELDS.map((key) => read[key] ?? null));\n } catch {\n return null;\n }\n}\n\n/** `memberSpec` with the lead's design and its own words, viewer and message. Pure. */\nfunction withLeadDesign(memberSpec: unknown, leadSpec: unknown): Record<string, unknown> {\n // An older blueprint names its design in its own shape: each is taken as the ad spec it reads as.\n const asSpec = (spec: unknown): Record<string, unknown> =>\n isAdSpec(spec) ? (spec as Record<string, unknown>) : readAdSpec(spec);\n const lead = asSpec(leadSpec);\n const out = { ...asSpec(memberSpec) };\n for (const key of DESIGN_FIELDS) {\n if (key in lead) out[key] = lead[key];\n else delete out[key];\n }\n return out;\n}\n\n/** A series ad whose words are still the lead's renders the lead again: refused before anything bills. Pure. */\nexport function unchangedCopyRefusal(lead: SeriesLead, memberSpec: unknown): SeriesRefusal | null {\n const words = (copy: ReadonlyArray<{ text: string }>) => copy.map((l) => l.text.trim()).join(\"\\n\");\n let copy: ReadonlyArray<{ text: string }>;\n try {\n copy = readAdSpec(memberSpec).copy;\n } catch {\n return null;\n }\n if (words(copy) !== words(lead.copy)) return null;\n return refusal(\n \"series_copy_unchanged\",\n `This ad's words are still the lead's (\"${lead.copy[0]?.text ?? \"\"}\"): it would render the lead again.`,\n \"Write this ad's own words in its prompt.json `copy`, one line for each of the lead's (same roles), saying this ad's message. Keep everything else: the design is the lead's.\",\n );\n}\n\n/**\n * A translation whose lines the lead holds as a customer's words (a quote, signed by its shape or\n * its role, or by a signature on the line below) are not those words as the lead has them: the\n * translation puts words the customer never said under their name. Null when every one is kept. Pure.\n */\nexport function changedCustomerWordsRefusal(lead: SeriesLead, memberSpec: unknown): SeriesRefusal | null {\n let copy: ReadonlyArray<{ text: string }>;\n try {\n copy = readAdSpec(memberSpec).copy;\n } catch {\n return null;\n }\n const said = new Set(copy.map((l) => l.text.trim()));\n const changed = lead.copy.filter((line, i) => {\n const below = lead.copy[i + 1];\n const theirs = isCustomersWords(line) || (below !== undefined && isSignatureLine(below));\n return theirs && !said.has(line.text.trim());\n });\n if (changed.length === 0) return null;\n return refusal(\n \"series_customer_words_changed\",\n `This translation changed a customer's own words: ${changed.map((l) => `\"${l.text}\"`).join(\", \")} is how they said it, and translated it would be words they never said under their name.`,\n `Put ${changed.length === 1 ? \"that line\" : \"those lines\"} back in this ad's prompt.json exactly as the lead has ${changed.length === 1 ? \"it\" : \"them\"}: ${changed.map((l) => `\"${l.text}\"`).join(\", \")}. Translate only the advertiser's own lines.`,\n );\n}\n\n/**\n * A design edited on an ad of a series: it is made once, on the ad whose design the whole series\n * has (the last of `leads`), then carried down each series run, the farthest first. Pure.\n */\nexport function designChangedRefusal(lead: string, leads: readonly string[]): SeriesRefusal {\n const chain = leads.length > 0 ? leads : [lead];\n const design = chain[chain.length - 1] ?? lead;\n const runs = [...chain].reverse().map((l) => `baker canvas run --series ${l}`);\n return refusal(\n \"series_design_changed\",\n `This ad's design (its scene, colours, pictures or logo in prompt.json) was changed on the ad itself, but every ad of the series has the design of \"${design}\".`,\n `Make the change once, on ${design}: edit src/creatives/${design}/prompt.json (or baker canvas run --slug ${design} --fix \"<the change>\"), then ${runs.join(\", then \")}: every ad takes the new design, its own words kept. Only this ad's copy belongs in its own prompt.json.`,\n );\n}\n\n/**\n * Write the canvas of series ad `slug` from its lead's ready version. Null when `slug` is no ad\n * of a series; a refusal when its lead is not ready or its words are still the lead's (allowed\n * only when the ad is first made, before its words are written: `leadWords`).\n */\nexport async function writeSeriesMemberCanvas(\n root: string,\n slug: string,\n opts: { fetchRecord?: Fetch; leadWords?: boolean; takeLeadDesign?: boolean } = {},\n): Promise<\n | {\n lead: string;\n leadRunId: string;\n canvasPath: string;\n written: boolean;\n designFromLead: boolean;\n /** The ad was last made from an older version of its lead: this run is a new version of the ad. */\n newLeadVersion: boolean;\n }\n | SeriesRefusal\n | null\n> {\n const lead = await seriesLeadOf(root, slug);\n if (!lead) return null;\n const version = await leadVersion(root, lead, opts.fetchRecord);\n if (\"refused\" in version) return version;\n const dir = creativeDir(root, slug);\n const promptPath = path.join(dir, \"prompt.json\");\n let memberSpec = JSON.parse(await readFile(promptPath, \"utf8\").catch(() => \"null\"));\n const unchanged = opts.leadWords ? null : unchangedCopyRefusal(version.lead, memberSpec);\n if (unchanged) return unchanged;\n const language = await translatedInto(root, slug, lead);\n const rewritten = language ? changedCustomerWordsRefusal(version.lead, memberSpec) : null;\n if (rewritten) return rewritten;\n const file = canvasFile(root, slug);\n const before = await readFile(file, \"utf8\").catch(() => null);\n // The design is the lead's. A new version of the lead carries it to an ad untouched since; a\n // design edited on the ad itself is refused, unless the series run is asked to take the lead's back.\n const leadDesign = seriesDesignOf(version.spec);\n const ownDesign = seriesDesignOf(memberSpec);\n const previous = before\n ? (JSON.parse(before) as { metadata?: { series?: { design?: string; run_id?: string } } }).metadata?.series\n : undefined;\n const synced = previous?.design;\n let designFromLead = false;\n if (leadDesign !== null && ownDesign !== null && ownDesign !== leadDesign) {\n if (!opts.takeLeadDesign && ownDesign !== synced) {\n return designChangedRefusal(lead, await seriesLeadsAbove(root, slug));\n }\n memberSpec = withLeadDesign(memberSpec, version.spec);\n await writeFile(promptPath, `${JSON.stringify(memberSpec, null, 2)}\\n`, \"utf8\");\n designFromLead = true;\n }\n const canvas = seriesMemberAd(\n rebaseLeadPaths(version.canvas, creativeDir(root, lead), dir),\n { ...version.lead, ...(leadDesign !== null ? { design: leadDesign } : {}) },\n language ? { language } : {},\n );\n const text = `${JSON.stringify(canvas, null, 2)}\\n`;\n if (before !== text) await writeFile(file, text, \"utf8\");\n const madeFrom = (await readRenderState(path.join(root, \"canvas\"), slug)).seriesLeadRun;\n const newLeadVersion = madeFrom !== undefined && madeFrom !== version.lead.runId;\n return { lead, leadRunId: version.lead.runId, canvasPath: file, written: before !== text, designFromLead, newLeadVersion };\n}\n\n/**\n * What a run of an ad of a series, or of its lead, says to do next: a new version of the lead\n * reaches the series only through a series run, and a change to the design every ad shares is\n * made once, on the lead. Empty for an ad in no series. Pure.\n */\nexport function seriesRunHints(\n slug: string,\n series: { lead?: string | null; leads?: readonly string[]; members: readonly string[] },\n): string[] {\n // Nearest lead first: a translation of an angle ad takes its design from the ad at the top.\n const leads = series.leads?.length ? series.leads : series.lead ? [series.lead] : [];\n const root = leads[leads.length - 1];\n if (root) {\n const runs = [...leads].reverse().map((lead) => `baker canvas run --series ${lead}`);\n return [\n `This ad is one of the series led by ${leads[0]}: its picture is ${root}'s with its own words. A change to what every ad shares (the picture, colours, layout, logo) is made once, on ${root} (src/creatives/${root}/prompt.json, or baker canvas run --slug ${root} --fix \"<the change>\"), then ${runs.join(\", then \")}. Correct only this ad's own words or its own defect here.`,\n ];\n }\n if (series.members.length === 0) return [];\n return [\n `This ad leads a series of ${series.members.length + 1}: baker canvas run --series ${slug} makes ${series.members.join(\", \")} again from this version, each with its own words. Until then they show the lead's earlier version; an ad of the series run by itself (baker canvas run --slug ${series.members[0]}) is made from this version too, its design included.`,\n ];\n}\n"],"mappings":"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","names":["readFile","path","path","readFile","copy"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  creativesRunResponseSchema
3
- } from "./chunk-ASVKZQUU.js";
3
+ } from "./chunk-6HJAHLLA.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-GZVZ7CQI.js.map
23
+ //# sourceMappingURL=chunk-WRIC2RPQ.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  findWorkspaceRoot
3
- } from "./chunk-HIPDMQZ6.js";
3
+ } from "./chunk-DZSIUEGH.js";
4
4
 
5
5
  // src/commands/canvas/unbilled-spend.ts
6
6
  import { randomUUID } from "crypto";
@@ -81,4 +81,4 @@ export {
81
81
  sendBillingSpend,
82
82
  holdWhenSettled
83
83
  };
84
- //# sourceMappingURL=chunk-K3PN7TN5.js.map
84
+ //# sourceMappingURL=chunk-WTOYCUKH.js.map
@@ -16,10 +16,11 @@ import {
16
16
  renderedPromptOverLimit,
17
17
  spellNumber,
18
18
  subgraph,
19
+ sumCredits,
19
20
  topologicalLayers,
20
21
  validateCanvas,
21
22
  validateCanvasDeep
22
- } from "./chunk-RRUJQVWA.js";
23
+ } from "./chunk-RCQJHKK5.js";
23
24
  import {
24
25
  remoteCacheEnabledFromEnv
25
26
  } from "./chunk-W3B4BHQU.js";
@@ -94,7 +95,7 @@ import {
94
95
  persistOutputAssetUrls,
95
96
  sha256Hex,
96
97
  uploadAndIngest
97
- } from "./chunk-OTFHEHIU.js";
98
+ } from "./chunk-HRYOZUSK.js";
98
99
  import {
99
100
  fetchExternalBytes
100
101
  } from "./chunk-YBMVHGY3.js";
@@ -106,6 +107,9 @@ import {
106
107
  // src/engine/index.ts
107
108
  import path15 from "path";
108
109
 
110
+ // src/engine/engine/executor.ts
111
+ import { existsSync } from "fs";
112
+
109
113
  // src/engine/lib/concurrency.ts
110
114
  var DEFAULT_CONCURRENCY = 8;
111
115
  function resolveConcurrency(...candidates) {
@@ -298,7 +302,8 @@ var Engine = class {
298
302
  const runId = opts.run_id ?? `r_${ulid()}`;
299
303
  const writer = new OutputWriter({ outputsDir: this.outputsDir, runId });
300
304
  await writer.ensure();
301
- this.log(`[validate] ok (${canvas.nodes.length} nodes, est. ${validation.estimatedCredits} credits)`);
305
+ const estimate = opts.pinned ? sumCredits((validation.perNodeCredits ?? []).filter((n) => !opts.pinned?.[n.node_id])) : validation.estimatedCredits;
306
+ this.log(`[validate] ok (${canvas.nodes.length} nodes, est. ${estimate} credits)`);
302
307
  for (const w of validation.warnings ?? []) {
303
308
  this.log(`[warn ] ${w.code}${w.node_id ? ` (${w.node_id})` : ""}: ${w.message}`);
304
309
  }
@@ -449,6 +454,8 @@ var Engine = class {
449
454
  if (!node) throw new Error(`executor: missing node ${nodeId}`);
450
455
  const def = this.registry.get(node.type);
451
456
  if (!def) throw new Error(`executor: missing registry entry for type ${node.type}`);
457
+ const pinned = opts.pinned?.[node.id];
458
+ if (pinned) return this.replayPinned(node, pinned, outputs, writer, downloadOutputs);
452
459
  const regenerateToken = resolveRegenerateToken(node, opts.regenerate, runId);
453
460
  const prepared = await prepareForExecution(node, outputs, def, canvas.cache_salt, regenerateToken, this.assets);
454
461
  const policy = opts.cache_policy ?? "read_write";
@@ -507,6 +514,25 @@ var Engine = class {
507
514
  this.logOutputWarnings(node.id, hit.outputs);
508
515
  return { cached: true, credits: 0, durationMs: Date.now() - cacheT0 };
509
516
  }
517
+ /**
518
+ * An earlier run's outputs replayed as this node's result: free, and never rendered again. A
519
+ * local file that is gone falls back to the durable URL, downloaded when a local node needs it.
520
+ */
521
+ async replayPinned(node, pinned, outputs, writer, downloadOutputs) {
522
+ const t0 = Date.now();
523
+ const replayed = await mapObjectsAsync(pinned, (v) => {
524
+ if (!isAssetRef(v) || typeof v.url !== "string") return void 0;
525
+ if (typeof v.path === "string" && existsSync(v.path)) return Promise.resolve(v);
526
+ const { path: _gone, ...urlOnly } = v;
527
+ if (!downloadOutputs) return Promise.resolve(urlOnly);
528
+ const url = v.url;
529
+ return this.assets.ingestRemote({ kind: v.kind, url, sha256: v.sha256, mime: v.mime, metadata: v.metadata }).then((local) => ({ ...urlOnly, path: local.path }));
530
+ });
531
+ outputs[node.id] = replayed;
532
+ await this.materializeNodeOutputs(node.id, replayed, writer);
533
+ this.log(`[exec ] ${node.id.padEnd(20)} ${node.type.padEnd(20)} kept from the version before`);
534
+ return { cached: true, credits: 0, durationMs: Date.now() - t0 };
535
+ }
510
536
  /** Best-effort: a failed upload keeps the outputs local-only, never fails the node. */
511
537
  async persistOutputs(nodeId, outputs, ctx) {
512
538
  try {
@@ -5160,4 +5186,4 @@ export {
5160
5186
  defaultRegistry,
5161
5187
  createEngineFromEnv
5162
5188
  };
5163
- //# sourceMappingURL=chunk-HMEFD2CG.js.map
5189
+ //# sourceMappingURL=chunk-XDNEG2H6.js.map