@loop_ouroboros/mcp-hub-lite 1.0.2 → 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 +32 -0
- package/dist/client/assets/{HomeView-7rMg9C6t.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-5q1b0P3O.js → _baseClone-Bp9Rjwd7.js} +1 -1
- 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-H85n3BUC.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-DPsOVNIJ.js → omit-CqPQN3XP.js} +1 -1
- package/dist/client/assets/{raf-DY5mgbuB.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 +362 -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 +1 -57
- package/dist/server/shared/models/session.model.d.ts.map +1 -1
- package/dist/server/shared/models/session.model.js +1 -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/session-context.types.d.ts +0 -2
- package/dist/server/shared/types/session-context.types.d.ts.map +1 -1
- 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/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 +19 -50
- package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -1
- package/dist/server/src/api/mcp/session-context-extractor.js +5 -14
- 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/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 -2
- 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 -104
- package/dist/server/src/config/config.schema.d.ts.map +1 -1
- package/dist/server/src/config/config.schema.js +15 -99
- 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/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/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 +10 -81
- 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 +24 -1
- 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 -39
- 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-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 -585
- package/dist/server/src/services/session-tracker.service.d.ts +2 -10
- package/dist/server/src/services/session-tracker.service.d.ts.map +1 -1
- package/dist/server/src/services/session-tracker.service.js +2 -53
- 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 +4 -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-formatter.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.js +82 -5
- package/dist/server/src/utils/logger/log-modules.d.ts +15 -9
- package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-modules.js +8 -6
- 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 +0 -18
- package/dist/server/src/utils/request-context.d.ts.map +1 -1
- package/dist/server/src/utils/request-context.js +0 -20
- 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/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 +31 -11
- 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 +2 -2
- 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/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 -320
- 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 +18 -18
- 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/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 +5 -24
- 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-Bf-1ffbk.js +0 -1
- package/dist/client/assets/ResourcesView-CjMklkyv.css +0 -1
- package/dist/client/assets/ResourcesView-g5x4xCPh.js +0 -1
- package/dist/client/assets/ServerDashboard-Chpne8Q0.css +0 -1
- package/dist/client/assets/ServerDashboard-G8Wmp4hF.js +0 -2
- package/dist/client/assets/ServerListView-dV2XrPjo.js +0 -32
- package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +0 -1
- package/dist/client/assets/SessionsView-Ckd38lj1.js +0 -1
- package/dist/client/assets/SettingsView-BJUdepEQ.js +0 -1
- package/dist/client/assets/ToolCallDialog-C_bTCpHC.js +0 -1
- package/dist/client/assets/ToolsView-0c2eputu.js +0 -1
- package/dist/client/assets/el-form-item-BVMLpmVC.css +0 -1
- package/dist/client/assets/el-form-item-ClFnj49k.js +0 -12
- package/dist/client/assets/el-input-CDnuSKVZ.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-CzMkXyYy.js +0 -1
- package/dist/client/assets/el-select-DvjGddk_.js +0 -1
- package/dist/client/assets/el-tab-pane-C_DQMcwe.js +0 -1
- package/dist/client/assets/el-table-column-CASRIbZM.js +0 -1
- package/dist/client/assets/el-table-column-T_mV9jNw.css +0 -1
- package/dist/client/assets/el-tag-DjxZVOpb.css +0 -1
- package/dist/client/assets/el-tag-npbwux4f.js +0 -1
- package/dist/client/assets/index-CCnAxNF8.js +0 -2
- package/dist/client/assets/index-d1DZeSfz.js +0 -1
- package/dist/client/assets/vnode-CHomNjgN.js +0 -1
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
import { describe, it, expect
|
|
2
|
-
import
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import os from 'node:os';
|
|
5
|
-
import { SessionStateSchema, SessionStoreSchema, createEmptySessionStore, validateSessionStore } from '../../../shared/models/session.model.js';
|
|
6
|
-
// Reset module cache
|
|
7
|
-
vi.resetModules();
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { SessionStateSchema } from '../../../shared/models/session.model.js';
|
|
8
3
|
describe('Session Model', () => {
|
|
9
4
|
describe('SessionStateSchema', () => {
|
|
10
5
|
it('should validate a valid session state', () => {
|
|
@@ -12,8 +7,6 @@ describe('Session Model', () => {
|
|
|
12
7
|
sessionId: 'test-session-123',
|
|
13
8
|
clientName: 'test-client',
|
|
14
9
|
clientVersion: '1.0.0',
|
|
15
|
-
cwd: '/path/to/project',
|
|
16
|
-
project: 'test-project',
|
|
17
10
|
createdAt: Date.now(),
|
|
18
11
|
lastAccessedAt: Date.now(),
|
|
19
12
|
metadata: {}
|
|
@@ -32,7 +25,6 @@ describe('Session Model', () => {
|
|
|
32
25
|
};
|
|
33
26
|
expect(minimalState.sessionId).toBe('test-session');
|
|
34
27
|
expect(minimalState.clientName).toBeUndefined();
|
|
35
|
-
expect(minimalState.cwd).toBeUndefined();
|
|
36
28
|
});
|
|
37
29
|
it('should handle metadata with arbitrary keys', () => {
|
|
38
30
|
const stateWithMetadata = {
|
|
@@ -48,434 +40,32 @@ describe('Session Model', () => {
|
|
|
48
40
|
expect(stateWithMetadata.metadata.customKey).toBe('customValue');
|
|
49
41
|
expect(stateWithMetadata.metadata.numericKey).toBe(123);
|
|
50
42
|
});
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
version: '1.0.0',
|
|
61
|
-
sessions: {
|
|
62
|
-
'session-1': {
|
|
63
|
-
sessionId: 'session-1',
|
|
64
|
-
createdAt: Date.now(),
|
|
65
|
-
lastAccessedAt: Date.now(),
|
|
66
|
-
metadata: {}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
43
|
+
it('should support SessionState type with all optional fields', () => {
|
|
44
|
+
// Test full version
|
|
45
|
+
const fullState = {
|
|
46
|
+
sessionId: 'full-session-001',
|
|
47
|
+
clientName: 'test-client',
|
|
48
|
+
clientVersion: '1.0.0',
|
|
49
|
+
createdAt: Date.now(),
|
|
50
|
+
lastAccessedAt: Date.now(),
|
|
51
|
+
metadata: { foo: 'bar', count: 42 }
|
|
69
52
|
};
|
|
70
|
-
expect(
|
|
71
|
-
expect(
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
sessionId: 'session-1',
|
|
79
|
-
createdAt: Date.now(),
|
|
80
|
-
lastAccessedAt: Date.now(),
|
|
81
|
-
metadata: {}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
53
|
+
expect(fullState.sessionId).toBe('full-session-001');
|
|
54
|
+
expect(fullState.clientName).toBe('test-client');
|
|
55
|
+
// Test minimal version
|
|
56
|
+
const minimalState = {
|
|
57
|
+
sessionId: 'minimal-session-001',
|
|
58
|
+
createdAt: Date.now(),
|
|
59
|
+
lastAccessedAt: Date.now(),
|
|
60
|
+
metadata: {}
|
|
84
61
|
};
|
|
85
|
-
|
|
86
|
-
expect(
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
expect(validated.version).toBe('1.0.0');
|
|
93
|
-
expect(validated.sessions).toEqual({});
|
|
62
|
+
expect(minimalState.sessionId).toBe('minimal-session-001');
|
|
63
|
+
expect(minimalState.clientName).toBeUndefined();
|
|
64
|
+
// Verify Schema validation
|
|
65
|
+
const fullResult = SessionStateSchema.safeParse(fullState);
|
|
66
|
+
const minimalResult = SessionStateSchema.safeParse(minimalState);
|
|
67
|
+
expect(fullResult.success).toBe(true);
|
|
68
|
+
expect(minimalResult.success).toBe(true);
|
|
94
69
|
});
|
|
95
70
|
});
|
|
96
71
|
});
|
|
97
|
-
describe('Session Persistence', () => {
|
|
98
|
-
let tempDir;
|
|
99
|
-
let sessionsPath;
|
|
100
|
-
let originalEnv;
|
|
101
|
-
beforeEach(() => {
|
|
102
|
-
originalEnv = { ...process.env };
|
|
103
|
-
// Create temporary directory
|
|
104
|
-
const testRunId = `session-test-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`;
|
|
105
|
-
tempDir = path.join(os.tmpdir(), `mcp-hub-session-test-${testRunId}`);
|
|
106
|
-
sessionsPath = path.join(tempDir, 'sessions');
|
|
107
|
-
fs.mkdirSync(tempDir, { recursive: true });
|
|
108
|
-
// Set environment variables
|
|
109
|
-
process.env.MCP_HUB_CONFIG_PATH = path.join(tempDir, '.mcp-hub.json');
|
|
110
|
-
});
|
|
111
|
-
afterEach(() => {
|
|
112
|
-
// Restore environment variables
|
|
113
|
-
process.env = { ...originalEnv };
|
|
114
|
-
// Clean up temporary directory
|
|
115
|
-
if (fs.existsSync(tempDir)) {
|
|
116
|
-
let retries = 3;
|
|
117
|
-
while (retries > 0) {
|
|
118
|
-
try {
|
|
119
|
-
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
120
|
-
break;
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
console.warn(`Failed to clean up test temp directory (retries left: ${retries - 1}): ${error}`);
|
|
124
|
-
retries--;
|
|
125
|
-
if (retries > 0) {
|
|
126
|
-
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
vi.restoreAllMocks();
|
|
132
|
-
});
|
|
133
|
-
it('should create directory if it does not exist when saving', () => {
|
|
134
|
-
const testStore = {
|
|
135
|
-
version: '1.0.0',
|
|
136
|
-
sessions: {
|
|
137
|
-
'test-session': {
|
|
138
|
-
sessionId: 'test-session',
|
|
139
|
-
createdAt: Date.now(),
|
|
140
|
-
lastAccessedAt: Date.now(),
|
|
141
|
-
metadata: {}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
// Ensure directory doesn't exist
|
|
146
|
-
if (fs.existsSync(sessionsPath)) {
|
|
147
|
-
fs.rmSync(sessionsPath, { recursive: true, force: true });
|
|
148
|
-
}
|
|
149
|
-
// Simulate save operation - create sessions directory
|
|
150
|
-
if (!fs.existsSync(sessionsPath)) {
|
|
151
|
-
fs.mkdirSync(sessionsPath, { recursive: true });
|
|
152
|
-
}
|
|
153
|
-
// Save individual session file
|
|
154
|
-
const sessionPath = path.join(sessionsPath, 'test-session.json');
|
|
155
|
-
fs.writeFileSync(sessionPath, JSON.stringify(testStore.sessions['test-session'], null, 2));
|
|
156
|
-
// Save index file
|
|
157
|
-
const indexPath = path.join(sessionsPath, 'index.json');
|
|
158
|
-
fs.writeFileSync(indexPath, JSON.stringify({ sessions: ['test-session'] }, null, 2));
|
|
159
|
-
// Verify directory and files were created
|
|
160
|
-
expect(fs.existsSync(sessionsPath)).toBe(true);
|
|
161
|
-
expect(fs.existsSync(sessionPath)).toBe(true);
|
|
162
|
-
expect(fs.existsSync(indexPath)).toBe(true);
|
|
163
|
-
const savedSession = JSON.parse(fs.readFileSync(sessionPath, 'utf-8'));
|
|
164
|
-
expect(savedSession.sessionId).toBe('test-session');
|
|
165
|
-
const savedIndex = JSON.parse(fs.readFileSync(indexPath, 'utf-8'));
|
|
166
|
-
expect(savedIndex.sessions).toContain('test-session');
|
|
167
|
-
});
|
|
168
|
-
it('should read existing sessions directory', () => {
|
|
169
|
-
// Create sessions directory
|
|
170
|
-
if (!fs.existsSync(sessionsPath)) {
|
|
171
|
-
fs.mkdirSync(sessionsPath, { recursive: true });
|
|
172
|
-
}
|
|
173
|
-
// Create individual session files
|
|
174
|
-
const session1Path = path.join(sessionsPath, 'session-1.json');
|
|
175
|
-
const session2Path = path.join(sessionsPath, 'session-2.json');
|
|
176
|
-
fs.writeFileSync(session1Path, JSON.stringify({
|
|
177
|
-
sessionId: 'session-1',
|
|
178
|
-
clientName: 'test-client',
|
|
179
|
-
createdAt: 1234567890,
|
|
180
|
-
lastAccessedAt: 1234567890,
|
|
181
|
-
metadata: {}
|
|
182
|
-
}, null, 2));
|
|
183
|
-
fs.writeFileSync(session2Path, JSON.stringify({
|
|
184
|
-
sessionId: 'session-2',
|
|
185
|
-
clientName: 'another-client',
|
|
186
|
-
createdAt: 9876543210,
|
|
187
|
-
lastAccessedAt: 9876543210,
|
|
188
|
-
metadata: {}
|
|
189
|
-
}, null, 2));
|
|
190
|
-
// Create index file
|
|
191
|
-
const indexPath = path.join(sessionsPath, 'index.json');
|
|
192
|
-
fs.writeFileSync(indexPath, JSON.stringify({
|
|
193
|
-
sessions: ['session-1', 'session-2']
|
|
194
|
-
}, null, 2));
|
|
195
|
-
// Simulate load operation
|
|
196
|
-
const indexContent = JSON.parse(fs.readFileSync(indexPath, 'utf-8'));
|
|
197
|
-
const loadedSessions = {};
|
|
198
|
-
for (const sessionId of indexContent.sessions) {
|
|
199
|
-
const sessionPath = path.join(sessionsPath, `${sessionId}.json`);
|
|
200
|
-
const sessionContent = JSON.parse(fs.readFileSync(sessionPath, 'utf-8'));
|
|
201
|
-
loadedSessions[sessionId] = sessionContent;
|
|
202
|
-
}
|
|
203
|
-
const loadedStore = {
|
|
204
|
-
version: '1.0.0',
|
|
205
|
-
sessions: loadedSessions
|
|
206
|
-
};
|
|
207
|
-
const validated = validateSessionStore(loadedStore);
|
|
208
|
-
expect(validated.version).toBe('1.0.0');
|
|
209
|
-
expect(Object.keys(validated.sessions)).toHaveLength(2);
|
|
210
|
-
expect(validated.sessions['session-1'].clientName).toBe('test-client');
|
|
211
|
-
expect(validated.sessions['session-2'].clientName).toBe('another-client');
|
|
212
|
-
});
|
|
213
|
-
it('should handle missing sessions directory gracefully', () => {
|
|
214
|
-
if (fs.existsSync(sessionsPath)) {
|
|
215
|
-
fs.rmSync(sessionsPath, { recursive: true, force: true });
|
|
216
|
-
}
|
|
217
|
-
const store = createEmptySessionStore();
|
|
218
|
-
expect(store.version).toBe('1.0.0');
|
|
219
|
-
expect(store.sessions).toEqual({});
|
|
220
|
-
});
|
|
221
|
-
it('should handle invalid JSON in session files', () => {
|
|
222
|
-
// Create sessions directory
|
|
223
|
-
if (!fs.existsSync(sessionsPath)) {
|
|
224
|
-
fs.mkdirSync(sessionsPath, { recursive: true });
|
|
225
|
-
}
|
|
226
|
-
// Create invalid session file
|
|
227
|
-
const sessionPath = path.join(sessionsPath, 'invalid-session.json');
|
|
228
|
-
fs.writeFileSync(sessionPath, 'invalid json content');
|
|
229
|
-
// Create index file
|
|
230
|
-
const indexPath = path.join(sessionsPath, 'index.json');
|
|
231
|
-
fs.writeFileSync(indexPath, JSON.stringify({
|
|
232
|
-
sessions: ['invalid-session']
|
|
233
|
-
}, null, 2));
|
|
234
|
-
const content = fs.readFileSync(sessionPath, 'utf-8');
|
|
235
|
-
expect(() => JSON.parse(content)).toThrow();
|
|
236
|
-
// Verify it returns empty store when validation fails
|
|
237
|
-
const store = validateSessionStore(null);
|
|
238
|
-
expect(store.version).toBe('1.0.0');
|
|
239
|
-
expect(store.sessions).toEqual({});
|
|
240
|
-
});
|
|
241
|
-
it('should update sessions incrementally', () => {
|
|
242
|
-
// Create sessions directory
|
|
243
|
-
if (!fs.existsSync(sessionsPath)) {
|
|
244
|
-
fs.mkdirSync(sessionsPath, { recursive: true });
|
|
245
|
-
}
|
|
246
|
-
// Initial session
|
|
247
|
-
const session1Path = path.join(sessionsPath, 'session-1.json');
|
|
248
|
-
fs.writeFileSync(session1Path, JSON.stringify({
|
|
249
|
-
sessionId: 'session-1',
|
|
250
|
-
createdAt: 1234567890,
|
|
251
|
-
lastAccessedAt: 1234567890,
|
|
252
|
-
metadata: {}
|
|
253
|
-
}, null, 2));
|
|
254
|
-
// Create initial index
|
|
255
|
-
const indexPath = path.join(sessionsPath, 'index.json');
|
|
256
|
-
fs.writeFileSync(indexPath, JSON.stringify({
|
|
257
|
-
sessions: ['session-1']
|
|
258
|
-
}, null, 2));
|
|
259
|
-
// Add second session
|
|
260
|
-
const session2Path = path.join(sessionsPath, 'session-2.json');
|
|
261
|
-
fs.writeFileSync(session2Path, JSON.stringify({
|
|
262
|
-
sessionId: 'session-2',
|
|
263
|
-
createdAt: 9876543210,
|
|
264
|
-
lastAccessedAt: 9876543210,
|
|
265
|
-
metadata: {}
|
|
266
|
-
}, null, 2));
|
|
267
|
-
// Update index to include both sessions
|
|
268
|
-
fs.writeFileSync(indexPath, JSON.stringify({
|
|
269
|
-
sessions: ['session-1', 'session-2']
|
|
270
|
-
}, null, 2));
|
|
271
|
-
// Verify both sessions exist
|
|
272
|
-
expect(fs.existsSync(session1Path)).toBe(true);
|
|
273
|
-
expect(fs.existsSync(session2Path)).toBe(true);
|
|
274
|
-
const session1Content = JSON.parse(fs.readFileSync(session1Path, 'utf-8'));
|
|
275
|
-
const session2Content = JSON.parse(fs.readFileSync(session2Path, 'utf-8'));
|
|
276
|
-
expect(session1Content.sessionId).toBe('session-1');
|
|
277
|
-
expect(session2Content.sessionId).toBe('session-2');
|
|
278
|
-
});
|
|
279
|
-
it('should remove sessions when deleted', () => {
|
|
280
|
-
// Create sessions directory
|
|
281
|
-
if (!fs.existsSync(sessionsPath)) {
|
|
282
|
-
fs.mkdirSync(sessionsPath, { recursive: true });
|
|
283
|
-
}
|
|
284
|
-
// Create initial sessions
|
|
285
|
-
const session1Path = path.join(sessionsPath, 'session-1.json');
|
|
286
|
-
const session2Path = path.join(sessionsPath, 'session-2.json');
|
|
287
|
-
fs.writeFileSync(session1Path, JSON.stringify({
|
|
288
|
-
sessionId: 'session-1',
|
|
289
|
-
createdAt: 1234567890,
|
|
290
|
-
lastAccessedAt: 1234567890,
|
|
291
|
-
metadata: {}
|
|
292
|
-
}, null, 2));
|
|
293
|
-
fs.writeFileSync(session2Path, JSON.stringify({
|
|
294
|
-
sessionId: 'session-2',
|
|
295
|
-
createdAt: 9876543210,
|
|
296
|
-
lastAccessedAt: 9876543210,
|
|
297
|
-
metadata: {}
|
|
298
|
-
}, null, 2));
|
|
299
|
-
// Create initial index
|
|
300
|
-
const indexPath = path.join(sessionsPath, 'index.json');
|
|
301
|
-
fs.writeFileSync(indexPath, JSON.stringify({
|
|
302
|
-
sessions: ['session-1', 'session-2']
|
|
303
|
-
}, null, 2));
|
|
304
|
-
// Delete session-1 (remove file and update index)
|
|
305
|
-
fs.unlinkSync(session1Path);
|
|
306
|
-
// Update index to only include session-2
|
|
307
|
-
fs.writeFileSync(indexPath, JSON.stringify({
|
|
308
|
-
sessions: ['session-2']
|
|
309
|
-
}, null, 2));
|
|
310
|
-
// Verify session-1 has been deleted
|
|
311
|
-
expect(fs.existsSync(session1Path)).toBe(false);
|
|
312
|
-
expect(fs.existsSync(session2Path)).toBe(true);
|
|
313
|
-
const finalIndex = JSON.parse(fs.readFileSync(indexPath, 'utf-8'));
|
|
314
|
-
expect(finalIndex.sessions).toHaveLength(1);
|
|
315
|
-
expect(finalIndex.sessions).toContain('session-2');
|
|
316
|
-
expect(finalIndex.sessions).not.toContain('session-1');
|
|
317
|
-
});
|
|
318
|
-
});
|
|
319
|
-
describe('McpSessionManager with Real SDK', () => {
|
|
320
|
-
let tempDir;
|
|
321
|
-
let originalEnv;
|
|
322
|
-
beforeEach(() => {
|
|
323
|
-
originalEnv = { ...process.env };
|
|
324
|
-
// Create temporary directory
|
|
325
|
-
const testRunId = `session-mgr-test-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`;
|
|
326
|
-
tempDir = path.join(os.tmpdir(), `mcp-hub-session-mgr-test-${testRunId}`);
|
|
327
|
-
fs.mkdirSync(tempDir, { recursive: true });
|
|
328
|
-
// Set environment variables
|
|
329
|
-
process.env.MCP_HUB_CONFIG_PATH = path.join(tempDir, '.mcp-hub.json');
|
|
330
|
-
process.env.SESSION_FLUSH_INTERVAL = '100'; // Fast refresh for testing
|
|
331
|
-
});
|
|
332
|
-
afterEach(() => {
|
|
333
|
-
// Restore environment variables
|
|
334
|
-
process.env = { ...originalEnv };
|
|
335
|
-
// Clean up temporary directory
|
|
336
|
-
if (fs.existsSync(tempDir)) {
|
|
337
|
-
let retries = 3;
|
|
338
|
-
while (retries > 0) {
|
|
339
|
-
try {
|
|
340
|
-
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
341
|
-
break;
|
|
342
|
-
}
|
|
343
|
-
catch {
|
|
344
|
-
retries--;
|
|
345
|
-
if (retries > 0) {
|
|
346
|
-
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
vi.resetModules();
|
|
352
|
-
vi.restoreAllMocks();
|
|
353
|
-
});
|
|
354
|
-
it('should manually initialize transport._webStandardTransport for restored sessions', async () => {
|
|
355
|
-
// This test verifies the core fix logic in createSession method
|
|
356
|
-
// Use real SDK types to simulate actual runtime flow
|
|
357
|
-
// 1. Prepare test data - create real session state
|
|
358
|
-
const testSessionId = 'test-session-restore-001';
|
|
359
|
-
const testState = {
|
|
360
|
-
sessionId: testSessionId,
|
|
361
|
-
clientName: 'claude-code',
|
|
362
|
-
clientVersion: '1.0.0',
|
|
363
|
-
cwd: '/test/project/path',
|
|
364
|
-
project: 'test-project',
|
|
365
|
-
createdAt: Date.now() - 3600000,
|
|
366
|
-
lastAccessedAt: Date.now() - 60000,
|
|
367
|
-
metadata: {
|
|
368
|
-
restoredFromDisk: true,
|
|
369
|
-
testRun: 'integration-test'
|
|
370
|
-
}
|
|
371
|
-
};
|
|
372
|
-
// 2. Import real SDK types
|
|
373
|
-
// Note: We don't actually create SDK instances (to avoid side effects), but verify type compatibility
|
|
374
|
-
// Verify type import path exists
|
|
375
|
-
const { McpSessionManager: McpSessionManagerClass } = await import('../../../src/services/session/index.js');
|
|
376
|
-
const manager = new McpSessionManagerClass();
|
|
377
|
-
manager.sessionStates.set(testSessionId, testState);
|
|
378
|
-
// Verify state injection succeeded
|
|
379
|
-
expect(manager.sessionStates.has(testSessionId)).toBe(true);
|
|
380
|
-
const injectedState = manager.sessionStates.get(testSessionId);
|
|
381
|
-
expect(injectedState).toBeDefined();
|
|
382
|
-
if (injectedState) {
|
|
383
|
-
expect(injectedState.sessionId).toBe(testSessionId);
|
|
384
|
-
expect(injectedState.clientName).toBe('claude-code');
|
|
385
|
-
}
|
|
386
|
-
});
|
|
387
|
-
it('should persist and reload session states using SessionStore schema', async () => {
|
|
388
|
-
// This test verifies the complete persistence flow - using real SessionStore model
|
|
389
|
-
// 1. Create test session store
|
|
390
|
-
const sessionsPath = path.join(tempDir, 'sessions');
|
|
391
|
-
const sessionIds = ['session-abc-123', 'session-def-456', 'session-ghi-789'];
|
|
392
|
-
const sessions = {};
|
|
393
|
-
for (const id of sessionIds) {
|
|
394
|
-
sessions[id] = {
|
|
395
|
-
sessionId: id,
|
|
396
|
-
clientName: `client-${id}`,
|
|
397
|
-
clientVersion: '2.0.0',
|
|
398
|
-
cwd: `/workspace/project-${id}`,
|
|
399
|
-
createdAt: Date.now() - 7200000,
|
|
400
|
-
lastAccessedAt: Date.now() - 300000,
|
|
401
|
-
metadata: {
|
|
402
|
-
source: 'test-suite',
|
|
403
|
-
createdAt: new Date().toISOString()
|
|
404
|
-
}
|
|
405
|
-
};
|
|
406
|
-
}
|
|
407
|
-
const testStore = {
|
|
408
|
-
version: '1.0.0',
|
|
409
|
-
sessions
|
|
410
|
-
};
|
|
411
|
-
// 2. Save to disk - simulate real persistence flow
|
|
412
|
-
fs.mkdirSync(path.dirname(sessionsPath), { recursive: true });
|
|
413
|
-
fs.writeFileSync(sessionsPath, JSON.stringify(testStore, null, 2));
|
|
414
|
-
// 3. Verify can be parsed using SessionStoreSchema
|
|
415
|
-
const rawContent = fs.readFileSync(sessionsPath, 'utf-8');
|
|
416
|
-
const parsed = JSON.parse(rawContent);
|
|
417
|
-
const validated = SessionStoreSchema.safeParse(parsed);
|
|
418
|
-
expect(validated.success).toBe(true);
|
|
419
|
-
if (validated.success) {
|
|
420
|
-
expect(validated.data.version).toBe('1.0.0');
|
|
421
|
-
expect(Object.keys(validated.data.sessions)).toHaveLength(3);
|
|
422
|
-
for (const id of sessionIds) {
|
|
423
|
-
expect(validated.data.sessions[id]).toBeDefined();
|
|
424
|
-
expect(validated.data.sessions[id].sessionId).toBe(id);
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
});
|
|
428
|
-
it('should support SessionState type with all optional fields', () => {
|
|
429
|
-
// This test verifies SessionState type flexibility
|
|
430
|
-
// Test full version
|
|
431
|
-
const fullState = {
|
|
432
|
-
sessionId: 'full-session-001',
|
|
433
|
-
clientName: 'test-client',
|
|
434
|
-
clientVersion: '1.0.0',
|
|
435
|
-
cwd: '/test/path',
|
|
436
|
-
project: 'test-project',
|
|
437
|
-
createdAt: Date.now(),
|
|
438
|
-
lastAccessedAt: Date.now(),
|
|
439
|
-
metadata: { foo: 'bar', count: 42 }
|
|
440
|
-
};
|
|
441
|
-
expect(fullState.sessionId).toBe('full-session-001');
|
|
442
|
-
expect(fullState.clientName).toBe('test-client');
|
|
443
|
-
// Test minimal version
|
|
444
|
-
const minimalState = {
|
|
445
|
-
sessionId: 'minimal-session-001',
|
|
446
|
-
createdAt: Date.now(),
|
|
447
|
-
lastAccessedAt: Date.now(),
|
|
448
|
-
metadata: {}
|
|
449
|
-
};
|
|
450
|
-
expect(minimalState.sessionId).toBe('minimal-session-001');
|
|
451
|
-
expect(minimalState.clientName).toBeUndefined();
|
|
452
|
-
// Verify Schema validation
|
|
453
|
-
const fullResult = SessionStateSchema.safeParse(fullState);
|
|
454
|
-
const minimalResult = SessionStateSchema.safeParse(minimalState);
|
|
455
|
-
expect(fullResult.success).toBe(true);
|
|
456
|
-
expect(minimalResult.success).toBe(true);
|
|
457
|
-
});
|
|
458
|
-
it('should integrate with real StreamableHTTPServerTransport structure', () => {
|
|
459
|
-
// This test verifies our fix is compatible with SDK's actual structure
|
|
460
|
-
// Verify the property paths we access are reasonable
|
|
461
|
-
// _webStandardTransport, sessionId, _initialized - these all actually exist in SDK
|
|
462
|
-
// We don't actually create SDK instances (may have side effects), but verify logical consistency of paths
|
|
463
|
-
// 1. Verify expected transport structure (based on our SDK code analysis)
|
|
464
|
-
const expectedTransportStructure = {
|
|
465
|
-
_webStandardTransport: {
|
|
466
|
-
sessionId: 'test-session-id',
|
|
467
|
-
_initialized: true
|
|
468
|
-
}
|
|
469
|
-
};
|
|
470
|
-
const mockTransport = expectedTransportStructure;
|
|
471
|
-
// This is what we do in the actual code
|
|
472
|
-
const webTransport = mockTransport._webStandardTransport;
|
|
473
|
-
expect(webTransport).toBeDefined();
|
|
474
|
-
if (webTransport) {
|
|
475
|
-
webTransport.sessionId = 'new-session-id';
|
|
476
|
-
webTransport._initialized = true;
|
|
477
|
-
expect(webTransport.sessionId).toBe('new-session-id');
|
|
478
|
-
expect(webTransport._initialized).toBe(true);
|
|
479
|
-
}
|
|
480
|
-
});
|
|
481
|
-
});
|