@koda-sl/baker-cli 0.470.0 → 0.471.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/README.md +41 -5
  2. package/dist/{account-GIZWP5QF.js → account-SP2RA2XD.js} +4 -4
  3. package/dist/{accounts-CQUW36ZY.js → accounts-R2ZLSJEW.js} +3 -3
  4. package/dist/{accounts-5KDBVRJ2.js → accounts-XG5W4JC4.js} +5 -5
  5. package/dist/{actions-BDC7CQ3R.js → actions-LZE7K24U.js} +18 -18
  6. package/dist/activecampaign-RKTIWG4U.js +935 -0
  7. package/dist/activecampaign-RKTIWG4U.js.map +1 -0
  8. package/dist/{add-3M6T5MLO.js → add-7LC2XDIE.js} +3 -3
  9. package/dist/{add-2N3G4EUY.js → add-XKSQMOFC.js} +2 -2
  10. package/dist/{ads-626CEAXU.js → ads-AEQPHUOB.js} +4 -4
  11. package/dist/{advertisers-XHIAWVLX.js → advertisers-FFRP4SQ3.js} +3 -3
  12. package/dist/{analytics-JK53QUDI.js → analytics-PQSMY2BS.js} +3 -3
  13. package/dist/{analytics-L4UTJ5RA.js → analytics-SETCYHRK.js} +15 -15
  14. package/dist/{assign-SH76OUMA.js → assign-3UKKZ3Q3.js} +3 -3
  15. package/dist/{audience-size-RXOBSRN5.js → audience-size-YBLT324O.js} +3 -3
  16. package/dist/{audit-RLYCO6Q6.js → audit-C6HEPG2Z.js} +3 -3
  17. package/dist/{autocomplete-QQ56I5YS.js → autocomplete-EYIWA7PG.js} +3 -3
  18. package/dist/{avatars-T66JDLVN.js → avatars-YDGM27UP.js} +4 -4
  19. package/dist/{bid-pricing-6UD42SON.js → bid-pricing-KSREYT6M.js} +3 -3
  20. package/dist/{brand-CRNZCOV2.js → brand-46IADVGO.js} +2 -2
  21. package/dist/{brief-NU5FLVPY.js → brief-54ZL3EXF.js} +7 -7
  22. package/dist/{campaign-groups-5HMTK5J5.js → campaign-groups-KT3BNDFJ.js} +8 -8
  23. package/dist/{campaign-writes-BGAS7L64.js → campaign-writes-FQJD4DWV.js} +3 -3
  24. package/dist/{campaigns-OM5FQIR6.js → campaigns-2PQHW6SO.js} +5 -5
  25. package/dist/{campaigns-R624HC75.js → campaigns-XQVYFSZG.js} +11 -11
  26. package/dist/{canvas-XOOXIOIM.js → canvas-YOO4IHGS.js} +12 -12
  27. package/dist/{capabilities-AH763WSY.js → capabilities-6QWU3ZJH.js} +3 -3
  28. package/dist/{chats-DNLK6TTQ.js → chats-VTM5S5Q5.js} +3 -3
  29. package/dist/{chunk-DBAO7JLW.js → chunk-2CMRJQY7.js} +3 -3
  30. package/dist/{chunk-WNTVBUVI.js → chunk-2KACEWPN.js} +4 -4
  31. package/dist/{chunk-HM25R6XJ.js → chunk-3BXQSDMJ.js} +2 -2
  32. package/dist/{chunk-2EINLGUZ.js → chunk-44TCHDXM.js} +3 -3
  33. package/dist/{chunk-ME6PYW77.js → chunk-4C7SIRHL.js} +2 -2
  34. package/dist/{chunk-HHOKZCIL.js → chunk-4I4UB4ZE.js} +3 -3
  35. package/dist/{chunk-V6GKEKPX.js → chunk-4LIYWGQL.js} +2 -2
  36. package/dist/{chunk-ZZMP35QD.js → chunk-4LXKCSWY.js} +2 -2
  37. package/dist/{chunk-PYPILVCC.js → chunk-53DV3HBZ.js} +2 -2
  38. package/dist/{chunk-XASW5FLO.js → chunk-6A2X5MPY.js} +2 -2
  39. package/dist/{chunk-XSFBGHGG.js → chunk-6EEYWFD5.js} +2 -2
  40. package/dist/{chunk-WWCQBHDC.js → chunk-6S44QXXI.js} +2 -2
  41. package/dist/{chunk-7MQVCSA7.js → chunk-6USNEQZT.js} +182 -100
  42. package/dist/chunk-6USNEQZT.js.map +1 -0
  43. package/dist/{chunk-XQ2FGDOQ.js → chunk-7NWOGEAW.js} +2 -2
  44. package/dist/{chunk-CAA32DMC.js → chunk-7SLEBQIM.js} +5 -5
  45. package/dist/{chunk-KBHXLOYJ.js → chunk-7ZSLXBOS.js} +2 -2
  46. package/dist/{chunk-WB77W2ST.js → chunk-BAEXXBRM.js} +293 -12
  47. package/dist/chunk-BAEXXBRM.js.map +1 -0
  48. package/dist/{chunk-SSJK7FEV.js → chunk-BC2BXRXY.js} +3 -2
  49. package/dist/{chunk-SSJK7FEV.js.map → chunk-BC2BXRXY.js.map} +1 -1
  50. package/dist/{chunk-MPXDQWYI.js → chunk-BMD3HCSI.js} +3 -3
  51. package/dist/{chunk-ACDS7T57.js → chunk-CS4NPJ2M.js} +13 -7
  52. package/dist/chunk-CS4NPJ2M.js.map +1 -0
  53. package/dist/{chunk-VXRGAUZK.js → chunk-D536MQC6.js} +3 -3
  54. package/dist/{chunk-YT74ZEVP.js → chunk-GFX3BZRA.js} +2 -2
  55. package/dist/{chunk-T4V6KQY2.js → chunk-IPWXGR65.js} +2 -2
  56. package/dist/{chunk-DA2ANVMG.js → chunk-IWE7WFHI.js} +3 -3
  57. package/dist/{chunk-4XZSZRCG.js → chunk-KLPCKKBZ.js} +2 -2
  58. package/dist/{chunk-M55JELFT.js → chunk-MM6QFNHV.js} +2 -2
  59. package/dist/{chunk-EPZNFXI2.js → chunk-NBXFSSCW.js} +3 -3
  60. package/dist/{chunk-IL7PZKQN.js → chunk-OCFYRZQW.js} +2 -2
  61. package/dist/{chunk-RPUSTYHL.js → chunk-PAJJXZ3Z.js} +2 -2
  62. package/dist/{chunk-F6G3RECD.js → chunk-PB4RAOBC.js} +3 -3
  63. package/dist/{chunk-T6USZ3EO.js → chunk-QHNHW76K.js} +2 -2
  64. package/dist/{chunk-BAXURR55.js → chunk-QNDZNMUS.js} +5 -5
  65. package/dist/{chunk-CTLAIMJP.js → chunk-QO6QHZTW.js} +2 -2
  66. package/dist/{chunk-ISDCUB2Q.js → chunk-TCQFIUKQ.js} +2 -2
  67. package/dist/{chunk-MSJKALUF.js → chunk-WTL5RI2J.js} +2 -2
  68. package/dist/{chunk-WXC3I4CT.js → chunk-XABVEMC3.js} +37 -11
  69. package/dist/chunk-XABVEMC3.js.map +1 -0
  70. package/dist/{chunk-A3VUXG5G.js → chunk-YRERFQ7Z.js} +2 -2
  71. package/dist/{claim-YXL2HUFU.js → claim-KPJXAUQW.js} +3 -3
  72. package/dist/cli.js +28 -27
  73. package/dist/cli.js.map +1 -1
  74. package/dist/{companies-U55HX5JN.js → companies-SD36QDTM.js} +3 -3
  75. package/dist/{complete-VABZEJTL.js → complete-Y3M6OXPA.js} +3 -3
  76. package/dist/{connect-6KS42I3C.js → connect-QNPBSMWK.js} +6 -6
  77. package/dist/{conversation-UEIXBJ32.js → conversation-EEL3AY6B.js} +3 -3
  78. package/dist/{conversions-V7ZPJ5T7.js → conversions-7A34JRO4.js} +7 -7
  79. package/dist/{create-5NLAAJE4.js → create-4H273ZGZ.js} +3 -3
  80. package/dist/{create-7L6SXSPH.js → create-6NJRTWYT.js} +3 -3
  81. package/dist/{create-UMVQNYZF.js → create-GKC3DLQK.js} +2 -2
  82. package/dist/{create-NZIFE6O7.js → create-JTTFEJZE.js} +3 -3
  83. package/dist/{creatives-5V3ZGVO6.js → creatives-FNHTRAAH.js} +8 -8
  84. package/dist/{creatives-4A4HJKD3.js → creatives-IFAOJHLW.js} +10 -10
  85. package/dist/{credentials-PB3RFZOC.js → credentials-7L3K6QFN.js} +3 -3
  86. package/dist/{critique-SZRPZU2P.js → critique-BZLL3N37.js} +5 -5
  87. package/dist/{critique-FRBVRWVL.js → critique-GEBGDHWB.js} +3 -3
  88. package/dist/{crm-SVQ22Q6N.js → crm-4IGMD5QF.js} +4 -4
  89. package/dist/{crm-I6E2FACM.js → crm-J3HX3ZT6.js} +4 -4
  90. package/dist/{customers-ZB6EYQEH.js → customers-TSJH2AUE.js} +5 -5
  91. package/dist/{delete-I7MTK63S.js → delete-56HFQZCX.js} +2 -2
  92. package/dist/{delete-7MNFMQ6X.js → delete-JZUAO6LZ.js} +3 -3
  93. package/dist/{delete-HE2ACICZ.js → delete-XTCS5H6L.js} +3 -3
  94. package/dist/{demographics-BLL7UL26.js → demographics-DKT2UN4S.js} +3 -3
  95. package/dist/{discard-6GTJKV37.js → discard-2357VMCI.js} +3 -3
  96. package/dist/{domain-FHJKL6ZC.js → domain-NM553OX2.js} +3 -3
  97. package/dist/{draft-3GZ3RTYT.js → draft-FDJK7FLI.js} +3 -3
  98. package/dist/{draft-4W5CP2R7.js → draft-NEXKT5HF.js} +4 -4
  99. package/dist/{draft-REIQ6JCS.js → draft-UDDLC7YZ.js} +3 -3
  100. package/dist/{facets-HCI6JP4Q.js → facets-6R4DOSZJ.js} +3 -3
  101. package/dist/{feedback-CM63S3ME.js → feedback-WW6YQQJA.js} +2 -2
  102. package/dist/{feedback-record-4EPVZ6BQ.js → feedback-record-KGYP2IUQ.js} +7 -7
  103. package/dist/{fetch-2ZONBBKW.js → fetch-JGUKB6R7.js} +3 -3
  104. package/dist/{flows-HXJXVGLU.js → flows-MI2FZJU2.js} +11 -11
  105. package/dist/{flows-HXJXVGLU.js.map → flows-MI2FZJU2.js.map} +1 -1
  106. package/dist/{fonts-T6BDCPSZ.js → fonts-JRQFPSS6.js} +5 -5
  107. package/dist/{forecast-EKOVQJ4F.js → forecast-72GMGD64.js} +3 -3
  108. package/dist/{funnel-ISMIHL3P.js → funnel-BJJQI72Z.js} +5 -5
  109. package/dist/{get-X5B6VCSC.js → get-DC3WBYJD.js} +3 -3
  110. package/dist/{get-LSIYBPPA.js → get-HTAU7NQU.js} +3 -3
  111. package/dist/{google-S7AQ7KOJ.js → google-UC5RRXF3.js} +2 -2
  112. package/dist/{google-ads-VYRPY3FQ.js → google-ads-OLFRVBP6.js} +3 -3
  113. package/dist/{history-2F3IPVQU.js → history-IFJKE65W.js} +3 -3
  114. package/dist/{hubspot-VFGBXW2X.js → hubspot-AT4E52RB.js} +7 -7
  115. package/dist/{ideas-FYW4XSSC.js → ideas-BUJVMRQF.js} +2 -2
  116. package/dist/{images-3EHPQRQD.js → images-MWG3CNPG.js} +4 -4
  117. package/dist/{ingest-SREMQAWS.js → ingest-F7XSH47V.js} +2 -2
  118. package/dist/{ingest-OFVANVIF.js → ingest-XIX4CZ2P.js} +3 -3
  119. package/dist/{inspect-PWUKLRNZ.js → inspect-4O2SAWNX.js} +3 -3
  120. package/dist/{keyword-metrics-SGOGGYHN.js → keyword-metrics-4UDAJAQJ.js} +3 -3
  121. package/dist/{keywords-for-site-NAZSCVQR.js → keywords-for-site-HZCZK3EI.js} +3 -3
  122. package/dist/{landing-33KYCXXA.js → landing-2L325EK3.js} +2 -2
  123. package/dist/{leads-Y3PFOEGM.js → leads-TNZW3RTA.js} +3 -3
  124. package/dist/{learn-WQ2QQ77L.js → learn-KNTDSDPX.js} +4 -4
  125. package/dist/{line-item-writes-S4JLVWTU.js → line-item-writes-6BWPQSOY.js} +3 -3
  126. package/dist/{line-items-DMXOAXFU.js → line-items-525PQOI3.js} +5 -5
  127. package/dist/{link-4DNY5OSY.js → link-SJQFQLTY.js} +3 -3
  128. package/dist/{linkedin-D22GQOKW.js → linkedin-OD36IRJS.js} +26 -26
  129. package/dist/{list-YFET6MM3.js → list-DKA4BDKT.js} +2 -2
  130. package/dist/{list-H7V6MUUV.js → list-QEPDSHHY.js} +3 -3
  131. package/dist/{list-CQXOFLNY.js → list-X3Q5MSYK.js} +3 -3
  132. package/dist/{log-SA4GFECI.js → log-S4U4JQ77.js} +3 -3
  133. package/dist/{lookup-32HPES25.js → lookup-CMB2JELV.js} +4 -4
  134. package/dist/{make-T2JR6IA5.js → make-ZKG6IKEL.js} +10 -10
  135. package/dist/{map-OMWTKH4J.js → map-DOGBZT3Y.js} +40 -11
  136. package/dist/map-DOGBZT3Y.js.map +1 -0
  137. package/dist/{mcp-OM6JLDQ6.js → mcp-ACBDK6UV.js} +2 -2
  138. package/dist/{media-sources-JHTGT6FF.js → media-sources-LCIPLOTF.js} +2 -2
  139. package/dist/{members-KDJBWRU5.js → members-3B43WCMP.js} +3 -3
  140. package/dist/{normalize-JEXAJD4K.js → normalize-QFKNYVLR.js} +3 -3
  141. package/dist/{options-CL2VJ26D.js → options-434QB4V6.js} +9 -8
  142. package/dist/options-434QB4V6.js.map +1 -0
  143. package/dist/{performance-SI2ZRX5D.js → performance-ZOWSMCZF.js} +4 -4
  144. package/dist/{plan-UEYS6CHL.js → plan-PZVXAECA.js} +3 -3
  145. package/dist/{promoted-tweet-writes-ADZNQUNV.js → promoted-tweet-writes-UBK3GPXT.js} +3 -3
  146. package/dist/{promoted-tweets-CNREPMPQ.js → promoted-tweets-MTZ7SSVK.js} +3 -3
  147. package/dist/{publish-2MQNUKLF.js → publish-N7WR2HAO.js} +3 -3
  148. package/dist/{questionnaire-4HSUNNNC.js → questionnaire-SGHGA4AZ.js} +3 -3
  149. package/dist/{reddit-C73WD45T.js → reddit-LWV2OILV.js} +4 -4
  150. package/dist/{refresh-FYOCED4T.js → refresh-GGMYGGUW.js} +2 -2
  151. package/dist/{release-HJZCWKY6.js → release-B5B7TWMA.js} +3 -3
  152. package/dist/{remove-WB6LFXWK.js → remove-EWZMAYUI.js} +2 -2
  153. package/dist/{reopen-3VQ4NYZ5.js → reopen-BAE4WPC6.js} +3 -3
  154. package/dist/{rerun-OV3TEE6P.js → rerun-KHHPDTLP.js} +10 -10
  155. package/dist/{research-6WRKGPRC.js → research-GR27TIGA.js} +2 -2
  156. package/dist/{research-7JKXF6BI.js → research-KMKYFBWF.js} +10 -10
  157. package/dist/{reset-5BMABGUG.js → reset-6XVTFUBM.js} +2 -2
  158. package/dist/{reset-F4BDAHUI.js → reset-BU6IJGOR.js} +2 -2
  159. package/dist/{resolve-QRATNPWX.js → resolve-3EPJNPRF.js} +3 -3
  160. package/dist/{retry-B4JRFPPF.js → retry-SWTQWKJM.js} +2 -2
  161. package/dist/{retry-SQSIAX33.js → retry-U4XMO7PA.js} +2 -2
  162. package/dist/{run-FU3UF4YV.js → run-EXER4CJ5.js} +10 -10
  163. package/dist/{run-6NXPDWRP.js → run-YVWGH5C5.js} +3 -3
  164. package/dist/{scaffold-ad-4VTZB4JH.js → scaffold-ad-HKGKQUR7.js} +8 -8
  165. package/dist/{scaffold-static-ad-AB2RG3SH.js → scaffold-static-ad-Q3AU7QQ4.js} +12 -12
  166. package/dist/{scaffold-video-RSGJWHHT.js → scaffold-video-M63JFOPT.js} +7 -7
  167. package/dist/{schedule-WZF3BQSX.js → schedule-RILFJJ2P.js} +2 -2
  168. package/dist/{scheduled-agents-J75TOVGN.js → scheduled-agents-CUSH7BI5.js} +11 -11
  169. package/dist/{schema-O5PX4O4J.js → schema-JASSX36C.js} +4 -4
  170. package/dist/{search-WYO77TIF.js → search-PP5PH3NM.js} +2 -2
  171. package/dist/{select-G5W6WGRB.js → select-O4NQK5A4.js} +7 -7
  172. package/dist/{sends-E5NSPLNS.js → sends-ZOT5WPVC.js} +3 -3
  173. package/dist/{set-prompt-PJA7LUUJ.js → set-prompt-SHMGN6KR.js} +5 -5
  174. package/dist/{setup-links-HFWMDF6E.js → setup-links-6THA2YOJ.js} +3 -3
  175. package/dist/{site-YJJBAS7M.js → site-JRCQUJOE.js} +4 -4
  176. package/dist/{sources-MCAH4GWS.js → sources-M7VWKKCP.js} +48 -15
  177. package/dist/sources-M7VWKKCP.js.map +1 -0
  178. package/dist/{sources-VRRDVWZC.js → sources-WRC3LAZQ.js} +6 -6
  179. package/dist/{stale-I6UGM3MO.js → stale-ZBXHYQ6Z.js} +6 -6
  180. package/dist/{status-TCOUMPJS.js → status-GG6UTBWM.js} +3 -3
  181. package/dist/{sync-TWV4HUHZ.js → sync-6R64PGCZ.js} +2 -2
  182. package/dist/{sync-definition-K6UMLDZF.js → sync-definition-YTTTJMV4.js} +7 -7
  183. package/dist/{tags-AWO5FFGM.js → tags-4CEVGCMN.js} +2 -2
  184. package/dist/{tags-NBUNSN5L.js → tags-7CGYLMST.js} +3 -3
  185. package/dist/{tags-NBVQWFS2.js → tags-H6MESAFQ.js} +4 -4
  186. package/dist/{tags-ZOK7CY4V.js → tags-PAEIW2UI.js} +3 -3
  187. package/dist/{tags-DGLT344J.js → tags-PLB6UT4U.js} +3 -3
  188. package/dist/{targeting-criteria-MG7RLBOG.js → targeting-criteria-G2BAM34G.js} +3 -3
  189. package/dist/{targets-2B5AG4E4.js → targets-HE2LJCHE.js} +3 -3
  190. package/dist/{templates-IXF2C2LD.js → templates-OSMHAXLI.js} +3 -3
  191. package/dist/{testimonials-WNNC5PKQ.js → testimonials-7LPKA54Y.js} +6 -6
  192. package/dist/{top-companies-B2IZYN4T.js → top-companies-QYBVUFSB.js} +3 -3
  193. package/dist/{translate-MGMGQ27R.js → translate-67D6PBVJ.js} +10 -10
  194. package/dist/{triggers-3DDV3OJ3.js → triggers-BEJHXIRZ.js} +3 -3
  195. package/dist/{unlink-6M577LT6.js → unlink-ANZSGHCG.js} +3 -3
  196. package/dist/{unstage-KNCIQR4E.js → unstage-HU7G23ZL.js} +3 -3
  197. package/dist/{unstage-4EJNGWUT.js → unstage-JDC2HBEI.js} +3 -3
  198. package/dist/{update-7SK6PHDL.js → update-2QJ2F43N.js} +2 -2
  199. package/dist/{update-4NHLEM64.js → update-4DATQZGJ.js} +3 -3
  200. package/dist/{update-U3GEUFNY.js → update-7226ZVPC.js} +3 -3
  201. package/dist/{update-PMFYYMFX.js → update-K7EJ45LU.js} +3 -3
  202. package/dist/{upload-ITKCCYOQ.js → upload-42A6MAS3.js} +3 -3
  203. package/dist/{url-options-UFRD42MD.js → url-options-3XRKJSFA.js} +2 -2
  204. package/dist/{url-params-GAEQM2MQ.js → url-params-EHUS5YG5.js} +3 -3
  205. package/dist/{validate-4P2L4AXG.js → validate-KBPZX2H7.js} +5 -5
  206. package/dist/{videos-YVGJ3WO5.js → videos-FILPMPRL.js} +5 -5
  207. package/dist/{web-M7EYV5DF.js → web-KZFJIKDU.js} +3 -3
  208. package/dist/{winning-ads-4SU5DBEY.js → winning-ads-NLHGB3GX.js} +2 -2
  209. package/dist/{write-commands-7FT3MTOZ.js → write-commands-JCM6ZMUJ.js} +4 -4
  210. package/dist/{x-ESEGQ3W2.js → x-GVNB2MV2.js} +6 -6
  211. package/package.json +1 -1
  212. package/dist/chunk-7MQVCSA7.js.map +0 -1
  213. package/dist/chunk-ACDS7T57.js.map +0 -1
  214. package/dist/chunk-WB77W2ST.js.map +0 -1
  215. package/dist/chunk-WXC3I4CT.js.map +0 -1
  216. package/dist/map-OMWTKH4J.js.map +0 -1
  217. package/dist/options-CL2VJ26D.js.map +0 -1
  218. package/dist/sources-MCAH4GWS.js.map +0 -1
  219. /package/dist/{account-GIZWP5QF.js.map → account-SP2RA2XD.js.map} +0 -0
  220. /package/dist/{accounts-CQUW36ZY.js.map → accounts-R2ZLSJEW.js.map} +0 -0
  221. /package/dist/{accounts-5KDBVRJ2.js.map → accounts-XG5W4JC4.js.map} +0 -0
  222. /package/dist/{actions-BDC7CQ3R.js.map → actions-LZE7K24U.js.map} +0 -0
  223. /package/dist/{add-3M6T5MLO.js.map → add-7LC2XDIE.js.map} +0 -0
  224. /package/dist/{add-2N3G4EUY.js.map → add-XKSQMOFC.js.map} +0 -0
  225. /package/dist/{ads-626CEAXU.js.map → ads-AEQPHUOB.js.map} +0 -0
  226. /package/dist/{advertisers-XHIAWVLX.js.map → advertisers-FFRP4SQ3.js.map} +0 -0
  227. /package/dist/{analytics-JK53QUDI.js.map → analytics-PQSMY2BS.js.map} +0 -0
  228. /package/dist/{analytics-L4UTJ5RA.js.map → analytics-SETCYHRK.js.map} +0 -0
  229. /package/dist/{assign-SH76OUMA.js.map → assign-3UKKZ3Q3.js.map} +0 -0
  230. /package/dist/{audience-size-RXOBSRN5.js.map → audience-size-YBLT324O.js.map} +0 -0
  231. /package/dist/{audit-RLYCO6Q6.js.map → audit-C6HEPG2Z.js.map} +0 -0
  232. /package/dist/{autocomplete-QQ56I5YS.js.map → autocomplete-EYIWA7PG.js.map} +0 -0
  233. /package/dist/{avatars-T66JDLVN.js.map → avatars-YDGM27UP.js.map} +0 -0
  234. /package/dist/{bid-pricing-6UD42SON.js.map → bid-pricing-KSREYT6M.js.map} +0 -0
  235. /package/dist/{brand-CRNZCOV2.js.map → brand-46IADVGO.js.map} +0 -0
  236. /package/dist/{brief-NU5FLVPY.js.map → brief-54ZL3EXF.js.map} +0 -0
  237. /package/dist/{campaign-groups-5HMTK5J5.js.map → campaign-groups-KT3BNDFJ.js.map} +0 -0
  238. /package/dist/{campaign-writes-BGAS7L64.js.map → campaign-writes-FQJD4DWV.js.map} +0 -0
  239. /package/dist/{campaigns-OM5FQIR6.js.map → campaigns-2PQHW6SO.js.map} +0 -0
  240. /package/dist/{campaigns-R624HC75.js.map → campaigns-XQVYFSZG.js.map} +0 -0
  241. /package/dist/{canvas-XOOXIOIM.js.map → canvas-YOO4IHGS.js.map} +0 -0
  242. /package/dist/{capabilities-AH763WSY.js.map → capabilities-6QWU3ZJH.js.map} +0 -0
  243. /package/dist/{chats-DNLK6TTQ.js.map → chats-VTM5S5Q5.js.map} +0 -0
  244. /package/dist/{chunk-DBAO7JLW.js.map → chunk-2CMRJQY7.js.map} +0 -0
  245. /package/dist/{chunk-WNTVBUVI.js.map → chunk-2KACEWPN.js.map} +0 -0
  246. /package/dist/{chunk-HM25R6XJ.js.map → chunk-3BXQSDMJ.js.map} +0 -0
  247. /package/dist/{chunk-2EINLGUZ.js.map → chunk-44TCHDXM.js.map} +0 -0
  248. /package/dist/{chunk-ME6PYW77.js.map → chunk-4C7SIRHL.js.map} +0 -0
  249. /package/dist/{chunk-HHOKZCIL.js.map → chunk-4I4UB4ZE.js.map} +0 -0
  250. /package/dist/{chunk-V6GKEKPX.js.map → chunk-4LIYWGQL.js.map} +0 -0
  251. /package/dist/{chunk-ZZMP35QD.js.map → chunk-4LXKCSWY.js.map} +0 -0
  252. /package/dist/{chunk-PYPILVCC.js.map → chunk-53DV3HBZ.js.map} +0 -0
  253. /package/dist/{chunk-XASW5FLO.js.map → chunk-6A2X5MPY.js.map} +0 -0
  254. /package/dist/{chunk-XSFBGHGG.js.map → chunk-6EEYWFD5.js.map} +0 -0
  255. /package/dist/{chunk-WWCQBHDC.js.map → chunk-6S44QXXI.js.map} +0 -0
  256. /package/dist/{chunk-XQ2FGDOQ.js.map → chunk-7NWOGEAW.js.map} +0 -0
  257. /package/dist/{chunk-CAA32DMC.js.map → chunk-7SLEBQIM.js.map} +0 -0
  258. /package/dist/{chunk-KBHXLOYJ.js.map → chunk-7ZSLXBOS.js.map} +0 -0
  259. /package/dist/{chunk-MPXDQWYI.js.map → chunk-BMD3HCSI.js.map} +0 -0
  260. /package/dist/{chunk-VXRGAUZK.js.map → chunk-D536MQC6.js.map} +0 -0
  261. /package/dist/{chunk-YT74ZEVP.js.map → chunk-GFX3BZRA.js.map} +0 -0
  262. /package/dist/{chunk-T4V6KQY2.js.map → chunk-IPWXGR65.js.map} +0 -0
  263. /package/dist/{chunk-DA2ANVMG.js.map → chunk-IWE7WFHI.js.map} +0 -0
  264. /package/dist/{chunk-4XZSZRCG.js.map → chunk-KLPCKKBZ.js.map} +0 -0
  265. /package/dist/{chunk-M55JELFT.js.map → chunk-MM6QFNHV.js.map} +0 -0
  266. /package/dist/{chunk-EPZNFXI2.js.map → chunk-NBXFSSCW.js.map} +0 -0
  267. /package/dist/{chunk-IL7PZKQN.js.map → chunk-OCFYRZQW.js.map} +0 -0
  268. /package/dist/{chunk-RPUSTYHL.js.map → chunk-PAJJXZ3Z.js.map} +0 -0
  269. /package/dist/{chunk-F6G3RECD.js.map → chunk-PB4RAOBC.js.map} +0 -0
  270. /package/dist/{chunk-T6USZ3EO.js.map → chunk-QHNHW76K.js.map} +0 -0
  271. /package/dist/{chunk-BAXURR55.js.map → chunk-QNDZNMUS.js.map} +0 -0
  272. /package/dist/{chunk-CTLAIMJP.js.map → chunk-QO6QHZTW.js.map} +0 -0
  273. /package/dist/{chunk-ISDCUB2Q.js.map → chunk-TCQFIUKQ.js.map} +0 -0
  274. /package/dist/{chunk-MSJKALUF.js.map → chunk-WTL5RI2J.js.map} +0 -0
  275. /package/dist/{chunk-A3VUXG5G.js.map → chunk-YRERFQ7Z.js.map} +0 -0
  276. /package/dist/{claim-YXL2HUFU.js.map → claim-KPJXAUQW.js.map} +0 -0
  277. /package/dist/{companies-U55HX5JN.js.map → companies-SD36QDTM.js.map} +0 -0
  278. /package/dist/{complete-VABZEJTL.js.map → complete-Y3M6OXPA.js.map} +0 -0
  279. /package/dist/{connect-6KS42I3C.js.map → connect-QNPBSMWK.js.map} +0 -0
  280. /package/dist/{conversation-UEIXBJ32.js.map → conversation-EEL3AY6B.js.map} +0 -0
  281. /package/dist/{conversions-V7ZPJ5T7.js.map → conversions-7A34JRO4.js.map} +0 -0
  282. /package/dist/{create-5NLAAJE4.js.map → create-4H273ZGZ.js.map} +0 -0
  283. /package/dist/{create-7L6SXSPH.js.map → create-6NJRTWYT.js.map} +0 -0
  284. /package/dist/{create-UMVQNYZF.js.map → create-GKC3DLQK.js.map} +0 -0
  285. /package/dist/{create-NZIFE6O7.js.map → create-JTTFEJZE.js.map} +0 -0
  286. /package/dist/{creatives-5V3ZGVO6.js.map → creatives-FNHTRAAH.js.map} +0 -0
  287. /package/dist/{creatives-4A4HJKD3.js.map → creatives-IFAOJHLW.js.map} +0 -0
  288. /package/dist/{credentials-PB3RFZOC.js.map → credentials-7L3K6QFN.js.map} +0 -0
  289. /package/dist/{critique-SZRPZU2P.js.map → critique-BZLL3N37.js.map} +0 -0
  290. /package/dist/{critique-FRBVRWVL.js.map → critique-GEBGDHWB.js.map} +0 -0
  291. /package/dist/{crm-SVQ22Q6N.js.map → crm-4IGMD5QF.js.map} +0 -0
  292. /package/dist/{crm-I6E2FACM.js.map → crm-J3HX3ZT6.js.map} +0 -0
  293. /package/dist/{customers-ZB6EYQEH.js.map → customers-TSJH2AUE.js.map} +0 -0
  294. /package/dist/{delete-I7MTK63S.js.map → delete-56HFQZCX.js.map} +0 -0
  295. /package/dist/{delete-7MNFMQ6X.js.map → delete-JZUAO6LZ.js.map} +0 -0
  296. /package/dist/{delete-HE2ACICZ.js.map → delete-XTCS5H6L.js.map} +0 -0
  297. /package/dist/{demographics-BLL7UL26.js.map → demographics-DKT2UN4S.js.map} +0 -0
  298. /package/dist/{discard-6GTJKV37.js.map → discard-2357VMCI.js.map} +0 -0
  299. /package/dist/{domain-FHJKL6ZC.js.map → domain-NM553OX2.js.map} +0 -0
  300. /package/dist/{draft-3GZ3RTYT.js.map → draft-FDJK7FLI.js.map} +0 -0
  301. /package/dist/{draft-4W5CP2R7.js.map → draft-NEXKT5HF.js.map} +0 -0
  302. /package/dist/{draft-REIQ6JCS.js.map → draft-UDDLC7YZ.js.map} +0 -0
  303. /package/dist/{facets-HCI6JP4Q.js.map → facets-6R4DOSZJ.js.map} +0 -0
  304. /package/dist/{feedback-CM63S3ME.js.map → feedback-WW6YQQJA.js.map} +0 -0
  305. /package/dist/{feedback-record-4EPVZ6BQ.js.map → feedback-record-KGYP2IUQ.js.map} +0 -0
  306. /package/dist/{fetch-2ZONBBKW.js.map → fetch-JGUKB6R7.js.map} +0 -0
  307. /package/dist/{fonts-T6BDCPSZ.js.map → fonts-JRQFPSS6.js.map} +0 -0
  308. /package/dist/{forecast-EKOVQJ4F.js.map → forecast-72GMGD64.js.map} +0 -0
  309. /package/dist/{funnel-ISMIHL3P.js.map → funnel-BJJQI72Z.js.map} +0 -0
  310. /package/dist/{get-X5B6VCSC.js.map → get-DC3WBYJD.js.map} +0 -0
  311. /package/dist/{get-LSIYBPPA.js.map → get-HTAU7NQU.js.map} +0 -0
  312. /package/dist/{google-S7AQ7KOJ.js.map → google-UC5RRXF3.js.map} +0 -0
  313. /package/dist/{google-ads-VYRPY3FQ.js.map → google-ads-OLFRVBP6.js.map} +0 -0
  314. /package/dist/{history-2F3IPVQU.js.map → history-IFJKE65W.js.map} +0 -0
  315. /package/dist/{hubspot-VFGBXW2X.js.map → hubspot-AT4E52RB.js.map} +0 -0
  316. /package/dist/{ideas-FYW4XSSC.js.map → ideas-BUJVMRQF.js.map} +0 -0
  317. /package/dist/{images-3EHPQRQD.js.map → images-MWG3CNPG.js.map} +0 -0
  318. /package/dist/{ingest-SREMQAWS.js.map → ingest-F7XSH47V.js.map} +0 -0
  319. /package/dist/{ingest-OFVANVIF.js.map → ingest-XIX4CZ2P.js.map} +0 -0
  320. /package/dist/{inspect-PWUKLRNZ.js.map → inspect-4O2SAWNX.js.map} +0 -0
  321. /package/dist/{keyword-metrics-SGOGGYHN.js.map → keyword-metrics-4UDAJAQJ.js.map} +0 -0
  322. /package/dist/{keywords-for-site-NAZSCVQR.js.map → keywords-for-site-HZCZK3EI.js.map} +0 -0
  323. /package/dist/{landing-33KYCXXA.js.map → landing-2L325EK3.js.map} +0 -0
  324. /package/dist/{leads-Y3PFOEGM.js.map → leads-TNZW3RTA.js.map} +0 -0
  325. /package/dist/{learn-WQ2QQ77L.js.map → learn-KNTDSDPX.js.map} +0 -0
  326. /package/dist/{line-item-writes-S4JLVWTU.js.map → line-item-writes-6BWPQSOY.js.map} +0 -0
  327. /package/dist/{line-items-DMXOAXFU.js.map → line-items-525PQOI3.js.map} +0 -0
  328. /package/dist/{link-4DNY5OSY.js.map → link-SJQFQLTY.js.map} +0 -0
  329. /package/dist/{linkedin-D22GQOKW.js.map → linkedin-OD36IRJS.js.map} +0 -0
  330. /package/dist/{list-YFET6MM3.js.map → list-DKA4BDKT.js.map} +0 -0
  331. /package/dist/{list-H7V6MUUV.js.map → list-QEPDSHHY.js.map} +0 -0
  332. /package/dist/{list-CQXOFLNY.js.map → list-X3Q5MSYK.js.map} +0 -0
  333. /package/dist/{log-SA4GFECI.js.map → log-S4U4JQ77.js.map} +0 -0
  334. /package/dist/{lookup-32HPES25.js.map → lookup-CMB2JELV.js.map} +0 -0
  335. /package/dist/{make-T2JR6IA5.js.map → make-ZKG6IKEL.js.map} +0 -0
  336. /package/dist/{mcp-OM6JLDQ6.js.map → mcp-ACBDK6UV.js.map} +0 -0
  337. /package/dist/{media-sources-JHTGT6FF.js.map → media-sources-LCIPLOTF.js.map} +0 -0
  338. /package/dist/{members-KDJBWRU5.js.map → members-3B43WCMP.js.map} +0 -0
  339. /package/dist/{normalize-JEXAJD4K.js.map → normalize-QFKNYVLR.js.map} +0 -0
  340. /package/dist/{performance-SI2ZRX5D.js.map → performance-ZOWSMCZF.js.map} +0 -0
  341. /package/dist/{plan-UEYS6CHL.js.map → plan-PZVXAECA.js.map} +0 -0
  342. /package/dist/{promoted-tweet-writes-ADZNQUNV.js.map → promoted-tweet-writes-UBK3GPXT.js.map} +0 -0
  343. /package/dist/{promoted-tweets-CNREPMPQ.js.map → promoted-tweets-MTZ7SSVK.js.map} +0 -0
  344. /package/dist/{publish-2MQNUKLF.js.map → publish-N7WR2HAO.js.map} +0 -0
  345. /package/dist/{questionnaire-4HSUNNNC.js.map → questionnaire-SGHGA4AZ.js.map} +0 -0
  346. /package/dist/{reddit-C73WD45T.js.map → reddit-LWV2OILV.js.map} +0 -0
  347. /package/dist/{refresh-FYOCED4T.js.map → refresh-GGMYGGUW.js.map} +0 -0
  348. /package/dist/{release-HJZCWKY6.js.map → release-B5B7TWMA.js.map} +0 -0
  349. /package/dist/{remove-WB6LFXWK.js.map → remove-EWZMAYUI.js.map} +0 -0
  350. /package/dist/{reopen-3VQ4NYZ5.js.map → reopen-BAE4WPC6.js.map} +0 -0
  351. /package/dist/{rerun-OV3TEE6P.js.map → rerun-KHHPDTLP.js.map} +0 -0
  352. /package/dist/{research-6WRKGPRC.js.map → research-GR27TIGA.js.map} +0 -0
  353. /package/dist/{research-7JKXF6BI.js.map → research-KMKYFBWF.js.map} +0 -0
  354. /package/dist/{reset-5BMABGUG.js.map → reset-6XVTFUBM.js.map} +0 -0
  355. /package/dist/{reset-F4BDAHUI.js.map → reset-BU6IJGOR.js.map} +0 -0
  356. /package/dist/{resolve-QRATNPWX.js.map → resolve-3EPJNPRF.js.map} +0 -0
  357. /package/dist/{retry-B4JRFPPF.js.map → retry-SWTQWKJM.js.map} +0 -0
  358. /package/dist/{retry-SQSIAX33.js.map → retry-U4XMO7PA.js.map} +0 -0
  359. /package/dist/{run-FU3UF4YV.js.map → run-EXER4CJ5.js.map} +0 -0
  360. /package/dist/{run-6NXPDWRP.js.map → run-YVWGH5C5.js.map} +0 -0
  361. /package/dist/{scaffold-ad-4VTZB4JH.js.map → scaffold-ad-HKGKQUR7.js.map} +0 -0
  362. /package/dist/{scaffold-static-ad-AB2RG3SH.js.map → scaffold-static-ad-Q3AU7QQ4.js.map} +0 -0
  363. /package/dist/{scaffold-video-RSGJWHHT.js.map → scaffold-video-M63JFOPT.js.map} +0 -0
  364. /package/dist/{schedule-WZF3BQSX.js.map → schedule-RILFJJ2P.js.map} +0 -0
  365. /package/dist/{scheduled-agents-J75TOVGN.js.map → scheduled-agents-CUSH7BI5.js.map} +0 -0
  366. /package/dist/{schema-O5PX4O4J.js.map → schema-JASSX36C.js.map} +0 -0
  367. /package/dist/{search-WYO77TIF.js.map → search-PP5PH3NM.js.map} +0 -0
  368. /package/dist/{select-G5W6WGRB.js.map → select-O4NQK5A4.js.map} +0 -0
  369. /package/dist/{sends-E5NSPLNS.js.map → sends-ZOT5WPVC.js.map} +0 -0
  370. /package/dist/{set-prompt-PJA7LUUJ.js.map → set-prompt-SHMGN6KR.js.map} +0 -0
  371. /package/dist/{setup-links-HFWMDF6E.js.map → setup-links-6THA2YOJ.js.map} +0 -0
  372. /package/dist/{site-YJJBAS7M.js.map → site-JRCQUJOE.js.map} +0 -0
  373. /package/dist/{sources-VRRDVWZC.js.map → sources-WRC3LAZQ.js.map} +0 -0
  374. /package/dist/{stale-I6UGM3MO.js.map → stale-ZBXHYQ6Z.js.map} +0 -0
  375. /package/dist/{status-TCOUMPJS.js.map → status-GG6UTBWM.js.map} +0 -0
  376. /package/dist/{sync-TWV4HUHZ.js.map → sync-6R64PGCZ.js.map} +0 -0
  377. /package/dist/{sync-definition-K6UMLDZF.js.map → sync-definition-YTTTJMV4.js.map} +0 -0
  378. /package/dist/{tags-AWO5FFGM.js.map → tags-4CEVGCMN.js.map} +0 -0
  379. /package/dist/{tags-NBUNSN5L.js.map → tags-7CGYLMST.js.map} +0 -0
  380. /package/dist/{tags-NBVQWFS2.js.map → tags-H6MESAFQ.js.map} +0 -0
  381. /package/dist/{tags-ZOK7CY4V.js.map → tags-PAEIW2UI.js.map} +0 -0
  382. /package/dist/{tags-DGLT344J.js.map → tags-PLB6UT4U.js.map} +0 -0
  383. /package/dist/{targeting-criteria-MG7RLBOG.js.map → targeting-criteria-G2BAM34G.js.map} +0 -0
  384. /package/dist/{targets-2B5AG4E4.js.map → targets-HE2LJCHE.js.map} +0 -0
  385. /package/dist/{templates-IXF2C2LD.js.map → templates-OSMHAXLI.js.map} +0 -0
  386. /package/dist/{testimonials-WNNC5PKQ.js.map → testimonials-7LPKA54Y.js.map} +0 -0
  387. /package/dist/{top-companies-B2IZYN4T.js.map → top-companies-QYBVUFSB.js.map} +0 -0
  388. /package/dist/{translate-MGMGQ27R.js.map → translate-67D6PBVJ.js.map} +0 -0
  389. /package/dist/{triggers-3DDV3OJ3.js.map → triggers-BEJHXIRZ.js.map} +0 -0
  390. /package/dist/{unlink-6M577LT6.js.map → unlink-ANZSGHCG.js.map} +0 -0
  391. /package/dist/{unstage-KNCIQR4E.js.map → unstage-HU7G23ZL.js.map} +0 -0
  392. /package/dist/{unstage-4EJNGWUT.js.map → unstage-JDC2HBEI.js.map} +0 -0
  393. /package/dist/{update-7SK6PHDL.js.map → update-2QJ2F43N.js.map} +0 -0
  394. /package/dist/{update-4NHLEM64.js.map → update-4DATQZGJ.js.map} +0 -0
  395. /package/dist/{update-U3GEUFNY.js.map → update-7226ZVPC.js.map} +0 -0
  396. /package/dist/{update-PMFYYMFX.js.map → update-K7EJ45LU.js.map} +0 -0
  397. /package/dist/{upload-ITKCCYOQ.js.map → upload-42A6MAS3.js.map} +0 -0
  398. /package/dist/{url-options-UFRD42MD.js.map → url-options-3XRKJSFA.js.map} +0 -0
  399. /package/dist/{url-params-GAEQM2MQ.js.map → url-params-EHUS5YG5.js.map} +0 -0
  400. /package/dist/{validate-4P2L4AXG.js.map → validate-KBPZX2H7.js.map} +0 -0
  401. /package/dist/{videos-YVGJ3WO5.js.map → videos-FILPMPRL.js.map} +0 -0
  402. /package/dist/{web-M7EYV5DF.js.map → web-KZFJIKDU.js.map} +0 -0
  403. /package/dist/{winning-ads-4SU5DBEY.js.map → winning-ads-NLHGB3GX.js.map} +0 -0
  404. /package/dist/{write-commands-7FT3MTOZ.js.map → write-commands-JCM6ZMUJ.js.map} +0 -0
  405. /package/dist/{x-ESEGQ3W2.js.map → x-GVNB2MV2.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/flows/map.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport type { HubspotFormsViewResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { repeatedFlagValues } from \"../../lib/repeatedFlags.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport {\n type BuiltMapping,\n buildFieldMapping,\n type DestinationField,\n describeSlots,\n type MapOptions,\n MappingError,\n namesComeFromAccount,\n otherSlots,\n shapeFor,\n} from \"./mapping.ts\";\nimport {\n collectConfigStatus,\n collectSideEffects,\n flowDataPath,\n readFlowTree,\n requestFlowInputCall,\n sideEffectNeedsInput,\n writeFlowTree,\n} from \"./shared.ts\";\n\nregisterSchema({\n command: \"flows.map\",\n description:\n \"Map form fields onto any named value a side effect sends: a CRM fieldMapping, a sheet columnMapping, a webhook payloadKeys, a pixel eventParams, or a platform matching block. Emits the mapping and splices it in with --write. Configure the destination through request_flow_input FIRST — the destination-side names come from the connected account, not from you.\",\n args: {\n slug: { type: \"positional\", description: \"Form slug (folder under flows/)\", required: true },\n map: {\n type: \"string\",\n description:\n \"<destField>[:<fieldType>]=<value>, repeatable. Omit both this and --from to be told what the side effect accepts instead. Sheet: A=name. HubSpot with --hubspot-form: firstname=nombre (the type is read off the form). Where a destination cannot be read, state the type on the LEFT — c0ffee:varchar=email — because `:` on the right belongs to the value grammar.\",\n required: false,\n },\n from: {\n type: \"string\",\n description:\n 'The whole mapping as a JSON file, or `-` for stdin: { \"sideEffect\": \"…\", \"map\": { \"<destField>\": \"<value>\", … } }. Past ~3 fields prefer this over repeated --map.',\n required: false,\n },\n \"side-effect\": { type: \"string\", description: \"Side-effect id, when the form has more than one\", required: false },\n \"hubspot-form\": {\n type: \"string\",\n description:\n \"HubSpot formGuid of the configured destination. Fills every mapping's fieldType and objectTypeId from the form itself, so you write no types at all. The guid is the `formGuid` in the `destination` request_flow_input returned.\",\n required: false,\n },\n into: {\n type: \"string\",\n description:\n \"Slot to map into when the type has more than one: meta/tiktok/pinterest take eventParams (default) or their matching record; googleAds takes enhancedConversions or value/currency/transactionId.\",\n required: false,\n },\n entity: {\n type: \"string\",\n description: \"Destination object (pipedrive: person|organization|lead, …)\",\n required: false,\n },\n custom: { type: \"boolean\", description: \"The destination fields are custom fields\", required: false },\n standard: { type: \"boolean\", description: \"The destination fields are standard fields\", required: false },\n \"object-type\": { type: \"string\", description: \"HubSpot objectTypeId (default 0-1, contact)\", required: false },\n \"prune-missing\": {\n type: \"boolean\",\n description:\n \"Drop the mappings whose destination field no longer exists on the account, and nothing else. The repair for a deleted HubSpot property: HubSpot refuses the WHOLE submission when it names a field it does not have, so one dead mapping loses every lead. Needs --hubspot-form so the live field list can be read. Runs on its own — no --map required. Prefer this to --replace, which drops everything this call does not name.\",\n required: false,\n },\n replace: {\n type: \"boolean\",\n description:\n \"Make the slot exactly what this call passes, dropping every mapping already in it. Without it, mappings MERGE by destination name — re-mapping a name overwrites it, a new name is appended, and the rest are left alone. To REMOVE a dead mapping, reach for --prune-missing instead: this one also deletes every mapping you did not re-state.\",\n required: false,\n },\n write: {\n type: \"boolean\",\n description: \"Splice the mapping into the form. Without it, prints and changes nothing\",\n required: false,\n },\n },\n});\n\n/**\n * Every `--map` on the command line.\n *\n * Read from `rawArgs`, not `args.map`: citty collapses a repeated flag to its\n * LAST value, so `--map A=name --map B=email` arrives as the single string\n * `\"B=email\"`. Taken from `args`, this command would map one field, report\n * success, and leave the other silently unmapped — which is the exact\n * failure mode it exists to prevent, one level up.\n */\nexport function mapSpecsFrom(rawArgs: readonly string[]): string[] {\n return repeatedFlagValues(rawArgs, \"map\");\n}\n\n/**\n * A whole mapping in one file, which is what a real one looks like.\n *\n * A CRM mapping is eight to fifteen fields. As repeated `--map` flags that is a\n * fifteen-flag command line whose shell quoting is its own hazard — an\n * improvement on hand-writing 230 lines of ProseMirror, but not much of one.\n * The JSON form is what the agent is actually holding in its head, and it is one\n * Write plus one command however many fields there are.\n *\n * {\n * \"sideEffect\": \"se-hubspotForm-1\",\n * \"hubspotForm\": \"8b1f…\",\n * \"map\": {\n * \"email\": \"email\",\n * \"firstname\": \"nombre\",\n * \"hs_lead_source\": \"tracking:utm_source\",\n * \"full_name\": \"nombre + \\\" \\\" + apellido\"\n * }\n * }\n *\n * `\"firstname\": { \"type\": \"…\", \"value\": \"…\" }` is still accepted for a\n * destination this command cannot read, but naming the destination once\n * (`hubspotForm` here, `--hubspot-form` on the command line) is strictly better:\n * the types then come from the account instead of from memory.\n */\ntype MapSpecFile = {\n sideEffect?: string;\n into?: string;\n entity?: string;\n custom?: boolean;\n objectType?: string;\n /**\n * Treat this file as the WHOLE mapping: anything in the slot it does not name\n * is dropped. Off by default so a file that lists three fields cannot delete\n * the five that were mapped before it.\n */\n replace?: boolean;\n /** Drop the mappings the destination no longer has. See `MapOptions.pruneMissing`. */\n pruneMissing?: boolean;\n /** HubSpot formGuid of the configured destination, so its field types can be read. */\n hubspotForm?: string;\n map?: Record<string, string | { type?: string; value?: string }>;\n};\n\n/** Flatten the JSON form into the same `<dest>[:<type>]=<value>` specs the flags produce. */\nexport function specsFromFile(parsed: MapSpecFile): string[] {\n return Object.entries(parsed.map ?? {}).map(([destField, entry]) => {\n if (typeof entry === \"string\") return `${destField}=${entry}`;\n const type = entry?.type ? `:${entry.type}` : \"\";\n return `${destField}${type}=${entry?.value ?? \"\"}`;\n });\n}\n\nfunction readSpecFile(path: string): MapSpecFile {\n let raw: string;\n try {\n raw = path === \"-\" ? readFileSync(0, \"utf-8\") : readFileSync(path, \"utf-8\");\n } catch (error) {\n refuse(\n `Could not read ${path === \"-\" ? \"the mapping from stdin\" : `\"${path}\"`}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n refuse(\n `${path === \"-\" ? \"stdin\" : `\"${path}\"`} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n 'Expected { \"map\": { \"<destField>\": \"<value>\", … } }',\n );\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n refuse(\"A mapping file must be a JSON object.\", 'Expected { \"map\": { \"<destField>\": \"<value>\", … } }');\n }\n const spec = parsed as MapSpecFile;\n if (!spec.map || typeof spec.map !== \"object\" || Object.keys(spec.map).length === 0) {\n refuse(\"A mapping file needs a non-empty `map` object.\", 'Expected { \"map\": { \"firstname\": \"nombre\", … } }');\n }\n return spec;\n}\n\n/** Refuse with the same envelope shape everywhere, so the agent parses one thing. */\nfunction refuse(message: string, fix?: string): never {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message, ...(fix ? { fix } : {}) } });\n process.exit(1);\n}\n\n/**\n * The destination's own field catalog, read off the connected account.\n *\n * This is the whole reason a HubSpot mapping no longer needs a type per field.\n * `fieldType` and `objectTypeId` are HubSpot's answers about its own properties,\n * not the agent's — the engine concatenates them into\n * `<objectTypeId>.<fieldType>.<fieldName>`, which is byte-for-byte the key the\n * dashboard's picker writes. Asking the agent to remember them is both more work\n * and less accurate than asking HubSpot, and a plausible-but-wrong one is the\n * silent kind: on a date property the engine skips the YYYY-MM-DD coercion and\n * HubSpot drops the value.\n *\n * One call for the whole mapping, and only when a destination was named. A\n * failure refuses rather than falling back to writing types nobody verified.\n */\nasync function hubspotFieldCatalog(\n formId: string,\n): Promise<{ fields: Map<string, DestinationField>; captchaEnabled: boolean }> {\n let response: HubspotFormsViewResponse;\n try {\n response = await apiPost<HubspotFormsViewResponse>(\"/api/hubspot/forms/view\", { formId });\n } catch (error) {\n refuse(\n `Could not read HubSpot form \"${formId}\": ${error instanceof Error ? error.message : String(error)}`,\n \"Check the guid against the `destination` request_flow_input returned, or `baker hubspot forms list`. Drop --hubspot-form and write `<field>:<fieldType>=<value>` per mapping only if HubSpot is unreachable.\",\n );\n }\n const fields = response.data.form?.fields ?? [];\n if (fields.length === 0) {\n refuse(\n `HubSpot form \"${formId}\" reports no fields, so nothing can be mapped against it.`,\n \"Confirm the guid names the form this side effect submits to: baker hubspot forms list\",\n );\n }\n return {\n fields: new Map(\n fields.map((field) => [\n field.name,\n { fieldType: field.fieldType, ...(field.objectTypeId ? { objectTypeId: field.objectTypeId } : {}) },\n ]),\n ),\n // Read while the form is already open, because this is the moment a\n // delivery is being wired: HubSpot refuses every submission sent to a form\n // with spam prevention on, so a mapping written against one is correct and\n // will still never arrive. Reported, not refused — the mapping is not the\n // mistake, and the client can switch it off without the work being redone.\n captchaEnabled: response.data.form?.captchaEnabled === true,\n };\n}\n\n/**\n * Answer the bare `baker flows map <slug> --side-effect <id>` probe.\n *\n * The left of a mapping is a different question per slot — a closed platform\n * set, a name the agent picks, or a name that only exists in the connected\n * account — and none of it was readable without guessing wrong first.\n */\nfunction describeDestination(chosen: Located): void {\n const type = String(chosen.sideEffect.type ?? \"\");\n const slots = describeSlots(type);\n if (slots.length === 0) {\n refuse(\n `A ${type} side effect has no mappable field.`,\n `Nothing on it addresses named values. \\`baker flows schema side-effect ${type}\\` shows what it does take.`,\n );\n }\n writeJson({\n ok: true,\n data: { sideEffectId: chosen.sideEffect.id, type, mappable: slots },\n hints: [\n `Nothing mapped — this is what a ${type} side effect accepts. Add --map <key>=<value> to build one.`,\n ...slots.map((slot) =>\n slot.keys\n ? `${slot.slot}: ${slot.keys.join(\", \")}`\n : `${slot.slot}: ${slot.keysFrom === \"account\" ? \"keys come from the connected account (request_flow_input returns them)\" : \"keys are yours to choose — whatever the receiving system expects\"}`,\n ),\n // Named separately from the key hint above: the key and its field type are\n // two different questions with two different answers, and the type is the\n // one an agent does not know it is being asked until a mapping is refused.\n ...slots.flatMap((slot) => (slot.fieldTypes ? [`${slot.slot} field types — ${slot.fieldTypes}`] : [])),\n 'Values (right of the `=`) are the same for every slot: a form field, tracking:<var>, global:<name>, code:<name>, a \"literal\", or those joined with +. A field may also be written as the file stores it, {{<stepId>.customForm.<field>}}. A value cannot run code (no .split(), .slice(), [0]).',\n ],\n });\n}\n\n/**\n * `shapeFor` as a refusal rather than a throw.\n *\n * `assertDestinationReady` is the one place `shapeFor` is reached BEFORE the\n * try/catch around `buildFieldMapping`, so an uncaught error here would escape\n * the `{ ok: false }` envelope every other path emits and reach the agent as a\n * stack trace.\n *\n * In practice the live case is an unrecognised `--into`, because only a type in\n * `FLOW_DELIVERY_SIDE_EFFECT_TYPES` gets this far (everything else returns at the\n * `sideEffectNeedsInput` check above) and every one of those has a slot. So\n * `--into eventParams` on an unconfigured `googleSpreadsheet` is enough to hit\n * it, and the message it would lose — the list of slots that type does have —\n * is exactly the one that answers it.\n */\nfunction shapeOrRefuse(type: string, into: string | undefined): ReturnType<typeof shapeFor> {\n try {\n return shapeFor(type, into);\n } catch (error) {\n if (error instanceof MappingError) refuse(error.message, error.fix);\n throw error;\n }\n}\n\n/**\n * Stop a mapping written against a destination nobody has picked yet.\n *\n * This is the failure the whole command exists to prevent, one level up: the\n * column letters and field keys live in an account only `request_flow_input`\n * can see, so before that call has run they can only be guesses — and a guessed\n * destination is structurally valid, passes every check here, ships, and sends\n * nothing forever. `verify` does catch it later (`flow-schema-unconfigured-oauth`),\n * but by then the mapping is written and the agent has moved on.\n *\n * Only for slots whose names come from the account. A webhook body or a pixel\n * parameter is the agent's to name, so an unset endpoint is a note, not a block.\n */\nfunction assertDestinationReady(\n slug: string,\n tree: Record<string, unknown>,\n chosen: Located,\n into: string | undefined,\n): void {\n if (!sideEffectNeedsInput(chosen.sideEffect)) return;\n\n const type = String(chosen.sideEffect.type ?? \"\");\n const status = collectConfigStatusFor(tree, slug, String(chosen.sideEffect.id ?? \"\"));\n const call = status ? requestFlowInputCall(slug, status) : `request_flow_input for the ${type} side effect`;\n\n if (!namesComeFromAccount(shapeOrRefuse(type, into))) return;\n\n refuse(\n `The ${type} destination is not configured yet, so its field names cannot be anything but a guess.`,\n `Configure it first, then map against the names that call returns: ${call}`,\n );\n}\n\n/** The config row for one side effect, so the refusal can carry a ready-to-issue call. */\nfunction collectConfigStatusFor(tree: Record<string, unknown>, _slug: string, sideEffectId: string) {\n const rows: Parameters<typeof requestFlowInputCall>[1][] = [];\n collectConfigStatus(tree, rows);\n return rows.find((row) => row.sideEffectId === sideEffectId);\n}\n\n/**\n * Name the slots this side effect has and this call did not use.\n *\n * A `meta` side effect has both `eventParams` and `advancedMatching`, and the\n * one an agent most often needs — advanced matching, which decides whether Meta\n * can attribute the conversion at all — is not the default. Saying so on every\n * response is cheaper than the agent finding out from a reference file it may\n * not open.\n */\nfunction slotHintFor(type: string, into: string | undefined): string[] {\n const others = otherSlots(type, shapeFor(type, into));\n if (others.length === 0) return [];\n return [`This side effect also takes ${others.join(\" and \")} — pass --into <slot> to map into one of those instead.`];\n}\n\n/**\n * What happened to the mappings this call did NOT name.\n *\n * Said out loud in both directions, because a slot whose size moved without\n * being mentioned is exactly how the loss stays silent: \"kept\" answers the\n * question a merge raises (\"did it drop the others?\"), and `--replace` has to\n * state its drop or it is the same bug with a flag on it.\n */\nfunction survivorHint(built: BuiltMapping, replacing: boolean): string[] {\n if (built.kept > 0) {\n return [`${built.kept} mapping${built.kept === 1 ? \"\" : \"s\"} already in ${built.key} kept — this merged by name.`];\n }\n if (!replacing) return [];\n return [`--replace: ${built.key} is now exactly these ${built.count}; anything else it held is gone.`];\n}\n\n/**\n * Every mapping `--prune-missing` removed, named one by one.\n *\n * A count would be the same mistake this whole repair exists to undo: the drift\n * Task that nobody could act on said \"an answer HubSpot no longer accepts\" and\n * named none of them, and six Forms were closed as false positives off that\n * sentence. A removal the agent cannot repeat back to the user is a removal\n * nobody can check.\n */\nfunction droppedHint(built: BuiltMapping): string[] {\n if (built.dropped.length === 0) return [];\n return [\n `--prune-missing dropped ${built.dropped.length} mapping${built.dropped.length === 1 ? \"\" : \"s\"} the destination no longer has: ${built.dropped.join(\", \")}. Every other mapping in ${built.key} was left alone.`,\n ];\n}\n\n/**\n * A note, not a block: these keys are the agent's to choose, but the endpoint\n * they are posted to is still the user's to supply, and nothing later in this\n * command will mention it.\n */\nfunction pendingEndpointHint(slug: string, tree: Record<string, unknown>, chosen: Located): string[] {\n if (!sideEffectNeedsInput(chosen.sideEffect)) return [];\n const status = collectConfigStatusFor(tree, slug, String(chosen.sideEffect.id ?? \"\"));\n if (!status) return [];\n return [`The mapping is written, but this destination still needs the user: ${requestFlowInputCall(slug, status)}`];\n}\n\ntype Located = { node: Record<string, unknown>; sideEffect: Record<string, unknown> };\n\n/** The side effect to map into: the named one, or the only one. Never a guess between several. */\nfunction pickSideEffect(slug: string, found: Located[], named: string | undefined): Located {\n if (found.length === 0) {\n refuse(\n `\"${slug}\" has no side effects — author the side effect first, then map into it.`,\n `baker flows add-side-effect ${slug} --node <nodeId> --type <type>`,\n );\n }\n const chosen = named\n ? found.find((entry) => entry.sideEffect.id === named)\n : found.length === 1\n ? found[0]\n : undefined;\n if (chosen) return chosen;\n\n const inventory = found.map((entry) => `${entry.sideEffect.id} (${entry.sideEffect.type})`).join(\", \");\n refuse(\n named\n ? `No side effect with id \"${named}\" in \"${slug}\".`\n : `\"${slug}\" has ${found.length} side effects — name one with --side-effect <id>.`,\n `Side effects in this form: ${inventory}`,\n );\n}\n\n/**\n * `--custom` and `--standard` answer the same question, and the answer decides\n * whether the write lands or is silently dropped. Taking the last flag would\n * pick one of two contradictory instructions at random.\n */\nfunction customFlag(custom: unknown, standard: unknown): boolean | undefined {\n if (custom === true && standard === true) {\n refuse(\"--custom and --standard contradict each other. Pass one.\");\n }\n if (custom === true) return true;\n if (standard === true) return false;\n return undefined;\n}\n\n/**\n * The destination-side options, from the flags and the mapping file together.\n *\n * A flag beats the file, so a saved mapping can be retargeted without editing\n * it. The destination catalog is read HERE, before anything is built, so every\n * mapping's field type is derived from the account rather than remembered —\n * and only when a destination was actually named: without one the build still\n * runs, and refuses per mapping if it turns out a type was needed.\n */\nasync function mapOptions(\n args: Record<string, unknown>,\n fromFile: MapSpecFile | undefined,\n into: string | undefined,\n): Promise<{ options: MapOptions; hints: string[] }> {\n const hubspotForm = args[\"hubspot-form\"] ? String(args[\"hubspot-form\"]) : fromFile?.hubspotForm;\n const catalog = hubspotForm ? await hubspotFieldCatalog(hubspotForm) : undefined;\n return {\n options: {\n into,\n entity: args.entity ? String(args.entity) : fromFile?.entity,\n isCustomField: customFlag(args.custom, args.standard) ?? fromFile?.custom,\n objectType: args[\"object-type\"] ? String(args[\"object-type\"]) : fromFile?.objectType,\n replace: args.replace === true || fromFile?.replace === true,\n pruneMissing: args[\"prune-missing\"] === true || fromFile?.pruneMissing === true,\n destinationFields: catalog?.fields,\n },\n hints: catalog?.captchaEnabled\n ? [\n \"WARNING: this HubSpot form has spam prevention (captcha) on. HubSpot refuses every submission sent to a form with it on, so nothing mapped here will arrive — the mapping is fine, the destination is not. Only the user can switch it off, on the form in HubSpot. Tell them that, and do not swap the destination yourself.\",\n ]\n : [],\n };\n}\n\nexport const mapCommand = defineCommand({\n meta: {\n name: \"map\",\n description:\n \"Map form fields onto any value a side effect sends — never hand-write a mapping. Start here: baker flows map contact --from map.json --write\",\n },\n args: {\n slug: { type: \"positional\", description: \"Form slug\", required: true },\n map: { type: \"string\", description: \"<destField>[:<fieldType>]=<value> (repeatable)\" },\n from: { type: \"string\", description: \"Read the whole mapping from a JSON file, or `-` for stdin\" },\n \"side-effect\": { type: \"string\", description: \"Side-effect id, when the form has more than one\" },\n \"hubspot-form\": {\n type: \"string\",\n description: \"HubSpot formGuid — reads every field's type off the form so you write none\",\n },\n into: {\n type: \"string\",\n description: \"Which slot to map into, for a type with more than one (e.g. meta: eventParams | advancedMatching)\",\n },\n entity: { type: \"string\", description: \"Destination object (person, contact, lead, …)\" },\n custom: { type: \"boolean\", description: \"Destination fields are custom fields\" },\n standard: { type: \"boolean\", description: \"Destination fields are standard fields\" },\n \"object-type\": { type: \"string\", description: \"HubSpot objectTypeId (default 0-1)\" },\n \"prune-missing\": {\n type: \"boolean\",\n description: \"Drop only the mappings the destination no longer has — the repair for a deleted HubSpot field\",\n },\n replace: {\n type: \"boolean\",\n description: \"Drop every mapping already in the slot. Default merges by destination name\",\n },\n write: { type: \"boolean\", description: \"Splice the mapping into the form\" },\n },\n run: async ({ args, rawArgs }) => {\n const slug = String(args.slug);\n const fromFile = args.from ? readSpecFile(String(args.from)) : undefined;\n const specs = fromFile ? specsFromFile(fromFile) : mapSpecsFrom(rawArgs);\n const into = args.into ? String(args.into) : fromFile?.into;\n const replacing = args.replace === true || fromFile?.replace === true;\n const pruning = args[\"prune-missing\"] === true || fromFile?.pruneMissing === true;\n\n const tree = readFlowTree(slug);\n // A flag beats the file, so a saved mapping can be retargeted without editing it.\n const chosen = pickSideEffect(\n slug,\n collectSideEffects(tree),\n args[\"side-effect\"] ? String(args[\"side-effect\"]) : fromFile?.sideEffect,\n );\n\n // No mappings given: answer \"what can I map here, and where do the key names\n // come from\" rather than printing usage. The command already holds the side\n // effect, so refusing threw the answer away and left the only discovery path\n // a wrong guess — name a key outside a closed set and read it off the refusal.\n // `--prune-missing` is a whole call on its own: the repair for a deleted\n // destination field is a removal, and requiring a `--map` alongside it would\n // mean inventing a mapping to make a deletion legal.\n if (specs.length === 0 && !pruning) {\n describeDestination(chosen);\n return;\n }\n\n assertDestinationReady(slug, tree, chosen, into);\n\n const { options, hints: destinationHints } = await mapOptions(args, fromFile, into);\n\n let built: ReturnType<typeof buildFieldMapping>;\n try {\n built = buildFieldMapping(tree, chosen.sideEffect, specs, options);\n } catch (error) {\n if (error instanceof MappingError) {\n refuse(error.message, error.fix);\n }\n throw error;\n }\n\n const slotHint = [\n ...destinationHints,\n ...droppedHint(built),\n ...survivorHint(built, replacing),\n ...slotHintFor(String(chosen.sideEffect.type ?? \"\"), into),\n ...pendingEndpointHint(slug, tree, chosen),\n ];\n\n if (args.write !== true) {\n emitDryRun(slug, chosen, built, slotHint);\n return;\n }\n\n Object.assign(chosen.sideEffect, built.patch);\n writeFlowTree(slug, tree);\n emitWritten(slug, chosen, built, slotHint);\n },\n});\n\n/**\n * The first line of the answer: what this call did, or would do.\n *\n * It has to survive a call that only REMOVES. `--prune-missing` on its own\n * writes nothing and drops something, and \"Wrote 0 fieldMapping mappings\"\n * describes the opposite of what happened — it reads as a no-op, which is the\n * one reading that sends an agent looking for a different command after the\n * repair has already landed. The drops are named by `droppedHint` two lines\n * further down, and that is not where anybody looks to find out whether a\n * command worked.\n *\n * Exported for its own test, because this sentence is the whole report.\n */\nexport function mapHeadline(built: BuiltMapping, phase: \"written\" | \"dry-run\", slug = \"\"): string {\n const wrote = `${built.count} ${built.key} mapping${built.count === 1 ? \"\" : \"s\"}`;\n const drops = `${built.dropped.length} dead mapping${built.dropped.length === 1 ? \"\" : \"s\"}`;\n\n if (phase === \"dry-run\") {\n if (built.count === 0 && built.dropped.length > 0) {\n return `Nothing written. Re-run with --write to drop ${drops} from ${slug}.`;\n }\n return `Nothing written. Re-run with --write to splice ${wrote} into ${slug}.`;\n }\n\n if (built.dropped.length === 0) return `Wrote ${wrote}.`;\n if (built.count === 0) return `Dropped ${drops} from ${built.key}; nothing else changed.`;\n return `Wrote ${wrote} and dropped ${drops}.`;\n}\n\n/** What the call WOULD do, plus the one sentence saying how to make it happen. */\nfunction emitDryRun(slug: string, chosen: Located, built: BuiltMapping, slotHint: string[]): void {\n writeJson({\n ok: true,\n data: {\n sideEffectId: chosen.sideEffect.id,\n type: chosen.sideEffect.type,\n key: built.key,\n patch: built.patch,\n },\n hints: [mapHeadline(built, \"dry-run\", slug), ...slotHint],\n });\n}\n\nfunction emitWritten(slug: string, chosen: Located, built: BuiltMapping, slotHint: string[]): void {\n writeJson({\n ok: true,\n data: {\n sideEffectId: chosen.sideEffect.id,\n type: chosen.sideEffect.type,\n key: built.key,\n written: built.count,\n kept: built.kept,\n dropped: built.dropped,\n path: flowDataPath(slug),\n },\n hints: [\n mapHeadline(built, \"written\"),\n `A mapping is only real once the destination is set — check with: baker flows show ${slug}`,\n ...slotHint,\n ],\n });\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/flows/options.ts"],"sourcesContent":["/**\n * `options`: what a Form's step or destination could be filled with, read\n * through the company's connected account — the same list the card shows the\n * user, so the agent can choose instead of asking.\n */\n\nimport { FLOW_AGENT_DESTINATION_KINDS, type FlowAgentDestinationKind, type FlowsOptionsResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi } from \"../actions/shared.ts\";\nimport { destinationRefusal } from \"./connect.ts\";\n\nconst HUBSPOT_KINDS: Record<string, string> = {\n hubspot: \"baker hubspot forms list\",\n hubspotForm: \"baker hubspot forms list\",\n hubspotMeeting: \"baker hubspot meetings list\",\n};\n\n/** The next call for each kind, spelled out — the target flag differs between a step and a destination. */\nexport function optionsHints(data: FlowsOptionsResponse[\"data\"]): string[] {\n const { kind, options } = data;\n if (kind === \"pipedrive\" || kind === \"goHighlevelContact\") {\n return [\n `Nothing to choose: the connected account is the destination. Wire it: baker flows connect <slug> --side-effect <id> (or --all --type ${kind}).`,\n ];\n }\n if (kind === \"googleSpreadsheet\") {\n return [\n \"These are the only spreadsheets Baker can reach: ones someone chose for a Form before, and ones Baker created. Pick one: baker flows connect <slug> --side-effect <id> --resource <id> [--tab <name>].\",\n 'None fits? Create one yourself: baker flows connect <slug> --side-effect <id> --new-sheet \"<Form name> leads\" --columns \"Name,Email,…\". Only when the user wants their own existing sheet: request_flow_input.',\n ];\n }\n const empty =\n options.length === 0\n ? [\"The account has none. Tell the user what to create there, or skip this step — do not invent one.\"]\n : [];\n return [\n ...empty,\n `Fill the step: baker flows connect <slug> --node <stepId> --resource <id> (or --all --type ${kind}). One clear match → use it; several plausible → ask the user which.`,\n ];\n}\n\nregisterSchema({\n command: \"flows.options\",\n description:\n \"What a Form step or destination can be filled with, read from the connected account: Calendly events, SavvyCal links, GoHighLevel calendars and forms, the Google spreadsheets Baker can reach. Pipedrive and GoHighLevel contact have nothing to choose — the account is the destination. Next: `baker flows connect <slug> --node|--side-effect <id> --resource <id>`. HubSpot has its own: `baker hubspot forms list` / `meetings list`.\",\n args: {\n kind: {\n type: \"positional\",\n description: `One of: ${FLOW_AGENT_DESTINATION_KINDS.join(\", \")}`,\n required: true,\n },\n account: {\n type: \"string\",\n description: \"Connection id, when more than one account of the platform is connected\",\n required: false,\n },\n },\n});\n\nexport const optionsCommand = defineCommand({\n meta: {\n name: \"options\",\n description:\n \"What a step or destination can be filled with, from the connected account. Start here: baker flows options calendly\",\n },\n args: {\n kind: { type: \"positional\", description: FLOW_AGENT_DESTINATION_KINDS.join(\" | \"), required: true },\n account: { type: \"string\", description: \"Connection id when several are connected\" },\n },\n run: async ({ args }) => {\n const kind = String(args.kind);\n const hubspot = HUBSPOT_KINDS[kind];\n if (hubspot) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: `HubSpot has its own list: ${hubspot}.` } });\n process.exit(1);\n }\n if (!(FLOW_AGENT_DESTINATION_KINDS as readonly string[]).includes(kind)) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: `\"${kind}\" is not filled from a platform account.`,\n fix: `Kinds: ${FLOW_AGENT_DESTINATION_KINDS.join(\", \")}. Typed credentials (webhooks, Zapier, Crmble) go through request_flow_input.`,\n },\n });\n process.exit(1);\n }\n try {\n const { data } = await apiPost<FlowsOptionsResponse>(\"/api/flows/destinations/options\", {\n kind,\n ...(args.account ? { account: String(args.account) } : {}),\n });\n writeJson({\n ok: true,\n data: { ...data, accounts: data.accounts.length > 1 ? data.accounts : undefined },\n hints: optionsHints(data),\n });\n } catch (err) {\n const refusal = err instanceof ApiError ? destinationRefusal(kind as FlowAgentDestinationKind, err) : null;\n if (err instanceof ApiError && refusal !== null) {\n writeJson({ ok: false, error: { code: refusal.code, message: err.message, fix: refusal.fix } });\n process.exit(1);\n }\n failApi(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,SAAS,qBAAqB;AAO9B,IAAM,gBAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,aAAa;AAAA,EACb,gBAAgB;AAClB;AAGO,SAAS,aAAa,MAA8C;AACzE,QAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,MAAI,SAAS,eAAe,SAAS,sBAAsB;AACzD,WAAO;AAAA,MACL,wIAAwI,IAAI;AAAA,IAC9I;AAAA,EACF;AACA,MAAI,SAAS,qBAAqB;AAChC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,QACJ,QAAQ,WAAW,IACf,CAAC,uGAAkG,IACnG,CAAC;AACP,SAAO;AAAA,IACL,GAAG;AAAA,IACH,8FAA8F,IAAI;AAAA,EACpG;AACF;AAEA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa,WAAW,6BAA6B,KAAK,IAAI,CAAC;AAAA,MAC/D,UAAU;AAAA,IACZ;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,cAAc,aAAa,6BAA6B,KAAK,KAAK,GAAG,UAAU,KAAK;AAAA,IAClG,SAAS,EAAE,MAAM,UAAU,aAAa,2CAA2C;AAAA,EACrF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,UAAM,UAAU,cAAc,IAAI;AAClC,QAAI,SAAS;AACX,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,6BAA6B,OAAO,IAAI,EAAE,CAAC;AAC9G,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,CAAE,6BAAmD,SAAS,IAAI,GAAG;AACvE,gBAAU;AAAA,QACR,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,IAAI,IAAI;AAAA,UACjB,KAAK,UAAU,6BAA6B,KAAK,IAAI,CAAC;AAAA,QACxD;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI;AACF,YAAM,EAAE,KAAK,IAAI,MAAM,QAA8B,mCAAmC;AAAA,QACtF;AAAA,QACA,GAAI,KAAK,UAAU,EAAE,SAAS,OAAO,KAAK,OAAO,EAAE,IAAI,CAAC;AAAA,MAC1D,CAAC;AACD,gBAAU;AAAA,QACR,IAAI;AAAA,QACJ,MAAM,EAAE,GAAG,MAAM,UAAU,KAAK,SAAS,SAAS,IAAI,KAAK,WAAW,OAAU;AAAA,QAChF,OAAO,aAAa,IAAI;AAAA,MAC1B,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,UAAU,eAAe,WAAW,mBAAmB,MAAkC,GAAG,IAAI;AACtG,UAAI,eAAe,YAAY,YAAY,MAAM;AAC/C,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,QAAQ,MAAM,SAAS,IAAI,SAAS,KAAK,QAAQ,IAAI,EAAE,CAAC;AAC9F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/analytics/sources.ts"],"sourcesContent":["import { REJECTION_MESSAGES, validateEventName } from \"@baker/api/event-ingest\";\nimport {\n HUBSPOT_DEAL_CONTACTS,\n HUBSPOT_OBJECTS,\n type HubspotDealContacts,\n type HubspotObject,\n hubspotDefaultMapping,\n hubspotTriggerInputSchema,\n mappingRowProblem,\n readsAssociatedContact,\n SOURCE_FIELD_NAMES,\n type SourcesRequestInput,\n type SourcesResponse,\n templateMentions,\n} from \"@baker/api/event-sources\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { writeJsonEnvelope } from \"../ads/output.ts\";\nimport { hubspotRefusal } from \"../hubspot/refusal.ts\";\nimport { ConversionArgsError, onlyOnce } from \"./conversionArgs.ts\";\n\n/**\n * `baker analytics sources` — an address for each of the client's own tools to\n * send events to, and what each one's payloads are read as.\n *\n * ## Why a URL and not a key\n *\n * `POST /v1/events` needs the sender to write code to our contract. A CRM's\n * webhook, an automation platform, a billing system cannot be told what to\n * send — they post what they post, to a URL, and set nothing else. A source\n * is that URL: the token in it is the whole credential, the first send\n * teaches Baker the shape, and a person confirms once which path is the\n * email, which the amount. From then on every arrival is an ordinary event.\n *\n * ## `--field` and `--value` repeat, and citty keeps only the last\n *\n * citty hands the LAST value of a repeated flag over as a plain string, so\n * `--field email=a --field value=b` would map `value` and silently drop\n * `email`, and `--value lead --value customer` would watch `customer` alone.\n * Both are read off `process.argv` instead, the way `conversions` reads its\n * repeats.\n */\n\nconst args = {\n server: {\n type: \"boolean\",\n description:\n \"The client's own server door: one address for their developers, made once and the same for ever after, counting at once in Baker's own format (`baker analytics sending-events` has the contract). Prints it; nothing else to set\",\n required: false,\n },\n create: {\n type: \"boolean\",\n description:\n \"Make an address for a tool that cannot be told what to send (a CRM webhook, an automation step). Needs --name. Its first send is kept as a sample and counted as nothing until --map\",\n required: false,\n },\n \"create-hubspot\": {\n type: \"boolean\",\n description:\n \"Make a HubSpot event: HubSpot keeps each change to --property for Baker (Baker's app subscribes the account to that property with the condition as HubSpot's own filter, and nothing else), and every contact whose new value satisfies --operator --value is an event, counted within a minute. Needs --property (names, kinds and operators from `baker hubspot contacts properties`); --operator defaults to `is`; --value repeats for a list (`is` on a dropdown) or a between; --name is optional and defaults to the trigger's words; --field rows (names from `baker hubspot contacts fields`) replace the default rows they name. Counts from now on, never earlier contacts\",\n required: false,\n },\n \"set-trigger\": {\n type: \"boolean\",\n description:\n \"Change what a HubSpot event watches. Needs --source and the same --property --operator --value as --create-hubspot. The rows stay; it counts from now on under the new trigger\",\n required: false,\n },\n preview: {\n type: \"boolean\",\n description:\n \"Ask HubSpot what --property --operator --value would count today, and read one real contact — the one most recently there, or --contact — with the properties the --field rows mention (the defaults when none), to check every row against real data BEFORE --create-hubspot. Makes nothing\",\n required: false,\n },\n object: {\n type: \"string\",\n description:\n \"With --create-hubspot or --preview: what the trigger is on — `contact` (the default), `deal` or `lead`. A deal's and a lead's event is about the contact the record is associated with: its rows read the record's own properties bare ({{amount}}, {{dealstage}}, {{hs_pipeline_stage}}) and the contact's as {{contact.<name>}} (`baker hubspot deals fields` / `baker hubspot leads fields`). A deal's amount defaults to its own amount in its currency; a lead has none, so it counts the step rather than money. Use `lead` for qualification and disqualification — HubSpot records both as a lead stage, and nothing on the contact or the deal says a lead was disqualified\",\n required: false,\n },\n contacts: {\n type: \"string\",\n description:\n \"With --object deal or --object lead (on --create-hubspot or --set-trigger): whose event it is — `every` (the default: every contact on the record, each its own event; on a deal each worth the deal's amount) or `first` (the record's first contact only)\",\n required: false,\n },\n property: {\n type: \"string\",\n description:\n \"With --create-hubspot, --set-trigger or --preview: the property to watch, by HubSpot's internal name (lifecyclestage, hs_lead_status, a custom one on a contact; dealstage, amount, closedate on a deal; hs_pipeline_stage, hs_lead_label on a lead) — any property, whatever its kind\",\n required: false,\n },\n operator: {\n type: \"string\",\n description:\n \"With --property: how the property has to read. By the property's kind — select: is, isNot, isEmpty, isNotEmpty · text: is, isNot, contains, doesNotContain, startsWith, endsWith, isEmpty, isNotEmpty · number: equal, notEqual, lessThan, lessThanOrEqual, greaterThan, greaterThanOrEqual, isEmpty, isNotEmpty · date: is, isBefore, isAfter, isOnOrBefore, isOnOrAfter, isBetween, isEmpty, isNotEmpty · yes/no: is, isNot. `is` when unsaid\",\n required: false,\n },\n value: {\n type: \"string\",\n description:\n \"With --property: the value, as HubSpot spells it — a dropdown's internal value (customer, QUALIFIED…), a number, a YYYY-MM-DD, true/false. Repeat it for a list (--value lead --value customer) or the two ends of isBetween; none for isEmpty / isNotEmpty\",\n required: false,\n },\n conditions: {\n type: \"string\",\n description:\n 'With --create-hubspot, --set-trigger or --preview, instead of --property/--operator/--value: several conditions combined the way a Form\\'s filter combines them, as JSON — `{\"logic\":\"And\",\"conditions\":[{\"property\":\"lifecyclestage\",\"values\":[\"customer\"]},{\"logic\":\"Or\",\"conditions\":[{\"property\":\"country\",\"values\":[\"Spain\"]},{\"property\":\"amount\",\"operator\":\"greaterThan\",\"values\":[\"1000\"]}]}]}`. `logic` is And (every row) or Or (any row); a row is a condition or a group with its own logic, one level deep; at most 10 conditions. The event fires when a change to any named property makes the whole combination hold',\n required: false,\n },\n contact: {\n type: \"string\",\n description:\n \"With --preview: the record to draw the sample from — a HubSpot id, or text to search (an email or a name for a contact, a deal's or a lead's name). The one most recently satisfying the trigger when unsaid\",\n required: false,\n },\n \"amount-property\": {\n type: \"string\",\n description:\n \"With --create-hubspot or --set-amount: a NUMBER property of the watched object to read as the event's amount (a deal value synced onto the contact; a deal's own `amount` is read by default on a deal). Needs --currency beside it\",\n required: false,\n },\n currency: {\n type: \"string\",\n description: \"With --amount-property: the three-letter currency the property is in, like EUR or USD\",\n required: false,\n },\n \"set-amount\": {\n type: \"boolean\",\n description:\n \"Change where a HubSpot-read source takes its amount from. Needs --source; with --amount-property and --currency it reads them, with neither it stops reading an amount\",\n required: false,\n },\n backfill: {\n type: \"boolean\",\n description:\n \"Count a HubSpot event's history: every moment its trigger came to hold since --since, at the instant HubSpot says it did. Needs --source and --since. Nothing is invented — a record that merely satisfies the trigger today is not an event today, and only moments HubSpot has a timestamp for are counted. Dry without --write. Reach for it when an event was made after the deals it should have counted, or after fixing one that was refusing everything it received\",\n required: false,\n },\n since: {\n type: \"string\",\n description:\n \"With --backfill: the date to count this event's history from, `2026-09-19` or an ISO instant. At most 400 days back — the store keeps no more\",\n required: false,\n },\n before: {\n type: \"string\",\n description:\n \"With --backfill: carry on from where a capped run stopped, by passing back the `reachedBack` it returned. One run reads at most 500 records, most recently changed first, so a capped run has covered the newest and the rest are the ones nearest --since — narrowing --since cannot reach them, this can. Repeat until `capped` is false; nothing is counted twice. It bounds which records are read, never which of their moments count: those are still the whole of --since to now\",\n required: false,\n },\n write: {\n type: \"boolean\",\n description:\n \"With --backfill: actually count what it found. Without it nothing is counted and the answer says what would be. Events inside the last 72 hours are uploaded to this event's ad platforms within minutes of counting, which spends real budget\",\n required: false,\n },\n name: {\n type: \"string\",\n description:\n \"The tool the source is for — HubSpot, Zapier, Stripe. It is the event's name when the payload does not say one, and every event it sends carries it as `baker_source`\",\n required: false,\n },\n map: {\n type: \"boolean\",\n description:\n \"Set what each field is read from. For an address this starts counting; needs --source, and one --field per row. With no --field the guess is used, which is right for a tool already sending Baker's own format. For a HubSpot-read source it replaces the whole mapping (the row list is on the source as `mapping`; empty means HubSpot's standard properties), so repeat every row you want kept\",\n required: false,\n },\n source: { type: \"string\", description: \"The source id, from the list\", required: false },\n field: {\n type: \"string\",\n description: `<field>=<template>, repeatable. A template is text with {{path}} mentions, one thing per mention: --field email={{contact.email}} --field currency=EUR --field first_name=\"{{who.first}} {{who.last}}\". A bare path (--field email=contact.email) is read as its mention when the sample has that path, so the short spelling still works. Fields: ${SOURCE_FIELD_NAMES.join(\", \")}. An EXTRA PROPERTY of the event — a plan, a stage, anything Measure → Events should break it down by and a send may pass on to a platform — is --field properties.<name>=<template>, e.g. --field properties.plan={{plan_tier}}. Paths come from \\`paths\\` on the source's sample; for a HubSpot event they are contact property names (\\`baker hubspot contacts fields\\`) plus \\`id\\` for the contact id`,\n required: false,\n },\n pause: {\n type: \"boolean\",\n description: \"Stop counting a source's arrivals; they are answered and dropped. Needs --source\",\n required: false,\n },\n resume: { type: \"boolean\", description: \"Count a paused source's arrivals again. Needs --source\", required: false },\n remove: {\n type: \"boolean\",\n description: \"Delete a source; its address stops working at once. Needs --source\",\n required: false,\n },\n full: {\n type: \"boolean\",\n description:\n \"Also return each source's masked sample body. The paths and the guess are always returned; the body is only for reading what a path held\",\n required: false,\n },\n} as const;\n\nregisterSchema({\n command: \"analytics.sources\",\n description:\n \"Where events reach Baker from a server: the client's own server door, and HubSpot events Baker reads — what each one watches and reads, and how it is doing\",\n args,\n});\n\n/** The value a repeated flag carries at this position, in either spelling, or nothing. */\nfunction flagValueAt(argv: readonly string[], flag: string, index: number): string | undefined {\n const arg = argv[index] ?? \"\";\n if (arg === flag) return argv[index + 1];\n return arg.startsWith(`${flag}=`) ? arg.slice(flag.length + 1) : undefined;\n}\n\n/** Every value of a repeated flag on the command line, in order. */\nexport function parseRepeated(argv: readonly string[], flag: string): string[] {\n const values: string[] = [];\n for (let index = 0; index < argv.length; index += 1) {\n const value = flagValueAt(argv, flag, index);\n if (value !== undefined) values.push(value);\n }\n return values;\n}\n\n/** Every `--field k=v` on the command line, in order, refusing a malformed one. */\nexport function parseFieldArgs(argv: readonly string[]): Record<string, string> {\n const mapping: Record<string, string> = {};\n for (const pair of parseRepeated(argv, \"--field\")) {\n const eq = pair.indexOf(\"=\");\n const field = eq === -1 ? pair : pair.slice(0, eq);\n const path = eq === -1 ? \"\" : pair.slice(eq + 1).trim();\n const problem = mappingRowProblem(field);\n if (problem !== null) throw new ConversionArgsError(problem);\n if (path === \"\") throw new ConversionArgsError(`--field ${field} needs a path: --field ${field}=<dotted.path>.`);\n mapping[field] = path;\n }\n return mapping;\n}\n\n/** The amount pair, which travels together or not at all. */\nfunction amountArgs(raw: Record<string, unknown>, argv: readonly string[]) {\n const amountProperty = onlyOnce(raw[\"amount-property\"], \"--amount-property\", argv);\n const currency = onlyOnce(raw.currency, \"--currency\", argv);\n if ((amountProperty === undefined) !== (currency === undefined)) {\n throw new ConversionArgsError(\"--amount-property and --currency go together: name both or neither.\");\n }\n return {\n ...(amountProperty === undefined ? {} : { amountProperty }),\n ...(currency === undefined ? {} : { currency }),\n };\n}\n\nconst NO_VALUE_OPERATORS = new Set([\"isEmpty\", \"isNotEmpty\"]);\n\n/**\n * The trigger every HubSpot verb needs: the property, how it has to read,\n * and the values — repeated on the command line, read off argv. Refused with\n * where the names come from; what the property's kind allows is checked\n * against the account by the backend.\n */\nfunction triggerArgs(raw: Record<string, unknown>, argv: readonly string[], verb: string): TriggerInput {\n const conditions = onlyOnce(raw.conditions, \"--conditions\", argv);\n if (conditions !== undefined) return conditionsArg(conditions, raw, verb);\n const property = onlyOnce(raw.property, \"--property\", argv);\n const operator = onlyOnce(raw.operator, \"--operator\", argv) ?? \"is\";\n // The last --value is what citty kept; every one is what was typed.\n const values = argv.length === 0 && typeof raw.value === \"string\" ? [raw.value] : parseRepeated(argv, \"--value\");\n if (property === undefined) {\n throw new ConversionArgsError(\n `--${verb} needs --property <name> [--operator <op>] --value <value>…, from \\`baker hubspot contacts properties\\`.`,\n );\n }\n if (values.length === 0 && !NO_VALUE_OPERATORS.has(operator)) {\n throw new ConversionArgsError(\n `--${verb} needs --value <value> (repeat it for a list); only --operator isEmpty / isNotEmpty take none.`,\n );\n }\n return { property, operator, values };\n}\n\ntype TriggerInput = NonNullable<SourcesRequestInput[\"createHubspot\"]>[\"trigger\"];\n\n/** `--conditions <json>`: a combination, checked for shape here so a typo is refused before the call. */\nfunction conditionsArg(text: string, raw: Record<string, unknown>, verb: string): TriggerInput {\n if (raw.property !== undefined || raw.value !== undefined || raw.operator !== undefined) {\n throw new ConversionArgsError(`--${verb} takes --conditions or --property/--operator/--value, not both.`);\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n throw new ConversionArgsError(\n '--conditions is JSON: {\"logic\":\"And\",\"conditions\":[{\"property\":\"lifecyclestage\",\"values\":[\"customer\"]}]}.',\n );\n }\n const checked = hubspotTriggerInputSchema.safeParse(parsed);\n if (!checked.success) {\n throw new ConversionArgsError(`--conditions: ${checked.error.issues.map((issue) => issue.message).join(\"; \")}`);\n }\n return parsed as TriggerInput;\n}\n\n/** `--object contact|deal`, spelled the two ways the wire takes and nothing else. */\nfunction objectArg(raw: Record<string, unknown>, argv: readonly string[]): HubspotObject {\n const object = onlyOnce(raw.object, \"--object\", argv) ?? \"contact\";\n if (!(HUBSPOT_OBJECTS as readonly string[]).includes(object)) {\n throw new ConversionArgsError(`--object is one of ${HUBSPOT_OBJECTS.join(\", \")}, not \"${object}\".`);\n }\n return object as HubspotObject;\n}\n\n/** `--contacts first|every`, which only means something on a deal or a lead. */\nfunction contactsArg(raw: Record<string, unknown>, argv: readonly string[]): HubspotDealContacts | undefined {\n const contacts = onlyOnce(raw.contacts, \"--contacts\", argv);\n if (contacts === undefined) return undefined;\n if (!(HUBSPOT_DEAL_CONTACTS as readonly string[]).includes(contacts)) {\n throw new ConversionArgsError(`--contacts is one of ${HUBSPOT_DEAL_CONTACTS.join(\", \")}, not \"${contacts}\".`);\n }\n return contacts as HubspotDealContacts;\n}\n\nfunction createHubspotArgs(\n raw: Record<string, unknown>,\n argv: readonly string[],\n name: string | undefined,\n): NonNullable<SourcesRequestInput[\"createHubspot\"]> {\n const mapping = parseFieldArgs(argv);\n const object = objectArg(raw, argv);\n const contacts = contactsArg(raw, argv);\n if (contacts !== undefined && !readsAssociatedContact(object)) {\n throw new ConversionArgsError(\n \"--contacts says whose event a deal's or a lead's is; it needs --object deal or --object lead.\",\n );\n }\n return {\n // A contact is the wire's default, so it is left unsaid — the way the schema reads it back.\n ...(object === \"contact\" ? {} : { object }),\n trigger: triggerArgs(raw, argv, \"create-hubspot\"),\n ...(contacts === undefined ? {} : { contacts }),\n ...(name === undefined ? {} : { name }),\n ...(Object.keys(mapping).length === 0 ? {} : { mapping }),\n ...amountArgs(raw, argv),\n };\n}\n\n/** What to read off the sample contact: whatever the rows mention, or the default rows' properties. */\nfunction previewArgs(\n raw: Record<string, unknown>,\n argv: readonly string[],\n): NonNullable<SourcesRequestInput[\"preview\"]> {\n const rows = parseFieldArgs(argv);\n const object = objectArg(raw, argv);\n const templates = Object.values(Object.keys(rows).length === 0 ? hubspotDefaultMapping(\"\", object) : rows);\n const properties = [...new Set(templates.flatMap((template) => templateMentions(template ?? \"\")))];\n const contact = onlyOnce(raw.contact, \"--contact\", argv);\n return {\n ...(object === \"contact\" ? {} : { object }),\n trigger: triggerArgs(raw, argv, \"preview\"),\n properties,\n ...(contact === undefined ? {} : { contact }),\n };\n}\n\nconst VERBS = [\n \"server\",\n \"create\",\n \"create-hubspot\",\n \"set-trigger\",\n \"preview\",\n \"backfill\",\n \"set-amount\",\n \"map\",\n \"pause\",\n \"resume\",\n \"remove\",\n] as const;\n\n/**\n * The name, refused here when the ingest door could never accept it.\n *\n * A source's name is the `event_name` of every event it raises, so this is\n * not a label being tidied: a name outside the rule makes a source that\n * counts **nothing**, for ever, while `baker analytics sources` goes on\n * listing it as counting and the only trace is one red line per event on the\n * feed. The contract refuses it too (`sourceNameSchema`), but that comes back\n * as a wire-validation error; the agent is better served by the sentence.\n */\nfunction checkedName(raw: Record<string, unknown>, argv: readonly string[]): string | undefined {\n const name = onlyOnce(raw.name, \"--name\", argv);\n if (name === undefined || validateEventName(name) === null) return name;\n throw new ConversionArgsError(\n `\"${name}\" cannot be an event name, and the name is what every event this source raises will carry. ${REJECTION_MESSAGES.invalid_name}`,\n );\n}\n\n/** What a backfill reads back to, and whether it counts what it finds. */\nfunction backfillArgs(\n raw: Record<string, unknown>,\n argv: readonly string[],\n sourceId: string,\n): NonNullable<SourcesRequestInput[\"backfill\"]> {\n const since = onlyOnce(raw.since, \"--since\", argv);\n if (since === undefined) {\n throw new ConversionArgsError(\n \"--backfill needs --since <date>, e.g. --since 2026-09-19. Nothing before it is read.\",\n );\n }\n const before = onlyOnce(raw.before, \"--before\", argv);\n return {\n sourceId,\n since,\n ...(before === undefined ? {} : { before }),\n ...(raw.write === true ? { write: true } : {}),\n };\n}\n\nexport function sourcesRequest(raw: Record<string, unknown>, argv: readonly string[]): SourcesRequestInput {\n const name = checkedName(raw, argv);\n const source = onlyOnce(raw.source, \"--source\", argv);\n const verbs = VERBS.filter((verb) => raw[verb] === true);\n if (verbs.length > 1) throw new ConversionArgsError(`One of --${verbs.join(\", --\")} per call.`);\n const verb = verbs[0];\n if (verb === undefined) return {};\n if (verb === \"server\") return { server: {} };\n if (verb === \"create\") {\n if (name === undefined) throw new ConversionArgsError(\"--create needs --name <tool>.\");\n return { create: { name } };\n }\n if (verb === \"create-hubspot\") return { createHubspot: createHubspotArgs(raw, argv, name) };\n if (verb === \"preview\") return { preview: previewArgs(raw, argv) };\n if (source === undefined) throw new ConversionArgsError(`--${verb} needs --source <id>, from the list.`);\n if (verb === \"backfill\") return { backfill: backfillArgs(raw, argv, source) };\n if (verb === \"set-trigger\") {\n const contacts = contactsArg(raw, argv);\n return {\n setTrigger: {\n sourceId: source,\n trigger: triggerArgs(raw, argv, verb),\n ...(contacts === undefined ? {} : { contacts }),\n },\n };\n }\n if (verb === \"set-amount\") return { setAmount: { sourceId: source, ...amountArgs(raw, argv) } };\n if (verb === \"map\") return { map: { sourceId: source, mapping: parseFieldArgs(argv) } };\n return { [verb]: { sourceId: source } };\n}\n\nfunction handleError(err: unknown): never {\n if (err instanceof ApiError) {\n // A HubSpot event needs HubSpot connected, and allowed to read what it watches.\n const refusal = hubspotRefusal(err.code, err.message);\n writeJsonEnvelope({\n ok: false,\n error:\n refusal === null\n ? { code: err.code, message: err.message }\n : { code: refusal.code, message: err.message, fix: refusal.fix },\n });\n process.exit(1);\n }\n writeJsonEnvelope({\n ok: false,\n error: { code: \"NETWORK_ERROR\", message: err instanceof Error ? err.message : \"Unexpected error\" },\n });\n process.exit(1);\n}\n\nexport const sourcesCommand = defineCommand({\n meta: {\n name: \"sources\",\n description:\n 'Where events reach Baker from a server, and what each one reads. Two doors. **The client\\'s own server**: `--server` prints one address for their developers — made once, the same for ever, counting at once, Baker\\'s own `POST /v1/events` format (`baker analytics sending-events` has the contract, `X-Baker-Mode: test` rehearses). **HubSpot events**: HubSpot keeps each change to a watched property in a journal Baker reads every half minute — Baker\\'s app subscribes the account to that one property with the condition as HubSpot\\'s own filter, so an account with a million contacts costs nothing to watch — on every plan, nothing to set up in HubSpot. The trigger is *when a contact\\'s* property satisfies a condition — the same conditions a Form\\'s filters take: `--property lifecyclestage --value customer` (a dropdown; `--value lead --value customer` for either), `--property deal_value --operator greaterThan --value 1000`, `--property email --operator endsWith --value @acme.com`, `--property closed_at --operator isAfter --value 2026-01-01`, `--property phone --operator isEmpty`. Several conditions combine the way a Form\\'s filter does — `--conditions \\'{\"logic\":\"And\",\"conditions\":[{\"property\":\"lifecyclestage\",\"values\":[\"customer\"]},{\"property\":\"country\",\"values\":[\"Spain\"]}]}\\'` (AND / OR, groups one level deep, 10 conditions at most) in place of --property/--operator/--value, on --create-hubspot, --set-trigger and --preview; the event fires when a change to any named property makes the whole combination hold. `baker hubspot contacts properties` lists every property with its kind, the operators that kind takes and a dropdown\\'s values; `baker hubspot contacts fields` every property a row can read. `--preview --property … [--operator …] --value … [--field …] [--contact <id or email>]` says how many contacts satisfy it today (NOT counted — only contacts that come to satisfy it from now on are) and reads one real contact so every row can be checked against real data; then `--create-hubspot --property … --value … --name \"Deal won\" --field email={{work_email}} --field value={{deal_value}} --field currency=EUR` makes the event, rows over the defaults (email, phone, the contact id, name, address, hs_google_click_id, hs_facebook_click_id). `--set-trigger --source <id> --property … --operator … --value …` changes what an event watches later (rows kept, counting from now on). Every row is a template — text with {{property}} mentions, one thing per mention; `--map --source <id> --field …` replaces the whole row set later, `--amount-property <number property> --currency EUR` is the short spelling for the amount rows. Each event is an ordinary event named after the source, carrying `baker_source`, listed by `feed --source <name>`, counted with `conversions` under `page:<name>`, and sent to the ad platforms with `sends`. `--pause`, `--resume`, `--remove` by --source. `--create --name <tool>` still makes an address for a tool that cannot be told what to send; its first send is a masked sample counted as nothing until `--map` confirms the rows.',\n },\n args,\n run: async ({ args: raw }) => {\n try {\n const request = sourcesRequest(raw as Record<string, unknown>, process.argv);\n const response = await apiPost<SourcesResponse>(\"/api/analytics/sources\", request);\n const full = raw.full === true;\n const sources = response.data.sources.map((source) => {\n const { sample, ...rest } = source;\n return full || sample === undefined ? source : { ...rest, sample: { receivedAt: sample.receivedAt } };\n });\n writeJsonEnvelope({\n ok: true,\n data: {\n sources,\n ...(response.data.preview === undefined ? {} : { preview: response.data.preview }),\n ...(response.data.staged === undefined ? {} : { staged: response.data.staged }),\n },\n ...(response.hints && response.hints.length > 0 ? { hints: response.hints } : {}),\n });\n } catch (err) {\n if (err instanceof ConversionArgsError) {\n handleError(new ApiError(\"VALIDATION_ERROR\", err.message));\n }\n handleError(err);\n }\n },\n});\n"],"mappings":"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","names":["verb"]}