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

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 +10 -11
  2. package/dist/{account-XQXC7BR6.js → account-AL2ZDSR7.js} +4 -5
  3. package/dist/{account-XQXC7BR6.js.map → account-AL2ZDSR7.js.map} +1 -1
  4. package/dist/{accounts-722UY53A.js → accounts-HAFCLSR5.js} +3 -4
  5. package/dist/{accounts-722UY53A.js.map → accounts-HAFCLSR5.js.map} +1 -1
  6. package/dist/{accounts-E67BMK7T.js → accounts-O5MFO3QQ.js} +5 -6
  7. package/dist/{accounts-E67BMK7T.js.map → accounts-O5MFO3QQ.js.map} +1 -1
  8. package/dist/{actions-6TQMSVWD.js → actions-P35MEMGN.js} +18 -18
  9. package/dist/{add-2BEGRHUX.js → add-5GAN6CVO.js} +5 -28
  10. package/dist/add-5GAN6CVO.js.map +1 -0
  11. package/dist/{add-LEMKEOPO.js → add-6DTC6X5G.js} +2 -3
  12. package/dist/{add-LEMKEOPO.js.map → add-6DTC6X5G.js.map} +1 -1
  13. package/dist/{ads-AGYCVD62.js → ads-73PGA4YC.js} +4 -4
  14. package/dist/{advertisers-2VQKAYKG.js → advertisers-AE75CGVE.js} +3 -4
  15. package/dist/{advertisers-2VQKAYKG.js.map → advertisers-AE75CGVE.js.map} +1 -1
  16. package/dist/{analytics-IFELDWLL.js → analytics-FKCXIMPO.js} +20 -24
  17. package/dist/analytics-FKCXIMPO.js.map +1 -0
  18. package/dist/{analytics-OH5QEH7F.js → analytics-FPWQQGRM.js} +3 -4
  19. package/dist/{analytics-OH5QEH7F.js.map → analytics-FPWQQGRM.js.map} +1 -1
  20. package/dist/{assign-PTUJUCEL.js → assign-ABN2AQ4J.js} +3 -4
  21. package/dist/{assign-PTUJUCEL.js.map → assign-ABN2AQ4J.js.map} +1 -1
  22. package/dist/{audience-size-LRI6GJRT.js → audience-size-GNBJY35X.js} +3 -4
  23. package/dist/{audience-size-LRI6GJRT.js.map → audience-size-GNBJY35X.js.map} +1 -1
  24. package/dist/{audit-HWP7OPB7.js → audit-3VS63TBW.js} +3 -4
  25. package/dist/{audit-HWP7OPB7.js.map → audit-3VS63TBW.js.map} +1 -1
  26. package/dist/{autocomplete-J6DHU6MR.js → autocomplete-VS3XG3B7.js} +3 -4
  27. package/dist/{autocomplete-J6DHU6MR.js.map → autocomplete-VS3XG3B7.js.map} +1 -1
  28. package/dist/{avatars-467OSBD6.js → avatars-EKCKHCC3.js} +4 -4
  29. package/dist/{bid-pricing-EO5WLHGV.js → bid-pricing-Q72B65AY.js} +3 -4
  30. package/dist/{bid-pricing-EO5WLHGV.js.map → bid-pricing-Q72B65AY.js.map} +1 -1
  31. package/dist/{brand-YRTEPGBK.js → brand-C6PFGGQN.js} +2 -2
  32. package/dist/{brief-OSFJ2V7F.js → brief-YFJHQ5VQ.js} +7 -8
  33. package/dist/{brief-OSFJ2V7F.js.map → brief-YFJHQ5VQ.js.map} +1 -1
  34. package/dist/{campaign-groups-PQ6KSQJR.js → campaign-groups-KFFYQPU3.js} +8 -9
  35. package/dist/{campaign-groups-PQ6KSQJR.js.map → campaign-groups-KFFYQPU3.js.map} +1 -1
  36. package/dist/{campaign-writes-5OVLUD5E.js → campaign-writes-FHOS5XZY.js} +3 -4
  37. package/dist/{campaign-writes-5OVLUD5E.js.map → campaign-writes-FHOS5XZY.js.map} +1 -1
  38. package/dist/{campaigns-6T3NSUT2.js → campaigns-2NHWBF5C.js} +11 -12
  39. package/dist/{campaigns-6T3NSUT2.js.map → campaigns-2NHWBF5C.js.map} +1 -1
  40. package/dist/{campaigns-OYMXDGWX.js → campaigns-KZYZTXDS.js} +5 -5
  41. package/dist/{canvas-YQFG52IG.js → canvas-5NB27FX2.js} +13 -13
  42. package/dist/{capabilities-PXBKUN2G.js → capabilities-DJFTRJKS.js} +3 -4
  43. package/dist/{capabilities-PXBKUN2G.js.map → capabilities-DJFTRJKS.js.map} +1 -1
  44. package/dist/{catalog-XLXIM7IW.js → catalog-VSSY6FGI.js} +4 -4
  45. package/dist/{chats-UK47UE7C.js → chats-D2CSDX5Q.js} +3 -4
  46. package/dist/{chats-UK47UE7C.js.map → chats-D2CSDX5Q.js.map} +1 -1
  47. package/dist/{chunk-5ZNTADVR.js → chunk-3G3ZDLMI.js} +2 -2
  48. package/dist/{chunk-SJYEY5MV.js → chunk-3HJLHTWP.js} +3 -12
  49. package/dist/{chunk-SJYEY5MV.js.map → chunk-3HJLHTWP.js.map} +1 -1
  50. package/dist/{chunk-ZDMTXQ2Q.js → chunk-3IBYKLXR.js} +2 -2
  51. package/dist/{chunk-CWYAELVG.js → chunk-464O4MT2.js} +2 -2
  52. package/dist/{chunk-NA63BH7V.js → chunk-4AUMTNVB.js} +3 -3
  53. package/dist/{chunk-NDEE6G2J.js → chunk-4BQXAE7Z.js} +2 -2
  54. package/dist/{chunk-2AOE2MZQ.js → chunk-5ZDLTE5T.js} +3 -3
  55. package/dist/{chunk-ULG4QRTV.js → chunk-6NB47MRW.js} +2 -2
  56. package/dist/{chunk-24EB7EDR.js → chunk-7YCRFMXF.js} +3 -3
  57. package/dist/{chunk-WGUQHAJY.js → chunk-A4LOJ2VD.js} +2 -2
  58. package/dist/{chunk-6F7DVPOS.js → chunk-AEOSAVVL.js} +3 -3
  59. package/dist/{chunk-MACCF4JZ.js → chunk-CMPEUZOR.js} +22 -16
  60. package/dist/{chunk-MACCF4JZ.js.map → chunk-CMPEUZOR.js.map} +1 -1
  61. package/dist/{chunk-N4LAYIIN.js → chunk-CSYSX4D2.js} +2 -2
  62. package/dist/{chunk-RX2DKU3W.js → chunk-DGUNI37S.js} +2 -2
  63. package/dist/{chunk-QE7W555R.js → chunk-DWHIOO7E.js} +12 -163
  64. package/dist/chunk-DWHIOO7E.js.map +1 -0
  65. package/dist/{chunk-FPOGPFAG.js → chunk-EBWBG6YV.js} +51 -24
  66. package/dist/chunk-EBWBG6YV.js.map +1 -0
  67. package/dist/{chunk-NYIGXDUG.js → chunk-EDLZGTGN.js} +39 -1
  68. package/dist/chunk-EDLZGTGN.js.map +1 -0
  69. package/dist/{chunk-I3ZR655O.js → chunk-IR6D7K4H.js} +2 -2
  70. package/dist/{chunk-FUHN4MFY.js → chunk-JQJDXPCO.js} +2 -2
  71. package/dist/{chunk-7CTMH5AK.js → chunk-KAUOHQTF.js} +3 -3
  72. package/dist/{chunk-VYQ3QJ3C.js → chunk-KHRXPQID.js} +2 -2
  73. package/dist/{chunk-6Y7ZBENQ.js → chunk-LECGCWT5.js} +6 -6
  74. package/dist/{chunk-5WCSKQ7Z.js → chunk-LZ73CZGP.js} +6 -6
  75. package/dist/{chunk-R25YLW6H.js → chunk-MELOSESI.js} +2 -2
  76. package/dist/{chunk-DCRPXOJJ.js → chunk-MXYBTMKB.js} +2 -2
  77. package/dist/{chunk-54C6YDGJ.js → chunk-NPY4QUMQ.js} +2 -2
  78. package/dist/{chunk-LYQJ4PZW.js → chunk-OQ6663F4.js} +5 -5
  79. package/dist/{chunk-H3427GPU.js → chunk-OZRUJVIQ.js} +2 -2
  80. package/dist/{chunk-KMKEYI37.js → chunk-Q2V6E6SL.js} +3 -3
  81. package/dist/{chunk-VL43TNIP.js → chunk-QRP3PXWN.js} +2 -2
  82. package/dist/{chunk-HDLYPC6K.js → chunk-RPUSTYHL.js} +3 -5
  83. package/dist/{chunk-HDLYPC6K.js.map → chunk-RPUSTYHL.js.map} +1 -1
  84. package/dist/{chunk-C46GUI2S.js → chunk-RZBEK2VE.js} +2 -2
  85. package/dist/{chunk-2VPBIT65.js → chunk-S3A3YOKO.js} +8 -8
  86. package/dist/{chunk-FYGR3I2A.js → chunk-S77PZVYM.js} +3 -3
  87. package/dist/{chunk-VLMBTPXU.js → chunk-SHL7LOC3.js} +3 -3
  88. package/dist/{chunk-HR6IWNKE.js → chunk-SSJK7FEV.js} +1140 -1196
  89. package/dist/chunk-SSJK7FEV.js.map +1 -0
  90. package/dist/{chunk-KS2QY6MK.js → chunk-W3ZHJJVT.js} +4 -4
  91. package/dist/{chunk-7EPXVICM.js → chunk-XF4JUKVF.js} +5 -38
  92. package/dist/chunk-XF4JUKVF.js.map +1 -0
  93. package/dist/{chunk-RL5CP7N6.js → chunk-Y6O7EWYY.js} +5 -5
  94. package/dist/{chunk-6NY2GPR4.js → chunk-Y6ZQXUZ7.js} +3 -3
  95. package/dist/{chunk-HROZYQ5H.js → chunk-YRQYA2LR.js} +5 -63
  96. package/dist/chunk-YRQYA2LR.js.map +1 -0
  97. package/dist/{chunk-ASI4P6X2.js → chunk-YUCLMOEG.js} +6 -6
  98. package/dist/chunk-YUCLMOEG.js.map +1 -0
  99. package/dist/{chunk-WKQG6TER.js → chunk-ZEYEWPK6.js} +2 -2
  100. package/dist/{claim-W6G6VEG5.js → claim-FZ5OQLMU.js} +3 -4
  101. package/dist/{claim-W6G6VEG5.js.map → claim-FZ5OQLMU.js.map} +1 -1
  102. package/dist/cli.js +30 -30
  103. package/dist/{companies-TS6KBATJ.js → companies-DNI634RC.js} +3 -4
  104. package/dist/{companies-TS6KBATJ.js.map → companies-DNI634RC.js.map} +1 -1
  105. package/dist/{complete-LYR2HMQU.js → complete-2FZMGJV5.js} +3 -4
  106. package/dist/{complete-LYR2HMQU.js.map → complete-2FZMGJV5.js.map} +1 -1
  107. package/dist/{connect-FCXNVTXG.js → connect-QCOGEPP4.js} +6 -13
  108. package/dist/{conversation-6ZJGPCXM.js → conversation-6IOGV7B7.js} +3 -4
  109. package/dist/{conversation-6ZJGPCXM.js.map → conversation-6IOGV7B7.js.map} +1 -1
  110. package/dist/{conversions-UHB55MMQ.js → conversions-4SRZPBBX.js} +7 -8
  111. package/dist/{conversions-UHB55MMQ.js.map → conversions-4SRZPBBX.js.map} +1 -1
  112. package/dist/{create-EX6OWLNM.js → create-BJNMO6HT.js} +2 -3
  113. package/dist/{create-EX6OWLNM.js.map → create-BJNMO6HT.js.map} +1 -1
  114. package/dist/{create-JFSK4BOP.js → create-FX4OJ2XF.js} +3 -4
  115. package/dist/{create-JFSK4BOP.js.map → create-FX4OJ2XF.js.map} +1 -1
  116. package/dist/{create-JCA7JPLP.js → create-RM7HV77Y.js} +3 -4
  117. package/dist/{create-JCA7JPLP.js.map → create-RM7HV77Y.js.map} +1 -1
  118. package/dist/{create-WU22YYU2.js → create-VXM34ZWH.js} +3 -4
  119. package/dist/{create-WU22YYU2.js.map → create-VXM34ZWH.js.map} +1 -1
  120. package/dist/{creatives-FXUQ5WSD.js → creatives-B5NTXPUB.js} +10 -10
  121. package/dist/{creatives-KGXUOYPE.js → creatives-JSWBFQ5R.js} +8 -9
  122. package/dist/{creatives-KGXUOYPE.js.map → creatives-JSWBFQ5R.js.map} +1 -1
  123. package/dist/{credentials-MJC7PGKR.js → credentials-C33K6XCJ.js} +3 -4
  124. package/dist/{credentials-MJC7PGKR.js.map → credentials-C33K6XCJ.js.map} +1 -1
  125. package/dist/{critique-GS5VV5ZC.js → critique-4V5SKH7C.js} +6 -7
  126. package/dist/{critique-GS5VV5ZC.js.map → critique-4V5SKH7C.js.map} +1 -1
  127. package/dist/{critique-TPHR27KH.js → critique-ZS4ON3SU.js} +3 -4
  128. package/dist/{critique-TPHR27KH.js.map → critique-ZS4ON3SU.js.map} +1 -1
  129. package/dist/{crm-VK44O3ED.js → crm-52ROSWH5.js} +4 -5
  130. package/dist/{crm-VK44O3ED.js.map → crm-52ROSWH5.js.map} +1 -1
  131. package/dist/{crm-AVCM5D4G.js → crm-R5IXIFIV.js} +4 -5
  132. package/dist/{crm-AVCM5D4G.js.map → crm-R5IXIFIV.js.map} +1 -1
  133. package/dist/{customers-XH2DMTFH.js → customers-A36LOZOB.js} +5 -6
  134. package/dist/{delete-WI5E3DR3.js → delete-AIGE4Y4H.js} +3 -4
  135. package/dist/{delete-WI5E3DR3.js.map → delete-AIGE4Y4H.js.map} +1 -1
  136. package/dist/{delete-KRH2YMSZ.js → delete-HGHXY24R.js} +3 -4
  137. package/dist/{delete-KRH2YMSZ.js.map → delete-HGHXY24R.js.map} +1 -1
  138. package/dist/{delete-E3R3TKIL.js → delete-M2GDLPYN.js} +2 -3
  139. package/dist/{delete-E3R3TKIL.js.map → delete-M2GDLPYN.js.map} +1 -1
  140. package/dist/{demographics-XV5PBA77.js → demographics-NTWB2IMG.js} +3 -4
  141. package/dist/{demographics-XV5PBA77.js.map → demographics-NTWB2IMG.js.map} +1 -1
  142. package/dist/{discard-HTQUUHJR.js → discard-2WWQG6OU.js} +3 -4
  143. package/dist/{discard-HTQUUHJR.js.map → discard-2WWQG6OU.js.map} +1 -1
  144. package/dist/{domain-RECGZXJB.js → domain-Y2LT6JLT.js} +3 -4
  145. package/dist/{domain-RECGZXJB.js.map → domain-Y2LT6JLT.js.map} +1 -1
  146. package/dist/{draft-Q546QPPU.js → draft-EJXNNJ3Y.js} +4 -5
  147. package/dist/{draft-Q546QPPU.js.map → draft-EJXNNJ3Y.js.map} +1 -1
  148. package/dist/{draft-PVTX6QT6.js → draft-FJ7WHIXW.js} +3 -4
  149. package/dist/{draft-PVTX6QT6.js.map → draft-FJ7WHIXW.js.map} +1 -1
  150. package/dist/{draft-2IBSJEKC.js → draft-SLHAKJ2A.js} +3 -4
  151. package/dist/{draft-2IBSJEKC.js.map → draft-SLHAKJ2A.js.map} +1 -1
  152. package/dist/engine/index.js +3 -3
  153. package/dist/{facets-7EVPJMKS.js → facets-U7AQC4H6.js} +3 -4
  154. package/dist/{facets-7EVPJMKS.js.map → facets-U7AQC4H6.js.map} +1 -1
  155. package/dist/{feedback-EIZKS4JU.js → feedback-OLTCHE6C.js} +2 -2
  156. package/dist/{feedback-record-TKO54BOE.js → feedback-record-7WZ4H7EP.js} +8 -9
  157. package/dist/{feedback-record-TKO54BOE.js.map → feedback-record-7WZ4H7EP.js.map} +1 -1
  158. package/dist/{fetch-4BY6HYUM.js → fetch-W7NULDEO.js} +3 -4
  159. package/dist/{fetch-4BY6HYUM.js.map → fetch-W7NULDEO.js.map} +1 -1
  160. package/dist/{find-FRRHAPWX.js → find-OTDIX6V4.js} +4 -4
  161. package/dist/{flows-KTFAML22.js → flows-KABCBS3S.js} +17 -21
  162. package/dist/flows-KABCBS3S.js.map +1 -0
  163. package/dist/{fonts-MXR3ZKDX.js → fonts-EMMX3KII.js} +5 -6
  164. package/dist/{forecast-3QTJYVND.js → forecast-GNODEIIC.js} +3 -4
  165. package/dist/{forecast-3QTJYVND.js.map → forecast-GNODEIIC.js.map} +1 -1
  166. package/dist/{funnel-I6XIAEHG.js → funnel-AAX27NH4.js} +455 -11
  167. package/dist/funnel-AAX27NH4.js.map +1 -0
  168. package/dist/{ga4-DV2AXCSL.js → ga4-UDQ2HA2J.js} +1 -1
  169. package/dist/{get-5PKNKJ5S.js → get-QEYJRLV3.js} +4 -7
  170. package/dist/get-QEYJRLV3.js.map +1 -0
  171. package/dist/{get-72YPHJGV.js → get-RTVUZM6E.js} +3 -4
  172. package/dist/{get-72YPHJGV.js.map → get-RTVUZM6E.js.map} +1 -1
  173. package/dist/{google-QYYYSSXI.js → google-KTO3PLEU.js} +5 -5
  174. package/dist/{google-6OGZX47I.js → google-M7KEXVK5.js} +2 -2
  175. package/dist/{google-ads-QGMQKZQD.js → google-ads-OK6IG3UV.js} +3 -4
  176. package/dist/{google-ads-QGMQKZQD.js.map → google-ads-OK6IG3UV.js.map} +1 -1
  177. package/dist/{gsc-TAKOF7J5.js → gsc-P3QYGDV2.js} +1 -1
  178. package/dist/{history-6AVQX2OQ.js → history-PQUJKK26.js} +3 -4
  179. package/dist/{history-6AVQX2OQ.js.map → history-PQUJKK26.js.map} +1 -1
  180. package/dist/{hubspot-SVEMFK5S.js → hubspot-Y77VLY6Y.js} +8 -9
  181. package/dist/{hubspot-SVEMFK5S.js.map → hubspot-Y77VLY6Y.js.map} +1 -1
  182. package/dist/{icon-L4RSS6PZ.js → icon-I43F77FV.js} +4 -4
  183. package/dist/{ideas-NFOW3HKJ.js → ideas-MIDU7YOA.js} +2 -3
  184. package/dist/{images-2EFFUNNV.js → images-S254MS6O.js} +9 -9
  185. package/dist/{ingest-2SO62RRI.js → ingest-J4I3HKM3.js} +2 -3
  186. package/dist/{ingest-2SO62RRI.js.map → ingest-J4I3HKM3.js.map} +1 -1
  187. package/dist/{ingest-2EIKN4QC.js → ingest-YV2NLDBE.js} +3 -4
  188. package/dist/{inspect-4OOS4APT.js → inspect-Q5NHBBHX.js} +3 -4
  189. package/dist/{inspect-4OOS4APT.js.map → inspect-Q5NHBBHX.js.map} +1 -1
  190. package/dist/{inspiration-S3DU4CMQ.js → inspiration-P265QJ2H.js} +1 -1
  191. package/dist/{keyword-metrics-SF4CSNZ2.js → keyword-metrics-PDY4ZXSP.js} +3 -4
  192. package/dist/{keyword-metrics-SF4CSNZ2.js.map → keyword-metrics-PDY4ZXSP.js.map} +1 -1
  193. package/dist/{keywords-for-site-WDAOPNKC.js → keywords-for-site-GALSCV77.js} +3 -4
  194. package/dist/{keywords-for-site-WDAOPNKC.js.map → keywords-for-site-GALSCV77.js.map} +1 -1
  195. package/dist/{landing-2ZB46LXH.js → landing-CJYGWCK4.js} +3 -3
  196. package/dist/{leads-A4W5KTWB.js → leads-PHKG6CP3.js} +3 -4
  197. package/dist/{leads-A4W5KTWB.js.map → leads-PHKG6CP3.js.map} +1 -1
  198. package/dist/{learn-IPULBCOD.js → learn-FUQSY7DN.js} +4 -5
  199. package/dist/{learn-IPULBCOD.js.map → learn-FUQSY7DN.js.map} +1 -1
  200. package/dist/{line-item-writes-EMYSOJKM.js → line-item-writes-E6MZPIZZ.js} +3 -4
  201. package/dist/{line-item-writes-EMYSOJKM.js.map → line-item-writes-E6MZPIZZ.js.map} +1 -1
  202. package/dist/{line-items-5NECXUZT.js → line-items-7ZGIKEF2.js} +5 -5
  203. package/dist/{link-CI45HWFN.js → link-QYAW6A2W.js} +3 -4
  204. package/dist/{link-CI45HWFN.js.map → link-QYAW6A2W.js.map} +1 -1
  205. package/dist/{linkedin-B7SYR75X.js → linkedin-FFSDSGGS.js} +26 -27
  206. package/dist/{linkedin-B7SYR75X.js.map → linkedin-FFSDSGGS.js.map} +1 -1
  207. package/dist/{list-ZBT3EBVZ.js → list-5IC6KIKO.js} +3 -4
  208. package/dist/{list-ZBT3EBVZ.js.map → list-5IC6KIKO.js.map} +1 -1
  209. package/dist/{list-2BARXOT5.js → list-NVQC5SNY.js} +2 -3
  210. package/dist/{list-2BARXOT5.js.map → list-NVQC5SNY.js.map} +1 -1
  211. package/dist/{list-BIEVLEHS.js → list-SAV3LQHY.js} +3 -4
  212. package/dist/{list-BIEVLEHS.js.map → list-SAV3LQHY.js.map} +1 -1
  213. package/dist/{log-C23OOAJZ.js → log-XZPVOALD.js} +3 -4
  214. package/dist/{log-C23OOAJZ.js.map → log-XZPVOALD.js.map} +1 -1
  215. package/dist/{logo-Q5D7PZY6.js → logo-2IP663QO.js} +3 -3
  216. package/dist/{lookup-ETWY47F7.js → lookup-XK45W2SH.js} +5 -6
  217. package/dist/{make-TPKKJXGL.js → make-BMWRKIIY.js} +20 -18
  218. package/dist/{make-TPKKJXGL.js.map → make-BMWRKIIY.js.map} +1 -1
  219. package/dist/{map-SYZMPHLL.js → map-4J5WIWIG.js} +4 -5
  220. package/dist/{map-SYZMPHLL.js.map → map-4J5WIWIG.js.map} +1 -1
  221. package/dist/{mcp-6FQBVJ6F.js → mcp-XXD7ZQCP.js} +2 -3
  222. package/dist/{mcp-6FQBVJ6F.js.map → mcp-XXD7ZQCP.js.map} +1 -1
  223. package/dist/{media-sources-ZXHEEP6T.js → media-sources-O6ZRUA3N.js} +2 -2
  224. package/dist/{members-UDY4OOJW.js → members-D5ZYLS4Y.js} +3 -4
  225. package/dist/{members-UDY4OOJW.js.map → members-D5ZYLS4Y.js.map} +1 -1
  226. package/dist/{normalize-DAKHYS3V.js → normalize-PCNC6E2N.js} +3 -7
  227. package/dist/{normalize-DAKHYS3V.js.map → normalize-PCNC6E2N.js.map} +1 -1
  228. package/dist/{options-QL3ULED5.js → options-MQ65VEVD.js} +6 -7
  229. package/dist/{options-QL3ULED5.js.map → options-MQ65VEVD.js.map} +1 -1
  230. package/dist/{performance-UF5VTY2U.js → performance-6QW2KEEQ.js} +4 -5
  231. package/dist/{promoted-tweet-writes-7HGESJ46.js → promoted-tweet-writes-JPLHY3GM.js} +3 -4
  232. package/dist/{promoted-tweet-writes-7HGESJ46.js.map → promoted-tweet-writes-JPLHY3GM.js.map} +1 -1
  233. package/dist/{promoted-tweets-LZKS5JIF.js → promoted-tweets-SURKMHFI.js} +3 -3
  234. package/dist/{publish-NPD3SMZL.js → publish-HCQ6MXLB.js} +3 -4
  235. package/dist/{publish-NPD3SMZL.js.map → publish-HCQ6MXLB.js.map} +1 -1
  236. package/dist/{reddit-NU2N3LZD.js → reddit-GIP3ADMS.js} +4 -5
  237. package/dist/{refresh-EBVJ2C6L.js → refresh-UXQSLCR3.js} +2 -3
  238. package/dist/{refresh-EBVJ2C6L.js.map → refresh-UXQSLCR3.js.map} +1 -1
  239. package/dist/{release-V43YB2PY.js → release-5KVLXNP6.js} +3 -4
  240. package/dist/{release-V43YB2PY.js.map → release-5KVLXNP6.js.map} +1 -1
  241. package/dist/{remove-QPSWLFI4.js → remove-6FIVKCJI.js} +2 -3
  242. package/dist/{remove-QPSWLFI4.js.map → remove-6FIVKCJI.js.map} +1 -1
  243. package/dist/{reopen-GQ66NMWF.js → reopen-YM5LNOLB.js} +3 -4
  244. package/dist/{reopen-GQ66NMWF.js.map → reopen-YM5LNOLB.js.map} +1 -1
  245. package/dist/{rerun-PZK275DY.js → rerun-6XZG7BGK.js} +17 -18
  246. package/dist/{rerun-PZK275DY.js.map → rerun-6XZG7BGK.js.map} +1 -1
  247. package/dist/{research-FMM6AWZC.js → research-2BLEISBG.js} +10 -10
  248. package/dist/{research-GEOCUBXB.js → research-YOGE7GT2.js} +2 -3
  249. package/dist/{research-GEOCUBXB.js.map → research-YOGE7GT2.js.map} +1 -1
  250. package/dist/{reset-REXJ6AUK.js → reset-C4UHQ3EU.js} +2 -3
  251. package/dist/{reset-REXJ6AUK.js.map → reset-C4UHQ3EU.js.map} +1 -1
  252. package/dist/{reset-Y72IVESB.js → reset-OLVB6AE6.js} +2 -3
  253. package/dist/{reset-Y72IVESB.js.map → reset-OLVB6AE6.js.map} +1 -1
  254. package/dist/{resolve-OGX7C4TV.js → resolve-XYH2GDAE.js} +3 -4
  255. package/dist/{resolve-OGX7C4TV.js.map → resolve-XYH2GDAE.js.map} +1 -1
  256. package/dist/{retry-TCUBBFR5.js → retry-726GKI6V.js} +2 -3
  257. package/dist/{retry-TCUBBFR5.js.map → retry-726GKI6V.js.map} +1 -1
  258. package/dist/{retry-CD6JAQ3F.js → retry-7EELDEQP.js} +2 -3
  259. package/dist/{retry-CD6JAQ3F.js.map → retry-7EELDEQP.js.map} +1 -1
  260. package/dist/{run-EUO34T2J.js → run-MMEDKJDB.js} +17 -18
  261. package/dist/{run-A5ZDXTOI.js → run-P4KR2MXC.js} +3 -4
  262. package/dist/{run-A5ZDXTOI.js.map → run-P4KR2MXC.js.map} +1 -1
  263. package/dist/{scaffold-ad-SW2HEWM3.js → scaffold-ad-PBTEWDAC.js} +12 -13
  264. package/dist/{scaffold-ad-SW2HEWM3.js.map → scaffold-ad-PBTEWDAC.js.map} +1 -1
  265. package/dist/{scaffold-static-ad-ECTJL54Y.js → scaffold-static-ad-RM4M4X5U.js} +36 -37
  266. package/dist/scaffold-static-ad-RM4M4X5U.js.map +1 -0
  267. package/dist/{scaffold-video-EI7U7RBK.js → scaffold-video-O2TTKZIE.js} +11 -12
  268. package/dist/{scaffold-video-EI7U7RBK.js.map → scaffold-video-O2TTKZIE.js.map} +1 -1
  269. package/dist/{schedule-S5YZJZ5U.js → schedule-RDK4GEPI.js} +2 -3
  270. package/dist/{schedule-S5YZJZ5U.js.map → schedule-RDK4GEPI.js.map} +1 -1
  271. package/dist/{scheduled-agents-N4LJRM4C.js → scheduled-agents-6U44QE76.js} +11 -11
  272. package/dist/{schema-R7JWWOF4.js → schema-CHJDC7GQ.js} +4 -8
  273. package/dist/{schema-R7JWWOF4.js.map → schema-CHJDC7GQ.js.map} +1 -1
  274. package/dist/{search-KHMQH3AT.js → search-PMJRU3C4.js} +2 -3
  275. package/dist/{search-KHMQH3AT.js.map → search-PMJRU3C4.js.map} +1 -1
  276. package/dist/{select-O2FN2JEQ.js → select-OEUKOVZ5.js} +8 -9
  277. package/dist/{select-O2FN2JEQ.js.map → select-OEUKOVZ5.js.map} +1 -1
  278. package/dist/{sends-BQZM5PLS.js → sends-WGJVQUMF.js} +4 -5
  279. package/dist/{sends-BQZM5PLS.js.map → sends-WGJVQUMF.js.map} +1 -1
  280. package/dist/{set-prompt-2HASHGWC.js → set-prompt-5E5I7QAZ.js} +8 -9
  281. package/dist/{set-prompt-2HASHGWC.js.map → set-prompt-5E5I7QAZ.js.map} +1 -1
  282. package/dist/{setup-links-GYSE56GX.js → setup-links-REPREN3C.js} +3 -4
  283. package/dist/{setup-links-GYSE56GX.js.map → setup-links-REPREN3C.js.map} +1 -1
  284. package/dist/{site-4SKM7RKG.js → site-WFSWIA3S.js} +4 -5
  285. package/dist/{site-4SKM7RKG.js.map → site-WFSWIA3S.js.map} +1 -1
  286. package/dist/{sources-R2NKNC6J.js → sources-AMI2AWKZ.js} +9 -10
  287. package/dist/{sources-R2NKNC6J.js.map → sources-AMI2AWKZ.js.map} +1 -1
  288. package/dist/{sources-FQ2UZTHL.js → sources-YBQ6KPFM.js} +6 -6
  289. package/dist/{stale-W756ACKC.js → stale-IGFUKEN2.js} +7 -8
  290. package/dist/{stale-W756ACKC.js.map → stale-IGFUKEN2.js.map} +1 -1
  291. package/dist/{status-SE2VZJJB.js → status-7F2KHFGA.js} +3 -4
  292. package/dist/{status-SE2VZJJB.js.map → status-7F2KHFGA.js.map} +1 -1
  293. package/dist/{stock-KXJ26BY4.js → stock-2YCDN3N6.js} +5 -5
  294. package/dist/{studio-SYKOSNDB.js → studio-RA7QQH4O.js} +1 -1
  295. package/dist/{sync-LJGSODK3.js → sync-GWTLKZTU.js} +2 -3
  296. package/dist/{sync-LJGSODK3.js.map → sync-GWTLKZTU.js.map} +1 -1
  297. package/dist/{sync-definition-QR2N233R.js → sync-definition-UGSDX2SZ.js} +11 -12
  298. package/dist/{tags-PYWFSBTR.js → tags-3WPW6PTV.js} +4 -4
  299. package/dist/{tags-QQU3OKMZ.js → tags-6342FQEB.js} +3 -4
  300. package/dist/{tags-QQU3OKMZ.js.map → tags-6342FQEB.js.map} +1 -1
  301. package/dist/{tags-5SBMRC2A.js → tags-ABHSX6M5.js} +3 -4
  302. package/dist/{tags-5SBMRC2A.js.map → tags-ABHSX6M5.js.map} +1 -1
  303. package/dist/{tags-YYLNF3PK.js → tags-FJIBBBRG.js} +3 -4
  304. package/dist/{tags-YYLNF3PK.js.map → tags-FJIBBBRG.js.map} +1 -1
  305. package/dist/{tags-4BAVFH4S.js → tags-KFYLZLB3.js} +2 -3
  306. package/dist/{tags-4BAVFH4S.js.map → tags-KFYLZLB3.js.map} +1 -1
  307. package/dist/{targeting-criteria-RJFLFICN.js → targeting-criteria-NR47AF5C.js} +3 -3
  308. package/dist/{targets-S2MT2PNB.js → targets-L56KOVQE.js} +3 -4
  309. package/dist/{targets-S2MT2PNB.js.map → targets-L56KOVQE.js.map} +1 -1
  310. package/dist/{templates-ZE5TOGRT.js → templates-B6XGDYUF.js} +3 -4
  311. package/dist/{templates-ZE5TOGRT.js.map → templates-B6XGDYUF.js.map} +1 -1
  312. package/dist/{testimonials-DII5DYLR.js → testimonials-CVC4YIXO.js} +6 -6
  313. package/dist/{top-companies-PGIAEHDF.js → top-companies-45X3DT7Z.js} +3 -4
  314. package/dist/{top-companies-PGIAEHDF.js.map → top-companies-45X3DT7Z.js.map} +1 -1
  315. package/dist/{translate-GXTS633J.js → translate-VP5R67PL.js} +11 -12
  316. package/dist/{translate-GXTS633J.js.map → translate-VP5R67PL.js.map} +1 -1
  317. package/dist/{triggers-2PTONXRU.js → triggers-22EMIVFD.js} +3 -4
  318. package/dist/{triggers-2PTONXRU.js.map → triggers-22EMIVFD.js.map} +1 -1
  319. package/dist/{unlink-XRMYJ6DB.js → unlink-65KUN6ID.js} +3 -4
  320. package/dist/{unlink-XRMYJ6DB.js.map → unlink-65KUN6ID.js.map} +1 -1
  321. package/dist/{unstage-FY7A3YFF.js → unstage-2E3I5SWF.js} +3 -4
  322. package/dist/{unstage-FY7A3YFF.js.map → unstage-2E3I5SWF.js.map} +1 -1
  323. package/dist/{unstage-RM2RLXKD.js → unstage-4ZEULXEQ.js} +4 -5
  324. package/dist/{unstage-RM2RLXKD.js.map → unstage-4ZEULXEQ.js.map} +1 -1
  325. package/dist/{update-S4562V3O.js → update-2S7CSEAW.js} +3 -4
  326. package/dist/{update-S4562V3O.js.map → update-2S7CSEAW.js.map} +1 -1
  327. package/dist/{update-V6YVEUI2.js → update-7NCOTAQZ.js} +3 -4
  328. package/dist/{update-V6YVEUI2.js.map → update-7NCOTAQZ.js.map} +1 -1
  329. package/dist/{update-PJ67D2OG.js → update-D6DJC6T7.js} +2 -3
  330. package/dist/{update-PJ67D2OG.js.map → update-D6DJC6T7.js.map} +1 -1
  331. package/dist/{update-E5SRBXQR.js → update-KREBPGBH.js} +3 -4
  332. package/dist/{update-E5SRBXQR.js.map → update-KREBPGBH.js.map} +1 -1
  333. package/dist/{upload-R6CQVLKF.js → upload-O6NHRPS7.js} +3 -4
  334. package/dist/{upload-R6CQVLKF.js.map → upload-O6NHRPS7.js.map} +1 -1
  335. package/dist/{url-options-JOKU46F2.js → url-options-GGXAL3J4.js} +3 -4
  336. package/dist/{url-options-JOKU46F2.js.map → url-options-GGXAL3J4.js.map} +1 -1
  337. package/dist/{url-params-7U2XMOWF.js → url-params-3EFGVTZZ.js} +3 -4
  338. package/dist/{url-params-7U2XMOWF.js.map → url-params-3EFGVTZZ.js.map} +1 -1
  339. package/dist/{validate-7YPOUKPB.js → validate-CSJM7XZM.js} +9 -10
  340. package/dist/{validate-7YPOUKPB.js.map → validate-CSJM7XZM.js.map} +1 -1
  341. package/dist/{videos-LICG6ACJ.js → videos-YSXYGTBM.js} +5 -5
  342. package/dist/{web-BA2PGTWU.js → web-IGIGVEKS.js} +3 -4
  343. package/dist/{web-BA2PGTWU.js.map → web-IGIGVEKS.js.map} +1 -1
  344. package/dist/{winning-ads-C6S2C5VP.js → winning-ads-2WS7FI4E.js} +2 -2
  345. package/dist/{write-commands-7SJ3BOW5.js → write-commands-5C7FUOVN.js} +4 -5
  346. package/dist/{write-commands-7SJ3BOW5.js.map → write-commands-5C7FUOVN.js.map} +1 -1
  347. package/dist/{x-CZHRC6U7.js → x-BFSKFCZD.js} +6 -6
  348. package/package.json +1 -1
  349. package/dist/add-2BEGRHUX.js.map +0 -1
  350. package/dist/analytics-IFELDWLL.js.map +0 -1
  351. package/dist/chunk-4PDHHHUJ.js +0 -537
  352. package/dist/chunk-4PDHHHUJ.js.map +0 -1
  353. package/dist/chunk-7EPXVICM.js.map +0 -1
  354. package/dist/chunk-ASI4P6X2.js.map +0 -1
  355. package/dist/chunk-FPOGPFAG.js.map +0 -1
  356. package/dist/chunk-HR6IWNKE.js.map +0 -1
  357. package/dist/chunk-HROZYQ5H.js.map +0 -1
  358. package/dist/chunk-NYIGXDUG.js.map +0 -1
  359. package/dist/chunk-QE7W555R.js.map +0 -1
  360. package/dist/flows-KTFAML22.js.map +0 -1
  361. package/dist/funnel-I6XIAEHG.js.map +0 -1
  362. package/dist/get-5PKNKJ5S.js.map +0 -1
  363. package/dist/plan-FT632COT.js +0 -51
  364. package/dist/plan-FT632COT.js.map +0 -1
  365. package/dist/questionnaire-JNGYJTAY.js +0 -37
  366. package/dist/questionnaire-JNGYJTAY.js.map +0 -1
  367. package/dist/scaffold-static-ad-ECTJL54Y.js.map +0 -1
  368. /package/dist/{actions-6TQMSVWD.js.map → actions-P35MEMGN.js.map} +0 -0
  369. /package/dist/{ads-AGYCVD62.js.map → ads-73PGA4YC.js.map} +0 -0
  370. /package/dist/{avatars-467OSBD6.js.map → avatars-EKCKHCC3.js.map} +0 -0
  371. /package/dist/{brand-YRTEPGBK.js.map → brand-C6PFGGQN.js.map} +0 -0
  372. /package/dist/{campaigns-OYMXDGWX.js.map → campaigns-KZYZTXDS.js.map} +0 -0
  373. /package/dist/{canvas-YQFG52IG.js.map → canvas-5NB27FX2.js.map} +0 -0
  374. /package/dist/{catalog-XLXIM7IW.js.map → catalog-VSSY6FGI.js.map} +0 -0
  375. /package/dist/{chunk-5ZNTADVR.js.map → chunk-3G3ZDLMI.js.map} +0 -0
  376. /package/dist/{chunk-ZDMTXQ2Q.js.map → chunk-3IBYKLXR.js.map} +0 -0
  377. /package/dist/{chunk-CWYAELVG.js.map → chunk-464O4MT2.js.map} +0 -0
  378. /package/dist/{chunk-NA63BH7V.js.map → chunk-4AUMTNVB.js.map} +0 -0
  379. /package/dist/{chunk-NDEE6G2J.js.map → chunk-4BQXAE7Z.js.map} +0 -0
  380. /package/dist/{chunk-2AOE2MZQ.js.map → chunk-5ZDLTE5T.js.map} +0 -0
  381. /package/dist/{chunk-ULG4QRTV.js.map → chunk-6NB47MRW.js.map} +0 -0
  382. /package/dist/{chunk-24EB7EDR.js.map → chunk-7YCRFMXF.js.map} +0 -0
  383. /package/dist/{chunk-WGUQHAJY.js.map → chunk-A4LOJ2VD.js.map} +0 -0
  384. /package/dist/{chunk-6F7DVPOS.js.map → chunk-AEOSAVVL.js.map} +0 -0
  385. /package/dist/{chunk-N4LAYIIN.js.map → chunk-CSYSX4D2.js.map} +0 -0
  386. /package/dist/{chunk-RX2DKU3W.js.map → chunk-DGUNI37S.js.map} +0 -0
  387. /package/dist/{chunk-I3ZR655O.js.map → chunk-IR6D7K4H.js.map} +0 -0
  388. /package/dist/{chunk-FUHN4MFY.js.map → chunk-JQJDXPCO.js.map} +0 -0
  389. /package/dist/{chunk-7CTMH5AK.js.map → chunk-KAUOHQTF.js.map} +0 -0
  390. /package/dist/{chunk-VYQ3QJ3C.js.map → chunk-KHRXPQID.js.map} +0 -0
  391. /package/dist/{chunk-6Y7ZBENQ.js.map → chunk-LECGCWT5.js.map} +0 -0
  392. /package/dist/{chunk-5WCSKQ7Z.js.map → chunk-LZ73CZGP.js.map} +0 -0
  393. /package/dist/{chunk-R25YLW6H.js.map → chunk-MELOSESI.js.map} +0 -0
  394. /package/dist/{chunk-DCRPXOJJ.js.map → chunk-MXYBTMKB.js.map} +0 -0
  395. /package/dist/{chunk-54C6YDGJ.js.map → chunk-NPY4QUMQ.js.map} +0 -0
  396. /package/dist/{chunk-LYQJ4PZW.js.map → chunk-OQ6663F4.js.map} +0 -0
  397. /package/dist/{chunk-H3427GPU.js.map → chunk-OZRUJVIQ.js.map} +0 -0
  398. /package/dist/{chunk-KMKEYI37.js.map → chunk-Q2V6E6SL.js.map} +0 -0
  399. /package/dist/{chunk-VL43TNIP.js.map → chunk-QRP3PXWN.js.map} +0 -0
  400. /package/dist/{chunk-C46GUI2S.js.map → chunk-RZBEK2VE.js.map} +0 -0
  401. /package/dist/{chunk-2VPBIT65.js.map → chunk-S3A3YOKO.js.map} +0 -0
  402. /package/dist/{chunk-FYGR3I2A.js.map → chunk-S77PZVYM.js.map} +0 -0
  403. /package/dist/{chunk-VLMBTPXU.js.map → chunk-SHL7LOC3.js.map} +0 -0
  404. /package/dist/{chunk-KS2QY6MK.js.map → chunk-W3ZHJJVT.js.map} +0 -0
  405. /package/dist/{chunk-RL5CP7N6.js.map → chunk-Y6O7EWYY.js.map} +0 -0
  406. /package/dist/{chunk-6NY2GPR4.js.map → chunk-Y6ZQXUZ7.js.map} +0 -0
  407. /package/dist/{chunk-WKQG6TER.js.map → chunk-ZEYEWPK6.js.map} +0 -0
  408. /package/dist/{connect-FCXNVTXG.js.map → connect-QCOGEPP4.js.map} +0 -0
  409. /package/dist/{creatives-FXUQ5WSD.js.map → creatives-B5NTXPUB.js.map} +0 -0
  410. /package/dist/{customers-XH2DMTFH.js.map → customers-A36LOZOB.js.map} +0 -0
  411. /package/dist/{feedback-EIZKS4JU.js.map → feedback-OLTCHE6C.js.map} +0 -0
  412. /package/dist/{find-FRRHAPWX.js.map → find-OTDIX6V4.js.map} +0 -0
  413. /package/dist/{fonts-MXR3ZKDX.js.map → fonts-EMMX3KII.js.map} +0 -0
  414. /package/dist/{ga4-DV2AXCSL.js.map → ga4-UDQ2HA2J.js.map} +0 -0
  415. /package/dist/{google-QYYYSSXI.js.map → google-KTO3PLEU.js.map} +0 -0
  416. /package/dist/{google-6OGZX47I.js.map → google-M7KEXVK5.js.map} +0 -0
  417. /package/dist/{gsc-TAKOF7J5.js.map → gsc-P3QYGDV2.js.map} +0 -0
  418. /package/dist/{icon-L4RSS6PZ.js.map → icon-I43F77FV.js.map} +0 -0
  419. /package/dist/{ideas-NFOW3HKJ.js.map → ideas-MIDU7YOA.js.map} +0 -0
  420. /package/dist/{images-2EFFUNNV.js.map → images-S254MS6O.js.map} +0 -0
  421. /package/dist/{ingest-2EIKN4QC.js.map → ingest-YV2NLDBE.js.map} +0 -0
  422. /package/dist/{inspiration-S3DU4CMQ.js.map → inspiration-P265QJ2H.js.map} +0 -0
  423. /package/dist/{landing-2ZB46LXH.js.map → landing-CJYGWCK4.js.map} +0 -0
  424. /package/dist/{line-items-5NECXUZT.js.map → line-items-7ZGIKEF2.js.map} +0 -0
  425. /package/dist/{logo-Q5D7PZY6.js.map → logo-2IP663QO.js.map} +0 -0
  426. /package/dist/{lookup-ETWY47F7.js.map → lookup-XK45W2SH.js.map} +0 -0
  427. /package/dist/{media-sources-ZXHEEP6T.js.map → media-sources-O6ZRUA3N.js.map} +0 -0
  428. /package/dist/{performance-UF5VTY2U.js.map → performance-6QW2KEEQ.js.map} +0 -0
  429. /package/dist/{promoted-tweets-LZKS5JIF.js.map → promoted-tweets-SURKMHFI.js.map} +0 -0
  430. /package/dist/{reddit-NU2N3LZD.js.map → reddit-GIP3ADMS.js.map} +0 -0
  431. /package/dist/{research-FMM6AWZC.js.map → research-2BLEISBG.js.map} +0 -0
  432. /package/dist/{run-EUO34T2J.js.map → run-MMEDKJDB.js.map} +0 -0
  433. /package/dist/{scheduled-agents-N4LJRM4C.js.map → scheduled-agents-6U44QE76.js.map} +0 -0
  434. /package/dist/{sources-FQ2UZTHL.js.map → sources-YBQ6KPFM.js.map} +0 -0
  435. /package/dist/{stock-KXJ26BY4.js.map → stock-2YCDN3N6.js.map} +0 -0
  436. /package/dist/{studio-SYKOSNDB.js.map → studio-RA7QQH4O.js.map} +0 -0
  437. /package/dist/{sync-definition-QR2N233R.js.map → sync-definition-UGSDX2SZ.js.map} +0 -0
  438. /package/dist/{tags-PYWFSBTR.js.map → tags-3WPW6PTV.js.map} +0 -0
  439. /package/dist/{targeting-criteria-RJFLFICN.js.map → targeting-criteria-NR47AF5C.js.map} +0 -0
  440. /package/dist/{testimonials-DII5DYLR.js.map → testimonials-CVC4YIXO.js.map} +0 -0
  441. /package/dist/{videos-LICG6ACJ.js.map → videos-YSXYGTBM.js.map} +0 -0
  442. /package/dist/{winning-ads-C6S2C5VP.js.map → winning-ads-2WS7FI4E.js.map} +0 -0
  443. /package/dist/{x-CZHRC6U7.js.map → x-BFSKFCZD.js.map} +0 -0
@@ -6,7 +6,7 @@ import {
6
6
  calendarDaySchema,
7
7
  todayUtc,
8
8
  windowTooLong
9
- } from "./chunk-7EPXVICM.js";
9
+ } from "./chunk-XF4JUKVF.js";
10
10
 
11
11
  // ../api/src/accounts/crm.ts
12
12
  import { z } from "zod";
@@ -1076,4 +1076,4 @@ export {
1076
1076
  accountsCampaignsRequestSchema,
1077
1077
  ACCOUNTS_NO_SETTINGS_MESSAGE
1078
1078
  };
1079
- //# sourceMappingURL=chunk-WKQG6TER.js.map
1079
+ //# sourceMappingURL=chunk-ZEYEWPK6.js.map
@@ -1,12 +1,11 @@
1
1
  import {
2
2
  failApi,
3
3
  failValidation
4
- } from "./chunk-SJYEY5MV.js";
5
- import "./chunk-7EPXVICM.js";
4
+ } from "./chunk-3HJLHTWP.js";
5
+ import "./chunk-XF4JUKVF.js";
6
6
  import "./chunk-GXDLWBOY.js";
7
7
  import "./chunk-TEINLN64.js";
8
8
  import "./chunk-ZJWUBJYQ.js";
9
- import "./chunk-HR6IWNKE.js";
10
9
  import "./chunk-NE4F3FHN.js";
11
10
  import {
12
11
  apiPost,
@@ -195,4 +194,4 @@ var claimCommand = defineCommand({
195
194
  export {
196
195
  claimCommand
197
196
  };
198
- //# sourceMappingURL=claim-W6G6VEG5.js.map
197
+ //# sourceMappingURL=claim-FZ5OQLMU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/actions/claim.ts","../src/commands/actions/skillCatalog.ts"],"sourcesContent":["import type { ActionsClaimResponse, ActionsRecommendSkillsResponse, SkillRecommendation } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation } from \"./shared.ts\";\nimport { readSkillCatalog } from \"./skillCatalog.ts\";\n\nregisterSchema({\n command: \"actions.claim\",\n description:\n \"Claim an action for the current chat (live — visible to other chats immediately). Claim only what you're actively working on now: it's required before `complete`, but NOT for `update` or `discard` (those stage without a claim). Returns action details plus a fast-model recommendation of which skills to load for the work (`recommendedSkills`) and a routing hint: load every skill that owns part of the work and the tool doc for each baker CLI family you'll use.\",\n args: {\n id: { type: \"string\", description: \"Action ID\", required: true },\n },\n});\n\nasync function recommendSkills(actionId: string): Promise<SkillRecommendation[]> {\n const skills = readSkillCatalog(process.cwd());\n if (skills.length === 0) return [];\n const response = await apiPost<ActionsRecommendSkillsResponse>(\"/api/actions/recommend-skills\", {\n actionId,\n skills,\n });\n return response.data.recommendations;\n}\n\n// Keep in sync with the claim-hint block in scripts/skill-routing-evals/run.mjs —\n// the action-claim evals embed this nudge so they test the real production surface.\nconst ROUTING_HINT =\n \"Actions often span several surfaces (a landing page plus a Google Ads change, a sheet pull plus an audience upload). Before starting, load EVERY skill that owns part of the work and read the tool doc (__tooling__/docs/tools/baker/<family>.md) for each baker CLI family you'll use. If the action references source material living in a connected tool (an email attachment, a call, a CRM record, a spreadsheet), reach for that tool too. If it describes recurring or future-dated work, it belongs on a schedule — see __tooling__/docs/tools/baker/scheduled-agents.md.\";\n\nfunction buildHints(recommendations: SkillRecommendation[]): string[] {\n if (recommendations.length === 0) {\n return [\"Review the action name, description, and tags above.\", ROUTING_HINT];\n }\n return [\n \"Recommended skills for this action (load the ones you'll use):\",\n ...recommendations.map((r) => ` /${r.name} — ${r.reason}`),\n \"Suggestions come from the action's name/description/tags only — the work may need more.\",\n ROUTING_HINT,\n ];\n}\n\nexport const claimCommand = defineCommand({\n meta: {\n name: \"claim\",\n description:\n \"Claim an action so other chats see you're working on it. Required before `complete` (update and discard don't need a claim). Example: baker actions claim <action-id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Action ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Action ID is required.\");\n }\n validateConvexId(id);\n const chatId = requireChatId();\n const response = await apiPost<ActionsClaimResponse>(\"/api/actions/claim\", {\n actionId: id,\n chatId,\n });\n\n let recommendedSkills: SkillRecommendation[] = [];\n try {\n recommendedSkills = await recommendSkills(id);\n } catch {\n // Recommendation is best-effort — a claim must never fail because the hint could not be produced.\n }\n\n const data = response.data ? { ...response.data, recommendedSkills } : response.data;\n writeJson({ ok: response.ok, data, hints: buildHints(recommendedSkills) });\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\ninterface SkillCatalogEntry {\n name: string;\n description: string;\n}\n\nconst DESCRIPTION_MAX = 600;\nconst SKILLS_SUBPATH = join(\".claude\", \"skills\");\n\n/** The backlog workflow lives in the actions tool doc, not a skill — never recommend a legacy `actions` skill a stale scaffold may still carry. */\nconst EXCLUDED_SKILLS = new Set([\"actions\"]);\n\nfunction stripQuotes(value: string): string {\n const trimmed = value.trim();\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\n/g, \"\\n\");\n }\n // YAML single-quoted scalars only escape a literal quote by doubling it ('').\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n return trimmed.slice(1, -1).replace(/''/g, \"'\");\n }\n return trimmed;\n}\n\nfunction extractFrontmatterLines(md: string): string[] | null {\n if (!md.startsWith(\"---\")) return null;\n const end = md.indexOf(\"\\n---\", 3);\n if (end === -1) return null;\n return md.slice(md.indexOf(\"\\n\", 3) + 1, end).split(\"\\n\");\n}\n\nconst BLOCK_SCALAR = /^([|>])[+-]?$/;\n\nfunction collectBlockLines(lines: string[], start: number): string[] {\n const collected: string[] = [];\n for (let i = start; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n if (line.trim() === \"\") {\n collected.push(\"\");\n } else if (/^\\s/.test(line)) {\n collected.push(line.trim());\n } else {\n break; // dedented to a new top-level key — block is over\n }\n }\n while (collected.length > 0 && collected.at(-1) === \"\") collected.pop();\n return collected;\n}\n\n/** Folded (`>`): join lines with spaces, blank lines become paragraph breaks. */\nfunction foldLines(collected: string[]): string {\n const paragraphs: string[] = [];\n let buffer: string[] = [];\n for (const line of collected) {\n if (line === \"\") {\n if (buffer.length > 0) paragraphs.push(buffer.join(\" \"));\n buffer = [];\n } else {\n buffer.push(line);\n }\n }\n if (buffer.length > 0) paragraphs.push(buffer.join(\" \"));\n return paragraphs.join(\"\\n\");\n}\n\n/** Join a YAML block scalar's indented continuation lines: literal (`|`) keeps line breaks, folded (`>`) joins with spaces. */\nfunction readBlockScalar(lines: string[], start: number, style: \"|\" | \">\"): string {\n const collected = collectBlockLines(lines, start);\n return style === \"|\" ? collected.join(\"\\n\") : foldLines(collected);\n}\n\nfunction readField(lines: string[], field: string): string | null {\n for (let i = 0; i < lines.length; i++) {\n const match = (lines[i] ?? \"\").match(/^([A-Za-z0-9_-]+):\\s*(.*)$/);\n if (!match || match[1] !== field) continue;\n const inline = (match[2] ?? \"\").trim();\n const scalar = inline.match(BLOCK_SCALAR);\n if (scalar) {\n return readBlockScalar(lines, i + 1, scalar[1] as \"|\" | \">\");\n }\n return stripQuotes(inline);\n }\n return null;\n}\n\nexport function parseSkillFrontmatter(md: string): SkillCatalogEntry | null {\n const lines = extractFrontmatterLines(md);\n if (!lines) return null;\n const name = readField(lines, \"name\");\n const description = readField(lines, \"description\");\n if (!name || !description) return null;\n const trimmed = description.length > DESCRIPTION_MAX ? `${description.slice(0, DESCRIPTION_MAX)}…` : description;\n return { name, description: trimmed };\n}\n\nexport function findSkillsDir(startDir: string): string | null {\n let dir = startDir;\n for (;;) {\n const candidate = join(dir, SKILLS_SUBPATH);\n if (existsSync(candidate)) return candidate;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport function readSkillCatalog(startDir: string): SkillCatalogEntry[] {\n const skillsDir = findSkillsDir(startDir);\n if (!skillsDir) return [];\n\n const entries: SkillCatalogEntry[] = [];\n for (const dirent of readdirSync(skillsDir, { withFileTypes: true })) {\n if (!dirent.isDirectory() || EXCLUDED_SKILLS.has(dirent.name)) continue;\n const skillFile = join(skillsDir, dirent.name, \"SKILL.md\");\n if (!existsSync(skillFile)) continue;\n try {\n const parsed = parseSkillFrontmatter(readFileSync(skillFile, \"utf8\"));\n if (parsed) entries.push(parsed);\n } catch {\n // Unreadable skill file — skip it, never block the claim.\n }\n }\n return entries.sort((a, b) => a.name.localeCompare(b.name));\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/commands/actions/claim.ts","../src/commands/actions/skillCatalog.ts"],"sourcesContent":["import type { ActionsClaimResponse, ActionsRecommendSkillsResponse, SkillRecommendation } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation } from \"./shared.ts\";\nimport { readSkillCatalog } from \"./skillCatalog.ts\";\n\nregisterSchema({\n command: \"actions.claim\",\n description:\n \"Claim an action for the current chat (live — visible to other chats immediately). Claim only what you're actively working on now: it's required before `complete`, but NOT for `update` or `discard` (those stage without a claim). Returns action details plus a fast-model recommendation of which skills to load for the work (`recommendedSkills`) and a routing hint: load every skill that owns part of the work and the tool doc for each baker CLI family you'll use.\",\n args: {\n id: { type: \"string\", description: \"Action ID\", required: true },\n },\n});\n\nasync function recommendSkills(actionId: string): Promise<SkillRecommendation[]> {\n const skills = readSkillCatalog(process.cwd());\n if (skills.length === 0) return [];\n const response = await apiPost<ActionsRecommendSkillsResponse>(\"/api/actions/recommend-skills\", {\n actionId,\n skills,\n });\n return response.data.recommendations;\n}\n\n// Keep in sync with the claim-hint block in scripts/skill-routing-evals/run.mjs —\n// the action-claim evals embed this nudge so they test the real production surface.\nconst ROUTING_HINT =\n \"Actions often span several surfaces (a landing page plus a Google Ads change, a sheet pull plus an audience upload). Before starting, load EVERY skill that owns part of the work and read the tool doc (__tooling__/docs/tools/baker/<family>.md) for each baker CLI family you'll use. If the action references source material living in a connected tool (an email attachment, a call, a CRM record, a spreadsheet), reach for that tool too. If it describes recurring or future-dated work, it belongs on a schedule — see __tooling__/docs/tools/baker/scheduled-agents.md.\";\n\nfunction buildHints(recommendations: SkillRecommendation[]): string[] {\n if (recommendations.length === 0) {\n return [\"Review the action name, description, and tags above.\", ROUTING_HINT];\n }\n return [\n \"Recommended skills for this action (load the ones you'll use):\",\n ...recommendations.map((r) => ` /${r.name} — ${r.reason}`),\n \"Suggestions come from the action's name/description/tags only — the work may need more.\",\n ROUTING_HINT,\n ];\n}\n\nexport const claimCommand = defineCommand({\n meta: {\n name: \"claim\",\n description:\n \"Claim an action so other chats see you're working on it. Required before `complete` (update and discard don't need a claim). Example: baker actions claim <action-id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Action ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Action ID is required.\");\n }\n validateConvexId(id);\n const chatId = requireChatId();\n const response = await apiPost<ActionsClaimResponse>(\"/api/actions/claim\", {\n actionId: id,\n chatId,\n });\n\n let recommendedSkills: SkillRecommendation[] = [];\n try {\n recommendedSkills = await recommendSkills(id);\n } catch {\n // Recommendation is best-effort — a claim must never fail because the hint could not be produced.\n }\n\n const data = response.data ? { ...response.data, recommendedSkills } : response.data;\n writeJson({ ok: response.ok, data, hints: buildHints(recommendedSkills) });\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\ninterface SkillCatalogEntry {\n name: string;\n description: string;\n}\n\nconst DESCRIPTION_MAX = 600;\nconst SKILLS_SUBPATH = join(\".claude\", \"skills\");\n\n/** The backlog workflow lives in the actions tool doc, not a skill — never recommend a legacy `actions` skill a stale scaffold may still carry. */\nconst EXCLUDED_SKILLS = new Set([\"actions\"]);\n\nfunction stripQuotes(value: string): string {\n const trimmed = value.trim();\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\n/g, \"\\n\");\n }\n // YAML single-quoted scalars only escape a literal quote by doubling it ('').\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n return trimmed.slice(1, -1).replace(/''/g, \"'\");\n }\n return trimmed;\n}\n\nfunction extractFrontmatterLines(md: string): string[] | null {\n if (!md.startsWith(\"---\")) return null;\n const end = md.indexOf(\"\\n---\", 3);\n if (end === -1) return null;\n return md.slice(md.indexOf(\"\\n\", 3) + 1, end).split(\"\\n\");\n}\n\nconst BLOCK_SCALAR = /^([|>])[+-]?$/;\n\nfunction collectBlockLines(lines: string[], start: number): string[] {\n const collected: string[] = [];\n for (let i = start; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n if (line.trim() === \"\") {\n collected.push(\"\");\n } else if (/^\\s/.test(line)) {\n collected.push(line.trim());\n } else {\n break; // dedented to a new top-level key — block is over\n }\n }\n while (collected.length > 0 && collected.at(-1) === \"\") collected.pop();\n return collected;\n}\n\n/** Folded (`>`): join lines with spaces, blank lines become paragraph breaks. */\nfunction foldLines(collected: string[]): string {\n const paragraphs: string[] = [];\n let buffer: string[] = [];\n for (const line of collected) {\n if (line === \"\") {\n if (buffer.length > 0) paragraphs.push(buffer.join(\" \"));\n buffer = [];\n } else {\n buffer.push(line);\n }\n }\n if (buffer.length > 0) paragraphs.push(buffer.join(\" \"));\n return paragraphs.join(\"\\n\");\n}\n\n/** Join a YAML block scalar's indented continuation lines: literal (`|`) keeps line breaks, folded (`>`) joins with spaces. */\nfunction readBlockScalar(lines: string[], start: number, style: \"|\" | \">\"): string {\n const collected = collectBlockLines(lines, start);\n return style === \"|\" ? collected.join(\"\\n\") : foldLines(collected);\n}\n\nfunction readField(lines: string[], field: string): string | null {\n for (let i = 0; i < lines.length; i++) {\n const match = (lines[i] ?? \"\").match(/^([A-Za-z0-9_-]+):\\s*(.*)$/);\n if (!match || match[1] !== field) continue;\n const inline = (match[2] ?? \"\").trim();\n const scalar = inline.match(BLOCK_SCALAR);\n if (scalar) {\n return readBlockScalar(lines, i + 1, scalar[1] as \"|\" | \">\");\n }\n return stripQuotes(inline);\n }\n return null;\n}\n\nexport function parseSkillFrontmatter(md: string): SkillCatalogEntry | null {\n const lines = extractFrontmatterLines(md);\n if (!lines) return null;\n const name = readField(lines, \"name\");\n const description = readField(lines, \"description\");\n if (!name || !description) return null;\n const trimmed = description.length > DESCRIPTION_MAX ? `${description.slice(0, DESCRIPTION_MAX)}…` : description;\n return { name, description: trimmed };\n}\n\nexport function findSkillsDir(startDir: string): string | null {\n let dir = startDir;\n for (;;) {\n const candidate = join(dir, SKILLS_SUBPATH);\n if (existsSync(candidate)) return candidate;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport function readSkillCatalog(startDir: string): SkillCatalogEntry[] {\n const skillsDir = findSkillsDir(startDir);\n if (!skillsDir) return [];\n\n const entries: SkillCatalogEntry[] = [];\n for (const dirent of readdirSync(skillsDir, { withFileTypes: true })) {\n if (!dirent.isDirectory() || EXCLUDED_SKILLS.has(dirent.name)) continue;\n const skillFile = join(skillsDir, dirent.name, \"SKILL.md\");\n if (!existsSync(skillFile)) continue;\n try {\n const parsed = parseSkillFrontmatter(readFileSync(skillFile, \"utf8\"));\n if (parsed) entries.push(parsed);\n } catch {\n // Unreadable skill file — skip it, never block the claim.\n }\n }\n return entries.sort((a, b) => a.name.localeCompare(b.name));\n}\n"],"mappings":"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","names":[]}
package/dist/cli.js CHANGED
@@ -106,38 +106,38 @@ Formats: --output json works on every command that prints the envelope. --output
106
106
  Introspection: Run 'baker schema <command>' to inspect argument schemas.`
107
107
  },
108
108
  subCommands: {
109
- capabilities: () => import("./capabilities-PXBKUN2G.js").then((m) => m.capabilitiesCommand),
110
- actions: () => import("./actions-6TQMSVWD.js").then((m) => m.actionsCommand),
111
- "scheduled-agents": () => import("./scheduled-agents-N4LJRM4C.js").then((m) => m.scheduledAgentsCommand),
112
- ads: () => import("./ads-AGYCVD62.js").then((m) => m.adsCommand),
113
- brand: () => import("./brand-YRTEPGBK.js").then((m) => m.brandCommand),
114
- analytics: () => import("./analytics-IFELDWLL.js").then((m) => m.analyticsCommand),
109
+ capabilities: () => import("./capabilities-DJFTRJKS.js").then((m) => m.capabilitiesCommand),
110
+ actions: () => import("./actions-P35MEMGN.js").then((m) => m.actionsCommand),
111
+ "scheduled-agents": () => import("./scheduled-agents-6U44QE76.js").then((m) => m.scheduledAgentsCommand),
112
+ ads: () => import("./ads-73PGA4YC.js").then((m) => m.adsCommand),
113
+ brand: () => import("./brand-C6PFGGQN.js").then((m) => m.brandCommand),
114
+ analytics: () => import("./analytics-FKCXIMPO.js").then((m) => m.analyticsCommand),
115
115
  experiment: () => import("./experiment-LKK77YAN.js").then((m) => m.experimentCommand),
116
- ga4: () => import("./ga4-DV2AXCSL.js").then((m) => m.ga4Command),
117
- gsc: () => import("./gsc-TAKOF7J5.js").then((m) => m.gscCommand),
118
- research: () => import("./research-FMM6AWZC.js").then((m) => m.researchCommand),
119
- creatives: () => import("./creatives-FXUQ5WSD.js").then((m) => m.creativesCommand),
120
- flows: () => import("./flows-KTFAML22.js").then((m) => m.flowsCommand),
121
- funnel: () => import("./funnel-I6XIAEHG.js").then((m) => m.funnelCommand),
122
- images: () => import("./images-2EFFUNNV.js").then((m) => m.imagesCommand),
123
- studio: () => import("./studio-SYKOSNDB.js").then((m) => m.studioCommand),
124
- avatars: () => import("./avatars-467OSBD6.js").then((m) => m.avatarsCommand),
125
- landing: () => import("./landing-2ZB46LXH.js").then((m) => m.landingCommand),
126
- videos: () => import("./videos-LICG6ACJ.js").then((m) => m.videosCommand),
127
- testimonials: () => import("./testimonials-DII5DYLR.js").then((m) => m.testimonialsCommand),
128
- canvas: () => import("./canvas-YQFG52IG.js").then((m) => m.canvasCommand),
129
- tags: () => import("./tags-4BAVFH4S.js").then((m) => m.tagsCommand),
116
+ ga4: () => import("./ga4-UDQ2HA2J.js").then((m) => m.ga4Command),
117
+ gsc: () => import("./gsc-P3QYGDV2.js").then((m) => m.gscCommand),
118
+ research: () => import("./research-2BLEISBG.js").then((m) => m.researchCommand),
119
+ creatives: () => import("./creatives-B5NTXPUB.js").then((m) => m.creativesCommand),
120
+ flows: () => import("./flows-KABCBS3S.js").then((m) => m.flowsCommand),
121
+ funnel: () => import("./funnel-AAX27NH4.js").then((m) => m.funnelCommand),
122
+ images: () => import("./images-S254MS6O.js").then((m) => m.imagesCommand),
123
+ studio: () => import("./studio-RA7QQH4O.js").then((m) => m.studioCommand),
124
+ avatars: () => import("./avatars-EKCKHCC3.js").then((m) => m.avatarsCommand),
125
+ landing: () => import("./landing-CJYGWCK4.js").then((m) => m.landingCommand),
126
+ videos: () => import("./videos-YSXYGTBM.js").then((m) => m.videosCommand),
127
+ testimonials: () => import("./testimonials-CVC4YIXO.js").then((m) => m.testimonialsCommand),
128
+ canvas: () => import("./canvas-5NB27FX2.js").then((m) => m.canvasCommand),
129
+ tags: () => import("./tags-KFYLZLB3.js").then((m) => m.tagsCommand),
130
130
  "tag-manager": () => import("./tag-manager-DYZUOIAS.js").then((m) => m.tagManagerCommand),
131
- chats: () => import("./chats-UK47UE7C.js").then((m) => m.chatsCommand),
132
- history: () => import("./history-6AVQX2OQ.js").then((m) => m.historyCommand),
133
- credentials: () => import("./credentials-MJC7PGKR.js").then((m) => m.credentialsCommand),
134
- hubspot: () => import("./hubspot-SVEMFK5S.js").then((m) => m.hubspotCommand),
135
- accounts: () => import("./accounts-E67BMK7T.js").then((m) => m.accountsCommand),
136
- "winning-ads": () => import("./winning-ads-C6S2C5VP.js").then((m) => m.winningAdsCommand),
137
- "media-sources": () => import("./media-sources-ZXHEEP6T.js").then((m) => m.mediaSourcesCommand),
138
- site: () => import("./site-4SKM7RKG.js").then((m) => m.siteCommand),
139
- mcp: () => import("./mcp-6FQBVJ6F.js").then((m) => m.mcpCommand),
140
- "setup-links": () => import("./setup-links-GYSE56GX.js").then((m) => m.setupLinksCommand),
131
+ chats: () => import("./chats-D2CSDX5Q.js").then((m) => m.chatsCommand),
132
+ history: () => import("./history-PQUJKK26.js").then((m) => m.historyCommand),
133
+ credentials: () => import("./credentials-C33K6XCJ.js").then((m) => m.credentialsCommand),
134
+ hubspot: () => import("./hubspot-Y77VLY6Y.js").then((m) => m.hubspotCommand),
135
+ accounts: () => import("./accounts-O5MFO3QQ.js").then((m) => m.accountsCommand),
136
+ "winning-ads": () => import("./winning-ads-2WS7FI4E.js").then((m) => m.winningAdsCommand),
137
+ "media-sources": () => import("./media-sources-O6ZRUA3N.js").then((m) => m.mediaSourcesCommand),
138
+ site: () => import("./site-WFSWIA3S.js").then((m) => m.siteCommand),
139
+ mcp: () => import("./mcp-XXD7ZQCP.js").then((m) => m.mcpCommand),
140
+ "setup-links": () => import("./setup-links-REPREN3C.js").then((m) => m.setupLinksCommand),
141
141
  schema: () => import("./schema-6GR77VJG.js").then((m) => m.schemaCommand)
142
142
  }
143
143
  });
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  csvOrJson,
3
3
  handleLinkedinError
4
- } from "./chunk-N4LAYIIN.js";
4
+ } from "./chunk-CSYSX4D2.js";
5
5
  import {
6
6
  TABLE_OUTPUT_FORMATS,
7
7
  outputFormatRefusal,
@@ -14,11 +14,10 @@ import {
14
14
  } from "./chunk-X7ZODEXJ.js";
15
15
  import {
16
16
  linkedinCompaniesRequestSchema
17
- } from "./chunk-7EPXVICM.js";
17
+ } from "./chunk-XF4JUKVF.js";
18
18
  import "./chunk-GXDLWBOY.js";
19
19
  import "./chunk-TEINLN64.js";
20
20
  import "./chunk-ZJWUBJYQ.js";
21
- import "./chunk-HR6IWNKE.js";
22
21
  import "./chunk-NE4F3FHN.js";
23
22
  import {
24
23
  apiPost
@@ -193,4 +192,4 @@ export {
193
192
  companiesCommand,
194
193
  companiesHints
195
194
  };
196
- //# sourceMappingURL=companies-TS6KBATJ.js.map
195
+ //# sourceMappingURL=companies-DNI634RC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/ads/linkedin/companies.ts"],"sourcesContent":["import {\n type LINKEDIN_COMPANIES_BY,\n type LinkedinCompaniesRequestInput,\n type LinkedinCompaniesResponse,\n linkedinCompaniesRequestSchema,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiPost } from \"../../../client.ts\";\nimport { getEnv } from \"../../../env.ts\";\nimport {\n outputFormatRefusal,\n TABLE_OUTPUT_FORMATS,\n writeAdsJson,\n writeAdsOutput,\n writeJsonEnvelope,\n} from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError } from \"./shared.ts\";\n\n/** Companies per page without --full. */\nconst COMPANIES_PAGE_SIZE = 100;\n\n/** A by-campaign read makes one LinkedIn call per delivered campaign. */\nconst COMPANIES_TIMEOUT_MS = 180_000;\n\nconst CSV_FIELDS = [\n \"org\",\n \"name\",\n \"domain\",\n \"domainSource\",\n \"impressions\",\n \"clicks\",\n \"engagements\",\n \"costLocal\",\n \"videoViews\",\n \"months\",\n \"campaigns\",\n];\n\n/** Next steps the agent can't see from the rows alone. */\nexport function companiesHints(data: LinkedinCompaniesResponse, request: { withDomains: boolean }): string[] {\n const hints: string[] = [];\n if (data.rows.length === 0) {\n hints.push(\n `No company shows up for ${data.query.start} to ${data.query.end}${data.query.minImpressions > 0 ? ` at --min-impressions ${data.query.minImpressions}` : \"\"}. LinkedIn reports companies 12-24h late and leaves out any with fewer than 3 events in a month, so a small or new campaign can have none yet. Try a longer period (--last-months 24), drop --min-impressions, or check the campaigns delivered with \\`baker ads linkedin analytics\\`.`,\n );\n return hints;\n }\n const withDomain = data.rows.filter((row) => row.domain !== undefined).length;\n if (withDomain > 0) {\n hints.push(\n `${withDomain} companies came back with a website domain — if HubSpot is connected, \\`baker hubspot companies search --domains <domain,domain,…> --with-deals\\` (up to 100 per call) shows which are already accounts and which have deals.`,\n );\n } else if (!request.withDomains && data.rows.length > 0) {\n hints.push(\n \"Add --with-domains to get each company's website domain, ready for matching against your customer list.\",\n );\n }\n if (data.totalCompanies > data.rows.length) {\n const page = data.page ?? 1;\n const first = (page - 1) * COMPANIES_PAGE_SIZE + 1;\n const last = first + data.rows.length - 1;\n const next = last < data.totalCompanies ? ` — --page ${page + 1} for the next ${COMPANIES_PAGE_SIZE}, ` : \" — \";\n hints.push(\n `Showing companies ${first}-${last} of ${data.totalCompanies.toLocaleString(\"en\")}, most engaged first${next}--full for all, or --min-impressions to trim the tail.`,\n );\n }\n if (data.query.by === \"none\" && data.rows.length > 0) {\n hints.push(\"--by month shows when each company warmed up; --by campaign shows which campaigns reached it.\");\n }\n return hints;\n}\n\nfunction csvList(raw: unknown): string[] | undefined {\n if (typeof raw !== \"string\") return undefined;\n const items = raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\n/** Request fields as the flags that set them, so a refusal names what the agent typed. */\nconst FLAG_OF_FIELD: Record<string, string> = {\n accountId: \"--account-id\",\n campaignIds: \"--campaign-id\",\n lastMonths: \"--last-months\",\n start: \"--start\",\n end: \"--end\",\n by: \"--by\",\n minImpressions: \"--min-impressions\",\n page: \"--page\",\n};\n\nfunction flagOf(field: string): string {\n return FLAG_OF_FIELD[field.split(\".\")[0] ?? \"\"] ?? (field || \"args\");\n}\n\nfunction optionalNumber(raw: unknown): number | undefined {\n return typeof raw === \"string\" && raw.trim() !== \"\" ? Number(raw) : undefined;\n}\n\nfunction bareAccountId(raw: string | undefined): string | undefined {\n return raw?.startsWith(\"urn:\") ? raw.split(\":\").pop() : raw;\n}\n\nexport const companiesCommand = defineCommand({\n meta: {\n name: \"companies\",\n description: `Which companies your LinkedIn ads reached — one row per company over the whole period, most engaged first.\n\nStart here for \"which companies are our ads warming\", ABM reporting, or building a warm-account list.\nRows: {org, name, impressions, clicks, engagements, costLocal}. Defaults: the last 12 calendar\nmonths, the only selected ad account, 100 companies a page (--page 2 for the next, --full for all).\n\nExamples:\n baker ads linkedin companies # last 12 months, whole account\n baker ads linkedin companies --page 2 # the next 100 companies\n baker ads linkedin companies --by month --min-impressions 50 # when each company warmed up\n baker ads linkedin companies --campaign-id 333728193,810055513 --by campaign\n baker ads linkedin companies --with-domains --output csv # + website domain, for CRM matching\n baker ads linkedin companies --last-months 3 --stats # + how complete LinkedIn's data is\n\nLinkedIn reports companies 12-24h late and leaves out any company with fewer than 3 events in a month,\nso small companies are undercounted. engagements = LinkedIn's totalEngagements.`,\n },\n args: {\n \"account-id\": {\n type: \"string\",\n description: \"Ad account id (numeric or urn:li:sponsoredAccount:N). Default: the only selected account\",\n },\n \"campaign-id\": { type: \"string\", description: \"Comma-separated campaign ids — read only these campaigns\" },\n \"last-months\": { type: \"string\", description: \"Calendar months back, including this one (1-24, default 12)\" },\n start: { type: \"string\", description: \"Start date YYYY-MM-DD (instead of --last-months)\" },\n end: { type: \"string\", description: \"End date YYYY-MM-DD (default today)\" },\n by: { type: \"string\", description: \"none | month | campaign — break each company down (default none)\" },\n \"with-domains\": { type: \"boolean\", description: \"Add each company's website domain and domainSource\" },\n \"min-impressions\": { type: \"string\", description: \"Leave out companies under N impressions over the period\" },\n full: { type: \"boolean\", description: \"Every company (not just a page of 100), plus videoViews\" },\n page: {\n type: \"string\",\n description: \"Which page of 100 companies, most engaged first (default 1); totalCompanies counts them all\",\n },\n stats: { type: \"boolean\", description: \"Add read-quality stats: row counts, cost/reach/domain coverage\" },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const input: LinkedinCompaniesRequestInput = {\n accountId: bareAccountId((args[\"account-id\"] as string | undefined) || getEnv().BAKER_LINKEDIN_AD_ACCOUNT_ID),\n campaignIds: csvList(args[\"campaign-id\"]),\n lastMonths: optionalNumber(args[\"last-months\"]),\n start: args.start as string | undefined,\n end: args.end as string | undefined,\n by: args.by as (typeof LINKEDIN_COMPANIES_BY)[number] | undefined,\n withDomains: Boolean(args[\"with-domains\"]),\n minImpressions: optionalNumber(args[\"min-impressions\"]),\n full: Boolean(args.full),\n page: optionalNumber(args.page),\n stats: Boolean(args.stats),\n skipCache: Boolean(args[\"no-cache\"]),\n };\n const parsed = linkedinCompaniesRequestSchema.safeParse(input);\n const formatRefusal = outputFormatRefusal(csvOrJson(args), TABLE_OUTPUT_FORMATS);\n if (!parsed.success || formatRefusal !== null) {\n const issues = parsed.success ? [] : parsed.error.issues;\n const messages = issues.map((issue) => `${flagOf(issue.path.join(\".\"))}: ${issue.message}`);\n writeAdsJson({\n ok: false,\n error: { code: \"INVALID_ARGS\", message: [...messages, ...(formatRefusal ? [formatRefusal] : [])].join(\"; \") },\n });\n process.exit(1);\n }\n\n try {\n const { data } = await apiPost<{ ok: true; data: LinkedinCompaniesResponse }>(\n \"/api/ads/linkedin/companies\",\n input,\n { timeoutMs: COMPANIES_TIMEOUT_MS },\n );\n const hints = companiesHints(data, parsed.data);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n const notes = [...data.warnings.map((w) => `${w.code}: ${w.message}`), ...hints];\n writeAdsOutput(data.rows, fmt, CSV_FIELDS, notes);\n return;\n }\n writeJsonEnvelope(hints.length > 0 ? { ok: true, data, hints } : { ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/commands/ads/linkedin/companies.ts"],"sourcesContent":["import {\n type LINKEDIN_COMPANIES_BY,\n type LinkedinCompaniesRequestInput,\n type LinkedinCompaniesResponse,\n linkedinCompaniesRequestSchema,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiPost } from \"../../../client.ts\";\nimport { getEnv } from \"../../../env.ts\";\nimport {\n outputFormatRefusal,\n TABLE_OUTPUT_FORMATS,\n writeAdsJson,\n writeAdsOutput,\n writeJsonEnvelope,\n} from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError } from \"./shared.ts\";\n\n/** Companies per page without --full. */\nconst COMPANIES_PAGE_SIZE = 100;\n\n/** A by-campaign read makes one LinkedIn call per delivered campaign. */\nconst COMPANIES_TIMEOUT_MS = 180_000;\n\nconst CSV_FIELDS = [\n \"org\",\n \"name\",\n \"domain\",\n \"domainSource\",\n \"impressions\",\n \"clicks\",\n \"engagements\",\n \"costLocal\",\n \"videoViews\",\n \"months\",\n \"campaigns\",\n];\n\n/** Next steps the agent can't see from the rows alone. */\nexport function companiesHints(data: LinkedinCompaniesResponse, request: { withDomains: boolean }): string[] {\n const hints: string[] = [];\n if (data.rows.length === 0) {\n hints.push(\n `No company shows up for ${data.query.start} to ${data.query.end}${data.query.minImpressions > 0 ? ` at --min-impressions ${data.query.minImpressions}` : \"\"}. LinkedIn reports companies 12-24h late and leaves out any with fewer than 3 events in a month, so a small or new campaign can have none yet. Try a longer period (--last-months 24), drop --min-impressions, or check the campaigns delivered with \\`baker ads linkedin analytics\\`.`,\n );\n return hints;\n }\n const withDomain = data.rows.filter((row) => row.domain !== undefined).length;\n if (withDomain > 0) {\n hints.push(\n `${withDomain} companies came back with a website domain — if HubSpot is connected, \\`baker hubspot companies search --domains <domain,domain,…> --with-deals\\` (up to 100 per call) shows which are already accounts and which have deals.`,\n );\n } else if (!request.withDomains && data.rows.length > 0) {\n hints.push(\n \"Add --with-domains to get each company's website domain, ready for matching against your customer list.\",\n );\n }\n if (data.totalCompanies > data.rows.length) {\n const page = data.page ?? 1;\n const first = (page - 1) * COMPANIES_PAGE_SIZE + 1;\n const last = first + data.rows.length - 1;\n const next = last < data.totalCompanies ? ` — --page ${page + 1} for the next ${COMPANIES_PAGE_SIZE}, ` : \" — \";\n hints.push(\n `Showing companies ${first}-${last} of ${data.totalCompanies.toLocaleString(\"en\")}, most engaged first${next}--full for all, or --min-impressions to trim the tail.`,\n );\n }\n if (data.query.by === \"none\" && data.rows.length > 0) {\n hints.push(\"--by month shows when each company warmed up; --by campaign shows which campaigns reached it.\");\n }\n return hints;\n}\n\nfunction csvList(raw: unknown): string[] | undefined {\n if (typeof raw !== \"string\") return undefined;\n const items = raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\n/** Request fields as the flags that set them, so a refusal names what the agent typed. */\nconst FLAG_OF_FIELD: Record<string, string> = {\n accountId: \"--account-id\",\n campaignIds: \"--campaign-id\",\n lastMonths: \"--last-months\",\n start: \"--start\",\n end: \"--end\",\n by: \"--by\",\n minImpressions: \"--min-impressions\",\n page: \"--page\",\n};\n\nfunction flagOf(field: string): string {\n return FLAG_OF_FIELD[field.split(\".\")[0] ?? \"\"] ?? (field || \"args\");\n}\n\nfunction optionalNumber(raw: unknown): number | undefined {\n return typeof raw === \"string\" && raw.trim() !== \"\" ? Number(raw) : undefined;\n}\n\nfunction bareAccountId(raw: string | undefined): string | undefined {\n return raw?.startsWith(\"urn:\") ? raw.split(\":\").pop() : raw;\n}\n\nexport const companiesCommand = defineCommand({\n meta: {\n name: \"companies\",\n description: `Which companies your LinkedIn ads reached — one row per company over the whole period, most engaged first.\n\nStart here for \"which companies are our ads warming\", ABM reporting, or building a warm-account list.\nRows: {org, name, impressions, clicks, engagements, costLocal}. Defaults: the last 12 calendar\nmonths, the only selected ad account, 100 companies a page (--page 2 for the next, --full for all).\n\nExamples:\n baker ads linkedin companies # last 12 months, whole account\n baker ads linkedin companies --page 2 # the next 100 companies\n baker ads linkedin companies --by month --min-impressions 50 # when each company warmed up\n baker ads linkedin companies --campaign-id 333728193,810055513 --by campaign\n baker ads linkedin companies --with-domains --output csv # + website domain, for CRM matching\n baker ads linkedin companies --last-months 3 --stats # + how complete LinkedIn's data is\n\nLinkedIn reports companies 12-24h late and leaves out any company with fewer than 3 events in a month,\nso small companies are undercounted. engagements = LinkedIn's totalEngagements.`,\n },\n args: {\n \"account-id\": {\n type: \"string\",\n description: \"Ad account id (numeric or urn:li:sponsoredAccount:N). Default: the only selected account\",\n },\n \"campaign-id\": { type: \"string\", description: \"Comma-separated campaign ids — read only these campaigns\" },\n \"last-months\": { type: \"string\", description: \"Calendar months back, including this one (1-24, default 12)\" },\n start: { type: \"string\", description: \"Start date YYYY-MM-DD (instead of --last-months)\" },\n end: { type: \"string\", description: \"End date YYYY-MM-DD (default today)\" },\n by: { type: \"string\", description: \"none | month | campaign — break each company down (default none)\" },\n \"with-domains\": { type: \"boolean\", description: \"Add each company's website domain and domainSource\" },\n \"min-impressions\": { type: \"string\", description: \"Leave out companies under N impressions over the period\" },\n full: { type: \"boolean\", description: \"Every company (not just a page of 100), plus videoViews\" },\n page: {\n type: \"string\",\n description: \"Which page of 100 companies, most engaged first (default 1); totalCompanies counts them all\",\n },\n stats: { type: \"boolean\", description: \"Add read-quality stats: row counts, cost/reach/domain coverage\" },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const input: LinkedinCompaniesRequestInput = {\n accountId: bareAccountId((args[\"account-id\"] as string | undefined) || getEnv().BAKER_LINKEDIN_AD_ACCOUNT_ID),\n campaignIds: csvList(args[\"campaign-id\"]),\n lastMonths: optionalNumber(args[\"last-months\"]),\n start: args.start as string | undefined,\n end: args.end as string | undefined,\n by: args.by as (typeof LINKEDIN_COMPANIES_BY)[number] | undefined,\n withDomains: Boolean(args[\"with-domains\"]),\n minImpressions: optionalNumber(args[\"min-impressions\"]),\n full: Boolean(args.full),\n page: optionalNumber(args.page),\n stats: Boolean(args.stats),\n skipCache: Boolean(args[\"no-cache\"]),\n };\n const parsed = linkedinCompaniesRequestSchema.safeParse(input);\n const formatRefusal = outputFormatRefusal(csvOrJson(args), TABLE_OUTPUT_FORMATS);\n if (!parsed.success || formatRefusal !== null) {\n const issues = parsed.success ? [] : parsed.error.issues;\n const messages = issues.map((issue) => `${flagOf(issue.path.join(\".\"))}: ${issue.message}`);\n writeAdsJson({\n ok: false,\n error: { code: \"INVALID_ARGS\", message: [...messages, ...(formatRefusal ? [formatRefusal] : [])].join(\"; \") },\n });\n process.exit(1);\n }\n\n try {\n const { data } = await apiPost<{ ok: true; data: LinkedinCompaniesResponse }>(\n \"/api/ads/linkedin/companies\",\n input,\n { timeoutMs: COMPANIES_TIMEOUT_MS },\n );\n const hints = companiesHints(data, parsed.data);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n const notes = [...data.warnings.map((w) => `${w.code}: ${w.message}`), ...hints];\n writeAdsOutput(data.rows, fmt, CSV_FIELDS, notes);\n return;\n }\n writeJsonEnvelope(hints.length > 0 ? { ok: true, data, hints } : { ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n"],"mappings":"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","names":[]}
@@ -3,14 +3,13 @@ import {
3
3
  failValidation,
4
4
  isTempId,
5
5
  writeOk
6
- } from "./chunk-SJYEY5MV.js";
6
+ } from "./chunk-3HJLHTWP.js";
7
7
  import {
8
8
  ACTION_COMPLETE_NOTE_MIN
9
- } from "./chunk-7EPXVICM.js";
9
+ } from "./chunk-XF4JUKVF.js";
10
10
  import "./chunk-GXDLWBOY.js";
11
11
  import "./chunk-TEINLN64.js";
12
12
  import "./chunk-ZJWUBJYQ.js";
13
- import "./chunk-HR6IWNKE.js";
14
13
  import "./chunk-NE4F3FHN.js";
15
14
  import {
16
15
  apiPost,
@@ -79,4 +78,4 @@ var completeCommand = defineCommand({
79
78
  export {
80
79
  completeCommand
81
80
  };
82
- //# sourceMappingURL=complete-LYR2HMQU.js.map
81
+ //# sourceMappingURL=complete-2FZMGJV5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/actions/complete.ts"],"sourcesContent":["import { ACTION_COMPLETE_NOTE_MIN, type ActionsCompleteResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, isTempId, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.complete\",\n description:\n \"Stage completion of an action (it was done). Accepts a real action ID (must be claimed) or a temp ID from the same draft. The action becomes completed when the chat is published. --note is required and must describe what you actually did to resolve it (what changed, where, and the outcome) — it is the client-facing record surfaced by `baker actions log`. Don't use this to drop an action you no longer want — to remove a staged op use `actions draft remove`, to close an unwanted published action use `actions discard`.\",\n args: {\n id: { type: \"string\", description: \"Action ID or temp ID\", required: true },\n note: {\n type: \"string\",\n description:\n \"REQUIRED. Detailed description of what you did to resolve this: what changed, where, and the outcome. This is the durable, client-facing record shown by `baker actions log`.\",\n required: true,\n },\n },\n});\n\nexport const completeCommand = defineCommand({\n meta: {\n name: \"complete\",\n description:\n \"Stage completion of an action. Accepts real IDs (claimed) or temp IDs (same draft). Example: baker actions complete <id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Action ID or temp ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID or temp ID\", required: false },\n note: {\n type: \"string\",\n description: \"REQUIRED. What you did to resolve this: what changed, where, and the outcome.\",\n required: false,\n },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Action ID is required.\");\n }\n if (!isTempId(id)) {\n validateConvexId(id);\n }\n const note = (args.note as string | undefined)?.trim() ?? \"\";\n if (note.length < ACTION_COMPLETE_NOTE_MIN) {\n failValidation(\n `--note is required and must describe what you did (≥${ACTION_COMPLETE_NOTE_MIN} chars): what changed, where, and the outcome. This becomes the client-facing record surfaced by \\`baker actions log\\`.`,\n );\n }\n const chatId = requireChatId();\n await apiPost<ActionsCompleteResponse>(\"/api/actions/complete\", { chatId, actionRef: id, note });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,KAAK;AAAA,IAC1E,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,wBAAwB,UAAU,MAAM;AAAA,IAC/E,aAAa,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IACpF,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,WAAW;AAC/D,UAAI,CAAC,IAAI;AACP,uBAAe,wBAAwB;AAAA,MACzC;AACA,UAAI,CAAC,SAAS,EAAE,GAAG;AACjB,yBAAiB,EAAE;AAAA,MACrB;AACA,YAAM,OAAQ,KAAK,MAA6B,KAAK,KAAK;AAC1D,UAAI,KAAK,SAAS,0BAA0B;AAC1C;AAAA,UACE,4DAAuD,wBAAwB;AAAA,QACjF;AAAA,MACF;AACA,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAiC,yBAAyB,EAAE,QAAQ,WAAW,IAAI,KAAK,CAAC;AAC/F,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/commands/actions/complete.ts"],"sourcesContent":["import { ACTION_COMPLETE_NOTE_MIN, type ActionsCompleteResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, isTempId, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.complete\",\n description:\n \"Stage completion of an action (it was done). Accepts a real action ID (must be claimed) or a temp ID from the same draft. The action becomes completed when the chat is published. --note is required and must describe what you actually did to resolve it (what changed, where, and the outcome) — it is the client-facing record surfaced by `baker actions log`. Don't use this to drop an action you no longer want — to remove a staged op use `actions draft remove`, to close an unwanted published action use `actions discard`.\",\n args: {\n id: { type: \"string\", description: \"Action ID or temp ID\", required: true },\n note: {\n type: \"string\",\n description:\n \"REQUIRED. Detailed description of what you did to resolve this: what changed, where, and the outcome. This is the durable, client-facing record shown by `baker actions log`.\",\n required: true,\n },\n },\n});\n\nexport const completeCommand = defineCommand({\n meta: {\n name: \"complete\",\n description:\n \"Stage completion of an action. Accepts real IDs (claimed) or temp IDs (same draft). Example: baker actions complete <id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Action ID or temp ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID or temp ID\", required: false },\n note: {\n type: \"string\",\n description: \"REQUIRED. What you did to resolve this: what changed, where, and the outcome.\",\n required: false,\n },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Action ID is required.\");\n }\n if (!isTempId(id)) {\n validateConvexId(id);\n }\n const note = (args.note as string | undefined)?.trim() ?? \"\";\n if (note.length < ACTION_COMPLETE_NOTE_MIN) {\n failValidation(\n `--note is required and must describe what you did (≥${ACTION_COMPLETE_NOTE_MIN} chars): what changed, where, and the outcome. This becomes the client-facing record surfaced by \\`baker actions log\\`.`,\n );\n }\n const chatId = requireChatId();\n await apiPost<ActionsCompleteResponse>(\"/api/actions/complete\", { chatId, actionRef: id, note });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,KAAK;AAAA,IAC1E,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,wBAAwB,UAAU,MAAM;AAAA,IAC/E,aAAa,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IACpF,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,WAAW;AAC/D,UAAI,CAAC,IAAI;AACP,uBAAe,wBAAwB;AAAA,MACzC;AACA,UAAI,CAAC,SAAS,EAAE,GAAG;AACjB,yBAAiB,EAAE;AAAA,MACrB;AACA,YAAM,OAAQ,KAAK,MAA6B,KAAK,KAAK;AAC1D,UAAI,KAAK,SAAS,0BAA0B;AAC1C;AAAA,UACE,4DAAuD,wBAAwB;AAAA,QACjF;AAAA,MACF;AACA,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAiC,yBAAyB,EAAE,QAAQ,WAAW,IAAI,KAAK,CAAC;AAC/F,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -1,25 +1,21 @@
1
1
  import {
2
2
  attachDestination,
3
- attachSettings,
4
3
  attachStep,
5
4
  connectCommand,
6
5
  copyDestination,
7
6
  destinationRefusal,
8
- restatableTargets,
9
- sealRequestFor,
10
7
  targetsFor,
11
8
  unpickedSteps,
12
9
  unwiredHubspotForms,
13
10
  unwiredSideEffects
14
- } from "./chunk-QE7W555R.js";
15
- import "./chunk-VLMBTPXU.js";
16
- import "./chunk-HROZYQ5H.js";
17
- import "./chunk-SJYEY5MV.js";
18
- import "./chunk-7EPXVICM.js";
11
+ } from "./chunk-DWHIOO7E.js";
12
+ import "./chunk-SHL7LOC3.js";
13
+ import "./chunk-YRQYA2LR.js";
14
+ import "./chunk-3HJLHTWP.js";
15
+ import "./chunk-XF4JUKVF.js";
19
16
  import "./chunk-GXDLWBOY.js";
20
17
  import "./chunk-TEINLN64.js";
21
18
  import "./chunk-ZJWUBJYQ.js";
22
- import "./chunk-HR6IWNKE.js";
23
19
  import "./chunk-NE4F3FHN.js";
24
20
  import "./chunk-XBOK23HI.js";
25
21
  import "./chunk-IFWP3ZDO.js";
@@ -28,16 +24,13 @@ import "./chunk-NU7JSWVA.js";
28
24
  import "./chunk-YQSBHWOI.js";
29
25
  export {
30
26
  attachDestination,
31
- attachSettings,
32
27
  attachStep,
33
28
  connectCommand,
34
29
  copyDestination,
35
30
  destinationRefusal,
36
- restatableTargets,
37
- sealRequestFor,
38
31
  targetsFor,
39
32
  unpickedSteps,
40
33
  unwiredHubspotForms,
41
34
  unwiredSideEffects
42
35
  };
43
- //# sourceMappingURL=connect-FCXNVTXG.js.map
36
+ //# sourceMappingURL=connect-QCOGEPP4.js.map
@@ -3,7 +3,7 @@ import {
3
3
  daysAgoIso,
4
4
  handleLinkedinError,
5
5
  todayIso
6
- } from "./chunk-N4LAYIIN.js";
6
+ } from "./chunk-CSYSX4D2.js";
7
7
  import {
8
8
  writeAdsJson,
9
9
  writeAdsOutput
@@ -11,11 +11,10 @@ import {
11
11
  import {
12
12
  NO_CACHE_ARG
13
13
  } from "./chunk-X7ZODEXJ.js";
14
- import "./chunk-7EPXVICM.js";
14
+ import "./chunk-XF4JUKVF.js";
15
15
  import "./chunk-GXDLWBOY.js";
16
16
  import "./chunk-TEINLN64.js";
17
17
  import "./chunk-ZJWUBJYQ.js";
18
- import "./chunk-HR6IWNKE.js";
19
18
  import "./chunk-NE4F3FHN.js";
20
19
  import {
21
20
  apiPost
@@ -91,4 +90,4 @@ Examples:
91
90
  export {
92
91
  conversationCommand
93
92
  };
94
- //# sourceMappingURL=conversation-6ZJGPCXM.js.map
93
+ //# sourceMappingURL=conversation-6IOGV7B7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/ads/linkedin/conversation.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, daysAgoIso, handleLinkedinError, todayIso } from \"./shared.ts\";\n\ninterface AnalyticsResponse {\n rows: Array<Record<string, unknown>>;\n fields: string[];\n warnings: Array<{ code: string; message: string }>;\n}\n\n/**\n * Conversation Ads (Sponsored Messaging) per-button analytics. Wraps\n * --pivot conversation-node-button on /api/ads/linkedin/analytics.\n *\n * Lets agents see which CTA button inside a multi-step Sponsored Message\n * actually drives clicks — no other ad platform exposes this granularity.\n */\nexport const conversationCommand = defineCommand({\n meta: {\n name: \"conversation\",\n description: `Per-button click rates inside Sponsored Messaging / Conversation Ads.\n\nReturns one row per CONVERSATION_NODE_BUTTON pivot, sorted by clicks desc.\nUse this to A/B test button copy and the cascade tree.\n\nExamples:\n baker ads linkedin conversation --campaign-id 1234\n baker ads linkedin conversation --campaign-id 1234 --last-days 30 --output csv`,\n },\n args: {\n \"campaign-id\": {\n type: \"string\",\n description: \"Comma-separated campaign IDs (Conversation Ad campaigns)\",\n required: true,\n },\n start: { type: \"string\", description: \"Start date YYYY-MM-DD\" },\n end: { type: \"string\", description: \"End date YYYY-MM-DD\" },\n \"last-days\": { type: \"string\", description: \"Window relative to today (default: 30)\" },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const campaignIdsRaw = args[\"campaign-id\"] as string | undefined;\n if (!campaignIdsRaw) {\n handleLinkedinError(new Error(\"--campaign-id is required\"));\n }\n const ids = campaignIdsRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n const start = (args.start as string | undefined) ?? daysAgoIso(args[\"last-days\"] ? Number(args[\"last-days\"]) : 30);\n const end = (args.end as string | undefined) ?? todayIso();\n\n try {\n const data = await apiPost<AnalyticsResponse>(\"/api/ads/linkedin/analytics\", {\n request: {\n level: \"campaign\",\n ids,\n intent: \"inmail\",\n pivot: \"conversation-node-button\",\n start,\n end,\n granularity: \"ALL\",\n limit: 500,\n },\n skipCache: Boolean(args[\"no-cache\"]),\n });\n const sorted = [...data.rows].sort((a, b) => Number(b.clicks ?? 0) - Number(a.clicks ?? 0));\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(sorted, fmt, data.fields);\n return;\n }\n writeAdsJson({\n ok: true,\n data: { query: { campaigns: ids, start, end }, rows: sorted, warnings: data.warnings },\n });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAmBvB,IAAM,sBAAsB,cAAc;AAAA,EAC/C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQf;AAAA,EACA,MAAM;AAAA,IACJ,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,IAC9D,KAAK,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,IAC1D,aAAa,EAAE,MAAM,UAAU,aAAa,yCAAyC;AAAA,IACrF,YAAY;AAAA,IACZ,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,SAAS,OAAO;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,iBAAiB,KAAK,aAAa;AACzC,QAAI,CAAC,gBAAgB;AACnB,0BAAoB,IAAI,MAAM,2BAA2B,CAAC;AAAA,IAC5D;AACA,UAAM,MAAM,eACT,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,UAAM,QAAS,KAAK,SAAgC,WAAW,KAAK,WAAW,IAAI,OAAO,KAAK,WAAW,CAAC,IAAI,EAAE;AACjH,UAAM,MAAO,KAAK,OAA8B,SAAS;AAEzD,QAAI;AACF,YAAM,OAAO,MAAM,QAA2B,+BAA+B;AAAA,QAC3E,SAAS;AAAA,UACP,OAAO;AAAA,UACP;AAAA,UACA,QAAQ;AAAA,UACR,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA,aAAa;AAAA,UACb,OAAO;AAAA,QACT;AAAA,QACA,WAAW,QAAQ,KAAK,UAAU,CAAC;AAAA,MACrC,CAAC;AACD,YAAM,SAAS,CAAC,GAAG,KAAK,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,EAAE,UAAU,CAAC,IAAI,OAAO,EAAE,UAAU,CAAC,CAAC;AAC1F,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,QAAQ,KAAK,KAAK,MAAM;AACvC;AAAA,MACF;AACA,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,IAAI,GAAG,MAAM,QAAQ,UAAU,KAAK,SAAS;AAAA,MACvF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/commands/ads/linkedin/conversation.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, daysAgoIso, handleLinkedinError, todayIso } from \"./shared.ts\";\n\ninterface AnalyticsResponse {\n rows: Array<Record<string, unknown>>;\n fields: string[];\n warnings: Array<{ code: string; message: string }>;\n}\n\n/**\n * Conversation Ads (Sponsored Messaging) per-button analytics. Wraps\n * --pivot conversation-node-button on /api/ads/linkedin/analytics.\n *\n * Lets agents see which CTA button inside a multi-step Sponsored Message\n * actually drives clicks — no other ad platform exposes this granularity.\n */\nexport const conversationCommand = defineCommand({\n meta: {\n name: \"conversation\",\n description: `Per-button click rates inside Sponsored Messaging / Conversation Ads.\n\nReturns one row per CONVERSATION_NODE_BUTTON pivot, sorted by clicks desc.\nUse this to A/B test button copy and the cascade tree.\n\nExamples:\n baker ads linkedin conversation --campaign-id 1234\n baker ads linkedin conversation --campaign-id 1234 --last-days 30 --output csv`,\n },\n args: {\n \"campaign-id\": {\n type: \"string\",\n description: \"Comma-separated campaign IDs (Conversation Ad campaigns)\",\n required: true,\n },\n start: { type: \"string\", description: \"Start date YYYY-MM-DD\" },\n end: { type: \"string\", description: \"End date YYYY-MM-DD\" },\n \"last-days\": { type: \"string\", description: \"Window relative to today (default: 30)\" },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const campaignIdsRaw = args[\"campaign-id\"] as string | undefined;\n if (!campaignIdsRaw) {\n handleLinkedinError(new Error(\"--campaign-id is required\"));\n }\n const ids = campaignIdsRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n const start = (args.start as string | undefined) ?? daysAgoIso(args[\"last-days\"] ? Number(args[\"last-days\"]) : 30);\n const end = (args.end as string | undefined) ?? todayIso();\n\n try {\n const data = await apiPost<AnalyticsResponse>(\"/api/ads/linkedin/analytics\", {\n request: {\n level: \"campaign\",\n ids,\n intent: \"inmail\",\n pivot: \"conversation-node-button\",\n start,\n end,\n granularity: \"ALL\",\n limit: 500,\n },\n skipCache: Boolean(args[\"no-cache\"]),\n });\n const sorted = [...data.rows].sort((a, b) => Number(b.clicks ?? 0) - Number(a.clicks ?? 0));\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(sorted, fmt, data.fields);\n return;\n }\n writeAdsJson({\n ok: true,\n data: { query: { campaigns: ids, start, end }, rows: sorted, warnings: data.warnings },\n });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAmBvB,IAAM,sBAAsB,cAAc;AAAA,EAC/C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQf;AAAA,EACA,MAAM;AAAA,IACJ,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,IAC9D,KAAK,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,IAC1D,aAAa,EAAE,MAAM,UAAU,aAAa,yCAAyC;AAAA,IACrF,YAAY;AAAA,IACZ,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,SAAS,OAAO;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,iBAAiB,KAAK,aAAa;AACzC,QAAI,CAAC,gBAAgB;AACnB,0BAAoB,IAAI,MAAM,2BAA2B,CAAC;AAAA,IAC5D;AACA,UAAM,MAAM,eACT,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,UAAM,QAAS,KAAK,SAAgC,WAAW,KAAK,WAAW,IAAI,OAAO,KAAK,WAAW,CAAC,IAAI,EAAE;AACjH,UAAM,MAAO,KAAK,OAA8B,SAAS;AAEzD,QAAI;AACF,YAAM,OAAO,MAAM,QAA2B,+BAA+B;AAAA,QAC3E,SAAS;AAAA,UACP,OAAO;AAAA,UACP;AAAA,UACA,QAAQ;AAAA,UACR,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA,aAAa;AAAA,UACb,OAAO;AAAA,QACT;AAAA,QACA,WAAW,QAAQ,KAAK,UAAU,CAAC;AAAA,MACrC,CAAC;AACD,YAAM,SAAS,CAAC,GAAG,KAAK,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,EAAE,UAAU,CAAC,IAAI,OAAO,EAAE,UAAU,CAAC,CAAC;AAC1F,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,QAAQ,KAAK,KAAK,MAAM;AACvC;AAAA,MACF;AACA,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,IAAI,GAAG,MAAM,QAAQ,UAAU,KAAK,SAAS;AAAA,MACvF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  csvOrJson,
3
3
  handleLinkedinError,
4
4
  resolveAccountIdArg
5
- } from "./chunk-N4LAYIIN.js";
5
+ } from "./chunk-CSYSX4D2.js";
6
6
  import {
7
7
  writeAdsJson,
8
8
  writeAdsOutput
@@ -10,11 +10,10 @@ import {
10
10
  import {
11
11
  NO_CACHE_ARG
12
12
  } from "./chunk-X7ZODEXJ.js";
13
- import "./chunk-7EPXVICM.js";
13
+ import "./chunk-XF4JUKVF.js";
14
14
  import "./chunk-GXDLWBOY.js";
15
15
  import "./chunk-TEINLN64.js";
16
16
  import "./chunk-ZJWUBJYQ.js";
17
- import "./chunk-HR6IWNKE.js";
18
17
  import "./chunk-NE4F3FHN.js";
19
18
  import {
20
19
  apiGet
@@ -124,13 +123,13 @@ Subcommands:
124
123
  subCommands: {
125
124
  list: listCmd,
126
125
  health: healthCmd,
127
- create: () => import("./write-commands-7SJ3BOW5.js").then((m) => m.conversionsCreateCommand),
128
- update: () => import("./write-commands-7SJ3BOW5.js").then((m) => m.conversionsUpdateCommand),
129
- "associate-campaign": () => import("./write-commands-7SJ3BOW5.js").then((m) => m.conversionsAssociateCommand),
130
- "dissociate-campaign": () => import("./write-commands-7SJ3BOW5.js").then((m) => m.conversionsDissociateCommand)
126
+ create: () => import("./write-commands-5C7FUOVN.js").then((m) => m.conversionsCreateCommand),
127
+ update: () => import("./write-commands-5C7FUOVN.js").then((m) => m.conversionsUpdateCommand),
128
+ "associate-campaign": () => import("./write-commands-5C7FUOVN.js").then((m) => m.conversionsAssociateCommand),
129
+ "dissociate-campaign": () => import("./write-commands-5C7FUOVN.js").then((m) => m.conversionsDissociateCommand)
131
130
  }
132
131
  });
133
132
  export {
134
133
  conversionsCommand
135
134
  };
136
- //# sourceMappingURL=conversions-UHB55MMQ.js.map
135
+ //# sourceMappingURL=conversions-4SRZPBBX.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/ads/linkedin/conversions.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError, resolveAccountIdArg } from \"./shared.ts\";\n\ninterface ConversionRule {\n id: string;\n urn: string;\n account: string;\n name?: string;\n type?: string;\n enabled?: boolean;\n conversionMethod?: string;\n attributionType?: string;\n postClickAttributionWindowSize?: number;\n viewThroughAttributionWindowSize?: number;\n associatedCampaigns?: string[];\n countingMethod?: string;\n lastConversionReportedAt?: number;\n}\n\nconst DAY_MS = 86_400_000;\n\nfunction healthOf(rules: ConversionRule[]): {\n totalRules: number;\n enabledRules: number;\n capiRules: number;\n pixelRules: number;\n hasLeadEvent: boolean;\n hasPurchaseEvent: boolean;\n staleCapiRules: ConversionRule[];\n longViewWindow: ConversionRule[];\n wrongLeadDedup: ConversionRule[];\n} {\n const enabled = rules.filter((r) => r.enabled !== false);\n const capi = enabled.filter((r) => r.conversionMethod === \"CONVERSIONS_API\");\n const pixel = enabled.filter((r) => r.conversionMethod === \"PIXEL\");\n const staleCapi = capi.filter(\n (r) => !r.lastConversionReportedAt || Date.now() - r.lastConversionReportedAt > 7 * DAY_MS,\n );\n const longView = enabled.filter(\n (r) => r.viewThroughAttributionWindowSize !== undefined && r.viewThroughAttributionWindowSize > 7,\n );\n const leads = enabled.filter((r) => r.type === \"LEAD\");\n const wrongDedup = leads.filter((r) => r.countingMethod && r.countingMethod !== \"ONE_TIME_EACH_MEMBER\");\n return {\n totalRules: rules.length,\n enabledRules: enabled.length,\n capiRules: capi.length,\n pixelRules: pixel.length,\n hasLeadEvent: leads.length > 0,\n hasPurchaseEvent: enabled.some((r) => r.type === \"PURCHASE\"),\n staleCapiRules: staleCapi,\n longViewWindow: longView,\n wrongLeadDedup: wrongDedup,\n };\n}\n\nconst listCmd = defineCommand({\n meta: {\n name: \"list\",\n description: `List conversion rules on the account.`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<ConversionRule[]>(\"/api/ads/linkedin/conversions\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\nconst healthCmd = defineCommand({\n meta: {\n name: \"health\",\n description: `5-point Insight Tag / CAPI health check (playbook §07).\n\nSurfaces:\n - Are rules enabled?\n - Do we have at least one LEAD or PURCHASE event?\n - Do CAPI rules show recent activity (≤7 days)?\n - Is the view-through window ≤7 days?\n - Do LEAD rules use ONE_TIME_EACH_MEMBER de-dup?`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<ConversionRule[]>(\"/api/ads/linkedin/conversions\", params);\n writeAdsJson({ ok: true, data: healthOf(data) });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\nexport const conversionsCommand = defineCommand({\n meta: {\n name: \"conversions\",\n description: `Conversion rules — Insight Tag and Conversions API.\n\nSubcommands:\n list — every rule on the account\n health — playbook §07 5-point health check\n create / update — stage a conversion-rule write (applies on chat publish)\n associate-campaign / dissociate-campaign\n — which ad sets a rule counts for (its own LinkedIn record, not a field on the rule)`,\n },\n subCommands: {\n list: listCmd,\n health: healthCmd,\n create: () => import(\"./write-commands.ts\").then((m) => m.conversionsCreateCommand),\n update: () => import(\"./write-commands.ts\").then((m) => m.conversionsUpdateCommand),\n \"associate-campaign\": () => import(\"./write-commands.ts\").then((m) => m.conversionsAssociateCommand),\n \"dissociate-campaign\": () => import(\"./write-commands.ts\").then((m) => m.conversionsDissociateCommand),\n },\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/commands/ads/linkedin/conversions.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError, resolveAccountIdArg } from \"./shared.ts\";\n\ninterface ConversionRule {\n id: string;\n urn: string;\n account: string;\n name?: string;\n type?: string;\n enabled?: boolean;\n conversionMethod?: string;\n attributionType?: string;\n postClickAttributionWindowSize?: number;\n viewThroughAttributionWindowSize?: number;\n associatedCampaigns?: string[];\n countingMethod?: string;\n lastConversionReportedAt?: number;\n}\n\nconst DAY_MS = 86_400_000;\n\nfunction healthOf(rules: ConversionRule[]): {\n totalRules: number;\n enabledRules: number;\n capiRules: number;\n pixelRules: number;\n hasLeadEvent: boolean;\n hasPurchaseEvent: boolean;\n staleCapiRules: ConversionRule[];\n longViewWindow: ConversionRule[];\n wrongLeadDedup: ConversionRule[];\n} {\n const enabled = rules.filter((r) => r.enabled !== false);\n const capi = enabled.filter((r) => r.conversionMethod === \"CONVERSIONS_API\");\n const pixel = enabled.filter((r) => r.conversionMethod === \"PIXEL\");\n const staleCapi = capi.filter(\n (r) => !r.lastConversionReportedAt || Date.now() - r.lastConversionReportedAt > 7 * DAY_MS,\n );\n const longView = enabled.filter(\n (r) => r.viewThroughAttributionWindowSize !== undefined && r.viewThroughAttributionWindowSize > 7,\n );\n const leads = enabled.filter((r) => r.type === \"LEAD\");\n const wrongDedup = leads.filter((r) => r.countingMethod && r.countingMethod !== \"ONE_TIME_EACH_MEMBER\");\n return {\n totalRules: rules.length,\n enabledRules: enabled.length,\n capiRules: capi.length,\n pixelRules: pixel.length,\n hasLeadEvent: leads.length > 0,\n hasPurchaseEvent: enabled.some((r) => r.type === \"PURCHASE\"),\n staleCapiRules: staleCapi,\n longViewWindow: longView,\n wrongLeadDedup: wrongDedup,\n };\n}\n\nconst listCmd = defineCommand({\n meta: {\n name: \"list\",\n description: `List conversion rules on the account.`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<ConversionRule[]>(\"/api/ads/linkedin/conversions\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\nconst healthCmd = defineCommand({\n meta: {\n name: \"health\",\n description: `5-point Insight Tag / CAPI health check (playbook §07).\n\nSurfaces:\n - Are rules enabled?\n - Do we have at least one LEAD or PURCHASE event?\n - Do CAPI rules show recent activity (≤7 days)?\n - Is the view-through window ≤7 days?\n - Do LEAD rules use ONE_TIME_EACH_MEMBER de-dup?`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<ConversionRule[]>(\"/api/ads/linkedin/conversions\", params);\n writeAdsJson({ ok: true, data: healthOf(data) });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\nexport const conversionsCommand = defineCommand({\n meta: {\n name: \"conversions\",\n description: `Conversion rules — Insight Tag and Conversions API.\n\nSubcommands:\n list — every rule on the account\n health — playbook §07 5-point health check\n create / update — stage a conversion-rule write (applies on chat publish)\n associate-campaign / dissociate-campaign\n — which ad sets a rule counts for (its own LinkedIn record, not a field on the rule)`,\n },\n subCommands: {\n list: listCmd,\n health: healthCmd,\n create: () => import(\"./write-commands.ts\").then((m) => m.conversionsCreateCommand),\n update: () => import(\"./write-commands.ts\").then((m) => m.conversionsUpdateCommand),\n \"associate-campaign\": () => import(\"./write-commands.ts\").then((m) => m.conversionsAssociateCommand),\n \"dissociate-campaign\": () => import(\"./write-commands.ts\").then((m) => m.conversionsDissociateCommand),\n },\n});\n"],"mappings":"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","names":[]}
@@ -13,11 +13,10 @@ import {
13
13
  } from "./chunk-PWGWMIIJ.js";
14
14
  import {
15
15
  AVATAR_HANDLE_PATTERN
16
- } from "./chunk-7EPXVICM.js";
16
+ } from "./chunk-XF4JUKVF.js";
17
17
  import "./chunk-GXDLWBOY.js";
18
18
  import "./chunk-TEINLN64.js";
19
19
  import "./chunk-ZJWUBJYQ.js";
20
- import "./chunk-HR6IWNKE.js";
21
20
  import "./chunk-NE4F3FHN.js";
22
21
  import "./chunk-XBOK23HI.js";
23
22
  import "./chunk-IFWP3ZDO.js";
@@ -205,4 +204,4 @@ var createCommand = defineCommand({
205
204
  export {
206
205
  createCommand
207
206
  };
208
- //# sourceMappingURL=create-EX6OWLNM.js.map
207
+ //# sourceMappingURL=create-BJNMO6HT.js.map