@loop_ouroboros/mcp-hub-lite 1.3.0 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +59 -0
- package/README.md +410 -331
- package/dist/client/assets/{HomeView-Bi2bkUKf.js → HomeView-DplI3V-h.js} +1 -1
- package/dist/client/assets/{ResourceDetailView-DyuSovH9.js → ResourceDetailView-CeHPn99Y.js} +1 -1
- package/dist/client/assets/ResourcesView-C1ObRhYS.js +1 -0
- package/dist/client/assets/{ServerDashboard-BGyyZAti.js → ServerDashboard-D7wG4Gvt.js} +1 -1
- package/dist/client/assets/ServerDetail-G23phOcJ.js +2 -0
- package/dist/client/assets/{ServerListView-yQPVJFHG.js → ServerListView-BFiZLtPO.js} +1 -1
- package/dist/client/assets/{ServerStatusTags.vue_vue_type_script_setup_true_lang-C8gQlxGE.js → ServerStatusTags.vue_vue_type_script_setup_true_lang-Deb_SbFw.js} +1 -1
- package/dist/client/assets/SettingsView-QBFLZ6fP.js +1 -0
- package/dist/client/assets/ToolCallDialog-DYS-ADCL.js +1 -0
- package/dist/client/assets/ToolsView-DYwgtm7W.js +1 -0
- package/dist/client/assets/_baseClone-DQno9YO3.js +1 -0
- package/dist/client/assets/{el-form-item-DfWq_kSy.js → el-form-item-DF0zzQdH.js} +2 -2
- package/dist/client/assets/el-input-C_p2Qw42.js +1 -0
- package/dist/client/assets/el-loading-BaenpNzU.js +1 -0
- package/dist/client/assets/el-overlay-MbIUXSQ7.js +1 -0
- package/dist/client/assets/el-radio-group-COnCjCcz.js +1 -0
- package/dist/client/assets/el-skeleton-item-qj0eQP4s.js +1 -0
- package/dist/client/assets/el-switch-BZbXqB3_.js +1 -0
- package/dist/client/assets/el-tab-pane-w7RltRLd.js +1 -0
- package/dist/client/assets/el-table-column-OD8zhFcD.js +1 -0
- package/dist/client/assets/index-DwhULJXZ.js +2 -0
- package/dist/client/assets/{index-Bzz3tYbS.css → index-UtsV0Cvh.css} +1 -1
- package/dist/client/assets/{omit-BIIebEYo.js → omit-BAJQlviJ.js} +1 -1
- package/dist/client/assets/raf-B1Ry7ruA.js +1 -0
- package/dist/client/assets/{vue-vendor-Dwcr0jep.js → vue-vendor-ClSvefnQ.js} +1 -1
- package/dist/client/index.html +3 -3
- package/dist/server/shared/models/constants.d.ts +5 -0
- package/dist/server/shared/models/constants.d.ts.map +1 -1
- package/dist/server/shared/models/constants.js +4 -0
- package/dist/server/shared/models/server.model.d.ts +14 -0
- package/dist/server/shared/models/server.model.d.ts.map +1 -1
- package/dist/server/shared/models/server.model.js +27 -4
- package/dist/server/src/api/mcp/gateway.d.ts +10 -6
- package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
- package/dist/server/src/api/mcp/gateway.js +235 -69
- package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
- package/dist/server/src/api/web/hub-tools.js +2 -2
- package/dist/server/src/api/web/search.d.ts +1 -1
- package/dist/server/src/api/web/search.d.ts.map +1 -1
- package/dist/server/src/api/web/search.js +18 -16
- package/dist/server/src/api/web/sessions.d.ts +1 -27
- package/dist/server/src/api/web/sessions.d.ts.map +1 -1
- package/dist/server/src/api/web/sessions.js +8 -97
- package/dist/server/src/app.d.ts.map +1 -1
- package/dist/server/src/app.js +5 -0
- package/dist/server/src/cli/commands/status.js +39 -1
- package/dist/server/src/cli/commands/use-guide.d.ts +0 -8
- package/dist/server/src/cli/commands/use-guide.d.ts.map +1 -1
- package/dist/server/src/cli/commands/use-guide.js +28 -170
- package/dist/server/src/cli/server.d.ts +10 -0
- package/dist/server/src/cli/server.d.ts.map +1 -1
- package/dist/server/src/cli/server.js +31 -1
- package/dist/server/src/models/system-tools.constants.d.ts +1 -0
- package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
- package/dist/server/src/server/dev-server.js +2 -0
- package/dist/server/src/server/runner.d.ts.map +1 -1
- package/dist/server/src/server/runner.js +2 -0
- package/dist/server/src/services/connection/connection-manager.d.ts +2 -0
- package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
- package/dist/server/src/services/connection/connection-manager.js +14 -7
- package/dist/server/src/services/gateway/gateway.service.d.ts +13 -0
- package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
- package/dist/server/src/services/gateway/gateway.service.js +72 -0
- package/dist/server/src/services/gateway/global-transport.d.ts +20 -10
- package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -1
- package/dist/server/src/services/gateway/global-transport.js +50 -34
- 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 +22 -6
- 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 -1
- 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 +3 -2
- package/dist/server/src/services/gateway/session-manager.d.ts +101 -0
- package/dist/server/src/services/gateway/session-manager.d.ts.map +1 -0
- package/dist/server/src/services/gateway/session-manager.js +256 -0
- package/dist/server/src/services/hub-tools/resource-generator.d.ts +1 -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 +11 -9
- 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 +7 -0
- package/dist/server/src/services/hub-tools.service.d.ts +1 -1
- package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools.service.js +23 -15
- package/dist/server/src/services/system-tool-handler.js +1 -1
- package/dist/server/src/utils/json-utils.d.ts +9 -0
- package/dist/server/src/utils/json-utils.d.ts.map +1 -1
- package/dist/server/src/utils/json-utils.js +19 -0
- package/dist/server/src/utils/logger/index.d.ts +1 -1
- package/dist/server/src/utils/logger/index.d.ts.map +1 -1
- package/dist/server/src/utils/logger/index.js +1 -1
- package/dist/server/src/utils/logger/log-context.d.ts +1 -0
- package/dist/server/src/utils/logger/log-context.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.js +25 -11
- package/dist/server/src/utils/logger/log-output.d.ts +17 -1
- package/dist/server/src/utils/logger/log-output.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-output.js +46 -40
- package/dist/server/src/utils/logger/logger.d.ts.map +1 -1
- package/dist/server/src/utils/logger/logger.js +18 -2
- package/dist/server/src/utils/request-context.d.ts +8 -70
- package/dist/server/src/utils/request-context.d.ts.map +1 -1
- package/dist/server/src/utils/request-context.js +11 -70
- package/dist/server/src/utils/search-matcher.d.ts +6 -0
- package/dist/server/src/utils/search-matcher.d.ts.map +1 -0
- package/dist/server/src/utils/search-matcher.js +24 -0
- package/dist/server/tests/unit/config/config.schema.test.js +2 -1
- package/dist/server/tests/unit/server/runner.test.js +14 -7
- package/dist/server/tests/unit/services/gateway-session-mode.test.d.ts +2 -0
- package/dist/server/tests/unit/services/gateway-session-mode.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/gateway-session-mode.test.js +174 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.js +299 -4
- package/dist/server/tests/unit/utils/config.test.js +14 -7
- package/dist/server/tests/unit/utils/log-output.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/log-output.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/log-output.test.js +198 -0
- package/dist/server/vitest.config.d.ts.map +1 -1
- package/dist/server/vitest.config.js +0 -2
- package/package.json +1 -1
- package/dist/client/assets/ResourcesView-CU0VbNy5.js +0 -1
- package/dist/client/assets/ServerDetail-bcQ8BVXR.js +0 -2
- package/dist/client/assets/SettingsView-B1DxbFP3.js +0 -1
- package/dist/client/assets/ToolCallDialog-DEapCO06.js +0 -1
- package/dist/client/assets/ToolsView-DA0u_bCw.js +0 -1
- package/dist/client/assets/_baseClone-B991Lvrt.js +0 -1
- package/dist/client/assets/el-input-5YzZrwir.js +0 -1
- package/dist/client/assets/el-loading-DE3FcxNH.js +0 -1
- package/dist/client/assets/el-overlay-BTeTueuN.js +0 -1
- package/dist/client/assets/el-radio-group-Y1E2bxIW.js +0 -1
- package/dist/client/assets/el-skeleton-item-DhgR50Jx.js +0 -1
- package/dist/client/assets/el-switch-fF--nMSD.js +0 -1
- package/dist/client/assets/el-tab-pane-rvS_KTwP.js +0 -1
- package/dist/client/assets/el-table-column-B1O8mY47.js +0 -1
- package/dist/client/assets/index-DkqV9kH4.js +0 -2
- package/dist/client/assets/raf-Cj-gATZv.js +0 -1
|
@@ -32,9 +32,25 @@ export declare function isNotificationMessage(message: unknown): message is Noti
|
|
|
32
32
|
* @param serverId - Optional server ID for log storage (for frontend display)
|
|
33
33
|
*/
|
|
34
34
|
export declare function logNotificationMessage(message: unknown, context: string, serverId?: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Check if JSON string contains data:image/*;base64 data URIs.
|
|
37
|
+
* These commonly appear in serverInfo.icons[].src and other metadata fields.
|
|
38
|
+
*
|
|
39
|
+
* @param data - JSON string to check
|
|
40
|
+
* @returns true if it contains data:image data URIs
|
|
41
|
+
*/
|
|
42
|
+
export declare function hasDataUriImage(data: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Simplify data URI images by replacing base64 payload with placeholder.
|
|
45
|
+
* Matches all data:image/*;base64,... patterns and truncates the payload.
|
|
46
|
+
*
|
|
47
|
+
* @param data - JSON string containing data URIs
|
|
48
|
+
* @returns JSON string with base64 payloads replaced
|
|
49
|
+
*/
|
|
50
|
+
export declare function simplifyDataUriImages(data: string): string;
|
|
35
51
|
/**
|
|
36
52
|
* Format an MCP message for logging, with simplification for tools/list,
|
|
37
|
-
* resources/list, capabilities responses, and
|
|
53
|
+
* resources/list, capabilities responses, image content, and data URI images.
|
|
38
54
|
*
|
|
39
55
|
* @param message - The MCP message object to format
|
|
40
56
|
* @returns Formatted log message string
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-output.d.ts","sourceRoot":"","sources":["../../../../../src/utils/logger/log-output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;GAEG;AACH,UAAU,yBAAyB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,UAAU,mBAAmB;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,yBAAyB,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,mBAAmB,CAMtF;AAqBD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAiDjG;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"log-output.d.ts","sourceRoot":"","sources":["../../../../../src/utils/logger/log-output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;GAEG;AACH,UAAU,yBAAyB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,UAAU,mBAAmB;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,yBAAyB,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,mBAAmB,CAMtF;AAqBD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAiDjG;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CA8CnE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAgCrD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqDzD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA+BzD;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiDrE"}
|
|
@@ -87,9 +87,29 @@ export function logNotificationMessage(message, context, serverId) {
|
|
|
87
87
|
logStorage.append(serverId, logLevel, `[${serverName}] ${messageContent}`);
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Check if JSON string contains data:image/*;base64 data URIs.
|
|
92
|
+
* These commonly appear in serverInfo.icons[].src and other metadata fields.
|
|
93
|
+
*
|
|
94
|
+
* @param data - JSON string to check
|
|
95
|
+
* @returns true if it contains data:image data URIs
|
|
96
|
+
*/
|
|
97
|
+
export function hasDataUriImage(data) {
|
|
98
|
+
return /data:image\/[^;]+;base64,/.test(data);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Simplify data URI images by replacing base64 payload with placeholder.
|
|
102
|
+
* Matches all data:image/*;base64,... patterns and truncates the payload.
|
|
103
|
+
*
|
|
104
|
+
* @param data - JSON string containing data URIs
|
|
105
|
+
* @returns JSON string with base64 payloads replaced
|
|
106
|
+
*/
|
|
107
|
+
export function simplifyDataUriImages(data) {
|
|
108
|
+
return data.replace(/(data:image\/[^;]+;base64,)[A-Za-z0-9+/=]+/g, '$1[Truncated]');
|
|
109
|
+
}
|
|
90
110
|
/**
|
|
91
111
|
* Format an MCP message for logging, with simplification for tools/list,
|
|
92
|
-
* resources/list, capabilities responses, and
|
|
112
|
+
* resources/list, capabilities responses, image content, and data URI images.
|
|
93
113
|
*
|
|
94
114
|
* @param message - The MCP message object to format
|
|
95
115
|
* @returns Formatted log message string
|
|
@@ -101,8 +121,20 @@ export function formatMcpMessageForLogging(message) {
|
|
|
101
121
|
if (isToolsListResponse(rawJson)) {
|
|
102
122
|
const simplified = simplifyToolsListResponse(rawJson);
|
|
103
123
|
if (simplified === null) {
|
|
104
|
-
// Could not simplify,
|
|
105
|
-
|
|
124
|
+
// Could not simplify, fall through to other checks
|
|
125
|
+
if (hasDataUriImage(rawJson)) {
|
|
126
|
+
const truncated = simplifyDataUriImages(rawJson);
|
|
127
|
+
try {
|
|
128
|
+
const parsed = JSON.parse(truncated);
|
|
129
|
+
logMessage = stringifyForLogging(parsed);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
logMessage = truncated;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
logMessage = stringifyForLogging(message);
|
|
137
|
+
}
|
|
106
138
|
}
|
|
107
139
|
else {
|
|
108
140
|
logMessage = simplified;
|
|
@@ -118,6 +150,16 @@ export function formatMcpMessageForLogging(message) {
|
|
|
118
150
|
logMessage = simplified;
|
|
119
151
|
}
|
|
120
152
|
}
|
|
153
|
+
else if (hasDataUriImage(rawJson)) {
|
|
154
|
+
const simplified = simplifyDataUriImages(rawJson);
|
|
155
|
+
try {
|
|
156
|
+
const parsed = JSON.parse(simplified);
|
|
157
|
+
logMessage = stringifyForLogging(parsed);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
logMessage = simplified;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
121
163
|
else {
|
|
122
164
|
logMessage = stringifyForLogging(message);
|
|
123
165
|
}
|
|
@@ -192,7 +234,7 @@ export function simplifyImageContent(data) {
|
|
|
192
234
|
'data' in item) {
|
|
193
235
|
return {
|
|
194
236
|
...item,
|
|
195
|
-
data: '[
|
|
237
|
+
data: '[Truncated]'
|
|
196
238
|
};
|
|
197
239
|
}
|
|
198
240
|
return item;
|
|
@@ -243,14 +285,6 @@ export function isToolsListResponse(data) {
|
|
|
243
285
|
if ('resources' in result) {
|
|
244
286
|
return true;
|
|
245
287
|
}
|
|
246
|
-
if ('capabilities' in result &&
|
|
247
|
-
typeof result.capabilities === 'object' &&
|
|
248
|
-
result.capabilities !== null) {
|
|
249
|
-
const capabilities = result.capabilities;
|
|
250
|
-
if ('tools' in capabilities || 'resources' in capabilities) {
|
|
251
|
-
return true;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
288
|
}
|
|
255
289
|
}
|
|
256
290
|
}
|
|
@@ -301,34 +335,6 @@ export function simplifyToolsListResponse(data) {
|
|
|
301
335
|
// No resources, don't simplify
|
|
302
336
|
return null;
|
|
303
337
|
}
|
|
304
|
-
if ('capabilities' in result &&
|
|
305
|
-
typeof result.capabilities === 'object' &&
|
|
306
|
-
result.capabilities !== null) {
|
|
307
|
-
const capabilities = result.capabilities;
|
|
308
|
-
let toolsCount = 0;
|
|
309
|
-
let resourcesCount = 0;
|
|
310
|
-
if ('tools' in capabilities &&
|
|
311
|
-
typeof capabilities.tools === 'object' &&
|
|
312
|
-
capabilities.tools !== null) {
|
|
313
|
-
toolsCount = Object.keys(capabilities.tools).length;
|
|
314
|
-
}
|
|
315
|
-
if ('resources' in capabilities &&
|
|
316
|
-
typeof capabilities.resources === 'object' &&
|
|
317
|
-
capabilities.resources !== null) {
|
|
318
|
-
resourcesCount = Object.keys(capabilities.resources).length;
|
|
319
|
-
}
|
|
320
|
-
if (toolsCount > 0 && resourcesCount > 0) {
|
|
321
|
-
return `Returned ${toolsCount} tools and ${resourcesCount} resources`;
|
|
322
|
-
}
|
|
323
|
-
else if (toolsCount > 0) {
|
|
324
|
-
return `Returned ${toolsCount} tools`;
|
|
325
|
-
}
|
|
326
|
-
else if (resourcesCount > 0) {
|
|
327
|
-
return `Returned ${resourcesCount} resources`;
|
|
328
|
-
}
|
|
329
|
-
// No tools or resources, don't simplify
|
|
330
|
-
return null;
|
|
331
|
-
}
|
|
332
338
|
}
|
|
333
339
|
}
|
|
334
340
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../../../src/utils/logger/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../../../src/utils/logger/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAmB5C,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,SAAS,CAA8B;gBAEnC,KAAK,GAAE,QAAiB;IAoBpC;;;;;;;;;OASG;IACI,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAIzC;;;;;;;;;;;;OAYG;IACI,YAAY,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAO5E,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAIvC;;;;;;;;;OASG;IACI,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAItC;;;OAGG;IACH,SAAS,CAAC,YAAY,EAAE,QAAQ,GAAG,OAAO;IAK1C;;OAEG;IACH,OAAO,CAAC,GAAG;IA8DX;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAKhD;;;;;;;;;;;;;;OAcG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAK/C;;;;;;;;;;;;;;OAcG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAK/C;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAKhD,OAAO,CAAC,qBAAqB;IAkB7B,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B;;;OAGG;IACH,SAAS,CACP,KAAK,EAAE,QAAQ,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,GACvC,IAAI;IAuBP;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA6D3B;;;OAGG;IACH,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED;;;OAGG;IACH,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED;;;OAGG;IACH,uBAAuB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM;IAIvF;;;OAGG;IACH,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM;IAIhF;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAInC;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAInC;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAIvC;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAG/B"}
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
import { DevLogger } from './dev-logger.js';
|
|
31
31
|
import { LOG_MODULES } from './log-modules.js';
|
|
32
32
|
import { createColoredLogMessage, createLogMessage, formatError, formatTimestamp, formatLogLevel, formatPid, getCallerInfo, formatCallerInfo } from './log-formatter.js';
|
|
33
|
-
import { setDevModeEnabled } from '../json-utils.js';
|
|
33
|
+
import { setDevModeEnabled, getShowTraceContextSetting } from '../json-utils.js';
|
|
34
|
+
import { getTraceIdFromContext, getSessionIdFromContext, isInRequestContext } from '../request-context.js';
|
|
34
35
|
export class Logger {
|
|
35
36
|
level = 'info';
|
|
36
37
|
useStderr = false;
|
|
@@ -124,9 +125,17 @@ export class Logger {
|
|
|
124
125
|
// Build context object
|
|
125
126
|
const context = {
|
|
126
127
|
...(options?.module && { module: options.module }),
|
|
128
|
+
...(options?.sessionId && { sessionId: options.sessionId }),
|
|
127
129
|
...(options?.traceId && { traceId: options.traceId }),
|
|
128
130
|
...(options?.spanId && { spanId: options.spanId })
|
|
129
131
|
};
|
|
132
|
+
// Auto-inject trace context from ALS when showTraceContext enabled
|
|
133
|
+
if (getShowTraceContextSetting() && isInRequestContext()) {
|
|
134
|
+
if (!context.sessionId)
|
|
135
|
+
context.sessionId = getSessionIdFromContext() || '-';
|
|
136
|
+
if (!context.traceId)
|
|
137
|
+
context.traceId = getTraceIdFromContext() || '-';
|
|
138
|
+
}
|
|
130
139
|
// Add caller info if enabled
|
|
131
140
|
if (this.showCaller) {
|
|
132
141
|
const callerInfo = getCallerInfo(4); // Skip 4 frames to get to the actual caller
|
|
@@ -241,7 +250,7 @@ export class Logger {
|
|
|
241
250
|
const optionsIndex = args.findIndex((arg) => typeof arg === 'object' &&
|
|
242
251
|
arg !== null &&
|
|
243
252
|
!Array.isArray(arg) &&
|
|
244
|
-
('module' in arg || 'traceId' in arg || 'spanId' in arg));
|
|
253
|
+
('module' in arg || 'sessionId' in arg || 'traceId' in arg || 'spanId' in arg));
|
|
245
254
|
if (optionsIndex !== -1) {
|
|
246
255
|
const options = args[optionsIndex];
|
|
247
256
|
const restArgs = [...args.slice(0, optionsIndex), ...args.slice(optionsIndex + 1)];
|
|
@@ -287,6 +296,13 @@ export class Logger {
|
|
|
287
296
|
...context,
|
|
288
297
|
serverName
|
|
289
298
|
};
|
|
299
|
+
// Auto-inject trace context from ALS when showTraceContext enabled
|
|
300
|
+
if (getShowTraceContextSetting() && isInRequestContext()) {
|
|
301
|
+
if (!logContext.sessionId)
|
|
302
|
+
logContext.sessionId = getSessionIdFromContext() || '-';
|
|
303
|
+
if (!logContext.traceId)
|
|
304
|
+
logContext.traceId = getTraceIdFromContext() || '-';
|
|
305
|
+
}
|
|
290
306
|
// Add caller info if enabled (only once per serverLog call would be better,
|
|
291
307
|
// but for consistency with multi-line logging, we add it for each line)
|
|
292
308
|
if (this.showCaller) {
|
|
@@ -1,71 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
* The primary use case is storing session context information (sessionId, clientName,
|
|
10
|
-
* cwd, project, etc.) that needs to be accessible from any part of the application
|
|
11
|
-
* during request processing.
|
|
12
|
-
*
|
|
13
|
-
* @module utils/request-context
|
|
14
|
-
*/
|
|
15
|
-
import { AsyncLocalStorage } from 'async_hooks';
|
|
16
|
-
import type { SessionContext } from '../../shared/types/session-context.types.js';
|
|
17
|
-
/**
|
|
18
|
-
* AsyncLocalStorage instance for storing request context.
|
|
19
|
-
*
|
|
20
|
-
* This storage holds the SessionContext object for the current request and
|
|
21
|
-
* makes it available throughout the entire request processing chain,
|
|
22
|
-
* including asynchronous operations and nested function calls.
|
|
23
|
-
*
|
|
24
|
-
* @example
|
|
25
|
-
* ```typescript
|
|
26
|
-
* // In route handler
|
|
27
|
-
* await requestContext.run(sessionContext, async () => {
|
|
28
|
-
* // Any code executed here can access the session context
|
|
29
|
-
* const ctx = getSessionContext();
|
|
30
|
-
* console.log(ctx.sessionId);
|
|
31
|
-
* });
|
|
32
|
-
* ```
|
|
33
|
-
*/
|
|
34
|
-
export declare const requestContext: AsyncLocalStorage<SessionContext>;
|
|
35
|
-
/**
|
|
36
|
-
* Retrieves the current request's session context.
|
|
37
|
-
*
|
|
38
|
-
* This function returns the SessionContext object stored in the AsyncLocalStorage
|
|
39
|
-
* for the current request. It should only be called within a request context
|
|
40
|
-
* that has been established using requestContext.run().
|
|
41
|
-
*
|
|
42
|
-
* @returns {SessionContext | undefined} The current request's session context, or undefined if not in a request context
|
|
43
|
-
*
|
|
44
|
-
* @example
|
|
45
|
-
* ```typescript
|
|
46
|
-
* const context = getSessionContext();
|
|
47
|
-
* if (context) {
|
|
48
|
-
* console.log(`Processing request for session: ${context.sessionId}`);
|
|
49
|
-
* }
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
export declare function getSessionContext(): SessionContext | undefined;
|
|
53
|
-
/**
|
|
54
|
-
* Retrieves the current request's working directory (cwd).
|
|
55
|
-
*
|
|
56
|
-
* This is a convenience function that extracts the cwd property from the
|
|
57
|
-
* current request's session context. It's commonly used in file operations
|
|
58
|
-
* that need to respect the session's current working directory.
|
|
59
|
-
*
|
|
60
|
-
* @returns {string | undefined} The current request's working directory, or undefined if not available
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* ```typescript
|
|
64
|
-
* const cwd = getSessionCwd();
|
|
65
|
-
* if (cwd) {
|
|
66
|
-
* const fullPath = path.join(cwd, relativePath);
|
|
67
|
-
* }
|
|
68
|
-
* ```
|
|
69
|
-
*/
|
|
70
|
-
export declare function getSessionCwd(): string | undefined;
|
|
1
|
+
export interface RequestContext {
|
|
2
|
+
sessionId?: string;
|
|
3
|
+
traceId?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function runWithRequestContext(context: RequestContext, fn: () => Promise<void>): Promise<void>;
|
|
6
|
+
export declare function getSessionIdFromContext(): string | undefined;
|
|
7
|
+
export declare function getTraceIdFromContext(): string | undefined;
|
|
8
|
+
export declare function isInRequestContext(): boolean;
|
|
71
9
|
//# sourceMappingURL=request-context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../../../src/utils/request-context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../../../src/utils/request-context.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACtB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,SAAS,CAE5D;AAED,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,SAAS,CAE1D;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C"}
|
|
@@ -1,73 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Request context management using AsyncLocalStorage for request-scoped data.
|
|
3
|
-
*
|
|
4
|
-
* This module provides a way to store and access request-specific context data
|
|
5
|
-
* across asynchronous operations without having to pass context objects through
|
|
6
|
-
* every function call. It uses Node.js AsyncLocalStorage to maintain context
|
|
7
|
-
* throughout the request lifecycle.
|
|
8
|
-
*
|
|
9
|
-
* The primary use case is storing session context information (sessionId, clientName,
|
|
10
|
-
* cwd, project, etc.) that needs to be accessible from any part of the application
|
|
11
|
-
* during request processing.
|
|
12
|
-
*
|
|
13
|
-
* @module utils/request-context
|
|
14
|
-
*/
|
|
15
1
|
import { AsyncLocalStorage } from 'async_hooks';
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
* This storage holds the SessionContext object for the current request and
|
|
20
|
-
* makes it available throughout the entire request processing chain,
|
|
21
|
-
* including asynchronous operations and nested function calls.
|
|
22
|
-
*
|
|
23
|
-
* @example
|
|
24
|
-
* ```typescript
|
|
25
|
-
* // In route handler
|
|
26
|
-
* await requestContext.run(sessionContext, async () => {
|
|
27
|
-
* // Any code executed here can access the session context
|
|
28
|
-
* const ctx = getSessionContext();
|
|
29
|
-
* console.log(ctx.sessionId);
|
|
30
|
-
* });
|
|
31
|
-
* ```
|
|
32
|
-
*/
|
|
33
|
-
export const requestContext = new AsyncLocalStorage();
|
|
34
|
-
/**
|
|
35
|
-
* Retrieves the current request's session context.
|
|
36
|
-
*
|
|
37
|
-
* This function returns the SessionContext object stored in the AsyncLocalStorage
|
|
38
|
-
* for the current request. It should only be called within a request context
|
|
39
|
-
* that has been established using requestContext.run().
|
|
40
|
-
*
|
|
41
|
-
* @returns {SessionContext | undefined} The current request's session context, or undefined if not in a request context
|
|
42
|
-
*
|
|
43
|
-
* @example
|
|
44
|
-
* ```typescript
|
|
45
|
-
* const context = getSessionContext();
|
|
46
|
-
* if (context) {
|
|
47
|
-
* console.log(`Processing request for session: ${context.sessionId}`);
|
|
48
|
-
* }
|
|
49
|
-
* ```
|
|
50
|
-
*/
|
|
51
|
-
export function getSessionContext() {
|
|
52
|
-
return requestContext.getStore();
|
|
2
|
+
const als = new AsyncLocalStorage();
|
|
3
|
+
export function runWithRequestContext(context, fn) {
|
|
4
|
+
return als.run(context, fn);
|
|
53
5
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
*
|
|
63
|
-
* @example
|
|
64
|
-
* ```typescript
|
|
65
|
-
* const cwd = getSessionCwd();
|
|
66
|
-
* if (cwd) {
|
|
67
|
-
* const fullPath = path.join(cwd, relativePath);
|
|
68
|
-
* }
|
|
69
|
-
* ```
|
|
70
|
-
*/
|
|
71
|
-
export function getSessionCwd() {
|
|
72
|
-
return requestContext.getStore()?.cwd;
|
|
6
|
+
export function getSessionIdFromContext() {
|
|
7
|
+
return als.getStore()?.sessionId;
|
|
8
|
+
}
|
|
9
|
+
export function getTraceIdFromContext() {
|
|
10
|
+
return als.getStore()?.traceId;
|
|
11
|
+
}
|
|
12
|
+
export function isInRequestContext() {
|
|
13
|
+
return als.getStore() !== undefined;
|
|
73
14
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Counts how many tokens from a whitespace-delimited query match against any of the given fields.
|
|
3
|
+
* Returns a large value for empty or whitespace-only queries so they match all results.
|
|
4
|
+
*/
|
|
5
|
+
export declare function countMatchingTokens(query: string, fields: string[]): number;
|
|
6
|
+
//# sourceMappingURL=search-matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-matcher.d.ts","sourceRoot":"","sources":["../../../../src/utils/search-matcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAwB3E"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Counts how many tokens from a whitespace-delimited query match against any of the given fields.
|
|
3
|
+
* Returns a large value for empty or whitespace-only queries so they match all results.
|
|
4
|
+
*/
|
|
5
|
+
export function countMatchingTokens(query, fields) {
|
|
6
|
+
if (!query || typeof query !== 'string') {
|
|
7
|
+
return 0;
|
|
8
|
+
}
|
|
9
|
+
const tokens = query
|
|
10
|
+
.toLowerCase()
|
|
11
|
+
.split(/[,\s;|]+/)
|
|
12
|
+
.filter(Boolean);
|
|
13
|
+
if (tokens.length === 0) {
|
|
14
|
+
return Number.MAX_SAFE_INTEGER;
|
|
15
|
+
}
|
|
16
|
+
const lowerFields = fields.map((f) => (f || '').toLowerCase());
|
|
17
|
+
let matchCount = 0;
|
|
18
|
+
for (const token of tokens) {
|
|
19
|
+
if (lowerFields.some((field) => field.includes(token))) {
|
|
20
|
+
matchCount++;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return matchCount;
|
|
24
|
+
}
|
|
@@ -95,7 +95,8 @@ describe('Server Runner', () => {
|
|
|
95
95
|
jsonPretty: true,
|
|
96
96
|
mcpCommDebug: false,
|
|
97
97
|
apiDebug: false,
|
|
98
|
-
gatewayDebug: false
|
|
98
|
+
gatewayDebug: false,
|
|
99
|
+
showTraceContext: true
|
|
99
100
|
}
|
|
100
101
|
},
|
|
101
102
|
security: {
|
|
@@ -136,7 +137,8 @@ describe('Server Runner', () => {
|
|
|
136
137
|
jsonPretty: true,
|
|
137
138
|
mcpCommDebug: false,
|
|
138
139
|
apiDebug: false,
|
|
139
|
-
gatewayDebug: false
|
|
140
|
+
gatewayDebug: false,
|
|
141
|
+
showTraceContext: true
|
|
140
142
|
}
|
|
141
143
|
},
|
|
142
144
|
security: {
|
|
@@ -186,7 +188,8 @@ describe('Server Runner', () => {
|
|
|
186
188
|
jsonPretty: true,
|
|
187
189
|
mcpCommDebug: false,
|
|
188
190
|
apiDebug: false,
|
|
189
|
-
gatewayDebug: false
|
|
191
|
+
gatewayDebug: false,
|
|
192
|
+
showTraceContext: true
|
|
190
193
|
}
|
|
191
194
|
},
|
|
192
195
|
security: {
|
|
@@ -241,7 +244,8 @@ describe('Server Runner', () => {
|
|
|
241
244
|
jsonPretty: true,
|
|
242
245
|
mcpCommDebug: false,
|
|
243
246
|
apiDebug: false,
|
|
244
|
-
gatewayDebug: false
|
|
247
|
+
gatewayDebug: false,
|
|
248
|
+
showTraceContext: true
|
|
245
249
|
}
|
|
246
250
|
},
|
|
247
251
|
security: {
|
|
@@ -359,7 +363,8 @@ describe('Server Runner', () => {
|
|
|
359
363
|
jsonPretty: true,
|
|
360
364
|
mcpCommDebug: false,
|
|
361
365
|
apiDebug: false,
|
|
362
|
-
gatewayDebug: false
|
|
366
|
+
gatewayDebug: false,
|
|
367
|
+
showTraceContext: true
|
|
363
368
|
}
|
|
364
369
|
},
|
|
365
370
|
security: {
|
|
@@ -414,7 +419,8 @@ describe('Server Runner', () => {
|
|
|
414
419
|
jsonPretty: true,
|
|
415
420
|
mcpCommDebug: false,
|
|
416
421
|
apiDebug: false,
|
|
417
|
-
gatewayDebug: false
|
|
422
|
+
gatewayDebug: false,
|
|
423
|
+
showTraceContext: true
|
|
418
424
|
}
|
|
419
425
|
},
|
|
420
426
|
security: {
|
|
@@ -465,7 +471,8 @@ describe('Server Runner', () => {
|
|
|
465
471
|
jsonPretty: true,
|
|
466
472
|
mcpCommDebug: false,
|
|
467
473
|
apiDebug: false,
|
|
468
|
-
gatewayDebug: false
|
|
474
|
+
gatewayDebug: false,
|
|
475
|
+
showTraceContext: true
|
|
469
476
|
}
|
|
470
477
|
},
|
|
471
478
|
security: {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-session-mode.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/services/gateway-session-mode.test.ts"],"names":[],"mappings":""}
|