@koda-sl/baker-cli 0.449.0-dev.bd86e5817 → 0.450.0-dev.b454c3dd2

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 (443) hide show
  1. package/README.md +11 -6
  2. package/dist/{account-AL2ZDSR7.js → account-XQXC7BR6.js} +5 -4
  3. package/dist/{account-AL2ZDSR7.js.map → account-XQXC7BR6.js.map} +1 -1
  4. package/dist/{accounts-HAFCLSR5.js → accounts-722UY53A.js} +4 -3
  5. package/dist/{accounts-HAFCLSR5.js.map → accounts-722UY53A.js.map} +1 -1
  6. package/dist/{accounts-O5MFO3QQ.js → accounts-E67BMK7T.js} +6 -5
  7. package/dist/{accounts-O5MFO3QQ.js.map → accounts-E67BMK7T.js.map} +1 -1
  8. package/dist/{actions-P35MEMGN.js → actions-6TQMSVWD.js} +18 -18
  9. package/dist/{add-5GAN6CVO.js → add-2BEGRHUX.js} +28 -5
  10. package/dist/add-2BEGRHUX.js.map +1 -0
  11. package/dist/{add-6DTC6X5G.js → add-LEMKEOPO.js} +3 -2
  12. package/dist/{add-6DTC6X5G.js.map → add-LEMKEOPO.js.map} +1 -1
  13. package/dist/{ads-73PGA4YC.js → ads-AGYCVD62.js} +4 -4
  14. package/dist/{advertisers-AE75CGVE.js → advertisers-2VQKAYKG.js} +4 -3
  15. package/dist/{advertisers-AE75CGVE.js.map → advertisers-2VQKAYKG.js.map} +1 -1
  16. package/dist/{analytics-FKCXIMPO.js → analytics-IFELDWLL.js} +24 -20
  17. package/dist/analytics-IFELDWLL.js.map +1 -0
  18. package/dist/{analytics-FPWQQGRM.js → analytics-OH5QEH7F.js} +4 -3
  19. package/dist/{analytics-FPWQQGRM.js.map → analytics-OH5QEH7F.js.map} +1 -1
  20. package/dist/{assign-ABN2AQ4J.js → assign-PTUJUCEL.js} +4 -3
  21. package/dist/{assign-ABN2AQ4J.js.map → assign-PTUJUCEL.js.map} +1 -1
  22. package/dist/{audience-size-GNBJY35X.js → audience-size-LRI6GJRT.js} +4 -3
  23. package/dist/{audience-size-GNBJY35X.js.map → audience-size-LRI6GJRT.js.map} +1 -1
  24. package/dist/{audit-3VS63TBW.js → audit-HWP7OPB7.js} +4 -3
  25. package/dist/{audit-3VS63TBW.js.map → audit-HWP7OPB7.js.map} +1 -1
  26. package/dist/{autocomplete-VS3XG3B7.js → autocomplete-J6DHU6MR.js} +4 -3
  27. package/dist/{autocomplete-VS3XG3B7.js.map → autocomplete-J6DHU6MR.js.map} +1 -1
  28. package/dist/{avatars-EKCKHCC3.js → avatars-467OSBD6.js} +4 -4
  29. package/dist/{bid-pricing-Q72B65AY.js → bid-pricing-EO5WLHGV.js} +4 -3
  30. package/dist/{bid-pricing-Q72B65AY.js.map → bid-pricing-EO5WLHGV.js.map} +1 -1
  31. package/dist/{brand-C6PFGGQN.js → brand-YRTEPGBK.js} +2 -2
  32. package/dist/{brief-YFJHQ5VQ.js → brief-OSFJ2V7F.js} +8 -7
  33. package/dist/{brief-YFJHQ5VQ.js.map → brief-OSFJ2V7F.js.map} +1 -1
  34. package/dist/{campaign-groups-KFFYQPU3.js → campaign-groups-PQ6KSQJR.js} +9 -8
  35. package/dist/{campaign-groups-KFFYQPU3.js.map → campaign-groups-PQ6KSQJR.js.map} +1 -1
  36. package/dist/{campaign-writes-FHOS5XZY.js → campaign-writes-5OVLUD5E.js} +4 -3
  37. package/dist/{campaign-writes-FHOS5XZY.js.map → campaign-writes-5OVLUD5E.js.map} +1 -1
  38. package/dist/{campaigns-2NHWBF5C.js → campaigns-6T3NSUT2.js} +12 -11
  39. package/dist/{campaigns-2NHWBF5C.js.map → campaigns-6T3NSUT2.js.map} +1 -1
  40. package/dist/{campaigns-KZYZTXDS.js → campaigns-OYMXDGWX.js} +5 -5
  41. package/dist/{canvas-UJNSHD3B.js → canvas-YQFG52IG.js} +13 -13
  42. package/dist/{capabilities-DJFTRJKS.js → capabilities-PXBKUN2G.js} +4 -3
  43. package/dist/{capabilities-DJFTRJKS.js.map → capabilities-PXBKUN2G.js.map} +1 -1
  44. package/dist/{catalog-ZQX6BGXS.js → catalog-XLXIM7IW.js} +4 -4
  45. package/dist/{chats-D2CSDX5Q.js → chats-UK47UE7C.js} +4 -3
  46. package/dist/{chats-D2CSDX5Q.js.map → chats-UK47UE7C.js.map} +1 -1
  47. package/dist/{chunk-7YCRFMXF.js → chunk-24EB7EDR.js} +3 -3
  48. package/dist/{chunk-5ZDLTE5T.js → chunk-2AOE2MZQ.js} +3 -3
  49. package/dist/{chunk-4SG4RW2P.js → chunk-2VPBIT65.js} +8 -8
  50. package/dist/chunk-4PDHHHUJ.js +537 -0
  51. package/dist/chunk-4PDHHHUJ.js.map +1 -0
  52. package/dist/{chunk-NPY4QUMQ.js → chunk-54C6YDGJ.js} +2 -2
  53. package/dist/{chunk-LZ73CZGP.js → chunk-5WCSKQ7Z.js} +6 -6
  54. package/dist/{chunk-3G3ZDLMI.js → chunk-5ZNTADVR.js} +2 -2
  55. package/dist/{chunk-AEOSAVVL.js → chunk-6F7DVPOS.js} +3 -3
  56. package/dist/{chunk-CJCVIEJ5.js → chunk-6NY2GPR4.js} +3 -3
  57. package/dist/{chunk-CXWFX2AM.js → chunk-6Y7ZBENQ.js} +6 -6
  58. package/dist/{chunk-M242LHLX.js → chunk-7CTMH5AK.js} +3 -3
  59. package/dist/{chunk-XF4JUKVF.js → chunk-7EPXVICM.js} +38 -5
  60. package/dist/chunk-7EPXVICM.js.map +1 -0
  61. package/dist/{chunk-T2PC5AVH.js → chunk-ASI4P6X2.js} +6 -6
  62. package/dist/chunk-ASI4P6X2.js.map +1 -0
  63. package/dist/{chunk-QD7ESRLN.js → chunk-C46GUI2S.js} +2 -2
  64. package/dist/{chunk-6N6WKAJM.js → chunk-CWYAELVG.js} +2 -2
  65. package/dist/{chunk-MXYBTMKB.js → chunk-DCRPXOJJ.js} +2 -2
  66. package/dist/{chunk-GKZ2WU75.js → chunk-FPOGPFAG.js} +3 -14
  67. package/dist/chunk-FPOGPFAG.js.map +1 -0
  68. package/dist/{chunk-JQJDXPCO.js → chunk-FUHN4MFY.js} +2 -2
  69. package/dist/{chunk-S77PZVYM.js → chunk-FYGR3I2A.js} +3 -3
  70. package/dist/{chunk-OZRUJVIQ.js → chunk-H3427GPU.js} +2 -2
  71. package/dist/{chunk-RPUSTYHL.js → chunk-HDLYPC6K.js} +5 -3
  72. package/dist/{chunk-RPUSTYHL.js.map → chunk-HDLYPC6K.js.map} +1 -1
  73. package/dist/{chunk-SSJK7FEV.js → chunk-HR6IWNKE.js} +1196 -1140
  74. package/dist/chunk-HR6IWNKE.js.map +1 -0
  75. package/dist/{chunk-YRQYA2LR.js → chunk-HROZYQ5H.js} +63 -5
  76. package/dist/chunk-HROZYQ5H.js.map +1 -0
  77. package/dist/{chunk-IR6D7K4H.js → chunk-I3ZR655O.js} +2 -2
  78. package/dist/{chunk-YK32GUBN.js → chunk-KMKEYI37.js} +3 -3
  79. package/dist/{chunk-W3ZHJJVT.js → chunk-KS2QY6MK.js} +4 -4
  80. package/dist/{chunk-WNRV4QH7.js → chunk-LYQJ4PZW.js} +5 -5
  81. package/dist/{chunk-B5SCU7MJ.js → chunk-MACCF4JZ.js} +16 -22
  82. package/dist/{chunk-B5SCU7MJ.js.map → chunk-MACCF4JZ.js.map} +1 -1
  83. package/dist/{chunk-CSYSX4D2.js → chunk-N4LAYIIN.js} +2 -2
  84. package/dist/{chunk-4AUMTNVB.js → chunk-NA63BH7V.js} +3 -3
  85. package/dist/{chunk-4BQXAE7Z.js → chunk-NDEE6G2J.js} +2 -2
  86. package/dist/{chunk-EDLZGTGN.js → chunk-NYIGXDUG.js} +1 -39
  87. package/dist/chunk-NYIGXDUG.js.map +1 -0
  88. package/dist/{chunk-DWHIOO7E.js → chunk-QE7W555R.js} +163 -12
  89. package/dist/chunk-QE7W555R.js.map +1 -0
  90. package/dist/{chunk-MELOSESI.js → chunk-R25YLW6H.js} +2 -2
  91. package/dist/{chunk-Y6O7EWYY.js → chunk-RL5CP7N6.js} +5 -5
  92. package/dist/{chunk-DGUNI37S.js → chunk-RX2DKU3W.js} +2 -2
  93. package/dist/{chunk-3HJLHTWP.js → chunk-SJYEY5MV.js} +12 -3
  94. package/dist/{chunk-3HJLHTWP.js.map → chunk-SJYEY5MV.js.map} +1 -1
  95. package/dist/{chunk-VTDMKARH.js → chunk-ULG4QRTV.js} +2 -2
  96. package/dist/{chunk-QRP3PXWN.js → chunk-VL43TNIP.js} +2 -2
  97. package/dist/{chunk-SHL7LOC3.js → chunk-VLMBTPXU.js} +3 -3
  98. package/dist/{chunk-KHRXPQID.js → chunk-VYQ3QJ3C.js} +2 -2
  99. package/dist/{chunk-A4LOJ2VD.js → chunk-WGUQHAJY.js} +2 -2
  100. package/dist/{chunk-ZEYEWPK6.js → chunk-WKQG6TER.js} +2 -2
  101. package/dist/{chunk-3IBYKLXR.js → chunk-ZDMTXQ2Q.js} +2 -2
  102. package/dist/{claim-FZ5OQLMU.js → claim-W6G6VEG5.js} +4 -3
  103. package/dist/{claim-FZ5OQLMU.js.map → claim-W6G6VEG5.js.map} +1 -1
  104. package/dist/cli.js +30 -30
  105. package/dist/{companies-DNI634RC.js → companies-TS6KBATJ.js} +4 -3
  106. package/dist/{companies-DNI634RC.js.map → companies-TS6KBATJ.js.map} +1 -1
  107. package/dist/{complete-2FZMGJV5.js → complete-LYR2HMQU.js} +4 -3
  108. package/dist/{complete-2FZMGJV5.js.map → complete-LYR2HMQU.js.map} +1 -1
  109. package/dist/{connect-QCOGEPP4.js → connect-FCXNVTXG.js} +13 -6
  110. package/dist/{conversation-6IOGV7B7.js → conversation-6ZJGPCXM.js} +4 -3
  111. package/dist/{conversation-6IOGV7B7.js.map → conversation-6ZJGPCXM.js.map} +1 -1
  112. package/dist/{conversions-4SRZPBBX.js → conversions-UHB55MMQ.js} +8 -7
  113. package/dist/{conversions-4SRZPBBX.js.map → conversions-UHB55MMQ.js.map} +1 -1
  114. package/dist/{create-BJNMO6HT.js → create-EX6OWLNM.js} +3 -2
  115. package/dist/{create-BJNMO6HT.js.map → create-EX6OWLNM.js.map} +1 -1
  116. package/dist/{create-RM7HV77Y.js → create-JCA7JPLP.js} +4 -3
  117. package/dist/{create-RM7HV77Y.js.map → create-JCA7JPLP.js.map} +1 -1
  118. package/dist/{create-FX4OJ2XF.js → create-JFSK4BOP.js} +4 -3
  119. package/dist/{create-FX4OJ2XF.js.map → create-JFSK4BOP.js.map} +1 -1
  120. package/dist/{create-VXM34ZWH.js → create-WU22YYU2.js} +4 -3
  121. package/dist/{create-VXM34ZWH.js.map → create-WU22YYU2.js.map} +1 -1
  122. package/dist/{creatives-NJF2U763.js → creatives-FXUQ5WSD.js} +10 -10
  123. package/dist/{creatives-JSWBFQ5R.js → creatives-KGXUOYPE.js} +9 -8
  124. package/dist/{creatives-JSWBFQ5R.js.map → creatives-KGXUOYPE.js.map} +1 -1
  125. package/dist/{credentials-C33K6XCJ.js → credentials-MJC7PGKR.js} +4 -3
  126. package/dist/{credentials-C33K6XCJ.js.map → credentials-MJC7PGKR.js.map} +1 -1
  127. package/dist/{critique-YDKPYZLD.js → critique-GS5VV5ZC.js} +7 -6
  128. package/dist/{critique-YDKPYZLD.js.map → critique-GS5VV5ZC.js.map} +1 -1
  129. package/dist/{critique-ZS4ON3SU.js → critique-TPHR27KH.js} +4 -3
  130. package/dist/{critique-ZS4ON3SU.js.map → critique-TPHR27KH.js.map} +1 -1
  131. package/dist/{crm-R5IXIFIV.js → crm-AVCM5D4G.js} +5 -4
  132. package/dist/{crm-R5IXIFIV.js.map → crm-AVCM5D4G.js.map} +1 -1
  133. package/dist/{crm-52ROSWH5.js → crm-VK44O3ED.js} +5 -4
  134. package/dist/{crm-52ROSWH5.js.map → crm-VK44O3ED.js.map} +1 -1
  135. package/dist/{customers-A36LOZOB.js → customers-XH2DMTFH.js} +6 -5
  136. package/dist/{delete-M2GDLPYN.js → delete-E3R3TKIL.js} +3 -2
  137. package/dist/{delete-M2GDLPYN.js.map → delete-E3R3TKIL.js.map} +1 -1
  138. package/dist/{delete-HGHXY24R.js → delete-KRH2YMSZ.js} +4 -3
  139. package/dist/{delete-HGHXY24R.js.map → delete-KRH2YMSZ.js.map} +1 -1
  140. package/dist/{delete-AIGE4Y4H.js → delete-WI5E3DR3.js} +4 -3
  141. package/dist/{delete-AIGE4Y4H.js.map → delete-WI5E3DR3.js.map} +1 -1
  142. package/dist/{demographics-NTWB2IMG.js → demographics-XV5PBA77.js} +4 -3
  143. package/dist/{demographics-NTWB2IMG.js.map → demographics-XV5PBA77.js.map} +1 -1
  144. package/dist/{discard-2WWQG6OU.js → discard-HTQUUHJR.js} +4 -3
  145. package/dist/{discard-2WWQG6OU.js.map → discard-HTQUUHJR.js.map} +1 -1
  146. package/dist/{domain-Y2LT6JLT.js → domain-RECGZXJB.js} +4 -3
  147. package/dist/{domain-Y2LT6JLT.js.map → domain-RECGZXJB.js.map} +1 -1
  148. package/dist/{draft-SLHAKJ2A.js → draft-2IBSJEKC.js} +4 -3
  149. package/dist/{draft-SLHAKJ2A.js.map → draft-2IBSJEKC.js.map} +1 -1
  150. package/dist/{draft-FJ7WHIXW.js → draft-PVTX6QT6.js} +4 -3
  151. package/dist/{draft-FJ7WHIXW.js.map → draft-PVTX6QT6.js.map} +1 -1
  152. package/dist/{draft-EJXNNJ3Y.js → draft-Q546QPPU.js} +5 -4
  153. package/dist/{draft-EJXNNJ3Y.js.map → draft-Q546QPPU.js.map} +1 -1
  154. package/dist/engine/index.js +3 -3
  155. package/dist/{facets-U7AQC4H6.js → facets-7EVPJMKS.js} +4 -3
  156. package/dist/{facets-U7AQC4H6.js.map → facets-7EVPJMKS.js.map} +1 -1
  157. package/dist/{feedback-PPQMOQ46.js → feedback-EIZKS4JU.js} +2 -2
  158. package/dist/{feedback-record-V66HWVRR.js → feedback-record-TKO54BOE.js} +9 -8
  159. package/dist/{feedback-record-V66HWVRR.js.map → feedback-record-TKO54BOE.js.map} +1 -1
  160. package/dist/{fetch-W7NULDEO.js → fetch-4BY6HYUM.js} +4 -3
  161. package/dist/{fetch-W7NULDEO.js.map → fetch-4BY6HYUM.js.map} +1 -1
  162. package/dist/{find-OTDIX6V4.js → find-FRRHAPWX.js} +4 -4
  163. package/dist/{flows-KABCBS3S.js → flows-KTFAML22.js} +21 -17
  164. package/dist/flows-KTFAML22.js.map +1 -0
  165. package/dist/{fonts-EMMX3KII.js → fonts-MXR3ZKDX.js} +6 -5
  166. package/dist/{forecast-GNODEIIC.js → forecast-3QTJYVND.js} +4 -3
  167. package/dist/{forecast-GNODEIIC.js.map → forecast-3QTJYVND.js.map} +1 -1
  168. package/dist/{funnel-AAX27NH4.js → funnel-I6XIAEHG.js} +11 -455
  169. package/dist/funnel-I6XIAEHG.js.map +1 -0
  170. package/dist/{ga4-UDQ2HA2J.js → ga4-DV2AXCSL.js} +1 -1
  171. package/dist/{get-QEYJRLV3.js → get-5PKNKJ5S.js} +7 -4
  172. package/dist/get-5PKNKJ5S.js.map +1 -0
  173. package/dist/{get-RTVUZM6E.js → get-72YPHJGV.js} +4 -3
  174. package/dist/{get-RTVUZM6E.js.map → get-72YPHJGV.js.map} +1 -1
  175. package/dist/{google-M7KEXVK5.js → google-6OGZX47I.js} +2 -2
  176. package/dist/{google-KTO3PLEU.js → google-QYYYSSXI.js} +5 -5
  177. package/dist/{google-ads-OK6IG3UV.js → google-ads-QGMQKZQD.js} +4 -3
  178. package/dist/{google-ads-OK6IG3UV.js.map → google-ads-QGMQKZQD.js.map} +1 -1
  179. package/dist/{gsc-P3QYGDV2.js → gsc-TAKOF7J5.js} +1 -1
  180. package/dist/{history-PQUJKK26.js → history-6AVQX2OQ.js} +4 -3
  181. package/dist/{history-PQUJKK26.js.map → history-6AVQX2OQ.js.map} +1 -1
  182. package/dist/{hubspot-Y77VLY6Y.js → hubspot-SVEMFK5S.js} +9 -8
  183. package/dist/{hubspot-Y77VLY6Y.js.map → hubspot-SVEMFK5S.js.map} +1 -1
  184. package/dist/{icon-I43F77FV.js → icon-L4RSS6PZ.js} +4 -4
  185. package/dist/{ideas-MIDU7YOA.js → ideas-NFOW3HKJ.js} +3 -2
  186. package/dist/{images-S254MS6O.js → images-2EFFUNNV.js} +9 -9
  187. package/dist/{ingest-YV2NLDBE.js → ingest-2EIKN4QC.js} +4 -3
  188. package/dist/{ingest-J4I3HKM3.js → ingest-2SO62RRI.js} +3 -2
  189. package/dist/{ingest-J4I3HKM3.js.map → ingest-2SO62RRI.js.map} +1 -1
  190. package/dist/{inspect-Q5NHBBHX.js → inspect-4OOS4APT.js} +4 -3
  191. package/dist/{inspect-Q5NHBBHX.js.map → inspect-4OOS4APT.js.map} +1 -1
  192. package/dist/{inspiration-P265QJ2H.js → inspiration-S3DU4CMQ.js} +1 -1
  193. package/dist/{keyword-metrics-PDY4ZXSP.js → keyword-metrics-SF4CSNZ2.js} +4 -3
  194. package/dist/{keyword-metrics-PDY4ZXSP.js.map → keyword-metrics-SF4CSNZ2.js.map} +1 -1
  195. package/dist/{keywords-for-site-GALSCV77.js → keywords-for-site-WDAOPNKC.js} +4 -3
  196. package/dist/{keywords-for-site-GALSCV77.js.map → keywords-for-site-WDAOPNKC.js.map} +1 -1
  197. package/dist/{landing-CJYGWCK4.js → landing-2ZB46LXH.js} +3 -3
  198. package/dist/{leads-PHKG6CP3.js → leads-A4W5KTWB.js} +4 -3
  199. package/dist/{leads-PHKG6CP3.js.map → leads-A4W5KTWB.js.map} +1 -1
  200. package/dist/{learn-FUQSY7DN.js → learn-IPULBCOD.js} +5 -4
  201. package/dist/{learn-FUQSY7DN.js.map → learn-IPULBCOD.js.map} +1 -1
  202. package/dist/{line-item-writes-E6MZPIZZ.js → line-item-writes-EMYSOJKM.js} +4 -3
  203. package/dist/{line-item-writes-E6MZPIZZ.js.map → line-item-writes-EMYSOJKM.js.map} +1 -1
  204. package/dist/{line-items-7ZGIKEF2.js → line-items-5NECXUZT.js} +5 -5
  205. package/dist/{link-QYAW6A2W.js → link-CI45HWFN.js} +4 -3
  206. package/dist/{link-QYAW6A2W.js.map → link-CI45HWFN.js.map} +1 -1
  207. package/dist/{linkedin-FFSDSGGS.js → linkedin-B7SYR75X.js} +27 -26
  208. package/dist/{linkedin-FFSDSGGS.js.map → linkedin-B7SYR75X.js.map} +1 -1
  209. package/dist/{list-NVQC5SNY.js → list-2BARXOT5.js} +3 -2
  210. package/dist/{list-NVQC5SNY.js.map → list-2BARXOT5.js.map} +1 -1
  211. package/dist/{list-SAV3LQHY.js → list-BIEVLEHS.js} +4 -3
  212. package/dist/{list-SAV3LQHY.js.map → list-BIEVLEHS.js.map} +1 -1
  213. package/dist/{list-5IC6KIKO.js → list-ZBT3EBVZ.js} +4 -3
  214. package/dist/{list-5IC6KIKO.js.map → list-ZBT3EBVZ.js.map} +1 -1
  215. package/dist/{log-XZPVOALD.js → log-C23OOAJZ.js} +4 -3
  216. package/dist/{log-XZPVOALD.js.map → log-C23OOAJZ.js.map} +1 -1
  217. package/dist/{logo-2IP663QO.js → logo-Q5D7PZY6.js} +3 -3
  218. package/dist/{lookup-XK45W2SH.js → lookup-ETWY47F7.js} +6 -5
  219. package/dist/{make-J3WBO62B.js → make-TPKKJXGL.js} +18 -17
  220. package/dist/{make-J3WBO62B.js.map → make-TPKKJXGL.js.map} +1 -1
  221. package/dist/{map-4J5WIWIG.js → map-SYZMPHLL.js} +5 -4
  222. package/dist/{map-4J5WIWIG.js.map → map-SYZMPHLL.js.map} +1 -1
  223. package/dist/{mcp-XXD7ZQCP.js → mcp-6FQBVJ6F.js} +3 -2
  224. package/dist/{mcp-XXD7ZQCP.js.map → mcp-6FQBVJ6F.js.map} +1 -1
  225. package/dist/{media-sources-O6ZRUA3N.js → media-sources-ZXHEEP6T.js} +2 -2
  226. package/dist/{members-D5ZYLS4Y.js → members-UDY4OOJW.js} +4 -3
  227. package/dist/{members-D5ZYLS4Y.js.map → members-UDY4OOJW.js.map} +1 -1
  228. package/dist/{normalize-PCNC6E2N.js → normalize-DAKHYS3V.js} +7 -3
  229. package/dist/{normalize-PCNC6E2N.js.map → normalize-DAKHYS3V.js.map} +1 -1
  230. package/dist/{options-MQ65VEVD.js → options-QL3ULED5.js} +7 -6
  231. package/dist/{options-MQ65VEVD.js.map → options-QL3ULED5.js.map} +1 -1
  232. package/dist/{performance-6QW2KEEQ.js → performance-UF5VTY2U.js} +5 -4
  233. package/dist/plan-FT632COT.js +51 -0
  234. package/dist/plan-FT632COT.js.map +1 -0
  235. package/dist/{promoted-tweet-writes-JPLHY3GM.js → promoted-tweet-writes-7HGESJ46.js} +4 -3
  236. package/dist/{promoted-tweet-writes-JPLHY3GM.js.map → promoted-tweet-writes-7HGESJ46.js.map} +1 -1
  237. package/dist/{promoted-tweets-SURKMHFI.js → promoted-tweets-LZKS5JIF.js} +3 -3
  238. package/dist/{publish-HCQ6MXLB.js → publish-NPD3SMZL.js} +4 -3
  239. package/dist/{publish-HCQ6MXLB.js.map → publish-NPD3SMZL.js.map} +1 -1
  240. package/dist/questionnaire-JNGYJTAY.js +37 -0
  241. package/dist/questionnaire-JNGYJTAY.js.map +1 -0
  242. package/dist/{reddit-GIP3ADMS.js → reddit-NU2N3LZD.js} +5 -4
  243. package/dist/{refresh-UXQSLCR3.js → refresh-EBVJ2C6L.js} +3 -2
  244. package/dist/{refresh-UXQSLCR3.js.map → refresh-EBVJ2C6L.js.map} +1 -1
  245. package/dist/{release-5KVLXNP6.js → release-V43YB2PY.js} +4 -3
  246. package/dist/{release-5KVLXNP6.js.map → release-V43YB2PY.js.map} +1 -1
  247. package/dist/{remove-6FIVKCJI.js → remove-QPSWLFI4.js} +3 -2
  248. package/dist/{remove-6FIVKCJI.js.map → remove-QPSWLFI4.js.map} +1 -1
  249. package/dist/{reopen-YM5LNOLB.js → reopen-GQ66NMWF.js} +4 -3
  250. package/dist/{reopen-YM5LNOLB.js.map → reopen-GQ66NMWF.js.map} +1 -1
  251. package/dist/{rerun-WYDRHIUJ.js → rerun-PZK275DY.js} +18 -17
  252. package/dist/{rerun-WYDRHIUJ.js.map → rerun-PZK275DY.js.map} +1 -1
  253. package/dist/{research-2BLEISBG.js → research-FMM6AWZC.js} +10 -10
  254. package/dist/{research-YOGE7GT2.js → research-GEOCUBXB.js} +3 -2
  255. package/dist/{research-YOGE7GT2.js.map → research-GEOCUBXB.js.map} +1 -1
  256. package/dist/{reset-C4UHQ3EU.js → reset-REXJ6AUK.js} +3 -2
  257. package/dist/{reset-C4UHQ3EU.js.map → reset-REXJ6AUK.js.map} +1 -1
  258. package/dist/{reset-OLVB6AE6.js → reset-Y72IVESB.js} +3 -2
  259. package/dist/{reset-OLVB6AE6.js.map → reset-Y72IVESB.js.map} +1 -1
  260. package/dist/{resolve-XYH2GDAE.js → resolve-OGX7C4TV.js} +4 -3
  261. package/dist/{resolve-XYH2GDAE.js.map → resolve-OGX7C4TV.js.map} +1 -1
  262. package/dist/{retry-7EELDEQP.js → retry-CD6JAQ3F.js} +3 -2
  263. package/dist/{retry-7EELDEQP.js.map → retry-CD6JAQ3F.js.map} +1 -1
  264. package/dist/{retry-726GKI6V.js → retry-TCUBBFR5.js} +3 -2
  265. package/dist/{retry-726GKI6V.js.map → retry-TCUBBFR5.js.map} +1 -1
  266. package/dist/{run-P4KR2MXC.js → run-A5ZDXTOI.js} +4 -3
  267. package/dist/{run-P4KR2MXC.js.map → run-A5ZDXTOI.js.map} +1 -1
  268. package/dist/{run-MODGUNGT.js → run-EUO34T2J.js} +18 -17
  269. package/dist/{scaffold-ad-5ZE7KE62.js → scaffold-ad-SW2HEWM3.js} +13 -12
  270. package/dist/{scaffold-ad-5ZE7KE62.js.map → scaffold-ad-SW2HEWM3.js.map} +1 -1
  271. package/dist/{scaffold-static-ad-HJY5HFDL.js → scaffold-static-ad-ECTJL54Y.js} +37 -36
  272. package/dist/scaffold-static-ad-ECTJL54Y.js.map +1 -0
  273. package/dist/{scaffold-video-P2PYPWG2.js → scaffold-video-EI7U7RBK.js} +12 -11
  274. package/dist/{scaffold-video-P2PYPWG2.js.map → scaffold-video-EI7U7RBK.js.map} +1 -1
  275. package/dist/{schedule-RDK4GEPI.js → schedule-S5YZJZ5U.js} +3 -2
  276. package/dist/{schedule-RDK4GEPI.js.map → schedule-S5YZJZ5U.js.map} +1 -1
  277. package/dist/{scheduled-agents-6U44QE76.js → scheduled-agents-N4LJRM4C.js} +11 -11
  278. package/dist/{schema-CHJDC7GQ.js → schema-R7JWWOF4.js} +8 -4
  279. package/dist/{schema-CHJDC7GQ.js.map → schema-R7JWWOF4.js.map} +1 -1
  280. package/dist/{search-PMJRU3C4.js → search-KHMQH3AT.js} +3 -2
  281. package/dist/{search-PMJRU3C4.js.map → search-KHMQH3AT.js.map} +1 -1
  282. package/dist/{select-AB2L4GAA.js → select-O2FN2JEQ.js} +9 -8
  283. package/dist/{select-AB2L4GAA.js.map → select-O2FN2JEQ.js.map} +1 -1
  284. package/dist/{sends-WGJVQUMF.js → sends-BQZM5PLS.js} +5 -4
  285. package/dist/{sends-WGJVQUMF.js.map → sends-BQZM5PLS.js.map} +1 -1
  286. package/dist/{set-prompt-DU2G2WTB.js → set-prompt-2HASHGWC.js} +9 -8
  287. package/dist/{set-prompt-DU2G2WTB.js.map → set-prompt-2HASHGWC.js.map} +1 -1
  288. package/dist/{setup-links-REPREN3C.js → setup-links-GYSE56GX.js} +4 -3
  289. package/dist/{setup-links-REPREN3C.js.map → setup-links-GYSE56GX.js.map} +1 -1
  290. package/dist/{site-WFSWIA3S.js → site-4SKM7RKG.js} +5 -4
  291. package/dist/{site-WFSWIA3S.js.map → site-4SKM7RKG.js.map} +1 -1
  292. package/dist/{sources-YBQ6KPFM.js → sources-FQ2UZTHL.js} +6 -6
  293. package/dist/{sources-AMI2AWKZ.js → sources-R2NKNC6J.js} +10 -9
  294. package/dist/{sources-AMI2AWKZ.js.map → sources-R2NKNC6J.js.map} +1 -1
  295. package/dist/{stale-6MJHVEG4.js → stale-W756ACKC.js} +8 -7
  296. package/dist/{stale-6MJHVEG4.js.map → stale-W756ACKC.js.map} +1 -1
  297. package/dist/{status-7F2KHFGA.js → status-SE2VZJJB.js} +4 -3
  298. package/dist/{status-7F2KHFGA.js.map → status-SE2VZJJB.js.map} +1 -1
  299. package/dist/{stock-2YCDN3N6.js → stock-KXJ26BY4.js} +5 -5
  300. package/dist/{studio-RA7QQH4O.js → studio-SYKOSNDB.js} +1 -1
  301. package/dist/{sync-GWTLKZTU.js → sync-LJGSODK3.js} +3 -2
  302. package/dist/{sync-GWTLKZTU.js.map → sync-LJGSODK3.js.map} +1 -1
  303. package/dist/{sync-definition-IPUFS5XS.js → sync-definition-QR2N233R.js} +12 -11
  304. package/dist/{tags-KFYLZLB3.js → tags-4BAVFH4S.js} +3 -2
  305. package/dist/{tags-KFYLZLB3.js.map → tags-4BAVFH4S.js.map} +1 -1
  306. package/dist/{tags-ABHSX6M5.js → tags-5SBMRC2A.js} +4 -3
  307. package/dist/{tags-ABHSX6M5.js.map → tags-5SBMRC2A.js.map} +1 -1
  308. package/dist/{tags-3WPW6PTV.js → tags-PYWFSBTR.js} +4 -4
  309. package/dist/{tags-6342FQEB.js → tags-QQU3OKMZ.js} +4 -3
  310. package/dist/{tags-6342FQEB.js.map → tags-QQU3OKMZ.js.map} +1 -1
  311. package/dist/{tags-FJIBBBRG.js → tags-YYLNF3PK.js} +4 -3
  312. package/dist/{tags-FJIBBBRG.js.map → tags-YYLNF3PK.js.map} +1 -1
  313. package/dist/{targeting-criteria-NR47AF5C.js → targeting-criteria-RJFLFICN.js} +3 -3
  314. package/dist/{targets-L56KOVQE.js → targets-S2MT2PNB.js} +4 -3
  315. package/dist/{targets-L56KOVQE.js.map → targets-S2MT2PNB.js.map} +1 -1
  316. package/dist/{templates-B6XGDYUF.js → templates-ZE5TOGRT.js} +4 -3
  317. package/dist/{templates-B6XGDYUF.js.map → templates-ZE5TOGRT.js.map} +1 -1
  318. package/dist/{testimonials-CVC4YIXO.js → testimonials-DII5DYLR.js} +6 -6
  319. package/dist/{top-companies-45X3DT7Z.js → top-companies-PGIAEHDF.js} +4 -3
  320. package/dist/{top-companies-45X3DT7Z.js.map → top-companies-PGIAEHDF.js.map} +1 -1
  321. package/dist/{translate-Z66FDB4K.js → translate-GXTS633J.js} +12 -11
  322. package/dist/{translate-Z66FDB4K.js.map → translate-GXTS633J.js.map} +1 -1
  323. package/dist/{triggers-22EMIVFD.js → triggers-2PTONXRU.js} +4 -3
  324. package/dist/{triggers-22EMIVFD.js.map → triggers-2PTONXRU.js.map} +1 -1
  325. package/dist/{unlink-65KUN6ID.js → unlink-XRMYJ6DB.js} +4 -3
  326. package/dist/{unlink-65KUN6ID.js.map → unlink-XRMYJ6DB.js.map} +1 -1
  327. package/dist/{unstage-2E3I5SWF.js → unstage-FY7A3YFF.js} +4 -3
  328. package/dist/{unstage-2E3I5SWF.js.map → unstage-FY7A3YFF.js.map} +1 -1
  329. package/dist/{unstage-4ZEULXEQ.js → unstage-RM2RLXKD.js} +5 -4
  330. package/dist/{unstage-4ZEULXEQ.js.map → unstage-RM2RLXKD.js.map} +1 -1
  331. package/dist/{update-KREBPGBH.js → update-E5SRBXQR.js} +4 -3
  332. package/dist/{update-KREBPGBH.js.map → update-E5SRBXQR.js.map} +1 -1
  333. package/dist/{update-D6DJC6T7.js → update-PJ67D2OG.js} +3 -2
  334. package/dist/{update-D6DJC6T7.js.map → update-PJ67D2OG.js.map} +1 -1
  335. package/dist/{update-2S7CSEAW.js → update-S4562V3O.js} +4 -3
  336. package/dist/{update-2S7CSEAW.js.map → update-S4562V3O.js.map} +1 -1
  337. package/dist/{update-7NCOTAQZ.js → update-V6YVEUI2.js} +4 -3
  338. package/dist/{update-7NCOTAQZ.js.map → update-V6YVEUI2.js.map} +1 -1
  339. package/dist/{upload-O6NHRPS7.js → upload-R6CQVLKF.js} +4 -3
  340. package/dist/{upload-O6NHRPS7.js.map → upload-R6CQVLKF.js.map} +1 -1
  341. package/dist/{url-options-GGXAL3J4.js → url-options-JOKU46F2.js} +4 -3
  342. package/dist/{url-options-GGXAL3J4.js.map → url-options-JOKU46F2.js.map} +1 -1
  343. package/dist/{url-params-3EFGVTZZ.js → url-params-7U2XMOWF.js} +4 -3
  344. package/dist/{url-params-3EFGVTZZ.js.map → url-params-7U2XMOWF.js.map} +1 -1
  345. package/dist/{validate-UMHHNTVU.js → validate-7YPOUKPB.js} +10 -9
  346. package/dist/{validate-UMHHNTVU.js.map → validate-7YPOUKPB.js.map} +1 -1
  347. package/dist/{videos-YSXYGTBM.js → videos-LICG6ACJ.js} +5 -5
  348. package/dist/{web-IGIGVEKS.js → web-BA2PGTWU.js} +4 -3
  349. package/dist/{web-IGIGVEKS.js.map → web-BA2PGTWU.js.map} +1 -1
  350. package/dist/{winning-ads-2WS7FI4E.js → winning-ads-C6S2C5VP.js} +2 -2
  351. package/dist/{write-commands-5C7FUOVN.js → write-commands-7SJ3BOW5.js} +5 -4
  352. package/dist/{write-commands-5C7FUOVN.js.map → write-commands-7SJ3BOW5.js.map} +1 -1
  353. package/dist/{x-BFSKFCZD.js → x-CZHRC6U7.js} +6 -6
  354. package/package.json +1 -1
  355. package/dist/add-5GAN6CVO.js.map +0 -1
  356. package/dist/analytics-FKCXIMPO.js.map +0 -1
  357. package/dist/chunk-DWHIOO7E.js.map +0 -1
  358. package/dist/chunk-EDLZGTGN.js.map +0 -1
  359. package/dist/chunk-GKZ2WU75.js.map +0 -1
  360. package/dist/chunk-SSJK7FEV.js.map +0 -1
  361. package/dist/chunk-T2PC5AVH.js.map +0 -1
  362. package/dist/chunk-XF4JUKVF.js.map +0 -1
  363. package/dist/chunk-YRQYA2LR.js.map +0 -1
  364. package/dist/flows-KABCBS3S.js.map +0 -1
  365. package/dist/funnel-AAX27NH4.js.map +0 -1
  366. package/dist/get-QEYJRLV3.js.map +0 -1
  367. package/dist/scaffold-static-ad-HJY5HFDL.js.map +0 -1
  368. /package/dist/{actions-P35MEMGN.js.map → actions-6TQMSVWD.js.map} +0 -0
  369. /package/dist/{ads-73PGA4YC.js.map → ads-AGYCVD62.js.map} +0 -0
  370. /package/dist/{avatars-EKCKHCC3.js.map → avatars-467OSBD6.js.map} +0 -0
  371. /package/dist/{brand-C6PFGGQN.js.map → brand-YRTEPGBK.js.map} +0 -0
  372. /package/dist/{campaigns-KZYZTXDS.js.map → campaigns-OYMXDGWX.js.map} +0 -0
  373. /package/dist/{canvas-UJNSHD3B.js.map → canvas-YQFG52IG.js.map} +0 -0
  374. /package/dist/{catalog-ZQX6BGXS.js.map → catalog-XLXIM7IW.js.map} +0 -0
  375. /package/dist/{chunk-7YCRFMXF.js.map → chunk-24EB7EDR.js.map} +0 -0
  376. /package/dist/{chunk-5ZDLTE5T.js.map → chunk-2AOE2MZQ.js.map} +0 -0
  377. /package/dist/{chunk-4SG4RW2P.js.map → chunk-2VPBIT65.js.map} +0 -0
  378. /package/dist/{chunk-NPY4QUMQ.js.map → chunk-54C6YDGJ.js.map} +0 -0
  379. /package/dist/{chunk-LZ73CZGP.js.map → chunk-5WCSKQ7Z.js.map} +0 -0
  380. /package/dist/{chunk-3G3ZDLMI.js.map → chunk-5ZNTADVR.js.map} +0 -0
  381. /package/dist/{chunk-AEOSAVVL.js.map → chunk-6F7DVPOS.js.map} +0 -0
  382. /package/dist/{chunk-CJCVIEJ5.js.map → chunk-6NY2GPR4.js.map} +0 -0
  383. /package/dist/{chunk-CXWFX2AM.js.map → chunk-6Y7ZBENQ.js.map} +0 -0
  384. /package/dist/{chunk-M242LHLX.js.map → chunk-7CTMH5AK.js.map} +0 -0
  385. /package/dist/{chunk-QD7ESRLN.js.map → chunk-C46GUI2S.js.map} +0 -0
  386. /package/dist/{chunk-6N6WKAJM.js.map → chunk-CWYAELVG.js.map} +0 -0
  387. /package/dist/{chunk-MXYBTMKB.js.map → chunk-DCRPXOJJ.js.map} +0 -0
  388. /package/dist/{chunk-JQJDXPCO.js.map → chunk-FUHN4MFY.js.map} +0 -0
  389. /package/dist/{chunk-S77PZVYM.js.map → chunk-FYGR3I2A.js.map} +0 -0
  390. /package/dist/{chunk-OZRUJVIQ.js.map → chunk-H3427GPU.js.map} +0 -0
  391. /package/dist/{chunk-IR6D7K4H.js.map → chunk-I3ZR655O.js.map} +0 -0
  392. /package/dist/{chunk-YK32GUBN.js.map → chunk-KMKEYI37.js.map} +0 -0
  393. /package/dist/{chunk-W3ZHJJVT.js.map → chunk-KS2QY6MK.js.map} +0 -0
  394. /package/dist/{chunk-WNRV4QH7.js.map → chunk-LYQJ4PZW.js.map} +0 -0
  395. /package/dist/{chunk-CSYSX4D2.js.map → chunk-N4LAYIIN.js.map} +0 -0
  396. /package/dist/{chunk-4AUMTNVB.js.map → chunk-NA63BH7V.js.map} +0 -0
  397. /package/dist/{chunk-4BQXAE7Z.js.map → chunk-NDEE6G2J.js.map} +0 -0
  398. /package/dist/{chunk-MELOSESI.js.map → chunk-R25YLW6H.js.map} +0 -0
  399. /package/dist/{chunk-Y6O7EWYY.js.map → chunk-RL5CP7N6.js.map} +0 -0
  400. /package/dist/{chunk-DGUNI37S.js.map → chunk-RX2DKU3W.js.map} +0 -0
  401. /package/dist/{chunk-VTDMKARH.js.map → chunk-ULG4QRTV.js.map} +0 -0
  402. /package/dist/{chunk-QRP3PXWN.js.map → chunk-VL43TNIP.js.map} +0 -0
  403. /package/dist/{chunk-SHL7LOC3.js.map → chunk-VLMBTPXU.js.map} +0 -0
  404. /package/dist/{chunk-KHRXPQID.js.map → chunk-VYQ3QJ3C.js.map} +0 -0
  405. /package/dist/{chunk-A4LOJ2VD.js.map → chunk-WGUQHAJY.js.map} +0 -0
  406. /package/dist/{chunk-ZEYEWPK6.js.map → chunk-WKQG6TER.js.map} +0 -0
  407. /package/dist/{chunk-3IBYKLXR.js.map → chunk-ZDMTXQ2Q.js.map} +0 -0
  408. /package/dist/{connect-QCOGEPP4.js.map → connect-FCXNVTXG.js.map} +0 -0
  409. /package/dist/{creatives-NJF2U763.js.map → creatives-FXUQ5WSD.js.map} +0 -0
  410. /package/dist/{customers-A36LOZOB.js.map → customers-XH2DMTFH.js.map} +0 -0
  411. /package/dist/{feedback-PPQMOQ46.js.map → feedback-EIZKS4JU.js.map} +0 -0
  412. /package/dist/{find-OTDIX6V4.js.map → find-FRRHAPWX.js.map} +0 -0
  413. /package/dist/{fonts-EMMX3KII.js.map → fonts-MXR3ZKDX.js.map} +0 -0
  414. /package/dist/{ga4-UDQ2HA2J.js.map → ga4-DV2AXCSL.js.map} +0 -0
  415. /package/dist/{google-M7KEXVK5.js.map → google-6OGZX47I.js.map} +0 -0
  416. /package/dist/{google-KTO3PLEU.js.map → google-QYYYSSXI.js.map} +0 -0
  417. /package/dist/{gsc-P3QYGDV2.js.map → gsc-TAKOF7J5.js.map} +0 -0
  418. /package/dist/{icon-I43F77FV.js.map → icon-L4RSS6PZ.js.map} +0 -0
  419. /package/dist/{ideas-MIDU7YOA.js.map → ideas-NFOW3HKJ.js.map} +0 -0
  420. /package/dist/{images-S254MS6O.js.map → images-2EFFUNNV.js.map} +0 -0
  421. /package/dist/{ingest-YV2NLDBE.js.map → ingest-2EIKN4QC.js.map} +0 -0
  422. /package/dist/{inspiration-P265QJ2H.js.map → inspiration-S3DU4CMQ.js.map} +0 -0
  423. /package/dist/{landing-CJYGWCK4.js.map → landing-2ZB46LXH.js.map} +0 -0
  424. /package/dist/{line-items-7ZGIKEF2.js.map → line-items-5NECXUZT.js.map} +0 -0
  425. /package/dist/{logo-2IP663QO.js.map → logo-Q5D7PZY6.js.map} +0 -0
  426. /package/dist/{lookup-XK45W2SH.js.map → lookup-ETWY47F7.js.map} +0 -0
  427. /package/dist/{media-sources-O6ZRUA3N.js.map → media-sources-ZXHEEP6T.js.map} +0 -0
  428. /package/dist/{performance-6QW2KEEQ.js.map → performance-UF5VTY2U.js.map} +0 -0
  429. /package/dist/{promoted-tweets-SURKMHFI.js.map → promoted-tweets-LZKS5JIF.js.map} +0 -0
  430. /package/dist/{reddit-GIP3ADMS.js.map → reddit-NU2N3LZD.js.map} +0 -0
  431. /package/dist/{research-2BLEISBG.js.map → research-FMM6AWZC.js.map} +0 -0
  432. /package/dist/{run-MODGUNGT.js.map → run-EUO34T2J.js.map} +0 -0
  433. /package/dist/{scheduled-agents-6U44QE76.js.map → scheduled-agents-N4LJRM4C.js.map} +0 -0
  434. /package/dist/{sources-YBQ6KPFM.js.map → sources-FQ2UZTHL.js.map} +0 -0
  435. /package/dist/{stock-2YCDN3N6.js.map → stock-KXJ26BY4.js.map} +0 -0
  436. /package/dist/{studio-RA7QQH4O.js.map → studio-SYKOSNDB.js.map} +0 -0
  437. /package/dist/{sync-definition-IPUFS5XS.js.map → sync-definition-QR2N233R.js.map} +0 -0
  438. /package/dist/{tags-3WPW6PTV.js.map → tags-PYWFSBTR.js.map} +0 -0
  439. /package/dist/{targeting-criteria-NR47AF5C.js.map → targeting-criteria-RJFLFICN.js.map} +0 -0
  440. /package/dist/{testimonials-CVC4YIXO.js.map → testimonials-DII5DYLR.js.map} +0 -0
  441. /package/dist/{videos-YSXYGTBM.js.map → videos-LICG6ACJ.js.map} +0 -0
  442. /package/dist/{winning-ads-2WS7FI4E.js.map → winning-ads-C6S2C5VP.js.map} +0 -0
  443. /package/dist/{x-BFSKFCZD.js.map → x-CZHRC6U7.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/actions/list.ts"],"sourcesContent":["import type { ActionsListRequest, ActionsListResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { Lexer, type Token } from \"marked\";\nimport { apiPost } from \"../../client.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { ACTIONS_LIST_DEFAULT_LIMIT, buildListHints, failApi } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.list\",\n description:\n 'List actions for the current company. Compact by default: a bucketed Task is its id and name (plus its blockers, holder or staged change); a flat row (--search, --bucketed=false) adds status, priority, tags and a one-line `summary` of its description. Checking whether a Task already exists? --search \"<words>\" returns the matches with their summaries. --full prints whole descriptions (or `baker actions get <id>` for one Task). Default: pre-bucketed (claimable/myClaims/blocked/claimedByOthers/completed/discarded), each bucket ordered do-first (blockers before blocked, then highest-leverage). The bucketed view reads the whole open backlog, so nothing pending is ever hidden from it. Set --bucketed=false for a flat list filterable by --status, orderable by --sort, and windowed by --limit. Looking for one Task by name? --search \"conversion goal\" --output md returns only the matching Tasks instead of the whole backlog.',\n args: {\n search: {\n type: \"string\",\n description:\n 'Find Tasks by words in their name, description or tags, searched on the server (e.g. --search \"conversion goal\"). Returns a flat list, best match first; by default it covers pending, in-progress and completed Tasks. Add --status to search one status instead, including discarded Tasks (--status discarded). Implies --bucketed=false.',\n required: false,\n },\n bucketed: {\n type: \"boolean\",\n description: \"Pre-bucket the results based on the current chat (default: true)\",\n required: false,\n default: true,\n },\n status: {\n type: \"string\",\n description: \"Filter by status (only with --bucketed=false): pending|in_progress|completed|discarded\",\n required: false,\n },\n sort: {\n type: \"string\",\n description:\n \"Order a flat list (only with --bucketed=false): priority (do-first: blockers before blocked, then highest-leverage) | recent. Default: priority.\",\n required: false,\n },\n limit: {\n type: \"string\",\n description: `How many Tasks a flat list reads, newest first (only with --bucketed=false). Default: ${ACTIONS_LIST_DEFAULT_LIMIT}. When the read comes back full, hints[] says so — raise --limit to reach older Tasks.`,\n required: false,\n },\n full: {\n type: \"boolean\",\n description:\n \"Print every Task's whole description and full record instead of the compact row. Large on a real backlog — prefer --search, or `baker actions get <id>` for one Task.\",\n required: false,\n default: false,\n },\n output: { type: \"string\", description: \"Output format: json|md. Default: json\", required: false },\n },\n});\n\nexport const listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List actions, one short row per Task (id and name; --search rows add a one-line summary). Default: bucketed view (claimable, myClaims, blocked, claimedByOthers). Use --bucketed=false for raw filter by --status, --search <text> to find Tasks by name, --full for whole descriptions.\",\n },\n args: {\n search: { type: \"string\", description: \"Find Tasks by words in name/description/tags\", required: false },\n bucketed: { type: \"boolean\", description: \"Pre-bucket by chat\", required: false, default: true },\n status: { type: \"string\", description: \"Status filter (raw mode)\", required: false },\n sort: { type: \"string\", description: \"Order (raw mode): priority|recent\", required: false },\n limit: { type: \"string\", description: \"How many Tasks to read (raw mode)\", required: false },\n full: {\n type: \"boolean\",\n description: \"Whole descriptions and full records\",\n required: false,\n default: false,\n },\n output: { type: \"string\", description: \"Output format: json|md\", required: false },\n },\n run: async ({ args }) => {\n try {\n const body = buildListRequest(args, getEnv().BAKER_CHAT_ID);\n const response = await apiPost<ActionsListResponse>(\"/api/actions/list\", body);\n // Only the flat list is windowed — the bucketed view reads the whole open\n // backlog, so there is nothing there to warn about.\n const hints =\n body.bucketed === false && body.limit !== undefined && response.ok && Array.isArray(response.data)\n ? buildListHints({ returned: response.data.length, limit: body.limit })\n : [];\n if (args.output === \"md\" && response.ok) {\n process.stdout.write(renderMarkdown(response.data, hints, { full: args.full === true }));\n return;\n }\n const compact = !args.full && response.ok;\n const shaped = compact ? { ...response, data: compactListData(response.data) } : response;\n const envelope = hints.length > 0 ? { ...shaped, hints } : shaped;\n if (compact) {\n // Unindented: on a real backlog the indentation alone outweighed the Tasks.\n process.stdout.write(`${JSON.stringify(envelope)}\\n`);\n return;\n }\n writeJson(envelope);\n } catch (err) {\n failApi(err);\n }\n },\n});\n\ntype ListArgs = {\n bucketed?: boolean;\n status?: string;\n sort?: string;\n limit?: string;\n search?: string;\n};\n\n// `status` goes out as typed so the server refuses a misspelt one instead of the\n// CLI dropping it and returning every status.\ntype ListRequest = Omit<ActionsListRequest, \"status\"> & { status?: string };\n\n/**\n * The request `actions list` sends. A search is answered by the server's\n * full-text index over each Task's name, description and tags, which only the\n * flat list reads — so `--search` implies `--bucketed=false`.\n */\nexport function buildListRequest(args: ListArgs, chatId: string | undefined): ListRequest {\n const q = args.search?.trim();\n if (args.bucketed !== false && !q) {\n return chatId ? { bucketed: true, chatId } : { bucketed: true };\n }\n const parsedLimit = args.limit === undefined ? Number.NaN : Number.parseInt(String(args.limit), 10);\n const body: ListRequest = {\n bucketed: false,\n // Default to do-first ordering so the flat list matches its documented\n // contract; only \"recent\" opts out. A search keeps relevance order.\n sort: args.sort === \"recent\" ? \"recent\" : \"priority\",\n limit: Number.isFinite(parsedLimit) && parsedLimit > 0 ? parsedLimit : ACTIONS_LIST_DEFAULT_LIMIT,\n };\n if (q) {\n body.q = q;\n }\n if (args.status) {\n body.status = args.status;\n }\n return body;\n}\n\n/** How long a Task's summary line may run before it is cut. */\nconst SUMMARY_MAX_CHARS = 100;\n\n/** The text a reader sees in inline markdown: emphasis, code and link markup dropped, images skipped. */\nfunction plainText(tokens: Token[]): string {\n return tokens\n .map((token) => {\n if (token.type === \"image\" || token.type === \"html\") {\n return \"\";\n }\n if (token.type === \"br\") {\n return \" \";\n }\n if (\"tokens\" in token && Array.isArray(token.tokens)) {\n return plainText(token.tokens);\n }\n return \"text\" in token && typeof token.text === \"string\" ? token.text : \"\";\n })\n .join(\"\");\n}\n\n/** The first run of prose in a block sequence — past headings, code blocks, rules and tables. */\nfunction firstProse(tokens: Token[]): string {\n for (const token of tokens) {\n let text = \"\";\n if (token.type === \"paragraph\" || token.type === \"text\") {\n text = plainText(Array.isArray(token.tokens) ? token.tokens : [token]);\n } else if (token.type === \"list\") {\n text = firstProse(token.items.flatMap((item: { tokens: Token[] }) => item.tokens));\n } else if (token.type === \"blockquote\") {\n text = firstProse(token.tokens ?? []);\n }\n const line = text.replace(/\\s+/g, \" \").trim();\n if (line) {\n return line;\n }\n }\n return \"\";\n}\n\n/**\n * A Task's description reduced to its first line of prose — enough to tell two\n * Tasks with similar names apart without reading either in full.\n *\n * Descriptions are markdown written to be read in a panel, so the first block is\n * often a `## What changes` heading or a code fence; the markdown is parsed, and\n * the summary is the first paragraph or list item as a reader would see it.\n */\nexport function summarizeDescription(description: string): string {\n const line = firstProse(Lexer.lex(description));\n if (line.length <= SUMMARY_MAX_CHARS) {\n return line;\n }\n const cut = line.slice(0, SUMMARY_MAX_CHARS - 1);\n const lastSpace = cut.lastIndexOf(\" \");\n return `${(lastSpace > SUMMARY_MAX_CHARS / 2 ? cut.slice(0, lastSpace) : cut).trimEnd()}…`;\n}\n\n/**\n * A bucket entry (published or staged-create) as its id and name, plus what only\n * this row says (its blockers, the chat holding it, its staged change). The\n * status and hint are the same for every row of a bucket, which already says them.\n */\nfunction compactBucketEntry(entry: Record<string, unknown>): Record<string, unknown> {\n const { description: _description, status: _status, hint: _hint, ...rest } = entry;\n return rest;\n}\n\n/**\n * A flat-list row (`ActionWithMeta`, the Task nested under `action`) as the same\n * short row a bucket entry is, plus the priority and tags only this shape carries.\n * The nested doc also holds `searchText`, a second copy of the whole description.\n */\nfunction compactFlatRow(entry: Record<string, unknown>): Record<string, unknown> {\n const nested = entry.action;\n const doc = nested && typeof nested === \"object\" ? (nested as Record<string, unknown>) : entry;\n const { id, name, status, hint } = toRow(entry);\n const assignee = entry.assignee && typeof entry.assignee === \"object\" ? (entry.assignee as { name?: unknown }) : null;\n return {\n id,\n name,\n status,\n ...(typeof doc.priority === \"string\" ? { priority: doc.priority } : {}),\n ...(Array.isArray(doc.tags) && doc.tags.length > 0 ? { tags: doc.tags } : {}),\n summary: summarizeDescription(typeof doc.description === \"string\" ? doc.description : \"\"),\n ...(hint ? { hint } : {}),\n ...(typeof assignee?.name === \"string\" ? { assignee: assignee.name } : {}),\n };\n}\n\n/**\n * The default `actions list` payload: every Task as a short row, never its full\n * description. A backlog's descriptions run to a kilobyte each, so printing them\n * all turned a \"does this Task already exist?\" check into ~110 KB of output.\n * `--full` prints the server's payload untouched.\n */\nexport function compactListData(data: unknown): unknown {\n if (Array.isArray(data)) {\n return data.map((entry) => compactFlatRow(entry as Record<string, unknown>));\n }\n if (!data || typeof data !== \"object\") {\n return data;\n }\n return Object.fromEntries(\n Object.entries(data).map(([bucket, entries]) => [\n bucket,\n Array.isArray(entries) ? entries.map((entry) => compactBucketEntry(entry as Record<string, unknown>)) : entries,\n ]),\n );\n}\n\n/**\n * Flatten either payload shape to the same row.\n *\n * The two responses do not agree, and the flat one is the odd shape: a bucket\n * entry carries `id`/`name`/`status`/`hint` at the top level, while the flat\n * list returns `ActionWithMeta` — the identity lives under `entry.action` as\n * `_id`/`name`/`status`, with the blocker counts as siblings. Reading the\n * bucket fields off both is how every flat row rendered as \"- `?` (unnamed)\".\n */\nfunction toRow(entry: Record<string, unknown>): {\n id: string;\n name: string;\n status: string;\n hint: string;\n} {\n const nested = entry.action;\n const doc = nested && typeof nested === \"object\" ? (nested as Record<string, unknown>) : entry;\n\n const id = doc.id ?? doc._id ?? entry.id ?? entry._id ?? entry.tempId ?? \"?\";\n const status = doc.status ?? entry.status ?? entry.draftStatus ?? \"\";\n\n // `hint` is a bucket-entry field; the flat shape has none, so say the thing it\n // does carry instead of dropping the row's only context.\n let hint = typeof entry.hint === \"string\" ? entry.hint.trim() : \"\";\n if (!hint && entry.isBlocked === true) {\n const open = typeof entry.openBlockerCount === \"number\" ? entry.openBlockerCount : null;\n hint = open === null ? \"blocked\" : `blocked by ${open} open Task${open === 1 ? \"\" : \"s\"}`;\n }\n\n return {\n id: String(id),\n name: String(doc.name ?? entry.name ?? \"(unnamed)\"),\n status: String(status),\n hint,\n };\n}\n\n/** One Task as a line, plus its summary (or with `full`, its whole description) and hint indented under it. */\nfunction renderEntry(entry: Record<string, unknown>, full: boolean): string[] {\n const row = toRow(entry);\n const suffix = row.status ? ` [${row.status}]` : \"\";\n const lines = [`- \\`${row.id}\\` ${row.name}${suffix}`];\n // The description lives under `action` on flat rows; a compact row already\n // carries its one-line `summary`.\n const nested = entry.action;\n const doc = nested && typeof nested === \"object\" ? (nested as Record<string, unknown>) : entry;\n const description = typeof doc.description === \"string\" ? doc.description : \"\";\n const text =\n typeof entry.summary === \"string\" ? entry.summary : full ? description : summarizeDescription(description);\n if (typeof text === \"string\" && text.trim()) {\n lines.push(\n ...text\n .trim()\n .split(\"\\n\")\n .map((line) => (line ? ` ${line}` : \"\")),\n );\n }\n if (row.hint) {\n lines.push(` ${row.hint}`);\n }\n return lines;\n}\n\n/** The hint every entry of a bucket shares, or \"\" when they differ (myClaims varies by staged change). */\nfunction sharedHint(entries: Record<string, unknown>[]): string {\n const first = entries[0]?.hint;\n return typeof first === \"string\" && entries.every((entry) => entry.hint === first) ? first : \"\";\n}\n\n/**\n * A bucket entry as its id and name, plus only what this row says that its\n * bucket does not: its staged change, its own hint, its open blockers, the chat\n * holding it. The bucket's shared hint is printed once, on its heading.\n */\nfunction renderBucketRow(entry: Record<string, unknown>, shared: string): string[] {\n const { id, name } = toRow(entry);\n const suffix = typeof entry.draftStatus === \"string\" ? ` [${entry.draftStatus}]` : \"\";\n const lines = [`- \\`${id}\\` ${name}${suffix}`];\n if (typeof entry.hint === \"string\" && entry.hint && entry.hint !== shared) {\n lines.push(` ${entry.hint}`);\n }\n if (Array.isArray(entry.blockedBy) && entry.blockedBy.length > 0) {\n const blockers = (entry.blockedBy as { id: string; name: string }[]).map((b) => `\\`${b.id}\\` ${b.name}`);\n lines.push(` blocked by: ${blockers.join(\", \")}`);\n }\n const holder = entry.claimedByChat as { title?: unknown } | undefined;\n if (typeof holder?.title === \"string\") {\n lines.push(` held by chat: ${holder.title}`);\n }\n return lines;\n}\n\n/** The bucketed payload: a dict of arrays, keyed by bucket name. */\nfunction renderBuckets(data: Record<string, unknown>, full: boolean): string[] {\n const lines: string[] = [];\n for (const [bucket, entries] of Object.entries(data)) {\n if (!Array.isArray(entries) || entries.length === 0) {\n continue;\n }\n const rows = entries as Record<string, unknown>[];\n if (full) {\n lines.push(`## ${bucket} (${rows.length})`, ...rows.flatMap((entry) => renderEntry(entry, true)));\n } else {\n const shared = sharedHint(rows);\n lines.push(`## ${bucket} (${rows.length})${shared ? `: ${shared}` : \"\"}`);\n lines.push(...rows.flatMap((entry) => renderBucketRow(entry, shared)));\n }\n lines.push(\"\");\n }\n return lines;\n}\n\n/** Compact, id-first Markdown of the server's payload (whole descriptions with\n * `full`). The bucketed payload is a dict of arrays and the flat one is an\n * array, and neither shape is guessable from the outside — an agent handed\n * only JSON here wrote three throwaway walkers to discover it. */\nexport function renderMarkdown(data: unknown, hints: string[], { full = false }: { full?: boolean } = {}): string {\n let lines: string[];\n if (Array.isArray(data)) {\n lines = data.flatMap((entry) => renderEntry(entry as Record<string, unknown>, full));\n } else if (data && typeof data === \"object\") {\n lines = renderBuckets(data as Record<string, unknown>, full);\n } else {\n lines = [];\n }\n\n if (lines.length === 0) {\n return \"No Tasks matched.\\n\";\n }\n\n for (const hint of hints) {\n lines.push(`> ${hint}`);\n }\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAC9B,SAAS,aAAyB;AAOlC,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa,yFAAyF,0BAA0B;AAAA,MAChI,UAAU;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,QAAQ,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,MAAM;AAAA,EAClG;AACF,CAAC;AAEM,IAAM,cAAc,cAAc;AAAA,EACvC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ,EAAE,MAAM,UAAU,aAAa,gDAAgD,UAAU,MAAM;AAAA,IACvG,UAAU,EAAE,MAAM,WAAW,aAAa,sBAAsB,UAAU,OAAO,SAAS,KAAK;AAAA,IAC/F,QAAQ,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,IACnF,MAAM,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IAC1F,OAAO,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IAC3F,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,QAAQ,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,MAAM;AAAA,EACnF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,OAAO,iBAAiB,MAAM,OAAO,EAAE,aAAa;AAC1D,YAAM,WAAW,MAAM,QAA6B,qBAAqB,IAAI;AAG7E,YAAM,QACJ,KAAK,aAAa,SAAS,KAAK,UAAU,UAAa,SAAS,MAAM,MAAM,QAAQ,SAAS,IAAI,IAC7F,eAAe,EAAE,UAAU,SAAS,KAAK,QAAQ,OAAO,KAAK,MAAM,CAAC,IACpE,CAAC;AACP,UAAI,KAAK,WAAW,QAAQ,SAAS,IAAI;AACvC,gBAAQ,OAAO,MAAM,eAAe,SAAS,MAAM,OAAO,EAAE,MAAM,KAAK,SAAS,KAAK,CAAC,CAAC;AACvF;AAAA,MACF;AACA,YAAM,UAAU,CAAC,KAAK,QAAQ,SAAS;AACvC,YAAM,SAAS,UAAU,EAAE,GAAG,UAAU,MAAM,gBAAgB,SAAS,IAAI,EAAE,IAAI;AACjF,YAAM,WAAW,MAAM,SAAS,IAAI,EAAE,GAAG,QAAQ,MAAM,IAAI;AAC3D,UAAI,SAAS;AAEX,gBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,CAAC;AAAA,CAAI;AACpD;AAAA,MACF;AACA,gBAAU,QAAQ;AAAA,IACpB,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;AAmBM,SAAS,iBAAiB,MAAgB,QAAyC;AACxF,QAAM,IAAI,KAAK,QAAQ,KAAK;AAC5B,MAAI,KAAK,aAAa,SAAS,CAAC,GAAG;AACjC,WAAO,SAAS,EAAE,UAAU,MAAM,OAAO,IAAI,EAAE,UAAU,KAAK;AAAA,EAChE;AACA,QAAM,cAAc,KAAK,UAAU,SAAY,OAAO,MAAM,OAAO,SAAS,OAAO,KAAK,KAAK,GAAG,EAAE;AAClG,QAAM,OAAoB;AAAA,IACxB,UAAU;AAAA;AAAA;AAAA,IAGV,MAAM,KAAK,SAAS,WAAW,WAAW;AAAA,IAC1C,OAAO,OAAO,SAAS,WAAW,KAAK,cAAc,IAAI,cAAc;AAAA,EACzE;AACA,MAAI,GAAG;AACL,SAAK,IAAI;AAAA,EACX;AACA,MAAI,KAAK,QAAQ;AACf,SAAK,SAAS,KAAK;AAAA,EACrB;AACA,SAAO;AACT;AAGA,IAAM,oBAAoB;AAG1B,SAAS,UAAU,QAAyB;AAC1C,SAAO,OACJ,IAAI,CAAC,UAAU;AACd,QAAI,MAAM,SAAS,WAAW,MAAM,SAAS,QAAQ;AACnD,aAAO;AAAA,IACT;AACA,QAAI,MAAM,SAAS,MAAM;AACvB,aAAO;AAAA,IACT;AACA,QAAI,YAAY,SAAS,MAAM,QAAQ,MAAM,MAAM,GAAG;AACpD,aAAO,UAAU,MAAM,MAAM;AAAA,IAC/B;AACA,WAAO,UAAU,SAAS,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAAA,EAC1E,CAAC,EACA,KAAK,EAAE;AACZ;AAGA,SAAS,WAAW,QAAyB;AAC3C,aAAW,SAAS,QAAQ;AAC1B,QAAI,OAAO;AACX,QAAI,MAAM,SAAS,eAAe,MAAM,SAAS,QAAQ;AACvD,aAAO,UAAU,MAAM,QAAQ,MAAM,MAAM,IAAI,MAAM,SAAS,CAAC,KAAK,CAAC;AAAA,IACvE,WAAW,MAAM,SAAS,QAAQ;AAChC,aAAO,WAAW,MAAM,MAAM,QAAQ,CAAC,SAA8B,KAAK,MAAM,CAAC;AAAA,IACnF,WAAW,MAAM,SAAS,cAAc;AACtC,aAAO,WAAW,MAAM,UAAU,CAAC,CAAC;AAAA,IACtC;AACA,UAAM,OAAO,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC5C,QAAI,MAAM;AACR,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAUO,SAAS,qBAAqB,aAA6B;AAChE,QAAM,OAAO,WAAW,MAAM,IAAI,WAAW,CAAC;AAC9C,MAAI,KAAK,UAAU,mBAAmB;AACpC,WAAO;AAAA,EACT;AACA,QAAM,MAAM,KAAK,MAAM,GAAG,oBAAoB,CAAC;AAC/C,QAAM,YAAY,IAAI,YAAY,GAAG;AACrC,SAAO,IAAI,YAAY,oBAAoB,IAAI,IAAI,MAAM,GAAG,SAAS,IAAI,KAAK,QAAQ,CAAC;AACzF;AAOA,SAAS,mBAAmB,OAAyD;AACnF,QAAM,EAAE,aAAa,cAAc,QAAQ,SAAS,MAAM,OAAO,GAAG,KAAK,IAAI;AAC7E,SAAO;AACT;AAOA,SAAS,eAAe,OAAyD;AAC/E,QAAM,SAAS,MAAM;AACrB,QAAM,MAAM,UAAU,OAAO,WAAW,WAAY,SAAqC;AACzF,QAAM,EAAE,IAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK;AAC9C,QAAM,WAAW,MAAM,YAAY,OAAO,MAAM,aAAa,WAAY,MAAM,WAAkC;AACjH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,OAAO,IAAI,aAAa,WAAW,EAAE,UAAU,IAAI,SAAS,IAAI,CAAC;AAAA,IACrE,GAAI,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,KAAK,SAAS,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,IAC3E,SAAS,qBAAqB,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc,EAAE;AAAA,IACxF,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACvB,GAAI,OAAO,UAAU,SAAS,WAAW,EAAE,UAAU,SAAS,KAAK,IAAI,CAAC;AAAA,EAC1E;AACF;AAQO,SAAS,gBAAgB,MAAwB;AACtD,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,IAAI,CAAC,UAAU,eAAe,KAAgC,CAAC;AAAA,EAC7E;AACA,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,EACT;AACA,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,OAAO,MAAM;AAAA,MAC9C;AAAA,MACA,MAAM,QAAQ,OAAO,IAAI,QAAQ,IAAI,CAAC,UAAU,mBAAmB,KAAgC,CAAC,IAAI;AAAA,IAC1G,CAAC;AAAA,EACH;AACF;AAWA,SAAS,MAAM,OAKb;AACA,QAAM,SAAS,MAAM;AACrB,QAAM,MAAM,UAAU,OAAO,WAAW,WAAY,SAAqC;AAEzF,QAAM,KAAK,IAAI,MAAM,IAAI,OAAO,MAAM,MAAM,MAAM,OAAO,MAAM,UAAU;AACzE,QAAM,SAAS,IAAI,UAAU,MAAM,UAAU,MAAM,eAAe;AAIlE,MAAI,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,KAAK,KAAK,IAAI;AAChE,MAAI,CAAC,QAAQ,MAAM,cAAc,MAAM;AACrC,UAAM,OAAO,OAAO,MAAM,qBAAqB,WAAW,MAAM,mBAAmB;AACnF,WAAO,SAAS,OAAO,YAAY,cAAc,IAAI,aAAa,SAAS,IAAI,KAAK,GAAG;AAAA,EACzF;AAEA,SAAO;AAAA,IACL,IAAI,OAAO,EAAE;AAAA,IACb,MAAM,OAAO,IAAI,QAAQ,MAAM,QAAQ,WAAW;AAAA,IAClD,QAAQ,OAAO,MAAM;AAAA,IACrB;AAAA,EACF;AACF;AAGA,SAAS,YAAY,OAAgC,MAAyB;AAC5E,QAAM,MAAM,MAAM,KAAK;AACvB,QAAM,SAAS,IAAI,SAAS,KAAK,IAAI,MAAM,MAAM;AACjD,QAAM,QAAQ,CAAC,OAAO,IAAI,EAAE,MAAM,IAAI,IAAI,GAAG,MAAM,EAAE;AAGrD,QAAM,SAAS,MAAM;AACrB,QAAM,MAAM,UAAU,OAAO,WAAW,WAAY,SAAqC;AACzF,QAAM,cAAc,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc;AAC5E,QAAM,OACJ,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU,OAAO,cAAc,qBAAqB,WAAW;AAC3G,MAAI,OAAO,SAAS,YAAY,KAAK,KAAK,GAAG;AAC3C,UAAM;AAAA,MACJ,GAAG,KACA,KAAK,EACL,MAAM,IAAI,EACV,IAAI,CAAC,SAAU,OAAO,KAAK,IAAI,KAAK,EAAG;AAAA,IAC5C;AAAA,EACF;AACA,MAAI,IAAI,MAAM;AACZ,UAAM,KAAK,KAAK,IAAI,IAAI,EAAE;AAAA,EAC5B;AACA,SAAO;AACT;AAGA,SAAS,WAAW,SAA4C;AAC9D,QAAM,QAAQ,QAAQ,CAAC,GAAG;AAC1B,SAAO,OAAO,UAAU,YAAY,QAAQ,MAAM,CAAC,UAAU,MAAM,SAAS,KAAK,IAAI,QAAQ;AAC/F;AAOA,SAAS,gBAAgB,OAAgC,QAA0B;AACjF,QAAM,EAAE,IAAI,KAAK,IAAI,MAAM,KAAK;AAChC,QAAM,SAAS,OAAO,MAAM,gBAAgB,WAAW,KAAK,MAAM,WAAW,MAAM;AACnF,QAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,EAAE;AAC7C,MAAI,OAAO,MAAM,SAAS,YAAY,MAAM,QAAQ,MAAM,SAAS,QAAQ;AACzE,UAAM,KAAK,KAAK,MAAM,IAAI,EAAE;AAAA,EAC9B;AACA,MAAI,MAAM,QAAQ,MAAM,SAAS,KAAK,MAAM,UAAU,SAAS,GAAG;AAChE,UAAM,WAAY,MAAM,UAA6C,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;AACvG,UAAM,KAAK,iBAAiB,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,EACnD;AACA,QAAM,SAAS,MAAM;AACrB,MAAI,OAAO,QAAQ,UAAU,UAAU;AACrC,UAAM,KAAK,mBAAmB,OAAO,KAAK,EAAE;AAAA,EAC9C;AACA,SAAO;AACT;AAGA,SAAS,cAAc,MAA+B,MAAyB;AAC7E,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,QAAQ,OAAO,KAAK,OAAO,QAAQ,IAAI,GAAG;AACpD,QAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,GAAG;AACnD;AAAA,IACF;AACA,UAAM,OAAO;AACb,QAAI,MAAM;AACR,YAAM,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,KAAK,GAAG,KAAK,QAAQ,CAAC,UAAU,YAAY,OAAO,IAAI,CAAC,CAAC;AAAA,IAClG,OAAO;AACL,YAAM,SAAS,WAAW,IAAI;AAC9B,YAAM,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,IAAI,SAAS,KAAK,MAAM,KAAK,EAAE,EAAE;AACxE,YAAM,KAAK,GAAG,KAAK,QAAQ,CAAC,UAAU,gBAAgB,OAAO,MAAM,CAAC,CAAC;AAAA,IACvE;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AACA,SAAO;AACT;AAMO,SAAS,eAAe,MAAe,OAAiB,EAAE,OAAO,MAAM,IAAwB,CAAC,GAAW;AAChH,MAAI;AACJ,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,YAAQ,KAAK,QAAQ,CAAC,UAAU,YAAY,OAAkC,IAAI,CAAC;AAAA,EACrF,WAAW,QAAQ,OAAO,SAAS,UAAU;AAC3C,YAAQ,cAAc,MAAiC,IAAI;AAAA,EAC7D,OAAO;AACL,YAAQ,CAAC;AAAA,EACX;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,aAAW,QAAQ,OAAO;AACxB,UAAM,KAAK,KAAK,IAAI,EAAE;AAAA,EACxB;AACA,SAAO,GAAG,MAAM,KAAK,IAAI,EAAE,QAAQ,CAAC;AAAA;AACtC;","names":[]}
1
+ {"version":3,"sources":["../src/commands/actions/list.ts"],"sourcesContent":["import type { ActionsListRequest, ActionsListResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { Lexer, type Token } from \"marked\";\nimport { apiPost } from \"../../client.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { ACTIONS_LIST_DEFAULT_LIMIT, buildListHints, failApi } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.list\",\n description:\n 'List actions for the current company. Compact by default: a bucketed Task is its id and name (plus its blockers, holder or staged change); a flat row (--search, --bucketed=false) adds status, priority, tags and a one-line `summary` of its description. Checking whether a Task already exists? --search \"<words>\" returns the matches with their summaries. --full prints whole descriptions (or `baker actions get <id>` for one Task). Default: pre-bucketed (claimable/myClaims/blocked/claimedByOthers/completed/discarded), each bucket ordered do-first (blockers before blocked, then highest-leverage). The bucketed view reads the whole open backlog, so nothing pending is ever hidden from it. Set --bucketed=false for a flat list filterable by --status, orderable by --sort, and windowed by --limit. Looking for one Task by name? --search \"conversion goal\" --output md returns only the matching Tasks instead of the whole backlog.',\n args: {\n search: {\n type: \"string\",\n description:\n 'Find Tasks by words in their name, description or tags, searched on the server (e.g. --search \"conversion goal\"). Returns a flat list, best match first; by default it covers pending, in-progress and completed Tasks. Add --status to search one status instead, including discarded Tasks (--status discarded). Implies --bucketed=false.',\n required: false,\n },\n bucketed: {\n type: \"boolean\",\n description: \"Pre-bucket the results based on the current chat (default: true)\",\n required: false,\n default: true,\n },\n status: {\n type: \"string\",\n description: \"Filter by status (only with --bucketed=false): pending|in_progress|completed|discarded\",\n required: false,\n },\n sort: {\n type: \"string\",\n description:\n \"Order a flat list (only with --bucketed=false): priority (do-first: blockers before blocked, then highest-leverage) | recent. Default: priority.\",\n required: false,\n },\n limit: {\n type: \"string\",\n description: `How many Tasks a flat list reads, newest first (only with --bucketed=false). Default: ${ACTIONS_LIST_DEFAULT_LIMIT}. When the read comes back full, hints[] says so — raise --limit to reach older Tasks.`,\n required: false,\n },\n full: {\n type: \"boolean\",\n description:\n \"Print every Task's whole description and full record instead of the compact row. Large on a real backlog — prefer --search, or `baker actions get <id>` for one Task.\",\n required: false,\n default: false,\n },\n output: { type: \"string\", description: \"Output format: json|md. Default: json\", required: false },\n },\n});\n\nexport const listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List actions, one short row per Task (id and name; --search rows add a one-line summary). Default: bucketed view (claimable, myClaims, blocked, claimedByOthers). Use --bucketed=false for raw filter by --status, --search <text> to find Tasks by name, --full for whole descriptions.\",\n },\n args: {\n search: { type: \"string\", description: \"Find Tasks by words in name/description/tags\", required: false },\n bucketed: { type: \"boolean\", description: \"Pre-bucket by chat\", required: false, default: true },\n status: { type: \"string\", description: \"Status filter (raw mode)\", required: false },\n sort: { type: \"string\", description: \"Order (raw mode): priority|recent\", required: false },\n limit: { type: \"string\", description: \"How many Tasks to read (raw mode)\", required: false },\n full: {\n type: \"boolean\",\n description: \"Whole descriptions and full records\",\n required: false,\n default: false,\n },\n output: { type: \"string\", description: \"Output format: json|md\", required: false },\n },\n run: async ({ args }) => {\n try {\n const body = buildListRequest(args, getEnv().BAKER_CHAT_ID);\n const response = await apiPost<ActionsListResponse>(\"/api/actions/list\", body);\n // Only the flat list is windowed — the bucketed view reads the whole open\n // backlog, so there is nothing there to warn about.\n const hints =\n body.bucketed === false && body.limit !== undefined && response.ok && Array.isArray(response.data)\n ? buildListHints({ returned: response.data.length, limit: body.limit })\n : [];\n if (args.output === \"md\" && response.ok) {\n process.stdout.write(renderMarkdown(response.data, hints, { full: args.full === true }));\n return;\n }\n const compact = !args.full && response.ok;\n const shaped = compact ? { ...response, data: compactListData(response.data) } : response;\n const envelope = hints.length > 0 ? { ...shaped, hints } : shaped;\n if (compact) {\n // Unindented: on a real backlog the indentation alone outweighed the Tasks.\n process.stdout.write(`${JSON.stringify(envelope)}\\n`);\n return;\n }\n writeJson(envelope);\n } catch (err) {\n failApi(err);\n }\n },\n});\n\ntype ListArgs = {\n bucketed?: boolean;\n status?: string;\n sort?: string;\n limit?: string;\n search?: string;\n};\n\n// `status` goes out as typed so the server refuses a misspelt one instead of the\n// CLI dropping it and returning every status.\ntype ListRequest = Omit<ActionsListRequest, \"status\"> & { status?: string };\n\n/**\n * The request `actions list` sends. A search is answered by the server's\n * full-text index over each Task's name, description and tags, which only the\n * flat list reads — so `--search` implies `--bucketed=false`.\n */\nexport function buildListRequest(args: ListArgs, chatId: string | undefined): ListRequest {\n const q = args.search?.trim();\n if (args.bucketed !== false && !q) {\n return chatId ? { bucketed: true, chatId } : { bucketed: true };\n }\n const parsedLimit = args.limit === undefined ? Number.NaN : Number.parseInt(String(args.limit), 10);\n const body: ListRequest = {\n bucketed: false,\n // Default to do-first ordering so the flat list matches its documented\n // contract; only \"recent\" opts out. A search keeps relevance order.\n sort: args.sort === \"recent\" ? \"recent\" : \"priority\",\n limit: Number.isFinite(parsedLimit) && parsedLimit > 0 ? parsedLimit : ACTIONS_LIST_DEFAULT_LIMIT,\n };\n if (q) {\n body.q = q;\n }\n if (args.status) {\n body.status = args.status;\n }\n return body;\n}\n\n/** How long a Task's summary line may run before it is cut. */\nconst SUMMARY_MAX_CHARS = 100;\n\n/** The text a reader sees in inline markdown: emphasis, code and link markup dropped, images skipped. */\nfunction plainText(tokens: Token[]): string {\n return tokens\n .map((token) => {\n if (token.type === \"image\" || token.type === \"html\") {\n return \"\";\n }\n if (token.type === \"br\") {\n return \" \";\n }\n if (\"tokens\" in token && Array.isArray(token.tokens)) {\n return plainText(token.tokens);\n }\n return \"text\" in token && typeof token.text === \"string\" ? token.text : \"\";\n })\n .join(\"\");\n}\n\n/** The first run of prose in a block sequence — past headings, code blocks, rules and tables. */\nfunction firstProse(tokens: Token[]): string {\n for (const token of tokens) {\n let text = \"\";\n if (token.type === \"paragraph\" || token.type === \"text\") {\n text = plainText(Array.isArray(token.tokens) ? token.tokens : [token]);\n } else if (token.type === \"list\") {\n text = firstProse(token.items.flatMap((item: { tokens: Token[] }) => item.tokens));\n } else if (token.type === \"blockquote\") {\n text = firstProse(token.tokens ?? []);\n }\n const line = text.replace(/\\s+/g, \" \").trim();\n if (line) {\n return line;\n }\n }\n return \"\";\n}\n\n/**\n * A Task's description reduced to its first line of prose — enough to tell two\n * Tasks with similar names apart without reading either in full.\n *\n * Descriptions are markdown written to be read in a panel, so the first block is\n * often a `## What changes` heading or a code fence; the markdown is parsed, and\n * the summary is the first paragraph or list item as a reader would see it.\n */\nexport function summarizeDescription(description: string): string {\n const line = firstProse(Lexer.lex(description));\n if (line.length <= SUMMARY_MAX_CHARS) {\n return line;\n }\n const cut = line.slice(0, SUMMARY_MAX_CHARS - 1);\n const lastSpace = cut.lastIndexOf(\" \");\n return `${(lastSpace > SUMMARY_MAX_CHARS / 2 ? cut.slice(0, lastSpace) : cut).trimEnd()}…`;\n}\n\n/**\n * A bucket entry (published or staged-create) as its id and name, plus what only\n * this row says (its blockers, the chat holding it, its staged change). The\n * status and hint are the same for every row of a bucket, which already says them.\n */\nfunction compactBucketEntry(entry: Record<string, unknown>): Record<string, unknown> {\n const { description: _description, status: _status, hint: _hint, ...rest } = entry;\n return rest;\n}\n\n/**\n * A flat-list row (`ActionWithMeta`, the Task nested under `action`) as the same\n * short row a bucket entry is, plus the priority and tags only this shape carries.\n * The nested doc also holds `searchText`, a second copy of the whole description.\n */\nfunction compactFlatRow(entry: Record<string, unknown>): Record<string, unknown> {\n const nested = entry.action;\n const doc = nested && typeof nested === \"object\" ? (nested as Record<string, unknown>) : entry;\n const { id, name, status, hint } = toRow(entry);\n const assignee = entry.assignee && typeof entry.assignee === \"object\" ? (entry.assignee as { name?: unknown }) : null;\n return {\n id,\n name,\n status,\n ...(typeof doc.priority === \"string\" ? { priority: doc.priority } : {}),\n ...(Array.isArray(doc.tags) && doc.tags.length > 0 ? { tags: doc.tags } : {}),\n summary: summarizeDescription(typeof doc.description === \"string\" ? doc.description : \"\"),\n ...(hint ? { hint } : {}),\n ...(typeof assignee?.name === \"string\" ? { assignee: assignee.name } : {}),\n };\n}\n\n/**\n * The default `actions list` payload: every Task as a short row, never its full\n * description. A backlog's descriptions run to a kilobyte each, so printing them\n * all turned a \"does this Task already exist?\" check into ~110 KB of output.\n * `--full` prints the server's payload untouched.\n */\nexport function compactListData(data: unknown): unknown {\n if (Array.isArray(data)) {\n return data.map((entry) => compactFlatRow(entry as Record<string, unknown>));\n }\n if (!data || typeof data !== \"object\") {\n return data;\n }\n return Object.fromEntries(\n Object.entries(data).map(([bucket, entries]) => [\n bucket,\n Array.isArray(entries) ? entries.map((entry) => compactBucketEntry(entry as Record<string, unknown>)) : entries,\n ]),\n );\n}\n\n/**\n * Flatten either payload shape to the same row.\n *\n * The two responses do not agree, and the flat one is the odd shape: a bucket\n * entry carries `id`/`name`/`status`/`hint` at the top level, while the flat\n * list returns `ActionWithMeta` — the identity lives under `entry.action` as\n * `_id`/`name`/`status`, with the blocker counts as siblings. Reading the\n * bucket fields off both is how every flat row rendered as \"- `?` (unnamed)\".\n */\nfunction toRow(entry: Record<string, unknown>): {\n id: string;\n name: string;\n status: string;\n hint: string;\n} {\n const nested = entry.action;\n const doc = nested && typeof nested === \"object\" ? (nested as Record<string, unknown>) : entry;\n\n const id = doc.id ?? doc._id ?? entry.id ?? entry._id ?? entry.tempId ?? \"?\";\n const status = doc.status ?? entry.status ?? entry.draftStatus ?? \"\";\n\n // `hint` is a bucket-entry field; the flat shape has none, so say the thing it\n // does carry instead of dropping the row's only context.\n let hint = typeof entry.hint === \"string\" ? entry.hint.trim() : \"\";\n if (!hint && entry.isBlocked === true) {\n const open = typeof entry.openBlockerCount === \"number\" ? entry.openBlockerCount : null;\n hint = open === null ? \"blocked\" : `blocked by ${open} open Task${open === 1 ? \"\" : \"s\"}`;\n }\n\n return {\n id: String(id),\n name: String(doc.name ?? entry.name ?? \"(unnamed)\"),\n status: String(status),\n hint,\n };\n}\n\n/** One Task as a line, plus its summary (or with `full`, its whole description) and hint indented under it. */\nfunction renderEntry(entry: Record<string, unknown>, full: boolean): string[] {\n const row = toRow(entry);\n const suffix = row.status ? ` [${row.status}]` : \"\";\n const lines = [`- \\`${row.id}\\` ${row.name}${suffix}`];\n // The description lives under `action` on flat rows; a compact row already\n // carries its one-line `summary`.\n const nested = entry.action;\n const doc = nested && typeof nested === \"object\" ? (nested as Record<string, unknown>) : entry;\n const description = typeof doc.description === \"string\" ? doc.description : \"\";\n const text =\n typeof entry.summary === \"string\" ? entry.summary : full ? description : summarizeDescription(description);\n if (typeof text === \"string\" && text.trim()) {\n lines.push(\n ...text\n .trim()\n .split(\"\\n\")\n .map((line) => (line ? ` ${line}` : \"\")),\n );\n }\n if (row.hint) {\n lines.push(` ${row.hint}`);\n }\n return lines;\n}\n\n/** The hint every entry of a bucket shares, or \"\" when they differ (myClaims varies by staged change). */\nfunction sharedHint(entries: Record<string, unknown>[]): string {\n const first = entries[0]?.hint;\n return typeof first === \"string\" && entries.every((entry) => entry.hint === first) ? first : \"\";\n}\n\n/**\n * A bucket entry as its id and name, plus only what this row says that its\n * bucket does not: its staged change, its own hint, its open blockers, the chat\n * holding it. The bucket's shared hint is printed once, on its heading.\n */\nfunction renderBucketRow(entry: Record<string, unknown>, shared: string): string[] {\n const { id, name } = toRow(entry);\n const suffix = typeof entry.draftStatus === \"string\" ? ` [${entry.draftStatus}]` : \"\";\n const lines = [`- \\`${id}\\` ${name}${suffix}`];\n if (typeof entry.hint === \"string\" && entry.hint && entry.hint !== shared) {\n lines.push(` ${entry.hint}`);\n }\n if (Array.isArray(entry.blockedBy) && entry.blockedBy.length > 0) {\n const blockers = (entry.blockedBy as { id: string; name: string }[]).map((b) => `\\`${b.id}\\` ${b.name}`);\n lines.push(` blocked by: ${blockers.join(\", \")}`);\n }\n const holder = entry.claimedByChat as { title?: unknown } | undefined;\n if (typeof holder?.title === \"string\") {\n lines.push(` held by chat: ${holder.title}`);\n }\n return lines;\n}\n\n/** The bucketed payload: a dict of arrays, keyed by bucket name. */\nfunction renderBuckets(data: Record<string, unknown>, full: boolean): string[] {\n const lines: string[] = [];\n for (const [bucket, entries] of Object.entries(data)) {\n if (!Array.isArray(entries) || entries.length === 0) {\n continue;\n }\n const rows = entries as Record<string, unknown>[];\n if (full) {\n lines.push(`## ${bucket} (${rows.length})`, ...rows.flatMap((entry) => renderEntry(entry, true)));\n } else {\n const shared = sharedHint(rows);\n lines.push(`## ${bucket} (${rows.length})${shared ? `: ${shared}` : \"\"}`);\n lines.push(...rows.flatMap((entry) => renderBucketRow(entry, shared)));\n }\n lines.push(\"\");\n }\n return lines;\n}\n\n/** Compact, id-first Markdown of the server's payload (whole descriptions with\n * `full`). The bucketed payload is a dict of arrays and the flat one is an\n * array, and neither shape is guessable from the outside — an agent handed\n * only JSON here wrote three throwaway walkers to discover it. */\nexport function renderMarkdown(data: unknown, hints: string[], { full = false }: { full?: boolean } = {}): string {\n let lines: string[];\n if (Array.isArray(data)) {\n lines = data.flatMap((entry) => renderEntry(entry as Record<string, unknown>, full));\n } else if (data && typeof data === \"object\") {\n lines = renderBuckets(data as Record<string, unknown>, full);\n } else {\n lines = [];\n }\n\n if (lines.length === 0) {\n return \"No Tasks matched.\\n\";\n }\n\n for (const hint of hints) {\n lines.push(`> ${hint}`);\n }\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n"],"mappings":"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","names":[]}
@@ -1,13 +1,14 @@
1
1
  import {
2
2
  failApi
3
- } from "./chunk-IR6D7K4H.js";
3
+ } from "./chunk-I3ZR655O.js";
4
4
  import {
5
5
  CHAT_READ_ARG
6
6
  } from "./chunk-PFBQERWX.js";
7
- import "./chunk-XF4JUKVF.js";
7
+ import "./chunk-7EPXVICM.js";
8
8
  import "./chunk-GXDLWBOY.js";
9
9
  import "./chunk-TEINLN64.js";
10
10
  import "./chunk-ZJWUBJYQ.js";
11
+ import "./chunk-HR6IWNKE.js";
11
12
  import "./chunk-NE4F3FHN.js";
12
13
  import {
13
14
  apiPost
@@ -60,4 +61,4 @@ var listCommand = defineCommand({
60
61
  export {
61
62
  listCommand
62
63
  };
63
- //# sourceMappingURL=list-5IC6KIKO.js.map
64
+ //# sourceMappingURL=list-ZBT3EBVZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/scheduled-agents/list.ts"],"sourcesContent":["import type { ScheduledAgentsListRequest } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { CHAT_READ_ARG } from \"../chat-arg.ts\";\nimport { failApi } from \"./shared.ts\";\n\nconst FULL_DESCRIPTION =\n \"Return every item and staged change as stored, briefs included (tens of KB). Prefer `get <id>` for one item.\";\n\nregisterSchema({\n command: \"scheduled-agents.list\",\n description:\n \"List scheduled agents compactly: each published item's id, name, trigger, enabled and run counts, and each change this chat staged (index, kind, ref, name, trigger). Briefs are left out — `get <id>` returns one item in full, --full returns everything as stored. Includes draft state when BAKER_CHAT_ID is set, or --chat <id> to read an earlier chat's staged items instead.\",\n args: {\n chat: { type: \"string\", description: CHAT_READ_ARG.description, required: false },\n full: { type: \"boolean\", description: FULL_DESCRIPTION, required: false },\n },\n});\n\nexport const listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List scheduled agents: id, name, trigger and status for each, plus this chat's staged changes when BAKER_CHAT_ID is set (or --chat <id> for an earlier chat's). Briefs are left out. Start here: baker scheduled-agents list; then baker scheduled-agents get <id> for one item's brief.\",\n },\n args: {\n chat: CHAT_READ_ARG,\n full: { type: \"boolean\", description: FULL_DESCRIPTION, required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const env = getEnv();\n const chatId = typeof args.chat === \"string\" && args.chat.length > 0 ? args.chat : env.BAKER_CHAT_ID;\n const body: ScheduledAgentsListRequest = {\n ...(chatId ? { chatId } : {}),\n ...(args.full === true ? { full: true } : {}),\n };\n const response = await apiPost<{ ok: true; data: unknown }>(\"/api/scheduled-agents/list\", body);\n writeJson(response);\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAQ9B,IAAM,mBACJ;AAEF,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,cAAc,aAAa,UAAU,MAAM;AAAA,IAChF,MAAM,EAAE,MAAM,WAAW,aAAa,kBAAkB,UAAU,MAAM;AAAA,EAC1E;AACF,CAAC;AAEM,IAAM,cAAc,cAAc;AAAA,EACvC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,MAAM,EAAE,MAAM,WAAW,aAAa,kBAAkB,UAAU,OAAO,SAAS,MAAM;AAAA,EAC1F;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,MAAM,OAAO;AACnB,YAAM,SAAS,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,IAAI,KAAK,OAAO,IAAI;AACvF,YAAM,OAAmC;AAAA,QACvC,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,QAC3B,GAAI,KAAK,SAAS,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAAA,MAC7C;AACA,YAAM,WAAW,MAAM,QAAqC,8BAA8B,IAAI;AAC9F,gBAAU,QAAQ;AAAA,IACpB,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/commands/scheduled-agents/list.ts"],"sourcesContent":["import type { ScheduledAgentsListRequest } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { CHAT_READ_ARG } from \"../chat-arg.ts\";\nimport { failApi } from \"./shared.ts\";\n\nconst FULL_DESCRIPTION =\n \"Return every item and staged change as stored, briefs included (tens of KB). Prefer `get <id>` for one item.\";\n\nregisterSchema({\n command: \"scheduled-agents.list\",\n description:\n \"List scheduled agents compactly: each published item's id, name, trigger, enabled and run counts, and each change this chat staged (index, kind, ref, name, trigger). Briefs are left out — `get <id>` returns one item in full, --full returns everything as stored. Includes draft state when BAKER_CHAT_ID is set, or --chat <id> to read an earlier chat's staged items instead.\",\n args: {\n chat: { type: \"string\", description: CHAT_READ_ARG.description, required: false },\n full: { type: \"boolean\", description: FULL_DESCRIPTION, required: false },\n },\n});\n\nexport const listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List scheduled agents: id, name, trigger and status for each, plus this chat's staged changes when BAKER_CHAT_ID is set (or --chat <id> for an earlier chat's). Briefs are left out. Start here: baker scheduled-agents list; then baker scheduled-agents get <id> for one item's brief.\",\n },\n args: {\n chat: CHAT_READ_ARG,\n full: { type: \"boolean\", description: FULL_DESCRIPTION, required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const env = getEnv();\n const chatId = typeof args.chat === \"string\" && args.chat.length > 0 ? args.chat : env.BAKER_CHAT_ID;\n const body: ScheduledAgentsListRequest = {\n ...(chatId ? { chatId } : {}),\n ...(args.full === true ? { full: true } : {}),\n };\n const response = await apiPost<{ ok: true; data: unknown }>(\"/api/scheduled-agents/list\", body);\n writeJson(response);\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAQ9B,IAAM,mBACJ;AAEF,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,cAAc,aAAa,UAAU,MAAM;AAAA,IAChF,MAAM,EAAE,MAAM,WAAW,aAAa,kBAAkB,UAAU,MAAM;AAAA,EAC1E;AACF,CAAC;AAEM,IAAM,cAAc,cAAc;AAAA,EACvC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,MAAM,EAAE,MAAM,WAAW,aAAa,kBAAkB,UAAU,OAAO,SAAS,MAAM;AAAA,EAC1F;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,MAAM,OAAO;AACnB,YAAM,SAAS,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,IAAI,KAAK,OAAO,IAAI;AACvF,YAAM,OAAmC;AAAA,QACvC,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,QAC3B,GAAI,KAAK,SAAS,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAAA,MAC7C;AACA,YAAM,WAAW,MAAM,QAAqC,8BAA8B,IAAI;AAC9F,gBAAU,QAAQ;AAAA,IACpB,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -1,11 +1,12 @@
1
1
  import {
2
2
  failApi,
3
3
  failValidation
4
- } from "./chunk-3HJLHTWP.js";
5
- import "./chunk-XF4JUKVF.js";
4
+ } from "./chunk-SJYEY5MV.js";
5
+ import "./chunk-7EPXVICM.js";
6
6
  import "./chunk-GXDLWBOY.js";
7
7
  import "./chunk-TEINLN64.js";
8
8
  import "./chunk-ZJWUBJYQ.js";
9
+ import "./chunk-HR6IWNKE.js";
9
10
  import "./chunk-NE4F3FHN.js";
10
11
  import {
11
12
  apiPost
@@ -89,4 +90,4 @@ var logCommand = defineCommand({
89
90
  export {
90
91
  logCommand
91
92
  };
92
- //# sourceMappingURL=log-XZPVOALD.js.map
93
+ //# sourceMappingURL=log-C23OOAJZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/actions/log.ts"],"sourcesContent":["import type { ActionsLogResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation } from \"./shared.ts\";\n\nconst DAY_MS = 86_400_000;\n\nfunction startOfLocalDay(date: Date): number {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n}\n\n// Resolve the report window to absolute epoch-ms bounds. `--from`/`--to` (ISO)\n// take precedence; otherwise `--since` is a friendly relative window anchored\n// to the machine's local day (default: today).\nfunction resolveWindow(args: Record<string, unknown>): { fromMs: number; toMs: number } {\n const fromArg = args.from as string | undefined;\n const toArg = args.to as string | undefined;\n if (fromArg) {\n const fromMs = Date.parse(fromArg);\n if (Number.isNaN(fromMs)) {\n failValidation(`--from is not a valid ISO date/datetime: ${fromArg}`);\n }\n const toMs = toArg ? Date.parse(toArg) : Date.now();\n if (Number.isNaN(toMs)) {\n failValidation(`--to is not a valid ISO date/datetime: ${toArg}`);\n }\n return { fromMs, toMs };\n }\n\n const since = ((args.since as string | undefined) ?? \"today\").trim().toLowerCase();\n const now = Date.now();\n if (since === \"today\") {\n return { fromMs: startOfLocalDay(new Date(now)), toMs: now };\n }\n if (since === \"yesterday\") {\n const todayStart = startOfLocalDay(new Date(now));\n return { fromMs: todayStart - DAY_MS, toMs: todayStart };\n }\n const days = /^(\\d+)d$/.exec(since);\n if (days) {\n return { fromMs: now - Number(days[1]) * DAY_MS, toMs: now };\n }\n return failValidation(`--since must be one of: today | yesterday | <N>d (e.g. 7d). Got: ${since}`);\n}\n\nregisterSchema({\n command: \"actions.log\",\n description:\n \"List actions COMPLETED in a time window, newest first, each with its completion note (what was done). Use this to report to the client what was accomplished — e.g. `baker actions log` for today, or `baker actions log --since 7d` for the last week. Only published completions appear (not ops staged in an unpublished chat). Window defaults to today in local time.\",\n args: {\n since: {\n type: \"string\",\n description: \"Relative window: today | yesterday | <N>d (e.g. 7d). Default: today.\",\n required: false,\n },\n from: { type: \"string\", description: \"Window start (ISO date/datetime). Overrides --since.\", required: false },\n to: { type: \"string\", description: \"Window end (ISO date/datetime). Defaults to now.\", required: false },\n },\n});\n\nexport const logCommand = defineCommand({\n meta: {\n name: \"log\",\n description:\n \"List completed actions in a window with their completion notes (what was done). Example: baker actions log --since today\",\n },\n args: {\n since: { type: \"string\", description: \"today | yesterday | <N>d (default: today)\", required: false },\n from: { type: \"string\", description: \"Window start (ISO). Overrides --since\", required: false },\n to: { type: \"string\", description: \"Window end (ISO). Defaults to now\", required: false },\n },\n run: async ({ args }) => {\n try {\n const { fromMs, toMs } = resolveWindow(args);\n const response = await apiPost<ActionsLogResponse>(\"/api/actions/log\", { fromMs, toMs });\n writeJson(response);\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAM9B,IAAM,SAAS;AAEf,SAAS,gBAAgB,MAAoB;AAC3C,SAAO,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,CAAC,EAAE,QAAQ;AAC/E;AAKA,SAAS,cAAc,MAAiE;AACtF,QAAM,UAAU,KAAK;AACrB,QAAM,QAAQ,KAAK;AACnB,MAAI,SAAS;AACX,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,OAAO,MAAM,MAAM,GAAG;AACxB,qBAAe,4CAA4C,OAAO,EAAE;AAAA,IACtE;AACA,UAAM,OAAO,QAAQ,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAClD,QAAI,OAAO,MAAM,IAAI,GAAG;AACtB,qBAAe,0CAA0C,KAAK,EAAE;AAAA,IAClE;AACA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAEA,QAAM,SAAU,KAAK,SAAgC,SAAS,KAAK,EAAE,YAAY;AACjF,QAAM,MAAM,KAAK,IAAI;AACrB,MAAI,UAAU,SAAS;AACrB,WAAO,EAAE,QAAQ,gBAAgB,IAAI,KAAK,GAAG,CAAC,GAAG,MAAM,IAAI;AAAA,EAC7D;AACA,MAAI,UAAU,aAAa;AACzB,UAAM,aAAa,gBAAgB,IAAI,KAAK,GAAG,CAAC;AAChD,WAAO,EAAE,QAAQ,aAAa,QAAQ,MAAM,WAAW;AAAA,EACzD;AACA,QAAM,OAAO,WAAW,KAAK,KAAK;AAClC,MAAI,MAAM;AACR,WAAO,EAAE,QAAQ,MAAM,OAAO,KAAK,CAAC,CAAC,IAAI,QAAQ,MAAM,IAAI;AAAA,EAC7D;AACA,SAAO,eAAe,oEAAoE,KAAK,EAAE;AACnG;AAEA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,aAAa,wDAAwD,UAAU,MAAM;AAAA,IAC7G,IAAI,EAAE,MAAM,UAAU,aAAa,oDAAoD,UAAU,MAAM;AAAA,EACzG;AACF,CAAC;AAEM,IAAM,aAAa,cAAc;AAAA,EACtC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,UAAU,aAAa,6CAA6C,UAAU,MAAM;AAAA,IACnG,MAAM,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,MAAM;AAAA,IAC9F,IAAI,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,EAC1F;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,KAAK,IAAI,cAAc,IAAI;AAC3C,YAAM,WAAW,MAAM,QAA4B,oBAAoB,EAAE,QAAQ,KAAK,CAAC;AACvF,gBAAU,QAAQ;AAAA,IACpB,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/commands/actions/log.ts"],"sourcesContent":["import type { ActionsLogResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation } from \"./shared.ts\";\n\nconst DAY_MS = 86_400_000;\n\nfunction startOfLocalDay(date: Date): number {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n}\n\n// Resolve the report window to absolute epoch-ms bounds. `--from`/`--to` (ISO)\n// take precedence; otherwise `--since` is a friendly relative window anchored\n// to the machine's local day (default: today).\nfunction resolveWindow(args: Record<string, unknown>): { fromMs: number; toMs: number } {\n const fromArg = args.from as string | undefined;\n const toArg = args.to as string | undefined;\n if (fromArg) {\n const fromMs = Date.parse(fromArg);\n if (Number.isNaN(fromMs)) {\n failValidation(`--from is not a valid ISO date/datetime: ${fromArg}`);\n }\n const toMs = toArg ? Date.parse(toArg) : Date.now();\n if (Number.isNaN(toMs)) {\n failValidation(`--to is not a valid ISO date/datetime: ${toArg}`);\n }\n return { fromMs, toMs };\n }\n\n const since = ((args.since as string | undefined) ?? \"today\").trim().toLowerCase();\n const now = Date.now();\n if (since === \"today\") {\n return { fromMs: startOfLocalDay(new Date(now)), toMs: now };\n }\n if (since === \"yesterday\") {\n const todayStart = startOfLocalDay(new Date(now));\n return { fromMs: todayStart - DAY_MS, toMs: todayStart };\n }\n const days = /^(\\d+)d$/.exec(since);\n if (days) {\n return { fromMs: now - Number(days[1]) * DAY_MS, toMs: now };\n }\n return failValidation(`--since must be one of: today | yesterday | <N>d (e.g. 7d). Got: ${since}`);\n}\n\nregisterSchema({\n command: \"actions.log\",\n description:\n \"List actions COMPLETED in a time window, newest first, each with its completion note (what was done). Use this to report to the client what was accomplished — e.g. `baker actions log` for today, or `baker actions log --since 7d` for the last week. Only published completions appear (not ops staged in an unpublished chat). Window defaults to today in local time.\",\n args: {\n since: {\n type: \"string\",\n description: \"Relative window: today | yesterday | <N>d (e.g. 7d). Default: today.\",\n required: false,\n },\n from: { type: \"string\", description: \"Window start (ISO date/datetime). Overrides --since.\", required: false },\n to: { type: \"string\", description: \"Window end (ISO date/datetime). Defaults to now.\", required: false },\n },\n});\n\nexport const logCommand = defineCommand({\n meta: {\n name: \"log\",\n description:\n \"List completed actions in a window with their completion notes (what was done). Example: baker actions log --since today\",\n },\n args: {\n since: { type: \"string\", description: \"today | yesterday | <N>d (default: today)\", required: false },\n from: { type: \"string\", description: \"Window start (ISO). Overrides --since\", required: false },\n to: { type: \"string\", description: \"Window end (ISO). Defaults to now\", required: false },\n },\n run: async ({ args }) => {\n try {\n const { fromMs, toMs } = resolveWindow(args);\n const response = await apiPost<ActionsLogResponse>(\"/api/actions/log\", { fromMs, toMs });\n writeJson(response);\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAM9B,IAAM,SAAS;AAEf,SAAS,gBAAgB,MAAoB;AAC3C,SAAO,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,CAAC,EAAE,QAAQ;AAC/E;AAKA,SAAS,cAAc,MAAiE;AACtF,QAAM,UAAU,KAAK;AACrB,QAAM,QAAQ,KAAK;AACnB,MAAI,SAAS;AACX,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,OAAO,MAAM,MAAM,GAAG;AACxB,qBAAe,4CAA4C,OAAO,EAAE;AAAA,IACtE;AACA,UAAM,OAAO,QAAQ,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAClD,QAAI,OAAO,MAAM,IAAI,GAAG;AACtB,qBAAe,0CAA0C,KAAK,EAAE;AAAA,IAClE;AACA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAEA,QAAM,SAAU,KAAK,SAAgC,SAAS,KAAK,EAAE,YAAY;AACjF,QAAM,MAAM,KAAK,IAAI;AACrB,MAAI,UAAU,SAAS;AACrB,WAAO,EAAE,QAAQ,gBAAgB,IAAI,KAAK,GAAG,CAAC,GAAG,MAAM,IAAI;AAAA,EAC7D;AACA,MAAI,UAAU,aAAa;AACzB,UAAM,aAAa,gBAAgB,IAAI,KAAK,GAAG,CAAC;AAChD,WAAO,EAAE,QAAQ,aAAa,QAAQ,MAAM,WAAW;AAAA,EACzD;AACA,QAAM,OAAO,WAAW,KAAK,KAAK;AAClC,MAAI,MAAM;AACR,WAAO,EAAE,QAAQ,MAAM,OAAO,KAAK,CAAC,CAAC,IAAI,QAAQ,MAAM,IAAI;AAAA,EAC7D;AACA,SAAO,eAAe,oEAAoE,KAAK,EAAE;AACnG;AAEA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,aAAa,wDAAwD,UAAU,MAAM;AAAA,IAC7G,IAAI,EAAE,MAAM,UAAU,aAAa,oDAAoD,UAAU,MAAM;AAAA,EACzG;AACF,CAAC;AAEM,IAAM,aAAa,cAAc;AAAA,EACtC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,UAAU,aAAa,6CAA6C,UAAU,MAAM;AAAA,IACnG,MAAM,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,MAAM;AAAA,IAC9F,IAAI,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,EAC1F;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,KAAK,IAAI,cAAc,IAAI;AAC3C,YAAM,WAAW,MAAM,QAA4B,oBAAoB,EAAE,QAAQ,KAAK,CAAC;AACvF,gBAAU,QAAQ;AAAA,IACpB,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  fetchBrandLogo,
3
3
  logoCommand
4
- } from "./chunk-W3ZHJJVT.js";
4
+ } from "./chunk-KS2QY6MK.js";
5
5
  import "./chunk-IVIJJXXT.js";
6
6
  import "./chunk-WS2GMOSG.js";
7
- import "./chunk-Q6ULQMWG.js";
8
7
  import "./chunk-KKJ4KJCW.js";
8
+ import "./chunk-Q6ULQMWG.js";
9
9
  import "./chunk-XBOK23HI.js";
10
10
  import "./chunk-IFWP3ZDO.js";
11
11
  import "./chunk-NAWWC5I3.js";
@@ -15,4 +15,4 @@ export {
15
15
  fetchBrandLogo,
16
16
  logoCommand
17
17
  };
18
- //# sourceMappingURL=logo-2IP663QO.js.map
18
+ //# sourceMappingURL=logo-Q5D7PZY6.js.map
@@ -3,11 +3,12 @@ import {
3
3
  lookupReport,
4
4
  peopleArgs,
5
5
  peopleLimitError
6
- } from "./chunk-LZ73CZGP.js";
7
- import "./chunk-MELOSESI.js";
8
- import "./chunk-SSJK7FEV.js";
9
- import "./chunk-EDLZGTGN.js";
6
+ } from "./chunk-5WCSKQ7Z.js";
7
+ import "./chunk-R25YLW6H.js";
8
+ import "./chunk-4PDHHHUJ.js";
9
+ import "./chunk-NYIGXDUG.js";
10
10
  import "./chunk-VFIOJD5M.js";
11
+ import "./chunk-HR6IWNKE.js";
11
12
  import "./chunk-XBOK23HI.js";
12
13
  import "./chunk-IFWP3ZDO.js";
13
14
  import "./chunk-NAWWC5I3.js";
@@ -19,4 +20,4 @@ export {
19
20
  peopleArgs,
20
21
  peopleLimitError
21
22
  };
22
- //# sourceMappingURL=lookup-XK45W2SH.js.map
23
+ //# sourceMappingURL=lookup-ETWY47F7.js.map
@@ -1,12 +1,18 @@
1
+ import {
2
+ NO_FIT_HINT,
3
+ conceptFromFit,
4
+ fitReference
5
+ } from "./chunk-EAP4O4FE.js";
1
6
  import {
2
7
  makeSeriesAd,
3
8
  seriesMadeEnvelope
4
- } from "./chunk-VTDMKARH.js";
9
+ } from "./chunk-ULG4QRTV.js";
5
10
  import "./chunk-ZZQXVYUY.js";
6
11
  import {
7
12
  runBaker
8
- } from "./chunk-4SG4RW2P.js";
9
- import "./chunk-CJCVIEJ5.js";
13
+ } from "./chunk-2VPBIT65.js";
14
+ import "./chunk-6NY2GPR4.js";
15
+ import "./chunk-WGUQHAJY.js";
10
16
  import {
11
17
  definitionFieldsOf,
12
18
  fitsIdea,
@@ -20,11 +26,10 @@ import {
20
26
  unsourcedCopyLines,
21
27
  withFitConcept
22
28
  } from "./chunk-VNUNE5AB.js";
23
- import "./chunk-M242LHLX.js";
29
+ import "./chunk-7CTMH5AK.js";
24
30
  import {
25
31
  projectStaticBriefs
26
- } from "./chunk-T2PC5AVH.js";
27
- import "./chunk-A4LOJ2VD.js";
32
+ } from "./chunk-ASI4P6X2.js";
28
33
  import {
29
34
  liveViewerLookups
30
35
  } from "./chunk-NJXNU2G6.js";
@@ -43,23 +48,18 @@ import {
43
48
  readPersonaIds,
44
49
  sourcesClaims
45
50
  } from "./chunk-4QEY2L6U.js";
46
- import {
47
- NO_FIT_HINT,
48
- conceptFromFit,
49
- fitReference
50
- } from "./chunk-EAP4O4FE.js";
51
- import "./chunk-QRP3PXWN.js";
52
- import "./chunk-3IBYKLXR.js";
51
+ import "./chunk-VL43TNIP.js";
52
+ import "./chunk-ZDMTXQ2Q.js";
53
53
  import "./chunk-NFSLRRIE.js";
54
54
  import "./chunk-F2S5BLPE.js";
55
55
  import "./chunk-WTOYCUKH.js";
56
56
  import {
57
57
  findWorkspaceRoot
58
58
  } from "./chunk-DZSIUEGH.js";
59
- import "./chunk-GKZ2WU75.js";
60
- import "./chunk-W3B4BHQU.js";
59
+ import "./chunk-FPOGPFAG.js";
61
60
  import "./chunk-NCWCZY5P.js";
62
61
  import "./chunk-DGCUPJZD.js";
62
+ import "./chunk-W3B4BHQU.js";
63
63
  import {
64
64
  SPEC_SHAPES_HINT,
65
65
  readAdSpec,
@@ -75,10 +75,11 @@ import "./chunk-VAJBWA2U.js";
75
75
  import "./chunk-HRYOZUSK.js";
76
76
  import "./chunk-VVZBBKRC.js";
77
77
  import "./chunk-YBMVHGY3.js";
78
- import "./chunk-XF4JUKVF.js";
78
+ import "./chunk-7EPXVICM.js";
79
79
  import "./chunk-GXDLWBOY.js";
80
80
  import "./chunk-TEINLN64.js";
81
81
  import "./chunk-ZJWUBJYQ.js";
82
+ import "./chunk-HR6IWNKE.js";
82
83
  import "./chunk-NE4F3FHN.js";
83
84
  import {
84
85
  apiPost
@@ -590,4 +591,4 @@ export {
590
591
  seedConcept,
591
592
  unbuiltReference
592
593
  };
593
- //# sourceMappingURL=make-J3WBO62B.js.map
594
+ //# sourceMappingURL=make-TPKKJXGL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/creatives/make.ts"],"sourcesContent":["/**\n * `baker creatives make <idea>`: one idea becomes one creative. For a static it finds a reference\n * for the job itself (the idea's container, made for our viewer), keeps the first whose\n * load-bearing parts we can supply, scaffolds from it, and records the idea on the creative and\n * its message in the ad spec. The agent then writes only the copy lines and the scene, and runs it.\n */\n\nimport { mkdtemp, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport type { ScopedWinnersSearchResponse } from \"@baker/api/ad-library\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport type { ConceptCarry } from \"../../engine/scaffold/static-ad-spec.ts\";\nimport { readAdSpec, SPEC_SHAPES_HINT, unwrittenProblems } from \"../../engine/scaffold/static-ad-spec.ts\";\nimport { projectStaticBriefs } from \"../../engine/scaffold/static-render-briefs.ts\";\nimport { optionalChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { type ViewerTemperature, viewerFromKnowledge } from \"../../viewer-profile.ts\";\nimport { runBaker as baker } from \"../baker-child.ts\";\nimport { findWorkspaceRoot } from \"../canvas/normalize-paths.ts\";\nimport { liveViewerLookups } from \"../canvas/viewer-check.ts\";\nimport { conceptFromFit, type FitAnswer, type FitFailure, fitReference, NO_FIT_HINT } from \"../winning-ads/fit.ts\";\nimport { buildSearchBody } from \"../winning-ads/search.ts\";\nimport { checkIdeas, type EvidenceLevel, type Idea, type IdeaCheck, sourcesClaims } from \"./ideas-model.ts\";\nimport {\n coverageOf,\n IDEAS_DIR,\n readCreativeRecords,\n readIdeas,\n readInsights,\n readKnowledgeCorpus,\n readPersonaIds,\n} from \"./ideas-workspace.ts\";\nimport {\n definitionFieldsOf,\n fitsIdea,\n ideaSpec,\n isVideoIdea,\n missingElements,\n pooledCandidates,\n referenceSearchesFor,\n setDefinitionFields,\n setSpecMessage,\n unsourcedCopyLines,\n withFitConcept,\n} from \"./make-model.ts\";\nimport { makeSeriesAd, seriesMadeEnvelope } from \"./make-series.ts\";\n\n/** Candidates whose fit may be asked (a few cents each, cached per workspace). */\nconst FITS_TRIED = 6;\n/**\n * Fits asked at a time: the best-ranked candidate is usually kept, so the rest wait for a slot that\n * one not fitting frees (six at once billed six fits where one was kept).\n */\nconst FITS_AT_ONCE = 3;\nconst SEARCH_TIMEOUT_MS = 120_000;\n/**\n * How long make looks for, checks and describes a reference before it starts the ad from the idea.\n * Every ad starts from a proven one when it can: dev, Oct 2026, a search took 3-30 s, a fit 20-50 s\n * and the describe ~35 s beside them, so the 50 s this once was sent good references to the idea.\n */\nconst REFERENCE_MS = 150_000;\n\nconst DESCRIPTION = `Build one idea from src/creatives/_ideas/ into a creative. For a static it builds on a proven winning ad in the idea's container: it searches on the idea's message for our viewer, then the container's strongest winners from any category, checks which fit us, scaffolds the creative on the best-ranked one, records the idea on it and sets the ad's message. The fit says what made that ad win, so what ours carries of it (\\`reference.carry\\`: whole_ad, layout, hook or angle); its first hint names the ad: tell the person. When no proven ad fits, it starts the ad from the idea itself and says why (never a dead end, never retry with another format). You then write the copy lines and the scene in prompt.json and run it. Takes up to about two and a half minutes: run it in the foreground, once per idea.\n\nStart here, with an idea from \\`baker creatives ideas\\` build_next:\n baker creatives make phone-payroll # static: reference found and checked for you\n baker creatives make phone-payroll --adset 120210000000 # written for that ad set's viewer\n baker creatives make phone-payroll --reference 1310524137919413 # your own reference instead\n baker creatives make founder-story --spec beats.json # a video idea: from its beats spec\n baker creatives make phone-payroll --slug phone-payroll-h2 # another hook of the same idea\n baker creatives make tiktok-speed --series zernio-live # another message in the style of a ready ad\nThen: edit src/creatives/<slug>/prompt.json (copy + scene; the message is set), and \\`baker canvas run src/creatives/<slug>/<slug>.canvas.json\\`.`;\n\nconst ARGS = {\n idea: { type: \"positional\", required: true, description: \"The idea id (src/creatives/_ideas/<idea>.md)\" },\n slug: { type: \"string\", required: false, description: \"Creative slug (default: the idea id)\" },\n adset: { type: \"string\", required: false, description: \"Meta ad set the ad is for: its viewer and placements\" },\n reference: {\n type: \"string\",\n required: false,\n description: \"A library ad id to build on instead of searching (statics)\",\n },\n platform: {\n type: \"string\",\n required: false,\n description: \"Library platform of --reference: meta|linkedin|tiktok (default meta)\",\n },\n spec: {\n type: \"string\",\n required: false,\n description: \"Video ideas: the beats spec for `baker canvas scaffold-ad --spec`\",\n },\n series: {\n type: \"string\",\n required: false,\n description:\n \"Statics: make this idea as another ad of the series led by this creative (its slug): the same design, only its words changed. No reference is searched; seconds. The lead must have a ready version. Then write its words and run the whole series: baker canvas run --series <lead>\",\n },\n \"from-idea\": {\n type: \"boolean\",\n required: false,\n default: false,\n description:\n \"Statics: skip the reference search and start from the idea (what make does by itself when no proven ad fits)\",\n },\n} as const;\n\nregisterSchema({ command: \"creatives.make\", description: DESCRIPTION, args: ARGS });\n\ntype Failure = { code: string; message: string; fix?: string };\n\nfunction fail(error: Failure): never {\n writeJson({ ok: false, error });\n process.exit(1);\n}\n\nasync function viewerTemperature(\n root: string,\n adSet: string | undefined,\n awareness: string,\n): Promise<ViewerTemperature> {\n if (adSet) {\n const read = await liveViewerLookups(root)\n .adSetViewer(adSet)\n .catch(() => null);\n if (read) return read.temperature;\n }\n return viewerFromKnowledge({ personas: [], awareness: awareness as never }).temperature;\n}\n\ntype Picked = {\n adId: string;\n platform: \"meta\" | \"linkedin\" | \"tiktok\";\n advertiserId?: string;\n why: string;\n tried: number;\n /** The fit that kept it, with what made it win (`carry`); none for a reference chosen by hand. */\n fit?: FitAnswer;\n};\n\nconst asPlatform = (value: unknown): Picked[\"platform\"] =>\n value === \"linkedin\" || value === \"tiktok\" ? value : \"meta\";\n\ntype Candidate = { ad_id?: string | null; platform?: unknown; advertiser_id?: string | null };\ntype FitResult = Awaited<ReturnType<typeof fitReference>>;\n\n/** How references are found and checked; the live library and fit by default, injected in tests. */\nexport type ReferenceDeps = {\n search: (body: Record<string, unknown>) => Promise<Candidate[]>;\n fit: (platform: Picked[\"platform\"], adId: string) => Promise<FitResult>;\n};\n\nfunction liveReferenceDeps(root: string): ReferenceDeps {\n return {\n search: async (body) =>\n (\n await apiPost<ScopedWinnersSearchResponse>(\"/api/ad-library/winners/search\", body, {\n timeoutMs: SEARCH_TIMEOUT_MS,\n }).catch(() => null)\n )?.results ?? [],\n fit: (platform, adId) => fitReference(root, platform, adId),\n };\n}\n\n/** The candidates of every search, the better search's first; every search runs at once. */\nasync function findCandidates(searches: Record<string, unknown>[], deps: ReferenceDeps): Promise<Candidate[]> {\n const results = await Promise.all(searches.map((search) => deps.search(search).catch(() => [] as Candidate[])));\n return pooledCandidates(results, FITS_TRIED);\n}\n\n/**\n * Search the idea's container and keep the best-ranked reference whose load-bearing parts we can\n * supply. Three fits run at once (a few cents each): one after another, one make took 109 s.\n */\n/**\n * What building on a reference started before its fit was known left behind: `prepared` when the\n * reference kept is the one built on, `discarded` (to wait for before building over it) when not.\n */\ntype Speculated<T> = { prepared?: Promise<T>; discarded?: Promise<T> };\n\n/** The reference a build starts on, as `prepare` is handed it before its fit is known. */\nexport type ReferenceCandidate = Pick<Picked, \"adId\" | \"platform\" | \"advertiserId\">;\n\nconst candidateOf = (c: Candidate): ReferenceCandidate => ({\n adId: String(c.ad_id),\n platform: asPlatform(c.platform),\n ...(c.advertiser_id ? { advertiserId: c.advertiser_id } : {}),\n});\n\nexport async function pickReference<T = never>(\n root: string,\n searches: Record<string, unknown>[],\n deps: ReferenceDeps = liveReferenceDeps(root),\n /**\n * Building on the best-ranked reference, started while the fits are asked: it is usually the one\n * kept, and its scaffold (a 35 s describe) then no longer waits ~25 s for them (dev, Oct 2026).\n */\n prepare?: (candidate: ReferenceCandidate, signal: AbortSignal) => Promise<T>,\n /** Aborted when the time for a reference is out: no reference is kept, and the build started is stopped. */\n within?: AbortSignal,\n): Promise<(Picked & Speculated<T>) | (Failure & Speculated<T>)> {\n const out = whenAborted(within);\n const found = await Promise.race([findCandidates(searches, deps), out]);\n if (found === \"out\") return slowReference();\n const candidates = found.slice(0, FITS_TRIED);\n const first = candidates[0];\n // A build on a reference that is not kept is stopped, not waited for (dev: 50 s for nothing).\n const stop = new AbortController();\n const building = first && prepare ? prepare(candidateOf(first), stop.signal) : undefined;\n // A failed speculative build is never this pick's failure: the kept reference is built again.\n void building?.catch(() => undefined);\n // Three fits are asked at once, and one that does not fit asks the next; the best-ranked one that\n // fits is kept as soon as it and every better-ranked one have answered, never waiting on slower\n // fits below it. Once the pick is made, no further fit is asked.\n let settled = false;\n const asked: Promise<FitResult>[] = [];\n const askNext = () => {\n const index = asked.length;\n const candidate = candidates[index];\n if (settled || !candidate) return;\n asked.push(\n askFit(deps, candidate).then((fit) => {\n if (!(fit.ok && fitsIdea(fit.fit))) askNext();\n return fit;\n }),\n );\n };\n for (let slot = 0; slot < FITS_AT_ONCE; slot++) askNext();\n const kept = await Promise.race([firstFitting(candidates, asked), out]);\n settled = true;\n if (kept === \"out\") {\n stop.abort();\n return { ...slowReference(), ...(building ? { discarded: building } : {}) };\n }\n if (kept.index !== 0) stop.abort();\n const speculated = building ? (kept.index === 0 ? { prepared: building } : { discarded: building }) : {};\n return { ...kept.picked, ...speculated };\n}\n\n/**\n * One candidate's fit, a throw read as a fit not made: it is handled when asked, since the fits\n * below the one awaited can fail while it is awaited.\n */\nconst askFit = (deps: ReferenceDeps, c: Candidate): Promise<FitResult> =>\n Promise.resolve()\n .then(() => deps.fit(asPlatform(c.platform), String(c.ad_id)))\n .catch((e): FitResult => ({ ok: false, error: { code: \"UNAVAILABLE\", message: String(e), fix: \"\" } }));\n\n/** Resolves \"out\" once `signal` aborts (never without one). */\nconst whenAborted = (signal: AbortSignal | undefined) =>\n new Promise<\"out\">((resolve) => {\n if (signal?.aborted) resolve(\"out\");\n signal?.addEventListener(\"abort\", () => resolve(\"out\"), { once: true });\n });\n\n/** The best-ranked candidate whose fit keeps it, with its rank; else why none was kept (index -1). */\nasync function firstFitting(\n candidates: readonly Candidate[],\n fits: readonly Promise<FitResult>[],\n): Promise<{ picked: Picked | Failure; index: number }> {\n let unchecked: FitFailure | null = null;\n let checked = 0;\n const lacking: string[] = [];\n for (const [index, candidate] of candidates.entries()) {\n const fit = await fits[index];\n if (!fit) continue;\n if (!fit.ok) unchecked = fit.error;\n else checked += 1;\n if (fit.ok && !fitsIdea(fit.fit)) lacking.push(...missingElements(fit.fit));\n if (!(fit.ok && fitsIdea(fit.fit))) continue;\n const layers = fit.fit.why_it_wins;\n return {\n picked: {\n ...candidateOf(candidate),\n why: [layers.disguise, layers.trigger, layers.logic].filter(Boolean).join(\"; \"),\n tried: index + 1,\n fit: fit.fit,\n },\n index,\n };\n }\n return { picked: noReference(candidates.length, checked, unchecked, lacking), index: -1 };\n}\n\n/** What the rejected references won on that we lack, each once, at most three. Pure. */\nconst lackingText = (lacking: readonly string[]) => {\n const named = [...new Set(lacking.map((l) => l.trim()).filter(Boolean))].slice(0, 3);\n return named.length > 0 ? ` (they won on ${named.join(\", \")})` : \"\";\n};\n\nconst slowReference = (): Failure => ({\n code: \"REFERENCE_SLOW\",\n message: `Finding and checking a proven ad took longer than ${REFERENCE_MS / 1000} s.`,\n fix: \"Nothing to do: the ad starts from the idea. To build on a proven ad anyway, run make again (the checks already made are kept) or pass --reference <adId>.\",\n});\n\n/**\n * Why no reference was kept: none found, none fits (naming what the ones checked won on that we\n * lack), or the fit could not be checked. Pure.\n */\nexport function noReference(\n found: number,\n checked: number,\n unchecked: { message: string } | null,\n lacking: readonly string[] = [],\n): Failure {\n if (found > 0 && checked === 0 && unchecked) {\n return {\n code: \"FIT_UNAVAILABLE\",\n message: `Could not check whether the references fit (${unchecked.message})`,\n fix: \"Run make again in a moment. To build now, pass --reference <adId> with one you looked at yourself (`baker winning-ads search`).\",\n };\n }\n return {\n code: \"NO_REFERENCE_FITS\",\n message:\n found === 0\n ? \"The library has no proven ad in this idea's format.\"\n : `None of the ${found} proven ads checked in this format wins on something this company has${lackingText(lacking)}.`,\n fix: \"Nothing to do to go on: the ad starts from the idea. To build on a proven ad instead, pass --reference <adId> for one you looked at (`baker winning-ads search --format static --format-pattern <the idea's format>`). Do not stop the batch: build the other ideas.\",\n };\n}\n\n/**\n * Refused when the creative's ad is already written: building again would put the idea's\n * placeholders over it (dev, Oct 2026: a chat agent re-ran make on a re-formatted idea and lost the\n * ad it had shown). Nothing there, or a failed make's placeholders, lets the build go ahead. Pure.\n */\nexport function alreadyWritten(promptJson: unknown, slug: string): Failure | null {\n if (promptJson === null || promptJson === undefined) return null;\n try {\n if (unwrittenProblems(readAdSpec(promptJson)).length > 0) return null;\n } catch {\n // Unreadable is still someone's work: refuse rather than overwrite it.\n }\n return {\n code: \"ALREADY_MADE\",\n message: `\"${slug}\" is already made and its ad is written: building it again would replace that ad with placeholders.`,\n fix: `To change this ad, edit src/creatives/${slug}/prompt.json and run \\`baker canvas run\\` on it. For another ad of the same idea, run make again with --slug <new-slug>.`,\n };\n}\n\ntype MakeArgs = {\n slug?: string;\n adset?: string;\n reference?: string;\n platform?: string;\n spec?: string;\n /** The lead ad of the series this idea is made in (`--series`). */\n series?: string;\n fromIdea?: boolean;\n};\n\nconst flag = (value: unknown): string | undefined => (typeof value === \"string\" && value ? value : undefined);\n\n/** The idea, checked: refused when unreadable, missing, or with a problem `creatives ideas` names. */\nasync function loadIdea(root: string, ideaId: string) {\n const { ideas, unreadable } = await readIdeas(root);\n const bad = unreadable.find((u) => u.id === ideaId);\n if (bad) {\n fail({\n code: \"INVALID_IDEA\",\n message: bad.problems.join(\"; \"),\n fix: `Fix ${IDEAS_DIR}/${ideaId}.md, then run make again.`,\n });\n }\n const idea = ideas.find((i) => i.id === ideaId);\n if (!idea) {\n fail({\n code: \"NOT_FOUND\",\n message: `No idea \"${ideaId}\" in ${IDEAS_DIR}/.`,\n fix: `Ideas on file: ${ideas.map((i) => i.id).join(\", \") || \"none\"}. Write it there first.`,\n });\n }\n const [insights, knowledge, personas, creatives] = await Promise.all([\n readInsights(root),\n readKnowledgeCorpus(root),\n readPersonaIds(root),\n readCreativeRecords(root),\n ]);\n const check = checkIdeas({ ideas, insights, knowledge, personas, ...coverageOf(ideas, creatives) }).find(\n (c) => c.id === idea.id,\n );\n if (check && check.problems.length > 0) {\n fail({\n code: \"IDEA_HAS_PROBLEMS\",\n message: check.problems.join(\"; \"),\n fix: \"Fix the idea file and run `baker creatives ideas` again.\",\n });\n }\n return { idea, check };\n}\n\ntype Scaffolded = {\n scaffold: Record<string, unknown>;\n reference: Picked | null;\n fromIdea?: string;\n /** Why the kept reference's concept could not be seeded: the render does not see it yet. */\n conceptUnseeded?: string;\n};\n\n/** Scaffold the creative: a video from its beats, a static from a reference that fits. */\nasync function scaffoldIdea(\n root: string,\n idea: Idea,\n args: MakeArgs,\n slug: string,\n temperature: ViewerTemperature,\n): Promise<Scaffolded> {\n const viewerFlags = args.adset ? [\"--target-adset\", args.adset] : [\"--viewer-temperature\", temperature];\n if (isVideoIdea(idea)) {\n if (!args.spec) {\n fail({\n code: \"SPEC_REQUIRED\",\n message: `\"${idea.id}\" is a video idea (${idea.format}): it is built from its beats.`,\n fix: `Write the beats spec (one spoken line plus one shot each; references/video-flow.md), message first, then: baker creatives make ${idea.id} --spec <file>.`,\n });\n }\n return {\n scaffold: await baker([\"canvas\", \"scaffold-ad\", \"--spec\", args.spec, \"--slug\", slug, ...viewerFlags]),\n reference: null,\n };\n }\n return await scaffoldStatic(root, idea, args, slug, temperature, viewerFlags);\n}\n\n/** A static from a reference that fits, found within `REFERENCE_MS`; else from the idea itself. */\nasync function scaffoldStatic(\n root: string,\n idea: Idea,\n args: MakeArgs,\n slug: string,\n temperature: ViewerTemperature,\n viewerFlags: string[],\n): Promise<Scaffolded> {\n const onReference = (c: ReferenceCandidate, signal?: AbortSignal) =>\n baker(\n [\n \"canvas\",\n \"scaffold-static-ad\",\n \"--source-ad-id\",\n c.adId,\n \"--source-platform\",\n c.platform,\n ...(c.advertiserId ? [\"--source-advertiser-id\", c.advertiserId] : []),\n \"--slug\",\n slug,\n \"--title\",\n idea.message.slice(0, 120),\n ...viewerFlags,\n ],\n signal,\n );\n // Built on the best-ranked reference while the fits are asked, only into a new creative: a build\n // that is not kept is then removed whole, leaving nothing of that reference on the creative.\n const dir = path.join(root, \"src\", \"creatives\", slug);\n const fresh = !(await stat(dir).catch(() => null));\n // A reference found by make has its time: past it, the ad starts from the idea (`REFERENCE_MS`).\n const budget = AbortSignal.timeout(REFERENCE_MS);\n const reference = args.reference\n ? { adId: args.reference, platform: asPlatform(args.platform), why: \"chosen by hand\", tried: 0 }\n : args.fromIdea\n ? { code: \"FROM_IDEA\", message: \"Asked to start from the idea.\" }\n : await pickReference(\n root,\n referenceSearchesFor(idea, temperature).map(buildSearchBody),\n undefined,\n fresh ? (c, signal) => onReference(c, AbortSignal.any([signal, budget])) : undefined,\n budget,\n );\n if (\"discarded\" in reference && reference.discarded) {\n await reference.discarded.catch(() => undefined);\n await rm(dir, { recursive: true, force: true });\n }\n if (\"code\" in reference) {\n return { scaffold: await scaffoldFromIdea(idea, slug, viewerFlags), reference: null, fromIdea: reference.message };\n }\n const prepared = \"prepared\" in reference ? await reference.prepared?.catch(() => null) : null;\n if (prepared?.ok !== true && budget.aborted && !args.reference) {\n await rm(dir, { recursive: true, force: true });\n const slow = slowReference().message;\n return { scaffold: await scaffoldFromIdea(idea, slug, viewerFlags), reference: null, fromIdea: slow };\n }\n const scaffold = prepared?.ok === true ? prepared : await onReference(reference);\n const unbuilt = unbuiltReference(scaffold, { adId: reference.adId, byHand: Boolean(args.reference) });\n if (!unbuilt) return await withKeptConcept(dir, slug, scaffold, reference);\n // What the failed build left of a new creative goes, so the idea's build starts clean.\n if (fresh) await rm(dir, { recursive: true, force: true });\n return { scaffold: await scaffoldFromIdea(idea, slug, viewerFlags), reference: null, fromIdea: unbuilt };\n}\n\n/**\n * Why the ad starts from the idea when the proven ad make picked could not be built on (its picture\n * not described, dev Oct 2026: twice running for one ad), else null: a build that went through, or a\n * reference chosen by hand, whose failure is the agent's to see. Pure.\n */\nexport function unbuiltReference(\n scaffold: Record<string, unknown>,\n reference: { adId: string; byHand: boolean },\n): string | null {\n if (scaffold.ok === true || reference.byHand) return null;\n return `The proven ad ${reference.adId} could not be read to build on.`;\n}\n\n/** The creative built on a reference, its fit's concept seeded, else why it could not be. */\nasync function withKeptConcept(\n dir: string,\n slug: string,\n scaffold: Record<string, unknown>,\n reference: Picked,\n): Promise<Scaffolded> {\n if (scaffold.ok !== true || !reference.fit) return { scaffold, reference };\n const unseeded = await seedConcept(dir, slug, conceptFromFit(reference.fit, reference.adId));\n return { scaffold, reference, ...(unseeded ? { conceptUnseeded: unseeded } : {}) };\n}\n\n/**\n * Seed the kept reference's concept into a creative built before its fit answered, and compile the\n * canvas from it: the render then sees the reference at the level that won (`concept.carry`).\n * Dev, Oct 2026: every build started on the best-ranked reference had no concept. Why it could not\n * be seeded, else null.\n */\nexport async function seedConcept(dir: string, slug: string, seeded: Record<string, unknown>): Promise<string | null> {\n const promptPath = path.join(dir, \"prompt.json\");\n const canvasPath = path.join(dir, `${slug}.canvas.json`);\n let prompt: string;\n try {\n prompt = withFitConcept(await readFile(promptPath, \"utf8\"), seeded);\n await writeFile(promptPath, prompt, \"utf8\");\n } catch (e) {\n return `prompt.json could not take the proven ad's concept (${e instanceof Error ? e.message : String(e)})`;\n }\n try {\n const canvas: unknown = JSON.parse(await readFile(canvasPath, \"utf8\"));\n if (projectStaticBriefs(canvas, JSON.parse(prompt)) > 0) {\n await writeFile(canvasPath, `${JSON.stringify(canvas, null, 2)}\\n`, \"utf8\");\n }\n } catch {\n // prompt.json holds the concept: the run compiles the canvas from it.\n }\n return null;\n}\n\n/** The static started from the idea's own spec: no reference picture, nothing described or billed. */\nasync function scaffoldFromIdea(idea: Idea, slug: string, viewerFlags: string[]): Promise<Record<string, unknown>> {\n const dir = await mkdtemp(path.join(tmpdir(), \"idea-spec-\"));\n const specPath = path.join(dir, \"prompt.json\");\n await writeFile(specPath, JSON.stringify(ideaSpec(idea, idea.who.replace(/[-_]/g, \" \")), null, 2), \"utf8\");\n try {\n return await baker([\n \"canvas\",\n \"scaffold-static-ad\",\n \"--spec\",\n specPath,\n \"--slug\",\n slug,\n \"--title\",\n idea.message.slice(0, 120),\n ...viewerFlags,\n ]);\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n}\n\n/** Record the idea on the creative and its message as the ad's one message; mark the idea built. */\nasync function recordIdea(\n root: string,\n slug: string,\n idea: Idea,\n evidence: EvidenceLevel | \"explore\",\n): Promise<{ dir: string; unsourcedCopy: string[] }> {\n const dir = path.join(root, \"src\", \"creatives\", slug);\n const definitionPath = path.join(dir, \"_definition.md\");\n const definition = await readFile(definitionPath, \"utf8\").catch(() => null);\n if (definition !== null) {\n await writeFile(definitionPath, setDefinitionFields(definition, { ...definitionFieldsOf(idea, evidence) }), \"utf8\");\n }\n const promptPath = path.join(dir, \"prompt.json\");\n const prompt = isVideoIdea(idea) ? null : await readFile(promptPath, \"utf8\").catch(() => null);\n // A spec that does not parse is the scaffold's to report; the message is set by hand then.\n if (prompt !== null) await writeFile(promptPath, setSpecMessage(prompt, idea.message), \"utf8\").catch(() => undefined);\n const unsourcedCopy = prompt === null ? [] : await draftedClaims(root, prompt);\n if (idea.status === \"idea\") {\n const ideaPath = path.join(root, IDEAS_DIR, `${idea.id}.md`);\n await writeFile(ideaPath, setDefinitionFields(await readFile(ideaPath, \"utf8\"), { status: \"built\" }), \"utf8\");\n }\n // The dashboard learns the idea now, not at Publish (where most verdicts are given already).\n await baker([\"canvas\", \"sync-definition\", dir]);\n return { dir, unsourcedCopy };\n}\n\n/** The drafted lines claiming what neither the Knowledge nor our own customers said. */\nasync function draftedClaims(root: string, prompt: string): Promise<string[]> {\n const [knowledge, insights] = await Promise.all([readKnowledgeCorpus(root), readInsights(root)]);\n const own = insights.filter(sourcesClaims).map((i) => i.quote);\n try {\n return unsourcedCopyLines(prompt, `${knowledge}\\n${own.join(\"\\n\")}`);\n } catch {\n return [];\n }\n}\n\nfunction makeArgsOf(args: Record<string, unknown>): MakeArgs {\n const opts: MakeArgs = {};\n for (const key of [\"slug\", \"adset\", \"reference\", \"platform\", \"spec\", \"series\"] as const) {\n const value = flag(args[key]);\n if (value) opts[key] = value;\n }\n if (args[\"from-idea\"] === true) opts.fromIdea = true;\n return opts;\n}\n\nfunction scaffoldFailure(scaffold: Record<string, unknown>): Failure {\n const error = (scaffold.error ?? {}) as Partial<Failure>;\n return {\n code: error.code ?? \"SCAFFOLD_FAILED\",\n message: error.message ?? \"The creative could not be scaffolded.\",\n ...(error.fix ? { fix: error.fix } : {}),\n };\n}\n\ntype Made = {\n slug: string;\n idea: Idea;\n check: IdeaCheck | undefined;\n reference: Picked | null;\n /** Why the static starts from the idea itself: no proven ad fits (or `--from-idea`). */\n fromIdea?: string;\n conceptUnseeded?: string;\n viewer: { adset: string } | { temperature: ViewerTemperature };\n canvasPath: string;\n scaffoldHints: string[];\n /** Drafted copy lines claiming a figure the company never wrote (often the reference's own promise). */\n unsourcedCopy: string[];\n};\n\nconst CARRY_WORDS: Record<ConceptCarry, string> = {\n whole_ad: \"the whole ad (its disguise, layout and hook)\",\n layout: \"its layout\",\n hook: \"its hook\",\n angle: \"its angle\",\n};\n\n/** What the agent tells the person about the proven ad a creative is built on. Pure. */\nfunction builtOnHint(reference: Picked): string {\n const tell = \"Tell the person which proven ad this builds on\";\n const ours = \"the words, brand, people and claims stay ours.\";\n if (!reference.fit) {\n // Chosen by hand: no fit read what made it win, so nothing is said of it.\n return `Built on proven ad ${reference.adId}, the one chosen for it; no check read what made it win. The canvas shows that ad as \\`original\\`. ${tell}; ${ours}`;\n }\n const carried = CARRY_WORDS[reference.fit.carry ?? \"whole_ad\"];\n const why = reference.fit.carry_why ? ` (${reference.fit.carry_why})` : \"\";\n const won = reference.why ? ` It won on: ${reference.why}.` : \"\";\n return `Built on proven ad ${reference.adId}: it carries ${carried}${why}.${won} The canvas shows that ad as \\`original\\`. ${tell} and what it takes from it; ${ours}`;\n}\n\n/** The fix for a concept make could not seed: the fit already made, written in by hand. Pure. */\nconst unseededHint = (reference: Picked, slug: string, why: string) =>\n `${why}, so the render does not see proven ad ${reference.adId} yet. \\`baker winning-ads fit ${reference.adId} --platform ${reference.platform} --full\\` prints the check already made (free): write its \\`read\\` into src/creatives/${slug}/prompt.json as \\`concept\\`, with \\`reference_ad_id: \"${reference.adId}\"\\`.`;\n\n/** What `make` prints: the creative, the idea it carries, and the two steps left to the agent. Pure. */\nexport function makeEnvelope(made: Made) {\n const quote = made.check?.quote;\n return {\n ok: true as const,\n data: {\n creative: made.slug,\n idea: made.idea.id,\n message: made.idea.message,\n evidence: made.check?.evidence ?? \"explore\",\n ...(quote ? { customer_quote: quote } : {}),\n ...(made.fromIdea ? { built_from: \"idea\" } : {}),\n ...(made.reference\n ? {\n reference: {\n ad_id: made.reference.adId,\n platform: made.reference.platform,\n why_it_wins: made.reference.why,\n ...(made.reference.fit?.carry ? { carry: made.reference.fit.carry } : {}),\n },\n }\n : {}),\n viewer: made.viewer,\n canvas_path: made.canvasPath,\n },\n hints: [\n ...(made.reference ? [builtOnHint(made.reference)] : []),\n ...(made.reference && made.conceptUnseeded\n ? [unseededHint(made.reference, made.slug, made.conceptUnseeded)]\n : []),\n ...(made.fromIdea\n ? [\n `${made.fromIdea} So this ad starts from the idea: write the scene and every line of copy in src/creatives/${made.slug}/prompt.json (a placeholder refuses to run). Tell the person this ad is not built on a proven ad, and why, in plain words.`,\n ]\n : []),\n ...(made.unsourcedCopy.length > 0\n ? [\n `Rewrite before running: ${made.unsourcedCopy.map((l) => JSON.stringify(l)).join(\", \")} claim a figure nothing the company wrote holds (the reference's promise, not ours).`,\n ]\n : []),\n `Write the copy lines and the scene in src/creatives/${made.slug}/prompt.json${made.reference ? \": the drafted lines are the reference's, so keep one only if the Knowledge says it (badges, ratings and guarantees too)\" : \"\"}. Say the message in the customer's words${quote ? ` (\"${quote.slice(0, 80)}\")` : \"\"}; keep \\`message\\` as it is.`,\n SPEC_SHAPES_HINT,\n `Then: baker canvas run ${made.canvasPath} (it validates and asks the viewer itself: nothing to run before it).`,\n // The scaffold's own next steps name a separate validate; the run does it (dev, Oct 2026: five validates before one run).\n ...made.scaffoldHints\n .filter((h) => !/canvas (?:validate|viewer-check)/.test(h))\n // make checked the reference and seeded its concept: the scaffold ran before the fit answered.\n .filter((h) => !(made.reference?.fit && h.startsWith(NO_FIT_HINT)))\n .slice(0, 4),\n ],\n };\n}\n\n/** `--series <lead>`: the idea made as another ad of the lead's series, printed or refused. */\nasync function makeInSeries(\n root: string,\n idea: Idea,\n slug: string,\n lead: string,\n evidence: EvidenceLevel | \"explore\",\n): Promise<void> {\n if (isVideoIdea(idea)) {\n fail({\n code: \"SERIES_STATIC_ONLY\",\n message: `\"${idea.id}\" is a video idea: a series repeats one static ad with other words.`,\n fix: `Make it on its own: baker creatives make ${idea.id} --spec <beats file>.`,\n });\n }\n const made = await makeSeriesAd(root, idea, slug, lead, evidence, {\n sync: (dir) => baker([\"canvas\", \"sync-definition\", dir, \"--title\"]),\n chatId: optionalChatId() ?? null,\n });\n if (\"code\" in made) fail(made);\n writeJson(seriesMadeEnvelope({ ...made, canvasPath: path.relative(root, made.canvasPath) }, idea));\n}\n\nexport const makeCommand = defineCommand({\n meta: { name: \"make\", description: DESCRIPTION },\n args: ARGS,\n async run({ args }) {\n const root = findWorkspaceRoot(process.cwd()) ?? process.cwd();\n const opts = makeArgsOf(args);\n const { idea, check } = await loadIdea(root, String(args.idea));\n const slug = opts.slug ?? idea.id;\n const written = await readFile(path.join(root, \"src\", \"creatives\", slug, \"prompt.json\"), \"utf8\").then(\n (text): unknown => {\n try {\n return JSON.parse(text);\n } catch {\n return {};\n }\n },\n (err: NodeJS.ErrnoException) => (err.code === \"ENOENT\" ? null : {}),\n );\n const refused = alreadyWritten(written, slug);\n if (refused) fail(refused);\n if (opts.series) {\n await makeInSeries(root, idea, slug, opts.series, check?.evidence ?? \"explore\");\n return;\n }\n const temperature = await viewerTemperature(root, opts.adset, idea.awareness);\n const { scaffold, reference, fromIdea, conceptUnseeded } = await scaffoldIdea(root, idea, opts, slug, temperature);\n if (scaffold.ok !== true) fail(scaffoldFailure(scaffold));\n const { dir, unsourcedCopy } = await recordIdea(root, slug, idea, check?.evidence ?? \"explore\");\n writeJson(\n makeEnvelope({\n slug,\n idea,\n check,\n reference,\n ...(fromIdea ? { fromIdea } : {}),\n ...(conceptUnseeded ? { conceptUnseeded } : {}),\n viewer: opts.adset ? { adset: opts.adset } : { temperature },\n canvasPath: path.relative(root, String(scaffold.canvas_path ?? path.join(dir, `${slug}.canvas.json`))),\n scaffoldHints: Array.isArray(scaffold.hints) ? (scaffold.hints as string[]) : [],\n unsourcedCopy,\n }),\n );\n },\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/commands/creatives/make.ts"],"sourcesContent":["/**\n * `baker creatives make <idea>`: one idea becomes one creative. For a static it finds a reference\n * for the job itself (the idea's container, made for our viewer), keeps the first whose\n * load-bearing parts we can supply, scaffolds from it, and records the idea on the creative and\n * its message in the ad spec. The agent then writes only the copy lines and the scene, and runs it.\n */\n\nimport { mkdtemp, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport type { ScopedWinnersSearchResponse } from \"@baker/api/ad-library\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport type { ConceptCarry } from \"../../engine/scaffold/static-ad-spec.ts\";\nimport { readAdSpec, SPEC_SHAPES_HINT, unwrittenProblems } from \"../../engine/scaffold/static-ad-spec.ts\";\nimport { projectStaticBriefs } from \"../../engine/scaffold/static-render-briefs.ts\";\nimport { optionalChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { type ViewerTemperature, viewerFromKnowledge } from \"../../viewer-profile.ts\";\nimport { runBaker as baker } from \"../baker-child.ts\";\nimport { findWorkspaceRoot } from \"../canvas/normalize-paths.ts\";\nimport { liveViewerLookups } from \"../canvas/viewer-check.ts\";\nimport { conceptFromFit, type FitAnswer, type FitFailure, fitReference, NO_FIT_HINT } from \"../winning-ads/fit.ts\";\nimport { buildSearchBody } from \"../winning-ads/search.ts\";\nimport { checkIdeas, type EvidenceLevel, type Idea, type IdeaCheck, sourcesClaims } from \"./ideas-model.ts\";\nimport {\n coverageOf,\n IDEAS_DIR,\n readCreativeRecords,\n readIdeas,\n readInsights,\n readKnowledgeCorpus,\n readPersonaIds,\n} from \"./ideas-workspace.ts\";\nimport {\n definitionFieldsOf,\n fitsIdea,\n ideaSpec,\n isVideoIdea,\n missingElements,\n pooledCandidates,\n referenceSearchesFor,\n setDefinitionFields,\n setSpecMessage,\n unsourcedCopyLines,\n withFitConcept,\n} from \"./make-model.ts\";\nimport { makeSeriesAd, seriesMadeEnvelope } from \"./make-series.ts\";\n\n/** Candidates whose fit may be asked (a few cents each, cached per workspace). */\nconst FITS_TRIED = 6;\n/**\n * Fits asked at a time: the best-ranked candidate is usually kept, so the rest wait for a slot that\n * one not fitting frees (six at once billed six fits where one was kept).\n */\nconst FITS_AT_ONCE = 3;\nconst SEARCH_TIMEOUT_MS = 120_000;\n/**\n * How long make looks for, checks and describes a reference before it starts the ad from the idea.\n * Every ad starts from a proven one when it can: dev, Oct 2026, a search took 3-30 s, a fit 20-50 s\n * and the describe ~35 s beside them, so the 50 s this once was sent good references to the idea.\n */\nconst REFERENCE_MS = 150_000;\n\nconst DESCRIPTION = `Build one idea from src/creatives/_ideas/ into a creative. For a static it builds on a proven winning ad in the idea's container: it searches on the idea's message for our viewer, then the container's strongest winners from any category, checks which fit us, scaffolds the creative on the best-ranked one, records the idea on it and sets the ad's message. The fit says what made that ad win, so what ours carries of it (\\`reference.carry\\`: whole_ad, layout, hook or angle); its first hint names the ad: tell the person. When no proven ad fits, it starts the ad from the idea itself and says why (never a dead end, never retry with another format). You then write the copy lines and the scene in prompt.json and run it. Takes up to about two and a half minutes: run it in the foreground, once per idea.\n\nStart here, with an idea from \\`baker creatives ideas\\` build_next:\n baker creatives make phone-payroll # static: reference found and checked for you\n baker creatives make phone-payroll --adset 120210000000 # written for that ad set's viewer\n baker creatives make phone-payroll --reference 1310524137919413 # your own reference instead\n baker creatives make founder-story --spec beats.json # a video idea: from its beats spec\n baker creatives make phone-payroll --slug phone-payroll-h2 # another hook of the same idea\n baker creatives make tiktok-speed --series zernio-live # another message in the style of a ready ad\nThen: edit src/creatives/<slug>/prompt.json (copy + scene; the message is set), and \\`baker canvas run src/creatives/<slug>/<slug>.canvas.json\\`.`;\n\nconst ARGS = {\n idea: { type: \"positional\", required: true, description: \"The idea id (src/creatives/_ideas/<idea>.md)\" },\n slug: { type: \"string\", required: false, description: \"Creative slug (default: the idea id)\" },\n adset: { type: \"string\", required: false, description: \"Meta ad set the ad is for: its viewer and placements\" },\n reference: {\n type: \"string\",\n required: false,\n description: \"A library ad id to build on instead of searching (statics)\",\n },\n platform: {\n type: \"string\",\n required: false,\n description: \"Library platform of --reference: meta|linkedin|tiktok (default meta)\",\n },\n spec: {\n type: \"string\",\n required: false,\n description: \"Video ideas: the beats spec for `baker canvas scaffold-ad --spec`\",\n },\n series: {\n type: \"string\",\n required: false,\n description:\n \"Statics: make this idea as another ad of the series led by this creative (its slug): the same design, only its words changed. No reference is searched; seconds. The lead must have a ready version. Then write its words and run the whole series: baker canvas run --series <lead>\",\n },\n \"from-idea\": {\n type: \"boolean\",\n required: false,\n default: false,\n description:\n \"Statics: skip the reference search and start from the idea (what make does by itself when no proven ad fits)\",\n },\n} as const;\n\nregisterSchema({ command: \"creatives.make\", description: DESCRIPTION, args: ARGS });\n\ntype Failure = { code: string; message: string; fix?: string };\n\nfunction fail(error: Failure): never {\n writeJson({ ok: false, error });\n process.exit(1);\n}\n\nasync function viewerTemperature(\n root: string,\n adSet: string | undefined,\n awareness: string,\n): Promise<ViewerTemperature> {\n if (adSet) {\n const read = await liveViewerLookups(root)\n .adSetViewer(adSet)\n .catch(() => null);\n if (read) return read.temperature;\n }\n return viewerFromKnowledge({ personas: [], awareness: awareness as never }).temperature;\n}\n\ntype Picked = {\n adId: string;\n platform: \"meta\" | \"linkedin\" | \"tiktok\";\n advertiserId?: string;\n why: string;\n tried: number;\n /** The fit that kept it, with what made it win (`carry`); none for a reference chosen by hand. */\n fit?: FitAnswer;\n};\n\nconst asPlatform = (value: unknown): Picked[\"platform\"] =>\n value === \"linkedin\" || value === \"tiktok\" ? value : \"meta\";\n\ntype Candidate = { ad_id?: string | null; platform?: unknown; advertiser_id?: string | null };\ntype FitResult = Awaited<ReturnType<typeof fitReference>>;\n\n/** How references are found and checked; the live library and fit by default, injected in tests. */\nexport type ReferenceDeps = {\n search: (body: Record<string, unknown>) => Promise<Candidate[]>;\n fit: (platform: Picked[\"platform\"], adId: string) => Promise<FitResult>;\n};\n\nfunction liveReferenceDeps(root: string): ReferenceDeps {\n return {\n search: async (body) =>\n (\n await apiPost<ScopedWinnersSearchResponse>(\"/api/ad-library/winners/search\", body, {\n timeoutMs: SEARCH_TIMEOUT_MS,\n }).catch(() => null)\n )?.results ?? [],\n fit: (platform, adId) => fitReference(root, platform, adId),\n };\n}\n\n/** The candidates of every search, the better search's first; every search runs at once. */\nasync function findCandidates(searches: Record<string, unknown>[], deps: ReferenceDeps): Promise<Candidate[]> {\n const results = await Promise.all(searches.map((search) => deps.search(search).catch(() => [] as Candidate[])));\n return pooledCandidates(results, FITS_TRIED);\n}\n\n/**\n * Search the idea's container and keep the best-ranked reference whose load-bearing parts we can\n * supply. Three fits run at once (a few cents each): one after another, one make took 109 s.\n */\n/**\n * What building on a reference started before its fit was known left behind: `prepared` when the\n * reference kept is the one built on, `discarded` (to wait for before building over it) when not.\n */\ntype Speculated<T> = { prepared?: Promise<T>; discarded?: Promise<T> };\n\n/** The reference a build starts on, as `prepare` is handed it before its fit is known. */\nexport type ReferenceCandidate = Pick<Picked, \"adId\" | \"platform\" | \"advertiserId\">;\n\nconst candidateOf = (c: Candidate): ReferenceCandidate => ({\n adId: String(c.ad_id),\n platform: asPlatform(c.platform),\n ...(c.advertiser_id ? { advertiserId: c.advertiser_id } : {}),\n});\n\nexport async function pickReference<T = never>(\n root: string,\n searches: Record<string, unknown>[],\n deps: ReferenceDeps = liveReferenceDeps(root),\n /**\n * Building on the best-ranked reference, started while the fits are asked: it is usually the one\n * kept, and its scaffold (a 35 s describe) then no longer waits ~25 s for them (dev, Oct 2026).\n */\n prepare?: (candidate: ReferenceCandidate, signal: AbortSignal) => Promise<T>,\n /** Aborted when the time for a reference is out: no reference is kept, and the build started is stopped. */\n within?: AbortSignal,\n): Promise<(Picked & Speculated<T>) | (Failure & Speculated<T>)> {\n const out = whenAborted(within);\n const found = await Promise.race([findCandidates(searches, deps), out]);\n if (found === \"out\") return slowReference();\n const candidates = found.slice(0, FITS_TRIED);\n const first = candidates[0];\n // A build on a reference that is not kept is stopped, not waited for (dev: 50 s for nothing).\n const stop = new AbortController();\n const building = first && prepare ? prepare(candidateOf(first), stop.signal) : undefined;\n // A failed speculative build is never this pick's failure: the kept reference is built again.\n void building?.catch(() => undefined);\n // Three fits are asked at once, and one that does not fit asks the next; the best-ranked one that\n // fits is kept as soon as it and every better-ranked one have answered, never waiting on slower\n // fits below it. Once the pick is made, no further fit is asked.\n let settled = false;\n const asked: Promise<FitResult>[] = [];\n const askNext = () => {\n const index = asked.length;\n const candidate = candidates[index];\n if (settled || !candidate) return;\n asked.push(\n askFit(deps, candidate).then((fit) => {\n if (!(fit.ok && fitsIdea(fit.fit))) askNext();\n return fit;\n }),\n );\n };\n for (let slot = 0; slot < FITS_AT_ONCE; slot++) askNext();\n const kept = await Promise.race([firstFitting(candidates, asked), out]);\n settled = true;\n if (kept === \"out\") {\n stop.abort();\n return { ...slowReference(), ...(building ? { discarded: building } : {}) };\n }\n if (kept.index !== 0) stop.abort();\n const speculated = building ? (kept.index === 0 ? { prepared: building } : { discarded: building }) : {};\n return { ...kept.picked, ...speculated };\n}\n\n/**\n * One candidate's fit, a throw read as a fit not made: it is handled when asked, since the fits\n * below the one awaited can fail while it is awaited.\n */\nconst askFit = (deps: ReferenceDeps, c: Candidate): Promise<FitResult> =>\n Promise.resolve()\n .then(() => deps.fit(asPlatform(c.platform), String(c.ad_id)))\n .catch((e): FitResult => ({ ok: false, error: { code: \"UNAVAILABLE\", message: String(e), fix: \"\" } }));\n\n/** Resolves \"out\" once `signal` aborts (never without one). */\nconst whenAborted = (signal: AbortSignal | undefined) =>\n new Promise<\"out\">((resolve) => {\n if (signal?.aborted) resolve(\"out\");\n signal?.addEventListener(\"abort\", () => resolve(\"out\"), { once: true });\n });\n\n/** The best-ranked candidate whose fit keeps it, with its rank; else why none was kept (index -1). */\nasync function firstFitting(\n candidates: readonly Candidate[],\n fits: readonly Promise<FitResult>[],\n): Promise<{ picked: Picked | Failure; index: number }> {\n let unchecked: FitFailure | null = null;\n let checked = 0;\n const lacking: string[] = [];\n for (const [index, candidate] of candidates.entries()) {\n const fit = await fits[index];\n if (!fit) continue;\n if (!fit.ok) unchecked = fit.error;\n else checked += 1;\n if (fit.ok && !fitsIdea(fit.fit)) lacking.push(...missingElements(fit.fit));\n if (!(fit.ok && fitsIdea(fit.fit))) continue;\n const layers = fit.fit.why_it_wins;\n return {\n picked: {\n ...candidateOf(candidate),\n why: [layers.disguise, layers.trigger, layers.logic].filter(Boolean).join(\"; \"),\n tried: index + 1,\n fit: fit.fit,\n },\n index,\n };\n }\n return { picked: noReference(candidates.length, checked, unchecked, lacking), index: -1 };\n}\n\n/** What the rejected references won on that we lack, each once, at most three. Pure. */\nconst lackingText = (lacking: readonly string[]) => {\n const named = [...new Set(lacking.map((l) => l.trim()).filter(Boolean))].slice(0, 3);\n return named.length > 0 ? ` (they won on ${named.join(\", \")})` : \"\";\n};\n\nconst slowReference = (): Failure => ({\n code: \"REFERENCE_SLOW\",\n message: `Finding and checking a proven ad took longer than ${REFERENCE_MS / 1000} s.`,\n fix: \"Nothing to do: the ad starts from the idea. To build on a proven ad anyway, run make again (the checks already made are kept) or pass --reference <adId>.\",\n});\n\n/**\n * Why no reference was kept: none found, none fits (naming what the ones checked won on that we\n * lack), or the fit could not be checked. Pure.\n */\nexport function noReference(\n found: number,\n checked: number,\n unchecked: { message: string } | null,\n lacking: readonly string[] = [],\n): Failure {\n if (found > 0 && checked === 0 && unchecked) {\n return {\n code: \"FIT_UNAVAILABLE\",\n message: `Could not check whether the references fit (${unchecked.message})`,\n fix: \"Run make again in a moment. To build now, pass --reference <adId> with one you looked at yourself (`baker winning-ads search`).\",\n };\n }\n return {\n code: \"NO_REFERENCE_FITS\",\n message:\n found === 0\n ? \"The library has no proven ad in this idea's format.\"\n : `None of the ${found} proven ads checked in this format wins on something this company has${lackingText(lacking)}.`,\n fix: \"Nothing to do to go on: the ad starts from the idea. To build on a proven ad instead, pass --reference <adId> for one you looked at (`baker winning-ads search --format static --format-pattern <the idea's format>`). Do not stop the batch: build the other ideas.\",\n };\n}\n\n/**\n * Refused when the creative's ad is already written: building again would put the idea's\n * placeholders over it (dev, Oct 2026: a chat agent re-ran make on a re-formatted idea and lost the\n * ad it had shown). Nothing there, or a failed make's placeholders, lets the build go ahead. Pure.\n */\nexport function alreadyWritten(promptJson: unknown, slug: string): Failure | null {\n if (promptJson === null || promptJson === undefined) return null;\n try {\n if (unwrittenProblems(readAdSpec(promptJson)).length > 0) return null;\n } catch {\n // Unreadable is still someone's work: refuse rather than overwrite it.\n }\n return {\n code: \"ALREADY_MADE\",\n message: `\"${slug}\" is already made and its ad is written: building it again would replace that ad with placeholders.`,\n fix: `To change this ad, edit src/creatives/${slug}/prompt.json and run \\`baker canvas run\\` on it. For another ad of the same idea, run make again with --slug <new-slug>.`,\n };\n}\n\ntype MakeArgs = {\n slug?: string;\n adset?: string;\n reference?: string;\n platform?: string;\n spec?: string;\n /** The lead ad of the series this idea is made in (`--series`). */\n series?: string;\n fromIdea?: boolean;\n};\n\nconst flag = (value: unknown): string | undefined => (typeof value === \"string\" && value ? value : undefined);\n\n/** The idea, checked: refused when unreadable, missing, or with a problem `creatives ideas` names. */\nasync function loadIdea(root: string, ideaId: string) {\n const { ideas, unreadable } = await readIdeas(root);\n const bad = unreadable.find((u) => u.id === ideaId);\n if (bad) {\n fail({\n code: \"INVALID_IDEA\",\n message: bad.problems.join(\"; \"),\n fix: `Fix ${IDEAS_DIR}/${ideaId}.md, then run make again.`,\n });\n }\n const idea = ideas.find((i) => i.id === ideaId);\n if (!idea) {\n fail({\n code: \"NOT_FOUND\",\n message: `No idea \"${ideaId}\" in ${IDEAS_DIR}/.`,\n fix: `Ideas on file: ${ideas.map((i) => i.id).join(\", \") || \"none\"}. Write it there first.`,\n });\n }\n const [insights, knowledge, personas, creatives] = await Promise.all([\n readInsights(root),\n readKnowledgeCorpus(root),\n readPersonaIds(root),\n readCreativeRecords(root),\n ]);\n const check = checkIdeas({ ideas, insights, knowledge, personas, ...coverageOf(ideas, creatives) }).find(\n (c) => c.id === idea.id,\n );\n if (check && check.problems.length > 0) {\n fail({\n code: \"IDEA_HAS_PROBLEMS\",\n message: check.problems.join(\"; \"),\n fix: \"Fix the idea file and run `baker creatives ideas` again.\",\n });\n }\n return { idea, check };\n}\n\ntype Scaffolded = {\n scaffold: Record<string, unknown>;\n reference: Picked | null;\n fromIdea?: string;\n /** Why the kept reference's concept could not be seeded: the render does not see it yet. */\n conceptUnseeded?: string;\n};\n\n/** Scaffold the creative: a video from its beats, a static from a reference that fits. */\nasync function scaffoldIdea(\n root: string,\n idea: Idea,\n args: MakeArgs,\n slug: string,\n temperature: ViewerTemperature,\n): Promise<Scaffolded> {\n const viewerFlags = args.adset ? [\"--target-adset\", args.adset] : [\"--viewer-temperature\", temperature];\n if (isVideoIdea(idea)) {\n if (!args.spec) {\n fail({\n code: \"SPEC_REQUIRED\",\n message: `\"${idea.id}\" is a video idea (${idea.format}): it is built from its beats.`,\n fix: `Write the beats spec (one spoken line plus one shot each; references/video-flow.md), message first, then: baker creatives make ${idea.id} --spec <file>.`,\n });\n }\n return {\n scaffold: await baker([\"canvas\", \"scaffold-ad\", \"--spec\", args.spec, \"--slug\", slug, ...viewerFlags]),\n reference: null,\n };\n }\n return await scaffoldStatic(root, idea, args, slug, temperature, viewerFlags);\n}\n\n/** A static from a reference that fits, found within `REFERENCE_MS`; else from the idea itself. */\nasync function scaffoldStatic(\n root: string,\n idea: Idea,\n args: MakeArgs,\n slug: string,\n temperature: ViewerTemperature,\n viewerFlags: string[],\n): Promise<Scaffolded> {\n const onReference = (c: ReferenceCandidate, signal?: AbortSignal) =>\n baker(\n [\n \"canvas\",\n \"scaffold-static-ad\",\n \"--source-ad-id\",\n c.adId,\n \"--source-platform\",\n c.platform,\n ...(c.advertiserId ? [\"--source-advertiser-id\", c.advertiserId] : []),\n \"--slug\",\n slug,\n \"--title\",\n idea.message.slice(0, 120),\n ...viewerFlags,\n ],\n signal,\n );\n // Built on the best-ranked reference while the fits are asked, only into a new creative: a build\n // that is not kept is then removed whole, leaving nothing of that reference on the creative.\n const dir = path.join(root, \"src\", \"creatives\", slug);\n const fresh = !(await stat(dir).catch(() => null));\n // A reference found by make has its time: past it, the ad starts from the idea (`REFERENCE_MS`).\n const budget = AbortSignal.timeout(REFERENCE_MS);\n const reference = args.reference\n ? { adId: args.reference, platform: asPlatform(args.platform), why: \"chosen by hand\", tried: 0 }\n : args.fromIdea\n ? { code: \"FROM_IDEA\", message: \"Asked to start from the idea.\" }\n : await pickReference(\n root,\n referenceSearchesFor(idea, temperature).map(buildSearchBody),\n undefined,\n fresh ? (c, signal) => onReference(c, AbortSignal.any([signal, budget])) : undefined,\n budget,\n );\n if (\"discarded\" in reference && reference.discarded) {\n await reference.discarded.catch(() => undefined);\n await rm(dir, { recursive: true, force: true });\n }\n if (\"code\" in reference) {\n return { scaffold: await scaffoldFromIdea(idea, slug, viewerFlags), reference: null, fromIdea: reference.message };\n }\n const prepared = \"prepared\" in reference ? await reference.prepared?.catch(() => null) : null;\n if (prepared?.ok !== true && budget.aborted && !args.reference) {\n await rm(dir, { recursive: true, force: true });\n const slow = slowReference().message;\n return { scaffold: await scaffoldFromIdea(idea, slug, viewerFlags), reference: null, fromIdea: slow };\n }\n const scaffold = prepared?.ok === true ? prepared : await onReference(reference);\n const unbuilt = unbuiltReference(scaffold, { adId: reference.adId, byHand: Boolean(args.reference) });\n if (!unbuilt) return await withKeptConcept(dir, slug, scaffold, reference);\n // What the failed build left of a new creative goes, so the idea's build starts clean.\n if (fresh) await rm(dir, { recursive: true, force: true });\n return { scaffold: await scaffoldFromIdea(idea, slug, viewerFlags), reference: null, fromIdea: unbuilt };\n}\n\n/**\n * Why the ad starts from the idea when the proven ad make picked could not be built on (its picture\n * not described, dev Oct 2026: twice running for one ad), else null: a build that went through, or a\n * reference chosen by hand, whose failure is the agent's to see. Pure.\n */\nexport function unbuiltReference(\n scaffold: Record<string, unknown>,\n reference: { adId: string; byHand: boolean },\n): string | null {\n if (scaffold.ok === true || reference.byHand) return null;\n return `The proven ad ${reference.adId} could not be read to build on.`;\n}\n\n/** The creative built on a reference, its fit's concept seeded, else why it could not be. */\nasync function withKeptConcept(\n dir: string,\n slug: string,\n scaffold: Record<string, unknown>,\n reference: Picked,\n): Promise<Scaffolded> {\n if (scaffold.ok !== true || !reference.fit) return { scaffold, reference };\n const unseeded = await seedConcept(dir, slug, conceptFromFit(reference.fit, reference.adId));\n return { scaffold, reference, ...(unseeded ? { conceptUnseeded: unseeded } : {}) };\n}\n\n/**\n * Seed the kept reference's concept into a creative built before its fit answered, and compile the\n * canvas from it: the render then sees the reference at the level that won (`concept.carry`).\n * Dev, Oct 2026: every build started on the best-ranked reference had no concept. Why it could not\n * be seeded, else null.\n */\nexport async function seedConcept(dir: string, slug: string, seeded: Record<string, unknown>): Promise<string | null> {\n const promptPath = path.join(dir, \"prompt.json\");\n const canvasPath = path.join(dir, `${slug}.canvas.json`);\n let prompt: string;\n try {\n prompt = withFitConcept(await readFile(promptPath, \"utf8\"), seeded);\n await writeFile(promptPath, prompt, \"utf8\");\n } catch (e) {\n return `prompt.json could not take the proven ad's concept (${e instanceof Error ? e.message : String(e)})`;\n }\n try {\n const canvas: unknown = JSON.parse(await readFile(canvasPath, \"utf8\"));\n if (projectStaticBriefs(canvas, JSON.parse(prompt)) > 0) {\n await writeFile(canvasPath, `${JSON.stringify(canvas, null, 2)}\\n`, \"utf8\");\n }\n } catch {\n // prompt.json holds the concept: the run compiles the canvas from it.\n }\n return null;\n}\n\n/** The static started from the idea's own spec: no reference picture, nothing described or billed. */\nasync function scaffoldFromIdea(idea: Idea, slug: string, viewerFlags: string[]): Promise<Record<string, unknown>> {\n const dir = await mkdtemp(path.join(tmpdir(), \"idea-spec-\"));\n const specPath = path.join(dir, \"prompt.json\");\n await writeFile(specPath, JSON.stringify(ideaSpec(idea, idea.who.replace(/[-_]/g, \" \")), null, 2), \"utf8\");\n try {\n return await baker([\n \"canvas\",\n \"scaffold-static-ad\",\n \"--spec\",\n specPath,\n \"--slug\",\n slug,\n \"--title\",\n idea.message.slice(0, 120),\n ...viewerFlags,\n ]);\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n}\n\n/** Record the idea on the creative and its message as the ad's one message; mark the idea built. */\nasync function recordIdea(\n root: string,\n slug: string,\n idea: Idea,\n evidence: EvidenceLevel | \"explore\",\n): Promise<{ dir: string; unsourcedCopy: string[] }> {\n const dir = path.join(root, \"src\", \"creatives\", slug);\n const definitionPath = path.join(dir, \"_definition.md\");\n const definition = await readFile(definitionPath, \"utf8\").catch(() => null);\n if (definition !== null) {\n await writeFile(definitionPath, setDefinitionFields(definition, { ...definitionFieldsOf(idea, evidence) }), \"utf8\");\n }\n const promptPath = path.join(dir, \"prompt.json\");\n const prompt = isVideoIdea(idea) ? null : await readFile(promptPath, \"utf8\").catch(() => null);\n // A spec that does not parse is the scaffold's to report; the message is set by hand then.\n if (prompt !== null) await writeFile(promptPath, setSpecMessage(prompt, idea.message), \"utf8\").catch(() => undefined);\n const unsourcedCopy = prompt === null ? [] : await draftedClaims(root, prompt);\n if (idea.status === \"idea\") {\n const ideaPath = path.join(root, IDEAS_DIR, `${idea.id}.md`);\n await writeFile(ideaPath, setDefinitionFields(await readFile(ideaPath, \"utf8\"), { status: \"built\" }), \"utf8\");\n }\n // The dashboard learns the idea now, not at Publish (where most verdicts are given already).\n await baker([\"canvas\", \"sync-definition\", dir]);\n return { dir, unsourcedCopy };\n}\n\n/** The drafted lines claiming what neither the Knowledge nor our own customers said. */\nasync function draftedClaims(root: string, prompt: string): Promise<string[]> {\n const [knowledge, insights] = await Promise.all([readKnowledgeCorpus(root), readInsights(root)]);\n const own = insights.filter(sourcesClaims).map((i) => i.quote);\n try {\n return unsourcedCopyLines(prompt, `${knowledge}\\n${own.join(\"\\n\")}`);\n } catch {\n return [];\n }\n}\n\nfunction makeArgsOf(args: Record<string, unknown>): MakeArgs {\n const opts: MakeArgs = {};\n for (const key of [\"slug\", \"adset\", \"reference\", \"platform\", \"spec\", \"series\"] as const) {\n const value = flag(args[key]);\n if (value) opts[key] = value;\n }\n if (args[\"from-idea\"] === true) opts.fromIdea = true;\n return opts;\n}\n\nfunction scaffoldFailure(scaffold: Record<string, unknown>): Failure {\n const error = (scaffold.error ?? {}) as Partial<Failure>;\n return {\n code: error.code ?? \"SCAFFOLD_FAILED\",\n message: error.message ?? \"The creative could not be scaffolded.\",\n ...(error.fix ? { fix: error.fix } : {}),\n };\n}\n\ntype Made = {\n slug: string;\n idea: Idea;\n check: IdeaCheck | undefined;\n reference: Picked | null;\n /** Why the static starts from the idea itself: no proven ad fits (or `--from-idea`). */\n fromIdea?: string;\n conceptUnseeded?: string;\n viewer: { adset: string } | { temperature: ViewerTemperature };\n canvasPath: string;\n scaffoldHints: string[];\n /** Drafted copy lines claiming a figure the company never wrote (often the reference's own promise). */\n unsourcedCopy: string[];\n};\n\nconst CARRY_WORDS: Record<ConceptCarry, string> = {\n whole_ad: \"the whole ad (its disguise, layout and hook)\",\n layout: \"its layout\",\n hook: \"its hook\",\n angle: \"its angle\",\n};\n\n/** What the agent tells the person about the proven ad a creative is built on. Pure. */\nfunction builtOnHint(reference: Picked): string {\n const tell = \"Tell the person which proven ad this builds on\";\n const ours = \"the words, brand, people and claims stay ours.\";\n if (!reference.fit) {\n // Chosen by hand: no fit read what made it win, so nothing is said of it.\n return `Built on proven ad ${reference.adId}, the one chosen for it; no check read what made it win. The canvas shows that ad as \\`original\\`. ${tell}; ${ours}`;\n }\n const carried = CARRY_WORDS[reference.fit.carry ?? \"whole_ad\"];\n const why = reference.fit.carry_why ? ` (${reference.fit.carry_why})` : \"\";\n const won = reference.why ? ` It won on: ${reference.why}.` : \"\";\n return `Built on proven ad ${reference.adId}: it carries ${carried}${why}.${won} The canvas shows that ad as \\`original\\`. ${tell} and what it takes from it; ${ours}`;\n}\n\n/** The fix for a concept make could not seed: the fit already made, written in by hand. Pure. */\nconst unseededHint = (reference: Picked, slug: string, why: string) =>\n `${why}, so the render does not see proven ad ${reference.adId} yet. \\`baker winning-ads fit ${reference.adId} --platform ${reference.platform} --full\\` prints the check already made (free): write its \\`read\\` into src/creatives/${slug}/prompt.json as \\`concept\\`, with \\`reference_ad_id: \"${reference.adId}\"\\`.`;\n\n/** What `make` prints: the creative, the idea it carries, and the two steps left to the agent. Pure. */\nexport function makeEnvelope(made: Made) {\n const quote = made.check?.quote;\n return {\n ok: true as const,\n data: {\n creative: made.slug,\n idea: made.idea.id,\n message: made.idea.message,\n evidence: made.check?.evidence ?? \"explore\",\n ...(quote ? { customer_quote: quote } : {}),\n ...(made.fromIdea ? { built_from: \"idea\" } : {}),\n ...(made.reference\n ? {\n reference: {\n ad_id: made.reference.adId,\n platform: made.reference.platform,\n why_it_wins: made.reference.why,\n ...(made.reference.fit?.carry ? { carry: made.reference.fit.carry } : {}),\n },\n }\n : {}),\n viewer: made.viewer,\n canvas_path: made.canvasPath,\n },\n hints: [\n ...(made.reference ? [builtOnHint(made.reference)] : []),\n ...(made.reference && made.conceptUnseeded\n ? [unseededHint(made.reference, made.slug, made.conceptUnseeded)]\n : []),\n ...(made.fromIdea\n ? [\n `${made.fromIdea} So this ad starts from the idea: write the scene and every line of copy in src/creatives/${made.slug}/prompt.json (a placeholder refuses to run). Tell the person this ad is not built on a proven ad, and why, in plain words.`,\n ]\n : []),\n ...(made.unsourcedCopy.length > 0\n ? [\n `Rewrite before running: ${made.unsourcedCopy.map((l) => JSON.stringify(l)).join(\", \")} claim a figure nothing the company wrote holds (the reference's promise, not ours).`,\n ]\n : []),\n `Write the copy lines and the scene in src/creatives/${made.slug}/prompt.json${made.reference ? \": the drafted lines are the reference's, so keep one only if the Knowledge says it (badges, ratings and guarantees too)\" : \"\"}. Say the message in the customer's words${quote ? ` (\"${quote.slice(0, 80)}\")` : \"\"}; keep \\`message\\` as it is.`,\n SPEC_SHAPES_HINT,\n `Then: baker canvas run ${made.canvasPath} (it validates and asks the viewer itself: nothing to run before it).`,\n // The scaffold's own next steps name a separate validate; the run does it (dev, Oct 2026: five validates before one run).\n ...made.scaffoldHints\n .filter((h) => !/canvas (?:validate|viewer-check)/.test(h))\n // make checked the reference and seeded its concept: the scaffold ran before the fit answered.\n .filter((h) => !(made.reference?.fit && h.startsWith(NO_FIT_HINT)))\n .slice(0, 4),\n ],\n };\n}\n\n/** `--series <lead>`: the idea made as another ad of the lead's series, printed or refused. */\nasync function makeInSeries(\n root: string,\n idea: Idea,\n slug: string,\n lead: string,\n evidence: EvidenceLevel | \"explore\",\n): Promise<void> {\n if (isVideoIdea(idea)) {\n fail({\n code: \"SERIES_STATIC_ONLY\",\n message: `\"${idea.id}\" is a video idea: a series repeats one static ad with other words.`,\n fix: `Make it on its own: baker creatives make ${idea.id} --spec <beats file>.`,\n });\n }\n const made = await makeSeriesAd(root, idea, slug, lead, evidence, {\n sync: (dir) => baker([\"canvas\", \"sync-definition\", dir, \"--title\"]),\n chatId: optionalChatId() ?? null,\n });\n if (\"code\" in made) fail(made);\n writeJson(seriesMadeEnvelope({ ...made, canvasPath: path.relative(root, made.canvasPath) }, idea));\n}\n\nexport const makeCommand = defineCommand({\n meta: { name: \"make\", description: DESCRIPTION },\n args: ARGS,\n async run({ args }) {\n const root = findWorkspaceRoot(process.cwd()) ?? process.cwd();\n const opts = makeArgsOf(args);\n const { idea, check } = await loadIdea(root, String(args.idea));\n const slug = opts.slug ?? idea.id;\n const written = await readFile(path.join(root, \"src\", \"creatives\", slug, \"prompt.json\"), \"utf8\").then(\n (text): unknown => {\n try {\n return JSON.parse(text);\n } catch {\n return {};\n }\n },\n (err: NodeJS.ErrnoException) => (err.code === \"ENOENT\" ? null : {}),\n );\n const refused = alreadyWritten(written, slug);\n if (refused) fail(refused);\n if (opts.series) {\n await makeInSeries(root, idea, slug, opts.series, check?.evidence ?? \"explore\");\n return;\n }\n const temperature = await viewerTemperature(root, opts.adset, idea.awareness);\n const { scaffold, reference, fromIdea, conceptUnseeded } = await scaffoldIdea(root, idea, opts, slug, temperature);\n if (scaffold.ok !== true) fail(scaffoldFailure(scaffold));\n const { dir, unsourcedCopy } = await recordIdea(root, slug, idea, check?.evidence ?? \"explore\");\n writeJson(\n makeEnvelope({\n slug,\n idea,\n check,\n reference,\n ...(fromIdea ? { fromIdea } : {}),\n ...(conceptUnseeded ? { conceptUnseeded } : {}),\n viewer: opts.adset ? { adset: opts.adset } : { temperature },\n canvasPath: path.relative(root, String(scaffold.canvas_path ?? path.join(dir, `${slug}.canvas.json`))),\n scaffoldHints: Array.isArray(scaffold.hints) ? (scaffold.hints as string[]) : [],\n unsourcedCopy,\n }),\n );\n },\n});\n"],"mappings":"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","names":[]}