@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
package/README.md CHANGED
@@ -3726,11 +3726,11 @@ Read and shape this workspace's Forms (flows). Operates on the local `_data.json
3726
3726
 
3727
3727
  For ChatGPT Ads conversions, add a `chatgptAds` side effect to the Form step, choose a supported event name, and use `baker flows map` to map `advancedMatching` and optional `eventParams` (`value` and `currency`).
3728
3728
 
3729
- **A Form has two halves, split by a trust boundary.** Its *structure* — steps, conditions, side effects, field mappings — is yours, and the write subcommands below edit exactly that. Its *confidential* half — connection secrets, OAuth accounts, third-party field definitions (HubSpot, Calendly, HighLevel, SavvyCal) — is set with `baker flows connect` whenever the agent knows the answer (an email's recipients and subject always; a connected platform's resource; a webhook with no token), and otherwise through the `request_flow_input` tool (`baker_ui` MCP server): the agent authors the surrounding structure and references it by `nodeId`/`sideEffectId`, and the user enters secrets, connects accounts, and picks resources in the dashboard. Those values are written (encrypted, where a secret) into the Form on the chat's branch and go live when the chat is published. Nothing any of these commands does touches a live system.
3729
+ **A Form has two halves, split by a trust boundary.** Its *structure* — steps, conditions, side effects, field mappings — is yours, and the write subcommands below edit exactly that. Its *confidential* half — connection secrets, OAuth accounts, third-party field definitions (HubSpot, Calendly, HighLevel, SavvyCal) — is configured through the `request_flow_input` tool (`baker_ui` MCP server): the agent authors the surrounding structure and references it by `nodeId`/`sideEffectId`, and the user enters secrets, connects accounts, and picks resources in the dashboard. Those values are written (encrypted, where a secret) into the Form on the chat's branch and go live when the chat is published. Nothing any of these commands does touches a live system.
3730
3730
 
3731
3731
  ```bash
3732
3732
  baker flows list # every Form + how many confidential fields still need setup
3733
- baker flows show contact # confidential fields, where each sealed destination sends (never a credential), and drift
3733
+ baker flows show contact # confidential fields + whether the destination changed under this Form
3734
3734
  baker flows show contact --full # include the full flow tree (secret values redacted)
3735
3735
 
3736
3736
  baker flows schema # both vocabularies + the customForm field types
@@ -3746,8 +3746,6 @@ baker flows connect contact --node book --resource <id> # fill a Calend
3746
3746
  baker flows connect contact --side-effect se-gsheet-1 --resource <spreadsheetId> # a sheet Baker can reach (--tab to pick the tab)
3747
3747
  baker flows connect contact --side-effect se-gsheet-1 --new-sheet "Contact leads" --columns "Name,Email" # create one and wire it
3748
3748
  baker flows connect contact --side-effect se-pipedrive-1 # Pipedrive / GoHighLevel contact: the account is the destination
3749
- baker flows connect contact --side-effect se-email-1 --email "ana@x.com, luis@x.com" --subject "New lead — Contact" # an email destination: the agent states it, never a card
3750
- baker flows connect contact --side-effect se-httpWebhook-1 --url https://hooks.example.com/lead # a webhook that needs no token
3751
3749
  baker flows connect contact --all --type googleSpreadsheet --same-as madrid:se-gsheet-1 # copy another Form's destination
3752
3750
  baker flows map contact --from map.json --write # a whole mapping at once — past ~3 fields, use this
3753
3751
  baker flows map contact --map A=nombre --write # one or two fields
@@ -3762,7 +3760,6 @@ Notes:
3762
3760
  - **`schema` takes the kind as an argument because `hubspot` is both** — a node type (embeds a form on the page) and a side-effect type (fires a behavioural event). They are different things with one name.
3763
3761
  - **`connect` wires a HubSpot form without asking the user.** When HubSpot is connected and the agent knows which form is meant, `baker flows connect <slug> --hubspot-form <formId> [--side-effect <id>]` attaches the account and the form to a `hubspotForm` side effect (`--all`: every one in the Form still missing it, never repointing one already wired) — the same thing the chat card writes, sealed by Baker so the config never passes through the agent. It refuses a form with spam prevention (captcha) on, and returns `destination.formGuid` for `map --hubspot-form`. The card (`request_flow_input`) stays for an unconnected account or an ambiguous choice.
3764
3762
  - **`options` + `connect` do the same for every other connected platform.** `baker flows options <kind>` lists what the connected account holds (Calendly events, SavvyCal links, GoHighLevel calendars and forms, the Google spreadsheets Baker can reach); `connect --node|--side-effect <id> --resource <id>` writes exactly what the card would. Pipedrive and a GoHighLevel contact take no resource. `--new-sheet` creates a spreadsheet in the connected Google account (Google only lets Baker reach sheets it created or the user chose), `--same-as <slug>:<id>` copies another Form's wired destination, `--all --type <kind>` fills every unwired one of a kind. Nothing connected answers `NOT_CONNECTED` with the `request_connection` fix; several accounts connected need `--account <id>`.
3765
- - **`--email` / `--url` replace a destination whole, so they leave alone what only the user can set.** `--all --email` passes over an email that replies to the visitor's own answer (and says so in its hints); naming one is refused. A webhook that sends a credential keeps its address until the user re-enters both through `request_flow_input`. Unreadable settings are also left alone by default. For one unreadable email, `--replace-unreadable --email <complete list> --subject <text>` replaces the old setup when the user intends replacement, without revealing it. Never use this to add to an unknown recipient list; it cannot override `--all`, a known visitor reply, or a webhook. `flows show` reads back only destinations sealed for this company.
3766
3763
  - **Configure the destination before you map.** `columnMapping`/`fieldMapping` describe a *specific* destination — sheet columns, a portal's field names — that only `connect` or `request_flow_input` can set, and both return it. A mapping written first is valid JSON that ships and drops every submission; `verify` blocks the half-wired result.
3767
3764
  - **`map` reads the record shape off the side effect's type.** One property name, four record shapes: a Sheet is addressed by column letter, HubSpot by property name, Pipedrive and GoHighLevel by field key, Crmble by field id. That is why there is no `--key`, and why `--entity` and `--custom`/`--standard` are required rather than defaulted.
3768
3765
  - **A mapping is usually eight to fifteen fields, so `--from` is the main door.** It takes `{ "map": { "<destField>": "<value>" } }` from a file or stdin; `--map` flags are for one or two. Both produce identical output.
@@ -4312,10 +4309,14 @@ A skill fills only what you did **not** pin — `--model`, `--aspect-ratio` and
4312
4309
 
4313
4310
  ## Creative Canvas
4314
4311
 
4312
+ Static-ad guidance prefers a ready company Avatar whenever an actor is needed, chosen for the buyer context. A real founder or testimonial author uses their verified likeness; if it cannot be found, use initials or no face. The shared creative instructions also call for deliberate complete-logo selection, one consistent primary CTA treatment, and deterministic rendering of recognizable interfaces. Screen guidance distinguishes laptops and notebook computers from paper notebooks beside a phone.
4313
+
4315
4314
  The creative canvas runs declarative JSON pipelines. You author a graph of nodes (text, image, video, audio, composition, control-flow), `baker canvas run` it, and every node's output drops to disk under `canvas/<run_id>/` so you can watch progress and consume the artifacts.
4316
4315
 
4317
4316
  Auth: same `BAKER_API_KEY` + `BAKER_API_URL` as the rest of the CLI.
4318
4317
 
4318
+ Static resizes, fixes and series continuations keep why the original ad works and the elements its concept depends on, alongside the previous image. Older specs carry their persuasion mechanism and its reason instead. Automatic spec repairs preserve the concept, mechanism, message, brand (including the CTA color) and native interface; they can correct the execution without changing the idea. Change those choices explicitly in `prompt.json` when the brief changes.
4319
+
4319
4320
  ### Quick start
4320
4321
 
4321
4322
  ```bash
@@ -6141,6 +6142,10 @@ baker canvas run ./static-ad.canvas.json
6141
6142
 
6142
6143
  Scaffolding runs (and bills) the two vision passes; **running** the result generates billed images. `baker canvas validate` does not check that the `[TODO]` paths exist — supply the real files before `run`.
6143
6144
 
6145
+ Size adaptations move and proportionally scale the existing composition first, keeping its background treatment, including intentional flat colour. Generation, adaptation, correction and series briefs preserve plausible anatomy, device proportions, scale, perspective and support, and reflow text while preserving letter shapes. Recognizable app controls remain native; marketing overlays stay visibly separate. Shared guidance records applicable intent and constraints briefly in `_definition.md`, then carries them into `prompt.json` (Markdown is not a render input). Direct briefs need no invented winner or fixed template; reference adaptations reason through the mechanism, transfer hypothesis and what must survive. `creatives make` returns this preparation hint before rendering. Choose the represented role and inspect existing Avatars before creating a new actor; a real founder or customer keeps their verified identity.
6146
+
6147
+ During continuations, the accepted image's screen content takes priority over geometry references unless explicitly changed. Laptop scenes receive guidance for a real laptop and consistent display, keyboard and hinge perspective.
6148
+
6144
6149
  #### `baker canvas rerun <slug> [flags]` (deprecated)
6145
6150
 
6146
6151
  Now `baker canvas run --slug <slug>`; `rerun` stays as a hidden alias for one release and prints a deprecation note. Every `canvas run` of a creative records a portable snapshot (the canvas JSON plus the local files it ingests: prompt blueprints, composition dirs, reference images) in durable storage, so `run --slug` can rebuild `src/creatives/<slug>/` in a workspace that never had it. A snapshot whose files are exactly the last one uploaded for the creative is reused without a request, and a file the store already holds is not uploaded again. Files the snapshot could not include (missing at run time, or oversized) are listed as warnings.
@@ -7022,9 +7027,3 @@ Pushing to `main` with changes in `packages/cli/` triggers the GitHub Actions wo
7022
7027
  npx convex env set BAKER_CLI_VERSION <version> # Override sandbox version
7023
7028
  npx convex env remove BAKER_CLI_VERSION # Clean up after testing
7024
7029
  ```
7025
-
7026
- ### Agreed tracking setup and external questionnaire diagnostics
7027
-
7028
- `baker analytics plan [--full]` reads the effective session plan. `--json @preparation.json` stages journeys, event purposes and readiness, optionally wiring conversion definitions, funnel steps and a managed Tag Manager installation. The generated base queues early events and runs before event tags; repeating preparation replaces its own draft operations. These changes apply only at Publish. Waiting events record the missing change and owner; prepared tags do not imply accepted events. The full request contract and example are in the scaffold's [analytics tool doc](../../apps/scaffold-template/__tooling__/docs/tools/baker/analytics.md#shared-journey-and-tracking-plan).
7029
-
7030
- `baker analytics questionnaire [--name questionnaire_step] [--days 7] [--inactivity 30]` reports distinct attempts reaching/completing/skipping questions and distinguishes pending, abandoned and incomplete steps. The external app must emit the documented attempt/version/sequence contract. The report refuses truncated histories above 600 events and excludes attempts without an observed start; no observations do not establish zero abandonment.
@@ -2,7 +2,7 @@ import {
2
2
  csvOrJson,
3
3
  handleLinkedinError,
4
4
  resolveAccountIdArg
5
- } from "./chunk-N4LAYIIN.js";
5
+ } from "./chunk-CSYSX4D2.js";
6
6
  import {
7
7
  writeAdsJson,
8
8
  writeAdsOutput
@@ -10,11 +10,10 @@ import {
10
10
  import {
11
11
  NO_CACHE_ARG
12
12
  } from "./chunk-X7ZODEXJ.js";
13
- import "./chunk-7EPXVICM.js";
13
+ import "./chunk-XF4JUKVF.js";
14
14
  import "./chunk-GXDLWBOY.js";
15
15
  import "./chunk-TEINLN64.js";
16
16
  import "./chunk-ZJWUBJYQ.js";
17
- import "./chunk-HR6IWNKE.js";
18
17
  import "./chunk-NE4F3FHN.js";
19
18
  import {
20
19
  apiGet
@@ -69,7 +68,7 @@ Examples:
69
68
  },
70
69
  subCommands: {
71
70
  detail: accountDetailCommand,
72
- "url-params": () => import("./write-commands-7SJ3BOW5.js").then((m) => m.accountUrlParamsCommand)
71
+ "url-params": () => import("./write-commands-5C7FUOVN.js").then((m) => m.accountUrlParamsCommand)
73
72
  },
74
73
  args: accountDetailCommand.args,
75
74
  default: "detail"
@@ -77,4 +76,4 @@ Examples:
77
76
  export {
78
77
  accountCommand
79
78
  };
80
- //# sourceMappingURL=account-XQXC7BR6.js.map
79
+ //# sourceMappingURL=account-AL2ZDSR7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/ads/linkedin/account.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError, resolveAccountIdArg } from \"./shared.ts\";\n\ninterface LinkedinAccountInfo {\n externalId: string;\n urn: string;\n name: string;\n status: string;\n type: string;\n currency?: string;\n test?: boolean;\n}\n\nconst accountDetailCommand = defineCommand({\n meta: {\n name: \"detail\",\n description: `Single LinkedIn ad account detail (currency, status, type).\n\nExamples:\n baker ads linkedin account --account-id 503001492\n baker ads linkedin account --account-urn urn:li:sponsoredAccount:503001492 --output md`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<LinkedinAccountInfo>(\"/api/ads/linkedin/account\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput([data] as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\n/**\n * Account-level settings, with the detail read as the default so\n * `baker ads linkedin account --account-id N` keeps working unchanged. A parent\n * must never declare `run` — citty falls through to it after the matched\n * subcommand, which would fire a live account read on every `url-params` stage.\n */\nexport const accountCommand = defineCommand({\n meta: {\n name: \"account\",\n description: `LinkedIn ad account: its detail, and the settings that apply across every ad set in it.\n\nExamples:\n baker ads linkedin account --account-id 503001492 — currency, status, type\n baker ads linkedin account url-params --param utm_source=linkedin — UTMs for every ad in the account`,\n },\n subCommands: {\n detail: accountDetailCommand,\n \"url-params\": () => import(\"./write-commands.ts\").then((m) => m.accountUrlParamsCommand),\n },\n args: accountDetailCommand.args,\n default: \"detail\",\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAgB9B,IAAM,uBAAuB,cAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAC/F,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,YAAY;AAAA,IACZ,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,SAAS,OAAO;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,UAAU,EAAG,QAAO,YAAY,IAAI;AAC7C,YAAM,OAAO,MAAM,OAA4B,6BAA6B,MAAM;AAClF,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,CAAC,IAAI,GAAgD,GAAG;AACvE;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;AAQM,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,aAAa;AAAA,IACX,QAAQ;AAAA,IACR,cAAc,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,uBAAuB;AAAA,EACzF;AAAA,EACA,MAAM,qBAAqB;AAAA,EAC3B,SAAS;AACX,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/commands/ads/linkedin/account.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError, resolveAccountIdArg } from \"./shared.ts\";\n\ninterface LinkedinAccountInfo {\n externalId: string;\n urn: string;\n name: string;\n status: string;\n type: string;\n currency?: string;\n test?: boolean;\n}\n\nconst accountDetailCommand = defineCommand({\n meta: {\n name: \"detail\",\n description: `Single LinkedIn ad account detail (currency, status, type).\n\nExamples:\n baker ads linkedin account --account-id 503001492\n baker ads linkedin account --account-urn urn:li:sponsoredAccount:503001492 --output md`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<LinkedinAccountInfo>(\"/api/ads/linkedin/account\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput([data] as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\n/**\n * Account-level settings, with the detail read as the default so\n * `baker ads linkedin account --account-id N` keeps working unchanged. A parent\n * must never declare `run` — citty falls through to it after the matched\n * subcommand, which would fire a live account read on every `url-params` stage.\n */\nexport const accountCommand = defineCommand({\n meta: {\n name: \"account\",\n description: `LinkedIn ad account: its detail, and the settings that apply across every ad set in it.\n\nExamples:\n baker ads linkedin account --account-id 503001492 — currency, status, type\n baker ads linkedin account url-params --param utm_source=linkedin — UTMs for every ad in the account`,\n },\n subCommands: {\n detail: accountDetailCommand,\n \"url-params\": () => import(\"./write-commands.ts\").then((m) => m.accountUrlParamsCommand),\n },\n args: accountDetailCommand.args,\n default: \"detail\",\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAgB9B,IAAM,uBAAuB,cAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAC/F,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,YAAY;AAAA,IACZ,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,SAAS,OAAO;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,UAAU,EAAG,QAAO,YAAY,IAAI;AAC7C,YAAM,OAAO,MAAM,OAA4B,6BAA6B,MAAM;AAClF,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,CAAC,IAAI,GAAgD,GAAG;AACvE;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;AAQM,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,aAAa;AAAA,IACX,QAAQ;AAAA,IACR,cAAc,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,uBAAuB;AAAA,EACzF;AAAA,EACA,MAAM,qBAAqB;AAAA,EAC3B,SAAS;AACX,CAAC;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  csvOrJson,
3
3
  handleLinkedinError
4
- } from "./chunk-N4LAYIIN.js";
4
+ } from "./chunk-CSYSX4D2.js";
5
5
  import {
6
6
  connectedResourceHints
7
7
  } from "./chunk-P4NSJS54.js";
@@ -16,11 +16,10 @@ import {
16
16
  import {
17
17
  NO_CACHE_ARG
18
18
  } from "./chunk-X7ZODEXJ.js";
19
- import "./chunk-7EPXVICM.js";
19
+ import "./chunk-XF4JUKVF.js";
20
20
  import "./chunk-GXDLWBOY.js";
21
21
  import "./chunk-TEINLN64.js";
22
22
  import "./chunk-ZJWUBJYQ.js";
23
- import "./chunk-HR6IWNKE.js";
24
23
  import "./chunk-NE4F3FHN.js";
25
24
  import {
26
25
  apiGet
@@ -75,4 +74,4 @@ Examples:
75
74
  export {
76
75
  accountsCommand
77
76
  };
78
- //# sourceMappingURL=accounts-722UY53A.js.map
77
+ //# sourceMappingURL=accounts-HAFCLSR5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/ads/linkedin/accounts.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { AVAILABLE_ARG, writeAvailableAccounts } from \"../../../available-accounts.ts\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport { connectedResourceHints } from \"../../../connected-resources.ts\";\nimport { writeAdsOutput, writeJsonEnvelope } from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError } from \"./shared.ts\";\n\ninterface LinkedinAccount {\n externalId: string;\n urn: string;\n name: string;\n status: string;\n type: string;\n currency?: string;\n test?: boolean;\n}\n\nfunction accountHints(accounts: LinkedinAccount[]): string[] {\n return connectedResourceHints({\n plural: \"LinkedIn ad accounts\",\n singular: \"LinkedIn ad account\",\n flag: \"--account-id\",\n resources: accounts.map((account) => ({ id: account.externalId, label: account.name })),\n });\n}\n\nexport const accountsCommand = defineCommand({\n meta: {\n name: \"accounts\",\n description: `List LinkedIn ad accounts in this company's connected scope.\n\nExamples:\n baker ads linkedin accounts\n baker ads linkedin accounts --output csv\n baker ads linkedin accounts --available # every account the login reaches, selected or not`,\n },\n args: {\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"Output format: json|csv|jsonl|md\", default: \"json\" },\n available: AVAILABLE_ARG,\n },\n run: async ({ args }) => {\n if (args.available) return writeAvailableAccounts(\"linkedin\", handleLinkedinError);\n try {\n const params: Record<string, string> = {};\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<LinkedinAccount[]>(\"/api/ads/linkedin/accounts\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeJsonEnvelope({ ok: true, data, hints: accountHints(data) });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAkB9B,SAAS,aAAa,UAAuC;AAC3D,SAAO,uBAAuB;AAAA,IAC5B,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,IACN,WAAW,SAAS,IAAI,CAAC,aAAa,EAAE,IAAI,QAAQ,YAAY,OAAO,QAAQ,KAAK,EAAE;AAAA,EACxF,CAAC;AACH;AAEO,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf;AAAA,EACA,MAAM;AAAA,IACJ,YAAY;AAAA,IACZ,QAAQ,EAAE,MAAM,UAAU,aAAa,oCAAoC,SAAS,OAAO;AAAA,IAC3F,WAAW;AAAA,EACb;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI,KAAK,UAAW,QAAO,uBAAuB,YAAY,mBAAmB;AACjF,QAAI;AACF,YAAM,SAAiC,CAAC;AACxC,UAAI,KAAK,UAAU,EAAG,QAAO,YAAY,IAAI;AAC7C,YAAM,OAAO,MAAM,OAA0B,8BAA8B,MAAM;AACjF,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAmD,GAAG;AACrE;AAAA,MACF;AACA,wBAAkB,EAAE,IAAI,MAAM,MAAM,OAAO,aAAa,IAAI,EAAE,CAAC;AAAA,IACjE,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/commands/ads/linkedin/accounts.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { AVAILABLE_ARG, writeAvailableAccounts } from \"../../../available-accounts.ts\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport { connectedResourceHints } from \"../../../connected-resources.ts\";\nimport { writeAdsOutput, writeJsonEnvelope } from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError } from \"./shared.ts\";\n\ninterface LinkedinAccount {\n externalId: string;\n urn: string;\n name: string;\n status: string;\n type: string;\n currency?: string;\n test?: boolean;\n}\n\nfunction accountHints(accounts: LinkedinAccount[]): string[] {\n return connectedResourceHints({\n plural: \"LinkedIn ad accounts\",\n singular: \"LinkedIn ad account\",\n flag: \"--account-id\",\n resources: accounts.map((account) => ({ id: account.externalId, label: account.name })),\n });\n}\n\nexport const accountsCommand = defineCommand({\n meta: {\n name: \"accounts\",\n description: `List LinkedIn ad accounts in this company's connected scope.\n\nExamples:\n baker ads linkedin accounts\n baker ads linkedin accounts --output csv\n baker ads linkedin accounts --available # every account the login reaches, selected or not`,\n },\n args: {\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"Output format: json|csv|jsonl|md\", default: \"json\" },\n available: AVAILABLE_ARG,\n },\n run: async ({ args }) => {\n if (args.available) return writeAvailableAccounts(\"linkedin\", handleLinkedinError);\n try {\n const params: Record<string, string> = {};\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<LinkedinAccount[]>(\"/api/ads/linkedin/accounts\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeJsonEnvelope({ ok: true, data, hints: accountHints(data) });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAkB9B,SAAS,aAAa,UAAuC;AAC3D,SAAO,uBAAuB;AAAA,IAC5B,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,IACN,WAAW,SAAS,IAAI,CAAC,aAAa,EAAE,IAAI,QAAQ,YAAY,OAAO,QAAQ,KAAK,EAAE;AAAA,EACxF,CAAC;AACH;AAEO,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf;AAAA,EACA,MAAM;AAAA,IACJ,YAAY;AAAA,IACZ,QAAQ,EAAE,MAAM,UAAU,aAAa,oCAAoC,SAAS,OAAO;AAAA,IAC3F,WAAW;AAAA,EACb;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI,KAAK,UAAW,QAAO,uBAAuB,YAAY,mBAAmB;AACjF,QAAI;AACF,YAAM,SAAiC,CAAC;AACxC,UAAI,KAAK,UAAU,EAAG,QAAO,YAAY,IAAI;AAC7C,YAAM,OAAO,MAAM,OAA0B,8BAA8B,MAAM;AACjF,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAmD,GAAG;AACrE;AAAA,MACF;AACA,wBAAkB,EAAE,IAAI,MAAM,MAAM,OAAO,aAAa,IAAI,EAAE,CAAC;AAAA,IACjE,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -9,7 +9,7 @@ import {
9
9
  accountsInfluencedRequestSchema,
10
10
  influenceParams,
11
11
  warmAccounts
12
- } from "./chunk-WKQG6TER.js";
12
+ } from "./chunk-ZEYEWPK6.js";
13
13
  import "./chunk-GRQ2AXDX.js";
14
14
  import {
15
15
  TABLE_OUTPUT_FORMATS,
@@ -19,12 +19,11 @@ import {
19
19
  } from "./chunk-VFIOJD5M.js";
20
20
  import {
21
21
  failApi
22
- } from "./chunk-SJYEY5MV.js";
23
- import "./chunk-7EPXVICM.js";
22
+ } from "./chunk-3HJLHTWP.js";
23
+ import "./chunk-XF4JUKVF.js";
24
24
  import "./chunk-GXDLWBOY.js";
25
25
  import "./chunk-TEINLN64.js";
26
26
  import "./chunk-ZJWUBJYQ.js";
27
- import "./chunk-HR6IWNKE.js";
28
27
  import "./chunk-NE4F3FHN.js";
29
28
  import {
30
29
  ApiError,
@@ -603,10 +602,10 @@ var accountsCommand = defineCommand({
603
602
  warm: warmCommand,
604
603
  company: companyCommand,
605
604
  campaigns: campaignsCommand,
606
- crm: () => import("./crm-AVCM5D4G.js").then((m) => m.crmCommand)
605
+ crm: () => import("./crm-R5IXIFIV.js").then((m) => m.crmCommand)
607
606
  }
608
607
  });
609
608
  export {
610
609
  accountsCommand
611
610
  };
612
- //# sourceMappingURL=accounts-E67BMK7T.js.map
611
+ //# sourceMappingURL=accounts-O5MFO3QQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/accounts/index.ts","../src/commands/accounts/report.ts"],"sourcesContent":["import {\n ACCOUNTS_ENGAGEMENT_MAX_LIMIT,\n type AccountsCampaignsResponse,\n type AccountsCompanyRequest,\n type AccountsCompanyResponse,\n type AccountsEngagementRequest,\n type AccountsEngagementResponse,\n type AccountsInfluencedResponse,\n accountsCampaignsRequestSchema,\n accountsCompanyRequestSchema,\n accountsEngagementRequestSchema,\n accountsInfluencedRequestSchema,\n INFLUENCE_MODEL_KINDS,\n type MoneyByCurrency,\n warmAccounts,\n} from \"@baker/api/accounts\";\nimport { defineCommand } from \"citty\";\nimport { z } from \"zod\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi } from \"../actions/shared.ts\";\nimport { outputFormatRefusal, TABLE_OUTPUT_FORMATS, writeAdsOutput } from \"../ads/output.ts\";\nimport {\n accountsRefusal,\n companyView,\n ENGAGEMENT_TABLE_FIELDS,\n engagementHints,\n engagementTableRows,\n influencedHints,\n influencedTableRows,\n invalidArgsMessage,\n warmAccountsCsv,\n warmHints,\n warmMinimum,\n withDealStatus,\n} from \"./report.ts\";\n\n/**\n * `baker accounts` — which companies the LinkedIn ads are warming, and which\n * CRM deals they influenced. Reads the nightly Account insights sync; nothing\n * here calls LinkedIn or the CRM, and nothing changes anywhere.\n */\n\nfunction optionalNumber(raw: unknown): number | undefined {\n return typeof raw === \"string\" && raw.trim() !== \"\" ? Number(raw) : undefined;\n}\n\nfunction optionalString(raw: unknown): string | undefined {\n return typeof raw === \"string\" && raw.trim() !== \"\" ? raw.trim() : undefined;\n}\n\nfunction failInvalidArgs(message: string): never {\n writeJson({ ok: false, error: { code: \"INVALID_ARGS\", message } });\n process.exit(1);\n}\n\n/** A request the schema refuses never reaches the store; say which flag, in the envelope. */\nfunction failInvalid(issues: ReadonlyArray<{ path: PropertyKey[]; message: string }>): never {\n failInvalidArgs(invalidArgsMessage(issues));\n}\n\n/** `--output` as asked, refused with the supported list instead of quietly printing JSON. */\nfunction outputFormat(args: Record<string, unknown>, supported: readonly string[]): string {\n const format = optionalString(args.output) ?? \"json\";\n const refusal = outputFormatRefusal(format, supported);\n if (refusal !== null) failInvalidArgs(refusal);\n return format;\n}\n\nconst OUTPUT_ARG = {\n type: \"string\",\n description: \"json|csv|jsonl|md (default json). csv/jsonl/md print the rows only; the summary and hints go to stderr\",\n required: false,\n default: \"json\",\n} as const;\n\nconst RULE_ARGS = {\n model: {\n type: \"string\",\n description:\n \"Read this report with another influence model, for this call only (the saved settings stay): engagement (engagements), awareness (impressions) or intent (clicks)\",\n required: false,\n },\n threshold: {\n type: \"string\",\n description:\n \"Read this report with another threshold on the model's metric, for this call only (a whole number, 1 or more)\",\n required: false,\n },\n} as const;\n\nfunction ruleInput(args: Record<string, unknown>): { model?: string; threshold?: number } {\n return { model: optionalString(args.model), threshold: optionalNumber(args.threshold) };\n}\n\nfunction moneyText(value: MoneyByCurrency): string {\n return Object.entries(value)\n .map(([currency, amount]) => `${Math.round(amount)} ${currency}`)\n .join(\" + \");\n}\n\n/** \"Not set up\" becomes the fix the agent relays; everything else is the ordinary error envelope. */\nfunction failAccounts(err: unknown): never {\n const refusal = err instanceof ApiError ? accountsRefusal(err.code, err.message) : 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\nconst WINDOW_ARGS = {\n \"last-months\": {\n type: \"string\",\n description: \"Calendar months to read, the current one included (1-24)\",\n required: false,\n },\n start: { type: \"string\", description: \"First day, YYYY-MM-DD (instead of --last-months)\", required: false },\n end: { type: \"string\", description: \"Last day, YYYY-MM-DD (default today; needs --start)\", required: false },\n} as const;\n\nfunction windowInput(args: Record<string, unknown>): { lastMonths?: number; start?: string; end?: string } {\n return {\n lastMonths: optionalNumber(args[\"last-months\"]),\n start: optionalString(args.start),\n end: optionalString(args.end),\n };\n}\n\n// --- influenced ---\n\nconst INFLUENCED_ARGS = {\n basis: {\n type: \"string\",\n description: \"pipeline (default): deals created in the period and not won. revenue: deals closed won in the period\",\n required: false,\n default: \"pipeline\",\n },\n ...WINDOW_ARGS,\n full: {\n type: \"boolean\",\n description: \"Every deal in the period, influenced or not, instead of the influenced ones\",\n required: false,\n default: false,\n },\n ...RULE_ARGS,\n output: OUTPUT_ARG,\n} as const;\n\nconst DEAL_TABLE_FIELDS = [\n \"dealId\",\n \"dealName\",\n \"companyName\",\n \"domain\",\n \"amount\",\n \"currency\",\n \"status\",\n \"referenceAt\",\n \"touchValue\",\n \"firstTouchMonth\",\n \"matchConfidence\",\n \"influenced\",\n \"crmCompanyId\",\n];\n\nfunction influencedSummaryLine(data: AccountsInfluencedResponse[\"data\"]): string {\n const { summary, rule } = data;\n const value = moneyText(summary.influencedValue) || \"no amount\";\n return `${summary.influencedDeals} of ${summary.deals} ${data.basis} deals influenced (${value}) — ${rule.threshold}+ ${rule.metric} in the ${rule.lookbackMonths} months up to each deal, ${data.window.start} to ${data.window.end}.`;\n}\n\nregisterSchema({\n command: \"accounts.influenced\",\n description:\n \"Start here for 'what pipeline / revenue did our LinkedIn ads influence'. A deal is influenced when its company reached the company's influence rule (default: 3+ LinkedIn ad engagements) in the 12 months up to and including the month the deal was created (pipeline) or closed won (revenue). A labelled rule, not credit: never call it 'attributed' or split it. Returns {summary: {deals, influencedDeals, influencedValue per currency, lowConfidenceDeals, spend, valuePerSpend}, deals, lowConfidence}. Amounts in different currencies are never added. Default the last 12 calendar months. --model/--threshold read it with another rule for this call only (\\\"what if we counted 5+ engagements\\\"); --output csv|md|jsonl prints the deals.\",\n args: INFLUENCED_ARGS,\n});\n\nconst influencedCommand = defineCommand({\n meta: {\n name: \"influenced\",\n description:\n \"Deals the LinkedIn ads influenced, with influenced pipeline or revenue. Example: baker accounts influenced --basis revenue --last-months 6\",\n },\n args: INFLUENCED_ARGS,\n run: async ({ args }) => {\n const format = outputFormat(args, TABLE_OUTPUT_FORMATS);\n const parsed = accountsInfluencedRequestSchema.safeParse({\n ...windowInput(args),\n ...ruleInput(args),\n basis: optionalString(args.basis),\n full: Boolean(args.full),\n });\n if (!parsed.success) failInvalid(parsed.error.issues);\n try {\n const response = await apiPost<AccountsInfluencedResponse>(\"/api/accounts/influenced\", parsed.data);\n const hints = influencedHints(response.data);\n if (format !== \"json\") {\n const rows = influencedTableRows(response.data, parsed.data.full);\n writeAdsOutput(rows, format, DEAL_TABLE_FIELDS, [influencedSummaryLine(response.data), ...hints]);\n return;\n }\n writeJson({ ...response, meta: { count: response.data.deals.length }, ...(hints.length > 0 ? { hints } : {}) });\n } catch (err) {\n failAccounts(err);\n }\n },\n});\n\n// --- engagement ---\n\nconst ENGAGEMENT_ARGS = {\n ...WINDOW_ARGS,\n \"campaign-id\": { type: \"string\", description: \"Only this campaign's companies (numeric id)\", required: false },\n limit: {\n type: \"string\",\n description: `Companies per page, 1-${ACCOUNTS_ENGAGEMENT_MAX_LIMIT} (default 500)`,\n required: false,\n },\n page: {\n type: \"string\",\n description:\n \"Which page to read, 1-based, most engaged first (default 1). pageInfo.hasMore says another page follows; pageInfo.total counts every company reached\",\n required: false,\n },\n output: OUTPUT_ARG,\n} as const;\n\nregisterSchema({\n command: \"accounts.engagement\",\n description:\n \"Every company the LinkedIn ads reached, most engaged first, with the period before for comparison, New/Rising flags, and where it stands in the CRM (matched company; dealStatus won > open > lost > none, lost meaning every deal it had was lost; lastLostAt). Default the last 3 calendar months. From the nightly sync, so it is fast and covers up to 24 months; for a live read of one ad account use `baker ads linkedin companies`. Paged: --limit companies per page, --page N; pageInfo {page, pageSize, total, hasMore}.\",\n args: ENGAGEMENT_ARGS,\n});\n\nfunction engagementInput(args: Record<string, unknown>, limit?: number): AccountsEngagementRequest {\n return {\n ...windowInput(args),\n campaignId: optionalString(args[\"campaign-id\"])?.replace(/^urn:li:sponsoredCampaign:/, \"\"),\n limit: limit ?? optionalNumber(args.limit),\n page: limit === undefined ? optionalNumber(args.page) : undefined,\n };\n}\n\nconst engagementCommand = defineCommand({\n meta: {\n name: \"engagement\",\n description:\n \"Companies the LinkedIn ads reached, with New/Rising flags and CRM status. Example: baker accounts engagement --last-months 3 --limit 50\",\n },\n args: ENGAGEMENT_ARGS,\n run: async ({ args }) => {\n const format = outputFormat(args, TABLE_OUTPUT_FORMATS);\n const parsed = accountsEngagementRequestSchema.safeParse(engagementInput(args));\n if (!parsed.success) failInvalid(parsed.error.issues);\n try {\n const response = await apiPost<AccountsEngagementResponse>(\"/api/accounts/engagement\", parsed.data);\n const hints = engagementHints(response.data, parsed.data);\n if (format !== \"json\") {\n writeAdsOutput(engagementTableRows(response.data.companies), format, ENGAGEMENT_TABLE_FIELDS, hints);\n return;\n }\n const companies = withDealStatus(response.data.companies);\n writeJson({\n ...response,\n data: { ...response.data, companies },\n meta: { count: companies.length, ...(response.data.pageInfo ? { total: response.data.pageInfo.total } : {}) },\n ...(hints.length > 0 ? { hints } : {}),\n });\n } catch (err) {\n failAccounts(err);\n }\n },\n});\n\n// --- warm ---\n\nconst warmRuleSchema = z.object({\n model: z.enum(INFLUENCE_MODEL_KINDS).optional(),\n threshold: z.number().int().min(1).optional(),\n min: z.number().int().min(0).optional(),\n});\n\nconst WARM_ARGS = {\n ...WINDOW_ARGS,\n \"campaign-id\": ENGAGEMENT_ARGS[\"campaign-id\"],\n min: {\n type: \"string\",\n description:\n \"Least a company must have done this period on the rule's metric to count as warm (default: the company's influence threshold, e.g. 3 engagements; 0 keeps every New/Rising company)\",\n required: false,\n },\n ...RULE_ARGS,\n output: {\n type: \"string\",\n description:\n \"json (default) or csv — csv prints companyName,domain,organizationUrn, the file `baker ads linkedin audiences create --type company-list --list-file` takes\",\n required: false,\n default: \"json\",\n },\n} as const;\n\nregisterSchema({\n command: \"accounts.warm\",\n description:\n \"Warm accounts: companies engaging with the LinkedIn ads more than in the period before (New: nothing before; Rising: engagements at least doubled) that reached the company's influence threshold this period (e.g. 3+ engagements; --min overrides, --min 0 drops it) and are not already somebody's deal: no open deal, never won (customers are left out), and no deal lost in the last 6 months (an older loss no longer counts). Default the current calendar month against the one before. `--output csv > warm.csv` writes a company list ready for `baker ads linkedin audiences create --type company-list --list-file warm.csv` (LinkedIn needs 300+ matched members to serve).\",\n args: WARM_ARGS,\n});\n\nconst warmCommand = defineCommand({\n meta: {\n name: \"warm\",\n description:\n \"Companies warming up that are not in pipeline, customers, or recently lost. Example: baker accounts warm --last-months 1 --output csv > warm.csv\",\n },\n args: WARM_ARGS,\n run: async ({ args }) => {\n const format = outputFormat(args, [\"json\", \"csv\"]);\n const rule = warmRuleSchema.safeParse({ ...ruleInput(args), min: optionalNumber(args.min) });\n if (!rule.success) failInvalid(rule.error.issues);\n const input = engagementInput(args, ACCOUNTS_ENGAGEMENT_MAX_LIMIT);\n const parsed = accountsEngagementRequestSchema.safeParse(\n input.start === undefined && input.lastMonths === undefined ? { ...input, lastMonths: 1 } : input,\n );\n if (!parsed.success) failInvalid(parsed.error.issues);\n try {\n const response = await apiPost<AccountsEngagementResponse>(\"/api/accounts/engagement\", parsed.data);\n const minimum = warmMinimum(response.data.rule, rule.data);\n const warm = warmAccounts(response.data.companies, new Date().toISOString().slice(0, 10), { minimum });\n const hints = warmHints(response.data, warm, minimum);\n if (format === \"csv\") {\n process.stdout.write(warmAccountsCsv(warm));\n for (const hint of hints) process.stderr.write(`${hint}\\n`);\n return;\n }\n writeJson({\n ok: true,\n data: {\n window: response.data.window,\n previousWindow: response.data.previousWindow,\n minimum: minimum ?? null,\n companies: withDealStatus(warm),\n },\n meta: { count: warm.length },\n ...(hints.length > 0 ? { hints } : {}),\n });\n } catch (err) {\n failAccounts(err);\n }\n },\n});\n\n// --- company ---\n\nconst COMPANY_ARGS = {\n company: {\n type: \"positional\",\n description: \"LinkedIn company id (1035), its urn:li:organization URN, or a website domain (acme.com)\",\n required: true,\n },\n} as const;\n\nregisterSchema({\n command: \"accounts.company\",\n description:\n \"One company's story: its month-by-month totals (`months`), the same numbers split by LinkedIn campaign (`byCampaign` — overlapping, never add it to the totals), the CRM company it matched and how surely, and that company's deals, each with `touchValue` and `influenced` under the company's rule. Use it to show why a deal counts as influenced.\",\n args: COMPANY_ARGS,\n});\n\n/** A bare number or an organization URN is a LinkedIn id; anything else is a domain. */\nfunction companyRequest(raw: string): AccountsCompanyRequest {\n const value = raw.trim();\n return /^(urn:li:organization:)?\\d+$/.test(value) ? { orgId: value } : { domain: value };\n}\n\nconst companyCommand = defineCommand({\n meta: {\n name: \"company\",\n description: \"One company's monthly LinkedIn ad activity and its deals. Example: baker accounts company acme.com\",\n },\n args: COMPANY_ARGS,\n run: async ({ args }) => {\n const parsed = accountsCompanyRequestSchema.safeParse(companyRequest(String(args.company ?? \"\")));\n if (!parsed.success) failInvalid(parsed.error.issues);\n try {\n const response = await apiPost<AccountsCompanyResponse>(\"/api/accounts/company\", parsed.data);\n const view = companyView(response.data);\n writeJson({ ok: true, data: view.data, ...(view.hints.length > 0 ? { hints: view.hints } : {}) });\n } catch (err) {\n failAccounts(err);\n }\n },\n});\n\n// --- campaigns ---\n\nconst CAMPAIGNS_ARGS = { basis: INFLUENCED_ARGS.basis, ...WINDOW_ARGS, ...RULE_ARGS, output: OUTPUT_ARG } as const;\n\nconst CAMPAIGN_TABLE_FIELDS = [\n \"campaignId\",\n \"campaignName\",\n \"companiesReached\",\n \"companiesEngaged\",\n \"influencedDeals\",\n \"influencedValue\",\n];\n\nregisterSchema({\n command: \"accounts.campaigns\",\n description:\n \"Per LinkedIn campaign: companies reached and engaged in the period, and the influenced deals it touched in their lookback — pipeline (default: deals created and not won) or, with --basis revenue, deals closed won. Overlapping by design — a deal counts for every campaign that touched it, so the rows never sum to the total; read them as a comparison, not a split. Default the last 12 calendar months. --model/--threshold read it with another rule for this call only.\",\n args: CAMPAIGNS_ARGS,\n});\n\nconst campaignsCommand = defineCommand({\n meta: {\n name: \"campaigns\",\n description:\n \"Companies reached and influenced pipeline or revenue per campaign. Example: baker accounts campaigns --basis revenue --last-months 6\",\n },\n args: CAMPAIGNS_ARGS,\n run: async ({ args }) => {\n const format = outputFormat(args, TABLE_OUTPUT_FORMATS);\n const input = { basis: optionalString(args.basis), ...windowInput(args), ...ruleInput(args) };\n const parsed = accountsCampaignsRequestSchema.safeParse(input);\n if (!parsed.success) failInvalid(parsed.error.issues);\n try {\n const response = await apiPost<AccountsCampaignsResponse>(\"/api/accounts/campaigns\", parsed.data);\n const hints = [\"Campaign rows overlap: a deal counts for every campaign that touched it. Never add them up.\"];\n if (format !== \"json\") {\n const rows = response.data.campaigns.map((row) => ({\n ...row,\n influencedValue: moneyText(row.influencedValue),\n }));\n writeAdsOutput(rows, format, CAMPAIGN_TABLE_FIELDS, hints);\n return;\n }\n writeJson({ ...response, meta: { count: response.data.campaigns.length }, hints });\n } catch (err) {\n failAccounts(err);\n }\n },\n});\n\nexport const accountsCommand = defineCommand({\n meta: {\n name: \"accounts\",\n description:\n \"Account insights: which companies the LinkedIn ads are warming, and which CRM deals they influenced. Start with `baker accounts influenced` or `baker accounts warm`.\",\n },\n subCommands: {\n influenced: influencedCommand,\n engagement: engagementCommand,\n warm: warmCommand,\n company: companyCommand,\n campaigns: campaignsCommand,\n crm: () => import(\"./crm.ts\").then((m) => m.crmCommand),\n },\n});\n","/**\n * The pure half of `baker accounts`: the warm-account list file, and what the\n * agent should take from a report that the rows alone don't say.\n */\n\nimport {\n ACCOUNTS_NO_SETTINGS_MESSAGE,\n type AccountCompanyMonth,\n type AccountDealRow,\n type AccountDealStatus,\n type AccountEngagementRow,\n type AccountsCompanyResponse,\n type AccountsEngagementResponse,\n type AccountsInfluencedResponse,\n accountDealStatus,\n type InfluenceMetric,\n type InfluenceModelKind,\n type InfluenceParams,\n type InfluenceRuleOverride,\n influenceParams,\n type MoneyByCurrency,\n type WarmAccountsOptions,\n} from \"@baker/api/accounts\";\nimport { toCsvRow } from \"../ads/output.ts\";\n\nexport type AccountsRefusal = { code: \"ACCOUNTS_NOT_SET_UP\"; fix: { action: \"ask_user\"; explanation: string } };\n\n/**\n * The refusal the agent cannot clear, as the fix it acts on: not set up (only\n * the user can say which stages mean won). Matched on the backend's own\n * sentence (shared from `@baker/api/accounts`), because it is a CONFLICT.\n * Null for every other refusal.\n */\nexport function accountsRefusal(code: string, message: string): AccountsRefusal | null {\n if (code === \"CONFLICT\" && message.includes(ACCOUNTS_NO_SETTINGS_MESSAGE)) {\n return {\n code: \"ACCOUNTS_NOT_SET_UP\",\n fix: {\n action: \"ask_user\",\n explanation:\n \"The user sets up where the deals are in Measure → Accounts first: HubSpot (then its pipelines and won/lost stages), or Another CRM, whose deals they send by spreadsheet or from their system (`baker accounts crm status`). Only the user can say which stages mean won and lost; do not guess them. Until then `baker accounts engagement` and `baker accounts warm` still work — they need no deals.\",\n },\n };\n }\n return null;\n}\n\n/** Request fields as the flags that set them. */\nconst FLAG_OF_FIELD: Record<string, string> = {\n lastMonths: \"--last-months\",\n start: \"--start\",\n end: \"--end\",\n campaignId: \"--campaign-id\",\n limit: \"--limit\",\n basis: \"--basis\",\n model: \"--model\",\n threshold: \"--threshold\",\n orgId: \"company\",\n domain: \"company\",\n};\n\n/** A refused request in the agent's own words: which flag, and why. */\nexport function invalidArgsMessage(issues: ReadonlyArray<{ path: PropertyKey[]; message: string }>): string {\n return issues\n .map((issue) => {\n const field = issue.path.map(String).join(\".\");\n return `${FLAG_OF_FIELD[field] ?? (field || \"args\")}: ${issue.message}`;\n })\n .join(\"; \");\n}\n\nfunction money(value: MoneyByCurrency): string {\n const parts = Object.entries(value).map(\n ([currency, amount]) => `${Math.round(amount).toLocaleString(\"en\")} ${currency}`,\n );\n return parts.length > 0 ? parts.join(\" + \") : \"no amount\";\n}\n\n/** What the agent should take from an influenced report that the rows alone don't say. */\nexport function influencedHints(data: AccountsInfluencedResponse[\"data\"]): string[] {\n const hints: string[] = [];\n const { summary } = data;\n if (summary.lowConfidenceDeals > 0) {\n const deals = summary.lowConfidenceDeals === 1 ? \"deal\" : \"deals\";\n const look = summary.lowConfidenceDeals === 1 ? \"looks\" : \"look\";\n hints.push(\n `${summary.lowConfidenceDeals} more ${deals} (${money(summary.lowConfidenceValue)}) ${look} influenced through a company match that is only a guess (a subdomain or a name). They are not counted in the numbers until someone confirms the match in Measure → Accounts; they are listed under lowConfidence.`,\n );\n }\n const valued = Object.keys(summary.influencedValue).length > 0;\n const spent = Object.values(summary.spend).some((amount) => amount > 0);\n if (summary.valuePerSpend === null && valued && spent) {\n hints.push(\n `valuePerSpend is null because the influenced value (${money(summary.influencedValue)}) and the LinkedIn spend (${money(summary.spend)}) are not in one single currency — amounts in different currencies are never converted or added. Report them side by side.`,\n );\n }\n return hints;\n}\n\n/**\n * The deals a table output prints: the counted ones, then the unconfirmed. With\n * `--full` the backend already lists the unconfirmed among `deals`, so they are\n * not added twice — a total taken from the table would count them double.\n */\nexport function influencedTableRows(data: AccountsInfluencedResponse[\"data\"], full: boolean): AccountDealRow[] {\n return full ? data.deals : [...data.deals, ...data.lowConfidence];\n}\n\n/** What the agent should take from an engagement read that the rows alone don't say. */\nexport function engagementHints(data: AccountsEngagementResponse[\"data\"], request: { limit: number }): string[] {\n if (data.companies.length === 0) {\n return [\n `No company the LinkedIn ads reached shows up for ${data.window.start} to ${data.window.end}. The nightly sync may not have run since the campaigns started delivering, or LinkedIn left the companies out (fewer than 3 events in a month). Try a longer period (--last-months 12), or read the ad account live with \\`baker ads linkedin companies\\`.`,\n ];\n }\n const page = data.pageInfo;\n if (page?.hasMore) {\n const first = (page.page - 1) * page.pageSize + 1;\n const last = first + data.companies.length - 1;\n return [\n `Companies ${first}-${last} of ${page.total.toLocaleString(\"en\")} shown. Read the next ones with --page ${page.page + 1} --limit ${page.pageSize}.`,\n ];\n }\n return data.truncated ? [`More companies were reached than --limit ${request.limit}; raise it to see the tail.`] : [];\n}\n\n/** The columns `baker accounts engagement --output csv|md` prints, in order. */\nexport const ENGAGEMENT_TABLE_FIELDS = [\n \"orgId\",\n \"name\",\n \"domain\",\n \"impressions\",\n \"clicks\",\n \"engagements\",\n \"videoViews\",\n \"costLocal\",\n \"currency\",\n \"monthsActive\",\n \"lastMonth\",\n \"previousImpressions\",\n \"previousClicks\",\n \"previousEngagements\",\n \"flag\",\n \"crmCompanyId\",\n \"matchConfidence\",\n \"dealStatus\",\n \"hasOpenDeal\",\n \"hasWonDeal\",\n \"hasLostDeal\",\n \"lastLostAt\",\n \"websitePeople\",\n \"websiteLeads\",\n];\n\n/** Engagement rows flat for a table: the period before as three columns and the website as two, not JSON cells. */\nexport function engagementTableRows(rows: readonly AccountEngagementRow[]): Array<Record<string, unknown>> {\n return withDealStatus(rows).map(({ previous, website, ...row }) => ({\n ...row,\n previousImpressions: previous.impressions,\n previousClicks: previous.clicks,\n previousEngagements: previous.engagements,\n websitePeople: website?.people ?? 0,\n websiteLeads: website?.leads ?? 0,\n }));\n}\n\nconst MODEL_OF_METRIC: Record<InfluenceMetric, InfluenceModelKind> = {\n engagements: \"engagement\",\n impressions: \"awareness\",\n clicks: \"intent\",\n};\n\n/**\n * The least a warm company must have done this period: the company's\n * influence rule (the default one when the backend sent none), read for this\n * call with `--model`/`--threshold`, or `--min` on the rule's metric. `--min 0`\n * drops it, so one engagement after none reads as warm again.\n */\nexport function warmMinimum(\n rule: InfluenceParams | undefined,\n override: InfluenceRuleOverride & { min?: number },\n): WarmAccountsOptions[\"minimum\"] {\n const saved = { model: { kind: rule ? MODEL_OF_METRIC[rule.metric] : \"engagement\", threshold: rule?.threshold } };\n const read = influenceParams(saved, { model: override.model, threshold: override.threshold });\n const value = override.min ?? read.threshold;\n return value > 0 ? { metric: read.metric, value } : undefined;\n}\n\n/** What the agent should take from a warm list that the rows alone don't say. */\nexport function warmHints(\n read: Pick<AccountsEngagementResponse[\"data\"], \"companies\" | \"truncated\">,\n warm: readonly AccountEngagementRow[],\n minimum: WarmAccountsOptions[\"minimum\"],\n): string[] {\n const hints: string[] = [];\n if (read.truncated) {\n hints.push(\n `The ads reached more companies than one read returns (${read.companies.length.toLocaleString(\"en\")}, the most engaged first), so warm companies with little engagement may be missing. Read a shorter period with --last-months 1 to see them.`,\n );\n }\n if (warm.length === 0 && read.companies.length > 0 && minimum !== undefined) {\n hints.push(\n `No company both warmed up and reached ${minimum.value}+ ${minimum.metric} in the period. Try a longer period with --last-months, or a lower bar with --min (--min 0 drops it).`,\n );\n }\n if (warm.some((row) => row.name === \"\")) {\n hints.push(\"Some companies have no name yet — the nightly sync looks them up; the organizationUrn still matches.\");\n }\n if (warm.length > 0) {\n hints.push(\n 'To advertise to them: `baker accounts warm --output csv > warm.csv`, then `baker ads linkedin audiences create --name \"Warm accounts\" --type company-list --list-file warm.csv` (staged until publish).',\n );\n }\n return hints;\n}\n\n/** The header `baker ads linkedin audiences create --type company-list --list-file` reads. */\nconst WARM_CSV_COLUMNS = [\"companyName\", \"domain\", \"organizationUrn\"];\n\n/**\n * Warm accounts as a company-list file, one company a line. The list reader\n * splits on line breaks, so a name carrying one is flattened.\n */\nexport function warmAccountsCsv(rows: readonly AccountEngagementRow[]): string {\n const lines = [toCsvRow(WARM_CSV_COLUMNS)];\n for (const row of rows) {\n const name = row.name.replace(/\\s*[\\r\\n]+\\s*/g, \" \");\n lines.push(toCsvRow([name, row.domain, `urn:li:organization:${row.orgId}`]));\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\n/** Each company with where it stands in the CRM spelled out, so the agent never has to combine the flags. */\nexport function withDealStatus(\n rows: readonly AccountEngagementRow[],\n): Array<AccountEngagementRow & { dealStatus: AccountDealStatus }> {\n return rows.map((row) => ({ ...row, dealStatus: accountDealStatus(row) }));\n}\n\ntype CompanyData = AccountsCompanyResponse[\"data\"];\ntype MonthCounts = Pick<AccountCompanyMonth, \"month\" | \"impressions\" | \"clicks\" | \"engagements\">;\n\nexport interface CompanyView {\n orgs: CompanyData[\"orgs\"];\n /** The company's own totals, month by month: the account-wide rows. */\n months: Array<MonthCounts & { orgId: string }>;\n /** The same numbers split by campaign. Overlapping: never add them to `months` or to each other. */\n byCampaign: Array<{ orgId: string; campaignId: string; campaignName: string | null; months: MonthCounts[] }>;\n deals: CompanyData[\"deals\"];\n rule?: CompanyData[\"rule\"];\n}\n\nconst counts = (row: AccountCompanyMonth): MonthCounts => ({\n month: row.month,\n impressions: row.impressions,\n clicks: row.clicks,\n engagements: row.engagements,\n});\n\n/**\n * One company as the agent should read it. The store answers the account-wide\n * row and every campaign's row for the same month side by side, which reads\n * as double the activity; here the account-wide months are the totals and\n * the campaign split sits apart, labelled. A company the ads never reached\n * comes back from the store as an unnamed echo of the id asked for — dropped,\n * and said in words.\n */\n/** Why a company lookup shows no LinkedIn company: an id the ads never reached, a CRM-only company, or no match at all. */\nfunction unreachedHint(unreached: ReadonlyArray<{ orgId: string }>, deals: number): string {\n if (unreached.length > 0) {\n return `The LinkedIn ads have not reached LinkedIn company ${unreached.map((org) => org.orgId).join(\", \")} in the months the nightly sync keeps (up to 24), so there is nothing to show. Check the id against \\`baker accounts engagement\\`, or try the company's website domain.`;\n }\n if (deals > 0) {\n return `That company is in the CRM with ${deals === 1 ? \"1 deal\" : `${deals} deals`}, but the LinkedIn ads have not reached it in the months the nightly sync keeps, so none of its deals can count as influenced.`;\n }\n return \"The ads have not reached that company, or it is named differently: try its LinkedIn id from `baker accounts engagement`.\";\n}\n\nexport function companyView(data: CompanyData): { data: CompanyView; hints: string[] } {\n const reachedOrgs = new Set(data.months.map((row) => row.orgId));\n const orgs = data.orgs.filter((org) => reachedOrgs.has(org.orgId) || org.name !== \"\" || org.crmCompanyId !== null);\n const months = data.months\n .filter((row) => row.campaignId === \"\")\n .map((row) => ({ orgId: row.orgId, ...counts(row) }));\n const byCampaign: CompanyView[\"byCampaign\"] = [];\n for (const row of data.months) {\n if (row.campaignId === \"\") continue;\n let entry = byCampaign.find((item) => item.orgId === row.orgId && item.campaignId === row.campaignId);\n if (entry === undefined) {\n entry = { orgId: row.orgId, campaignId: row.campaignId, campaignName: row.campaignName, months: [] };\n byCampaign.push(entry);\n }\n entry.months.push(counts(row));\n }\n\n const hints: string[] = [];\n const unreached = unreachedHint(\n data.orgs.filter((org) => !orgs.includes(org)),\n data.deals.length,\n );\n if (orgs.length === 0) hints.push(unreached);\n if (byCampaign.length > 0) {\n hints.push(\n \"`months` are the company's totals. `byCampaign` splits the same numbers by campaign, and a company several campaigns reached shows up under each — never add byCampaign to the totals or to each other.\",\n );\n }\n if (orgs.some((org) => org.matchConfidence === \"low\")) {\n hints.push(\n \"The CRM match is only a guess (a subdomain or a name) until someone confirms it in Measure → Accounts.\",\n );\n }\n if (data.rule !== undefined && data.deals.length > 0) {\n hints.push(\n `\\`influenced\\` on each deal: ${data.rule.threshold}+ ${data.rule.metric} (\\`touchValue\\`) in the ${data.rule.lookbackMonths} months up to the month the deal was created (closed, for a won deal), counted from this company's months above.`,\n );\n }\n return { data: { orgs, months, byCampaign, deals: data.deals, ...(data.rule ? { rule: data.rule } : {}) }, hints };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/commands/accounts/index.ts","../src/commands/accounts/report.ts"],"sourcesContent":["import {\n ACCOUNTS_ENGAGEMENT_MAX_LIMIT,\n type AccountsCampaignsResponse,\n type AccountsCompanyRequest,\n type AccountsCompanyResponse,\n type AccountsEngagementRequest,\n type AccountsEngagementResponse,\n type AccountsInfluencedResponse,\n accountsCampaignsRequestSchema,\n accountsCompanyRequestSchema,\n accountsEngagementRequestSchema,\n accountsInfluencedRequestSchema,\n INFLUENCE_MODEL_KINDS,\n type MoneyByCurrency,\n warmAccounts,\n} from \"@baker/api/accounts\";\nimport { defineCommand } from \"citty\";\nimport { z } from \"zod\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi } from \"../actions/shared.ts\";\nimport { outputFormatRefusal, TABLE_OUTPUT_FORMATS, writeAdsOutput } from \"../ads/output.ts\";\nimport {\n accountsRefusal,\n companyView,\n ENGAGEMENT_TABLE_FIELDS,\n engagementHints,\n engagementTableRows,\n influencedHints,\n influencedTableRows,\n invalidArgsMessage,\n warmAccountsCsv,\n warmHints,\n warmMinimum,\n withDealStatus,\n} from \"./report.ts\";\n\n/**\n * `baker accounts` — which companies the LinkedIn ads are warming, and which\n * CRM deals they influenced. Reads the nightly Account insights sync; nothing\n * here calls LinkedIn or the CRM, and nothing changes anywhere.\n */\n\nfunction optionalNumber(raw: unknown): number | undefined {\n return typeof raw === \"string\" && raw.trim() !== \"\" ? Number(raw) : undefined;\n}\n\nfunction optionalString(raw: unknown): string | undefined {\n return typeof raw === \"string\" && raw.trim() !== \"\" ? raw.trim() : undefined;\n}\n\nfunction failInvalidArgs(message: string): never {\n writeJson({ ok: false, error: { code: \"INVALID_ARGS\", message } });\n process.exit(1);\n}\n\n/** A request the schema refuses never reaches the store; say which flag, in the envelope. */\nfunction failInvalid(issues: ReadonlyArray<{ path: PropertyKey[]; message: string }>): never {\n failInvalidArgs(invalidArgsMessage(issues));\n}\n\n/** `--output` as asked, refused with the supported list instead of quietly printing JSON. */\nfunction outputFormat(args: Record<string, unknown>, supported: readonly string[]): string {\n const format = optionalString(args.output) ?? \"json\";\n const refusal = outputFormatRefusal(format, supported);\n if (refusal !== null) failInvalidArgs(refusal);\n return format;\n}\n\nconst OUTPUT_ARG = {\n type: \"string\",\n description: \"json|csv|jsonl|md (default json). csv/jsonl/md print the rows only; the summary and hints go to stderr\",\n required: false,\n default: \"json\",\n} as const;\n\nconst RULE_ARGS = {\n model: {\n type: \"string\",\n description:\n \"Read this report with another influence model, for this call only (the saved settings stay): engagement (engagements), awareness (impressions) or intent (clicks)\",\n required: false,\n },\n threshold: {\n type: \"string\",\n description:\n \"Read this report with another threshold on the model's metric, for this call only (a whole number, 1 or more)\",\n required: false,\n },\n} as const;\n\nfunction ruleInput(args: Record<string, unknown>): { model?: string; threshold?: number } {\n return { model: optionalString(args.model), threshold: optionalNumber(args.threshold) };\n}\n\nfunction moneyText(value: MoneyByCurrency): string {\n return Object.entries(value)\n .map(([currency, amount]) => `${Math.round(amount)} ${currency}`)\n .join(\" + \");\n}\n\n/** \"Not set up\" becomes the fix the agent relays; everything else is the ordinary error envelope. */\nfunction failAccounts(err: unknown): never {\n const refusal = err instanceof ApiError ? accountsRefusal(err.code, err.message) : 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\nconst WINDOW_ARGS = {\n \"last-months\": {\n type: \"string\",\n description: \"Calendar months to read, the current one included (1-24)\",\n required: false,\n },\n start: { type: \"string\", description: \"First day, YYYY-MM-DD (instead of --last-months)\", required: false },\n end: { type: \"string\", description: \"Last day, YYYY-MM-DD (default today; needs --start)\", required: false },\n} as const;\n\nfunction windowInput(args: Record<string, unknown>): { lastMonths?: number; start?: string; end?: string } {\n return {\n lastMonths: optionalNumber(args[\"last-months\"]),\n start: optionalString(args.start),\n end: optionalString(args.end),\n };\n}\n\n// --- influenced ---\n\nconst INFLUENCED_ARGS = {\n basis: {\n type: \"string\",\n description: \"pipeline (default): deals created in the period and not won. revenue: deals closed won in the period\",\n required: false,\n default: \"pipeline\",\n },\n ...WINDOW_ARGS,\n full: {\n type: \"boolean\",\n description: \"Every deal in the period, influenced or not, instead of the influenced ones\",\n required: false,\n default: false,\n },\n ...RULE_ARGS,\n output: OUTPUT_ARG,\n} as const;\n\nconst DEAL_TABLE_FIELDS = [\n \"dealId\",\n \"dealName\",\n \"companyName\",\n \"domain\",\n \"amount\",\n \"currency\",\n \"status\",\n \"referenceAt\",\n \"touchValue\",\n \"firstTouchMonth\",\n \"matchConfidence\",\n \"influenced\",\n \"crmCompanyId\",\n];\n\nfunction influencedSummaryLine(data: AccountsInfluencedResponse[\"data\"]): string {\n const { summary, rule } = data;\n const value = moneyText(summary.influencedValue) || \"no amount\";\n return `${summary.influencedDeals} of ${summary.deals} ${data.basis} deals influenced (${value}) — ${rule.threshold}+ ${rule.metric} in the ${rule.lookbackMonths} months up to each deal, ${data.window.start} to ${data.window.end}.`;\n}\n\nregisterSchema({\n command: \"accounts.influenced\",\n description:\n \"Start here for 'what pipeline / revenue did our LinkedIn ads influence'. A deal is influenced when its company reached the company's influence rule (default: 3+ LinkedIn ad engagements) in the 12 months up to and including the month the deal was created (pipeline) or closed won (revenue). A labelled rule, not credit: never call it 'attributed' or split it. Returns {summary: {deals, influencedDeals, influencedValue per currency, lowConfidenceDeals, spend, valuePerSpend}, deals, lowConfidence}. Amounts in different currencies are never added. Default the last 12 calendar months. --model/--threshold read it with another rule for this call only (\\\"what if we counted 5+ engagements\\\"); --output csv|md|jsonl prints the deals.\",\n args: INFLUENCED_ARGS,\n});\n\nconst influencedCommand = defineCommand({\n meta: {\n name: \"influenced\",\n description:\n \"Deals the LinkedIn ads influenced, with influenced pipeline or revenue. Example: baker accounts influenced --basis revenue --last-months 6\",\n },\n args: INFLUENCED_ARGS,\n run: async ({ args }) => {\n const format = outputFormat(args, TABLE_OUTPUT_FORMATS);\n const parsed = accountsInfluencedRequestSchema.safeParse({\n ...windowInput(args),\n ...ruleInput(args),\n basis: optionalString(args.basis),\n full: Boolean(args.full),\n });\n if (!parsed.success) failInvalid(parsed.error.issues);\n try {\n const response = await apiPost<AccountsInfluencedResponse>(\"/api/accounts/influenced\", parsed.data);\n const hints = influencedHints(response.data);\n if (format !== \"json\") {\n const rows = influencedTableRows(response.data, parsed.data.full);\n writeAdsOutput(rows, format, DEAL_TABLE_FIELDS, [influencedSummaryLine(response.data), ...hints]);\n return;\n }\n writeJson({ ...response, meta: { count: response.data.deals.length }, ...(hints.length > 0 ? { hints } : {}) });\n } catch (err) {\n failAccounts(err);\n }\n },\n});\n\n// --- engagement ---\n\nconst ENGAGEMENT_ARGS = {\n ...WINDOW_ARGS,\n \"campaign-id\": { type: \"string\", description: \"Only this campaign's companies (numeric id)\", required: false },\n limit: {\n type: \"string\",\n description: `Companies per page, 1-${ACCOUNTS_ENGAGEMENT_MAX_LIMIT} (default 500)`,\n required: false,\n },\n page: {\n type: \"string\",\n description:\n \"Which page to read, 1-based, most engaged first (default 1). pageInfo.hasMore says another page follows; pageInfo.total counts every company reached\",\n required: false,\n },\n output: OUTPUT_ARG,\n} as const;\n\nregisterSchema({\n command: \"accounts.engagement\",\n description:\n \"Every company the LinkedIn ads reached, most engaged first, with the period before for comparison, New/Rising flags, and where it stands in the CRM (matched company; dealStatus won > open > lost > none, lost meaning every deal it had was lost; lastLostAt). Default the last 3 calendar months. From the nightly sync, so it is fast and covers up to 24 months; for a live read of one ad account use `baker ads linkedin companies`. Paged: --limit companies per page, --page N; pageInfo {page, pageSize, total, hasMore}.\",\n args: ENGAGEMENT_ARGS,\n});\n\nfunction engagementInput(args: Record<string, unknown>, limit?: number): AccountsEngagementRequest {\n return {\n ...windowInput(args),\n campaignId: optionalString(args[\"campaign-id\"])?.replace(/^urn:li:sponsoredCampaign:/, \"\"),\n limit: limit ?? optionalNumber(args.limit),\n page: limit === undefined ? optionalNumber(args.page) : undefined,\n };\n}\n\nconst engagementCommand = defineCommand({\n meta: {\n name: \"engagement\",\n description:\n \"Companies the LinkedIn ads reached, with New/Rising flags and CRM status. Example: baker accounts engagement --last-months 3 --limit 50\",\n },\n args: ENGAGEMENT_ARGS,\n run: async ({ args }) => {\n const format = outputFormat(args, TABLE_OUTPUT_FORMATS);\n const parsed = accountsEngagementRequestSchema.safeParse(engagementInput(args));\n if (!parsed.success) failInvalid(parsed.error.issues);\n try {\n const response = await apiPost<AccountsEngagementResponse>(\"/api/accounts/engagement\", parsed.data);\n const hints = engagementHints(response.data, parsed.data);\n if (format !== \"json\") {\n writeAdsOutput(engagementTableRows(response.data.companies), format, ENGAGEMENT_TABLE_FIELDS, hints);\n return;\n }\n const companies = withDealStatus(response.data.companies);\n writeJson({\n ...response,\n data: { ...response.data, companies },\n meta: { count: companies.length, ...(response.data.pageInfo ? { total: response.data.pageInfo.total } : {}) },\n ...(hints.length > 0 ? { hints } : {}),\n });\n } catch (err) {\n failAccounts(err);\n }\n },\n});\n\n// --- warm ---\n\nconst warmRuleSchema = z.object({\n model: z.enum(INFLUENCE_MODEL_KINDS).optional(),\n threshold: z.number().int().min(1).optional(),\n min: z.number().int().min(0).optional(),\n});\n\nconst WARM_ARGS = {\n ...WINDOW_ARGS,\n \"campaign-id\": ENGAGEMENT_ARGS[\"campaign-id\"],\n min: {\n type: \"string\",\n description:\n \"Least a company must have done this period on the rule's metric to count as warm (default: the company's influence threshold, e.g. 3 engagements; 0 keeps every New/Rising company)\",\n required: false,\n },\n ...RULE_ARGS,\n output: {\n type: \"string\",\n description:\n \"json (default) or csv — csv prints companyName,domain,organizationUrn, the file `baker ads linkedin audiences create --type company-list --list-file` takes\",\n required: false,\n default: \"json\",\n },\n} as const;\n\nregisterSchema({\n command: \"accounts.warm\",\n description:\n \"Warm accounts: companies engaging with the LinkedIn ads more than in the period before (New: nothing before; Rising: engagements at least doubled) that reached the company's influence threshold this period (e.g. 3+ engagements; --min overrides, --min 0 drops it) and are not already somebody's deal: no open deal, never won (customers are left out), and no deal lost in the last 6 months (an older loss no longer counts). Default the current calendar month against the one before. `--output csv > warm.csv` writes a company list ready for `baker ads linkedin audiences create --type company-list --list-file warm.csv` (LinkedIn needs 300+ matched members to serve).\",\n args: WARM_ARGS,\n});\n\nconst warmCommand = defineCommand({\n meta: {\n name: \"warm\",\n description:\n \"Companies warming up that are not in pipeline, customers, or recently lost. Example: baker accounts warm --last-months 1 --output csv > warm.csv\",\n },\n args: WARM_ARGS,\n run: async ({ args }) => {\n const format = outputFormat(args, [\"json\", \"csv\"]);\n const rule = warmRuleSchema.safeParse({ ...ruleInput(args), min: optionalNumber(args.min) });\n if (!rule.success) failInvalid(rule.error.issues);\n const input = engagementInput(args, ACCOUNTS_ENGAGEMENT_MAX_LIMIT);\n const parsed = accountsEngagementRequestSchema.safeParse(\n input.start === undefined && input.lastMonths === undefined ? { ...input, lastMonths: 1 } : input,\n );\n if (!parsed.success) failInvalid(parsed.error.issues);\n try {\n const response = await apiPost<AccountsEngagementResponse>(\"/api/accounts/engagement\", parsed.data);\n const minimum = warmMinimum(response.data.rule, rule.data);\n const warm = warmAccounts(response.data.companies, new Date().toISOString().slice(0, 10), { minimum });\n const hints = warmHints(response.data, warm, minimum);\n if (format === \"csv\") {\n process.stdout.write(warmAccountsCsv(warm));\n for (const hint of hints) process.stderr.write(`${hint}\\n`);\n return;\n }\n writeJson({\n ok: true,\n data: {\n window: response.data.window,\n previousWindow: response.data.previousWindow,\n minimum: minimum ?? null,\n companies: withDealStatus(warm),\n },\n meta: { count: warm.length },\n ...(hints.length > 0 ? { hints } : {}),\n });\n } catch (err) {\n failAccounts(err);\n }\n },\n});\n\n// --- company ---\n\nconst COMPANY_ARGS = {\n company: {\n type: \"positional\",\n description: \"LinkedIn company id (1035), its urn:li:organization URN, or a website domain (acme.com)\",\n required: true,\n },\n} as const;\n\nregisterSchema({\n command: \"accounts.company\",\n description:\n \"One company's story: its month-by-month totals (`months`), the same numbers split by LinkedIn campaign (`byCampaign` — overlapping, never add it to the totals), the CRM company it matched and how surely, and that company's deals, each with `touchValue` and `influenced` under the company's rule. Use it to show why a deal counts as influenced.\",\n args: COMPANY_ARGS,\n});\n\n/** A bare number or an organization URN is a LinkedIn id; anything else is a domain. */\nfunction companyRequest(raw: string): AccountsCompanyRequest {\n const value = raw.trim();\n return /^(urn:li:organization:)?\\d+$/.test(value) ? { orgId: value } : { domain: value };\n}\n\nconst companyCommand = defineCommand({\n meta: {\n name: \"company\",\n description: \"One company's monthly LinkedIn ad activity and its deals. Example: baker accounts company acme.com\",\n },\n args: COMPANY_ARGS,\n run: async ({ args }) => {\n const parsed = accountsCompanyRequestSchema.safeParse(companyRequest(String(args.company ?? \"\")));\n if (!parsed.success) failInvalid(parsed.error.issues);\n try {\n const response = await apiPost<AccountsCompanyResponse>(\"/api/accounts/company\", parsed.data);\n const view = companyView(response.data);\n writeJson({ ok: true, data: view.data, ...(view.hints.length > 0 ? { hints: view.hints } : {}) });\n } catch (err) {\n failAccounts(err);\n }\n },\n});\n\n// --- campaigns ---\n\nconst CAMPAIGNS_ARGS = { basis: INFLUENCED_ARGS.basis, ...WINDOW_ARGS, ...RULE_ARGS, output: OUTPUT_ARG } as const;\n\nconst CAMPAIGN_TABLE_FIELDS = [\n \"campaignId\",\n \"campaignName\",\n \"companiesReached\",\n \"companiesEngaged\",\n \"influencedDeals\",\n \"influencedValue\",\n];\n\nregisterSchema({\n command: \"accounts.campaigns\",\n description:\n \"Per LinkedIn campaign: companies reached and engaged in the period, and the influenced deals it touched in their lookback — pipeline (default: deals created and not won) or, with --basis revenue, deals closed won. Overlapping by design — a deal counts for every campaign that touched it, so the rows never sum to the total; read them as a comparison, not a split. Default the last 12 calendar months. --model/--threshold read it with another rule for this call only.\",\n args: CAMPAIGNS_ARGS,\n});\n\nconst campaignsCommand = defineCommand({\n meta: {\n name: \"campaigns\",\n description:\n \"Companies reached and influenced pipeline or revenue per campaign. Example: baker accounts campaigns --basis revenue --last-months 6\",\n },\n args: CAMPAIGNS_ARGS,\n run: async ({ args }) => {\n const format = outputFormat(args, TABLE_OUTPUT_FORMATS);\n const input = { basis: optionalString(args.basis), ...windowInput(args), ...ruleInput(args) };\n const parsed = accountsCampaignsRequestSchema.safeParse(input);\n if (!parsed.success) failInvalid(parsed.error.issues);\n try {\n const response = await apiPost<AccountsCampaignsResponse>(\"/api/accounts/campaigns\", parsed.data);\n const hints = [\"Campaign rows overlap: a deal counts for every campaign that touched it. Never add them up.\"];\n if (format !== \"json\") {\n const rows = response.data.campaigns.map((row) => ({\n ...row,\n influencedValue: moneyText(row.influencedValue),\n }));\n writeAdsOutput(rows, format, CAMPAIGN_TABLE_FIELDS, hints);\n return;\n }\n writeJson({ ...response, meta: { count: response.data.campaigns.length }, hints });\n } catch (err) {\n failAccounts(err);\n }\n },\n});\n\nexport const accountsCommand = defineCommand({\n meta: {\n name: \"accounts\",\n description:\n \"Account insights: which companies the LinkedIn ads are warming, and which CRM deals they influenced. Start with `baker accounts influenced` or `baker accounts warm`.\",\n },\n subCommands: {\n influenced: influencedCommand,\n engagement: engagementCommand,\n warm: warmCommand,\n company: companyCommand,\n campaigns: campaignsCommand,\n crm: () => import(\"./crm.ts\").then((m) => m.crmCommand),\n },\n});\n","/**\n * The pure half of `baker accounts`: the warm-account list file, and what the\n * agent should take from a report that the rows alone don't say.\n */\n\nimport {\n ACCOUNTS_NO_SETTINGS_MESSAGE,\n type AccountCompanyMonth,\n type AccountDealRow,\n type AccountDealStatus,\n type AccountEngagementRow,\n type AccountsCompanyResponse,\n type AccountsEngagementResponse,\n type AccountsInfluencedResponse,\n accountDealStatus,\n type InfluenceMetric,\n type InfluenceModelKind,\n type InfluenceParams,\n type InfluenceRuleOverride,\n influenceParams,\n type MoneyByCurrency,\n type WarmAccountsOptions,\n} from \"@baker/api/accounts\";\nimport { toCsvRow } from \"../ads/output.ts\";\n\nexport type AccountsRefusal = { code: \"ACCOUNTS_NOT_SET_UP\"; fix: { action: \"ask_user\"; explanation: string } };\n\n/**\n * The refusal the agent cannot clear, as the fix it acts on: not set up (only\n * the user can say which stages mean won). Matched on the backend's own\n * sentence (shared from `@baker/api/accounts`), because it is a CONFLICT.\n * Null for every other refusal.\n */\nexport function accountsRefusal(code: string, message: string): AccountsRefusal | null {\n if (code === \"CONFLICT\" && message.includes(ACCOUNTS_NO_SETTINGS_MESSAGE)) {\n return {\n code: \"ACCOUNTS_NOT_SET_UP\",\n fix: {\n action: \"ask_user\",\n explanation:\n \"The user sets up where the deals are in Measure → Accounts first: HubSpot (then its pipelines and won/lost stages), or Another CRM, whose deals they send by spreadsheet or from their system (`baker accounts crm status`). Only the user can say which stages mean won and lost; do not guess them. Until then `baker accounts engagement` and `baker accounts warm` still work — they need no deals.\",\n },\n };\n }\n return null;\n}\n\n/** Request fields as the flags that set them. */\nconst FLAG_OF_FIELD: Record<string, string> = {\n lastMonths: \"--last-months\",\n start: \"--start\",\n end: \"--end\",\n campaignId: \"--campaign-id\",\n limit: \"--limit\",\n basis: \"--basis\",\n model: \"--model\",\n threshold: \"--threshold\",\n orgId: \"company\",\n domain: \"company\",\n};\n\n/** A refused request in the agent's own words: which flag, and why. */\nexport function invalidArgsMessage(issues: ReadonlyArray<{ path: PropertyKey[]; message: string }>): string {\n return issues\n .map((issue) => {\n const field = issue.path.map(String).join(\".\");\n return `${FLAG_OF_FIELD[field] ?? (field || \"args\")}: ${issue.message}`;\n })\n .join(\"; \");\n}\n\nfunction money(value: MoneyByCurrency): string {\n const parts = Object.entries(value).map(\n ([currency, amount]) => `${Math.round(amount).toLocaleString(\"en\")} ${currency}`,\n );\n return parts.length > 0 ? parts.join(\" + \") : \"no amount\";\n}\n\n/** What the agent should take from an influenced report that the rows alone don't say. */\nexport function influencedHints(data: AccountsInfluencedResponse[\"data\"]): string[] {\n const hints: string[] = [];\n const { summary } = data;\n if (summary.lowConfidenceDeals > 0) {\n const deals = summary.lowConfidenceDeals === 1 ? \"deal\" : \"deals\";\n const look = summary.lowConfidenceDeals === 1 ? \"looks\" : \"look\";\n hints.push(\n `${summary.lowConfidenceDeals} more ${deals} (${money(summary.lowConfidenceValue)}) ${look} influenced through a company match that is only a guess (a subdomain or a name). They are not counted in the numbers until someone confirms the match in Measure → Accounts; they are listed under lowConfidence.`,\n );\n }\n const valued = Object.keys(summary.influencedValue).length > 0;\n const spent = Object.values(summary.spend).some((amount) => amount > 0);\n if (summary.valuePerSpend === null && valued && spent) {\n hints.push(\n `valuePerSpend is null because the influenced value (${money(summary.influencedValue)}) and the LinkedIn spend (${money(summary.spend)}) are not in one single currency — amounts in different currencies are never converted or added. Report them side by side.`,\n );\n }\n return hints;\n}\n\n/**\n * The deals a table output prints: the counted ones, then the unconfirmed. With\n * `--full` the backend already lists the unconfirmed among `deals`, so they are\n * not added twice — a total taken from the table would count them double.\n */\nexport function influencedTableRows(data: AccountsInfluencedResponse[\"data\"], full: boolean): AccountDealRow[] {\n return full ? data.deals : [...data.deals, ...data.lowConfidence];\n}\n\n/** What the agent should take from an engagement read that the rows alone don't say. */\nexport function engagementHints(data: AccountsEngagementResponse[\"data\"], request: { limit: number }): string[] {\n if (data.companies.length === 0) {\n return [\n `No company the LinkedIn ads reached shows up for ${data.window.start} to ${data.window.end}. The nightly sync may not have run since the campaigns started delivering, or LinkedIn left the companies out (fewer than 3 events in a month). Try a longer period (--last-months 12), or read the ad account live with \\`baker ads linkedin companies\\`.`,\n ];\n }\n const page = data.pageInfo;\n if (page?.hasMore) {\n const first = (page.page - 1) * page.pageSize + 1;\n const last = first + data.companies.length - 1;\n return [\n `Companies ${first}-${last} of ${page.total.toLocaleString(\"en\")} shown. Read the next ones with --page ${page.page + 1} --limit ${page.pageSize}.`,\n ];\n }\n return data.truncated ? [`More companies were reached than --limit ${request.limit}; raise it to see the tail.`] : [];\n}\n\n/** The columns `baker accounts engagement --output csv|md` prints, in order. */\nexport const ENGAGEMENT_TABLE_FIELDS = [\n \"orgId\",\n \"name\",\n \"domain\",\n \"impressions\",\n \"clicks\",\n \"engagements\",\n \"videoViews\",\n \"costLocal\",\n \"currency\",\n \"monthsActive\",\n \"lastMonth\",\n \"previousImpressions\",\n \"previousClicks\",\n \"previousEngagements\",\n \"flag\",\n \"crmCompanyId\",\n \"matchConfidence\",\n \"dealStatus\",\n \"hasOpenDeal\",\n \"hasWonDeal\",\n \"hasLostDeal\",\n \"lastLostAt\",\n \"websitePeople\",\n \"websiteLeads\",\n];\n\n/** Engagement rows flat for a table: the period before as three columns and the website as two, not JSON cells. */\nexport function engagementTableRows(rows: readonly AccountEngagementRow[]): Array<Record<string, unknown>> {\n return withDealStatus(rows).map(({ previous, website, ...row }) => ({\n ...row,\n previousImpressions: previous.impressions,\n previousClicks: previous.clicks,\n previousEngagements: previous.engagements,\n websitePeople: website?.people ?? 0,\n websiteLeads: website?.leads ?? 0,\n }));\n}\n\nconst MODEL_OF_METRIC: Record<InfluenceMetric, InfluenceModelKind> = {\n engagements: \"engagement\",\n impressions: \"awareness\",\n clicks: \"intent\",\n};\n\n/**\n * The least a warm company must have done this period: the company's\n * influence rule (the default one when the backend sent none), read for this\n * call with `--model`/`--threshold`, or `--min` on the rule's metric. `--min 0`\n * drops it, so one engagement after none reads as warm again.\n */\nexport function warmMinimum(\n rule: InfluenceParams | undefined,\n override: InfluenceRuleOverride & { min?: number },\n): WarmAccountsOptions[\"minimum\"] {\n const saved = { model: { kind: rule ? MODEL_OF_METRIC[rule.metric] : \"engagement\", threshold: rule?.threshold } };\n const read = influenceParams(saved, { model: override.model, threshold: override.threshold });\n const value = override.min ?? read.threshold;\n return value > 0 ? { metric: read.metric, value } : undefined;\n}\n\n/** What the agent should take from a warm list that the rows alone don't say. */\nexport function warmHints(\n read: Pick<AccountsEngagementResponse[\"data\"], \"companies\" | \"truncated\">,\n warm: readonly AccountEngagementRow[],\n minimum: WarmAccountsOptions[\"minimum\"],\n): string[] {\n const hints: string[] = [];\n if (read.truncated) {\n hints.push(\n `The ads reached more companies than one read returns (${read.companies.length.toLocaleString(\"en\")}, the most engaged first), so warm companies with little engagement may be missing. Read a shorter period with --last-months 1 to see them.`,\n );\n }\n if (warm.length === 0 && read.companies.length > 0 && minimum !== undefined) {\n hints.push(\n `No company both warmed up and reached ${minimum.value}+ ${minimum.metric} in the period. Try a longer period with --last-months, or a lower bar with --min (--min 0 drops it).`,\n );\n }\n if (warm.some((row) => row.name === \"\")) {\n hints.push(\"Some companies have no name yet — the nightly sync looks them up; the organizationUrn still matches.\");\n }\n if (warm.length > 0) {\n hints.push(\n 'To advertise to them: `baker accounts warm --output csv > warm.csv`, then `baker ads linkedin audiences create --name \"Warm accounts\" --type company-list --list-file warm.csv` (staged until publish).',\n );\n }\n return hints;\n}\n\n/** The header `baker ads linkedin audiences create --type company-list --list-file` reads. */\nconst WARM_CSV_COLUMNS = [\"companyName\", \"domain\", \"organizationUrn\"];\n\n/**\n * Warm accounts as a company-list file, one company a line. The list reader\n * splits on line breaks, so a name carrying one is flattened.\n */\nexport function warmAccountsCsv(rows: readonly AccountEngagementRow[]): string {\n const lines = [toCsvRow(WARM_CSV_COLUMNS)];\n for (const row of rows) {\n const name = row.name.replace(/\\s*[\\r\\n]+\\s*/g, \" \");\n lines.push(toCsvRow([name, row.domain, `urn:li:organization:${row.orgId}`]));\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\n/** Each company with where it stands in the CRM spelled out, so the agent never has to combine the flags. */\nexport function withDealStatus(\n rows: readonly AccountEngagementRow[],\n): Array<AccountEngagementRow & { dealStatus: AccountDealStatus }> {\n return rows.map((row) => ({ ...row, dealStatus: accountDealStatus(row) }));\n}\n\ntype CompanyData = AccountsCompanyResponse[\"data\"];\ntype MonthCounts = Pick<AccountCompanyMonth, \"month\" | \"impressions\" | \"clicks\" | \"engagements\">;\n\nexport interface CompanyView {\n orgs: CompanyData[\"orgs\"];\n /** The company's own totals, month by month: the account-wide rows. */\n months: Array<MonthCounts & { orgId: string }>;\n /** The same numbers split by campaign. Overlapping: never add them to `months` or to each other. */\n byCampaign: Array<{ orgId: string; campaignId: string; campaignName: string | null; months: MonthCounts[] }>;\n deals: CompanyData[\"deals\"];\n rule?: CompanyData[\"rule\"];\n}\n\nconst counts = (row: AccountCompanyMonth): MonthCounts => ({\n month: row.month,\n impressions: row.impressions,\n clicks: row.clicks,\n engagements: row.engagements,\n});\n\n/**\n * One company as the agent should read it. The store answers the account-wide\n * row and every campaign's row for the same month side by side, which reads\n * as double the activity; here the account-wide months are the totals and\n * the campaign split sits apart, labelled. A company the ads never reached\n * comes back from the store as an unnamed echo of the id asked for — dropped,\n * and said in words.\n */\n/** Why a company lookup shows no LinkedIn company: an id the ads never reached, a CRM-only company, or no match at all. */\nfunction unreachedHint(unreached: ReadonlyArray<{ orgId: string }>, deals: number): string {\n if (unreached.length > 0) {\n return `The LinkedIn ads have not reached LinkedIn company ${unreached.map((org) => org.orgId).join(\", \")} in the months the nightly sync keeps (up to 24), so there is nothing to show. Check the id against \\`baker accounts engagement\\`, or try the company's website domain.`;\n }\n if (deals > 0) {\n return `That company is in the CRM with ${deals === 1 ? \"1 deal\" : `${deals} deals`}, but the LinkedIn ads have not reached it in the months the nightly sync keeps, so none of its deals can count as influenced.`;\n }\n return \"The ads have not reached that company, or it is named differently: try its LinkedIn id from `baker accounts engagement`.\";\n}\n\nexport function companyView(data: CompanyData): { data: CompanyView; hints: string[] } {\n const reachedOrgs = new Set(data.months.map((row) => row.orgId));\n const orgs = data.orgs.filter((org) => reachedOrgs.has(org.orgId) || org.name !== \"\" || org.crmCompanyId !== null);\n const months = data.months\n .filter((row) => row.campaignId === \"\")\n .map((row) => ({ orgId: row.orgId, ...counts(row) }));\n const byCampaign: CompanyView[\"byCampaign\"] = [];\n for (const row of data.months) {\n if (row.campaignId === \"\") continue;\n let entry = byCampaign.find((item) => item.orgId === row.orgId && item.campaignId === row.campaignId);\n if (entry === undefined) {\n entry = { orgId: row.orgId, campaignId: row.campaignId, campaignName: row.campaignName, months: [] };\n byCampaign.push(entry);\n }\n entry.months.push(counts(row));\n }\n\n const hints: string[] = [];\n const unreached = unreachedHint(\n data.orgs.filter((org) => !orgs.includes(org)),\n data.deals.length,\n );\n if (orgs.length === 0) hints.push(unreached);\n if (byCampaign.length > 0) {\n hints.push(\n \"`months` are the company's totals. `byCampaign` splits the same numbers by campaign, and a company several campaigns reached shows up under each — never add byCampaign to the totals or to each other.\",\n );\n }\n if (orgs.some((org) => org.matchConfidence === \"low\")) {\n hints.push(\n \"The CRM match is only a guess (a subdomain or a name) until someone confirms it in Measure → Accounts.\",\n );\n }\n if (data.rule !== undefined && data.deals.length > 0) {\n hints.push(\n `\\`influenced\\` on each deal: ${data.rule.threshold}+ ${data.rule.metric} (\\`touchValue\\`) in the ${data.rule.lookbackMonths} months up to the month the deal was created (closed, for a won deal), counted from this company's months above.`,\n );\n }\n return { data: { orgs, months, byCampaign, deals: data.deals, ...(data.rule ? { rule: data.rule } : {}) }, hints };\n}\n"],"mappings":"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","names":[]}
@@ -30,26 +30,26 @@ Examples:
30
30
  Full guide: __tooling__/docs/tools/baker/actions.md`
31
31
  },
32
32
  subCommands: {
33
- list: () => import("./list-BIEVLEHS.js").then((m) => m.listCommand),
34
- log: () => import("./log-C23OOAJZ.js").then((m) => m.logCommand),
35
- draft: () => import("./draft-2IBSJEKC.js").then((m) => m.draftCommand),
36
- get: () => import("./get-5PKNKJ5S.js").then((m) => m.getCommand),
37
- status: () => import("./status-SE2VZJJB.js").then((m) => m.statusCommand),
38
- claim: () => import("./claim-W6G6VEG5.js").then((m) => m.claimCommand),
39
- release: () => import("./release-V43YB2PY.js").then((m) => m.releaseCommand),
40
- create: () => import("./create-WU22YYU2.js").then((m) => m.createCommand),
41
- update: () => import("./update-V6YVEUI2.js").then((m) => m.updateCommand),
42
- complete: () => import("./complete-LYR2HMQU.js").then((m) => m.completeCommand),
43
- discard: () => import("./discard-HTQUUHJR.js").then((m) => m.discardCommand),
44
- reopen: () => import("./reopen-GQ66NMWF.js").then((m) => m.reopenCommand),
45
- assign: () => import("./assign-PTUJUCEL.js").then((m) => m.assignCommand),
46
- members: () => import("./members-UDY4OOJW.js").then((m) => m.membersCommand),
47
- link: () => import("./link-CI45HWFN.js").then((m) => m.linkCommand),
48
- unlink: () => import("./unlink-XRMYJ6DB.js").then((m) => m.unlinkCommand),
49
- tags: () => import("./tags-PYWFSBTR.js").then((m) => m.tagsCommand)
33
+ list: () => import("./list-SAV3LQHY.js").then((m) => m.listCommand),
34
+ log: () => import("./log-XZPVOALD.js").then((m) => m.logCommand),
35
+ draft: () => import("./draft-SLHAKJ2A.js").then((m) => m.draftCommand),
36
+ get: () => import("./get-QEYJRLV3.js").then((m) => m.getCommand),
37
+ status: () => import("./status-7F2KHFGA.js").then((m) => m.statusCommand),
38
+ claim: () => import("./claim-FZ5OQLMU.js").then((m) => m.claimCommand),
39
+ release: () => import("./release-5KVLXNP6.js").then((m) => m.releaseCommand),
40
+ create: () => import("./create-VXM34ZWH.js").then((m) => m.createCommand),
41
+ update: () => import("./update-7NCOTAQZ.js").then((m) => m.updateCommand),
42
+ complete: () => import("./complete-2FZMGJV5.js").then((m) => m.completeCommand),
43
+ discard: () => import("./discard-2WWQG6OU.js").then((m) => m.discardCommand),
44
+ reopen: () => import("./reopen-YM5LNOLB.js").then((m) => m.reopenCommand),
45
+ assign: () => import("./assign-ABN2AQ4J.js").then((m) => m.assignCommand),
46
+ members: () => import("./members-D5ZYLS4Y.js").then((m) => m.membersCommand),
47
+ link: () => import("./link-QYAW6A2W.js").then((m) => m.linkCommand),
48
+ unlink: () => import("./unlink-65KUN6ID.js").then((m) => m.unlinkCommand),
49
+ tags: () => import("./tags-3WPW6PTV.js").then((m) => m.tagsCommand)
50
50
  }
51
51
  });
52
52
  export {
53
53
  actionsCommand
54
54
  };
55
- //# sourceMappingURL=actions-6TQMSVWD.js.map
55
+ //# sourceMappingURL=actions-P35MEMGN.js.map
@@ -6,20 +6,16 @@ import {
6
6
  stepNameKey,
7
7
  walkNodes,
8
8
  writeFlowTree
9
- } from "./chunk-HROZYQ5H.js";
9
+ } from "./chunk-YRQYA2LR.js";
10
10
  import {
11
11
  flowCatalogEntry,
12
12
  flowCatalogTypes,
13
13
  flowNodeTriggers
14
- } from "./chunk-7EPXVICM.js";
14
+ } from "./chunk-XF4JUKVF.js";
15
15
  import "./chunk-GXDLWBOY.js";
16
16
  import "./chunk-TEINLN64.js";
17
17
  import "./chunk-ZJWUBJYQ.js";
18
- import "./chunk-HR6IWNKE.js";
19
18
  import "./chunk-NE4F3FHN.js";
20
- import "./chunk-XBOK23HI.js";
21
- import "./chunk-IFWP3ZDO.js";
22
- import "./chunk-NAWWC5I3.js";
23
19
  import {
24
20
  registerSchema,
25
21
  writeJson
@@ -153,21 +149,6 @@ function freeSideEffectId(type, taken) {
153
149
  if (!taken.has(candidate)) return candidate;
154
150
  }
155
151
  }
156
- function sameTrackingSideEffect(node, type, triggerId) {
157
- if (flowCatalogEntry("side-effect", type)?.owners?.tagIds !== "tags") return null;
158
- const effects = Array.isArray(node.sideEffects) ? node.sideEffects : [];
159
- for (const raw of effects) {
160
- const effect = raw;
161
- if (effect?.type === type && effect.triggerId === triggerId) return effect;
162
- }
163
- return null;
164
- }
165
- function secondPixelHint(node, type, triggerId) {
166
- const already = sameTrackingSideEffect(node, type, triggerId);
167
- if (!already) return null;
168
- const event = typeof already.eventName === "string" ? ` with event "${already.eventName}"` : "";
169
- return `"${String(node.name ?? node.id)}" already reports \`${triggerId}\` to ${type} as "${String(already.id)}"${event}. Give this one a different event; to change that conversion, edit "${String(already.id)}" and delete this one \u2014 the same event to the same tag counts every conversion twice.`;
170
- }
171
152
  function pendingItem(target, nodeId, kind, sideEffectId) {
172
153
  return {
173
154
  target,
@@ -186,7 +167,7 @@ function configureHints(slug, nodeId, id, type, needsCard) {
186
167
  }
187
168
  registerSchema({
188
169
  command: "flows.add-side-effect",
189
- description: "Add a side effect to a step with a valid skeleton \u2014 encryptedConfig:null for a CRM, a tagIds slot for a pixel, and no oauthProviderId key. Then set where it sends with `baker flows connect` (an email: --email/--subject, written by you); only a typed secret goes to request_flow_input.",
170
+ description: "Add a side effect to a step with a valid skeleton \u2014 encryptedConfig:null for a CRM, a tagIds slot for a pixel, and no oauthProviderId key. Configure the confidential half with request_flow_input afterwards.",
190
171
  args: {
191
172
  slug: { type: "positional", description: "Form slug", required: true },
192
173
  node: { type: "string", description: "Id of the step that fires it", required: true },
@@ -258,7 +239,6 @@ var addSideEffectCommand = defineCommand({
258
239
  process.exit(1);
259
240
  }
260
241
  const triggerId = trigger.triggerId;
261
- const secondPixel = secondPixelHint(node, type, triggerId);
262
242
  const sideEffect = concrete(entry.skeleton, { id, triggerId });
263
243
  existing.push(sideEffect);
264
244
  writeFlowTree(slug, tree);
@@ -275,13 +255,12 @@ var addSideEffectCommand = defineCommand({
275
255
  ...needsUser.some(([, owner]) => owner === "tags") ? [
276
256
  `This reports the conversion to ${type}. It does NOT make Baker count anything: what Baker counts is a named event, set with \`baker analytics conversions --flow ${slug}\`. Do both \u2014 they are two different systems asked the same question.`
277
257
  ] : [],
278
- ...secondPixel ? [secondPixel] : [],
279
258
  ...configureHints(
280
259
  slug,
281
260
  String(node.id),
282
261
  id,
283
262
  type,
284
- needsUser.some(([, owner]) => owner === "request_flow_input" || owner === "connect")
263
+ needsUser.some(([, owner]) => owner === "request_flow_input")
285
264
  ),
286
265
  ...needsUser.some(([, owner]) => owner === "tags") ? [
287
266
  "Fill `tagIds` with a real ref from `baker tags list`, or stage the tag first with the `tags` skill. Never invent one."
@@ -296,8 +275,6 @@ export {
296
275
  addSideEffectCommand,
297
276
  freeSideEffectId,
298
277
  resolveTrigger,
299
- sameTrackingSideEffect,
300
- secondPixelHint,
301
278
  stepNameRefusal
302
279
  };
303
- //# sourceMappingURL=add-2BEGRHUX.js.map
280
+ //# sourceMappingURL=add-5GAN6CVO.js.map