@keystrokehq/platform 0.1.117 → 0.1.118
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-Dvoy0Jo4.cjs → awk2-LA3USKJP-C544FFGP.cjs} +2 -2
- package/dist/{awk2-LA3USKJP-Dvoy0Jo4.cjs.map → awk2-LA3USKJP-C544FFGP.cjs.map} +1 -1
- package/dist/{awk2-LA3USKJP-DpvnYjX2.mjs → awk2-LA3USKJP-OaTNLGfL.mjs} +2 -2
- package/dist/{awk2-LA3USKJP-DpvnYjX2.mjs.map → awk2-LA3USKJP-OaTNLGfL.mjs.map} +1 -1
- package/dist/{base64-C2AIWVNC-CTQAdSG0.cjs → base64-C2AIWVNC-BnyRxaRd.cjs} +2 -2
- package/dist/{base64-C2AIWVNC-CTQAdSG0.cjs.map → base64-C2AIWVNC-BnyRxaRd.cjs.map} +1 -1
- package/dist/{base64-C2AIWVNC-DNibLND0.mjs → base64-C2AIWVNC-DcAp1c2p.mjs} +2 -2
- package/dist/{base64-C2AIWVNC-DNibLND0.mjs.map → base64-C2AIWVNC-DcAp1c2p.mjs.map} +1 -1
- package/dist/{bash-YZ33HQZQ-CqiP9-IN.cjs → bash-YZ33HQZQ-BRMsK3RY.cjs} +2 -2
- package/dist/{bash-YZ33HQZQ-CqiP9-IN.cjs.map → bash-YZ33HQZQ-BRMsK3RY.cjs.map} +1 -1
- package/dist/{bash-YZ33HQZQ-BBhsNCSj.mjs → bash-YZ33HQZQ-DukphZlQ.mjs} +2 -2
- package/dist/{bash-YZ33HQZQ-BBhsNCSj.mjs.map → bash-YZ33HQZQ-DukphZlQ.mjs.map} +1 -1
- package/dist/{cat-TSFMZVYS-CzLIxs_Y.mjs → cat-TSFMZVYS-B9ZweZ0g.mjs} +3 -3
- package/dist/{cat-TSFMZVYS-CzLIxs_Y.mjs.map → cat-TSFMZVYS-B9ZweZ0g.mjs.map} +1 -1
- package/dist/{cat-TSFMZVYS-BqA9dC8-.cjs → cat-TSFMZVYS-KZgn9B7l.cjs} +3 -3
- package/dist/{cat-TSFMZVYS-BqA9dC8-.cjs.map → cat-TSFMZVYS-KZgn9B7l.cjs.map} +1 -1
- package/dist/{chunk-5H5SCKJM-bwO1_x66.mjs → chunk-5H5SCKJM-BaQNy7Uj.mjs} +2 -2
- package/dist/{chunk-5H5SCKJM-bwO1_x66.mjs.map → chunk-5H5SCKJM-BaQNy7Uj.mjs.map} +1 -1
- package/dist/{chunk-5H5SCKJM-DbJ6QWgq.cjs → chunk-5H5SCKJM-DjtB3NAz.cjs} +2 -2
- package/dist/{chunk-5H5SCKJM-DbJ6QWgq.cjs.map → chunk-5H5SCKJM-DjtB3NAz.cjs.map} +1 -1
- package/dist/{chunk-AQ6FYS2X-BlpUjVwc.mjs → chunk-AQ6FYS2X-CXdwzuuw.mjs} +2 -2
- package/dist/{chunk-AQ6FYS2X-BlpUjVwc.mjs.map → chunk-AQ6FYS2X-CXdwzuuw.mjs.map} +1 -1
- package/dist/{chunk-AQ6FYS2X-dyvh_3_k.cjs → chunk-AQ6FYS2X-CsoGKQ2j.cjs} +2 -2
- package/dist/{chunk-AQ6FYS2X-dyvh_3_k.cjs.map → chunk-AQ6FYS2X-CsoGKQ2j.cjs.map} +1 -1
- package/dist/{chunk-CHFEPBH4-PkR6Rg7k.cjs → chunk-CHFEPBH4-B7SK6y0J.cjs} +2 -2
- package/dist/{chunk-CHFEPBH4-PkR6Rg7k.cjs.map → chunk-CHFEPBH4-B7SK6y0J.cjs.map} +1 -1
- package/dist/{chunk-CHFEPBH4-B3-VFcQl.mjs → chunk-CHFEPBH4-DWsPJ6bE.mjs} +2 -2
- package/dist/{chunk-CHFEPBH4-B3-VFcQl.mjs.map → chunk-CHFEPBH4-DWsPJ6bE.mjs.map} +1 -1
- package/dist/{chunk-EBAPSGAO-CB7OXdxC.mjs → chunk-EBAPSGAO-Bo2g3Ra0.mjs} +2 -2
- package/dist/{chunk-EBAPSGAO-CB7OXdxC.mjs.map → chunk-EBAPSGAO-Bo2g3Ra0.mjs.map} +1 -1
- package/dist/{chunk-EBAPSGAO-Crn54yub.cjs → chunk-EBAPSGAO-DxcD_wN0.cjs} +2 -2
- package/dist/{chunk-EBAPSGAO-Crn54yub.cjs.map → chunk-EBAPSGAO-DxcD_wN0.cjs.map} +1 -1
- package/dist/{chunk-LEKBROJD-B3cLm6oa.mjs → chunk-LEKBROJD-CKOwe9-J.mjs} +2 -2
- package/dist/{chunk-LEKBROJD-B3cLm6oa.mjs.map → chunk-LEKBROJD-CKOwe9-J.mjs.map} +1 -1
- package/dist/{chunk-LEKBROJD-BAKGB8s6.cjs → chunk-LEKBROJD-lSH8qRL-.cjs} +2 -2
- package/dist/{chunk-LEKBROJD-BAKGB8s6.cjs.map → chunk-LEKBROJD-lSH8qRL-.cjs.map} +1 -1
- package/dist/{chunk-VPADYNBD-BuWaBJwi.cjs → chunk-VPADYNBD-Cjfz5Alm.cjs} +2 -2
- package/dist/{chunk-VPADYNBD-BuWaBJwi.cjs.map → chunk-VPADYNBD-Cjfz5Alm.cjs.map} +1 -1
- package/dist/{chunk-VPADYNBD-B902D9e8.mjs → chunk-VPADYNBD-D106m_2F.mjs} +2 -2
- package/dist/{chunk-VPADYNBD-B902D9e8.mjs.map → chunk-VPADYNBD-D106m_2F.mjs.map} +1 -1
- package/dist/{chunk-YCLFEX4T-Dn4vKiDg.cjs → chunk-YCLFEX4T-BKdilKg9.cjs} +2 -2
- package/dist/{chunk-YCLFEX4T-Dn4vKiDg.cjs.map → chunk-YCLFEX4T-BKdilKg9.cjs.map} +1 -1
- package/dist/{chunk-YCLFEX4T-LIwTH9SY.mjs → chunk-YCLFEX4T-BNcQm2wg.mjs} +2 -2
- package/dist/{chunk-YCLFEX4T-LIwTH9SY.mjs.map → chunk-YCLFEX4T-BNcQm2wg.mjs.map} +1 -1
- package/dist/{column-XT6UFXNQ-Boj04bYt.cjs → column-XT6UFXNQ-BE9ZFChf.cjs} +2 -2
- package/dist/{column-XT6UFXNQ-Boj04bYt.cjs.map → column-XT6UFXNQ-BE9ZFChf.cjs.map} +1 -1
- package/dist/{column-XT6UFXNQ-kaZr3ck1.mjs → column-XT6UFXNQ-Cv-T7URw.mjs} +2 -2
- package/dist/{column-XT6UFXNQ-kaZr3ck1.mjs.map → column-XT6UFXNQ-Cv-T7URw.mjs.map} +1 -1
- package/dist/{comm-VV2LDX2J-BcfPIK9n.mjs → comm-VV2LDX2J-CwlEnHpG.mjs} +2 -2
- package/dist/{comm-VV2LDX2J-BcfPIK9n.mjs.map → comm-VV2LDX2J-CwlEnHpG.mjs.map} +1 -1
- package/dist/{comm-VV2LDX2J-DgVwT105.cjs → comm-VV2LDX2J-DToPWFK0.cjs} +2 -2
- package/dist/{comm-VV2LDX2J-DgVwT105.cjs.map → comm-VV2LDX2J-DToPWFK0.cjs.map} +1 -1
- package/dist/config.cjs +2 -2
- package/dist/config.mjs +2 -2
- package/dist/{cp-BISAAS7A-D85tMW1Y.mjs → cp-BISAAS7A-Baa7jHjq.mjs} +2 -2
- package/dist/{cp-BISAAS7A-D85tMW1Y.mjs.map → cp-BISAAS7A-Baa7jHjq.mjs.map} +1 -1
- package/dist/{cp-BISAAS7A-Bcf_ba9y.cjs → cp-BISAAS7A-CkmJTroD.cjs} +2 -2
- package/dist/{cp-BISAAS7A-Bcf_ba9y.cjs.map → cp-BISAAS7A-CkmJTroD.cjs.map} +1 -1
- package/dist/{cut-OKARJCCV-B1JE4QQ8.mjs → cut-OKARJCCV-BB4GpDEw.mjs} +3 -3
- package/dist/{cut-OKARJCCV-B1JE4QQ8.mjs.map → cut-OKARJCCV-BB4GpDEw.mjs.map} +1 -1
- package/dist/{cut-OKARJCCV-JizvZoF6.cjs → cut-OKARJCCV-LjiQbogw.cjs} +3 -3
- package/dist/{cut-OKARJCCV-JizvZoF6.cjs.map → cut-OKARJCCV-LjiQbogw.cjs.map} +1 -1
- package/dist/{diff-MWJFIG7X-BMYp-iAk.cjs → diff-MWJFIG7X-4T0AtZb6.cjs} +2 -2
- package/dist/{diff-MWJFIG7X-BMYp-iAk.cjs.map → diff-MWJFIG7X-4T0AtZb6.cjs.map} +1 -1
- package/dist/{diff-MWJFIG7X-DNpSNYB2.mjs → diff-MWJFIG7X-CoLpB5r8.mjs} +2 -2
- package/dist/{diff-MWJFIG7X-DNpSNYB2.mjs.map → diff-MWJFIG7X-CoLpB5r8.mjs.map} +1 -1
- package/dist/{dist-bLC4LOvt.cjs → dist-1gAqMJCK.cjs} +4 -4
- package/dist/dist-1gAqMJCK.cjs.map +1 -0
- package/dist/{dist-Cj3RPKwD.mjs → dist-B2lPLfrR.mjs} +415 -158
- package/dist/dist-B2lPLfrR.mjs.map +1 -0
- package/dist/{dist-D7eFCDTR.mjs → dist-BBJhHiW3.mjs} +4 -4
- package/dist/dist-BBJhHiW3.mjs.map +1 -0
- package/dist/{dist-AKkRwuhE.cjs → dist-ZPZwDr3w.cjs} +414 -157
- package/dist/dist-ZPZwDr3w.cjs.map +1 -0
- package/dist/{du-572XNP42-BwvbhLB4.mjs → du-572XNP42-B4W75agS.mjs} +2 -2
- package/dist/{du-572XNP42-BwvbhLB4.mjs.map → du-572XNP42-B4W75agS.mjs.map} +1 -1
- package/dist/{du-572XNP42-tSkGjDhu.cjs → du-572XNP42-Bu2lK3XF.cjs} +2 -2
- package/dist/{du-572XNP42-tSkGjDhu.cjs.map → du-572XNP42-Bu2lK3XF.cjs.map} +1 -1
- package/dist/{env-36M5BO7M-BwKubobQ.cjs → env-36M5BO7M-Buj1j2Ha.cjs} +2 -2
- package/dist/{env-36M5BO7M-BwKubobQ.cjs.map → env-36M5BO7M-Buj1j2Ha.cjs.map} +1 -1
- package/dist/{env-36M5BO7M-ClR8f-u_.mjs → env-36M5BO7M-CzYSWBAm.mjs} +2 -2
- package/dist/{env-36M5BO7M-ClR8f-u_.mjs.map → env-36M5BO7M-CzYSWBAm.mjs.map} +1 -1
- package/dist/{expand-JSPG6VOP-BWU9TNYW.mjs → expand-JSPG6VOP-B3OiXvMy.mjs} +2 -2
- package/dist/{expand-JSPG6VOP-BWU9TNYW.mjs.map → expand-JSPG6VOP-B3OiXvMy.mjs.map} +1 -1
- package/dist/{expand-JSPG6VOP-BeHkk5Oo.cjs → expand-JSPG6VOP-Ydh9BD2_.cjs} +2 -2
- package/dist/{expand-JSPG6VOP-BeHkk5Oo.cjs.map → expand-JSPG6VOP-Ydh9BD2_.cjs.map} +1 -1
- package/dist/{expr-5JAACS4X-DjCkxQwm.mjs → expr-5JAACS4X-C4pTNZ3u.mjs} +2 -2
- package/dist/{expr-5JAACS4X-DjCkxQwm.mjs.map → expr-5JAACS4X-C4pTNZ3u.mjs.map} +1 -1
- package/dist/{expr-5JAACS4X-CuMpHcmU.cjs → expr-5JAACS4X-DhFIFxWY.cjs} +2 -2
- package/dist/{expr-5JAACS4X-CuMpHcmU.cjs.map → expr-5JAACS4X-DhFIFxWY.cjs.map} +1 -1
- package/dist/{find-INTH3OLC-ANEYvUZg.mjs → find-INTH3OLC-BXgosBN-.mjs} +3 -3
- package/dist/{find-INTH3OLC-ANEYvUZg.mjs.map → find-INTH3OLC-BXgosBN-.mjs.map} +1 -1
- package/dist/{find-INTH3OLC-CGo48GJL.cjs → find-INTH3OLC-CgGC1SmT.cjs} +3 -3
- package/dist/{find-INTH3OLC-CGo48GJL.cjs.map → find-INTH3OLC-CgGC1SmT.cjs.map} +1 -1
- package/dist/{fold-4TQNYMSW-C8GWRkk8.cjs → fold-4TQNYMSW-D9mL8Sn3.cjs} +2 -2
- package/dist/{fold-4TQNYMSW-C8GWRkk8.cjs.map → fold-4TQNYMSW-D9mL8Sn3.cjs.map} +1 -1
- package/dist/{fold-4TQNYMSW-BmpYm0H1.mjs → fold-4TQNYMSW-DMdiKJ06.mjs} +2 -2
- package/dist/{fold-4TQNYMSW-BmpYm0H1.mjs.map → fold-4TQNYMSW-DMdiKJ06.mjs.map} +1 -1
- package/dist/{grep-V3LQVMRQ-FFO9h2h8.mjs → grep-V3LQVMRQ-BKB3zi73.mjs} +4 -4
- package/dist/{grep-V3LQVMRQ-FFO9h2h8.mjs.map → grep-V3LQVMRQ-BKB3zi73.mjs.map} +1 -1
- package/dist/{grep-V3LQVMRQ-9V45Njd7.cjs → grep-V3LQVMRQ-DdECgTsM.cjs} +4 -4
- package/dist/{grep-V3LQVMRQ-9V45Njd7.cjs.map → grep-V3LQVMRQ-DdECgTsM.cjs.map} +1 -1
- package/dist/{gzip-O5ASJAFY-B43NZFRO.cjs → gzip-O5ASJAFY-DXYfhNMl.cjs} +2 -2
- package/dist/{gzip-O5ASJAFY-B43NZFRO.cjs.map → gzip-O5ASJAFY-DXYfhNMl.cjs.map} +1 -1
- package/dist/{gzip-O5ASJAFY-CRDFlLbr.mjs → gzip-O5ASJAFY-qGwUq87o.mjs} +2 -2
- package/dist/{gzip-O5ASJAFY-CRDFlLbr.mjs.map → gzip-O5ASJAFY-qGwUq87o.mjs.map} +1 -1
- package/dist/{head-442HYESI-CXxOStnC.mjs → head-442HYESI-C6Z7-vE9.mjs} +2 -2
- package/dist/{head-442HYESI-CXxOStnC.mjs.map → head-442HYESI-C6Z7-vE9.mjs.map} +1 -1
- package/dist/{head-442HYESI-CmVujDWk.cjs → head-442HYESI-j5KhFbpE.cjs} +2 -2
- package/dist/{head-442HYESI-CmVujDWk.cjs.map → head-442HYESI-j5KhFbpE.cjs.map} +1 -1
- package/dist/{help-HZ6M2CKN-DO23r8PQ.cjs → help-HZ6M2CKN-C8nI-RQW.cjs} +2 -2
- package/dist/{help-HZ6M2CKN-DO23r8PQ.cjs.map → help-HZ6M2CKN-C8nI-RQW.cjs.map} +1 -1
- package/dist/{help-HZ6M2CKN-_fBE8i_X.mjs → help-HZ6M2CKN-CZ6qTcLB.mjs} +2 -2
- package/dist/{help-HZ6M2CKN-_fBE8i_X.mjs.map → help-HZ6M2CKN-CZ6qTcLB.mjs.map} +1 -1
- package/dist/{html-to-markdown-JW4MSQZO-B_ZXZPwG.mjs → html-to-markdown-JW4MSQZO-DUhiVkMF.mjs} +3 -3
- package/dist/{html-to-markdown-JW4MSQZO-B_ZXZPwG.mjs.map → html-to-markdown-JW4MSQZO-DUhiVkMF.mjs.map} +1 -1
- package/dist/{html-to-markdown-JW4MSQZO-CaYVbaxu.cjs → html-to-markdown-JW4MSQZO-g6j8npLf.cjs} +3 -3
- package/dist/{html-to-markdown-JW4MSQZO-CaYVbaxu.cjs.map → html-to-markdown-JW4MSQZO-g6j8npLf.cjs.map} +1 -1
- package/dist/internal.cjs +1 -1
- package/dist/internal.mjs +1 -1
- package/dist/{join-TBRGI3LQ-BKh_m7Ck.cjs → join-TBRGI3LQ-CbBwIms1.cjs} +2 -2
- package/dist/{join-TBRGI3LQ-BKh_m7Ck.cjs.map → join-TBRGI3LQ-CbBwIms1.cjs.map} +1 -1
- package/dist/{join-TBRGI3LQ-Bryan1uc.mjs → join-TBRGI3LQ-CytgtxxD.mjs} +2 -2
- package/dist/{join-TBRGI3LQ-Bryan1uc.mjs.map → join-TBRGI3LQ-CytgtxxD.mjs.map} +1 -1
- package/dist/{jq-4XLYLOS5-DlA0DGTU.mjs → jq-4XLYLOS5-BhbSj1D9.mjs} +4 -4
- package/dist/{jq-4XLYLOS5-DlA0DGTU.mjs.map → jq-4XLYLOS5-BhbSj1D9.mjs.map} +1 -1
- package/dist/{jq-4XLYLOS5-BxFW6--8.cjs → jq-4XLYLOS5-C90BkvNt.cjs} +4 -4
- package/dist/{jq-4XLYLOS5-BxFW6--8.cjs.map → jq-4XLYLOS5-C90BkvNt.cjs.map} +1 -1
- package/dist/{js-exec-N5KEZBH7-1jBR3z1f.mjs → js-exec-N5KEZBH7-B2gt37yR.mjs} +3 -3
- package/dist/{js-exec-N5KEZBH7-1jBR3z1f.mjs.map → js-exec-N5KEZBH7-B2gt37yR.mjs.map} +1 -1
- package/dist/{js-exec-N5KEZBH7-hTtZY8cm.cjs → js-exec-N5KEZBH7-Mu2CT-LK.cjs} +3 -3
- package/dist/{js-exec-N5KEZBH7-hTtZY8cm.cjs.map → js-exec-N5KEZBH7-Mu2CT-LK.cjs.map} +1 -1
- package/dist/{lib-DEuFQ8jW.cjs → lib-B8audCXM.cjs} +2 -2
- package/dist/{lib-DEuFQ8jW.cjs.map → lib-B8audCXM.cjs.map} +1 -1
- package/dist/{lib-DLNAr9hM.mjs → lib-r4uXvKzY.mjs} +2 -2
- package/dist/{lib-DLNAr9hM.mjs.map → lib-r4uXvKzY.mjs.map} +1 -1
- package/dist/{ln-4LGSXXGD-DZ20jRcK.cjs → ln-4LGSXXGD-BwI1Ba1v.cjs} +2 -2
- package/dist/{ln-4LGSXXGD-DZ20jRcK.cjs.map → ln-4LGSXXGD-BwI1Ba1v.cjs.map} +1 -1
- package/dist/{ln-4LGSXXGD-DoMwqtWM.mjs → ln-4LGSXXGD-DK1HQ-Z7.mjs} +2 -2
- package/dist/{ln-4LGSXXGD-DoMwqtWM.mjs.map → ln-4LGSXXGD-DK1HQ-Z7.mjs.map} +1 -1
- package/dist/{ls-ZJGQER7M-Dethi67D.cjs → ls-ZJGQER7M-BH8enpfY.cjs} +2 -2
- package/dist/{ls-ZJGQER7M-Dethi67D.cjs.map → ls-ZJGQER7M-BH8enpfY.cjs.map} +1 -1
- package/dist/{ls-ZJGQER7M-B5gaVKxE.mjs → ls-ZJGQER7M-CDvVLwGN.mjs} +2 -2
- package/dist/{ls-ZJGQER7M-B5gaVKxE.mjs.map → ls-ZJGQER7M-CDvVLwGN.mjs.map} +1 -1
- package/dist/{lzma-O8OSBX-9.cjs → lzma-DRcwNt3i.cjs} +2 -2
- package/dist/{lzma-O8OSBX-9.cjs.map → lzma-DRcwNt3i.cjs.map} +1 -1
- package/dist/{md5sum-SPU24VSG-CAE_-OrT.mjs → md5sum-SPU24VSG-10wb8jSM.mjs} +3 -3
- package/dist/{md5sum-SPU24VSG-CAE_-OrT.mjs.map → md5sum-SPU24VSG-10wb8jSM.mjs.map} +1 -1
- package/dist/{md5sum-SPU24VSG-Dh6HTP0G.cjs → md5sum-SPU24VSG-e7geuGSr.cjs} +3 -3
- package/dist/{md5sum-SPU24VSG-Dh6HTP0G.cjs.map → md5sum-SPU24VSG-e7geuGSr.cjs.map} +1 -1
- package/dist/{mkdir-MEPGZOB6-D5whvinj.cjs → mkdir-MEPGZOB6-DHvBslz2.cjs} +2 -2
- package/dist/{mkdir-MEPGZOB6-D5whvinj.cjs.map → mkdir-MEPGZOB6-DHvBslz2.cjs.map} +1 -1
- package/dist/{mkdir-MEPGZOB6-BaXX8tym.mjs → mkdir-MEPGZOB6-KgCHTAGt.mjs} +2 -2
- package/dist/{mkdir-MEPGZOB6-BaXX8tym.mjs.map → mkdir-MEPGZOB6-KgCHTAGt.mjs.map} +1 -1
- package/dist/{mv-W5BIQ646-Bkt3Wkxb.cjs → mv-W5BIQ646-BvUigdVa.cjs} +2 -2
- package/dist/{mv-W5BIQ646-Bkt3Wkxb.cjs.map → mv-W5BIQ646-BvUigdVa.cjs.map} +1 -1
- package/dist/{mv-W5BIQ646-CwWkCaw1.mjs → mv-W5BIQ646-m6KvTj2j.mjs} +2 -2
- package/dist/{mv-W5BIQ646-CwWkCaw1.mjs.map → mv-W5BIQ646-m6KvTj2j.mjs.map} +1 -1
- package/dist/{nl-WSDW7I4O-DgLzrg9w.cjs → nl-WSDW7I4O-BHCgsxiV.cjs} +2 -2
- package/dist/{nl-WSDW7I4O-DgLzrg9w.cjs.map → nl-WSDW7I4O-BHCgsxiV.cjs.map} +1 -1
- package/dist/{nl-WSDW7I4O-DKNWPtTC.mjs → nl-WSDW7I4O-BOU_uI5i.mjs} +2 -2
- package/dist/{nl-WSDW7I4O-DKNWPtTC.mjs.map → nl-WSDW7I4O-BOU_uI5i.mjs.map} +1 -1
- package/dist/{od-WOKFDJTP-8pORtSkj.cjs → od-WOKFDJTP-CsiFbtX8.cjs} +2 -2
- package/dist/{od-WOKFDJTP-8pORtSkj.cjs.map → od-WOKFDJTP-CsiFbtX8.cjs.map} +1 -1
- package/dist/{od-WOKFDJTP-Ci-7AUKD.mjs → od-WOKFDJTP-D9CDg_0N.mjs} +2 -2
- package/dist/{od-WOKFDJTP-Ci-7AUKD.mjs.map → od-WOKFDJTP-D9CDg_0N.mjs.map} +1 -1
- package/dist/{paste-7JC6S4DX-By-QZFhH.mjs → paste-7JC6S4DX-BPZM8va6.mjs} +2 -2
- package/dist/{paste-7JC6S4DX-By-QZFhH.mjs.map → paste-7JC6S4DX-BPZM8va6.mjs.map} +1 -1
- package/dist/{paste-7JC6S4DX-CcluY3SW.cjs → paste-7JC6S4DX-DOfui9Os.cjs} +2 -2
- package/dist/{paste-7JC6S4DX-CcluY3SW.cjs.map → paste-7JC6S4DX-DOfui9Os.cjs.map} +1 -1
- package/dist/{printf-TWGXF445-BIL2LikJ.mjs → printf-TWGXF445-BFtTTFUx.mjs} +3 -3
- package/dist/{printf-TWGXF445-BIL2LikJ.mjs.map → printf-TWGXF445-BFtTTFUx.mjs.map} +1 -1
- package/dist/{printf-TWGXF445-B2JFcHkJ.cjs → printf-TWGXF445-CxEPw_qf.cjs} +3 -3
- package/dist/{printf-TWGXF445-B2JFcHkJ.cjs.map → printf-TWGXF445-CxEPw_qf.cjs.map} +1 -1
- package/dist/{python3-POMOR4OA-CRUFjgTB.mjs → python3-POMOR4OA-BrPhKjye.mjs} +3 -3
- package/dist/{python3-POMOR4OA-CRUFjgTB.mjs.map → python3-POMOR4OA-BrPhKjye.mjs.map} +1 -1
- package/dist/{python3-POMOR4OA-Bn9o5xa_.cjs → python3-POMOR4OA-C4csB3z_.cjs} +3 -3
- package/dist/{python3-POMOR4OA-Bn9o5xa_.cjs.map → python3-POMOR4OA-C4csB3z_.cjs.map} +1 -1
- package/dist/{rev-5EHFX4EJ-DupNIGct.cjs → rev-5EHFX4EJ-BDPraoKf.cjs} +2 -2
- package/dist/{rev-5EHFX4EJ-DupNIGct.cjs.map → rev-5EHFX4EJ-BDPraoKf.cjs.map} +1 -1
- package/dist/{rev-5EHFX4EJ-CVOJJds6.mjs → rev-5EHFX4EJ-DT84cm7e.mjs} +2 -2
- package/dist/{rev-5EHFX4EJ-CVOJJds6.mjs.map → rev-5EHFX4EJ-DT84cm7e.mjs.map} +1 -1
- package/dist/{rg-S4FXYXWB-DT3iZWlx.cjs → rg-S4FXYXWB-BOtIPQjO.cjs} +3 -3
- package/dist/{rg-S4FXYXWB-DT3iZWlx.cjs.map → rg-S4FXYXWB-BOtIPQjO.cjs.map} +1 -1
- package/dist/{rg-S4FXYXWB-CezCFXCC.mjs → rg-S4FXYXWB-DvLBW3FF.mjs} +3 -3
- package/dist/{rg-S4FXYXWB-CezCFXCC.mjs.map → rg-S4FXYXWB-DvLBW3FF.mjs.map} +1 -1
- package/dist/{rm-SSGETQVQ-DamSzyVi.mjs → rm-SSGETQVQ-CSmxrWHU.mjs} +2 -2
- package/dist/{rm-SSGETQVQ-DamSzyVi.mjs.map → rm-SSGETQVQ-CSmxrWHU.mjs.map} +1 -1
- package/dist/{rm-SSGETQVQ-Dpw1qQmO.cjs → rm-SSGETQVQ-mSI8N9e1.cjs} +2 -2
- package/dist/{rm-SSGETQVQ-Dpw1qQmO.cjs.map → rm-SSGETQVQ-mSI8N9e1.cjs.map} +1 -1
- package/dist/{rmdir-OC4ZLPYA-CjhUuzYY.mjs → rmdir-OC4ZLPYA-DBRCWWxY.mjs} +2 -2
- package/dist/{rmdir-OC4ZLPYA-CjhUuzYY.mjs.map → rmdir-OC4ZLPYA-DBRCWWxY.mjs.map} +1 -1
- package/dist/{rmdir-OC4ZLPYA-BgRhHhqc.cjs → rmdir-OC4ZLPYA-KewwQ5OQ.cjs} +2 -2
- package/dist/{rmdir-OC4ZLPYA-BgRhHhqc.cjs.map → rmdir-OC4ZLPYA-KewwQ5OQ.cjs.map} +1 -1
- package/dist/run.cjs +1 -1
- package/dist/run.mjs +1 -1
- package/dist/{sed-S5UIK574-W9sjT6JH.mjs → sed-S5UIK574-BPN7JI6S.mjs} +2 -2
- package/dist/{sed-S5UIK574-W9sjT6JH.mjs.map → sed-S5UIK574-BPN7JI6S.mjs.map} +1 -1
- package/dist/{sed-S5UIK574-CAB4O14o.cjs → sed-S5UIK574-D2fQ08wE.cjs} +2 -2
- package/dist/{sed-S5UIK574-CAB4O14o.cjs.map → sed-S5UIK574-D2fQ08wE.cjs.map} +1 -1
- package/dist/{sha1sum-2PTOAFR6-CQXvW7hE.cjs → sha1sum-2PTOAFR6-CUzO9jAy.cjs} +3 -3
- package/dist/{sha1sum-2PTOAFR6-CQXvW7hE.cjs.map → sha1sum-2PTOAFR6-CUzO9jAy.cjs.map} +1 -1
- package/dist/{sha1sum-2PTOAFR6-CjO1AnCs.mjs → sha1sum-2PTOAFR6-CaclrBG7.mjs} +3 -3
- package/dist/{sha1sum-2PTOAFR6-CjO1AnCs.mjs.map → sha1sum-2PTOAFR6-CaclrBG7.mjs.map} +1 -1
- package/dist/{sha256sum-NS7D3IXX-CfwCHZAO.cjs → sha256sum-NS7D3IXX-CyjoG_Fo.cjs} +3 -3
- package/dist/{sha256sum-NS7D3IXX-CfwCHZAO.cjs.map → sha256sum-NS7D3IXX-CyjoG_Fo.cjs.map} +1 -1
- package/dist/{sha256sum-NS7D3IXX-CUL2cnM9.mjs → sha256sum-NS7D3IXX-Dirjqo9R.mjs} +3 -3
- package/dist/{sha256sum-NS7D3IXX-CUL2cnM9.mjs.map → sha256sum-NS7D3IXX-Dirjqo9R.mjs.map} +1 -1
- package/dist/{sleep-X22JJINO-f7XVUQXn.cjs → sleep-X22JJINO-BmN15X75.cjs} +2 -2
- package/dist/{sleep-X22JJINO-f7XVUQXn.cjs.map → sleep-X22JJINO-BmN15X75.cjs.map} +1 -1
- package/dist/{sleep-X22JJINO-DterE54A.mjs → sleep-X22JJINO-C85vW9bl.mjs} +2 -2
- package/dist/{sleep-X22JJINO-DterE54A.mjs.map → sleep-X22JJINO-C85vW9bl.mjs.map} +1 -1
- package/dist/{sort-SW2YEO5B-CxI3IB8r.cjs → sort-SW2YEO5B-BXo_cCn8.cjs} +3 -3
- package/dist/{sort-SW2YEO5B-CxI3IB8r.cjs.map → sort-SW2YEO5B-BXo_cCn8.cjs.map} +1 -1
- package/dist/{sort-SW2YEO5B-Bwsz5nWP.mjs → sort-SW2YEO5B-OWnbfe9g.mjs} +3 -3
- package/dist/{sort-SW2YEO5B-Bwsz5nWP.mjs.map → sort-SW2YEO5B-OWnbfe9g.mjs.map} +1 -1
- package/dist/{split-4KKZZXXE-CbYicfn8.cjs → split-4KKZZXXE-BRZ9Onc5.cjs} +2 -2
- package/dist/{split-4KKZZXXE-CbYicfn8.cjs.map → split-4KKZZXXE-BRZ9Onc5.cjs.map} +1 -1
- package/dist/{split-4KKZZXXE-CSlaFM2x.mjs → split-4KKZZXXE-Do1z2dE5.mjs} +2 -2
- package/dist/{split-4KKZZXXE-CSlaFM2x.mjs.map → split-4KKZZXXE-Do1z2dE5.mjs.map} +1 -1
- package/dist/{sqlite3-CGOEFJAO-ZWNmR0V9.cjs → sqlite3-CGOEFJAO-B6nuurF0.cjs} +3 -3
- package/dist/{sqlite3-CGOEFJAO-ZWNmR0V9.cjs.map → sqlite3-CGOEFJAO-B6nuurF0.cjs.map} +1 -1
- package/dist/{sqlite3-CGOEFJAO-c1BPhcI3.mjs → sqlite3-CGOEFJAO-DrBY4xSR.mjs} +3 -3
- package/dist/{sqlite3-CGOEFJAO-c1BPhcI3.mjs.map → sqlite3-CGOEFJAO-DrBY4xSR.mjs.map} +1 -1
- package/dist/{start-MBSz5HQb.cjs → start-ClWb87N-.cjs} +180 -124
- package/dist/start-ClWb87N-.cjs.map +1 -0
- package/dist/{start-CKxh9Ozm.mjs → start-zbLIFKlv.mjs} +180 -124
- package/dist/start-zbLIFKlv.mjs.map +1 -0
- package/dist/start.cjs +1 -1
- package/dist/start.mjs +1 -1
- package/dist/{strings-6WDHLGMX-BdetudYk.cjs → strings-6WDHLGMX-Cja4C0R3.cjs} +2 -2
- package/dist/{strings-6WDHLGMX-BdetudYk.cjs.map → strings-6WDHLGMX-Cja4C0R3.cjs.map} +1 -1
- package/dist/{strings-6WDHLGMX-DiYPNtXb.mjs → strings-6WDHLGMX-DPcD3lVo.mjs} +2 -2
- package/dist/{strings-6WDHLGMX-DiYPNtXb.mjs.map → strings-6WDHLGMX-DPcD3lVo.mjs.map} +1 -1
- package/dist/{tac-2STMMJYW-B7OoWT_U.mjs → tac-2STMMJYW-Bap8fjvo.mjs} +2 -2
- package/dist/{tac-2STMMJYW-B7OoWT_U.mjs.map → tac-2STMMJYW-Bap8fjvo.mjs.map} +1 -1
- package/dist/{tac-2STMMJYW-BSY6Cwj8.cjs → tac-2STMMJYW-hqV9IWjO.cjs} +2 -2
- package/dist/{tac-2STMMJYW-BSY6Cwj8.cjs.map → tac-2STMMJYW-hqV9IWjO.cjs.map} +1 -1
- package/dist/{tail-R4PCA2C4-CLN95T7S.mjs → tail-R4PCA2C4-D8gTAJv4.mjs} +2 -2
- package/dist/{tail-R4PCA2C4-CLN95T7S.mjs.map → tail-R4PCA2C4-D8gTAJv4.mjs.map} +1 -1
- package/dist/{tail-R4PCA2C4-DjxLbbV-.cjs → tail-R4PCA2C4-DLYInTSg.cjs} +2 -2
- package/dist/{tail-R4PCA2C4-DjxLbbV-.cjs.map → tail-R4PCA2C4-DLYInTSg.cjs.map} +1 -1
- package/dist/{tar-STHHZTZ6-DF-n62Vs.mjs → tar-STHHZTZ6-BvaMjwan.mjs} +4 -4
- package/dist/{tar-STHHZTZ6-DF-n62Vs.mjs.map → tar-STHHZTZ6-BvaMjwan.mjs.map} +1 -1
- package/dist/{tar-STHHZTZ6-DvB6AkG2.cjs → tar-STHHZTZ6-C1coMUN-.cjs} +5 -5
- package/dist/{tar-STHHZTZ6-DvB6AkG2.cjs.map → tar-STHHZTZ6-C1coMUN-.cjs.map} +1 -1
- package/dist/{tee-YUZ2FKCJ-_l9qTJch.mjs → tee-YUZ2FKCJ-BeZbMeQg.mjs} +2 -2
- package/dist/{tee-YUZ2FKCJ-_l9qTJch.mjs.map → tee-YUZ2FKCJ-BeZbMeQg.mjs.map} +1 -1
- package/dist/{tee-YUZ2FKCJ-CksTNads.cjs → tee-YUZ2FKCJ-DZjg1j71.cjs} +2 -2
- package/dist/{tee-YUZ2FKCJ-CksTNads.cjs.map → tee-YUZ2FKCJ-DZjg1j71.cjs.map} +1 -1
- package/dist/{time-D4LNBSWX-40_1kPdP.mjs → time-D4LNBSWX-CwNJDX9k.mjs} +2 -2
- package/dist/{time-D4LNBSWX-40_1kPdP.mjs.map → time-D4LNBSWX-CwNJDX9k.mjs.map} +1 -1
- package/dist/{time-D4LNBSWX-DiI0vjvV.cjs → time-D4LNBSWX-D0o9WKnd.cjs} +2 -2
- package/dist/{time-D4LNBSWX-DiI0vjvV.cjs.map → time-D4LNBSWX-D0o9WKnd.cjs.map} +1 -1
- package/dist/{timeout-YDCRSLPQ-CUgf7efV.mjs → timeout-YDCRSLPQ-BYQu8FB_.mjs} +2 -2
- package/dist/{timeout-YDCRSLPQ-CUgf7efV.mjs.map → timeout-YDCRSLPQ-BYQu8FB_.mjs.map} +1 -1
- package/dist/{timeout-YDCRSLPQ-cmqLQn-O.cjs → timeout-YDCRSLPQ-gCL0dPir.cjs} +2 -2
- package/dist/{timeout-YDCRSLPQ-cmqLQn-O.cjs.map → timeout-YDCRSLPQ-gCL0dPir.cjs.map} +1 -1
- package/dist/{touch-UA33VN3N-02vOLkJx.mjs → touch-UA33VN3N-Clj615aH.mjs} +2 -2
- package/dist/{touch-UA33VN3N-02vOLkJx.mjs.map → touch-UA33VN3N-Clj615aH.mjs.map} +1 -1
- package/dist/{touch-UA33VN3N-B3rLDkVA.cjs → touch-UA33VN3N-W1buBQYM.cjs} +2 -2
- package/dist/{touch-UA33VN3N-B3rLDkVA.cjs.map → touch-UA33VN3N-W1buBQYM.cjs.map} +1 -1
- package/dist/{tr-36LHWFRQ-BwnDmJhv.mjs → tr-36LHWFRQ-DPz3syv0.mjs} +2 -2
- package/dist/{tr-36LHWFRQ-BwnDmJhv.mjs.map → tr-36LHWFRQ-DPz3syv0.mjs.map} +1 -1
- package/dist/{tr-36LHWFRQ-BfGf2mLy.cjs → tr-36LHWFRQ-DS2DvRpE.cjs} +2 -2
- package/dist/{tr-36LHWFRQ-BfGf2mLy.cjs.map → tr-36LHWFRQ-DS2DvRpE.cjs.map} +1 -1
- package/dist/{tree-YLD52CNT-DqLUz109.mjs → tree-YLD52CNT-BbMGKPvW.mjs} +2 -2
- package/dist/{tree-YLD52CNT-DqLUz109.mjs.map → tree-YLD52CNT-BbMGKPvW.mjs.map} +1 -1
- package/dist/{tree-YLD52CNT-B3eXfjPn.cjs → tree-YLD52CNT-BoQBXdSr.cjs} +2 -2
- package/dist/{tree-YLD52CNT-B3eXfjPn.cjs.map → tree-YLD52CNT-BoQBXdSr.cjs.map} +1 -1
- package/dist/{unexpand-CADSA4VO-VlwyRCQP.mjs → unexpand-CADSA4VO-C0IRoV5k.mjs} +2 -2
- package/dist/{unexpand-CADSA4VO-VlwyRCQP.mjs.map → unexpand-CADSA4VO-C0IRoV5k.mjs.map} +1 -1
- package/dist/{unexpand-CADSA4VO-CdhtwV2v.cjs → unexpand-CADSA4VO-DM36-Dne.cjs} +2 -2
- package/dist/{unexpand-CADSA4VO-CdhtwV2v.cjs.map → unexpand-CADSA4VO-DM36-Dne.cjs.map} +1 -1
- package/dist/{uniq-XSIZR6PB-DAXqaH8E.mjs → uniq-XSIZR6PB-DTNQOumC.mjs} +3 -3
- package/dist/{uniq-XSIZR6PB-DAXqaH8E.mjs.map → uniq-XSIZR6PB-DTNQOumC.mjs.map} +1 -1
- package/dist/{uniq-XSIZR6PB-Ch7QSVAZ.cjs → uniq-XSIZR6PB-cbqtNDFd.cjs} +3 -3
- package/dist/{uniq-XSIZR6PB-Ch7QSVAZ.cjs.map → uniq-XSIZR6PB-cbqtNDFd.cjs.map} +1 -1
- package/dist/{wc-LF7NU4LA-Ny3uANGM.cjs → wc-LF7NU4LA-CmxEf7a9.cjs} +3 -3
- package/dist/{wc-LF7NU4LA-Ny3uANGM.cjs.map → wc-LF7NU4LA-CmxEf7a9.cjs.map} +1 -1
- package/dist/{wc-LF7NU4LA-Q1EAygpb.mjs → wc-LF7NU4LA-CrZ2_f9J.mjs} +3 -3
- package/dist/{wc-LF7NU4LA-Q1EAygpb.mjs.map → wc-LF7NU4LA-CrZ2_f9J.mjs.map} +1 -1
- package/dist/{with-project-scope-BqDYOg9O.mjs → with-project-scope-5Gfc8263.mjs} +2 -2
- package/dist/{with-project-scope-BqDYOg9O.mjs.map → with-project-scope-5Gfc8263.mjs.map} +1 -1
- package/dist/{with-project-scope-CYWdNoND.cjs → with-project-scope-Hh6iqeoh.cjs} +2 -2
- package/dist/{with-project-scope-CYWdNoND.cjs.map → with-project-scope-Hh6iqeoh.cjs.map} +1 -1
- package/dist/{xan-Y6WF3IRG-QiEtoTG4.cjs → xan-Y6WF3IRG-CdBO57j3.cjs} +6 -6
- package/dist/{xan-Y6WF3IRG-QiEtoTG4.cjs.map → xan-Y6WF3IRG-CdBO57j3.cjs.map} +1 -1
- package/dist/{xan-Y6WF3IRG-unqwcLj2.mjs → xan-Y6WF3IRG-rLQOC4c5.mjs} +6 -6
- package/dist/{xan-Y6WF3IRG-unqwcLj2.mjs.map → xan-Y6WF3IRG-rLQOC4c5.mjs.map} +1 -1
- package/dist/{xan-view-HDVKHFC2-Dg8w1JPa.mjs → xan-view-HDVKHFC2-BLteyNnh.mjs} +3 -3
- package/dist/{xan-view-HDVKHFC2-Dg8w1JPa.mjs.map → xan-view-HDVKHFC2-BLteyNnh.mjs.map} +1 -1
- package/dist/{xan-view-HDVKHFC2-BuH-MKEl.cjs → xan-view-HDVKHFC2-CJxt0KHg.cjs} +3 -3
- package/dist/{xan-view-HDVKHFC2-BuH-MKEl.cjs.map → xan-view-HDVKHFC2-CJxt0KHg.cjs.map} +1 -1
- package/dist/{xargs-MGZPH7AX-BbxYcwaV.cjs → xargs-MGZPH7AX-BwI33_UH.cjs} +2 -2
- package/dist/{xargs-MGZPH7AX-BbxYcwaV.cjs.map → xargs-MGZPH7AX-BwI33_UH.cjs.map} +1 -1
- package/dist/{xargs-MGZPH7AX-2U3kL7dv.mjs → xargs-MGZPH7AX-zJMHUR_2.mjs} +2 -2
- package/dist/{xargs-MGZPH7AX-2U3kL7dv.mjs.map → xargs-MGZPH7AX-zJMHUR_2.mjs.map} +1 -1
- package/dist/{yq-4QJW3EQG-DNbPHGic.mjs → yq-4QJW3EQG-B_jhRTwa.mjs} +3 -3
- package/dist/{yq-4QJW3EQG-DNbPHGic.mjs.map → yq-4QJW3EQG-B_jhRTwa.mjs.map} +1 -1
- package/dist/{yq-4QJW3EQG-DxlASFGb.cjs → yq-4QJW3EQG-CpEslf6d.cjs} +3 -3
- package/dist/{yq-4QJW3EQG-DxlASFGb.cjs.map → yq-4QJW3EQG-CpEslf6d.cjs.map} +1 -1
- package/package.json +1 -1
- package/dist/dist-AKkRwuhE.cjs.map +0 -1
- package/dist/dist-Cj3RPKwD.mjs.map +0 -1
- package/dist/dist-D7eFCDTR.mjs.map +0 -1
- package/dist/dist-bLC4LOvt.cjs.map +0 -1
- package/dist/start-CKxh9Ozm.mjs.map +0 -1
- package/dist/start-MBSz5HQb.cjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_dist$3 = require("./dist-
|
|
1
|
+
const require_dist$3 = require("./dist-1gAqMJCK.cjs");
|
|
2
2
|
let node_crypto = require("node:crypto");
|
|
3
3
|
let _keystrokehq_database = require("@keystrokehq/database");
|
|
4
4
|
let node_events = require("node:events");
|
|
@@ -10224,6 +10224,7 @@ function mcpProbeToAppTemplate(probe) {
|
|
|
10224
10224
|
};
|
|
10225
10225
|
return {
|
|
10226
10226
|
authKind: "api_key",
|
|
10227
|
+
credentialScheme: "NO_AUTH",
|
|
10227
10228
|
credentialFields: {},
|
|
10228
10229
|
oauthScopes: [],
|
|
10229
10230
|
url
|
|
@@ -10724,10 +10725,10 @@ const CreateCredentialsRequestSchema = CredentialTargetsFieldsSchema.extend({
|
|
|
10724
10725
|
message: "OAuth credentials are created via the OAuth callback",
|
|
10725
10726
|
path: ["connectionKind"]
|
|
10726
10727
|
});
|
|
10727
|
-
if (input.connectionKind === "none") ctx.addIssue({
|
|
10728
|
+
if (input.connectionKind === "none" && input.value) ctx.addIssue({
|
|
10728
10729
|
code: "custom",
|
|
10729
|
-
message: "
|
|
10730
|
-
path: ["
|
|
10730
|
+
message: "value is not allowed for no-auth connections",
|
|
10731
|
+
path: ["value"]
|
|
10731
10732
|
});
|
|
10732
10733
|
});
|
|
10733
10734
|
/** Request body for `PATCH /api/credentials/:id`. */
|
|
@@ -13187,7 +13188,7 @@ function registerWorkflowRunGetter(fn) {
|
|
|
13187
13188
|
}
|
|
13188
13189
|
new node_async_hooks.AsyncLocalStorage();
|
|
13189
13190
|
//#endregion
|
|
13190
|
-
//#region ../../packages/credentials/dist/store-
|
|
13191
|
+
//#region ../../packages/credentials/dist/store-B7IWQPwD.mjs
|
|
13191
13192
|
function normalizeRow(row) {
|
|
13192
13193
|
const { projectId: _projectId, ...rest } = row;
|
|
13193
13194
|
return rest;
|
|
@@ -24843,21 +24844,29 @@ var StreamableHTTPClientTransport = class {
|
|
|
24843
24844
|
};
|
|
24844
24845
|
//#endregion
|
|
24845
24846
|
//#region ../../packages/mcp/dist/index.mjs
|
|
24846
|
-
|
|
24847
|
-
|
|
24848
|
-
|
|
24849
|
-
|
|
24850
|
-
|
|
24851
|
-
|
|
24852
|
-
|
|
24853
|
-
|
|
24854
|
-
|
|
24855
|
-
|
|
24856
|
-
|
|
24857
|
-
|
|
24858
|
-
|
|
24859
|
-
|
|
24860
|
-
|
|
24847
|
+
function challengeParameter(value, name) {
|
|
24848
|
+
const match = new RegExp(`(?:^|,)\\s*${name}\\s*=\\s*(?:"((?:[^"\\\\]|\\\\.)*)"|([^,\\s]+))`, "i").exec(value);
|
|
24849
|
+
return (match?.[1] ?? match?.[2])?.replace(/\\(["\\])/g, "$1").trim() || void 0;
|
|
24850
|
+
}
|
|
24851
|
+
/** Parse the Bearer challenge even when another authentication scheme appears first. */
|
|
24852
|
+
function parseMcpBearerChallenge(response) {
|
|
24853
|
+
const header = response.headers.get("www-authenticate");
|
|
24854
|
+
if (!header) return {};
|
|
24855
|
+
const bearer = /(?:^|,)\s*Bearer(?:\s+|$)/i.exec(header);
|
|
24856
|
+
if (!bearer) return {};
|
|
24857
|
+
const parameters = header.slice(bearer.index + bearer[0].length);
|
|
24858
|
+
const resourceMetadata = challengeParameter(parameters, "resource_metadata");
|
|
24859
|
+
const scope = challengeParameter(parameters, "scope");
|
|
24860
|
+
const error = challengeParameter(parameters, "error");
|
|
24861
|
+
let resourceMetadataUrl;
|
|
24862
|
+
if (resourceMetadata) try {
|
|
24863
|
+
resourceMetadataUrl = new URL(resourceMetadata);
|
|
24864
|
+
} catch {}
|
|
24865
|
+
return {
|
|
24866
|
+
...resourceMetadataUrl ? { resourceMetadataUrl } : {},
|
|
24867
|
+
...scope ? { scope } : {},
|
|
24868
|
+
...error ? { error } : {}
|
|
24869
|
+
};
|
|
24861
24870
|
}
|
|
24862
24871
|
/** Thrown when a URL is not safe for server-side outbound fetch (SSRF guard). */
|
|
24863
24872
|
var PublicHttpUrlError = class extends Error {
|
|
@@ -24970,6 +24979,7 @@ function createPublicHttpFetch(fetchFn = fetch) {
|
|
|
24970
24979
|
});
|
|
24971
24980
|
};
|
|
24972
24981
|
}
|
|
24982
|
+
const MCP_AUTHORIZATION_PROTOCOL_VERSION = "2025-11-25";
|
|
24973
24983
|
function resourceNameFromMetadata(metadata) {
|
|
24974
24984
|
return metadata?.resource_name?.trim() || void 0;
|
|
24975
24985
|
}
|
|
@@ -24989,6 +24999,74 @@ async function probeUnauthenticatedStatus(url, fetchFn) {
|
|
|
24989
24999
|
return {};
|
|
24990
25000
|
}
|
|
24991
25001
|
}
|
|
25002
|
+
function assertHttps(value, label) {
|
|
25003
|
+
if (new URL(value).protocol !== "https:") throw new Error(`${label} must use HTTPS`);
|
|
25004
|
+
}
|
|
25005
|
+
function assertPublicHttpsUrl(value, label) {
|
|
25006
|
+
assertPublicHttpUrl(value);
|
|
25007
|
+
assertHttps(value, label);
|
|
25008
|
+
}
|
|
25009
|
+
function assertResourceIdentity(serverUrl, resource) {
|
|
25010
|
+
const resourceUrl = new URL(resource);
|
|
25011
|
+
if (serverUrl.hash || resourceUrl.hash || resourceUrl.toString() !== serverUrl.toString()) throw new Error("MCP protected resource does not match the requested MCP server URL");
|
|
25012
|
+
}
|
|
25013
|
+
function validateAuthorizationServerMetadata(authorizationServerUrl, metadata) {
|
|
25014
|
+
if (metadata.issuer !== authorizationServerUrl) throw new Error("MCP authorization server metadata issuer does not match authorization server");
|
|
25015
|
+
if (!metadata.authorization_endpoint || !metadata.token_endpoint) throw new Error("MCP authorization server metadata is missing required endpoints");
|
|
25016
|
+
assertPublicHttpsUrl(metadata.authorization_endpoint, "MCP authorization endpoint");
|
|
25017
|
+
assertPublicHttpsUrl(metadata.token_endpoint, "MCP token endpoint");
|
|
25018
|
+
if (metadata.registration_endpoint) assertPublicHttpsUrl(metadata.registration_endpoint, "MCP registration endpoint");
|
|
25019
|
+
}
|
|
25020
|
+
async function discoverMcpOAuthServerFromProbe(url, safeFetch, initial) {
|
|
25021
|
+
const serverUrl = new URL(url);
|
|
25022
|
+
assertHttps(serverUrl, "MCP server URL");
|
|
25023
|
+
const { status } = initial;
|
|
25024
|
+
const wwwAuthenticate = status === 401 ? initial.wwwAuthenticate : void 0;
|
|
25025
|
+
let resourceMetadataUrl;
|
|
25026
|
+
let challengeScope;
|
|
25027
|
+
if (wwwAuthenticate) {
|
|
25028
|
+
const params = parseMcpBearerChallenge(new Response(null, { headers: { "www-authenticate": wwwAuthenticate } }));
|
|
25029
|
+
resourceMetadataUrl = params.resourceMetadataUrl;
|
|
25030
|
+
challengeScope = params.scope?.trim() || void 0;
|
|
25031
|
+
if (resourceMetadataUrl) {
|
|
25032
|
+
assertPublicHttpUrl(resourceMetadataUrl.toString());
|
|
25033
|
+
assertHttps(resourceMetadataUrl, "MCP resource metadata URL");
|
|
25034
|
+
}
|
|
25035
|
+
}
|
|
25036
|
+
const resourceMetadata = await discoverOAuthProtectedResourceMetadata(serverUrl, {
|
|
25037
|
+
protocolVersion: MCP_AUTHORIZATION_PROTOCOL_VERSION,
|
|
25038
|
+
...resourceMetadataUrl ? { resourceMetadataUrl } : {}
|
|
25039
|
+
}, safeFetch);
|
|
25040
|
+
if (!resourceMetadata.resource) throw new Error("MCP protected resource metadata is missing resource");
|
|
25041
|
+
if (!resourceMetadata.authorization_servers?.length) throw new Error("MCP protected resource metadata is missing authorization_servers");
|
|
25042
|
+
assertResourceIdentity(serverUrl, resourceMetadata.resource);
|
|
25043
|
+
const authorizationServerUrl = resourceMetadata.authorization_servers[0];
|
|
25044
|
+
if (!authorizationServerUrl) throw new Error("MCP protected resource metadata is missing authorization_servers");
|
|
25045
|
+
assertPublicHttpsUrl(authorizationServerUrl, "MCP authorization server URL");
|
|
25046
|
+
const authorizationServerMetadata = await discoverAuthorizationServerMetadata(authorizationServerUrl, {
|
|
25047
|
+
fetchFn: safeFetch,
|
|
25048
|
+
protocolVersion: MCP_AUTHORIZATION_PROTOCOL_VERSION
|
|
25049
|
+
});
|
|
25050
|
+
if (!authorizationServerMetadata) throw new Error("MCP authorization server metadata was not found");
|
|
25051
|
+
validateAuthorizationServerMetadata(authorizationServerUrl, authorizationServerMetadata);
|
|
25052
|
+
return {
|
|
25053
|
+
authorizationServerUrl,
|
|
25054
|
+
authorizationServerMetadata,
|
|
25055
|
+
resourceMetadata,
|
|
25056
|
+
...resourceMetadataUrl ? { resourceMetadataUrl: resourceMetadataUrl.toString() } : {},
|
|
25057
|
+
...challengeScope ? { challengeScope } : {},
|
|
25058
|
+
...status !== void 0 ? { unauthenticatedStatus: status } : {}
|
|
25059
|
+
};
|
|
25060
|
+
}
|
|
25061
|
+
/**
|
|
25062
|
+
* Discover an MCP authorization server without the legacy origin fallback.
|
|
25063
|
+
* MCP 2025-11-25 requires protected-resource metadata for AS selection.
|
|
25064
|
+
*/
|
|
25065
|
+
async function discoverMcpOAuthServer(url, fetchFn = fetch) {
|
|
25066
|
+
assertPublicHttpUrl(url);
|
|
25067
|
+
const safeFetch = createPublicHttpFetch(fetchFn);
|
|
25068
|
+
return discoverMcpOAuthServerFromProbe(url, safeFetch, await probeUnauthenticatedStatus(url, safeFetch));
|
|
25069
|
+
}
|
|
24992
25070
|
function scopesFromMetadata(metadata) {
|
|
24993
25071
|
if (!metadata?.scopes_supported?.length) return [];
|
|
24994
25072
|
return metadata.scopes_supported;
|
|
@@ -25001,68 +25079,37 @@ function logProbeFallback(phase, error) {
|
|
|
25001
25079
|
async function probeMcpAuth(url, fetchFn = fetch) {
|
|
25002
25080
|
assertPublicHttpUrl(url);
|
|
25003
25081
|
const safeFetch = createPublicHttpFetch(fetchFn);
|
|
25004
|
-
const
|
|
25005
|
-
const { status, wwwAuthenticate } = await probeUnauthenticatedStatus(url, safeFetch);
|
|
25006
|
-
let resourceMetadataUrl;
|
|
25007
|
-
if (wwwAuthenticate) {
|
|
25008
|
-
resourceMetadataUrl = extractWWWAuthenticateParams(new Response(null, { headers: { "www-authenticate": wwwAuthenticate } })).resourceMetadataUrl?.toString();
|
|
25009
|
-
if (resourceMetadataUrl) assertPublicHttpUrl(resourceMetadataUrl);
|
|
25010
|
-
}
|
|
25082
|
+
const initial = await probeUnauthenticatedStatus(url, safeFetch);
|
|
25011
25083
|
try {
|
|
25012
|
-
const discovered = await
|
|
25013
|
-
fetchFn: safeFetch,
|
|
25014
|
-
...resourceMetadataUrl ? { resourceMetadataUrl: new URL(resourceMetadataUrl) } : {}
|
|
25015
|
-
});
|
|
25084
|
+
const discovered = await discoverMcpOAuthServerFromProbe(url, safeFetch, initial);
|
|
25016
25085
|
const metadata = discovered.authorizationServerMetadata;
|
|
25017
25086
|
if (metadata?.authorization_endpoint && metadata.token_endpoint) return {
|
|
25018
25087
|
url,
|
|
25019
25088
|
mode: "oauth",
|
|
25020
|
-
unauthenticatedStatus: status,
|
|
25089
|
+
unauthenticatedStatus: initial.status,
|
|
25021
25090
|
oauth: {
|
|
25022
25091
|
issuer: metadata.issuer,
|
|
25023
25092
|
authorizationEndpoint: metadata.authorization_endpoint,
|
|
25024
25093
|
tokenEndpoint: metadata.token_endpoint,
|
|
25025
25094
|
registrationEndpoint: metadata.registration_endpoint,
|
|
25026
|
-
scopes:
|
|
25095
|
+
scopes: discovered.challengeScope ? discovered.challengeScope.split(/\s+/).filter(Boolean) : scopesFromMetadata(discovered.resourceMetadata),
|
|
25027
25096
|
resource: discovered.resourceMetadata?.resource,
|
|
25028
25097
|
resourceName: resourceNameFromMetadata(discovered.resourceMetadata)
|
|
25029
25098
|
}
|
|
25030
25099
|
};
|
|
25031
25100
|
} catch (error) {
|
|
25032
|
-
logProbeFallback("
|
|
25033
|
-
}
|
|
25034
|
-
try {
|
|
25035
|
-
const protectedResource = await discoverOAuthProtectedResourceMetadata(serverUrl, {}, safeFetch);
|
|
25036
|
-
const authorizationServerUrl = protectedResource.authorization_servers?.[0] ?? serverUrl.origin;
|
|
25037
|
-
assertPublicHttpUrl(authorizationServerUrl);
|
|
25038
|
-
const metadata = await discoverAuthorizationServerMetadata(authorizationServerUrl, { fetchFn: safeFetch });
|
|
25039
|
-
if (metadata?.authorization_endpoint && metadata.token_endpoint) return {
|
|
25040
|
-
url,
|
|
25041
|
-
mode: "oauth",
|
|
25042
|
-
unauthenticatedStatus: status,
|
|
25043
|
-
oauth: {
|
|
25044
|
-
issuer: metadata.issuer,
|
|
25045
|
-
authorizationEndpoint: metadata.authorization_endpoint,
|
|
25046
|
-
tokenEndpoint: metadata.token_endpoint,
|
|
25047
|
-
registrationEndpoint: metadata.registration_endpoint,
|
|
25048
|
-
scopes: mergeOAuthScopes(scopesFromMetadata(metadata), scopesFromMetadata(protectedResource)),
|
|
25049
|
-
resource: protectedResource.resource,
|
|
25050
|
-
resourceName: resourceNameFromMetadata(protectedResource)
|
|
25051
|
-
}
|
|
25052
|
-
};
|
|
25053
|
-
} catch (error) {
|
|
25054
|
-
logProbeFallback("discoverOAuthProtectedResourceMetadata", error);
|
|
25101
|
+
logProbeFallback("discoverMcpOAuthServer", error);
|
|
25055
25102
|
}
|
|
25056
|
-
if (status === 401 || status === 403) return {
|
|
25103
|
+
if (initial.status === 401 || initial.status === 403) return {
|
|
25057
25104
|
url,
|
|
25058
25105
|
mode: "token",
|
|
25059
|
-
unauthenticatedStatus: status,
|
|
25106
|
+
unauthenticatedStatus: initial.status,
|
|
25060
25107
|
scheme: "BEARER_TOKEN"
|
|
25061
25108
|
};
|
|
25062
25109
|
return {
|
|
25063
25110
|
url,
|
|
25064
25111
|
mode: "none",
|
|
25065
|
-
unauthenticatedStatus: status
|
|
25112
|
+
unauthenticatedStatus: initial.status
|
|
25066
25113
|
};
|
|
25067
25114
|
}
|
|
25068
25115
|
/** Best-effort server metadata for no-auth MCP servers (initialize handshake). */
|
|
@@ -31882,11 +31929,70 @@ async function describeCredentialBindings(requirements, context) {
|
|
|
31882
31929
|
preload
|
|
31883
31930
|
}, preload));
|
|
31884
31931
|
}
|
|
31885
|
-
|
|
31886
|
-
|
|
31887
|
-
|
|
31888
|
-
|
|
31889
|
-
return
|
|
31932
|
+
const DEFAULT_STATE_TTL_MS = 600 * 1e3;
|
|
31933
|
+
function defaultSigningKey() {
|
|
31934
|
+
const secret = process.env.CREDENTIALS_ENCRYPTION_KEY?.trim();
|
|
31935
|
+
if (!secret) throw new Error("CREDENTIALS_ENCRYPTION_KEY is required");
|
|
31936
|
+
return secret;
|
|
31937
|
+
}
|
|
31938
|
+
function signPayload(payload, signingKey) {
|
|
31939
|
+
return (0, node_crypto.createHmac)("sha256", signingKey()).update(payload).digest("base64url");
|
|
31940
|
+
}
|
|
31941
|
+
function createOAuthState(options = {}) {
|
|
31942
|
+
const signingKey = options.signingKey ?? defaultSigningKey;
|
|
31943
|
+
const payload = options.payload ?? {};
|
|
31944
|
+
const payloadSegment = (options.serializePayload ?? (() => ""))(payload);
|
|
31945
|
+
const id = (0, node_crypto.randomBytes)(16).toString("hex");
|
|
31946
|
+
const expiresAt = Date.now() + (options.ttlMs ?? DEFAULT_STATE_TTL_MS);
|
|
31947
|
+
const signedPayload = payloadSegment ? `${id}.${expiresAt}.${payloadSegment}` : `${id}.${expiresAt}`;
|
|
31948
|
+
return {
|
|
31949
|
+
state: `${signedPayload}.${signPayload(signedPayload, signingKey)}`,
|
|
31950
|
+
payload,
|
|
31951
|
+
id,
|
|
31952
|
+
expiresAt
|
|
31953
|
+
};
|
|
31954
|
+
}
|
|
31955
|
+
function verifyOAuthState(options, state) {
|
|
31956
|
+
if (!state) return null;
|
|
31957
|
+
const hasPayload = Boolean(options.deserializePayload);
|
|
31958
|
+
const parts = state.split(".");
|
|
31959
|
+
if (parts.length !== (hasPayload ? 4 : 3)) return null;
|
|
31960
|
+
const [id, expiresRaw] = parts;
|
|
31961
|
+
const signature = parts.at(-1);
|
|
31962
|
+
if (!id || !expiresRaw || !signature) return null;
|
|
31963
|
+
const payloadSegment = hasPayload ? parts[2] ?? "" : "";
|
|
31964
|
+
const expected = signPayload(hasPayload ? `${id}.${expiresRaw}.${payloadSegment}` : `${id}.${expiresRaw}`, options.signingKey ?? defaultSigningKey);
|
|
31965
|
+
const signatureBuffer = Buffer.from(signature);
|
|
31966
|
+
const expectedBuffer = Buffer.from(expected);
|
|
31967
|
+
if (signatureBuffer.length !== expectedBuffer.length || !(0, node_crypto.timingSafeEqual)(signatureBuffer, expectedBuffer)) return null;
|
|
31968
|
+
const expiresAt = Number(expiresRaw);
|
|
31969
|
+
if (!Number.isFinite(expiresAt) || expiresAt < Date.now()) return null;
|
|
31970
|
+
if (!hasPayload) return {};
|
|
31971
|
+
return options.deserializePayload(payloadSegment);
|
|
31972
|
+
}
|
|
31973
|
+
async function encodeOAuthState(payload, ttlMs) {
|
|
31974
|
+
const { state, id, expiresAt } = createOAuthState({
|
|
31975
|
+
payload,
|
|
31976
|
+
ttlMs
|
|
31977
|
+
});
|
|
31978
|
+
await (0, _keystrokehq_platform_database.putOAuthPendingState)({
|
|
31979
|
+
id,
|
|
31980
|
+
payloadCiphertext: (0, _keystrokehq_database.encryptCredentialPayload)(JSON.stringify(payload)),
|
|
31981
|
+
expiresAt: new Date(expiresAt)
|
|
31982
|
+
});
|
|
31983
|
+
return state;
|
|
31984
|
+
}
|
|
31985
|
+
async function decodeOAuthState(state) {
|
|
31986
|
+
const verified = verifyOAuthState({}, state);
|
|
31987
|
+
const id = state.split(".")[0];
|
|
31988
|
+
if (!verified || !id) throw new Error("OAuth state is invalid or expired");
|
|
31989
|
+
const ciphertext = await (0, _keystrokehq_platform_database.takeOAuthPendingState)(id);
|
|
31990
|
+
if (!ciphertext) throw new Error("OAuth state is invalid or expired");
|
|
31991
|
+
try {
|
|
31992
|
+
return JSON.parse((0, _keystrokehq_database.decryptCredentialPayload)(ciphertext));
|
|
31993
|
+
} catch {
|
|
31994
|
+
throw new Error("OAuth state is invalid or expired");
|
|
31995
|
+
}
|
|
31890
31996
|
}
|
|
31891
31997
|
function oauthAppMetadata(oauth, mcpUrl, options) {
|
|
31892
31998
|
return {
|
|
@@ -31897,7 +32003,9 @@ function oauthAppMetadata(oauth, mcpUrl, options) {
|
|
|
31897
32003
|
resource: oauth.resource,
|
|
31898
32004
|
issuer: oauth.issuer,
|
|
31899
32005
|
scopes: oauth.scopes,
|
|
31900
|
-
...options?.tokenEndpointAuthMethod ? { tokenEndpointAuthMethod: options.tokenEndpointAuthMethod } : {}
|
|
32006
|
+
...options?.tokenEndpointAuthMethod ? { tokenEndpointAuthMethod: options.tokenEndpointAuthMethod } : {},
|
|
32007
|
+
...options?.clientRegistrationMode ? { clientRegistrationMode: options.clientRegistrationMode } : {},
|
|
32008
|
+
...options?.redirectUri ? { redirectUri: options.redirectUri } : {}
|
|
31901
32009
|
};
|
|
31902
32010
|
}
|
|
31903
32011
|
function oauthClientSecretForStorage(clientSecret) {
|
|
@@ -31928,14 +32036,62 @@ async function discoverMcpApp(url) {
|
|
|
31928
32036
|
};
|
|
31929
32037
|
}
|
|
31930
32038
|
var McpOAuthConnectError = class extends Error {
|
|
32039
|
+
phase;
|
|
31931
32040
|
diagnostics;
|
|
31932
|
-
phase =
|
|
31933
|
-
|
|
31934
|
-
|
|
32041
|
+
constructor(phase, message, diagnostics = {}) {
|
|
32042
|
+
super(message);
|
|
32043
|
+
this.phase = phase;
|
|
31935
32044
|
this.diagnostics = diagnostics;
|
|
31936
32045
|
this.name = "McpOAuthConnectError";
|
|
31937
32046
|
}
|
|
31938
32047
|
};
|
|
32048
|
+
function oauthErrorCode(error) {
|
|
32049
|
+
if (!error || typeof error !== "object" || !("errorCode" in error)) return;
|
|
32050
|
+
const value = Reflect.get(error, "errorCode");
|
|
32051
|
+
return typeof value === "string" && /^[a-z0-9_]+$/i.test(value) ? value : void 0;
|
|
32052
|
+
}
|
|
32053
|
+
const SUPPORTED_TOKEN_AUTH_METHODS = [
|
|
32054
|
+
"client_secret_basic",
|
|
32055
|
+
"client_secret_post",
|
|
32056
|
+
"none"
|
|
32057
|
+
];
|
|
32058
|
+
function requireHttpsUrl(value, label) {
|
|
32059
|
+
const url = new URL(value);
|
|
32060
|
+
if (url.protocol !== "https:") throw new Error(`${label} must use HTTPS`);
|
|
32061
|
+
return url;
|
|
32062
|
+
}
|
|
32063
|
+
function validateRedirectUri(value) {
|
|
32064
|
+
const url = new URL(value);
|
|
32065
|
+
const isLocalhost = url.hostname === "localhost" || url.hostname === "127.0.0.1";
|
|
32066
|
+
if (url.protocol !== "https:" && !(url.protocol === "http:" && isLocalhost)) throw new Error("OAuth redirect URI must use HTTPS or HTTP localhost");
|
|
32067
|
+
}
|
|
32068
|
+
function validateMcpResource(mcpUrl, resourceUrl) {
|
|
32069
|
+
const serverUrl = new URL(mcpUrl);
|
|
32070
|
+
if (serverUrl.hash || resourceUrl.hash || resourceUrl.toString() !== serverUrl.toString()) throw new Error("MCP protected resource does not identify the requested MCP server");
|
|
32071
|
+
}
|
|
32072
|
+
function selectTokenEndpointAuthMethod(metadata) {
|
|
32073
|
+
const advertised = metadata.token_endpoint_auth_methods_supported;
|
|
32074
|
+
const supported = advertised?.length ? advertised : ["client_secret_basic"];
|
|
32075
|
+
const selected = SUPPORTED_TOKEN_AUTH_METHODS.find((method) => supported.includes(method));
|
|
32076
|
+
if (!selected) throw new Error(`MCP authorization server only supports unsupported token endpoint authentication methods: ${supported.join(", ")}`);
|
|
32077
|
+
return selected;
|
|
32078
|
+
}
|
|
32079
|
+
function validateAuthorizationCapabilities(metadata) {
|
|
32080
|
+
if (!metadata.response_types_supported?.includes("code")) throw new Error("MCP authorization server does not support the code response type");
|
|
32081
|
+
if (metadata.grant_types_supported?.length && !metadata.grant_types_supported.includes("authorization_code")) throw new Error("MCP authorization server does not support authorization_code");
|
|
32082
|
+
if (!metadata.code_challenge_methods_supported?.includes("S256")) throw new Error("MCP authorization server does not advertise PKCE S256 support");
|
|
32083
|
+
}
|
|
32084
|
+
function validateRegisteredClientInformation(clientInformation, requestedMethod, advertisedMethods) {
|
|
32085
|
+
const assignedMethod = clientInformation.token_endpoint_auth_method ?? requestedMethod;
|
|
32086
|
+
if (!SUPPORTED_TOKEN_AUTH_METHODS.includes(assignedMethod)) throw new Error(`MCP authorization server assigned unsupported token endpoint authentication method: ${assignedMethod}`);
|
|
32087
|
+
if (!advertisedMethods.includes(assignedMethod)) throw new Error(`MCP authorization server assigned an unadvertised token endpoint authentication method: ${assignedMethod}`);
|
|
32088
|
+
if (assignedMethod !== "none" && !clientInformation.client_secret?.trim()) throw new Error(`MCP authorization server assigned ${assignedMethod} without a client_secret`);
|
|
32089
|
+
return {
|
|
32090
|
+
...clientInformation,
|
|
32091
|
+
token_endpoint_auth_method: assignedMethod,
|
|
32092
|
+
registrationMode: "dcr"
|
|
32093
|
+
};
|
|
32094
|
+
}
|
|
31939
32095
|
/**
|
|
31940
32096
|
* Prefer CIMD (URL client_id) when the AS advertises support and we have an
|
|
31941
32097
|
* HTTPS metadata URL; otherwise DCR. Localhost HTTP cannot be a CIMD client_id
|
|
@@ -31946,15 +32102,27 @@ var McpOAuthConnectError = class extends Error {
|
|
|
31946
32102
|
*/
|
|
31947
32103
|
async function resolveMcpOAuthClientInformation(options) {
|
|
31948
32104
|
const supportsCimd = options.metadata.client_id_metadata_document_supported === true;
|
|
31949
|
-
|
|
32105
|
+
const supportsPublicClient = options.metadata.token_endpoint_auth_methods_supported?.includes("none") === true;
|
|
32106
|
+
if (supportsCimd && supportsPublicClient && Boolean(options.clientMetadataUrl) && isHttpsUrl(options.clientMetadataUrl) && options.clientMetadataUrl) return {
|
|
31950
32107
|
client_id: options.clientMetadataUrl,
|
|
31951
|
-
token_endpoint_auth_method: "none"
|
|
32108
|
+
token_endpoint_auth_method: "none",
|
|
32109
|
+
registrationMode: "cimd"
|
|
31952
32110
|
};
|
|
31953
32111
|
if (options.metadata.registration_endpoint) {
|
|
31954
|
-
const grantTypes = ["authorization_code", "refresh_token"];
|
|
31955
|
-
const tokenEndpointAuthMethod =
|
|
32112
|
+
const grantTypes = ["authorization_code", ...options.metadata.grant_types_supported?.includes("refresh_token") ? ["refresh_token"] : []];
|
|
32113
|
+
const tokenEndpointAuthMethod = selectTokenEndpointAuthMethod(options.metadata);
|
|
32114
|
+
const currentlySupportedAuthMethods = options.metadata.token_endpoint_auth_methods_supported?.length ? options.metadata.token_endpoint_auth_methods_supported : ["client_secret_basic"];
|
|
32115
|
+
const existing = await (0, _keystrokehq_platform_database.getDecryptedOAuthAppBySlug)(options.appSlug);
|
|
32116
|
+
if (existing?.provider === "mcp" && existing.metadata?.clientRegistrationMode === "dcr" && existing.metadata.issuer === options.metadata.issuer && existing.metadata.registrationEndpoint === options.metadata.registration_endpoint && existing.metadata.resource === options.resource && existing.metadata.redirectUri === options.redirectUri && existing.metadata.tokenEndpointAuthMethod && SUPPORTED_TOKEN_AUTH_METHODS.includes(existing.metadata.tokenEndpointAuthMethod) && currentlySupportedAuthMethods.includes(existing.metadata.tokenEndpointAuthMethod)) return {
|
|
32117
|
+
client_id: existing.clientId,
|
|
32118
|
+
...existing.clientSecret ? { client_secret: existing.clientSecret } : {},
|
|
32119
|
+
token_endpoint_auth_method: existing.metadata.tokenEndpointAuthMethod,
|
|
32120
|
+
registrationMode: "dcr"
|
|
32121
|
+
};
|
|
32122
|
+
let providerHttpStatus;
|
|
31956
32123
|
try {
|
|
31957
|
-
|
|
32124
|
+
const safeFetch = createPublicHttpFetch();
|
|
32125
|
+
return validateRegisteredClientInformation(await registerClient(options.authorizationServerUrl, {
|
|
31958
32126
|
metadata: options.metadata,
|
|
31959
32127
|
clientMetadata: {
|
|
31960
32128
|
client_name: "Keystroke",
|
|
@@ -31963,54 +32131,112 @@ async function resolveMcpOAuthClientInformation(options) {
|
|
|
31963
32131
|
response_types: ["code"],
|
|
31964
32132
|
token_endpoint_auth_method: tokenEndpointAuthMethod
|
|
31965
32133
|
},
|
|
31966
|
-
scope: options.scope
|
|
31967
|
-
|
|
32134
|
+
scope: options.scope,
|
|
32135
|
+
fetchFn: async (input, init) => {
|
|
32136
|
+
const response = await safeFetch(input, init);
|
|
32137
|
+
providerHttpStatus = response.status;
|
|
32138
|
+
return response;
|
|
32139
|
+
}
|
|
32140
|
+
}), tokenEndpointAuthMethod, currentlySupportedAuthMethods);
|
|
31968
32141
|
} catch (error) {
|
|
31969
|
-
throw new McpOAuthConnectError(
|
|
32142
|
+
throw new McpOAuthConnectError("client_registration", providerHttpStatus === 403 ? "MCP server rejected dynamic client registration; it may require a pre-approved OAuth client" : "MCP OAuth client registration failed", {
|
|
32143
|
+
correlationId: options.correlationId,
|
|
31970
32144
|
authorizationServerUrl: options.authorizationServerUrl,
|
|
31971
32145
|
registrationEndpoint: options.metadata.registration_endpoint,
|
|
31972
32146
|
grantTypes,
|
|
31973
|
-
tokenEndpointAuthMethod
|
|
32147
|
+
tokenEndpointAuthMethod,
|
|
32148
|
+
...providerHttpStatus ? { providerHttpStatus } : {},
|
|
32149
|
+
...oauthErrorCode(error) ? { oauthError: oauthErrorCode(error) } : {}
|
|
31974
32150
|
});
|
|
31975
32151
|
}
|
|
31976
32152
|
}
|
|
31977
|
-
if (supportsCimd) throw new Error("Authorization server
|
|
32153
|
+
if (supportsCimd) throw new Error("Authorization server supports Client ID Metadata Documents, but not Keystroke's public-client authentication or HTTPS metadata URL");
|
|
31978
32154
|
throw new Error("MCP authorization server does not support Client ID Metadata Documents or Dynamic Client Registration");
|
|
31979
32155
|
}
|
|
31980
32156
|
async function beginMcpOAuthConnect(options) {
|
|
31981
32157
|
const appUrl = options.app.url?.trim();
|
|
31982
32158
|
if (!appUrl || options.app.source !== "mcp" || options.app.authKind !== "oauth") throw new Error("App is not a direct MCP OAuth app");
|
|
31983
|
-
const
|
|
32159
|
+
const correlationId = crypto.randomUUID();
|
|
32160
|
+
let discovered;
|
|
32161
|
+
try {
|
|
32162
|
+
validateRedirectUri(options.redirectUri);
|
|
32163
|
+
requireHttpsUrl(appUrl, "MCP server URL");
|
|
32164
|
+
discovered = await discoverMcpOAuthServer(appUrl);
|
|
32165
|
+
} catch {
|
|
32166
|
+
throw new McpOAuthConnectError("resource_discovery", "Failed to discover MCP OAuth protected-resource metadata", { correlationId });
|
|
32167
|
+
}
|
|
31984
32168
|
const metadata = discovered.authorizationServerMetadata;
|
|
31985
|
-
|
|
32169
|
+
try {
|
|
32170
|
+
if (!metadata?.authorization_endpoint || !metadata.token_endpoint) throw new Error("MCP server does not expose OAuth authorization metadata");
|
|
32171
|
+
validateAuthorizationCapabilities(metadata);
|
|
32172
|
+
requireHttpsUrl(discovered.authorizationServerUrl, "OAuth authorization server URL");
|
|
32173
|
+
requireHttpsUrl(metadata.authorization_endpoint, "OAuth authorization endpoint");
|
|
32174
|
+
requireHttpsUrl(metadata.token_endpoint, "OAuth token endpoint");
|
|
32175
|
+
if (metadata.registration_endpoint) requireHttpsUrl(metadata.registration_endpoint, "OAuth registration endpoint");
|
|
32176
|
+
} catch {
|
|
32177
|
+
throw new McpOAuthConnectError("authorization_server_discovery", "MCP authorization server metadata is incompatible", {
|
|
32178
|
+
correlationId,
|
|
32179
|
+
authorizationServerUrl: discovered.authorizationServerUrl
|
|
32180
|
+
});
|
|
32181
|
+
}
|
|
32182
|
+
let resourceUrl;
|
|
32183
|
+
try {
|
|
32184
|
+
resourceUrl = requireHttpsUrl(discovered.resourceMetadata.resource, "MCP protected resource");
|
|
32185
|
+
if (resourceUrl.hash) throw new Error("MCP protected resource must not include a fragment");
|
|
32186
|
+
validateMcpResource(appUrl, resourceUrl);
|
|
32187
|
+
} catch {
|
|
32188
|
+
throw new McpOAuthConnectError("resource_discovery", "MCP protected-resource metadata contains an invalid resource", { correlationId });
|
|
32189
|
+
}
|
|
31986
32190
|
const oauth = {
|
|
31987
32191
|
issuer: metadata.issuer,
|
|
31988
32192
|
authorizationEndpoint: metadata.authorization_endpoint,
|
|
31989
32193
|
tokenEndpoint: metadata.token_endpoint,
|
|
31990
32194
|
registrationEndpoint: metadata.registration_endpoint,
|
|
31991
|
-
scopes:
|
|
31992
|
-
resource:
|
|
32195
|
+
scopes: discovered.challengeScope ? discovered.challengeScope.split(/\s+/).filter(Boolean) : discovered.resourceMetadata.scopes_supported ?? [],
|
|
32196
|
+
resource: resourceUrl.toString(),
|
|
31993
32197
|
resourceName: discovered.resourceMetadata?.resource_name?.trim() || void 0
|
|
31994
32198
|
};
|
|
31995
|
-
const
|
|
31996
|
-
const
|
|
31997
|
-
const
|
|
31998
|
-
|
|
31999
|
-
|
|
32000
|
-
|
|
32001
|
-
|
|
32002
|
-
|
|
32003
|
-
|
|
32004
|
-
|
|
32005
|
-
|
|
32006
|
-
|
|
32007
|
-
|
|
32008
|
-
|
|
32009
|
-
|
|
32010
|
-
|
|
32011
|
-
})
|
|
32012
|
-
|
|
32199
|
+
const requestedScopes = options.input.scopes?.map((value) => value.trim()).filter(Boolean) ?? [];
|
|
32200
|
+
const challengedScopes = discovered.challengeScope?.split(/\s+/).filter(Boolean) ?? [];
|
|
32201
|
+
const selectedScopes = challengedScopes.length > 0 ? [...new Set([...challengedScopes, ...requestedScopes])] : requestedScopes.length > 0 ? requestedScopes : discovered.resourceMetadata.scopes_supported ?? [];
|
|
32202
|
+
const scope = selectedScopes.length > 0 ? selectedScopes.join(" ") : void 0;
|
|
32203
|
+
let clientInformation;
|
|
32204
|
+
try {
|
|
32205
|
+
clientInformation = await resolveMcpOAuthClientInformation({
|
|
32206
|
+
appSlug: options.app.slug,
|
|
32207
|
+
correlationId,
|
|
32208
|
+
authorizationServerUrl: discovered.authorizationServerUrl,
|
|
32209
|
+
metadata,
|
|
32210
|
+
resource: resourceUrl.toString(),
|
|
32211
|
+
redirectUri: options.redirectUri,
|
|
32212
|
+
scope,
|
|
32213
|
+
clientMetadataUrl: options.clientMetadataUrl
|
|
32214
|
+
});
|
|
32215
|
+
} catch (error) {
|
|
32216
|
+
if (error instanceof McpOAuthConnectError) throw error;
|
|
32217
|
+
throw new McpOAuthConnectError("client_registration", "MCP authorization server does not support a compatible client registration", {
|
|
32218
|
+
correlationId,
|
|
32219
|
+
authorizationServerUrl: discovered.authorizationServerUrl
|
|
32220
|
+
});
|
|
32221
|
+
}
|
|
32222
|
+
try {
|
|
32223
|
+
await (0, _keystrokehq_platform_database.ensureOAuthApp)({
|
|
32224
|
+
slug: options.app.slug,
|
|
32225
|
+
provider: "mcp",
|
|
32226
|
+
tokenStrategy: "refresh",
|
|
32227
|
+
clientId: clientInformation.client_id,
|
|
32228
|
+
clientSecret: oauthClientSecretForStorage(clientInformation.client_secret),
|
|
32229
|
+
metadata: oauthAppMetadata(oauth, appUrl, {
|
|
32230
|
+
tokenEndpointAuthMethod: clientInformation.token_endpoint_auth_method,
|
|
32231
|
+
clientRegistrationMode: clientInformation.registrationMode,
|
|
32232
|
+
redirectUri: options.redirectUri
|
|
32233
|
+
})
|
|
32234
|
+
});
|
|
32235
|
+
} catch {
|
|
32236
|
+
throw new McpOAuthConnectError("credential_persistence", "Failed to save MCP OAuth client registration", { correlationId });
|
|
32237
|
+
}
|
|
32013
32238
|
const statePayload = {
|
|
32239
|
+
correlationId,
|
|
32014
32240
|
codeVerifier: "",
|
|
32015
32241
|
appSlug: options.app.slug,
|
|
32016
32242
|
organizationId: options.organizationId,
|
|
@@ -32022,76 +32248,107 @@ async function beginMcpOAuthConnect(options) {
|
|
|
32022
32248
|
authorizationServerUrl: discovered.authorizationServerUrl,
|
|
32023
32249
|
resource: oauth.resource,
|
|
32024
32250
|
oauthMetadata: oauth,
|
|
32251
|
+
authorizationServerMetadata: metadata,
|
|
32025
32252
|
mcpUrl: appUrl,
|
|
32026
32253
|
redirectUri: options.redirectUri,
|
|
32027
32254
|
clientId: clientInformation.client_id,
|
|
32028
32255
|
clientSecret: clientInformation.client_secret,
|
|
32029
32256
|
tokenEndpointAuthMethod: clientInformation.token_endpoint_auth_method,
|
|
32257
|
+
clientRegistrationMode: clientInformation.registrationMode,
|
|
32030
32258
|
label: options.input.label,
|
|
32031
32259
|
credentialInstanceId: options.input.credentialInstanceId
|
|
32032
32260
|
};
|
|
32033
|
-
|
|
32034
|
-
|
|
32035
|
-
|
|
32036
|
-
|
|
32037
|
-
|
|
32038
|
-
|
|
32039
|
-
|
|
32261
|
+
let authorizationUrl;
|
|
32262
|
+
let codeVerifier;
|
|
32263
|
+
try {
|
|
32264
|
+
({authorizationUrl, codeVerifier} = await startAuthorization(discovered.authorizationServerUrl, {
|
|
32265
|
+
metadata,
|
|
32266
|
+
clientInformation,
|
|
32267
|
+
redirectUrl: options.redirectUri,
|
|
32268
|
+
scope,
|
|
32269
|
+
resource: resourceUrl
|
|
32270
|
+
}));
|
|
32271
|
+
} catch (error) {
|
|
32272
|
+
throw new McpOAuthConnectError("authorization_start", "Failed to start MCP authorization", {
|
|
32273
|
+
correlationId,
|
|
32274
|
+
authorizationServerUrl: discovered.authorizationServerUrl,
|
|
32275
|
+
...oauthErrorCode(error) ? { oauthError: oauthErrorCode(error) } : {}
|
|
32276
|
+
});
|
|
32277
|
+
}
|
|
32040
32278
|
statePayload.codeVerifier = codeVerifier;
|
|
32041
|
-
const state = encodeOAuthState(statePayload);
|
|
32279
|
+
const state = await encodeOAuthState(statePayload);
|
|
32042
32280
|
authorizationUrl.searchParams.set("state", state);
|
|
32043
32281
|
return { authorizeUrl: authorizationUrl.toString() };
|
|
32044
32282
|
}
|
|
32045
32283
|
async function completeMcpOAuthConnect(options) {
|
|
32046
|
-
const payload =
|
|
32047
|
-
const metadata = {
|
|
32048
|
-
issuer: payload.oauthMetadata.issuer ?? payload.authorizationServerUrl,
|
|
32049
|
-
authorization_endpoint: payload.oauthMetadata.authorizationEndpoint,
|
|
32050
|
-
token_endpoint: payload.oauthMetadata.tokenEndpoint,
|
|
32051
|
-
registration_endpoint: payload.oauthMetadata.registrationEndpoint,
|
|
32052
|
-
scopes_supported: payload.oauthMetadata.scopes,
|
|
32053
|
-
response_types_supported: ["code"],
|
|
32054
|
-
code_challenge_methods_supported: ["S256"]
|
|
32055
|
-
};
|
|
32284
|
+
const { payload } = options;
|
|
32056
32285
|
const resourceUrl = payload.resource ? new URL(payload.resource) : void 0;
|
|
32057
|
-
|
|
32058
|
-
|
|
32059
|
-
|
|
32060
|
-
|
|
32061
|
-
|
|
32062
|
-
|
|
32063
|
-
|
|
32064
|
-
|
|
32065
|
-
|
|
32066
|
-
|
|
32067
|
-
|
|
32068
|
-
|
|
32069
|
-
|
|
32070
|
-
|
|
32071
|
-
|
|
32072
|
-
|
|
32073
|
-
|
|
32074
|
-
|
|
32075
|
-
|
|
32076
|
-
|
|
32077
|
-
|
|
32078
|
-
|
|
32079
|
-
|
|
32080
|
-
|
|
32081
|
-
|
|
32082
|
-
|
|
32083
|
-
|
|
32084
|
-
|
|
32085
|
-
|
|
32086
|
-
|
|
32087
|
-
|
|
32088
|
-
|
|
32089
|
-
|
|
32090
|
-
|
|
32091
|
-
|
|
32092
|
-
|
|
32093
|
-
|
|
32094
|
-
|
|
32286
|
+
if (!resourceUrl) throw new McpOAuthConnectError("authorization_callback", "OAuth callback state is missing the MCP resource", { correlationId: payload.correlationId });
|
|
32287
|
+
let tokens;
|
|
32288
|
+
let providerHttpStatus;
|
|
32289
|
+
try {
|
|
32290
|
+
const safeFetch = createPublicHttpFetch();
|
|
32291
|
+
tokens = await exchangeAuthorization(payload.authorizationServerUrl, {
|
|
32292
|
+
metadata: payload.authorizationServerMetadata,
|
|
32293
|
+
clientInformation: {
|
|
32294
|
+
client_id: payload.clientId,
|
|
32295
|
+
...payload.clientSecret ? { client_secret: payload.clientSecret } : {},
|
|
32296
|
+
...payload.tokenEndpointAuthMethod ? { token_endpoint_auth_method: payload.tokenEndpointAuthMethod } : {}
|
|
32297
|
+
},
|
|
32298
|
+
authorizationCode: options.code,
|
|
32299
|
+
codeVerifier: payload.codeVerifier,
|
|
32300
|
+
redirectUri: payload.redirectUri,
|
|
32301
|
+
resource: resourceUrl,
|
|
32302
|
+
fetchFn: async (input, init) => {
|
|
32303
|
+
const response = await safeFetch(input, init);
|
|
32304
|
+
providerHttpStatus = response.status;
|
|
32305
|
+
return response;
|
|
32306
|
+
}
|
|
32307
|
+
});
|
|
32308
|
+
} catch (error) {
|
|
32309
|
+
throw new McpOAuthConnectError("token_exchange", "MCP OAuth token exchange failed", {
|
|
32310
|
+
correlationId: payload.correlationId,
|
|
32311
|
+
authorizationServerUrl: payload.authorizationServerUrl,
|
|
32312
|
+
...providerHttpStatus ? { providerHttpStatus } : {},
|
|
32313
|
+
...oauthErrorCode(error) ? { oauthError: oauthErrorCode(error) } : {}
|
|
32314
|
+
});
|
|
32315
|
+
}
|
|
32316
|
+
let oauthAppId;
|
|
32317
|
+
let connectionId;
|
|
32318
|
+
try {
|
|
32319
|
+
({id: oauthAppId} = await (0, _keystrokehq_platform_database.ensureOAuthApp)({
|
|
32320
|
+
slug: payload.appSlug,
|
|
32321
|
+
provider: "mcp",
|
|
32322
|
+
tokenStrategy: "refresh",
|
|
32323
|
+
clientId: payload.clientId,
|
|
32324
|
+
clientSecret: oauthClientSecretForStorage(payload.clientSecret),
|
|
32325
|
+
metadata: oauthAppMetadata(payload.oauthMetadata, payload.mcpUrl, {
|
|
32326
|
+
tokenEndpointAuthMethod: payload.tokenEndpointAuthMethod,
|
|
32327
|
+
clientRegistrationMode: payload.clientRegistrationMode,
|
|
32328
|
+
redirectUri: payload.redirectUri
|
|
32329
|
+
})
|
|
32330
|
+
}));
|
|
32331
|
+
connectionId = await (0, _keystrokehq_platform_database.saveOAuthConnection)({
|
|
32332
|
+
appId: oauthAppId,
|
|
32333
|
+
externalId: payload.userId,
|
|
32334
|
+
accessToken: tokens.access_token,
|
|
32335
|
+
refreshToken: tokens.refresh_token,
|
|
32336
|
+
accessTokenExpiresAt: accessTokenExpiresAt(tokens.expires_in),
|
|
32337
|
+
grantedScopes: grantedScopesFromToken(tokens.scope, payload.oauthMetadata.scopes),
|
|
32338
|
+
metadata: { mcpUrl: payload.oauthMetadata.resource }
|
|
32339
|
+
});
|
|
32340
|
+
await (0, _keystrokehq_database.ensureOAuthCredentialInstance)({
|
|
32341
|
+
credentialKey: payload.appSlug,
|
|
32342
|
+
connectionId,
|
|
32343
|
+
accountLabel: payload.label,
|
|
32344
|
+
externalId: payload.userId,
|
|
32345
|
+
userLabel: payload.label,
|
|
32346
|
+
targets: payload.scopeTargets,
|
|
32347
|
+
credentialInstanceId: payload.credentialInstanceId
|
|
32348
|
+
});
|
|
32349
|
+
} catch {
|
|
32350
|
+
throw new McpOAuthConnectError("credential_persistence", "Failed to save the MCP OAuth credential", { correlationId: payload.correlationId });
|
|
32351
|
+
}
|
|
32095
32352
|
return {
|
|
32096
32353
|
appSlug: payload.appSlug,
|
|
32097
32354
|
connectionId,
|
|
@@ -39121,4 +39378,4 @@ Object.defineProperty(exports, "withCredentialAssignments", {
|
|
|
39121
39378
|
}
|
|
39122
39379
|
});
|
|
39123
39380
|
|
|
39124
|
-
//# sourceMappingURL=dist-
|
|
39381
|
+
//# sourceMappingURL=dist-ZPZwDr3w.cjs.map
|