@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,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ACTION_TEMP_ID_PREFIX
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-7EPXVICM.js";
|
|
4
4
|
import {
|
|
5
5
|
ApiError
|
|
6
6
|
} from "./chunk-XBOK23HI.js";
|
|
@@ -146,6 +146,14 @@ function buildListHints({ returned, limit }) {
|
|
|
146
146
|
`This list is capped at ${limit} Tasks and came back full, so older Tasks exist that are NOT shown. Do not treat it as the whole backlog \u2014 re-run with --limit ${limit * 2} (or narrow with --status / --search).`
|
|
147
147
|
];
|
|
148
148
|
}
|
|
149
|
+
function buildGetHints(detail) {
|
|
150
|
+
if (!detail || detail.action.status !== "pending" || detail.activeChat !== null) {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
return [
|
|
154
|
+
`If you are working on this Task in this chat, claim it first so the Tasks page shows it in progress: baker actions claim ${detail.action._id}`
|
|
155
|
+
];
|
|
156
|
+
}
|
|
149
157
|
|
|
150
158
|
export {
|
|
151
159
|
writeOk,
|
|
@@ -158,6 +166,7 @@ export {
|
|
|
158
166
|
parsePriority,
|
|
159
167
|
buildCreateHints,
|
|
160
168
|
ACTIONS_LIST_DEFAULT_LIMIT,
|
|
161
|
-
buildListHints
|
|
169
|
+
buildListHints,
|
|
170
|
+
buildGetHints
|
|
162
171
|
};
|
|
163
|
-
//# sourceMappingURL=chunk-
|
|
172
|
+
//# sourceMappingURL=chunk-SJYEY5MV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/actions/tagError.ts","../src/commands/actions/shared.ts"],"sourcesContent":["/**\n * Structured remediation for the one `actions` failure an agent cannot fix from\n * the message alone: an unknown `--tags` slug.\n *\n * The backend already inlines the valid taxonomy in the rejection text\n * (`unknownActionTagMessage`, packages/backend/convex/actionItems/tags/utils.ts),\n * but only `{ code, message }` crosses the HTTP boundary into `ApiError`. Parsing\n * the two lists back out here is what lets `error.fix` carry them as data, so the\n * agent retries in the same call instead of running `tags list` and trying again\n * — the \"list-then-retry dance\" this file exists to end.\n *\n * Fails closed: anything that doesn't match exactly returns `null` and the caller\n * emits the plain message it would have emitted anyway.\n */\n\nconst UNKNOWN_TAG_RE = /Unknown action tag\\(s\\): ([^.]+)\\. Valid tags: ([^.]+)\\./;\n\n// A type alias, not an interface: the envelope's `fix` slot is\n// `{ action, explanation } & Record<string, unknown>`, and only an alias is\n// structurally assignable to that index signature.\nexport type ActionTagFix = {\n action: \"retry_with_a_valid_tag\";\n explanation: string;\n unknownTags: string[];\n validTags: string[];\n mintCommand: string;\n listCommand: string;\n};\n\nfunction splitSlugs(list: string): string[] {\n return list\n .split(\",\")\n .map((slug) => slug.trim())\n .filter((slug) => slug.length > 0);\n}\n\nexport function actionTagFix(message: string): ActionTagFix | null {\n const match = UNKNOWN_TAG_RE.exec(message);\n if (!match) {\n return null;\n }\n const [, unknownList, validList] = match;\n const unknownTags = splitSlugs(unknownList ?? \"\");\n const validTags = splitSlugs(validList ?? \"\");\n const first = unknownTags[0];\n if (first === undefined || validTags.length === 0) {\n return null;\n }\n return {\n action: \"retry_with_a_valid_tag\",\n explanation:\n `The tag(s) ${unknownTags.join(\", \")} are not in this company's taxonomy. ` +\n `\\`validTags\\` below is the complete accepted set — pick from it and re-run the same command. ` +\n `Only mint a new tag when none of them names this work; a near-duplicate of an existing tag ` +\n `splits the backlog's filter instead of extending it.`,\n unknownTags,\n validTags,\n mintCommand: `baker actions tags create --slug ${first} --description \"<what ${first} groups>\"`,\n listCommand: \"baker actions tags list\",\n };\n}\n","import { ACTION_TEMP_ID_PREFIX } from \"@baker/api\";\nimport { ApiError } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport type { AdvisoryHint } from \"./advisory.ts\";\nimport { actionTagFix } from \"./tagError.ts\";\n\nexport function writeOk<T = null>(data?: T): void {\n writeJson({ ok: true, data: (data ?? null) as T });\n}\n\nexport function failValidation(message: string): never {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message } });\n process.exit(1);\n}\n\n// Every actions command routes its API failures through here, so attaching the\n// tag `fix` at this one point covers `create`, `update`, and any later write\n// path that hits the same strict tag gate. Non-tag errors are untouched.\nexport function failApi(err: unknown): never {\n if (err instanceof ApiError) {\n const fix = actionTagFix(err.message);\n writeJson({ ok: false, error: { code: err.code, message: err.message, ...(fix ? { fix } : {}) } });\n process.exit(1);\n }\n if (err instanceof Error) {\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", 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\nexport function generateTempId(): string {\n return `${ACTION_TEMP_ID_PREFIX}${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function isTempId(id: string): boolean {\n return id.startsWith(ACTION_TEMP_ID_PREFIX);\n}\n\n// Parse a `--tags a,b,c` CSV flag into a deduped slug list. Returns undefined\n// when the flag was omitted so callers can distinguish \"not provided\" from\n// \"explicitly cleared\" (empty list).\nexport function parseTagList(value: unknown): string[] | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const tags = value\n .split(\",\")\n .map((t) => t.trim())\n .filter((t) => t.length > 0);\n return [...new Set(tags)];\n}\n\n// User priority for an action. Drives the dependency-aware \"Do first\" ordering\n// in `baker actions list`. Unset == \"normal\" (ranks as medium).\nexport const ACTION_PRIORITIES = [\"urgent\", \"high\", \"medium\", \"low\"] as const;\ntype ActionPriority = (typeof ACTION_PRIORITIES)[number];\n\n// Parse a `--priority` flag. Returns:\n// - undefined → flag omitted (leave unchanged on update; unset on create)\n// - null → explicit clear (only meaningful on update; \"\" or \"none\")\n// - one of ACTION_PRIORITIES on a valid value\n// Fails validation on any other string so the agent gets an immediate error.\nexport function parsePriority(\n value: unknown,\n { allowClear }: { allowClear: boolean },\n): ActionPriority | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n failValidation(\n `--priority must be one of: ${ACTION_PRIORITIES.join(\", \")}${allowClear ? \", or 'none' to clear\" : \"\"}.`,\n );\n }\n const trimmed = value.trim().toLowerCase();\n if (trimmed === \"\") {\n if (allowClear) {\n return null;\n }\n return undefined;\n }\n if (allowClear && (trimmed === \"none\" || trimmed === \"clear\")) {\n return null;\n }\n if ((ACTION_PRIORITIES as readonly string[]).includes(trimmed)) {\n return trimmed as ActionPriority;\n }\n failValidation(\n `Unknown --priority \"${value}\". Expected one of: ${ACTION_PRIORITIES.join(\", \")}${allowClear ? \", or 'none' to clear\" : \"\"}.`,\n );\n}\n\n// Two tiers, because the two counts want different amounts of words.\n//\n// The mean chat that files anything files ~2, and two Tasks is already above\n// the bar (\"a Task is the exception\"), so a 2→1 merge is the cheapest win\n// available — but firing the full paragraph on the modal chat is how you train\n// the model to skim `hints[]` and miss the do-it-now redirect above it. So 2\n// gets one sentence.\n//\n// Three is where \"capturing follow-ups\" stops looking like a backlog and\n// starts looking like a to-do list handed back to the user. That gets the\n// paragraph, from there on, every time — a legitimate 3-Task chat (an approved\n// plan) still benefits from being asked whether any two merge.\nexport const FAN_OUT_NUDGE_THRESHOLD = 2;\nexport const FAN_OUT_THRESHOLD = 3;\n\n// Every hint `create` returns, in reading order. The two that argue against\n// the action existing come first — by the time the agent reaches \"add tags\" it\n// has already accepted the action as a given.\nexport function buildCreateHints({\n advisory,\n description,\n tempId,\n tags,\n prioritySet,\n draftCreateCount,\n}: {\n /** What the Task reads as (`advisory.ts`), decided before: recurring work, or work a surface does now. */\n advisory: AdvisoryHint | null;\n description: string;\n tempId: string;\n tags: string[] | undefined;\n prioritySet: boolean;\n draftCreateCount: number;\n}): string[] {\n const hints: string[] = [];\n if (advisory) {\n hints.push(\n `${advisory.hint} If nothing actually blocks it: baker actions draft remove ${tempId}, then do the work.`,\n );\n }\n // The advisory reading is a judgment; this count is a fact. It keeps firing on\n // every further create — a chat that fanned out into a to-do list is the\n // failure the whole hint set exists to catch.\n if (draftCreateCount >= FAN_OUT_THRESHOLD) {\n hints.push(\n `${draftCreateCount} Tasks are staged in this chat. Re-read them with \\`baker actions draft\\`: can any be done now with a surface you already have, and do any two touch the same system (same container, same campaign, same page)? Those belong in ONE Task — fold them together with \\`baker actions update\\` and drop the extras with \\`baker actions draft remove <tempId>\\`.`,\n );\n } else if (draftCreateCount === FAN_OUT_NUDGE_THRESHOLD) {\n hints.push(\n `Second Task staged in this chat. If these two land on the same system (same container, same campaign, same page) they are ONE Task — fold them with \\`baker actions update\\` and drop the extra with \\`baker actions draft remove ${tempId}\\`.`,\n );\n }\n hints.push(`Link dependencies: baker actions link --blocker <id> --blocked ${tempId}`);\n if (!description) {\n hints.push(\"Add description: baker actions update <tempId> --description '...' (what/why/where/done-when)\");\n }\n if (!tags || tags.length === 0) {\n hints.push(\n \"MISSING --tags. This action is invisible to the backlog's tag filter. Re-run with --tags <slug,...> (`baker actions tags list` for the taxonomy, `baker actions tags create --slug <slug>` to mint) — or `baker actions update <tempId> --tags <slug,...>`.\",\n );\n }\n if (!prioritySet) {\n hints.push(\n `MISSING --priority. Without it this action ranks as 'normal' (medium) in the do-first ordering, so urgent/high client work won't surface first. Re-run with --priority ${ACTION_PRIORITIES.join(\"|\")} — or \\`baker actions update <tempId> --priority <level>\\`.`,\n );\n }\n return hints;\n}\n\n/**\n * How far back a flat `baker actions list` reads when the caller does not say.\n *\n * Sent explicitly rather than left to the server default so this side knows the\n * window it asked for, and can therefore tell when a read came back exactly full\n * — the only evidence available that older Tasks exist. Without that the agent\n * reads a truncated backlog as a complete one and reports finished work that was\n * never seen.\n */\nexport const ACTIONS_LIST_DEFAULT_LIMIT = 500;\n\nexport function buildListHints({ returned, limit }: { returned: number; limit: number }): string[] {\n if (returned < limit) {\n return [];\n }\n return [\n `This list is capped at ${limit} Tasks and came back full, so older Tasks exist that are NOT shown. Do not treat it as the whole backlog — re-run with --limit ${limit * 2} (or narrow with --status / --search).`,\n ];\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/actions/tagError.ts","../src/commands/actions/shared.ts"],"sourcesContent":["/**\n * Structured remediation for the one `actions` failure an agent cannot fix from\n * the message alone: an unknown `--tags` slug.\n *\n * The backend already inlines the valid taxonomy in the rejection text\n * (`unknownActionTagMessage`, packages/backend/convex/actionItems/tags/utils.ts),\n * but only `{ code, message }` crosses the HTTP boundary into `ApiError`. Parsing\n * the two lists back out here is what lets `error.fix` carry them as data, so the\n * agent retries in the same call instead of running `tags list` and trying again\n * — the \"list-then-retry dance\" this file exists to end.\n *\n * Fails closed: anything that doesn't match exactly returns `null` and the caller\n * emits the plain message it would have emitted anyway.\n */\n\nconst UNKNOWN_TAG_RE = /Unknown action tag\\(s\\): ([^.]+)\\. Valid tags: ([^.]+)\\./;\n\n// A type alias, not an interface: the envelope's `fix` slot is\n// `{ action, explanation } & Record<string, unknown>`, and only an alias is\n// structurally assignable to that index signature.\nexport type ActionTagFix = {\n action: \"retry_with_a_valid_tag\";\n explanation: string;\n unknownTags: string[];\n validTags: string[];\n mintCommand: string;\n listCommand: string;\n};\n\nfunction splitSlugs(list: string): string[] {\n return list\n .split(\",\")\n .map((slug) => slug.trim())\n .filter((slug) => slug.length > 0);\n}\n\nexport function actionTagFix(message: string): ActionTagFix | null {\n const match = UNKNOWN_TAG_RE.exec(message);\n if (!match) {\n return null;\n }\n const [, unknownList, validList] = match;\n const unknownTags = splitSlugs(unknownList ?? \"\");\n const validTags = splitSlugs(validList ?? \"\");\n const first = unknownTags[0];\n if (first === undefined || validTags.length === 0) {\n return null;\n }\n return {\n action: \"retry_with_a_valid_tag\",\n explanation:\n `The tag(s) ${unknownTags.join(\", \")} are not in this company's taxonomy. ` +\n `\\`validTags\\` below is the complete accepted set — pick from it and re-run the same command. ` +\n `Only mint a new tag when none of them names this work; a near-duplicate of an existing tag ` +\n `splits the backlog's filter instead of extending it.`,\n unknownTags,\n validTags,\n mintCommand: `baker actions tags create --slug ${first} --description \"<what ${first} groups>\"`,\n listCommand: \"baker actions tags list\",\n };\n}\n","import { ACTION_TEMP_ID_PREFIX } from \"@baker/api\";\nimport { ApiError } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport type { AdvisoryHint } from \"./advisory.ts\";\nimport { actionTagFix } from \"./tagError.ts\";\n\nexport function writeOk<T = null>(data?: T): void {\n writeJson({ ok: true, data: (data ?? null) as T });\n}\n\nexport function failValidation(message: string): never {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message } });\n process.exit(1);\n}\n\n// Every actions command routes its API failures through here, so attaching the\n// tag `fix` at this one point covers `create`, `update`, and any later write\n// path that hits the same strict tag gate. Non-tag errors are untouched.\nexport function failApi(err: unknown): never {\n if (err instanceof ApiError) {\n const fix = actionTagFix(err.message);\n writeJson({ ok: false, error: { code: err.code, message: err.message, ...(fix ? { fix } : {}) } });\n process.exit(1);\n }\n if (err instanceof Error) {\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", 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\nexport function generateTempId(): string {\n return `${ACTION_TEMP_ID_PREFIX}${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function isTempId(id: string): boolean {\n return id.startsWith(ACTION_TEMP_ID_PREFIX);\n}\n\n// Parse a `--tags a,b,c` CSV flag into a deduped slug list. Returns undefined\n// when the flag was omitted so callers can distinguish \"not provided\" from\n// \"explicitly cleared\" (empty list).\nexport function parseTagList(value: unknown): string[] | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const tags = value\n .split(\",\")\n .map((t) => t.trim())\n .filter((t) => t.length > 0);\n return [...new Set(tags)];\n}\n\n// User priority for an action. Drives the dependency-aware \"Do first\" ordering\n// in `baker actions list`. Unset == \"normal\" (ranks as medium).\nexport const ACTION_PRIORITIES = [\"urgent\", \"high\", \"medium\", \"low\"] as const;\ntype ActionPriority = (typeof ACTION_PRIORITIES)[number];\n\n// Parse a `--priority` flag. Returns:\n// - undefined → flag omitted (leave unchanged on update; unset on create)\n// - null → explicit clear (only meaningful on update; \"\" or \"none\")\n// - one of ACTION_PRIORITIES on a valid value\n// Fails validation on any other string so the agent gets an immediate error.\nexport function parsePriority(\n value: unknown,\n { allowClear }: { allowClear: boolean },\n): ActionPriority | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n failValidation(\n `--priority must be one of: ${ACTION_PRIORITIES.join(\", \")}${allowClear ? \", or 'none' to clear\" : \"\"}.`,\n );\n }\n const trimmed = value.trim().toLowerCase();\n if (trimmed === \"\") {\n if (allowClear) {\n return null;\n }\n return undefined;\n }\n if (allowClear && (trimmed === \"none\" || trimmed === \"clear\")) {\n return null;\n }\n if ((ACTION_PRIORITIES as readonly string[]).includes(trimmed)) {\n return trimmed as ActionPriority;\n }\n failValidation(\n `Unknown --priority \"${value}\". Expected one of: ${ACTION_PRIORITIES.join(\", \")}${allowClear ? \", or 'none' to clear\" : \"\"}.`,\n );\n}\n\n// Two tiers, because the two counts want different amounts of words.\n//\n// The mean chat that files anything files ~2, and two Tasks is already above\n// the bar (\"a Task is the exception\"), so a 2→1 merge is the cheapest win\n// available — but firing the full paragraph on the modal chat is how you train\n// the model to skim `hints[]` and miss the do-it-now redirect above it. So 2\n// gets one sentence.\n//\n// Three is where \"capturing follow-ups\" stops looking like a backlog and\n// starts looking like a to-do list handed back to the user. That gets the\n// paragraph, from there on, every time — a legitimate 3-Task chat (an approved\n// plan) still benefits from being asked whether any two merge.\nexport const FAN_OUT_NUDGE_THRESHOLD = 2;\nexport const FAN_OUT_THRESHOLD = 3;\n\n// Every hint `create` returns, in reading order. The two that argue against\n// the action existing come first — by the time the agent reaches \"add tags\" it\n// has already accepted the action as a given.\nexport function buildCreateHints({\n advisory,\n description,\n tempId,\n tags,\n prioritySet,\n draftCreateCount,\n}: {\n /** What the Task reads as (`advisory.ts`), decided before: recurring work, or work a surface does now. */\n advisory: AdvisoryHint | null;\n description: string;\n tempId: string;\n tags: string[] | undefined;\n prioritySet: boolean;\n draftCreateCount: number;\n}): string[] {\n const hints: string[] = [];\n if (advisory) {\n hints.push(\n `${advisory.hint} If nothing actually blocks it: baker actions draft remove ${tempId}, then do the work.`,\n );\n }\n // The advisory reading is a judgment; this count is a fact. It keeps firing on\n // every further create — a chat that fanned out into a to-do list is the\n // failure the whole hint set exists to catch.\n if (draftCreateCount >= FAN_OUT_THRESHOLD) {\n hints.push(\n `${draftCreateCount} Tasks are staged in this chat. Re-read them with \\`baker actions draft\\`: can any be done now with a surface you already have, and do any two touch the same system (same container, same campaign, same page)? Those belong in ONE Task — fold them together with \\`baker actions update\\` and drop the extras with \\`baker actions draft remove <tempId>\\`.`,\n );\n } else if (draftCreateCount === FAN_OUT_NUDGE_THRESHOLD) {\n hints.push(\n `Second Task staged in this chat. If these two land on the same system (same container, same campaign, same page) they are ONE Task — fold them with \\`baker actions update\\` and drop the extra with \\`baker actions draft remove ${tempId}\\`.`,\n );\n }\n hints.push(`Link dependencies: baker actions link --blocker <id> --blocked ${tempId}`);\n if (!description) {\n hints.push(\"Add description: baker actions update <tempId> --description '...' (what/why/where/done-when)\");\n }\n if (!tags || tags.length === 0) {\n hints.push(\n \"MISSING --tags. This action is invisible to the backlog's tag filter. Re-run with --tags <slug,...> (`baker actions tags list` for the taxonomy, `baker actions tags create --slug <slug>` to mint) — or `baker actions update <tempId> --tags <slug,...>`.\",\n );\n }\n if (!prioritySet) {\n hints.push(\n `MISSING --priority. Without it this action ranks as 'normal' (medium) in the do-first ordering, so urgent/high client work won't surface first. Re-run with --priority ${ACTION_PRIORITIES.join(\"|\")} — or \\`baker actions update <tempId> --priority <level>\\`.`,\n );\n }\n return hints;\n}\n\n/**\n * How far back a flat `baker actions list` reads when the caller does not say.\n *\n * Sent explicitly rather than left to the server default so this side knows the\n * window it asked for, and can therefore tell when a read came back exactly full\n * — the only evidence available that older Tasks exist. Without that the agent\n * reads a truncated backlog as a complete one and reports finished work that was\n * never seen.\n */\nexport const ACTIONS_LIST_DEFAULT_LIMIT = 500;\n\nexport function buildListHints({ returned, limit }: { returned: number; limit: number }): string[] {\n if (returned < limit) {\n return [];\n }\n return [\n `This list is capped at ${limit} Tasks and came back full, so older Tasks exist that are NOT shown. Do not treat it as the whole backlog — re-run with --limit ${limit * 2} (or narrow with --status / --search).`,\n ];\n}\n\n/**\n * A pending Task nobody is working on is one the agent was most likely asked to\n * solve: without a claim the dashboard shows no work in progress on it.\n */\nexport function buildGetHints(\n detail: { action: { _id: string; status: string }; activeChat: unknown } | null,\n): string[] {\n if (!detail || detail.action.status !== \"pending\" || detail.activeChat !== null) {\n return [];\n }\n return [\n `If you are working on this Task in this chat, claim it first so the Tasks page shows it in progress: baker actions claim ${detail.action._id}`,\n ];\n}\n"],"mappings":";;;;;;;;;;;AAeA,IAAM,iBAAiB;AAcvB,SAAS,WAAW,MAAwB;AAC1C,SAAO,KACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACrC;AAEO,SAAS,aAAa,SAAsC;AACjE,QAAM,QAAQ,eAAe,KAAK,OAAO;AACzC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,CAAC,EAAE,aAAa,SAAS,IAAI;AACnC,QAAM,cAAc,WAAW,eAAe,EAAE;AAChD,QAAM,YAAY,WAAW,aAAa,EAAE;AAC5C,QAAM,QAAQ,YAAY,CAAC;AAC3B,MAAI,UAAU,UAAa,UAAU,WAAW,GAAG;AACjD,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,aACE,cAAc,YAAY,KAAK,IAAI,CAAC;AAAA,IAItC;AAAA,IACA;AAAA,IACA,aAAa,oCAAoC,KAAK,yBAAyB,KAAK;AAAA,IACpF,aAAa;AAAA,EACf;AACF;;;ACtDO,SAAS,QAAkB,MAAgB;AAChD,YAAU,EAAE,IAAI,MAAM,MAAO,QAAQ,KAAW,CAAC;AACnD;AAEO,SAAS,eAAe,SAAwB;AACrD,YAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,QAAQ,EAAE,CAAC;AACrE,UAAQ,KAAK,CAAC;AAChB;AAKO,SAAS,QAAQ,KAAqB;AAC3C,MAAI,eAAe,UAAU;AAC3B,UAAM,MAAM,aAAa,IAAI,OAAO;AACpC,cAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,SAAS,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC,EAAG,EAAE,CAAC;AACjG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,eAAe,OAAO;AACxB,cAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,IAAI,QAAQ,EAAE,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,YAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,UAAQ,KAAK,CAAC;AAChB;AAEO,SAAS,iBAAyB;AACvC,SAAO,GAAG,qBAAqB,GAAG,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACtG;AAEO,SAAS,SAAS,IAAqB;AAC5C,SAAO,GAAG,WAAW,qBAAqB;AAC5C;AAKO,SAAS,aAAa,OAAsC;AACjE,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,OAAO,MACV,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC7B,SAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAC1B;AAIO,IAAM,oBAAoB,CAAC,UAAU,QAAQ,UAAU,KAAK;AAQ5D,SAAS,cACd,OACA,EAAE,WAAW,GACsB;AACnC,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B;AAAA,MACE,8BAA8B,kBAAkB,KAAK,IAAI,CAAC,GAAG,aAAa,yBAAyB,EAAE;AAAA,IACvG;AAAA,EACF;AACA,QAAM,UAAU,MAAM,KAAK,EAAE,YAAY;AACzC,MAAI,YAAY,IAAI;AAClB,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,MAAI,eAAe,YAAY,UAAU,YAAY,UAAU;AAC7D,WAAO;AAAA,EACT;AACA,MAAK,kBAAwC,SAAS,OAAO,GAAG;AAC9D,WAAO;AAAA,EACT;AACA;AAAA,IACE,uBAAuB,KAAK,uBAAuB,kBAAkB,KAAK,IAAI,CAAC,GAAG,aAAa,yBAAyB,EAAE;AAAA,EAC5H;AACF;AAcO,IAAM,0BAA0B;AAChC,IAAM,oBAAoB;AAK1B,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQa;AACX,QAAM,QAAkB,CAAC;AACzB,MAAI,UAAU;AACZ,UAAM;AAAA,MACJ,GAAG,SAAS,IAAI,8DAA8D,MAAM;AAAA,IACtF;AAAA,EACF;AAIA,MAAI,oBAAoB,mBAAmB;AACzC,UAAM;AAAA,MACJ,GAAG,gBAAgB;AAAA,IACrB;AAAA,EACF,WAAW,qBAAqB,yBAAyB;AACvD,UAAM;AAAA,MACJ,0OAAqO,MAAM;AAAA,IAC7O;AAAA,EACF;AACA,QAAM,KAAK,kEAAkE,MAAM,EAAE;AACrF,MAAI,CAAC,aAAa;AAChB,UAAM,KAAK,+FAA+F;AAAA,EAC5G;AACA,MAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAC9B,UAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,aAAa;AAChB,UAAM;AAAA,MACJ,0KAA0K,kBAAkB,KAAK,GAAG,CAAC;AAAA,IACvM;AAAA,EACF;AACA,SAAO;AACT;AAWO,IAAM,6BAA6B;AAEnC,SAAS,eAAe,EAAE,UAAU,MAAM,GAAkD;AACjG,MAAI,WAAW,OAAO;AACpB,WAAO,CAAC;AAAA,EACV;AACA,SAAO;AAAA,IACL,0BAA0B,KAAK,uIAAkI,QAAQ,CAAC;AAAA,EAC5K;AACF;AAMO,SAAS,cACd,QACU;AACV,MAAI,CAAC,UAAU,OAAO,OAAO,WAAW,aAAa,OAAO,eAAe,MAAM;AAC/E,WAAO,CAAC;AAAA,EACV;AACA,SAAO;AAAA,IACL,4HAA4H,OAAO,OAAO,GAAG;AAAA,EAC/I;AACF;","names":[]}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
leadVersion,
|
|
7
7
|
writeSeriesMemberCanvas
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-2VPBIT65.js";
|
|
9
9
|
import {
|
|
10
10
|
definitionFieldsOf,
|
|
11
11
|
setDefinitionFields,
|
|
@@ -89,4 +89,4 @@ export {
|
|
|
89
89
|
makeSeriesAd,
|
|
90
90
|
seriesMadeEnvelope
|
|
91
91
|
};
|
|
92
|
-
//# sourceMappingURL=chunk-
|
|
92
|
+
//# sourceMappingURL=chunk-ULG4QRTV.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
parseBrandTokens
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZDMTXQ2Q.js";
|
|
4
4
|
|
|
5
5
|
// src/engine/brand/fonts.ts
|
|
6
6
|
import { posix } from "path";
|
|
@@ -452,4 +452,4 @@ export {
|
|
|
452
452
|
stripFontFaceBlocks,
|
|
453
453
|
upsertFontFaceCss
|
|
454
454
|
};
|
|
455
|
-
//# sourceMappingURL=chunk-
|
|
455
|
+
//# sourceMappingURL=chunk-VL43TNIP.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
failApi
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-SJYEY5MV.js";
|
|
4
4
|
import {
|
|
5
5
|
HUBSPOT_MISSING_GRANT_MARKER,
|
|
6
6
|
HUBSPOT_NOT_CONNECTED_MESSAGE
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-7EPXVICM.js";
|
|
8
8
|
import {
|
|
9
9
|
ApiError
|
|
10
10
|
} from "./chunk-XBOK23HI.js";
|
|
@@ -48,4 +48,4 @@ export {
|
|
|
48
48
|
hubspotRefusal,
|
|
49
49
|
failNotConnected
|
|
50
50
|
};
|
|
51
|
-
//# sourceMappingURL=chunk-
|
|
51
|
+
//# sourceMappingURL=chunk-VLMBTPXU.js.map
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
import {
|
|
12
12
|
X_DRAFT_BATCH_MAX,
|
|
13
13
|
xDraftOpInputSchema
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-7EPXVICM.js";
|
|
15
15
|
import {
|
|
16
16
|
ApiError,
|
|
17
17
|
apiPost
|
|
@@ -166,4 +166,4 @@ export {
|
|
|
166
166
|
requireTarget,
|
|
167
167
|
requireTargets
|
|
168
168
|
};
|
|
169
|
-
//# sourceMappingURL=chunk-
|
|
169
|
+
//# sourceMappingURL=chunk-VYQ3QJ3C.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
creativesRunResponseSchema
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-7EPXVICM.js";
|
|
4
4
|
import {
|
|
5
5
|
ApiError,
|
|
6
6
|
apiPost
|
|
@@ -20,4 +20,4 @@ async function fetchRunRecord(runId, post = apiPost) {
|
|
|
20
20
|
export {
|
|
21
21
|
fetchRunRecord
|
|
22
22
|
};
|
|
23
|
-
//# sourceMappingURL=chunk-
|
|
23
|
+
//# sourceMappingURL=chunk-WGUQHAJY.js.map
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
calendarDaySchema,
|
|
7
7
|
todayUtc,
|
|
8
8
|
windowTooLong
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-7EPXVICM.js";
|
|
10
10
|
|
|
11
11
|
// ../api/src/accounts/crm.ts
|
|
12
12
|
import { z } from "zod";
|
|
@@ -1076,4 +1076,4 @@ export {
|
|
|
1076
1076
|
accountsCampaignsRequestSchema,
|
|
1077
1077
|
ACCOUNTS_NO_SETTINGS_MESSAGE
|
|
1078
1078
|
};
|
|
1079
|
-
//# sourceMappingURL=chunk-
|
|
1079
|
+
//# sourceMappingURL=chunk-WKQG6TER.js.map
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-RX6F3GEA.js";
|
|
7
7
|
import {
|
|
8
8
|
brandTokensSchema
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-7EPXVICM.js";
|
|
10
10
|
|
|
11
11
|
// src/engine/landing/lib/brand-tokens.ts
|
|
12
12
|
import { readFile as readFile2 } from "fs/promises";
|
|
@@ -334,4 +334,4 @@ export {
|
|
|
334
334
|
brandCommitsAiHue,
|
|
335
335
|
brandCommitsCream
|
|
336
336
|
};
|
|
337
|
-
//# sourceMappingURL=chunk-
|
|
337
|
+
//# sourceMappingURL=chunk-ZDMTXQ2Q.js.map
|
|
@@ -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,
|
|
@@ -194,4 +195,4 @@ var claimCommand = defineCommand({
|
|
|
194
195
|
export {
|
|
195
196
|
claimCommand
|
|
196
197
|
};
|
|
197
|
-
//# sourceMappingURL=claim-
|
|
198
|
+
//# sourceMappingURL=claim-W6G6VEG5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/actions/claim.ts","../src/commands/actions/skillCatalog.ts"],"sourcesContent":["import type { ActionsClaimResponse, ActionsRecommendSkillsResponse, SkillRecommendation } 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\";\nimport { readSkillCatalog } from \"./skillCatalog.ts\";\n\nregisterSchema({\n command: \"actions.claim\",\n description:\n \"Claim an action for the current chat (live — visible to other chats immediately). Claim only what you're actively working on now: it's required before `complete`, but NOT for `update` or `discard` (those stage without a claim). Returns action details plus a fast-model recommendation of which skills to load for the work (`recommendedSkills`) and a routing hint: load every skill that owns part of the work and the tool doc for each baker CLI family you'll use.\",\n args: {\n id: { type: \"string\", description: \"Action ID\", required: true },\n },\n});\n\nasync function recommendSkills(actionId: string): Promise<SkillRecommendation[]> {\n const skills = readSkillCatalog(process.cwd());\n if (skills.length === 0) return [];\n const response = await apiPost<ActionsRecommendSkillsResponse>(\"/api/actions/recommend-skills\", {\n actionId,\n skills,\n });\n return response.data.recommendations;\n}\n\n// Keep in sync with the claim-hint block in scripts/skill-routing-evals/run.mjs —\n// the action-claim evals embed this nudge so they test the real production surface.\nconst ROUTING_HINT =\n \"Actions often span several surfaces (a landing page plus a Google Ads change, a sheet pull plus an audience upload). Before starting, load EVERY skill that owns part of the work and read the tool doc (__tooling__/docs/tools/baker/<family>.md) for each baker CLI family you'll use. If the action references source material living in a connected tool (an email attachment, a call, a CRM record, a spreadsheet), reach for that tool too. If it describes recurring or future-dated work, it belongs on a schedule — see __tooling__/docs/tools/baker/scheduled-agents.md.\";\n\nfunction buildHints(recommendations: SkillRecommendation[]): string[] {\n if (recommendations.length === 0) {\n return [\"Review the action name, description, and tags above.\", ROUTING_HINT];\n }\n return [\n \"Recommended skills for this action (load the ones you'll use):\",\n ...recommendations.map((r) => ` /${r.name} — ${r.reason}`),\n \"Suggestions come from the action's name/description/tags only — the work may need more.\",\n ROUTING_HINT,\n ];\n}\n\nexport const claimCommand = defineCommand({\n meta: {\n name: \"claim\",\n description:\n \"Claim an action so other chats see you're working on it. Required before `complete` (update and discard don't need a claim). Example: baker actions claim <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 const response = await apiPost<ActionsClaimResponse>(\"/api/actions/claim\", {\n actionId: id,\n chatId,\n });\n\n let recommendedSkills: SkillRecommendation[] = [];\n try {\n recommendedSkills = await recommendSkills(id);\n } catch {\n // Recommendation is best-effort — a claim must never fail because the hint could not be produced.\n }\n\n const data = response.data ? { ...response.data, recommendedSkills } : response.data;\n writeJson({ ok: response.ok, data, hints: buildHints(recommendedSkills) });\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\ninterface SkillCatalogEntry {\n name: string;\n description: string;\n}\n\nconst DESCRIPTION_MAX = 600;\nconst SKILLS_SUBPATH = join(\".claude\", \"skills\");\n\n/** The backlog workflow lives in the actions tool doc, not a skill — never recommend a legacy `actions` skill a stale scaffold may still carry. */\nconst EXCLUDED_SKILLS = new Set([\"actions\"]);\n\nfunction stripQuotes(value: string): string {\n const trimmed = value.trim();\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\n/g, \"\\n\");\n }\n // YAML single-quoted scalars only escape a literal quote by doubling it ('').\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n return trimmed.slice(1, -1).replace(/''/g, \"'\");\n }\n return trimmed;\n}\n\nfunction extractFrontmatterLines(md: string): string[] | null {\n if (!md.startsWith(\"---\")) return null;\n const end = md.indexOf(\"\\n---\", 3);\n if (end === -1) return null;\n return md.slice(md.indexOf(\"\\n\", 3) + 1, end).split(\"\\n\");\n}\n\nconst BLOCK_SCALAR = /^([|>])[+-]?$/;\n\nfunction collectBlockLines(lines: string[], start: number): string[] {\n const collected: string[] = [];\n for (let i = start; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n if (line.trim() === \"\") {\n collected.push(\"\");\n } else if (/^\\s/.test(line)) {\n collected.push(line.trim());\n } else {\n break; // dedented to a new top-level key — block is over\n }\n }\n while (collected.length > 0 && collected.at(-1) === \"\") collected.pop();\n return collected;\n}\n\n/** Folded (`>`): join lines with spaces, blank lines become paragraph breaks. */\nfunction foldLines(collected: string[]): string {\n const paragraphs: string[] = [];\n let buffer: string[] = [];\n for (const line of collected) {\n if (line === \"\") {\n if (buffer.length > 0) paragraphs.push(buffer.join(\" \"));\n buffer = [];\n } else {\n buffer.push(line);\n }\n }\n if (buffer.length > 0) paragraphs.push(buffer.join(\" \"));\n return paragraphs.join(\"\\n\");\n}\n\n/** Join a YAML block scalar's indented continuation lines: literal (`|`) keeps line breaks, folded (`>`) joins with spaces. */\nfunction readBlockScalar(lines: string[], start: number, style: \"|\" | \">\"): string {\n const collected = collectBlockLines(lines, start);\n return style === \"|\" ? collected.join(\"\\n\") : foldLines(collected);\n}\n\nfunction readField(lines: string[], field: string): string | null {\n for (let i = 0; i < lines.length; i++) {\n const match = (lines[i] ?? \"\").match(/^([A-Za-z0-9_-]+):\\s*(.*)$/);\n if (!match || match[1] !== field) continue;\n const inline = (match[2] ?? \"\").trim();\n const scalar = inline.match(BLOCK_SCALAR);\n if (scalar) {\n return readBlockScalar(lines, i + 1, scalar[1] as \"|\" | \">\");\n }\n return stripQuotes(inline);\n }\n return null;\n}\n\nexport function parseSkillFrontmatter(md: string): SkillCatalogEntry | null {\n const lines = extractFrontmatterLines(md);\n if (!lines) return null;\n const name = readField(lines, \"name\");\n const description = readField(lines, \"description\");\n if (!name || !description) return null;\n const trimmed = description.length > DESCRIPTION_MAX ? `${description.slice(0, DESCRIPTION_MAX)}…` : description;\n return { name, description: trimmed };\n}\n\nexport function findSkillsDir(startDir: string): string | null {\n let dir = startDir;\n for (;;) {\n const candidate = join(dir, SKILLS_SUBPATH);\n if (existsSync(candidate)) return candidate;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport function readSkillCatalog(startDir: string): SkillCatalogEntry[] {\n const skillsDir = findSkillsDir(startDir);\n if (!skillsDir) return [];\n\n const entries: SkillCatalogEntry[] = [];\n for (const dirent of readdirSync(skillsDir, { withFileTypes: true })) {\n if (!dirent.isDirectory() || EXCLUDED_SKILLS.has(dirent.name)) continue;\n const skillFile = join(skillsDir, dirent.name, \"SKILL.md\");\n if (!existsSync(skillFile)) continue;\n try {\n const parsed = parseSkillFrontmatter(readFileSync(skillFile, \"utf8\"));\n if (parsed) entries.push(parsed);\n } catch {\n // Unreadable skill file — skip it, never block the claim.\n }\n }\n return entries.sort((a, b) => a.name.localeCompare(b.name));\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/actions/claim.ts","../src/commands/actions/skillCatalog.ts"],"sourcesContent":["import type { ActionsClaimResponse, ActionsRecommendSkillsResponse, SkillRecommendation } 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\";\nimport { readSkillCatalog } from \"./skillCatalog.ts\";\n\nregisterSchema({\n command: \"actions.claim\",\n description:\n \"Claim an action for the current chat (live — visible to other chats immediately). Claim only what you're actively working on now: it's required before `complete`, but NOT for `update` or `discard` (those stage without a claim). Returns action details plus a fast-model recommendation of which skills to load for the work (`recommendedSkills`) and a routing hint: load every skill that owns part of the work and the tool doc for each baker CLI family you'll use.\",\n args: {\n id: { type: \"string\", description: \"Action ID\", required: true },\n },\n});\n\nasync function recommendSkills(actionId: string): Promise<SkillRecommendation[]> {\n const skills = readSkillCatalog(process.cwd());\n if (skills.length === 0) return [];\n const response = await apiPost<ActionsRecommendSkillsResponse>(\"/api/actions/recommend-skills\", {\n actionId,\n skills,\n });\n return response.data.recommendations;\n}\n\n// Keep in sync with the claim-hint block in scripts/skill-routing-evals/run.mjs —\n// the action-claim evals embed this nudge so they test the real production surface.\nconst ROUTING_HINT =\n \"Actions often span several surfaces (a landing page plus a Google Ads change, a sheet pull plus an audience upload). Before starting, load EVERY skill that owns part of the work and read the tool doc (__tooling__/docs/tools/baker/<family>.md) for each baker CLI family you'll use. If the action references source material living in a connected tool (an email attachment, a call, a CRM record, a spreadsheet), reach for that tool too. If it describes recurring or future-dated work, it belongs on a schedule — see __tooling__/docs/tools/baker/scheduled-agents.md.\";\n\nfunction buildHints(recommendations: SkillRecommendation[]): string[] {\n if (recommendations.length === 0) {\n return [\"Review the action name, description, and tags above.\", ROUTING_HINT];\n }\n return [\n \"Recommended skills for this action (load the ones you'll use):\",\n ...recommendations.map((r) => ` /${r.name} — ${r.reason}`),\n \"Suggestions come from the action's name/description/tags only — the work may need more.\",\n ROUTING_HINT,\n ];\n}\n\nexport const claimCommand = defineCommand({\n meta: {\n name: \"claim\",\n description:\n \"Claim an action so other chats see you're working on it. Required before `complete` (update and discard don't need a claim). Example: baker actions claim <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 const response = await apiPost<ActionsClaimResponse>(\"/api/actions/claim\", {\n actionId: id,\n chatId,\n });\n\n let recommendedSkills: SkillRecommendation[] = [];\n try {\n recommendedSkills = await recommendSkills(id);\n } catch {\n // Recommendation is best-effort — a claim must never fail because the hint could not be produced.\n }\n\n const data = response.data ? { ...response.data, recommendedSkills } : response.data;\n writeJson({ ok: response.ok, data, hints: buildHints(recommendedSkills) });\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\ninterface SkillCatalogEntry {\n name: string;\n description: string;\n}\n\nconst DESCRIPTION_MAX = 600;\nconst SKILLS_SUBPATH = join(\".claude\", \"skills\");\n\n/** The backlog workflow lives in the actions tool doc, not a skill — never recommend a legacy `actions` skill a stale scaffold may still carry. */\nconst EXCLUDED_SKILLS = new Set([\"actions\"]);\n\nfunction stripQuotes(value: string): string {\n const trimmed = value.trim();\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\n/g, \"\\n\");\n }\n // YAML single-quoted scalars only escape a literal quote by doubling it ('').\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n return trimmed.slice(1, -1).replace(/''/g, \"'\");\n }\n return trimmed;\n}\n\nfunction extractFrontmatterLines(md: string): string[] | null {\n if (!md.startsWith(\"---\")) return null;\n const end = md.indexOf(\"\\n---\", 3);\n if (end === -1) return null;\n return md.slice(md.indexOf(\"\\n\", 3) + 1, end).split(\"\\n\");\n}\n\nconst BLOCK_SCALAR = /^([|>])[+-]?$/;\n\nfunction collectBlockLines(lines: string[], start: number): string[] {\n const collected: string[] = [];\n for (let i = start; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n if (line.trim() === \"\") {\n collected.push(\"\");\n } else if (/^\\s/.test(line)) {\n collected.push(line.trim());\n } else {\n break; // dedented to a new top-level key — block is over\n }\n }\n while (collected.length > 0 && collected.at(-1) === \"\") collected.pop();\n return collected;\n}\n\n/** Folded (`>`): join lines with spaces, blank lines become paragraph breaks. */\nfunction foldLines(collected: string[]): string {\n const paragraphs: string[] = [];\n let buffer: string[] = [];\n for (const line of collected) {\n if (line === \"\") {\n if (buffer.length > 0) paragraphs.push(buffer.join(\" \"));\n buffer = [];\n } else {\n buffer.push(line);\n }\n }\n if (buffer.length > 0) paragraphs.push(buffer.join(\" \"));\n return paragraphs.join(\"\\n\");\n}\n\n/** Join a YAML block scalar's indented continuation lines: literal (`|`) keeps line breaks, folded (`>`) joins with spaces. */\nfunction readBlockScalar(lines: string[], start: number, style: \"|\" | \">\"): string {\n const collected = collectBlockLines(lines, start);\n return style === \"|\" ? collected.join(\"\\n\") : foldLines(collected);\n}\n\nfunction readField(lines: string[], field: string): string | null {\n for (let i = 0; i < lines.length; i++) {\n const match = (lines[i] ?? \"\").match(/^([A-Za-z0-9_-]+):\\s*(.*)$/);\n if (!match || match[1] !== field) continue;\n const inline = (match[2] ?? \"\").trim();\n const scalar = inline.match(BLOCK_SCALAR);\n if (scalar) {\n return readBlockScalar(lines, i + 1, scalar[1] as \"|\" | \">\");\n }\n return stripQuotes(inline);\n }\n return null;\n}\n\nexport function parseSkillFrontmatter(md: string): SkillCatalogEntry | null {\n const lines = extractFrontmatterLines(md);\n if (!lines) return null;\n const name = readField(lines, \"name\");\n const description = readField(lines, \"description\");\n if (!name || !description) return null;\n const trimmed = description.length > DESCRIPTION_MAX ? `${description.slice(0, DESCRIPTION_MAX)}…` : description;\n return { name, description: trimmed };\n}\n\nexport function findSkillsDir(startDir: string): string | null {\n let dir = startDir;\n for (;;) {\n const candidate = join(dir, SKILLS_SUBPATH);\n if (existsSync(candidate)) return candidate;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport function readSkillCatalog(startDir: string): SkillCatalogEntry[] {\n const skillsDir = findSkillsDir(startDir);\n if (!skillsDir) return [];\n\n const entries: SkillCatalogEntry[] = [];\n for (const dirent of readdirSync(skillsDir, { withFileTypes: true })) {\n if (!dirent.isDirectory() || EXCLUDED_SKILLS.has(dirent.name)) continue;\n const skillFile = join(skillsDir, dirent.name, \"SKILL.md\");\n if (!existsSync(skillFile)) continue;\n try {\n const parsed = parseSkillFrontmatter(readFileSync(skillFile, \"utf8\"));\n if (parsed) entries.push(parsed);\n } catch {\n // Unreadable skill file — skip it, never block the claim.\n }\n }\n return entries.sort((a, b) => a.name.localeCompare(b.name));\n}\n"],"mappings":"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","names":[]}
|
package/dist/cli.js
CHANGED
|
@@ -106,38 +106,38 @@ Formats: --output json works on every command that prints the envelope. --output
|
|
|
106
106
|
Introspection: Run 'baker schema <command>' to inspect argument schemas.`
|
|
107
107
|
},
|
|
108
108
|
subCommands: {
|
|
109
|
-
capabilities: () => import("./capabilities-
|
|
110
|
-
actions: () => import("./actions-
|
|
111
|
-
"scheduled-agents": () => import("./scheduled-agents-
|
|
112
|
-
ads: () => import("./ads-
|
|
113
|
-
brand: () => import("./brand-
|
|
114
|
-
analytics: () => import("./analytics-
|
|
109
|
+
capabilities: () => import("./capabilities-PXBKUN2G.js").then((m) => m.capabilitiesCommand),
|
|
110
|
+
actions: () => import("./actions-6TQMSVWD.js").then((m) => m.actionsCommand),
|
|
111
|
+
"scheduled-agents": () => import("./scheduled-agents-N4LJRM4C.js").then((m) => m.scheduledAgentsCommand),
|
|
112
|
+
ads: () => import("./ads-AGYCVD62.js").then((m) => m.adsCommand),
|
|
113
|
+
brand: () => import("./brand-YRTEPGBK.js").then((m) => m.brandCommand),
|
|
114
|
+
analytics: () => import("./analytics-IFELDWLL.js").then((m) => m.analyticsCommand),
|
|
115
115
|
experiment: () => import("./experiment-LKK77YAN.js").then((m) => m.experimentCommand),
|
|
116
|
-
ga4: () => import("./ga4-
|
|
117
|
-
gsc: () => import("./gsc-
|
|
118
|
-
research: () => import("./research-
|
|
119
|
-
creatives: () => import("./creatives-
|
|
120
|
-
flows: () => import("./flows-
|
|
121
|
-
funnel: () => import("./funnel-
|
|
122
|
-
images: () => import("./images-
|
|
123
|
-
studio: () => import("./studio-
|
|
124
|
-
avatars: () => import("./avatars-
|
|
125
|
-
landing: () => import("./landing-
|
|
126
|
-
videos: () => import("./videos-
|
|
127
|
-
testimonials: () => import("./testimonials-
|
|
128
|
-
canvas: () => import("./canvas-
|
|
129
|
-
tags: () => import("./tags-
|
|
116
|
+
ga4: () => import("./ga4-DV2AXCSL.js").then((m) => m.ga4Command),
|
|
117
|
+
gsc: () => import("./gsc-TAKOF7J5.js").then((m) => m.gscCommand),
|
|
118
|
+
research: () => import("./research-FMM6AWZC.js").then((m) => m.researchCommand),
|
|
119
|
+
creatives: () => import("./creatives-FXUQ5WSD.js").then((m) => m.creativesCommand),
|
|
120
|
+
flows: () => import("./flows-KTFAML22.js").then((m) => m.flowsCommand),
|
|
121
|
+
funnel: () => import("./funnel-I6XIAEHG.js").then((m) => m.funnelCommand),
|
|
122
|
+
images: () => import("./images-2EFFUNNV.js").then((m) => m.imagesCommand),
|
|
123
|
+
studio: () => import("./studio-SYKOSNDB.js").then((m) => m.studioCommand),
|
|
124
|
+
avatars: () => import("./avatars-467OSBD6.js").then((m) => m.avatarsCommand),
|
|
125
|
+
landing: () => import("./landing-2ZB46LXH.js").then((m) => m.landingCommand),
|
|
126
|
+
videos: () => import("./videos-LICG6ACJ.js").then((m) => m.videosCommand),
|
|
127
|
+
testimonials: () => import("./testimonials-DII5DYLR.js").then((m) => m.testimonialsCommand),
|
|
128
|
+
canvas: () => import("./canvas-YQFG52IG.js").then((m) => m.canvasCommand),
|
|
129
|
+
tags: () => import("./tags-4BAVFH4S.js").then((m) => m.tagsCommand),
|
|
130
130
|
"tag-manager": () => import("./tag-manager-DYZUOIAS.js").then((m) => m.tagManagerCommand),
|
|
131
|
-
chats: () => import("./chats-
|
|
132
|
-
history: () => import("./history-
|
|
133
|
-
credentials: () => import("./credentials-
|
|
134
|
-
hubspot: () => import("./hubspot-
|
|
135
|
-
accounts: () => import("./accounts-
|
|
136
|
-
"winning-ads": () => import("./winning-ads-
|
|
137
|
-
"media-sources": () => import("./media-sources-
|
|
138
|
-
site: () => import("./site-
|
|
139
|
-
mcp: () => import("./mcp-
|
|
140
|
-
"setup-links": () => import("./setup-links-
|
|
131
|
+
chats: () => import("./chats-UK47UE7C.js").then((m) => m.chatsCommand),
|
|
132
|
+
history: () => import("./history-6AVQX2OQ.js").then((m) => m.historyCommand),
|
|
133
|
+
credentials: () => import("./credentials-MJC7PGKR.js").then((m) => m.credentialsCommand),
|
|
134
|
+
hubspot: () => import("./hubspot-SVEMFK5S.js").then((m) => m.hubspotCommand),
|
|
135
|
+
accounts: () => import("./accounts-E67BMK7T.js").then((m) => m.accountsCommand),
|
|
136
|
+
"winning-ads": () => import("./winning-ads-C6S2C5VP.js").then((m) => m.winningAdsCommand),
|
|
137
|
+
"media-sources": () => import("./media-sources-ZXHEEP6T.js").then((m) => m.mediaSourcesCommand),
|
|
138
|
+
site: () => import("./site-4SKM7RKG.js").then((m) => m.siteCommand),
|
|
139
|
+
mcp: () => import("./mcp-6FQBVJ6F.js").then((m) => m.mcpCommand),
|
|
140
|
+
"setup-links": () => import("./setup-links-GYSE56GX.js").then((m) => m.setupLinksCommand),
|
|
141
141
|
schema: () => import("./schema-6GR77VJG.js").then((m) => m.schemaCommand)
|
|
142
142
|
}
|
|
143
143
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
csvOrJson,
|
|
3
3
|
handleLinkedinError
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-N4LAYIIN.js";
|
|
5
5
|
import {
|
|
6
6
|
TABLE_OUTPUT_FORMATS,
|
|
7
7
|
outputFormatRefusal,
|
|
@@ -14,10 +14,11 @@ import {
|
|
|
14
14
|
} from "./chunk-X7ZODEXJ.js";
|
|
15
15
|
import {
|
|
16
16
|
linkedinCompaniesRequestSchema
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-7EPXVICM.js";
|
|
18
18
|
import "./chunk-GXDLWBOY.js";
|
|
19
19
|
import "./chunk-TEINLN64.js";
|
|
20
20
|
import "./chunk-ZJWUBJYQ.js";
|
|
21
|
+
import "./chunk-HR6IWNKE.js";
|
|
21
22
|
import "./chunk-NE4F3FHN.js";
|
|
22
23
|
import {
|
|
23
24
|
apiPost
|
|
@@ -192,4 +193,4 @@ export {
|
|
|
192
193
|
companiesCommand,
|
|
193
194
|
companiesHints
|
|
194
195
|
};
|
|
195
|
-
//# sourceMappingURL=companies-
|
|
196
|
+
//# sourceMappingURL=companies-TS6KBATJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/ads/linkedin/companies.ts"],"sourcesContent":["import {\n type LINKEDIN_COMPANIES_BY,\n type LinkedinCompaniesRequestInput,\n type LinkedinCompaniesResponse,\n linkedinCompaniesRequestSchema,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiPost } from \"../../../client.ts\";\nimport { getEnv } from \"../../../env.ts\";\nimport {\n outputFormatRefusal,\n TABLE_OUTPUT_FORMATS,\n writeAdsJson,\n writeAdsOutput,\n writeJsonEnvelope,\n} from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError } from \"./shared.ts\";\n\n/** Companies per page without --full. */\nconst COMPANIES_PAGE_SIZE = 100;\n\n/** A by-campaign read makes one LinkedIn call per delivered campaign. */\nconst COMPANIES_TIMEOUT_MS = 180_000;\n\nconst CSV_FIELDS = [\n \"org\",\n \"name\",\n \"domain\",\n \"domainSource\",\n \"impressions\",\n \"clicks\",\n \"engagements\",\n \"costLocal\",\n \"videoViews\",\n \"months\",\n \"campaigns\",\n];\n\n/** Next steps the agent can't see from the rows alone. */\nexport function companiesHints(data: LinkedinCompaniesResponse, request: { withDomains: boolean }): string[] {\n const hints: string[] = [];\n if (data.rows.length === 0) {\n hints.push(\n `No company shows up for ${data.query.start} to ${data.query.end}${data.query.minImpressions > 0 ? ` at --min-impressions ${data.query.minImpressions}` : \"\"}. LinkedIn reports companies 12-24h late and leaves out any with fewer than 3 events in a month, so a small or new campaign can have none yet. Try a longer period (--last-months 24), drop --min-impressions, or check the campaigns delivered with \\`baker ads linkedin analytics\\`.`,\n );\n return hints;\n }\n const withDomain = data.rows.filter((row) => row.domain !== undefined).length;\n if (withDomain > 0) {\n hints.push(\n `${withDomain} companies came back with a website domain — if HubSpot is connected, \\`baker hubspot companies search --domains <domain,domain,…> --with-deals\\` (up to 100 per call) shows which are already accounts and which have deals.`,\n );\n } else if (!request.withDomains && data.rows.length > 0) {\n hints.push(\n \"Add --with-domains to get each company's website domain, ready for matching against your customer list.\",\n );\n }\n if (data.totalCompanies > data.rows.length) {\n const page = data.page ?? 1;\n const first = (page - 1) * COMPANIES_PAGE_SIZE + 1;\n const last = first + data.rows.length - 1;\n const next = last < data.totalCompanies ? ` — --page ${page + 1} for the next ${COMPANIES_PAGE_SIZE}, ` : \" — \";\n hints.push(\n `Showing companies ${first}-${last} of ${data.totalCompanies.toLocaleString(\"en\")}, most engaged first${next}--full for all, or --min-impressions to trim the tail.`,\n );\n }\n if (data.query.by === \"none\" && data.rows.length > 0) {\n hints.push(\"--by month shows when each company warmed up; --by campaign shows which campaigns reached it.\");\n }\n return hints;\n}\n\nfunction csvList(raw: unknown): string[] | undefined {\n if (typeof raw !== \"string\") return undefined;\n const items = raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\n/** Request fields as the flags that set them, so a refusal names what the agent typed. */\nconst FLAG_OF_FIELD: Record<string, string> = {\n accountId: \"--account-id\",\n campaignIds: \"--campaign-id\",\n lastMonths: \"--last-months\",\n start: \"--start\",\n end: \"--end\",\n by: \"--by\",\n minImpressions: \"--min-impressions\",\n page: \"--page\",\n};\n\nfunction flagOf(field: string): string {\n return FLAG_OF_FIELD[field.split(\".\")[0] ?? \"\"] ?? (field || \"args\");\n}\n\nfunction optionalNumber(raw: unknown): number | undefined {\n return typeof raw === \"string\" && raw.trim() !== \"\" ? Number(raw) : undefined;\n}\n\nfunction bareAccountId(raw: string | undefined): string | undefined {\n return raw?.startsWith(\"urn:\") ? raw.split(\":\").pop() : raw;\n}\n\nexport const companiesCommand = defineCommand({\n meta: {\n name: \"companies\",\n description: `Which companies your LinkedIn ads reached — one row per company over the whole period, most engaged first.\n\nStart here for \"which companies are our ads warming\", ABM reporting, or building a warm-account list.\nRows: {org, name, impressions, clicks, engagements, costLocal}. Defaults: the last 12 calendar\nmonths, the only selected ad account, 100 companies a page (--page 2 for the next, --full for all).\n\nExamples:\n baker ads linkedin companies # last 12 months, whole account\n baker ads linkedin companies --page 2 # the next 100 companies\n baker ads linkedin companies --by month --min-impressions 50 # when each company warmed up\n baker ads linkedin companies --campaign-id 333728193,810055513 --by campaign\n baker ads linkedin companies --with-domains --output csv # + website domain, for CRM matching\n baker ads linkedin companies --last-months 3 --stats # + how complete LinkedIn's data is\n\nLinkedIn reports companies 12-24h late and leaves out any company with fewer than 3 events in a month,\nso small companies are undercounted. engagements = LinkedIn's totalEngagements.`,\n },\n args: {\n \"account-id\": {\n type: \"string\",\n description: \"Ad account id (numeric or urn:li:sponsoredAccount:N). Default: the only selected account\",\n },\n \"campaign-id\": { type: \"string\", description: \"Comma-separated campaign ids — read only these campaigns\" },\n \"last-months\": { type: \"string\", description: \"Calendar months back, including this one (1-24, default 12)\" },\n start: { type: \"string\", description: \"Start date YYYY-MM-DD (instead of --last-months)\" },\n end: { type: \"string\", description: \"End date YYYY-MM-DD (default today)\" },\n by: { type: \"string\", description: \"none | month | campaign — break each company down (default none)\" },\n \"with-domains\": { type: \"boolean\", description: \"Add each company's website domain and domainSource\" },\n \"min-impressions\": { type: \"string\", description: \"Leave out companies under N impressions over the period\" },\n full: { type: \"boolean\", description: \"Every company (not just a page of 100), plus videoViews\" },\n page: {\n type: \"string\",\n description: \"Which page of 100 companies, most engaged first (default 1); totalCompanies counts them all\",\n },\n stats: { type: \"boolean\", description: \"Add read-quality stats: row counts, cost/reach/domain coverage\" },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const input: LinkedinCompaniesRequestInput = {\n accountId: bareAccountId((args[\"account-id\"] as string | undefined) || getEnv().BAKER_LINKEDIN_AD_ACCOUNT_ID),\n campaignIds: csvList(args[\"campaign-id\"]),\n lastMonths: optionalNumber(args[\"last-months\"]),\n start: args.start as string | undefined,\n end: args.end as string | undefined,\n by: args.by as (typeof LINKEDIN_COMPANIES_BY)[number] | undefined,\n withDomains: Boolean(args[\"with-domains\"]),\n minImpressions: optionalNumber(args[\"min-impressions\"]),\n full: Boolean(args.full),\n page: optionalNumber(args.page),\n stats: Boolean(args.stats),\n skipCache: Boolean(args[\"no-cache\"]),\n };\n const parsed = linkedinCompaniesRequestSchema.safeParse(input);\n const formatRefusal = outputFormatRefusal(csvOrJson(args), TABLE_OUTPUT_FORMATS);\n if (!parsed.success || formatRefusal !== null) {\n const issues = parsed.success ? [] : parsed.error.issues;\n const messages = issues.map((issue) => `${flagOf(issue.path.join(\".\"))}: ${issue.message}`);\n writeAdsJson({\n ok: false,\n error: { code: \"INVALID_ARGS\", message: [...messages, ...(formatRefusal ? [formatRefusal] : [])].join(\"; \") },\n });\n process.exit(1);\n }\n\n try {\n const { data } = await apiPost<{ ok: true; data: LinkedinCompaniesResponse }>(\n \"/api/ads/linkedin/companies\",\n input,\n { timeoutMs: COMPANIES_TIMEOUT_MS },\n );\n const hints = companiesHints(data, parsed.data);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n const notes = [...data.warnings.map((w) => `${w.code}: ${w.message}`), ...hints];\n writeAdsOutput(data.rows, fmt, CSV_FIELDS, notes);\n return;\n }\n writeJsonEnvelope(hints.length > 0 ? { ok: true, data, hints } : { ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/linkedin/companies.ts"],"sourcesContent":["import {\n type LINKEDIN_COMPANIES_BY,\n type LinkedinCompaniesRequestInput,\n type LinkedinCompaniesResponse,\n linkedinCompaniesRequestSchema,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiPost } from \"../../../client.ts\";\nimport { getEnv } from \"../../../env.ts\";\nimport {\n outputFormatRefusal,\n TABLE_OUTPUT_FORMATS,\n writeAdsJson,\n writeAdsOutput,\n writeJsonEnvelope,\n} from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError } from \"./shared.ts\";\n\n/** Companies per page without --full. */\nconst COMPANIES_PAGE_SIZE = 100;\n\n/** A by-campaign read makes one LinkedIn call per delivered campaign. */\nconst COMPANIES_TIMEOUT_MS = 180_000;\n\nconst CSV_FIELDS = [\n \"org\",\n \"name\",\n \"domain\",\n \"domainSource\",\n \"impressions\",\n \"clicks\",\n \"engagements\",\n \"costLocal\",\n \"videoViews\",\n \"months\",\n \"campaigns\",\n];\n\n/** Next steps the agent can't see from the rows alone. */\nexport function companiesHints(data: LinkedinCompaniesResponse, request: { withDomains: boolean }): string[] {\n const hints: string[] = [];\n if (data.rows.length === 0) {\n hints.push(\n `No company shows up for ${data.query.start} to ${data.query.end}${data.query.minImpressions > 0 ? ` at --min-impressions ${data.query.minImpressions}` : \"\"}. LinkedIn reports companies 12-24h late and leaves out any with fewer than 3 events in a month, so a small or new campaign can have none yet. Try a longer period (--last-months 24), drop --min-impressions, or check the campaigns delivered with \\`baker ads linkedin analytics\\`.`,\n );\n return hints;\n }\n const withDomain = data.rows.filter((row) => row.domain !== undefined).length;\n if (withDomain > 0) {\n hints.push(\n `${withDomain} companies came back with a website domain — if HubSpot is connected, \\`baker hubspot companies search --domains <domain,domain,…> --with-deals\\` (up to 100 per call) shows which are already accounts and which have deals.`,\n );\n } else if (!request.withDomains && data.rows.length > 0) {\n hints.push(\n \"Add --with-domains to get each company's website domain, ready for matching against your customer list.\",\n );\n }\n if (data.totalCompanies > data.rows.length) {\n const page = data.page ?? 1;\n const first = (page - 1) * COMPANIES_PAGE_SIZE + 1;\n const last = first + data.rows.length - 1;\n const next = last < data.totalCompanies ? ` — --page ${page + 1} for the next ${COMPANIES_PAGE_SIZE}, ` : \" — \";\n hints.push(\n `Showing companies ${first}-${last} of ${data.totalCompanies.toLocaleString(\"en\")}, most engaged first${next}--full for all, or --min-impressions to trim the tail.`,\n );\n }\n if (data.query.by === \"none\" && data.rows.length > 0) {\n hints.push(\"--by month shows when each company warmed up; --by campaign shows which campaigns reached it.\");\n }\n return hints;\n}\n\nfunction csvList(raw: unknown): string[] | undefined {\n if (typeof raw !== \"string\") return undefined;\n const items = raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\n/** Request fields as the flags that set them, so a refusal names what the agent typed. */\nconst FLAG_OF_FIELD: Record<string, string> = {\n accountId: \"--account-id\",\n campaignIds: \"--campaign-id\",\n lastMonths: \"--last-months\",\n start: \"--start\",\n end: \"--end\",\n by: \"--by\",\n minImpressions: \"--min-impressions\",\n page: \"--page\",\n};\n\nfunction flagOf(field: string): string {\n return FLAG_OF_FIELD[field.split(\".\")[0] ?? \"\"] ?? (field || \"args\");\n}\n\nfunction optionalNumber(raw: unknown): number | undefined {\n return typeof raw === \"string\" && raw.trim() !== \"\" ? Number(raw) : undefined;\n}\n\nfunction bareAccountId(raw: string | undefined): string | undefined {\n return raw?.startsWith(\"urn:\") ? raw.split(\":\").pop() : raw;\n}\n\nexport const companiesCommand = defineCommand({\n meta: {\n name: \"companies\",\n description: `Which companies your LinkedIn ads reached — one row per company over the whole period, most engaged first.\n\nStart here for \"which companies are our ads warming\", ABM reporting, or building a warm-account list.\nRows: {org, name, impressions, clicks, engagements, costLocal}. Defaults: the last 12 calendar\nmonths, the only selected ad account, 100 companies a page (--page 2 for the next, --full for all).\n\nExamples:\n baker ads linkedin companies # last 12 months, whole account\n baker ads linkedin companies --page 2 # the next 100 companies\n baker ads linkedin companies --by month --min-impressions 50 # when each company warmed up\n baker ads linkedin companies --campaign-id 333728193,810055513 --by campaign\n baker ads linkedin companies --with-domains --output csv # + website domain, for CRM matching\n baker ads linkedin companies --last-months 3 --stats # + how complete LinkedIn's data is\n\nLinkedIn reports companies 12-24h late and leaves out any company with fewer than 3 events in a month,\nso small companies are undercounted. engagements = LinkedIn's totalEngagements.`,\n },\n args: {\n \"account-id\": {\n type: \"string\",\n description: \"Ad account id (numeric or urn:li:sponsoredAccount:N). Default: the only selected account\",\n },\n \"campaign-id\": { type: \"string\", description: \"Comma-separated campaign ids — read only these campaigns\" },\n \"last-months\": { type: \"string\", description: \"Calendar months back, including this one (1-24, default 12)\" },\n start: { type: \"string\", description: \"Start date YYYY-MM-DD (instead of --last-months)\" },\n end: { type: \"string\", description: \"End date YYYY-MM-DD (default today)\" },\n by: { type: \"string\", description: \"none | month | campaign — break each company down (default none)\" },\n \"with-domains\": { type: \"boolean\", description: \"Add each company's website domain and domainSource\" },\n \"min-impressions\": { type: \"string\", description: \"Leave out companies under N impressions over the period\" },\n full: { type: \"boolean\", description: \"Every company (not just a page of 100), plus videoViews\" },\n page: {\n type: \"string\",\n description: \"Which page of 100 companies, most engaged first (default 1); totalCompanies counts them all\",\n },\n stats: { type: \"boolean\", description: \"Add read-quality stats: row counts, cost/reach/domain coverage\" },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const input: LinkedinCompaniesRequestInput = {\n accountId: bareAccountId((args[\"account-id\"] as string | undefined) || getEnv().BAKER_LINKEDIN_AD_ACCOUNT_ID),\n campaignIds: csvList(args[\"campaign-id\"]),\n lastMonths: optionalNumber(args[\"last-months\"]),\n start: args.start as string | undefined,\n end: args.end as string | undefined,\n by: args.by as (typeof LINKEDIN_COMPANIES_BY)[number] | undefined,\n withDomains: Boolean(args[\"with-domains\"]),\n minImpressions: optionalNumber(args[\"min-impressions\"]),\n full: Boolean(args.full),\n page: optionalNumber(args.page),\n stats: Boolean(args.stats),\n skipCache: Boolean(args[\"no-cache\"]),\n };\n const parsed = linkedinCompaniesRequestSchema.safeParse(input);\n const formatRefusal = outputFormatRefusal(csvOrJson(args), TABLE_OUTPUT_FORMATS);\n if (!parsed.success || formatRefusal !== null) {\n const issues = parsed.success ? [] : parsed.error.issues;\n const messages = issues.map((issue) => `${flagOf(issue.path.join(\".\"))}: ${issue.message}`);\n writeAdsJson({\n ok: false,\n error: { code: \"INVALID_ARGS\", message: [...messages, ...(formatRefusal ? [formatRefusal] : [])].join(\"; \") },\n });\n process.exit(1);\n }\n\n try {\n const { data } = await apiPost<{ ok: true; data: LinkedinCompaniesResponse }>(\n \"/api/ads/linkedin/companies\",\n input,\n { timeoutMs: COMPANIES_TIMEOUT_MS },\n );\n const hints = companiesHints(data, parsed.data);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n const notes = [...data.warnings.map((w) => `${w.code}: ${w.message}`), ...hints];\n writeAdsOutput(data.rows, fmt, CSV_FIELDS, notes);\n return;\n }\n writeJsonEnvelope(hints.length > 0 ? { ok: true, data, hints } : { ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n"],"mappings":"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","names":[]}
|
|
@@ -3,13 +3,14 @@ import {
|
|
|
3
3
|
failValidation,
|
|
4
4
|
isTempId,
|
|
5
5
|
writeOk
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-SJYEY5MV.js";
|
|
7
7
|
import {
|
|
8
8
|
ACTION_COMPLETE_NOTE_MIN
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-7EPXVICM.js";
|
|
10
10
|
import "./chunk-GXDLWBOY.js";
|
|
11
11
|
import "./chunk-TEINLN64.js";
|
|
12
12
|
import "./chunk-ZJWUBJYQ.js";
|
|
13
|
+
import "./chunk-HR6IWNKE.js";
|
|
13
14
|
import "./chunk-NE4F3FHN.js";
|
|
14
15
|
import {
|
|
15
16
|
apiPost,
|
|
@@ -78,4 +79,4 @@ var completeCommand = defineCommand({
|
|
|
78
79
|
export {
|
|
79
80
|
completeCommand
|
|
80
81
|
};
|
|
81
|
-
//# sourceMappingURL=complete-
|
|
82
|
+
//# sourceMappingURL=complete-LYR2HMQU.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/actions/complete.ts"],"sourcesContent":["import { ACTION_COMPLETE_NOTE_MIN, type ActionsCompleteResponse } 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, isTempId, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.complete\",\n description:\n \"Stage completion of an action (it was done). Accepts a real action ID (must be claimed) or a temp ID from the same draft. The action becomes completed when the chat is published. --note is required and must describe what you actually did to resolve it (what changed, where, and the outcome) — it is the client-facing record surfaced by `baker actions log`. Don't use this to drop an action you no longer want — to remove a staged op use `actions draft remove`, to close an unwanted published action use `actions discard`.\",\n args: {\n id: { type: \"string\", description: \"Action ID or temp ID\", required: true },\n note: {\n type: \"string\",\n description:\n \"REQUIRED. Detailed description of what you did to resolve this: what changed, where, and the outcome. This is the durable, client-facing record shown by `baker actions log`.\",\n required: true,\n },\n },\n});\n\nexport const completeCommand = defineCommand({\n meta: {\n name: \"complete\",\n description:\n \"Stage completion of an action. Accepts real IDs (claimed) or temp IDs (same draft). Example: baker actions complete <id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Action ID or temp ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID or temp ID\", required: false },\n note: {\n type: \"string\",\n description: \"REQUIRED. What you did to resolve this: what changed, where, and the outcome.\",\n required: false,\n },\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 if (!isTempId(id)) {\n validateConvexId(id);\n }\n const note = (args.note as string | undefined)?.trim() ?? \"\";\n if (note.length < ACTION_COMPLETE_NOTE_MIN) {\n failValidation(\n `--note is required and must describe what you did (≥${ACTION_COMPLETE_NOTE_MIN} chars): what changed, where, and the outcome. This becomes the client-facing record surfaced by \\`baker actions log\\`.`,\n );\n }\n const chatId = requireChatId();\n await apiPost<ActionsCompleteResponse>(\"/api/actions/complete\", { chatId, actionRef: id, note });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/actions/complete.ts"],"sourcesContent":["import { ACTION_COMPLETE_NOTE_MIN, type ActionsCompleteResponse } 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, isTempId, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.complete\",\n description:\n \"Stage completion of an action (it was done). Accepts a real action ID (must be claimed) or a temp ID from the same draft. The action becomes completed when the chat is published. --note is required and must describe what you actually did to resolve it (what changed, where, and the outcome) — it is the client-facing record surfaced by `baker actions log`. Don't use this to drop an action you no longer want — to remove a staged op use `actions draft remove`, to close an unwanted published action use `actions discard`.\",\n args: {\n id: { type: \"string\", description: \"Action ID or temp ID\", required: true },\n note: {\n type: \"string\",\n description:\n \"REQUIRED. Detailed description of what you did to resolve this: what changed, where, and the outcome. This is the durable, client-facing record shown by `baker actions log`.\",\n required: true,\n },\n },\n});\n\nexport const completeCommand = defineCommand({\n meta: {\n name: \"complete\",\n description:\n \"Stage completion of an action. Accepts real IDs (claimed) or temp IDs (same draft). Example: baker actions complete <id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Action ID or temp ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID or temp ID\", required: false },\n note: {\n type: \"string\",\n description: \"REQUIRED. What you did to resolve this: what changed, where, and the outcome.\",\n required: false,\n },\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 if (!isTempId(id)) {\n validateConvexId(id);\n }\n const note = (args.note as string | undefined)?.trim() ?? \"\";\n if (note.length < ACTION_COMPLETE_NOTE_MIN) {\n failValidation(\n `--note is required and must describe what you did (≥${ACTION_COMPLETE_NOTE_MIN} chars): what changed, where, and the outcome. This becomes the client-facing record surfaced by \\`baker actions log\\`.`,\n );\n }\n const chatId = requireChatId();\n await apiPost<ActionsCompleteResponse>(\"/api/actions/complete\", { chatId, actionRef: id, note });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,qBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,KAAK;AAAA,IAC1E,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,wBAAwB,UAAU,MAAM;AAAA,IAC/E,aAAa,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IACpF,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;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,UAAI,CAAC,SAAS,EAAE,GAAG;AACjB,yBAAiB,EAAE;AAAA,MACrB;AACA,YAAM,OAAQ,KAAK,MAA6B,KAAK,KAAK;AAC1D,UAAI,KAAK,SAAS,0BAA0B;AAC1C;AAAA,UACE,4DAAuD,wBAAwB;AAAA,QACjF;AAAA,MACF;AACA,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAiC,yBAAyB,EAAE,QAAQ,WAAW,IAAI,KAAK,CAAC;AAC/F,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
import {
|
|
2
2
|
attachDestination,
|
|
3
|
+
attachSettings,
|
|
3
4
|
attachStep,
|
|
4
5
|
connectCommand,
|
|
5
6
|
copyDestination,
|
|
6
7
|
destinationRefusal,
|
|
8
|
+
restatableTargets,
|
|
9
|
+
sealRequestFor,
|
|
7
10
|
targetsFor,
|
|
8
11
|
unpickedSteps,
|
|
9
12
|
unwiredHubspotForms,
|
|
10
13
|
unwiredSideEffects
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
14
|
+
} from "./chunk-QE7W555R.js";
|
|
15
|
+
import "./chunk-VLMBTPXU.js";
|
|
16
|
+
import "./chunk-HROZYQ5H.js";
|
|
17
|
+
import "./chunk-SJYEY5MV.js";
|
|
18
|
+
import "./chunk-7EPXVICM.js";
|
|
16
19
|
import "./chunk-GXDLWBOY.js";
|
|
17
20
|
import "./chunk-TEINLN64.js";
|
|
18
21
|
import "./chunk-ZJWUBJYQ.js";
|
|
22
|
+
import "./chunk-HR6IWNKE.js";
|
|
19
23
|
import "./chunk-NE4F3FHN.js";
|
|
20
24
|
import "./chunk-XBOK23HI.js";
|
|
21
25
|
import "./chunk-IFWP3ZDO.js";
|
|
@@ -24,13 +28,16 @@ import "./chunk-NU7JSWVA.js";
|
|
|
24
28
|
import "./chunk-YQSBHWOI.js";
|
|
25
29
|
export {
|
|
26
30
|
attachDestination,
|
|
31
|
+
attachSettings,
|
|
27
32
|
attachStep,
|
|
28
33
|
connectCommand,
|
|
29
34
|
copyDestination,
|
|
30
35
|
destinationRefusal,
|
|
36
|
+
restatableTargets,
|
|
37
|
+
sealRequestFor,
|
|
31
38
|
targetsFor,
|
|
32
39
|
unpickedSteps,
|
|
33
40
|
unwiredHubspotForms,
|
|
34
41
|
unwiredSideEffects
|
|
35
42
|
};
|
|
36
|
-
//# sourceMappingURL=connect-
|
|
43
|
+
//# sourceMappingURL=connect-FCXNVTXG.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
daysAgoIso,
|
|
4
4
|
handleLinkedinError,
|
|
5
5
|
todayIso
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-N4LAYIIN.js";
|
|
7
7
|
import {
|
|
8
8
|
writeAdsJson,
|
|
9
9
|
writeAdsOutput
|
|
@@ -11,10 +11,11 @@ import {
|
|
|
11
11
|
import {
|
|
12
12
|
NO_CACHE_ARG
|
|
13
13
|
} from "./chunk-X7ZODEXJ.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./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 {
|
|
20
21
|
apiPost
|
|
@@ -90,4 +91,4 @@ Examples:
|
|
|
90
91
|
export {
|
|
91
92
|
conversationCommand
|
|
92
93
|
};
|
|
93
|
-
//# sourceMappingURL=conversation-
|
|
94
|
+
//# sourceMappingURL=conversation-6ZJGPCXM.js.map
|