@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,296 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { stringifyForLogging, stringifyForLoggingWithReplacer, setJsonPrettyConfigGetter, rawHeadersToObject, stringifyRawHeadersForLogging, getJsonPrettySetting, getMcpCommDebugSetting, getSessionDebugSetting } from '../../../src/utils/json-utils.js';
|
|
3
|
+
describe('json-utils', () => {
|
|
4
|
+
beforeEach(() => {
|
|
5
|
+
// Reset config getter
|
|
6
|
+
setJsonPrettyConfigGetter(null);
|
|
7
|
+
});
|
|
8
|
+
describe('processPrettyJsonForLogging (internal)', () => {
|
|
9
|
+
it('should convert \\n to actual newlines in string values (basic newline processing)', () => {
|
|
10
|
+
// Enable pretty mode via config getter
|
|
11
|
+
setJsonPrettyConfigGetter(() => ({
|
|
12
|
+
system: {
|
|
13
|
+
logging: {
|
|
14
|
+
jsonPretty: true,
|
|
15
|
+
mcpCommDebug: false,
|
|
16
|
+
sessionDebug: false
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}));
|
|
20
|
+
const obj = {
|
|
21
|
+
text: 'line1\nline2\nline3'
|
|
22
|
+
};
|
|
23
|
+
const result = stringifyForLogging(obj);
|
|
24
|
+
// The result should have actual newlines, not escaped \n
|
|
25
|
+
expect(result).toContain('"text": "line1');
|
|
26
|
+
expect(result).toContain('line2');
|
|
27
|
+
expect(result).toContain('line3"');
|
|
28
|
+
// Should not contain escaped \n in the string value
|
|
29
|
+
expect(result).not.toContain('line1\\nline2');
|
|
30
|
+
});
|
|
31
|
+
it('should keep escaped newlines (\\\\n) unchanged', () => {
|
|
32
|
+
// Enable pretty mode via config getter
|
|
33
|
+
setJsonPrettyConfigGetter(() => ({
|
|
34
|
+
system: {
|
|
35
|
+
logging: {
|
|
36
|
+
jsonPretty: true,
|
|
37
|
+
mcpCommDebug: false,
|
|
38
|
+
sessionDebug: false
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}));
|
|
42
|
+
const obj = {
|
|
43
|
+
text: 'literal backslash n: \\n'
|
|
44
|
+
};
|
|
45
|
+
const result = stringifyForLogging(obj);
|
|
46
|
+
// The escaped newline should remain as \\n in the output (but in the string, we need to escape it)
|
|
47
|
+
expect(result).toContain('literal backslash n: \\\\n');
|
|
48
|
+
});
|
|
49
|
+
it('should handle mixed scenario with both \\n and \\\\n', () => {
|
|
50
|
+
// Enable pretty mode via config getter
|
|
51
|
+
setJsonPrettyConfigGetter(() => ({
|
|
52
|
+
system: {
|
|
53
|
+
logging: {
|
|
54
|
+
jsonPretty: true,
|
|
55
|
+
mcpCommDebug: false,
|
|
56
|
+
sessionDebug: false
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}));
|
|
60
|
+
const obj = {
|
|
61
|
+
text: 'first line\nsecond line with \\n literal'
|
|
62
|
+
};
|
|
63
|
+
const result = stringifyForLogging(obj);
|
|
64
|
+
// The first \n should be actual newline, the \\n should remain as \\n
|
|
65
|
+
expect(result).toContain('first line');
|
|
66
|
+
expect(result).toContain('second line with \\\\n literal');
|
|
67
|
+
});
|
|
68
|
+
it('should preserve JSON structure integrity', () => {
|
|
69
|
+
// Enable pretty mode via config getter
|
|
70
|
+
setJsonPrettyConfigGetter(() => ({
|
|
71
|
+
system: {
|
|
72
|
+
logging: {
|
|
73
|
+
jsonPretty: true,
|
|
74
|
+
mcpCommDebug: false,
|
|
75
|
+
sessionDebug: false
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}));
|
|
79
|
+
const obj = {
|
|
80
|
+
key1: 'value\\nwith\\nnewlines',
|
|
81
|
+
key2: 'normal value',
|
|
82
|
+
key3: {
|
|
83
|
+
nested: 'nested\\nvalue'
|
|
84
|
+
},
|
|
85
|
+
key4: ['array\\nitem1', 'array\\nitem2']
|
|
86
|
+
};
|
|
87
|
+
const result = stringifyForLogging(obj);
|
|
88
|
+
// Should still be valid JSON structure
|
|
89
|
+
expect(result).toContain('"key1":');
|
|
90
|
+
expect(result).toContain('"key2":');
|
|
91
|
+
expect(result).toContain('"key3":');
|
|
92
|
+
expect(result).toContain('"nested":');
|
|
93
|
+
expect(result).toContain('"key4":');
|
|
94
|
+
// Parse back should work (even with actual newlines in strings)
|
|
95
|
+
// Note: We can't directly JSON.parse the result because it has actual newlines,
|
|
96
|
+
// but we can verify the structure is correct
|
|
97
|
+
});
|
|
98
|
+
it('should not affect compact mode (non-PRETTY mode)', () => {
|
|
99
|
+
// Disable pretty mode via config getter
|
|
100
|
+
setJsonPrettyConfigGetter(() => ({
|
|
101
|
+
system: {
|
|
102
|
+
logging: {
|
|
103
|
+
jsonPretty: false,
|
|
104
|
+
mcpCommDebug: false,
|
|
105
|
+
sessionDebug: false
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}));
|
|
109
|
+
const obj = {
|
|
110
|
+
text: 'line1\nline2'
|
|
111
|
+
};
|
|
112
|
+
const result = stringifyForLogging(obj);
|
|
113
|
+
// In compact mode, should keep \n as escaped sequence
|
|
114
|
+
expect(result).toContain('line1\\nline2');
|
|
115
|
+
// Compact mode should not be pretty printed
|
|
116
|
+
expect(result).not.toContain('\n "text":');
|
|
117
|
+
});
|
|
118
|
+
it('should work with stringifyForLoggingWithReplacer', () => {
|
|
119
|
+
const obj = {
|
|
120
|
+
text: 'line1\\nline2',
|
|
121
|
+
sensitive: 'should be redacted'
|
|
122
|
+
};
|
|
123
|
+
const replacer = (key, value) => {
|
|
124
|
+
if (key === 'sensitive') {
|
|
125
|
+
return '[REDACTED]';
|
|
126
|
+
}
|
|
127
|
+
return value;
|
|
128
|
+
};
|
|
129
|
+
const result = stringifyForLoggingWithReplacer(obj, replacer);
|
|
130
|
+
expect(result).toContain('"text": "line1');
|
|
131
|
+
expect(result).toContain('line2"');
|
|
132
|
+
expect(result).toContain('"sensitive": "[REDACTED]"');
|
|
133
|
+
});
|
|
134
|
+
it('should handle multiple newline sequences', () => {
|
|
135
|
+
const obj = {
|
|
136
|
+
text: 'start\n\n\nmiddle\n\nend'
|
|
137
|
+
};
|
|
138
|
+
const result = stringifyForLogging(obj);
|
|
139
|
+
expect(result).toContain('start');
|
|
140
|
+
expect(result).toContain('middle');
|
|
141
|
+
expect(result).toContain('end');
|
|
142
|
+
});
|
|
143
|
+
it('should handle newlines at beginning and end', () => {
|
|
144
|
+
const obj = {
|
|
145
|
+
text: '\nstart with newline\nend with newline\n'
|
|
146
|
+
};
|
|
147
|
+
const result = stringifyForLogging(obj);
|
|
148
|
+
expect(result).toContain('"text": "');
|
|
149
|
+
expect(result).toContain('start with newline');
|
|
150
|
+
expect(result).toContain('end with newline');
|
|
151
|
+
});
|
|
152
|
+
it('should not process if there are no \\n in the string', () => {
|
|
153
|
+
const obj = {
|
|
154
|
+
text: 'no newlines here',
|
|
155
|
+
number: 42,
|
|
156
|
+
bool: true
|
|
157
|
+
};
|
|
158
|
+
const result = stringifyForLogging(obj);
|
|
159
|
+
expect(result).toContain('"text": "no newlines here"');
|
|
160
|
+
expect(result).toContain('"number": 42');
|
|
161
|
+
expect(result).toContain('"bool": true');
|
|
162
|
+
});
|
|
163
|
+
it('should handle edge case with trailing backslash', () => {
|
|
164
|
+
// Note: A single trailing backslash is not valid in a JavaScript string,
|
|
165
|
+
// JSON.stringify will handle it properly by escaping it
|
|
166
|
+
const obj = {
|
|
167
|
+
text: 'ends with backslash'
|
|
168
|
+
};
|
|
169
|
+
const result = stringifyForLogging(obj);
|
|
170
|
+
// Should handle gracefully
|
|
171
|
+
expect(result).toBeDefined();
|
|
172
|
+
expect(result).toContain('ends with backslash');
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe('getJsonPrettySetting', () => {
|
|
176
|
+
it('should return true by default', () => {
|
|
177
|
+
expect(getJsonPrettySetting()).toBe(true);
|
|
178
|
+
});
|
|
179
|
+
it('should use config getter if available', () => {
|
|
180
|
+
setJsonPrettyConfigGetter(() => ({
|
|
181
|
+
system: {
|
|
182
|
+
logging: {
|
|
183
|
+
jsonPretty: false,
|
|
184
|
+
mcpCommDebug: false,
|
|
185
|
+
sessionDebug: false
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}));
|
|
189
|
+
expect(getJsonPrettySetting()).toBe(false);
|
|
190
|
+
setJsonPrettyConfigGetter(() => ({
|
|
191
|
+
system: {
|
|
192
|
+
logging: {
|
|
193
|
+
jsonPretty: true,
|
|
194
|
+
mcpCommDebug: false,
|
|
195
|
+
sessionDebug: false
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}));
|
|
199
|
+
expect(getJsonPrettySetting()).toBe(true);
|
|
200
|
+
});
|
|
201
|
+
it('should fall back to default value when config getter fails', () => {
|
|
202
|
+
setJsonPrettyConfigGetter(() => {
|
|
203
|
+
throw new Error('Config getter failed');
|
|
204
|
+
});
|
|
205
|
+
expect(getJsonPrettySetting()).toBe(true);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
describe('all setting getters', () => {
|
|
209
|
+
it('should return correct defaults when no config getter is set', () => {
|
|
210
|
+
expect(getJsonPrettySetting()).toBe(true);
|
|
211
|
+
expect(getMcpCommDebugSetting()).toBe(false);
|
|
212
|
+
expect(getSessionDebugSetting()).toBe(false);
|
|
213
|
+
});
|
|
214
|
+
it('should return values from config getter when available', () => {
|
|
215
|
+
setJsonPrettyConfigGetter(() => ({
|
|
216
|
+
system: {
|
|
217
|
+
logging: {
|
|
218
|
+
jsonPretty: false,
|
|
219
|
+
mcpCommDebug: true,
|
|
220
|
+
sessionDebug: true
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}));
|
|
224
|
+
expect(getJsonPrettySetting()).toBe(false);
|
|
225
|
+
expect(getMcpCommDebugSetting()).toBe(true);
|
|
226
|
+
expect(getSessionDebugSetting()).toBe(true);
|
|
227
|
+
});
|
|
228
|
+
it('should fall back to defaults when config getter fails', () => {
|
|
229
|
+
setJsonPrettyConfigGetter(() => {
|
|
230
|
+
throw new Error('Config getter failed');
|
|
231
|
+
});
|
|
232
|
+
expect(getJsonPrettySetting()).toBe(true);
|
|
233
|
+
expect(getMcpCommDebugSetting()).toBe(false);
|
|
234
|
+
expect(getSessionDebugSetting()).toBe(false);
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
describe('rawHeadersToObject', () => {
|
|
238
|
+
it('should convert rawHeaders array to object', () => {
|
|
239
|
+
const rawHeaders = ['Host', 'example.com', 'Content-Type', 'application/json'];
|
|
240
|
+
const result = rawHeadersToObject(rawHeaders);
|
|
241
|
+
expect(result).toEqual({
|
|
242
|
+
Host: 'example.com',
|
|
243
|
+
'Content-Type': 'application/json'
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
it('should handle empty array', () => {
|
|
247
|
+
expect(rawHeadersToObject([])).toEqual({});
|
|
248
|
+
});
|
|
249
|
+
it('should skip undefined pairs', () => {
|
|
250
|
+
const rawHeaders = ['Host', 'example.com', 'Only-Key'];
|
|
251
|
+
const result = rawHeadersToObject(rawHeaders);
|
|
252
|
+
expect(result).toEqual({ Host: 'example.com' });
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
describe('stringifyRawHeadersForLogging', () => {
|
|
256
|
+
it('should stringify raw headers for logging', () => {
|
|
257
|
+
const rawHeaders = ['Host', 'example.com', 'Content-Type', 'application/json'];
|
|
258
|
+
const result = stringifyRawHeadersForLogging(rawHeaders);
|
|
259
|
+
expect(result).toContain('Host');
|
|
260
|
+
expect(result).toContain('example.com');
|
|
261
|
+
expect(result).toContain('Content-Type');
|
|
262
|
+
expect(result).toContain('application/json');
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
describe('integration tests', () => {
|
|
266
|
+
it('should work with realistic debug response scenario', () => {
|
|
267
|
+
// Enable pretty mode via config getter
|
|
268
|
+
setJsonPrettyConfigGetter(() => ({
|
|
269
|
+
system: {
|
|
270
|
+
logging: {
|
|
271
|
+
jsonPretty: true,
|
|
272
|
+
mcpCommDebug: false,
|
|
273
|
+
sessionDebug: false
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}));
|
|
277
|
+
const debugResponse = {
|
|
278
|
+
jsonrpc: '2.0',
|
|
279
|
+
id: 1,
|
|
280
|
+
result: {
|
|
281
|
+
content: [
|
|
282
|
+
{
|
|
283
|
+
type: 'text',
|
|
284
|
+
text: '# click response\nSuccessfully clicked on the element\nAction completed'
|
|
285
|
+
}
|
|
286
|
+
]
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
const result = stringifyForLogging(debugResponse);
|
|
290
|
+
// Should have actual newlines in the text field
|
|
291
|
+
expect(result).toContain('"text": "# click response');
|
|
292
|
+
expect(result).toContain('Successfully clicked on the element');
|
|
293
|
+
expect(result).toContain('Action completed"');
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-rotator.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/utils/log-rotator.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import { LogRotator } from '../../../src/utils/log-rotator.js';
|
|
6
|
+
// Helper function to create a complete system config with custom logging rotation
|
|
7
|
+
function createTestConfig(rotationConfig = {}) {
|
|
8
|
+
return {
|
|
9
|
+
system: {
|
|
10
|
+
logging: {
|
|
11
|
+
rotationAge: rotationConfig.rotationAge ?? '7d'
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
describe('LogRotator', () => {
|
|
17
|
+
let logRotator;
|
|
18
|
+
let tempLogDir;
|
|
19
|
+
let originalConfig;
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
// Create temporary log directory
|
|
22
|
+
tempLogDir = path.join(os.tmpdir(), `log-rotator-test-${Date.now()}`);
|
|
23
|
+
fs.mkdirSync(tempLogDir, { recursive: true });
|
|
24
|
+
// Set default configuration
|
|
25
|
+
originalConfig = createTestConfig();
|
|
26
|
+
});
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
// Clean up temporary directory
|
|
29
|
+
if (fs.existsSync(tempLogDir)) {
|
|
30
|
+
fs.rmSync(tempLogDir, { recursive: true, force: true });
|
|
31
|
+
}
|
|
32
|
+
vi.clearAllMocks();
|
|
33
|
+
});
|
|
34
|
+
it('should create log rotator with default base name', () => {
|
|
35
|
+
logRotator = new LogRotator(tempLogDir);
|
|
36
|
+
expect(logRotator).toBeDefined();
|
|
37
|
+
});
|
|
38
|
+
it('should create log rotator with custom base name', () => {
|
|
39
|
+
logRotator = new LogRotator(tempLogDir, 'custom-log');
|
|
40
|
+
expect(logRotator).toBeDefined();
|
|
41
|
+
});
|
|
42
|
+
it('should create log directory if it does not exist', () => {
|
|
43
|
+
const newDir = path.join(tempLogDir, 'new-subdir');
|
|
44
|
+
logRotator = new LogRotator(newDir);
|
|
45
|
+
expect(fs.existsSync(newDir)).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
it('should create new log file path with timestamp format', () => {
|
|
48
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
|
|
49
|
+
const logPath = logRotator.createNewLogFilePath();
|
|
50
|
+
// Should match format: mcp-hub.YYYYMMDD_HHmmSSZZZ.log
|
|
51
|
+
const basename = path.basename(logPath);
|
|
52
|
+
expect(basename).toMatch(/^mcp-hub\.\d{8}_\d{9}\.log$/);
|
|
53
|
+
});
|
|
54
|
+
it('should create different file paths on subsequent calls', () => {
|
|
55
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
|
|
56
|
+
// Use fake timers to ensure different timestamps
|
|
57
|
+
const path1 = logRotator.createNewLogFilePath();
|
|
58
|
+
// Advance time by 1ms
|
|
59
|
+
vi.useFakeTimers();
|
|
60
|
+
vi.advanceTimersByTime(1);
|
|
61
|
+
const path2 = logRotator.createNewLogFilePath();
|
|
62
|
+
vi.useRealTimers();
|
|
63
|
+
expect(path1).not.toBe(path2);
|
|
64
|
+
});
|
|
65
|
+
it('should get latest log file path', () => {
|
|
66
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
|
|
67
|
+
// Create some log files
|
|
68
|
+
const file1 = path.join(tempLogDir, 'mcp-hub.20260301_100000000.log');
|
|
69
|
+
const file2 = path.join(tempLogDir, 'mcp-hub.20260301_110000000.log');
|
|
70
|
+
const file3 = path.join(tempLogDir, 'mcp-hub.20260301_120000000.log');
|
|
71
|
+
fs.writeFileSync(file1, 'test content');
|
|
72
|
+
fs.writeFileSync(file2, 'test content');
|
|
73
|
+
fs.writeFileSync(file3, 'test content');
|
|
74
|
+
const latest = logRotator.getLatestLogFilePath();
|
|
75
|
+
expect(latest).toBe(file3);
|
|
76
|
+
});
|
|
77
|
+
it('should return null for latest log file when none exist', () => {
|
|
78
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
|
|
79
|
+
const latest = logRotator.getLatestLogFilePath();
|
|
80
|
+
expect(latest).toBeNull();
|
|
81
|
+
});
|
|
82
|
+
it('should maintain backward compatibility with getCurrentLogFilePath', () => {
|
|
83
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
|
|
84
|
+
// When no files exist, getCurrentLogFilePath will create a new path (but not the file)
|
|
85
|
+
const path1 = logRotator.getCurrentLogFilePath();
|
|
86
|
+
expect(path.basename(path1)).toMatch(/^mcp-hub\.\d{8}_\d{9}\.log$/);
|
|
87
|
+
// Actually create the file on disk
|
|
88
|
+
fs.writeFileSync(path1, 'test content 1');
|
|
89
|
+
// Create an older file
|
|
90
|
+
const oldFile = path.join(tempLogDir, 'mcp-hub.20260301_100000000.log');
|
|
91
|
+
fs.writeFileSync(oldFile, 'test content 2');
|
|
92
|
+
// When files exist, getCurrentLogFilePath should return the latest one
|
|
93
|
+
const path2 = logRotator.getCurrentLogFilePath();
|
|
94
|
+
expect(path2).toBe(path1); // Should return the newer one we just created
|
|
95
|
+
});
|
|
96
|
+
it('should get current log file path with custom base name', () => {
|
|
97
|
+
logRotator = new LogRotator(tempLogDir, 'custom-log', undefined, () => originalConfig);
|
|
98
|
+
const currentPath = logRotator.createNewLogFilePath();
|
|
99
|
+
const basename = path.basename(currentPath);
|
|
100
|
+
expect(basename).toMatch(/^custom-log\.\d{8}_\d{9}\.log$/);
|
|
101
|
+
});
|
|
102
|
+
it('should parse retention days correctly for days', () => {
|
|
103
|
+
const configWithDays = createTestConfig({ rotationAge: '30d' });
|
|
104
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => configWithDays);
|
|
105
|
+
// @ts-expect-error - accessing private method for testing
|
|
106
|
+
const retentionDays = logRotator.getRetentionDays();
|
|
107
|
+
expect(retentionDays).toBe(30);
|
|
108
|
+
});
|
|
109
|
+
it('should parse retention days correctly for hours', () => {
|
|
110
|
+
const configWithHours = createTestConfig({ rotationAge: '48h' });
|
|
111
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => configWithHours);
|
|
112
|
+
// @ts-expect-error - accessing private method for testing
|
|
113
|
+
const retentionDays = logRotator.getRetentionDays();
|
|
114
|
+
expect(retentionDays).toBe(2); // 48 hours = 2 days
|
|
115
|
+
});
|
|
116
|
+
it('should parse retention days correctly for minutes', () => {
|
|
117
|
+
const configWithMinutes = createTestConfig({ rotationAge: '1440m' });
|
|
118
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => configWithMinutes);
|
|
119
|
+
// @ts-expect-error - accessing private method for testing
|
|
120
|
+
const retentionDays = logRotator.getRetentionDays();
|
|
121
|
+
expect(retentionDays).toBe(1); // 1440 minutes = 1 day
|
|
122
|
+
});
|
|
123
|
+
it('should return default retention days for invalid format', () => {
|
|
124
|
+
const configWithInvalid = createTestConfig({ rotationAge: 'invalid' });
|
|
125
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => configWithInvalid);
|
|
126
|
+
// @ts-expect-error - accessing private method for testing
|
|
127
|
+
const retentionDays = logRotator.getRetentionDays();
|
|
128
|
+
expect(retentionDays).toBe(7); // default
|
|
129
|
+
});
|
|
130
|
+
it('should use default 7 days when no config provided', () => {
|
|
131
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub');
|
|
132
|
+
// @ts-expect-error - accessing private method for testing
|
|
133
|
+
const retentionDays = logRotator.getRetentionDays();
|
|
134
|
+
expect(retentionDays).toBe(7); // default
|
|
135
|
+
});
|
|
136
|
+
it('should extract date from new format filename correctly', () => {
|
|
137
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
|
|
138
|
+
const filename = 'mcp-hub.20251201_143022123.log';
|
|
139
|
+
// @ts-expect-error - accessing private method for testing
|
|
140
|
+
const date = logRotator.extractDateFromFilename(filename);
|
|
141
|
+
expect(date).toBeInstanceOf(Date);
|
|
142
|
+
expect(date?.getFullYear()).toBe(2025);
|
|
143
|
+
expect(date?.getMonth()).toBe(11); // months are 0-indexed
|
|
144
|
+
expect(date?.getDate()).toBe(1);
|
|
145
|
+
expect(date?.getHours()).toBe(14);
|
|
146
|
+
expect(date?.getMinutes()).toBe(30);
|
|
147
|
+
expect(date?.getSeconds()).toBe(22);
|
|
148
|
+
expect(date?.getMilliseconds()).toBe(123);
|
|
149
|
+
});
|
|
150
|
+
it('should extract date from old format filename correctly (backward compatibility)', () => {
|
|
151
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
|
|
152
|
+
const filename = 'mcp-hub.2025-12-01.log';
|
|
153
|
+
// @ts-expect-error - accessing private method for testing
|
|
154
|
+
const date = logRotator.extractDateFromFilename(filename);
|
|
155
|
+
expect(date).toBeInstanceOf(Date);
|
|
156
|
+
expect(date?.getFullYear()).toBe(2025);
|
|
157
|
+
expect(date?.getMonth()).toBe(11); // months are 0-indexed
|
|
158
|
+
expect(date?.getDate()).toBe(1);
|
|
159
|
+
});
|
|
160
|
+
it('should return null for invalid filename', () => {
|
|
161
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
|
|
162
|
+
const filename = 'invalid-filename.txt';
|
|
163
|
+
// @ts-expect-error - accessing private method for testing
|
|
164
|
+
const date = logRotator.extractDateFromFilename(filename);
|
|
165
|
+
expect(date).toBeNull();
|
|
166
|
+
});
|
|
167
|
+
it('should get log files sorted by date (newest first)', () => {
|
|
168
|
+
// Create mock log files with new format
|
|
169
|
+
const newFormatDates = ['20260301_100000000', '20260301_120000000', '20260301_110000000'];
|
|
170
|
+
for (const date of newFormatDates) {
|
|
171
|
+
const filePath = path.join(tempLogDir, `mcp-hub.${date}.log`);
|
|
172
|
+
fs.writeFileSync(filePath, 'test content');
|
|
173
|
+
}
|
|
174
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
|
|
175
|
+
const logFiles = logRotator.getLogFiles();
|
|
176
|
+
expect(logFiles).toHaveLength(3);
|
|
177
|
+
// Should be sorted newest first
|
|
178
|
+
expect(path.basename(logFiles[0])).toBe('mcp-hub.20260301_120000000.log');
|
|
179
|
+
expect(path.basename(logFiles[1])).toBe('mcp-hub.20260301_110000000.log');
|
|
180
|
+
expect(path.basename(logFiles[2])).toBe('mcp-hub.20260301_100000000.log');
|
|
181
|
+
});
|
|
182
|
+
it('should sort mixed format log files correctly', () => {
|
|
183
|
+
// Create both old and new format files
|
|
184
|
+
const oldFile = path.join(tempLogDir, 'mcp-hub.2026-02-28.log');
|
|
185
|
+
const newFile1 = path.join(tempLogDir, 'mcp-hub.20260301_100000000.log');
|
|
186
|
+
const newFile2 = path.join(tempLogDir, 'mcp-hub.20260301_120000000.log');
|
|
187
|
+
fs.writeFileSync(oldFile, 'old format');
|
|
188
|
+
fs.writeFileSync(newFile1, 'new format 1');
|
|
189
|
+
fs.writeFileSync(newFile2, 'new format 2');
|
|
190
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
|
|
191
|
+
const logFiles = logRotator.getLogFiles();
|
|
192
|
+
expect(logFiles).toHaveLength(3);
|
|
193
|
+
expect(path.basename(logFiles[0])).toBe('mcp-hub.20260301_120000000.log');
|
|
194
|
+
expect(path.basename(logFiles[1])).toBe('mcp-hub.20260301_100000000.log');
|
|
195
|
+
expect(path.basename(logFiles[2])).toBe('mcp-hub.2026-02-28.log');
|
|
196
|
+
});
|
|
197
|
+
it('should handle empty log directory', () => {
|
|
198
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
|
|
199
|
+
const logFiles = logRotator.getLogFiles();
|
|
200
|
+
expect(logFiles).toHaveLength(0);
|
|
201
|
+
});
|
|
202
|
+
it('should rotate logs and remove old files', () => {
|
|
203
|
+
// Create old log files (beyond retention period)
|
|
204
|
+
const oldDate = new Date('2025-01-01'); // Fixed date in the past
|
|
205
|
+
const oldFilePath = path.join(tempLogDir, 'mcp-hub.20250101_100000000.log');
|
|
206
|
+
fs.writeFileSync(oldFilePath, 'old log content');
|
|
207
|
+
// Set file modification time to old date
|
|
208
|
+
fs.utimesSync(oldFilePath, oldDate, oldDate);
|
|
209
|
+
// Create recent log file (within retention period)
|
|
210
|
+
const recentFilePath = path.join(tempLogDir, 'mcp-hub.20260301_100000000.log');
|
|
211
|
+
fs.writeFileSync(recentFilePath, 'recent log content');
|
|
212
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
|
|
213
|
+
logRotator.rotateLogs();
|
|
214
|
+
// Old file should be deleted, recent file should remain
|
|
215
|
+
expect(fs.existsSync(oldFilePath)).toBe(false);
|
|
216
|
+
expect(fs.existsSync(recentFilePath)).toBe(true);
|
|
217
|
+
});
|
|
218
|
+
it('should handle rotation errors gracefully', () => {
|
|
219
|
+
// Mock fs.readdirSync to throw an error
|
|
220
|
+
const readdirSyncSpy = vi.spyOn(fs, 'readdirSync').mockImplementation(() => {
|
|
221
|
+
throw new Error('Permission denied');
|
|
222
|
+
});
|
|
223
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
|
|
224
|
+
// Should not throw an error
|
|
225
|
+
expect(() => logRotator.rotateLogs()).not.toThrow();
|
|
226
|
+
readdirSyncSpy.mockRestore();
|
|
227
|
+
});
|
|
228
|
+
it('should handle getLogFiles errors gracefully', () => {
|
|
229
|
+
// Mock fs.readdirSync to throw an error
|
|
230
|
+
const readdirSyncSpy = vi.spyOn(fs, 'readdirSync').mockImplementation(() => {
|
|
231
|
+
throw new Error('Permission denied');
|
|
232
|
+
});
|
|
233
|
+
logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
|
|
234
|
+
const logFiles = logRotator.getLogFiles();
|
|
235
|
+
expect(logFiles).toHaveLength(0);
|
|
236
|
+
readdirSyncSpy.mockRestore();
|
|
237
|
+
});
|
|
238
|
+
describe('with custom config', () => {
|
|
239
|
+
it('should create log rotator with custom configuration', () => {
|
|
240
|
+
logRotator = new LogRotator(tempLogDir, 'custom-log', { rotationAge: '14d' });
|
|
241
|
+
expect(logRotator).toBeDefined();
|
|
242
|
+
});
|
|
243
|
+
it('should use custom rotation age when provided', () => {
|
|
244
|
+
logRotator = new LogRotator(tempLogDir, 'custom-log', { rotationAge: '30d' });
|
|
245
|
+
// @ts-expect-error - accessing private method for testing
|
|
246
|
+
const retentionDays = logRotator.getRetentionDays();
|
|
247
|
+
expect(retentionDays).toBe(30);
|
|
248
|
+
});
|
|
249
|
+
it('should parse custom rotation age in hours', () => {
|
|
250
|
+
logRotator = new LogRotator(tempLogDir, 'custom-log', { rotationAge: '48h' });
|
|
251
|
+
// @ts-expect-error - accessing private method for testing
|
|
252
|
+
const retentionDays = logRotator.getRetentionDays();
|
|
253
|
+
expect(retentionDays).toBe(2);
|
|
254
|
+
});
|
|
255
|
+
it('should parse custom rotation age in minutes', () => {
|
|
256
|
+
logRotator = new LogRotator(tempLogDir, 'custom-log', { rotationAge: '2880m' });
|
|
257
|
+
// @ts-expect-error - accessing private method for testing
|
|
258
|
+
const retentionDays = logRotator.getRetentionDays();
|
|
259
|
+
expect(retentionDays).toBe(2); // 2880 minutes = 2 days
|
|
260
|
+
});
|
|
261
|
+
it('should return default 7 days for invalid custom format', () => {
|
|
262
|
+
logRotator = new LogRotator(tempLogDir, 'custom-log', { rotationAge: 'invalid' });
|
|
263
|
+
// @ts-expect-error - accessing private method for testing
|
|
264
|
+
const retentionDays = logRotator.getRetentionDays();
|
|
265
|
+
expect(retentionDays).toBe(7);
|
|
266
|
+
});
|
|
267
|
+
it('should use default 7 days when no custom rotation age provided', () => {
|
|
268
|
+
logRotator = new LogRotator(tempLogDir, 'custom-log', {});
|
|
269
|
+
// @ts-expect-error - accessing private method for testing
|
|
270
|
+
const retentionDays = logRotator.getRetentionDays();
|
|
271
|
+
expect(retentionDays).toBe(7);
|
|
272
|
+
});
|
|
273
|
+
it('should create new log file path with custom base name and custom config', () => {
|
|
274
|
+
logRotator = new LogRotator(tempLogDir, 'dev-server', { rotationAge: '7d' });
|
|
275
|
+
const logPath = logRotator.createNewLogFilePath();
|
|
276
|
+
const basename = path.basename(logPath);
|
|
277
|
+
expect(basename).toMatch(/^dev-server\.\d{8}_\d{9}\.log$/);
|
|
278
|
+
});
|
|
279
|
+
it('should rotate logs with custom retention period', () => {
|
|
280
|
+
// Create old log files (beyond custom 2-day retention period)
|
|
281
|
+
const oldDate = new Date();
|
|
282
|
+
oldDate.setDate(oldDate.getDate() - 3); // 3 days old
|
|
283
|
+
const oldFilePath = path.join(tempLogDir, 'dev-server.20260228_100000000.log');
|
|
284
|
+
fs.writeFileSync(oldFilePath, 'old log content');
|
|
285
|
+
fs.utimesSync(oldFilePath, oldDate, oldDate);
|
|
286
|
+
// Create recent log file (within custom 2-day retention period)
|
|
287
|
+
const recentFilePath = path.join(tempLogDir, 'dev-server.20260301_100000000.log');
|
|
288
|
+
fs.writeFileSync(recentFilePath, 'recent log content');
|
|
289
|
+
logRotator = new LogRotator(tempLogDir, 'dev-server', { rotationAge: '2d' });
|
|
290
|
+
logRotator.rotateLogs();
|
|
291
|
+
// Old file should be deleted, recent file should remain
|
|
292
|
+
expect(fs.existsSync(oldFilePath)).toBe(false);
|
|
293
|
+
expect(fs.existsSync(recentFilePath)).toBe(true);
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/utils/logger.test.ts"],"names":[],"mappings":""}
|