@loop_ouroboros/mcp-hub-lite 1.0.0
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 +228 -0
- package/LICENSE +21 -0
- package/README.md +354 -0
- package/dist/client/assets/HomeView-f901HeKw.js +1 -0
- package/dist/client/assets/ResourceDetailView-BdOaL_-o.css +1 -0
- package/dist/client/assets/ResourceDetailView-Bz66ZjfY.js +1 -0
- package/dist/client/assets/ResourcesView-CjMklkyv.css +1 -0
- package/dist/client/assets/ResourcesView-lI_fItfA.js +1 -0
- package/dist/client/assets/ServerDashboard-7_8Og9JJ.css +1 -0
- package/dist/client/assets/ServerDashboard-Bgx8WVkx.js +2 -0
- package/dist/client/assets/ServerListView-Bws09jNR.css +1 -0
- package/dist/client/assets/ServerListView-CP6Ffkfx.js +30 -0
- package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +1 -0
- package/dist/client/assets/SessionsView-D68qKR4D.js +1 -0
- package/dist/client/assets/SettingsView-BPYfO9BE.js +1 -0
- package/dist/client/assets/ToolCallDialog-Br8FNebN.js +1 -0
- package/dist/client/assets/ToolCallDialog-C7eh7jHE.css +1 -0
- package/dist/client/assets/ToolsView-B6hUiR43.js +1 -0
- package/dist/client/assets/ToolsView-BLnU8cV6.css +1 -0
- package/dist/client/assets/_baseClone-DCmK847M.js +1 -0
- package/dist/client/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
- package/dist/client/assets/el-form-item-BVMLpmVC.css +1 -0
- package/dist/client/assets/el-form-item-DM0q2hmO.js +12 -0
- package/dist/client/assets/el-input-BtI9NECe.js +1 -0
- package/dist/client/assets/el-input-CmuHb8HS.css +1 -0
- package/dist/client/assets/el-loading-CChNmKeI.js +1 -0
- package/dist/client/assets/el-loading-bpKhqqQq.css +1 -0
- package/dist/client/assets/el-overlay-B2ZKM6Up.css +1 -0
- package/dist/client/assets/el-overlay-lZZbPmsX.js +1 -0
- package/dist/client/assets/el-select-BXztu2b5.js +1 -0
- package/dist/client/assets/el-select-C0U_l4IZ.css +1 -0
- package/dist/client/assets/el-tab-pane-CnNoQHsR.css +1 -0
- package/dist/client/assets/el-tab-pane-Dy9ruaEX.js +1 -0
- package/dist/client/assets/el-table-column-98UyVgBH.js +1 -0
- package/dist/client/assets/el-table-column-T_mV9jNw.css +1 -0
- package/dist/client/assets/el-tag-B5lLT51E.js +1 -0
- package/dist/client/assets/el-tag-DjxZVOpb.css +1 -0
- package/dist/client/assets/event-BB_Ol6Sd.js +1 -0
- package/dist/client/assets/index-BgKcmWJr.js +1 -0
- package/dist/client/assets/index-BsDWtoIl.css +1 -0
- package/dist/client/assets/index-BzQXG7no.js +1 -0
- package/dist/client/assets/index-CSTs2jYk.js +2 -0
- package/dist/client/assets/omit-Bx5HJNV_.js +1 -0
- package/dist/client/assets/raf-B9VDMtMF.js +1 -0
- package/dist/client/assets/typescript-Bp3YSIOJ.js +1 -0
- package/dist/client/assets/vnode-B8aJx8u4.js +1 -0
- package/dist/client/assets/vue-vendor-6ny5zj9i.js +3 -0
- package/dist/client/index.html +15 -0
- package/dist/server/shared/index.d.ts +3 -0
- package/dist/server/shared/index.d.ts.map +1 -0
- package/dist/server/shared/index.js +2 -0
- package/dist/server/shared/models/index.d.ts +4 -0
- package/dist/server/shared/models/index.d.ts.map +1 -0
- package/dist/server/shared/models/index.js +3 -0
- package/dist/server/shared/models/resource.model.d.ts +8 -0
- package/dist/server/shared/models/resource.model.d.ts.map +1 -0
- package/dist/server/shared/models/resource.model.js +1 -0
- package/dist/server/shared/models/server.model.d.ts +57 -0
- package/dist/server/shared/models/server.model.d.ts.map +1 -0
- package/dist/server/shared/models/server.model.js +1 -0
- package/dist/server/shared/models/session.model.d.ts +73 -0
- package/dist/server/shared/models/session.model.d.ts.map +1 -0
- package/dist/server/shared/models/session.model.js +70 -0
- package/dist/server/shared/models/tool.model.d.ts +22 -0
- package/dist/server/shared/models/tool.model.d.ts.map +1 -0
- package/dist/server/shared/models/tool.model.js +1 -0
- package/dist/server/shared/types/client.types.d.ts +35 -0
- package/dist/server/shared/types/client.types.d.ts.map +1 -0
- package/dist/server/shared/types/client.types.js +5 -0
- package/dist/server/shared/types/common.types.d.ts +5 -0
- package/dist/server/shared/types/common.types.d.ts.map +1 -0
- package/dist/server/shared/types/common.types.js +2 -0
- package/dist/server/shared/types/index.d.ts +4 -0
- package/dist/server/shared/types/index.d.ts.map +1 -0
- package/dist/server/shared/types/index.js +3 -0
- package/dist/server/shared/types/session.types.d.ts +15 -0
- package/dist/server/shared/types/session.types.d.ts.map +1 -0
- package/dist/server/shared/types/session.types.js +5 -0
- package/dist/server/shared/types/websocket.types.d.ts +177 -0
- package/dist/server/shared/types/websocket.types.d.ts.map +1 -0
- package/dist/server/shared/types/websocket.types.js +25 -0
- package/dist/server/src/api/mcp/debug-response-wrapper.d.ts +13 -0
- package/dist/server/src/api/mcp/debug-response-wrapper.d.ts.map +1 -0
- package/dist/server/src/api/mcp/debug-response-wrapper.js +271 -0
- package/dist/server/src/api/mcp/gateway.d.ts +14 -0
- package/dist/server/src/api/mcp/gateway.d.ts.map +1 -0
- package/dist/server/src/api/mcp/gateway.js +116 -0
- package/dist/server/src/api/mcp/session-context-extractor.d.ts +47 -0
- package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -0
- package/dist/server/src/api/mcp/session-context-extractor.js +127 -0
- package/dist/server/src/api/mcp/sse-stream-manager.d.ts +13 -0
- package/dist/server/src/api/mcp/sse-stream-manager.d.ts.map +1 -0
- package/dist/server/src/api/mcp/sse-stream-manager.js +40 -0
- package/dist/server/src/api/web/clients.d.ts +30 -0
- package/dist/server/src/api/web/clients.d.ts.map +1 -0
- package/dist/server/src/api/web/clients.js +41 -0
- package/dist/server/src/api/web/config.d.ts +21 -0
- package/dist/server/src/api/web/config.d.ts.map +1 -0
- package/dist/server/src/api/web/config.js +119 -0
- package/dist/server/src/api/web/health.d.ts +21 -0
- package/dist/server/src/api/web/health.d.ts.map +1 -0
- package/dist/server/src/api/web/health.js +24 -0
- package/dist/server/src/api/web/hub-tools.d.ts +30 -0
- package/dist/server/src/api/web/hub-tools.d.ts.map +1 -0
- package/dist/server/src/api/web/hub-tools.js +202 -0
- package/dist/server/src/api/web/logs.d.ts +30 -0
- package/dist/server/src/api/web/logs.d.ts.map +1 -0
- package/dist/server/src/api/web/logs.js +141 -0
- package/dist/server/src/api/web/mcp-status.d.ts +29 -0
- package/dist/server/src/api/web/mcp-status.d.ts.map +1 -0
- package/dist/server/src/api/web/mcp-status.js +126 -0
- package/dist/server/src/api/web/resources.d.ts +28 -0
- package/dist/server/src/api/web/resources.d.ts.map +1 -0
- package/dist/server/src/api/web/resources.js +93 -0
- package/dist/server/src/api/web/search.d.ts +26 -0
- package/dist/server/src/api/web/search.d.ts.map +1 -0
- package/dist/server/src/api/web/search.js +62 -0
- package/dist/server/src/api/web/servers.d.ts +33 -0
- package/dist/server/src/api/web/servers.d.ts.map +1 -0
- package/dist/server/src/api/web/servers.js +235 -0
- package/dist/server/src/api/web/sessions.d.ts +29 -0
- package/dist/server/src/api/web/sessions.d.ts.map +1 -0
- package/dist/server/src/api/web/sessions.js +104 -0
- package/dist/server/src/api/ws/events.d.ts +29 -0
- package/dist/server/src/api/ws/events.d.ts.map +1 -0
- package/dist/server/src/api/ws/events.js +44 -0
- package/dist/server/src/api/ws/ws-handler.d.ts +83 -0
- package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -0
- package/dist/server/src/api/ws/ws-handler.js +217 -0
- package/dist/server/src/app.d.ts +24 -0
- package/dist/server/src/app.d.ts.map +1 -0
- package/dist/server/src/app.js +108 -0
- package/dist/server/src/cli/commands/list.d.ts +71 -0
- package/dist/server/src/cli/commands/list.d.ts.map +1 -0
- package/dist/server/src/cli/commands/list.js +97 -0
- package/dist/server/src/cli/commands/restart.d.ts +42 -0
- package/dist/server/src/cli/commands/restart.d.ts.map +1 -0
- package/dist/server/src/cli/commands/restart.js +61 -0
- package/dist/server/src/cli/commands/start.d.ts +43 -0
- package/dist/server/src/cli/commands/start.d.ts.map +1 -0
- package/dist/server/src/cli/commands/start.js +160 -0
- package/dist/server/src/cli/commands/status.d.ts +39 -0
- package/dist/server/src/cli/commands/status.d.ts.map +1 -0
- package/dist/server/src/cli/commands/status.js +164 -0
- package/dist/server/src/cli/commands/stop.d.ts +34 -0
- package/dist/server/src/cli/commands/stop.d.ts.map +1 -0
- package/dist/server/src/cli/commands/stop.js +47 -0
- package/dist/server/src/cli/commands/ui.d.ts +44 -0
- package/dist/server/src/cli/commands/ui.d.ts.map +1 -0
- package/dist/server/src/cli/commands/ui.js +95 -0
- package/dist/server/src/cli/index.d.ts +62 -0
- package/dist/server/src/cli/index.d.ts.map +1 -0
- package/dist/server/src/cli/index.js +88 -0
- package/dist/server/src/cli/parse-args.d.ts +108 -0
- package/dist/server/src/cli/parse-args.d.ts.map +1 -0
- package/dist/server/src/cli/parse-args.js +131 -0
- package/dist/server/src/cli/server.d.ts +171 -0
- package/dist/server/src/cli/server.d.ts.map +1 -0
- package/dist/server/src/cli/server.js +246 -0
- package/dist/server/src/config/config-change-logger.d.ts +16 -0
- package/dist/server/src/config/config-change-logger.d.ts.map +1 -0
- package/dist/server/src/config/config-change-logger.js +43 -0
- package/dist/server/src/config/config-loader.d.ts +22 -0
- package/dist/server/src/config/config-loader.d.ts.map +1 -0
- package/dist/server/src/config/config-loader.js +66 -0
- package/dist/server/src/config/config-manager.d.ts +158 -0
- package/dist/server/src/config/config-manager.d.ts.map +1 -0
- package/dist/server/src/config/config-manager.js +246 -0
- package/dist/server/src/config/config-saver.d.ts +16 -0
- package/dist/server/src/config/config-saver.d.ts.map +1 -0
- package/dist/server/src/config/config-saver.js +28 -0
- package/dist/server/src/config/config.schema.d.ts +108 -0
- package/dist/server/src/config/config.schema.d.ts.map +1 -0
- package/dist/server/src/config/config.schema.js +103 -0
- package/dist/server/src/config/server-config-manager.d.ts +74 -0
- package/dist/server/src/config/server-config-manager.d.ts.map +1 -0
- package/dist/server/src/config/server-config-manager.js +157 -0
- package/dist/server/src/config/type-converter.d.ts +13 -0
- package/dist/server/src/config/type-converter.d.ts.map +1 -0
- package/dist/server/src/config/type-converter.js +37 -0
- package/dist/server/src/index.d.ts +3 -0
- package/dist/server/src/index.d.ts.map +1 -0
- package/dist/server/src/index.js +352 -0
- package/dist/server/src/models/event.model.d.ts +106 -0
- package/dist/server/src/models/event.model.d.ts.map +1 -0
- package/dist/server/src/models/event.model.js +5 -0
- package/dist/server/src/models/server.model.d.ts +19 -0
- package/dist/server/src/models/server.model.d.ts.map +1 -0
- package/dist/server/src/models/server.model.js +1 -0
- package/dist/server/src/models/system-tools.constants.d.ts +73 -0
- package/dist/server/src/models/system-tools.constants.d.ts.map +1 -0
- package/dist/server/src/models/system-tools.constants.js +31 -0
- package/dist/server/src/models/types.d.ts +84 -0
- package/dist/server/src/models/types.d.ts.map +1 -0
- package/dist/server/src/models/types.js +67 -0
- package/dist/server/src/pid/file.d.ts +26 -0
- package/dist/server/src/pid/file.d.ts.map +1 -0
- package/dist/server/src/pid/file.js +68 -0
- package/dist/server/src/pid/manager.d.ts +98 -0
- package/dist/server/src/pid/manager.d.ts.map +1 -0
- package/dist/server/src/pid/manager.js +158 -0
- package/dist/server/src/pid/types.d.ts +13 -0
- package/dist/server/src/pid/types.d.ts.map +1 -0
- package/dist/server/src/pid/types.js +4 -0
- package/dist/server/src/server/dev-server.d.ts +2 -0
- package/dist/server/src/server/dev-server.d.ts.map +1 -0
- package/dist/server/src/server/dev-server.js +171 -0
- package/dist/server/src/server/runner.d.ts +57 -0
- package/dist/server/src/server/runner.d.ts.map +1 -0
- package/dist/server/src/server/runner.js +163 -0
- package/dist/server/src/services/client-tracker.service.d.ts +132 -0
- package/dist/server/src/services/client-tracker.service.d.ts.map +1 -0
- package/dist/server/src/services/client-tracker.service.js +203 -0
- package/dist/server/src/services/connection/connection-manager.d.ts +478 -0
- package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -0
- package/dist/server/src/services/connection/connection-manager.js +929 -0
- package/dist/server/src/services/connection/index.d.ts +6 -0
- package/dist/server/src/services/connection/index.d.ts.map +1 -0
- package/dist/server/src/services/connection/index.js +4 -0
- package/dist/server/src/services/connection/tool-cache.d.ts +122 -0
- package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -0
- package/dist/server/src/services/connection/tool-cache.js +202 -0
- package/dist/server/src/services/connection/types.d.ts +30 -0
- package/dist/server/src/services/connection/types.d.ts.map +1 -0
- package/dist/server/src/services/connection/types.js +1 -0
- package/dist/server/src/services/event-bus.service.d.ts +169 -0
- package/dist/server/src/services/event-bus.service.d.ts.map +1 -0
- package/dist/server/src/services/event-bus.service.js +200 -0
- package/dist/server/src/services/gateway/gateway.service.d.ts +61 -0
- package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -0
- package/dist/server/src/services/gateway/gateway.service.js +107 -0
- package/dist/server/src/services/gateway/index.d.ts +8 -0
- package/dist/server/src/services/gateway/index.d.ts.map +1 -0
- package/dist/server/src/services/gateway/index.js +6 -0
- package/dist/server/src/services/gateway/log-formatter.d.ts +26 -0
- package/dist/server/src/services/gateway/log-formatter.d.ts.map +1 -0
- package/dist/server/src/services/gateway/log-formatter.js +66 -0
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts +13 -0
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +131 -0
- package/dist/server/src/services/gateway/request-handlers/index.d.ts +9 -0
- package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/index.js +8 -0
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +11 -0
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +85 -0
- package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts +11 -0
- package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/resources-handler.js +56 -0
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts +11 -0
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +228 -0
- package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts +11 -0
- package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/tools-handler.js +79 -0
- package/dist/server/src/services/gateway/tool-list-generator.d.ts +23 -0
- package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -0
- package/dist/server/src/services/gateway/tool-list-generator.js +115 -0
- package/dist/server/src/services/gateway/types.d.ts +27 -0
- package/dist/server/src/services/gateway/types.d.ts.map +1 -0
- package/dist/server/src/services/gateway/types.js +4 -0
- package/dist/server/src/services/gateway.service.d.ts +7 -0
- package/dist/server/src/services/gateway.service.d.ts.map +1 -0
- package/dist/server/src/services/gateway.service.js +6 -0
- package/dist/server/src/services/hub-manager.service.d.ts +299 -0
- package/dist/server/src/services/hub-manager.service.d.ts.map +1 -0
- package/dist/server/src/services/hub-manager.service.js +413 -0
- package/dist/server/src/services/hub-tools/index.d.ts +10 -0
- package/dist/server/src/services/hub-tools/index.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/index.js +6 -0
- package/dist/server/src/services/hub-tools/resource-generator.d.ts +63 -0
- package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/resource-generator.js +141 -0
- package/dist/server/src/services/hub-tools/server-selector.d.ts +63 -0
- package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/server-selector.js +108 -0
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +47 -0
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/system-tool-definitions.js +225 -0
- package/dist/server/src/services/hub-tools/tool-search.d.ts +85 -0
- package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/tool-search.js +115 -0
- package/dist/server/src/services/hub-tools/types.d.ts +42 -0
- package/dist/server/src/services/hub-tools/types.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/types.js +1 -0
- package/dist/server/src/services/hub-tools.service.d.ts +235 -0
- package/dist/server/src/services/hub-tools.service.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools.service.js +457 -0
- package/dist/server/src/services/log-storage.service.d.ts +177 -0
- package/dist/server/src/services/log-storage.service.d.ts.map +1 -0
- package/dist/server/src/services/log-storage.service.js +243 -0
- package/dist/server/src/services/mcp-connection-manager.d.ts +7 -0
- package/dist/server/src/services/mcp-connection-manager.d.ts.map +1 -0
- package/dist/server/src/services/mcp-connection-manager.js +6 -0
- package/dist/server/src/services/mcp-session-manager.d.ts +6 -0
- package/dist/server/src/services/mcp-session-manager.d.ts.map +1 -0
- package/dist/server/src/services/mcp-session-manager.js +4 -0
- package/dist/server/src/services/search/index.d.ts +5 -0
- package/dist/server/src/services/search/index.d.ts.map +1 -0
- package/dist/server/src/services/search/index.js +5 -0
- package/dist/server/src/services/search/search-cache.d.ts +132 -0
- package/dist/server/src/services/search/search-cache.d.ts.map +1 -0
- package/dist/server/src/services/search/search-cache.js +151 -0
- package/dist/server/src/services/search/search-core.service.d.ts +108 -0
- package/dist/server/src/services/search/search-core.service.d.ts.map +1 -0
- package/dist/server/src/services/search/search-core.service.js +187 -0
- package/dist/server/src/services/search/search-scorer.d.ts +54 -0
- package/dist/server/src/services/search/search-scorer.d.ts.map +1 -0
- package/dist/server/src/services/search/search-scorer.js +83 -0
- package/dist/server/src/services/search/types.d.ts +20 -0
- package/dist/server/src/services/search/types.d.ts.map +1 -0
- package/dist/server/src/services/search/types.js +1 -0
- package/dist/server/src/services/session/index.d.ts +6 -0
- package/dist/server/src/services/session/index.d.ts.map +1 -0
- package/dist/server/src/services/session/index.js +4 -0
- package/dist/server/src/services/session/session-manager.d.ts +352 -0
- package/dist/server/src/services/session/session-manager.d.ts.map +1 -0
- package/dist/server/src/services/session/session-manager.js +835 -0
- package/dist/server/src/services/session/types.d.ts +32 -0
- package/dist/server/src/services/session/types.d.ts.map +1 -0
- package/dist/server/src/services/session/types.js +1 -0
- package/dist/server/src/services/simple-search.service.d.ts +67 -0
- package/dist/server/src/services/simple-search.service.d.ts.map +1 -0
- package/dist/server/src/services/simple-search.service.js +82 -0
- package/dist/server/src/services/system-tool-handler.d.ts +10 -0
- package/dist/server/src/services/system-tool-handler.d.ts.map +1 -0
- package/dist/server/src/services/system-tool-handler.js +77 -0
- package/dist/server/src/utils/error-handler.d.ts +18 -0
- package/dist/server/src/utils/error-handler.d.ts.map +1 -0
- package/dist/server/src/utils/error-handler.js +59 -0
- package/dist/server/src/utils/format-utils.d.ts +23 -0
- package/dist/server/src/utils/format-utils.d.ts.map +1 -0
- package/dist/server/src/utils/format-utils.js +58 -0
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -0
- package/dist/server/src/utils/index.js +1 -0
- package/dist/server/src/utils/json-utils.d.ts +82 -0
- package/dist/server/src/utils/json-utils.d.ts.map +1 -0
- package/dist/server/src/utils/json-utils.js +204 -0
- package/dist/server/src/utils/log-rotator.d.ts +223 -0
- package/dist/server/src/utils/log-rotator.d.ts.map +1 -0
- package/dist/server/src/utils/log-rotator.js +306 -0
- package/dist/server/src/utils/logger/dev-logger.d.ts +39 -0
- package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -0
- package/dist/server/src/utils/logger/dev-logger.js +63 -0
- package/dist/server/src/utils/logger/index.d.ts +36 -0
- package/dist/server/src/utils/logger/index.d.ts.map +1 -0
- package/dist/server/src/utils/logger/index.js +46 -0
- package/dist/server/src/utils/logger/log-colors.d.ts +27 -0
- package/dist/server/src/utils/logger/log-colors.d.ts.map +1 -0
- package/dist/server/src/utils/logger/log-colors.js +41 -0
- package/dist/server/src/utils/logger/log-context.d.ts +13 -0
- package/dist/server/src/utils/logger/log-context.d.ts.map +1 -0
- package/dist/server/src/utils/logger/log-context.js +5 -0
- package/dist/server/src/utils/logger/log-formatter.d.ts +47 -0
- package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -0
- package/dist/server/src/utils/logger/log-formatter.js +150 -0
- package/dist/server/src/utils/logger/log-modules.d.ts +141 -0
- package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -0
- package/dist/server/src/utils/logger/log-modules.js +81 -0
- package/dist/server/src/utils/logger/log-output.d.ts +68 -0
- package/dist/server/src/utils/logger/log-output.d.ts.map +1 -0
- package/dist/server/src/utils/logger/log-output.js +320 -0
- package/dist/server/src/utils/logger/logger.d.ts +190 -0
- package/dist/server/src/utils/logger/logger.d.ts.map +1 -0
- package/dist/server/src/utils/logger/logger.js +350 -0
- package/dist/server/src/utils/logger.d.ts +12 -0
- package/dist/server/src/utils/logger.d.ts.map +1 -0
- package/dist/server/src/utils/logger.js +12 -0
- package/dist/server/src/utils/mcp-error-handler.d.ts +162 -0
- package/dist/server/src/utils/mcp-error-handler.d.ts.map +1 -0
- package/dist/server/src/utils/mcp-error-handler.js +270 -0
- package/dist/server/src/utils/port-checker.d.ts +16 -0
- package/dist/server/src/utils/port-checker.d.ts.map +1 -0
- package/dist/server/src/utils/port-checker.js +242 -0
- package/dist/server/src/utils/request-context.d.ts +71 -0
- package/dist/server/src/utils/request-context.d.ts.map +1 -0
- package/dist/server/src/utils/request-context.js +73 -0
- package/dist/server/src/utils/tool-args-parser.d.ts +17 -0
- package/dist/server/src/utils/tool-args-parser.d.ts.map +1 -0
- package/dist/server/src/utils/tool-args-parser.js +34 -0
- package/dist/server/src/utils/transports/sse-transport.d.ts +104 -0
- package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -0
- package/dist/server/src/utils/transports/sse-transport.js +189 -0
- package/dist/server/src/utils/transports/stdio-transport.d.ts +122 -0
- package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -0
- package/dist/server/src/utils/transports/stdio-transport.js +324 -0
- package/dist/server/src/utils/transports/streamable-http-transport.d.ts +146 -0
- package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -0
- package/dist/server/src/utils/transports/streamable-http-transport.js +212 -0
- package/dist/server/src/utils/transports/transport-factory.d.ts +26 -0
- package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -0
- package/dist/server/src/utils/transports/transport-factory.js +104 -0
- package/dist/server/src/utils/transports/transport.interface.d.ts +35 -0
- package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -0
- package/dist/server/src/utils/transports/transport.interface.js +1 -0
- package/dist/server/tests/contract/mcp-protocol/initialize.test.d.ts +2 -0
- package/dist/server/tests/contract/mcp-protocol/initialize.test.d.ts.map +1 -0
- package/dist/server/tests/contract/mcp-protocol/initialize.test.js +103 -0
- package/dist/server/tests/contract/mcp-protocol/tools-call.test.d.ts +2 -0
- package/dist/server/tests/contract/mcp-protocol/tools-call.test.d.ts.map +1 -0
- package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +181 -0
- package/dist/server/tests/contract/mcp-protocol/tools-list.test.d.ts +2 -0
- package/dist/server/tests/contract/mcp-protocol/tools-list.test.d.ts.map +1 -0
- package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +155 -0
- package/dist/server/tests/evaluation/evaluation.test.d.ts +2 -0
- package/dist/server/tests/evaluation/evaluation.test.d.ts.map +1 -0
- package/dist/server/tests/evaluation/evaluation.test.js +102 -0
- package/dist/server/tests/helpers/sdk-test-helpers.d.ts +32 -0
- package/dist/server/tests/helpers/sdk-test-helpers.d.ts.map +1 -0
- package/dist/server/tests/helpers/sdk-test-helpers.js +82 -0
- package/dist/server/tests/integration/api/gateway.test.d.ts +2 -0
- package/dist/server/tests/integration/api/gateway.test.d.ts.map +1 -0
- package/dist/server/tests/integration/api/gateway.test.js +366 -0
- package/dist/server/tests/integration/gateway/fault-tolerance.test.d.ts +2 -0
- package/dist/server/tests/integration/gateway/fault-tolerance.test.d.ts.map +1 -0
- package/dist/server/tests/integration/gateway/fault-tolerance.test.js +109 -0
- package/dist/server/tests/integration/gateway/mcp-connection.test.d.ts +2 -0
- package/dist/server/tests/integration/gateway/mcp-connection.test.d.ts.map +1 -0
- package/dist/server/tests/integration/gateway/mcp-connection.test.js +149 -0
- package/dist/server/tests/server.test.d.ts +2 -0
- package/dist/server/tests/server.test.d.ts.map +1 -0
- package/dist/server/tests/server.test.js +95 -0
- package/dist/server/tests/setup.d.ts +7 -0
- package/dist/server/tests/setup.d.ts.map +1 -0
- package/dist/server/tests/setup.js +53 -0
- package/dist/server/tests/types/logger-test-helpers.d.ts +17 -0
- package/dist/server/tests/types/logger-test-helpers.d.ts.map +1 -0
- package/dist/server/tests/types/logger-test-helpers.js +4 -0
- package/dist/server/tests/types/test-helpers.d.ts +27 -0
- package/dist/server/tests/types/test-helpers.d.ts.map +1 -0
- package/dist/server/tests/types/test-helpers.js +4 -0
- package/dist/server/tests/unit/cli/basic-cli.test.d.ts +2 -0
- package/dist/server/tests/unit/cli/basic-cli.test.d.ts.map +1 -0
- package/dist/server/tests/unit/cli/basic-cli.test.js +33 -0
- package/dist/server/tests/unit/cli/cli.test.d.ts +2 -0
- package/dist/server/tests/unit/cli/cli.test.d.ts.map +1 -0
- package/dist/server/tests/unit/cli/cli.test.js +17 -0
- package/dist/server/tests/unit/cli/commands.test.d.ts +2 -0
- package/dist/server/tests/unit/cli/commands.test.d.ts.map +1 -0
- package/dist/server/tests/unit/cli/commands.test.js +75 -0
- package/dist/server/tests/unit/cli/server.test.d.ts +2 -0
- package/dist/server/tests/unit/cli/server.test.d.ts.map +1 -0
- package/dist/server/tests/unit/cli/server.test.js +68 -0
- package/dist/server/tests/unit/server/runner.test.d.ts +2 -0
- package/dist/server/tests/unit/server/runner.test.d.ts.map +1 -0
- package/dist/server/tests/unit/server/runner.test.js +488 -0
- package/dist/server/tests/unit/server/setup.d.ts +2 -0
- package/dist/server/tests/unit/server/setup.d.ts.map +1 -0
- package/dist/server/tests/unit/server/setup.js +21 -0
- package/dist/server/tests/unit/services/gateway-logging.test.d.ts +2 -0
- package/dist/server/tests/unit/services/gateway-logging.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/gateway-logging.test.js +47 -0
- package/dist/server/tests/unit/services/hub-manager-service.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-manager-service.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-manager-service.test.js +140 -0
- package/dist/server/tests/unit/services/hub-manager.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-manager.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-manager.test.js +98 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.js +674 -0
- package/dist/server/tests/unit/services/search/search-cache.test.d.ts +2 -0
- package/dist/server/tests/unit/services/search/search-cache.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/search/search-cache.test.js +58 -0
- package/dist/server/tests/unit/services/search/search-core.service.test.d.ts +2 -0
- package/dist/server/tests/unit/services/search/search-core.service.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/search/search-core.service.test.js +84 -0
- package/dist/server/tests/unit/services/search/search-scorer.test.d.ts +2 -0
- package/dist/server/tests/unit/services/search/search-scorer.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/search/search-scorer.test.js +97 -0
- package/dist/server/tests/unit/services/session-manager.test.d.ts +2 -0
- package/dist/server/tests/unit/services/session-manager.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/session-manager.test.js +481 -0
- package/dist/server/tests/unit/utils/config.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/config.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/config.test.js +634 -0
- package/dist/server/tests/unit/utils/json-utils.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/json-utils.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/json-utils.test.js +296 -0
- package/dist/server/tests/unit/utils/log-rotator.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/log-rotator.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/log-rotator.test.js +296 -0
- package/dist/server/tests/unit/utils/logger.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/logger.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/logger.test.js +462 -0
- package/dist/server/tests/unit/utils/mcp-error-handler.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/mcp-error-handler.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/mcp-error-handler.test.js +163 -0
- package/dist/server/tests/unit/utils/request-context.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/request-context.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/request-context.test.js +82 -0
- package/dist/server/vite.config.d.ts +3 -0
- package/dist/server/vite.config.d.ts.map +1 -0
- package/dist/server/vite.config.js +160 -0
- package/dist/server/vitest.config.d.ts +3 -0
- package/dist/server/vitest.config.d.ts.map +1 -0
- package/dist/server/vitest.config.js +53 -0
- package/package.json +113 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type guard function to check if an unknown error object is a CMDError.
|
|
3
|
+
* Validates that the object has the required properties of a CMDError.
|
|
4
|
+
*
|
|
5
|
+
* @param error - The error object to validate
|
|
6
|
+
* @returns True if the error is a CMDError, false otherwise
|
|
7
|
+
*/
|
|
8
|
+
function isCMDError(error) {
|
|
9
|
+
return (typeof error === 'object' &&
|
|
10
|
+
error !== null &&
|
|
11
|
+
'code' in error &&
|
|
12
|
+
'message' in error &&
|
|
13
|
+
'data' in error &&
|
|
14
|
+
typeof error.code === 'number' &&
|
|
15
|
+
typeof error.message === 'string');
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* MCP Hub Lite's error code mapping from internal gateway error codes
|
|
19
|
+
* to standard MCP protocol error codes. This mapping ensures compliance
|
|
20
|
+
* with the MCP specification while maintaining internal error categorization.
|
|
21
|
+
*
|
|
22
|
+
* The mapping follows these conventions:
|
|
23
|
+
* - 6001: Gateway internal error → Service unavailable (-32001)
|
|
24
|
+
* - 6002: Connection timeout → Request timeout (-32002)
|
|
25
|
+
* - 6003: Tool not found → MCP tool not found (-32801)
|
|
26
|
+
* - 6004: Tool execution failed → MCP execution failed (-32802)
|
|
27
|
+
* - 6005: Initialization failed → MCP initialization failed (-32803)
|
|
28
|
+
*/
|
|
29
|
+
export const MCPHubLiteErrorMap = {
|
|
30
|
+
// Map gateway internal errors to standard MCP error codes
|
|
31
|
+
6001: -32001, // Gateway internal error -> Service unavailable
|
|
32
|
+
6002: -32002, // Connection timeout -> Request timeout
|
|
33
|
+
6003: -32801, // Tool not found -> MCP tool not found
|
|
34
|
+
6004: -32802, // Tool execution failed -> MCP execution failed
|
|
35
|
+
6005: -32803 // Initialization failed -> MCP initialization failed
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* MCPErrorHandler provides standardized error handling and conversion for the MCP Hub Lite system.
|
|
39
|
+
* This class is responsible for converting internal application errors (both native JavaScript Error
|
|
40
|
+
* objects and custom CMDError objects) into standardized MCP protocol error responses that comply
|
|
41
|
+
* with the Model Context Protocol specification.
|
|
42
|
+
*
|
|
43
|
+
* The handler ensures consistent error formatting across the entire system, providing appropriate
|
|
44
|
+
* error codes, messages, and extended metadata that clients can use for proper error handling
|
|
45
|
+
* and user feedback. It supports both generic JavaScript errors and structured CMDError objects
|
|
46
|
+
* with categorized error codes.
|
|
47
|
+
*
|
|
48
|
+
* Usage scenarios include:
|
|
49
|
+
* - Converting backend server errors to MCP-compliant responses
|
|
50
|
+
* - Standardizing error responses from different MCP server implementations
|
|
51
|
+
* - Providing consistent error metadata for client-side error handling
|
|
52
|
+
* - Maintaining compatibility with the MCP protocol specification
|
|
53
|
+
*/
|
|
54
|
+
export class MCPErrorHandler {
|
|
55
|
+
/**
|
|
56
|
+
* Converts internal errors to standardized MCP error responses.
|
|
57
|
+
* This method handles both native JavaScript Error objects and custom CMDError objects,
|
|
58
|
+
* mapping them to appropriate MCP error codes and formatting them according to the
|
|
59
|
+
* MCP protocol specification.
|
|
60
|
+
*
|
|
61
|
+
* For native Error objects, it creates a standard MCP error with service unavailable
|
|
62
|
+
* code (-32001) and includes debugging information like stack trace and error name.
|
|
63
|
+
* For CMDError objects, it maps the internal error code ranges to appropriate MCP
|
|
64
|
+
* standard error codes based on error categories (system, security, business, etc.).
|
|
65
|
+
*
|
|
66
|
+
* @param error - The error to convert, either a native Error or CMDError object
|
|
67
|
+
* @returns A standardized MCPError object compliant with the MCP protocol
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* // Converting a native Error
|
|
72
|
+
* const mcpError = MCPErrorHandler.toMCPError(new Error('Connection failed'));
|
|
73
|
+
*
|
|
74
|
+
* // Converting a CMDError
|
|
75
|
+
* const cmdError: CMDError = { code: 6003, message: 'Tool not found', data: {} };
|
|
76
|
+
* const mcpError = MCPErrorHandler.toMCPError(cmdError);
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
static toMCPError(error) {
|
|
80
|
+
if (error instanceof Error) {
|
|
81
|
+
// Generic error mapping to standard MCP error
|
|
82
|
+
return {
|
|
83
|
+
code: -32001, // Default to service unavailable
|
|
84
|
+
message: error.message,
|
|
85
|
+
data: {
|
|
86
|
+
originalError: error.message,
|
|
87
|
+
timestamp: new Date().toISOString()
|
|
88
|
+
},
|
|
89
|
+
'x-mcp': {
|
|
90
|
+
details: {
|
|
91
|
+
stack: error.stack,
|
|
92
|
+
name: error.name
|
|
93
|
+
},
|
|
94
|
+
suggestedActions: ['Check server status', 'Retry request']
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
else if (isCMDError(error)) {
|
|
99
|
+
// Map CMD errors to MCP errors
|
|
100
|
+
const mcpCode = this.mapCMDToMCPErrorCode(error.code);
|
|
101
|
+
return {
|
|
102
|
+
code: mcpCode,
|
|
103
|
+
message: error.message,
|
|
104
|
+
data: error.data,
|
|
105
|
+
'x-mcp': {
|
|
106
|
+
details: error.error?.context,
|
|
107
|
+
suggestedActions: ['Refer to error details', 'Retry or contact administrator']
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// Default MCP error
|
|
112
|
+
return {
|
|
113
|
+
code: -32001,
|
|
114
|
+
message: 'Unknown error',
|
|
115
|
+
'x-mcp': {
|
|
116
|
+
suggestedActions: ['Retry request']
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Maps internal CMD error codes to standardized MCP error codes.
|
|
122
|
+
* This private method implements the core logic for converting categorized
|
|
123
|
+
* internal error codes to appropriate MCP standard error codes based on
|
|
124
|
+
* error type ranges:
|
|
125
|
+
*
|
|
126
|
+
* - 1000-1999: System errors → Service unavailable (-32001)
|
|
127
|
+
* - 2000-2999: Security errors → Authentication/Authorization failed (-32806/-32807)
|
|
128
|
+
* - 3000-3999: Business errors → Invalid parameter (-32602)
|
|
129
|
+
* - 5000-5999: MCP protocol errors → Direct mapping or service unavailable
|
|
130
|
+
* - 6000-6999: Gateway-specific errors → Specific MCP error codes via switch
|
|
131
|
+
*
|
|
132
|
+
* The mapping ensures that internal error categorization is preserved while
|
|
133
|
+
* maintaining compliance with the external MCP protocol standard.
|
|
134
|
+
*
|
|
135
|
+
* @param cmdCode - The internal CMD error code to map
|
|
136
|
+
* @returns The corresponding standardized MCP error code
|
|
137
|
+
*
|
|
138
|
+
* @private
|
|
139
|
+
*/
|
|
140
|
+
static mapCMDToMCPErrorCode(cmdCode) {
|
|
141
|
+
// System error mapping
|
|
142
|
+
if (cmdCode >= 1000 && cmdCode <= 1999) {
|
|
143
|
+
return -32001; // Service unavailable
|
|
144
|
+
}
|
|
145
|
+
// Security error mapping
|
|
146
|
+
if (cmdCode >= 2000 && cmdCode <= 2999) {
|
|
147
|
+
return -32806; // Authentication failed or -32807 Authorization failed
|
|
148
|
+
}
|
|
149
|
+
// Business error mapping
|
|
150
|
+
if (cmdCode >= 3000 && cmdCode <= 3999) {
|
|
151
|
+
return -32602; // Invalid parameter (typically used for business validation errors)
|
|
152
|
+
}
|
|
153
|
+
// MCP protocol errors, use standard codes directly
|
|
154
|
+
if (cmdCode >= 5000 && cmdCode <= 5999) {
|
|
155
|
+
// If it's a standard MCP error code, return directly
|
|
156
|
+
if (cmdCode >= 5800 && cmdCode <= 5815) {
|
|
157
|
+
// Corresponds to -328xx range
|
|
158
|
+
return -(32900 - (cmdCode - 5800));
|
|
159
|
+
}
|
|
160
|
+
return -32001; // Default
|
|
161
|
+
}
|
|
162
|
+
// Gateway-specific error code mapping
|
|
163
|
+
if (cmdCode >= 6000 && cmdCode <= 6999) {
|
|
164
|
+
switch (cmdCode) {
|
|
165
|
+
case 6001:
|
|
166
|
+
return -32001; // Service unavailable
|
|
167
|
+
case 6002:
|
|
168
|
+
return -32002; // Request timeout
|
|
169
|
+
case 6003:
|
|
170
|
+
return -32801; // Tool not found
|
|
171
|
+
case 6004:
|
|
172
|
+
return -32802; // Execution failed
|
|
173
|
+
default:
|
|
174
|
+
return -32001;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return -32001; // Default MCP error code
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* MCPErrorsMiddleware provides middleware functionality for handling and normalizing
|
|
182
|
+
* error responses from backend MCP servers. This class acts as an intermediary layer
|
|
183
|
+
* that ensures all error responses conform to the standard MCP protocol format,
|
|
184
|
+
* regardless of how the backend server originally formatted its errors.
|
|
185
|
+
*
|
|
186
|
+
* The middleware intercepts JSON-RPC responses containing errors and validates
|
|
187
|
+
* whether they already comply with the MCP error standard. If they don't, it
|
|
188
|
+
* converts them using the MCPErrorHandler to ensure consistent error formatting
|
|
189
|
+
* across all connected MCP servers.
|
|
190
|
+
*
|
|
191
|
+
* This is particularly useful when integrating with various MCP server implementations
|
|
192
|
+
* that may have different error handling conventions, ensuring that clients receive
|
|
193
|
+
* standardized error responses regardless of the underlying server implementation.
|
|
194
|
+
*/
|
|
195
|
+
export class MCPErrorsMiddleware {
|
|
196
|
+
/**
|
|
197
|
+
* Handles and normalizes error responses from backend MCP servers.
|
|
198
|
+
* This method processes JSON-RPC responses and ensures that any error objects
|
|
199
|
+
* are converted to the standard MCP error format if they aren't already compliant.
|
|
200
|
+
*
|
|
201
|
+
* The method performs the following steps:
|
|
202
|
+
* 1. Checks if the response contains an error field
|
|
203
|
+
* 2. Validates if the error is already in standard MCP format
|
|
204
|
+
* 3. If not standard, converts the error to MCP format using MCPErrorHandler
|
|
205
|
+
* 4. Returns the normalized response with standardized error formatting
|
|
206
|
+
*
|
|
207
|
+
* Non-error responses are returned unchanged to maintain performance.
|
|
208
|
+
*
|
|
209
|
+
* @param response - The raw response from a backend MCP server
|
|
210
|
+
* @returns The response with standardized error formatting if applicable, otherwise the original response
|
|
211
|
+
*
|
|
212
|
+
* @example
|
|
213
|
+
* ```typescript
|
|
214
|
+
* // Handle a response with a non-standard error
|
|
215
|
+
* const rawResponse = { jsonrpc: '2.0', id: 1, error: new Error('Connection failed') };
|
|
216
|
+
* const normalizedResponse = MCPErrorsMiddleware.handleBackendMCPErrors(rawResponse);
|
|
217
|
+
* // normalizedResponse.error will be in standard MCP format
|
|
218
|
+
* ```
|
|
219
|
+
*/
|
|
220
|
+
static handleBackendMCPErrors(response) {
|
|
221
|
+
if (typeof response === 'object' && response !== null && 'error' in response) {
|
|
222
|
+
const rpcResponse = response;
|
|
223
|
+
// If it's already in standard MCP error format, return directly
|
|
224
|
+
if (this.isStandardMCPError(rpcResponse.error)) {
|
|
225
|
+
return response;
|
|
226
|
+
}
|
|
227
|
+
// Ensure error is of type Error or CMDError
|
|
228
|
+
let errorToConvert;
|
|
229
|
+
if (rpcResponse.error instanceof Error) {
|
|
230
|
+
errorToConvert = rpcResponse.error;
|
|
231
|
+
}
|
|
232
|
+
else if (isCMDError(rpcResponse.error)) {
|
|
233
|
+
errorToConvert = rpcResponse.error;
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
// If neither, create a generic error
|
|
237
|
+
errorToConvert = new Error(typeof rpcResponse.error === 'object' && rpcResponse.error !== null
|
|
238
|
+
? rpcResponse.error.message || 'Unknown error'
|
|
239
|
+
: String(rpcResponse.error));
|
|
240
|
+
}
|
|
241
|
+
// Otherwise convert non-standard errors to standard format
|
|
242
|
+
return {
|
|
243
|
+
jsonrpc: '2.0',
|
|
244
|
+
error: MCPErrorHandler.toMCPError(errorToConvert),
|
|
245
|
+
id: rpcResponse.id
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
return response;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Type guard function to check if an error object conforms to the standard MCP error format.
|
|
252
|
+
* This private method validates that the error object has the required properties
|
|
253
|
+
* (code as number, message as string) and optional data property according to
|
|
254
|
+
* the MCP specification.
|
|
255
|
+
*
|
|
256
|
+
* @param error - The error object to validate
|
|
257
|
+
* @returns True if the error conforms to MCP standard format, false otherwise
|
|
258
|
+
*
|
|
259
|
+
* @private
|
|
260
|
+
*/
|
|
261
|
+
static isStandardMCPError(error) {
|
|
262
|
+
return (typeof error === 'object' &&
|
|
263
|
+
error !== null &&
|
|
264
|
+
'code' in error &&
|
|
265
|
+
'message' in error &&
|
|
266
|
+
typeof error.code === 'number' &&
|
|
267
|
+
typeof error.message === 'string' &&
|
|
268
|
+
('data' in error ? error.data !== undefined : true));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port occupancy checker utility
|
|
3
|
+
* Checks if a port is in use and attempts to identify the occupying process
|
|
4
|
+
*/
|
|
5
|
+
export interface PortCheckResult {
|
|
6
|
+
inUse: boolean;
|
|
7
|
+
pid?: number;
|
|
8
|
+
processName?: string;
|
|
9
|
+
commandLine?: string;
|
|
10
|
+
isSelfProject?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Check if port is in use
|
|
14
|
+
*/
|
|
15
|
+
export declare function checkPort(port: number): Promise<PortCheckResult>;
|
|
16
|
+
//# sourceMappingURL=port-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-checker.d.ts","sourceRoot":"","sources":["../../../../src/utils/port-checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAatE"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port occupancy checker utility
|
|
3
|
+
* Checks if a port is in use and attempts to identify the occupying process
|
|
4
|
+
*/
|
|
5
|
+
import { exec } from 'child_process';
|
|
6
|
+
import { promisify } from 'util';
|
|
7
|
+
import { PidManager } from '../pid/manager.js';
|
|
8
|
+
const execAsync = promisify(exec);
|
|
9
|
+
/**
|
|
10
|
+
* Check if port is in use
|
|
11
|
+
*/
|
|
12
|
+
export async function checkPort(port) {
|
|
13
|
+
try {
|
|
14
|
+
const platform = process.platform;
|
|
15
|
+
if (platform === 'win32') {
|
|
16
|
+
return await checkPortWindows(port);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
return await checkPortUnix(port);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Return not in use on check failure (safe default)
|
|
24
|
+
return { inUse: false };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Checks if a specific port is in use on Windows platform.
|
|
29
|
+
*
|
|
30
|
+
* This function uses the Windows `netstat` command to identify processes that are
|
|
31
|
+
* listening on the specified port. It parses the netstat output to extract the
|
|
32
|
+
* process ID (PID) and then retrieves detailed process information using WMIC.
|
|
33
|
+
*
|
|
34
|
+
* The function specifically looks for connections in the "LISTENING" state and
|
|
35
|
+
* matches the local address to ensure it's the exact port being checked.
|
|
36
|
+
*
|
|
37
|
+
* @param port - The port number to check for occupancy (e.g., 7788)
|
|
38
|
+
* @returns {Promise<PortCheckResult>} A promise that resolves to a PortCheckResult object
|
|
39
|
+
* containing information about whether the port is in use, the PID of the
|
|
40
|
+
* occupying process, process name, command line, and whether it's the current project
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const result = await checkPortWindows(7788);
|
|
45
|
+
* if (result.inUse) {
|
|
46
|
+
* console.log(`Port 7788 is used by PID ${result.pid} (${result.processName})`);
|
|
47
|
+
* }
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
async function checkPortWindows(port) {
|
|
51
|
+
try {
|
|
52
|
+
// Use netstat to find the process occupying the port
|
|
53
|
+
const { stdout } = await execAsync(`netstat -ano | findstr :${port}`);
|
|
54
|
+
if (!stdout.trim()) {
|
|
55
|
+
return { inUse: false };
|
|
56
|
+
}
|
|
57
|
+
// Parse netstat output to extract PID
|
|
58
|
+
const lines = stdout.trim().split('\n');
|
|
59
|
+
for (const line of lines) {
|
|
60
|
+
const parts = line.trim().split(/\s+/);
|
|
61
|
+
const localAddress = parts[1];
|
|
62
|
+
const state = parts[3];
|
|
63
|
+
const pid = parseInt(parts[4], 10);
|
|
64
|
+
// Check if it's in LISTENING state and is the target port
|
|
65
|
+
if (state === 'LISTENING' && localAddress.endsWith(`:${port}`)) {
|
|
66
|
+
// Get process details
|
|
67
|
+
const processInfo = await getProcessInfoWindows(pid);
|
|
68
|
+
// Check if it's the current project's process
|
|
69
|
+
const isSelfProject = await isSelfProjectProcess(pid, processInfo.commandLine);
|
|
70
|
+
return {
|
|
71
|
+
inUse: true,
|
|
72
|
+
pid,
|
|
73
|
+
processName: processInfo.processName,
|
|
74
|
+
commandLine: processInfo.commandLine,
|
|
75
|
+
isSelfProject
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return { inUse: false };
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return { inUse: false };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Checks if a specific port is in use on Unix platforms (Linux, macOS).
|
|
87
|
+
*
|
|
88
|
+
* This function uses the `lsof` (list open files) command to identify processes that are
|
|
89
|
+
* listening on the specified port. It filters for TCP connections in LISTEN state and
|
|
90
|
+
* extracts the process ID (PID) from the output.
|
|
91
|
+
*
|
|
92
|
+
* After identifying the PID, it retrieves detailed process information using the `ps` command
|
|
93
|
+
* to get the process name and full command line arguments.
|
|
94
|
+
*
|
|
95
|
+
* @param port - The port number to check for occupancy (e.g., 7788)
|
|
96
|
+
* @returns {Promise<PortCheckResult>} A promise that resolves to a PortCheckResult object
|
|
97
|
+
* containing information about whether the port is in use, the PID of the
|
|
98
|
+
* occupying process, process name, command line, and whether it's the current project
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```typescript
|
|
102
|
+
* const result = await checkPortUnix(7788);
|
|
103
|
+
* if (result.inUse) {
|
|
104
|
+
* console.log(`Port 7788 is used by PID ${result.pid} (${result.processName})`);
|
|
105
|
+
* }
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
async function checkPortUnix(port) {
|
|
109
|
+
try {
|
|
110
|
+
// Use lsof to find the process occupying the port
|
|
111
|
+
const { stdout } = await execAsync(`lsof -i :${port} -sTCP:LISTEN -t`);
|
|
112
|
+
if (!stdout.trim()) {
|
|
113
|
+
return { inUse: false };
|
|
114
|
+
}
|
|
115
|
+
const pid = parseInt(stdout.trim().split('\n')[0], 10);
|
|
116
|
+
// Get process details
|
|
117
|
+
const processInfo = await getProcessInfoUnix(pid);
|
|
118
|
+
// Check if it's the current project's process
|
|
119
|
+
const isSelfProject = await isSelfProjectProcess(pid, processInfo.commandLine);
|
|
120
|
+
return {
|
|
121
|
+
inUse: true,
|
|
122
|
+
pid,
|
|
123
|
+
processName: processInfo.processName,
|
|
124
|
+
commandLine: processInfo.commandLine,
|
|
125
|
+
isSelfProject
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return { inUse: false };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Retrieves detailed process information for a given PID on Windows.
|
|
134
|
+
*
|
|
135
|
+
* This function uses the Windows Management Instrumentation Command-line (WMIC) tool
|
|
136
|
+
* to query process details including the process name and full command line arguments.
|
|
137
|
+
* It parses the WMIC output to extract the relevant information and handles potential
|
|
138
|
+
* errors gracefully by returning default values.
|
|
139
|
+
*
|
|
140
|
+
* @param pid - The process ID to query for information
|
|
141
|
+
* @returns {Promise<{ processName: string; commandLine: string }>} A promise that resolves to an object
|
|
142
|
+
* containing the process name and command line arguments, or default values if the query fails
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* ```typescript
|
|
146
|
+
* const info = await getProcessInfoWindows(12345);
|
|
147
|
+
* console.log(`Process: ${info.processName}`);
|
|
148
|
+
* console.log(`Command: ${info.commandLine}`);
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
async function getProcessInfoWindows(pid) {
|
|
152
|
+
try {
|
|
153
|
+
// Use wmic to get process details
|
|
154
|
+
const { stdout } = await execAsync(`wmic process where ProcessId=${pid} get Name,CommandLine /format:list`);
|
|
155
|
+
const lines = stdout.split('\n').filter((line) => line.trim());
|
|
156
|
+
let processName = 'Unknown';
|
|
157
|
+
let commandLine = '';
|
|
158
|
+
for (const line of lines) {
|
|
159
|
+
if (line.startsWith('CommandLine=')) {
|
|
160
|
+
commandLine = line.substring('CommandLine='.length).trim();
|
|
161
|
+
}
|
|
162
|
+
else if (line.startsWith('Name=')) {
|
|
163
|
+
processName = line.substring('Name='.length).trim();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return { processName, commandLine };
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return { processName: 'Unknown', commandLine: '' };
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Retrieves detailed process information for a given PID on Unix platforms (Linux, macOS).
|
|
174
|
+
*
|
|
175
|
+
* This function uses the `ps` (process status) command to query process details including
|
|
176
|
+
* the process name (comm) and full command line arguments (args). It parses the ps output
|
|
177
|
+
* to extract the relevant information and handles potential errors gracefully by returning
|
|
178
|
+
* default values.
|
|
179
|
+
*
|
|
180
|
+
* @param pid - The process ID to query for information
|
|
181
|
+
* @returns {Promise<{ processName: string; commandLine: string }>} A promise that resolves to an object
|
|
182
|
+
* containing the process name and command line arguments, or default values if the query fails
|
|
183
|
+
*
|
|
184
|
+
* @example
|
|
185
|
+
* ```typescript
|
|
186
|
+
* const info = await getProcessInfoUnix(12345);
|
|
187
|
+
* console.log(`Process: ${info.processName}`);
|
|
188
|
+
* console.log(`Command: ${info.commandLine}`);
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
191
|
+
async function getProcessInfoUnix(pid) {
|
|
192
|
+
try {
|
|
193
|
+
// Use ps to get process details
|
|
194
|
+
const { stdout } = await execAsync(`ps -p ${pid} -o comm=,args=`);
|
|
195
|
+
const parts = stdout.trim().split(/\s+/);
|
|
196
|
+
const processName = parts[0] || 'Unknown';
|
|
197
|
+
const commandLine = stdout.trim();
|
|
198
|
+
return { processName, commandLine };
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return { processName: 'Unknown', commandLine: '' };
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Determines whether a given process belongs to the current MCP Hub Lite project.
|
|
206
|
+
*
|
|
207
|
+
* This function performs two checks to identify if a process is part of the current project:
|
|
208
|
+
* 1. **PID File Check**: Compares the provided PID with the PID stored in the project's PID file
|
|
209
|
+
* 2. **Command Line Signature Check**: Searches for project-specific signatures in the command line
|
|
210
|
+
*
|
|
211
|
+
* The function uses a list of project signatures including the project name 'mcp-hub-lite',
|
|
212
|
+
* the compiled entry file path 'dist/server/src/index.js', and the source entry file 'src/index.ts'.
|
|
213
|
+
*
|
|
214
|
+
* @param pid - The process ID to check
|
|
215
|
+
* @param commandLine - The full command line used to start the process
|
|
216
|
+
* @returns {Promise<boolean>} A promise that resolves to true if the process belongs to the current project, false otherwise
|
|
217
|
+
*
|
|
218
|
+
* @example
|
|
219
|
+
* ```typescript
|
|
220
|
+
* const isSelf = await isSelfProjectProcess(12345, 'node dist/server/src/index.js');
|
|
221
|
+
* if (isSelf) {
|
|
222
|
+
* console.log('This is our project process');
|
|
223
|
+
* }
|
|
224
|
+
* ```
|
|
225
|
+
*/
|
|
226
|
+
async function isSelfProjectProcess(pid, commandLine) {
|
|
227
|
+
// Check 1: Check if the PID recorded in the PID file matches
|
|
228
|
+
const savedPid = PidManager.getPid();
|
|
229
|
+
if (savedPid === pid) {
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
// Check 2: Check if the command line contains project signatures
|
|
233
|
+
if (!commandLine) {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
const projectSignatures = [
|
|
237
|
+
'mcp-hub-lite', // Project name
|
|
238
|
+
'dist/server/src/index.js', // Compiled entry file
|
|
239
|
+
'src/index.ts' // Source code entry file
|
|
240
|
+
];
|
|
241
|
+
return projectSignatures.some((signature) => commandLine.includes(signature));
|
|
242
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request context management using AsyncLocalStorage for request-scoped data.
|
|
3
|
+
*
|
|
4
|
+
* This module provides a way to store and access request-specific context data
|
|
5
|
+
* across asynchronous operations without having to pass context objects through
|
|
6
|
+
* every function call. It uses Node.js AsyncLocalStorage to maintain context
|
|
7
|
+
* throughout the request lifecycle.
|
|
8
|
+
*
|
|
9
|
+
* The primary use case is storing client context information (sessionId, clientName,
|
|
10
|
+
* cwd, project, etc.) that needs to be accessible from any part of the application
|
|
11
|
+
* during request processing.
|
|
12
|
+
*
|
|
13
|
+
* @module utils/request-context
|
|
14
|
+
*/
|
|
15
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
16
|
+
import type { ClientContext } from '../../shared/types/client.types.js';
|
|
17
|
+
/**
|
|
18
|
+
* AsyncLocalStorage instance for storing request context.
|
|
19
|
+
*
|
|
20
|
+
* This storage holds the ClientContext object for the current request and
|
|
21
|
+
* makes it available throughout the entire request processing chain,
|
|
22
|
+
* including asynchronous operations and nested function calls.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* // In route handler
|
|
27
|
+
* await requestContext.run(clientContext, async () => {
|
|
28
|
+
* // Any code executed here can access the client context
|
|
29
|
+
* const ctx = getClientContext();
|
|
30
|
+
* console.log(ctx.sessionId);
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare const requestContext: AsyncLocalStorage<ClientContext>;
|
|
35
|
+
/**
|
|
36
|
+
* Retrieves the current request's client context.
|
|
37
|
+
*
|
|
38
|
+
* This function returns the ClientContext object stored in the AsyncLocalStorage
|
|
39
|
+
* for the current request. It should only be called within a request context
|
|
40
|
+
* that has been established using requestContext.run().
|
|
41
|
+
*
|
|
42
|
+
* @returns {ClientContext | undefined} The current request's client context, or undefined if not in a request context
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* const context = getClientContext();
|
|
47
|
+
* if (context) {
|
|
48
|
+
* console.log(`Processing request for session: ${context.sessionId}`);
|
|
49
|
+
* }
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare function getClientContext(): ClientContext | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Retrieves the current request's working directory (cwd).
|
|
55
|
+
*
|
|
56
|
+
* This is a convenience function that extracts the cwd property from the
|
|
57
|
+
* current request's client context. It's commonly used in file operations
|
|
58
|
+
* that need to respect the client's current working directory.
|
|
59
|
+
*
|
|
60
|
+
* @returns {string | undefined} The current request's working directory, or undefined if not available
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```typescript
|
|
64
|
+
* const cwd = getClientCwd();
|
|
65
|
+
* if (cwd) {
|
|
66
|
+
* const fullPath = path.join(cwd, relativePath);
|
|
67
|
+
* }
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export declare function getClientCwd(): string | undefined;
|
|
71
|
+
//# sourceMappingURL=request-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../../../src/utils/request-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,cAAc,kCAAyC,CAAC;AAErE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,SAAS,CAE5D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request context management using AsyncLocalStorage for request-scoped data.
|
|
3
|
+
*
|
|
4
|
+
* This module provides a way to store and access request-specific context data
|
|
5
|
+
* across asynchronous operations without having to pass context objects through
|
|
6
|
+
* every function call. It uses Node.js AsyncLocalStorage to maintain context
|
|
7
|
+
* throughout the request lifecycle.
|
|
8
|
+
*
|
|
9
|
+
* The primary use case is storing client context information (sessionId, clientName,
|
|
10
|
+
* cwd, project, etc.) that needs to be accessible from any part of the application
|
|
11
|
+
* during request processing.
|
|
12
|
+
*
|
|
13
|
+
* @module utils/request-context
|
|
14
|
+
*/
|
|
15
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
16
|
+
/**
|
|
17
|
+
* AsyncLocalStorage instance for storing request context.
|
|
18
|
+
*
|
|
19
|
+
* This storage holds the ClientContext object for the current request and
|
|
20
|
+
* makes it available throughout the entire request processing chain,
|
|
21
|
+
* including asynchronous operations and nested function calls.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // In route handler
|
|
26
|
+
* await requestContext.run(clientContext, async () => {
|
|
27
|
+
* // Any code executed here can access the client context
|
|
28
|
+
* const ctx = getClientContext();
|
|
29
|
+
* console.log(ctx.sessionId);
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export const requestContext = new AsyncLocalStorage();
|
|
34
|
+
/**
|
|
35
|
+
* Retrieves the current request's client context.
|
|
36
|
+
*
|
|
37
|
+
* This function returns the ClientContext object stored in the AsyncLocalStorage
|
|
38
|
+
* for the current request. It should only be called within a request context
|
|
39
|
+
* that has been established using requestContext.run().
|
|
40
|
+
*
|
|
41
|
+
* @returns {ClientContext | undefined} The current request's client context, or undefined if not in a request context
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* const context = getClientContext();
|
|
46
|
+
* if (context) {
|
|
47
|
+
* console.log(`Processing request for session: ${context.sessionId}`);
|
|
48
|
+
* }
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export function getClientContext() {
|
|
52
|
+
return requestContext.getStore();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Retrieves the current request's working directory (cwd).
|
|
56
|
+
*
|
|
57
|
+
* This is a convenience function that extracts the cwd property from the
|
|
58
|
+
* current request's client context. It's commonly used in file operations
|
|
59
|
+
* that need to respect the client's current working directory.
|
|
60
|
+
*
|
|
61
|
+
* @returns {string | undefined} The current request's working directory, or undefined if not available
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* const cwd = getClientCwd();
|
|
66
|
+
* if (cwd) {
|
|
67
|
+
* const fullPath = path.join(cwd, relativePath);
|
|
68
|
+
* }
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export function getClientCwd() {
|
|
72
|
+
return requestContext.getStore()?.cwd;
|
|
73
|
+
}
|