@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
@@ -1,18 +1,17 @@
1
1
  import {
2
2
  failNotConnected
3
- } from "./chunk-VLMBTPXU.js";
3
+ } from "./chunk-SHL7LOC3.js";
4
4
  import {
5
5
  writeAdsOutput
6
6
  } from "./chunk-VFIOJD5M.js";
7
- import "./chunk-SJYEY5MV.js";
7
+ import "./chunk-3HJLHTWP.js";
8
8
  import {
9
9
  hubspotCompaniesSearchRequestSchema,
10
10
  hubspotDealsListRequestSchema
11
- } from "./chunk-7EPXVICM.js";
11
+ } from "./chunk-XF4JUKVF.js";
12
12
  import "./chunk-GXDLWBOY.js";
13
13
  import "./chunk-TEINLN64.js";
14
14
  import "./chunk-ZJWUBJYQ.js";
15
- import "./chunk-HR6IWNKE.js";
16
15
  import "./chunk-NE4F3FHN.js";
17
16
  import {
18
17
  apiPost
@@ -222,4 +221,4 @@ export {
222
221
  dealsListCommand,
223
222
  dealsListHints
224
223
  };
225
- //# sourceMappingURL=crm-VK44O3ED.js.map
224
+ //# sourceMappingURL=crm-52ROSWH5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/hubspot/crm.ts"],"sourcesContent":["import {\n type HubspotCompaniesSearchRequest,\n type HubspotCompaniesSearchResponse,\n type HubspotDealsListRequest,\n type HubspotDealsListResponse,\n hubspotCompaniesSearchRequestSchema,\n hubspotDealsListRequestSchema,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { writeAdsOutput } from \"../ads/output.ts\";\nimport { failNotConnected } from \"./refusal.ts\";\n\n/** What the agent should take from a page of deals that the rows alone don't say. */\nexport function dealsListHints(\n data: HubspotDealsListResponse[\"data\"],\n request: { pipelineIds: readonly string[]; modifiedSince?: string },\n): string[] {\n const hints: string[] = [];\n if (data.deals.length === 0 && (request.pipelineIds.length > 0 || request.modifiedSince !== undefined)) {\n hints.push(\n \"No deals matched. Widen the read: drop --pipeline, or pass an earlier --modified-since (`baker hubspot pipelines list` shows the pipeline ids).\",\n );\n }\n if (data.next !== null) {\n hints.push(`More deals follow: run it again with --after ${data.next}.`);\n }\n if (data.restartFrom !== null) {\n hints.push(\n `HubSpot stops one search at 10,000 deals. Read on with --modified-since ${data.restartFrom} (no --after); the first deal repeats the last one here.`,\n );\n }\n if (!data.companiesReadable) {\n hints.push(\n \"Deals came back without their companies: this HubSpot connection cannot read companies. Do not report a deal as having no company — you cannot tell. The user can enable it by reconnecting HubSpot.\",\n );\n }\n return hints;\n}\n\n/** What the agent should take from a company search that the rows alone don't say. */\nexport function companiesSearchHints(\n data: HubspotCompaniesSearchResponse[\"data\"],\n request: { withDeals: boolean },\n): string[] {\n const hints: string[] = [];\n if (data.notFound.length > 0) {\n hints.push(\n `${data.notFound.length} domain(s) are not in HubSpot: ${data.notFound.join(\", \")}. Those companies are new to the CRM — not in pipeline — which is a finding, not a failed search.`,\n );\n }\n if (!request.withDeals && data.companies.length > 0) {\n hints.push(\"Add --with-deals to see each company's deals: amount, stage, and whether it closed won.\");\n }\n if (data.truncated) {\n hints.push(\n \"More companies matched than --limit, so the search stopped before checking every domain: a domain with no row here may still be in HubSpot, and notFound leaves it out. Do not report a domain without a row as new to the CRM until a search returns every match: raise --limit (up to 500) or search fewer domains at a time.\",\n );\n }\n return hints;\n}\n\nfunction list(raw: unknown, separator: string): string[] | undefined {\n if (typeof raw !== \"string\") return undefined;\n const items = raw\n .split(separator)\n .map((item) => item.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\nfunction optionalNumber(raw: unknown): number | undefined {\n return typeof raw === \"string\" && raw.trim() !== \"\" ? Number(raw) : undefined;\n}\n\n/** A request the schema refuses never reaches HubSpot; say which flag, in the envelope. */\nfunction failInvalid(issues: ReadonlyArray<{ path: PropertyKey[]; message: string }>): never {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: issues.map((issue) => `${issue.path.map(String).join(\".\") || \"args\"}: ${issue.message}`).join(\"; \"),\n },\n });\n process.exit(1);\n}\n\nconst OUTPUT_ARG = {\n type: \"string\",\n description: \"json|csv|jsonl|md (default json). csv/jsonl/md print the rows only; hints go to stderr\",\n required: false,\n default: \"json\",\n} as const;\n\nconst COMPANIES_SEARCH_ARGS = {\n domains: {\n type: \"string\",\n description: \"Comma-separated website domains, up to 100 (acme.com,globex.io). URLs and www. are fine\",\n required: false,\n },\n names: {\n type: \"string\",\n description: \"Semicolon-separated exact company names (names contain commas): 'Acme, Inc.;Globex'\",\n required: false,\n },\n \"with-deals\": {\n type: \"boolean\",\n description: \"Add each company's deals: amount, currency, pipeline, stage, closed/won, dates\",\n required: false,\n default: false,\n },\n limit: { type: \"string\", description: \"Most companies to return, 1-500 (default 100)\", required: false },\n output: OUTPUT_ARG,\n} as const;\n\nregisterSchema({\n command: \"hubspot.companies.search\",\n description:\n \"Find the client's CRM companies (accounts) by website domain or name — start here to match an outside list of companies against HubSpot, e.g. the companies `baker ads linkedin companies --with-domains` says the ads reached: which are already accounts, which have deals, which are new. Rows: {id, name, domain, linkedinPage}; --with-deals adds each company's deals. `notFound` lists the domains no CRM company carries — new to the CRM, a finding; when `truncated`, it leaves out the domains the search did not reach. Reads records only; changes nothing in HubSpot.\",\n args: COMPANIES_SEARCH_ARGS,\n});\n\nconst COMPANY_CSV_FIELDS = [\"id\", \"name\", \"domain\", \"linkedinPage\", \"deals\"];\n\nexport const companiesSearchCommand = defineCommand({\n meta: {\n name: \"search\",\n description:\n \"Find CRM companies by domain or name, optionally with their deals. Example: baker hubspot companies search --domains acme.com,globex.io --with-deals\",\n },\n args: COMPANIES_SEARCH_ARGS,\n run: async ({ args }) => {\n const input: HubspotCompaniesSearchRequest = {\n domains: list(args.domains, \",\"),\n names: list(args.names, \";\"),\n withDeals: Boolean(args[\"with-deals\"]),\n limit: optionalNumber(args.limit),\n };\n const parsed = hubspotCompaniesSearchRequestSchema.safeParse(input);\n if (!parsed.success) failInvalid(parsed.error.issues);\n\n try {\n const response = await apiPost<HubspotCompaniesSearchResponse>(\"/api/hubspot/companies/search\", parsed.data);\n const hints = companiesSearchHints(response.data, { withDeals: parsed.data.withDeals === true });\n const format = String(args.output ?? \"json\");\n if (format !== \"json\") {\n writeAdsOutput(response.data.companies, format, COMPANY_CSV_FIELDS, hints);\n return;\n }\n writeJson({\n ...response,\n meta: { count: response.data.companies.length },\n ...(hints.length > 0 ? { hints } : {}),\n });\n } catch (err) {\n failNotConnected(err, \"so I can see which of your companies and deals the ads reached\");\n }\n },\n});\n\nconst DEALS_LIST_ARGS = {\n pipeline: {\n type: \"string\",\n description: \"Comma-separated pipeline ids, from `baker hubspot pipelines list` (default: every pipeline)\",\n required: false,\n },\n \"modified-since\": {\n type: \"string\",\n description: \"Only deals changed on or after this date (YYYY-MM-DD or ISO date-time)\",\n required: false,\n },\n limit: { type: \"string\", description: \"Most deals to return, 1-1000 (default 200)\", required: false },\n after: { type: \"string\", description: \"Cursor from the previous page's `next`\", required: false },\n output: OUTPUT_ARG,\n} as const;\n\nregisterSchema({\n command: \"hubspot.deals.list\",\n description:\n \"The client's deals, oldest change first: {id, name, amount, currency, pipelineId, stageId, stageLabel, isClosed, isWon, createdAt, closedAt, modifiedAt, companyIds}. Start here for pipeline and revenue questions — which deals closed won, what is open, which companies they belong to (`companyIds` are HubSpot company ids, the same as `hubspot companies search` returns). Page with --after <next> until it is null. `amount: null` means no amount was entered, not zero.\",\n args: DEALS_LIST_ARGS,\n});\n\nconst DEAL_CSV_FIELDS = [\n \"id\",\n \"name\",\n \"amount\",\n \"currency\",\n \"pipelineId\",\n \"stageId\",\n \"stageLabel\",\n \"isClosed\",\n \"isWon\",\n \"createdAt\",\n \"closedAt\",\n \"modifiedAt\",\n \"companyIds\",\n];\n\nexport const dealsListCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List deals with amount, stage and whether they closed won. Example: baker hubspot deals list --pipeline default --modified-since 2026-01-01\",\n },\n args: DEALS_LIST_ARGS,\n run: async ({ args }) => {\n const input: HubspotDealsListRequest = {\n pipelineIds: list(args.pipeline, \",\"),\n modifiedSince: typeof args[\"modified-since\"] === \"string\" ? args[\"modified-since\"] : undefined,\n limit: optionalNumber(args.limit),\n after: typeof args.after === \"string\" && args.after !== \"\" ? args.after : undefined,\n };\n const parsed = hubspotDealsListRequestSchema.safeParse(input);\n if (!parsed.success) failInvalid(parsed.error.issues);\n\n try {\n const response = await apiPost<HubspotDealsListResponse>(\"/api/hubspot/deals/list\", parsed.data);\n const hints = dealsListHints(response.data, {\n pipelineIds: parsed.data.pipelineIds ?? [],\n modifiedSince: parsed.data.modifiedSince,\n });\n const format = String(args.output ?? \"json\");\n if (format !== \"json\") {\n writeAdsOutput(response.data.deals, format, DEAL_CSV_FIELDS, hints);\n return;\n }\n writeJson({ ...response, meta: { count: response.data.deals.length }, ...(hints.length > 0 ? { hints } : {}) });\n } catch (err) {\n failNotConnected(err, \"so I can see which of your companies and deals the ads reached\");\n }\n },\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/commands/hubspot/crm.ts"],"sourcesContent":["import {\n type HubspotCompaniesSearchRequest,\n type HubspotCompaniesSearchResponse,\n type HubspotDealsListRequest,\n type HubspotDealsListResponse,\n hubspotCompaniesSearchRequestSchema,\n hubspotDealsListRequestSchema,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { writeAdsOutput } from \"../ads/output.ts\";\nimport { failNotConnected } from \"./refusal.ts\";\n\n/** What the agent should take from a page of deals that the rows alone don't say. */\nexport function dealsListHints(\n data: HubspotDealsListResponse[\"data\"],\n request: { pipelineIds: readonly string[]; modifiedSince?: string },\n): string[] {\n const hints: string[] = [];\n if (data.deals.length === 0 && (request.pipelineIds.length > 0 || request.modifiedSince !== undefined)) {\n hints.push(\n \"No deals matched. Widen the read: drop --pipeline, or pass an earlier --modified-since (`baker hubspot pipelines list` shows the pipeline ids).\",\n );\n }\n if (data.next !== null) {\n hints.push(`More deals follow: run it again with --after ${data.next}.`);\n }\n if (data.restartFrom !== null) {\n hints.push(\n `HubSpot stops one search at 10,000 deals. Read on with --modified-since ${data.restartFrom} (no --after); the first deal repeats the last one here.`,\n );\n }\n if (!data.companiesReadable) {\n hints.push(\n \"Deals came back without their companies: this HubSpot connection cannot read companies. Do not report a deal as having no company — you cannot tell. The user can enable it by reconnecting HubSpot.\",\n );\n }\n return hints;\n}\n\n/** What the agent should take from a company search that the rows alone don't say. */\nexport function companiesSearchHints(\n data: HubspotCompaniesSearchResponse[\"data\"],\n request: { withDeals: boolean },\n): string[] {\n const hints: string[] = [];\n if (data.notFound.length > 0) {\n hints.push(\n `${data.notFound.length} domain(s) are not in HubSpot: ${data.notFound.join(\", \")}. Those companies are new to the CRM — not in pipeline — which is a finding, not a failed search.`,\n );\n }\n if (!request.withDeals && data.companies.length > 0) {\n hints.push(\"Add --with-deals to see each company's deals: amount, stage, and whether it closed won.\");\n }\n if (data.truncated) {\n hints.push(\n \"More companies matched than --limit, so the search stopped before checking every domain: a domain with no row here may still be in HubSpot, and notFound leaves it out. Do not report a domain without a row as new to the CRM until a search returns every match: raise --limit (up to 500) or search fewer domains at a time.\",\n );\n }\n return hints;\n}\n\nfunction list(raw: unknown, separator: string): string[] | undefined {\n if (typeof raw !== \"string\") return undefined;\n const items = raw\n .split(separator)\n .map((item) => item.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\nfunction optionalNumber(raw: unknown): number | undefined {\n return typeof raw === \"string\" && raw.trim() !== \"\" ? Number(raw) : undefined;\n}\n\n/** A request the schema refuses never reaches HubSpot; say which flag, in the envelope. */\nfunction failInvalid(issues: ReadonlyArray<{ path: PropertyKey[]; message: string }>): never {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: issues.map((issue) => `${issue.path.map(String).join(\".\") || \"args\"}: ${issue.message}`).join(\"; \"),\n },\n });\n process.exit(1);\n}\n\nconst OUTPUT_ARG = {\n type: \"string\",\n description: \"json|csv|jsonl|md (default json). csv/jsonl/md print the rows only; hints go to stderr\",\n required: false,\n default: \"json\",\n} as const;\n\nconst COMPANIES_SEARCH_ARGS = {\n domains: {\n type: \"string\",\n description: \"Comma-separated website domains, up to 100 (acme.com,globex.io). URLs and www. are fine\",\n required: false,\n },\n names: {\n type: \"string\",\n description: \"Semicolon-separated exact company names (names contain commas): 'Acme, Inc.;Globex'\",\n required: false,\n },\n \"with-deals\": {\n type: \"boolean\",\n description: \"Add each company's deals: amount, currency, pipeline, stage, closed/won, dates\",\n required: false,\n default: false,\n },\n limit: { type: \"string\", description: \"Most companies to return, 1-500 (default 100)\", required: false },\n output: OUTPUT_ARG,\n} as const;\n\nregisterSchema({\n command: \"hubspot.companies.search\",\n description:\n \"Find the client's CRM companies (accounts) by website domain or name — start here to match an outside list of companies against HubSpot, e.g. the companies `baker ads linkedin companies --with-domains` says the ads reached: which are already accounts, which have deals, which are new. Rows: {id, name, domain, linkedinPage}; --with-deals adds each company's deals. `notFound` lists the domains no CRM company carries — new to the CRM, a finding; when `truncated`, it leaves out the domains the search did not reach. Reads records only; changes nothing in HubSpot.\",\n args: COMPANIES_SEARCH_ARGS,\n});\n\nconst COMPANY_CSV_FIELDS = [\"id\", \"name\", \"domain\", \"linkedinPage\", \"deals\"];\n\nexport const companiesSearchCommand = defineCommand({\n meta: {\n name: \"search\",\n description:\n \"Find CRM companies by domain or name, optionally with their deals. Example: baker hubspot companies search --domains acme.com,globex.io --with-deals\",\n },\n args: COMPANIES_SEARCH_ARGS,\n run: async ({ args }) => {\n const input: HubspotCompaniesSearchRequest = {\n domains: list(args.domains, \",\"),\n names: list(args.names, \";\"),\n withDeals: Boolean(args[\"with-deals\"]),\n limit: optionalNumber(args.limit),\n };\n const parsed = hubspotCompaniesSearchRequestSchema.safeParse(input);\n if (!parsed.success) failInvalid(parsed.error.issues);\n\n try {\n const response = await apiPost<HubspotCompaniesSearchResponse>(\"/api/hubspot/companies/search\", parsed.data);\n const hints = companiesSearchHints(response.data, { withDeals: parsed.data.withDeals === true });\n const format = String(args.output ?? \"json\");\n if (format !== \"json\") {\n writeAdsOutput(response.data.companies, format, COMPANY_CSV_FIELDS, hints);\n return;\n }\n writeJson({\n ...response,\n meta: { count: response.data.companies.length },\n ...(hints.length > 0 ? { hints } : {}),\n });\n } catch (err) {\n failNotConnected(err, \"so I can see which of your companies and deals the ads reached\");\n }\n },\n});\n\nconst DEALS_LIST_ARGS = {\n pipeline: {\n type: \"string\",\n description: \"Comma-separated pipeline ids, from `baker hubspot pipelines list` (default: every pipeline)\",\n required: false,\n },\n \"modified-since\": {\n type: \"string\",\n description: \"Only deals changed on or after this date (YYYY-MM-DD or ISO date-time)\",\n required: false,\n },\n limit: { type: \"string\", description: \"Most deals to return, 1-1000 (default 200)\", required: false },\n after: { type: \"string\", description: \"Cursor from the previous page's `next`\", required: false },\n output: OUTPUT_ARG,\n} as const;\n\nregisterSchema({\n command: \"hubspot.deals.list\",\n description:\n \"The client's deals, oldest change first: {id, name, amount, currency, pipelineId, stageId, stageLabel, isClosed, isWon, createdAt, closedAt, modifiedAt, companyIds}. Start here for pipeline and revenue questions — which deals closed won, what is open, which companies they belong to (`companyIds` are HubSpot company ids, the same as `hubspot companies search` returns). Page with --after <next> until it is null. `amount: null` means no amount was entered, not zero.\",\n args: DEALS_LIST_ARGS,\n});\n\nconst DEAL_CSV_FIELDS = [\n \"id\",\n \"name\",\n \"amount\",\n \"currency\",\n \"pipelineId\",\n \"stageId\",\n \"stageLabel\",\n \"isClosed\",\n \"isWon\",\n \"createdAt\",\n \"closedAt\",\n \"modifiedAt\",\n \"companyIds\",\n];\n\nexport const dealsListCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List deals with amount, stage and whether they closed won. Example: baker hubspot deals list --pipeline default --modified-since 2026-01-01\",\n },\n args: DEALS_LIST_ARGS,\n run: async ({ args }) => {\n const input: HubspotDealsListRequest = {\n pipelineIds: list(args.pipeline, \",\"),\n modifiedSince: typeof args[\"modified-since\"] === \"string\" ? args[\"modified-since\"] : undefined,\n limit: optionalNumber(args.limit),\n after: typeof args.after === \"string\" && args.after !== \"\" ? args.after : undefined,\n };\n const parsed = hubspotDealsListRequestSchema.safeParse(input);\n if (!parsed.success) failInvalid(parsed.error.issues);\n\n try {\n const response = await apiPost<HubspotDealsListResponse>(\"/api/hubspot/deals/list\", parsed.data);\n const hints = dealsListHints(response.data, {\n pipelineIds: parsed.data.pipelineIds ?? [],\n modifiedSince: parsed.data.modifiedSince,\n });\n const format = String(args.output ?? \"json\");\n if (format !== \"json\") {\n writeAdsOutput(response.data.deals, format, DEAL_CSV_FIELDS, hints);\n return;\n }\n writeJson({ ...response, meta: { count: response.data.deals.length }, ...(hints.length > 0 ? { hints } : {}) });\n } catch (err) {\n failNotConnected(err, \"so I can see which of your companies and deals the ads reached\");\n }\n },\n});\n"],"mappings":"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","names":[]}
@@ -9,7 +9,7 @@ import {
9
9
  exactCrmColumns,
10
10
  judgeCrmBatch,
11
11
  sheetDelimiter
12
- } from "./chunk-WKQG6TER.js";
12
+ } from "./chunk-ZEYEWPK6.js";
13
13
  import "./chunk-GRQ2AXDX.js";
14
14
  import {
15
15
  holdWorkspaceSpend
@@ -23,12 +23,11 @@ import "./chunk-VVZBBKRC.js";
23
23
  import "./chunk-YBMVHGY3.js";
24
24
  import {
25
25
  failApi
26
- } from "./chunk-SJYEY5MV.js";
27
- import "./chunk-7EPXVICM.js";
26
+ } from "./chunk-3HJLHTWP.js";
27
+ import "./chunk-XF4JUKVF.js";
28
28
  import "./chunk-GXDLWBOY.js";
29
29
  import "./chunk-TEINLN64.js";
30
30
  import "./chunk-ZJWUBJYQ.js";
31
- import "./chunk-HR6IWNKE.js";
32
31
  import "./chunk-NE4F3FHN.js";
33
32
  import {
34
33
  ApiError,
@@ -316,4 +315,4 @@ export {
316
315
  sheetFailureFix,
317
316
  statusHints
318
317
  };
319
- //# sourceMappingURL=crm-AVCM5D4G.js.map
318
+ //# sourceMappingURL=crm-R5IXIFIV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/accounts/crm.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport {\n type AccountsCrmSheetResponse,\n type AccountsCrmStatusResponse,\n type CrmColumnAnswer,\n type CrmColumnQuestion,\n type CrmRejection,\n crmBatchFromSheet,\n crmColumnMeanings,\n crmColumnQuestions,\n crmColumnReading,\n crmPushBrief,\n crmPushRequestSchema,\n crmPushUrl,\n exactCrmColumns,\n judgeCrmBatch,\n sheetDelimiter,\n} from \"@baker/api/accounts\";\nimport { defineCommand } from \"citty\";\nimport { parse } from \"csv-parse/sync\";\nimport { ApiError, apiGet, apiPost } from \"../../client.ts\";\nimport { askJevQuestions } from \"../../engine/nodes/local/lib/jev.ts\";\nimport type { ReviewUsage } from \"../../engine/nodes/local/lib/render-review.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi } from \"../actions/shared.ts\";\nimport { holdWorkspaceSpend } from \"../canvas/unbilled-spend.ts\";\n\n/**\n * `baker accounts crm` — for a client whose CRM Baker cannot read (Salesforce,\n * Pipedrive, a Google Sheet, their own): where their deals and companies\n * stand, whether a file of them will be accepted, and the contract their\n * developer sends to.\n *\n * Nothing here sends a deal. A send changes every influenced number at once\n * and outside any Session, so it is the client's own act: an upload or a\n * linked Google Sheet in Measure → Accounts, or their system posting with its\n * own key. The agent checks, explains and prepares — up to creating the empty\n * sheet the client fills (`sheet`) — and never stores a deal.\n */\n\nconst MAX_REJECTIONS_SHOWN = 20;\n\nexport interface CrmFileCheck {\n file: string;\n format: \"csv\" | \"json\";\n /** What the file holds: one row per deal, or one row per company (an accounts export, a target list). */\n kind: \"deals\" | \"companies\" | \"both\";\n received: { companies: number; deals: number };\n accepted: { companies: number; deals: number };\n rejected: CrmRejection[];\n rejectedCount: number;\n /** CSV columns Baker does not read — left behind, never sent. */\n ignoredColumns: string[];\n}\n\ninterface ReadBatch {\n format: \"csv\" | \"json\";\n kind: CrmFileCheck[\"kind\"];\n batch: unknown;\n ignoredColumns: string[];\n /** Headers not Baker's own that Jev could not read this time: left behind, though the upload may read them. */\n unread: string[];\n}\n\n/** Jev, asked the upload's own column questions; null when it could not answer. */\nexport type ColumnReader = (questions: CrmColumnQuestion[]) => Promise<CrmColumnAnswer[] | null>;\n\nconst SAMPLES_MAX = 3;\n\nfunction jsonKind(batch: unknown): CrmFileCheck[\"kind\"] {\n const body = batch as { companies?: unknown[]; deals?: unknown[] } | null;\n const companies = (body?.companies?.length ?? 0) > 0;\n const deals = (body?.deals?.length ?? 0) > 0;\n if (companies && deals) return \"both\";\n return companies ? \"companies\" : \"deals\";\n}\n\nasync function readBatch(name: string, text: string, readColumns: ColumnReader): Promise<ReadBatch> {\n if (name.toLowerCase().endsWith(\".json\")) {\n const batch: unknown = JSON.parse(text);\n return { format: \"json\", kind: jsonKind(batch), batch, ignoredColumns: [], unread: [] };\n }\n const rows = parse(text, {\n bom: true,\n columns: true,\n delimiter: sheetDelimiter(text),\n skip_empty_lines: true,\n relax_column_count: true,\n trim: true,\n }) as Array<Record<string, string>>;\n // Baker's own headers are read as they are; every other one is asked as the upload asks it.\n const headers = Object.keys(rows[0] ?? {});\n const exact = exactCrmColumns(headers);\n const rest = headers\n .filter((header) => exact[header] === undefined)\n .map((header) => ({\n header,\n samples: rows\n .map((row) => row[header] ?? \"\")\n .filter(Boolean)\n .slice(0, SAMPLES_MAX),\n }));\n const answers = rest.length > 0 ? await readColumns(crmColumnQuestions(rest, headers)) : [];\n const meanings = answers ? { ...crmColumnMeanings(rest, answers), ...exact } : exact;\n const sheet = crmBatchFromSheet(rows, crmColumnReading(meanings));\n return {\n format: \"csv\",\n kind: sheet.kind,\n batch: sheet.batch,\n ignoredColumns: sheet.ignoredColumns,\n unread: answers ? [] : rest.map((column) => column.header),\n };\n}\n\n/** A file judged exactly as the upload and the endpoint judge it — offline, nothing stored. */\nexport async function checkCrmFile(\n name: string,\n text: string,\n readColumns: ColumnReader,\n): Promise<{ data: CrmFileCheck; hints: string[] }> {\n const { format, kind, batch, ignoredColumns, unread } = await readBatch(name, text, readColumns);\n const body = crmPushRequestSchema.safeParse(batch);\n if (!body.success) throw new Error(body.error.issues[0]?.message ?? \"not a batch of companies and deals\");\n const judged = judgeCrmBatch(body.data);\n const kept = (items: ReadonlyArray<{ deleted: boolean }>) => items.filter((item) => !item.deleted).length;\n const rejectedOf = (kind: \"company\" | \"deal\") => judged.rejected.filter((r) => r.kind === kind).length;\n const data: CrmFileCheck = {\n file: name,\n format,\n kind,\n received: {\n companies: judged.companies.length + rejectedOf(\"company\"),\n deals: judged.deals.length + rejectedOf(\"deal\"),\n },\n accepted: { companies: kept(judged.companies), deals: kept(judged.deals) },\n rejected: judged.rejected.slice(0, MAX_REJECTIONS_SHOWN),\n rejectedCount: judged.rejected.length,\n ignoredColumns,\n };\n const hints: string[] = [];\n if (judged.rejected.length > 0) {\n hints.push(\n `${judged.rejected.length} record(s) would be refused — fix them in the file (each message names the field) and check again. The rest would still be accepted.`,\n );\n }\n if (kind === \"companies\") {\n hints.push(\n \"Read as a company list (one row per company). A website or LinkedIn page is enough to know a company by; deals sent later with the same website land on it.\",\n );\n }\n if (unread.length > 0) {\n hints.push(\n `These columns could not be read just now, so this check leaves them out: ${unread.join(\", \")}. The upload reads them again; check once more to see what they hold.`,\n );\n }\n const left = ignoredColumns.filter((header) => !unread.includes(header));\n if (left.length > 0) {\n hints.push(`These columns are left behind and never sent: ${left.join(\", \")}.`);\n }\n hints.push(\n format === \"csv\"\n ? \"Nothing was sent. The user uploads this file themselves in Measure → Sources → Deals → Send your deals → Upload a file — or keeps it in a Google Sheet and links it there (Google Sheets), which Baker then reads every night.\"\n : \"Nothing was sent. This is the body their system posts to the address in `baker accounts crm contract`, with their CRM sending key.\",\n );\n return { data, hints };\n}\n\n// --- status ---\n\nregisterSchema({\n command: \"accounts.crm.status\",\n description:\n \"Start here when a client's deals are not in HubSpot. Where Account insights reads deals from (source: hubspot | api — api means the client sends them), the address their system sends to, the last live send and the last test send (when, via upload | sheet | api, how many companies and deals, the first refusals and why), the Google Sheets Baker reads every night (each with its last read, or why it failed), and what Baker holds now (companies, deals, deals per pipeline and stage, and how many were sent as won or lost).\",\n args: {},\n});\n\nconst statusCommand = defineCommand({\n meta: {\n name: \"status\",\n description: \"Where the client's deals come from and what has arrived. Example: baker accounts crm status\",\n },\n args: {},\n run: async () => {\n try {\n const response = await apiGet<AccountsCrmStatusResponse>(\"/api/accounts/crm/status\");\n writeJson({ ...response, hints: statusHints(response.data) });\n } catch (err) {\n failApi(err);\n }\n },\n});\n\n/** A linked Google Sheet whose last read failed, as a hint naming it and passing on why. */\nfunction sheetHints(sheets: AccountsCrmStatusResponse[\"data\"][\"sheets\"]): string[] {\n return sheets\n .filter((sheet) => sheet.lastRead !== null && !sheet.lastRead.ok)\n .map(\n (sheet) =>\n `Baker could not read the linked Google Sheet \"${sheet.spreadsheetName} · ${sheet.tab}\": ${sheet.lastRead?.message ?? \"no reason given\"} Tell the user; they fix it in Measure → Sources → Deals → Google Sheets (Read now, or link it again). What it brought stays in Baker until then.`,\n );\n}\n\n/** Records the last send refused, with Baker's reasons, to be fixed where they came from. */\nfunction refusedHints(lastLive: AccountsCrmStatusResponse[\"data\"][\"lastLive\"]): string[] {\n if (lastLive === null || lastLive.rejected === 0) return [];\n const reasons = [...new Set(lastLive.samples.map((sample) => sample.message))].join(\"; \");\n return [\n `${lastLive.rejected} record(s) in the last send were refused and are not in Baker (${reasons}). The rest arrived. Tell the user what to fix in their file, sheet or system; the next send takes the corrected rows.`,\n ];\n}\n\nexport function statusHints(data: AccountsCrmStatusResponse[\"data\"]): string[] {\n if (data.source === null) {\n return [\n \"Nobody has said where the deals are yet. The user chooses in Measure → Accounts: HubSpot, or Another CRM (they send the deals).\",\n ];\n }\n if (data.source === \"hubspot\") return [\"Deals are read from HubSpot; nothing needs sending.\"];\n const failing = [...sheetHints(data.sheets), ...refusedHints(data.lastLive)];\n if (data.lastLive === null && data.sheets.length === 0) {\n return [\n \"Another CRM is chosen and nothing has arrived. Offer the three ways in, all in Measure → Sources → Deals: a CSV of deals or of companies uploaded there (check it first with `baker accounts crm check --file`), a Google Sheet they link there and Baker reads every night, or their developer sending from their system (`baker accounts crm contract`).\",\n ];\n }\n if ((data.contents?.companies ?? 0) > 0 && (data.contents?.deals ?? 0) === 0) {\n return [\n ...failing,\n \"Only companies have arrived, no deals. Baker matches them to the companies the LinkedIn ads reach, but no pipeline or revenue counts as influenced until deals arrive: offer the same ways in for a deals export (a deal names its company by the same website).\",\n ];\n }\n const sentStatus = (data.contents?.stages ?? []).some((stage) => stage.won > 0 || stage.lost > 0);\n if (sentStatus || (data.contents?.deals ?? 0) === 0) return failing;\n return [\n ...failing,\n \"The deals arrived without a status (open, won, lost). Unless the user has picked which stages mean won and lost in Measure → Sources → Deals, no deal counts as won: send status with each deal, or ask them to pick.\",\n ];\n}\n\n// --- check ---\n\nconst CHECK_ARGS = {\n file: {\n type: \"string\",\n description: \"A CSV of deals or of companies (one row each), or a JSON body { companies, deals }\",\n required: true,\n },\n} as const;\n\nregisterSchema({\n command: \"accounts.crm.check\",\n description:\n \"Check a client's CRM file before they send it: judged by exactly the rules the upload, a linked Google Sheet and the endpoint use, nothing stored. A CSV is a deals export (the deal's id, name, company, website, LinkedIn page, amount, currency, pipeline, stage, status, created and closed dates) or a company list (the company's id, name, website, LinkedIn page — a website alone is enough), told apart by its columns. Headers are read in any language or CRM wording, as the upload reads them; columns that are none of these are left behind. Dates may be YYYY-MM-DD or 15/03/2026. Returns {kind, received, accepted, rejected (each with the field and why), ignoredColumns}. Records naming a person (contact, owner, email, phone) are refused.\",\n args: CHECK_ARGS,\n});\n\nconst checkCommand = defineCommand({\n meta: {\n name: \"check\",\n description:\n \"Check a CRM export will be accepted, without sending it. Example: baker accounts crm check --file deals.csv\",\n },\n args: CHECK_ARGS,\n run: async ({ args }) => {\n try {\n const spent: ReviewUsage[] = [];\n const { data, hints } = await checkCrmFile(args.file, readFileSync(args.file, \"utf8\"), (questions) =>\n askJevQuestions(questions, (usage) => spent.push(usage)),\n );\n await holdWorkspaceSpend(spent);\n writeJson({ ok: true, data, hints });\n } catch (error) {\n writeJson({\n ok: false,\n error: {\n code: \"INVALID_FILE\",\n message: `${args.file} could not be read as CSV or JSON: ${error instanceof Error ? error.message : String(error)}`,\n },\n });\n process.exit(1);\n }\n },\n});\n\n// --- contract ---\n\nregisterSchema({\n command: \"accounts.crm.contract\",\n description:\n \"The whole contract for a client's developer (or their coding assistant) as Markdown: the address, the key to use, test mode, every company and deal field, the answer and an example. Hand it over as it is; never put a key in it.\",\n args: {},\n});\n\nconst contractCommand = defineCommand({\n meta: {\n name: \"contract\",\n description: \"What a client's system sends, for their developer. Example: baker accounts crm contract\",\n },\n args: {},\n run: () => {\n const env = getEnv();\n process.stdout.write(crmPushBrief(crmPushUrl(env.BAKER_PUBLIC_API_URL, env.BAKER_API_URL)));\n },\n});\n\n// --- sheet ---\n\nconst SHEET_ARGS = {\n account: {\n type: \"string\",\n description: \"The Google Drive connection to create it with, when the company has more than one\",\n required: false,\n },\n} as const;\n\nregisterSchema({\n command: \"accounts.crm.sheet\",\n description:\n \"Create the deals sheet LinkedIn's Account insights reads, for a company running LinkedIn campaigns whose CRM Baker cannot read (anything but HubSpot). Makes \\\"Deals and companies for Baker\\\" in the client's Google Drive — a Deals tab and a Companies tab headed by the columns Baker reads — and links both, so Baker reads it every night; chooses Another CRM first when nobody has said where the deals are. Applies at once (it is a real file) and goes on the chat's change list. Empty: nothing counts until the client fills it or pastes their CRM export into it. Asking again returns the sheet already linked. Needs a Google Drive connection and a chat owned by an admin of the company; refused when HubSpot is where the deals come from. Returns {created, spreadsheetName, url, tabs}.\",\n args: SHEET_ARGS,\n});\n\n/** What the agent does when the sheet cannot be made: never a reason to stop the rest of the work. */\nexport function sheetFailureFix(\n code: string,\n message: string,\n): { action: \"request_connection\" | \"continue_without\"; explanation: string } | null {\n if (code === \"NOT_FOUND\" && message.startsWith(\"No Google Drive account is connected\")) {\n return {\n action: \"request_connection\",\n explanation:\n 'Google Drive is not connected, and the sheet is made in it. Don\\'t send the user to Settings or end the turn — call the `request_connection` tool with { platform: \"google-drive\", reason: \"so I can create the sheet of your deals that LinkedIn Account insights reads\" }; once they connect, run `baker accounts crm sheet` again. If they decline or the call fails, carry on with the rest of the work and leave a Task saying the deals sheet is still to create.',\n };\n }\n if (message.startsWith(\"Only an admin\")) {\n return {\n action: \"continue_without\",\n explanation:\n \"Carry on with the rest of the work and leave a Task for an admin: create the deals sheet for LinkedIn Account insights.\",\n };\n }\n return null;\n}\n\nconst sheetCommand = defineCommand({\n meta: {\n name: \"sheet\",\n description:\n \"Start here when the client runs LinkedIn ads and their deals are not in HubSpot: create and link the Google Sheet of deals Account insights reads. Example: baker accounts crm sheet\",\n },\n args: SHEET_ARGS,\n run: async ({ args }) => {\n try {\n const account = typeof args.account === \"string\" && args.account.trim() !== \"\" ? args.account.trim() : undefined;\n const response = await apiPost<AccountsCrmSheetResponse>(\"/api/accounts/crm/sheet\", account ? { account } : {});\n writeJson({\n ...response,\n hints: [\n `Give the user the link (${response.data.url}). The client fills the Deals tab — or pastes their CRM's deals export into it — and keeps it up to date; Baker reads it every night, and \"Read now\" in Measure → Sources → Deals reads it at once. A website on each deal is enough to match it to the companies the LinkedIn ads reach.`,\n \"Check what arrived later with `baker accounts crm status`.\",\n ],\n });\n } catch (err) {\n if (err instanceof ApiError) {\n const fix = sheetFailureFix(err.code, err.message);\n if (fix) {\n writeJson({ ok: false, error: { code: err.code, message: err.message, fix } });\n process.exit(1);\n }\n }\n failApi(err);\n }\n },\n});\n\nexport const crmCommand = defineCommand({\n meta: {\n name: \"crm\",\n description:\n \"A CRM Baker cannot read (Salesforce, Pipedrive, a Google Sheet, their own): where the deals and companies stand, create the deals sheet Baker reads, check a file before it is sent, and the contract a developer sends to. Nothing here sends a deal.\",\n },\n subCommands: { status: statusCommand, sheet: sheetCommand, check: checkCommand, contract: contractCommand },\n});\n"],"mappings":"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","names":["kind"]}
1
+ {"version":3,"sources":["../src/commands/accounts/crm.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport {\n type AccountsCrmSheetResponse,\n type AccountsCrmStatusResponse,\n type CrmColumnAnswer,\n type CrmColumnQuestion,\n type CrmRejection,\n crmBatchFromSheet,\n crmColumnMeanings,\n crmColumnQuestions,\n crmColumnReading,\n crmPushBrief,\n crmPushRequestSchema,\n crmPushUrl,\n exactCrmColumns,\n judgeCrmBatch,\n sheetDelimiter,\n} from \"@baker/api/accounts\";\nimport { defineCommand } from \"citty\";\nimport { parse } from \"csv-parse/sync\";\nimport { ApiError, apiGet, apiPost } from \"../../client.ts\";\nimport { askJevQuestions } from \"../../engine/nodes/local/lib/jev.ts\";\nimport type { ReviewUsage } from \"../../engine/nodes/local/lib/render-review.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi } from \"../actions/shared.ts\";\nimport { holdWorkspaceSpend } from \"../canvas/unbilled-spend.ts\";\n\n/**\n * `baker accounts crm` — for a client whose CRM Baker cannot read (Salesforce,\n * Pipedrive, a Google Sheet, their own): where their deals and companies\n * stand, whether a file of them will be accepted, and the contract their\n * developer sends to.\n *\n * Nothing here sends a deal. A send changes every influenced number at once\n * and outside any Session, so it is the client's own act: an upload or a\n * linked Google Sheet in Measure → Accounts, or their system posting with its\n * own key. The agent checks, explains and prepares — up to creating the empty\n * sheet the client fills (`sheet`) — and never stores a deal.\n */\n\nconst MAX_REJECTIONS_SHOWN = 20;\n\nexport interface CrmFileCheck {\n file: string;\n format: \"csv\" | \"json\";\n /** What the file holds: one row per deal, or one row per company (an accounts export, a target list). */\n kind: \"deals\" | \"companies\" | \"both\";\n received: { companies: number; deals: number };\n accepted: { companies: number; deals: number };\n rejected: CrmRejection[];\n rejectedCount: number;\n /** CSV columns Baker does not read — left behind, never sent. */\n ignoredColumns: string[];\n}\n\ninterface ReadBatch {\n format: \"csv\" | \"json\";\n kind: CrmFileCheck[\"kind\"];\n batch: unknown;\n ignoredColumns: string[];\n /** Headers not Baker's own that Jev could not read this time: left behind, though the upload may read them. */\n unread: string[];\n}\n\n/** Jev, asked the upload's own column questions; null when it could not answer. */\nexport type ColumnReader = (questions: CrmColumnQuestion[]) => Promise<CrmColumnAnswer[] | null>;\n\nconst SAMPLES_MAX = 3;\n\nfunction jsonKind(batch: unknown): CrmFileCheck[\"kind\"] {\n const body = batch as { companies?: unknown[]; deals?: unknown[] } | null;\n const companies = (body?.companies?.length ?? 0) > 0;\n const deals = (body?.deals?.length ?? 0) > 0;\n if (companies && deals) return \"both\";\n return companies ? \"companies\" : \"deals\";\n}\n\nasync function readBatch(name: string, text: string, readColumns: ColumnReader): Promise<ReadBatch> {\n if (name.toLowerCase().endsWith(\".json\")) {\n const batch: unknown = JSON.parse(text);\n return { format: \"json\", kind: jsonKind(batch), batch, ignoredColumns: [], unread: [] };\n }\n const rows = parse(text, {\n bom: true,\n columns: true,\n delimiter: sheetDelimiter(text),\n skip_empty_lines: true,\n relax_column_count: true,\n trim: true,\n }) as Array<Record<string, string>>;\n // Baker's own headers are read as they are; every other one is asked as the upload asks it.\n const headers = Object.keys(rows[0] ?? {});\n const exact = exactCrmColumns(headers);\n const rest = headers\n .filter((header) => exact[header] === undefined)\n .map((header) => ({\n header,\n samples: rows\n .map((row) => row[header] ?? \"\")\n .filter(Boolean)\n .slice(0, SAMPLES_MAX),\n }));\n const answers = rest.length > 0 ? await readColumns(crmColumnQuestions(rest, headers)) : [];\n const meanings = answers ? { ...crmColumnMeanings(rest, answers), ...exact } : exact;\n const sheet = crmBatchFromSheet(rows, crmColumnReading(meanings));\n return {\n format: \"csv\",\n kind: sheet.kind,\n batch: sheet.batch,\n ignoredColumns: sheet.ignoredColumns,\n unread: answers ? [] : rest.map((column) => column.header),\n };\n}\n\n/** A file judged exactly as the upload and the endpoint judge it — offline, nothing stored. */\nexport async function checkCrmFile(\n name: string,\n text: string,\n readColumns: ColumnReader,\n): Promise<{ data: CrmFileCheck; hints: string[] }> {\n const { format, kind, batch, ignoredColumns, unread } = await readBatch(name, text, readColumns);\n const body = crmPushRequestSchema.safeParse(batch);\n if (!body.success) throw new Error(body.error.issues[0]?.message ?? \"not a batch of companies and deals\");\n const judged = judgeCrmBatch(body.data);\n const kept = (items: ReadonlyArray<{ deleted: boolean }>) => items.filter((item) => !item.deleted).length;\n const rejectedOf = (kind: \"company\" | \"deal\") => judged.rejected.filter((r) => r.kind === kind).length;\n const data: CrmFileCheck = {\n file: name,\n format,\n kind,\n received: {\n companies: judged.companies.length + rejectedOf(\"company\"),\n deals: judged.deals.length + rejectedOf(\"deal\"),\n },\n accepted: { companies: kept(judged.companies), deals: kept(judged.deals) },\n rejected: judged.rejected.slice(0, MAX_REJECTIONS_SHOWN),\n rejectedCount: judged.rejected.length,\n ignoredColumns,\n };\n const hints: string[] = [];\n if (judged.rejected.length > 0) {\n hints.push(\n `${judged.rejected.length} record(s) would be refused — fix them in the file (each message names the field) and check again. The rest would still be accepted.`,\n );\n }\n if (kind === \"companies\") {\n hints.push(\n \"Read as a company list (one row per company). A website or LinkedIn page is enough to know a company by; deals sent later with the same website land on it.\",\n );\n }\n if (unread.length > 0) {\n hints.push(\n `These columns could not be read just now, so this check leaves them out: ${unread.join(\", \")}. The upload reads them again; check once more to see what they hold.`,\n );\n }\n const left = ignoredColumns.filter((header) => !unread.includes(header));\n if (left.length > 0) {\n hints.push(`These columns are left behind and never sent: ${left.join(\", \")}.`);\n }\n hints.push(\n format === \"csv\"\n ? \"Nothing was sent. The user uploads this file themselves in Measure → Sources → Deals → Send your deals → Upload a file — or keeps it in a Google Sheet and links it there (Google Sheets), which Baker then reads every night.\"\n : \"Nothing was sent. This is the body their system posts to the address in `baker accounts crm contract`, with their CRM sending key.\",\n );\n return { data, hints };\n}\n\n// --- status ---\n\nregisterSchema({\n command: \"accounts.crm.status\",\n description:\n \"Start here when a client's deals are not in HubSpot. Where Account insights reads deals from (source: hubspot | api — api means the client sends them), the address their system sends to, the last live send and the last test send (when, via upload | sheet | api, how many companies and deals, the first refusals and why), the Google Sheets Baker reads every night (each with its last read, or why it failed), and what Baker holds now (companies, deals, deals per pipeline and stage, and how many were sent as won or lost).\",\n args: {},\n});\n\nconst statusCommand = defineCommand({\n meta: {\n name: \"status\",\n description: \"Where the client's deals come from and what has arrived. Example: baker accounts crm status\",\n },\n args: {},\n run: async () => {\n try {\n const response = await apiGet<AccountsCrmStatusResponse>(\"/api/accounts/crm/status\");\n writeJson({ ...response, hints: statusHints(response.data) });\n } catch (err) {\n failApi(err);\n }\n },\n});\n\n/** A linked Google Sheet whose last read failed, as a hint naming it and passing on why. */\nfunction sheetHints(sheets: AccountsCrmStatusResponse[\"data\"][\"sheets\"]): string[] {\n return sheets\n .filter((sheet) => sheet.lastRead !== null && !sheet.lastRead.ok)\n .map(\n (sheet) =>\n `Baker could not read the linked Google Sheet \"${sheet.spreadsheetName} · ${sheet.tab}\": ${sheet.lastRead?.message ?? \"no reason given\"} Tell the user; they fix it in Measure → Sources → Deals → Google Sheets (Read now, or link it again). What it brought stays in Baker until then.`,\n );\n}\n\n/** Records the last send refused, with Baker's reasons, to be fixed where they came from. */\nfunction refusedHints(lastLive: AccountsCrmStatusResponse[\"data\"][\"lastLive\"]): string[] {\n if (lastLive === null || lastLive.rejected === 0) return [];\n const reasons = [...new Set(lastLive.samples.map((sample) => sample.message))].join(\"; \");\n return [\n `${lastLive.rejected} record(s) in the last send were refused and are not in Baker (${reasons}). The rest arrived. Tell the user what to fix in their file, sheet or system; the next send takes the corrected rows.`,\n ];\n}\n\nexport function statusHints(data: AccountsCrmStatusResponse[\"data\"]): string[] {\n if (data.source === null) {\n return [\n \"Nobody has said where the deals are yet. The user chooses in Measure → Accounts: HubSpot, or Another CRM (they send the deals).\",\n ];\n }\n if (data.source === \"hubspot\") return [\"Deals are read from HubSpot; nothing needs sending.\"];\n const failing = [...sheetHints(data.sheets), ...refusedHints(data.lastLive)];\n if (data.lastLive === null && data.sheets.length === 0) {\n return [\n \"Another CRM is chosen and nothing has arrived. Offer the three ways in, all in Measure → Sources → Deals: a CSV of deals or of companies uploaded there (check it first with `baker accounts crm check --file`), a Google Sheet they link there and Baker reads every night, or their developer sending from their system (`baker accounts crm contract`).\",\n ];\n }\n if ((data.contents?.companies ?? 0) > 0 && (data.contents?.deals ?? 0) === 0) {\n return [\n ...failing,\n \"Only companies have arrived, no deals. Baker matches them to the companies the LinkedIn ads reach, but no pipeline or revenue counts as influenced until deals arrive: offer the same ways in for a deals export (a deal names its company by the same website).\",\n ];\n }\n const sentStatus = (data.contents?.stages ?? []).some((stage) => stage.won > 0 || stage.lost > 0);\n if (sentStatus || (data.contents?.deals ?? 0) === 0) return failing;\n return [\n ...failing,\n \"The deals arrived without a status (open, won, lost). Unless the user has picked which stages mean won and lost in Measure → Sources → Deals, no deal counts as won: send status with each deal, or ask them to pick.\",\n ];\n}\n\n// --- check ---\n\nconst CHECK_ARGS = {\n file: {\n type: \"string\",\n description: \"A CSV of deals or of companies (one row each), or a JSON body { companies, deals }\",\n required: true,\n },\n} as const;\n\nregisterSchema({\n command: \"accounts.crm.check\",\n description:\n \"Check a client's CRM file before they send it: judged by exactly the rules the upload, a linked Google Sheet and the endpoint use, nothing stored. A CSV is a deals export (the deal's id, name, company, website, LinkedIn page, amount, currency, pipeline, stage, status, created and closed dates) or a company list (the company's id, name, website, LinkedIn page — a website alone is enough), told apart by its columns. Headers are read in any language or CRM wording, as the upload reads them; columns that are none of these are left behind. Dates may be YYYY-MM-DD or 15/03/2026. Returns {kind, received, accepted, rejected (each with the field and why), ignoredColumns}. Records naming a person (contact, owner, email, phone) are refused.\",\n args: CHECK_ARGS,\n});\n\nconst checkCommand = defineCommand({\n meta: {\n name: \"check\",\n description:\n \"Check a CRM export will be accepted, without sending it. Example: baker accounts crm check --file deals.csv\",\n },\n args: CHECK_ARGS,\n run: async ({ args }) => {\n try {\n const spent: ReviewUsage[] = [];\n const { data, hints } = await checkCrmFile(args.file, readFileSync(args.file, \"utf8\"), (questions) =>\n askJevQuestions(questions, (usage) => spent.push(usage)),\n );\n await holdWorkspaceSpend(spent);\n writeJson({ ok: true, data, hints });\n } catch (error) {\n writeJson({\n ok: false,\n error: {\n code: \"INVALID_FILE\",\n message: `${args.file} could not be read as CSV or JSON: ${error instanceof Error ? error.message : String(error)}`,\n },\n });\n process.exit(1);\n }\n },\n});\n\n// --- contract ---\n\nregisterSchema({\n command: \"accounts.crm.contract\",\n description:\n \"The whole contract for a client's developer (or their coding assistant) as Markdown: the address, the key to use, test mode, every company and deal field, the answer and an example. Hand it over as it is; never put a key in it.\",\n args: {},\n});\n\nconst contractCommand = defineCommand({\n meta: {\n name: \"contract\",\n description: \"What a client's system sends, for their developer. Example: baker accounts crm contract\",\n },\n args: {},\n run: () => {\n const env = getEnv();\n process.stdout.write(crmPushBrief(crmPushUrl(env.BAKER_PUBLIC_API_URL, env.BAKER_API_URL)));\n },\n});\n\n// --- sheet ---\n\nconst SHEET_ARGS = {\n account: {\n type: \"string\",\n description: \"The Google Drive connection to create it with, when the company has more than one\",\n required: false,\n },\n} as const;\n\nregisterSchema({\n command: \"accounts.crm.sheet\",\n description:\n \"Create the deals sheet LinkedIn's Account insights reads, for a company running LinkedIn campaigns whose CRM Baker cannot read (anything but HubSpot). Makes \\\"Deals and companies for Baker\\\" in the client's Google Drive — a Deals tab and a Companies tab headed by the columns Baker reads — and links both, so Baker reads it every night; chooses Another CRM first when nobody has said where the deals are. Applies at once (it is a real file) and goes on the chat's change list. Empty: nothing counts until the client fills it or pastes their CRM export into it. Asking again returns the sheet already linked. Needs a Google Drive connection and a chat owned by an admin of the company; refused when HubSpot is where the deals come from. Returns {created, spreadsheetName, url, tabs}.\",\n args: SHEET_ARGS,\n});\n\n/** What the agent does when the sheet cannot be made: never a reason to stop the rest of the work. */\nexport function sheetFailureFix(\n code: string,\n message: string,\n): { action: \"request_connection\" | \"continue_without\"; explanation: string } | null {\n if (code === \"NOT_FOUND\" && message.startsWith(\"No Google Drive account is connected\")) {\n return {\n action: \"request_connection\",\n explanation:\n 'Google Drive is not connected, and the sheet is made in it. Don\\'t send the user to Settings or end the turn — call the `request_connection` tool with { platform: \"google-drive\", reason: \"so I can create the sheet of your deals that LinkedIn Account insights reads\" }; once they connect, run `baker accounts crm sheet` again. If they decline or the call fails, carry on with the rest of the work and leave a Task saying the deals sheet is still to create.',\n };\n }\n if (message.startsWith(\"Only an admin\")) {\n return {\n action: \"continue_without\",\n explanation:\n \"Carry on with the rest of the work and leave a Task for an admin: create the deals sheet for LinkedIn Account insights.\",\n };\n }\n return null;\n}\n\nconst sheetCommand = defineCommand({\n meta: {\n name: \"sheet\",\n description:\n \"Start here when the client runs LinkedIn ads and their deals are not in HubSpot: create and link the Google Sheet of deals Account insights reads. Example: baker accounts crm sheet\",\n },\n args: SHEET_ARGS,\n run: async ({ args }) => {\n try {\n const account = typeof args.account === \"string\" && args.account.trim() !== \"\" ? args.account.trim() : undefined;\n const response = await apiPost<AccountsCrmSheetResponse>(\"/api/accounts/crm/sheet\", account ? { account } : {});\n writeJson({\n ...response,\n hints: [\n `Give the user the link (${response.data.url}). The client fills the Deals tab — or pastes their CRM's deals export into it — and keeps it up to date; Baker reads it every night, and \"Read now\" in Measure → Sources → Deals reads it at once. A website on each deal is enough to match it to the companies the LinkedIn ads reach.`,\n \"Check what arrived later with `baker accounts crm status`.\",\n ],\n });\n } catch (err) {\n if (err instanceof ApiError) {\n const fix = sheetFailureFix(err.code, err.message);\n if (fix) {\n writeJson({ ok: false, error: { code: err.code, message: err.message, fix } });\n process.exit(1);\n }\n }\n failApi(err);\n }\n },\n});\n\nexport const crmCommand = defineCommand({\n meta: {\n name: \"crm\",\n description:\n \"A CRM Baker cannot read (Salesforce, Pipedrive, a Google Sheet, their own): where the deals and companies stand, create the deals sheet Baker reads, check a file before it is sent, and the contract a developer sends to. Nothing here sends a deal.\",\n },\n subCommands: { status: statusCommand, sheet: sheetCommand, check: checkCommand, contract: contractCommand },\n});\n"],"mappings":"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","names":["kind"]}
@@ -14,9 +14,9 @@ import {
14
14
  sourcesFromPages,
15
15
  sourcesFromReddit,
16
16
  sourcesFromTestimonials
17
- } from "./chunk-RX2DKU3W.js";
18
- import "./chunk-FYGR3I2A.js";
19
- import "./chunk-H3427GPU.js";
17
+ } from "./chunk-DGUNI37S.js";
18
+ import "./chunk-S77PZVYM.js";
19
+ import "./chunk-OZRUJVIQ.js";
20
20
  import "./chunk-WNFIJAUO.js";
21
21
  import "./chunk-ERSX3MKH.js";
22
22
  import "./chunk-WTOYCUKH.js";
@@ -26,11 +26,10 @@ import "./chunk-RX6F3GEA.js";
26
26
  import "./chunk-HRYOZUSK.js";
27
27
  import "./chunk-VVZBBKRC.js";
28
28
  import "./chunk-YBMVHGY3.js";
29
- import "./chunk-7EPXVICM.js";
29
+ import "./chunk-XF4JUKVF.js";
30
30
  import "./chunk-GXDLWBOY.js";
31
31
  import "./chunk-TEINLN64.js";
32
32
  import "./chunk-ZJWUBJYQ.js";
33
- import "./chunk-HR6IWNKE.js";
34
33
  import "./chunk-NE4F3FHN.js";
35
34
  import "./chunk-XBOK23HI.js";
36
35
  import "./chunk-IFWP3ZDO.js";
@@ -54,4 +53,4 @@ export {
54
53
  sourcesFromReddit,
55
54
  sourcesFromTestimonials
56
55
  };
57
- //# sourceMappingURL=customers-XH2DMTFH.js.map
56
+ //# sourceMappingURL=customers-A36LOZOB.js.map
@@ -3,12 +3,11 @@ import {
3
3
  failValidation,
4
4
  validateScheduledAgentRef,
5
5
  writeOk
6
- } from "./chunk-I3ZR655O.js";
7
- import "./chunk-7EPXVICM.js";
6
+ } from "./chunk-IR6D7K4H.js";
7
+ import "./chunk-XF4JUKVF.js";
8
8
  import "./chunk-GXDLWBOY.js";
9
9
  import "./chunk-TEINLN64.js";
10
10
  import "./chunk-ZJWUBJYQ.js";
11
- import "./chunk-HR6IWNKE.js";
12
11
  import "./chunk-NE4F3FHN.js";
13
12
  import {
14
13
  apiPost
@@ -61,4 +60,4 @@ var deleteCommand = defineCommand({
61
60
  export {
62
61
  deleteCommand
63
62
  };
64
- //# sourceMappingURL=delete-WI5E3DR3.js.map
63
+ //# sourceMappingURL=delete-AIGE4Y4H.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/scheduled-agents/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, validateScheduledAgentRef, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"scheduled-agents.delete\",\n description: \"Stage deletion of a published scheduled agent, or cancel one this chat staged (temp_agent_*).\",\n args: {\n id: { type: \"string\", description: \"Published scheduled agent ID or temp_agent_* draft ID\", required: true },\n },\n});\n\nexport const deleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description: \"Stage a scheduled agent deletion. Example: baker scheduled-agents delete <id-or-temp_agent_id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Scheduled agent ID or temp_agent_* draft ID\", required: false },\n \"scheduled-agent-id\": {\n type: \"string\",\n description: \"Scheduled agent ID (alternative to positional)\",\n required: false,\n },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"scheduled-agent-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Scheduled agent ID is required.\");\n }\n validateScheduledAgentRef(id);\n await apiPost<{ ok: true }>(\"/api/scheduled-agents/delete\", { chatId: requireChatId(), id });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,yDAAyD,UAAU,KAAK;AAAA,EAC7G;AACF,CAAC;AAEM,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,+CAA+C,UAAU,MAAM;AAAA,IACtG,sBAAsB;AAAA,MACpB,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,oBAAoB;AACxE,UAAI,CAAC,IAAI;AACP,uBAAe,iCAAiC;AAAA,MAClD;AACA,gCAA0B,EAAE;AAC5B,YAAM,QAAsB,gCAAgC,EAAE,QAAQ,cAAc,GAAG,GAAG,CAAC;AAC3F,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/commands/scheduled-agents/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, validateScheduledAgentRef, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"scheduled-agents.delete\",\n description: \"Stage deletion of a published scheduled agent, or cancel one this chat staged (temp_agent_*).\",\n args: {\n id: { type: \"string\", description: \"Published scheduled agent ID or temp_agent_* draft ID\", required: true },\n },\n});\n\nexport const deleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description: \"Stage a scheduled agent deletion. Example: baker scheduled-agents delete <id-or-temp_agent_id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Scheduled agent ID or temp_agent_* draft ID\", required: false },\n \"scheduled-agent-id\": {\n type: \"string\",\n description: \"Scheduled agent ID (alternative to positional)\",\n required: false,\n },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"scheduled-agent-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Scheduled agent ID is required.\");\n }\n validateScheduledAgentRef(id);\n await apiPost<{ ok: true }>(\"/api/scheduled-agents/delete\", { chatId: requireChatId(), id });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,yDAAyD,UAAU,KAAK;AAAA,EAC7G;AACF,CAAC;AAEM,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,+CAA+C,UAAU,MAAM;AAAA,IACtG,sBAAsB;AAAA,MACpB,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,oBAAoB;AACxE,UAAI,CAAC,IAAI;AACP,uBAAe,iCAAiC;AAAA,MAClD;AACA,gCAA0B,EAAE;AAC5B,YAAM,QAAsB,gCAAgC,EAAE,QAAQ,cAAc,GAAG,GAAG,CAAC;AAC3F,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -2,12 +2,11 @@ import {
2
2
  failApi,
3
3
  failValidation,
4
4
  writeOk
5
- } from "./chunk-SJYEY5MV.js";
6
- import "./chunk-7EPXVICM.js";
5
+ } from "./chunk-3HJLHTWP.js";
6
+ import "./chunk-XF4JUKVF.js";
7
7
  import "./chunk-GXDLWBOY.js";
8
8
  import "./chunk-TEINLN64.js";
9
9
  import "./chunk-ZJWUBJYQ.js";
10
- import "./chunk-HR6IWNKE.js";
11
10
  import "./chunk-NE4F3FHN.js";
12
11
  import {
13
12
  apiPost
@@ -52,4 +51,4 @@ var tagsDeleteCommand = defineCommand({
52
51
  export {
53
52
  tagsDeleteCommand
54
53
  };
55
- //# sourceMappingURL=delete-KRH2YMSZ.js.map
54
+ //# sourceMappingURL=delete-HGHXY24R.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/actions/tags/delete.ts"],"sourcesContent":["import type { ActionsTagsDeleteResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { failApi, failValidation, writeOk } from \"../shared.ts\";\n\nregisterSchema({\n command: \"actions.tags.delete\",\n description:\n \"Delete a company custom action tag by slug. Built-in default tags cannot be deleted. Existing actions keep the slug (it just stops appearing in the taxonomy).\",\n args: {\n slug: { type: \"string\", description: \"Custom tag slug to delete\", required: true },\n },\n});\n\nexport const tagsDeleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a custom action tag. Example: baker actions tags delete --slug pmax\",\n },\n args: {\n slug: { type: \"string\", description: \"Custom tag slug\", required: false },\n },\n run: async ({ args }) => {\n try {\n const slug = args.slug as string | undefined;\n if (!slug || slug.trim().length === 0) {\n failValidation(\"--slug is required.\");\n }\n await apiPost<ActionsTagsDeleteResponse>(\"/api/actions/tags/delete\", { name: slug });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,KAAK;AAAA,EACnF;AACF,CAAC;AAEM,IAAM,oBAAoB,cAAc;AAAA,EAC7C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,EAC1E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,WAAW,GAAG;AACrC,uBAAe,qBAAqB;AAAA,MACtC;AACA,YAAM,QAAmC,4BAA4B,EAAE,MAAM,KAAK,CAAC;AACnF,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/commands/actions/tags/delete.ts"],"sourcesContent":["import type { ActionsTagsDeleteResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { failApi, failValidation, writeOk } from \"../shared.ts\";\n\nregisterSchema({\n command: \"actions.tags.delete\",\n description:\n \"Delete a company custom action tag by slug. Built-in default tags cannot be deleted. Existing actions keep the slug (it just stops appearing in the taxonomy).\",\n args: {\n slug: { type: \"string\", description: \"Custom tag slug to delete\", required: true },\n },\n});\n\nexport const tagsDeleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a custom action tag. Example: baker actions tags delete --slug pmax\",\n },\n args: {\n slug: { type: \"string\", description: \"Custom tag slug\", required: false },\n },\n run: async ({ args }) => {\n try {\n const slug = args.slug as string | undefined;\n if (!slug || slug.trim().length === 0) {\n failValidation(\"--slug is required.\");\n }\n await apiPost<ActionsTagsDeleteResponse>(\"/api/actions/tags/delete\", { name: slug });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,KAAK;AAAA,EACnF;AACF,CAAC;AAEM,IAAM,oBAAoB,cAAc;AAAA,EAC7C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,EAC1E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,WAAW,GAAG;AACrC,uBAAe,qBAAqB;AAAA,MACtC;AACA,YAAM,QAAmC,4BAA4B,EAAE,MAAM,KAAK,CAAC;AACnF,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -4,11 +4,10 @@ import {
4
4
  } from "./chunk-6G5K6ZC6.js";
5
5
  import {
6
6
  testimonialsDeleteRequestSchema
7
- } from "./chunk-7EPXVICM.js";
7
+ } from "./chunk-XF4JUKVF.js";
8
8
  import "./chunk-GXDLWBOY.js";
9
9
  import "./chunk-TEINLN64.js";
10
10
  import "./chunk-ZJWUBJYQ.js";
11
- import "./chunk-HR6IWNKE.js";
12
11
  import "./chunk-NE4F3FHN.js";
13
12
  import {
14
13
  apiPost
@@ -64,4 +63,4 @@ var deleteCommand = defineCommand({
64
63
  export {
65
64
  deleteCommand
66
65
  };
67
- //# sourceMappingURL=delete-E3R3TKIL.js.map
66
+ //# sourceMappingURL=delete-M2GDLPYN.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/testimonials/delete.ts"],"sourcesContent":["import { type TestimonialsDeleteResponse, testimonialsDeleteRequestSchema } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { reportError, reportInvalid } from \"./sources/shared.ts\";\n\nregisterSchema({\n command: \"testimonials.delete\",\n description:\n \"Remove one testimonial from the library, with the images it brought in. Applies immediately and cannot be undone — confirm with the user first; --dry-run previews.\",\n args: {\n id: { type: \"string\", description: \"Testimonial id from `testimonials list|search`\", required: true },\n \"dry-run\": { type: \"boolean\", description: \"Preview without removing\", required: false, default: false },\n },\n});\n\nexport const deleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description:\n \"Remove one testimonial (and its images) from the library. Applies immediately — confirm with the user first.\\n\\nExample: baker testimonials delete <testimonial-id> --dry-run\",\n },\n args: {\n id: { type: \"positional\", description: \"Testimonial id from `testimonials list|search`\", required: true },\n \"dry-run\": { type: \"boolean\", description: \"Preview without removing\", required: false, default: false },\n },\n run: async ({ args }) => {\n const parsed = testimonialsDeleteRequestSchema.safeParse({ id: String(args.id ?? \"\") });\n if (!parsed.success) reportInvalid(parsed.error.issues[0]);\n if (args[\"dry-run\"]) {\n writeJson({ ok: true, dryRun: true, operation: \"testimonials.delete\", params: parsed.data });\n return;\n }\n try {\n const data = await apiPost<TestimonialsDeleteResponse>(\"/api/testimonials/delete\", parsed.data);\n writeJson({\n ok: true,\n data,\n hints: [\n \"Already removed: publishing or discarding this chat will not bring it back. If its review page is still a source, the next import can add it again — remove the source to stop that.\",\n ],\n });\n } catch (err) {\n reportError(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,kDAAkD,UAAU,KAAK;AAAA,IACpG,WAAW,EAAE,MAAM,WAAW,aAAa,4BAA4B,UAAU,OAAO,SAAS,MAAM;AAAA,EACzG;AACF,CAAC;AAEM,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,kDAAkD,UAAU,KAAK;AAAA,IACxG,WAAW,EAAE,MAAM,WAAW,aAAa,4BAA4B,UAAU,OAAO,SAAS,MAAM;AAAA,EACzG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,SAAS,gCAAgC,UAAU,EAAE,IAAI,OAAO,KAAK,MAAM,EAAE,EAAE,CAAC;AACtF,QAAI,CAAC,OAAO,QAAS,eAAc,OAAO,MAAM,OAAO,CAAC,CAAC;AACzD,QAAI,KAAK,SAAS,GAAG;AACnB,gBAAU,EAAE,IAAI,MAAM,QAAQ,MAAM,WAAW,uBAAuB,QAAQ,OAAO,KAAK,CAAC;AAC3F;AAAA,IACF;AACA,QAAI;AACF,YAAM,OAAO,MAAM,QAAoC,4BAA4B,OAAO,IAAI;AAC9F,gBAAU;AAAA,QACR,IAAI;AAAA,QACJ;AAAA,QACA,OAAO;AAAA,UACL;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/commands/testimonials/delete.ts"],"sourcesContent":["import { type TestimonialsDeleteResponse, testimonialsDeleteRequestSchema } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { reportError, reportInvalid } from \"./sources/shared.ts\";\n\nregisterSchema({\n command: \"testimonials.delete\",\n description:\n \"Remove one testimonial from the library, with the images it brought in. Applies immediately and cannot be undone — confirm with the user first; --dry-run previews.\",\n args: {\n id: { type: \"string\", description: \"Testimonial id from `testimonials list|search`\", required: true },\n \"dry-run\": { type: \"boolean\", description: \"Preview without removing\", required: false, default: false },\n },\n});\n\nexport const deleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description:\n \"Remove one testimonial (and its images) from the library. Applies immediately — confirm with the user first.\\n\\nExample: baker testimonials delete <testimonial-id> --dry-run\",\n },\n args: {\n id: { type: \"positional\", description: \"Testimonial id from `testimonials list|search`\", required: true },\n \"dry-run\": { type: \"boolean\", description: \"Preview without removing\", required: false, default: false },\n },\n run: async ({ args }) => {\n const parsed = testimonialsDeleteRequestSchema.safeParse({ id: String(args.id ?? \"\") });\n if (!parsed.success) reportInvalid(parsed.error.issues[0]);\n if (args[\"dry-run\"]) {\n writeJson({ ok: true, dryRun: true, operation: \"testimonials.delete\", params: parsed.data });\n return;\n }\n try {\n const data = await apiPost<TestimonialsDeleteResponse>(\"/api/testimonials/delete\", parsed.data);\n writeJson({\n ok: true,\n data,\n hints: [\n \"Already removed: publishing or discarding this chat will not bring it back. If its review page is still a source, the next import can add it again — remove the source to stop that.\",\n ],\n });\n } catch (err) {\n reportError(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,kDAAkD,UAAU,KAAK;AAAA,IACpG,WAAW,EAAE,MAAM,WAAW,aAAa,4BAA4B,UAAU,OAAO,SAAS,MAAM;AAAA,EACzG;AACF,CAAC;AAEM,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,kDAAkD,UAAU,KAAK;AAAA,IACxG,WAAW,EAAE,MAAM,WAAW,aAAa,4BAA4B,UAAU,OAAO,SAAS,MAAM;AAAA,EACzG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,SAAS,gCAAgC,UAAU,EAAE,IAAI,OAAO,KAAK,MAAM,EAAE,EAAE,CAAC;AACtF,QAAI,CAAC,OAAO,QAAS,eAAc,OAAO,MAAM,OAAO,CAAC,CAAC;AACzD,QAAI,KAAK,SAAS,GAAG;AACnB,gBAAU,EAAE,IAAI,MAAM,QAAQ,MAAM,WAAW,uBAAuB,QAAQ,OAAO,KAAK,CAAC;AAC3F;AAAA,IACF;AACA,QAAI;AACF,YAAM,OAAO,MAAM,QAAoC,4BAA4B,OAAO,IAAI;AAC9F,gBAAU;AAAA,QACR,IAAI;AAAA,QACJ;AAAA,QACA,OAAO;AAAA,UACL;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -3,18 +3,17 @@ 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
  } from "./chunk-VFIOJD5M.js";
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
  apiPost
@@ -136,4 +135,4 @@ function resolveRange(args) {
136
135
  export {
137
136
  demographicsCommand
138
137
  };
139
- //# sourceMappingURL=demographics-XV5PBA77.js.map
138
+ //# sourceMappingURL=demographics-NTWB2IMG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/ads/linkedin/demographics.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeAdsJson } from \"../output.ts\";\nimport type { PivotSlug } from \"./presets.ts\";\nimport { csvOrJson, daysAgoIso, handleLinkedinError, todayIso } from \"./shared.ts\";\n\n/**\n * Sweep all firmographic pivots in one command. Answers playbook §13's\n * \"audience analysis\" question: who actually saw / clicked / converted on\n * this ad, by job title, company, industry, seniority, function, company size?\n *\n * Hits /api/ads/linkedin/analytics once per pivot (sequentially to respect\n * Development Tier rate limits) and returns a per-pivot top-N summary plus\n * the raw rows. Backend handles\n * granularity (forced to ALL for MEMBER_* pivots) and the demographic\n * delay/floor warnings.\n */\n\ninterface PivotResult {\n pivot: string;\n rows: Array<Record<string, unknown>>;\n warnings: Array<{ code: string; message: string }>;\n}\n\nconst DEFAULT_PIVOTS: PivotSlug[] = [\"job-title\", \"company\", \"industry\", \"seniority\", \"job-function\", \"company-size\"];\n\ninterface AnalyticsResponse {\n rows: Array<Record<string, unknown>>;\n fields: string[];\n warnings: Array<{ code: string; message: string }>;\n}\n\nfunction numberOf(v: unknown): number {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : 0;\n if (typeof v === \"string\") {\n const n = Number(v);\n return Number.isFinite(n) ? n : 0;\n }\n return 0;\n}\n\nfunction topByImpressions(rows: Array<Record<string, unknown>>, limit: number): Array<Record<string, unknown>> {\n return [...rows].sort((a, b) => numberOf(b.impressions) - numberOf(a.impressions)).slice(0, limit);\n}\n\nexport const demographicsCommand = defineCommand({\n meta: {\n name: \"demographics\",\n description: `Sweep all firmographic pivots in one command — LinkedIn's superpower.\n\nDefault pivots:\n job-title, company, industry, seniority, job-function, company-size\n\nUse --pivots to narrow the sweep. Output is one section per pivot, each with\ntop-N rows by impressions (configurable via --top-n).\n\nDemographic data is delayed 12-24h with a ≥3-event privacy floor — small\nbuckets are silently dropped. The CLI surfaces this in 'warnings' when the\nresult set comes back unexpectedly empty.\n\nExamples:\n baker ads linkedin demographics --campaign-id 1234\n baker ads linkedin demographics --campaign-id 1234 --pivots job-title,company\n baker ads linkedin demographics --campaign-id 1234 --last-days 30 --top-n 25`,\n },\n args: {\n \"campaign-id\": { type: \"string\", description: \"Comma-separated campaign IDs (required)\" },\n pivots: { type: \"string\", description: `CSV of pivots (default: ${DEFAULT_PIVOTS.join(\",\")})` },\n \"top-n\": { type: \"string\", description: \"Top rows per pivot (default: 10)\" },\n intent: { type: \"string\", description: \"baseline | revenue | funnel | engagement | lead-gen (default: baseline)\" },\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\", default: \"json\" },\n },\n run: async ({ args }) => {\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsJson({\n ok: false,\n error: {\n code: \"UNSUPPORTED_FORMAT\",\n message: \"demographics returns a structured per-pivot report — only --output json supported.\",\n },\n });\n process.exit(1);\n }\n\n const campaignIdsRaw = args[\"campaign-id\"] as string | undefined;\n if (!campaignIdsRaw) {\n handleLinkedinError(new Error(\"--campaign-id is required (CSV for multi).\"));\n }\n const ids = campaignIdsRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n const pivotsRaw = (args.pivots as string | undefined)?.split(\",\").map((s) => s.trim().toLowerCase());\n const pivots = (pivotsRaw && pivotsRaw.length > 0 ? pivotsRaw : DEFAULT_PIVOTS) as PivotSlug[];\n const topN = args[\"top-n\"] ? Number(args[\"top-n\"]) : 10;\n const intent = (args.intent as string | undefined) ?? \"baseline\";\n\n const { start, end } = resolveRange(args);\n\n try {\n const results: PivotResult[] = [];\n for (const pivot of pivots) {\n const data = await apiPost<AnalyticsResponse>(\"/api/ads/linkedin/analytics\", {\n request: {\n level: \"campaign\",\n ids,\n intent,\n pivot,\n start,\n end,\n granularity: \"ALL\",\n limit: 500,\n },\n skipCache: Boolean(args[\"no-cache\"]),\n });\n results.push({ pivot, rows: topByImpressions(data.rows, topN), warnings: data.warnings });\n }\n\n writeAdsJson({\n ok: true,\n data: {\n query: { campaigns: ids, start, end, intent, topN },\n pivots: results,\n },\n });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\nfunction resolveRange(args: Record<string, unknown>): { start: string; end?: string } {\n const start = args.start as string | undefined;\n const end = args.end as string | undefined;\n if (start) {\n return { start, end };\n }\n const days = args[\"last-days\"] ? Number(args[\"last-days\"]) : 30;\n if (!Number.isFinite(days) || days < 1) {\n handleLinkedinError(new Error(\"Invalid --last-days; must be a positive integer.\"));\n }\n return { start: daysAgoIso(days), end: todayIso() };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/commands/ads/linkedin/demographics.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeAdsJson } from \"../output.ts\";\nimport type { PivotSlug } from \"./presets.ts\";\nimport { csvOrJson, daysAgoIso, handleLinkedinError, todayIso } from \"./shared.ts\";\n\n/**\n * Sweep all firmographic pivots in one command. Answers playbook §13's\n * \"audience analysis\" question: who actually saw / clicked / converted on\n * this ad, by job title, company, industry, seniority, function, company size?\n *\n * Hits /api/ads/linkedin/analytics once per pivot (sequentially to respect\n * Development Tier rate limits) and returns a per-pivot top-N summary plus\n * the raw rows. Backend handles\n * granularity (forced to ALL for MEMBER_* pivots) and the demographic\n * delay/floor warnings.\n */\n\ninterface PivotResult {\n pivot: string;\n rows: Array<Record<string, unknown>>;\n warnings: Array<{ code: string; message: string }>;\n}\n\nconst DEFAULT_PIVOTS: PivotSlug[] = [\"job-title\", \"company\", \"industry\", \"seniority\", \"job-function\", \"company-size\"];\n\ninterface AnalyticsResponse {\n rows: Array<Record<string, unknown>>;\n fields: string[];\n warnings: Array<{ code: string; message: string }>;\n}\n\nfunction numberOf(v: unknown): number {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : 0;\n if (typeof v === \"string\") {\n const n = Number(v);\n return Number.isFinite(n) ? n : 0;\n }\n return 0;\n}\n\nfunction topByImpressions(rows: Array<Record<string, unknown>>, limit: number): Array<Record<string, unknown>> {\n return [...rows].sort((a, b) => numberOf(b.impressions) - numberOf(a.impressions)).slice(0, limit);\n}\n\nexport const demographicsCommand = defineCommand({\n meta: {\n name: \"demographics\",\n description: `Sweep all firmographic pivots in one command — LinkedIn's superpower.\n\nDefault pivots:\n job-title, company, industry, seniority, job-function, company-size\n\nUse --pivots to narrow the sweep. Output is one section per pivot, each with\ntop-N rows by impressions (configurable via --top-n).\n\nDemographic data is delayed 12-24h with a ≥3-event privacy floor — small\nbuckets are silently dropped. The CLI surfaces this in 'warnings' when the\nresult set comes back unexpectedly empty.\n\nExamples:\n baker ads linkedin demographics --campaign-id 1234\n baker ads linkedin demographics --campaign-id 1234 --pivots job-title,company\n baker ads linkedin demographics --campaign-id 1234 --last-days 30 --top-n 25`,\n },\n args: {\n \"campaign-id\": { type: \"string\", description: \"Comma-separated campaign IDs (required)\" },\n pivots: { type: \"string\", description: `CSV of pivots (default: ${DEFAULT_PIVOTS.join(\",\")})` },\n \"top-n\": { type: \"string\", description: \"Top rows per pivot (default: 10)\" },\n intent: { type: \"string\", description: \"baseline | revenue | funnel | engagement | lead-gen (default: baseline)\" },\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\", default: \"json\" },\n },\n run: async ({ args }) => {\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsJson({\n ok: false,\n error: {\n code: \"UNSUPPORTED_FORMAT\",\n message: \"demographics returns a structured per-pivot report — only --output json supported.\",\n },\n });\n process.exit(1);\n }\n\n const campaignIdsRaw = args[\"campaign-id\"] as string | undefined;\n if (!campaignIdsRaw) {\n handleLinkedinError(new Error(\"--campaign-id is required (CSV for multi).\"));\n }\n const ids = campaignIdsRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n const pivotsRaw = (args.pivots as string | undefined)?.split(\",\").map((s) => s.trim().toLowerCase());\n const pivots = (pivotsRaw && pivotsRaw.length > 0 ? pivotsRaw : DEFAULT_PIVOTS) as PivotSlug[];\n const topN = args[\"top-n\"] ? Number(args[\"top-n\"]) : 10;\n const intent = (args.intent as string | undefined) ?? \"baseline\";\n\n const { start, end } = resolveRange(args);\n\n try {\n const results: PivotResult[] = [];\n for (const pivot of pivots) {\n const data = await apiPost<AnalyticsResponse>(\"/api/ads/linkedin/analytics\", {\n request: {\n level: \"campaign\",\n ids,\n intent,\n pivot,\n start,\n end,\n granularity: \"ALL\",\n limit: 500,\n },\n skipCache: Boolean(args[\"no-cache\"]),\n });\n results.push({ pivot, rows: topByImpressions(data.rows, topN), warnings: data.warnings });\n }\n\n writeAdsJson({\n ok: true,\n data: {\n query: { campaigns: ids, start, end, intent, topN },\n pivots: results,\n },\n });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\nfunction resolveRange(args: Record<string, unknown>): { start: string; end?: string } {\n const start = args.start as string | undefined;\n const end = args.end as string | undefined;\n if (start) {\n return { start, end };\n }\n const days = args[\"last-days\"] ? Number(args[\"last-days\"]) : 30;\n if (!Number.isFinite(days) || days < 1) {\n handleLinkedinError(new Error(\"Invalid --last-days; must be a positive integer.\"));\n }\n return { start: daysAgoIso(days), end: todayIso() };\n}\n"],"mappings":"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","names":[]}
@@ -2,12 +2,11 @@ import {
2
2
  failApi,
3
3
  failValidation,
4
4
  writeOk
5
- } from "./chunk-SJYEY5MV.js";
6
- import "./chunk-7EPXVICM.js";
5
+ } from "./chunk-3HJLHTWP.js";
6
+ import "./chunk-XF4JUKVF.js";
7
7
  import "./chunk-GXDLWBOY.js";
8
8
  import "./chunk-TEINLN64.js";
9
9
  import "./chunk-ZJWUBJYQ.js";
10
- import "./chunk-HR6IWNKE.js";
11
10
  import "./chunk-NE4F3FHN.js";
12
11
  import {
13
12
  apiPost,
@@ -64,4 +63,4 @@ var discardCommand = defineCommand({
64
63
  export {
65
64
  discardCommand
66
65
  };
67
- //# sourceMappingURL=discard-HTQUUHJR.js.map
66
+ //# sourceMappingURL=discard-2WWQG6OU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/actions/discard.ts"],"sourcesContent":["import type { ActionsDiscardResponse } 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, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.discard\",\n description:\n \"Stage discard of an action — no claim needed; retire any action you're not working on. Applies on chat publish. Blocked only if another chat currently has it claimed.\",\n args: {\n id: { type: \"string\", description: \"Action ID\", required: true },\n reason: { type: \"string\", description: \"Optional reason\", required: false },\n },\n});\n\nexport const discardCommand = defineCommand({\n meta: {\n name: \"discard\",\n description:\n 'Stage discard of an action (no claim needed). Example: baker actions discard <id> --reason \"obsolete\"',\n },\n args: {\n id: { type: \"positional\", description: \"Action ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID\", required: false },\n reason: { type: \"string\", description: \"Reason for discarding\", 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 await apiPost<ActionsDiscardResponse>(\"/api/actions/discard\", {\n chatId,\n actionId: id,\n reason: args.reason,\n });\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,aAAa,UAAU,KAAK;AAAA,IAC/D,QAAQ,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AAEM,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,aAAa,UAAU,MAAM;AAAA,IACpE,aAAa,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,MAAM;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,yBAAyB,UAAU,MAAM;AAAA,EAClF;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,uBAAiB,EAAE;AACnB,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAgC,wBAAwB;AAAA,QAC5D;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,KAAK;AAAA,MACf,CAAC;AACD,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/commands/actions/discard.ts"],"sourcesContent":["import type { ActionsDiscardResponse } 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, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.discard\",\n description:\n \"Stage discard of an action — no claim needed; retire any action you're not working on. Applies on chat publish. Blocked only if another chat currently has it claimed.\",\n args: {\n id: { type: \"string\", description: \"Action ID\", required: true },\n reason: { type: \"string\", description: \"Optional reason\", required: false },\n },\n});\n\nexport const discardCommand = defineCommand({\n meta: {\n name: \"discard\",\n description:\n 'Stage discard of an action (no claim needed). Example: baker actions discard <id> --reason \"obsolete\"',\n },\n args: {\n id: { type: \"positional\", description: \"Action ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID\", required: false },\n reason: { type: \"string\", description: \"Reason for discarding\", 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 await apiPost<ActionsDiscardResponse>(\"/api/actions/discard\", {\n chatId,\n actionId: id,\n reason: args.reason,\n });\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,aAAa,UAAU,KAAK;AAAA,IAC/D,QAAQ,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AAEM,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,aAAa,UAAU,MAAM;AAAA,IACpE,aAAa,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,MAAM;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,yBAAyB,UAAU,MAAM;AAAA,EAClF;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,uBAAiB,EAAE;AACnB,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAgC,wBAAwB;AAAA,QAC5D;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,KAAK;AAAA,MACf,CAAC;AACD,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -1,11 +1,10 @@
1
1
  import {
2
2
  failSite
3
- } from "./chunk-FUHN4MFY.js";
4
- import "./chunk-7EPXVICM.js";
3
+ } from "./chunk-JQJDXPCO.js";
4
+ import "./chunk-XF4JUKVF.js";
5
5
  import "./chunk-GXDLWBOY.js";
6
6
  import "./chunk-TEINLN64.js";
7
7
  import "./chunk-ZJWUBJYQ.js";
8
- import "./chunk-HR6IWNKE.js";
9
8
  import "./chunk-NE4F3FHN.js";
10
9
  import {
11
10
  apiGet,
@@ -96,4 +95,4 @@ var domainCommand = defineCommand({
96
95
  export {
97
96
  domainCommand
98
97
  };
99
- //# sourceMappingURL=domain-RECGZXJB.js.map
98
+ //# sourceMappingURL=domain-Y2LT6JLT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/site/domain.ts"],"sourcesContent":["import type {\n SiteDomainsResponse,\n SiteDomainVerifyRequest,\n SiteDomainVerifyResponse,\n SiteStageRequest,\n SiteStageResponse,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiGet, apiPost } from \"../../client.ts\";\nimport { optionalChatId, requireChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failSite } from \"./shared.ts\";\n\nregisterSchema({\n command: \"site.domain.add\",\n description:\n \"Stage connecting a custom domain (a subdomain such as shop.acme.com — not the bare acme.com) to the company's landings. Applies when the chat is published; then Baker starts verifying it. The client must add a CNAME record pointing the hostname at customers.withbaker.com — the response's hints give the exact record to ask for. Refused at once when another company already registered it or the company is at its domain limit.\",\n args: { hostname: { type: \"string\", description: \"The subdomain to connect, e.g. shop.acme.com\", required: true } },\n});\n\nregisterSchema({\n command: \"site.domain.list\",\n description:\n \"Every custom domain of the company and its status: pending_verification (waiting for the DNS record — `message` says what is missing), active (live), error, or staged (this chat adds it at publish). Read-only.\",\n args: {},\n});\n\nregisterSchema({\n command: \"site.domain.verify\",\n description:\n \"Re-check a domain that is waiting for verification now instead of waiting for the background check (every few minutes). Use after the client says they added the DNS record. Returns its state and, if it is not live yet, what is still missing. A staged domain cannot be checked until the chat is published.\",\n args: { hostname: { type: \"string\", description: \"A domain from `baker site domain list`\", required: true } },\n});\n\nconst addCommand = defineCommand({\n meta: {\n name: \"add\",\n description:\n \"Stage connecting a custom domain; applies at publish. The client adds a CNAME to customers.withbaker.com.\\n\\nExample: baker site domain add shop.acme.com\",\n },\n args: { hostname: { type: \"positional\", description: \"Subdomain, e.g. shop.acme.com\", required: true } },\n run: async ({ args }) => {\n try {\n const body: SiteStageRequest = {\n chatId: requireChatId(),\n inputs: [{ setting: \"customDomain\", hostname: String(args.hostname) }],\n };\n writeJson(await apiPost<SiteStageResponse>(\"/api/site/stage\", body));\n } catch (err) {\n failSite(err);\n }\n },\n});\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description: \"List the company's custom domains and what each is waiting for.\\n\\nExample: baker site domain list\",\n },\n run: async () => {\n try {\n const chatId = optionalChatId();\n writeJson(await apiGet<SiteDomainsResponse>(\"/api/site/domains\", chatId ? { chatId } : undefined));\n } catch (err) {\n failSite(err);\n }\n },\n});\n\nconst verifyCommand = defineCommand({\n meta: {\n name: \"verify\",\n description:\n \"Re-check a pending domain now, e.g. right after the client added the DNS record.\\n\\nExample: baker site domain verify shop.acme.com\",\n },\n args: { hostname: { type: \"positional\", description: \"A domain from `baker site domain list`\", required: true } },\n run: async ({ args }) => {\n try {\n const body: SiteDomainVerifyRequest = { hostname: String(args.hostname) };\n writeJson(await apiPost<SiteDomainVerifyResponse>(\"/api/site/domains/verify\", body));\n } catch (err) {\n failSite(err);\n }\n },\n});\n\nexport const domainCommand = defineCommand({\n meta: {\n name: \"domain\",\n description:\n \"Custom domains for the company's landings. Subcommands: add (staged until publish), list, verify.\\n\\nExamples:\\n baker site domain add shop.acme.com\\n baker site domain list\\n baker site domain verify shop.acme.com\",\n },\n subCommands: { add: addCommand, list: listCommand, verify: verifyCommand },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAOA,SAAS,qBAAqB;AAO9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM,EAAE,UAAU,EAAE,MAAM,UAAU,aAAa,gDAAgD,UAAU,KAAK,EAAE;AACpH,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM,CAAC;AACT,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM,EAAE,UAAU,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,KAAK,EAAE;AAC9G,CAAC;AAED,IAAM,aAAa,cAAc;AAAA,EAC/B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,aAAa,iCAAiC,UAAU,KAAK,EAAE;AAAA,EACvG,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,OAAyB;AAAA,QAC7B,QAAQ,cAAc;AAAA,QACtB,QAAQ,CAAC,EAAE,SAAS,gBAAgB,UAAU,OAAO,KAAK,QAAQ,EAAE,CAAC;AAAA,MACvE;AACA,gBAAU,MAAM,QAA2B,mBAAmB,IAAI,CAAC;AAAA,IACrE,SAAS,KAAK;AACZ,eAAS,GAAG;AAAA,IACd;AAAA,EACF;AACF,CAAC;AAED,IAAM,cAAc,cAAc;AAAA,EAChC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,KAAK,YAAY;AACf,QAAI;AACF,YAAM,SAAS,eAAe;AAC9B,gBAAU,MAAM,OAA4B,qBAAqB,SAAS,EAAE,OAAO,IAAI,MAAS,CAAC;AAAA,IACnG,SAAS,KAAK;AACZ,eAAS,GAAG;AAAA,IACd;AAAA,EACF;AACF,CAAC;AAED,IAAM,gBAAgB,cAAc;AAAA,EAClC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,aAAa,0CAA0C,UAAU,KAAK,EAAE;AAAA,EAChH,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,OAAgC,EAAE,UAAU,OAAO,KAAK,QAAQ,EAAE;AACxE,gBAAU,MAAM,QAAkC,4BAA4B,IAAI,CAAC;AAAA,IACrF,SAAS,KAAK;AACZ,eAAS,GAAG;AAAA,IACd;AAAA,EACF;AACF,CAAC;AAEM,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,aAAa,EAAE,KAAK,YAAY,MAAM,aAAa,QAAQ,cAAc;AAC3E,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/commands/site/domain.ts"],"sourcesContent":["import type {\n SiteDomainsResponse,\n SiteDomainVerifyRequest,\n SiteDomainVerifyResponse,\n SiteStageRequest,\n SiteStageResponse,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiGet, apiPost } from \"../../client.ts\";\nimport { optionalChatId, requireChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failSite } from \"./shared.ts\";\n\nregisterSchema({\n command: \"site.domain.add\",\n description:\n \"Stage connecting a custom domain (a subdomain such as shop.acme.com — not the bare acme.com) to the company's landings. Applies when the chat is published; then Baker starts verifying it. The client must add a CNAME record pointing the hostname at customers.withbaker.com — the response's hints give the exact record to ask for. Refused at once when another company already registered it or the company is at its domain limit.\",\n args: { hostname: { type: \"string\", description: \"The subdomain to connect, e.g. shop.acme.com\", required: true } },\n});\n\nregisterSchema({\n command: \"site.domain.list\",\n description:\n \"Every custom domain of the company and its status: pending_verification (waiting for the DNS record — `message` says what is missing), active (live), error, or staged (this chat adds it at publish). Read-only.\",\n args: {},\n});\n\nregisterSchema({\n command: \"site.domain.verify\",\n description:\n \"Re-check a domain that is waiting for verification now instead of waiting for the background check (every few minutes). Use after the client says they added the DNS record. Returns its state and, if it is not live yet, what is still missing. A staged domain cannot be checked until the chat is published.\",\n args: { hostname: { type: \"string\", description: \"A domain from `baker site domain list`\", required: true } },\n});\n\nconst addCommand = defineCommand({\n meta: {\n name: \"add\",\n description:\n \"Stage connecting a custom domain; applies at publish. The client adds a CNAME to customers.withbaker.com.\\n\\nExample: baker site domain add shop.acme.com\",\n },\n args: { hostname: { type: \"positional\", description: \"Subdomain, e.g. shop.acme.com\", required: true } },\n run: async ({ args }) => {\n try {\n const body: SiteStageRequest = {\n chatId: requireChatId(),\n inputs: [{ setting: \"customDomain\", hostname: String(args.hostname) }],\n };\n writeJson(await apiPost<SiteStageResponse>(\"/api/site/stage\", body));\n } catch (err) {\n failSite(err);\n }\n },\n});\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description: \"List the company's custom domains and what each is waiting for.\\n\\nExample: baker site domain list\",\n },\n run: async () => {\n try {\n const chatId = optionalChatId();\n writeJson(await apiGet<SiteDomainsResponse>(\"/api/site/domains\", chatId ? { chatId } : undefined));\n } catch (err) {\n failSite(err);\n }\n },\n});\n\nconst verifyCommand = defineCommand({\n meta: {\n name: \"verify\",\n description:\n \"Re-check a pending domain now, e.g. right after the client added the DNS record.\\n\\nExample: baker site domain verify shop.acme.com\",\n },\n args: { hostname: { type: \"positional\", description: \"A domain from `baker site domain list`\", required: true } },\n run: async ({ args }) => {\n try {\n const body: SiteDomainVerifyRequest = { hostname: String(args.hostname) };\n writeJson(await apiPost<SiteDomainVerifyResponse>(\"/api/site/domains/verify\", body));\n } catch (err) {\n failSite(err);\n }\n },\n});\n\nexport const domainCommand = defineCommand({\n meta: {\n name: \"domain\",\n description:\n \"Custom domains for the company's landings. Subcommands: add (staged until publish), list, verify.\\n\\nExamples:\\n baker site domain add shop.acme.com\\n baker site domain list\\n baker site domain verify shop.acme.com\",\n },\n subCommands: { add: addCommand, list: listCommand, verify: verifyCommand },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAOA,SAAS,qBAAqB;AAO9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM,EAAE,UAAU,EAAE,MAAM,UAAU,aAAa,gDAAgD,UAAU,KAAK,EAAE;AACpH,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM,CAAC;AACT,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM,EAAE,UAAU,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,KAAK,EAAE;AAC9G,CAAC;AAED,IAAM,aAAa,cAAc;AAAA,EAC/B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,aAAa,iCAAiC,UAAU,KAAK,EAAE;AAAA,EACvG,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,OAAyB;AAAA,QAC7B,QAAQ,cAAc;AAAA,QACtB,QAAQ,CAAC,EAAE,SAAS,gBAAgB,UAAU,OAAO,KAAK,QAAQ,EAAE,CAAC;AAAA,MACvE;AACA,gBAAU,MAAM,QAA2B,mBAAmB,IAAI,CAAC;AAAA,IACrE,SAAS,KAAK;AACZ,eAAS,GAAG;AAAA,IACd;AAAA,EACF;AACF,CAAC;AAED,IAAM,cAAc,cAAc;AAAA,EAChC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,KAAK,YAAY;AACf,QAAI;AACF,YAAM,SAAS,eAAe;AAC9B,gBAAU,MAAM,OAA4B,qBAAqB,SAAS,EAAE,OAAO,IAAI,MAAS,CAAC;AAAA,IACnG,SAAS,KAAK;AACZ,eAAS,GAAG;AAAA,IACd;AAAA,EACF;AACF,CAAC;AAED,IAAM,gBAAgB,cAAc;AAAA,EAClC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,aAAa,0CAA0C,UAAU,KAAK,EAAE;AAAA,EAChH,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,OAAgC,EAAE,UAAU,OAAO,KAAK,QAAQ,EAAE;AACxE,gBAAU,MAAM,QAAkC,4BAA4B,IAAI,CAAC;AAAA,IACrF,SAAS,KAAK;AACZ,eAAS,GAAG;AAAA,IACd;AAAA,EACF;AACF,CAAC;AAEM,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,aAAa,EAAE,KAAK,YAAY,MAAM,aAAa,QAAQ,cAAc;AAC3E,CAAC;","names":[]}
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  loadPatchArg,
3
3
  requireTarget
4
- } from "./chunk-NA63BH7V.js";
4
+ } from "./chunk-4AUMTNVB.js";
5
5
  import {
6
6
  handleLinkedinError
7
- } from "./chunk-N4LAYIIN.js";
7
+ } from "./chunk-CSYSX4D2.js";
8
8
  import "./chunk-T4DD5YMP.js";
9
9
  import "./chunk-4NZ47VXO.js";
10
10
  import {
@@ -23,11 +23,10 @@ import "./chunk-YBMVHGY3.js";
23
23
  import {
24
24
  CHAT_READ_ARG
25
25
  } from "./chunk-PFBQERWX.js";
26
- import "./chunk-7EPXVICM.js";
26
+ import "./chunk-XF4JUKVF.js";
27
27
  import "./chunk-GXDLWBOY.js";
28
28
  import "./chunk-TEINLN64.js";
29
29
  import "./chunk-ZJWUBJYQ.js";
30
- import "./chunk-HR6IWNKE.js";
31
30
  import "./chunk-NE4F3FHN.js";
32
31
  import {
33
32
  apiPost
@@ -304,4 +303,4 @@ var linkedinDraftCommand = defineCommand({
304
303
  export {
305
304
  linkedinDraftCommand
306
305
  };
307
- //# sourceMappingURL=draft-Q546QPPU.js.map
306
+ //# sourceMappingURL=draft-EJXNNJ3Y.js.map