@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.
Files changed (129) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +15 -0
  3. package/dist/client/assets/{HomeView-f901HeKw.js → HomeView-7rMg9C6t.js} +1 -1
  4. package/dist/client/assets/{ResourceDetailView-Bz66ZjfY.js → ResourceDetailView-Bf-1ffbk.js} +1 -1
  5. package/dist/client/assets/ResourcesView-g5x4xCPh.js +1 -0
  6. package/dist/client/assets/{ServerDashboard-7_8Og9JJ.css → ServerDashboard-Chpne8Q0.css} +1 -1
  7. package/dist/client/assets/ServerDashboard-G8Wmp4hF.js +2 -0
  8. package/dist/client/assets/ServerListView-dV2XrPjo.js +32 -0
  9. package/dist/client/assets/SessionsView-Ckd38lj1.js +1 -0
  10. package/dist/client/assets/SettingsView-BJUdepEQ.js +1 -0
  11. package/dist/client/assets/ToolCallDialog-BhdPX-Kf.css +1 -0
  12. package/dist/client/assets/ToolCallDialog-C_bTCpHC.js +1 -0
  13. package/dist/client/assets/ToolsView-0c2eputu.js +1 -0
  14. package/dist/client/assets/ToolsView-E3Ps9c7i.css +1 -0
  15. package/dist/client/assets/{_baseClone-DCmK847M.js → _baseClone-5q1b0P3O.js} +1 -1
  16. package/dist/client/assets/{el-form-item-DM0q2hmO.js → el-form-item-ClFnj49k.js} +1 -1
  17. package/dist/client/assets/{el-input-BtI9NECe.js → el-input-CDnuSKVZ.js} +1 -1
  18. package/dist/client/assets/{el-loading-CChNmKeI.js → el-loading-H85n3BUC.js} +1 -1
  19. package/dist/client/assets/{el-overlay-lZZbPmsX.js → el-overlay-CzMkXyYy.js} +1 -1
  20. package/dist/client/assets/el-select-DvjGddk_.js +1 -0
  21. package/dist/client/assets/{el-tab-pane-Dy9ruaEX.js → el-tab-pane-C_DQMcwe.js} +1 -1
  22. package/dist/client/assets/{el-table-column-98UyVgBH.js → el-table-column-CASRIbZM.js} +1 -1
  23. package/dist/client/assets/el-tag-npbwux4f.js +1 -0
  24. package/dist/client/assets/{index-CSTs2jYk.js → index-CCnAxNF8.js} +2 -2
  25. package/dist/client/assets/{index-BzQXG7no.js → index-d1DZeSfz.js} +1 -1
  26. package/dist/client/assets/{omit-Bx5HJNV_.js → omit-DPsOVNIJ.js} +1 -1
  27. package/dist/client/assets/{raf-B9VDMtMF.js → raf-DY5mgbuB.js} +1 -1
  28. package/dist/client/assets/{vnode-B8aJx8u4.js → vnode-CHomNjgN.js} +1 -1
  29. package/dist/client/index.html +1 -1
  30. package/dist/server/shared/models/server.model.d.ts +1 -0
  31. package/dist/server/shared/models/server.model.d.ts.map +1 -1
  32. package/dist/server/shared/models/session.model.d.ts +2 -0
  33. package/dist/server/shared/models/session.model.d.ts.map +1 -1
  34. package/dist/server/shared/models/session.model.js +1 -0
  35. package/dist/server/shared/types/client.types.d.ts +4 -32
  36. package/dist/server/shared/types/client.types.d.ts.map +1 -1
  37. package/dist/server/shared/types/client.types.js +3 -2
  38. package/dist/server/shared/types/index.d.ts +3 -3
  39. package/dist/server/shared/types/index.d.ts.map +1 -1
  40. package/dist/server/shared/types/index.js +3 -3
  41. package/dist/server/shared/types/session-context.types.d.ts +37 -0
  42. package/dist/server/shared/types/session-context.types.d.ts.map +1 -0
  43. package/dist/server/shared/types/session-context.types.js +5 -0
  44. package/dist/server/src/api/mcp/debug-response-wrapper.d.ts.map +1 -1
  45. package/dist/server/src/api/mcp/debug-response-wrapper.js +26 -1
  46. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
  47. package/dist/server/src/api/mcp/gateway.js +28 -24
  48. package/dist/server/src/api/mcp/session-context-extractor.d.ts +5 -5
  49. package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -1
  50. package/dist/server/src/api/mcp/session-context-extractor.js +12 -27
  51. package/dist/server/src/api/web/clients.js +2 -2
  52. package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
  53. package/dist/server/src/api/web/hub-tools.js +4 -1
  54. package/dist/server/src/api/web/sessions.js +1 -1
  55. package/dist/server/src/app.d.ts.map +1 -1
  56. package/dist/server/src/app.js +0 -2
  57. package/dist/server/src/config/config.schema.d.ts +2 -0
  58. package/dist/server/src/config/config.schema.d.ts.map +1 -1
  59. package/dist/server/src/config/config.schema.js +1 -0
  60. package/dist/server/src/index.js +1 -1
  61. package/dist/server/src/services/client-tracker.service.d.ts +3 -128
  62. package/dist/server/src/services/client-tracker.service.d.ts.map +1 -1
  63. package/dist/server/src/services/client-tracker.service.js +4 -200
  64. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +2 -2
  65. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -1
  66. package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +40 -8
  67. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
  68. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +18 -6
  69. package/dist/server/src/services/gateway/tool-list-generator.js +2 -2
  70. package/dist/server/src/services/hub-tools/resource-generator.d.ts +1 -4
  71. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
  72. package/dist/server/src/services/hub-tools/resource-generator.js +1 -26
  73. package/dist/server/src/services/search/search-cache.d.ts +0 -19
  74. package/dist/server/src/services/search/search-cache.d.ts.map +1 -1
  75. package/dist/server/src/services/search/search-cache.js +0 -24
  76. package/dist/server/src/services/session/session-manager.d.ts.map +1 -1
  77. package/dist/server/src/services/session/session-manager.js +11 -9
  78. package/dist/server/src/services/session-tracker.service.d.ts +132 -0
  79. package/dist/server/src/services/session-tracker.service.d.ts.map +1 -0
  80. package/dist/server/src/services/session-tracker.service.js +227 -0
  81. package/dist/server/src/utils/json-utils.d.ts.map +1 -1
  82. package/dist/server/src/utils/json-utils.js +6 -0
  83. package/dist/server/src/utils/logger/log-colors.d.ts +1 -0
  84. package/dist/server/src/utils/logger/log-colors.d.ts.map +1 -1
  85. package/dist/server/src/utils/logger/log-colors.js +2 -1
  86. package/dist/server/src/utils/logger/log-context.d.ts +1 -0
  87. package/dist/server/src/utils/logger/log-context.d.ts.map +1 -1
  88. package/dist/server/src/utils/logger/log-formatter.d.ts +28 -0
  89. package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
  90. package/dist/server/src/utils/logger/log-formatter.js +205 -0
  91. package/dist/server/src/utils/logger/log-modules.d.ts +3 -6
  92. package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
  93. package/dist/server/src/utils/logger/log-modules.js +1 -3
  94. package/dist/server/src/utils/logger/log-output.d.ts +2 -2
  95. package/dist/server/src/utils/logger/log-output.d.ts.map +1 -1
  96. package/dist/server/src/utils/logger/log-output.js +27 -6
  97. package/dist/server/src/utils/logger/logger.d.ts +13 -0
  98. package/dist/server/src/utils/logger/logger.d.ts.map +1 -1
  99. package/dist/server/src/utils/logger/logger.js +42 -7
  100. package/dist/server/src/utils/request-context.d.ts +16 -16
  101. package/dist/server/src/utils/request-context.d.ts.map +1 -1
  102. package/dist/server/src/utils/request-context.js +14 -14
  103. package/dist/server/src/utils/tool-args-parser.d.ts +0 -4
  104. package/dist/server/src/utils/tool-args-parser.d.ts.map +1 -1
  105. package/dist/server/src/utils/tool-args-parser.js +0 -7
  106. package/dist/server/src/utils/transports/stdio-transport.js +1 -1
  107. package/dist/server/src/utils/transports/transport-factory.js +2 -2
  108. package/dist/server/tests/integration/api/gateway.test.js +22 -37
  109. package/dist/server/tests/temp/test-stack.d.ts +6 -0
  110. package/dist/server/tests/temp/test-stack.d.ts.map +1 -0
  111. package/dist/server/tests/temp/test-stack.js +40 -0
  112. package/dist/server/tests/unit/services/hub-tools.service.test.js +1 -15
  113. package/dist/server/tests/unit/services/session-manager.test.js +1 -1
  114. package/dist/server/tests/unit/utils/json-utils.test.js +94 -0
  115. package/dist/server/tests/unit/utils/logger.test.js +101 -0
  116. package/dist/server/tests/unit/utils/request-context.test.js +12 -12
  117. package/package.json +1 -1
  118. package/dist/client/assets/ResourcesView-lI_fItfA.js +0 -1
  119. package/dist/client/assets/ServerDashboard-Bgx8WVkx.js +0 -2
  120. package/dist/client/assets/ServerListView-CP6Ffkfx.js +0 -30
  121. package/dist/client/assets/SessionsView-D68qKR4D.js +0 -1
  122. package/dist/client/assets/SettingsView-BPYfO9BE.js +0 -1
  123. package/dist/client/assets/ToolCallDialog-Br8FNebN.js +0 -1
  124. package/dist/client/assets/ToolCallDialog-C7eh7jHE.css +0 -1
  125. package/dist/client/assets/ToolsView-B6hUiR43.js +0 -1
  126. package/dist/client/assets/ToolsView-BLnU8cV6.css +0 -1
  127. package/dist/client/assets/el-select-BXztu2b5.js +0 -1
  128. package/dist/client/assets/el-tag-B5lLT51E.js +0 -1
  129. package/dist/client/assets/index-BgKcmWJr.js +0 -1
@@ -1 +1 @@
1
- import{t as Q,c as d,A as x,y as f,v as A,O as F,G as k,H as W,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 M,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 Me,i as le,U as ke,d as $e,e as q,aQ as Ie,aR as Le,a as K,T as Oe,a8 as Pe,g as xe,E as Ae,bi as p,$ as P,h as De,bj as ze}from"./index-CSTs2jYk.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=Q({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:k(()=>[W(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=Me(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:ke,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"],Qe=["innerHTML"],We=Q({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:k(()=>[W(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"])):M("v-if",!0),R.value?(f(),C(i(K),{key:1,class:g([i(l).e("icon"),pe.value])},{default:k(()=>[(f(),C(Te(R.value)))]),_:1},8,["class"])):M("v-if",!0),A(r.$slots,"default",{},()=>[r.dangerouslyUseHTMLString?(f(),x(Se,{key:1},[M(" 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,Qe)],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:k(()=>[F(i(n))]),_:1},8,["class"])):M("v-if",!0)],46,Ke),[[ee,E.value]])]),_:3},8,["name","onBeforeLeave"]))}});var Xe=ae(We,[["__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
+ 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{ap as a,bt as c,bs as s,bu as u,bq as g,bv as v,aw as O}from"./index-CSTs2jYk.js";import{g as b,c as p,f as y,e as _}from"./_baseClone-DCmK847M.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 T(t){return A(t)?void 0:t}var x=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,x|N|D,T));for(var n=r.length;n--;)h(e,r[n]);return e});export{A as i,R as o};
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-CSTs2jYk.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
+ 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-CSTs2jYk.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};
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};
@@ -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-CSTs2jYk.js"></script>
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>
@@ -6,6 +6,7 @@ export interface ServerConfig {
6
6
  args?: string[];
7
7
  url?: string;
8
8
  env?: Record<string, string>;
9
+ headers?: Record<string, string>;
9
10
  timeout?: number;
10
11
  enabled?: boolean;
11
12
  allowedTools?: string[];
@@ -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;;;;;;;;;;;;iBAY7B,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"}
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
- * Client Types
3
- * Shared client session types between frontend and backend
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;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,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,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAW,SAAQ,aAAa;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB"}
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
- * Client Types
3
- * Shared client session types between frontend and backend
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 * from './client.types';
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":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC"}
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
- export * from './client.types';
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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Session Context Types
3
+ * Shared session context types between frontend and backend
4
+ */
5
+ export {};
@@ -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,CAmR9E"}
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
- logResponse = simplifyToolsListResponse(logResponse);
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,iBAmI9D"}
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 { clientTrackerService } from '../../services/client-tracker.service.js';
11
- import { mcpSessionManager } from '../../services/mcp-session-manager.js';
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
- let initialLogMsg = `MCP Gateway ${request.method} ${request.url}`;
24
- // Combine headers and body into one log block
25
- initialLogMsg += `\n Request headers: ${stringifyForLogging(request.headers)}`;
26
- if (request.body) {
27
- try {
28
- const preview = stringifyForLogging(request.body);
29
- initialLogMsg += `\n Body: ${preview}`;
30
- }
31
- catch {
32
- initialLogMsg += `\n Body: [Unserializable]`;
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
- logger.debug(initialLogMsg, LOG_MODULES.GATEWAY);
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 client tracking information
39
- clientTrackerService.updateClient(clientContext);
40
+ // Update session tracking information
41
+ sessionTrackerService.updateSession(sessionContext);
40
42
  // Log the session context after extraction
41
- let sessionLogMsg = `MCP Gateway Session Context [Session: ${sessionId}]`;
42
- if (clientContext.cwd)
43
- sessionLogMsg += ` [CWD: ${clientContext.cwd}]`;
44
- if (clientContext.clientName)
45
- sessionLogMsg += ` [Client: ${clientContext.clientName}]`;
46
- logger.debug(sessionLogMsg, LOG_MODULES.GATEWAY);
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(clientContext, async () => {
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 { ClientContext } from '../../../shared/types/client.types.js';
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; clientContext: ClientContext }} Object containing resolved session ID and enriched client context
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, clientContext } = extractSessionContext(request);
38
- * console.log(`Session: ${sessionId}, Client: ${clientContext.clientName}`);
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
- clientContext: ClientContext;
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,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAInE,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,aAAa,EAAE,aAAa,CAAC;CAC9B,CAoHA"}
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/mcp-session-manager.js';
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; clientContext: ClientContext }} Object containing resolved session ID and enriched client context
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, clientContext } = extractSessionContext(request);
27
- * console.log(`Session: ${sessionId}, Client: ${clientContext.clientName}`);
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
- const cwd = headers['x-mcp-cwd'] || headers['x-cwd'];
72
- // Generate sessionId from client info
73
- let baseId = `${name.replace(/[^a-zA-Z0-9-]/g, '')}-${version.replace(/[^a-zA-Z0-9-]/g, '')}`;
74
- if (cwd) {
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 clientContext = {
100
+ const sessionContext = {
116
101
  sessionId,
117
102
  clientName,
118
103
  clientVersion,
119
104
  protocolVersion,
120
- cwd: headers['x-mcp-cwd'] || headers['x-cwd'],
121
- project: headers['x-mcp-project'] || headers['x-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, clientContext };
111
+ return { sessionId, sessionContext };
127
112
  }
@@ -1,4 +1,4 @@
1
- import { clientTrackerService } from '../../services/client-tracker.service.js';
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 = clientTrackerService.getClients();
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,iBA0O/D"}
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.string().optional(),
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,4 +1,4 @@
1
- import { mcpSessionManager } from '../../services/mcp-session-manager.js';
1
+ import { mcpSessionManager } from '../../services/session/index.js';
2
2
  import { logger, LOG_MODULES } from '../../utils/logger.js';
3
3
  /**
4
4
  * Session Management API Routes
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app.ts"],"names":[],"mappings":"AA6BA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,QAAQ,mWAqE7B"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app.ts"],"names":[],"mappings":"AA4BA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,QAAQ,mWAoE7B"}
@@ -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;;;;;;;;;;;;;;;;iBAW7B,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"}
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'),
@@ -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.getCurrentLogFilePath();
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}`);