@loop_ouroboros/mcp-hub-lite 1.0.0 → 1.0.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 +15 -0
- package/README.md +15 -0
- package/dist/client/assets/{HomeView-f901HeKw.js → HomeView-7rMg9C6t.js} +1 -1
- package/dist/client/assets/{ResourceDetailView-Bz66ZjfY.js → ResourceDetailView-Bf-1ffbk.js} +1 -1
- package/dist/client/assets/ResourcesView-g5x4xCPh.js +1 -0
- package/dist/client/assets/{ServerDashboard-7_8Og9JJ.css → ServerDashboard-Chpne8Q0.css} +1 -1
- package/dist/client/assets/ServerDashboard-G8Wmp4hF.js +2 -0
- package/dist/client/assets/ServerListView-dV2XrPjo.js +32 -0
- package/dist/client/assets/SessionsView-Ckd38lj1.js +1 -0
- package/dist/client/assets/SettingsView-BJUdepEQ.js +1 -0
- package/dist/client/assets/ToolCallDialog-BhdPX-Kf.css +1 -0
- package/dist/client/assets/ToolCallDialog-C_bTCpHC.js +1 -0
- package/dist/client/assets/ToolsView-0c2eputu.js +1 -0
- package/dist/client/assets/ToolsView-E3Ps9c7i.css +1 -0
- package/dist/client/assets/{_baseClone-DCmK847M.js → _baseClone-5q1b0P3O.js} +1 -1
- package/dist/client/assets/{el-form-item-DM0q2hmO.js → el-form-item-ClFnj49k.js} +1 -1
- package/dist/client/assets/{el-input-BtI9NECe.js → el-input-CDnuSKVZ.js} +1 -1
- package/dist/client/assets/{el-loading-CChNmKeI.js → el-loading-H85n3BUC.js} +1 -1
- package/dist/client/assets/{el-overlay-lZZbPmsX.js → el-overlay-CzMkXyYy.js} +1 -1
- package/dist/client/assets/el-select-DvjGddk_.js +1 -0
- package/dist/client/assets/{el-tab-pane-Dy9ruaEX.js → el-tab-pane-C_DQMcwe.js} +1 -1
- package/dist/client/assets/{el-table-column-98UyVgBH.js → el-table-column-CASRIbZM.js} +1 -1
- package/dist/client/assets/el-tag-npbwux4f.js +1 -0
- package/dist/client/assets/{index-CSTs2jYk.js → index-CCnAxNF8.js} +2 -2
- package/dist/client/assets/{index-BzQXG7no.js → index-d1DZeSfz.js} +1 -1
- package/dist/client/assets/{omit-Bx5HJNV_.js → omit-DPsOVNIJ.js} +1 -1
- package/dist/client/assets/{raf-B9VDMtMF.js → raf-DY5mgbuB.js} +1 -1
- package/dist/client/assets/{vnode-B8aJx8u4.js → vnode-CHomNjgN.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/shared/models/server.model.d.ts +1 -0
- package/dist/server/shared/models/server.model.d.ts.map +1 -1
- package/dist/server/shared/models/session.model.d.ts +2 -0
- package/dist/server/shared/models/session.model.d.ts.map +1 -1
- package/dist/server/shared/models/session.model.js +1 -0
- package/dist/server/shared/types/client.types.d.ts +4 -32
- package/dist/server/shared/types/client.types.d.ts.map +1 -1
- package/dist/server/shared/types/client.types.js +3 -2
- package/dist/server/shared/types/index.d.ts +3 -3
- package/dist/server/shared/types/index.d.ts.map +1 -1
- package/dist/server/shared/types/index.js +3 -3
- package/dist/server/shared/types/session-context.types.d.ts +37 -0
- package/dist/server/shared/types/session-context.types.d.ts.map +1 -0
- package/dist/server/shared/types/session-context.types.js +5 -0
- package/dist/server/src/api/mcp/debug-response-wrapper.d.ts.map +1 -1
- package/dist/server/src/api/mcp/debug-response-wrapper.js +26 -1
- package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
- package/dist/server/src/api/mcp/gateway.js +28 -24
- package/dist/server/src/api/mcp/session-context-extractor.d.ts +5 -5
- package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -1
- package/dist/server/src/api/mcp/session-context-extractor.js +12 -27
- package/dist/server/src/api/web/clients.js +2 -2
- package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
- package/dist/server/src/api/web/hub-tools.js +4 -1
- package/dist/server/src/api/web/sessions.js +1 -1
- package/dist/server/src/app.d.ts.map +1 -1
- package/dist/server/src/app.js +0 -2
- package/dist/server/src/config/config.schema.d.ts +2 -0
- package/dist/server/src/config/config.schema.d.ts.map +1 -1
- package/dist/server/src/config/config.schema.js +1 -0
- package/dist/server/src/index.js +1 -1
- package/dist/server/src/services/client-tracker.service.d.ts +3 -128
- package/dist/server/src/services/client-tracker.service.d.ts.map +1 -1
- package/dist/server/src/services/client-tracker.service.js +4 -200
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +2 -2
- 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 +40 -8
- 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 +18 -6
- package/dist/server/src/services/gateway/tool-list-generator.js +2 -2
- package/dist/server/src/services/hub-tools/resource-generator.d.ts +1 -4
- package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/resource-generator.js +1 -26
- package/dist/server/src/services/search/search-cache.d.ts +0 -19
- package/dist/server/src/services/search/search-cache.d.ts.map +1 -1
- package/dist/server/src/services/search/search-cache.js +0 -24
- package/dist/server/src/services/session/session-manager.d.ts.map +1 -1
- package/dist/server/src/services/session/session-manager.js +11 -9
- package/dist/server/src/services/session-tracker.service.d.ts +132 -0
- package/dist/server/src/services/session-tracker.service.d.ts.map +1 -0
- package/dist/server/src/services/session-tracker.service.js +227 -0
- package/dist/server/src/utils/json-utils.d.ts.map +1 -1
- package/dist/server/src/utils/json-utils.js +6 -0
- package/dist/server/src/utils/logger/log-colors.d.ts +1 -0
- package/dist/server/src/utils/logger/log-colors.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-colors.js +2 -1
- package/dist/server/src/utils/logger/log-context.d.ts +1 -0
- package/dist/server/src/utils/logger/log-context.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.d.ts +28 -0
- package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.js +205 -0
- package/dist/server/src/utils/logger/log-modules.d.ts +3 -6
- package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-modules.js +1 -3
- package/dist/server/src/utils/logger/log-output.d.ts +2 -2
- package/dist/server/src/utils/logger/log-output.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-output.js +27 -6
- package/dist/server/src/utils/logger/logger.d.ts +13 -0
- package/dist/server/src/utils/logger/logger.d.ts.map +1 -1
- package/dist/server/src/utils/logger/logger.js +42 -7
- package/dist/server/src/utils/request-context.d.ts +16 -16
- package/dist/server/src/utils/request-context.d.ts.map +1 -1
- package/dist/server/src/utils/request-context.js +14 -14
- package/dist/server/src/utils/tool-args-parser.d.ts +0 -4
- package/dist/server/src/utils/tool-args-parser.d.ts.map +1 -1
- package/dist/server/src/utils/tool-args-parser.js +0 -7
- package/dist/server/src/utils/transports/stdio-transport.js +1 -1
- package/dist/server/src/utils/transports/transport-factory.js +2 -2
- package/dist/server/tests/integration/api/gateway.test.js +22 -37
- package/dist/server/tests/temp/test-stack.d.ts +6 -0
- package/dist/server/tests/temp/test-stack.d.ts.map +1 -0
- package/dist/server/tests/temp/test-stack.js +40 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.js +1 -15
- package/dist/server/tests/unit/services/session-manager.test.js +1 -1
- package/dist/server/tests/unit/utils/json-utils.test.js +94 -0
- package/dist/server/tests/unit/utils/logger.test.js +101 -0
- package/dist/server/tests/unit/utils/request-context.test.js +12 -12
- package/package.json +1 -1
- package/dist/client/assets/ResourcesView-lI_fItfA.js +0 -1
- package/dist/client/assets/ServerDashboard-Bgx8WVkx.js +0 -2
- package/dist/client/assets/ServerListView-CP6Ffkfx.js +0 -30
- package/dist/client/assets/SessionsView-D68qKR4D.js +0 -1
- package/dist/client/assets/SettingsView-BPYfO9BE.js +0 -1
- package/dist/client/assets/ToolCallDialog-Br8FNebN.js +0 -1
- package/dist/client/assets/ToolCallDialog-C7eh7jHE.css +0 -1
- package/dist/client/assets/ToolsView-B6hUiR43.js +0 -1
- package/dist/client/assets/ToolsView-BLnU8cV6.css +0 -1
- package/dist/client/assets/el-select-BXztu2b5.js +0 -1
- package/dist/client/assets/el-tag-B5lLT51E.js +0 -1
- package/dist/client/assets/index-BgKcmWJr.js +0 -1
|
@@ -6,6 +6,204 @@ import { stringifyForLogging } from '../json-utils.js';
|
|
|
6
6
|
import { getColorCodeForLevel, getResetColor, COLORS } from './log-colors.js';
|
|
7
7
|
// PID formatting configuration
|
|
8
8
|
const PID_WIDTH = 8;
|
|
9
|
+
/**
|
|
10
|
+
* Check if we're running via tsx (development mode).
|
|
11
|
+
* In tsx mode, stack traces already show TypeScript file names and line numbers.
|
|
12
|
+
*
|
|
13
|
+
* @returns true if running via tsx
|
|
14
|
+
*/
|
|
15
|
+
function isTsxMode() {
|
|
16
|
+
return (process.argv.some((arg) => arg.includes('tsx')) ||
|
|
17
|
+
process.execArgv.some((arg) => arg.includes('tsx')) ||
|
|
18
|
+
!!process.env.TSX ||
|
|
19
|
+
(process.mainModule?.filename.includes('tsx') ?? false));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Check if a file path is a project source file.
|
|
23
|
+
*
|
|
24
|
+
* @param filePath - The file path to check
|
|
25
|
+
* @returns true if the file is within the project's src directory
|
|
26
|
+
*/
|
|
27
|
+
function isProjectSourceFile(filePath) {
|
|
28
|
+
return filePath.includes('/src/') || filePath.includes('\\src\\');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Clean up a file path to make it more readable.
|
|
32
|
+
* Extracts the relative path from the src directory if present.
|
|
33
|
+
* In tsx mode, keeps the .ts extension; in compiled mode, converts .js to .ts.
|
|
34
|
+
*
|
|
35
|
+
* @param filePath - The full file path to clean
|
|
36
|
+
* @returns Cleaned file path
|
|
37
|
+
*/
|
|
38
|
+
function cleanFilePath(filePath) {
|
|
39
|
+
let cleanFileName = filePath;
|
|
40
|
+
// If it's a full path, try to extract just the file name or relative path
|
|
41
|
+
if (cleanFileName.includes('/')) {
|
|
42
|
+
// Extract everything after the last /src/ if present
|
|
43
|
+
const srcIndex = cleanFileName.lastIndexOf('/src/');
|
|
44
|
+
if (srcIndex !== -1) {
|
|
45
|
+
cleanFileName = 'src' + cleanFileName.substring(srcIndex + 4);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// Otherwise just take the base name
|
|
49
|
+
cleanFileName = cleanFileName.substring(cleanFileName.lastIndexOf('/') + 1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else if (cleanFileName.includes('\\')) {
|
|
53
|
+
// Handle Windows paths
|
|
54
|
+
const srcIndex = cleanFileName.lastIndexOf('\\src\\');
|
|
55
|
+
if (srcIndex !== -1) {
|
|
56
|
+
cleanFileName = 'src' + cleanFileName.substring(srcIndex + 4);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
cleanFileName = cleanFileName.substring(cleanFileName.lastIndexOf('\\') + 1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// In non-tsx mode (compiled JS), convert .js to .ts for TypeScript source files
|
|
63
|
+
if (!isTsxMode() && cleanFileName.endsWith('.js')) {
|
|
64
|
+
// Check if there's likely a .ts source file
|
|
65
|
+
// For our project, all .js files in src/ are compiled from .ts
|
|
66
|
+
if (cleanFileName.startsWith('src/') || cleanFileName.startsWith('src\\')) {
|
|
67
|
+
cleanFileName = cleanFileName.replace(/\.js$/, '.ts');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return cleanFileName;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get caller information from stack trace.
|
|
74
|
+
* Extracts the file name, line number, and column number from the call stack.
|
|
75
|
+
* This method traverses the stack to find the first project source file (in src/),
|
|
76
|
+
* skipping external dependencies and Node.js internals.
|
|
77
|
+
*
|
|
78
|
+
* In tsx (development) mode: Parses default stack string for accurate .ts line numbers
|
|
79
|
+
* In production mode: Shows .ts file names but without line numbers (inaccurate)
|
|
80
|
+
*
|
|
81
|
+
* @param skipFrames - Number of stack frames to skip before starting the search (default: 3 to skip logger internal frames)
|
|
82
|
+
* @returns CallerInfo with fileName, lineNumber, columnNumber or null if cannot be determined
|
|
83
|
+
*/
|
|
84
|
+
export function getCallerInfo(skipFrames = 3) {
|
|
85
|
+
// In tsx mode, parse the default stack string for accurate line numbers
|
|
86
|
+
if (isTsxMode()) {
|
|
87
|
+
return getCallerInfoFromStackString(skipFrames);
|
|
88
|
+
}
|
|
89
|
+
// In production mode, use structured stack frames but without line numbers
|
|
90
|
+
return getCallerInfoFromStructuredStack(skipFrames);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Parse caller information from default stack string (for tsx mode).
|
|
94
|
+
* In tsx mode, the default stack string already contains accurate TypeScript
|
|
95
|
+
* file names and line numbers, so we parse it directly.
|
|
96
|
+
*
|
|
97
|
+
* @param skipFrames - Number of stack frames to skip
|
|
98
|
+
* @returns CallerInfo or null if cannot be determined
|
|
99
|
+
*/
|
|
100
|
+
function getCallerInfoFromStackString(skipFrames) {
|
|
101
|
+
const err = new Error();
|
|
102
|
+
const stackStr = err.stack;
|
|
103
|
+
if (!stackStr)
|
|
104
|
+
return null;
|
|
105
|
+
const lines = stackStr.split('\n').slice(1); // Skip first line ("Error")
|
|
106
|
+
// Find the first project source file in the stack
|
|
107
|
+
for (let i = skipFrames; i < lines.length; i++) {
|
|
108
|
+
const line = lines[i];
|
|
109
|
+
if (!line)
|
|
110
|
+
continue;
|
|
111
|
+
// Match patterns like:
|
|
112
|
+
// at ... (file:///D:/path/src/file.ts:123:45)
|
|
113
|
+
// at ... (D:\path\src\file.ts:123:45)
|
|
114
|
+
// at file:///D:/path/src/file.ts:123:45
|
|
115
|
+
const match = line.match(/(?:\(|at\s+)([^:\s]+\/src\/[^:\s)]+|\S+\\src\\[^:\s)]+):(\d+)(?::(\d+))?/);
|
|
116
|
+
if (match) {
|
|
117
|
+
let filePath = match[1];
|
|
118
|
+
const lineNumber = parseInt(match[2], 10) || 0;
|
|
119
|
+
const columnNumber = match[3] ? parseInt(match[3], 10) : 0;
|
|
120
|
+
// Remove file:// prefix if present
|
|
121
|
+
if (filePath.startsWith('file://')) {
|
|
122
|
+
filePath = filePath.replace('file://', '');
|
|
123
|
+
// On Windows, file:///D:/path becomes /D:/path - fix that
|
|
124
|
+
if (filePath.startsWith('/') && filePath.length > 2 && filePath[2] === ':') {
|
|
125
|
+
filePath = filePath.substring(1);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const cleanFileName = cleanFilePath(filePath);
|
|
129
|
+
return {
|
|
130
|
+
fileName: cleanFileName,
|
|
131
|
+
lineNumber,
|
|
132
|
+
columnNumber
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Get caller information from structured stack frames (for production mode).
|
|
140
|
+
* In production mode, we show the .ts file name but without line numbers
|
|
141
|
+
* since they would be inaccurate.
|
|
142
|
+
*
|
|
143
|
+
* @param skipFrames - Number of stack frames to skip
|
|
144
|
+
* @returns CallerInfo or null if cannot be determined
|
|
145
|
+
*/
|
|
146
|
+
function getCallerInfoFromStructuredStack(skipFrames) {
|
|
147
|
+
const originalPrepareStackTrace = Error.prepareStackTrace;
|
|
148
|
+
let callerInfo = null;
|
|
149
|
+
try {
|
|
150
|
+
// Override prepareStackTrace to get structured stack frames
|
|
151
|
+
Error.prepareStackTrace = (_err, stack) => stack;
|
|
152
|
+
const err = new Error();
|
|
153
|
+
const stack = err.stack;
|
|
154
|
+
if (stack && stack.length > skipFrames) {
|
|
155
|
+
let selectedFrame = null;
|
|
156
|
+
// Traverse stack frames starting from skipFrames
|
|
157
|
+
// Look for the first project source file (contains /src/ or \src\)
|
|
158
|
+
for (let i = skipFrames; i < stack.length; i++) {
|
|
159
|
+
const frame = stack[i];
|
|
160
|
+
if (!frame)
|
|
161
|
+
continue;
|
|
162
|
+
const fileName = frame.getFileName() || '';
|
|
163
|
+
// If this is a project source file, use it
|
|
164
|
+
if (isProjectSourceFile(fileName)) {
|
|
165
|
+
selectedFrame = frame;
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// If no project source file found, fall back to the original skipFrames approach
|
|
170
|
+
if (!selectedFrame) {
|
|
171
|
+
selectedFrame = stack[skipFrames] || null;
|
|
172
|
+
}
|
|
173
|
+
if (selectedFrame) {
|
|
174
|
+
const fileName = selectedFrame.getFileName() || 'unknown';
|
|
175
|
+
// Clean up file path to make it more readable
|
|
176
|
+
const cleanFileName = cleanFilePath(fileName);
|
|
177
|
+
// In production mode, line numbers are inaccurate - don't show them
|
|
178
|
+
callerInfo = {
|
|
179
|
+
fileName: cleanFileName,
|
|
180
|
+
lineNumber: 0,
|
|
181
|
+
columnNumber: 0
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// Ignore errors - caller info is best effort
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
// Restore original prepareStackTrace
|
|
191
|
+
Error.prepareStackTrace = originalPrepareStackTrace;
|
|
192
|
+
}
|
|
193
|
+
return callerInfo;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Format caller information for display.
|
|
197
|
+
*
|
|
198
|
+
* @param callerInfo - Caller info to format
|
|
199
|
+
* @returns Formatted string like "file.ts:123" or just "file.ts" in production
|
|
200
|
+
*/
|
|
201
|
+
export function formatCallerInfo(callerInfo) {
|
|
202
|
+
if (callerInfo.lineNumber > 0) {
|
|
203
|
+
return `${callerInfo.fileName}:${callerInfo.lineNumber}`;
|
|
204
|
+
}
|
|
205
|
+
return callerInfo.fileName;
|
|
206
|
+
}
|
|
9
207
|
/**
|
|
10
208
|
* Format a timestamp for logging.
|
|
11
209
|
* @param date - The date to format
|
|
@@ -71,6 +269,7 @@ export function createColoredLogMessage(level, message, context) {
|
|
|
71
269
|
const serverColor = COLORS.brightCyan;
|
|
72
270
|
const moduleColor = COLORS.brightMagenta;
|
|
73
271
|
const traceColor = COLORS.yellow;
|
|
272
|
+
const callerColor = COLORS.brightBlue;
|
|
74
273
|
const resetColor = getResetColor();
|
|
75
274
|
let result = `${timestampColor}[${timestamp}]${resetColor} ${levelColor}[${formattedLevel}]${resetColor} ${pidColor}[${formattedPid}]${resetColor}`;
|
|
76
275
|
if (context?.traceId) {
|
|
@@ -83,6 +282,9 @@ export function createColoredLogMessage(level, message, context) {
|
|
|
83
282
|
if (context?.module) {
|
|
84
283
|
result += ` ${moduleColor}[${context.module}]${resetColor}`;
|
|
85
284
|
}
|
|
285
|
+
if (context?.caller) {
|
|
286
|
+
result += ` ${callerColor}[${context.caller}]${resetColor}`;
|
|
287
|
+
}
|
|
86
288
|
result += ` ${message}`;
|
|
87
289
|
return result;
|
|
88
290
|
}
|
|
@@ -110,6 +312,9 @@ export function createLogMessage(level, message, context) {
|
|
|
110
312
|
if (context?.module) {
|
|
111
313
|
result += ` [${context.module}]`;
|
|
112
314
|
}
|
|
315
|
+
if (context?.caller) {
|
|
316
|
+
result += ` [${context.caller}]`;
|
|
317
|
+
}
|
|
113
318
|
result += ` ${message}`;
|
|
114
319
|
return result;
|
|
115
320
|
}
|
|
@@ -42,6 +42,9 @@ export declare const LOG_MODULES: {
|
|
|
42
42
|
readonly SESSION_API: {
|
|
43
43
|
module: string;
|
|
44
44
|
};
|
|
45
|
+
readonly SESSION_TRACKER: {
|
|
46
|
+
module: string;
|
|
47
|
+
};
|
|
45
48
|
readonly CONNECTION_MANAGER: {
|
|
46
49
|
module: string;
|
|
47
50
|
};
|
|
@@ -99,12 +102,6 @@ export declare const LOG_MODULES: {
|
|
|
99
102
|
readonly PID_MANAGER: {
|
|
100
103
|
module: string;
|
|
101
104
|
};
|
|
102
|
-
readonly CLIENT_TRACKER: {
|
|
103
|
-
module: string;
|
|
104
|
-
};
|
|
105
|
-
readonly CLIENT_API: {
|
|
106
|
-
module: string;
|
|
107
|
-
};
|
|
108
105
|
readonly SERVER_API: {
|
|
109
106
|
module: string;
|
|
110
107
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-modules.d.ts","sourceRoot":"","sources":["../../../../../src/utils/logger/log-modules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"log-modules.d.ts","sourceRoot":"","sources":["../../../../../src/utils/logger/log-modules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4DtB;;;;;;;;;;;OAWG;mCACmB,MAAM;;;CACpB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,WAAW,EAAE,SAAS,CAAC,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC"}
|
|
@@ -29,6 +29,7 @@ export const LOG_MODULES = {
|
|
|
29
29
|
SESSION_MANAGER: { module: 'SessionManager' },
|
|
30
30
|
SESSION: { module: 'Session' },
|
|
31
31
|
SESSION_API: { module: 'Session API' },
|
|
32
|
+
SESSION_TRACKER: { module: 'SessionTracker' },
|
|
32
33
|
// Connection management
|
|
33
34
|
CONNECTION_MANAGER: { module: 'ConnectionManager' },
|
|
34
35
|
HUB_MANAGER: { module: 'HubManager' },
|
|
@@ -57,9 +58,6 @@ export const LOG_MODULES = {
|
|
|
57
58
|
SSE_TRANSPORT: { module: 'SSETransport' },
|
|
58
59
|
// PID management
|
|
59
60
|
PID_MANAGER: { module: 'PIDManager' },
|
|
60
|
-
// Client tracking
|
|
61
|
-
CLIENT_TRACKER: { module: 'ClientTracker' },
|
|
62
|
-
CLIENT_API: { module: 'ClientAPI' },
|
|
63
61
|
// Server API
|
|
64
62
|
SERVER_API: { module: 'ServerAPI' },
|
|
65
63
|
MCP_STATUS: { module: 'MCPStatus' },
|
|
@@ -61,8 +61,8 @@ export declare function isToolsListResponse(data: string): boolean;
|
|
|
61
61
|
/**
|
|
62
62
|
* Simplify tools/list response log information.
|
|
63
63
|
* @param data - Complete response data
|
|
64
|
-
* @returns Simplified log information
|
|
64
|
+
* @returns Simplified log information, or null if cannot be simplified
|
|
65
65
|
*/
|
|
66
|
-
export declare function simplifyToolsListResponse(data: string): string;
|
|
66
|
+
export declare function simplifyToolsListResponse(data: string): string | null;
|
|
67
67
|
export {};
|
|
68
68
|
//# sourceMappingURL=log-output.d.ts.map
|
|
@@ -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,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CA4BnE;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,CAyCzD;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAuFrE"}
|
|
@@ -99,7 +99,14 @@ export function formatMcpMessageForLogging(message) {
|
|
|
99
99
|
const rawJson = JSON.stringify(message);
|
|
100
100
|
let logMessage;
|
|
101
101
|
if (isToolsListResponse(rawJson)) {
|
|
102
|
-
|
|
102
|
+
const simplified = simplifyToolsListResponse(rawJson);
|
|
103
|
+
if (simplified === null) {
|
|
104
|
+
// Could not simplify, use pretty JSON formatting
|
|
105
|
+
logMessage = stringifyForLogging(message);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
logMessage = simplified;
|
|
109
|
+
}
|
|
103
110
|
}
|
|
104
111
|
else if (hasImageContent(rawJson)) {
|
|
105
112
|
const simplified = simplifyImageContent(rawJson);
|
|
@@ -256,7 +263,7 @@ export function isToolsListResponse(data) {
|
|
|
256
263
|
/**
|
|
257
264
|
* Simplify tools/list response log information.
|
|
258
265
|
* @param data - Complete response data
|
|
259
|
-
* @returns Simplified log information
|
|
266
|
+
* @returns Simplified log information, or null if cannot be simplified
|
|
260
267
|
*/
|
|
261
268
|
export function simplifyToolsListResponse(data) {
|
|
262
269
|
try {
|
|
@@ -266,6 +273,9 @@ export function simplifyToolsListResponse(data) {
|
|
|
266
273
|
if (dataMatch) {
|
|
267
274
|
const jsonData = dataMatch[1].trim();
|
|
268
275
|
const simplified = simplifyToolsListResponse(jsonData);
|
|
276
|
+
if (simplified === null) {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
269
279
|
return `event: message\ndata: ${simplified}`;
|
|
270
280
|
}
|
|
271
281
|
}
|
|
@@ -277,11 +287,19 @@ export function simplifyToolsListResponse(data) {
|
|
|
277
287
|
const result = msg.result;
|
|
278
288
|
if ('tools' in result) {
|
|
279
289
|
const toolsCount = Array.isArray(result.tools) ? result.tools.length : 0;
|
|
280
|
-
|
|
290
|
+
if (toolsCount > 0) {
|
|
291
|
+
return `Returned ${toolsCount} tools`;
|
|
292
|
+
}
|
|
293
|
+
// No tools, don't simplify
|
|
294
|
+
return null;
|
|
281
295
|
}
|
|
282
296
|
if ('resources' in result) {
|
|
283
297
|
const resourcesCount = Array.isArray(result.resources) ? result.resources.length : 0;
|
|
284
|
-
|
|
298
|
+
if (resourcesCount > 0) {
|
|
299
|
+
return `Returned ${resourcesCount} resources`;
|
|
300
|
+
}
|
|
301
|
+
// No resources, don't simplify
|
|
302
|
+
return null;
|
|
285
303
|
}
|
|
286
304
|
if ('capabilities' in result &&
|
|
287
305
|
typeof result.capabilities === 'object' &&
|
|
@@ -308,13 +326,16 @@ export function simplifyToolsListResponse(data) {
|
|
|
308
326
|
else if (resourcesCount > 0) {
|
|
309
327
|
return `Returned ${resourcesCount} resources`;
|
|
310
328
|
}
|
|
329
|
+
// No tools or resources, don't simplify
|
|
330
|
+
return null;
|
|
311
331
|
}
|
|
312
332
|
}
|
|
313
333
|
}
|
|
314
334
|
}
|
|
315
335
|
}
|
|
316
336
|
catch {
|
|
317
|
-
// Parsing failed,
|
|
337
|
+
// Parsing failed, don't simplify
|
|
318
338
|
}
|
|
319
|
-
|
|
339
|
+
// Could not simplify
|
|
340
|
+
return null;
|
|
320
341
|
}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* - Error formatting with stack trace truncation to prevent overly verbose logs
|
|
11
11
|
* - MCP server-specific logging with serverName context
|
|
12
12
|
* - Log rotation with date-based file naming and automatic cleanup
|
|
13
|
+
* - Caller location information (file name and line number)
|
|
13
14
|
*
|
|
14
15
|
* The logger supports four log levels: debug, info, warn, and error, with configurable
|
|
15
16
|
* minimum log level threshold.
|
|
@@ -33,8 +34,20 @@ export declare class Logger {
|
|
|
33
34
|
private level;
|
|
34
35
|
private useStderr;
|
|
35
36
|
private useColor;
|
|
37
|
+
private showCaller;
|
|
36
38
|
private devLogger;
|
|
37
39
|
constructor(level?: LogLevel);
|
|
40
|
+
/**
|
|
41
|
+
* Enable or disable caller information in logs.
|
|
42
|
+
* When enabled, logs will show the file name and line number where the log was called.
|
|
43
|
+
*
|
|
44
|
+
* @param show - Whether to show caller information
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* logger.setShowCaller(false); // Disable caller info
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
setShowCaller(show: boolean): void;
|
|
38
51
|
/**
|
|
39
52
|
* Enables development logging mode with file output and enhanced debugging.
|
|
40
53
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../../../src/utils/logger/logger.ts"],"names":[],"mappings":"AAAA
|
|
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;AAc5C,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;IAuDX;;;;;;;;;;;;;;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;IAuD3B;;;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"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* - Error formatting with stack trace truncation to prevent overly verbose logs
|
|
11
11
|
* - MCP server-specific logging with serverName context
|
|
12
12
|
* - Log rotation with date-based file naming and automatic cleanup
|
|
13
|
+
* - Caller location information (file name and line number)
|
|
13
14
|
*
|
|
14
15
|
* The logger supports four log levels: debug, info, warn, and error, with configurable
|
|
15
16
|
* minimum log level threshold.
|
|
@@ -28,12 +29,13 @@
|
|
|
28
29
|
*/
|
|
29
30
|
import { DevLogger } from './dev-logger.js';
|
|
30
31
|
import { LOG_MODULES } from './log-modules.js';
|
|
31
|
-
import { createColoredLogMessage, createLogMessage, formatError, formatTimestamp, formatLogLevel, formatPid } from './log-formatter.js';
|
|
32
|
+
import { createColoredLogMessage, createLogMessage, formatError, formatTimestamp, formatLogLevel, formatPid, getCallerInfo, formatCallerInfo } from './log-formatter.js';
|
|
32
33
|
import { setDevModeEnabled } from '../json-utils.js';
|
|
33
34
|
export class Logger {
|
|
34
35
|
level = 'info';
|
|
35
36
|
useStderr = false;
|
|
36
37
|
useColor = true;
|
|
38
|
+
showCaller = true;
|
|
37
39
|
devLogger = new DevLogger();
|
|
38
40
|
constructor(level = 'info') {
|
|
39
41
|
this.level = level;
|
|
@@ -45,6 +47,24 @@ export class Logger {
|
|
|
45
47
|
if (noColorEnv === 'true' || noColorEnv === '1' || noColorEnv === '') {
|
|
46
48
|
this.setUseColor(false);
|
|
47
49
|
}
|
|
50
|
+
// Check LOG_CALLER environment variable
|
|
51
|
+
const logCallerEnv = process.env.LOG_CALLER;
|
|
52
|
+
if (logCallerEnv === 'false' || logCallerEnv === '0') {
|
|
53
|
+
this.setShowCaller(false);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Enable or disable caller information in logs.
|
|
58
|
+
* When enabled, logs will show the file name and line number where the log was called.
|
|
59
|
+
*
|
|
60
|
+
* @param show - Whether to show caller information
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* logger.setShowCaller(false); // Disable caller info
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
setShowCaller(show) {
|
|
67
|
+
this.showCaller = show;
|
|
48
68
|
}
|
|
49
69
|
/**
|
|
50
70
|
* Enables development logging mode with file output and enhanced debugging.
|
|
@@ -101,13 +121,19 @@ export class Logger {
|
|
|
101
121
|
const formattedArgs = args.map((arg) => formatError(arg)).join(' ');
|
|
102
122
|
fullMessage = `${message} ${formattedArgs}`;
|
|
103
123
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
124
|
+
// Build context object
|
|
125
|
+
const context = {
|
|
126
|
+
...(options?.module && { module: options.module }),
|
|
127
|
+
...(options?.traceId && { traceId: options.traceId }),
|
|
128
|
+
...(options?.spanId && { spanId: options.spanId })
|
|
129
|
+
};
|
|
130
|
+
// Add caller info if enabled
|
|
131
|
+
if (this.showCaller) {
|
|
132
|
+
const callerInfo = getCallerInfo(4); // Skip 4 frames to get to the actual caller
|
|
133
|
+
if (callerInfo) {
|
|
134
|
+
context.caller = formatCallerInfo(callerInfo);
|
|
109
135
|
}
|
|
110
|
-
|
|
136
|
+
}
|
|
111
137
|
const coloredLogMsg = createColoredLogMessage(level, fullMessage, context);
|
|
112
138
|
const plainLogMsg = createLogMessage(level, fullMessage, context);
|
|
113
139
|
const consoleLogMsg = this.useColor ? coloredLogMsg : plainLogMsg;
|
|
@@ -256,10 +282,19 @@ export class Logger {
|
|
|
256
282
|
* Contains the core logging logic originally in serverLog.
|
|
257
283
|
*/
|
|
258
284
|
logSingleServerLine(level, serverName, message, context) {
|
|
285
|
+
// Build log context with server name
|
|
259
286
|
const logContext = {
|
|
260
287
|
...context,
|
|
261
288
|
serverName
|
|
262
289
|
};
|
|
290
|
+
// Add caller info if enabled (only once per serverLog call would be better,
|
|
291
|
+
// but for consistency with multi-line logging, we add it for each line)
|
|
292
|
+
if (this.showCaller) {
|
|
293
|
+
const callerInfo = getCallerInfo(5); // Skip 5 frames to get to the actual caller
|
|
294
|
+
if (callerInfo) {
|
|
295
|
+
logContext.caller = formatCallerInfo(callerInfo);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
263
298
|
const coloredLogMsg = createColoredLogMessage(level, message, logContext);
|
|
264
299
|
const plainLogMsg = createLogMessage(level, message, logContext);
|
|
265
300
|
const consoleLogMsg = this.useColor ? coloredLogMsg : plainLogMsg;
|
|
@@ -6,66 +6,66 @@
|
|
|
6
6
|
* every function call. It uses Node.js AsyncLocalStorage to maintain context
|
|
7
7
|
* throughout the request lifecycle.
|
|
8
8
|
*
|
|
9
|
-
* The primary use case is storing
|
|
9
|
+
* The primary use case is storing session context information (sessionId, clientName,
|
|
10
10
|
* cwd, project, etc.) that needs to be accessible from any part of the application
|
|
11
11
|
* during request processing.
|
|
12
12
|
*
|
|
13
13
|
* @module utils/request-context
|
|
14
14
|
*/
|
|
15
15
|
import { AsyncLocalStorage } from 'async_hooks';
|
|
16
|
-
import type {
|
|
16
|
+
import type { SessionContext } from '../../shared/types/session-context.types.js';
|
|
17
17
|
/**
|
|
18
18
|
* AsyncLocalStorage instance for storing request context.
|
|
19
19
|
*
|
|
20
|
-
* This storage holds the
|
|
20
|
+
* This storage holds the SessionContext object for the current request and
|
|
21
21
|
* makes it available throughout the entire request processing chain,
|
|
22
22
|
* including asynchronous operations and nested function calls.
|
|
23
23
|
*
|
|
24
24
|
* @example
|
|
25
25
|
* ```typescript
|
|
26
26
|
* // In route handler
|
|
27
|
-
* await requestContext.run(
|
|
28
|
-
* // Any code executed here can access the
|
|
29
|
-
* const ctx =
|
|
27
|
+
* await requestContext.run(sessionContext, async () => {
|
|
28
|
+
* // Any code executed here can access the session context
|
|
29
|
+
* const ctx = getSessionContext();
|
|
30
30
|
* console.log(ctx.sessionId);
|
|
31
31
|
* });
|
|
32
32
|
* ```
|
|
33
33
|
*/
|
|
34
|
-
export declare const requestContext: AsyncLocalStorage<
|
|
34
|
+
export declare const requestContext: AsyncLocalStorage<SessionContext>;
|
|
35
35
|
/**
|
|
36
|
-
* Retrieves the current request's
|
|
36
|
+
* Retrieves the current request's session context.
|
|
37
37
|
*
|
|
38
|
-
* This function returns the
|
|
38
|
+
* This function returns the SessionContext object stored in the AsyncLocalStorage
|
|
39
39
|
* for the current request. It should only be called within a request context
|
|
40
40
|
* that has been established using requestContext.run().
|
|
41
41
|
*
|
|
42
|
-
* @returns {
|
|
42
|
+
* @returns {SessionContext | undefined} The current request's session context, or undefined if not in a request context
|
|
43
43
|
*
|
|
44
44
|
* @example
|
|
45
45
|
* ```typescript
|
|
46
|
-
* const context =
|
|
46
|
+
* const context = getSessionContext();
|
|
47
47
|
* if (context) {
|
|
48
48
|
* console.log(`Processing request for session: ${context.sessionId}`);
|
|
49
49
|
* }
|
|
50
50
|
* ```
|
|
51
51
|
*/
|
|
52
|
-
export declare function
|
|
52
|
+
export declare function getSessionContext(): SessionContext | undefined;
|
|
53
53
|
/**
|
|
54
54
|
* Retrieves the current request's working directory (cwd).
|
|
55
55
|
*
|
|
56
56
|
* This is a convenience function that extracts the cwd property from the
|
|
57
|
-
* current request's
|
|
58
|
-
* that need to respect 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
59
|
*
|
|
60
60
|
* @returns {string | undefined} The current request's working directory, or undefined if not available
|
|
61
61
|
*
|
|
62
62
|
* @example
|
|
63
63
|
* ```typescript
|
|
64
|
-
* const cwd =
|
|
64
|
+
* const cwd = getSessionCwd();
|
|
65
65
|
* if (cwd) {
|
|
66
66
|
* const fullPath = path.join(cwd, relativePath);
|
|
67
67
|
* }
|
|
68
68
|
* ```
|
|
69
69
|
*/
|
|
70
|
-
export declare function
|
|
70
|
+
export declare function getSessionCwd(): string | undefined;
|
|
71
71
|
//# sourceMappingURL=request-context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../../../src/utils/request-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../../../src/utils/request-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAE7E;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,cAAc,mCAA0C,CAAC;AAEtE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,SAAS,CAE9D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAElD"}
|