@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/flows/options.ts"],"sourcesContent":["/**\n * `options`: what a Form's step or destination could be filled with, read\n * through the company's connected account — the same list the card shows the\n * user, so the agent can choose instead of asking.\n */\n\nimport { FLOW_AGENT_DESTINATION_KINDS, type FlowAgentDestinationKind, type FlowsOptionsResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi } from \"../actions/shared.ts\";\nimport { destinationRefusal } from \"./connect.ts\";\n\nconst HUBSPOT_KINDS: Record<string, string> = {\n hubspot: \"baker hubspot forms list\",\n hubspotForm: \"baker hubspot forms list\",\n hubspotMeeting: \"baker hubspot meetings list\",\n};\n\n/** The next call for each kind, spelled out — the target flag differs between a step and a destination. */\nexport function optionsHints(data: FlowsOptionsResponse[\"data\"]): string[] {\n const { kind, options } = data;\n if (kind === \"pipedrive\" || kind === \"goHighlevelContact\") {\n return [\n `Nothing to choose: the connected account is the destination. Wire it: baker flows connect <slug> --side-effect <id> (or --all --type ${kind}).`,\n ];\n }\n if (kind === \"googleSpreadsheet\") {\n return [\n \"These are the only spreadsheets Baker can reach: ones someone chose for a Form before, and ones Baker created. Pick one: baker flows connect <slug> --side-effect <id> --resource <id> [--tab <name>].\",\n 'None fits? Create one yourself: baker flows connect <slug> --side-effect <id> --new-sheet \"<Form name> leads\" --columns \"Name,Email,…\". Only when the user wants their own existing sheet: request_flow_input.',\n ];\n }\n const empty =\n options.length === 0\n ? [\"The account has none. Tell the user what to create there, or skip this step — do not invent one.\"]\n : [];\n return [\n ...empty,\n `Fill the step: baker flows connect <slug> --node <stepId> --resource <id> (or --all --type ${kind}). One clear match → use it; several plausible → ask the user which.`,\n ];\n}\n\nregisterSchema({\n command: \"flows.options\",\n description:\n \"What a Form step or destination can be filled with, read from the connected account: Calendly events, SavvyCal links, GoHighLevel calendars and forms, the Google spreadsheets Baker can reach. Pipedrive and GoHighLevel contact have nothing to choose — the account is the destination. Next: `baker flows connect <slug> --node|--side-effect <id> --resource <id>`. HubSpot has its own: `baker hubspot forms list` / `meetings list`.\",\n args: {\n kind: {\n type: \"positional\",\n description: `One of: ${FLOW_AGENT_DESTINATION_KINDS.join(\", \")}`,\n required: true,\n },\n account: {\n type: \"string\",\n description: \"Connection id, when more than one account of the platform is connected\",\n required: false,\n },\n },\n});\n\nexport const optionsCommand = defineCommand({\n meta: {\n name: \"options\",\n description:\n \"What a step or destination can be filled with, from the connected account. Start here: baker flows options calendly\",\n },\n args: {\n kind: { type: \"positional\", description: FLOW_AGENT_DESTINATION_KINDS.join(\" | \"), required: true },\n account: { type: \"string\", description: \"Connection id when several are connected\" },\n },\n run: async ({ args }) => {\n const kind = String(args.kind);\n const hubspot = HUBSPOT_KINDS[kind];\n if (hubspot) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: `HubSpot has its own list: ${hubspot}.` } });\n process.exit(1);\n }\n if (!(FLOW_AGENT_DESTINATION_KINDS as readonly string[]).includes(kind)) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: `\"${kind}\" is not filled from a platform account.`,\n fix: `Kinds: ${FLOW_AGENT_DESTINATION_KINDS.join(\", \")}. Typed credentials (webhooks, Zapier, Crmble) go through request_flow_input.`,\n },\n });\n process.exit(1);\n }\n try {\n const { data } = await apiPost<FlowsOptionsResponse>(\"/api/flows/destinations/options\", {\n kind,\n ...(args.account ? { account: String(args.account) } : {}),\n });\n writeJson({\n ok: true,\n data: { ...data, accounts: data.accounts.length > 1 ? data.accounts : undefined },\n hints: optionsHints(data),\n });\n } catch (err) {\n const refusal = err instanceof ApiError ? destinationRefusal(kind as FlowAgentDestinationKind, err) : null;\n if (err instanceof ApiError && refusal !== null) {\n writeJson({ ok: false, error: { code: refusal.code, message: err.message, fix: refusal.fix } });\n process.exit(1);\n }\n failApi(err);\n }\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/flows/options.ts"],"sourcesContent":["/**\n * `options`: what a Form's step or destination could be filled with, read\n * through the company's connected account — the same list the card shows the\n * user, so the agent can choose instead of asking.\n */\n\nimport { FLOW_AGENT_DESTINATION_KINDS, type FlowAgentDestinationKind, type FlowsOptionsResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi } from \"../actions/shared.ts\";\nimport { destinationRefusal } from \"./connect.ts\";\n\nconst HUBSPOT_KINDS: Record<string, string> = {\n hubspot: \"baker hubspot forms list\",\n hubspotForm: \"baker hubspot forms list\",\n hubspotMeeting: \"baker hubspot meetings list\",\n};\n\n/** The next call for each kind, spelled out — the target flag differs between a step and a destination. */\nexport function optionsHints(data: FlowsOptionsResponse[\"data\"]): string[] {\n const { kind, options } = data;\n if (kind === \"pipedrive\" || kind === \"goHighlevelContact\") {\n return [\n `Nothing to choose: the connected account is the destination. Wire it: baker flows connect <slug> --side-effect <id> (or --all --type ${kind}).`,\n ];\n }\n if (kind === \"googleSpreadsheet\") {\n return [\n \"These are the only spreadsheets Baker can reach: ones someone chose for a Form before, and ones Baker created. Pick one: baker flows connect <slug> --side-effect <id> --resource <id> [--tab <name>].\",\n 'None fits? Create one yourself: baker flows connect <slug> --side-effect <id> --new-sheet \"<Form name> leads\" --columns \"Name,Email,…\". Only when the user wants their own existing sheet: request_flow_input.',\n ];\n }\n const empty =\n options.length === 0\n ? [\"The account has none. Tell the user what to create there, or skip this step — do not invent one.\"]\n : [];\n return [\n ...empty,\n `Fill the step: baker flows connect <slug> --node <stepId> --resource <id> (or --all --type ${kind}). One clear match → use it; several plausible → ask the user which.`,\n ];\n}\n\nregisterSchema({\n command: \"flows.options\",\n description:\n \"What a Form step or destination can be filled with, read from the connected account: Calendly events, SavvyCal links, GoHighLevel calendars and forms, the Google spreadsheets Baker can reach. Pipedrive and GoHighLevel contact have nothing to choose — the account is the destination. Next: `baker flows connect <slug> --node|--side-effect <id> --resource <id>`. HubSpot has its own: `baker hubspot forms list` / `meetings list`.\",\n args: {\n kind: {\n type: \"positional\",\n description: `One of: ${FLOW_AGENT_DESTINATION_KINDS.join(\", \")}`,\n required: true,\n },\n account: {\n type: \"string\",\n description: \"Connection id, when more than one account of the platform is connected\",\n required: false,\n },\n },\n});\n\nexport const optionsCommand = defineCommand({\n meta: {\n name: \"options\",\n description:\n \"What a step or destination can be filled with, from the connected account. Start here: baker flows options calendly\",\n },\n args: {\n kind: { type: \"positional\", description: FLOW_AGENT_DESTINATION_KINDS.join(\" | \"), required: true },\n account: { type: \"string\", description: \"Connection id when several are connected\" },\n },\n run: async ({ args }) => {\n const kind = String(args.kind);\n const hubspot = HUBSPOT_KINDS[kind];\n if (hubspot) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: `HubSpot has its own list: ${hubspot}.` } });\n process.exit(1);\n }\n if (!(FLOW_AGENT_DESTINATION_KINDS as readonly string[]).includes(kind)) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: `\"${kind}\" is not filled from a platform account.`,\n fix: `Kinds: ${FLOW_AGENT_DESTINATION_KINDS.join(\", \")}. Typed credentials (webhooks, Zapier, Crmble) go through request_flow_input.`,\n },\n });\n process.exit(1);\n }\n try {\n const { data } = await apiPost<FlowsOptionsResponse>(\"/api/flows/destinations/options\", {\n kind,\n ...(args.account ? { account: String(args.account) } : {}),\n });\n writeJson({\n ok: true,\n data: { ...data, accounts: data.accounts.length > 1 ? data.accounts : undefined },\n hints: optionsHints(data),\n });\n } catch (err) {\n const refusal = err instanceof ApiError ? destinationRefusal(kind as FlowAgentDestinationKind, err) : null;\n if (err instanceof ApiError && refusal !== null) {\n writeJson({ ok: false, error: { code: refusal.code, message: err.message, fix: refusal.fix } });\n process.exit(1);\n }\n failApi(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,SAAS,qBAAqB;AAO9B,IAAM,gBAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,aAAa;AAAA,EACb,gBAAgB;AAClB;AAGO,SAAS,aAAa,MAA8C;AACzE,QAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,MAAI,SAAS,eAAe,SAAS,sBAAsB;AACzD,WAAO;AAAA,MACL,wIAAwI,IAAI;AAAA,IAC9I;AAAA,EACF;AACA,MAAI,SAAS,qBAAqB;AAChC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,QACJ,QAAQ,WAAW,IACf,CAAC,uGAAkG,IACnG,CAAC;AACP,SAAO;AAAA,IACL,GAAG;AAAA,IACH,8FAA8F,IAAI;AAAA,EACpG;AACF;AAEA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa,WAAW,6BAA6B,KAAK,IAAI,CAAC;AAAA,MAC/D,UAAU;AAAA,IACZ;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,cAAc,aAAa,6BAA6B,KAAK,KAAK,GAAG,UAAU,KAAK;AAAA,IAClG,SAAS,EAAE,MAAM,UAAU,aAAa,2CAA2C;AAAA,EACrF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,UAAM,UAAU,cAAc,IAAI;AAClC,QAAI,SAAS;AACX,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,6BAA6B,OAAO,IAAI,EAAE,CAAC;AAC9G,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,CAAE,6BAAmD,SAAS,IAAI,GAAG;AACvE,gBAAU;AAAA,QACR,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,IAAI,IAAI;AAAA,UACjB,KAAK,UAAU,6BAA6B,KAAK,IAAI,CAAC;AAAA,QACxD;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI;AACF,YAAM,EAAE,KAAK,IAAI,MAAM,QAA8B,mCAAmC;AAAA,QACtF;AAAA,QACA,GAAI,KAAK,UAAU,EAAE,SAAS,OAAO,KAAK,OAAO,EAAE,IAAI,CAAC;AAAA,MAC1D,CAAC;AACD,gBAAU;AAAA,QACR,IAAI;AAAA,QACJ,MAAM,EAAE,GAAG,MAAM,UAAU,KAAK,SAAS,SAAS,IAAI,KAAK,WAAW,OAAU;AAAA,QAChF,OAAO,aAAa,IAAI;AAAA,MAC1B,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,UAAU,eAAe,WAAW,mBAAmB,MAAkC,GAAG,IAAI;AACtG,UAAI,eAAe,YAAY,YAAY,MAAM;AAC/C,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,QAAQ,MAAM,SAAS,IAAI,SAAS,KAAK,QAAQ,IAAI,EAAE,CAAC;AAC9F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -3,12 +3,13 @@ import {
|
|
|
3
3
|
parseDays,
|
|
4
4
|
performanceCommand,
|
|
5
5
|
withDefinitions
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-2AOE2MZQ.js";
|
|
7
|
+
import "./chunk-SJYEY5MV.js";
|
|
8
|
+
import "./chunk-7EPXVICM.js";
|
|
9
9
|
import "./chunk-GXDLWBOY.js";
|
|
10
10
|
import "./chunk-TEINLN64.js";
|
|
11
11
|
import "./chunk-ZJWUBJYQ.js";
|
|
12
|
+
import "./chunk-HR6IWNKE.js";
|
|
12
13
|
import "./chunk-NE4F3FHN.js";
|
|
13
14
|
import "./chunk-XBOK23HI.js";
|
|
14
15
|
import "./chunk-IFWP3ZDO.js";
|
|
@@ -21,4 +22,4 @@ export {
|
|
|
21
22
|
performanceCommand,
|
|
22
23
|
withDefinitions
|
|
23
24
|
};
|
|
24
|
-
//# sourceMappingURL=performance-
|
|
25
|
+
//# sourceMappingURL=performance-UF5VTY2U.js.map
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import "./chunk-4PDHHHUJ.js";
|
|
2
|
+
import "./chunk-NYIGXDUG.js";
|
|
3
|
+
import {
|
|
4
|
+
writeJsonEnvelope
|
|
5
|
+
} from "./chunk-VFIOJD5M.js";
|
|
6
|
+
import {
|
|
7
|
+
trackingPlanRequestSchema,
|
|
8
|
+
trackingPlanResponseSchema
|
|
9
|
+
} from "./chunk-HR6IWNKE.js";
|
|
10
|
+
import {
|
|
11
|
+
apiPost
|
|
12
|
+
} from "./chunk-XBOK23HI.js";
|
|
13
|
+
import "./chunk-IFWP3ZDO.js";
|
|
14
|
+
import {
|
|
15
|
+
getEnv
|
|
16
|
+
} from "./chunk-NAWWC5I3.js";
|
|
17
|
+
import {
|
|
18
|
+
registerSchema
|
|
19
|
+
} from "./chunk-NU7JSWVA.js";
|
|
20
|
+
import "./chunk-YQSBHWOI.js";
|
|
21
|
+
|
|
22
|
+
// src/commands/analytics/plan.ts
|
|
23
|
+
import { readFileSync } from "fs";
|
|
24
|
+
import { defineCommand } from "citty";
|
|
25
|
+
var description = "Start here before building a replacement Form: read the agreed journeys, event names, purposes and readiness. --json @plan.json stages the complete plan, with optional wireConversions, funnel steps and a managed Tag Manager installation. Each event records its actual emitter or the missing change and owner. Prepared is not verified. See analytics.md for the contract. Repeating installation preparation replaces its own staged tags; applies only at Publish. --full includes evidence; the default keeps the decision inventory compact.";
|
|
26
|
+
var args = { json: { type: "string", description: "Preparation request as JSON or @path; omit to read the effective plan", required: false }, full: { type: "boolean", description: "Include all journey and verification evidence", required: false } };
|
|
27
|
+
registerSchema({ command: "analytics.plan", description, args });
|
|
28
|
+
var planCommand = defineCommand({
|
|
29
|
+
meta: { name: "plan", description },
|
|
30
|
+
args,
|
|
31
|
+
run: async ({ args: args2 }) => {
|
|
32
|
+
try {
|
|
33
|
+
const input = args2.json ? JSON.parse(args2.json.startsWith("@") ? readFileSync(args2.json.slice(1), "utf8") : args2.json) : {};
|
|
34
|
+
const parsed = trackingPlanRequestSchema.parse(input);
|
|
35
|
+
const body = { ...parsed, chatId: getEnv().BAKER_CHAT_ID };
|
|
36
|
+
const response = trackingPlanResponseSchema.parse(await apiPost("/api/analytics/plan", body));
|
|
37
|
+
const plan = response.data.plan;
|
|
38
|
+
writeJsonEnvelope({ ...response, data: { ...response.data, plan: args2.full || !plan ? plan : {
|
|
39
|
+
journeys: plan.journeys.map(({ key, name, strategy, status, destinationUrl, requirement, owner }) => ({ key, name, strategy, status, destinationUrl, requirement, owner })),
|
|
40
|
+
events: plan.events.map(({ eventKey, name, purpose, door, sourceEvent, status, requirement, owner }) => ({ eventKey, name, purpose, door, sourceEvent, status, requirement, owner }))
|
|
41
|
+
} } });
|
|
42
|
+
} catch (error) {
|
|
43
|
+
writeJsonEnvelope({ ok: false, error: { code: "TRACKING_PLAN_FAILED", message: error instanceof Error ? error.message : "Could not prepare tracking", fix: "Read baker analytics plan --full and baker tag-manager draft list to see what is prepared. Correct the request and repeat; do not publish until every requested installation is staged." } });
|
|
44
|
+
process.exitCode = 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
export {
|
|
49
|
+
planCommand
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=plan-FT632COT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/analytics/plan.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { trackingPlanRequestSchema, trackingPlanResponseSchema } from \"@baker/api/analytics\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { writeJsonEnvelope } from \"../ads/output.ts\";\n\nconst description = \"Start here before building a replacement Form: read the agreed journeys, event names, purposes and readiness. --json @plan.json stages the complete plan, with optional wireConversions, funnel steps and a managed Tag Manager installation. Each event records its actual emitter or the missing change and owner. Prepared is not verified. See analytics.md for the contract. Repeating installation preparation replaces its own staged tags; applies only at Publish. --full includes evidence; the default keeps the decision inventory compact.\";\nconst args = { json: { type: \"string\" as const, description: \"Preparation request as JSON or @path; omit to read the effective plan\", required: false }, full: { type: \"boolean\" as const, description: \"Include all journey and verification evidence\", required: false } };\nregisterSchema({ command: \"analytics.plan\", description, args });\n\nexport const planCommand = defineCommand({\n meta: { name: \"plan\", description }, args,\n run: async ({ args }) => {\n try {\n const input: unknown = args.json ? JSON.parse(args.json.startsWith(\"@\") ? readFileSync(args.json.slice(1), \"utf8\") : args.json) : {};\n const parsed = trackingPlanRequestSchema.parse(input);\n const body = { ...parsed, chatId: getEnv().BAKER_CHAT_ID };\n const response = trackingPlanResponseSchema.parse(await apiPost(\"/api/analytics/plan\", body));\n const plan = response.data.plan;\n writeJsonEnvelope({ ...response, data: { ...response.data, plan: args.full || !plan ? plan : {\n journeys: plan.journeys.map(({ key, name, strategy, status, destinationUrl, requirement, owner }) => ({ key, name, strategy, status, destinationUrl, requirement, owner })),\n events: plan.events.map(({ eventKey, name, purpose, door, sourceEvent, status, requirement, owner }) => ({ eventKey, name, purpose, door, sourceEvent, status, requirement, owner })),\n } } });\n } catch (error) {\n writeJsonEnvelope({ ok: false, error: { code: \"TRACKING_PLAN_FAILED\", message: error instanceof Error ? error.message : \"Could not prepare tracking\", fix: \"Read baker analytics plan --full and baker tag-manager draft list to see what is prepared. Correct the request and repeat; do not publish until every requested installation is staged.\" } });\n process.exitCode = 1;\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,oBAAoB;AAE7B,SAAS,qBAAqB;AAM9B,IAAM,cAAc;AACpB,IAAM,OAAO,EAAE,MAAM,EAAE,MAAM,UAAmB,aAAa,yEAAyE,UAAU,MAAM,GAAG,MAAM,EAAE,MAAM,WAAoB,aAAa,iDAAiD,UAAU,MAAM,EAAE;AAC3Q,eAAe,EAAE,SAAS,kBAAkB,aAAa,KAAK,CAAC;AAExD,IAAM,cAAc,cAAc;AAAA,EACvC,MAAM,EAAE,MAAM,QAAQ,YAAY;AAAA,EAAG;AAAA,EACrC,KAAK,OAAO,EAAE,MAAAA,MAAK,MAAM;AACvB,QAAI;AACF,YAAM,QAAiBA,MAAK,OAAO,KAAK,MAAMA,MAAK,KAAK,WAAW,GAAG,IAAI,aAAaA,MAAK,KAAK,MAAM,CAAC,GAAG,MAAM,IAAIA,MAAK,IAAI,IAAI,CAAC;AACnI,YAAM,SAAS,0BAA0B,MAAM,KAAK;AACpD,YAAM,OAAO,EAAE,GAAG,QAAQ,QAAQ,OAAO,EAAE,cAAc;AACzD,YAAM,WAAW,2BAA2B,MAAM,MAAM,QAAQ,uBAAuB,IAAI,CAAC;AAC5F,YAAM,OAAO,SAAS,KAAK;AAC3B,wBAAkB,EAAE,GAAG,UAAU,MAAM,EAAE,GAAG,SAAS,MAAM,MAAMA,MAAK,QAAQ,CAAC,OAAO,OAAO;AAAA,QAC3F,UAAU,KAAK,SAAS,IAAI,CAAC,EAAE,KAAK,MAAM,UAAU,QAAQ,gBAAgB,aAAa,MAAM,OAAO,EAAE,KAAK,MAAM,UAAU,QAAQ,gBAAgB,aAAa,MAAM,EAAE;AAAA,QAC1K,QAAQ,KAAK,OAAO,IAAI,CAAC,EAAE,UAAU,MAAM,SAAS,MAAM,aAAa,QAAQ,aAAa,MAAM,OAAO,EAAE,UAAU,MAAM,SAAS,MAAM,aAAa,QAAQ,aAAa,MAAM,EAAE;AAAA,MACtL,EAAE,EAAE,CAAC;AAAA,IACP,SAAS,OAAO;AACd,wBAAkB,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,wBAAwB,SAAS,iBAAiB,QAAQ,MAAM,UAAU,8BAA8B,KAAK,0LAA0L,EAAE,CAAC;AACxV,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF,CAAC;","names":["args"]}
|
|
@@ -4,17 +4,18 @@ import {
|
|
|
4
4
|
stageAccountId,
|
|
5
5
|
stageXOp,
|
|
6
6
|
stageXOps
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-VYQ3QJ3C.js";
|
|
8
8
|
import "./chunk-M6UNISGO.js";
|
|
9
9
|
import "./chunk-C6U6UDHJ.js";
|
|
10
10
|
import "./chunk-VFIOJD5M.js";
|
|
11
11
|
import {
|
|
12
12
|
TARGETING_OPERATORS,
|
|
13
13
|
TARGETING_TYPES
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-7EPXVICM.js";
|
|
15
15
|
import "./chunk-GXDLWBOY.js";
|
|
16
16
|
import "./chunk-TEINLN64.js";
|
|
17
17
|
import "./chunk-ZJWUBJYQ.js";
|
|
18
|
+
import "./chunk-HR6IWNKE.js";
|
|
18
19
|
import "./chunk-NE4F3FHN.js";
|
|
19
20
|
import "./chunk-XBOK23HI.js";
|
|
20
21
|
import "./chunk-IFWP3ZDO.js";
|
|
@@ -177,4 +178,4 @@ export {
|
|
|
177
178
|
targetingCriteriaCreateCommand,
|
|
178
179
|
targetingCriteriaRemoveCommand
|
|
179
180
|
};
|
|
180
|
-
//# sourceMappingURL=promoted-tweet-writes-
|
|
181
|
+
//# sourceMappingURL=promoted-tweet-writes-7HGESJ46.js.map
|
package/dist/{promoted-tweet-writes-JPLHY3GM.js.map → promoted-tweet-writes-7HGESJ46.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/ads/x/promoted-tweet-writes.ts"],"sourcesContent":["import { TARGETING_OPERATORS, TARGETING_TYPES } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { csvArg, requireTargets, stageAccountId, stageXOp, stageXOps } from \"./write-shared.ts\";\n\n/**\n * Staged ad and targeting writes.\n *\n * \"Promoted tweet\" is X's name for the association between a post and an ad\n * group — the thing X Ads Manager calls an ad. There is no pause: the only way\n * to stop one serving is to remove the association, which leaves the post itself\n * untouched.\n */\n\nregisterSchema({\n command: \"ads.x.promotedTweets.create\",\n description:\n \"Stage promoting one or more existing posts in an X ad group. Takes post (tweet) ids — the numeric id from the post's URL, not a base36 ads id.\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"line-item-id\": {\n type: \"string\",\n description: \"Ad group id, or an x_temp_* ref staged in this draft\",\n required: true,\n },\n \"tweet-ids\": { type: \"string\", description: \"CSV of post ids\", required: true },\n },\n});\n\nexport const promotedTweetsCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage promoting posts in an ad group (applies when the chat is published).\n\nExample:\n baker ads x promoted-tweets create --line-item-id wiee9 --tweet-ids 2042198488033661285`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\" },\n \"line-item-id\": { type: \"string\", description: \"Ad group id or x_temp_* ref\", required: true },\n \"tweet-ids\": { type: \"string\", description: \"CSV of post ids\", required: true },\n },\n run: async ({ args }) => {\n const accountId = await stageAccountId(args);\n await stageXOp({\n kind: \"promotedTweet.create\",\n accountId,\n payload: { lineItemId: args[\"line-item-id\"], tweetIds: csvArg(args[\"tweet-ids\"]) ?? [] },\n });\n },\n});\n\nregisterSchema({\n command: \"ads.x.promotedTweets.remove\",\n description:\n \"Stage removing one or more promoted posts. X has no pause for these — removal is the only way to stop one serving, and it cannot be undone (re-promoting creates a new association).\",\n args: {\n ids: { type: \"string\", description: \"Promoted-post ids, comma-separated\", required: true },\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n },\n});\n\nexport const promotedTweetsRemoveCommand = defineCommand({\n meta: {\n name: \"remove\",\n description: `Stage removing promoted posts. Cannot be undone.\n\nExample:\n baker ads x promoted-tweets remove ayyorn,ayyoro`,\n },\n args: {\n ids: { type: \"positional\", description: \"Promoted-post ids, comma-separated\", required: true },\n \"account-id\": { type: \"string\", description: \"X Ads account ID\" },\n },\n run: async ({ args }) => {\n const accountId = await stageAccountId(args);\n await stageXOps(\n requireTargets(args, \"ids\").map((id) => ({\n kind: \"promotedTweet.remove\",\n accountId,\n target: id,\n payload: {},\n })),\n );\n },\n});\n\nregisterSchema({\n command: \"ads.x.targetingCriteria.create\",\n description: `Stage one targeting criterion on an X ad group. One op per value, because X stores each criterion as its own entity. Look values up first with \\`baker ads x targeting-constants\\`.\nTypes: ${TARGETING_TYPES.join(\", \")}. Operators: ${TARGETING_OPERATORS.join(\" (include) | \")} (exclude).`,\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"line-item-id\": { type: \"string\", description: \"Ad group id, or an x_temp_* ref\", required: true },\n type: { type: \"string\", description: TARGETING_TYPES.join(\" | \"), required: true },\n value: {\n type: \"string\",\n description: \"Targeting value — from `targeting-constants` for the lookup types\",\n required: true,\n },\n operator: { type: \"string\", description: \"EQ to include (default), NE to exclude\", required: false },\n },\n});\n\nexport const targetingCriteriaCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage one targeting criterion on an ad group.\n\nExamples:\n baker ads x targeting-criteria create --line-item-id wiee9 --type LOCATION --value 96683cc9126741d1\n baker ads x targeting-criteria create --line-item-id wiee9 --type INTEREST --value 25 --operator NE`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\" },\n \"line-item-id\": { type: \"string\", description: \"Ad group id or x_temp_* ref\", required: true },\n type: { type: \"string\", description: TARGETING_TYPES.join(\" | \"), required: true },\n value: { type: \"string\", description: \"Targeting value\", required: true },\n operator: { type: \"string\", description: \"EQ (include) | NE (exclude)\" },\n },\n run: async ({ args }) => {\n const accountId = await stageAccountId(args);\n await stageXOp({\n kind: \"targetingCriteria.create\",\n accountId,\n payload: {\n lineItemId: args[\"line-item-id\"],\n targetingType: args.type,\n targetingValue: args.value,\n ...(args.operator ? { operatorType: args.operator } : {}),\n },\n });\n },\n});\n\nregisterSchema({\n command: \"ads.x.targetingCriteria.remove\",\n description: \"Stage removing one or more targeting criteria from an X ad group.\",\n args: {\n ids: { type: \"string\", description: \"Targeting criterion ids, comma-separated\", required: true },\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n },\n});\n\nexport const targetingCriteriaRemoveCommand = defineCommand({\n meta: {\n name: \"remove\",\n description: `Stage removing targeting criteria.\n\nExample:\n baker ads x targeting-criteria remove 1dmtken`,\n },\n args: {\n ids: { type: \"positional\", description: \"Targeting criterion ids, comma-separated\", required: true },\n \"account-id\": { type: \"string\", description: \"X Ads account ID\" },\n },\n run: async ({ args }) => {\n const accountId = await stageAccountId(args);\n await stageXOps(\n requireTargets(args, \"ids\").map((id) => ({\n kind: \"targetingCriteria.remove\",\n accountId,\n target: id,\n payload: {},\n })),\n );\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/x/promoted-tweet-writes.ts"],"sourcesContent":["import { TARGETING_OPERATORS, TARGETING_TYPES } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { csvArg, requireTargets, stageAccountId, stageXOp, stageXOps } from \"./write-shared.ts\";\n\n/**\n * Staged ad and targeting writes.\n *\n * \"Promoted tweet\" is X's name for the association between a post and an ad\n * group — the thing X Ads Manager calls an ad. There is no pause: the only way\n * to stop one serving is to remove the association, which leaves the post itself\n * untouched.\n */\n\nregisterSchema({\n command: \"ads.x.promotedTweets.create\",\n description:\n \"Stage promoting one or more existing posts in an X ad group. Takes post (tweet) ids — the numeric id from the post's URL, not a base36 ads id.\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"line-item-id\": {\n type: \"string\",\n description: \"Ad group id, or an x_temp_* ref staged in this draft\",\n required: true,\n },\n \"tweet-ids\": { type: \"string\", description: \"CSV of post ids\", required: true },\n },\n});\n\nexport const promotedTweetsCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage promoting posts in an ad group (applies when the chat is published).\n\nExample:\n baker ads x promoted-tweets create --line-item-id wiee9 --tweet-ids 2042198488033661285`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\" },\n \"line-item-id\": { type: \"string\", description: \"Ad group id or x_temp_* ref\", required: true },\n \"tweet-ids\": { type: \"string\", description: \"CSV of post ids\", required: true },\n },\n run: async ({ args }) => {\n const accountId = await stageAccountId(args);\n await stageXOp({\n kind: \"promotedTweet.create\",\n accountId,\n payload: { lineItemId: args[\"line-item-id\"], tweetIds: csvArg(args[\"tweet-ids\"]) ?? [] },\n });\n },\n});\n\nregisterSchema({\n command: \"ads.x.promotedTweets.remove\",\n description:\n \"Stage removing one or more promoted posts. X has no pause for these — removal is the only way to stop one serving, and it cannot be undone (re-promoting creates a new association).\",\n args: {\n ids: { type: \"string\", description: \"Promoted-post ids, comma-separated\", required: true },\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n },\n});\n\nexport const promotedTweetsRemoveCommand = defineCommand({\n meta: {\n name: \"remove\",\n description: `Stage removing promoted posts. Cannot be undone.\n\nExample:\n baker ads x promoted-tweets remove ayyorn,ayyoro`,\n },\n args: {\n ids: { type: \"positional\", description: \"Promoted-post ids, comma-separated\", required: true },\n \"account-id\": { type: \"string\", description: \"X Ads account ID\" },\n },\n run: async ({ args }) => {\n const accountId = await stageAccountId(args);\n await stageXOps(\n requireTargets(args, \"ids\").map((id) => ({\n kind: \"promotedTweet.remove\",\n accountId,\n target: id,\n payload: {},\n })),\n );\n },\n});\n\nregisterSchema({\n command: \"ads.x.targetingCriteria.create\",\n description: `Stage one targeting criterion on an X ad group. One op per value, because X stores each criterion as its own entity. Look values up first with \\`baker ads x targeting-constants\\`.\nTypes: ${TARGETING_TYPES.join(\", \")}. Operators: ${TARGETING_OPERATORS.join(\" (include) | \")} (exclude).`,\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"line-item-id\": { type: \"string\", description: \"Ad group id, or an x_temp_* ref\", required: true },\n type: { type: \"string\", description: TARGETING_TYPES.join(\" | \"), required: true },\n value: {\n type: \"string\",\n description: \"Targeting value — from `targeting-constants` for the lookup types\",\n required: true,\n },\n operator: { type: \"string\", description: \"EQ to include (default), NE to exclude\", required: false },\n },\n});\n\nexport const targetingCriteriaCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage one targeting criterion on an ad group.\n\nExamples:\n baker ads x targeting-criteria create --line-item-id wiee9 --type LOCATION --value 96683cc9126741d1\n baker ads x targeting-criteria create --line-item-id wiee9 --type INTEREST --value 25 --operator NE`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\" },\n \"line-item-id\": { type: \"string\", description: \"Ad group id or x_temp_* ref\", required: true },\n type: { type: \"string\", description: TARGETING_TYPES.join(\" | \"), required: true },\n value: { type: \"string\", description: \"Targeting value\", required: true },\n operator: { type: \"string\", description: \"EQ (include) | NE (exclude)\" },\n },\n run: async ({ args }) => {\n const accountId = await stageAccountId(args);\n await stageXOp({\n kind: \"targetingCriteria.create\",\n accountId,\n payload: {\n lineItemId: args[\"line-item-id\"],\n targetingType: args.type,\n targetingValue: args.value,\n ...(args.operator ? { operatorType: args.operator } : {}),\n },\n });\n },\n});\n\nregisterSchema({\n command: \"ads.x.targetingCriteria.remove\",\n description: \"Stage removing one or more targeting criteria from an X ad group.\",\n args: {\n ids: { type: \"string\", description: \"Targeting criterion ids, comma-separated\", required: true },\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n },\n});\n\nexport const targetingCriteriaRemoveCommand = defineCommand({\n meta: {\n name: \"remove\",\n description: `Stage removing targeting criteria.\n\nExample:\n baker ads x targeting-criteria remove 1dmtken`,\n },\n args: {\n ids: { type: \"positional\", description: \"Targeting criterion ids, comma-separated\", required: true },\n \"account-id\": { type: \"string\", description: \"X Ads account ID\" },\n },\n run: async ({ args }) => {\n const accountId = await stageAccountId(args);\n await stageXOps(\n requireTargets(args, \"ids\").map((id) => ({\n kind: \"targetingCriteria.remove\",\n accountId,\n target: id,\n payload: {},\n })),\n );\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAa9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,gBAAgB;AAAA,MACd,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,aAAa,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,KAAK;AAAA,EAChF;AACF,CAAC;AAEM,IAAM,8BAA8B,cAAc;AAAA,EACvD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,IAChE,gBAAgB,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,KAAK;AAAA,IAC7F,aAAa,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,KAAK;AAAA,EAChF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,eAAe,IAAI;AAC3C,UAAM,SAAS;AAAA,MACb,MAAM;AAAA,MACN;AAAA,MACA,SAAS,EAAE,YAAY,KAAK,cAAc,GAAG,UAAU,OAAO,KAAK,WAAW,CAAC,KAAK,CAAC,EAAE;AAAA,IACzF,CAAC;AAAA,EACH;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,UAAU,aAAa,sCAAsC,UAAU,KAAK;AAAA,IACzF,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,EACnF;AACF,CAAC;AAEM,IAAM,8BAA8B,cAAc;AAAA,EACvD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,cAAc,aAAa,sCAAsC,UAAU,KAAK;AAAA,IAC7F,cAAc,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,EAClE;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,eAAe,IAAI;AAC3C,UAAM;AAAA,MACJ,eAAe,MAAM,KAAK,EAAE,IAAI,CAAC,QAAQ;AAAA,QACvC,MAAM;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,QACR,SAAS,CAAC;AAAA,MACZ,EAAE;AAAA,IACJ;AAAA,EACF;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,SACN,gBAAgB,KAAK,IAAI,CAAC,gBAAgB,oBAAoB,KAAK,eAAe,CAAC;AAAA,EAC1F,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,gBAAgB,EAAE,MAAM,UAAU,aAAa,mCAAmC,UAAU,KAAK;AAAA,IACjG,MAAM,EAAE,MAAM,UAAU,aAAa,gBAAgB,KAAK,KAAK,GAAG,UAAU,KAAK;AAAA,IACjF,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,UAAU,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,MAAM;AAAA,EACrG;AACF,CAAC;AAEM,IAAM,iCAAiC,cAAc;AAAA,EAC1D,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,IAChE,gBAAgB,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,KAAK;AAAA,IAC7F,MAAM,EAAE,MAAM,UAAU,aAAa,gBAAgB,KAAK,KAAK,GAAG,UAAU,KAAK;AAAA,IACjF,OAAO,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,KAAK;AAAA,IACxE,UAAU,EAAE,MAAM,UAAU,aAAa,8BAA8B;AAAA,EACzE;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,eAAe,IAAI;AAC3C,UAAM,SAAS;AAAA,MACb,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,QACP,YAAY,KAAK,cAAc;AAAA,QAC/B,eAAe,KAAK;AAAA,QACpB,gBAAgB,KAAK;AAAA,QACrB,GAAI,KAAK,WAAW,EAAE,cAAc,KAAK,SAAS,IAAI,CAAC;AAAA,MACzD;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,UAAU,aAAa,4CAA4C,UAAU,KAAK;AAAA,IAC/F,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,EACnF;AACF,CAAC;AAEM,IAAM,iCAAiC,cAAc;AAAA,EAC1D,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,cAAc,aAAa,4CAA4C,UAAU,KAAK;AAAA,IACnG,cAAc,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,EAClE;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,eAAe,IAAI;AAC3C,UAAM;AAAA,MACJ,eAAe,MAAM,KAAK,EAAE,IAAI,CAAC,QAAQ;AAAA,QACvC,MAAM;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,QACR,SAAS,CAAC;AAAA,MACZ,EAAE;AAAA,IACJ;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -101,8 +101,8 @@ Examples:
|
|
|
101
101
|
},
|
|
102
102
|
subCommands: {
|
|
103
103
|
list: promotedTweetsListCommand,
|
|
104
|
-
create: () => import("./promoted-tweet-writes-
|
|
105
|
-
remove: () => import("./promoted-tweet-writes-
|
|
104
|
+
create: () => import("./promoted-tweet-writes-7HGESJ46.js").then((m) => m.promotedTweetsCreateCommand),
|
|
105
|
+
remove: () => import("./promoted-tweet-writes-7HGESJ46.js").then((m) => m.promotedTweetsRemoveCommand)
|
|
106
106
|
},
|
|
107
107
|
args: {
|
|
108
108
|
"account-id": { type: "string", description: "X Ads account ID" },
|
|
@@ -116,4 +116,4 @@ Examples:
|
|
|
116
116
|
export {
|
|
117
117
|
promotedTweetsCommand
|
|
118
118
|
};
|
|
119
|
-
//# sourceMappingURL=promoted-tweets-
|
|
119
|
+
//# sourceMappingURL=promoted-tweets-LZKS5JIF.js.map
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
} from "./chunk-75FDTDLH.js";
|
|
22
22
|
import {
|
|
23
23
|
fetchRunRecord
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-WGUQHAJY.js";
|
|
25
25
|
import {
|
|
26
26
|
findWorkspaceRoot
|
|
27
27
|
} from "./chunk-DZSIUEGH.js";
|
|
@@ -30,10 +30,11 @@ import {
|
|
|
30
30
|
} from "./chunk-HRYOZUSK.js";
|
|
31
31
|
import "./chunk-VVZBBKRC.js";
|
|
32
32
|
import "./chunk-YBMVHGY3.js";
|
|
33
|
-
import "./chunk-
|
|
33
|
+
import "./chunk-7EPXVICM.js";
|
|
34
34
|
import "./chunk-GXDLWBOY.js";
|
|
35
35
|
import "./chunk-TEINLN64.js";
|
|
36
36
|
import "./chunk-ZJWUBJYQ.js";
|
|
37
|
+
import "./chunk-HR6IWNKE.js";
|
|
37
38
|
import "./chunk-NE4F3FHN.js";
|
|
38
39
|
import {
|
|
39
40
|
ApiError
|
|
@@ -319,4 +320,4 @@ export {
|
|
|
319
320
|
publishCreative,
|
|
320
321
|
publishVideoCreative
|
|
321
322
|
};
|
|
322
|
-
//# sourceMappingURL=publish-
|
|
323
|
+
//# sourceMappingURL=publish-NPD3SMZL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/creatives/publish.ts"],"sourcesContent":["import { Buffer } from \"node:buffer\";\nimport type {\n CreativesPublishVideoRequest,\n CreativesPublishVideoResponse,\n CreativesRunData,\n CreativesRunOutput,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { ApiError } from \"../../client.ts\";\nimport { sha256Hex } from \"../../engine/storage/sha256.ts\";\nimport { optionalChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { advanceDefinitionStatus, definitionPathFor } from \"../canvas/definition-status.ts\";\nimport { findWorkspaceRoot } from \"../canvas/normalize-paths.ts\";\nimport { fetchRunRecord } from \"../canvas/run-history.ts\";\nimport {\n defaultImageApiDeps,\n detectImageContentType,\n type ImageApiDeps,\n imageProcessingTimeoutMs,\n publishImageAsCreative,\n uploadImageBytes,\n uploadLocalImage,\n waitForReadyImage,\n} from \"../images/api.ts\";\nimport {\n defaultVideoApiDeps,\n detectVideoContentType,\n isVideoFile,\n uploadLocalVideo,\n type VideoApiDeps,\n videoProcessingTimeoutMs,\n waitForPlayableVideo,\n} from \"../videos/api.ts\";\n\nconst creativeContentTypes = [\"image/png\", \"image/jpeg\", \"image/webp\"] as const;\nconst creativeVideoContentTypes = [\"video/mp4\", \"video/quicktime\", \"video/webm\"] as const;\nconst UNSUPPORTED_CREATIVE_FILE =\n \"Unsupported creative file extension. Use PNG, JPG or WebP for an image, MP4, MOV or WebM for a video.\";\n\ntype CreativeReference = {\n type: \"creative\";\n slug: string;\n creativeId: string;\n title: string;\n asset: {\n kind: \"static_image\";\n imageId: string;\n imageUrl: string;\n storageKey?: string;\n width?: number;\n height?: number;\n aspectRatio?: number;\n };\n imageUrl: string;\n thumbnailUrl: string;\n storageKey?: string;\n sourceReferenceUrl?: string;\n width?: number;\n height?: number;\n aspectRatio?: number;\n};\n\ntype CreativesPublishResult = {\n creativeId: string;\n imageId: string;\n reference: CreativeReference;\n /** Set when `src/creatives/<slug>/_definition.md` was moved to `published`. */\n definitionStatus?: \"published\";\n};\n\nconst DESCRIPTION = `Save a finished creative to Baker Creatives and return a creative reference: a static image (PNG/JPG/WebP) or a finished video render (MP4/MOV/WebM).\nStart here:\n baker creatives publish ./canvas/r_01K…/final_4x5.png --title \"Spring Offer\" --slug spring-offer --run-id r_01K…\n baker creatives publish --title \"Spring Offer\" --slug spring-offer --run-id r_01K… --output 4:5\n baker creatives publish ./canvas/r_01K…/final.mp4 --title \"Spring Offer Reel\" --slug spring-offer --run-id r_01K…\nWith --run-id and no file, the run's own saved image is published (--output picks one when the run made several). A video goes to the company's video library first and is saved once it plays (up to 3 minutes); it needs the file and --slug. Choose and save the finished version yourself, including in the turn that rendered it. Saving pins that version without recording user approval or putting an ad live. An image publish marks the creative's _definition.md published.`;\n\nconst ARGS = {\n file: {\n type: \"string\",\n description:\n \"Local creative file: PNG/JPG/WebP image or MP4/MOV/WebM video. Optional for an image with --run-id: the run's saved output is used instead.\",\n required: false,\n },\n title: { type: \"string\", description: \"Human title for the creative output\", required: true },\n context: { type: \"string\", description: \"Optional describe context for the image asset\", required: false },\n sourceReferenceUrl: {\n type: \"string\",\n description: \"Optional URL of the original reference ad\",\n required: false,\n },\n slug: {\n type: \"string\",\n description:\n \"Creative slug (src/creatives/<slug>/). Attaches the image or video to that creative's row. Required for a video\",\n required: false,\n },\n runId: {\n type: \"string\",\n description: \"Canvas run id (r_…) of the finished generation to pin as published\",\n required: false,\n },\n output: {\n type: \"string\",\n description:\n \"With --run-id and no file: which of the run's outputs to save when it made several, by label (e.g. 4:5), slot, or number (1 = first).\",\n required: false,\n },\n} as const;\n\nregisterSchema({ command: \"creatives.publish\", description: DESCRIPTION, args: ARGS });\n\nexport function detectCreativeContentType(filePath: string): string {\n return detectImageContentType(filePath, {\n allowedContentTypes: creativeContentTypes,\n unsupportedMessage: UNSUPPORTED_CREATIVE_FILE,\n });\n}\n\nfunction chatIdFromEnv(): string | undefined {\n // Soft read: publish attribution is best-effort. Direct callers (tests,\n // local one-offs) may run without the full env contract — missing creds\n // already fail loudly at the API call itself.\n return optionalChatId();\n}\n\nfunction parseOptionalUrl(value: string | undefined): string | undefined {\n if (value === undefined || value.trim() === \"\") {\n return undefined;\n }\n\n try {\n return new URL(value).toString();\n } catch {\n throw new ApiError(\"VALIDATION_ERROR\", \"--source-reference-url must be a valid URL\");\n }\n}\n\n/** What publishing needs beyond the image API: fetching a run's output, and where the workspace is. */\nexport type PublishDeps = ImageApiDeps & {\n download?: (url: string) => Promise<Buffer>;\n workspaceRoot?: string;\n};\n\nasync function downloadBytes(url: string): Promise<Buffer> {\n const res = await fetch(url);\n if (!res.ok) throw new ApiError(\"UNAVAILABLE\", `Could not read the run's output (${res.status} ${res.statusText})`);\n return Buffer.from(await res.arrayBuffer());\n}\n\n/**\n * The run's result, when it is still images, in the order the run delivered them. Only the\n * final outputs of a finished run count: the frames and reference sheets its steps made on\n * the way are images too, and publishing one of those would save a stand-in as the creative.\n */\nfunction runImages(run: CreativesRunData): CreativesRunOutput[] {\n if (run.status !== \"completed\") {\n throw new ApiError(\n \"VALIDATION_ERROR\",\n `Run ${run.runId} did not finish (${run.status}), so it has no result to publish. Finish the run first, or pass the image file.`,\n );\n }\n const finals = run.finalOutputs.filter((o) => typeof o.url === \"string\");\n if (finals.some((o) => !creativeContentTypes.some((t) => t === o.mime))) {\n throw new ApiError(\n \"VALIDATION_ERROR\",\n `Run ${run.runId} made a video, not a still image. Publish the video file: baker creatives publish ./canvas/${run.runId}/<file>.mp4 --slug <slug> --run-id ${run.runId}.`,\n );\n }\n return finals;\n}\n\nfunction describeOutputs(outputs: CreativesRunOutput[]): string {\n return outputs.map((o, i) => `${i + 1}: ${o.label ?? o.slot}`).join(\", \");\n}\n\n/** The one output to save: the only one, or the one `choice` names by label, slot or number. */\nfunction chooseOutput(run: CreativesRunData, choice: string | undefined): CreativesRunOutput {\n const images = runImages(run);\n if (images.length === 0) {\n throw new ApiError(\n \"VALIDATION_ERROR\",\n `Run ${run.runId} has no saved image to publish. Pass the image file instead.`,\n );\n }\n if (choice === undefined) {\n const [only] = images;\n if (images.length === 1 && only) return only;\n throw new ApiError(\n \"VALIDATION_ERROR\",\n `Run ${run.runId} made ${images.length} images; pick one with --output (${describeOutputs(images)}).`,\n );\n }\n const wanted = choice.trim();\n const byNumber = /^\\d+$/.test(wanted) ? images[Number(wanted) - 1] : undefined;\n const found = byNumber ?? images.find((o) => o.label === wanted || o.slot === wanted);\n if (!found) {\n throw new ApiError(\"VALIDATION_ERROR\", `Run ${run.runId} has no output \"${wanted}\" (${describeOutputs(images)}).`);\n }\n return found;\n}\n\nconst EXTENSION: Record<string, string> = { \"image/png\": \".png\", \"image/jpeg\": \".jpg\", \"image/webp\": \".webp\" };\n\n/**\n * Upload the run's saved output, byte for byte: the version that was chosen, not whichever\n * local file happens to sit at a path (and it works in a workspace that never had one).\n */\nasync function uploadRunOutput(\n args: {\n runId: string;\n output: string | undefined;\n descriptionContext: string;\n },\n deps: PublishDeps,\n): Promise<{ imageId: string }> {\n const run = await fetchRunRecord(args.runId, deps.post);\n if (!run) {\n throw new ApiError(\n \"NOT_FOUND\",\n `No run \"${args.runId}\" in this company's run history. Pass the image file instead.`,\n );\n }\n const chosen = chooseOutput(run, args.output);\n const bytes = await (deps.download ?? downloadBytes)(String(chosen.url));\n if (sha256Hex(bytes) !== chosen.sha256) {\n throw new ApiError(\n \"VALIDATION_ERROR\",\n `The saved output of run ${run.runId} does not match its recorded fingerprint`,\n );\n }\n const name = (chosen.label ?? chosen.slot).replace(/[^a-z0-9.-]+/gi, \"_\");\n return uploadImageBytes(\n {\n bytes,\n contentType: chosen.mime,\n originalFilename: `${run.runId}-${name}${EXTENSION[chosen.mime] ?? \"\"}`,\n source: \"ai_generated\",\n descriptionContext: args.descriptionContext,\n },\n deps,\n );\n}\n\nexport async function publishCreative(\n args: {\n file?: string;\n title: string;\n context?: string;\n sourceReferenceUrl?: string;\n slug?: string;\n runId?: string;\n output?: string;\n },\n deps: PublishDeps = defaultImageApiDeps,\n): Promise<CreativesPublishResult> {\n const title = args.title.trim();\n if (!title) {\n throw new ApiError(\"VALIDATION_ERROR\", \"--title is required\");\n }\n\n const sourceReferenceUrl = parseOptionalUrl(args.sourceReferenceUrl);\n const descriptionContext = args.context ?? `Static ad creative: ${title}`;\n let upload: { imageId: string };\n if (args.file) {\n upload = await uploadLocalImage(\n {\n file: args.file,\n contentType: detectCreativeContentType(args.file),\n source: \"ai_generated\",\n descriptionContext,\n },\n deps,\n );\n } else if (args.runId) {\n upload = await uploadRunOutput(\n {\n runId: args.runId,\n output: args.output,\n descriptionContext,\n },\n deps,\n );\n } else {\n throw new ApiError(\"VALIDATION_ERROR\", \"Pass the image file, or --run-id to save the run's own output\");\n }\n await waitForReadyImage(deps, upload.imageId, { timeoutMs: imageProcessingTimeoutMs });\n const result = await publishImageAsCreative(deps, {\n imageId: upload.imageId,\n title,\n sourceReferenceUrl,\n slug: args.slug,\n runId: args.runId,\n // Attribute the publish to the driving chat (injected by the bridge).\n chatId: chatIdFromEnv(),\n });\n // The lifecycle field moves with what happened: saving a finished version marks the\n // creative published in its definition, so nobody edits it by hand.\n if (args.slug && args.runId) {\n const cwd = process.cwd();\n const root = deps.workspaceRoot ?? findWorkspaceRoot(cwd) ?? cwd;\n const status = await advanceDefinitionStatus(definitionPathFor(root, args.slug), \"published\");\n if (status === \"updated\") return { ...result, definitionStatus: \"published\" };\n }\n return result;\n}\n\n/**\n * `baker creatives publish <video>`: upload the render to the company's video\n * library, wait until Baker can play it, then save it on the creative. The\n * image path above is untouched by this.\n */\nexport async function publishVideoCreative(\n args: { file: string; title: string; context?: string; sourceReferenceUrl?: string; slug?: string; runId?: string },\n deps: VideoApiDeps = defaultVideoApiDeps,\n): Promise<CreativesPublishVideoResponse> {\n const title = args.title.trim();\n if (!title) {\n throw new ApiError(\"VALIDATION_ERROR\", \"--title is required\");\n }\n const slug = args.slug?.trim();\n if (!slug) {\n throw new ApiError(\n \"VALIDATION_ERROR\",\n \"--slug is required for a video: name the creative (src/creatives/<slug>/) this render belongs to\",\n );\n }\n const sourceReferenceUrl = parseOptionalUrl(args.sourceReferenceUrl);\n const contentType = detectVideoContentType(args.file, {\n allowedContentTypes: creativeVideoContentTypes,\n unsupportedMessage: UNSUPPORTED_CREATIVE_FILE,\n });\n const { videoId } = await uploadLocalVideo(\n { file: args.file, contentType, descriptionContext: args.context ?? `Video ad creative: ${title}` },\n deps,\n );\n await waitForPlayableVideo(deps, videoId, { timeoutMs: videoProcessingTimeoutMs });\n const body: CreativesPublishVideoRequest = { videoId, title, slug };\n if (args.runId) body.runId = args.runId;\n if (sourceReferenceUrl) body.sourceReferenceUrl = sourceReferenceUrl;\n const chatId = chatIdFromEnv();\n if (chatId) body.chatId = chatId;\n return deps.post<CreativesPublishVideoResponse>(\"/api/creatives/publish-video\", body);\n}\n\nexport const publishCommand = defineCommand({\n meta: { name: \"publish\", description: DESCRIPTION },\n // Checked in `run` rather than by citty, so a missing value answers with the JSON envelope.\n args: { ...ARGS, file: { ...ARGS.file, type: \"positional\" }, title: { ...ARGS.title, required: false } },\n run: async ({ args }) => {\n try {\n const file = args.file as string | undefined;\n const title = args.title as string | undefined;\n const runId = args.runId as string | undefined;\n if (!file && !runId) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: \"Image or video path is required (or --run-id to save the run's own image)\",\n },\n });\n process.exit(1);\n }\n if (!title) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"--title is required\" } });\n process.exit(1);\n }\n const publishArgs = {\n file: file || undefined,\n title,\n context: args.context as string | undefined,\n sourceReferenceUrl: args.sourceReferenceUrl as string | undefined,\n slug: args.slug as string | undefined,\n runId,\n };\n if (file && isVideoFile(file)) {\n writeJson(await publishVideoCreative({ ...publishArgs, file }));\n return;\n }\n const data = await publishCreative({\n ...publishArgs,\n output: args.output as string | undefined,\n });\n writeJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/creatives/publish.ts"],"sourcesContent":["import { Buffer } from \"node:buffer\";\nimport type {\n CreativesPublishVideoRequest,\n CreativesPublishVideoResponse,\n CreativesRunData,\n CreativesRunOutput,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { ApiError } from \"../../client.ts\";\nimport { sha256Hex } from \"../../engine/storage/sha256.ts\";\nimport { optionalChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { advanceDefinitionStatus, definitionPathFor } from \"../canvas/definition-status.ts\";\nimport { findWorkspaceRoot } from \"../canvas/normalize-paths.ts\";\nimport { fetchRunRecord } from \"../canvas/run-history.ts\";\nimport {\n defaultImageApiDeps,\n detectImageContentType,\n type ImageApiDeps,\n imageProcessingTimeoutMs,\n publishImageAsCreative,\n uploadImageBytes,\n uploadLocalImage,\n waitForReadyImage,\n} from \"../images/api.ts\";\nimport {\n defaultVideoApiDeps,\n detectVideoContentType,\n isVideoFile,\n uploadLocalVideo,\n type VideoApiDeps,\n videoProcessingTimeoutMs,\n waitForPlayableVideo,\n} from \"../videos/api.ts\";\n\nconst creativeContentTypes = [\"image/png\", \"image/jpeg\", \"image/webp\"] as const;\nconst creativeVideoContentTypes = [\"video/mp4\", \"video/quicktime\", \"video/webm\"] as const;\nconst UNSUPPORTED_CREATIVE_FILE =\n \"Unsupported creative file extension. Use PNG, JPG or WebP for an image, MP4, MOV or WebM for a video.\";\n\ntype CreativeReference = {\n type: \"creative\";\n slug: string;\n creativeId: string;\n title: string;\n asset: {\n kind: \"static_image\";\n imageId: string;\n imageUrl: string;\n storageKey?: string;\n width?: number;\n height?: number;\n aspectRatio?: number;\n };\n imageUrl: string;\n thumbnailUrl: string;\n storageKey?: string;\n sourceReferenceUrl?: string;\n width?: number;\n height?: number;\n aspectRatio?: number;\n};\n\ntype CreativesPublishResult = {\n creativeId: string;\n imageId: string;\n reference: CreativeReference;\n /** Set when `src/creatives/<slug>/_definition.md` was moved to `published`. */\n definitionStatus?: \"published\";\n};\n\nconst DESCRIPTION = `Save a finished creative to Baker Creatives and return a creative reference: a static image (PNG/JPG/WebP) or a finished video render (MP4/MOV/WebM).\nStart here:\n baker creatives publish ./canvas/r_01K…/final_4x5.png --title \"Spring Offer\" --slug spring-offer --run-id r_01K…\n baker creatives publish --title \"Spring Offer\" --slug spring-offer --run-id r_01K… --output 4:5\n baker creatives publish ./canvas/r_01K…/final.mp4 --title \"Spring Offer Reel\" --slug spring-offer --run-id r_01K…\nWith --run-id and no file, the run's own saved image is published (--output picks one when the run made several). A video goes to the company's video library first and is saved once it plays (up to 3 minutes); it needs the file and --slug. Choose and save the finished version yourself, including in the turn that rendered it. Saving pins that version without recording user approval or putting an ad live. An image publish marks the creative's _definition.md published.`;\n\nconst ARGS = {\n file: {\n type: \"string\",\n description:\n \"Local creative file: PNG/JPG/WebP image or MP4/MOV/WebM video. Optional for an image with --run-id: the run's saved output is used instead.\",\n required: false,\n },\n title: { type: \"string\", description: \"Human title for the creative output\", required: true },\n context: { type: \"string\", description: \"Optional describe context for the image asset\", required: false },\n sourceReferenceUrl: {\n type: \"string\",\n description: \"Optional URL of the original reference ad\",\n required: false,\n },\n slug: {\n type: \"string\",\n description:\n \"Creative slug (src/creatives/<slug>/). Attaches the image or video to that creative's row. Required for a video\",\n required: false,\n },\n runId: {\n type: \"string\",\n description: \"Canvas run id (r_…) of the finished generation to pin as published\",\n required: false,\n },\n output: {\n type: \"string\",\n description:\n \"With --run-id and no file: which of the run's outputs to save when it made several, by label (e.g. 4:5), slot, or number (1 = first).\",\n required: false,\n },\n} as const;\n\nregisterSchema({ command: \"creatives.publish\", description: DESCRIPTION, args: ARGS });\n\nexport function detectCreativeContentType(filePath: string): string {\n return detectImageContentType(filePath, {\n allowedContentTypes: creativeContentTypes,\n unsupportedMessage: UNSUPPORTED_CREATIVE_FILE,\n });\n}\n\nfunction chatIdFromEnv(): string | undefined {\n // Soft read: publish attribution is best-effort. Direct callers (tests,\n // local one-offs) may run without the full env contract — missing creds\n // already fail loudly at the API call itself.\n return optionalChatId();\n}\n\nfunction parseOptionalUrl(value: string | undefined): string | undefined {\n if (value === undefined || value.trim() === \"\") {\n return undefined;\n }\n\n try {\n return new URL(value).toString();\n } catch {\n throw new ApiError(\"VALIDATION_ERROR\", \"--source-reference-url must be a valid URL\");\n }\n}\n\n/** What publishing needs beyond the image API: fetching a run's output, and where the workspace is. */\nexport type PublishDeps = ImageApiDeps & {\n download?: (url: string) => Promise<Buffer>;\n workspaceRoot?: string;\n};\n\nasync function downloadBytes(url: string): Promise<Buffer> {\n const res = await fetch(url);\n if (!res.ok) throw new ApiError(\"UNAVAILABLE\", `Could not read the run's output (${res.status} ${res.statusText})`);\n return Buffer.from(await res.arrayBuffer());\n}\n\n/**\n * The run's result, when it is still images, in the order the run delivered them. Only the\n * final outputs of a finished run count: the frames and reference sheets its steps made on\n * the way are images too, and publishing one of those would save a stand-in as the creative.\n */\nfunction runImages(run: CreativesRunData): CreativesRunOutput[] {\n if (run.status !== \"completed\") {\n throw new ApiError(\n \"VALIDATION_ERROR\",\n `Run ${run.runId} did not finish (${run.status}), so it has no result to publish. Finish the run first, or pass the image file.`,\n );\n }\n const finals = run.finalOutputs.filter((o) => typeof o.url === \"string\");\n if (finals.some((o) => !creativeContentTypes.some((t) => t === o.mime))) {\n throw new ApiError(\n \"VALIDATION_ERROR\",\n `Run ${run.runId} made a video, not a still image. Publish the video file: baker creatives publish ./canvas/${run.runId}/<file>.mp4 --slug <slug> --run-id ${run.runId}.`,\n );\n }\n return finals;\n}\n\nfunction describeOutputs(outputs: CreativesRunOutput[]): string {\n return outputs.map((o, i) => `${i + 1}: ${o.label ?? o.slot}`).join(\", \");\n}\n\n/** The one output to save: the only one, or the one `choice` names by label, slot or number. */\nfunction chooseOutput(run: CreativesRunData, choice: string | undefined): CreativesRunOutput {\n const images = runImages(run);\n if (images.length === 0) {\n throw new ApiError(\n \"VALIDATION_ERROR\",\n `Run ${run.runId} has no saved image to publish. Pass the image file instead.`,\n );\n }\n if (choice === undefined) {\n const [only] = images;\n if (images.length === 1 && only) return only;\n throw new ApiError(\n \"VALIDATION_ERROR\",\n `Run ${run.runId} made ${images.length} images; pick one with --output (${describeOutputs(images)}).`,\n );\n }\n const wanted = choice.trim();\n const byNumber = /^\\d+$/.test(wanted) ? images[Number(wanted) - 1] : undefined;\n const found = byNumber ?? images.find((o) => o.label === wanted || o.slot === wanted);\n if (!found) {\n throw new ApiError(\"VALIDATION_ERROR\", `Run ${run.runId} has no output \"${wanted}\" (${describeOutputs(images)}).`);\n }\n return found;\n}\n\nconst EXTENSION: Record<string, string> = { \"image/png\": \".png\", \"image/jpeg\": \".jpg\", \"image/webp\": \".webp\" };\n\n/**\n * Upload the run's saved output, byte for byte: the version that was chosen, not whichever\n * local file happens to sit at a path (and it works in a workspace that never had one).\n */\nasync function uploadRunOutput(\n args: {\n runId: string;\n output: string | undefined;\n descriptionContext: string;\n },\n deps: PublishDeps,\n): Promise<{ imageId: string }> {\n const run = await fetchRunRecord(args.runId, deps.post);\n if (!run) {\n throw new ApiError(\n \"NOT_FOUND\",\n `No run \"${args.runId}\" in this company's run history. Pass the image file instead.`,\n );\n }\n const chosen = chooseOutput(run, args.output);\n const bytes = await (deps.download ?? downloadBytes)(String(chosen.url));\n if (sha256Hex(bytes) !== chosen.sha256) {\n throw new ApiError(\n \"VALIDATION_ERROR\",\n `The saved output of run ${run.runId} does not match its recorded fingerprint`,\n );\n }\n const name = (chosen.label ?? chosen.slot).replace(/[^a-z0-9.-]+/gi, \"_\");\n return uploadImageBytes(\n {\n bytes,\n contentType: chosen.mime,\n originalFilename: `${run.runId}-${name}${EXTENSION[chosen.mime] ?? \"\"}`,\n source: \"ai_generated\",\n descriptionContext: args.descriptionContext,\n },\n deps,\n );\n}\n\nexport async function publishCreative(\n args: {\n file?: string;\n title: string;\n context?: string;\n sourceReferenceUrl?: string;\n slug?: string;\n runId?: string;\n output?: string;\n },\n deps: PublishDeps = defaultImageApiDeps,\n): Promise<CreativesPublishResult> {\n const title = args.title.trim();\n if (!title) {\n throw new ApiError(\"VALIDATION_ERROR\", \"--title is required\");\n }\n\n const sourceReferenceUrl = parseOptionalUrl(args.sourceReferenceUrl);\n const descriptionContext = args.context ?? `Static ad creative: ${title}`;\n let upload: { imageId: string };\n if (args.file) {\n upload = await uploadLocalImage(\n {\n file: args.file,\n contentType: detectCreativeContentType(args.file),\n source: \"ai_generated\",\n descriptionContext,\n },\n deps,\n );\n } else if (args.runId) {\n upload = await uploadRunOutput(\n {\n runId: args.runId,\n output: args.output,\n descriptionContext,\n },\n deps,\n );\n } else {\n throw new ApiError(\"VALIDATION_ERROR\", \"Pass the image file, or --run-id to save the run's own output\");\n }\n await waitForReadyImage(deps, upload.imageId, { timeoutMs: imageProcessingTimeoutMs });\n const result = await publishImageAsCreative(deps, {\n imageId: upload.imageId,\n title,\n sourceReferenceUrl,\n slug: args.slug,\n runId: args.runId,\n // Attribute the publish to the driving chat (injected by the bridge).\n chatId: chatIdFromEnv(),\n });\n // The lifecycle field moves with what happened: saving a finished version marks the\n // creative published in its definition, so nobody edits it by hand.\n if (args.slug && args.runId) {\n const cwd = process.cwd();\n const root = deps.workspaceRoot ?? findWorkspaceRoot(cwd) ?? cwd;\n const status = await advanceDefinitionStatus(definitionPathFor(root, args.slug), \"published\");\n if (status === \"updated\") return { ...result, definitionStatus: \"published\" };\n }\n return result;\n}\n\n/**\n * `baker creatives publish <video>`: upload the render to the company's video\n * library, wait until Baker can play it, then save it on the creative. The\n * image path above is untouched by this.\n */\nexport async function publishVideoCreative(\n args: { file: string; title: string; context?: string; sourceReferenceUrl?: string; slug?: string; runId?: string },\n deps: VideoApiDeps = defaultVideoApiDeps,\n): Promise<CreativesPublishVideoResponse> {\n const title = args.title.trim();\n if (!title) {\n throw new ApiError(\"VALIDATION_ERROR\", \"--title is required\");\n }\n const slug = args.slug?.trim();\n if (!slug) {\n throw new ApiError(\n \"VALIDATION_ERROR\",\n \"--slug is required for a video: name the creative (src/creatives/<slug>/) this render belongs to\",\n );\n }\n const sourceReferenceUrl = parseOptionalUrl(args.sourceReferenceUrl);\n const contentType = detectVideoContentType(args.file, {\n allowedContentTypes: creativeVideoContentTypes,\n unsupportedMessage: UNSUPPORTED_CREATIVE_FILE,\n });\n const { videoId } = await uploadLocalVideo(\n { file: args.file, contentType, descriptionContext: args.context ?? `Video ad creative: ${title}` },\n deps,\n );\n await waitForPlayableVideo(deps, videoId, { timeoutMs: videoProcessingTimeoutMs });\n const body: CreativesPublishVideoRequest = { videoId, title, slug };\n if (args.runId) body.runId = args.runId;\n if (sourceReferenceUrl) body.sourceReferenceUrl = sourceReferenceUrl;\n const chatId = chatIdFromEnv();\n if (chatId) body.chatId = chatId;\n return deps.post<CreativesPublishVideoResponse>(\"/api/creatives/publish-video\", body);\n}\n\nexport const publishCommand = defineCommand({\n meta: { name: \"publish\", description: DESCRIPTION },\n // Checked in `run` rather than by citty, so a missing value answers with the JSON envelope.\n args: { ...ARGS, file: { ...ARGS.file, type: \"positional\" }, title: { ...ARGS.title, required: false } },\n run: async ({ args }) => {\n try {\n const file = args.file as string | undefined;\n const title = args.title as string | undefined;\n const runId = args.runId as string | undefined;\n if (!file && !runId) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: \"Image or video path is required (or --run-id to save the run's own image)\",\n },\n });\n process.exit(1);\n }\n if (!title) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"--title is required\" } });\n process.exit(1);\n }\n const publishArgs = {\n file: file || undefined,\n title,\n context: args.context as string | undefined,\n sourceReferenceUrl: args.sourceReferenceUrl as string | undefined,\n slug: args.slug as string | undefined,\n runId,\n };\n if (file && isVideoFile(file)) {\n writeJson(await publishVideoCreative({ ...publishArgs, file }));\n return;\n }\n const data = await publishCreative({\n ...publishArgs,\n output: args.output as string | undefined,\n });\n writeJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import {
|
|
2
|
+
questionnaireRequestSchema,
|
|
3
|
+
questionnaireResponseSchema
|
|
4
|
+
} from "./chunk-4PDHHHUJ.js";
|
|
5
|
+
import "./chunk-NYIGXDUG.js";
|
|
6
|
+
import {
|
|
7
|
+
writeJsonEnvelope
|
|
8
|
+
} from "./chunk-VFIOJD5M.js";
|
|
9
|
+
import "./chunk-HR6IWNKE.js";
|
|
10
|
+
import {
|
|
11
|
+
apiPost
|
|
12
|
+
} from "./chunk-XBOK23HI.js";
|
|
13
|
+
import "./chunk-IFWP3ZDO.js";
|
|
14
|
+
import "./chunk-NAWWC5I3.js";
|
|
15
|
+
import {
|
|
16
|
+
registerSchema
|
|
17
|
+
} from "./chunk-NU7JSWVA.js";
|
|
18
|
+
import "./chunk-YQSBHWOI.js";
|
|
19
|
+
|
|
20
|
+
// src/commands/analytics/questionnaire.ts
|
|
21
|
+
import { defineCommand } from "citty";
|
|
22
|
+
var description = "Question-level drop-off from the external questionnaire contract: start, viewed, completed, skipped and finished per attempt, version and sequence. Reports actual reached questions and the last unanswered one after inactivity; deduplicates repeated visits. Refuses a truncated feed (maximum 600 events), so narrow --days if needed. No events is not proof of zero abandonment. The contract is in analytics.md.";
|
|
23
|
+
var args = { name: { type: "string", description: "Event name (default questionnaire_step)", required: false }, days: { type: "string", description: "Observation window in days (default 7, maximum 90)", required: false }, inactivity: { type: "string", description: "Minutes without an event before abandonment (default 30)", required: false } };
|
|
24
|
+
registerSchema({ command: "analytics.questionnaire", description, args });
|
|
25
|
+
var questionnaireCommand = defineCommand({ meta: { name: "questionnaire", description }, args, run: async ({ args: args2 }) => {
|
|
26
|
+
try {
|
|
27
|
+
const body = questionnaireRequestSchema.parse({ ...args2.name ? { eventName: args2.name } : {}, ...args2.days ? { days: Number(args2.days) } : {}, ...args2.inactivity ? { inactivityMinutes: Number(args2.inactivity) } : {} });
|
|
28
|
+
writeJsonEnvelope(questionnaireResponseSchema.parse(await apiPost("/api/analytics/questionnaire", body)));
|
|
29
|
+
} catch (error) {
|
|
30
|
+
writeJsonEnvelope({ ok: false, error: { code: "QUESTIONNAIRE_REPORT_FAILED", message: error instanceof Error ? error.message : "Could not read question tracking", fix: "Check baker analytics plan --full for missing app events. Resolve the named contract issue or narrow the observation window; never infer abandonment from completion totals." } });
|
|
31
|
+
process.exitCode = 1;
|
|
32
|
+
}
|
|
33
|
+
} });
|
|
34
|
+
export {
|
|
35
|
+
questionnaireCommand
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=questionnaire-JNGYJTAY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/analytics/questionnaire.ts"],"sourcesContent":["import { questionnaireRequestSchema, questionnaireResponseSchema } from \"@baker/api/analytics\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { writeJsonEnvelope } from \"../ads/output.ts\";\n\nconst description = \"Question-level drop-off from the external questionnaire contract: start, viewed, completed, skipped and finished per attempt, version and sequence. Reports actual reached questions and the last unanswered one after inactivity; deduplicates repeated visits. Refuses a truncated feed (maximum 600 events), so narrow --days if needed. No events is not proof of zero abandonment. The contract is in analytics.md.\";\nconst args = { name: { type: \"string\" as const, description: \"Event name (default questionnaire_step)\", required: false }, days: { type: \"string\" as const, description: \"Observation window in days (default 7, maximum 90)\", required: false }, inactivity: { type: \"string\" as const, description: \"Minutes without an event before abandonment (default 30)\", required: false } };\nregisterSchema({ command: \"analytics.questionnaire\", description, args });\nexport const questionnaireCommand = defineCommand({ meta: { name: \"questionnaire\", description }, args, run: async ({ args }) => {\n try {\n const body = questionnaireRequestSchema.parse({ ...(args.name ? { eventName: args.name } : {}), ...(args.days ? { days: Number(args.days) } : {}), ...(args.inactivity ? { inactivityMinutes: Number(args.inactivity) } : {}) });\n writeJsonEnvelope(questionnaireResponseSchema.parse(await apiPost(\"/api/analytics/questionnaire\", body)));\n } catch (error) {\n writeJsonEnvelope({ ok: false, error: { code: \"QUESTIONNAIRE_REPORT_FAILED\", message: error instanceof Error ? error.message : \"Could not read question tracking\", fix: \"Check baker analytics plan --full for missing app events. Resolve the named contract issue or narrow the observation window; never infer abandonment from completion totals.\" } });\n process.exitCode = 1;\n }\n} });\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAK9B,IAAM,cAAc;AACpB,IAAM,OAAO,EAAE,MAAM,EAAE,MAAM,UAAmB,aAAa,2CAA2C,UAAU,MAAM,GAAG,MAAM,EAAE,MAAM,UAAmB,aAAa,sDAAsD,UAAU,MAAM,GAAG,YAAY,EAAE,MAAM,UAAmB,aAAa,4DAA4D,UAAU,MAAM,EAAE;AACpX,eAAe,EAAE,SAAS,2BAA2B,aAAa,KAAK,CAAC;AACjE,IAAM,uBAAuB,cAAc,EAAE,MAAM,EAAE,MAAM,iBAAiB,YAAY,GAAG,MAAM,KAAK,OAAO,EAAE,MAAAA,MAAK,MAAM;AAC/H,MAAI;AACF,UAAM,OAAO,2BAA2B,MAAM,EAAE,GAAIA,MAAK,OAAO,EAAE,WAAWA,MAAK,KAAK,IAAI,CAAC,GAAI,GAAIA,MAAK,OAAO,EAAE,MAAM,OAAOA,MAAK,IAAI,EAAE,IAAI,CAAC,GAAI,GAAIA,MAAK,aAAa,EAAE,mBAAmB,OAAOA,MAAK,UAAU,EAAE,IAAI,CAAC,EAAG,CAAC;AAC/N,sBAAkB,4BAA4B,MAAM,MAAM,QAAQ,gCAAgC,IAAI,CAAC,CAAC;AAAA,EAC1G,SAAS,OAAO;AACd,sBAAkB,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,+BAA+B,SAAS,iBAAiB,QAAQ,MAAM,UAAU,oCAAoC,KAAK,+KAA+K,EAAE,CAAC;AAC1V,YAAQ,WAAW;AAAA,EACrB;AACF,EAAE,CAAC;","names":["args"]}
|
|
@@ -3,14 +3,15 @@ import {
|
|
|
3
3
|
redditCommand,
|
|
4
4
|
searchReddit,
|
|
5
5
|
subredditsFromArgs
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-FYGR3I2A.js";
|
|
7
|
+
import "./chunk-H3427GPU.js";
|
|
8
8
|
import "./chunk-WNFIJAUO.js";
|
|
9
9
|
import "./chunk-ERSX3MKH.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-7EPXVICM.js";
|
|
11
11
|
import "./chunk-GXDLWBOY.js";
|
|
12
12
|
import "./chunk-TEINLN64.js";
|
|
13
13
|
import "./chunk-ZJWUBJYQ.js";
|
|
14
|
+
import "./chunk-HR6IWNKE.js";
|
|
14
15
|
import "./chunk-NE4F3FHN.js";
|
|
15
16
|
import "./chunk-XBOK23HI.js";
|
|
16
17
|
import "./chunk-IFWP3ZDO.js";
|
|
@@ -23,4 +24,4 @@ export {
|
|
|
23
24
|
searchReddit,
|
|
24
25
|
subredditsFromArgs
|
|
25
26
|
};
|
|
26
|
-
//# sourceMappingURL=reddit-
|
|
27
|
+
//# sourceMappingURL=reddit-NU2N3LZD.js.map
|
|
@@ -3,10 +3,11 @@ import {
|
|
|
3
3
|
} from "./chunk-LERTEZST.js";
|
|
4
4
|
import {
|
|
5
5
|
adLibraryRefreshRequestSchema
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-7EPXVICM.js";
|
|
7
7
|
import "./chunk-GXDLWBOY.js";
|
|
8
8
|
import "./chunk-TEINLN64.js";
|
|
9
9
|
import "./chunk-ZJWUBJYQ.js";
|
|
10
|
+
import "./chunk-HR6IWNKE.js";
|
|
10
11
|
import "./chunk-NE4F3FHN.js";
|
|
11
12
|
import {
|
|
12
13
|
apiPost
|
|
@@ -91,4 +92,4 @@ export {
|
|
|
91
92
|
refreshCommand,
|
|
92
93
|
refreshEnvelope
|
|
93
94
|
};
|
|
94
|
-
//# sourceMappingURL=refresh-
|
|
95
|
+
//# sourceMappingURL=refresh-EBVJ2C6L.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/winning-ads/refresh.ts"],"sourcesContent":["import { type AdLibraryRefreshResponse, adLibraryRefreshRequestSchema } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { reportError } from \"./shared.ts\";\n\ntype RefreshEnvelope =\n | { ok: true; data: AdLibraryRefreshResponse; hints?: string[] }\n | { ok: false; error: { code: \"RATE_LIMITED\"; message: string; fix: string } };\n\n/**\n * What the agent reads back. A refresh inside the cooldown is a refusal with a\n * `fix` naming when the brand can be refreshed again — never something to retry\n * in a loop, and never a reason to stop: the ads already collected are usable.\n */\nexport function refreshEnvelope(data: AdLibraryRefreshResponse): RefreshEnvelope {\n if (data.queued) {\n return {\n ok: true,\n data,\n hints: [\n \"Re-scrape started — new ads arrive over the next minutes. Check progress with `baker winning-ads following`; carry on with the ads already there meanwhile.\",\n ],\n };\n }\n if (data.collecting) {\n return {\n ok: true,\n data,\n hints: [\n `${data.label}'s ads are still being collected from the follow or the last refresh, so there is nothing to refresh yet. Check progress with \\`baker winning-ads following\\` and use what is there meanwhile.`,\n ],\n };\n }\n if (data.nextAllowedAt !== undefined) {\n const next = new Date(data.nextAllowedAt).toISOString();\n return {\n ok: false,\n error: {\n code: \"RATE_LIMITED\",\n message: `${data.label} was refreshed less than 6 hours ago.`,\n fix: `Use the ads already collected for ${data.label}; it can be refreshed again after ${next}. Do not retry before then.`,\n },\n };\n }\n return {\n ok: true,\n data,\n hints: [\"Nothing new to look for on this brand right now; its ads are already up to date.\"],\n };\n}\n\nregisterSchema({\n command: \"winning-ads.refresh\",\n description:\n \"Re-scrape a brand this company follows so its newest ads land in the library. At most once every 6 hours per brand, and not while its ads are still being collected; it costs a fresh scrape, so use it only when the user wants the latest ads.\",\n args: {\n advertiser: { type: \"string\", description: \"Advertiser id of a followed brand (from `following`)\", required: true },\n },\n});\n\nexport const refreshCommand = defineCommand({\n meta: {\n name: \"refresh\",\n description:\n \"Re-scrape a followed brand for its newest ads (at most once every 6 hours). Example: baker winning-ads refresh adv_123\",\n },\n args: {\n advertiser: { type: \"positional\", description: \"Advertiser id of a followed brand\", required: true },\n },\n run: async ({ args }) => {\n const parsed = adLibraryRefreshRequestSchema.safeParse({ advertiser_id: String(args.advertiser ?? \"\") });\n if (!parsed.success) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: parsed.error.issues[0]?.message ?? \"\" } });\n process.exit(1);\n }\n try {\n const envelope = refreshEnvelope(await apiPost<AdLibraryRefreshResponse>(\"/api/ad-library/refresh\", parsed.data));\n writeJson(envelope);\n if (!envelope.ok) process.exit(1);\n } catch (err) {\n reportError(err);\n }\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/winning-ads/refresh.ts"],"sourcesContent":["import { type AdLibraryRefreshResponse, adLibraryRefreshRequestSchema } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { reportError } from \"./shared.ts\";\n\ntype RefreshEnvelope =\n | { ok: true; data: AdLibraryRefreshResponse; hints?: string[] }\n | { ok: false; error: { code: \"RATE_LIMITED\"; message: string; fix: string } };\n\n/**\n * What the agent reads back. A refresh inside the cooldown is a refusal with a\n * `fix` naming when the brand can be refreshed again — never something to retry\n * in a loop, and never a reason to stop: the ads already collected are usable.\n */\nexport function refreshEnvelope(data: AdLibraryRefreshResponse): RefreshEnvelope {\n if (data.queued) {\n return {\n ok: true,\n data,\n hints: [\n \"Re-scrape started — new ads arrive over the next minutes. Check progress with `baker winning-ads following`; carry on with the ads already there meanwhile.\",\n ],\n };\n }\n if (data.collecting) {\n return {\n ok: true,\n data,\n hints: [\n `${data.label}'s ads are still being collected from the follow or the last refresh, so there is nothing to refresh yet. Check progress with \\`baker winning-ads following\\` and use what is there meanwhile.`,\n ],\n };\n }\n if (data.nextAllowedAt !== undefined) {\n const next = new Date(data.nextAllowedAt).toISOString();\n return {\n ok: false,\n error: {\n code: \"RATE_LIMITED\",\n message: `${data.label} was refreshed less than 6 hours ago.`,\n fix: `Use the ads already collected for ${data.label}; it can be refreshed again after ${next}. Do not retry before then.`,\n },\n };\n }\n return {\n ok: true,\n data,\n hints: [\"Nothing new to look for on this brand right now; its ads are already up to date.\"],\n };\n}\n\nregisterSchema({\n command: \"winning-ads.refresh\",\n description:\n \"Re-scrape a brand this company follows so its newest ads land in the library. At most once every 6 hours per brand, and not while its ads are still being collected; it costs a fresh scrape, so use it only when the user wants the latest ads.\",\n args: {\n advertiser: { type: \"string\", description: \"Advertiser id of a followed brand (from `following`)\", required: true },\n },\n});\n\nexport const refreshCommand = defineCommand({\n meta: {\n name: \"refresh\",\n description:\n \"Re-scrape a followed brand for its newest ads (at most once every 6 hours). Example: baker winning-ads refresh adv_123\",\n },\n args: {\n advertiser: { type: \"positional\", description: \"Advertiser id of a followed brand\", required: true },\n },\n run: async ({ args }) => {\n const parsed = adLibraryRefreshRequestSchema.safeParse({ advertiser_id: String(args.advertiser ?? \"\") });\n if (!parsed.success) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: parsed.error.issues[0]?.message ?? \"\" } });\n process.exit(1);\n }\n try {\n const envelope = refreshEnvelope(await apiPost<AdLibraryRefreshResponse>(\"/api/ad-library/refresh\", parsed.data));\n writeJson(envelope);\n if (!envelope.ok) process.exit(1);\n } catch (err) {\n reportError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAevB,SAAS,gBAAgB,MAAiD;AAC/E,MAAI,KAAK,QAAQ;AACf,WAAO;AAAA,MACL,IAAI;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,YAAY;AACnB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,QACL,GAAG,KAAK,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,kBAAkB,QAAW;AACpC,UAAM,OAAO,IAAI,KAAK,KAAK,aAAa,EAAE,YAAY;AACtD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,GAAG,KAAK,KAAK;AAAA,QACtB,KAAK,qCAAqC,KAAK,KAAK,qCAAqC,IAAI;AAAA,MAC/F;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,OAAO,CAAC,kFAAkF;AAAA,EAC5F;AACF;AAEA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,UAAU,aAAa,wDAAwD,UAAU,KAAK;AAAA,EACpH;AACF,CAAC;AAEM,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,cAAc,aAAa,qCAAqC,UAAU,KAAK;AAAA,EACrG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,SAAS,8BAA8B,UAAU,EAAE,eAAe,OAAO,KAAK,cAAc,EAAE,EAAE,CAAC;AACvG,QAAI,CAAC,OAAO,SAAS;AACnB,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,OAAO,MAAM,OAAO,CAAC,GAAG,WAAW,GAAG,EAAE,CAAC;AAC5G,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI;AACF,YAAM,WAAW,gBAAgB,MAAM,QAAkC,2BAA2B,OAAO,IAAI,CAAC;AAChH,gBAAU,QAAQ;AAClB,UAAI,CAAC,SAAS,GAAI,SAAQ,KAAK,CAAC;AAAA,IAClC,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -2,11 +2,12 @@ import {
|
|
|
2
2
|
failApi,
|
|
3
3
|
failValidation,
|
|
4
4
|
writeOk
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-SJYEY5MV.js";
|
|
6
|
+
import "./chunk-7EPXVICM.js";
|
|
7
7
|
import "./chunk-GXDLWBOY.js";
|
|
8
8
|
import "./chunk-TEINLN64.js";
|
|
9
9
|
import "./chunk-ZJWUBJYQ.js";
|
|
10
|
+
import "./chunk-HR6IWNKE.js";
|
|
10
11
|
import "./chunk-NE4F3FHN.js";
|
|
11
12
|
import {
|
|
12
13
|
apiPost,
|
|
@@ -57,4 +58,4 @@ var releaseCommand = defineCommand({
|
|
|
57
58
|
export {
|
|
58
59
|
releaseCommand
|
|
59
60
|
};
|
|
60
|
-
//# sourceMappingURL=release-
|
|
61
|
+
//# sourceMappingURL=release-V43YB2PY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/actions/release.ts"],"sourcesContent":["import type { ActionsReleaseResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.release\",\n description: \"Release an action you previously claimed (no-op if you don't own the claim).\",\n args: {\n id: { type: \"string\", description: \"Action ID\", required: true },\n },\n});\n\nexport const releaseCommand = defineCommand({\n meta: {\n name: \"release\",\n description: \"Release a claim you made on an action. Example: baker actions release <action-id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Action ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Action ID is required.\");\n }\n validateConvexId(id);\n const chatId = requireChatId();\n await apiPost<ActionsReleaseResponse>(\"/api/actions/release\", { actionId: id, chatId });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/actions/release.ts"],"sourcesContent":["import type { ActionsReleaseResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.release\",\n description: \"Release an action you previously claimed (no-op if you don't own the claim).\",\n args: {\n id: { type: \"string\", description: \"Action ID\", required: true },\n },\n});\n\nexport const releaseCommand = defineCommand({\n meta: {\n name: \"release\",\n description: \"Release a claim you made on an action. Example: baker actions release <action-id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Action ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Action ID is required.\");\n }\n validateConvexId(id);\n const chatId = requireChatId();\n await apiPost<ActionsReleaseResponse>(\"/api/actions/release\", { actionId: id, chatId });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,KAAK;AAAA,EACjE;AACF,CAAC;AAEM,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,aAAa,UAAU,MAAM;AAAA,IACpE,aAAa,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,MAAM;AAAA,EAC3E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,WAAW;AAC/D,UAAI,CAAC,IAAI;AACP,uBAAe,wBAAwB;AAAA,MACzC;AACA,uBAAiB,EAAE;AACnB,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAgC,wBAAwB,EAAE,UAAU,IAAI,OAAO,CAAC;AACtF,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -4,10 +4,11 @@ import {
|
|
|
4
4
|
} from "./chunk-6G5K6ZC6.js";
|
|
5
5
|
import {
|
|
6
6
|
testimonialSourcesRemoveRequestSchema
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-7EPXVICM.js";
|
|
8
8
|
import "./chunk-GXDLWBOY.js";
|
|
9
9
|
import "./chunk-TEINLN64.js";
|
|
10
10
|
import "./chunk-ZJWUBJYQ.js";
|
|
11
|
+
import "./chunk-HR6IWNKE.js";
|
|
11
12
|
import "./chunk-NE4F3FHN.js";
|
|
12
13
|
import {
|
|
13
14
|
apiPost
|
|
@@ -47,4 +48,4 @@ var removeCommand = defineCommand({
|
|
|
47
48
|
export {
|
|
48
49
|
removeCommand
|
|
49
50
|
};
|
|
50
|
-
//# sourceMappingURL=remove-
|
|
51
|
+
//# sourceMappingURL=remove-QPSWLFI4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/testimonials/sources/remove.ts"],"sourcesContent":["import { type TestimonialSourcesRemoveResponse, testimonialSourcesRemoveRequestSchema } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeJson } from \"../../../output.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { reportError, reportInvalid } from \"./shared.ts\";\n\nregisterSchema({\n command: \"testimonials.sources.remove\",\n description:\n \"Remove a review source AND every testimonial it imported (and their pictures). Applies immediately and cannot be undone — only when the user asked for it.\",\n args: { id: { type: \"string\", description: \"Source id from `testimonials sources list`\", required: true } },\n});\n\nexport const removeCommand = defineCommand({\n meta: {\n name: \"remove\",\n description:\n \"Remove a review source and all its testimonials (cannot be undone).\\n\\nExample: baker testimonials sources remove <source-id>\",\n },\n args: { id: { type: \"positional\", description: \"Source id from `testimonials sources list`\", required: true } },\n run: async ({ args }) => {\n const parsed = testimonialSourcesRemoveRequestSchema.safeParse({ id: String(args.id ?? \"\") });\n if (!parsed.success) reportInvalid(parsed.error.issues[0]);\n try {\n const data = await apiPost<TestimonialSourcesRemoveResponse>(\"/api/testimonials/sources/remove\", parsed.data);\n writeJson({ ok: true, data });\n } catch (err) {\n reportError(err);\n }\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/testimonials/sources/remove.ts"],"sourcesContent":["import { type TestimonialSourcesRemoveResponse, testimonialSourcesRemoveRequestSchema } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeJson } from \"../../../output.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { reportError, reportInvalid } from \"./shared.ts\";\n\nregisterSchema({\n command: \"testimonials.sources.remove\",\n description:\n \"Remove a review source AND every testimonial it imported (and their pictures). Applies immediately and cannot be undone — only when the user asked for it.\",\n args: { id: { type: \"string\", description: \"Source id from `testimonials sources list`\", required: true } },\n});\n\nexport const removeCommand = defineCommand({\n meta: {\n name: \"remove\",\n description:\n \"Remove a review source and all its testimonials (cannot be undone).\\n\\nExample: baker testimonials sources remove <source-id>\",\n },\n args: { id: { type: \"positional\", description: \"Source id from `testimonials sources list`\", required: true } },\n run: async ({ args }) => {\n const parsed = testimonialSourcesRemoveRequestSchema.safeParse({ id: String(args.id ?? \"\") });\n if (!parsed.success) reportInvalid(parsed.error.issues[0]);\n try {\n const data = await apiPost<TestimonialSourcesRemoveResponse>(\"/api/testimonials/sources/remove\", parsed.data);\n writeJson({ ok: true, data });\n } catch (err) {\n reportError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,aAAa,8CAA8C,UAAU,KAAK,EAAE;AAC5G,CAAC;AAEM,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,aAAa,8CAA8C,UAAU,KAAK,EAAE;AAAA,EAC9G,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,SAAS,sCAAsC,UAAU,EAAE,IAAI,OAAO,KAAK,MAAM,EAAE,EAAE,CAAC;AAC5F,QAAI,CAAC,OAAO,QAAS,eAAc,OAAO,MAAM,OAAO,CAAC,CAAC;AACzD,QAAI;AACF,YAAM,OAAO,MAAM,QAA0C,oCAAoC,OAAO,IAAI;AAC5G,gBAAU,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IAC9B,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
failApi,
|
|
3
3
|
failValidation
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-SJYEY5MV.js";
|
|
5
|
+
import "./chunk-7EPXVICM.js";
|
|
6
6
|
import "./chunk-GXDLWBOY.js";
|
|
7
7
|
import "./chunk-TEINLN64.js";
|
|
8
8
|
import "./chunk-ZJWUBJYQ.js";
|
|
9
|
+
import "./chunk-HR6IWNKE.js";
|
|
9
10
|
import "./chunk-NE4F3FHN.js";
|
|
10
11
|
import {
|
|
11
12
|
apiPost,
|
|
@@ -60,4 +61,4 @@ var reopenCommand = defineCommand({
|
|
|
60
61
|
export {
|
|
61
62
|
reopenCommand
|
|
62
63
|
};
|
|
63
|
-
//# sourceMappingURL=reopen-
|
|
64
|
+
//# sourceMappingURL=reopen-GQ66NMWF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/actions/reopen.ts"],"sourcesContent":["import type { ActionsReopenResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.reopen\",\n description:\n \"Stage reopening a completed Task: when the chat is published it goes back to the backlog as pending and its completion note is cleared. Only completed Tasks can be reopened (a discarded one cannot). Drop it with `baker actions draft remove <id> --op reopen`.\",\n args: {\n id: { type: \"string\", description: \"ID of a completed Task\", required: true },\n },\n});\n\nexport const reopenCommand = defineCommand({\n meta: {\n name: \"reopen\",\n description: \"Stage reopening a completed Task (applies on publish). Example: baker actions reopen <id>\",\n },\n args: {\n id: { type: \"positional\", description: \"ID of a completed Task\", required: false },\n \"action-id\": { type: \"string\", description: \"ID of a completed Task\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Action ID is required.\");\n }\n validateConvexId(id);\n await apiPost<ActionsReopenResponse>(\"/api/actions/reopen\", { chatId: requireChatId(), actionId: id });\n writeJson({\n ok: true,\n data: null,\n hints: [\"Staged: the Task goes back to the backlog when the chat is published.\"],\n });\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/actions/reopen.ts"],"sourcesContent":["import type { ActionsReopenResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.reopen\",\n description:\n \"Stage reopening a completed Task: when the chat is published it goes back to the backlog as pending and its completion note is cleared. Only completed Tasks can be reopened (a discarded one cannot). Drop it with `baker actions draft remove <id> --op reopen`.\",\n args: {\n id: { type: \"string\", description: \"ID of a completed Task\", required: true },\n },\n});\n\nexport const reopenCommand = defineCommand({\n meta: {\n name: \"reopen\",\n description: \"Stage reopening a completed Task (applies on publish). Example: baker actions reopen <id>\",\n },\n args: {\n id: { type: \"positional\", description: \"ID of a completed Task\", required: false },\n \"action-id\": { type: \"string\", description: \"ID of a completed Task\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Action ID is required.\");\n }\n validateConvexId(id);\n await apiPost<ActionsReopenResponse>(\"/api/actions/reopen\", { chatId: requireChatId(), actionId: id });\n writeJson({\n ok: true,\n data: null,\n hints: [\"Staged: the Task goes back to the backlog when the chat is published.\"],\n });\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAO9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,KAAK;AAAA,EAC9E;AACF,CAAC;AAEM,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,0BAA0B,UAAU,MAAM;AAAA,IACjF,aAAa,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,MAAM;AAAA,EACxF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,WAAW;AAC/D,UAAI,CAAC,IAAI;AACP,uBAAe,wBAAwB;AAAA,MACzC;AACA,uBAAiB,EAAE;AACnB,YAAM,QAA+B,uBAAuB,EAAE,QAAQ,cAAc,GAAG,UAAU,GAAG,CAAC;AACrG,gBAAU;AAAA,QACR,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO,CAAC,uEAAuE;AAAA,MACjF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
|