@koda-sl/baker-cli 0.449.0-dev.bd86e5817 → 0.450.0-dev.b454c3dd2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -6
- package/dist/{account-AL2ZDSR7.js → account-XQXC7BR6.js} +5 -4
- package/dist/{account-AL2ZDSR7.js.map → account-XQXC7BR6.js.map} +1 -1
- package/dist/{accounts-HAFCLSR5.js → accounts-722UY53A.js} +4 -3
- package/dist/{accounts-HAFCLSR5.js.map → accounts-722UY53A.js.map} +1 -1
- package/dist/{accounts-O5MFO3QQ.js → accounts-E67BMK7T.js} +6 -5
- package/dist/{accounts-O5MFO3QQ.js.map → accounts-E67BMK7T.js.map} +1 -1
- package/dist/{actions-P35MEMGN.js → actions-6TQMSVWD.js} +18 -18
- package/dist/{add-5GAN6CVO.js → add-2BEGRHUX.js} +28 -5
- package/dist/add-2BEGRHUX.js.map +1 -0
- package/dist/{add-6DTC6X5G.js → add-LEMKEOPO.js} +3 -2
- package/dist/{add-6DTC6X5G.js.map → add-LEMKEOPO.js.map} +1 -1
- package/dist/{ads-73PGA4YC.js → ads-AGYCVD62.js} +4 -4
- package/dist/{advertisers-AE75CGVE.js → advertisers-2VQKAYKG.js} +4 -3
- package/dist/{advertisers-AE75CGVE.js.map → advertisers-2VQKAYKG.js.map} +1 -1
- package/dist/{analytics-FKCXIMPO.js → analytics-IFELDWLL.js} +24 -20
- package/dist/analytics-IFELDWLL.js.map +1 -0
- package/dist/{analytics-FPWQQGRM.js → analytics-OH5QEH7F.js} +4 -3
- package/dist/{analytics-FPWQQGRM.js.map → analytics-OH5QEH7F.js.map} +1 -1
- package/dist/{assign-ABN2AQ4J.js → assign-PTUJUCEL.js} +4 -3
- package/dist/{assign-ABN2AQ4J.js.map → assign-PTUJUCEL.js.map} +1 -1
- package/dist/{audience-size-GNBJY35X.js → audience-size-LRI6GJRT.js} +4 -3
- package/dist/{audience-size-GNBJY35X.js.map → audience-size-LRI6GJRT.js.map} +1 -1
- package/dist/{audit-3VS63TBW.js → audit-HWP7OPB7.js} +4 -3
- package/dist/{audit-3VS63TBW.js.map → audit-HWP7OPB7.js.map} +1 -1
- package/dist/{autocomplete-VS3XG3B7.js → autocomplete-J6DHU6MR.js} +4 -3
- package/dist/{autocomplete-VS3XG3B7.js.map → autocomplete-J6DHU6MR.js.map} +1 -1
- package/dist/{avatars-EKCKHCC3.js → avatars-467OSBD6.js} +4 -4
- package/dist/{bid-pricing-Q72B65AY.js → bid-pricing-EO5WLHGV.js} +4 -3
- package/dist/{bid-pricing-Q72B65AY.js.map → bid-pricing-EO5WLHGV.js.map} +1 -1
- package/dist/{brand-C6PFGGQN.js → brand-YRTEPGBK.js} +2 -2
- package/dist/{brief-YFJHQ5VQ.js → brief-OSFJ2V7F.js} +8 -7
- package/dist/{brief-YFJHQ5VQ.js.map → brief-OSFJ2V7F.js.map} +1 -1
- package/dist/{campaign-groups-KFFYQPU3.js → campaign-groups-PQ6KSQJR.js} +9 -8
- package/dist/{campaign-groups-KFFYQPU3.js.map → campaign-groups-PQ6KSQJR.js.map} +1 -1
- package/dist/{campaign-writes-FHOS5XZY.js → campaign-writes-5OVLUD5E.js} +4 -3
- package/dist/{campaign-writes-FHOS5XZY.js.map → campaign-writes-5OVLUD5E.js.map} +1 -1
- package/dist/{campaigns-2NHWBF5C.js → campaigns-6T3NSUT2.js} +12 -11
- package/dist/{campaigns-2NHWBF5C.js.map → campaigns-6T3NSUT2.js.map} +1 -1
- package/dist/{campaigns-KZYZTXDS.js → campaigns-OYMXDGWX.js} +5 -5
- package/dist/{canvas-UJNSHD3B.js → canvas-YQFG52IG.js} +13 -13
- package/dist/{capabilities-DJFTRJKS.js → capabilities-PXBKUN2G.js} +4 -3
- package/dist/{capabilities-DJFTRJKS.js.map → capabilities-PXBKUN2G.js.map} +1 -1
- package/dist/{catalog-ZQX6BGXS.js → catalog-XLXIM7IW.js} +4 -4
- package/dist/{chats-D2CSDX5Q.js → chats-UK47UE7C.js} +4 -3
- package/dist/{chats-D2CSDX5Q.js.map → chats-UK47UE7C.js.map} +1 -1
- package/dist/{chunk-7YCRFMXF.js → chunk-24EB7EDR.js} +3 -3
- package/dist/{chunk-5ZDLTE5T.js → chunk-2AOE2MZQ.js} +3 -3
- package/dist/{chunk-4SG4RW2P.js → chunk-2VPBIT65.js} +8 -8
- package/dist/chunk-4PDHHHUJ.js +537 -0
- package/dist/chunk-4PDHHHUJ.js.map +1 -0
- package/dist/{chunk-NPY4QUMQ.js → chunk-54C6YDGJ.js} +2 -2
- package/dist/{chunk-LZ73CZGP.js → chunk-5WCSKQ7Z.js} +6 -6
- package/dist/{chunk-3G3ZDLMI.js → chunk-5ZNTADVR.js} +2 -2
- package/dist/{chunk-AEOSAVVL.js → chunk-6F7DVPOS.js} +3 -3
- package/dist/{chunk-CJCVIEJ5.js → chunk-6NY2GPR4.js} +3 -3
- package/dist/{chunk-CXWFX2AM.js → chunk-6Y7ZBENQ.js} +6 -6
- package/dist/{chunk-M242LHLX.js → chunk-7CTMH5AK.js} +3 -3
- package/dist/{chunk-XF4JUKVF.js → chunk-7EPXVICM.js} +38 -5
- package/dist/chunk-7EPXVICM.js.map +1 -0
- package/dist/{chunk-T2PC5AVH.js → chunk-ASI4P6X2.js} +6 -6
- package/dist/chunk-ASI4P6X2.js.map +1 -0
- package/dist/{chunk-QD7ESRLN.js → chunk-C46GUI2S.js} +2 -2
- package/dist/{chunk-6N6WKAJM.js → chunk-CWYAELVG.js} +2 -2
- package/dist/{chunk-MXYBTMKB.js → chunk-DCRPXOJJ.js} +2 -2
- package/dist/{chunk-GKZ2WU75.js → chunk-FPOGPFAG.js} +3 -14
- package/dist/chunk-FPOGPFAG.js.map +1 -0
- package/dist/{chunk-JQJDXPCO.js → chunk-FUHN4MFY.js} +2 -2
- package/dist/{chunk-S77PZVYM.js → chunk-FYGR3I2A.js} +3 -3
- package/dist/{chunk-OZRUJVIQ.js → chunk-H3427GPU.js} +2 -2
- package/dist/{chunk-RPUSTYHL.js → chunk-HDLYPC6K.js} +5 -3
- package/dist/{chunk-RPUSTYHL.js.map → chunk-HDLYPC6K.js.map} +1 -1
- package/dist/{chunk-SSJK7FEV.js → chunk-HR6IWNKE.js} +1196 -1140
- package/dist/chunk-HR6IWNKE.js.map +1 -0
- package/dist/{chunk-YRQYA2LR.js → chunk-HROZYQ5H.js} +63 -5
- package/dist/chunk-HROZYQ5H.js.map +1 -0
- package/dist/{chunk-IR6D7K4H.js → chunk-I3ZR655O.js} +2 -2
- package/dist/{chunk-YK32GUBN.js → chunk-KMKEYI37.js} +3 -3
- package/dist/{chunk-W3ZHJJVT.js → chunk-KS2QY6MK.js} +4 -4
- package/dist/{chunk-WNRV4QH7.js → chunk-LYQJ4PZW.js} +5 -5
- package/dist/{chunk-B5SCU7MJ.js → chunk-MACCF4JZ.js} +16 -22
- package/dist/{chunk-B5SCU7MJ.js.map → chunk-MACCF4JZ.js.map} +1 -1
- package/dist/{chunk-CSYSX4D2.js → chunk-N4LAYIIN.js} +2 -2
- package/dist/{chunk-4AUMTNVB.js → chunk-NA63BH7V.js} +3 -3
- package/dist/{chunk-4BQXAE7Z.js → chunk-NDEE6G2J.js} +2 -2
- package/dist/{chunk-EDLZGTGN.js → chunk-NYIGXDUG.js} +1 -39
- package/dist/chunk-NYIGXDUG.js.map +1 -0
- package/dist/{chunk-DWHIOO7E.js → chunk-QE7W555R.js} +163 -12
- package/dist/chunk-QE7W555R.js.map +1 -0
- package/dist/{chunk-MELOSESI.js → chunk-R25YLW6H.js} +2 -2
- package/dist/{chunk-Y6O7EWYY.js → chunk-RL5CP7N6.js} +5 -5
- package/dist/{chunk-DGUNI37S.js → chunk-RX2DKU3W.js} +2 -2
- package/dist/{chunk-3HJLHTWP.js → chunk-SJYEY5MV.js} +12 -3
- package/dist/{chunk-3HJLHTWP.js.map → chunk-SJYEY5MV.js.map} +1 -1
- package/dist/{chunk-VTDMKARH.js → chunk-ULG4QRTV.js} +2 -2
- package/dist/{chunk-QRP3PXWN.js → chunk-VL43TNIP.js} +2 -2
- package/dist/{chunk-SHL7LOC3.js → chunk-VLMBTPXU.js} +3 -3
- package/dist/{chunk-KHRXPQID.js → chunk-VYQ3QJ3C.js} +2 -2
- package/dist/{chunk-A4LOJ2VD.js → chunk-WGUQHAJY.js} +2 -2
- package/dist/{chunk-ZEYEWPK6.js → chunk-WKQG6TER.js} +2 -2
- package/dist/{chunk-3IBYKLXR.js → chunk-ZDMTXQ2Q.js} +2 -2
- package/dist/{claim-FZ5OQLMU.js → claim-W6G6VEG5.js} +4 -3
- package/dist/{claim-FZ5OQLMU.js.map → claim-W6G6VEG5.js.map} +1 -1
- package/dist/cli.js +30 -30
- package/dist/{companies-DNI634RC.js → companies-TS6KBATJ.js} +4 -3
- package/dist/{companies-DNI634RC.js.map → companies-TS6KBATJ.js.map} +1 -1
- package/dist/{complete-2FZMGJV5.js → complete-LYR2HMQU.js} +4 -3
- package/dist/{complete-2FZMGJV5.js.map → complete-LYR2HMQU.js.map} +1 -1
- package/dist/{connect-QCOGEPP4.js → connect-FCXNVTXG.js} +13 -6
- package/dist/{conversation-6IOGV7B7.js → conversation-6ZJGPCXM.js} +4 -3
- package/dist/{conversation-6IOGV7B7.js.map → conversation-6ZJGPCXM.js.map} +1 -1
- package/dist/{conversions-4SRZPBBX.js → conversions-UHB55MMQ.js} +8 -7
- package/dist/{conversions-4SRZPBBX.js.map → conversions-UHB55MMQ.js.map} +1 -1
- package/dist/{create-BJNMO6HT.js → create-EX6OWLNM.js} +3 -2
- package/dist/{create-BJNMO6HT.js.map → create-EX6OWLNM.js.map} +1 -1
- package/dist/{create-RM7HV77Y.js → create-JCA7JPLP.js} +4 -3
- package/dist/{create-RM7HV77Y.js.map → create-JCA7JPLP.js.map} +1 -1
- package/dist/{create-FX4OJ2XF.js → create-JFSK4BOP.js} +4 -3
- package/dist/{create-FX4OJ2XF.js.map → create-JFSK4BOP.js.map} +1 -1
- package/dist/{create-VXM34ZWH.js → create-WU22YYU2.js} +4 -3
- package/dist/{create-VXM34ZWH.js.map → create-WU22YYU2.js.map} +1 -1
- package/dist/{creatives-NJF2U763.js → creatives-FXUQ5WSD.js} +10 -10
- package/dist/{creatives-JSWBFQ5R.js → creatives-KGXUOYPE.js} +9 -8
- package/dist/{creatives-JSWBFQ5R.js.map → creatives-KGXUOYPE.js.map} +1 -1
- package/dist/{credentials-C33K6XCJ.js → credentials-MJC7PGKR.js} +4 -3
- package/dist/{credentials-C33K6XCJ.js.map → credentials-MJC7PGKR.js.map} +1 -1
- package/dist/{critique-YDKPYZLD.js → critique-GS5VV5ZC.js} +7 -6
- package/dist/{critique-YDKPYZLD.js.map → critique-GS5VV5ZC.js.map} +1 -1
- package/dist/{critique-ZS4ON3SU.js → critique-TPHR27KH.js} +4 -3
- package/dist/{critique-ZS4ON3SU.js.map → critique-TPHR27KH.js.map} +1 -1
- package/dist/{crm-R5IXIFIV.js → crm-AVCM5D4G.js} +5 -4
- package/dist/{crm-R5IXIFIV.js.map → crm-AVCM5D4G.js.map} +1 -1
- package/dist/{crm-52ROSWH5.js → crm-VK44O3ED.js} +5 -4
- package/dist/{crm-52ROSWH5.js.map → crm-VK44O3ED.js.map} +1 -1
- package/dist/{customers-A36LOZOB.js → customers-XH2DMTFH.js} +6 -5
- package/dist/{delete-M2GDLPYN.js → delete-E3R3TKIL.js} +3 -2
- package/dist/{delete-M2GDLPYN.js.map → delete-E3R3TKIL.js.map} +1 -1
- package/dist/{delete-HGHXY24R.js → delete-KRH2YMSZ.js} +4 -3
- package/dist/{delete-HGHXY24R.js.map → delete-KRH2YMSZ.js.map} +1 -1
- package/dist/{delete-AIGE4Y4H.js → delete-WI5E3DR3.js} +4 -3
- package/dist/{delete-AIGE4Y4H.js.map → delete-WI5E3DR3.js.map} +1 -1
- package/dist/{demographics-NTWB2IMG.js → demographics-XV5PBA77.js} +4 -3
- package/dist/{demographics-NTWB2IMG.js.map → demographics-XV5PBA77.js.map} +1 -1
- package/dist/{discard-2WWQG6OU.js → discard-HTQUUHJR.js} +4 -3
- package/dist/{discard-2WWQG6OU.js.map → discard-HTQUUHJR.js.map} +1 -1
- package/dist/{domain-Y2LT6JLT.js → domain-RECGZXJB.js} +4 -3
- package/dist/{domain-Y2LT6JLT.js.map → domain-RECGZXJB.js.map} +1 -1
- package/dist/{draft-SLHAKJ2A.js → draft-2IBSJEKC.js} +4 -3
- package/dist/{draft-SLHAKJ2A.js.map → draft-2IBSJEKC.js.map} +1 -1
- package/dist/{draft-FJ7WHIXW.js → draft-PVTX6QT6.js} +4 -3
- package/dist/{draft-FJ7WHIXW.js.map → draft-PVTX6QT6.js.map} +1 -1
- package/dist/{draft-EJXNNJ3Y.js → draft-Q546QPPU.js} +5 -4
- package/dist/{draft-EJXNNJ3Y.js.map → draft-Q546QPPU.js.map} +1 -1
- package/dist/engine/index.js +3 -3
- package/dist/{facets-U7AQC4H6.js → facets-7EVPJMKS.js} +4 -3
- package/dist/{facets-U7AQC4H6.js.map → facets-7EVPJMKS.js.map} +1 -1
- package/dist/{feedback-PPQMOQ46.js → feedback-EIZKS4JU.js} +2 -2
- package/dist/{feedback-record-V66HWVRR.js → feedback-record-TKO54BOE.js} +9 -8
- package/dist/{feedback-record-V66HWVRR.js.map → feedback-record-TKO54BOE.js.map} +1 -1
- package/dist/{fetch-W7NULDEO.js → fetch-4BY6HYUM.js} +4 -3
- package/dist/{fetch-W7NULDEO.js.map → fetch-4BY6HYUM.js.map} +1 -1
- package/dist/{find-OTDIX6V4.js → find-FRRHAPWX.js} +4 -4
- package/dist/{flows-KABCBS3S.js → flows-KTFAML22.js} +21 -17
- package/dist/flows-KTFAML22.js.map +1 -0
- package/dist/{fonts-EMMX3KII.js → fonts-MXR3ZKDX.js} +6 -5
- package/dist/{forecast-GNODEIIC.js → forecast-3QTJYVND.js} +4 -3
- package/dist/{forecast-GNODEIIC.js.map → forecast-3QTJYVND.js.map} +1 -1
- package/dist/{funnel-AAX27NH4.js → funnel-I6XIAEHG.js} +11 -455
- package/dist/funnel-I6XIAEHG.js.map +1 -0
- package/dist/{ga4-UDQ2HA2J.js → ga4-DV2AXCSL.js} +1 -1
- package/dist/{get-QEYJRLV3.js → get-5PKNKJ5S.js} +7 -4
- package/dist/get-5PKNKJ5S.js.map +1 -0
- package/dist/{get-RTVUZM6E.js → get-72YPHJGV.js} +4 -3
- package/dist/{get-RTVUZM6E.js.map → get-72YPHJGV.js.map} +1 -1
- package/dist/{google-M7KEXVK5.js → google-6OGZX47I.js} +2 -2
- package/dist/{google-KTO3PLEU.js → google-QYYYSSXI.js} +5 -5
- package/dist/{google-ads-OK6IG3UV.js → google-ads-QGMQKZQD.js} +4 -3
- package/dist/{google-ads-OK6IG3UV.js.map → google-ads-QGMQKZQD.js.map} +1 -1
- package/dist/{gsc-P3QYGDV2.js → gsc-TAKOF7J5.js} +1 -1
- package/dist/{history-PQUJKK26.js → history-6AVQX2OQ.js} +4 -3
- package/dist/{history-PQUJKK26.js.map → history-6AVQX2OQ.js.map} +1 -1
- package/dist/{hubspot-Y77VLY6Y.js → hubspot-SVEMFK5S.js} +9 -8
- package/dist/{hubspot-Y77VLY6Y.js.map → hubspot-SVEMFK5S.js.map} +1 -1
- package/dist/{icon-I43F77FV.js → icon-L4RSS6PZ.js} +4 -4
- package/dist/{ideas-MIDU7YOA.js → ideas-NFOW3HKJ.js} +3 -2
- package/dist/{images-S254MS6O.js → images-2EFFUNNV.js} +9 -9
- package/dist/{ingest-YV2NLDBE.js → ingest-2EIKN4QC.js} +4 -3
- package/dist/{ingest-J4I3HKM3.js → ingest-2SO62RRI.js} +3 -2
- package/dist/{ingest-J4I3HKM3.js.map → ingest-2SO62RRI.js.map} +1 -1
- package/dist/{inspect-Q5NHBBHX.js → inspect-4OOS4APT.js} +4 -3
- package/dist/{inspect-Q5NHBBHX.js.map → inspect-4OOS4APT.js.map} +1 -1
- package/dist/{inspiration-P265QJ2H.js → inspiration-S3DU4CMQ.js} +1 -1
- package/dist/{keyword-metrics-PDY4ZXSP.js → keyword-metrics-SF4CSNZ2.js} +4 -3
- package/dist/{keyword-metrics-PDY4ZXSP.js.map → keyword-metrics-SF4CSNZ2.js.map} +1 -1
- package/dist/{keywords-for-site-GALSCV77.js → keywords-for-site-WDAOPNKC.js} +4 -3
- package/dist/{keywords-for-site-GALSCV77.js.map → keywords-for-site-WDAOPNKC.js.map} +1 -1
- package/dist/{landing-CJYGWCK4.js → landing-2ZB46LXH.js} +3 -3
- package/dist/{leads-PHKG6CP3.js → leads-A4W5KTWB.js} +4 -3
- package/dist/{leads-PHKG6CP3.js.map → leads-A4W5KTWB.js.map} +1 -1
- package/dist/{learn-FUQSY7DN.js → learn-IPULBCOD.js} +5 -4
- package/dist/{learn-FUQSY7DN.js.map → learn-IPULBCOD.js.map} +1 -1
- package/dist/{line-item-writes-E6MZPIZZ.js → line-item-writes-EMYSOJKM.js} +4 -3
- package/dist/{line-item-writes-E6MZPIZZ.js.map → line-item-writes-EMYSOJKM.js.map} +1 -1
- package/dist/{line-items-7ZGIKEF2.js → line-items-5NECXUZT.js} +5 -5
- package/dist/{link-QYAW6A2W.js → link-CI45HWFN.js} +4 -3
- package/dist/{link-QYAW6A2W.js.map → link-CI45HWFN.js.map} +1 -1
- package/dist/{linkedin-FFSDSGGS.js → linkedin-B7SYR75X.js} +27 -26
- package/dist/{linkedin-FFSDSGGS.js.map → linkedin-B7SYR75X.js.map} +1 -1
- package/dist/{list-NVQC5SNY.js → list-2BARXOT5.js} +3 -2
- package/dist/{list-NVQC5SNY.js.map → list-2BARXOT5.js.map} +1 -1
- package/dist/{list-SAV3LQHY.js → list-BIEVLEHS.js} +4 -3
- package/dist/{list-SAV3LQHY.js.map → list-BIEVLEHS.js.map} +1 -1
- package/dist/{list-5IC6KIKO.js → list-ZBT3EBVZ.js} +4 -3
- package/dist/{list-5IC6KIKO.js.map → list-ZBT3EBVZ.js.map} +1 -1
- package/dist/{log-XZPVOALD.js → log-C23OOAJZ.js} +4 -3
- package/dist/{log-XZPVOALD.js.map → log-C23OOAJZ.js.map} +1 -1
- package/dist/{logo-2IP663QO.js → logo-Q5D7PZY6.js} +3 -3
- package/dist/{lookup-XK45W2SH.js → lookup-ETWY47F7.js} +6 -5
- package/dist/{make-J3WBO62B.js → make-TPKKJXGL.js} +18 -17
- package/dist/{make-J3WBO62B.js.map → make-TPKKJXGL.js.map} +1 -1
- package/dist/{map-4J5WIWIG.js → map-SYZMPHLL.js} +5 -4
- package/dist/{map-4J5WIWIG.js.map → map-SYZMPHLL.js.map} +1 -1
- package/dist/{mcp-XXD7ZQCP.js → mcp-6FQBVJ6F.js} +3 -2
- package/dist/{mcp-XXD7ZQCP.js.map → mcp-6FQBVJ6F.js.map} +1 -1
- package/dist/{media-sources-O6ZRUA3N.js → media-sources-ZXHEEP6T.js} +2 -2
- package/dist/{members-D5ZYLS4Y.js → members-UDY4OOJW.js} +4 -3
- package/dist/{members-D5ZYLS4Y.js.map → members-UDY4OOJW.js.map} +1 -1
- package/dist/{normalize-PCNC6E2N.js → normalize-DAKHYS3V.js} +7 -3
- package/dist/{normalize-PCNC6E2N.js.map → normalize-DAKHYS3V.js.map} +1 -1
- package/dist/{options-MQ65VEVD.js → options-QL3ULED5.js} +7 -6
- package/dist/{options-MQ65VEVD.js.map → options-QL3ULED5.js.map} +1 -1
- package/dist/{performance-6QW2KEEQ.js → performance-UF5VTY2U.js} +5 -4
- package/dist/plan-FT632COT.js +51 -0
- package/dist/plan-FT632COT.js.map +1 -0
- package/dist/{promoted-tweet-writes-JPLHY3GM.js → promoted-tweet-writes-7HGESJ46.js} +4 -3
- package/dist/{promoted-tweet-writes-JPLHY3GM.js.map → promoted-tweet-writes-7HGESJ46.js.map} +1 -1
- package/dist/{promoted-tweets-SURKMHFI.js → promoted-tweets-LZKS5JIF.js} +3 -3
- package/dist/{publish-HCQ6MXLB.js → publish-NPD3SMZL.js} +4 -3
- package/dist/{publish-HCQ6MXLB.js.map → publish-NPD3SMZL.js.map} +1 -1
- package/dist/questionnaire-JNGYJTAY.js +37 -0
- package/dist/questionnaire-JNGYJTAY.js.map +1 -0
- package/dist/{reddit-GIP3ADMS.js → reddit-NU2N3LZD.js} +5 -4
- package/dist/{refresh-UXQSLCR3.js → refresh-EBVJ2C6L.js} +3 -2
- package/dist/{refresh-UXQSLCR3.js.map → refresh-EBVJ2C6L.js.map} +1 -1
- package/dist/{release-5KVLXNP6.js → release-V43YB2PY.js} +4 -3
- package/dist/{release-5KVLXNP6.js.map → release-V43YB2PY.js.map} +1 -1
- package/dist/{remove-6FIVKCJI.js → remove-QPSWLFI4.js} +3 -2
- package/dist/{remove-6FIVKCJI.js.map → remove-QPSWLFI4.js.map} +1 -1
- package/dist/{reopen-YM5LNOLB.js → reopen-GQ66NMWF.js} +4 -3
- package/dist/{reopen-YM5LNOLB.js.map → reopen-GQ66NMWF.js.map} +1 -1
- package/dist/{rerun-WYDRHIUJ.js → rerun-PZK275DY.js} +18 -17
- package/dist/{rerun-WYDRHIUJ.js.map → rerun-PZK275DY.js.map} +1 -1
- package/dist/{research-2BLEISBG.js → research-FMM6AWZC.js} +10 -10
- package/dist/{research-YOGE7GT2.js → research-GEOCUBXB.js} +3 -2
- package/dist/{research-YOGE7GT2.js.map → research-GEOCUBXB.js.map} +1 -1
- package/dist/{reset-C4UHQ3EU.js → reset-REXJ6AUK.js} +3 -2
- package/dist/{reset-C4UHQ3EU.js.map → reset-REXJ6AUK.js.map} +1 -1
- package/dist/{reset-OLVB6AE6.js → reset-Y72IVESB.js} +3 -2
- package/dist/{reset-OLVB6AE6.js.map → reset-Y72IVESB.js.map} +1 -1
- package/dist/{resolve-XYH2GDAE.js → resolve-OGX7C4TV.js} +4 -3
- package/dist/{resolve-XYH2GDAE.js.map → resolve-OGX7C4TV.js.map} +1 -1
- package/dist/{retry-7EELDEQP.js → retry-CD6JAQ3F.js} +3 -2
- package/dist/{retry-7EELDEQP.js.map → retry-CD6JAQ3F.js.map} +1 -1
- package/dist/{retry-726GKI6V.js → retry-TCUBBFR5.js} +3 -2
- package/dist/{retry-726GKI6V.js.map → retry-TCUBBFR5.js.map} +1 -1
- package/dist/{run-P4KR2MXC.js → run-A5ZDXTOI.js} +4 -3
- package/dist/{run-P4KR2MXC.js.map → run-A5ZDXTOI.js.map} +1 -1
- package/dist/{run-MODGUNGT.js → run-EUO34T2J.js} +18 -17
- package/dist/{scaffold-ad-5ZE7KE62.js → scaffold-ad-SW2HEWM3.js} +13 -12
- package/dist/{scaffold-ad-5ZE7KE62.js.map → scaffold-ad-SW2HEWM3.js.map} +1 -1
- package/dist/{scaffold-static-ad-HJY5HFDL.js → scaffold-static-ad-ECTJL54Y.js} +37 -36
- package/dist/scaffold-static-ad-ECTJL54Y.js.map +1 -0
- package/dist/{scaffold-video-P2PYPWG2.js → scaffold-video-EI7U7RBK.js} +12 -11
- package/dist/{scaffold-video-P2PYPWG2.js.map → scaffold-video-EI7U7RBK.js.map} +1 -1
- package/dist/{schedule-RDK4GEPI.js → schedule-S5YZJZ5U.js} +3 -2
- package/dist/{schedule-RDK4GEPI.js.map → schedule-S5YZJZ5U.js.map} +1 -1
- package/dist/{scheduled-agents-6U44QE76.js → scheduled-agents-N4LJRM4C.js} +11 -11
- package/dist/{schema-CHJDC7GQ.js → schema-R7JWWOF4.js} +8 -4
- package/dist/{schema-CHJDC7GQ.js.map → schema-R7JWWOF4.js.map} +1 -1
- package/dist/{search-PMJRU3C4.js → search-KHMQH3AT.js} +3 -2
- package/dist/{search-PMJRU3C4.js.map → search-KHMQH3AT.js.map} +1 -1
- package/dist/{select-AB2L4GAA.js → select-O2FN2JEQ.js} +9 -8
- package/dist/{select-AB2L4GAA.js.map → select-O2FN2JEQ.js.map} +1 -1
- package/dist/{sends-WGJVQUMF.js → sends-BQZM5PLS.js} +5 -4
- package/dist/{sends-WGJVQUMF.js.map → sends-BQZM5PLS.js.map} +1 -1
- package/dist/{set-prompt-DU2G2WTB.js → set-prompt-2HASHGWC.js} +9 -8
- package/dist/{set-prompt-DU2G2WTB.js.map → set-prompt-2HASHGWC.js.map} +1 -1
- package/dist/{setup-links-REPREN3C.js → setup-links-GYSE56GX.js} +4 -3
- package/dist/{setup-links-REPREN3C.js.map → setup-links-GYSE56GX.js.map} +1 -1
- package/dist/{site-WFSWIA3S.js → site-4SKM7RKG.js} +5 -4
- package/dist/{site-WFSWIA3S.js.map → site-4SKM7RKG.js.map} +1 -1
- package/dist/{sources-YBQ6KPFM.js → sources-FQ2UZTHL.js} +6 -6
- package/dist/{sources-AMI2AWKZ.js → sources-R2NKNC6J.js} +10 -9
- package/dist/{sources-AMI2AWKZ.js.map → sources-R2NKNC6J.js.map} +1 -1
- package/dist/{stale-6MJHVEG4.js → stale-W756ACKC.js} +8 -7
- package/dist/{stale-6MJHVEG4.js.map → stale-W756ACKC.js.map} +1 -1
- package/dist/{status-7F2KHFGA.js → status-SE2VZJJB.js} +4 -3
- package/dist/{status-7F2KHFGA.js.map → status-SE2VZJJB.js.map} +1 -1
- package/dist/{stock-2YCDN3N6.js → stock-KXJ26BY4.js} +5 -5
- package/dist/{studio-RA7QQH4O.js → studio-SYKOSNDB.js} +1 -1
- package/dist/{sync-GWTLKZTU.js → sync-LJGSODK3.js} +3 -2
- package/dist/{sync-GWTLKZTU.js.map → sync-LJGSODK3.js.map} +1 -1
- package/dist/{sync-definition-IPUFS5XS.js → sync-definition-QR2N233R.js} +12 -11
- package/dist/{tags-KFYLZLB3.js → tags-4BAVFH4S.js} +3 -2
- package/dist/{tags-KFYLZLB3.js.map → tags-4BAVFH4S.js.map} +1 -1
- package/dist/{tags-ABHSX6M5.js → tags-5SBMRC2A.js} +4 -3
- package/dist/{tags-ABHSX6M5.js.map → tags-5SBMRC2A.js.map} +1 -1
- package/dist/{tags-3WPW6PTV.js → tags-PYWFSBTR.js} +4 -4
- package/dist/{tags-6342FQEB.js → tags-QQU3OKMZ.js} +4 -3
- package/dist/{tags-6342FQEB.js.map → tags-QQU3OKMZ.js.map} +1 -1
- package/dist/{tags-FJIBBBRG.js → tags-YYLNF3PK.js} +4 -3
- package/dist/{tags-FJIBBBRG.js.map → tags-YYLNF3PK.js.map} +1 -1
- package/dist/{targeting-criteria-NR47AF5C.js → targeting-criteria-RJFLFICN.js} +3 -3
- package/dist/{targets-L56KOVQE.js → targets-S2MT2PNB.js} +4 -3
- package/dist/{targets-L56KOVQE.js.map → targets-S2MT2PNB.js.map} +1 -1
- package/dist/{templates-B6XGDYUF.js → templates-ZE5TOGRT.js} +4 -3
- package/dist/{templates-B6XGDYUF.js.map → templates-ZE5TOGRT.js.map} +1 -1
- package/dist/{testimonials-CVC4YIXO.js → testimonials-DII5DYLR.js} +6 -6
- package/dist/{top-companies-45X3DT7Z.js → top-companies-PGIAEHDF.js} +4 -3
- package/dist/{top-companies-45X3DT7Z.js.map → top-companies-PGIAEHDF.js.map} +1 -1
- package/dist/{translate-Z66FDB4K.js → translate-GXTS633J.js} +12 -11
- package/dist/{translate-Z66FDB4K.js.map → translate-GXTS633J.js.map} +1 -1
- package/dist/{triggers-22EMIVFD.js → triggers-2PTONXRU.js} +4 -3
- package/dist/{triggers-22EMIVFD.js.map → triggers-2PTONXRU.js.map} +1 -1
- package/dist/{unlink-65KUN6ID.js → unlink-XRMYJ6DB.js} +4 -3
- package/dist/{unlink-65KUN6ID.js.map → unlink-XRMYJ6DB.js.map} +1 -1
- package/dist/{unstage-2E3I5SWF.js → unstage-FY7A3YFF.js} +4 -3
- package/dist/{unstage-2E3I5SWF.js.map → unstage-FY7A3YFF.js.map} +1 -1
- package/dist/{unstage-4ZEULXEQ.js → unstage-RM2RLXKD.js} +5 -4
- package/dist/{unstage-4ZEULXEQ.js.map → unstage-RM2RLXKD.js.map} +1 -1
- package/dist/{update-KREBPGBH.js → update-E5SRBXQR.js} +4 -3
- package/dist/{update-KREBPGBH.js.map → update-E5SRBXQR.js.map} +1 -1
- package/dist/{update-D6DJC6T7.js → update-PJ67D2OG.js} +3 -2
- package/dist/{update-D6DJC6T7.js.map → update-PJ67D2OG.js.map} +1 -1
- package/dist/{update-2S7CSEAW.js → update-S4562V3O.js} +4 -3
- package/dist/{update-2S7CSEAW.js.map → update-S4562V3O.js.map} +1 -1
- package/dist/{update-7NCOTAQZ.js → update-V6YVEUI2.js} +4 -3
- package/dist/{update-7NCOTAQZ.js.map → update-V6YVEUI2.js.map} +1 -1
- package/dist/{upload-O6NHRPS7.js → upload-R6CQVLKF.js} +4 -3
- package/dist/{upload-O6NHRPS7.js.map → upload-R6CQVLKF.js.map} +1 -1
- package/dist/{url-options-GGXAL3J4.js → url-options-JOKU46F2.js} +4 -3
- package/dist/{url-options-GGXAL3J4.js.map → url-options-JOKU46F2.js.map} +1 -1
- package/dist/{url-params-3EFGVTZZ.js → url-params-7U2XMOWF.js} +4 -3
- package/dist/{url-params-3EFGVTZZ.js.map → url-params-7U2XMOWF.js.map} +1 -1
- package/dist/{validate-UMHHNTVU.js → validate-7YPOUKPB.js} +10 -9
- package/dist/{validate-UMHHNTVU.js.map → validate-7YPOUKPB.js.map} +1 -1
- package/dist/{videos-YSXYGTBM.js → videos-LICG6ACJ.js} +5 -5
- package/dist/{web-IGIGVEKS.js → web-BA2PGTWU.js} +4 -3
- package/dist/{web-IGIGVEKS.js.map → web-BA2PGTWU.js.map} +1 -1
- package/dist/{winning-ads-2WS7FI4E.js → winning-ads-C6S2C5VP.js} +2 -2
- package/dist/{write-commands-5C7FUOVN.js → write-commands-7SJ3BOW5.js} +5 -4
- package/dist/{write-commands-5C7FUOVN.js.map → write-commands-7SJ3BOW5.js.map} +1 -1
- package/dist/{x-BFSKFCZD.js → x-CZHRC6U7.js} +6 -6
- package/package.json +1 -1
- package/dist/add-5GAN6CVO.js.map +0 -1
- package/dist/analytics-FKCXIMPO.js.map +0 -1
- package/dist/chunk-DWHIOO7E.js.map +0 -1
- package/dist/chunk-EDLZGTGN.js.map +0 -1
- package/dist/chunk-GKZ2WU75.js.map +0 -1
- package/dist/chunk-SSJK7FEV.js.map +0 -1
- package/dist/chunk-T2PC5AVH.js.map +0 -1
- package/dist/chunk-XF4JUKVF.js.map +0 -1
- package/dist/chunk-YRQYA2LR.js.map +0 -1
- package/dist/flows-KABCBS3S.js.map +0 -1
- package/dist/funnel-AAX27NH4.js.map +0 -1
- package/dist/get-QEYJRLV3.js.map +0 -1
- package/dist/scaffold-static-ad-HJY5HFDL.js.map +0 -1
- /package/dist/{actions-P35MEMGN.js.map → actions-6TQMSVWD.js.map} +0 -0
- /package/dist/{ads-73PGA4YC.js.map → ads-AGYCVD62.js.map} +0 -0
- /package/dist/{avatars-EKCKHCC3.js.map → avatars-467OSBD6.js.map} +0 -0
- /package/dist/{brand-C6PFGGQN.js.map → brand-YRTEPGBK.js.map} +0 -0
- /package/dist/{campaigns-KZYZTXDS.js.map → campaigns-OYMXDGWX.js.map} +0 -0
- /package/dist/{canvas-UJNSHD3B.js.map → canvas-YQFG52IG.js.map} +0 -0
- /package/dist/{catalog-ZQX6BGXS.js.map → catalog-XLXIM7IW.js.map} +0 -0
- /package/dist/{chunk-7YCRFMXF.js.map → chunk-24EB7EDR.js.map} +0 -0
- /package/dist/{chunk-5ZDLTE5T.js.map → chunk-2AOE2MZQ.js.map} +0 -0
- /package/dist/{chunk-4SG4RW2P.js.map → chunk-2VPBIT65.js.map} +0 -0
- /package/dist/{chunk-NPY4QUMQ.js.map → chunk-54C6YDGJ.js.map} +0 -0
- /package/dist/{chunk-LZ73CZGP.js.map → chunk-5WCSKQ7Z.js.map} +0 -0
- /package/dist/{chunk-3G3ZDLMI.js.map → chunk-5ZNTADVR.js.map} +0 -0
- /package/dist/{chunk-AEOSAVVL.js.map → chunk-6F7DVPOS.js.map} +0 -0
- /package/dist/{chunk-CJCVIEJ5.js.map → chunk-6NY2GPR4.js.map} +0 -0
- /package/dist/{chunk-CXWFX2AM.js.map → chunk-6Y7ZBENQ.js.map} +0 -0
- /package/dist/{chunk-M242LHLX.js.map → chunk-7CTMH5AK.js.map} +0 -0
- /package/dist/{chunk-QD7ESRLN.js.map → chunk-C46GUI2S.js.map} +0 -0
- /package/dist/{chunk-6N6WKAJM.js.map → chunk-CWYAELVG.js.map} +0 -0
- /package/dist/{chunk-MXYBTMKB.js.map → chunk-DCRPXOJJ.js.map} +0 -0
- /package/dist/{chunk-JQJDXPCO.js.map → chunk-FUHN4MFY.js.map} +0 -0
- /package/dist/{chunk-S77PZVYM.js.map → chunk-FYGR3I2A.js.map} +0 -0
- /package/dist/{chunk-OZRUJVIQ.js.map → chunk-H3427GPU.js.map} +0 -0
- /package/dist/{chunk-IR6D7K4H.js.map → chunk-I3ZR655O.js.map} +0 -0
- /package/dist/{chunk-YK32GUBN.js.map → chunk-KMKEYI37.js.map} +0 -0
- /package/dist/{chunk-W3ZHJJVT.js.map → chunk-KS2QY6MK.js.map} +0 -0
- /package/dist/{chunk-WNRV4QH7.js.map → chunk-LYQJ4PZW.js.map} +0 -0
- /package/dist/{chunk-CSYSX4D2.js.map → chunk-N4LAYIIN.js.map} +0 -0
- /package/dist/{chunk-4AUMTNVB.js.map → chunk-NA63BH7V.js.map} +0 -0
- /package/dist/{chunk-4BQXAE7Z.js.map → chunk-NDEE6G2J.js.map} +0 -0
- /package/dist/{chunk-MELOSESI.js.map → chunk-R25YLW6H.js.map} +0 -0
- /package/dist/{chunk-Y6O7EWYY.js.map → chunk-RL5CP7N6.js.map} +0 -0
- /package/dist/{chunk-DGUNI37S.js.map → chunk-RX2DKU3W.js.map} +0 -0
- /package/dist/{chunk-VTDMKARH.js.map → chunk-ULG4QRTV.js.map} +0 -0
- /package/dist/{chunk-QRP3PXWN.js.map → chunk-VL43TNIP.js.map} +0 -0
- /package/dist/{chunk-SHL7LOC3.js.map → chunk-VLMBTPXU.js.map} +0 -0
- /package/dist/{chunk-KHRXPQID.js.map → chunk-VYQ3QJ3C.js.map} +0 -0
- /package/dist/{chunk-A4LOJ2VD.js.map → chunk-WGUQHAJY.js.map} +0 -0
- /package/dist/{chunk-ZEYEWPK6.js.map → chunk-WKQG6TER.js.map} +0 -0
- /package/dist/{chunk-3IBYKLXR.js.map → chunk-ZDMTXQ2Q.js.map} +0 -0
- /package/dist/{connect-QCOGEPP4.js.map → connect-FCXNVTXG.js.map} +0 -0
- /package/dist/{creatives-NJF2U763.js.map → creatives-FXUQ5WSD.js.map} +0 -0
- /package/dist/{customers-A36LOZOB.js.map → customers-XH2DMTFH.js.map} +0 -0
- /package/dist/{feedback-PPQMOQ46.js.map → feedback-EIZKS4JU.js.map} +0 -0
- /package/dist/{find-OTDIX6V4.js.map → find-FRRHAPWX.js.map} +0 -0
- /package/dist/{fonts-EMMX3KII.js.map → fonts-MXR3ZKDX.js.map} +0 -0
- /package/dist/{ga4-UDQ2HA2J.js.map → ga4-DV2AXCSL.js.map} +0 -0
- /package/dist/{google-M7KEXVK5.js.map → google-6OGZX47I.js.map} +0 -0
- /package/dist/{google-KTO3PLEU.js.map → google-QYYYSSXI.js.map} +0 -0
- /package/dist/{gsc-P3QYGDV2.js.map → gsc-TAKOF7J5.js.map} +0 -0
- /package/dist/{icon-I43F77FV.js.map → icon-L4RSS6PZ.js.map} +0 -0
- /package/dist/{ideas-MIDU7YOA.js.map → ideas-NFOW3HKJ.js.map} +0 -0
- /package/dist/{images-S254MS6O.js.map → images-2EFFUNNV.js.map} +0 -0
- /package/dist/{ingest-YV2NLDBE.js.map → ingest-2EIKN4QC.js.map} +0 -0
- /package/dist/{inspiration-P265QJ2H.js.map → inspiration-S3DU4CMQ.js.map} +0 -0
- /package/dist/{landing-CJYGWCK4.js.map → landing-2ZB46LXH.js.map} +0 -0
- /package/dist/{line-items-7ZGIKEF2.js.map → line-items-5NECXUZT.js.map} +0 -0
- /package/dist/{logo-2IP663QO.js.map → logo-Q5D7PZY6.js.map} +0 -0
- /package/dist/{lookup-XK45W2SH.js.map → lookup-ETWY47F7.js.map} +0 -0
- /package/dist/{media-sources-O6ZRUA3N.js.map → media-sources-ZXHEEP6T.js.map} +0 -0
- /package/dist/{performance-6QW2KEEQ.js.map → performance-UF5VTY2U.js.map} +0 -0
- /package/dist/{promoted-tweets-SURKMHFI.js.map → promoted-tweets-LZKS5JIF.js.map} +0 -0
- /package/dist/{reddit-GIP3ADMS.js.map → reddit-NU2N3LZD.js.map} +0 -0
- /package/dist/{research-2BLEISBG.js.map → research-FMM6AWZC.js.map} +0 -0
- /package/dist/{run-MODGUNGT.js.map → run-EUO34T2J.js.map} +0 -0
- /package/dist/{scheduled-agents-6U44QE76.js.map → scheduled-agents-N4LJRM4C.js.map} +0 -0
- /package/dist/{sources-YBQ6KPFM.js.map → sources-FQ2UZTHL.js.map} +0 -0
- /package/dist/{stock-2YCDN3N6.js.map → stock-KXJ26BY4.js.map} +0 -0
- /package/dist/{studio-RA7QQH4O.js.map → studio-SYKOSNDB.js.map} +0 -0
- /package/dist/{sync-definition-IPUFS5XS.js.map → sync-definition-QR2N233R.js.map} +0 -0
- /package/dist/{tags-3WPW6PTV.js.map → tags-PYWFSBTR.js.map} +0 -0
- /package/dist/{targeting-criteria-NR47AF5C.js.map → targeting-criteria-RJFLFICN.js.map} +0 -0
- /package/dist/{testimonials-CVC4YIXO.js.map → testimonials-DII5DYLR.js.map} +0 -0
- /package/dist/{videos-YSXYGTBM.js.map → videos-LICG6ACJ.js.map} +0 -0
- /package/dist/{winning-ads-2WS7FI4E.js.map → winning-ads-C6S2C5VP.js.map} +0 -0
- /package/dist/{x-BFSKFCZD.js.map → x-CZHRC6U7.js.map} +0 -0
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
import {
|
|
7
7
|
LINKEDIN_SEARCH_STATUSES,
|
|
8
8
|
unsupportedLinkedinSearchStatuses
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-7EPXVICM.js";
|
|
10
10
|
import {
|
|
11
11
|
ApiError
|
|
12
12
|
} from "./chunk-XBOK23HI.js";
|
|
@@ -172,4 +172,4 @@ export {
|
|
|
172
172
|
statusesArgDescription,
|
|
173
173
|
resolveStatusFilter
|
|
174
174
|
};
|
|
175
|
-
//# sourceMappingURL=chunk-
|
|
175
|
+
//# sourceMappingURL=chunk-N4LAYIIN.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
handleLinkedinError,
|
|
3
3
|
resolveAccountIdArg
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-N4LAYIIN.js";
|
|
5
5
|
import {
|
|
6
6
|
adCopyHints,
|
|
7
7
|
booleanWordPositionalError,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
import {
|
|
17
17
|
LINKEDIN_DRAFT_BATCH_MAX,
|
|
18
18
|
linkedinDraftOpInputSchema
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-7EPXVICM.js";
|
|
20
20
|
import {
|
|
21
21
|
apiPost
|
|
22
22
|
} from "./chunk-XBOK23HI.js";
|
|
@@ -343,4 +343,4 @@ export {
|
|
|
343
343
|
requireTarget,
|
|
344
344
|
requireTargets
|
|
345
345
|
};
|
|
346
|
-
//# sourceMappingURL=chunk-
|
|
346
|
+
//# sourceMappingURL=chunk-NA63BH7V.js.map
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
suggestFamilies,
|
|
21
21
|
unresolvedBrandFamilies,
|
|
22
22
|
upsertFontFaceCss
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-VL43TNIP.js";
|
|
24
24
|
import {
|
|
25
25
|
registerSchema,
|
|
26
26
|
writeJson
|
|
@@ -491,4 +491,4 @@ export {
|
|
|
491
491
|
fontsAdoptCommand,
|
|
492
492
|
fontsCommand
|
|
493
493
|
};
|
|
494
|
-
//# sourceMappingURL=chunk-
|
|
494
|
+
//# sourceMappingURL=chunk-NDEE6G2J.js.map
|
|
@@ -1,39 +1,3 @@
|
|
|
1
|
-
// ../api/src/identity/digest.ts
|
|
2
|
-
var SHA256_HEX = /^[0-9a-fA-F]{64}$/;
|
|
3
|
-
function isSha256Hex(value) {
|
|
4
|
-
return SHA256_HEX.test(value);
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
// ../api/src/identity/email.ts
|
|
8
|
-
function normalizeEmailV1(raw) {
|
|
9
|
-
const trimmed = raw.trim().toLowerCase();
|
|
10
|
-
return trimmed === "" ? null : trimmed;
|
|
11
|
-
}
|
|
12
|
-
var EMAIL = /^[^\s@]+@[^\s@.]+(?:\.[^\s@.]+)+$/;
|
|
13
|
-
function normalizeEmailV2(raw) {
|
|
14
|
-
const trimmed = raw.trim().toLowerCase();
|
|
15
|
-
return EMAIL.test(trimmed) ? trimmed : null;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// ../api/src/identity/phone.ts
|
|
19
|
-
function normalizePhoneV1(raw) {
|
|
20
|
-
const digits = raw.trim().toLowerCase().replace(/[^0-9]/g, "");
|
|
21
|
-
return digits === "" ? null : `+${digits}`;
|
|
22
|
-
}
|
|
23
|
-
var PHONE_PUNCTUATION = /[\s()./-]/g;
|
|
24
|
-
var E164 = /^\+[1-9]\d{7,14}$/;
|
|
25
|
-
function normalizePhoneV2(raw) {
|
|
26
|
-
const compact = raw.replace(PHONE_PUNCTUATION, "");
|
|
27
|
-
const e164 = compact.startsWith("00") ? `+${compact.slice(2)}` : compact;
|
|
28
|
-
return E164.test(e164) ? e164 : null;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// ../api/src/identity/index.ts
|
|
32
|
-
function normalizeIdentity(raw, version) {
|
|
33
|
-
const value = raw.kind === "email" ? version === 1 ? normalizeEmailV1(raw.value) : normalizeEmailV2(raw.value) : version === 1 ? normalizePhoneV1(raw.value) : normalizePhoneV2(raw.value);
|
|
34
|
-
return value === null ? null : { kind: raw.kind, value, normalizationVersion: version };
|
|
35
|
-
}
|
|
36
|
-
|
|
37
1
|
// ../api/src/event-ingest/matching.ts
|
|
38
2
|
var MATCH_FIELDS = [
|
|
39
3
|
"first_name",
|
|
@@ -203,8 +167,6 @@ function templateMentions(template) {
|
|
|
203
167
|
}
|
|
204
168
|
|
|
205
169
|
export {
|
|
206
|
-
isSha256Hex,
|
|
207
|
-
normalizeIdentity,
|
|
208
170
|
MATCH_COOKIES,
|
|
209
171
|
MATCH_FIELD_FORWARDING,
|
|
210
172
|
INGEST_CLICK_ID_PARAMS,
|
|
@@ -213,4 +175,4 @@ export {
|
|
|
213
175
|
mentionOf,
|
|
214
176
|
templateMentions
|
|
215
177
|
};
|
|
216
|
-
//# sourceMappingURL=chunk-
|
|
178
|
+
//# sourceMappingURL=chunk-NYIGXDUG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../api/src/event-ingest/matching.ts","../../api/src/event-ingest/vocabulary.ts","../../api/src/event-sources/fields.ts","../../api/src/event-sources/template.ts"],"sourcesContent":["/**\n * The customer-matching block: one vocabulary for everything Meta calls\n * *advanced matching* and Google calls *enhanced conversions*.\n *\n * ## Why these fields are here at all\n *\n * A server event is worth what it can be joined to. An email is the join that\n * works, and everything in this file is the second-best set for when the join\n * has to happen *outward* instead — Meta and Google both accept an event with\n * no email at all if it carries enough of a person: a name and a postcode, a\n * click id, a browser cookie. They disagree about spelling and about what has\n * to be hashed, and they do not disagree about the set.\n *\n * Two things follow, and they are the whole design:\n *\n * - **One block, one spelling.** A sender maps their CRM once, here, rather\n * than once per destination. `MATCH_FIELD_FORWARDING` is the table that says\n * what each field is called on the other side, so the mapping is published\n * rather than folklore.\n * - **Kept in the form every destination can still be derived from.** That rule\n * decides, per field, whether it is stored hashed or in the clear, and it is\n * the only rule here worth remembering: **a digest can be computed later and\n * never undone.** A city hashed on arrival can never be sent to Google, which\n * wants `address_info.city` in plain text; a city kept in the clear can be\n * hashed for Meta at the moment of sending, for free.\n *\n * So: hashed here are the fields **both** destinations want hashed and which\n * identify a person on their own — email, phone, the two names, the date of\n * birth, and the sender's own id. Kept in the clear are the coarse ones that\n * identify nobody by themselves and that Google wants unhashed: city, region,\n * postal code, country, and the gender letter. Hashing that second set would\n * buy no privacy — the digest of `es` is not a secret — and would cost the\n * ability to send them anywhere.\n *\n * ## A value that arrives already hashed\n *\n * Accepted for every field, and detected rather than declared. There is no\n * `email_sha256` beside `email` any more, because two fields for one idea is a\n * choice a sender should never have had to make: a 64-character hex string is\n * unambiguously a digest — no address, phone number, city or name can be one —\n * so the field can hold either and we can tell. What we cannot do is *unhash*,\n * so a digest arriving for a field this module would otherwise keep in the\n * clear is stored under `<field>_sha256`: the key says what is inside it, and a\n * forward that needs the plain value knows it does not have one.\n *\n * ## Normalization is Meta's, and the divergence is stated\n *\n * The hashed fields are normalized under the rule Meta publishes (lower case,\n * trimmed, punctuation and spacing removed) because a digest can only be\n * computed under one rule and Meta's is the stricter of the two. Google's rule\n * for a name is lower-case-and-trim only, so the two agree on every name\n * without punctuation in it and differ on `O'Brien`. Email and phone do not\n * have this problem: they go through `../identity`, which is the platform's one\n * versioned rule and the same one the browser beacon writes with — which is\n * what makes a server event and a Form submission land on one person.\n */\n\nimport { isSha256Hex, sha256Hex } from \"../identity\";\n\n/**\n * A field of `user_data` that describes the person rather than naming a click.\n *\n * `email` and `phone` are deliberately not here: they are resolved by\n * `./identity` into the row's own `identity_hash`, under the platform's\n * versioned rule, and this module reads that result rather than hashing them a\n * second time under a different one.\n */\nexport const MATCH_FIELDS = [\n \"first_name\",\n \"last_name\",\n \"date_of_birth\",\n \"gender\",\n \"city\",\n \"region\",\n \"postal_code\",\n \"country\",\n] as const;\nexport type MatchField = (typeof MATCH_FIELDS)[number];\n\n/**\n * The browser cookies Meta's pixel sets, which name a browser rather than a\n * person.\n *\n * `fbp` is the pixel's own first-party cookie and `fbc` is the one it derives\n * from a click. Both are sent to Meta **unhashed and verbatim** — they are\n * opaque strings of Meta's own making, and hashing one destroys it — so they\n * are stored exactly as they arrived.\n *\n * They are not in {@link MATCH_FIELDS} and not in the click-id list either.\n * They are not click ids: a `gclid` is stamped on a URL by the ad platform and\n * has a column of its own here because reports filter on it, while `fbp` is a\n * cookie a script wrote and nothing reports on. But they *do* name somebody,\n * which is why `namesSomebody` counts them — an event carrying only an `fbp` is\n * still an event Meta can attribute, and refusing it would lose exactly the\n * conversions this block exists to make sendable.\n */\nexport const MATCH_COOKIES = [\"fbp\", \"fbc\"] as const;\nexport type MatchCookie = (typeof MATCH_COOKIES)[number];\n\n/** How a field is stored, once it has been normalized. */\ntype Keeping = \"hashed\" | \"plain\";\n\ntype MatchSpec = {\n keep: Keeping;\n /** The canonical form, or `null` when the value says nothing usable. */\n normalize: (value: string) => string | null;\n /** What Meta and Google call this field, for the published mapping. */\n meta: string;\n google: string | null;\n};\n\n/** Lower-cased, trimmed, and stripped of everything that is not a letter or a digit. Meta's rule. */\nfunction tightened(value: string): string | null {\n const stripped = value.toLowerCase().replace(/[^\\p{L}\\p{N}]/gu, \"\");\n return stripped === \"\" ? null : stripped;\n}\n\n/** Lower-cased and trimmed, with runs of whitespace collapsed. Nothing else is removed. */\nfunction loosened(value: string): string | null {\n const collapsed = value.trim().toLowerCase().replace(/\\s+/g, \" \");\n return collapsed === \"\" ? null : collapsed;\n}\n\n/**\n * `1985-04-09`, `1985/04/09`, `19850409` — eight digits in year-month-day\n * order, however they are punctuated.\n *\n * The order is not guessed. `09/04/1985` is refused rather than read as the\n * ninth of April or the fourth of September: nothing in the value says which,\n * and a birth date hashed under the wrong reading is a digest that matches\n * nobody at Meta, with no error anywhere to say so. A refusal costs one field\n * on one event and is visible in the arrival log; a wrong guess costs the match\n * and is not.\n */\nfunction birthDate(value: string): string | null {\n const digits = value.replace(/\\D/g, \"\");\n if (!/^\\d{8}$/.test(digits)) return null;\n const month = Number(digits.slice(4, 6));\n const day = Number(digits.slice(6, 8));\n if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n return digits;\n}\n\n/** `f` or `m`, from whatever word or letter the sender's system stores. */\nfunction genderLetter(value: string): string | null {\n const first = value.trim().toLowerCase().charAt(0);\n return first === \"f\" || first === \"m\" ? first : null;\n}\n\n/** ISO-3166 alpha-2, lower-cased. A country name is refused rather than guessed at. */\nfunction countryCode(value: string): string | null {\n const code = value.trim().toLowerCase();\n return /^[a-z]{2}$/.test(code) ? code : null;\n}\n\nexport const MATCH_SPECS: Readonly<Record<MatchField, MatchSpec>> = {\n first_name: { keep: \"hashed\", normalize: tightened, meta: \"fn\", google: \"hashed_first_name\" },\n last_name: { keep: \"hashed\", normalize: tightened, meta: \"ln\", google: \"hashed_last_name\" },\n // Meta only. Google's enhanced conversions have no date of birth, so there is\n // no destination wanting it in the clear and every reason not to keep one.\n date_of_birth: { keep: \"hashed\", normalize: birthDate, meta: \"db\", google: null },\n gender: { keep: \"plain\", normalize: genderLetter, meta: \"ge\", google: null },\n city: { keep: \"plain\", normalize: loosened, meta: \"ct\", google: \"city\" },\n region: { keep: \"plain\", normalize: loosened, meta: \"st\", google: \"state\" },\n postal_code: { keep: \"plain\", normalize: loosened, meta: \"zp\", google: \"postal_code\" },\n country: { keep: \"plain\", normalize: countryCode, meta: \"country\", google: \"country_code\" },\n};\n\n/** One row of the published mapping: our name, Meta's, Google's, and whether we hold it hashed. */\nexport type MatchFieldForwarding = {\n field: string;\n meta: string;\n google: string | null;\n hashed: boolean;\n};\n\n/**\n * What each field of the matching block is called at the destinations that\n * accept it — the table the dialog and the docs both read.\n *\n * Published rather than described, because \"it maps onto Meta's user_data\" is\n * a promise a sender cannot check and this is the same promise they can.\n */\nexport const MATCH_FIELD_FORWARDING: readonly MatchFieldForwarding[] = [\n { field: \"email\", meta: \"em\", google: \"hashed_email\", hashed: true },\n { field: \"phone\", meta: \"ph\", google: \"hashed_phone_number\", hashed: true },\n // Kept in the clear — see `resolveOwnId`. The digest is still computed and\n // still stored beside it, so a Meta forward has one; what changed is that the\n // sender's own key is now readable, which is the entire reason they sent it.\n { field: \"external_id\", meta: \"external_id\", google: null, hashed: false },\n ...MATCH_FIELDS.map((field) => ({\n field,\n meta: MATCH_SPECS[field].meta,\n google: MATCH_SPECS[field].google,\n hashed: MATCH_SPECS[field].keep === \"hashed\",\n })),\n { field: \"fbp\", meta: \"fbp\", google: null, hashed: false },\n { field: \"fbc\", meta: \"fbc\", google: null, hashed: false },\n];\n\n/** The longest a stored match value may be, matching the width the map's values are held at. */\nconst MAX_MATCH_VALUE = 255;\n\n/**\n * One field, resolved to the key it is stored under and the value stored there.\n *\n * `null` when the field said nothing usable — `gender: \"unknown\"`, a country\n * spelled out in full, a postcode of whitespace. A field that is present and\n * unusable contributes nothing rather than storing something that matches\n * nobody, which is the same rule the identity resolution follows.\n */\nexport async function resolveMatchField(\n field: MatchField,\n raw: string,\n): Promise<{ key: string; value: string } | null> {\n const value = raw.trim();\n if (value === \"\") return null;\n const spec = MATCH_SPECS[field];\n // Already a digest, whatever this field would otherwise keep. Taken at face\n // value — hashing a hash matches nothing, forever — and keyed so that the\n // name says what is inside, because a plain-text destination cannot use it.\n if (isSha256Hex(value)) return { key: `${field}_sha256`, value: value.toLowerCase() };\n const normalized = spec.normalize(value);\n if (normalized === null) return null;\n if (spec.keep === \"plain\") return { key: field, value: normalized.slice(0, MAX_MATCH_VALUE) };\n return { key: `${field}_sha256`, value: await sha256Hex(normalized) };\n}\n\n/**\n * The two ids that are not facts about a person but *names the sender chose*,\n * kept exactly as they were sent.\n *\n * `external_id` is the client's own key — a HubSpot contact id, a Salesforce\n * record id — and `baker_id` is a cookie value one of our own pages minted.\n * Neither describes anybody: they are pointers, and a pointer is worth only\n * what it can be followed with.\n *\n * ## Why these are the exception to \"identifying fields are hashed\"\n *\n * `external_id` used to be hashed here and nothing else, on the reasoning that\n * it is sometimes an email or a document number in disguise. That reasoning\n * held and the consequence did not: it made the field **useless to the person\n * who sent it**. An integrator posting `external_id: \"hs:contact:12345\"` opened\n * the event and read *Provided, stored hashed* — no way to check we had read\n * the right record, no way to paste the id back into their CRM, and no way to\n * tell a working integration from one silently keyed on the wrong column. The\n * whole point of the field is to be recognised on the way back out.\n *\n * The privacy this bought was also smaller than it looked. The digest is still\n * computed, still what `identity_hash` stores and still what the identity graph\n * joins on — see `./identity` — so nothing about the joining changed. What is\n * new is a second copy in the clear, under the key that says so.\n *\n * A value that arrives *already* a digest still keeps `<field>_sha256`, for the\n * rule that governs every field here: a digest cannot be undone, so the key has\n * to say what is inside it.\n */\nexport function resolveOwnId(field: \"external_id\" | \"baker_id\", raw: string): { key: string; value: string } | null {\n const value = raw.trim();\n if (value === \"\") return null;\n if (isSha256Hex(value)) return { key: `${field}_sha256`, value: value.toLowerCase() };\n return { key: field, value: value.slice(0, MAX_MATCH_VALUE) };\n}\n\n/** A cookie value, as Meta minted it: bounded, and otherwise untouched. */\nexport function resolveMatchCookie(raw: string): string | null {\n const value = raw.trim();\n return value === \"\" ? null : value.slice(0, MAX_MATCH_VALUE);\n}\n\n/**\n * The `fbclid` hiding inside an `fbc`, or `null`.\n *\n * `fbc` is `fb.<subdomain index>.<timestamp>.<fbclid>` — Meta's own encoding of\n * a click id it already saw. A sender whose system stored the cookie has the\n * click id and does not know it, so reading it out costs one split and gives\n * the event the same paid-attribution column a landing page would have written\n * from the URL. Nothing is invented: the value was there.\n */\nexport function fbclidFromFbc(fbc: string): string | null {\n const parts = fbc.split(\".\");\n if (parts.length < 4 || parts[0] !== \"fb\") return null;\n const id = parts.slice(3).join(\".\");\n return id === \"\" ? null : id;\n}\n","/**\n * The click ids a sender may hand over, named the way their own system stored\n * them.\n *\n * The wire uses the **URL parameter** spelling (`li_fat_id`) rather than the\n * analytics row's field spelling (`liFatId`), because a client's CRM captured\n * these off a landing URL and that is the name it wrote them down under.\n * {@link clickIdsFromWire} is the one place the two vocabularies meet.\n *\n * Mirrored from `CLICK_ID_FIELDS` in `../analytics/normalize.ts`, which is the\n * source of truth for which click ids the store has columns for.\n * `vocabulary.parity.test.ts` reads that file and fails if the two drift — a\n * missing entry here is an attribution a client sent and we dropped.\n */\n\nimport type { ClickIdFields } from \"../analytics/normalize\";\n\nexport const INGEST_CLICK_ID_PARAMS = [\n \"gclid\",\n \"wbraid\",\n \"gbraid\",\n \"dclid\",\n \"fbclid\",\n \"ttclid\",\n \"twclid\",\n \"li_fat_id\",\n \"msclkid\",\n \"rdt_cid\",\n \"epik\",\n \"sccid\",\n \"oppref\",\n] as const;\nexport type IngestClickIdParam = (typeof INGEST_CLICK_ID_PARAMS)[number];\n\nconst FIELD_FOR_PARAM: Readonly<Record<IngestClickIdParam, keyof ClickIdFields>> = {\n gclid: \"gclid\",\n wbraid: \"wbraid\",\n gbraid: \"gbraid\",\n dclid: \"dclid\",\n fbclid: \"fbclid\",\n ttclid: \"ttclid\",\n twclid: \"twclid\",\n li_fat_id: \"liFatId\",\n msclkid: \"msclkid\",\n rdt_cid: \"rdtCid\",\n epik: \"epik\",\n sccid: \"sccid\",\n oppref: \"oppref\",\n};\n\n/** The wire's click block as the analytics row builder names its fields. Empty values are dropped. */\nexport function clickIdsFromWire(click: Partial<Record<IngestClickIdParam, string | null>> | null | undefined): {\n clickIds: ClickIdFields;\n kinds: IngestClickIdParam[];\n} {\n const clickIds: ClickIdFields = {};\n const kinds: IngestClickIdParam[] = [];\n for (const param of INGEST_CLICK_ID_PARAMS) {\n const value = click?.[param];\n if (typeof value !== \"string\" || value === \"\") continue;\n clickIds[FIELD_FOR_PARAM[param]] = value;\n kinds.push(param);\n }\n return { clickIds, kinds };\n}\n","/**\n * What a source can be read into: the fields of an event, named the way\n * `POST /v1/events` already names them.\n *\n * Assembled from the ingest vocabulary rather than spelled a fourth time. A\n * mapping is `SourceField → dotted path`, and the field half of that pair has\n * to be a name the wire already accepts, because the whole of what a source\n * does is build an `IngestEventInput` and hand it to the same door the\n * client's own server would have used. A field that existed only here would be\n * a field the event could not carry.\n */\n\nimport { MATCH_FIELDS, type MatchField } from \"../event-ingest/matching\";\nimport type { IngestClickIdParam } from \"../event-ingest/vocabulary\";\nimport { INGEST_CLICK_ID_PARAMS } from \"../event-ingest/vocabulary\";\n\n/** Where a field sits on the sheet: one row per group, in this order. */\nexport type SourceFieldGroup = \"event\" | \"person\" | \"money\" | \"click\";\n\nexport type SourceField =\n | \"event_name\"\n | \"event_time\"\n | \"event_id\"\n | \"email\"\n | \"phone\"\n | \"external_id\"\n | MatchField\n | \"value\"\n | \"currency\"\n | IngestClickIdParam;\n\nexport interface SourceFieldSpec {\n field: SourceField;\n /** The product word for it — what the sheet and the CLI show. */\n label: string;\n group: SourceFieldGroup;\n}\n\nconst MATCH_LABELS: Readonly<Record<MatchField, string>> = {\n first_name: \"First name\",\n last_name: \"Last name\",\n date_of_birth: \"Date of birth\",\n gender: \"Gender\",\n city: \"City\",\n region: \"Region\",\n postal_code: \"Postcode\",\n country: \"Country\",\n};\n\nconst CLICK_LABELS: Readonly<Record<IngestClickIdParam, string>> = {\n gclid: \"Google click id\",\n wbraid: \"Google click id (iOS, web to app)\",\n gbraid: \"Google click id (iOS, app)\",\n dclid: \"Google click id (Display & Video)\",\n fbclid: \"Meta click id\",\n ttclid: \"TikTok click id\",\n twclid: \"X click id\",\n li_fat_id: \"LinkedIn click id\",\n msclkid: \"Microsoft click id\",\n rdt_cid: \"Reddit click id\",\n epik: \"Pinterest click id\",\n sccid: \"Snapchat click id\",\n oppref: \"ChatGPT Ads click id\",\n};\n\nexport const SOURCE_FIELDS: readonly SourceFieldSpec[] = [\n { field: \"event_name\", label: \"What happened\", group: \"event\" },\n { field: \"event_time\", label: \"When it happened\", group: \"event\" },\n { field: \"event_id\", label: \"Its id\", group: \"event\" },\n { field: \"email\", label: \"Email\", group: \"person\" },\n { field: \"phone\", label: \"Phone\", group: \"person\" },\n { field: \"external_id\", label: \"Your own id for the person\", group: \"person\" },\n ...MATCH_FIELDS.map((field) => ({ field, label: MATCH_LABELS[field], group: \"person\" as const })),\n { field: \"value\", label: \"Amount\", group: \"money\" },\n { field: \"currency\", label: \"Currency\", group: \"money\" },\n ...INGEST_CLICK_ID_PARAMS.map((field) => ({ field, label: CLICK_LABELS[field], group: \"click\" as const })),\n];\n\nexport const SOURCE_FIELD_NAMES: readonly SourceField[] = SOURCE_FIELDS.map((spec) => spec.field);\n\nconst FIELD_SET: ReadonlySet<string> = new Set(SOURCE_FIELD_NAMES);\n\nexport function isSourceField(value: string): value is SourceField {\n return FIELD_SET.has(value);\n}\n\nexport const SOURCE_FIELD_GROUPS: readonly { group: SourceFieldGroup; label: string; detail: string }[] = [\n { group: \"event\", label: \"The event\", detail: \"What it is called, when it happened, and its own id.\" },\n {\n group: \"person\",\n label: \"Who it is about\",\n detail: \"How the platforms find the person. Email or phone is the one that matters.\",\n },\n {\n group: \"money\",\n label: \"What it was worth\",\n detail: \"The amount and its currency, for revenue and for the platforms.\",\n },\n {\n group: \"click\",\n label: \"The ad click that brought them\",\n detail: \"When the source keeps the click id, the campaign gets the credit.\",\n },\n];\n\n/**\n * A row that is not a field of the event but one of its own **properties** —\n * the flat `properties` object every event carries, which Measure → Events\n * breaks an event down by and which a send can forward to a platform as an\n * extra parameter (Meta's `custom_data`, a GA4 event parameter).\n *\n * Spelled `properties.<key>` in the mapping so the row shares the table with\n * the fields and the CLI's `--field` takes it unchanged, while an unknown bare\n * key is still refused: the namespace is what tells a deliberate extra\n * property from a typo that would otherwise silently map nothing.\n */\nexport const PROPERTY_ROW_PREFIX = \"properties.\";\n\n/** The longest a property's key may be. Keys are a shared dictionary in the store, so they are kept short and plain. */\nexport const PROPERTY_KEY_MAX = 64;\n\n/** Letters, digits, underscore, dash and dot — what a property key of `POST /v1/events` may be, and what a platform parameter name may be. */\nconst PROPERTY_KEY = /^[A-Za-z0-9_][A-Za-z0-9_.-]*$/;\n\n/** Keys a source writes itself; a row naming one would be overwritten in silence. */\nexport const RESERVED_PROPERTY_KEYS: readonly string[] = [\"baker_source\", \"hubspot_property\", \"hubspot_value\"];\n\n/** Whether a mapping row names a property rather than a field. */\nexport function isPropertyRow(row: string): boolean {\n return row.startsWith(PROPERTY_ROW_PREFIX);\n}\n\n/** The property's own key, for a `properties.<key>` row; null for anything else. */\nexport function propertyKeyOf(row: string): string | null {\n return isPropertyRow(row) ? row.slice(PROPERTY_ROW_PREFIX.length) : null;\n}\n\n/** The mapping row for a property key. */\nexport function propertyRow(key: string): string {\n return `${PROPERTY_ROW_PREFIX}${key}`;\n}\n\n/**\n * Why a property key cannot be used, in one sentence, or null when it can.\n * The same rule for a source's extra properties and for a send's parameters.\n */\nexport function propertyKeyProblem(key: string): string | null {\n const trimmed = key.trim();\n if (trimmed === \"\") return \"A property needs a name.\";\n if (trimmed.length > PROPERTY_KEY_MAX) return `A property name is at most ${PROPERTY_KEY_MAX} characters.`;\n if (!PROPERTY_KEY.test(trimmed)) {\n return `\"${trimmed}\" is not a property name: letters, digits, underscore, dash and dot only, starting with a letter or digit.`;\n }\n if (RESERVED_PROPERTY_KEYS.includes(trimmed)) return `\"${trimmed}\" is written by Baker itself; pick another name.`;\n return null;\n}\n\n/**\n * Whether a mapping row is one a source can hold: a field of the event, or a\n * well-named property. The reason when it is not.\n */\nexport function mappingRowProblem(row: string): string | null {\n if (isSourceField(row)) return null;\n const key = propertyKeyOf(row);\n if (key === null) {\n return `\"${row}\" is not a field an event can carry. A field is one of ${SOURCE_FIELD_NAMES.join(\", \")}; an extra property is spelled properties.<name>.`;\n }\n return propertyKeyProblem(key);\n}\n\n/** The property rows of a mapping, as `key → template`, in the order stored. */\nexport function propertyRows(mapping: Readonly<Record<string, string>>): { key: string; template: string }[] {\n return Object.entries(mapping).flatMap(([row, template]) => {\n const key = propertyKeyOf(row);\n return key === null ? [] : [{ key, template }];\n });\n}\n","/**\n * A mapping row is a template: literal text with `{{mentions}}` in it.\n *\n * ## Why a template and not a path\n *\n * A row used to hold one dotted path, and one path answers one question —\n * \"which field of the payload is the email\". It cannot answer the next three:\n * a currency the tool never sends but the company knows (`EUR`), a name split\n * over two fields (`{{firstname}} {{lastname}}`), or an amount a HubSpot\n * contact carries under a property nobody would guess. A template answers all\n * of them with one rule the Forms builder already teaches: type text, insert\n * a variable. The same spelling is what the CLI takes, so an agent and a\n * person write the same thing.\n *\n * ## What a mention points at\n *\n * Whatever the source can read. For an address it is a dotted path into the\n * payload (`contact.email`, `deal.contacts.0.email`); for a HubSpot read it\n * is a contact property's internal name (`hs_google_click_id`), plus `id` for\n * the contact's own id. The template does not know which — the lookup passed\n * to `renderTemplate` does.\n *\n * A mention names exactly one thing. There was a `{{phone|mobilephone}}`\n * spelling for \"the first that holds anything\"; it is gone, because it was a\n * rule the Forms builder's variables do not have, and a row that reads\n * differently from every other variable field in the product is a row nobody\n * can predict. A person who wants the mobile picks the mobile.\n */\n\nconst MENTION = /\\{\\{\\s*([^{}]+?)\\s*\\}\\}/g;\n\n/** The path a mention names, with the braces on. */\nexport function mentionOf(path: string): string {\n return `{{${path}}}`;\n}\n\n/** Every path a template reads, in order, once each. */\nexport function templateMentions(template: string): string[] {\n const seen: string[] = [];\n for (const match of template.matchAll(MENTION)) {\n const path = (match[1] ?? \"\").trim();\n if (path !== \"\" && !seen.includes(path)) seen.push(path);\n }\n return seen;\n}\n\n/**\n * The template with every mention replaced by what it points at, trimmed —\n * or nothing, when what is left is empty. An empty mention reads as empty\n * text rather than as its own spelling, so a template made only of mentions\n * the payload did not fill is \"not sent\", not the literal `{{phone}}`.\n */\nexport function renderTemplate(template: string, lookup: (path: string) => string | undefined): string | undefined {\n const rendered = template.replace(MENTION, (_whole, path: string) => lookup(path.trim()) ?? \"\").trim();\n return rendered === \"\" ? undefined : rendered;\n}\n\n/** The one path a template is, when it is exactly one mention and nothing else. */\nexport function isBareMention(template: string): string | null {\n const match = /^\\{\\{\\s*([^{}]+?)\\s*\\}\\}$/.exec(template.trim());\n return match === null ? null : (match[1] ?? null);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
2
|
hubspotRefusal
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-VLMBTPXU.js";
|
|
4
4
|
import {
|
|
5
5
|
collectSideEffects,
|
|
6
6
|
readFlowTree,
|
|
7
|
+
readSettings,
|
|
7
8
|
walkNodes,
|
|
8
9
|
writeFlowTree
|
|
9
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-HROZYQ5H.js";
|
|
10
11
|
import {
|
|
11
12
|
failApi
|
|
12
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-SJYEY5MV.js";
|
|
13
14
|
import {
|
|
14
15
|
FLOW_AGENT_DESTINATION_KINDS,
|
|
15
16
|
FLOW_PROVIDER_TYPE
|
|
16
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-7EPXVICM.js";
|
|
17
18
|
import {
|
|
18
19
|
ApiError,
|
|
19
20
|
apiPost
|
|
@@ -53,11 +54,89 @@ function isSet(value) {
|
|
|
53
54
|
return typeof value === "string" && value.length > 0;
|
|
54
55
|
}
|
|
55
56
|
function unwiredSideEffects(tree, type) {
|
|
56
|
-
return collectSideEffects(tree).filter(({ sideEffect }) => sideEffect.type === type).filter(
|
|
57
|
+
return collectSideEffects(tree).filter(({ sideEffect }) => sideEffect.type === type).filter(
|
|
58
|
+
({ sideEffect }) => OAUTH_SIDE_EFFECTS.has(type) && !isSet(sideEffect.oauthProviderId) || !isSet(sideEffect.encryptedConfig)
|
|
59
|
+
).map(({ sideEffect }) => String(sideEffect.id));
|
|
57
60
|
}
|
|
58
61
|
function unwiredHubspotForms(tree) {
|
|
59
62
|
return unwiredSideEffects(tree, "hubspotForm");
|
|
60
63
|
}
|
|
64
|
+
var STATED_KINDS = /* @__PURE__ */ new Set(["email", "httpWebhook"]);
|
|
65
|
+
function statedKind(args) {
|
|
66
|
+
if (typeof args.email === "string" || typeof args.subject === "string") return "email";
|
|
67
|
+
if (typeof args.url === "string") return "httpWebhook";
|
|
68
|
+
return void 0;
|
|
69
|
+
}
|
|
70
|
+
function sealRequestFor(kind, args) {
|
|
71
|
+
const text = (key) => typeof args[key] === "string" && args[key].trim() ? args[key].trim() : void 0;
|
|
72
|
+
if (kind === "email") {
|
|
73
|
+
const email = text("email");
|
|
74
|
+
const subject = text("subject");
|
|
75
|
+
if (!email || !subject) {
|
|
76
|
+
return {
|
|
77
|
+
ok: false,
|
|
78
|
+
message: "An email destination needs both who receives it and its subject.",
|
|
79
|
+
fix: 'Pass --email "a@x.com, b@x.com" --subject "New lead \u2014 <Form name>". Write the subject yourself from the Form; ask the user only for an address you were not given.'
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return { ok: true, request: { type: "email", email, subject } };
|
|
83
|
+
}
|
|
84
|
+
if (kind === "httpWebhook") {
|
|
85
|
+
const apiUrl = text("url");
|
|
86
|
+
if (!apiUrl) {
|
|
87
|
+
return { ok: false, message: "A webhook destination needs its address.", fix: "Pass --url https://\u2026" };
|
|
88
|
+
}
|
|
89
|
+
return { ok: true, request: { type: "httpWebhook", apiUrl } };
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
ok: false,
|
|
93
|
+
message: `A ${kind} destination holds a credential, so it is not one you can state.`,
|
|
94
|
+
fix: "Its token or URL is the user's to enter: request_flow_input."
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
var UNREADABLE = "holds settings this chat cannot read";
|
|
98
|
+
function keepsWhatTheAgentCannotState(kind, settings) {
|
|
99
|
+
if (settings === null) return UNREADABLE;
|
|
100
|
+
if (kind === "httpWebhook" && typeof settings?.auth === "string" && settings.auth !== "noAuth") {
|
|
101
|
+
return "sends a credential the user entered";
|
|
102
|
+
}
|
|
103
|
+
if (kind === "email" && settings !== void 0 && "email" in settings && typeof settings.email !== "string") {
|
|
104
|
+
return "replies to the visitor's own email answer";
|
|
105
|
+
}
|
|
106
|
+
return void 0;
|
|
107
|
+
}
|
|
108
|
+
function restatableTargets(target, settingsById, all, replaceUnreadableEmail = false) {
|
|
109
|
+
const kept = target.ids.flatMap((id) => {
|
|
110
|
+
if (target.kind === "email" && settingsById[id] === null && replaceUnreadableEmail && !all && target.ids.length === 1) {
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
const why = keepsWhatTheAgentCannotState(target.kind, settingsById[id]);
|
|
114
|
+
return why ? [{ id, why }] : [];
|
|
115
|
+
});
|
|
116
|
+
const ids = target.ids.filter((id) => !kept.some((entry) => entry.id === id));
|
|
117
|
+
if (kept.length > 0 && (!all || ids.length === 0)) {
|
|
118
|
+
const [first] = kept;
|
|
119
|
+
return {
|
|
120
|
+
ok: false,
|
|
121
|
+
message: `"${first?.id}" ${first?.why}; restating it would replace that.`,
|
|
122
|
+
fix: first?.why === UNREADABLE ? target.kind === "email" ? `Baker cannot read the old recipients or tell whether this replies to a visitor. If the user wants to replace this destination, pass --side-effect ${first?.id} --replace-unreadable --email <complete recipient list> --subject <subject>. This replaces its entire previous setup; never use it to add a recipient to an unknown list. Otherwise leave it as it is and add a separate team email destination.` : "Have the user restate the webhook address and any credential once with request_flow_input; after that this command can change a webhook with no credential." : target.kind === "httpWebhook" ? "A new address for a webhook with a credential is the user's to enter with it: request_flow_input." : "Leave it as it is. Add a separate email destination for the team: baker flows add-side-effect."
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return { ok: true, ids, skipped: kept.map((entry) => entry.id) };
|
|
126
|
+
}
|
|
127
|
+
function attachSettings(tree, id, encryptedConfig, type) {
|
|
128
|
+
const chosen = collectSideEffects(tree).find((entry) => entry.sideEffect.id === id);
|
|
129
|
+
if (!chosen || chosen.sideEffect.type !== type) {
|
|
130
|
+
const ofType = collectSideEffects(tree).filter((entry) => entry.sideEffect.type === type);
|
|
131
|
+
return {
|
|
132
|
+
ok: false,
|
|
133
|
+
message: chosen ? `Side effect "${id}" is a ${String(chosen.sideEffect.type)}, not a ${type}.` : `No side effect with id "${id}" in this form.`,
|
|
134
|
+
fix: `${type} side effects in this form: ${ofType.map((entry) => String(entry.sideEffect.id)).join(", ") || "none"}`
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
chosen.sideEffect.encryptedConfig = encryptedConfig;
|
|
138
|
+
return { ok: true, nodeId: String(chosen.node.id), sideEffectId: id };
|
|
139
|
+
}
|
|
61
140
|
function stepType(node) {
|
|
62
141
|
const type = node?.nodeData?.type;
|
|
63
142
|
return typeof type === "string" ? type : void 0;
|
|
@@ -138,7 +217,13 @@ function refuse(message, fix, code = "VALIDATION_ERROR") {
|
|
|
138
217
|
function allTargets(tree, kind) {
|
|
139
218
|
if (!kind) refuse("--all needs --type <kind> to know what to wire.", "e.g. --all --type googleSpreadsheet");
|
|
140
219
|
const on = STEP_KINDS.has(kind) ? "node" : "sideEffect";
|
|
141
|
-
const ids = on === "node" ? unpickedSteps(tree, kind) : unwiredSideEffects(tree, kind);
|
|
220
|
+
const ids = STATED_KINDS.has(kind) ? collectSideEffects(tree).filter(({ sideEffect }) => sideEffect.type === kind).map(({ sideEffect }) => String(sideEffect.id)) : on === "node" ? unpickedSteps(tree, kind) : unwiredSideEffects(tree, kind);
|
|
221
|
+
if (ids.length === 0 && STATED_KINDS.has(kind)) {
|
|
222
|
+
refuse(
|
|
223
|
+
`This Form has no ${kind} destination.`,
|
|
224
|
+
`Add one: baker flows add-side-effect <slug> --node <stepId> --type ${kind}`
|
|
225
|
+
);
|
|
226
|
+
}
|
|
142
227
|
if (ids.length === 0) {
|
|
143
228
|
refuse(
|
|
144
229
|
`Every ${kind} in this Form is already wired.`,
|
|
@@ -169,12 +254,14 @@ function targetsFor(tree, args) {
|
|
|
169
254
|
refuse("Pass one of --node, --side-effect or --all.", "One target per call; --all for every unwired one.");
|
|
170
255
|
}
|
|
171
256
|
if (args.all === true) {
|
|
172
|
-
const kind = typeof args.type === "string" ? args.type : args["hubspot-form"] ? "hubspotForm" :
|
|
257
|
+
const kind = typeof args.type === "string" ? args.type : args["hubspot-form"] ? "hubspotForm" : statedKind(args);
|
|
173
258
|
return allTargets(tree, kind);
|
|
174
259
|
}
|
|
175
260
|
if (node) return stepTarget(tree, node);
|
|
176
261
|
if (named) return sideEffectTarget(tree, named);
|
|
177
262
|
if (args["hubspot-form"]) return { kind: "hubspotForm", on: "sideEffect", ids: [onlyOfType(tree, "hubspotForm")] };
|
|
263
|
+
const stated = statedKind(args);
|
|
264
|
+
if (stated) return { kind: stated, on: "sideEffect", ids: [onlyOfType(tree, stated)] };
|
|
178
265
|
return refuse(
|
|
179
266
|
"Name what to fill: --node <stepId>, --side-effect <id>, or --all --type <kind>.",
|
|
180
267
|
"Ids: baker flows show <slug>"
|
|
@@ -269,6 +356,39 @@ function sheetHints(slug, data) {
|
|
|
269
356
|
columns ? `Columns: ${columns}. Map by letter: baker flows map ${slug} --side-effect <id> --map A=<value> \u2026 --write.` : `The "${sheet.tab}" tab has no header row. Map by letter anyway, and say which column holds what.`
|
|
270
357
|
];
|
|
271
358
|
}
|
|
359
|
+
async function fromStated(tree, target, args) {
|
|
360
|
+
const plan = sealRequestFor(target.kind, args);
|
|
361
|
+
if (!plan.ok) refuse(plan.message, plan.fix);
|
|
362
|
+
const current = await readSettings(tree);
|
|
363
|
+
if (current === null) {
|
|
364
|
+
refuse(
|
|
365
|
+
"Could not read what this Form's destinations hold now, so nothing was overwritten.",
|
|
366
|
+
"Try again in a moment; if it keeps failing, carry on with the rest and tell the user this one is not set.",
|
|
367
|
+
"NETWORK_ERROR"
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
const restatable = restatableTargets(target, current, args.all === true, args["replace-unreadable"] === true);
|
|
371
|
+
if (!restatable.ok) refuse(restatable.message, restatable.fix);
|
|
372
|
+
const kept = restatable.skipped.length ? [`Left as it was: ${restatable.skipped.join(", ")} (it holds what only the user can set).`] : [];
|
|
373
|
+
let sealed;
|
|
374
|
+
try {
|
|
375
|
+
sealed = (await apiPost("/api/flows/destinations/seal", plan.request)).data;
|
|
376
|
+
} catch (err) {
|
|
377
|
+
failApi(err);
|
|
378
|
+
}
|
|
379
|
+
const wired = applyAll(
|
|
380
|
+
{ ...target, ids: restatable.ids },
|
|
381
|
+
(id) => attachSettings(tree, id, sealed.encryptedConfig, target.kind)
|
|
382
|
+
);
|
|
383
|
+
return {
|
|
384
|
+
wired,
|
|
385
|
+
destination: sealed.settings,
|
|
386
|
+
hints: [
|
|
387
|
+
...kept,
|
|
388
|
+
target.kind === "email" ? `Leads from these steps now go to ${String(sealed.settings.email)} with the subject "${String(sealed.settings.subject)}". Tell the user in those words.` : `Submissions now go to ${String(sealed.settings.apiUrl)}.`
|
|
389
|
+
]
|
|
390
|
+
};
|
|
391
|
+
}
|
|
272
392
|
async function fromPlatform(tree, target, args, slug) {
|
|
273
393
|
const kind = target.kind;
|
|
274
394
|
if (!isAgentKind(kind)) {
|
|
@@ -297,7 +417,7 @@ async function fromPlatform(tree, target, args, slug) {
|
|
|
297
417
|
}
|
|
298
418
|
registerSchema({
|
|
299
419
|
command: "flows.connect",
|
|
300
|
-
description:
|
|
420
|
+
description: 'Fill a Form\'s step or destination yourself \u2014 no card for the user. Steps: Calendly, SavvyCal, GoHighLevel calendar/form (`--node <id> --resource <id>`). Destinations: HubSpot form (`--hubspot-form <id>`), Google Sheets (`--resource <spreadsheetId>` or `--new-sheet <title> --columns \u2026`), Pipedrive and GoHighLevel contact (no resource: the connected account is the destination), email (`--email "a@x.com, b@x.com" --subject "New lead \u2014 <Form>"`, never a card), webhook without a credential (`--url`). `--same-as <slug>:<id>` copies what another Form already has. `--all --type <kind>` fills every unwired one of that kind at once. Ids come from `baker flows options <kind>`. Fall back to request_flow_input only when nothing is connected, the sheet was never chosen, or several resources plausibly match.',
|
|
301
421
|
args: {
|
|
302
422
|
slug: { type: "positional", description: "Form slug", required: true },
|
|
303
423
|
node: {
|
|
@@ -334,13 +454,34 @@ registerSchema({
|
|
|
334
454
|
type: "string",
|
|
335
455
|
description: "Connection id, when more than one account of the platform is connected",
|
|
336
456
|
required: false
|
|
457
|
+
},
|
|
458
|
+
email: {
|
|
459
|
+
type: "string",
|
|
460
|
+
description: 'Email destination: who receives each lead, comma-separated for several (--email "ana@x.com, luis@x.com"). Never a card: you state it.',
|
|
461
|
+
required: false
|
|
462
|
+
},
|
|
463
|
+
subject: {
|
|
464
|
+
type: "string",
|
|
465
|
+
description: 'Email destination: the subject line. Write it yourself from the Form ("New lead \u2014 Private events").',
|
|
466
|
+
required: false
|
|
467
|
+
},
|
|
468
|
+
"replace-unreadable": {
|
|
469
|
+
type: "boolean",
|
|
470
|
+
description: "Email only, one destination: replace unreadable old settings with the complete --email and --subject. Use only when the user intends replacement, never to add to an unknown recipient list. Does not apply with --all.",
|
|
471
|
+
required: false,
|
|
472
|
+
default: false
|
|
473
|
+
},
|
|
474
|
+
url: {
|
|
475
|
+
type: "string",
|
|
476
|
+
description: "Webhook destination with no credential: its https address. One that needs a token goes to request_flow_input.",
|
|
477
|
+
required: false
|
|
337
478
|
}
|
|
338
479
|
}
|
|
339
480
|
});
|
|
340
481
|
var connectCommand = defineCommand({
|
|
341
482
|
meta: {
|
|
342
483
|
name: "connect",
|
|
343
|
-
description: 'Fill a step or destination yourself. Start here: baker flows options calendly, then baker flows connect contact --node book --resource <id>. Sheets: --side-effect se-gsheet-1 --new-sheet "Leads" --columns "Name,Email". Same as another Form: --same-as madrid:se-gsheet-1'
|
|
484
|
+
description: 'Fill a step or destination yourself. Start here: baker flows options calendly, then baker flows connect contact --node book --resource <id>. Email: --side-effect se-email-1 --email "ana@x.com, luis@x.com" --subject "New lead \u2014 Contact". Sheets: --side-effect se-gsheet-1 --new-sheet "Leads" --columns "Name,Email". Same as another Form: --same-as madrid:se-gsheet-1'
|
|
344
485
|
},
|
|
345
486
|
args: {
|
|
346
487
|
slug: { type: "positional", description: "Form slug", required: true },
|
|
@@ -354,13 +495,20 @@ var connectCommand = defineCommand({
|
|
|
354
495
|
columns: { type: "string", description: "Header row for --new-sheet, comma-separated" },
|
|
355
496
|
tab: { type: "string", description: "Sheet tab (default: the first)" },
|
|
356
497
|
"same-as": { type: "string", description: "<slug>:<id> to copy" },
|
|
357
|
-
account: { type: "string", description: "Connection id when several are connected" }
|
|
498
|
+
account: { type: "string", description: "Connection id when several are connected" },
|
|
499
|
+
email: { type: "string", description: "Email destination: recipients, comma-separated" },
|
|
500
|
+
subject: { type: "string", description: "Email destination: subject line" },
|
|
501
|
+
"replace-unreadable": {
|
|
502
|
+
type: "boolean",
|
|
503
|
+
description: "Replace one unreadable email's entire setup with --email and --subject"
|
|
504
|
+
},
|
|
505
|
+
url: { type: "string", description: "Webhook destination with no credential: its address" }
|
|
358
506
|
},
|
|
359
507
|
run: async ({ args }) => {
|
|
360
508
|
const slug = String(args.slug);
|
|
361
509
|
const target = targetsFor(readFlowTree(slug), args);
|
|
362
510
|
const tree = readFlowTree(slug);
|
|
363
|
-
const result = typeof args["same-as"] === "string" ? sameAs(tree, target, args["same-as"]) : typeof args["hubspot-form"] === "string" ? await fromHubspot(tree, target, args["hubspot-form"], slug) : await fromPlatform(tree, target, args, slug);
|
|
511
|
+
const result = typeof args["same-as"] === "string" ? sameAs(tree, target, args["same-as"]) : typeof args["hubspot-form"] === "string" ? await fromHubspot(tree, target, args["hubspot-form"], slug) : STATED_KINDS.has(target.kind) ? await fromStated(tree, target, args) : await fromPlatform(tree, target, args, slug);
|
|
364
512
|
writeFlowTree(slug, tree);
|
|
365
513
|
writeJson({
|
|
366
514
|
ok: true,
|
|
@@ -380,6 +528,9 @@ export {
|
|
|
380
528
|
attachDestination,
|
|
381
529
|
unwiredSideEffects,
|
|
382
530
|
unwiredHubspotForms,
|
|
531
|
+
sealRequestFor,
|
|
532
|
+
restatableTargets,
|
|
533
|
+
attachSettings,
|
|
383
534
|
attachStep,
|
|
384
535
|
unpickedSteps,
|
|
385
536
|
copyDestination,
|
|
@@ -387,4 +538,4 @@ export {
|
|
|
387
538
|
destinationRefusal,
|
|
388
539
|
connectCommand
|
|
389
540
|
};
|
|
390
|
-
//# sourceMappingURL=chunk-
|
|
541
|
+
//# sourceMappingURL=chunk-QE7W555R.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/flows/connect.ts"],"sourcesContent":["/**\n * `connect`: fill a Form's step or destination yourself once you know which\n * resource is meant, instead of parking the turn on the chat's picker card.\n *\n * Three sources, one write:\n * - `--hubspot-form <id>` — a HubSpot form as a `hubspotForm` destination.\n * - `--resource <id>` / `--new-sheet <title>` / nothing — Calendly, SavvyCal\n * and GoHighLevel steps; Google Sheets, Pipedrive and GoHighLevel\n * destinations. The backend reads the resource through the company's\n * connected account and answers with exactly what the card would write,\n * sealed under the flow key where it is a destination — so this command\n * writes ciphertext it cannot read.\n * - `--same-as <slug>:<id>` — the destination or step another Form already\n * has, copied as-is. No platform is asked anything.\n *\n * `request_flow_input` stays the path when nothing is connected, when a\n * spreadsheet has never been chosen, or when the agent cannot tell which\n * resource is meant.\n */\n\nimport {\n FLOW_AGENT_DESTINATION_KINDS,\n FLOW_PROVIDER_TYPE,\n type FlowAgentDestinationKind,\n type FlowsResolveResponse,\n type FlowsSealRequest,\n type FlowsSealResponse,\n type HubspotFormsDestinationResponse,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi } from \"../actions/shared.ts\";\nimport { hubspotRefusal } from \"../hubspot/refusal.ts\";\nimport { collectSideEffects, readFlowTree, readSettings, walkNodes, writeFlowTree } from \"./shared.ts\";\n\ntype AnyRecord = Record<string, unknown>;\n\ntype Sealed = { oauthProviderId: string; encryptedConfig: string };\n\ntype Attached = { ok: true; nodeId: string; sideEffectId: string } | { ok: false; message: string; fix: string };\n\ntype Target = { kind: string; on: \"node\" | \"sideEffect\"; ids: string[] };\n\ntype Stepped = { ok: true; nodeId: string; type: string } | { ok: false; message: string; fix: string };\n\nconst STEP_KINDS = new Set([\"calendly\", \"savvycal\", \"highlevel\", \"highlevelForm\", \"hubspot\", \"hubspotMeeting\"]);\nconst OAUTH_SIDE_EFFECTS = new Set([\"hubspotForm\", \"googleSpreadsheet\", \"pipedrive\", \"goHighlevelContact\"]);\n\n/**\n * Put the sealed destination on the side effect `named` picks — or, with no\n * name, on the form's only one of `type`. Mutates `tree`; the caller writes it.\n */\nexport function attachDestination(\n tree: AnyRecord,\n named: string | undefined,\n sealed: Sealed,\n type = \"hubspotForm\",\n): Attached {\n const ofType = collectSideEffects(tree).filter((entry) => entry.sideEffect.type === type);\n const inventory = ofType.map((entry) => String(entry.sideEffect.id)).join(\", \") || \"none\";\n const chosen = named\n ? collectSideEffects(tree).find((entry) => entry.sideEffect.id === named)\n : ofType.length === 1\n ? ofType[0]\n : undefined;\n if (!chosen) {\n return {\n ok: false,\n message: named\n ? `No side effect with id \"${named}\" in this form.`\n : `This form has ${ofType.length} ${type} side effects — name one with --side-effect <id>.`,\n fix:\n ofType.length === 0\n ? `Add one first: baker flows add-side-effect <slug> --node <stepId> --type ${type}`\n : `${type} side effects in this form: ${inventory}`,\n };\n }\n if (chosen.sideEffect.type !== type) {\n return {\n ok: false,\n message: `Side effect \"${named}\" is a ${String(chosen.sideEffect.type)}, not a ${type}.`,\n fix: `${type} side effects in this form: ${inventory}`,\n };\n }\n chosen.sideEffect.oauthProviderId = sealed.oauthProviderId;\n chosen.sideEffect.encryptedConfig = sealed.encryptedConfig;\n return { ok: true, nodeId: String(chosen.node.id), sideEffectId: String(chosen.sideEffect.id) };\n}\n\nfunction isSet(value: unknown): boolean {\n return typeof value === \"string\" && value.length > 0;\n}\n\n/**\n * Every side effect of `type` that still lacks its account or its config — what\n * `--all` wires. One already wired is left alone, so re-running after a partial\n * setup never repoints a destination someone chose.\n */\nexport function unwiredSideEffects(tree: AnyRecord, type: string): string[] {\n return collectSideEffects(tree)\n .filter(({ sideEffect }) => sideEffect.type === type)\n .filter(\n ({ sideEffect }) =>\n (OAUTH_SIDE_EFFECTS.has(type) && !isSet(sideEffect.oauthProviderId)) || !isSet(sideEffect.encryptedConfig),\n )\n .map(({ sideEffect }) => String(sideEffect.id));\n}\n\nexport function unwiredHubspotForms(tree: AnyRecord): string[] {\n return unwiredSideEffects(tree, \"hubspotForm\");\n}\n\n/** Destinations with nothing confidential in them: the agent states them, no card. */\nconst STATED_KINDS = new Set([\"email\", \"httpWebhook\"]);\n\n/** The stated kind an `--email` / `--subject` / `--url` call is about. */\nfunction statedKind(args: AnyRecord): string | undefined {\n if (typeof args.email === \"string\" || typeof args.subject === \"string\") return \"email\";\n if (typeof args.url === \"string\") return \"httpWebhook\";\n return undefined;\n}\n\ntype SealPlan = { ok: true; request: FlowsSealRequest } | { ok: false; message: string; fix: string };\n\n/** What `--email/--subject` or `--url` say, as the request the backend seals — or why not. */\nexport function sealRequestFor(kind: string, args: AnyRecord): SealPlan {\n const text = (key: string) => (typeof args[key] === \"string\" && args[key].trim() ? args[key].trim() : undefined);\n if (kind === \"email\") {\n const email = text(\"email\");\n const subject = text(\"subject\");\n if (!email || !subject) {\n return {\n ok: false,\n message: \"An email destination needs both who receives it and its subject.\",\n fix: 'Pass --email \"a@x.com, b@x.com\" --subject \"New lead — <Form name>\". Write the subject yourself from the Form; ask the user only for an address you were not given.',\n };\n }\n return { ok: true, request: { type: \"email\", email, subject } };\n }\n if (kind === \"httpWebhook\") {\n const apiUrl = text(\"url\");\n if (!apiUrl) {\n return { ok: false, message: \"A webhook destination needs its address.\", fix: \"Pass --url https://…\" };\n }\n return { ok: true, request: { type: \"httpWebhook\", apiUrl } };\n }\n return {\n ok: false,\n message: `A ${kind} destination holds a credential, so it is not one you can state.`,\n fix: \"Its token or URL is the user's to enter: request_flow_input.\",\n };\n}\n\ntype Restatable = { ok: true; ids: string[]; skipped: string[] } | { ok: false; message: string; fix: string };\n\n/** Why a stated value must not replace what `settings` holds, or undefined when it may. */\nconst UNREADABLE = \"holds settings this chat cannot read\";\n\nfunction keepsWhatTheAgentCannotState(kind: string, settings: AnyRecord | null | undefined): string | undefined {\n if (settings === null) return UNREADABLE;\n if (kind === \"httpWebhook\" && typeof settings?.auth === \"string\" && settings.auth !== \"noAuth\") {\n return \"sends a credential the user entered\";\n }\n if (kind === \"email\" && settings !== undefined && \"email\" in settings && typeof settings.email !== \"string\") {\n return \"replies to the visitor's own email answer\";\n }\n return undefined;\n}\n\n/**\n * Which of `target`'s destinations a stated `--email` / `--url` may overwrite.\n * The sealed value is replaced whole, so a webhook's credential or a reply to\n * the visitor's own address would be lost and nothing the agent can say puts it\n * back. One whose settings came back unreadable (null) is treated the same:\n * unknown is not empty. `--all` passes over those. An unreadable email may be\n * replaced explicitly with a complete recipient list and subject, without\n * reading the old value or claiming ownership of its ciphertext.\n */\nexport function restatableTargets(\n target: Target,\n settingsById: Record<string, AnyRecord | null>,\n all: boolean,\n replaceUnreadableEmail = false,\n): Restatable {\n const kept = target.ids.flatMap((id) => {\n if (\n target.kind === \"email\" &&\n settingsById[id] === null &&\n replaceUnreadableEmail &&\n !all &&\n target.ids.length === 1\n ) {\n return [];\n }\n const why = keepsWhatTheAgentCannotState(target.kind, settingsById[id]);\n return why ? [{ id, why }] : [];\n });\n const ids = target.ids.filter((id) => !kept.some((entry) => entry.id === id));\n if (kept.length > 0 && (!all || ids.length === 0)) {\n const [first] = kept;\n return {\n ok: false,\n message: `\"${first?.id}\" ${first?.why}; restating it would replace that.`,\n fix:\n first?.why === UNREADABLE\n ? target.kind === \"email\"\n ? `Baker cannot read the old recipients or tell whether this replies to a visitor. If the user wants to replace this destination, pass --side-effect ${first?.id} --replace-unreadable --email <complete recipient list> --subject <subject>. This replaces its entire previous setup; never use it to add a recipient to an unknown list. Otherwise leave it as it is and add a separate team email destination.`\n : \"Have the user restate the webhook address and any credential once with request_flow_input; after that this command can change a webhook with no credential.\"\n : target.kind === \"httpWebhook\"\n ? \"A new address for a webhook with a credential is the user's to enter with it: request_flow_input.\"\n : \"Leave it as it is. Add a separate email destination for the team: baker flows add-side-effect.\",\n };\n }\n return { ok: true, ids, skipped: kept.map((entry) => entry.id) };\n}\n\n/** Write sealed settings onto a destination that has no account (email, webhook). Mutates `tree`. */\nexport function attachSettings(tree: AnyRecord, id: string, encryptedConfig: string, type: string): Attached {\n const chosen = collectSideEffects(tree).find((entry) => entry.sideEffect.id === id);\n if (!chosen || chosen.sideEffect.type !== type) {\n const ofType = collectSideEffects(tree).filter((entry) => entry.sideEffect.type === type);\n return {\n ok: false,\n message: chosen\n ? `Side effect \"${id}\" is a ${String(chosen.sideEffect.type)}, not a ${type}.`\n : `No side effect with id \"${id}\" in this form.`,\n fix: `${type} side effects in this form: ${ofType.map((entry) => String(entry.sideEffect.id)).join(\", \") || \"none\"}`,\n };\n }\n chosen.sideEffect.encryptedConfig = encryptedConfig;\n return { ok: true, nodeId: String(chosen.node.id), sideEffectId: id };\n}\n\nfunction stepType(node: AnyRecord | undefined): string | undefined {\n const type = (node?.nodeData as AnyRecord | undefined)?.type;\n return typeof type === \"string\" ? type : undefined;\n}\n\nfunction findStep(tree: AnyRecord, nodeId: string): AnyRecord | undefined {\n return walkNodes(tree).find((node) => node.id === nodeId);\n}\n\n/** Write a picked resource into a step's `form.external`, keeping what the step autofills. */\nexport function attachStep(tree: AnyRecord, nodeId: string, external: AnyRecord): Stepped {\n const node = findStep(tree, nodeId);\n const type = stepType(node);\n if (!node || !type) {\n return {\n ok: false,\n message: `No step with id \"${nodeId}\" in this form.`,\n fix: \"Step ids: baker flows show <slug>\",\n };\n }\n if (!STEP_KINDS.has(type)) {\n return {\n ok: false,\n message: `Step \"${nodeId}\" is a ${type}, which embeds nothing from another platform.`,\n fix: \"Only calendly, savvycal, highlevel, highlevelForm, hubspot and hubspotMeeting steps take a resource.\",\n };\n }\n const nodeData = node.nodeData as AnyRecord;\n const form = (nodeData.form as AnyRecord | undefined) ?? {};\n nodeData.form = { autofilledFields: {}, ...form, external };\n return { ok: true, nodeId, type };\n}\n\n/** Steps of `type` with nothing picked yet — what `--all` fills for a step kind. */\nexport function unpickedSteps(tree: AnyRecord, type: string): string[] {\n return walkNodes(tree)\n .filter((node) => stepType(node) === type)\n .filter((node) => ((node.nodeData as AnyRecord).form as AnyRecord | undefined)?.external == null)\n .map((node) => String(node.id));\n}\n\n/**\n * Give `targetId` exactly the destination (or picked resource) `sourceId`\n * already has in another Form. Only between the same type: a sheet's sealed\n * config means nothing to Pipedrive.\n */\nexport function copyDestination(source: AnyRecord, sourceId: string, target: AnyRecord, targetId: string): Stepped {\n const from = collectSideEffects(source).find((entry) => entry.sideEffect.id === sourceId);\n if (from) {\n const type = String(from.sideEffect.type);\n if (!isSet(from.sideEffect.oauthProviderId) || !isSet(from.sideEffect.encryptedConfig)) {\n return {\n ok: false,\n message: `\"${sourceId}\" is not wired itself — nothing to copy.`,\n fix: \"Copy from one that is.\",\n };\n }\n const attached = attachDestination(\n target,\n targetId,\n {\n oauthProviderId: String(from.sideEffect.oauthProviderId),\n encryptedConfig: String(from.sideEffect.encryptedConfig),\n },\n type,\n );\n return attached.ok ? { ok: true, nodeId: attached.nodeId, type } : attached;\n }\n const step = findStep(source, sourceId);\n const external = ((step?.nodeData as AnyRecord | undefined)?.form as AnyRecord | undefined)?.external;\n if (!step || external == null || typeof external !== \"object\") {\n return {\n ok: false,\n message: `No wired side effect or picked step \"${sourceId}\" in the source form.`,\n fix: \"Ids: baker flows show <slug>\",\n };\n }\n const targetType = stepType(findStep(target, targetId));\n if (targetType !== stepType(step)) {\n return {\n ok: false,\n message: `\"${sourceId}\" is a ${String(stepType(step))} and \"${targetId}\" a ${String(targetType)} — copy only between the same type.`,\n fix: \"Pick a source of the same type.\",\n };\n }\n return attachStep(target, targetId, structuredClone(external as AnyRecord));\n}\n\nfunction refuse(\n message: string,\n fix: string | { action: string; explanation: string },\n code = \"VALIDATION_ERROR\",\n): never {\n writeJson({ ok: false, error: { code, message, fix } });\n process.exit(1);\n}\n\nfunction allTargets(tree: AnyRecord, kind: string | undefined): Target {\n if (!kind) refuse(\"--all needs --type <kind> to know what to wire.\", \"e.g. --all --type googleSpreadsheet\");\n const on = STEP_KINDS.has(kind) ? \"node\" : \"sideEffect\";\n // A stated destination is restated whole (\"every lead to Vicente and Fran\"), set or not.\n const ids = STATED_KINDS.has(kind)\n ? collectSideEffects(tree)\n .filter(({ sideEffect }) => sideEffect.type === kind)\n .map(({ sideEffect }) => String(sideEffect.id))\n : on === \"node\"\n ? unpickedSteps(tree, kind)\n : unwiredSideEffects(tree, kind);\n if (ids.length === 0 && STATED_KINDS.has(kind)) {\n refuse(\n `This Form has no ${kind} destination.`,\n `Add one: baker flows add-side-effect <slug> --node <stepId> --type ${kind}`,\n );\n }\n if (ids.length === 0) {\n refuse(\n `Every ${kind} in this Form is already wired.`,\n \"Repoint one by naming it with --node / --side-effect instead of --all.\",\n );\n }\n return { kind, on, ids };\n}\n\nfunction onlyOfType(tree: AnyRecord, type: string): string {\n const probe = attachDestination(tree, undefined, { oauthProviderId: \"\", encryptedConfig: \"\" }, type);\n if (!probe.ok) refuse(probe.message, probe.fix);\n return probe.sideEffectId;\n}\n\nfunction stepTarget(tree: AnyRecord, node: string): Target {\n const type = stepType(findStep(tree, node));\n if (!type) refuse(`No step with id \"${node}\" in this form.`, \"Step ids: baker flows show <slug>\");\n return { kind: type, on: \"node\", ids: [node] };\n}\n\nfunction sideEffectTarget(tree: AnyRecord, named: string): Target {\n const found = collectSideEffects(tree).find((entry) => entry.sideEffect.id === named);\n if (!found) refuse(`No side effect with id \"${named}\" in this form.`, \"Side-effect ids: baker flows show <slug>\");\n return { kind: String(found.sideEffect.type), on: \"sideEffect\", ids: [named] };\n}\n\n/** Which steps or side effects this call fills, resolved before any platform is asked anything. */\nexport function targetsFor(tree: AnyRecord, args: AnyRecord): Target {\n const node = typeof args.node === \"string\" ? args.node : undefined;\n const named = typeof args[\"side-effect\"] === \"string\" ? args[\"side-effect\"] : undefined;\n if ([node, named, args.all === true ? \"all\" : undefined].filter(Boolean).length > 1) {\n refuse(\"Pass one of --node, --side-effect or --all.\", \"One target per call; --all for every unwired one.\");\n }\n if (args.all === true) {\n const kind = typeof args.type === \"string\" ? args.type : args[\"hubspot-form\"] ? \"hubspotForm\" : statedKind(args);\n return allTargets(tree, kind);\n }\n if (node) return stepTarget(tree, node);\n if (named) return sideEffectTarget(tree, named);\n if (args[\"hubspot-form\"]) return { kind: \"hubspotForm\", on: \"sideEffect\", ids: [onlyOfType(tree, \"hubspotForm\")] };\n const stated = statedKind(args);\n if (stated) return { kind: stated, on: \"sideEffect\", ids: [onlyOfType(tree, stated)] };\n return refuse(\n \"Name what to fill: --node <stepId>, --side-effect <id>, or --all --type <kind>.\",\n \"Ids: baker flows show <slug>\",\n );\n}\n\nasync function sealHubspotForm(formId: string): Promise<HubspotFormsDestinationResponse[\"data\"]> {\n try {\n return (await apiPost<HubspotFormsDestinationResponse>(\"/api/hubspot/forms/destination\", { formId })).data;\n } catch (err) {\n const refusal = err instanceof ApiError ? hubspotRefusal(err.code, err.message) : null;\n if (err instanceof ApiError && refusal !== null) refuse(err.message, refusal.fix, refusal.code);\n failApi(err);\n }\n}\n\nfunction isAgentKind(kind: string): kind is FlowAgentDestinationKind {\n return (FLOW_AGENT_DESTINATION_KINDS as readonly string[]).includes(kind);\n}\n\n/**\n * The refusals only the user can clear, as the call that clears them: nothing\n * connected is the connect card; two accounts is a question only when the\n * agent cannot tell which one the user means.\n */\nexport function destinationRefusal(\n kind: FlowAgentDestinationKind,\n err: ApiError,\n): { code: string; fix: string } | null {\n if (err.code === \"NOT_FOUND\" && err.message.includes(\"is connected to this company\")) {\n return {\n code: \"NOT_CONNECTED\",\n fix: `AGENT INSTRUCTION: only the user can connect it. Call request_connection with { platform: \"${FLOW_PROVIDER_TYPE[kind]}\", reason } — reason in their words — then run this again. Keep going with the rest of the task meanwhile.`,\n };\n }\n if (err.code === \"CONFLICT\" && err.message.includes(\"--account\")) {\n return {\n code: \"SEVERAL_ACCOUNTS\",\n fix: \"Pass --account <id> when the user or the brief makes clear which one; otherwise ask them which (AskUserQuestion), naming the accounts above.\",\n };\n }\n return null;\n}\n\nfunction resolveBody(kind: FlowAgentDestinationKind, args: AnyRecord): AnyRecord {\n const columns =\n typeof args.columns === \"string\"\n ? args.columns\n .split(\",\")\n .map((column) => column.trim())\n .filter(Boolean)\n : undefined;\n return {\n kind,\n ...(typeof args.account === \"string\" ? { account: args.account } : {}),\n ...(typeof args.resource === \"string\" ? { resourceId: args.resource } : {}),\n ...(typeof args.tab === \"string\" ? { tab: args.tab } : {}),\n ...(typeof args[\"new-sheet\"] === \"string\" ? { newSheet: { title: args[\"new-sheet\"], columns } } : {}),\n };\n}\n\nasync function resolveDestination(\n kind: FlowAgentDestinationKind,\n args: AnyRecord,\n): Promise<FlowsResolveResponse[\"data\"]> {\n try {\n return (await apiPost<FlowsResolveResponse>(\"/api/flows/destinations/resolve\", resolveBody(kind, args))).data;\n } catch (err) {\n const refusal = err instanceof ApiError ? destinationRefusal(kind, err) : null;\n if (err instanceof ApiError && refusal !== null) refuse(err.message, refusal.fix, refusal.code);\n failApi(err);\n }\n}\n\ntype Wired = { wired: { nodeId: string; sideEffectId?: string }[]; destination: unknown; hints: string[] };\n\nfunction applyAll(target: Target, apply: (id: string) => Stepped | Attached): Wired[\"wired\"] {\n return target.ids.map((id) => {\n const done = apply(id);\n if (!done.ok) refuse(done.message, done.fix);\n return \"sideEffectId\" in done ? { nodeId: done.nodeId, sideEffectId: done.sideEffectId } : { nodeId: done.nodeId };\n });\n}\n\nfunction sameAs(tree: AnyRecord, target: Target, ref: string): Wired {\n const [slug, id] = ref.split(\":\");\n if (!slug || !id) refuse(`--same-as takes <slug>:<id>, got \"${ref}\".`, \"e.g. --same-as madrid:se-gsheet-1\");\n const source = readFlowTree(slug);\n const wired = applyAll(target, (targetId) => copyDestination(source, id, tree, targetId));\n return { wired, destination: { sameAs: ref }, hints: [] };\n}\n\nasync function fromHubspot(tree: AnyRecord, target: Target, formId: string, slug: string): Promise<Wired> {\n if (target.kind !== \"hubspotForm\") {\n refuse(\n `--hubspot-form wires a hubspotForm side effect, not a ${target.kind}.`,\n \"A HubSpot step takes `baker hubspot forms view <id> --as-node` (or `meetings view <slug> --as-node`).\",\n );\n }\n const sealed = await sealHubspotForm(formId);\n const wired = applyAll(target, (id) => attachDestination(tree, id, sealed));\n return {\n wired,\n destination: { formGuid: sealed.formGuid, formName: sealed.formName, portalId: sealed.portalId },\n hints: [\n `Now map each step's answers onto it: baker flows map ${slug} --side-effect <id> --hubspot-form ${sealed.formGuid} --map email=<value> … --write. Field names come from \\`baker hubspot forms view ${sealed.formGuid}\\`.`,\n ],\n };\n}\n\nfunction sheetHints(slug: string, data: Extract<FlowsResolveResponse[\"data\"], { target: \"sideEffect\" }>): string[] {\n const sheet = data.destination;\n if (!sheet)\n return [`Now map the fields: baker flows map ${slug} --side-effect <id> --map <fieldKey>=<value> … --write.`];\n const columns = sheet.columns.map((column) => `${column.letter}=${column.header}`).join(\", \");\n return [\n ...(sheet.created\n ? [\n `Created \"${sheet.name}\" in the connected Google account${sheet.url ? ` (${sheet.url})` : \"\"} — tell the user where their leads will land.`,\n ]\n : []),\n columns\n ? `Columns: ${columns}. Map by letter: baker flows map ${slug} --side-effect <id> --map A=<value> … --write.`\n : `The \"${sheet.tab}\" tab has no header row. Map by letter anyway, and say which column holds what.`,\n ];\n}\n\nasync function fromStated(tree: AnyRecord, target: Target, args: AnyRecord): Promise<Wired> {\n const plan = sealRequestFor(target.kind, args);\n if (!plan.ok) refuse(plan.message, plan.fix);\n const current = await readSettings(tree);\n if (current === null) {\n refuse(\n \"Could not read what this Form's destinations hold now, so nothing was overwritten.\",\n \"Try again in a moment; if it keeps failing, carry on with the rest and tell the user this one is not set.\",\n \"NETWORK_ERROR\",\n );\n }\n const restatable = restatableTargets(target, current, args.all === true, args[\"replace-unreadable\"] === true);\n if (!restatable.ok) refuse(restatable.message, restatable.fix);\n const kept = restatable.skipped.length\n ? [`Left as it was: ${restatable.skipped.join(\", \")} (it holds what only the user can set).`]\n : [];\n let sealed: FlowsSealResponse[\"data\"];\n try {\n sealed = (await apiPost<FlowsSealResponse>(\"/api/flows/destinations/seal\", plan.request)).data;\n } catch (err) {\n failApi(err);\n }\n const wired = applyAll({ ...target, ids: restatable.ids }, (id) =>\n attachSettings(tree, id, sealed.encryptedConfig, target.kind),\n );\n return {\n wired,\n destination: sealed.settings,\n hints: [\n ...kept,\n target.kind === \"email\"\n ? `Leads from these steps now go to ${String(sealed.settings.email)} with the subject \"${String(sealed.settings.subject)}\". Tell the user in those words.`\n : `Submissions now go to ${String(sealed.settings.apiUrl)}.`,\n ],\n };\n}\n\nasync function fromPlatform(tree: AnyRecord, target: Target, args: AnyRecord, slug: string): Promise<Wired> {\n const kind = target.kind;\n if (!isAgentKind(kind)) {\n const hubspotStep = kind === \"hubspot\" || kind === \"hubspotMeeting\";\n refuse(\n `A ${kind} ${target.on === \"node\" ? \"step\" : \"side effect\"} is not something this command can fill from a platform.`,\n hubspotStep\n ? \"Write the blob from `baker hubspot forms view <id> --as-node` (or `meetings view <slug> --as-node`) into the step's form.external.\"\n : OAUTH_SIDE_EFFECTS.has(kind)\n ? \"Pass --hubspot-form <formId>.\"\n : \"It takes typed credentials only the user has: request_flow_input.\",\n );\n }\n const data = await resolveDestination(kind, args);\n if (data.target === \"node\") {\n const wired = applyAll(target, (id) => attachStep(tree, id, data.external));\n return {\n wired,\n destination: { name: data.name, account: data.account },\n hints: [`Picked \"${data.name}\". Autofill its fields from earlier answers in the step's form.autofilledFields.`],\n };\n }\n const sealed = { oauthProviderId: data.oauthProviderId, encryptedConfig: data.encryptedConfig };\n const wired = applyAll(target, (id) => attachDestination(tree, id, sealed, kind));\n return {\n wired,\n destination: data.destination ? { ...data.destination, account: data.account } : { account: data.account },\n hints: sheetHints(slug, data),\n };\n}\n\nregisterSchema({\n command: \"flows.connect\",\n description:\n 'Fill a Form\\'s step or destination yourself — no card for the user. Steps: Calendly, SavvyCal, GoHighLevel calendar/form (`--node <id> --resource <id>`). Destinations: HubSpot form (`--hubspot-form <id>`), Google Sheets (`--resource <spreadsheetId>` or `--new-sheet <title> --columns …`), Pipedrive and GoHighLevel contact (no resource: the connected account is the destination), email (`--email \"a@x.com, b@x.com\" --subject \"New lead — <Form>\"`, never a card), webhook without a credential (`--url`). `--same-as <slug>:<id>` copies what another Form already has. `--all --type <kind>` fills every unwired one of that kind at once. Ids come from `baker flows options <kind>`. Fall back to request_flow_input only when nothing is connected, the sheet was never chosen, or several resources plausibly match.',\n args: {\n slug: { type: \"positional\", description: \"Form slug\", required: true },\n node: {\n type: \"string\",\n description: \"Step id to fill (calendly, savvycal, highlevel, highlevelForm)\",\n required: false,\n },\n \"side-effect\": { type: \"string\", description: \"Side-effect id to wire\", required: false },\n all: { type: \"boolean\", description: \"Every unwired one of --type in this Form\", required: false, default: false },\n type: { type: \"string\", description: \"The kind --all wires (e.g. googleSpreadsheet, calendly)\", required: false },\n resource: { type: \"string\", description: \"Option id from `baker flows options <kind>`\", required: false },\n \"hubspot-form\": {\n type: \"string\",\n description: \"HubSpot form id (from `baker hubspot forms list`)\",\n required: false,\n },\n \"new-sheet\": {\n type: \"string\",\n description: \"Create a Google spreadsheet with this title and wire it\",\n required: false,\n },\n columns: {\n type: \"string\",\n description: \"With --new-sheet: header row, comma-separated, from column A\",\n required: false,\n },\n tab: { type: \"string\", description: \"Google Sheets tab to append to (default: the first)\", required: false },\n \"same-as\": {\n type: \"string\",\n description: \"<slug>:<id> — copy another Form's wired destination or picked step\",\n required: false,\n },\n account: {\n type: \"string\",\n description: \"Connection id, when more than one account of the platform is connected\",\n required: false,\n },\n email: {\n type: \"string\",\n description:\n 'Email destination: who receives each lead, comma-separated for several (--email \"ana@x.com, luis@x.com\"). Never a card: you state it.',\n required: false,\n },\n subject: {\n type: \"string\",\n description:\n 'Email destination: the subject line. Write it yourself from the Form (\"New lead — Private events\").',\n required: false,\n },\n \"replace-unreadable\": {\n type: \"boolean\",\n description:\n \"Email only, one destination: replace unreadable old settings with the complete --email and --subject. Use only when the user intends replacement, never to add to an unknown recipient list. Does not apply with --all.\",\n required: false,\n default: false,\n },\n url: {\n type: \"string\",\n description:\n \"Webhook destination with no credential: its https address. One that needs a token goes to request_flow_input.\",\n required: false,\n },\n },\n});\n\nexport const connectCommand = defineCommand({\n meta: {\n name: \"connect\",\n description:\n 'Fill a step or destination yourself. Start here: baker flows options calendly, then baker flows connect contact --node book --resource <id>. Email: --side-effect se-email-1 --email \"ana@x.com, luis@x.com\" --subject \"New lead — Contact\". Sheets: --side-effect se-gsheet-1 --new-sheet \"Leads\" --columns \"Name,Email\". Same as another Form: --same-as madrid:se-gsheet-1',\n },\n args: {\n slug: { type: \"positional\", description: \"Form slug\", required: true },\n node: { type: \"string\", description: \"Step id to fill\" },\n \"side-effect\": { type: \"string\", description: \"Side-effect id to wire\" },\n all: { type: \"boolean\", description: \"Every unwired one of --type\" },\n type: { type: \"string\", description: \"The kind --all wires\" },\n resource: { type: \"string\", description: \"Option id from baker flows options <kind>\" },\n \"hubspot-form\": { type: \"string\", description: \"HubSpot form id (from baker hubspot forms list)\" },\n \"new-sheet\": { type: \"string\", description: \"Create a spreadsheet with this title\" },\n columns: { type: \"string\", description: \"Header row for --new-sheet, comma-separated\" },\n tab: { type: \"string\", description: \"Sheet tab (default: the first)\" },\n \"same-as\": { type: \"string\", description: \"<slug>:<id> to copy\" },\n account: { type: \"string\", description: \"Connection id when several are connected\" },\n email: { type: \"string\", description: \"Email destination: recipients, comma-separated\" },\n subject: { type: \"string\", description: \"Email destination: subject line\" },\n \"replace-unreadable\": {\n type: \"boolean\",\n description: \"Replace one unreadable email's entire setup with --email and --subject\",\n },\n url: { type: \"string\", description: \"Webhook destination with no credential: its address\" },\n },\n run: async ({ args }) => {\n const slug = String(args.slug);\n const target = targetsFor(readFlowTree(slug), args);\n\n const tree = readFlowTree(slug);\n const result =\n typeof args[\"same-as\"] === \"string\"\n ? sameAs(tree, target, args[\"same-as\"])\n : typeof args[\"hubspot-form\"] === \"string\"\n ? await fromHubspot(tree, target, args[\"hubspot-form\"], slug)\n : STATED_KINDS.has(target.kind)\n ? await fromStated(tree, target, args)\n : await fromPlatform(tree, target, args, slug);\n writeFlowTree(slug, tree);\n\n writeJson({\n ok: true,\n data: {\n slug,\n kind: target.kind,\n [target.on === \"node\" ? \"steps\" : \"sideEffects\"]: result.wired,\n destination: result.destination,\n connected: true,\n },\n hints: [...result.hints, \"Staged like any other edit in this chat: it goes live when the chat is published.\"],\n });\n },\n});\n"],"mappings":"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","names":["wired"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ANALYTICS_BUSY_FIX,
|
|
3
3
|
isAnalyticsBusy
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-4PDHHHUJ.js";
|
|
5
5
|
import {
|
|
6
6
|
ApiError
|
|
7
7
|
} from "./chunk-XBOK23HI.js";
|
|
@@ -17,4 +17,4 @@ function analyticsErrorEnvelope(err) {
|
|
|
17
17
|
export {
|
|
18
18
|
analyticsErrorEnvelope
|
|
19
19
|
};
|
|
20
|
-
//# sourceMappingURL=chunk-
|
|
20
|
+
//# sourceMappingURL=chunk-R25YLW6H.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
formEventKey
|
|
3
|
-
} from "./chunk-SSJK7FEV.js";
|
|
4
1
|
import {
|
|
5
2
|
flowNodeTriggers
|
|
6
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-7EPXVICM.js";
|
|
4
|
+
import {
|
|
5
|
+
formEventKey
|
|
6
|
+
} from "./chunk-HR6IWNKE.js";
|
|
7
7
|
|
|
8
8
|
// ../api/src/analytics/flowEventKeys.ts
|
|
9
9
|
function flowNodes(node, acc = []) {
|
|
@@ -54,4 +54,4 @@ export {
|
|
|
54
54
|
flowNodes,
|
|
55
55
|
flowEventKeys
|
|
56
56
|
};
|
|
57
|
-
//# sourceMappingURL=chunk-
|
|
57
|
+
//# sourceMappingURL=chunk-RL5CP7N6.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
findSubreddits,
|
|
3
3
|
searchReddit
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-FYGR3I2A.js";
|
|
5
5
|
import {
|
|
6
6
|
holdUnbilledSpend
|
|
7
7
|
} from "./chunk-WTOYCUKH.js";
|
|
@@ -589,4 +589,4 @@ export {
|
|
|
589
589
|
researchCustomers,
|
|
590
590
|
customersCommand
|
|
591
591
|
};
|
|
592
|
-
//# sourceMappingURL=chunk-
|
|
592
|
+
//# sourceMappingURL=chunk-RX2DKU3W.js.map
|