@koda-sl/baker-cli 0.450.0-dev.b454c3dd2 → 0.450.0-dev.d6701597d
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -11
- package/dist/{account-XQXC7BR6.js → account-AL2ZDSR7.js} +4 -5
- package/dist/{account-XQXC7BR6.js.map → account-AL2ZDSR7.js.map} +1 -1
- package/dist/{accounts-722UY53A.js → accounts-HAFCLSR5.js} +3 -4
- package/dist/{accounts-722UY53A.js.map → accounts-HAFCLSR5.js.map} +1 -1
- package/dist/{accounts-E67BMK7T.js → accounts-O5MFO3QQ.js} +5 -6
- package/dist/{accounts-E67BMK7T.js.map → accounts-O5MFO3QQ.js.map} +1 -1
- package/dist/{actions-6TQMSVWD.js → actions-P35MEMGN.js} +18 -18
- package/dist/{add-2BEGRHUX.js → add-5GAN6CVO.js} +5 -28
- package/dist/add-5GAN6CVO.js.map +1 -0
- package/dist/{add-LEMKEOPO.js → add-6DTC6X5G.js} +2 -3
- package/dist/{add-LEMKEOPO.js.map → add-6DTC6X5G.js.map} +1 -1
- package/dist/{ads-AGYCVD62.js → ads-73PGA4YC.js} +4 -4
- package/dist/{advertisers-2VQKAYKG.js → advertisers-AE75CGVE.js} +3 -4
- package/dist/{advertisers-2VQKAYKG.js.map → advertisers-AE75CGVE.js.map} +1 -1
- package/dist/{analytics-IFELDWLL.js → analytics-FKCXIMPO.js} +20 -24
- package/dist/analytics-FKCXIMPO.js.map +1 -0
- package/dist/{analytics-OH5QEH7F.js → analytics-FPWQQGRM.js} +3 -4
- package/dist/{analytics-OH5QEH7F.js.map → analytics-FPWQQGRM.js.map} +1 -1
- package/dist/{assign-PTUJUCEL.js → assign-ABN2AQ4J.js} +3 -4
- package/dist/{assign-PTUJUCEL.js.map → assign-ABN2AQ4J.js.map} +1 -1
- package/dist/{audience-size-LRI6GJRT.js → audience-size-GNBJY35X.js} +3 -4
- package/dist/{audience-size-LRI6GJRT.js.map → audience-size-GNBJY35X.js.map} +1 -1
- package/dist/{audit-HWP7OPB7.js → audit-3VS63TBW.js} +3 -4
- package/dist/{audit-HWP7OPB7.js.map → audit-3VS63TBW.js.map} +1 -1
- package/dist/{autocomplete-J6DHU6MR.js → autocomplete-VS3XG3B7.js} +3 -4
- package/dist/{autocomplete-J6DHU6MR.js.map → autocomplete-VS3XG3B7.js.map} +1 -1
- package/dist/{avatars-467OSBD6.js → avatars-EKCKHCC3.js} +4 -4
- package/dist/{bid-pricing-EO5WLHGV.js → bid-pricing-Q72B65AY.js} +3 -4
- package/dist/{bid-pricing-EO5WLHGV.js.map → bid-pricing-Q72B65AY.js.map} +1 -1
- package/dist/{brand-YRTEPGBK.js → brand-C6PFGGQN.js} +2 -2
- package/dist/{brief-OSFJ2V7F.js → brief-YFJHQ5VQ.js} +7 -8
- package/dist/{brief-OSFJ2V7F.js.map → brief-YFJHQ5VQ.js.map} +1 -1
- package/dist/{campaign-groups-PQ6KSQJR.js → campaign-groups-KFFYQPU3.js} +8 -9
- package/dist/{campaign-groups-PQ6KSQJR.js.map → campaign-groups-KFFYQPU3.js.map} +1 -1
- package/dist/{campaign-writes-5OVLUD5E.js → campaign-writes-FHOS5XZY.js} +3 -4
- package/dist/{campaign-writes-5OVLUD5E.js.map → campaign-writes-FHOS5XZY.js.map} +1 -1
- package/dist/{campaigns-6T3NSUT2.js → campaigns-2NHWBF5C.js} +11 -12
- package/dist/{campaigns-6T3NSUT2.js.map → campaigns-2NHWBF5C.js.map} +1 -1
- package/dist/{campaigns-OYMXDGWX.js → campaigns-KZYZTXDS.js} +5 -5
- package/dist/{canvas-YQFG52IG.js → canvas-5NB27FX2.js} +13 -13
- package/dist/{capabilities-PXBKUN2G.js → capabilities-DJFTRJKS.js} +3 -4
- package/dist/{capabilities-PXBKUN2G.js.map → capabilities-DJFTRJKS.js.map} +1 -1
- package/dist/{catalog-XLXIM7IW.js → catalog-VSSY6FGI.js} +4 -4
- package/dist/{chats-UK47UE7C.js → chats-D2CSDX5Q.js} +3 -4
- package/dist/{chats-UK47UE7C.js.map → chats-D2CSDX5Q.js.map} +1 -1
- package/dist/{chunk-5ZNTADVR.js → chunk-3G3ZDLMI.js} +2 -2
- package/dist/{chunk-SJYEY5MV.js → chunk-3HJLHTWP.js} +3 -12
- package/dist/{chunk-SJYEY5MV.js.map → chunk-3HJLHTWP.js.map} +1 -1
- package/dist/{chunk-ZDMTXQ2Q.js → chunk-3IBYKLXR.js} +2 -2
- package/dist/{chunk-CWYAELVG.js → chunk-464O4MT2.js} +2 -2
- package/dist/{chunk-NA63BH7V.js → chunk-4AUMTNVB.js} +3 -3
- package/dist/{chunk-NDEE6G2J.js → chunk-4BQXAE7Z.js} +2 -2
- package/dist/{chunk-2AOE2MZQ.js → chunk-5ZDLTE5T.js} +3 -3
- package/dist/{chunk-ULG4QRTV.js → chunk-6NB47MRW.js} +2 -2
- package/dist/{chunk-24EB7EDR.js → chunk-7YCRFMXF.js} +3 -3
- package/dist/{chunk-WGUQHAJY.js → chunk-A4LOJ2VD.js} +2 -2
- package/dist/{chunk-6F7DVPOS.js → chunk-AEOSAVVL.js} +3 -3
- package/dist/{chunk-MACCF4JZ.js → chunk-CMPEUZOR.js} +22 -16
- package/dist/{chunk-MACCF4JZ.js.map → chunk-CMPEUZOR.js.map} +1 -1
- package/dist/{chunk-N4LAYIIN.js → chunk-CSYSX4D2.js} +2 -2
- package/dist/{chunk-RX2DKU3W.js → chunk-DGUNI37S.js} +2 -2
- package/dist/{chunk-QE7W555R.js → chunk-DWHIOO7E.js} +12 -163
- package/dist/chunk-DWHIOO7E.js.map +1 -0
- package/dist/{chunk-FPOGPFAG.js → chunk-EBWBG6YV.js} +51 -24
- package/dist/chunk-EBWBG6YV.js.map +1 -0
- package/dist/{chunk-NYIGXDUG.js → chunk-EDLZGTGN.js} +39 -1
- package/dist/chunk-EDLZGTGN.js.map +1 -0
- package/dist/{chunk-I3ZR655O.js → chunk-IR6D7K4H.js} +2 -2
- package/dist/{chunk-FUHN4MFY.js → chunk-JQJDXPCO.js} +2 -2
- package/dist/{chunk-7CTMH5AK.js → chunk-KAUOHQTF.js} +3 -3
- package/dist/{chunk-VYQ3QJ3C.js → chunk-KHRXPQID.js} +2 -2
- package/dist/{chunk-6Y7ZBENQ.js → chunk-LECGCWT5.js} +6 -6
- package/dist/{chunk-5WCSKQ7Z.js → chunk-LZ73CZGP.js} +6 -6
- package/dist/{chunk-R25YLW6H.js → chunk-MELOSESI.js} +2 -2
- package/dist/{chunk-DCRPXOJJ.js → chunk-MXYBTMKB.js} +2 -2
- package/dist/{chunk-54C6YDGJ.js → chunk-NPY4QUMQ.js} +2 -2
- package/dist/{chunk-LYQJ4PZW.js → chunk-OQ6663F4.js} +5 -5
- package/dist/{chunk-H3427GPU.js → chunk-OZRUJVIQ.js} +2 -2
- package/dist/{chunk-KMKEYI37.js → chunk-Q2V6E6SL.js} +3 -3
- package/dist/{chunk-VL43TNIP.js → chunk-QRP3PXWN.js} +2 -2
- package/dist/{chunk-HDLYPC6K.js → chunk-RPUSTYHL.js} +3 -5
- package/dist/{chunk-HDLYPC6K.js.map → chunk-RPUSTYHL.js.map} +1 -1
- package/dist/{chunk-C46GUI2S.js → chunk-RZBEK2VE.js} +2 -2
- package/dist/{chunk-2VPBIT65.js → chunk-S3A3YOKO.js} +8 -8
- package/dist/{chunk-FYGR3I2A.js → chunk-S77PZVYM.js} +3 -3
- package/dist/{chunk-VLMBTPXU.js → chunk-SHL7LOC3.js} +3 -3
- package/dist/{chunk-HR6IWNKE.js → chunk-SSJK7FEV.js} +1140 -1196
- package/dist/chunk-SSJK7FEV.js.map +1 -0
- package/dist/{chunk-KS2QY6MK.js → chunk-W3ZHJJVT.js} +4 -4
- package/dist/{chunk-7EPXVICM.js → chunk-XF4JUKVF.js} +5 -38
- package/dist/chunk-XF4JUKVF.js.map +1 -0
- package/dist/{chunk-RL5CP7N6.js → chunk-Y6O7EWYY.js} +5 -5
- package/dist/{chunk-6NY2GPR4.js → chunk-Y6ZQXUZ7.js} +3 -3
- package/dist/{chunk-HROZYQ5H.js → chunk-YRQYA2LR.js} +5 -63
- package/dist/chunk-YRQYA2LR.js.map +1 -0
- package/dist/{chunk-ASI4P6X2.js → chunk-YUCLMOEG.js} +6 -6
- package/dist/chunk-YUCLMOEG.js.map +1 -0
- package/dist/{chunk-WKQG6TER.js → chunk-ZEYEWPK6.js} +2 -2
- package/dist/{claim-W6G6VEG5.js → claim-FZ5OQLMU.js} +3 -4
- package/dist/{claim-W6G6VEG5.js.map → claim-FZ5OQLMU.js.map} +1 -1
- package/dist/cli.js +30 -30
- package/dist/{companies-TS6KBATJ.js → companies-DNI634RC.js} +3 -4
- package/dist/{companies-TS6KBATJ.js.map → companies-DNI634RC.js.map} +1 -1
- package/dist/{complete-LYR2HMQU.js → complete-2FZMGJV5.js} +3 -4
- package/dist/{complete-LYR2HMQU.js.map → complete-2FZMGJV5.js.map} +1 -1
- package/dist/{connect-FCXNVTXG.js → connect-QCOGEPP4.js} +6 -13
- package/dist/{conversation-6ZJGPCXM.js → conversation-6IOGV7B7.js} +3 -4
- package/dist/{conversation-6ZJGPCXM.js.map → conversation-6IOGV7B7.js.map} +1 -1
- package/dist/{conversions-UHB55MMQ.js → conversions-4SRZPBBX.js} +7 -8
- package/dist/{conversions-UHB55MMQ.js.map → conversions-4SRZPBBX.js.map} +1 -1
- package/dist/{create-EX6OWLNM.js → create-BJNMO6HT.js} +2 -3
- package/dist/{create-EX6OWLNM.js.map → create-BJNMO6HT.js.map} +1 -1
- package/dist/{create-JFSK4BOP.js → create-FX4OJ2XF.js} +3 -4
- package/dist/{create-JFSK4BOP.js.map → create-FX4OJ2XF.js.map} +1 -1
- package/dist/{create-JCA7JPLP.js → create-RM7HV77Y.js} +3 -4
- package/dist/{create-JCA7JPLP.js.map → create-RM7HV77Y.js.map} +1 -1
- package/dist/{create-WU22YYU2.js → create-VXM34ZWH.js} +3 -4
- package/dist/{create-WU22YYU2.js.map → create-VXM34ZWH.js.map} +1 -1
- package/dist/{creatives-FXUQ5WSD.js → creatives-B5NTXPUB.js} +10 -10
- package/dist/{creatives-KGXUOYPE.js → creatives-JSWBFQ5R.js} +8 -9
- package/dist/{creatives-KGXUOYPE.js.map → creatives-JSWBFQ5R.js.map} +1 -1
- package/dist/{credentials-MJC7PGKR.js → credentials-C33K6XCJ.js} +3 -4
- package/dist/{credentials-MJC7PGKR.js.map → credentials-C33K6XCJ.js.map} +1 -1
- package/dist/{critique-GS5VV5ZC.js → critique-4V5SKH7C.js} +6 -7
- package/dist/{critique-GS5VV5ZC.js.map → critique-4V5SKH7C.js.map} +1 -1
- package/dist/{critique-TPHR27KH.js → critique-ZS4ON3SU.js} +3 -4
- package/dist/{critique-TPHR27KH.js.map → critique-ZS4ON3SU.js.map} +1 -1
- package/dist/{crm-VK44O3ED.js → crm-52ROSWH5.js} +4 -5
- package/dist/{crm-VK44O3ED.js.map → crm-52ROSWH5.js.map} +1 -1
- package/dist/{crm-AVCM5D4G.js → crm-R5IXIFIV.js} +4 -5
- package/dist/{crm-AVCM5D4G.js.map → crm-R5IXIFIV.js.map} +1 -1
- package/dist/{customers-XH2DMTFH.js → customers-A36LOZOB.js} +5 -6
- package/dist/{delete-WI5E3DR3.js → delete-AIGE4Y4H.js} +3 -4
- package/dist/{delete-WI5E3DR3.js.map → delete-AIGE4Y4H.js.map} +1 -1
- package/dist/{delete-KRH2YMSZ.js → delete-HGHXY24R.js} +3 -4
- package/dist/{delete-KRH2YMSZ.js.map → delete-HGHXY24R.js.map} +1 -1
- package/dist/{delete-E3R3TKIL.js → delete-M2GDLPYN.js} +2 -3
- package/dist/{delete-E3R3TKIL.js.map → delete-M2GDLPYN.js.map} +1 -1
- package/dist/{demographics-XV5PBA77.js → demographics-NTWB2IMG.js} +3 -4
- package/dist/{demographics-XV5PBA77.js.map → demographics-NTWB2IMG.js.map} +1 -1
- package/dist/{discard-HTQUUHJR.js → discard-2WWQG6OU.js} +3 -4
- package/dist/{discard-HTQUUHJR.js.map → discard-2WWQG6OU.js.map} +1 -1
- package/dist/{domain-RECGZXJB.js → domain-Y2LT6JLT.js} +3 -4
- package/dist/{domain-RECGZXJB.js.map → domain-Y2LT6JLT.js.map} +1 -1
- package/dist/{draft-Q546QPPU.js → draft-EJXNNJ3Y.js} +4 -5
- package/dist/{draft-Q546QPPU.js.map → draft-EJXNNJ3Y.js.map} +1 -1
- package/dist/{draft-PVTX6QT6.js → draft-FJ7WHIXW.js} +3 -4
- package/dist/{draft-PVTX6QT6.js.map → draft-FJ7WHIXW.js.map} +1 -1
- package/dist/{draft-2IBSJEKC.js → draft-SLHAKJ2A.js} +3 -4
- package/dist/{draft-2IBSJEKC.js.map → draft-SLHAKJ2A.js.map} +1 -1
- package/dist/engine/index.js +3 -3
- package/dist/{facets-7EVPJMKS.js → facets-U7AQC4H6.js} +3 -4
- package/dist/{facets-7EVPJMKS.js.map → facets-U7AQC4H6.js.map} +1 -1
- package/dist/{feedback-EIZKS4JU.js → feedback-OLTCHE6C.js} +2 -2
- package/dist/{feedback-record-TKO54BOE.js → feedback-record-7WZ4H7EP.js} +8 -9
- package/dist/{feedback-record-TKO54BOE.js.map → feedback-record-7WZ4H7EP.js.map} +1 -1
- package/dist/{fetch-4BY6HYUM.js → fetch-W7NULDEO.js} +3 -4
- package/dist/{fetch-4BY6HYUM.js.map → fetch-W7NULDEO.js.map} +1 -1
- package/dist/{find-FRRHAPWX.js → find-OTDIX6V4.js} +4 -4
- package/dist/{flows-KTFAML22.js → flows-KABCBS3S.js} +17 -21
- package/dist/flows-KABCBS3S.js.map +1 -0
- package/dist/{fonts-MXR3ZKDX.js → fonts-EMMX3KII.js} +5 -6
- package/dist/{forecast-3QTJYVND.js → forecast-GNODEIIC.js} +3 -4
- package/dist/{forecast-3QTJYVND.js.map → forecast-GNODEIIC.js.map} +1 -1
- package/dist/{funnel-I6XIAEHG.js → funnel-AAX27NH4.js} +455 -11
- package/dist/funnel-AAX27NH4.js.map +1 -0
- package/dist/{ga4-DV2AXCSL.js → ga4-UDQ2HA2J.js} +1 -1
- package/dist/{get-5PKNKJ5S.js → get-QEYJRLV3.js} +4 -7
- package/dist/get-QEYJRLV3.js.map +1 -0
- package/dist/{get-72YPHJGV.js → get-RTVUZM6E.js} +3 -4
- package/dist/{get-72YPHJGV.js.map → get-RTVUZM6E.js.map} +1 -1
- package/dist/{google-QYYYSSXI.js → google-KTO3PLEU.js} +5 -5
- package/dist/{google-6OGZX47I.js → google-M7KEXVK5.js} +2 -2
- package/dist/{google-ads-QGMQKZQD.js → google-ads-OK6IG3UV.js} +3 -4
- package/dist/{google-ads-QGMQKZQD.js.map → google-ads-OK6IG3UV.js.map} +1 -1
- package/dist/{gsc-TAKOF7J5.js → gsc-P3QYGDV2.js} +1 -1
- package/dist/{history-6AVQX2OQ.js → history-PQUJKK26.js} +3 -4
- package/dist/{history-6AVQX2OQ.js.map → history-PQUJKK26.js.map} +1 -1
- package/dist/{hubspot-SVEMFK5S.js → hubspot-Y77VLY6Y.js} +8 -9
- package/dist/{hubspot-SVEMFK5S.js.map → hubspot-Y77VLY6Y.js.map} +1 -1
- package/dist/{icon-L4RSS6PZ.js → icon-I43F77FV.js} +4 -4
- package/dist/{ideas-NFOW3HKJ.js → ideas-MIDU7YOA.js} +2 -3
- package/dist/{images-2EFFUNNV.js → images-S254MS6O.js} +9 -9
- package/dist/{ingest-2SO62RRI.js → ingest-J4I3HKM3.js} +2 -3
- package/dist/{ingest-2SO62RRI.js.map → ingest-J4I3HKM3.js.map} +1 -1
- package/dist/{ingest-2EIKN4QC.js → ingest-YV2NLDBE.js} +3 -4
- package/dist/{inspect-4OOS4APT.js → inspect-Q5NHBBHX.js} +3 -4
- package/dist/{inspect-4OOS4APT.js.map → inspect-Q5NHBBHX.js.map} +1 -1
- package/dist/{inspiration-S3DU4CMQ.js → inspiration-P265QJ2H.js} +1 -1
- package/dist/{keyword-metrics-SF4CSNZ2.js → keyword-metrics-PDY4ZXSP.js} +3 -4
- package/dist/{keyword-metrics-SF4CSNZ2.js.map → keyword-metrics-PDY4ZXSP.js.map} +1 -1
- package/dist/{keywords-for-site-WDAOPNKC.js → keywords-for-site-GALSCV77.js} +3 -4
- package/dist/{keywords-for-site-WDAOPNKC.js.map → keywords-for-site-GALSCV77.js.map} +1 -1
- package/dist/{landing-2ZB46LXH.js → landing-CJYGWCK4.js} +3 -3
- package/dist/{leads-A4W5KTWB.js → leads-PHKG6CP3.js} +3 -4
- package/dist/{leads-A4W5KTWB.js.map → leads-PHKG6CP3.js.map} +1 -1
- package/dist/{learn-IPULBCOD.js → learn-FUQSY7DN.js} +4 -5
- package/dist/{learn-IPULBCOD.js.map → learn-FUQSY7DN.js.map} +1 -1
- package/dist/{line-item-writes-EMYSOJKM.js → line-item-writes-E6MZPIZZ.js} +3 -4
- package/dist/{line-item-writes-EMYSOJKM.js.map → line-item-writes-E6MZPIZZ.js.map} +1 -1
- package/dist/{line-items-5NECXUZT.js → line-items-7ZGIKEF2.js} +5 -5
- package/dist/{link-CI45HWFN.js → link-QYAW6A2W.js} +3 -4
- package/dist/{link-CI45HWFN.js.map → link-QYAW6A2W.js.map} +1 -1
- package/dist/{linkedin-B7SYR75X.js → linkedin-FFSDSGGS.js} +26 -27
- package/dist/{linkedin-B7SYR75X.js.map → linkedin-FFSDSGGS.js.map} +1 -1
- package/dist/{list-ZBT3EBVZ.js → list-5IC6KIKO.js} +3 -4
- package/dist/{list-ZBT3EBVZ.js.map → list-5IC6KIKO.js.map} +1 -1
- package/dist/{list-2BARXOT5.js → list-NVQC5SNY.js} +2 -3
- package/dist/{list-2BARXOT5.js.map → list-NVQC5SNY.js.map} +1 -1
- package/dist/{list-BIEVLEHS.js → list-SAV3LQHY.js} +3 -4
- package/dist/{list-BIEVLEHS.js.map → list-SAV3LQHY.js.map} +1 -1
- package/dist/{log-C23OOAJZ.js → log-XZPVOALD.js} +3 -4
- package/dist/{log-C23OOAJZ.js.map → log-XZPVOALD.js.map} +1 -1
- package/dist/{logo-Q5D7PZY6.js → logo-2IP663QO.js} +3 -3
- package/dist/{lookup-ETWY47F7.js → lookup-XK45W2SH.js} +5 -6
- package/dist/{make-TPKKJXGL.js → make-BMWRKIIY.js} +20 -18
- package/dist/{make-TPKKJXGL.js.map → make-BMWRKIIY.js.map} +1 -1
- package/dist/{map-SYZMPHLL.js → map-4J5WIWIG.js} +4 -5
- package/dist/{map-SYZMPHLL.js.map → map-4J5WIWIG.js.map} +1 -1
- package/dist/{mcp-6FQBVJ6F.js → mcp-XXD7ZQCP.js} +2 -3
- package/dist/{mcp-6FQBVJ6F.js.map → mcp-XXD7ZQCP.js.map} +1 -1
- package/dist/{media-sources-ZXHEEP6T.js → media-sources-O6ZRUA3N.js} +2 -2
- package/dist/{members-UDY4OOJW.js → members-D5ZYLS4Y.js} +3 -4
- package/dist/{members-UDY4OOJW.js.map → members-D5ZYLS4Y.js.map} +1 -1
- package/dist/{normalize-DAKHYS3V.js → normalize-PCNC6E2N.js} +3 -7
- package/dist/{normalize-DAKHYS3V.js.map → normalize-PCNC6E2N.js.map} +1 -1
- package/dist/{options-QL3ULED5.js → options-MQ65VEVD.js} +6 -7
- package/dist/{options-QL3ULED5.js.map → options-MQ65VEVD.js.map} +1 -1
- package/dist/{performance-UF5VTY2U.js → performance-6QW2KEEQ.js} +4 -5
- package/dist/{promoted-tweet-writes-7HGESJ46.js → promoted-tweet-writes-JPLHY3GM.js} +3 -4
- package/dist/{promoted-tweet-writes-7HGESJ46.js.map → promoted-tweet-writes-JPLHY3GM.js.map} +1 -1
- package/dist/{promoted-tweets-LZKS5JIF.js → promoted-tweets-SURKMHFI.js} +3 -3
- package/dist/{publish-NPD3SMZL.js → publish-HCQ6MXLB.js} +3 -4
- package/dist/{publish-NPD3SMZL.js.map → publish-HCQ6MXLB.js.map} +1 -1
- package/dist/{reddit-NU2N3LZD.js → reddit-GIP3ADMS.js} +4 -5
- package/dist/{refresh-EBVJ2C6L.js → refresh-UXQSLCR3.js} +2 -3
- package/dist/{refresh-EBVJ2C6L.js.map → refresh-UXQSLCR3.js.map} +1 -1
- package/dist/{release-V43YB2PY.js → release-5KVLXNP6.js} +3 -4
- package/dist/{release-V43YB2PY.js.map → release-5KVLXNP6.js.map} +1 -1
- package/dist/{remove-QPSWLFI4.js → remove-6FIVKCJI.js} +2 -3
- package/dist/{remove-QPSWLFI4.js.map → remove-6FIVKCJI.js.map} +1 -1
- package/dist/{reopen-GQ66NMWF.js → reopen-YM5LNOLB.js} +3 -4
- package/dist/{reopen-GQ66NMWF.js.map → reopen-YM5LNOLB.js.map} +1 -1
- package/dist/{rerun-PZK275DY.js → rerun-6XZG7BGK.js} +17 -18
- package/dist/{rerun-PZK275DY.js.map → rerun-6XZG7BGK.js.map} +1 -1
- package/dist/{research-FMM6AWZC.js → research-2BLEISBG.js} +10 -10
- package/dist/{research-GEOCUBXB.js → research-YOGE7GT2.js} +2 -3
- package/dist/{research-GEOCUBXB.js.map → research-YOGE7GT2.js.map} +1 -1
- package/dist/{reset-REXJ6AUK.js → reset-C4UHQ3EU.js} +2 -3
- package/dist/{reset-REXJ6AUK.js.map → reset-C4UHQ3EU.js.map} +1 -1
- package/dist/{reset-Y72IVESB.js → reset-OLVB6AE6.js} +2 -3
- package/dist/{reset-Y72IVESB.js.map → reset-OLVB6AE6.js.map} +1 -1
- package/dist/{resolve-OGX7C4TV.js → resolve-XYH2GDAE.js} +3 -4
- package/dist/{resolve-OGX7C4TV.js.map → resolve-XYH2GDAE.js.map} +1 -1
- package/dist/{retry-TCUBBFR5.js → retry-726GKI6V.js} +2 -3
- package/dist/{retry-TCUBBFR5.js.map → retry-726GKI6V.js.map} +1 -1
- package/dist/{retry-CD6JAQ3F.js → retry-7EELDEQP.js} +2 -3
- package/dist/{retry-CD6JAQ3F.js.map → retry-7EELDEQP.js.map} +1 -1
- package/dist/{run-EUO34T2J.js → run-MMEDKJDB.js} +17 -18
- package/dist/{run-A5ZDXTOI.js → run-P4KR2MXC.js} +3 -4
- package/dist/{run-A5ZDXTOI.js.map → run-P4KR2MXC.js.map} +1 -1
- package/dist/{scaffold-ad-SW2HEWM3.js → scaffold-ad-PBTEWDAC.js} +12 -13
- package/dist/{scaffold-ad-SW2HEWM3.js.map → scaffold-ad-PBTEWDAC.js.map} +1 -1
- package/dist/{scaffold-static-ad-ECTJL54Y.js → scaffold-static-ad-RM4M4X5U.js} +36 -37
- package/dist/scaffold-static-ad-RM4M4X5U.js.map +1 -0
- package/dist/{scaffold-video-EI7U7RBK.js → scaffold-video-O2TTKZIE.js} +11 -12
- package/dist/{scaffold-video-EI7U7RBK.js.map → scaffold-video-O2TTKZIE.js.map} +1 -1
- package/dist/{schedule-S5YZJZ5U.js → schedule-RDK4GEPI.js} +2 -3
- package/dist/{schedule-S5YZJZ5U.js.map → schedule-RDK4GEPI.js.map} +1 -1
- package/dist/{scheduled-agents-N4LJRM4C.js → scheduled-agents-6U44QE76.js} +11 -11
- package/dist/{schema-R7JWWOF4.js → schema-CHJDC7GQ.js} +4 -8
- package/dist/{schema-R7JWWOF4.js.map → schema-CHJDC7GQ.js.map} +1 -1
- package/dist/{search-KHMQH3AT.js → search-PMJRU3C4.js} +2 -3
- package/dist/{search-KHMQH3AT.js.map → search-PMJRU3C4.js.map} +1 -1
- package/dist/{select-O2FN2JEQ.js → select-OEUKOVZ5.js} +8 -9
- package/dist/{select-O2FN2JEQ.js.map → select-OEUKOVZ5.js.map} +1 -1
- package/dist/{sends-BQZM5PLS.js → sends-WGJVQUMF.js} +4 -5
- package/dist/{sends-BQZM5PLS.js.map → sends-WGJVQUMF.js.map} +1 -1
- package/dist/{set-prompt-2HASHGWC.js → set-prompt-5E5I7QAZ.js} +8 -9
- package/dist/{set-prompt-2HASHGWC.js.map → set-prompt-5E5I7QAZ.js.map} +1 -1
- package/dist/{setup-links-GYSE56GX.js → setup-links-REPREN3C.js} +3 -4
- package/dist/{setup-links-GYSE56GX.js.map → setup-links-REPREN3C.js.map} +1 -1
- package/dist/{site-4SKM7RKG.js → site-WFSWIA3S.js} +4 -5
- package/dist/{site-4SKM7RKG.js.map → site-WFSWIA3S.js.map} +1 -1
- package/dist/{sources-R2NKNC6J.js → sources-AMI2AWKZ.js} +9 -10
- package/dist/{sources-R2NKNC6J.js.map → sources-AMI2AWKZ.js.map} +1 -1
- package/dist/{sources-FQ2UZTHL.js → sources-YBQ6KPFM.js} +6 -6
- package/dist/{stale-W756ACKC.js → stale-IGFUKEN2.js} +7 -8
- package/dist/{stale-W756ACKC.js.map → stale-IGFUKEN2.js.map} +1 -1
- package/dist/{status-SE2VZJJB.js → status-7F2KHFGA.js} +3 -4
- package/dist/{status-SE2VZJJB.js.map → status-7F2KHFGA.js.map} +1 -1
- package/dist/{stock-KXJ26BY4.js → stock-2YCDN3N6.js} +5 -5
- package/dist/{studio-SYKOSNDB.js → studio-RA7QQH4O.js} +1 -1
- package/dist/{sync-LJGSODK3.js → sync-GWTLKZTU.js} +2 -3
- package/dist/{sync-LJGSODK3.js.map → sync-GWTLKZTU.js.map} +1 -1
- package/dist/{sync-definition-QR2N233R.js → sync-definition-UGSDX2SZ.js} +11 -12
- package/dist/{tags-PYWFSBTR.js → tags-3WPW6PTV.js} +4 -4
- package/dist/{tags-QQU3OKMZ.js → tags-6342FQEB.js} +3 -4
- package/dist/{tags-QQU3OKMZ.js.map → tags-6342FQEB.js.map} +1 -1
- package/dist/{tags-5SBMRC2A.js → tags-ABHSX6M5.js} +3 -4
- package/dist/{tags-5SBMRC2A.js.map → tags-ABHSX6M5.js.map} +1 -1
- package/dist/{tags-YYLNF3PK.js → tags-FJIBBBRG.js} +3 -4
- package/dist/{tags-YYLNF3PK.js.map → tags-FJIBBBRG.js.map} +1 -1
- package/dist/{tags-4BAVFH4S.js → tags-KFYLZLB3.js} +2 -3
- package/dist/{tags-4BAVFH4S.js.map → tags-KFYLZLB3.js.map} +1 -1
- package/dist/{targeting-criteria-RJFLFICN.js → targeting-criteria-NR47AF5C.js} +3 -3
- package/dist/{targets-S2MT2PNB.js → targets-L56KOVQE.js} +3 -4
- package/dist/{targets-S2MT2PNB.js.map → targets-L56KOVQE.js.map} +1 -1
- package/dist/{templates-ZE5TOGRT.js → templates-B6XGDYUF.js} +3 -4
- package/dist/{templates-ZE5TOGRT.js.map → templates-B6XGDYUF.js.map} +1 -1
- package/dist/{testimonials-DII5DYLR.js → testimonials-CVC4YIXO.js} +6 -6
- package/dist/{top-companies-PGIAEHDF.js → top-companies-45X3DT7Z.js} +3 -4
- package/dist/{top-companies-PGIAEHDF.js.map → top-companies-45X3DT7Z.js.map} +1 -1
- package/dist/{translate-GXTS633J.js → translate-VP5R67PL.js} +11 -12
- package/dist/{translate-GXTS633J.js.map → translate-VP5R67PL.js.map} +1 -1
- package/dist/{triggers-2PTONXRU.js → triggers-22EMIVFD.js} +3 -4
- package/dist/{triggers-2PTONXRU.js.map → triggers-22EMIVFD.js.map} +1 -1
- package/dist/{unlink-XRMYJ6DB.js → unlink-65KUN6ID.js} +3 -4
- package/dist/{unlink-XRMYJ6DB.js.map → unlink-65KUN6ID.js.map} +1 -1
- package/dist/{unstage-FY7A3YFF.js → unstage-2E3I5SWF.js} +3 -4
- package/dist/{unstage-FY7A3YFF.js.map → unstage-2E3I5SWF.js.map} +1 -1
- package/dist/{unstage-RM2RLXKD.js → unstage-4ZEULXEQ.js} +4 -5
- package/dist/{unstage-RM2RLXKD.js.map → unstage-4ZEULXEQ.js.map} +1 -1
- package/dist/{update-S4562V3O.js → update-2S7CSEAW.js} +3 -4
- package/dist/{update-S4562V3O.js.map → update-2S7CSEAW.js.map} +1 -1
- package/dist/{update-V6YVEUI2.js → update-7NCOTAQZ.js} +3 -4
- package/dist/{update-V6YVEUI2.js.map → update-7NCOTAQZ.js.map} +1 -1
- package/dist/{update-PJ67D2OG.js → update-D6DJC6T7.js} +2 -3
- package/dist/{update-PJ67D2OG.js.map → update-D6DJC6T7.js.map} +1 -1
- package/dist/{update-E5SRBXQR.js → update-KREBPGBH.js} +3 -4
- package/dist/{update-E5SRBXQR.js.map → update-KREBPGBH.js.map} +1 -1
- package/dist/{upload-R6CQVLKF.js → upload-O6NHRPS7.js} +3 -4
- package/dist/{upload-R6CQVLKF.js.map → upload-O6NHRPS7.js.map} +1 -1
- package/dist/{url-options-JOKU46F2.js → url-options-GGXAL3J4.js} +3 -4
- package/dist/{url-options-JOKU46F2.js.map → url-options-GGXAL3J4.js.map} +1 -1
- package/dist/{url-params-7U2XMOWF.js → url-params-3EFGVTZZ.js} +3 -4
- package/dist/{url-params-7U2XMOWF.js.map → url-params-3EFGVTZZ.js.map} +1 -1
- package/dist/{validate-7YPOUKPB.js → validate-CSJM7XZM.js} +9 -10
- package/dist/{validate-7YPOUKPB.js.map → validate-CSJM7XZM.js.map} +1 -1
- package/dist/{videos-LICG6ACJ.js → videos-YSXYGTBM.js} +5 -5
- package/dist/{web-BA2PGTWU.js → web-IGIGVEKS.js} +3 -4
- package/dist/{web-BA2PGTWU.js.map → web-IGIGVEKS.js.map} +1 -1
- package/dist/{winning-ads-C6S2C5VP.js → winning-ads-2WS7FI4E.js} +2 -2
- package/dist/{write-commands-7SJ3BOW5.js → write-commands-5C7FUOVN.js} +4 -5
- package/dist/{write-commands-7SJ3BOW5.js.map → write-commands-5C7FUOVN.js.map} +1 -1
- package/dist/{x-CZHRC6U7.js → x-BFSKFCZD.js} +6 -6
- package/package.json +1 -1
- package/dist/add-2BEGRHUX.js.map +0 -1
- package/dist/analytics-IFELDWLL.js.map +0 -1
- package/dist/chunk-4PDHHHUJ.js +0 -537
- package/dist/chunk-4PDHHHUJ.js.map +0 -1
- package/dist/chunk-7EPXVICM.js.map +0 -1
- package/dist/chunk-ASI4P6X2.js.map +0 -1
- package/dist/chunk-FPOGPFAG.js.map +0 -1
- package/dist/chunk-HR6IWNKE.js.map +0 -1
- package/dist/chunk-HROZYQ5H.js.map +0 -1
- package/dist/chunk-NYIGXDUG.js.map +0 -1
- package/dist/chunk-QE7W555R.js.map +0 -1
- package/dist/flows-KTFAML22.js.map +0 -1
- package/dist/funnel-I6XIAEHG.js.map +0 -1
- package/dist/get-5PKNKJ5S.js.map +0 -1
- package/dist/plan-FT632COT.js +0 -51
- package/dist/plan-FT632COT.js.map +0 -1
- package/dist/questionnaire-JNGYJTAY.js +0 -37
- package/dist/questionnaire-JNGYJTAY.js.map +0 -1
- package/dist/scaffold-static-ad-ECTJL54Y.js.map +0 -1
- /package/dist/{actions-6TQMSVWD.js.map → actions-P35MEMGN.js.map} +0 -0
- /package/dist/{ads-AGYCVD62.js.map → ads-73PGA4YC.js.map} +0 -0
- /package/dist/{avatars-467OSBD6.js.map → avatars-EKCKHCC3.js.map} +0 -0
- /package/dist/{brand-YRTEPGBK.js.map → brand-C6PFGGQN.js.map} +0 -0
- /package/dist/{campaigns-OYMXDGWX.js.map → campaigns-KZYZTXDS.js.map} +0 -0
- /package/dist/{canvas-YQFG52IG.js.map → canvas-5NB27FX2.js.map} +0 -0
- /package/dist/{catalog-XLXIM7IW.js.map → catalog-VSSY6FGI.js.map} +0 -0
- /package/dist/{chunk-5ZNTADVR.js.map → chunk-3G3ZDLMI.js.map} +0 -0
- /package/dist/{chunk-ZDMTXQ2Q.js.map → chunk-3IBYKLXR.js.map} +0 -0
- /package/dist/{chunk-CWYAELVG.js.map → chunk-464O4MT2.js.map} +0 -0
- /package/dist/{chunk-NA63BH7V.js.map → chunk-4AUMTNVB.js.map} +0 -0
- /package/dist/{chunk-NDEE6G2J.js.map → chunk-4BQXAE7Z.js.map} +0 -0
- /package/dist/{chunk-2AOE2MZQ.js.map → chunk-5ZDLTE5T.js.map} +0 -0
- /package/dist/{chunk-ULG4QRTV.js.map → chunk-6NB47MRW.js.map} +0 -0
- /package/dist/{chunk-24EB7EDR.js.map → chunk-7YCRFMXF.js.map} +0 -0
- /package/dist/{chunk-WGUQHAJY.js.map → chunk-A4LOJ2VD.js.map} +0 -0
- /package/dist/{chunk-6F7DVPOS.js.map → chunk-AEOSAVVL.js.map} +0 -0
- /package/dist/{chunk-N4LAYIIN.js.map → chunk-CSYSX4D2.js.map} +0 -0
- /package/dist/{chunk-RX2DKU3W.js.map → chunk-DGUNI37S.js.map} +0 -0
- /package/dist/{chunk-I3ZR655O.js.map → chunk-IR6D7K4H.js.map} +0 -0
- /package/dist/{chunk-FUHN4MFY.js.map → chunk-JQJDXPCO.js.map} +0 -0
- /package/dist/{chunk-7CTMH5AK.js.map → chunk-KAUOHQTF.js.map} +0 -0
- /package/dist/{chunk-VYQ3QJ3C.js.map → chunk-KHRXPQID.js.map} +0 -0
- /package/dist/{chunk-6Y7ZBENQ.js.map → chunk-LECGCWT5.js.map} +0 -0
- /package/dist/{chunk-5WCSKQ7Z.js.map → chunk-LZ73CZGP.js.map} +0 -0
- /package/dist/{chunk-R25YLW6H.js.map → chunk-MELOSESI.js.map} +0 -0
- /package/dist/{chunk-DCRPXOJJ.js.map → chunk-MXYBTMKB.js.map} +0 -0
- /package/dist/{chunk-54C6YDGJ.js.map → chunk-NPY4QUMQ.js.map} +0 -0
- /package/dist/{chunk-LYQJ4PZW.js.map → chunk-OQ6663F4.js.map} +0 -0
- /package/dist/{chunk-H3427GPU.js.map → chunk-OZRUJVIQ.js.map} +0 -0
- /package/dist/{chunk-KMKEYI37.js.map → chunk-Q2V6E6SL.js.map} +0 -0
- /package/dist/{chunk-VL43TNIP.js.map → chunk-QRP3PXWN.js.map} +0 -0
- /package/dist/{chunk-C46GUI2S.js.map → chunk-RZBEK2VE.js.map} +0 -0
- /package/dist/{chunk-2VPBIT65.js.map → chunk-S3A3YOKO.js.map} +0 -0
- /package/dist/{chunk-FYGR3I2A.js.map → chunk-S77PZVYM.js.map} +0 -0
- /package/dist/{chunk-VLMBTPXU.js.map → chunk-SHL7LOC3.js.map} +0 -0
- /package/dist/{chunk-KS2QY6MK.js.map → chunk-W3ZHJJVT.js.map} +0 -0
- /package/dist/{chunk-RL5CP7N6.js.map → chunk-Y6O7EWYY.js.map} +0 -0
- /package/dist/{chunk-6NY2GPR4.js.map → chunk-Y6ZQXUZ7.js.map} +0 -0
- /package/dist/{chunk-WKQG6TER.js.map → chunk-ZEYEWPK6.js.map} +0 -0
- /package/dist/{connect-FCXNVTXG.js.map → connect-QCOGEPP4.js.map} +0 -0
- /package/dist/{creatives-FXUQ5WSD.js.map → creatives-B5NTXPUB.js.map} +0 -0
- /package/dist/{customers-XH2DMTFH.js.map → customers-A36LOZOB.js.map} +0 -0
- /package/dist/{feedback-EIZKS4JU.js.map → feedback-OLTCHE6C.js.map} +0 -0
- /package/dist/{find-FRRHAPWX.js.map → find-OTDIX6V4.js.map} +0 -0
- /package/dist/{fonts-MXR3ZKDX.js.map → fonts-EMMX3KII.js.map} +0 -0
- /package/dist/{ga4-DV2AXCSL.js.map → ga4-UDQ2HA2J.js.map} +0 -0
- /package/dist/{google-QYYYSSXI.js.map → google-KTO3PLEU.js.map} +0 -0
- /package/dist/{google-6OGZX47I.js.map → google-M7KEXVK5.js.map} +0 -0
- /package/dist/{gsc-TAKOF7J5.js.map → gsc-P3QYGDV2.js.map} +0 -0
- /package/dist/{icon-L4RSS6PZ.js.map → icon-I43F77FV.js.map} +0 -0
- /package/dist/{ideas-NFOW3HKJ.js.map → ideas-MIDU7YOA.js.map} +0 -0
- /package/dist/{images-2EFFUNNV.js.map → images-S254MS6O.js.map} +0 -0
- /package/dist/{ingest-2EIKN4QC.js.map → ingest-YV2NLDBE.js.map} +0 -0
- /package/dist/{inspiration-S3DU4CMQ.js.map → inspiration-P265QJ2H.js.map} +0 -0
- /package/dist/{landing-2ZB46LXH.js.map → landing-CJYGWCK4.js.map} +0 -0
- /package/dist/{line-items-5NECXUZT.js.map → line-items-7ZGIKEF2.js.map} +0 -0
- /package/dist/{logo-Q5D7PZY6.js.map → logo-2IP663QO.js.map} +0 -0
- /package/dist/{lookup-ETWY47F7.js.map → lookup-XK45W2SH.js.map} +0 -0
- /package/dist/{media-sources-ZXHEEP6T.js.map → media-sources-O6ZRUA3N.js.map} +0 -0
- /package/dist/{performance-UF5VTY2U.js.map → performance-6QW2KEEQ.js.map} +0 -0
- /package/dist/{promoted-tweets-LZKS5JIF.js.map → promoted-tweets-SURKMHFI.js.map} +0 -0
- /package/dist/{reddit-NU2N3LZD.js.map → reddit-GIP3ADMS.js.map} +0 -0
- /package/dist/{research-FMM6AWZC.js.map → research-2BLEISBG.js.map} +0 -0
- /package/dist/{run-EUO34T2J.js.map → run-MMEDKJDB.js.map} +0 -0
- /package/dist/{scheduled-agents-N4LJRM4C.js.map → scheduled-agents-6U44QE76.js.map} +0 -0
- /package/dist/{sources-FQ2UZTHL.js.map → sources-YBQ6KPFM.js.map} +0 -0
- /package/dist/{stock-KXJ26BY4.js.map → stock-2YCDN3N6.js.map} +0 -0
- /package/dist/{studio-SYKOSNDB.js.map → studio-RA7QQH4O.js.map} +0 -0
- /package/dist/{sync-definition-QR2N233R.js.map → sync-definition-UGSDX2SZ.js.map} +0 -0
- /package/dist/{tags-PYWFSBTR.js.map → tags-3WPW6PTV.js.map} +0 -0
- /package/dist/{targeting-criteria-RJFLFICN.js.map → targeting-criteria-NR47AF5C.js.map} +0 -0
- /package/dist/{testimonials-DII5DYLR.js.map → testimonials-CVC4YIXO.js.map} +0 -0
- /package/dist/{videos-LICG6ACJ.js.map → videos-YSXYGTBM.js.map} +0 -0
- /package/dist/{winning-ads-C6S2C5VP.js.map → winning-ads-2WS7FI4E.js.map} +0 -0
- /package/dist/{x-CZHRC6U7.js.map → x-BFSKFCZD.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/flows/add.ts"],"sourcesContent":["/**\n * `add-node` and `add-side-effect`: emit a valid skeleton and splice it in.\n *\n * The point is not to save typing — it is that the skeleton is right. A node\n * needs a fresh UUID, an explicit `condition: null`, the correct `nodeData`\n * discriminator, and — for a widget — `form.external: null` rather than an\n * invented resource. A side effect needs `encryptedConfig: null` and no\n * `oauthProviderId` key at all. Every one of those is a rule the flow-builder\n * skill used to spend prose on, and each was a real defect when got wrong.\n *\n * Deliberately scoped to creating the skeleton. Copy, conditions, autofill and\n * the `ai` field stay hand-edited: they are judgement, and a flag-based API for\n * them would be worse than JSON.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { type FlowConfigStatus, flowCatalogEntry, flowCatalogTypes, flowNodeTriggers } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport {\n flowDataPath,\n isUsableStepNameKey,\n readFlowTree,\n requestFlowInputCall,\n stepNameKey,\n walkNodes,\n writeFlowTree,\n} from \"./shared.ts\";\n\ntype AnyRecord = Record<string, unknown>;\n\nfunction unknownType(kind: \"node\" | \"side-effect\", type: string): never {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: `No ${kind} type \"${type}\".`,\n fix: `Known types: ${flowCatalogTypes(kind).join(\", \")}. See: baker flows schema ${kind}`,\n },\n });\n process.exit(1);\n}\n\n/** Replace the catalog's `<placeholder>` strings with real values where we have them. */\nfunction concrete(skeleton: AnyRecord, replacements: Record<string, unknown>): AnyRecord {\n return { ...structuredClone(skeleton), ...replacements };\n}\n\n/**\n * Whether this name can be a step in this form, and why not when it cannot.\n *\n * Both answers are about the same fact: the name becomes a constant in the\n * form's generated `_query.ts` (`export const <KEY> = \"<node id>\";`), and\n * `flow-typed.mjs` writes it without checking either that it parses or that no\n * other step already produced it. So both failures land on a generated file\n * rather than on the name that caused them — one as a syntax error, one as\n * `Duplicate flow node name` — and `_query.ts` stops regenerating for the whole\n * form. A name is minted once, here, which makes here the only cheap place to\n * say so.\n *\n * Returns `null` when the name is fine.\n */\nexport function stepNameRefusal(nodes: readonly AnyRecord[], name: string): { message: string; fix: string } | null {\n const key = stepNameKey(name);\n if (!isUsableStepNameKey(key)) {\n return {\n message: `\"${name}\" cannot be a step name: it becomes the constant \\`${key || \"(empty)\"}\\`, which is not a valid identifier.`,\n fix: 'A step name becomes `export const <NAME> = …` in the form\\'s generated code, so it must start with a letter and hold only letters, digits, spaces and dashes. Try \"Your Details\" rather than \"1. Your details\".',\n };\n }\n const clash = nodes.find((node) => typeof node.name === \"string\" && stepNameKey(node.name) === key);\n if (!clash) return null;\n return {\n message: `This form already has a step named \"${clash.name}\", which collides with \"${name}\".`,\n fix: `Both become the constant \\`${key}\\`, and the form's generated code cannot hold it twice. Pick a name that differs by more than case, spacing or punctuation.`,\n };\n}\n\nregisterSchema({\n command: \"flows.add-node\",\n description:\n \"Add a step to a form with a valid skeleton — fresh UUID, explicit condition, correct nodeData discriminator, and form.external:null for a widget. Author its copy and conditions afterwards by editing _data.json.\",\n args: {\n slug: { type: \"positional\", description: \"Form slug\", required: true },\n type: { type: \"string\", description: \"Node type (see: baker flows schema node)\", required: true },\n name: { type: \"string\", description: \"Step name — unique, Title Case\", required: true },\n parent: { type: \"string\", description: \"Parent node id. Omit to append to the root's children.\", required: false },\n },\n});\n\nexport const addNodeCommand = defineCommand({\n meta: {\n name: \"add-node\",\n description:\n 'Add a step to a form, with the skeleton its type requires. Example: baker flows add-node contact --type customForm --name \"Contact Info\"',\n },\n args: {\n slug: { type: \"positional\", description: \"Form slug\", required: true },\n type: { type: \"string\", description: \"Node type\", required: true },\n name: { type: \"string\", description: \"Step name — unique, Title Case\", required: true },\n parent: { type: \"string\", description: \"Parent node id (default: the root)\" },\n },\n run: ({ args }) => {\n const slug = String(args.slug);\n const type = String(args.type);\n // Trimmed before anything reads it, because the generator does not trim:\n // ` Contact Info ` becomes the constant `_CONTACT_INFO_`, which is legal,\n // permanent, and not what anyone typed.\n const name = String(args.name).trim();\n const entry = flowCatalogEntry(\"node\", type) ?? unknownType(\"node\", type);\n\n const tree = readFlowTree(slug);\n const nodes = walkNodes(tree);\n\n const refusal = stepNameRefusal(nodes, name);\n if (refusal) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: refusal.message.replace(\"This form\", `\"${slug}\"`),\n fix: refusal.fix,\n },\n });\n process.exit(1);\n }\n\n const parent = args.parent ? nodes.find((node) => node.id === String(args.parent)) : tree;\n if (!parent) {\n writeJson({\n ok: false,\n error: {\n code: \"NOT_FOUND\",\n message: `No node with id \"${args.parent}\" in \"${slug}\".`,\n fix: `Nodes in this form: ${nodes.map((node) => `${node.id} (${node.name})`).join(\", \")}`,\n },\n });\n process.exit(1);\n }\n\n const node = concrete(entry.skeleton, { id: randomUUID(), name });\n if (!Array.isArray(parent.children)) parent.children = [];\n (parent.children as AnyRecord[]).push(node);\n writeFlowTree(slug, tree);\n\n writeJson({\n ok: true,\n data: { slug, nodeId: node.id, type, parentId: parent.id ?? null, path: flowDataPath(slug) },\n hints: [\n `Now fill in this step's \\`ai\\` field and its copy by editing ${flowDataPath(slug)}.`,\n // Said on every step added, because the moment a Form's shape changes\n // is the moment its outcome can move — and a Form nobody named an\n // outcome for reports zero conversions rather than an error.\n `Say what this Form counts before you finish: \\`baker analytics conversions --flow ${slug}\\` lists every ending already spelled as an event key, including this step's. Nothing in _data.json decides it.`,\n ...(entry.owners?.[\"nodeData.form.external\"] === \"request_flow_input\"\n ? [\n `Pick this ${type} step's resource: ${requestFlowInputCall(slug, pendingItem(\"node\", String(node.id), type))}.`,\n ]\n : []),\n ...(entry.gotcha ? [entry.gotcha] : []),\n ],\n });\n },\n});\n\n/**\n * The `triggerId` a side effect on this step has to carry.\n *\n * This is the one field on a side effect that is decided by its STEP rather\n * than by its own type, and getting it wrong is silent in every direction:\n * `fireSideEffects` filters on `triggerId` equality, so a mismatch means the\n * side effect never runs — no error, no log, nothing half-written. Every\n * validator in the repo passes, because the file is valid; it just does nothing.\n *\n * Taking the skeleton's default was that failure. `SIDE_EFFECT_ENVELOPE` carries\n * `customForm.onFormSubmitted`, which is right for a `customForm` step and wrong\n * for the five widget types that raise an id of their own — so the command that\n * exists to emit a skeleton the agent cannot get wrong emitted a dead side\n * effect on any booking or embedded-form step.\n */\nexport type TriggerChoice = { ok: true; triggerId: string } | { ok: false; message: string; fix: string };\n\nexport function resolveTrigger(node: AnyRecord, requested: string | undefined): TriggerChoice {\n const triggers = flowNodeTriggers(node.nodeData);\n const where = `Step \"${String(node.name ?? node.id)}\"${triggers.type ? ` (a ${triggers.type} step)` : \"\"}`;\n const raises = triggers.available.length > 0 ? `It raises: ${triggers.available.join(\", \")}.` : (triggers.why ?? \"\");\n const no = (message: string, fix: string): TriggerChoice => ({ ok: false, message, fix });\n\n // A node type the table does not cover is a table that has fallen behind, not\n // a form that is wrong — so an explicit trigger is taken at its word there.\n // Refusing instead would let a stale table reject a form the engine handles.\n if (!triggers.known) {\n return requested\n ? { ok: true, triggerId: requested }\n : no(`${where} is not a node type this command knows, so --trigger is required.`, triggers.why ?? \"\");\n }\n\n if (requested) {\n return triggers.available.includes(requested)\n ? { ok: true, triggerId: requested }\n : no(\n `${where} never raises \\`${requested}\\`, so a side effect carrying it would be written, pass every check, and never run.`,\n raises,\n );\n }\n\n return triggers.completion\n ? { ok: true, triggerId: triggers.completion }\n : no(`${where} has no trigger a side effect can answer.`, raises);\n}\n\n/**\n * The first `se-{type}-{n}` nobody is using.\n *\n * Counting the same-type side effects instead was wrong whenever the numbering\n * had a gap — a form holding `se-hubspotForm-1` and `se-hubspotForm-3`, or one\n * where `se-meta-1` was deleted and `se-meta-2` left behind. The count then\n * names an id that already exists and the command refuses, which is the one\n * outcome a skeleton-minting command should never produce for a form it can see\n * in full.\n */\nexport function freeSideEffectId(type: string, taken: ReadonlySet<string>): string {\n for (let n = 1; ; n++) {\n const candidate = `se-${type}-${n}`;\n if (!taken.has(candidate)) return candidate;\n }\n}\n\n/**\n * How the confidential half of a new side effect gets filled. HubSpot is the\n * one destination the agent can wire itself; the rest go to the user's card.\n */\n/** The one row `requestFlowInputCall` needs, for an item this command just added unconfigured. */\nfunction pendingItem(\n target: \"node\" | \"sideEffect\",\n nodeId: string,\n kind: string,\n sideEffectId?: string,\n): FlowConfigStatus {\n return {\n target,\n nodeId,\n kind,\n status: `${kind} — not configured`,\n needsInput: true,\n ...(sideEffectId ? { sideEffectId } : {}),\n };\n}\n\nfunction configureHints(slug: string, nodeId: string, id: string, type: string, needsCard: boolean): string[] {\n if (!needsCard) return [];\n return [\n `Configure it: ${requestFlowInputCall(slug, pendingItem(\"sideEffect\", nodeId, type, id))}. Read the destination off that call's result.`,\n ];\n}\n\nregisterSchema({\n command: \"flows.add-side-effect\",\n description:\n \"Add a side effect to a step with a valid skeleton — encryptedConfig:null for a CRM, a tagIds slot for a pixel, and no oauthProviderId key. Configure the confidential half with request_flow_input afterwards.\",\n args: {\n slug: { type: \"positional\", description: \"Form slug\", required: true },\n node: { type: \"string\", description: \"Id of the step that fires it\", required: true },\n type: { type: \"string\", description: \"Side-effect type (see: baker flows schema side-effect)\", required: true },\n id: { type: \"string\", description: \"Side-effect id. Defaults to se-{type}-{n}.\", required: false },\n trigger: {\n type: \"string\",\n description:\n \"triggerId. Defaults to the moment the step named by --node completes, which is a different id per node type. Pass this only for a non-completion moment (a HubSpot form's onFormReady, a Calendly page view, one of several iframe events); an id the step never raises is refused.\",\n required: false,\n },\n },\n});\n\nexport const addSideEffectCommand = defineCommand({\n meta: {\n name: \"add-side-effect\",\n description:\n \"Add a side effect to a step, with the skeleton its type requires. Example: baker flows add-side-effect contact --node <id> --type googleSpreadsheet\",\n },\n args: {\n slug: { type: \"positional\", description: \"Form slug\", required: true },\n node: { type: \"string\", description: \"Id of the step that fires it\", required: true },\n type: { type: \"string\", description: \"Side-effect type\", required: true },\n id: { type: \"string\", description: \"Side-effect id (default se-{type}-{n})\" },\n trigger: {\n type: \"string\",\n description: \"triggerId, for a non-completion moment. Default: whatever the step named by --node raises\",\n },\n },\n run: ({ args }) => {\n const slug = String(args.slug);\n const type = String(args.type);\n const entry = flowCatalogEntry(\"side-effect\", type) ?? unknownType(\"side-effect\", type);\n\n const tree = readFlowTree(slug);\n const nodes = walkNodes(tree);\n const node = nodes.find((candidate) => candidate.id === String(args.node));\n if (!node) {\n writeJson({\n ok: false,\n error: {\n code: \"NOT_FOUND\",\n message: `No node with id \"${args.node}\" in \"${slug}\".`,\n fix: `Nodes in this form: ${nodes.map((candidate) => `${candidate.id} (${candidate.name})`).join(\", \")}`,\n },\n });\n process.exit(1);\n }\n\n if (!Array.isArray(node.sideEffects)) node.sideEffects = [];\n const existing = node.sideEffects as AnyRecord[];\n const takenIds = new Set(\n nodes.flatMap((n) => ((n.sideEffects as AnyRecord[] | undefined) ?? []).map((se) => String(se?.id ?? \"\"))),\n );\n const id = args.id ? String(args.id) : freeSideEffectId(type, takenIds);\n\n // Only an id the caller chose can still collide — the generated one is free\n // by construction.\n if (takenIds.has(id)) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: `\"${slug}\" already has a side effect with id \"${id}\".`,\n fix: `Drop --id to be given a free one (${freeSideEffectId(type, takenIds)}), or pick another.`,\n },\n });\n process.exit(1);\n }\n\n const trigger = resolveTrigger(node, args.trigger ? String(args.trigger) : undefined);\n if (!trigger.ok) {\n writeJson({\n ok: false,\n error: { code: \"VALIDATION_ERROR\", message: trigger.message, ...(trigger.fix ? { fix: trigger.fix } : {}) },\n });\n process.exit(1);\n }\n const triggerId = trigger.triggerId;\n\n const sideEffect = concrete(entry.skeleton, { id, triggerId });\n existing.push(sideEffect);\n writeFlowTree(slug, tree);\n\n const needsUser = Object.entries(entry.owners ?? {}).filter(([, owner]) => owner !== \"agent\");\n writeJson({\n ok: true,\n data: { slug, nodeId: node.id, sideEffectId: id, type, triggerId, path: flowDataPath(slug) },\n hints: [\n `Fires on \\`${triggerId}\\` — the moment \"${String(node.name ?? node.id)}\" raises. A side effect only runs when its triggerId is the one its own step raises, so this is set from the step, never from the side-effect type.`,\n // A pixel side effect is the thing most often mistaken for \"setting the\n // conversion\". It tells the ad platform; it tells Baker nothing, and a\n // Form can fire every pixel it has while every Baker report says it\n // converted nobody.\n ...(needsUser.some(([, owner]) => owner === \"tags\")\n ? [\n `This reports the conversion to ${type}. It does NOT make Baker count anything: what Baker counts is a named event, set with \\`baker analytics conversions --flow ${slug}\\`. Do both — they are two different systems asked the same question.`,\n ]\n : []),\n ...configureHints(\n slug,\n String(node.id),\n id,\n type,\n needsUser.some(([, owner]) => owner === \"request_flow_input\"),\n ),\n ...(needsUser.some(([, owner]) => owner === \"tags\")\n ? [\n \"Fill `tagIds` with a real ref from `baker tags list`, or stage the tag first with the `tags` skill. Never invent one.\",\n ]\n : []),\n ...(entry.gotcha ? [entry.gotcha] : []),\n ],\n });\n },\n});\n"],"mappings":"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","names":["node"]}
|
|
@@ -7,11 +7,10 @@ import {
|
|
|
7
7
|
testimonialSourceRefreshIntervalSchema,
|
|
8
8
|
testimonialSourceTypeSchema,
|
|
9
9
|
testimonialSourcesAddRequestSchema
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-XF4JUKVF.js";
|
|
11
11
|
import "./chunk-GXDLWBOY.js";
|
|
12
12
|
import "./chunk-TEINLN64.js";
|
|
13
13
|
import "./chunk-ZJWUBJYQ.js";
|
|
14
|
-
import "./chunk-HR6IWNKE.js";
|
|
15
14
|
import "./chunk-NE4F3FHN.js";
|
|
16
15
|
import {
|
|
17
16
|
apiPost
|
|
@@ -102,4 +101,4 @@ export {
|
|
|
102
101
|
addCommand,
|
|
103
102
|
addSourceHints
|
|
104
103
|
};
|
|
105
|
-
//# sourceMappingURL=add-
|
|
104
|
+
//# sourceMappingURL=add-6DTC6X5G.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/testimonials/sources/add.ts"],"sourcesContent":["import {\n type TestimonialSourcesAddResponse,\n testimonialSourceRefreshIntervalSchema,\n testimonialSourcesAddRequestSchema,\n testimonialSourceTypeSchema,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeJson } from \"../../../output.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { compactSource, reportError, reportInvalid } from \"./shared.ts\";\n\nconst SITES = testimonialSourceTypeSchema.options.join(\"|\");\n\nregisterSchema({\n command: \"testimonials.sources.add\",\n description:\n \"Add a review page as a testimonial source — Google Maps, Trustpilot, Yelp, Tripadvisor, G2, Capterra, Amazon, App Store or Google Play. Pass the page's link (it names its own site), or a business name for Google Maps. Its reviews (up to 700) are imported, tagged and made searchable in the background over the next minutes. Each imported review costs a little, so add only the client's own listings the user asked for. Applies immediately and shows on the chat as an already-applied change. Adding a listing that is already a source is a no-op that starts a fresh import.\",\n args: {\n input: {\n type: \"string\",\n description: \"The review page's link, or a business name (Google Maps only)\",\n required: true,\n },\n platform: {\n type: \"string\",\n description: `Only to force a site: ${SITES}. A bare domain with trustpilot is that company's Trustpilot page.`,\n required: false,\n },\n every: {\n type: \"string\",\n description: `Auto-sync cadence: ${testimonialSourceRefreshIntervalSchema.options.join(\"|\")} (default never)`,\n required: false,\n },\n },\n});\n\n/** What the agent should know after an add: that it runs on without it, and what to check. */\nexport function addSourceHints(input: string, { created, source }: TestimonialSourcesAddResponse): string[] {\n const hints = [\n created\n ? `Added ${source.label} on ${source.platformLabel}. Its reviews are importing in the background — they become searchable with \\`baker testimonials search\\` as each one is analysed, usually within a few minutes. Don't wait on them in this turn; check with \\`baker testimonials sources list\\`.`\n : `${source.label} on ${source.platformLabel} was already a source; a fresh import was started if one wasn't running.`,\n ];\n if (created && source.platform === \"google\" && !/^https?:\\/\\/|\\.[a-z]{2,}\\//i.test(input.trim())) {\n hints.push(\n `Matched the name to ${source.label} on Google Maps (${source.pageUrl ?? \"no link\"}). If that is not the client's business, run \\`baker testimonials sources remove ${source.id}\\` at once and add the listing's Google Maps link instead.`,\n );\n }\n if (source.refreshInterval === \"never\") {\n hints.push(\n `Auto-sync is off. If the user wants new reviews to keep arriving: \\`baker testimonials sources schedule ${source.id} --every monthly\\`.`,\n );\n }\n return hints;\n}\n\nexport const addCommand = defineCommand({\n meta: {\n name: \"add\",\n description: `Add a review page as a testimonial source. Start here with the page's link; for Google Maps a business name also works.\n\nExamples:\n baker testimonials sources add https://www.yelp.com/biz/acme-bakery-madrid\n baker testimonials sources add https://www.g2.com/products/acme --every monthly\n baker testimonials sources add \"Acme Bakery Madrid\" # Google Maps, found by name\n baker testimonials sources add acme.com --platform trustpilot`,\n },\n args: {\n input: { type: \"positional\", description: \"Review page link, or a business name for Google Maps\", required: true },\n platform: { type: \"string\", description: `Force a site: ${SITES}`, required: false },\n every: { type: \"string\", description: \"Auto-sync: never|daily|weekly|monthly\", required: false },\n },\n run: async ({ args }) => {\n const parsed = testimonialSourcesAddRequestSchema.safeParse({\n input: String(args.input ?? \"\"),\n platform: args.platform ? String(args.platform).toLowerCase().replace(/[\\s-]/g, \"_\") : undefined,\n every: args.every ? String(args.every).toLowerCase() : undefined,\n });\n if (!parsed.success) reportInvalid(parsed.error.issues[0]);\n\n try {\n const data = await apiPost<TestimonialSourcesAddResponse>(\"/api/testimonials/sources/add\", parsed.data, {\n timeoutMs: 120_000,\n });\n const hints = addSourceHints(parsed.data.input, data);\n writeJson({ ok: true, data: { created: data.created, source: compactSource(data.source) }, hints });\n } catch (err) {\n reportError(err);\n }\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/testimonials/sources/add.ts"],"sourcesContent":["import {\n type TestimonialSourcesAddResponse,\n testimonialSourceRefreshIntervalSchema,\n testimonialSourcesAddRequestSchema,\n testimonialSourceTypeSchema,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeJson } from \"../../../output.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { compactSource, reportError, reportInvalid } from \"./shared.ts\";\n\nconst SITES = testimonialSourceTypeSchema.options.join(\"|\");\n\nregisterSchema({\n command: \"testimonials.sources.add\",\n description:\n \"Add a review page as a testimonial source — Google Maps, Trustpilot, Yelp, Tripadvisor, G2, Capterra, Amazon, App Store or Google Play. Pass the page's link (it names its own site), or a business name for Google Maps. Its reviews (up to 700) are imported, tagged and made searchable in the background over the next minutes. Each imported review costs a little, so add only the client's own listings the user asked for. Applies immediately and shows on the chat as an already-applied change. Adding a listing that is already a source is a no-op that starts a fresh import.\",\n args: {\n input: {\n type: \"string\",\n description: \"The review page's link, or a business name (Google Maps only)\",\n required: true,\n },\n platform: {\n type: \"string\",\n description: `Only to force a site: ${SITES}. A bare domain with trustpilot is that company's Trustpilot page.`,\n required: false,\n },\n every: {\n type: \"string\",\n description: `Auto-sync cadence: ${testimonialSourceRefreshIntervalSchema.options.join(\"|\")} (default never)`,\n required: false,\n },\n },\n});\n\n/** What the agent should know after an add: that it runs on without it, and what to check. */\nexport function addSourceHints(input: string, { created, source }: TestimonialSourcesAddResponse): string[] {\n const hints = [\n created\n ? `Added ${source.label} on ${source.platformLabel}. Its reviews are importing in the background — they become searchable with \\`baker testimonials search\\` as each one is analysed, usually within a few minutes. Don't wait on them in this turn; check with \\`baker testimonials sources list\\`.`\n : `${source.label} on ${source.platformLabel} was already a source; a fresh import was started if one wasn't running.`,\n ];\n if (created && source.platform === \"google\" && !/^https?:\\/\\/|\\.[a-z]{2,}\\//i.test(input.trim())) {\n hints.push(\n `Matched the name to ${source.label} on Google Maps (${source.pageUrl ?? \"no link\"}). If that is not the client's business, run \\`baker testimonials sources remove ${source.id}\\` at once and add the listing's Google Maps link instead.`,\n );\n }\n if (source.refreshInterval === \"never\") {\n hints.push(\n `Auto-sync is off. If the user wants new reviews to keep arriving: \\`baker testimonials sources schedule ${source.id} --every monthly\\`.`,\n );\n }\n return hints;\n}\n\nexport const addCommand = defineCommand({\n meta: {\n name: \"add\",\n description: `Add a review page as a testimonial source. Start here with the page's link; for Google Maps a business name also works.\n\nExamples:\n baker testimonials sources add https://www.yelp.com/biz/acme-bakery-madrid\n baker testimonials sources add https://www.g2.com/products/acme --every monthly\n baker testimonials sources add \"Acme Bakery Madrid\" # Google Maps, found by name\n baker testimonials sources add acme.com --platform trustpilot`,\n },\n args: {\n input: { type: \"positional\", description: \"Review page link, or a business name for Google Maps\", required: true },\n platform: { type: \"string\", description: `Force a site: ${SITES}`, required: false },\n every: { type: \"string\", description: \"Auto-sync: never|daily|weekly|monthly\", required: false },\n },\n run: async ({ args }) => {\n const parsed = testimonialSourcesAddRequestSchema.safeParse({\n input: String(args.input ?? \"\"),\n platform: args.platform ? String(args.platform).toLowerCase().replace(/[\\s-]/g, \"_\") : undefined,\n every: args.every ? String(args.every).toLowerCase() : undefined,\n });\n if (!parsed.success) reportInvalid(parsed.error.issues[0]);\n\n try {\n const data = await apiPost<TestimonialSourcesAddResponse>(\"/api/testimonials/sources/add\", parsed.data, {\n timeoutMs: 120_000,\n });\n const hints = addSourceHints(parsed.data.input, data);\n writeJson({ ok: true, data: { created: data.created, source: compactSource(data.source) }, hints });\n } catch (err) {\n reportError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,SAAS,qBAAqB;AAM9B,IAAM,QAAQ,4BAA4B,QAAQ,KAAK,GAAG;AAE1D,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa,yBAAyB,KAAK;AAAA,MAC3C,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa,sBAAsB,uCAAuC,QAAQ,KAAK,GAAG,CAAC;AAAA,MAC3F,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAGM,SAAS,eAAe,OAAe,EAAE,SAAS,OAAO,GAA4C;AAC1G,QAAM,QAAQ;AAAA,IACZ,UACI,SAAS,OAAO,KAAK,OAAO,OAAO,aAAa,2PAChD,GAAG,OAAO,KAAK,OAAO,OAAO,aAAa;AAAA,EAChD;AACA,MAAI,WAAW,OAAO,aAAa,YAAY,CAAC,8BAA8B,KAAK,MAAM,KAAK,CAAC,GAAG;AAChG,UAAM;AAAA,MACJ,uBAAuB,OAAO,KAAK,oBAAoB,OAAO,WAAW,SAAS,oFAAoF,OAAO,EAAE;AAAA,IACjL;AAAA,EACF;AACA,MAAI,OAAO,oBAAoB,SAAS;AACtC,UAAM;AAAA,MACJ,2GAA2G,OAAO,EAAE;AAAA,IACtH;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,aAAa,cAAc;AAAA,EACtC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,cAAc,aAAa,wDAAwD,UAAU,KAAK;AAAA,IACjH,UAAU,EAAE,MAAM,UAAU,aAAa,iBAAiB,KAAK,IAAI,UAAU,MAAM;AAAA,IACnF,OAAO,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,MAAM;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,SAAS,mCAAmC,UAAU;AAAA,MAC1D,OAAO,OAAO,KAAK,SAAS,EAAE;AAAA,MAC9B,UAAU,KAAK,WAAW,OAAO,KAAK,QAAQ,EAAE,YAAY,EAAE,QAAQ,UAAU,GAAG,IAAI;AAAA,MACvF,OAAO,KAAK,QAAQ,OAAO,KAAK,KAAK,EAAE,YAAY,IAAI;AAAA,IACzD,CAAC;AACD,QAAI,CAAC,OAAO,QAAS,eAAc,OAAO,MAAM,OAAO,CAAC,CAAC;AAEzD,QAAI;AACF,YAAM,OAAO,MAAM,QAAuC,iCAAiC,OAAO,MAAM;AAAA,QACtG,WAAW;AAAA,MACb,CAAC;AACD,YAAM,QAAQ,eAAe,OAAO,KAAK,OAAO,IAAI;AACpD,gBAAU,EAAE,IAAI,MAAM,MAAM,EAAE,SAAS,KAAK,SAAS,QAAQ,cAAc,KAAK,MAAM,EAAE,GAAG,MAAM,CAAC;AAAA,IACpG,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -27,14 +27,14 @@ Examples:
|
|
|
27
27
|
Full guides: __tooling__/docs/tools/baker/ads-<platform>.md (google|meta|linkedin|x|chatgpt)`
|
|
28
28
|
},
|
|
29
29
|
subCommands: {
|
|
30
|
-
google: () => import("./google-
|
|
30
|
+
google: () => import("./google-M7KEXVK5.js").then((m) => m.googleCommand),
|
|
31
31
|
meta: () => import("./meta-A7KM6TF5.js").then((m) => m.metaCommand),
|
|
32
|
-
linkedin: () => import("./linkedin-
|
|
33
|
-
x: () => import("./x-
|
|
32
|
+
linkedin: () => import("./linkedin-FFSDSGGS.js").then((m) => m.linkedinCommand),
|
|
33
|
+
x: () => import("./x-BFSKFCZD.js").then((m) => m.xCommand),
|
|
34
34
|
chatgpt: () => import("./chatgpt-7W75X3ER.js").then((m) => m.chatgptCommand)
|
|
35
35
|
}
|
|
36
36
|
});
|
|
37
37
|
export {
|
|
38
38
|
adsCommand
|
|
39
39
|
};
|
|
40
|
-
//# sourceMappingURL=ads-
|
|
40
|
+
//# sourceMappingURL=ads-73PGA4YC.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
advertisersHints
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-OZRUJVIQ.js";
|
|
4
4
|
import {
|
|
5
5
|
RESEARCH_DATA_NOTE,
|
|
6
6
|
handleResearchError,
|
|
@@ -13,11 +13,10 @@ import {
|
|
|
13
13
|
warnDefaults
|
|
14
14
|
} from "./chunk-LIQ4SQ2T.js";
|
|
15
15
|
import "./chunk-XCM6XWOB.js";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-XF4JUKVF.js";
|
|
17
17
|
import "./chunk-GXDLWBOY.js";
|
|
18
18
|
import "./chunk-TEINLN64.js";
|
|
19
19
|
import "./chunk-ZJWUBJYQ.js";
|
|
20
|
-
import "./chunk-HR6IWNKE.js";
|
|
21
20
|
import "./chunk-NE4F3FHN.js";
|
|
22
21
|
import {
|
|
23
22
|
apiPost
|
|
@@ -118,4 +117,4 @@ Examples:
|
|
|
118
117
|
export {
|
|
119
118
|
advertisersCommand
|
|
120
119
|
};
|
|
121
|
-
//# sourceMappingURL=advertisers-
|
|
120
|
+
//# sourceMappingURL=advertisers-AE75CGVE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/research/advertisers.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { buildResearchQueryContext, warnDefaults } from \"../../geo-context.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { advertisersHints } from \"./hints.ts\";\nimport {\n handleResearchError,\n RESEARCH_DATA_NOTE,\n writeResearchHints,\n writeResearchJson,\n writeResearchOutput,\n} from \"./output.ts\";\n\nregisterSchema({\n command: \"research.advertisers\",\n description:\n 'Returns a ranked list of domains competing for one keyword in Google, with avg SERP position, relevance rating, estimated traffic value and visibility — domain economics, not ad copy. Despite the name it returns no headlines, descriptions or creative of any kind; for a competitor\\'s actual ad copy use `baker research google-ads <competitor.com> --copy` (Google) or `baker winning-ads content <adId>` (Meta/LinkedIn). Start here: `baker research advertisers \"<keyword>\" --location <cc> --language <code>` to size up who owns a term. If --location and --language are omitted, defaults to United States (us) and English (en). The response includes a query_context object showing which location/language were used.',\n args: {\n keyword: {\n type: \"string\",\n description:\n \"Keyword to search (positional). One search term, not a brand or a domain — this is a SERP query, not an advertiser lookup\",\n required: true,\n },\n location: {\n type: \"string\",\n description:\n \"Country code (us, uk, es, de...) or DataForSEO location code. Defaults to us (United States) if omitted — always set this for non-US markets\",\n required: false,\n },\n language: {\n type: \"string\",\n description:\n \"Language code or name (en, es, spanish...). Defaults to en (English) if omitted — always set this for non-English markets\",\n required: false,\n },\n limit: { type: \"string\", description: \"Max results (default: 20, max: 100)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n});\n\ninterface Advertiser {\n domain: string;\n avg_position: number;\n rating: number;\n etv: number;\n visibility: number;\n}\n\nconst FIELDS: Record<string, string> = {\n domain: \"Competing domain (no ad copy is returned — see hints)\",\n avg_position: \"Average SERP position (1 = top)\",\n rating: \"Domain relevance rating (0-100)\",\n etv: \"Estimated traffic value (USD)\",\n visibility: \"SERP visibility score (0-1)\",\n};\n\nexport const advertisersCommand = defineCommand({\n meta: {\n name: \"advertisers\",\n description: `Domains competing for a keyword in Google SERPs, with position, relevance, traffic value and visibility. Returns NO ad copy — for a competitor's headlines and body copy use \\`baker research google-ads <competitor.com> --copy\\` (Google) or \\`baker winning-ads content <adId>\\` (Meta/LinkedIn).\n\nExamples:\n baker research advertisers \"running shoes\"\n baker research advertisers \"crm software\" --location uk --limit 10\n baker research advertisers \"zapatos\" --location es --language spanish`,\n },\n args: {\n keyword: { type: \"positional\", description: \"Keyword to search\", required: true },\n location: { type: \"string\", description: \"Country code or location code (default: us)\", required: false },\n language: { type: \"string\", description: \"Language code or name (default: en)\", required: false },\n limit: { type: \"string\", description: \"Max results (default: 20, max: 100)\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md|jsonl\", required: false, default: \"json\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n run: async ({ args }) => {\n const keyword = args.keyword as string;\n const location = (args.location as string) || undefined;\n const language = (args.language as string) || undefined;\n const limit = args.limit ? Number(args.limit) : undefined;\n const skipCache = args[\"no-cache\"] ? true : undefined;\n const queryContext = buildResearchQueryContext(location, language);\n\n try {\n const data = await apiPost<Advertiser[]>(\"/api/research/advertisers\", {\n keyword,\n location,\n language,\n limit,\n skipCache,\n });\n\n warnDefaults(queryContext);\n const format = (args.output as string) || \"json\";\n const hints = advertisersHints(data.length, queryContext);\n if (format !== \"json\") {\n writeResearchOutput(data as unknown as Array<Record<string, unknown>>, format);\n writeResearchHints(hints, format);\n return;\n }\n writeResearchJson({\n ok: true,\n data,\n fields: FIELDS,\n note: RESEARCH_DATA_NOTE,\n query_context: queryContext,\n hints,\n });\n } catch (err) {\n handleResearchError(err);\n }\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/research/advertisers.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { buildResearchQueryContext, warnDefaults } from \"../../geo-context.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { advertisersHints } from \"./hints.ts\";\nimport {\n handleResearchError,\n RESEARCH_DATA_NOTE,\n writeResearchHints,\n writeResearchJson,\n writeResearchOutput,\n} from \"./output.ts\";\n\nregisterSchema({\n command: \"research.advertisers\",\n description:\n 'Returns a ranked list of domains competing for one keyword in Google, with avg SERP position, relevance rating, estimated traffic value and visibility — domain economics, not ad copy. Despite the name it returns no headlines, descriptions or creative of any kind; for a competitor\\'s actual ad copy use `baker research google-ads <competitor.com> --copy` (Google) or `baker winning-ads content <adId>` (Meta/LinkedIn). Start here: `baker research advertisers \"<keyword>\" --location <cc> --language <code>` to size up who owns a term. If --location and --language are omitted, defaults to United States (us) and English (en). The response includes a query_context object showing which location/language were used.',\n args: {\n keyword: {\n type: \"string\",\n description:\n \"Keyword to search (positional). One search term, not a brand or a domain — this is a SERP query, not an advertiser lookup\",\n required: true,\n },\n location: {\n type: \"string\",\n description:\n \"Country code (us, uk, es, de...) or DataForSEO location code. Defaults to us (United States) if omitted — always set this for non-US markets\",\n required: false,\n },\n language: {\n type: \"string\",\n description:\n \"Language code or name (en, es, spanish...). Defaults to en (English) if omitted — always set this for non-English markets\",\n required: false,\n },\n limit: { type: \"string\", description: \"Max results (default: 20, max: 100)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n});\n\ninterface Advertiser {\n domain: string;\n avg_position: number;\n rating: number;\n etv: number;\n visibility: number;\n}\n\nconst FIELDS: Record<string, string> = {\n domain: \"Competing domain (no ad copy is returned — see hints)\",\n avg_position: \"Average SERP position (1 = top)\",\n rating: \"Domain relevance rating (0-100)\",\n etv: \"Estimated traffic value (USD)\",\n visibility: \"SERP visibility score (0-1)\",\n};\n\nexport const advertisersCommand = defineCommand({\n meta: {\n name: \"advertisers\",\n description: `Domains competing for a keyword in Google SERPs, with position, relevance, traffic value and visibility. Returns NO ad copy — for a competitor's headlines and body copy use \\`baker research google-ads <competitor.com> --copy\\` (Google) or \\`baker winning-ads content <adId>\\` (Meta/LinkedIn).\n\nExamples:\n baker research advertisers \"running shoes\"\n baker research advertisers \"crm software\" --location uk --limit 10\n baker research advertisers \"zapatos\" --location es --language spanish`,\n },\n args: {\n keyword: { type: \"positional\", description: \"Keyword to search\", required: true },\n location: { type: \"string\", description: \"Country code or location code (default: us)\", required: false },\n language: { type: \"string\", description: \"Language code or name (default: en)\", required: false },\n limit: { type: \"string\", description: \"Max results (default: 20, max: 100)\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md|jsonl\", required: false, default: \"json\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n run: async ({ args }) => {\n const keyword = args.keyword as string;\n const location = (args.location as string) || undefined;\n const language = (args.language as string) || undefined;\n const limit = args.limit ? Number(args.limit) : undefined;\n const skipCache = args[\"no-cache\"] ? true : undefined;\n const queryContext = buildResearchQueryContext(location, language);\n\n try {\n const data = await apiPost<Advertiser[]>(\"/api/research/advertisers\", {\n keyword,\n location,\n language,\n limit,\n skipCache,\n });\n\n warnDefaults(queryContext);\n const format = (args.output as string) || \"json\";\n const hints = advertisersHints(data.length, queryContext);\n if (format !== \"json\") {\n writeResearchOutput(data as unknown as Array<Record<string, unknown>>, format);\n writeResearchHints(hints, format);\n return;\n }\n writeResearchJson({\n ok: true,\n data,\n fields: FIELDS,\n note: RESEARCH_DATA_NOTE,\n query_context: queryContext,\n hints,\n });\n } catch (err) {\n handleResearchError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAa9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IAC7F,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AACF,CAAC;AAUD,IAAM,SAAiC;AAAA,EACrC,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,YAAY;AACd;AAEO,IAAM,qBAAqB,cAAc;AAAA,EAC9C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf;AAAA,EACA,MAAM;AAAA,IACJ,SAAS,EAAE,MAAM,cAAc,aAAa,qBAAqB,UAAU,KAAK;AAAA,IAChF,UAAU,EAAE,MAAM,UAAU,aAAa,+CAA+C,UAAU,MAAM;AAAA,IACxG,UAAU,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IAChG,OAAO,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IAC7F,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,UAAU,KAAK;AACrB,UAAM,WAAY,KAAK,YAAuB;AAC9C,UAAM,WAAY,KAAK,YAAuB;AAC9C,UAAM,QAAQ,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAChD,UAAM,YAAY,KAAK,UAAU,IAAI,OAAO;AAC5C,UAAM,eAAe,0BAA0B,UAAU,QAAQ;AAEjE,QAAI;AACF,YAAM,OAAO,MAAM,QAAsB,6BAA6B;AAAA,QACpE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,mBAAa,YAAY;AACzB,YAAM,SAAU,KAAK,UAAqB;AAC1C,YAAM,QAAQ,iBAAiB,KAAK,QAAQ,YAAY;AACxD,UAAI,WAAW,QAAQ;AACrB,4BAAoB,MAAmD,MAAM;AAC7E,2BAAmB,OAAO,MAAM;AAChC;AAAA,MACF;AACA,wBAAkB;AAAA,QAChB,IAAI;AAAA,QACJ;AAAA,QACA,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,eAAe;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -1,58 +1,56 @@
|
|
|
1
1
|
import {
|
|
2
2
|
flowEventKeys,
|
|
3
3
|
flowNodes
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-Y6O7EWYY.js";
|
|
5
5
|
import {
|
|
6
6
|
flowDataPath,
|
|
7
7
|
flowExists,
|
|
8
8
|
listFlowSlugs,
|
|
9
9
|
readFlowTree
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-YRQYA2LR.js";
|
|
11
11
|
import {
|
|
12
12
|
peopleArgs,
|
|
13
13
|
peopleLimitError
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-LZ73CZGP.js";
|
|
15
15
|
import {
|
|
16
16
|
analyticsErrorEnvelope
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-MELOSESI.js";
|
|
18
18
|
import {
|
|
19
19
|
INGEST_ARRIVALS_MAX,
|
|
20
20
|
eventIngestUrl,
|
|
21
21
|
ingestBrief
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-7YCRFMXF.js";
|
|
23
23
|
import "./chunk-GRQ2AXDX.js";
|
|
24
24
|
import {
|
|
25
25
|
ConversionArgsError,
|
|
26
26
|
conversionsWrite,
|
|
27
27
|
parseConversionsArgs
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-RPUSTYHL.js";
|
|
29
29
|
import {
|
|
30
30
|
repeatedValues
|
|
31
31
|
} from "./chunk-ERSX3MKH.js";
|
|
32
32
|
import {
|
|
33
|
+
AD_PARAM_ROLE_SPECS,
|
|
34
|
+
ANALYTICS_EVENT_DOORS,
|
|
35
|
+
SEND_FILTERS,
|
|
33
36
|
STANDARD_CONVERSION_NAMES,
|
|
34
37
|
destinationName,
|
|
38
|
+
essentialAdDimensions,
|
|
39
|
+
isAdPlatform,
|
|
35
40
|
isBookkeepingRow,
|
|
41
|
+
parseEventKey,
|
|
36
42
|
rowMatchKeys
|
|
37
|
-
} from "./chunk-
|
|
38
|
-
import "./chunk-
|
|
43
|
+
} from "./chunk-SSJK7FEV.js";
|
|
44
|
+
import "./chunk-EDLZGTGN.js";
|
|
39
45
|
import {
|
|
40
46
|
writeJsonEnvelope
|
|
41
47
|
} from "./chunk-VFIOJD5M.js";
|
|
42
48
|
import {
|
|
43
49
|
flowNodeTriggers
|
|
44
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-XF4JUKVF.js";
|
|
45
51
|
import "./chunk-GXDLWBOY.js";
|
|
46
52
|
import "./chunk-TEINLN64.js";
|
|
47
53
|
import "./chunk-ZJWUBJYQ.js";
|
|
48
|
-
import {
|
|
49
|
-
AD_PARAM_ROLE_SPECS,
|
|
50
|
-
ANALYTICS_EVENT_DOORS,
|
|
51
|
-
SEND_FILTERS,
|
|
52
|
-
essentialAdDimensions,
|
|
53
|
-
isAdPlatform,
|
|
54
|
-
parseEventKey
|
|
55
|
-
} from "./chunk-HR6IWNKE.js";
|
|
56
54
|
import "./chunk-NE4F3FHN.js";
|
|
57
55
|
import {
|
|
58
56
|
ApiError,
|
|
@@ -1933,21 +1931,19 @@ Full guide: __tooling__/docs/tools/baker/analytics.md`
|
|
|
1933
1931
|
tags: tagsCommand,
|
|
1934
1932
|
events: eventsCommand,
|
|
1935
1933
|
feed: feedCommand,
|
|
1936
|
-
lookup: () => import("./lookup-
|
|
1934
|
+
lookup: () => import("./lookup-XK45W2SH.js").then((m) => m.lookupCommand),
|
|
1937
1935
|
devices: devicesCommand,
|
|
1938
1936
|
ads: adsCommand,
|
|
1939
1937
|
conversions: conversionsCommand,
|
|
1940
|
-
sends: () => import("./sends-
|
|
1938
|
+
sends: () => import("./sends-WGJVQUMF.js").then((m) => m.sendsCommand),
|
|
1941
1939
|
map: mapCommand,
|
|
1942
|
-
unstage: () => import("./unstage-
|
|
1940
|
+
unstage: () => import("./unstage-4ZEULXEQ.js").then((m) => m.unstageCommand),
|
|
1943
1941
|
tracking: trackingCommand,
|
|
1944
1942
|
arrivals: arrivalsCommand,
|
|
1945
1943
|
"sending-events": sendingEventsCommand,
|
|
1946
|
-
sources: () => import("./sources-
|
|
1944
|
+
sources: () => import("./sources-AMI2AWKZ.js").then((m) => m.sourcesCommand),
|
|
1947
1945
|
"website-tag": websiteTagCommand,
|
|
1948
1946
|
sites: sitesCommand,
|
|
1949
|
-
plan: () => import("./plan-FT632COT.js").then((m) => m.planCommand),
|
|
1950
|
-
questionnaire: () => import("./questionnaire-JNGYJTAY.js").then((m) => m.questionnaireCommand),
|
|
1951
1947
|
presets: presetsCommand
|
|
1952
1948
|
}
|
|
1953
1949
|
});
|
|
@@ -1959,4 +1955,4 @@ export {
|
|
|
1959
1955
|
requestBody,
|
|
1960
1956
|
sendingEventsAddress
|
|
1961
1957
|
};
|
|
1962
|
-
//# sourceMappingURL=analytics-
|
|
1958
|
+
//# sourceMappingURL=analytics-FKCXIMPO.js.map
|