@loop_ouroboros/mcp-hub-lite 1.0.1 → 1.1.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 +47 -0
- package/dist/client/assets/{HomeView-Cr1jX73N.js → HomeView-Bu2joUvW.js} +1 -1
- package/dist/client/assets/ResourceDetailView-BvrhDCD1.js +1 -0
- package/dist/client/assets/ResourceDetailView-DUJZbegl.css +1 -0
- package/dist/client/assets/ResourcesView-Cc8RHtia.css +1 -0
- package/dist/client/assets/ResourcesView-LjqioF_s.js +1 -0
- package/dist/client/assets/ServerDashboard-BfLeFDGw.css +1 -0
- package/dist/client/assets/ServerDashboard-FhHJFvUi.js +1 -0
- package/dist/client/assets/ServerDetail-BKV-M4qT.js +2 -0
- package/dist/client/assets/ServerDetail-CtnNKJGx.css +1 -0
- package/dist/client/assets/{ServerListView-Bws09jNR.css → ServerListView-B-bPljsO.css} +1 -1
- package/dist/client/assets/ServerListView-BXgtDyt3.js +36 -0
- package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-D-ooYNdN.js +1 -0
- package/dist/client/assets/SettingsView-CMFG91Z4.js +1 -0
- package/dist/client/assets/SettingsView-GkBOKL0V.css +1 -0
- package/dist/client/assets/ToolCallDialog-Bf4Xe4gH.js +1 -0
- package/dist/client/assets/ToolsView-DFpha1z0.js +1 -0
- package/dist/client/assets/_baseClone-Bp9Rjwd7.js +1 -0
- package/dist/client/assets/el-form-item-B4LbJ6OO.css +1 -0
- package/dist/client/assets/el-form-item-DdSUWYsl.js +12 -0
- package/dist/client/assets/el-input-99gMrutP.js +1 -0
- package/dist/client/assets/el-input-BH4BZKnG.css +1 -0
- package/dist/client/assets/{el-loading-Csv24uBk.js → el-loading-CIQ5pD5u.js} +1 -1
- package/dist/client/assets/el-overlay-BVM6msGX.js +1 -0
- package/dist/client/assets/{el-select-C0U_l4IZ.css → el-overlay-CBvdpA69.css} +1 -1
- package/dist/client/assets/{ResourceDetailView-BdOaL_-o.css → el-radio-group-B0bauIRR.css} +1 -1
- package/dist/client/assets/el-radio-group-DhXWy7ry.js +1 -0
- package/dist/client/assets/el-skeleton-item-BLY1jEuR.css +1 -0
- package/dist/client/assets/el-skeleton-item-DJz-Us12.js +1 -0
- package/dist/client/assets/el-switch-BBrS-_6y.css +1 -0
- package/dist/client/assets/el-switch-Bu8AQ5uM.js +1 -0
- package/dist/client/assets/el-tab-pane-BnGMaV56.js +1 -0
- package/dist/client/assets/el-table-column-BMWOaLS_.js +1 -0
- package/dist/client/assets/el-table-column-BdvRS9Y2.css +1 -0
- package/dist/client/assets/index-C2V-ZGji.js +1 -0
- package/dist/client/assets/{index-BsDWtoIl.css → index-DpH6ZSbs.css} +1 -1
- package/dist/client/assets/index-vhkqgpmN.js +2 -0
- package/dist/client/assets/omit-CqPQN3XP.js +1 -0
- package/dist/client/assets/{raf-DDfJOMYh.js → raf-C2wXzaVU.js} +1 -1
- package/dist/client/assets/{vue-vendor-6ny5zj9i.js → vue-vendor-BLHLXXJK.js} +1 -1
- package/dist/client/index.html +3 -3
- package/dist/server/shared/models/resource.model.d.ts +2 -1
- package/dist/server/shared/models/resource.model.d.ts.map +1 -1
- package/dist/server/shared/models/server.model.d.ts +363 -5
- package/dist/server/shared/models/server.model.d.ts.map +1 -1
- package/dist/server/shared/models/server.model.js +220 -1
- package/dist/server/shared/models/session.model.d.ts +2 -56
- package/dist/server/shared/models/session.model.d.ts.map +1 -1
- package/dist/server/shared/models/session.model.js +2 -55
- package/dist/server/shared/models/tool.model.d.ts +4 -2
- package/dist/server/shared/models/tool.model.d.ts.map +1 -1
- package/dist/server/shared/types/client.types.d.ts +4 -32
- package/dist/server/shared/types/client.types.d.ts.map +1 -1
- package/dist/server/shared/types/client.types.js +3 -2
- package/dist/server/shared/types/index.d.ts +3 -3
- package/dist/server/shared/types/index.d.ts.map +1 -1
- package/dist/server/shared/types/index.js +3 -3
- package/dist/server/shared/types/session-context.types.d.ts +35 -0
- package/dist/server/shared/types/session-context.types.d.ts.map +1 -0
- package/dist/server/shared/types/session-context.types.js +5 -0
- package/dist/server/shared/types/websocket.types.d.ts +17 -10
- package/dist/server/shared/types/websocket.types.d.ts.map +1 -1
- package/dist/server/src/api/mcp/debug-response-wrapper.d.ts.map +1 -1
- package/dist/server/src/api/mcp/debug-response-wrapper.js +26 -1
- package/dist/server/src/api/mcp/gateway.d.ts +1 -3
- package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
- package/dist/server/src/api/mcp/gateway.js +34 -61
- package/dist/server/src/api/mcp/session-context-extractor.d.ts +5 -5
- package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -1
- package/dist/server/src/api/mcp/session-context-extractor.js +15 -39
- package/dist/server/src/api/web/clients.js +2 -2
- package/dist/server/src/api/web/hub-tools.d.ts +2 -2
- package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
- package/dist/server/src/api/web/hub-tools.js +3 -54
- package/dist/server/src/api/web/mcp-status.d.ts +1 -1
- package/dist/server/src/api/web/mcp-status.d.ts.map +1 -1
- package/dist/server/src/api/web/mcp-status.js +71 -30
- package/dist/server/src/api/web/resources.d.ts.map +1 -1
- package/dist/server/src/api/web/resources.js +28 -22
- package/dist/server/src/api/web/search.d.ts +2 -16
- package/dist/server/src/api/web/search.d.ts.map +1 -1
- package/dist/server/src/api/web/search.js +24 -45
- package/dist/server/src/api/web/servers.d.ts +3 -3
- package/dist/server/src/api/web/servers.d.ts.map +1 -1
- package/dist/server/src/api/web/servers.js +70 -25
- package/dist/server/src/api/web/sessions.js +1 -1
- package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -1
- package/dist/server/src/api/ws/ws-handler.js +4 -2
- package/dist/server/src/app.d.ts.map +1 -1
- package/dist/server/src/app.js +0 -4
- package/dist/server/src/cli/commands/list.js +2 -2
- package/dist/server/src/cli/commands/status.d.ts.map +1 -1
- package/dist/server/src/cli/commands/status.js +41 -30
- package/dist/server/src/cli/index.d.ts.map +1 -1
- package/dist/server/src/cli/index.js +2 -1
- package/dist/server/src/cli/server.d.ts +11 -2
- package/dist/server/src/cli/server.d.ts.map +1 -1
- package/dist/server/src/config/config-change-logger.d.ts +22 -0
- package/dist/server/src/config/config-change-logger.d.ts.map +1 -1
- package/dist/server/src/config/config-change-logger.js +135 -11
- package/dist/server/src/config/config-loader.d.ts +6 -5
- package/dist/server/src/config/config-loader.d.ts.map +1 -1
- package/dist/server/src/config/config-loader.js +54 -16
- package/dist/server/src/config/config-manager.d.ts +51 -43
- package/dist/server/src/config/config-manager.d.ts.map +1 -1
- package/dist/server/src/config/config-manager.js +84 -66
- package/dist/server/src/config/config-migrator.d.ts +82 -0
- package/dist/server/src/config/config-migrator.d.ts.map +1 -0
- package/dist/server/src/config/config-migrator.js +348 -0
- package/dist/server/src/config/config-saver.d.ts +2 -0
- package/dist/server/src/config/config-saver.d.ts.map +1 -1
- package/dist/server/src/config/config-saver.js +8 -2
- package/dist/server/src/config/config.schema.d.ts +10 -102
- package/dist/server/src/config/config.schema.d.ts.map +1 -1
- package/dist/server/src/config/config.schema.js +15 -98
- package/dist/server/src/config/path-validator.d.ts +27 -0
- package/dist/server/src/config/path-validator.d.ts.map +1 -0
- package/dist/server/src/config/path-validator.js +53 -0
- package/dist/server/src/config/server-config-manager.d.ts +37 -31
- package/dist/server/src/config/server-config-manager.d.ts.map +1 -1
- package/dist/server/src/config/server-config-manager.js +222 -66
- package/dist/server/src/config/type-converter.d.ts.map +1 -1
- package/dist/server/src/config/type-converter.js +3 -2
- package/dist/server/src/index.js +1 -1
- package/dist/server/src/models/event.model.d.ts +17 -10
- package/dist/server/src/models/event.model.d.ts.map +1 -1
- package/dist/server/src/models/server.model.d.ts +17 -3
- package/dist/server/src/models/server.model.d.ts.map +1 -1
- package/dist/server/src/models/server.model.js +2 -1
- package/dist/server/src/models/system-tools.constants.d.ts +10 -27
- package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
- package/dist/server/src/models/system-tools.constants.js +4 -8
- package/dist/server/src/pid/manager.d.ts.map +1 -1
- package/dist/server/src/pid/manager.js +2 -1
- package/dist/server/src/server/dev-server.js +34 -20
- package/dist/server/src/server/runner.d.ts.map +1 -1
- package/dist/server/src/server/runner.js +41 -26
- package/dist/server/src/services/client-tracker.service.d.ts +3 -128
- package/dist/server/src/services/client-tracker.service.d.ts.map +1 -1
- package/dist/server/src/services/client-tracker.service.js +4 -200
- package/dist/server/src/services/connection/connection-manager.d.ts +85 -103
- package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
- package/dist/server/src/services/connection/connection-manager.js +286 -241
- package/dist/server/src/services/connection/tool-cache.d.ts +27 -25
- package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -1
- package/dist/server/src/services/connection/tool-cache.js +50 -55
- package/dist/server/src/services/gateway/gateway.service.d.ts +2 -0
- package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
- package/dist/server/src/services/gateway/gateway.service.js +15 -19
- package/dist/server/src/services/gateway/global-transport.d.ts +10 -0
- package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -0
- package/dist/server/src/services/gateway/global-transport.js +42 -0
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +67 -65
- package/dist/server/src/services/gateway/request-handlers/index.d.ts +1 -1
- package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/index.js +1 -1
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +1 -4
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +16 -55
- package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts +35 -0
- package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/initialize.constants.js +44 -0
- package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/resources-handler.js +5 -4
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +32 -77
- package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/tools-handler.js +4 -3
- package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -1
- package/dist/server/src/services/gateway/tool-list-generator.js +37 -16
- package/dist/server/src/services/gateway/types.d.ts +2 -1
- package/dist/server/src/services/gateway/types.d.ts.map +1 -1
- package/dist/server/src/services/hub-manager.service.d.ts +32 -238
- package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
- package/dist/server/src/services/hub-manager.service.js +89 -267
- package/dist/server/src/services/hub-tools/index.d.ts +1 -3
- package/dist/server/src/services/hub-tools/index.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/index.js +1 -2
- package/dist/server/src/services/hub-tools/instance-matcher.d.ts +62 -0
- package/dist/server/src/services/hub-tools/instance-matcher.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/instance-matcher.js +132 -0
- package/dist/server/src/services/hub-tools/instance-selector.d.ts +29 -0
- package/dist/server/src/services/hub-tools/instance-selector.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/instance-selector.js +103 -0
- package/dist/server/src/services/hub-tools/resource-generator.d.ts +25 -5
- package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/resource-generator.js +259 -64
- package/dist/server/src/services/hub-tools/server-selector.d.ts +26 -13
- package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/server-selector.js +44 -37
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +1 -4
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/system-tool-definitions.js +17 -80
- package/dist/server/src/services/hub-tools/tool-search.d.ts +7 -7
- package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/tool-search.js +10 -4
- package/dist/server/src/services/hub-tools/types.d.ts +2 -2
- package/dist/server/src/services/hub-tools/types.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools.service.d.ts +43 -72
- package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools.service.js +185 -110
- package/dist/server/src/services/search/search-cache.d.ts +0 -19
- package/dist/server/src/services/search/search-cache.d.ts.map +1 -1
- package/dist/server/src/services/search/search-cache.js +0 -24
- package/dist/server/src/services/search/search-core.service.d.ts +5 -5
- package/dist/server/src/services/search/search-core.service.js +11 -11
- package/dist/server/src/services/session/session-manager.d.ts +12 -256
- package/dist/server/src/services/session/session-manager.d.ts.map +1 -1
- package/dist/server/src/services/session/session-manager.js +23 -583
- package/dist/server/src/services/session-tracker.service.d.ts +124 -0
- package/dist/server/src/services/session-tracker.service.d.ts.map +1 -0
- package/dist/server/src/services/session-tracker.service.js +176 -0
- package/dist/server/src/services/system-tool-handler.d.ts.map +1 -1
- package/dist/server/src/services/system-tool-handler.js +7 -17
- package/dist/server/src/utils/composite-key.d.ts +29 -0
- package/dist/server/src/utils/composite-key.d.ts.map +1 -0
- package/dist/server/src/utils/composite-key.js +39 -0
- package/dist/server/src/utils/error-handler.d.ts.map +1 -1
- package/dist/server/src/utils/error-handler.js +3 -2
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/src/utils/index.js +2 -0
- package/dist/server/src/utils/instance-id.d.ts +22 -0
- package/dist/server/src/utils/instance-id.d.ts.map +1 -0
- package/dist/server/src/utils/instance-id.js +59 -0
- package/dist/server/src/utils/json-utils.d.ts +4 -4
- package/dist/server/src/utils/json-utils.d.ts.map +1 -1
- package/dist/server/src/utils/json-utils.js +10 -4
- package/dist/server/src/utils/logger/dev-logger.d.ts +2 -1
- package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-colors.d.ts +1 -0
- package/dist/server/src/utils/logger/log-colors.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-colors.js +2 -1
- package/dist/server/src/utils/logger/log-context.d.ts +1 -0
- package/dist/server/src/utils/logger/log-context.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.d.ts +28 -0
- package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.js +287 -5
- package/dist/server/src/utils/logger/log-modules.d.ts +15 -12
- package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-modules.js +8 -8
- package/dist/server/src/utils/logger/log-output.d.ts +2 -2
- package/dist/server/src/utils/logger/log-output.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-output.js +27 -6
- package/dist/server/src/utils/logger/logger.d.ts +13 -0
- package/dist/server/src/utils/logger/logger.d.ts.map +1 -1
- package/dist/server/src/utils/logger/logger.js +42 -7
- package/dist/server/src/utils/parameter-validator.d.ts +10 -0
- package/dist/server/src/utils/parameter-validator.d.ts.map +1 -0
- package/dist/server/src/utils/parameter-validator.js +53 -0
- package/dist/server/src/utils/process-tree.d.ts +49 -0
- package/dist/server/src/utils/process-tree.d.ts.map +1 -0
- package/dist/server/src/utils/process-tree.js +285 -0
- package/dist/server/src/utils/request-context.d.ts +12 -30
- package/dist/server/src/utils/request-context.d.ts.map +1 -1
- package/dist/server/src/utils/request-context.js +10 -30
- package/dist/server/src/utils/sort-utils.d.ts +40 -0
- package/dist/server/src/utils/sort-utils.d.ts.map +1 -0
- package/dist/server/src/utils/sort-utils.js +131 -0
- package/dist/server/src/utils/tool-args-parser.d.ts +0 -4
- package/dist/server/src/utils/tool-args-parser.d.ts.map +1 -1
- package/dist/server/src/utils/tool-args-parser.js +0 -7
- package/dist/server/src/utils/transports/sse-transport.d.ts +16 -1
- package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -1
- package/dist/server/src/utils/transports/sse-transport.js +55 -9
- package/dist/server/src/utils/transports/stdio-transport.d.ts +24 -53
- package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -1
- package/dist/server/src/utils/transports/stdio-transport.js +66 -247
- package/dist/server/src/utils/transports/streamable-http-transport.d.ts +24 -1
- package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -1
- package/dist/server/src/utils/transports/streamable-http-transport.js +68 -8
- package/dist/server/src/utils/transports/transport-factory.d.ts +9 -4
- package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
- package/dist/server/src/utils/transports/transport-factory.js +33 -13
- package/dist/server/src/utils/transports/transport.interface.d.ts +6 -0
- package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -1
- package/dist/server/src/utils/version.d.ts +11 -0
- package/dist/server/src/utils/version.d.ts.map +1 -0
- package/dist/server/src/utils/version.js +57 -0
- package/dist/server/tests/contract/mcp-protocol/initialize.test.js +24 -24
- package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +49 -45
- package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +35 -36
- package/dist/server/tests/evaluation/evaluation.test.js +10 -9
- package/dist/server/tests/integration/api/gateway.test.js +24 -39
- package/dist/server/tests/integration/gateway/fault-tolerance.test.js +65 -25
- package/dist/server/tests/integration/gateway/mcp-connection.test.js +53 -61
- package/dist/server/tests/server.test.js +27 -16
- package/dist/server/tests/temp/temp-run-docling.d.ts +2 -0
- package/dist/server/tests/temp/temp-run-docling.d.ts.map +1 -0
- package/dist/server/tests/temp/temp-run-docling.js +53 -0
- package/dist/server/tests/temp/test-stack.d.ts +6 -0
- package/dist/server/tests/temp/test-stack.d.ts.map +1 -0
- package/dist/server/tests/temp/test-stack.js +40 -0
- package/dist/server/tests/types/test-helpers.d.ts +1 -2
- package/dist/server/tests/types/test-helpers.d.ts.map +1 -1
- package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config-loader-automatic-migration.test.js +199 -0
- package/dist/server/tests/unit/config/config-migrator.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config-migrator.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config-migrator.test.js +316 -0
- package/dist/server/tests/unit/config/config-saver.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config-saver.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config-saver.test.js +200 -0
- package/dist/server/tests/unit/config/config.schema.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config.schema.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config.schema.test.js +347 -0
- package/dist/server/tests/unit/server/runner.test.js +86 -62
- package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts +2 -0
- package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/connection/connection-manager.test.js +112 -0
- package/dist/server/tests/unit/services/hub-manager-service.test.js +112 -46
- package/dist/server/tests/unit/services/hub-manager.test.js +25 -15
- package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-tools/instance-selector.test.js +195 -0
- package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-tools/server-selector.test.js +190 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.js +560 -334
- package/dist/server/tests/unit/services/instance-matcher.test.d.ts +2 -0
- package/dist/server/tests/unit/services/instance-matcher.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/instance-matcher.test.js +256 -0
- package/dist/server/tests/unit/services/session-manager.test.js +26 -436
- package/dist/server/tests/unit/utils/config.test.js +88 -186
- package/dist/server/tests/unit/utils/json-utils.test.js +107 -13
- package/dist/server/tests/unit/utils/logger-formatter.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/logger-formatter.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/logger-formatter.test.js +66 -0
- package/dist/server/tests/unit/utils/logger.test.js +101 -0
- package/dist/server/tests/unit/utils/parameter-validator.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/parameter-validator.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/parameter-validator.test.js +63 -0
- package/dist/server/tests/unit/utils/process-tree.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/process-tree.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/process-tree.test.js +129 -0
- package/dist/server/tests/unit/utils/request-context.test.js +9 -28
- package/dist/server/tests/unit/utils/sort-utils.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/sort-utils.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/sort-utils.test.js +220 -0
- package/dist/server/tests/unit/utils/transport-factory.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/transport-factory.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/transport-factory.test.js +55 -0
- package/package.json +1 -1
- package/dist/client/assets/ResourceDetailView-BQ49hk0c.js +0 -1
- package/dist/client/assets/ResourcesView-BYZfWtia.js +0 -1
- package/dist/client/assets/ResourcesView-CjMklkyv.css +0 -1
- package/dist/client/assets/ServerDashboard-7_8Og9JJ.css +0 -1
- package/dist/client/assets/ServerDashboard-DHcxwKeh.js +0 -2
- package/dist/client/assets/ServerListView-DralUL71.js +0 -30
- package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +0 -1
- package/dist/client/assets/SessionsView-BCGRTqem.js +0 -1
- package/dist/client/assets/SettingsView-BLfxa6PZ.js +0 -1
- package/dist/client/assets/ToolCallDialog-DQ0OQ1mD.js +0 -1
- package/dist/client/assets/ToolsView-BLB6x3tC.js +0 -1
- package/dist/client/assets/_baseClone-Bo5mBgsT.js +0 -1
- package/dist/client/assets/el-form-item-BVMLpmVC.css +0 -1
- package/dist/client/assets/el-form-item-BmeJKVSi.js +0 -12
- package/dist/client/assets/el-input-CeZiq23m.js +0 -1
- package/dist/client/assets/el-input-CmuHb8HS.css +0 -1
- package/dist/client/assets/el-overlay-B2ZKM6Up.css +0 -1
- package/dist/client/assets/el-overlay-iw_hrrlC.js +0 -1
- package/dist/client/assets/el-select-B73uRP_Y.js +0 -1
- package/dist/client/assets/el-tab-pane-BgOTBn4X.js +0 -1
- package/dist/client/assets/el-table-column-Ld4GSD3x.js +0 -1
- package/dist/client/assets/el-table-column-T_mV9jNw.css +0 -1
- package/dist/client/assets/el-tag-DYmSo8Bx.js +0 -1
- package/dist/client/assets/el-tag-DjxZVOpb.css +0 -1
- package/dist/client/assets/index-COYaYRbH.js +0 -1
- package/dist/client/assets/index-Cfcvxyee.js +0 -2
- package/dist/client/assets/index-PhuI36Zi.js +0 -1
- package/dist/client/assets/omit-7EL6VJO4.js +0 -1
- package/dist/client/assets/vnode-upjuIlvm.js +0 -1
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* - Error formatting with stack trace truncation to prevent overly verbose logs
|
|
11
11
|
* - MCP server-specific logging with serverName context
|
|
12
12
|
* - Log rotation with date-based file naming and automatic cleanup
|
|
13
|
+
* - Caller location information (file name and line number)
|
|
13
14
|
*
|
|
14
15
|
* The logger supports four log levels: debug, info, warn, and error, with configurable
|
|
15
16
|
* minimum log level threshold.
|
|
@@ -28,12 +29,13 @@
|
|
|
28
29
|
*/
|
|
29
30
|
import { DevLogger } from './dev-logger.js';
|
|
30
31
|
import { LOG_MODULES } from './log-modules.js';
|
|
31
|
-
import { createColoredLogMessage, createLogMessage, formatError, formatTimestamp, formatLogLevel, formatPid } from './log-formatter.js';
|
|
32
|
+
import { createColoredLogMessage, createLogMessage, formatError, formatTimestamp, formatLogLevel, formatPid, getCallerInfo, formatCallerInfo } from './log-formatter.js';
|
|
32
33
|
import { setDevModeEnabled } from '../json-utils.js';
|
|
33
34
|
export class Logger {
|
|
34
35
|
level = 'info';
|
|
35
36
|
useStderr = false;
|
|
36
37
|
useColor = true;
|
|
38
|
+
showCaller = true;
|
|
37
39
|
devLogger = new DevLogger();
|
|
38
40
|
constructor(level = 'info') {
|
|
39
41
|
this.level = level;
|
|
@@ -45,6 +47,24 @@ export class Logger {
|
|
|
45
47
|
if (noColorEnv === 'true' || noColorEnv === '1' || noColorEnv === '') {
|
|
46
48
|
this.setUseColor(false);
|
|
47
49
|
}
|
|
50
|
+
// Check LOG_CALLER environment variable
|
|
51
|
+
const logCallerEnv = process.env.LOG_CALLER;
|
|
52
|
+
if (logCallerEnv === 'false' || logCallerEnv === '0') {
|
|
53
|
+
this.setShowCaller(false);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Enable or disable caller information in logs.
|
|
58
|
+
* When enabled, logs will show the file name and line number where the log was called.
|
|
59
|
+
*
|
|
60
|
+
* @param show - Whether to show caller information
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* logger.setShowCaller(false); // Disable caller info
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
setShowCaller(show) {
|
|
67
|
+
this.showCaller = show;
|
|
48
68
|
}
|
|
49
69
|
/**
|
|
50
70
|
* Enables development logging mode with file output and enhanced debugging.
|
|
@@ -101,13 +121,19 @@ export class Logger {
|
|
|
101
121
|
const formattedArgs = args.map((arg) => formatError(arg)).join(' ');
|
|
102
122
|
fullMessage = `${message} ${formattedArgs}`;
|
|
103
123
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
124
|
+
// Build context object
|
|
125
|
+
const context = {
|
|
126
|
+
...(options?.module && { module: options.module }),
|
|
127
|
+
...(options?.traceId && { traceId: options.traceId }),
|
|
128
|
+
...(options?.spanId && { spanId: options.spanId })
|
|
129
|
+
};
|
|
130
|
+
// Add caller info if enabled
|
|
131
|
+
if (this.showCaller) {
|
|
132
|
+
const callerInfo = getCallerInfo(4); // Skip 4 frames to get to the actual caller
|
|
133
|
+
if (callerInfo) {
|
|
134
|
+
context.caller = formatCallerInfo(callerInfo);
|
|
109
135
|
}
|
|
110
|
-
|
|
136
|
+
}
|
|
111
137
|
const coloredLogMsg = createColoredLogMessage(level, fullMessage, context);
|
|
112
138
|
const plainLogMsg = createLogMessage(level, fullMessage, context);
|
|
113
139
|
const consoleLogMsg = this.useColor ? coloredLogMsg : plainLogMsg;
|
|
@@ -256,10 +282,19 @@ export class Logger {
|
|
|
256
282
|
* Contains the core logging logic originally in serverLog.
|
|
257
283
|
*/
|
|
258
284
|
logSingleServerLine(level, serverName, message, context) {
|
|
285
|
+
// Build log context with server name
|
|
259
286
|
const logContext = {
|
|
260
287
|
...context,
|
|
261
288
|
serverName
|
|
262
289
|
};
|
|
290
|
+
// Add caller info if enabled (only once per serverLog call would be better,
|
|
291
|
+
// but for consistency with multi-line logging, we add it for each line)
|
|
292
|
+
if (this.showCaller) {
|
|
293
|
+
const callerInfo = getCallerInfo(5); // Skip 5 frames to get to the actual caller
|
|
294
|
+
if (callerInfo) {
|
|
295
|
+
logContext.caller = formatCallerInfo(callerInfo);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
263
298
|
const coloredLogMsg = createColoredLogMessage(level, message, logContext);
|
|
264
299
|
const plainLogMsg = createLogMessage(level, message, logContext);
|
|
265
300
|
const consoleLogMsg = this.useColor ? coloredLogMsg : plainLogMsg;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { JsonSchema } from '../../shared/models/tool.model.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validates tool arguments against the provided JSON schema
|
|
4
|
+
*
|
|
5
|
+
* @param args - The tool arguments to validate
|
|
6
|
+
* @param schema - The JSON schema to validate against
|
|
7
|
+
* @returns null if valid, or an error message string if invalid
|
|
8
|
+
*/
|
|
9
|
+
export declare function validateParameters(args: Record<string, unknown>, schema: JsonSchema): string | null;
|
|
10
|
+
//# sourceMappingURL=parameter-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parameter-validator.d.ts","sourceRoot":"","sources":["../../../../src/utils/parameter-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE/D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,UAAU,GACjB,MAAM,GAAG,IAAI,CAyBf"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates tool arguments against the provided JSON schema
|
|
3
|
+
*
|
|
4
|
+
* @param args - The tool arguments to validate
|
|
5
|
+
* @param schema - The JSON schema to validate against
|
|
6
|
+
* @returns null if valid, or an error message string if invalid
|
|
7
|
+
*/
|
|
8
|
+
export function validateParameters(args, schema) {
|
|
9
|
+
// Check required fields
|
|
10
|
+
if (schema.required && Array.isArray(schema.required)) {
|
|
11
|
+
for (const requiredField of schema.required) {
|
|
12
|
+
if (!(requiredField in args)) {
|
|
13
|
+
return `Missing required parameter: '${requiredField}'. Required parameters: [${schema.required.join(', ')}]`;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// Check parameter types (basic validation)
|
|
18
|
+
if (schema.properties) {
|
|
19
|
+
for (const [paramName, paramSchema] of Object.entries(schema.properties)) {
|
|
20
|
+
if (paramName in args) {
|
|
21
|
+
const argValue = args[paramName];
|
|
22
|
+
const expectedType = paramSchema.type;
|
|
23
|
+
if (expectedType && !isValidType(argValue, expectedType)) {
|
|
24
|
+
return `Invalid type for parameter '${paramName}'. Expected: ${expectedType}, got: ${typeof argValue}`;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Validates if a value matches the expected type
|
|
33
|
+
*
|
|
34
|
+
* @param value - The value to validate
|
|
35
|
+
* @param expectedType - The expected JSON schema type
|
|
36
|
+
* @returns true if valid, false otherwise
|
|
37
|
+
*/
|
|
38
|
+
function isValidType(value, expectedType) {
|
|
39
|
+
switch (expectedType) {
|
|
40
|
+
case 'string':
|
|
41
|
+
return typeof value === 'string';
|
|
42
|
+
case 'number':
|
|
43
|
+
return typeof value === 'number';
|
|
44
|
+
case 'boolean':
|
|
45
|
+
return typeof value === 'boolean';
|
|
46
|
+
case 'object':
|
|
47
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
48
|
+
case 'array':
|
|
49
|
+
return Array.isArray(value);
|
|
50
|
+
default:
|
|
51
|
+
return true; // Cannot validate unknown types, so pass by default
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Windows Process Tree Utility Module
|
|
3
|
+
*
|
|
4
|
+
* This module provides process tree management utilities specifically for Windows.
|
|
5
|
+
* It handles the case where shell: true spawns cmd.exe which then spawns
|
|
6
|
+
* the actual working process (like node.exe, python.exe, etc.).
|
|
7
|
+
*
|
|
8
|
+
* On non-Windows platforms, all methods return safe default values
|
|
9
|
+
* and don't perform any actual operations.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Gets all child process IDs for a given parent PID on Windows.
|
|
13
|
+
*
|
|
14
|
+
* @param pid - Parent process ID
|
|
15
|
+
@returns Promise resolving to array of child PID
|
|
16
|
+
*/
|
|
17
|
+
export declare function getChildren(pid: number): Promise<number[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Gets the entire process tree (all descendants) for a given PID.
|
|
20
|
+
* Includes the original PID at the beginning of the array.
|
|
21
|
+
*
|
|
22
|
+
* @param pid - Root process ID
|
|
23
|
+
* @returns Array of all process IDs in the tree
|
|
24
|
+
*/
|
|
25
|
+
export declare function getProcessTree(pid: number): Promise<number[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Checks if any process in the process tree is still running.
|
|
28
|
+
*
|
|
29
|
+
* @param pid - Root process ID
|
|
30
|
+
* @returns True if any process in the tree is running
|
|
31
|
+
*/
|
|
32
|
+
export declare function isAnyInTreeRunning(pid: number): Promise<boolean>;
|
|
33
|
+
/**
|
|
34
|
+
* Tries to find the actual working process PID in the tree.
|
|
35
|
+
* This looks for processes that are likely the actual worker
|
|
36
|
+
* (node.exe, python.exe, etc.) rather than shell processes.
|
|
37
|
+
*
|
|
38
|
+
* @param pid - Root process ID
|
|
39
|
+
* @returns Working process PID if found, undefined otherwise
|
|
40
|
+
*/
|
|
41
|
+
export declare function getWorkingProcessPid(pid: number): Promise<number | undefined>;
|
|
42
|
+
/**
|
|
43
|
+
* Kills the entire process tree.
|
|
44
|
+
*
|
|
45
|
+
* @param pid - Root process ID
|
|
46
|
+
* @param signal - Signal to send (default: SIGTERM)
|
|
47
|
+
*/
|
|
48
|
+
export declare function killProcessTree(pid: number, signal?: NodeJS.Signals): Promise<void>;
|
|
49
|
+
//# sourceMappingURL=process-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-tree.d.ts","sourceRoot":"","sources":["../../../../src/utils/process-tree.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AAEH;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBhE;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBnE;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBtE;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAkCnF;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,MAAM,CAAC,OAAmB,GACjC,OAAO,CAAC,IAAI,CAAC,CAgCf"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { logger, LOG_MODULES } from './logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Windows Process Tree Utility Module
|
|
5
|
+
*
|
|
6
|
+
* This module provides process tree management utilities specifically for Windows.
|
|
7
|
+
* It handles the case where shell: true spawns cmd.exe which then spawns
|
|
8
|
+
* the actual working process (like node.exe, python.exe, etc.).
|
|
9
|
+
*
|
|
10
|
+
* On non-Windows platforms, all methods return safe default values
|
|
11
|
+
* and don't perform any actual operations.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Gets all child process IDs for a given parent PID on Windows.
|
|
15
|
+
*
|
|
16
|
+
* @param pid - Parent process ID
|
|
17
|
+
@returns Promise resolving to array of child PID
|
|
18
|
+
*/
|
|
19
|
+
export async function getChildren(pid) {
|
|
20
|
+
if (process.platform !== 'win32') {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const result = await executePowerShellCommand(`Get-CimInstance Win32_Process | Where-Object { $_.ParentProcessId -eq ${pid} } | Select-Object -ExpandProperty ProcessId`);
|
|
25
|
+
const pids = parsePidList(result);
|
|
26
|
+
return pids;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
logger.debug(`Failed to get children for PID ${pid}:`, error, LOG_MODULES.STDIO_TRANSPORT);
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Gets the entire process tree (all descendants) for a given PID.
|
|
35
|
+
* Includes the original PID at the beginning of the array.
|
|
36
|
+
*
|
|
37
|
+
* @param pid - Root process ID
|
|
38
|
+
* @returns Array of all process IDs in the tree
|
|
39
|
+
*/
|
|
40
|
+
export async function getProcessTree(pid) {
|
|
41
|
+
if (process.platform !== 'win32') {
|
|
42
|
+
return [pid];
|
|
43
|
+
}
|
|
44
|
+
const tree = [pid];
|
|
45
|
+
const queue = [pid];
|
|
46
|
+
while (queue.length > 0) {
|
|
47
|
+
const current = queue.shift();
|
|
48
|
+
const children = await getChildren(current);
|
|
49
|
+
for (const child of children) {
|
|
50
|
+
if (!tree.includes(child)) {
|
|
51
|
+
tree.push(child);
|
|
52
|
+
queue.push(child);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return tree;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Checks if any process in the process tree is still running.
|
|
60
|
+
*
|
|
61
|
+
* @param pid - Root process ID
|
|
62
|
+
* @returns True if any process in the tree is running
|
|
63
|
+
*/
|
|
64
|
+
export async function isAnyInTreeRunning(pid) {
|
|
65
|
+
if (process.platform !== 'win32') {
|
|
66
|
+
return isProcessRunning(pid);
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const tree = await getProcessTree(pid);
|
|
70
|
+
for (const processId of tree) {
|
|
71
|
+
if (isProcessRunning(processId)) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
logger.debug(`Error checking process tree for PID ${pid}:`, error, LOG_MODULES.STDIO_TRANSPORT);
|
|
79
|
+
return isProcessRunning(pid);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Tries to find the actual working process PID in the tree.
|
|
84
|
+
* This looks for processes that are likely the actual worker
|
|
85
|
+
* (node.exe, python.exe, etc.) rather than shell processes.
|
|
86
|
+
*
|
|
87
|
+
* @param pid - Root process ID
|
|
88
|
+
* @returns Working process PID if found, undefined otherwise
|
|
89
|
+
*/
|
|
90
|
+
export async function getWorkingProcessPid(pid) {
|
|
91
|
+
if (process.platform !== 'win32') {
|
|
92
|
+
return pid;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const tree = await getProcessTree(pid);
|
|
96
|
+
// If only the root process is in the tree, return it
|
|
97
|
+
if (tree.length === 1) {
|
|
98
|
+
return pid;
|
|
99
|
+
}
|
|
100
|
+
// Get process names for all PIDs in the tree
|
|
101
|
+
const processInfo = await getProcessInfo(tree);
|
|
102
|
+
// Filter out shell processes (cmd.exe, powershell.exe, etc.)
|
|
103
|
+
const workerProcesses = processInfo.filter((info) => !isShellProcess(info.name));
|
|
104
|
+
if (workerProcesses.length > 0) {
|
|
105
|
+
// Prefer the deepest (last) worker process in the tree
|
|
106
|
+
return workerProcesses[workerProcesses.length - 1].pid;
|
|
107
|
+
}
|
|
108
|
+
// If no worker processes found, return the last process in the tree
|
|
109
|
+
return tree[tree.length - 1];
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
logger.debug(`Error finding working process for PID ${pid}:`, error, LOG_MODULES.STDIO_TRANSPORT);
|
|
113
|
+
return pid;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Kills the entire process tree.
|
|
118
|
+
*
|
|
119
|
+
* @param pid - Root process ID
|
|
120
|
+
* @param signal - Signal to send (default: SIGTERM)
|
|
121
|
+
*/
|
|
122
|
+
export async function killProcessTree(pid, signal = 'SIGTERM') {
|
|
123
|
+
if (process.platform !== 'win32') {
|
|
124
|
+
// On non-Windows, just kill the single process
|
|
125
|
+
try {
|
|
126
|
+
process.kill(pid, signal);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Process might already be dead
|
|
130
|
+
}
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
const tree = await getProcessTree(pid);
|
|
135
|
+
// Kill processes in reverse order (children first, parent last)
|
|
136
|
+
for (let i = tree.length - 1; i >= 0; i--) {
|
|
137
|
+
const processId = tree[i];
|
|
138
|
+
try {
|
|
139
|
+
process.kill(processId, signal);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Process might already be dead
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
logger.debug(`Error killing process tree for PID ${pid}:`, error, LOG_MODULES.STDIO_TRANSPORT);
|
|
148
|
+
// Fallback: try to kill just the root process
|
|
149
|
+
try {
|
|
150
|
+
process.kill(pid, signal);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Process might already be dead
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// ==================== Internal Helper Functions ====================
|
|
158
|
+
/**
|
|
159
|
+
* Checks if a single process is running.
|
|
160
|
+
*
|
|
161
|
+
* @param pid - Process ID
|
|
162
|
+
* @returns True if process is running
|
|
163
|
+
*/
|
|
164
|
+
function isProcessRunning(pid) {
|
|
165
|
+
try {
|
|
166
|
+
process.kill(pid, 0);
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Executes a PowerShell command and returns the output.
|
|
175
|
+
*
|
|
176
|
+
* @param command - PowerShell command
|
|
177
|
+
* @returns Command output
|
|
178
|
+
*/
|
|
179
|
+
async function executePowerShellCommand(command) {
|
|
180
|
+
return new Promise((resolve, reject) => {
|
|
181
|
+
const ps = spawn('powershell.exe', ['-Command', command], {
|
|
182
|
+
windowsHide: true,
|
|
183
|
+
stdio: ['ignore', 'pipe', 'pipe']
|
|
184
|
+
});
|
|
185
|
+
let stdout = '';
|
|
186
|
+
let stderr = '';
|
|
187
|
+
ps.stdout?.on('data', (data) => {
|
|
188
|
+
stdout += data.toString();
|
|
189
|
+
});
|
|
190
|
+
ps.stderr?.on('data', (data) => {
|
|
191
|
+
stderr += data.toString();
|
|
192
|
+
});
|
|
193
|
+
ps.on('close', (code) => {
|
|
194
|
+
if (code === 0) {
|
|
195
|
+
resolve(stdout.trim());
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
reject(new Error(`PowerShell command failed: ${stderr || stdout}`));
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
ps.on('error', (error) => {
|
|
202
|
+
reject(error);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Parses a list of PIDs from command output.
|
|
208
|
+
*
|
|
209
|
+
* @param output - Command output
|
|
210
|
+
* * @returns Array of PIDs
|
|
211
|
+
*/
|
|
212
|
+
function parsePidList(output) {
|
|
213
|
+
const lines = output
|
|
214
|
+
.split('\n')
|
|
215
|
+
.map((line) => line.trim())
|
|
216
|
+
.filter((line) => line.length > 0);
|
|
217
|
+
const pids = [];
|
|
218
|
+
for (const line of lines) {
|
|
219
|
+
const pid = parseInt(line, 10);
|
|
220
|
+
if (!isNaN(pid) && pid > 0) {
|
|
221
|
+
pids.push(pid);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return pids;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Gets process information for multiple PIDs.
|
|
228
|
+
*
|
|
229
|
+
* @param pids - Array of process IDs
|
|
230
|
+
* @returns Array of process info objects
|
|
231
|
+
*/
|
|
232
|
+
async function getProcessInfo(pids) {
|
|
233
|
+
if (pids.length === 0) {
|
|
234
|
+
return [];
|
|
235
|
+
}
|
|
236
|
+
const result = await executePowerShellCommand(`Get-CimInstance Win32_Process | Where-Object { ${pids.map((pid) => `$_.ProcessId -eq ${pid}`).join(' -or ')} } | Select-Object ProcessId, Name | ConvertTo-Csv -NoTypeInformation`);
|
|
237
|
+
return parseProcessInfoCsv(result);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Parses process info from CSV output.
|
|
241
|
+
*
|
|
242
|
+
* @param csvOutput - CSV output from PowerShell
|
|
243
|
+
* @ *returns Array of process info
|
|
244
|
+
*/
|
|
245
|
+
function parseProcessInfoCsv(csvOutput) {
|
|
246
|
+
const lines = csvOutput
|
|
247
|
+
.split('\n')
|
|
248
|
+
.map((line) => line.trim())
|
|
249
|
+
.filter((line) => line.length > 0);
|
|
250
|
+
if (lines.length < 2) {
|
|
251
|
+
return [];
|
|
252
|
+
}
|
|
253
|
+
const info = [];
|
|
254
|
+
// Skip header line
|
|
255
|
+
for (let i = 1; i < lines.length; i++) {
|
|
256
|
+
const parts = lines[i].split(',').map((p) => p.trim().replace(/^"|"$/g, ''));
|
|
257
|
+
if (parts.length >= 2) {
|
|
258
|
+
const pid = parseInt(parts[0], 10);
|
|
259
|
+
if (!isNaN(pid) && pid > 0) {
|
|
260
|
+
info.push({
|
|
261
|
+
pid,
|
|
262
|
+
name: parts[1].toLowerCase()
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return info;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Checks if a process name is a shell process.
|
|
271
|
+
*
|
|
272
|
+
* @param processName - Process name (should be lowercase)
|
|
273
|
+
* @returns True if it's a shell process
|
|
274
|
+
*/
|
|
275
|
+
function isShellProcess(processName) {
|
|
276
|
+
const shellProcesses = [
|
|
277
|
+
'cmd.exe',
|
|
278
|
+
'powershell.exe',
|
|
279
|
+
'pwsh.exe',
|
|
280
|
+
'command.com',
|
|
281
|
+
'sh.exe',
|
|
282
|
+
'bash.exe'
|
|
283
|
+
];
|
|
284
|
+
return shellProcesses.includes(processName.toLowerCase());
|
|
285
|
+
}
|
|
@@ -6,66 +6,48 @@
|
|
|
6
6
|
* every function call. It uses Node.js AsyncLocalStorage to maintain context
|
|
7
7
|
* throughout the request lifecycle.
|
|
8
8
|
*
|
|
9
|
-
* The primary use case is storing
|
|
9
|
+
* The primary use case is storing session context information (sessionId, clientName,
|
|
10
10
|
* cwd, project, etc.) that needs to be accessible from any part of the application
|
|
11
11
|
* during request processing.
|
|
12
12
|
*
|
|
13
13
|
* @module utils/request-context
|
|
14
14
|
*/
|
|
15
15
|
import { AsyncLocalStorage } from 'async_hooks';
|
|
16
|
-
import type {
|
|
16
|
+
import type { SessionContext } from '../../shared/types/session-context.types.js';
|
|
17
17
|
/**
|
|
18
18
|
* AsyncLocalStorage instance for storing request context.
|
|
19
19
|
*
|
|
20
|
-
* This storage holds the
|
|
20
|
+
* This storage holds the SessionContext object for the current request and
|
|
21
21
|
* makes it available throughout the entire request processing chain,
|
|
22
22
|
* including asynchronous operations and nested function calls.
|
|
23
23
|
*
|
|
24
24
|
* @example
|
|
25
25
|
* ```typescript
|
|
26
26
|
* // In route handler
|
|
27
|
-
* await requestContext.run(
|
|
28
|
-
* // Any code executed here can access the
|
|
29
|
-
* const ctx =
|
|
27
|
+
* await requestContext.run(sessionContext, async () => {
|
|
28
|
+
* // Any code executed here can access the session context
|
|
29
|
+
* const ctx = getSessionContext();
|
|
30
30
|
* console.log(ctx.sessionId);
|
|
31
31
|
* });
|
|
32
32
|
* ```
|
|
33
33
|
*/
|
|
34
|
-
export declare const requestContext: AsyncLocalStorage<
|
|
34
|
+
export declare const requestContext: AsyncLocalStorage<SessionContext>;
|
|
35
35
|
/**
|
|
36
|
-
* Retrieves the current request's
|
|
36
|
+
* Retrieves the current request's session context.
|
|
37
37
|
*
|
|
38
|
-
* This function returns the
|
|
38
|
+
* This function returns the SessionContext object stored in the AsyncLocalStorage
|
|
39
39
|
* for the current request. It should only be called within a request context
|
|
40
40
|
* that has been established using requestContext.run().
|
|
41
41
|
*
|
|
42
|
-
* @returns {
|
|
42
|
+
* @returns {SessionContext | undefined} The current request's session context, or undefined if not in a request context
|
|
43
43
|
*
|
|
44
44
|
* @example
|
|
45
45
|
* ```typescript
|
|
46
|
-
* const context =
|
|
46
|
+
* const context = getSessionContext();
|
|
47
47
|
* if (context) {
|
|
48
48
|
* console.log(`Processing request for session: ${context.sessionId}`);
|
|
49
49
|
* }
|
|
50
50
|
* ```
|
|
51
51
|
*/
|
|
52
|
-
export declare function
|
|
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;
|
|
52
|
+
export declare function getSessionContext(): SessionContext | undefined;
|
|
71
53
|
//# sourceMappingURL=request-context.d.ts.map
|
|
@@ -1 +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,
|
|
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,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAE7E;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,cAAc,mCAA0C,CAAC;AAEtE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,SAAS,CAE9D"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* every function call. It uses Node.js AsyncLocalStorage to maintain context
|
|
7
7
|
* throughout the request lifecycle.
|
|
8
8
|
*
|
|
9
|
-
* The primary use case is storing
|
|
9
|
+
* The primary use case is storing session context information (sessionId, clientName,
|
|
10
10
|
* cwd, project, etc.) that needs to be accessible from any part of the application
|
|
11
11
|
* during request processing.
|
|
12
12
|
*
|
|
@@ -16,58 +16,38 @@ import { AsyncLocalStorage } from 'async_hooks';
|
|
|
16
16
|
/**
|
|
17
17
|
* AsyncLocalStorage instance for storing request context.
|
|
18
18
|
*
|
|
19
|
-
* This storage holds the
|
|
19
|
+
* This storage holds the SessionContext object for the current request and
|
|
20
20
|
* makes it available throughout the entire request processing chain,
|
|
21
21
|
* including asynchronous operations and nested function calls.
|
|
22
22
|
*
|
|
23
23
|
* @example
|
|
24
24
|
* ```typescript
|
|
25
25
|
* // In route handler
|
|
26
|
-
* await requestContext.run(
|
|
27
|
-
* // Any code executed here can access the
|
|
28
|
-
* const ctx =
|
|
26
|
+
* await requestContext.run(sessionContext, async () => {
|
|
27
|
+
* // Any code executed here can access the session context
|
|
28
|
+
* const ctx = getSessionContext();
|
|
29
29
|
* console.log(ctx.sessionId);
|
|
30
30
|
* });
|
|
31
31
|
* ```
|
|
32
32
|
*/
|
|
33
33
|
export const requestContext = new AsyncLocalStorage();
|
|
34
34
|
/**
|
|
35
|
-
* Retrieves the current request's
|
|
35
|
+
* Retrieves the current request's session context.
|
|
36
36
|
*
|
|
37
|
-
* This function returns the
|
|
37
|
+
* This function returns the SessionContext object stored in the AsyncLocalStorage
|
|
38
38
|
* for the current request. It should only be called within a request context
|
|
39
39
|
* that has been established using requestContext.run().
|
|
40
40
|
*
|
|
41
|
-
* @returns {
|
|
41
|
+
* @returns {SessionContext | undefined} The current request's session context, or undefined if not in a request context
|
|
42
42
|
*
|
|
43
43
|
* @example
|
|
44
44
|
* ```typescript
|
|
45
|
-
* const context =
|
|
45
|
+
* const context = getSessionContext();
|
|
46
46
|
* if (context) {
|
|
47
47
|
* console.log(`Processing request for session: ${context.sessionId}`);
|
|
48
48
|
* }
|
|
49
49
|
* ```
|
|
50
50
|
*/
|
|
51
|
-
export function
|
|
51
|
+
export function getSessionContext() {
|
|
52
52
|
return requestContext.getStore();
|
|
53
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
|
-
}
|