@loop_ouroboros/mcp-hub-lite 1.0.0 → 1.0.2
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/CHANGELOG.md +15 -0
- package/README.md +15 -0
- package/dist/client/assets/{HomeView-f901HeKw.js → HomeView-7rMg9C6t.js} +1 -1
- package/dist/client/assets/{ResourceDetailView-Bz66ZjfY.js → ResourceDetailView-Bf-1ffbk.js} +1 -1
- package/dist/client/assets/ResourcesView-g5x4xCPh.js +1 -0
- package/dist/client/assets/{ServerDashboard-7_8Og9JJ.css → ServerDashboard-Chpne8Q0.css} +1 -1
- package/dist/client/assets/ServerDashboard-G8Wmp4hF.js +2 -0
- package/dist/client/assets/ServerListView-dV2XrPjo.js +32 -0
- package/dist/client/assets/SessionsView-Ckd38lj1.js +1 -0
- package/dist/client/assets/SettingsView-BJUdepEQ.js +1 -0
- package/dist/client/assets/ToolCallDialog-BhdPX-Kf.css +1 -0
- package/dist/client/assets/ToolCallDialog-C_bTCpHC.js +1 -0
- package/dist/client/assets/ToolsView-0c2eputu.js +1 -0
- package/dist/client/assets/ToolsView-E3Ps9c7i.css +1 -0
- package/dist/client/assets/{_baseClone-DCmK847M.js → _baseClone-5q1b0P3O.js} +1 -1
- package/dist/client/assets/{el-form-item-DM0q2hmO.js → el-form-item-ClFnj49k.js} +1 -1
- package/dist/client/assets/{el-input-BtI9NECe.js → el-input-CDnuSKVZ.js} +1 -1
- package/dist/client/assets/{el-loading-CChNmKeI.js → el-loading-H85n3BUC.js} +1 -1
- package/dist/client/assets/{el-overlay-lZZbPmsX.js → el-overlay-CzMkXyYy.js} +1 -1
- package/dist/client/assets/el-select-DvjGddk_.js +1 -0
- package/dist/client/assets/{el-tab-pane-Dy9ruaEX.js → el-tab-pane-C_DQMcwe.js} +1 -1
- package/dist/client/assets/{el-table-column-98UyVgBH.js → el-table-column-CASRIbZM.js} +1 -1
- package/dist/client/assets/el-tag-npbwux4f.js +1 -0
- package/dist/client/assets/{index-CSTs2jYk.js → index-CCnAxNF8.js} +2 -2
- package/dist/client/assets/{index-BzQXG7no.js → index-d1DZeSfz.js} +1 -1
- package/dist/client/assets/{omit-Bx5HJNV_.js → omit-DPsOVNIJ.js} +1 -1
- package/dist/client/assets/{raf-B9VDMtMF.js → raf-DY5mgbuB.js} +1 -1
- package/dist/client/assets/{vnode-B8aJx8u4.js → vnode-CHomNjgN.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/shared/models/server.model.d.ts +1 -0
- package/dist/server/shared/models/server.model.d.ts.map +1 -1
- package/dist/server/shared/models/session.model.d.ts +2 -0
- package/dist/server/shared/models/session.model.d.ts.map +1 -1
- package/dist/server/shared/models/session.model.js +1 -0
- package/dist/server/shared/types/client.types.d.ts +4 -32
- package/dist/server/shared/types/client.types.d.ts.map +1 -1
- package/dist/server/shared/types/client.types.js +3 -2
- package/dist/server/shared/types/index.d.ts +3 -3
- package/dist/server/shared/types/index.d.ts.map +1 -1
- package/dist/server/shared/types/index.js +3 -3
- package/dist/server/shared/types/session-context.types.d.ts +37 -0
- package/dist/server/shared/types/session-context.types.d.ts.map +1 -0
- package/dist/server/shared/types/session-context.types.js +5 -0
- package/dist/server/src/api/mcp/debug-response-wrapper.d.ts.map +1 -1
- package/dist/server/src/api/mcp/debug-response-wrapper.js +26 -1
- package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
- package/dist/server/src/api/mcp/gateway.js +28 -24
- package/dist/server/src/api/mcp/session-context-extractor.d.ts +5 -5
- package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -1
- package/dist/server/src/api/mcp/session-context-extractor.js +12 -27
- package/dist/server/src/api/web/clients.js +2 -2
- package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
- package/dist/server/src/api/web/hub-tools.js +4 -1
- package/dist/server/src/api/web/sessions.js +1 -1
- package/dist/server/src/app.d.ts.map +1 -1
- package/dist/server/src/app.js +0 -2
- package/dist/server/src/config/config.schema.d.ts +2 -0
- package/dist/server/src/config/config.schema.d.ts.map +1 -1
- package/dist/server/src/config/config.schema.js +1 -0
- package/dist/server/src/index.js +1 -1
- package/dist/server/src/services/client-tracker.service.d.ts +3 -128
- package/dist/server/src/services/client-tracker.service.d.ts.map +1 -1
- package/dist/server/src/services/client-tracker.service.js +4 -200
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +2 -2
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +40 -8
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +18 -6
- package/dist/server/src/services/gateway/tool-list-generator.js +2 -2
- package/dist/server/src/services/hub-tools/resource-generator.d.ts +1 -4
- package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/resource-generator.js +1 -26
- package/dist/server/src/services/search/search-cache.d.ts +0 -19
- package/dist/server/src/services/search/search-cache.d.ts.map +1 -1
- package/dist/server/src/services/search/search-cache.js +0 -24
- package/dist/server/src/services/session/session-manager.d.ts.map +1 -1
- package/dist/server/src/services/session/session-manager.js +11 -9
- package/dist/server/src/services/session-tracker.service.d.ts +132 -0
- package/dist/server/src/services/session-tracker.service.d.ts.map +1 -0
- package/dist/server/src/services/session-tracker.service.js +227 -0
- package/dist/server/src/utils/json-utils.d.ts.map +1 -1
- package/dist/server/src/utils/json-utils.js +6 -0
- package/dist/server/src/utils/logger/log-colors.d.ts +1 -0
- package/dist/server/src/utils/logger/log-colors.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-colors.js +2 -1
- package/dist/server/src/utils/logger/log-context.d.ts +1 -0
- package/dist/server/src/utils/logger/log-context.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.d.ts +28 -0
- package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.js +205 -0
- package/dist/server/src/utils/logger/log-modules.d.ts +3 -6
- package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-modules.js +1 -3
- package/dist/server/src/utils/logger/log-output.d.ts +2 -2
- package/dist/server/src/utils/logger/log-output.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-output.js +27 -6
- package/dist/server/src/utils/logger/logger.d.ts +13 -0
- package/dist/server/src/utils/logger/logger.d.ts.map +1 -1
- package/dist/server/src/utils/logger/logger.js +42 -7
- package/dist/server/src/utils/request-context.d.ts +16 -16
- package/dist/server/src/utils/request-context.d.ts.map +1 -1
- package/dist/server/src/utils/request-context.js +14 -14
- package/dist/server/src/utils/tool-args-parser.d.ts +0 -4
- package/dist/server/src/utils/tool-args-parser.d.ts.map +1 -1
- package/dist/server/src/utils/tool-args-parser.js +0 -7
- package/dist/server/src/utils/transports/stdio-transport.js +1 -1
- package/dist/server/src/utils/transports/transport-factory.js +2 -2
- package/dist/server/tests/integration/api/gateway.test.js +22 -37
- package/dist/server/tests/temp/test-stack.d.ts +6 -0
- package/dist/server/tests/temp/test-stack.d.ts.map +1 -0
- package/dist/server/tests/temp/test-stack.js +40 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.js +1 -15
- package/dist/server/tests/unit/services/session-manager.test.js +1 -1
- package/dist/server/tests/unit/utils/json-utils.test.js +94 -0
- package/dist/server/tests/unit/utils/logger.test.js +101 -0
- package/dist/server/tests/unit/utils/request-context.test.js +12 -12
- package/package.json +1 -1
- package/dist/client/assets/ResourcesView-lI_fItfA.js +0 -1
- package/dist/client/assets/ServerDashboard-Bgx8WVkx.js +0 -2
- package/dist/client/assets/ServerListView-CP6Ffkfx.js +0 -30
- package/dist/client/assets/SessionsView-D68qKR4D.js +0 -1
- package/dist/client/assets/SettingsView-BPYfO9BE.js +0 -1
- package/dist/client/assets/ToolCallDialog-Br8FNebN.js +0 -1
- package/dist/client/assets/ToolCallDialog-C7eh7jHE.css +0 -1
- package/dist/client/assets/ToolsView-B6hUiR43.js +0 -1
- package/dist/client/assets/ToolsView-BLnU8cV6.css +0 -1
- package/dist/client/assets/el-select-BXztu2b5.js +0 -1
- package/dist/client/assets/el-tag-B5lLT51E.js +0 -1
- package/dist/client/assets/index-BgKcmWJr.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as
|
|
1
|
+
import{t as W,c as d,A as x,y as f,v as A,O as F,G as M,H as Q,C as D,K as X,J as g,u as i,a9 as he,$ as Y,L as ee,M as se,az as te,r as N,f as Ce,w as be,x as C,U as k,V as Te,P as Se,I as we,n as Ee,a as U,ai as ne,p as z,l as Be,aj as Z}from"./vue-vendor-6ny5zj9i.js";import{F as oe,G as $,_ as ae,I as Ne,ac as b,V as J,J as ke,i as le,U as Me,d as $e,e as q,aR as Ie,aS as Le,a as K,T as Oe,a8 as Pe,g as xe,E as Ae,bj as p,$ as P,h as De,bk as ze}from"./index-CCnAxNF8.js";import{m as Fe}from"./typescript-Bp3YSIOJ.js";const Ue=oe({value:{type:[String,Number],default:""},max:{type:Number,default:99},isDot:Boolean,hidden:Boolean,type:{type:String,values:["primary","success","warning","info","danger"],default:"danger"},showZero:{type:Boolean,default:!0},color:String,badgeStyle:{type:$([String,Object,Array])},offset:{type:$(Array),default:[0,0]},badgeClass:{type:String}}),Ve=W({name:"ElBadge",__name:"badge",props:Ue,setup(s,{expose:a}){const e=s,n=Ne("badge"),t=d(()=>e.isDot?"":b(e.value)&&b(e.max)?e.max<e.value?`${e.max}+`:`${e.value}`:`${e.value}`),u=d(()=>{var o;return[{backgroundColor:e.color,marginRight:J(-e.offset[0]),marginTop:J(e.offset[1])},(o=e.badgeStyle)!=null?o:{}]});return a({content:t}),(o,l)=>(f(),x("div",{class:g(i(n).b())},[A(o.$slots,"default"),F(se,{name:`${i(n).namespace.value}-zoom-in-center`,persisted:""},{default:M(()=>[Q(D("sup",{class:g([i(n).e("content"),i(n).em("content",o.type),i(n).is("fixed",!!o.$slots.default),i(n).is("dot",o.isDot),i(n).is("hide-zero",!o.showZero&&o.value===0),o.badgeClass]),style:X(u.value)},[A(o.$slots,"content",{value:t.value},()=>[he(Y(t.value),1)])],6),[[ee,!o.hidden&&(t.value||o.isDot||o.$slots.content)]])]),_:3},8,["name"])],2))}});var He=ae(Ve,[["__file","/home/runner/work/element-plus/element-plus/packages/components/badge/src/badge.vue"]]);const Re=ke(He),re=["primary","success","info","warning","error"],ie=["top","top-left","top-right","bottom","bottom-left","bottom-right"],T="top",c=Fe({customClass:"",dangerouslyUseHTMLString:!1,duration:3e3,icon:void 0,id:"",message:"",onClose:void 0,showClose:!1,type:"info",plain:!1,offset:16,placement:void 0,zIndex:0,grouping:!1,repeatNum:1,appendTo:le?document.body:void 0}),_e=oe({customClass:{type:String,default:c.customClass},dangerouslyUseHTMLString:{type:Boolean,default:c.dangerouslyUseHTMLString},duration:{type:Number,default:c.duration},icon:{type:Me,default:c.icon},id:{type:String,default:c.id},message:{type:$([String,Object,Function]),default:c.message},onClose:{type:$(Function),default:c.onClose},showClose:{type:Boolean,default:c.showClose},type:{type:String,values:re,default:c.type},plain:{type:Boolean,default:c.plain},offset:{type:Number,default:c.offset},placement:{type:String,values:ie,default:c.placement},zIndex:{type:Number,default:c.zIndex},grouping:{type:Boolean,default:c.grouping},repeatNum:{type:Number,default:c.repeatNum}}),je={destroy:()=>!0},m=te({}),Ge=s=>(m[s]||(m[s]=te([])),m[s]),Ze=(s,a)=>{const e=m[a]||[],n=e.findIndex(o=>o.id===s),t=e[n];let u;return n>0&&(u=e[n-1]),{current:t,prev:u}},Je=(s,a)=>{const{prev:e}=Ze(s,a);return e?e.vm.exposed.bottom.value:0},qe=(s,a,e)=>(m[e]||[]).findIndex(u=>u.id===s)>0?16:a,Ke=["id"],We=["innerHTML"],Qe=W({name:"ElMessage",__name:"message",props:_e,emits:je,setup(s,{expose:a,emit:e}){const{Close:n}=Oe,t=s,u=e,o=N(!1),{ns:l,zIndex:S}=$e("message"),{currentZIndex:V,nextZIndex:w}=S,I=N(),E=N(!1),H=N(0);let L;const ce=d(()=>t.type?t.type==="error"?"danger":t.type:"info"),pe=d(()=>{const r=t.type;return{[l.bm("icon",r)]:r&&q[r]}}),R=d(()=>t.icon||q[t.type]||""),y=d(()=>t.placement||T),de=d(()=>Je(t.id,y.value)),_=d(()=>qe(t.id,t.offset,y.value)+de.value),me=d(()=>H.value+_.value),fe=d(()=>y.value.includes("left")?l.is("left"):y.value.includes("right")?l.is("right"):l.is("center")),j=d(()=>y.value.startsWith("top")?"top":"bottom"),ge=d(()=>({[j.value]:`${_.value}px`,zIndex:V.value}));function O(){t.duration!==0&&({stop:L}=Pe(()=>{B()},t.duration))}function G(){L?.()}function B(){E.value=!1,Ee(()=>{var r;o.value||((r=t.onClose)==null||r.call(t),u("destroy"))})}function ve(r){xe(r)===Ae.esc&&B()}return Ce(()=>{O(),w(),E.value=!0}),be(()=>t.repeatNum,()=>{G(),O()}),Ie(document,"keydown",ve),Le(I,()=>{H.value=I.value.getBoundingClientRect().height}),a({visible:E,bottom:me,close:B}),(r,h)=>(f(),C(se,{name:i(l).b("fade"),onBeforeEnter:h[0]||(h[0]=ye=>o.value=!0),onBeforeLeave:r.onClose,onAfterLeave:h[1]||(h[1]=ye=>r.$emit("destroy")),persisted:""},{default:M(()=>[Q(D("div",{id:r.id,ref_key:"messageRef",ref:I,class:g([i(l).b(),{[i(l).m(r.type)]:r.type},i(l).is("closable",r.showClose),i(l).is("plain",r.plain),i(l).is("bottom",j.value==="bottom"),fe.value,r.customClass]),style:X(ge.value),role:"alert",onMouseenter:G,onMouseleave:O},[r.repeatNum>1?(f(),C(i(Re),{key:0,value:r.repeatNum,type:ce.value,class:g(i(l).e("badge"))},null,8,["value","type","class"])):k("v-if",!0),R.value?(f(),C(i(K),{key:1,class:g([i(l).e("icon"),pe.value])},{default:M(()=>[(f(),C(Te(R.value)))]),_:1},8,["class"])):k("v-if",!0),A(r.$slots,"default",{},()=>[r.dangerouslyUseHTMLString?(f(),x(Se,{key:1},[k(" Caution here, message could've been compromised, never use user's input as message "),D("p",{class:g(i(l).e("content")),innerHTML:r.message},null,10,We)],2112)):(f(),x("p",{key:0,class:g(i(l).e("content"))},Y(r.message),3))]),r.showClose?(f(),C(i(K),{key:2,class:g(i(l).e("closeBtn")),onClick:we(B,["stop"])},{default:M(()=>[F(i(n))]),_:1},8,["class"])):k("v-if",!0)],46,Ke),[[ee,E.value]])]),_:3},8,["name","onBeforeLeave"]))}});var Xe=ae(Qe,[["__file","/home/runner/work/element-plus/element-plus/packages/components/message/src/message.vue"]]);let Ye=1;const es=s=>{if(!s.appendTo)s.appendTo=document.body;else if(U(s.appendTo)){let e=document.querySelector(s.appendTo);De(e)||(e=document.body),s.appendTo=e}},ss=s=>{!s.placement&&U(p.placement)&&p.placement&&(s.placement=p.placement),s.placement||(s.placement=T),ie.includes(s.placement)||(s.placement=T)},ue=s=>{const a=!s||U(s)||ne(s)||z(s)?{message:s}:s,e={...c,...a};return es(e),ss(e),P(p.grouping)&&!e.grouping&&(e.grouping=p.grouping),b(p.duration)&&e.duration===3e3&&(e.duration=p.duration),b(p.offset)&&e.offset===16&&(e.offset=p.offset),P(p.showClose)&&!e.showClose&&(e.showClose=p.showClose),P(p.plain)&&!e.plain&&(e.plain=p.plain),e},ts=s=>{const a=s.props.placement||T,e=m[a],n=e.indexOf(s);if(n===-1)return;e.splice(n,1);const{handler:t}=s;t.close()},ns=({appendTo:s,...a},e)=>{const n=`message_${Ye++}`,t=a.onClose,u=document.createElement("div"),o={...a,id:n,onClose:()=>{t?.(),ts(w)},onDestroy:()=>{Z(null,u)}},l=F(Xe,o,z(o.message)||ne(o.message)?{default:z(o.message)?o.message:()=>o.message}:null);l.appContext=e||v._context,Z(l,u),s.appendChild(u.firstElementChild);const S=l.component,w={id:n,vnode:l,vm:S,handler:{close:()=>{S.exposed.close()}},props:l.component.props};return w},v=(s={},a)=>{if(!le)return{close:()=>{}};const e=ue(s),n=Ge(e.placement||T);if(e.grouping&&n.length){const u=n.find(({vnode:o})=>{var l;return((l=o.props)==null?void 0:l.message)===e.message});if(u)return u.props.repeatNum+=1,u.props.type=e.type,u.handler}if(b(p.max)&&n.length>=p.max)return{close:()=>{}};const t=ns(e,a);return n.push(t),t.handler};re.forEach(s=>{v[s]=(a={},e)=>{const n=ue(a);return v({...n,type:s},e)}});function os(s){for(const a in m)if(Be(m,a)){const e=[...m[a]];for(const n of e)(!s||s===n.props.type)&&n.handler.close()}}function as(s){if(!m[s])return;[...m[s]].forEach(e=>e.handler.close())}v.closeAll=os;v.closeAllByPlacement=as;v._context=null;const us=ze(v,"$message");export{us as E};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{aq as a,bu as c,bt as s,bv as u,br as g,bw as v,ax as O}from"./index-CCnAxNF8.js";import{g as b,c as p,f as y,e as _}from"./_baseClone-5q1b0P3O.js";var P="[object Object]",L=Function.prototype,m=Object.prototype,f=L.toString,w=m.hasOwnProperty,C=f.call(Object);function A(t){if(!a(t)||c(t)!=P)return!1;var r=b(t);if(r===null)return!0;var e=w.call(r,"constructor")&&r.constructor;return typeof e=="function"&&e instanceof e&&f.call(e)==C}function S(t,r,e){var o=-1,n=t.length;r<0&&(r=-r>n?0:n+r),e=e>n?n:e,e<0&&(e+=n),n=r>e?0:e-r>>>0,r>>>=0;for(var i=Array(n);++o<n;)i[o]=t[o+r];return i}function j(t){var r=t==null?0:t.length;return r?t[r-1]:void 0}function E(t,r){return r.length<2?t:s(t,S(r,0,-1))}var F=Object.prototype,G=F.hasOwnProperty;function h(t,r){r=u(r,t);var e=-1,o=r.length;if(!o)return!0;for(var n=t==null||typeof t!="object"&&typeof t!="function";++e<o;){var i=r[e];if(typeof i=="string"){if(i==="__proto__"&&!G.call(t,"__proto__"))return!1;if(i==="constructor"&&e+1<o&&typeof r[e+1]=="string"&&r[e+1]==="prototype"){if(n&&e===0)continue;return!1}}}var l=E(t,r);return l==null||delete l[g(j(r))]}function x(t){return A(t)?void 0:t}var T=1,N=2,D=4,R=v(function(t,r){var e={};if(t==null)return e;var o=!1;r=O(r,function(i){return i=u(i,t),o||(o=i.length>1),i}),p(t,y(t),e),o&&(e=_(e,T|N|D,x));for(var n=r.length;n--;)h(e,r[n]);return e});export{A as i,R as o};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as o}from"./index-
|
|
1
|
+
import{i as o}from"./index-CCnAxNF8.js";const e=i=>o?window.requestAnimationFrame(i):setTimeout(i,16),r=i=>o?window.cancelAnimationFrame(i):clearTimeout(i);export{r as c,e as r};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as u}from"./index-
|
|
1
|
+
import{i as u}from"./index-CCnAxNF8.js";import{b as f,ai as T}from"./vue-vendor-6ny5zj9i.js";let i;const m=e=>{var s;if(!u)return 0;if(i!==void 0)return i;const t=document.createElement("div");t.className=`${e}-scrollbar__wrap`,t.style.visibility="hidden",t.style.width="100px",t.style.position="absolute",t.style.top="-9999px",document.body.appendChild(t);const o=t.offsetWidth;t.style.overflow="scroll";const r=document.createElement("div");r.style.width="100%",t.appendChild(r);const n=r.offsetWidth;return(s=t.parentNode)==null||s.removeChild(t),i=o-n,i};function v(e,s){if(!u)return;if(!s){e.scrollTop=0;return}const t=[];let o=s.offsetParent;for(;o!==null&&e!==o&&e.contains(o);)t.push(o),o=o.offsetParent;const r=s.offsetTop+t.reduce((A,N)=>A+N.offsetTop,0),n=r+s.offsetHeight,p=e.scrollTop,S=p+e.clientHeight;r<p?e.scrollTop=r:n>S&&(e.scrollTop=n-e.clientHeight)}var l=(e=>(e[e.TEXT=1]="TEXT",e[e.CLASS=2]="CLASS",e[e.STYLE=4]="STYLE",e[e.PROPS=8]="PROPS",e[e.FULL_PROPS=16]="FULL_PROPS",e[e.HYDRATE_EVENTS=32]="HYDRATE_EVENTS",e[e.STABLE_FRAGMENT=64]="STABLE_FRAGMENT",e[e.KEYED_FRAGMENT=128]="KEYED_FRAGMENT",e[e.UNKEYED_FRAGMENT=256]="UNKEYED_FRAGMENT",e[e.NEED_PATCH=512]="NEED_PATCH",e[e.DYNAMIC_SLOTS=1024]="DYNAMIC_SLOTS",e[e.HOISTED=-1]="HOISTED",e[e.BAIL=-2]="BAIL",e))(l||{});const E=e=>{const s=f(e)?e:[e],t=[];return s.forEach(o=>{var r;f(o)?t.push(...E(o)):T(o)&&((r=o.component)!=null&&r.subTree)?t.push(o,...E(o.component.subTree)):T(o)&&f(o.children)?t.push(...E(o.children)):T(o)&&o.shapeFlag===2?t.push(...E(o.type())):t.push(o)}),t};export{l as P,E as f,m as g,v as s};
|
package/dist/client/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<link rel="icon" href="/favicon.ico" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>MCP Server Manager</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-CCnAxNF8.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/vue-vendor-6ny5zj9i.js">
|
|
10
10
|
<link rel="stylesheet" crossorigin href="/assets/index-BsDWtoIl.css">
|
|
11
11
|
</head>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.model.d.ts","sourceRoot":"","sources":["../../../../shared/models/server.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGjD,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE;QACN,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAGD,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
1
|
+
{"version":3,"file":"server.model.d.ts","sourceRoot":"","sources":["../../../../shared/models/server.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGjD,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE;QACN,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAGD,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -12,6 +12,7 @@ export declare const SessionStateSchema: z.ZodObject<{
|
|
|
12
12
|
project: z.ZodOptional<z.ZodString>;
|
|
13
13
|
userAgent: z.ZodOptional<z.ZodString>;
|
|
14
14
|
ip: z.ZodOptional<z.ZodString>;
|
|
15
|
+
capabilities: z.ZodOptional<z.ZodAny>;
|
|
15
16
|
createdAt: z.ZodNumber;
|
|
16
17
|
lastAccessedAt: z.ZodNumber;
|
|
17
18
|
metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
@@ -32,6 +33,7 @@ export declare const SessionStoreSchema: z.ZodObject<{
|
|
|
32
33
|
project: z.ZodOptional<z.ZodString>;
|
|
33
34
|
userAgent: z.ZodOptional<z.ZodString>;
|
|
34
35
|
ip: z.ZodOptional<z.ZodString>;
|
|
36
|
+
capabilities: z.ZodOptional<z.ZodAny>;
|
|
35
37
|
createdAt: z.ZodNumber;
|
|
36
38
|
lastAccessedAt: z.ZodNumber;
|
|
37
39
|
metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.model.d.ts","sourceRoot":"","sources":["../../../../shared/models/session.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"session.model.d.ts","sourceRoot":"","sources":["../../../../shared/models/session.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;iBAa7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;iBAG7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,YAAY,CAKtD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAOhE"}
|
|
@@ -12,6 +12,7 @@ export const SessionStateSchema = z.object({
|
|
|
12
12
|
project: z.string().optional(),
|
|
13
13
|
userAgent: z.string().optional(),
|
|
14
14
|
ip: z.string().optional(),
|
|
15
|
+
capabilities: z.any().optional(),
|
|
15
16
|
createdAt: z.number(),
|
|
16
17
|
lastAccessedAt: z.number(),
|
|
17
18
|
metadata: z.record(z.string(), z.any()).default({})
|
|
@@ -1,35 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* @deprecated This file is deprecated. Please import from './session-context.types.js' instead.
|
|
3
|
+
*
|
|
4
|
+
* Client Types (Deprecated - maintained for backward compatibility)
|
|
4
5
|
*/
|
|
5
|
-
|
|
6
|
-
* Workspace root information
|
|
7
|
-
*/
|
|
8
|
-
export interface ClientRoot {
|
|
9
|
-
uri: string;
|
|
10
|
-
name?: string;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Basic request context - for AsyncLocalStorage
|
|
14
|
-
* Contains the minimal set of fields required for requests
|
|
15
|
-
*/
|
|
16
|
-
export interface ClientContext {
|
|
17
|
-
sessionId: string;
|
|
18
|
-
clientName?: string;
|
|
19
|
-
clientVersion?: string;
|
|
20
|
-
protocolVersion?: string;
|
|
21
|
-
cwd?: string;
|
|
22
|
-
project?: string;
|
|
23
|
-
ip?: string;
|
|
24
|
-
userAgent?: string;
|
|
25
|
-
timestamp: number;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Complete client information - for tracking and display
|
|
29
|
-
* Extends ClientContext with runtime state
|
|
30
|
-
*/
|
|
31
|
-
export interface ClientInfo extends ClientContext {
|
|
32
|
-
lastSeen: number;
|
|
33
|
-
roots?: ClientRoot[];
|
|
34
|
-
}
|
|
6
|
+
export type { SessionRoot as ClientRoot, SessionContext as ClientContext, SessionInfo as ClientInfo } from './session-context.types.js';
|
|
35
7
|
//# sourceMappingURL=client.types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.types.d.ts","sourceRoot":"","sources":["../../../../shared/types/client.types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client.types.d.ts","sourceRoot":"","sources":["../../../../shared/types/client.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,WAAW,IAAI,UAAU,EACzB,cAAc,IAAI,aAAa,EAC/B,WAAW,IAAI,UAAU,EAC1B,MAAM,4BAA4B,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* @deprecated This file is deprecated. Please import from './session-context.types.js' instead.
|
|
3
|
+
*
|
|
4
|
+
* Client Types (Deprecated - maintained for backward compatibility)
|
|
4
5
|
*/
|
|
5
6
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
export * from './common.types';
|
|
3
|
-
export * from './websocket.types';
|
|
1
|
+
export type { SessionContext, SessionInfo, SessionRoot } from './session-context.types.js';
|
|
2
|
+
export * from './common.types.js';
|
|
3
|
+
export * from './websocket.types.js';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../shared/types/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../shared/types/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG3F,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
export * from './common.types';
|
|
3
|
-
export * from './websocket.types';
|
|
1
|
+
// Other types
|
|
2
|
+
export * from './common.types.js';
|
|
3
|
+
export * from './websocket.types.js';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Context Types
|
|
3
|
+
* Shared session context types between frontend and backend
|
|
4
|
+
*/
|
|
5
|
+
import type { ClientCapabilities } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Workspace root information
|
|
8
|
+
*/
|
|
9
|
+
export interface SessionRoot {
|
|
10
|
+
uri: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Basic request context - for AsyncLocalStorage
|
|
15
|
+
* Contains the minimal set of fields required for requests
|
|
16
|
+
*/
|
|
17
|
+
export interface SessionContext {
|
|
18
|
+
sessionId: string;
|
|
19
|
+
clientName?: string;
|
|
20
|
+
clientVersion?: string;
|
|
21
|
+
protocolVersion?: string;
|
|
22
|
+
cwd?: string;
|
|
23
|
+
project?: string;
|
|
24
|
+
ip?: string;
|
|
25
|
+
userAgent?: string;
|
|
26
|
+
capabilities?: ClientCapabilities;
|
|
27
|
+
timestamp: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Complete session information - for tracking and display
|
|
31
|
+
* Extends SessionContext with runtime state
|
|
32
|
+
*/
|
|
33
|
+
export interface SessionInfo extends SessionContext {
|
|
34
|
+
lastSeen: number;
|
|
35
|
+
roots?: SessionRoot[];
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=session-context.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-context.types.d.ts","sourceRoot":"","sources":["../../../../shared/types/session-context.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAY,SAAQ,cAAc;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;CACvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug-response-wrapper.d.ts","sourceRoot":"","sources":["../../../../../src/api/mcp/debug-response-wrapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAW5C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"debug-response-wrapper.d.ts","sourceRoot":"","sources":["../../../../../src/api/mcp/debug-response-wrapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAW5C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAyS9E"}
|
|
@@ -78,7 +78,32 @@ export function wrapReplyForDebug(reply, sessionId) {
|
|
|
78
78
|
let logResponse = primaryBuffer;
|
|
79
79
|
try {
|
|
80
80
|
if (isToolsListResponse(logResponse)) {
|
|
81
|
-
|
|
81
|
+
const simplified = simplifyToolsListResponse(logResponse);
|
|
82
|
+
if (simplified !== null) {
|
|
83
|
+
logResponse = simplified;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// Could not simplify, format as pretty JSON
|
|
87
|
+
try {
|
|
88
|
+
// Handle SSE format
|
|
89
|
+
if (logResponse.includes('event: message') && logResponse.includes('data:')) {
|
|
90
|
+
const dataMatch = logResponse.match(/data: ([^\n]+)/);
|
|
91
|
+
if (dataMatch) {
|
|
92
|
+
const jsonData = dataMatch[1].trim();
|
|
93
|
+
const parsed = JSON.parse(jsonData);
|
|
94
|
+
const formattedData = stringifyForLogging(parsed);
|
|
95
|
+
logResponse = `event: message\ndata: ${formattedData}`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
const parsed = JSON.parse(logResponse);
|
|
100
|
+
logResponse = stringifyForLogging(parsed);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// If parsing fails, use original
|
|
105
|
+
}
|
|
106
|
+
}
|
|
82
107
|
}
|
|
83
108
|
else if (hasImageContent(logResponse)) {
|
|
84
109
|
// Simplify image content first
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../../../../src/api/mcp/gateway.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAU7E;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../../../../src/api/mcp/gateway.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAU7E;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,eAAe,iBAuI9D"}
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* This is a thin wrapper around modular utilities for better maintainability.
|
|
6
6
|
*/
|
|
7
7
|
import { logger, LOG_MODULES } from '../../utils/logger.js';
|
|
8
|
-
import { stringifyForLogging } from '../../utils/json-utils.js';
|
|
8
|
+
import { stringifyForLogging, getMcpCommDebugSetting } from '../../utils/json-utils.js';
|
|
9
9
|
import { requestContext } from '../../utils/request-context.js';
|
|
10
|
-
import {
|
|
11
|
-
import { mcpSessionManager } from '../../services/
|
|
10
|
+
import { sessionTrackerService } from '../../services/session-tracker.service.js';
|
|
11
|
+
import { mcpSessionManager } from '../../services/session/index.js';
|
|
12
12
|
import { cleanupStaleSseStreams } from './sse-stream-manager.js';
|
|
13
13
|
import { extractSessionContext } from './session-context-extractor.js';
|
|
14
14
|
import { wrapReplyForDebug } from './debug-response-wrapper.js';
|
|
@@ -20,30 +20,34 @@ import { wrapReplyForDebug } from './debug-response-wrapper.js';
|
|
|
20
20
|
export async function mcpGatewayRoutes(fastify) {
|
|
21
21
|
const handleMcpRequest = async (request, reply) => {
|
|
22
22
|
// First, log that we received the request (before extracting session context)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
23
|
+
if (getMcpCommDebugSetting()) {
|
|
24
|
+
let initialLogMsg = `MCP Gateway ${request.method} ${request.url}`;
|
|
25
|
+
// Combine headers and body into one log block
|
|
26
|
+
initialLogMsg += `\n Request headers: ${stringifyForLogging(request.headers)}`;
|
|
27
|
+
if (request.body) {
|
|
28
|
+
try {
|
|
29
|
+
const preview = stringifyForLogging(request.body);
|
|
30
|
+
initialLogMsg += `\n Body: ${preview}`;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
initialLogMsg += `\n Body: [Unserializable]`;
|
|
34
|
+
}
|
|
33
35
|
}
|
|
36
|
+
logger.debug(initialLogMsg, LOG_MODULES.COMMUNICATION);
|
|
34
37
|
}
|
|
35
|
-
|
|
36
|
-
const { sessionId, clientContext } = extractSessionContext(request);
|
|
38
|
+
const { sessionId, sessionContext } = extractSessionContext(request);
|
|
37
39
|
logger.info(`MCP Gateway ${request.method} ${request.url} [Session: ${sessionId}]`, LOG_MODULES.GATEWAY);
|
|
38
|
-
// Update
|
|
39
|
-
|
|
40
|
+
// Update session tracking information
|
|
41
|
+
sessionTrackerService.updateSession(sessionContext);
|
|
40
42
|
// Log the session context after extraction
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
if (getMcpCommDebugSetting()) {
|
|
44
|
+
let sessionLogMsg = `MCP Gateway Session Context [Session: ${sessionId}]`;
|
|
45
|
+
if (sessionContext.cwd)
|
|
46
|
+
sessionLogMsg += ` [CWD: ${sessionContext.cwd}]`;
|
|
47
|
+
if (sessionContext.clientName)
|
|
48
|
+
sessionLogMsg += ` [Client: ${sessionContext.clientName}]`;
|
|
49
|
+
logger.debug(sessionLogMsg, LOG_MODULES.COMMUNICATION);
|
|
50
|
+
}
|
|
47
51
|
reply.header('Content-Type', 'application/json');
|
|
48
52
|
if (!request.headers['accept']) {
|
|
49
53
|
request.headers['accept'] = 'application/json, text/event-stream';
|
|
@@ -66,7 +70,7 @@ export async function mcpGatewayRoutes(fastify) {
|
|
|
66
70
|
logger.debug(`Proactive SSE stream cleanup for session ${sessionId} before handling request`, LOG_MODULES.GATEWAY);
|
|
67
71
|
cleanupStaleSseStreams(session.transport, sessionId);
|
|
68
72
|
}
|
|
69
|
-
await requestContext.run(
|
|
73
|
+
await requestContext.run(sessionContext, async () => {
|
|
70
74
|
await session.transport.handleRequest(request.raw, reply.raw, request.body);
|
|
71
75
|
});
|
|
72
76
|
const duration = Date.now() - startTime;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Extracts and resolves session context from incoming requests.
|
|
4
4
|
*/
|
|
5
5
|
import type { FastifyRequest } from 'fastify';
|
|
6
|
-
import type {
|
|
6
|
+
import type { SessionContext } from '../../../shared/types/session-context.types.js';
|
|
7
7
|
export interface RequestBody {
|
|
8
8
|
method?: string;
|
|
9
9
|
params?: {
|
|
@@ -30,18 +30,18 @@ export interface RequestBody {
|
|
|
30
30
|
* project information, IP address, and user agent for comprehensive session tracking.
|
|
31
31
|
*
|
|
32
32
|
* @param {FastifyRequest<{ Body: RequestBody | null }>} request - Incoming Fastify request object
|
|
33
|
-
* @returns {{ sessionId: string;
|
|
33
|
+
* @returns {{ sessionId: string; sessionContext: SessionContext }} Object containing resolved session ID and enriched session context
|
|
34
34
|
*
|
|
35
35
|
* @example
|
|
36
36
|
* ```typescript
|
|
37
|
-
* const { sessionId,
|
|
38
|
-
* console.log(`Session: ${sessionId}, Client: ${
|
|
37
|
+
* const { sessionId, sessionContext } = extractSessionContext(request);
|
|
38
|
+
* console.log(`Session: ${sessionId}, Client: ${sessionContext.clientName}`);
|
|
39
39
|
* ```
|
|
40
40
|
*/
|
|
41
41
|
export declare function extractSessionContext(request: FastifyRequest<{
|
|
42
42
|
Body: RequestBody | null;
|
|
43
43
|
}>): {
|
|
44
44
|
sessionId: string;
|
|
45
|
-
|
|
45
|
+
sessionContext: SessionContext;
|
|
46
46
|
};
|
|
47
47
|
//# sourceMappingURL=session-context-extractor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-context-extractor.d.ts","sourceRoot":"","sources":["../../../../../src/api/mcp/session-context-extractor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"session-context-extractor.d.ts","sourceRoot":"","sources":["../../../../../src/api/mcp/session-context-extractor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAI7E,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QACP,UAAU,CAAC,EAAE;YACX,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,CAAC;IAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,CAAC,GAAG;IAC5F,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,cAAc,CAAC;CAChC,CAsGA"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { logger, LOG_MODULES } from '../../utils/logger.js';
|
|
6
6
|
import { randomUUID } from 'crypto';
|
|
7
|
-
import { mcpSessionManager } from '../../services/
|
|
7
|
+
import { mcpSessionManager } from '../../services/session/index.js';
|
|
8
8
|
/**
|
|
9
9
|
* Extracts session context from incoming MCP requests to establish client identity and session management.
|
|
10
10
|
*
|
|
@@ -19,12 +19,12 @@ import { mcpSessionManager } from '../../services/mcp-session-manager.js';
|
|
|
19
19
|
* project information, IP address, and user agent for comprehensive session tracking.
|
|
20
20
|
*
|
|
21
21
|
* @param {FastifyRequest<{ Body: RequestBody | null }>} request - Incoming Fastify request object
|
|
22
|
-
* @returns {{ sessionId: string;
|
|
22
|
+
* @returns {{ sessionId: string; sessionContext: SessionContext }} Object containing resolved session ID and enriched session context
|
|
23
23
|
*
|
|
24
24
|
* @example
|
|
25
25
|
* ```typescript
|
|
26
|
-
* const { sessionId,
|
|
27
|
-
* console.log(`Session: ${sessionId}, Client: ${
|
|
26
|
+
* const { sessionId, sessionContext } = extractSessionContext(request);
|
|
27
|
+
* console.log(`Session: ${sessionId}, Client: ${sessionContext.clientName}`);
|
|
28
28
|
* ```
|
|
29
29
|
*/
|
|
30
30
|
export function extractSessionContext(request) {
|
|
@@ -68,25 +68,10 @@ export function extractSessionContext(request) {
|
|
|
68
68
|
if (!sessionId && isInitializeRequest && request.body?.params?.clientInfo) {
|
|
69
69
|
const { name, version } = request.body.params.clientInfo;
|
|
70
70
|
protocolVersion = request.body.params.protocolVersion;
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const cwdHash = cwd
|
|
76
|
-
.split('')
|
|
77
|
-
.reduce((acc, char) => {
|
|
78
|
-
acc = (acc << 5) - acc + char.charCodeAt(0);
|
|
79
|
-
return acc & acc;
|
|
80
|
-
}, 0)
|
|
81
|
-
.toString(16)
|
|
82
|
-
.replace('-', '');
|
|
83
|
-
baseId = `${baseId}-${cwdHash}`;
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
const randomHash = randomUUID().substring(0, 8);
|
|
87
|
-
baseId = `${baseId}-${randomHash}`;
|
|
88
|
-
}
|
|
89
|
-
sessionId = baseId;
|
|
71
|
+
// Generate sessionId from client info with random hash (no cwd dependency)
|
|
72
|
+
const baseId = `${name.replace(/[^a-zA-Z0-9-]/g, '')}-${version.replace(/[^a-zA-Z0-9-]/g, '')}`;
|
|
73
|
+
const randomHash = randomUUID().substring(0, 8);
|
|
74
|
+
sessionId = `${baseId}-${randomHash}`;
|
|
90
75
|
logger.debug(`Generated sessionId from initialize params: ${sessionId}`, LOG_MODULES.CONTEXT);
|
|
91
76
|
// Save client version and protocol version information
|
|
92
77
|
clientVersion = version;
|
|
@@ -112,16 +97,16 @@ export function extractSessionContext(request) {
|
|
|
112
97
|
logger.warn(`Session state exists but session object missing for ${sessionId}`, LOG_MODULES.CONTEXT);
|
|
113
98
|
}
|
|
114
99
|
}
|
|
115
|
-
const
|
|
100
|
+
const sessionContext = {
|
|
116
101
|
sessionId,
|
|
117
102
|
clientName,
|
|
118
103
|
clientVersion,
|
|
119
104
|
protocolVersion,
|
|
120
|
-
cwd:
|
|
121
|
-
project:
|
|
105
|
+
cwd: undefined, // Will be populated from roots/list response later
|
|
106
|
+
project: undefined, // Will be populated from roots/list response later
|
|
122
107
|
ip: request.ip,
|
|
123
108
|
userAgent: headers['user-agent'],
|
|
124
109
|
timestamp: Date.now()
|
|
125
110
|
};
|
|
126
|
-
return { sessionId,
|
|
111
|
+
return { sessionId, sessionContext };
|
|
127
112
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { sessionTrackerService } from '../../services/session-tracker.service.js';
|
|
2
2
|
import { logger } from '../../utils/logger.js';
|
|
3
3
|
/**
|
|
4
4
|
* Registers web API routes for client management endpoints.
|
|
@@ -30,7 +30,7 @@ import { logger } from '../../utils/logger.js';
|
|
|
30
30
|
export async function webClientRoutes(fastify) {
|
|
31
31
|
fastify.get('/api/clients', async (_request, reply) => {
|
|
32
32
|
try {
|
|
33
|
-
const clients =
|
|
33
|
+
const clients = sessionTrackerService.getSessions();
|
|
34
34
|
return reply.send(clients);
|
|
35
35
|
}
|
|
36
36
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub-tools.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/hub-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA8B1C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"hub-tools.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/hub-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA8B1C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,iBA6O/D"}
|
|
@@ -154,7 +154,10 @@ export async function webHubToolsRoutes(fastify) {
|
|
|
154
154
|
toolArgs: z.record(z.string(), z.any()),
|
|
155
155
|
requestOptions: z
|
|
156
156
|
.object({
|
|
157
|
-
sessionId: z
|
|
157
|
+
sessionId: z
|
|
158
|
+
.union([z.string(), z.null()])
|
|
159
|
+
.optional()
|
|
160
|
+
.transform((val) => val ?? undefined),
|
|
158
161
|
tags: z.record(z.string(), z.string()).optional()
|
|
159
162
|
})
|
|
160
163
|
.optional()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app.ts"],"names":[],"mappings":"AA4BA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,QAAQ,mWAoE7B"}
|
package/dist/server/src/app.js
CHANGED
|
@@ -14,7 +14,6 @@ import { webMcpStatusRoutes } from './api/web/mcp-status.js';
|
|
|
14
14
|
import { configRoutes } from './api/web/config.js';
|
|
15
15
|
import { webLogRoutes } from './api/web/logs.js';
|
|
16
16
|
import { webHubToolsRoutes } from './api/web/hub-tools.js';
|
|
17
|
-
import { webClientRoutes } from './api/web/clients.js';
|
|
18
17
|
import { webResourceRoutes } from './api/web/resources.js';
|
|
19
18
|
import { webSessionRoutes } from './api/web/sessions.js';
|
|
20
19
|
// WebSocket Routes
|
|
@@ -77,7 +76,6 @@ export async function buildApp() {
|
|
|
77
76
|
fastify.register(configRoutes);
|
|
78
77
|
fastify.register(webLogRoutes);
|
|
79
78
|
fastify.register(webHubToolsRoutes);
|
|
80
|
-
fastify.register(webClientRoutes);
|
|
81
79
|
fastify.register(webResourceRoutes);
|
|
82
80
|
fastify.register(webSessionRoutes);
|
|
83
81
|
fastify.register(webSocketRoutes);
|
|
@@ -8,6 +8,7 @@ export declare const ServerConfigSchema: z.ZodObject<{
|
|
|
8
8
|
command: z.ZodOptional<z.ZodString>;
|
|
9
9
|
args: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
10
10
|
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
11
|
+
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
11
12
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
12
13
|
tags: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
13
14
|
type: z.ZodDefault<z.ZodEnum<{
|
|
@@ -88,6 +89,7 @@ export declare const SystemConfigSchema: z.ZodObject<{
|
|
|
88
89
|
command: z.ZodOptional<z.ZodString>;
|
|
89
90
|
args: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
90
91
|
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
92
|
+
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
91
93
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
92
94
|
tags: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
93
95
|
type: z.ZodDefault<z.ZodEnum<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.schema.d.ts","sourceRoot":"","sources":["../../../../src/config/config.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAE9D;;;GAGG;AAGH,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"config.schema.d.ts","sourceRoot":"","sources":["../../../../src/config/config.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAE9D;;;GAGG;AAGH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;iBAY7B,CAAC;AAGH,eAAO,MAAM,0BAA0B;;;;;;iBAMrC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;kBAc5B,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;kBA0B7B,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyB7B,CAAC;AAGH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
|
|
@@ -8,6 +8,7 @@ export const ServerConfigSchema = z.object({
|
|
|
8
8
|
command: z.string().optional(),
|
|
9
9
|
args: z.array(z.string()).default([]),
|
|
10
10
|
env: z.record(z.string(), z.string()).optional(),
|
|
11
|
+
headers: z.record(z.string(), z.string()).optional(),
|
|
11
12
|
enabled: z.boolean().default(true),
|
|
12
13
|
tags: z.record(z.string(), z.string()).optional(),
|
|
13
14
|
type: z.enum(['stdio', 'sse', 'streamable-http', 'http']).default('stdio'),
|
package/dist/server/src/index.js
CHANGED
|
@@ -80,7 +80,7 @@ program
|
|
|
80
80
|
const logRotator = new LogRotator(logDir, 'mcp-hub', undefined, () => configManager.getConfig());
|
|
81
81
|
// Rotate old logs before starting
|
|
82
82
|
logRotator.rotateLogs();
|
|
83
|
-
const logFile = logRotator.
|
|
83
|
+
const logFile = logRotator.createNewLogFilePath();
|
|
84
84
|
const logStream = fs.openSync(logFile, 'a');
|
|
85
85
|
console.log(`Starting server in background...`);
|
|
86
86
|
console.log(`Logs: ${logFile}`);
|