@keystrokehq/platform 0.1.6 → 0.1.9
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/dist/{awk2-LA3USKJP-CWyXAnm3.cjs → awk2-LA3USKJP-C8TQfH53.cjs} +2 -2
- package/dist/{awk2-LA3USKJP-CWyXAnm3.cjs.map → awk2-LA3USKJP-C8TQfH53.cjs.map} +1 -1
- package/dist/{awk2-LA3USKJP-BhFGxIs7.mjs → awk2-LA3USKJP-iKo516lo.mjs} +2 -2
- package/dist/{awk2-LA3USKJP-BhFGxIs7.mjs.map → awk2-LA3USKJP-iKo516lo.mjs.map} +1 -1
- package/dist/{base64-C2AIWVNC-JXy8vwLH.cjs → base64-C2AIWVNC-BvnbraSd.cjs} +2 -2
- package/dist/{base64-C2AIWVNC-JXy8vwLH.cjs.map → base64-C2AIWVNC-BvnbraSd.cjs.map} +1 -1
- package/dist/{base64-C2AIWVNC-bTzuSsmR.mjs → base64-C2AIWVNC-DFlEIYu8.mjs} +2 -2
- package/dist/{base64-C2AIWVNC-bTzuSsmR.mjs.map → base64-C2AIWVNC-DFlEIYu8.mjs.map} +1 -1
- package/dist/{bash-YZ33HQZQ-BHybPYlT.mjs → bash-YZ33HQZQ-C5bTiiJp.mjs} +2 -2
- package/dist/{bash-YZ33HQZQ-BHybPYlT.mjs.map → bash-YZ33HQZQ-C5bTiiJp.mjs.map} +1 -1
- package/dist/{bash-YZ33HQZQ-5WKdWyaB.cjs → bash-YZ33HQZQ-CTEFZdqT.cjs} +2 -2
- package/dist/{bash-YZ33HQZQ-5WKdWyaB.cjs.map → bash-YZ33HQZQ-CTEFZdqT.cjs.map} +1 -1
- package/dist/{cat-TSFMZVYS-T80cqhDV.cjs → cat-TSFMZVYS-B2K0uDKN.cjs} +3 -3
- package/dist/{cat-TSFMZVYS-T80cqhDV.cjs.map → cat-TSFMZVYS-B2K0uDKN.cjs.map} +1 -1
- package/dist/{cat-TSFMZVYS-Ceu5HL0Q.mjs → cat-TSFMZVYS-D32dnWp3.mjs} +3 -3
- package/dist/{cat-TSFMZVYS-Ceu5HL0Q.mjs.map → cat-TSFMZVYS-D32dnWp3.mjs.map} +1 -1
- package/dist/{chunk-5H5SCKJM-BFKvZTj1.mjs → chunk-5H5SCKJM-BlgR0V3A.mjs} +2 -2
- package/dist/{chunk-5H5SCKJM-BFKvZTj1.mjs.map → chunk-5H5SCKJM-BlgR0V3A.mjs.map} +1 -1
- package/dist/{chunk-5H5SCKJM-CGwO8LN_.cjs → chunk-5H5SCKJM-CL3A9kMI.cjs} +2 -2
- package/dist/{chunk-5H5SCKJM-CGwO8LN_.cjs.map → chunk-5H5SCKJM-CL3A9kMI.cjs.map} +1 -1
- package/dist/{chunk-AQ6FYS2X-CJjPwzf4.mjs → chunk-AQ6FYS2X-AzmRUg3D.mjs} +2 -2
- package/dist/{chunk-AQ6FYS2X-CJjPwzf4.mjs.map → chunk-AQ6FYS2X-AzmRUg3D.mjs.map} +1 -1
- package/dist/{chunk-AQ6FYS2X-zV3Coc0j.cjs → chunk-AQ6FYS2X-CPSSDKT0.cjs} +2 -2
- package/dist/{chunk-AQ6FYS2X-zV3Coc0j.cjs.map → chunk-AQ6FYS2X-CPSSDKT0.cjs.map} +1 -1
- package/dist/{chunk-CHFEPBH4-BJfBf11C.mjs → chunk-CHFEPBH4-B59ZOlVh.mjs} +2 -2
- package/dist/{chunk-CHFEPBH4-BJfBf11C.mjs.map → chunk-CHFEPBH4-B59ZOlVh.mjs.map} +1 -1
- package/dist/{chunk-CHFEPBH4-C7fwqALc.cjs → chunk-CHFEPBH4-DndUvPEz.cjs} +2 -2
- package/dist/{chunk-CHFEPBH4-C7fwqALc.cjs.map → chunk-CHFEPBH4-DndUvPEz.cjs.map} +1 -1
- package/dist/{chunk-EBAPSGAO-CZPAmSX8.cjs → chunk-EBAPSGAO-BCq1VEUF.cjs} +2 -2
- package/dist/{chunk-EBAPSGAO-CZPAmSX8.cjs.map → chunk-EBAPSGAO-BCq1VEUF.cjs.map} +1 -1
- package/dist/{chunk-EBAPSGAO-eG42tA2r.mjs → chunk-EBAPSGAO-Bq-JthJ5.mjs} +2 -2
- package/dist/{chunk-EBAPSGAO-eG42tA2r.mjs.map → chunk-EBAPSGAO-Bq-JthJ5.mjs.map} +1 -1
- package/dist/{chunk-LEKBROJD-Bnp-la65.mjs → chunk-LEKBROJD-BljEVlAX.mjs} +2 -2
- package/dist/{chunk-LEKBROJD-Bnp-la65.mjs.map → chunk-LEKBROJD-BljEVlAX.mjs.map} +1 -1
- package/dist/{chunk-LEKBROJD-CFSlDKEu.cjs → chunk-LEKBROJD-CYjJVRHn.cjs} +2 -2
- package/dist/{chunk-LEKBROJD-CFSlDKEu.cjs.map → chunk-LEKBROJD-CYjJVRHn.cjs.map} +1 -1
- package/dist/{chunk-VPADYNBD-Un2OQeml.mjs → chunk-VPADYNBD-22xWuTBB.mjs} +2 -2
- package/dist/{chunk-VPADYNBD-Un2OQeml.mjs.map → chunk-VPADYNBD-22xWuTBB.mjs.map} +1 -1
- package/dist/{chunk-VPADYNBD-BGC-BkW2.cjs → chunk-VPADYNBD-BB4ObtpU.cjs} +2 -2
- package/dist/{chunk-VPADYNBD-BGC-BkW2.cjs.map → chunk-VPADYNBD-BB4ObtpU.cjs.map} +1 -1
- package/dist/{chunk-YCLFEX4T-C2ffdKTI.mjs → chunk-YCLFEX4T-BYCz1ce9.mjs} +2 -2
- package/dist/{chunk-YCLFEX4T-C2ffdKTI.mjs.map → chunk-YCLFEX4T-BYCz1ce9.mjs.map} +1 -1
- package/dist/{chunk-YCLFEX4T-DiUi4t4Y.cjs → chunk-YCLFEX4T-BvTNX2Vz.cjs} +2 -2
- package/dist/{chunk-YCLFEX4T-DiUi4t4Y.cjs.map → chunk-YCLFEX4T-BvTNX2Vz.cjs.map} +1 -1
- package/dist/{column-XT6UFXNQ-BOensfuu.mjs → column-XT6UFXNQ-2JxGKnhQ.mjs} +2 -2
- package/dist/{column-XT6UFXNQ-BOensfuu.mjs.map → column-XT6UFXNQ-2JxGKnhQ.mjs.map} +1 -1
- package/dist/{column-XT6UFXNQ-BeOUDpIf.cjs → column-XT6UFXNQ-Dt66NYBA.cjs} +2 -2
- package/dist/{column-XT6UFXNQ-BeOUDpIf.cjs.map → column-XT6UFXNQ-Dt66NYBA.cjs.map} +1 -1
- package/dist/{comm-VV2LDX2J-C7VcIq-K.mjs → comm-VV2LDX2J-BQ4xi5L9.mjs} +2 -2
- package/dist/{comm-VV2LDX2J-C7VcIq-K.mjs.map → comm-VV2LDX2J-BQ4xi5L9.mjs.map} +1 -1
- package/dist/{comm-VV2LDX2J-Ca7AKON3.cjs → comm-VV2LDX2J-C8sq4a_X.cjs} +2 -2
- package/dist/{comm-VV2LDX2J-Ca7AKON3.cjs.map → comm-VV2LDX2J-C8sq4a_X.cjs.map} +1 -1
- package/dist/{config-m9Z87E2p.d.mts → config-4tlyrD1h.d.mts} +28 -2
- package/dist/{config-DmqhoHPA.d.cts → config-DCMtEjGV.d.cts} +28 -2
- package/dist/config.cjs +1 -1
- package/dist/config.d.cts +1 -1
- package/dist/config.d.mts +1 -1
- package/dist/config.mjs +1 -1
- package/dist/{cp-BISAAS7A-HMB8w9Qk.mjs → cp-BISAAS7A-CcMwaVYs.mjs} +2 -2
- package/dist/{cp-BISAAS7A-HMB8w9Qk.mjs.map → cp-BISAAS7A-CcMwaVYs.mjs.map} +1 -1
- package/dist/{cp-BISAAS7A-B9yK_zET.cjs → cp-BISAAS7A-DmZV5f27.cjs} +2 -2
- package/dist/{cp-BISAAS7A-B9yK_zET.cjs.map → cp-BISAAS7A-DmZV5f27.cjs.map} +1 -1
- package/dist/{cut-OKARJCCV-NXtL8aUb.mjs → cut-OKARJCCV-Co4UXF7Y.mjs} +3 -3
- package/dist/{cut-OKARJCCV-NXtL8aUb.mjs.map → cut-OKARJCCV-Co4UXF7Y.mjs.map} +1 -1
- package/dist/{cut-OKARJCCV-qUXIktVO.cjs → cut-OKARJCCV-DwtHdU58.cjs} +3 -3
- package/dist/{cut-OKARJCCV-qUXIktVO.cjs.map → cut-OKARJCCV-DwtHdU58.cjs.map} +1 -1
- package/dist/{diff-MWJFIG7X-BpMQR3bl.cjs → diff-MWJFIG7X-DX6SkQWo.cjs} +2 -2
- package/dist/{diff-MWJFIG7X-BpMQR3bl.cjs.map → diff-MWJFIG7X-DX6SkQWo.cjs.map} +1 -1
- package/dist/{diff-MWJFIG7X-DVUdRi3i.mjs → diff-MWJFIG7X-RORXFtQw.mjs} +2 -2
- package/dist/{diff-MWJFIG7X-DVUdRi3i.mjs.map → diff-MWJFIG7X-RORXFtQw.mjs.map} +1 -1
- package/dist/{dist-BB6Y_75v.mjs → dist-DQZABv1_.mjs} +525 -64
- package/dist/dist-DQZABv1_.mjs.map +1 -0
- package/dist/{dist-BtAOWi5K.cjs → dist-KeJkUQxy.cjs} +542 -63
- package/dist/dist-KeJkUQxy.cjs.map +1 -0
- package/dist/{du-572XNP42-B7Daeoyh.cjs → du-572XNP42-ByLXb5YF.cjs} +2 -2
- package/dist/{du-572XNP42-B7Daeoyh.cjs.map → du-572XNP42-ByLXb5YF.cjs.map} +1 -1
- package/dist/{du-572XNP42-DganHTrH.mjs → du-572XNP42-DJxtt8pO.mjs} +2 -2
- package/dist/{du-572XNP42-DganHTrH.mjs.map → du-572XNP42-DJxtt8pO.mjs.map} +1 -1
- package/dist/{env-36M5BO7M-Dg1z4ZQ3.cjs → env-36M5BO7M-7mpjgw1V.cjs} +2 -2
- package/dist/{env-36M5BO7M-Dg1z4ZQ3.cjs.map → env-36M5BO7M-7mpjgw1V.cjs.map} +1 -1
- package/dist/{env-36M5BO7M-D_E39yfu.mjs → env-36M5BO7M-ZlUW3Sl0.mjs} +2 -2
- package/dist/{env-36M5BO7M-D_E39yfu.mjs.map → env-36M5BO7M-ZlUW3Sl0.mjs.map} +1 -1
- package/dist/{expand-JSPG6VOP-sHoECND6.mjs → expand-JSPG6VOP-B2YxeegL.mjs} +2 -2
- package/dist/{expand-JSPG6VOP-sHoECND6.mjs.map → expand-JSPG6VOP-B2YxeegL.mjs.map} +1 -1
- package/dist/{expand-JSPG6VOP-D2xi4Y-n.cjs → expand-JSPG6VOP-MOAUsgSe.cjs} +2 -2
- package/dist/{expand-JSPG6VOP-D2xi4Y-n.cjs.map → expand-JSPG6VOP-MOAUsgSe.cjs.map} +1 -1
- package/dist/{expr-5JAACS4X-DrJ47AJL.cjs → expr-5JAACS4X-C-wWI5Y2.cjs} +2 -2
- package/dist/{expr-5JAACS4X-DrJ47AJL.cjs.map → expr-5JAACS4X-C-wWI5Y2.cjs.map} +1 -1
- package/dist/{expr-5JAACS4X-gYMEvPyP.mjs → expr-5JAACS4X-DGhrcLeU.mjs} +2 -2
- package/dist/{expr-5JAACS4X-gYMEvPyP.mjs.map → expr-5JAACS4X-DGhrcLeU.mjs.map} +1 -1
- package/dist/{find-INTH3OLC-NNFVNc1H.cjs → find-INTH3OLC-ErDLi_Ak.cjs} +3 -3
- package/dist/{find-INTH3OLC-NNFVNc1H.cjs.map → find-INTH3OLC-ErDLi_Ak.cjs.map} +1 -1
- package/dist/{find-INTH3OLC-dBBPukw9.mjs → find-INTH3OLC-Vzv3utqz.mjs} +3 -3
- package/dist/{find-INTH3OLC-dBBPukw9.mjs.map → find-INTH3OLC-Vzv3utqz.mjs.map} +1 -1
- package/dist/{fold-4TQNYMSW-N0_1Z6_j.mjs → fold-4TQNYMSW-BWKs2Ew0.mjs} +2 -2
- package/dist/{fold-4TQNYMSW-N0_1Z6_j.mjs.map → fold-4TQNYMSW-BWKs2Ew0.mjs.map} +1 -1
- package/dist/{fold-4TQNYMSW-C7ArceGr.cjs → fold-4TQNYMSW-DoBCXtmy.cjs} +2 -2
- package/dist/{fold-4TQNYMSW-C7ArceGr.cjs.map → fold-4TQNYMSW-DoBCXtmy.cjs.map} +1 -1
- package/dist/{grep-V3LQVMRQ-D_s5HB2b.cjs → grep-V3LQVMRQ-BU066j1r.cjs} +4 -4
- package/dist/{grep-V3LQVMRQ-D_s5HB2b.cjs.map → grep-V3LQVMRQ-BU066j1r.cjs.map} +1 -1
- package/dist/{grep-V3LQVMRQ-CN7esn9_.mjs → grep-V3LQVMRQ-Okt1supZ.mjs} +4 -4
- package/dist/{grep-V3LQVMRQ-CN7esn9_.mjs.map → grep-V3LQVMRQ-Okt1supZ.mjs.map} +1 -1
- package/dist/{gzip-O5ASJAFY-BYavGtyV.cjs → gzip-O5ASJAFY-B1FTMMFq.cjs} +2 -2
- package/dist/{gzip-O5ASJAFY-BYavGtyV.cjs.map → gzip-O5ASJAFY-B1FTMMFq.cjs.map} +1 -1
- package/dist/{gzip-O5ASJAFY-tQxmEpj_.mjs → gzip-O5ASJAFY-BUU_FNGK.mjs} +2 -2
- package/dist/{gzip-O5ASJAFY-tQxmEpj_.mjs.map → gzip-O5ASJAFY-BUU_FNGK.mjs.map} +1 -1
- package/dist/{head-442HYESI-Bzlad8f3.mjs → head-442HYESI-CPQWywtB.mjs} +2 -2
- package/dist/{head-442HYESI-Bzlad8f3.mjs.map → head-442HYESI-CPQWywtB.mjs.map} +1 -1
- package/dist/{head-442HYESI-Du4OHag6.cjs → head-442HYESI-DeLkuG8l.cjs} +2 -2
- package/dist/{head-442HYESI-Du4OHag6.cjs.map → head-442HYESI-DeLkuG8l.cjs.map} +1 -1
- package/dist/{help-HZ6M2CKN-DxQhQLup.cjs → help-HZ6M2CKN-CACYSgeV.cjs} +2 -2
- package/dist/{help-HZ6M2CKN-DxQhQLup.cjs.map → help-HZ6M2CKN-CACYSgeV.cjs.map} +1 -1
- package/dist/{help-HZ6M2CKN-DMr18xJE.mjs → help-HZ6M2CKN-Si2t7kXA.mjs} +2 -2
- package/dist/{help-HZ6M2CKN-DMr18xJE.mjs.map → help-HZ6M2CKN-Si2t7kXA.mjs.map} +1 -1
- package/dist/{html-to-markdown-JW4MSQZO-BZFKTpVV.cjs → html-to-markdown-JW4MSQZO-BnrGqsni.cjs} +3 -3
- package/dist/{html-to-markdown-JW4MSQZO-BZFKTpVV.cjs.map → html-to-markdown-JW4MSQZO-BnrGqsni.cjs.map} +1 -1
- package/dist/{html-to-markdown-JW4MSQZO-ByplyNhg.mjs → html-to-markdown-JW4MSQZO-yPkAOM4T.mjs} +3 -3
- package/dist/{html-to-markdown-JW4MSQZO-ByplyNhg.mjs.map → html-to-markdown-JW4MSQZO-yPkAOM4T.mjs.map} +1 -1
- package/dist/internal.cjs +1 -1
- package/dist/internal.mjs +1 -1
- package/dist/{join-TBRGI3LQ-BJnYqeRE.cjs → join-TBRGI3LQ-BK0v7LDZ.cjs} +2 -2
- package/dist/{join-TBRGI3LQ-BJnYqeRE.cjs.map → join-TBRGI3LQ-BK0v7LDZ.cjs.map} +1 -1
- package/dist/{join-TBRGI3LQ-zQYqJlyJ.mjs → join-TBRGI3LQ-C3eqxR8J.mjs} +2 -2
- package/dist/{join-TBRGI3LQ-zQYqJlyJ.mjs.map → join-TBRGI3LQ-C3eqxR8J.mjs.map} +1 -1
- package/dist/{jq-4XLYLOS5-DyYnnhSj.cjs → jq-4XLYLOS5-BPgpTkTX.cjs} +4 -4
- package/dist/{jq-4XLYLOS5-DyYnnhSj.cjs.map → jq-4XLYLOS5-BPgpTkTX.cjs.map} +1 -1
- package/dist/{jq-4XLYLOS5-rVnHaS8d.mjs → jq-4XLYLOS5-DOiIyV4r.mjs} +4 -4
- package/dist/{jq-4XLYLOS5-rVnHaS8d.mjs.map → jq-4XLYLOS5-DOiIyV4r.mjs.map} +1 -1
- package/dist/{js-exec-N5KEZBH7-BS33g5Vz.cjs → js-exec-N5KEZBH7-6a2l4HY0.cjs} +3 -3
- package/dist/{js-exec-N5KEZBH7-BS33g5Vz.cjs.map → js-exec-N5KEZBH7-6a2l4HY0.cjs.map} +1 -1
- package/dist/{js-exec-N5KEZBH7-CelGB_A8.mjs → js-exec-N5KEZBH7-BB3hczF6.mjs} +3 -3
- package/dist/{js-exec-N5KEZBH7-CelGB_A8.mjs.map → js-exec-N5KEZBH7-BB3hczF6.mjs.map} +1 -1
- package/dist/{lib-BtuXCD2W.cjs → lib-CYQ_gA3u.cjs} +2 -2
- package/dist/{lib-BtuXCD2W.cjs.map → lib-CYQ_gA3u.cjs.map} +1 -1
- package/dist/{lib-_5zrQvIo.mjs → lib-CcVWhxFS.mjs} +2 -2
- package/dist/{lib-_5zrQvIo.mjs.map → lib-CcVWhxFS.mjs.map} +1 -1
- package/dist/{ln-4LGSXXGD-DCuMyx3a.mjs → ln-4LGSXXGD-BGCw3j2u.mjs} +2 -2
- package/dist/{ln-4LGSXXGD-DCuMyx3a.mjs.map → ln-4LGSXXGD-BGCw3j2u.mjs.map} +1 -1
- package/dist/{ln-4LGSXXGD-BjitMbox.cjs → ln-4LGSXXGD-Cq6RmKEo.cjs} +2 -2
- package/dist/{ln-4LGSXXGD-BjitMbox.cjs.map → ln-4LGSXXGD-Cq6RmKEo.cjs.map} +1 -1
- package/dist/{ls-ZJGQER7M-CsKopKVX.cjs → ls-ZJGQER7M-CJuMmb9p.cjs} +2 -2
- package/dist/{ls-ZJGQER7M-CsKopKVX.cjs.map → ls-ZJGQER7M-CJuMmb9p.cjs.map} +1 -1
- package/dist/{ls-ZJGQER7M-ByYf3Vxj.mjs → ls-ZJGQER7M-CSzmMPVo.mjs} +2 -2
- package/dist/{ls-ZJGQER7M-ByYf3Vxj.mjs.map → ls-ZJGQER7M-CSzmMPVo.mjs.map} +1 -1
- package/dist/{lzma-_kmNWjFB.cjs → lzma-BaLt2cZv.cjs} +3 -3
- package/dist/{lzma-_kmNWjFB.cjs.map → lzma-BaLt2cZv.cjs.map} +1 -1
- package/dist/{lzma-DtV0zx4R.mjs → lzma-d7Yy7VcZ.mjs} +2 -2
- package/dist/{lzma-DtV0zx4R.mjs.map → lzma-d7Yy7VcZ.mjs.map} +1 -1
- package/dist/{md5sum-SPU24VSG-jewPBR38.cjs → md5sum-SPU24VSG-BL6W95eE.cjs} +3 -3
- package/dist/{md5sum-SPU24VSG-jewPBR38.cjs.map → md5sum-SPU24VSG-BL6W95eE.cjs.map} +1 -1
- package/dist/{md5sum-SPU24VSG-R7dHHfV4.mjs → md5sum-SPU24VSG-CIeUFHdK.mjs} +3 -3
- package/dist/{md5sum-SPU24VSG-R7dHHfV4.mjs.map → md5sum-SPU24VSG-CIeUFHdK.mjs.map} +1 -1
- package/dist/{mkdir-MEPGZOB6-DNmJhnvS.cjs → mkdir-MEPGZOB6-BZyyoaAf.cjs} +2 -2
- package/dist/{mkdir-MEPGZOB6-DNmJhnvS.cjs.map → mkdir-MEPGZOB6-BZyyoaAf.cjs.map} +1 -1
- package/dist/{mkdir-MEPGZOB6-BQe4XS_e.mjs → mkdir-MEPGZOB6-MgHictKj.mjs} +2 -2
- package/dist/{mkdir-MEPGZOB6-BQe4XS_e.mjs.map → mkdir-MEPGZOB6-MgHictKj.mjs.map} +1 -1
- package/dist/{mv-W5BIQ646-BorqaWWj.mjs → mv-W5BIQ646-CP9-vF4_.mjs} +2 -2
- package/dist/{mv-W5BIQ646-BorqaWWj.mjs.map → mv-W5BIQ646-CP9-vF4_.mjs.map} +1 -1
- package/dist/{mv-W5BIQ646-BsbfENE0.cjs → mv-W5BIQ646-dwb25lDI.cjs} +2 -2
- package/dist/{mv-W5BIQ646-BsbfENE0.cjs.map → mv-W5BIQ646-dwb25lDI.cjs.map} +1 -1
- package/dist/{nl-WSDW7I4O-DMfjYou-.cjs → nl-WSDW7I4O-C7rZxzPm.cjs} +2 -2
- package/dist/{nl-WSDW7I4O-DMfjYou-.cjs.map → nl-WSDW7I4O-C7rZxzPm.cjs.map} +1 -1
- package/dist/{nl-WSDW7I4O-uNIqSVeW.mjs → nl-WSDW7I4O-SXX_wp28.mjs} +2 -2
- package/dist/{nl-WSDW7I4O-uNIqSVeW.mjs.map → nl-WSDW7I4O-SXX_wp28.mjs.map} +1 -1
- package/dist/{od-WOKFDJTP-DOW6faUi.cjs → od-WOKFDJTP-CDFKqUJg.cjs} +2 -2
- package/dist/{od-WOKFDJTP-DOW6faUi.cjs.map → od-WOKFDJTP-CDFKqUJg.cjs.map} +1 -1
- package/dist/{od-WOKFDJTP-KhZEaBTC.mjs → od-WOKFDJTP-DyqUJY9V.mjs} +2 -2
- package/dist/{od-WOKFDJTP-KhZEaBTC.mjs.map → od-WOKFDJTP-DyqUJY9V.mjs.map} +1 -1
- package/dist/{paste-7JC6S4DX-B7D3kyRf.cjs → paste-7JC6S4DX-4vBMkbXu.cjs} +2 -2
- package/dist/{paste-7JC6S4DX-B7D3kyRf.cjs.map → paste-7JC6S4DX-4vBMkbXu.cjs.map} +1 -1
- package/dist/{paste-7JC6S4DX-DOEPGmaJ.mjs → paste-7JC6S4DX-yV2mN3Xi.mjs} +2 -2
- package/dist/{paste-7JC6S4DX-DOEPGmaJ.mjs.map → paste-7JC6S4DX-yV2mN3Xi.mjs.map} +1 -1
- package/dist/{printf-TWGXF445-BgY14UrZ.mjs → printf-TWGXF445-AG6ZxuUM.mjs} +3 -3
- package/dist/{printf-TWGXF445-BgY14UrZ.mjs.map → printf-TWGXF445-AG6ZxuUM.mjs.map} +1 -1
- package/dist/{printf-TWGXF445-MddJu1yx.cjs → printf-TWGXF445-BGeZYMde.cjs} +3 -3
- package/dist/{printf-TWGXF445-MddJu1yx.cjs.map → printf-TWGXF445-BGeZYMde.cjs.map} +1 -1
- package/dist/{python3-POMOR4OA-BwDdQ_I-.mjs → python3-POMOR4OA-BClYVovb.mjs} +3 -3
- package/dist/{python3-POMOR4OA-BwDdQ_I-.mjs.map → python3-POMOR4OA-BClYVovb.mjs.map} +1 -1
- package/dist/{python3-POMOR4OA-DXoihZl6.cjs → python3-POMOR4OA-CXiSd1gN.cjs} +3 -3
- package/dist/{python3-POMOR4OA-DXoihZl6.cjs.map → python3-POMOR4OA-CXiSd1gN.cjs.map} +1 -1
- package/dist/{rev-5EHFX4EJ-CMoRCR7l.mjs → rev-5EHFX4EJ-B82WG1Lv.mjs} +2 -2
- package/dist/{rev-5EHFX4EJ-CMoRCR7l.mjs.map → rev-5EHFX4EJ-B82WG1Lv.mjs.map} +1 -1
- package/dist/{rev-5EHFX4EJ-C0tEUAtq.cjs → rev-5EHFX4EJ-DIjd9v_Q.cjs} +2 -2
- package/dist/{rev-5EHFX4EJ-C0tEUAtq.cjs.map → rev-5EHFX4EJ-DIjd9v_Q.cjs.map} +1 -1
- package/dist/{rg-S4FXYXWB-BnlBncIg.cjs → rg-S4FXYXWB-ApQWE_EG.cjs} +3 -3
- package/dist/{rg-S4FXYXWB-BnlBncIg.cjs.map → rg-S4FXYXWB-ApQWE_EG.cjs.map} +1 -1
- package/dist/{rg-S4FXYXWB-CIJXVbGY.mjs → rg-S4FXYXWB-CyeQeN6m.mjs} +3 -3
- package/dist/{rg-S4FXYXWB-CIJXVbGY.mjs.map → rg-S4FXYXWB-CyeQeN6m.mjs.map} +1 -1
- package/dist/{rm-SSGETQVQ-ZisaZPqB.cjs → rm-SSGETQVQ-C9JTViwB.cjs} +2 -2
- package/dist/{rm-SSGETQVQ-ZisaZPqB.cjs.map → rm-SSGETQVQ-C9JTViwB.cjs.map} +1 -1
- package/dist/{rm-SSGETQVQ-Ba0g_xkF.mjs → rm-SSGETQVQ-LQ0RrYWT.mjs} +2 -2
- package/dist/{rm-SSGETQVQ-Ba0g_xkF.mjs.map → rm-SSGETQVQ-LQ0RrYWT.mjs.map} +1 -1
- package/dist/{rmdir-OC4ZLPYA-CaFxfYPV.cjs → rmdir-OC4ZLPYA-BjJEGyWy.cjs} +2 -2
- package/dist/{rmdir-OC4ZLPYA-CaFxfYPV.cjs.map → rmdir-OC4ZLPYA-BjJEGyWy.cjs.map} +1 -1
- package/dist/{rmdir-OC4ZLPYA-DhtkbSLr.mjs → rmdir-OC4ZLPYA-j7rpYv9w.mjs} +2 -2
- package/dist/{rmdir-OC4ZLPYA-DhtkbSLr.mjs.map → rmdir-OC4ZLPYA-j7rpYv9w.mjs.map} +1 -1
- package/dist/run.cjs +1 -1
- package/dist/run.mjs +1 -1
- package/dist/{sed-S5UIK574-Dg9RxQ3I.cjs → sed-S5UIK574-BKjIhqZC.cjs} +2 -2
- package/dist/{sed-S5UIK574-Dg9RxQ3I.cjs.map → sed-S5UIK574-BKjIhqZC.cjs.map} +1 -1
- package/dist/{sed-S5UIK574-BYyLDVp9.mjs → sed-S5UIK574-J74NTjfC.mjs} +2 -2
- package/dist/{sed-S5UIK574-BYyLDVp9.mjs.map → sed-S5UIK574-J74NTjfC.mjs.map} +1 -1
- package/dist/{sha1sum-2PTOAFR6-1lWZQvKU.mjs → sha1sum-2PTOAFR6-IP0cr9Nk.mjs} +3 -3
- package/dist/{sha1sum-2PTOAFR6-1lWZQvKU.mjs.map → sha1sum-2PTOAFR6-IP0cr9Nk.mjs.map} +1 -1
- package/dist/{sha1sum-2PTOAFR6-BPmv6rQj.cjs → sha1sum-2PTOAFR6-MSflYn0r.cjs} +3 -3
- package/dist/{sha1sum-2PTOAFR6-BPmv6rQj.cjs.map → sha1sum-2PTOAFR6-MSflYn0r.cjs.map} +1 -1
- package/dist/{sha256sum-NS7D3IXX-DtuuyUn8.cjs → sha256sum-NS7D3IXX-8-O3yDRg.cjs} +3 -3
- package/dist/{sha256sum-NS7D3IXX-DtuuyUn8.cjs.map → sha256sum-NS7D3IXX-8-O3yDRg.cjs.map} +1 -1
- package/dist/{sha256sum-NS7D3IXX-wQgC_9TD.mjs → sha256sum-NS7D3IXX-B83KYuY_.mjs} +3 -3
- package/dist/{sha256sum-NS7D3IXX-wQgC_9TD.mjs.map → sha256sum-NS7D3IXX-B83KYuY_.mjs.map} +1 -1
- package/dist/{sleep-X22JJINO-CpWhcnde.cjs → sleep-X22JJINO-CdKETYgR.cjs} +2 -2
- package/dist/{sleep-X22JJINO-CpWhcnde.cjs.map → sleep-X22JJINO-CdKETYgR.cjs.map} +1 -1
- package/dist/{sleep-X22JJINO-DAN0H6x8.mjs → sleep-X22JJINO-YTG2e9mJ.mjs} +2 -2
- package/dist/{sleep-X22JJINO-DAN0H6x8.mjs.map → sleep-X22JJINO-YTG2e9mJ.mjs.map} +1 -1
- package/dist/{sort-SW2YEO5B-BrAbgeh7.mjs → sort-SW2YEO5B-CbPi6K24.mjs} +3 -3
- package/dist/{sort-SW2YEO5B-BrAbgeh7.mjs.map → sort-SW2YEO5B-CbPi6K24.mjs.map} +1 -1
- package/dist/{sort-SW2YEO5B-rDpnVZhF.cjs → sort-SW2YEO5B-Cum9z2a8.cjs} +3 -3
- package/dist/{sort-SW2YEO5B-rDpnVZhF.cjs.map → sort-SW2YEO5B-Cum9z2a8.cjs.map} +1 -1
- package/dist/{split-4KKZZXXE-BPiXrXbG.mjs → split-4KKZZXXE-CKGhHIFM.mjs} +2 -2
- package/dist/{split-4KKZZXXE-BPiXrXbG.mjs.map → split-4KKZZXXE-CKGhHIFM.mjs.map} +1 -1
- package/dist/{split-4KKZZXXE-DWMRSG1h.cjs → split-4KKZZXXE-fz33ycN2.cjs} +2 -2
- package/dist/{split-4KKZZXXE-DWMRSG1h.cjs.map → split-4KKZZXXE-fz33ycN2.cjs.map} +1 -1
- package/dist/{sqlite3-CGOEFJAO-Dw3Z8yEh.mjs → sqlite3-CGOEFJAO-CZRp6vSh.mjs} +3 -3
- package/dist/{sqlite3-CGOEFJAO-Dw3Z8yEh.mjs.map → sqlite3-CGOEFJAO-CZRp6vSh.mjs.map} +1 -1
- package/dist/{sqlite3-CGOEFJAO-CoAwi92j.cjs → sqlite3-CGOEFJAO-GnOOhzcu.cjs} +3 -3
- package/dist/{sqlite3-CGOEFJAO-CoAwi92j.cjs.map → sqlite3-CGOEFJAO-GnOOhzcu.cjs.map} +1 -1
- package/dist/{start-CXfv1wyL.cjs → start-BDCUU_Ry.cjs} +232 -233
- package/dist/start-BDCUU_Ry.cjs.map +1 -0
- package/dist/{start-Dyqmdghh.mjs → start-CJs5Jmpv.mjs} +233 -234
- package/dist/start-CJs5Jmpv.mjs.map +1 -0
- package/dist/start.cjs +1 -1
- package/dist/start.d.cts +1 -1
- package/dist/start.d.mts +1 -1
- package/dist/start.mjs +1 -1
- package/dist/{strings-6WDHLGMX-CxvuK0mi.mjs → strings-6WDHLGMX-CRYfEQoM.mjs} +2 -2
- package/dist/{strings-6WDHLGMX-CxvuK0mi.mjs.map → strings-6WDHLGMX-CRYfEQoM.mjs.map} +1 -1
- package/dist/{strings-6WDHLGMX-Dhb8yDLC.cjs → strings-6WDHLGMX-_709peER.cjs} +2 -2
- package/dist/{strings-6WDHLGMX-Dhb8yDLC.cjs.map → strings-6WDHLGMX-_709peER.cjs.map} +1 -1
- package/dist/{tac-2STMMJYW-BFmTtfPi.cjs → tac-2STMMJYW-DaTzHJTH.cjs} +2 -2
- package/dist/{tac-2STMMJYW-BFmTtfPi.cjs.map → tac-2STMMJYW-DaTzHJTH.cjs.map} +1 -1
- package/dist/{tac-2STMMJYW-D98V7DHS.mjs → tac-2STMMJYW-Dfi2Vjmr.mjs} +2 -2
- package/dist/{tac-2STMMJYW-D98V7DHS.mjs.map → tac-2STMMJYW-Dfi2Vjmr.mjs.map} +1 -1
- package/dist/{tail-R4PCA2C4-4wnLsL5b.cjs → tail-R4PCA2C4-C4F7cpls.cjs} +2 -2
- package/dist/{tail-R4PCA2C4-4wnLsL5b.cjs.map → tail-R4PCA2C4-C4F7cpls.cjs.map} +1 -1
- package/dist/{tail-R4PCA2C4-Bu6_miEK.mjs → tail-R4PCA2C4-kxwztnN6.mjs} +2 -2
- package/dist/{tail-R4PCA2C4-Bu6_miEK.mjs.map → tail-R4PCA2C4-kxwztnN6.mjs.map} +1 -1
- package/dist/{tar-STHHZTZ6-CI536ZUL.mjs → tar-STHHZTZ6-ClyyrPcY.mjs} +5 -5
- package/dist/{tar-STHHZTZ6-CI536ZUL.mjs.map → tar-STHHZTZ6-ClyyrPcY.mjs.map} +1 -1
- package/dist/{tar-STHHZTZ6-B7s0JAEv.cjs → tar-STHHZTZ6-D5iu_ftt.cjs} +5 -5
- package/dist/{tar-STHHZTZ6-B7s0JAEv.cjs.map → tar-STHHZTZ6-D5iu_ftt.cjs.map} +1 -1
- package/dist/{tee-YUZ2FKCJ-gBEgGJ5c.cjs → tee-YUZ2FKCJ-Cwpyu4z6.cjs} +2 -2
- package/dist/{tee-YUZ2FKCJ-gBEgGJ5c.cjs.map → tee-YUZ2FKCJ-Cwpyu4z6.cjs.map} +1 -1
- package/dist/{tee-YUZ2FKCJ-CSJtUwl1.mjs → tee-YUZ2FKCJ-DwiX9lOR.mjs} +2 -2
- package/dist/{tee-YUZ2FKCJ-CSJtUwl1.mjs.map → tee-YUZ2FKCJ-DwiX9lOR.mjs.map} +1 -1
- package/dist/{time-D4LNBSWX-BXweubfY.cjs → time-D4LNBSWX-Crz6IS_Y.cjs} +2 -2
- package/dist/{time-D4LNBSWX-BXweubfY.cjs.map → time-D4LNBSWX-Crz6IS_Y.cjs.map} +1 -1
- package/dist/{time-D4LNBSWX-CmK5D5j8.mjs → time-D4LNBSWX-DCUHnjK8.mjs} +2 -2
- package/dist/{time-D4LNBSWX-CmK5D5j8.mjs.map → time-D4LNBSWX-DCUHnjK8.mjs.map} +1 -1
- package/dist/{timeout-YDCRSLPQ-B5hVfG7d.cjs → timeout-YDCRSLPQ-DDd3NRW_.cjs} +2 -2
- package/dist/{timeout-YDCRSLPQ-B5hVfG7d.cjs.map → timeout-YDCRSLPQ-DDd3NRW_.cjs.map} +1 -1
- package/dist/{timeout-YDCRSLPQ-p3LY8vYu.mjs → timeout-YDCRSLPQ-DcWnNYBb.mjs} +2 -2
- package/dist/{timeout-YDCRSLPQ-p3LY8vYu.mjs.map → timeout-YDCRSLPQ-DcWnNYBb.mjs.map} +1 -1
- package/dist/{touch-UA33VN3N-XzfqX6Xj.mjs → touch-UA33VN3N-B2XLBEia.mjs} +2 -2
- package/dist/{touch-UA33VN3N-XzfqX6Xj.mjs.map → touch-UA33VN3N-B2XLBEia.mjs.map} +1 -1
- package/dist/{touch-UA33VN3N-Cxjf6mOi.cjs → touch-UA33VN3N-qa2uKr61.cjs} +2 -2
- package/dist/{touch-UA33VN3N-Cxjf6mOi.cjs.map → touch-UA33VN3N-qa2uKr61.cjs.map} +1 -1
- package/dist/{tr-36LHWFRQ-Bj7MhSYO.cjs → tr-36LHWFRQ-CGKncf0e.cjs} +2 -2
- package/dist/{tr-36LHWFRQ-Bj7MhSYO.cjs.map → tr-36LHWFRQ-CGKncf0e.cjs.map} +1 -1
- package/dist/{tr-36LHWFRQ-BeW3mxZ0.mjs → tr-36LHWFRQ-qB7RaGkH.mjs} +2 -2
- package/dist/{tr-36LHWFRQ-BeW3mxZ0.mjs.map → tr-36LHWFRQ-qB7RaGkH.mjs.map} +1 -1
- package/dist/{tree-YLD52CNT-Bw83zmWP.mjs → tree-YLD52CNT-CSDgMp-S.mjs} +2 -2
- package/dist/{tree-YLD52CNT-Bw83zmWP.mjs.map → tree-YLD52CNT-CSDgMp-S.mjs.map} +1 -1
- package/dist/{tree-YLD52CNT-BifusHMT.cjs → tree-YLD52CNT-DCaIk200.cjs} +2 -2
- package/dist/{tree-YLD52CNT-BifusHMT.cjs.map → tree-YLD52CNT-DCaIk200.cjs.map} +1 -1
- package/dist/{unexpand-CADSA4VO-DCxmAQHt.mjs → unexpand-CADSA4VO-OXSW5LXB.mjs} +2 -2
- package/dist/{unexpand-CADSA4VO-DCxmAQHt.mjs.map → unexpand-CADSA4VO-OXSW5LXB.mjs.map} +1 -1
- package/dist/{unexpand-CADSA4VO-CJANgVRy.cjs → unexpand-CADSA4VO-Y0YxuYnQ.cjs} +2 -2
- package/dist/{unexpand-CADSA4VO-CJANgVRy.cjs.map → unexpand-CADSA4VO-Y0YxuYnQ.cjs.map} +1 -1
- package/dist/{uniq-XSIZR6PB-0UT5akN_.cjs → uniq-XSIZR6PB-CUquOIDK.cjs} +3 -3
- package/dist/{uniq-XSIZR6PB-0UT5akN_.cjs.map → uniq-XSIZR6PB-CUquOIDK.cjs.map} +1 -1
- package/dist/{uniq-XSIZR6PB-KlGH94Ga.mjs → uniq-XSIZR6PB-CddB2OBC.mjs} +3 -3
- package/dist/{uniq-XSIZR6PB-KlGH94Ga.mjs.map → uniq-XSIZR6PB-CddB2OBC.mjs.map} +1 -1
- package/dist/{wc-LF7NU4LA-QvPk1zKo.cjs → wc-LF7NU4LA-CpWeSthu.cjs} +3 -3
- package/dist/{wc-LF7NU4LA-QvPk1zKo.cjs.map → wc-LF7NU4LA-CpWeSthu.cjs.map} +1 -1
- package/dist/{wc-LF7NU4LA-B_-ng-Qd.mjs → wc-LF7NU4LA-wLql_W1c.mjs} +3 -3
- package/dist/{wc-LF7NU4LA-B_-ng-Qd.mjs.map → wc-LF7NU4LA-wLql_W1c.mjs.map} +1 -1
- package/dist/{with-project-scope-BSsArVUs.cjs → with-project-scope-Cz_Tmvau.cjs} +3 -6
- package/dist/with-project-scope-Cz_Tmvau.cjs.map +1 -0
- package/dist/{with-project-scope-C6gaaB04.mjs → with-project-scope-DWwbN8Qs.mjs} +4 -7
- package/dist/with-project-scope-DWwbN8Qs.mjs.map +1 -0
- package/dist/{xan-Y6WF3IRG-DHhphzLb.cjs → xan-Y6WF3IRG-BTAFHcaS.cjs} +6 -6
- package/dist/{xan-Y6WF3IRG-DHhphzLb.cjs.map → xan-Y6WF3IRG-BTAFHcaS.cjs.map} +1 -1
- package/dist/{xan-Y6WF3IRG-BXWEZVur.mjs → xan-Y6WF3IRG-DN5T5LS5.mjs} +6 -6
- package/dist/{xan-Y6WF3IRG-BXWEZVur.mjs.map → xan-Y6WF3IRG-DN5T5LS5.mjs.map} +1 -1
- package/dist/{xan-view-HDVKHFC2-WPJFqBbO.mjs → xan-view-HDVKHFC2-BQQBGxmS.mjs} +3 -3
- package/dist/{xan-view-HDVKHFC2-WPJFqBbO.mjs.map → xan-view-HDVKHFC2-BQQBGxmS.mjs.map} +1 -1
- package/dist/{xan-view-HDVKHFC2-C1H88LhM.cjs → xan-view-HDVKHFC2-CgL1WiSa.cjs} +3 -3
- package/dist/{xan-view-HDVKHFC2-C1H88LhM.cjs.map → xan-view-HDVKHFC2-CgL1WiSa.cjs.map} +1 -1
- package/dist/{xargs-MGZPH7AX-C_1kQIIR.mjs → xargs-MGZPH7AX-B1z5_213.mjs} +2 -2
- package/dist/{xargs-MGZPH7AX-C_1kQIIR.mjs.map → xargs-MGZPH7AX-B1z5_213.mjs.map} +1 -1
- package/dist/{xargs-MGZPH7AX-D0x1uJ2C.cjs → xargs-MGZPH7AX-D7LS1Gf3.cjs} +2 -2
- package/dist/{xargs-MGZPH7AX-D0x1uJ2C.cjs.map → xargs-MGZPH7AX-D7LS1Gf3.cjs.map} +1 -1
- package/dist/{yq-4QJW3EQG-CVOgQbCg.cjs → yq-4QJW3EQG-CiIzl_ob.cjs} +3 -3
- package/dist/{yq-4QJW3EQG-CVOgQbCg.cjs.map → yq-4QJW3EQG-CiIzl_ob.cjs.map} +1 -1
- package/dist/{yq-4QJW3EQG-BGn4IxWd.mjs → yq-4QJW3EQG-D6NJ7PX1.mjs} +3 -3
- package/dist/{yq-4QJW3EQG-BGn4IxWd.mjs.map → yq-4QJW3EQG-D6NJ7PX1.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/dist-BB6Y_75v.mjs.map +0 -1
- package/dist/dist-BtAOWi5K.cjs.map +0 -1
- package/dist/start-CXfv1wyL.cjs.map +0 -1
- package/dist/start-Dyqmdghh.mjs.map +0 -1
- package/dist/with-project-scope-BSsArVUs.cjs.map +0 -1
- package/dist/with-project-scope-C6gaaB04.mjs.map +0 -1
|
@@ -25,6 +25,8 @@ let dockerode = require("dockerode");
|
|
|
25
25
|
dockerode = __toESM(dockerode, 1);
|
|
26
26
|
let node_fs_promises = require("node:fs/promises");
|
|
27
27
|
let _keystrokehq_database = require("@keystrokehq/database");
|
|
28
|
+
let node_events = require("node:events");
|
|
29
|
+
node_events = __toESM(node_events, 1);
|
|
28
30
|
let zod = require("zod");
|
|
29
31
|
let node_async_hooks = require("node:async_hooks");
|
|
30
32
|
let _keystrokehq_platform_database = require("@keystrokehq/platform-database");
|
|
@@ -37,8 +39,6 @@ zod_v4 = __toESM(zod_v4, 1);
|
|
|
37
39
|
let node_process = require("node:process");
|
|
38
40
|
node_process = __toESM(node_process, 1);
|
|
39
41
|
require("node:stream");
|
|
40
|
-
let node_events = require("node:events");
|
|
41
|
-
node_events = __toESM(node_events, 1);
|
|
42
42
|
let node_assert = require("node:assert");
|
|
43
43
|
node_assert = __toESM(node_assert, 1);
|
|
44
44
|
let node_timers_promises = require("node:timers/promises");
|
|
@@ -5276,18 +5276,19 @@ object({
|
|
|
5276
5276
|
source: _enum([
|
|
5277
5277
|
"custom",
|
|
5278
5278
|
"mcp",
|
|
5279
|
-
"openapi"
|
|
5279
|
+
"openapi",
|
|
5280
|
+
"graphql"
|
|
5280
5281
|
]).default("custom"),
|
|
5281
|
-
|
|
5282
|
+
url: string().url().optional(),
|
|
5282
5283
|
authKind: AppAuthKindSchema$1.optional(),
|
|
5283
5284
|
fields: optionalCredentialFieldsSchema$1.optional(),
|
|
5284
5285
|
credentialScheme: AppCredentialSchemeSchema$1.optional(),
|
|
5285
5286
|
oauthScopes: array(OAuthScopeOptionSchema$1).optional()
|
|
5286
5287
|
}).superRefine((data, ctx) => {
|
|
5287
|
-
if (data.source === "mcp" && !data.
|
|
5288
|
+
if ((data.source === "mcp" || data.source === "openapi" || data.source === "graphql") && !data.url) ctx.addIssue({
|
|
5288
5289
|
code: "custom",
|
|
5289
|
-
message: "
|
|
5290
|
-
path: ["
|
|
5290
|
+
message: "url is required for this app source",
|
|
5291
|
+
path: ["url"]
|
|
5291
5292
|
});
|
|
5292
5293
|
if (!(data.authKind ?? (data.source === "custom" ? "api_key" : void 0))) {
|
|
5293
5294
|
ctx.addIssue({
|
|
@@ -5313,7 +5314,7 @@ object({
|
|
|
5313
5314
|
category: string().min(1),
|
|
5314
5315
|
authKind: AppAuthKindSchema$1,
|
|
5315
5316
|
source: AppSourceSchema$1,
|
|
5316
|
-
|
|
5317
|
+
url: string().url().nullable().optional(),
|
|
5317
5318
|
credentialFields: optionalCredentialFieldsSchema$1.optional(),
|
|
5318
5319
|
credentialScheme: AppCredentialSchemeSchema$1.optional(),
|
|
5319
5320
|
oauthScopes: array(OAuthScopeOptionSchema$1).optional(),
|
|
@@ -5333,7 +5334,7 @@ object({
|
|
|
5333
5334
|
source: AppSourceSchema$1,
|
|
5334
5335
|
credentialFields: AppCredentialFieldsSchema$1.optional(),
|
|
5335
5336
|
credentialScheme: AppCredentialSchemeSchema$1.optional(),
|
|
5336
|
-
|
|
5337
|
+
url: string().url().nullable().optional(),
|
|
5337
5338
|
createdAt: string().min(1),
|
|
5338
5339
|
updatedAt: string().min(1)
|
|
5339
5340
|
});
|
|
@@ -5352,8 +5353,8 @@ object({
|
|
|
5352
5353
|
credentialFields: AppCredentialFieldsSchema$1.optional(),
|
|
5353
5354
|
/** Composio auth scheme when credentialFields are present. */
|
|
5354
5355
|
credentialScheme: AppCredentialSchemeSchema$1.optional(),
|
|
5355
|
-
/**
|
|
5356
|
-
|
|
5356
|
+
/** Endpoint URL for MCP, OpenAPI, or GraphQL custom apps. */
|
|
5357
|
+
url: string().url().nullable().optional(),
|
|
5357
5358
|
/** When present, the app supports agent gateway bindings (external channels). */
|
|
5358
5359
|
gateway: AppGatewaySchema$1.optional()
|
|
5359
5360
|
});
|
|
@@ -5387,7 +5388,7 @@ object({
|
|
|
5387
5388
|
credentialFields: record(string(), AppCredentialFieldSchema$1).optional(),
|
|
5388
5389
|
credentialScheme: AppCredentialSchemeSchema$1.optional(),
|
|
5389
5390
|
oauthScopes: array(OAuthScopeOptionSchema$1),
|
|
5390
|
-
|
|
5391
|
+
url: string().url(),
|
|
5391
5392
|
oauth: McpAuthProbeOAuthSchema$1.optional(),
|
|
5392
5393
|
serverName: string().optional(),
|
|
5393
5394
|
serverDescription: string().optional()
|
|
@@ -5411,7 +5412,21 @@ object({
|
|
|
5411
5412
|
credentialFields: record(string(), AppCredentialFieldSchema$1).optional(),
|
|
5412
5413
|
credentialScheme: AppCredentialSchemeSchema$1.optional(),
|
|
5413
5414
|
oauthScopes: array(OAuthScopeOptionSchema$1),
|
|
5414
|
-
|
|
5415
|
+
url: string().url(),
|
|
5416
|
+
name: string().optional(),
|
|
5417
|
+
description: string().optional(),
|
|
5418
|
+
homepageUrl: string().optional()
|
|
5419
|
+
})
|
|
5420
|
+
});
|
|
5421
|
+
object({ url: string().url() });
|
|
5422
|
+
object({
|
|
5423
|
+
detected: boolean(),
|
|
5424
|
+
template: object({
|
|
5425
|
+
authKind: AppAuthKindSchema$1,
|
|
5426
|
+
credentialFields: record(string(), AppCredentialFieldSchema$1).optional(),
|
|
5427
|
+
credentialScheme: AppCredentialSchemeSchema$1.optional(),
|
|
5428
|
+
oauthScopes: array(OAuthScopeOptionSchema$1),
|
|
5429
|
+
url: string().url(),
|
|
5415
5430
|
name: string().optional(),
|
|
5416
5431
|
description: string().optional(),
|
|
5417
5432
|
homepageUrl: string().optional()
|
|
@@ -6975,11 +6990,11 @@ async function waitForHealth(baseUrl, options = {}) {
|
|
|
6975
6990
|
try {
|
|
6976
6991
|
if ((await fetchImpl(url, { signal: AbortSignal.timeout(2e3) })).ok) return;
|
|
6977
6992
|
} catch {}
|
|
6978
|
-
await sleep$
|
|
6993
|
+
await sleep$2(intervalMs);
|
|
6979
6994
|
}
|
|
6980
6995
|
throw new Error(`Project server health check timed out after ${timeoutMs}ms (${url})`);
|
|
6981
6996
|
}
|
|
6982
|
-
function sleep$
|
|
6997
|
+
function sleep$2(ms) {
|
|
6983
6998
|
return new Promise((resolve) => {
|
|
6984
6999
|
setTimeout(resolve, ms);
|
|
6985
7000
|
});
|
|
@@ -8713,18 +8728,19 @@ const CreateCustomAppRequestSchema = zod.z.object({
|
|
|
8713
8728
|
source: zod.z.enum([
|
|
8714
8729
|
"custom",
|
|
8715
8730
|
"mcp",
|
|
8716
|
-
"openapi"
|
|
8731
|
+
"openapi",
|
|
8732
|
+
"graphql"
|
|
8717
8733
|
]).default("custom"),
|
|
8718
|
-
|
|
8734
|
+
url: zod.z.string().url().optional(),
|
|
8719
8735
|
authKind: AppAuthKindSchema.optional(),
|
|
8720
8736
|
fields: optionalCredentialFieldsSchema.optional(),
|
|
8721
8737
|
credentialScheme: AppCredentialSchemeSchema.optional(),
|
|
8722
8738
|
oauthScopes: zod.z.array(OAuthScopeOptionSchema).optional()
|
|
8723
8739
|
}).superRefine((data, ctx) => {
|
|
8724
|
-
if (data.source === "mcp" && !data.
|
|
8740
|
+
if ((data.source === "mcp" || data.source === "openapi" || data.source === "graphql") && !data.url) ctx.addIssue({
|
|
8725
8741
|
code: "custom",
|
|
8726
|
-
message: "
|
|
8727
|
-
path: ["
|
|
8742
|
+
message: "url is required for this app source",
|
|
8743
|
+
path: ["url"]
|
|
8728
8744
|
});
|
|
8729
8745
|
if (!(data.authKind ?? (data.source === "custom" ? "api_key" : void 0))) {
|
|
8730
8746
|
ctx.addIssue({
|
|
@@ -8751,7 +8767,7 @@ const CustomAppDetailSchema = zod.z.object({
|
|
|
8751
8767
|
category: zod.z.string().min(1),
|
|
8752
8768
|
authKind: AppAuthKindSchema,
|
|
8753
8769
|
source: AppSourceSchema,
|
|
8754
|
-
|
|
8770
|
+
url: zod.z.string().url().nullable().optional(),
|
|
8755
8771
|
credentialFields: optionalCredentialFieldsSchema.optional(),
|
|
8756
8772
|
credentialScheme: AppCredentialSchemeSchema.optional(),
|
|
8757
8773
|
oauthScopes: zod.z.array(OAuthScopeOptionSchema).optional(),
|
|
@@ -8773,7 +8789,7 @@ zod.z.object({
|
|
|
8773
8789
|
source: AppSourceSchema,
|
|
8774
8790
|
credentialFields: AppCredentialFieldsSchema.optional(),
|
|
8775
8791
|
credentialScheme: AppCredentialSchemeSchema.optional(),
|
|
8776
|
-
|
|
8792
|
+
url: zod.z.string().url().nullable().optional(),
|
|
8777
8793
|
createdAt: zod.z.string().min(1),
|
|
8778
8794
|
updatedAt: zod.z.string().min(1)
|
|
8779
8795
|
});
|
|
@@ -8796,8 +8812,8 @@ const AppCatalogEntrySchema = zod.z.object({
|
|
|
8796
8812
|
credentialFields: AppCredentialFieldsSchema.optional(),
|
|
8797
8813
|
/** Composio auth scheme when credentialFields are present. */
|
|
8798
8814
|
credentialScheme: AppCredentialSchemeSchema.optional(),
|
|
8799
|
-
/**
|
|
8800
|
-
|
|
8815
|
+
/** Endpoint URL for MCP, OpenAPI, or GraphQL custom apps. */
|
|
8816
|
+
url: zod.z.string().url().nullable().optional(),
|
|
8801
8817
|
/** When present, the app supports agent gateway bindings (external channels). */
|
|
8802
8818
|
gateway: AppGatewaySchema.optional()
|
|
8803
8819
|
});
|
|
@@ -8832,7 +8848,7 @@ const McpDiscoverResponseSchema = zod.z.object({
|
|
|
8832
8848
|
credentialFields: zod.z.record(zod.z.string(), AppCredentialFieldSchema).optional(),
|
|
8833
8849
|
credentialScheme: AppCredentialSchemeSchema.optional(),
|
|
8834
8850
|
oauthScopes: zod.z.array(OAuthScopeOptionSchema),
|
|
8835
|
-
|
|
8851
|
+
url: zod.z.string().url(),
|
|
8836
8852
|
oauth: McpAuthProbeOAuthSchema.optional(),
|
|
8837
8853
|
serverName: zod.z.string().optional(),
|
|
8838
8854
|
serverDescription: zod.z.string().optional()
|
|
@@ -8849,7 +8865,7 @@ const StartMcpOAuthConnectionInputSchema = zod.z.object({
|
|
|
8849
8865
|
});
|
|
8850
8866
|
const StartMcpOAuthConnectionResultSchema = zod.z.object({ authorizeUrl: zod.z.string().url() });
|
|
8851
8867
|
function mcpProbeToAppTemplate(probe) {
|
|
8852
|
-
const
|
|
8868
|
+
const url = probe.url;
|
|
8853
8869
|
if (probe.mode === "oauth" && probe.oauth) return {
|
|
8854
8870
|
authKind: "oauth",
|
|
8855
8871
|
oauthScopes: probe.oauth.scopes.map((name) => ({
|
|
@@ -8857,7 +8873,7 @@ function mcpProbeToAppTemplate(probe) {
|
|
|
8857
8873
|
description: name,
|
|
8858
8874
|
defaultSelected: true
|
|
8859
8875
|
})),
|
|
8860
|
-
|
|
8876
|
+
url,
|
|
8861
8877
|
oauth: probe.oauth
|
|
8862
8878
|
};
|
|
8863
8879
|
if (probe.mode === "token") return {
|
|
@@ -8868,32 +8884,32 @@ function mcpProbeToAppTemplate(probe) {
|
|
|
8868
8884
|
label: "Token"
|
|
8869
8885
|
} },
|
|
8870
8886
|
oauthScopes: [],
|
|
8871
|
-
|
|
8887
|
+
url
|
|
8872
8888
|
};
|
|
8873
8889
|
return {
|
|
8874
8890
|
authKind: "api_key",
|
|
8875
8891
|
credentialFields: {},
|
|
8876
8892
|
oauthScopes: [],
|
|
8877
|
-
|
|
8893
|
+
url
|
|
8878
8894
|
};
|
|
8879
8895
|
}
|
|
8880
|
-
function isRecord$1(value) {
|
|
8896
|
+
function isRecord$1$1(value) {
|
|
8881
8897
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
8882
8898
|
}
|
|
8883
|
-
function trimString(value) {
|
|
8899
|
+
function trimString$1(value) {
|
|
8884
8900
|
if (typeof value !== "string") return;
|
|
8885
8901
|
const trimmed = value.trim();
|
|
8886
8902
|
return trimmed.length > 0 ? trimmed : void 0;
|
|
8887
8903
|
}
|
|
8888
8904
|
function securitySchemesFromSpec(spec) {
|
|
8889
|
-
if (isRecord$1(spec.components) && isRecord$1(spec.components.securitySchemes)) return spec.components.securitySchemes;
|
|
8890
|
-
if (isRecord$1(spec.securityDefinitions)) return spec.securityDefinitions;
|
|
8905
|
+
if (isRecord$1$1(spec.components) && isRecord$1$1(spec.components.securitySchemes)) return spec.components.securitySchemes;
|
|
8906
|
+
if (isRecord$1$1(spec.securityDefinitions)) return spec.securityDefinitions;
|
|
8891
8907
|
}
|
|
8892
8908
|
function primarySecuritySchemeName(spec) {
|
|
8893
8909
|
const security = spec.security;
|
|
8894
8910
|
if (Array.isArray(security) && security.length > 0) {
|
|
8895
8911
|
const first = security[0];
|
|
8896
|
-
if (isRecord$1(first)) {
|
|
8912
|
+
if (isRecord$1$1(first)) {
|
|
8897
8913
|
const keys = Object.keys(first);
|
|
8898
8914
|
if (keys.length > 0) return keys[0];
|
|
8899
8915
|
}
|
|
@@ -8908,28 +8924,28 @@ function homepageUrlFromSpec(spec) {
|
|
|
8908
8924
|
const servers = spec.servers;
|
|
8909
8925
|
if (Array.isArray(servers) && servers.length > 0) {
|
|
8910
8926
|
const first = servers[0];
|
|
8911
|
-
if (isRecord$1(first)) {
|
|
8912
|
-
const url = trimString(first.url);
|
|
8927
|
+
if (isRecord$1$1(first)) {
|
|
8928
|
+
const url = trimString$1(first.url);
|
|
8913
8929
|
if (url) return url.replace(/\/+$/, "");
|
|
8914
8930
|
}
|
|
8915
8931
|
}
|
|
8916
8932
|
if (typeof spec.swagger === "string") {
|
|
8917
8933
|
const schemes = spec.schemes;
|
|
8918
8934
|
const scheme = Array.isArray(schemes) && typeof schemes[0] === "string" ? schemes[0] : "https";
|
|
8919
|
-
const host = trimString(spec.host);
|
|
8935
|
+
const host = trimString$1(spec.host);
|
|
8920
8936
|
const basePath = typeof spec.basePath === "string" ? spec.basePath : "";
|
|
8921
8937
|
if (host) return `${scheme}://${host}${basePath}`.replace(/\/+$/, "");
|
|
8922
8938
|
}
|
|
8923
8939
|
}
|
|
8924
8940
|
function oauthScopesFromOas3Scheme(scheme) {
|
|
8925
8941
|
const flows = scheme.flows;
|
|
8926
|
-
if (!isRecord$1(flows)) return [];
|
|
8942
|
+
if (!isRecord$1$1(flows)) return [];
|
|
8927
8943
|
const scopes = [];
|
|
8928
|
-
for (const flow of Object.values(flows)) if (isRecord$1(flow) && isRecord$1(flow.scopes)) scopes.push(...Object.keys(flow.scopes));
|
|
8944
|
+
for (const flow of Object.values(flows)) if (isRecord$1$1(flow) && isRecord$1$1(flow.scopes)) scopes.push(...Object.keys(flow.scopes));
|
|
8929
8945
|
return scopes;
|
|
8930
8946
|
}
|
|
8931
8947
|
function oauthScopesFromSwagger2Scheme(scheme) {
|
|
8932
|
-
if (!isRecord$1(scheme.scopes)) return [];
|
|
8948
|
+
if (!isRecord$1$1(scheme.scopes)) return [];
|
|
8933
8949
|
return Object.keys(scheme.scopes);
|
|
8934
8950
|
}
|
|
8935
8951
|
function oauthScopeOptions(scopeNames) {
|
|
@@ -8940,7 +8956,7 @@ function oauthScopeOptions(scopeNames) {
|
|
|
8940
8956
|
}));
|
|
8941
8957
|
}
|
|
8942
8958
|
function apiKeyPlacement(scheme) {
|
|
8943
|
-
const name = trimString(scheme.name) ?? "api_key";
|
|
8959
|
+
const name = trimString$1(scheme.name) ?? "api_key";
|
|
8944
8960
|
if ((typeof scheme.in === "string" ? scheme.in.toLowerCase() : "header") === "query") return {
|
|
8945
8961
|
kind: "query",
|
|
8946
8962
|
name
|
|
@@ -8982,7 +8998,7 @@ function mapSecurityScheme(scheme) {
|
|
|
8982
8998
|
credentialScheme: "API_KEY",
|
|
8983
8999
|
credentialFields: { token: {
|
|
8984
9000
|
secret: true,
|
|
8985
|
-
label: trimString(scheme.name) ?? "API Key",
|
|
9001
|
+
label: trimString$1(scheme.name) ?? "API Key",
|
|
8986
9002
|
placement: apiKeyPlacement(scheme)
|
|
8987
9003
|
} },
|
|
8988
9004
|
oauthScopes: []
|
|
@@ -9014,18 +9030,18 @@ function mapSecurityScheme(scheme) {
|
|
|
9014
9030
|
};
|
|
9015
9031
|
}
|
|
9016
9032
|
/** Map a parsed OpenAPI/Swagger document to a custom app template. */
|
|
9017
|
-
function openApiSpecToAppTemplate(spec,
|
|
9018
|
-
if (!isRecord$1(spec)) throw new Error("Invalid OpenAPI spec");
|
|
9019
|
-
const info = isRecord$1(spec.info) ? spec.info : {};
|
|
9020
|
-
const name = trimString(info.title);
|
|
9021
|
-
const description = trimString(info.description);
|
|
9033
|
+
function openApiSpecToAppTemplate(spec, url) {
|
|
9034
|
+
if (!isRecord$1$1(spec)) throw new Error("Invalid OpenAPI spec");
|
|
9035
|
+
const info = isRecord$1$1(spec.info) ? spec.info : {};
|
|
9036
|
+
const name = trimString$1(info.title);
|
|
9037
|
+
const description = trimString$1(info.description);
|
|
9022
9038
|
const homepageUrl = homepageUrlFromSpec(spec);
|
|
9023
9039
|
const schemes = securitySchemesFromSpec(spec);
|
|
9024
9040
|
const schemeName = primarySecuritySchemeName(spec);
|
|
9025
9041
|
let authPart = mapSecurityScheme({ type: "none" });
|
|
9026
|
-
if (schemeName && schemes && isRecord$1(schemes[schemeName])) authPart = mapSecurityScheme(schemes[schemeName]);
|
|
9042
|
+
if (schemeName && schemes && isRecord$1$1(schemes[schemeName])) authPart = mapSecurityScheme(schemes[schemeName]);
|
|
9027
9043
|
return {
|
|
9028
|
-
|
|
9044
|
+
url,
|
|
9029
9045
|
name,
|
|
9030
9046
|
description,
|
|
9031
9047
|
homepageUrl,
|
|
@@ -9043,7 +9059,125 @@ const OpenApiDiscoverResponseSchema = zod.z.object({
|
|
|
9043
9059
|
credentialFields: zod.z.record(zod.z.string(), AppCredentialFieldSchema).optional(),
|
|
9044
9060
|
credentialScheme: AppCredentialSchemeSchema.optional(),
|
|
9045
9061
|
oauthScopes: zod.z.array(OAuthScopeOptionSchema),
|
|
9046
|
-
|
|
9062
|
+
url: zod.z.string().url(),
|
|
9063
|
+
name: zod.z.string().optional(),
|
|
9064
|
+
description: zod.z.string().optional(),
|
|
9065
|
+
homepageUrl: zod.z.string().optional()
|
|
9066
|
+
})
|
|
9067
|
+
});
|
|
9068
|
+
function isRecord(value) {
|
|
9069
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
9070
|
+
}
|
|
9071
|
+
function trimString(value) {
|
|
9072
|
+
if (typeof value !== "string") return;
|
|
9073
|
+
const trimmed = value.trim();
|
|
9074
|
+
return trimmed.length > 0 ? trimmed : void 0;
|
|
9075
|
+
}
|
|
9076
|
+
function displayNameFromUrl(value) {
|
|
9077
|
+
try {
|
|
9078
|
+
const hostname = new URL(value).hostname.replace(/^www\./, "");
|
|
9079
|
+
const parts = hostname.split(".").filter(Boolean);
|
|
9080
|
+
let label = parts[0] ?? hostname;
|
|
9081
|
+
if ((label === "mcp" || label === "api" || label === "graphql") && parts.length > 1) label = parts[1] ?? label;
|
|
9082
|
+
if (!label) return;
|
|
9083
|
+
return label.charAt(0).toUpperCase() + label.slice(1);
|
|
9084
|
+
} catch {
|
|
9085
|
+
return;
|
|
9086
|
+
}
|
|
9087
|
+
}
|
|
9088
|
+
function homepageUrlFromEndpoint(endpointUrl) {
|
|
9089
|
+
try {
|
|
9090
|
+
return new URL(endpointUrl).origin;
|
|
9091
|
+
} catch {
|
|
9092
|
+
return;
|
|
9093
|
+
}
|
|
9094
|
+
}
|
|
9095
|
+
function typeDescription(schema) {
|
|
9096
|
+
if (!schema) return;
|
|
9097
|
+
return trimString(schema.description);
|
|
9098
|
+
}
|
|
9099
|
+
function authFromProbe(authProbe) {
|
|
9100
|
+
if (authProbe === "basic") return {
|
|
9101
|
+
authKind: "api_key",
|
|
9102
|
+
credentialScheme: "BASIC",
|
|
9103
|
+
credentialFields: {
|
|
9104
|
+
username: { label: "Username" },
|
|
9105
|
+
password: {
|
|
9106
|
+
secret: true,
|
|
9107
|
+
label: "Password"
|
|
9108
|
+
}
|
|
9109
|
+
},
|
|
9110
|
+
oauthScopes: []
|
|
9111
|
+
};
|
|
9112
|
+
if (authProbe === "none") return {
|
|
9113
|
+
authKind: "api_key",
|
|
9114
|
+
credentialFields: {},
|
|
9115
|
+
oauthScopes: []
|
|
9116
|
+
};
|
|
9117
|
+
return {
|
|
9118
|
+
authKind: "api_key",
|
|
9119
|
+
credentialScheme: "BEARER_TOKEN",
|
|
9120
|
+
credentialFields: { token: {
|
|
9121
|
+
secret: true,
|
|
9122
|
+
label: "Token",
|
|
9123
|
+
placement: DEFAULT_MCP_API_KEY_PLACEMENT
|
|
9124
|
+
} },
|
|
9125
|
+
oauthScopes: []
|
|
9126
|
+
};
|
|
9127
|
+
}
|
|
9128
|
+
/** Infer auth requirements from an unauthenticated probe response. */
|
|
9129
|
+
function inferGraphqlAuthFromProbe(status, wwwAuthenticate, body) {
|
|
9130
|
+
if (status === 401) {
|
|
9131
|
+
if ((wwwAuthenticate?.toLowerCase() ?? "").includes("basic")) return "basic";
|
|
9132
|
+
return "bearer";
|
|
9133
|
+
}
|
|
9134
|
+
if (status === 403) return "bearer";
|
|
9135
|
+
if (isGraphqlAuthError(body)) return "bearer";
|
|
9136
|
+
return "none";
|
|
9137
|
+
}
|
|
9138
|
+
const AUTH_ERROR_PATTERN = /auth|unauthorized|unauthenticated|access token|credentials|not authenticated/i;
|
|
9139
|
+
function isGraphqlAuthError(body) {
|
|
9140
|
+
if (!isRecord(body) || !Array.isArray(body.errors)) return false;
|
|
9141
|
+
return body.errors.some((error) => {
|
|
9142
|
+
if (!isRecord(error)) return false;
|
|
9143
|
+
const message = typeof error.message === "string" ? error.message : "";
|
|
9144
|
+
const extensions = isRecord(error.extensions) ? error.extensions : void 0;
|
|
9145
|
+
const extensionHint = extensions ? `${extensions.code ?? ""} ${extensions.type ?? ""}` : "";
|
|
9146
|
+
return AUTH_ERROR_PATTERN.test(message) || /AUTH/i.test(extensionHint);
|
|
9147
|
+
});
|
|
9148
|
+
}
|
|
9149
|
+
/** Map a GraphQL introspection result to a custom app template. */
|
|
9150
|
+
function graphqlIntrospectionToAppTemplate(introspection, endpointUrl, authProbe = "bearer") {
|
|
9151
|
+
const root = isRecord(introspection) ? introspection : {};
|
|
9152
|
+
const data = isRecord(root.data) ? root.data : root;
|
|
9153
|
+
const schema = isRecord(data.__schema) ? data.__schema : void 0;
|
|
9154
|
+
const queryType = schema && isRecord(schema.queryType) ? schema.queryType : void 0;
|
|
9155
|
+
const mutationType = schema && isRecord(schema.mutationType) ? schema.mutationType : void 0;
|
|
9156
|
+
const queryName = trimString(queryType?.name);
|
|
9157
|
+
const name = queryName === "Query" ? displayNameFromUrl(endpointUrl) : queryName;
|
|
9158
|
+
const description = typeDescription(queryType) || typeDescription(mutationType) || (name ? `GraphQL API for ${name}.` : void 0);
|
|
9159
|
+
const homepageUrl = homepageUrlFromEndpoint(endpointUrl);
|
|
9160
|
+
const authPart = authFromProbe(authProbe);
|
|
9161
|
+
return {
|
|
9162
|
+
url: endpointUrl,
|
|
9163
|
+
name,
|
|
9164
|
+
description,
|
|
9165
|
+
homepageUrl,
|
|
9166
|
+
authKind: authPart.authKind,
|
|
9167
|
+
credentialFields: authPart.credentialFields,
|
|
9168
|
+
credentialScheme: authPart.credentialScheme,
|
|
9169
|
+
oauthScopes: authPart.oauthScopes
|
|
9170
|
+
};
|
|
9171
|
+
}
|
|
9172
|
+
const GraphqlDiscoverRequestSchema = zod.z.object({ url: zod.z.string().url() });
|
|
9173
|
+
const GraphqlDiscoverResponseSchema = zod.z.object({
|
|
9174
|
+
detected: zod.z.boolean(),
|
|
9175
|
+
template: zod.z.object({
|
|
9176
|
+
authKind: AppAuthKindSchema,
|
|
9177
|
+
credentialFields: zod.z.record(zod.z.string(), AppCredentialFieldSchema).optional(),
|
|
9178
|
+
credentialScheme: AppCredentialSchemeSchema.optional(),
|
|
9179
|
+
oauthScopes: zod.z.array(OAuthScopeOptionSchema),
|
|
9180
|
+
url: zod.z.string().url(),
|
|
9047
9181
|
name: zod.z.string().optional(),
|
|
9048
9182
|
description: zod.z.string().optional(),
|
|
9049
9183
|
homepageUrl: zod.z.string().optional()
|
|
@@ -29699,9 +29833,9 @@ async function discoverMcpApp(url) {
|
|
|
29699
29833
|
};
|
|
29700
29834
|
}
|
|
29701
29835
|
async function beginMcpOAuthConnect(options) {
|
|
29702
|
-
const
|
|
29703
|
-
if (!
|
|
29704
|
-
const discovered = await discoverOAuthServerInfo(new URL(
|
|
29836
|
+
const appUrl = options.app.url?.trim();
|
|
29837
|
+
if (!appUrl || options.app.source !== "mcp" || options.app.authKind !== "oauth") throw new Error("App is not a direct MCP OAuth app");
|
|
29838
|
+
const discovered = await discoverOAuthServerInfo(new URL(appUrl), {});
|
|
29705
29839
|
const metadata = discovered.authorizationServerMetadata;
|
|
29706
29840
|
if (!metadata?.authorization_endpoint || !metadata.token_endpoint) throw new Error("MCP server does not expose OAuth authorization metadata");
|
|
29707
29841
|
const oauth = {
|
|
@@ -29732,9 +29866,9 @@ async function beginMcpOAuthConnect(options) {
|
|
|
29732
29866
|
tokenStrategy: "refresh",
|
|
29733
29867
|
clientId: clientInformation.client_id,
|
|
29734
29868
|
clientSecret: oauthClientSecretForStorage(clientInformation.client_secret),
|
|
29735
|
-
metadata: oauthAppMetadata(oauth,
|
|
29869
|
+
metadata: oauthAppMetadata(oauth, appUrl, { tokenEndpointAuthMethod: clientInformation.token_endpoint_auth_method })
|
|
29736
29870
|
});
|
|
29737
|
-
const resourceUrl = oauth.resource ? new URL(oauth.resource) : new URL(
|
|
29871
|
+
const resourceUrl = oauth.resource ? new URL(oauth.resource) : new URL(appUrl);
|
|
29738
29872
|
const statePayload = {
|
|
29739
29873
|
codeVerifier: "",
|
|
29740
29874
|
appSlug: options.app.slug,
|
|
@@ -29747,7 +29881,7 @@ async function beginMcpOAuthConnect(options) {
|
|
|
29747
29881
|
authorizationServerUrl: discovered.authorizationServerUrl,
|
|
29748
29882
|
resource: oauth.resource,
|
|
29749
29883
|
oauthMetadata: oauth,
|
|
29750
|
-
mcpUrl,
|
|
29884
|
+
mcpUrl: appUrl,
|
|
29751
29885
|
redirectUri: options.redirectUri,
|
|
29752
29886
|
clientId: clientInformation.client_id,
|
|
29753
29887
|
clientSecret: clientInformation.client_secret,
|
|
@@ -29824,11 +29958,11 @@ async function completeMcpOAuthConnect(options) {
|
|
|
29824
29958
|
};
|
|
29825
29959
|
}
|
|
29826
29960
|
const MAX_SPEC_BYTES = 5 * 1024 * 1024;
|
|
29827
|
-
function isRecord(value) {
|
|
29961
|
+
function isRecord$1(value) {
|
|
29828
29962
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
29829
29963
|
}
|
|
29830
29964
|
function isOpenApiSpec(value) {
|
|
29831
|
-
return isRecord(value) && (typeof value.openapi === "string" || typeof value.swagger === "string");
|
|
29965
|
+
return isRecord$1(value) && (typeof value.openapi === "string" || typeof value.swagger === "string");
|
|
29832
29966
|
}
|
|
29833
29967
|
async function discoverOpenApiApp(url) {
|
|
29834
29968
|
const response = await fetch(url, { redirect: "follow" });
|
|
@@ -29849,6 +29983,76 @@ async function discoverOpenApiApp(url) {
|
|
|
29849
29983
|
template: openApiSpecToAppTemplate(parsed, url)
|
|
29850
29984
|
};
|
|
29851
29985
|
}
|
|
29986
|
+
const MAX_RESPONSE_BYTES = 5 * 1024 * 1024;
|
|
29987
|
+
const INTROSPECTION_QUERY = `query IntrospectionQuery {
|
|
29988
|
+
__schema {
|
|
29989
|
+
queryType { name description }
|
|
29990
|
+
mutationType { name description }
|
|
29991
|
+
}
|
|
29992
|
+
}`;
|
|
29993
|
+
const USAGE_AUTH_PROBE_QUERY = "query { __typename }";
|
|
29994
|
+
async function postGraphql(endpointUrl, query) {
|
|
29995
|
+
const response = await fetch(endpointUrl, {
|
|
29996
|
+
method: "POST",
|
|
29997
|
+
redirect: "follow",
|
|
29998
|
+
headers: {
|
|
29999
|
+
"content-type": "application/json",
|
|
30000
|
+
accept: "application/json"
|
|
30001
|
+
},
|
|
30002
|
+
body: JSON.stringify({ query })
|
|
30003
|
+
});
|
|
30004
|
+
const contentLength = response.headers.get("content-length");
|
|
30005
|
+
if (contentLength && Number(contentLength) > MAX_RESPONSE_BYTES) throw new Error("GraphQL introspection response is too large");
|
|
30006
|
+
const text = await response.text();
|
|
30007
|
+
if (text.length > MAX_RESPONSE_BYTES) throw new Error("GraphQL introspection response is too large");
|
|
30008
|
+
let body;
|
|
30009
|
+
try {
|
|
30010
|
+
body = JSON.parse(text);
|
|
30011
|
+
} catch {
|
|
30012
|
+
throw new Error("GraphQL endpoint did not return JSON");
|
|
30013
|
+
}
|
|
30014
|
+
return {
|
|
30015
|
+
response,
|
|
30016
|
+
body,
|
|
30017
|
+
text
|
|
30018
|
+
};
|
|
30019
|
+
}
|
|
30020
|
+
function introspectionDisabled(body) {
|
|
30021
|
+
if (!isRecord(body) || !Array.isArray(body.errors)) return false;
|
|
30022
|
+
return body.errors.some((error) => {
|
|
30023
|
+
if (!isRecord(error)) return false;
|
|
30024
|
+
return (typeof error.message === "string" ? error.message.toLowerCase() : "").includes("introspection");
|
|
30025
|
+
});
|
|
30026
|
+
}
|
|
30027
|
+
function parseEndpointUrl(url) {
|
|
30028
|
+
const trimmed = url.trim();
|
|
30029
|
+
const parsed = new URL(trimmed);
|
|
30030
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") throw new Error("GraphQL endpoint must use http or https");
|
|
30031
|
+
return parsed;
|
|
30032
|
+
}
|
|
30033
|
+
async function discoverGraphqlApp(url) {
|
|
30034
|
+
const endpointUrl = parseEndpointUrl(url).toString();
|
|
30035
|
+
const { response, body } = await postGraphql(endpointUrl, INTROSPECTION_QUERY);
|
|
30036
|
+
const authProbe = inferGraphqlAuthFromProbe(response.status, response.headers.get("www-authenticate"), body);
|
|
30037
|
+
if (!(isRecord(body) && isRecord(body.data) && isRecord(body.data.__schema))) {
|
|
30038
|
+
if (response.status === 401 || response.status === 403) return {
|
|
30039
|
+
detected: true,
|
|
30040
|
+
template: graphqlIntrospectionToAppTemplate({ data: {} }, endpointUrl, authProbe)
|
|
30041
|
+
};
|
|
30042
|
+
if (response.ok && introspectionDisabled(body)) throw new Error("Introspection is disabled on this endpoint");
|
|
30043
|
+
throw new Error(`Failed to introspect GraphQL endpoint (${response.status})`);
|
|
30044
|
+
}
|
|
30045
|
+
let resolvedAuthProbe = authProbe;
|
|
30046
|
+
if (resolvedAuthProbe === "none") {
|
|
30047
|
+
const usageProbe = await postGraphql(endpointUrl, USAGE_AUTH_PROBE_QUERY);
|
|
30048
|
+
const usageAuth = inferGraphqlAuthFromProbe(usageProbe.response.status, usageProbe.response.headers.get("www-authenticate"), usageProbe.body);
|
|
30049
|
+
if (usageAuth !== "none") resolvedAuthProbe = usageAuth;
|
|
30050
|
+
}
|
|
30051
|
+
return {
|
|
30052
|
+
detected: true,
|
|
30053
|
+
template: graphqlIntrospectionToAppTemplate(body, endpointUrl, resolvedAuthProbe)
|
|
30054
|
+
};
|
|
30055
|
+
}
|
|
29852
30056
|
//#endregion
|
|
29853
30057
|
//#region ../../packages/workflow/dist/index.mjs
|
|
29854
30058
|
const zodSchema$1 = zod.z.custom((v) => v instanceof zod.z.ZodType, "must be a Zod schema");
|
|
@@ -29893,6 +30097,18 @@ registerWorkflowRunGetter(() => {
|
|
|
29893
30097
|
*/
|
|
29894
30098
|
const cronScheduleSchema = zod.z.string().trim().min(1, "cron schedule must be a non-empty string").refine(isParseableCron, "must be a valid cron expression").brand();
|
|
29895
30099
|
/**
|
|
30100
|
+
* Resolves the effective schedule for an attachment, applying overrides by
|
|
30101
|
+
* precedence: per-attachment override → global override → the authored
|
|
30102
|
+
* schedule. Pure string precedence — no cron parsing.
|
|
30103
|
+
*/
|
|
30104
|
+
function resolveCronSchedule(attachmentId, schedule, options) {
|
|
30105
|
+
return options.attachmentScheduleOverrides?.[attachmentId] ?? options.cronScheduleOverride ?? schedule;
|
|
30106
|
+
}
|
|
30107
|
+
/** The next time the schedule fires at or after `from`. */
|
|
30108
|
+
function nextTriggerRunAt(schedule, from = /* @__PURE__ */ new Date()) {
|
|
30109
|
+
return toCron(schedule).getNextDate(from);
|
|
30110
|
+
}
|
|
30111
|
+
/**
|
|
29896
30112
|
* Single touchpoint for the `cron-schedule` library — every parse, validation,
|
|
29897
30113
|
* and next-run calculation in this package goes through here.
|
|
29898
30114
|
*/
|
|
@@ -42762,7 +42978,7 @@ function createDatabaseJobQueue() {
|
|
|
42762
42978
|
while (running) try {
|
|
42763
42979
|
const job = await (0, _keystrokehq_database.claimNextJob)(workerId);
|
|
42764
42980
|
if (!job) {
|
|
42765
|
-
await sleep(pollIntervalMs);
|
|
42981
|
+
await sleep$1(pollIntervalMs);
|
|
42766
42982
|
continue;
|
|
42767
42983
|
}
|
|
42768
42984
|
try {
|
|
@@ -42776,7 +42992,7 @@ function createDatabaseJobQueue() {
|
|
|
42776
42992
|
}
|
|
42777
42993
|
}
|
|
42778
42994
|
} catch {
|
|
42779
|
-
await sleep(pollIntervalMs);
|
|
42995
|
+
await sleep$1(pollIntervalMs);
|
|
42780
42996
|
}
|
|
42781
42997
|
};
|
|
42782
42998
|
loop();
|
|
@@ -42789,9 +43005,126 @@ function createDatabaseJobQueue() {
|
|
|
42789
43005
|
subscribeCancel: (handler) => cancelChannel.subscribeCancel(handler)
|
|
42790
43006
|
};
|
|
42791
43007
|
}
|
|
43008
|
+
function sleep$1(ms) {
|
|
43009
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
43010
|
+
}
|
|
43011
|
+
function enqueueTriggerJob(jobQueue, row, scheduledAt) {
|
|
43012
|
+
const input = {
|
|
43013
|
+
kind: "trigger",
|
|
43014
|
+
targetId: row.slug,
|
|
43015
|
+
runId: crypto.randomUUID(),
|
|
43016
|
+
trigger: row.kind,
|
|
43017
|
+
payload: {},
|
|
43018
|
+
projectId: row.projectId
|
|
43019
|
+
};
|
|
43020
|
+
if (scheduledAt) input.scheduledAt = scheduledAt;
|
|
43021
|
+
return jobQueue.enqueue(input);
|
|
43022
|
+
}
|
|
43023
|
+
async function claimDue(scope, asOf, resolveNextRunAt, limit) {
|
|
43024
|
+
if (scope === "organization") return (0, _keystrokehq_database.claimDueTriggersForOrg)(asOf, resolveNextRunAt, limit);
|
|
43025
|
+
return (0, _keystrokehq_database.claimDueTriggers)(asOf, resolveNextRunAt, limit).then((rows) => rows.map((row) => ({
|
|
43026
|
+
...row,
|
|
43027
|
+
projectId: (0, _keystrokehq_database.getProjectScopeId)()
|
|
43028
|
+
})));
|
|
43029
|
+
}
|
|
43030
|
+
function createScheduleTicker(ctx) {
|
|
43031
|
+
const pollIntervalMs = ctx.pollIntervalMs ?? 1e3;
|
|
43032
|
+
const batchSize = ctx.batchSize ?? 10;
|
|
43033
|
+
async function fireDueSchedules(asOf = /* @__PURE__ */ new Date()) {
|
|
43034
|
+
const claimed = await claimDue(ctx.scope ?? "project", asOf, (schedule) => nextTriggerRunAt(schedule, asOf), batchSize);
|
|
43035
|
+
for (const row of claimed) {
|
|
43036
|
+
if (row.kind !== "cron" && row.kind !== "poll") continue;
|
|
43037
|
+
await enqueueTriggerJob(ctx.jobQueue, {
|
|
43038
|
+
slug: row.slug,
|
|
43039
|
+
kind: row.kind,
|
|
43040
|
+
projectId: row.projectId
|
|
43041
|
+
}, asOf);
|
|
43042
|
+
}
|
|
43043
|
+
return claimed.length;
|
|
43044
|
+
}
|
|
43045
|
+
async function startScheduleTicker(options = {}) {
|
|
43046
|
+
const intervalMs = options.pollIntervalMs ?? pollIntervalMs;
|
|
43047
|
+
const limit = options.batchSize ?? batchSize;
|
|
43048
|
+
const scope = options.scope ?? ctx.scope ?? "project";
|
|
43049
|
+
let running = true;
|
|
43050
|
+
const loop = async () => {
|
|
43051
|
+
while (running) {
|
|
43052
|
+
try {
|
|
43053
|
+
const claimed = await claimDue(scope, /* @__PURE__ */ new Date(), (schedule) => nextTriggerRunAt(schedule, /* @__PURE__ */ new Date()), limit);
|
|
43054
|
+
for (const row of claimed) {
|
|
43055
|
+
if (row.kind !== "cron" && row.kind !== "poll") continue;
|
|
43056
|
+
await enqueueTriggerJob(ctx.jobQueue, {
|
|
43057
|
+
slug: row.slug,
|
|
43058
|
+
kind: row.kind,
|
|
43059
|
+
projectId: row.projectId
|
|
43060
|
+
});
|
|
43061
|
+
}
|
|
43062
|
+
} catch {}
|
|
43063
|
+
await sleep(intervalMs);
|
|
43064
|
+
}
|
|
43065
|
+
};
|
|
43066
|
+
loop();
|
|
43067
|
+
return async () => {
|
|
43068
|
+
running = false;
|
|
43069
|
+
};
|
|
43070
|
+
}
|
|
43071
|
+
return {
|
|
43072
|
+
fireDueSchedules,
|
|
43073
|
+
startScheduleTicker
|
|
43074
|
+
};
|
|
43075
|
+
}
|
|
42792
43076
|
function sleep(ms) {
|
|
42793
43077
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
42794
43078
|
}
|
|
43079
|
+
function resolveTriggerSchedule(triggerSlug, schedule, overrides) {
|
|
43080
|
+
return resolveCronSchedule(triggerSlug, schedule, {
|
|
43081
|
+
cronScheduleOverride: overrides?.global,
|
|
43082
|
+
attachmentScheduleOverrides: overrides?.byTrigger
|
|
43083
|
+
});
|
|
43084
|
+
}
|
|
43085
|
+
async function syncTriggerSchedules(options) {
|
|
43086
|
+
const now = /* @__PURE__ */ new Date();
|
|
43087
|
+
const projectSlugs = options.schedules.map((schedule) => schedule.triggerSlug);
|
|
43088
|
+
const ephemeralSlugs = await (0, _keystrokehq_database.selectActiveEphemeralScheduledTriggerSlugs)();
|
|
43089
|
+
const slugs = [...projectSlugs, ...ephemeralSlugs];
|
|
43090
|
+
if (slugs.length === 0) {
|
|
43091
|
+
await (0, _keystrokehq_database.disableAllTriggerSchedules)(now);
|
|
43092
|
+
return;
|
|
43093
|
+
}
|
|
43094
|
+
await (0, _keystrokehq_database.disableTriggerSchedulesNotInSlugs)(slugs, now);
|
|
43095
|
+
for (const spec of options.schedules) {
|
|
43096
|
+
const schedule = resolveTriggerSchedule(spec.triggerSlug, spec.schedule, options.scheduleOverrides);
|
|
43097
|
+
const existing = await (0, _keystrokehq_database.selectTriggerBySlug)(spec.triggerSlug);
|
|
43098
|
+
if (!existing) continue;
|
|
43099
|
+
const nextRunAt = !(existing.schedule !== schedule) && existing.enabled === 1 ? existing.nextRunAt : nextTriggerRunAt(schedule, now);
|
|
43100
|
+
const enabled = (await (0, _keystrokehq_database.listExecutableAttachmentsByTriggerIds)([existing.id])).length > 0;
|
|
43101
|
+
await (0, _keystrokehq_database.upsertTriggerScheduleFields)({
|
|
43102
|
+
triggerSlug: spec.triggerSlug,
|
|
43103
|
+
schedule,
|
|
43104
|
+
nextRunAt: nextRunAt ?? now,
|
|
43105
|
+
enabled,
|
|
43106
|
+
updatedAt: now
|
|
43107
|
+
});
|
|
43108
|
+
}
|
|
43109
|
+
}
|
|
43110
|
+
/** Postgres poll loop — default trigger scheduler for pg-boss, polling, and memory paths. */
|
|
43111
|
+
function createDatabaseTriggerScheduler(options) {
|
|
43112
|
+
const ticker = createScheduleTicker({
|
|
43113
|
+
jobQueue: options.jobQueue,
|
|
43114
|
+
scope: options.scope,
|
|
43115
|
+
pollIntervalMs: options.pollIntervalMs,
|
|
43116
|
+
batchSize: options.batchSize
|
|
43117
|
+
});
|
|
43118
|
+
return {
|
|
43119
|
+
sync: (syncOptions) => syncTriggerSchedules(syncOptions),
|
|
43120
|
+
start: (startOptions) => ticker.startScheduleTicker(startOptions),
|
|
43121
|
+
fireDue: (asOf) => ticker.fireDueSchedules(asOf),
|
|
43122
|
+
async remove(triggerSlug) {
|
|
43123
|
+
await (0, _keystrokehq_database.setTriggerScheduleEnabled)(triggerSlug, false, /* @__PURE__ */ new Date());
|
|
43124
|
+
},
|
|
43125
|
+
async upsert(_spec) {}
|
|
43126
|
+
};
|
|
43127
|
+
}
|
|
42795
43128
|
let boss;
|
|
42796
43129
|
function resolveDatabaseUrl(url) {
|
|
42797
43130
|
const resolved = url ?? (0, _keystrokehq_database.resolvePostgresUrlFromEnv)(process.env);
|
|
@@ -42844,6 +43177,8 @@ function buildPgBossJobQueue(boss, options) {
|
|
|
42844
43177
|
const queueName = options.queueName ?? "keystroke";
|
|
42845
43178
|
const cancelChannel = (0, _keystrokehq_database.createPostgresCancelChannel)(options.connectionString, pgCancelChannelName(options.cancelScope ?? "platform", options.cancelScope === "organization" ? options.organizationId : options.projectId));
|
|
42846
43179
|
return {
|
|
43180
|
+
boss,
|
|
43181
|
+
queueName,
|
|
42847
43182
|
async enqueue(input) {
|
|
42848
43183
|
const jobId = await boss.send(queueName, {
|
|
42849
43184
|
...input,
|
|
@@ -42925,9 +43260,129 @@ async function createSharedPgBossJobQueue(boss, options) {
|
|
|
42925
43260
|
cancelScope: "platform"
|
|
42926
43261
|
});
|
|
42927
43262
|
}
|
|
43263
|
+
/**
|
|
43264
|
+
* pg-boss schedule key for one trigger. Mirrors {@link bullmqTriggerSchedulerId}
|
|
43265
|
+
* so the firing backend is interchangeable: `trigger-<projectId>-<slug>`. pg-boss
|
|
43266
|
+
* keys allow hyphens, so colons (legal in ids) are swapped for `-`.
|
|
43267
|
+
*/
|
|
43268
|
+
function pgBossTriggerScheduleKey(spec) {
|
|
43269
|
+
return `trigger-${(spec.projectId ?? (0, _keystrokehq_database.getProjectScopeId)()).replaceAll(":", "-")}-${spec.triggerSlug.replaceAll(":", "-")}`;
|
|
43270
|
+
}
|
|
43271
|
+
/** Key prefix scoping reconcile cleanup to the active project (org queues are shared). */
|
|
43272
|
+
function pgBossTriggerScheduleKeyPrefix(projectId) {
|
|
43273
|
+
return `trigger-${(projectId ?? (0, _keystrokehq_database.getProjectScopeId)()).replaceAll(":", "-")}-`;
|
|
43274
|
+
}
|
|
43275
|
+
function triggerJobData(spec) {
|
|
43276
|
+
return {
|
|
43277
|
+
kind: "trigger",
|
|
43278
|
+
targetId: spec.triggerSlug,
|
|
43279
|
+
runId: "",
|
|
43280
|
+
trigger: spec.kind,
|
|
43281
|
+
payload: {},
|
|
43282
|
+
projectId: spec.projectId ?? (0, _keystrokehq_database.getProjectScopeId)()
|
|
43283
|
+
};
|
|
43284
|
+
}
|
|
43285
|
+
function rowToSpec(row) {
|
|
43286
|
+
if (row.kind !== "cron" && row.kind !== "poll") return;
|
|
43287
|
+
if (!row.schedule) return;
|
|
43288
|
+
return {
|
|
43289
|
+
triggerSlug: row.slug,
|
|
43290
|
+
kind: row.kind,
|
|
43291
|
+
schedule: row.schedule,
|
|
43292
|
+
projectId: row.projectId
|
|
43293
|
+
};
|
|
43294
|
+
}
|
|
43295
|
+
/**
|
|
43296
|
+
* Trigger scheduler backed by pg-boss native cron scheduling. Mirrors
|
|
43297
|
+
* {@link createBullmqTriggerScheduler}: `boss.schedule` registers a recurring job
|
|
43298
|
+
* onto the project/org queue (no per-second DB poll), and reconcile keeps the
|
|
43299
|
+
* `pgboss.schedule` table in sync with the `triggers` table (source of truth).
|
|
43300
|
+
*
|
|
43301
|
+
* Granularity: pg-boss cron is minute-level (it checks schedules every ~30s and
|
|
43302
|
+
* dedupes per minute), so sub-minute schedules effectively fire at most once per
|
|
43303
|
+
* minute — unlike the DB ticker's 1s loop.
|
|
43304
|
+
*/
|
|
43305
|
+
function createPgBossTriggerScheduler(_ctx, queue) {
|
|
43306
|
+
async function upsertScheduler(spec, overrides) {
|
|
43307
|
+
const schedule = resolveTriggerSchedule(spec.triggerSlug, spec.schedule, overrides);
|
|
43308
|
+
const key = pgBossTriggerScheduleKey(spec);
|
|
43309
|
+
await queue.boss.schedule(queue.queueName, schedule, triggerJobData({
|
|
43310
|
+
...spec,
|
|
43311
|
+
schedule
|
|
43312
|
+
}), { key });
|
|
43313
|
+
}
|
|
43314
|
+
async function reconcileFromDatabase(overrides) {
|
|
43315
|
+
const projectPrefix = pgBossTriggerScheduleKeyPrefix();
|
|
43316
|
+
const rows = await (0, _keystrokehq_database.listEnabledScheduledTriggers)();
|
|
43317
|
+
const expectedKeys = /* @__PURE__ */ new Set();
|
|
43318
|
+
const failures = [];
|
|
43319
|
+
for (const row of rows) {
|
|
43320
|
+
const spec = rowToSpec(row);
|
|
43321
|
+
if (!spec) continue;
|
|
43322
|
+
expectedKeys.add(pgBossTriggerScheduleKey(spec));
|
|
43323
|
+
try {
|
|
43324
|
+
await upsertScheduler(spec, overrides);
|
|
43325
|
+
} catch (error) {
|
|
43326
|
+
failures.push({
|
|
43327
|
+
triggerSlug: spec.triggerSlug,
|
|
43328
|
+
error
|
|
43329
|
+
});
|
|
43330
|
+
console.error(`[pg-boss-trigger-scheduler] failed to schedule ${spec.triggerSlug}`, error);
|
|
43331
|
+
}
|
|
43332
|
+
}
|
|
43333
|
+
const schedules = await queue.boss.getSchedules(queue.queueName);
|
|
43334
|
+
for (const schedule of schedules) {
|
|
43335
|
+
const key = schedule.key;
|
|
43336
|
+
if (!key || !key.startsWith(projectPrefix)) continue;
|
|
43337
|
+
if (!expectedKeys.has(key)) try {
|
|
43338
|
+
await queue.boss.unschedule(queue.queueName, key);
|
|
43339
|
+
} catch (error) {
|
|
43340
|
+
failures.push({
|
|
43341
|
+
triggerSlug: key,
|
|
43342
|
+
error
|
|
43343
|
+
});
|
|
43344
|
+
console.error(`[pg-boss-trigger-scheduler] failed to unschedule stale ${key}`, error);
|
|
43345
|
+
}
|
|
43346
|
+
}
|
|
43347
|
+
if (failures.length > 0) throw new Error(`pg-boss trigger scheduler reconcile failed for ${failures.length} trigger(s)`);
|
|
43348
|
+
}
|
|
43349
|
+
return {
|
|
43350
|
+
async sync(syncOptions) {
|
|
43351
|
+
await syncTriggerSchedules(syncOptions);
|
|
43352
|
+
await reconcileFromDatabase(syncOptions.scheduleOverrides);
|
|
43353
|
+
},
|
|
43354
|
+
async start(_options) {
|
|
43355
|
+
return async () => void 0;
|
|
43356
|
+
},
|
|
43357
|
+
fireDue: async () => 0,
|
|
43358
|
+
upsert: upsertScheduler,
|
|
43359
|
+
async remove(triggerSlug, projectId) {
|
|
43360
|
+
await queue.boss.unschedule(queue.queueName, pgBossTriggerScheduleKey({
|
|
43361
|
+
triggerSlug,
|
|
43362
|
+
projectId
|
|
43363
|
+
}));
|
|
43364
|
+
}
|
|
43365
|
+
};
|
|
43366
|
+
}
|
|
42928
43367
|
function resolveUrl(ctx) {
|
|
42929
43368
|
return ctx.url ?? (0, _keystrokehq_database.resolveProjectDatabaseUrlFromEnv)(process.env) ?? _keystrokehq_database.DEFAULT_DATABASE_URL;
|
|
42930
43369
|
}
|
|
43370
|
+
/** DB poll-loop trigger scheduler — used by the SQLite/self-host polling backend. */
|
|
43371
|
+
function createPollingTriggerScheduler(ctx, queue) {
|
|
43372
|
+
const scope = ctx.scope === "organization" ? "organization" : "project";
|
|
43373
|
+
return Promise.resolve(createDatabaseTriggerScheduler({
|
|
43374
|
+
jobQueue: queue,
|
|
43375
|
+
scope
|
|
43376
|
+
}));
|
|
43377
|
+
}
|
|
43378
|
+
function isPgBossJobQueue(queue) {
|
|
43379
|
+
return "boss" in queue && "queueName" in queue;
|
|
43380
|
+
}
|
|
43381
|
+
/** Native pg-boss cron scheduler; falls back to the DB ticker if the queue isn't pg-boss. */
|
|
43382
|
+
function createPgBossTriggerSchedulerForPlugin(ctx, queue) {
|
|
43383
|
+
if (!isPgBossJobQueue(queue)) return createPollingTriggerScheduler(ctx, queue);
|
|
43384
|
+
return Promise.resolve(createPgBossTriggerScheduler(ctx, queue));
|
|
43385
|
+
}
|
|
42931
43386
|
/** Postgres pg-boss backend. Platform scope shares one queue; org scope gets one queue per org. */
|
|
42932
43387
|
function pgBossSchedulerPlugin() {
|
|
42933
43388
|
return defineSchedulerPlugin({
|
|
@@ -42954,7 +43409,8 @@ function pgBossSchedulerPlugin() {
|
|
|
42954
43409
|
queueName: pgBossProjectQueueName(projectId),
|
|
42955
43410
|
projectId
|
|
42956
43411
|
});
|
|
42957
|
-
}
|
|
43412
|
+
},
|
|
43413
|
+
createTriggerScheduler: createPgBossTriggerSchedulerForPlugin
|
|
42958
43414
|
});
|
|
42959
43415
|
}
|
|
42960
43416
|
/** DB-table queue (Drizzle `jobs`), for SQLite / self-host. */
|
|
@@ -42963,7 +43419,8 @@ function pollingSchedulerPlugin() {
|
|
|
42963
43419
|
name: "polling",
|
|
42964
43420
|
async createJobQueue() {
|
|
42965
43421
|
return createDatabaseJobQueue();
|
|
42966
|
-
}
|
|
43422
|
+
},
|
|
43423
|
+
createTriggerScheduler: createPollingTriggerScheduler
|
|
42967
43424
|
});
|
|
42968
43425
|
}
|
|
42969
43426
|
/** Auto-selects pg-boss (postgres) or polling (sqlite) by dialect. */
|
|
@@ -42973,6 +43430,10 @@ function defaultSchedulerPlugin() {
|
|
|
42973
43430
|
async createJobQueue(ctx) {
|
|
42974
43431
|
if ((0, _keystrokehq_database.inferDialect)(resolveUrl(ctx), ctx.dialect) === "postgres") return pgBossSchedulerPlugin().createJobQueue(ctx);
|
|
42975
43432
|
return pollingSchedulerPlugin().createJobQueue(ctx);
|
|
43433
|
+
},
|
|
43434
|
+
async createTriggerScheduler(ctx, queue) {
|
|
43435
|
+
if ((0, _keystrokehq_database.inferDialect)(resolveUrl(ctx), ctx.dialect) === "postgres") return pgBossSchedulerPlugin().createTriggerScheduler(ctx, queue);
|
|
43436
|
+
return pollingSchedulerPlugin().createTriggerScheduler(ctx, queue);
|
|
42976
43437
|
}
|
|
42977
43438
|
});
|
|
42978
43439
|
}
|
|
@@ -43545,6 +44006,18 @@ Object.defineProperty(exports, "GetCustomAppResponseSchema", {
|
|
|
43545
44006
|
return GetCustomAppResponseSchema;
|
|
43546
44007
|
}
|
|
43547
44008
|
});
|
|
44009
|
+
Object.defineProperty(exports, "GraphqlDiscoverRequestSchema", {
|
|
44010
|
+
enumerable: true,
|
|
44011
|
+
get: function() {
|
|
44012
|
+
return GraphqlDiscoverRequestSchema;
|
|
44013
|
+
}
|
|
44014
|
+
});
|
|
44015
|
+
Object.defineProperty(exports, "GraphqlDiscoverResponseSchema", {
|
|
44016
|
+
enumerable: true,
|
|
44017
|
+
get: function() {
|
|
44018
|
+
return GraphqlDiscoverResponseSchema;
|
|
44019
|
+
}
|
|
44020
|
+
});
|
|
43548
44021
|
Object.defineProperty(exports, "HistoryRunCancelResponseSchema", {
|
|
43549
44022
|
enumerable: true,
|
|
43550
44023
|
get: function() {
|
|
@@ -44115,6 +44588,12 @@ Object.defineProperty(exports, "deriveCredentialInstanceSlug", {
|
|
|
44115
44588
|
return deriveCredentialInstanceSlug;
|
|
44116
44589
|
}
|
|
44117
44590
|
});
|
|
44591
|
+
Object.defineProperty(exports, "discoverGraphqlApp", {
|
|
44592
|
+
enumerable: true,
|
|
44593
|
+
get: function() {
|
|
44594
|
+
return discoverGraphqlApp;
|
|
44595
|
+
}
|
|
44596
|
+
});
|
|
44118
44597
|
Object.defineProperty(exports, "discoverMcpApp", {
|
|
44119
44598
|
enumerable: true,
|
|
44120
44599
|
get: function() {
|
|
@@ -44368,4 +44847,4 @@ Object.defineProperty(exports, "validationErrorResponse", {
|
|
|
44368
44847
|
}
|
|
44369
44848
|
});
|
|
44370
44849
|
|
|
44371
|
-
//# sourceMappingURL=dist-
|
|
44850
|
+
//# sourceMappingURL=dist-KeJkUQxy.cjs.map
|