@west10tech/notion-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +120 -0
- package/dist/clients/notion-client.d.ts +53 -0
- package/dist/clients/notion-client.d.ts.map +1 -0
- package/dist/clients/notion-client.js +2950 -0
- package/dist/clients/notion-client.js.map +1 -0
- package/dist/config.d.ts +21 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +58 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +163 -0
- package/dist/index.js.map +1 -0
- package/dist/services/log-batcher.d.ts +44 -0
- package/dist/services/log-batcher.d.ts.map +1 -0
- package/dist/services/log-batcher.js +81 -0
- package/dist/services/log-batcher.js.map +1 -0
- package/dist/services/log-shipper.d.ts +104 -0
- package/dist/services/log-shipper.d.ts.map +1 -0
- package/dist/services/log-shipper.js +384 -0
- package/dist/services/log-shipper.js.map +1 -0
- package/dist/services/logger.d.ts +92 -0
- package/dist/services/logger.d.ts.map +1 -0
- package/dist/services/logger.js +224 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/progress-reporter.d.ts +64 -0
- package/dist/services/progress-reporter.d.ts.map +1 -0
- package/dist/services/progress-reporter.js +192 -0
- package/dist/services/progress-reporter.js.map +1 -0
- package/dist/services/request-tracker.d.ts +55 -0
- package/dist/services/request-tracker.d.ts.map +1 -0
- package/dist/services/request-tracker.js +184 -0
- package/dist/services/request-tracker.js.map +1 -0
- package/dist/tools/notion-tools.d.ts +21 -0
- package/dist/tools/notion-tools.d.ts.map +1 -0
- package/dist/tools/notion-tools.js +1146 -0
- package/dist/tools/notion-tools.js.map +1 -0
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger - Centralized logging service for notion-mcp
|
|
3
|
+
* Provides structured logging with centralized log shipping capability
|
|
4
|
+
*/
|
|
5
|
+
import { LogShipper } from './log-shipper.js';
|
|
6
|
+
export type LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'FATAL';
|
|
7
|
+
export interface LoggerConfig {
|
|
8
|
+
logLevel: LogLevel;
|
|
9
|
+
component: string;
|
|
10
|
+
enableConsole: boolean;
|
|
11
|
+
enableShipping: boolean;
|
|
12
|
+
serverName: string;
|
|
13
|
+
logShipper?: LogShipper;
|
|
14
|
+
}
|
|
15
|
+
export declare class Logger {
|
|
16
|
+
private config;
|
|
17
|
+
private batcher;
|
|
18
|
+
private logLevelPriority;
|
|
19
|
+
constructor(config: LoggerConfig);
|
|
20
|
+
/**
|
|
21
|
+
* Log a debug message
|
|
22
|
+
*/
|
|
23
|
+
debug(action: string, message: string, metadata?: any): void;
|
|
24
|
+
/**
|
|
25
|
+
* Log an info message
|
|
26
|
+
*/
|
|
27
|
+
info(action: string, message: string, metadata?: any): void;
|
|
28
|
+
/**
|
|
29
|
+
* Log a warning message
|
|
30
|
+
*/
|
|
31
|
+
warn(action: string, message: string, metadata?: any): void;
|
|
32
|
+
/**
|
|
33
|
+
* Log an error message
|
|
34
|
+
*/
|
|
35
|
+
error(action: string, message: string, metadata?: any): void;
|
|
36
|
+
/**
|
|
37
|
+
* Log a fatal error message
|
|
38
|
+
*/
|
|
39
|
+
fatal(action: string, message: string, metadata?: any): void;
|
|
40
|
+
/**
|
|
41
|
+
* Core logging method
|
|
42
|
+
*/
|
|
43
|
+
private log;
|
|
44
|
+
/**
|
|
45
|
+
* Log HTTP request start
|
|
46
|
+
*/
|
|
47
|
+
logRequestStart(method: string, url: string, metadata?: any): void;
|
|
48
|
+
/**
|
|
49
|
+
* Log HTTP request success
|
|
50
|
+
*/
|
|
51
|
+
logRequestSuccess(method: string, url: string, status: number, duration: number, metadata?: any): void;
|
|
52
|
+
/**
|
|
53
|
+
* Log HTTP request error
|
|
54
|
+
*/
|
|
55
|
+
logRequestError(method: string, url: string, error: any, duration: number, metadata?: any): void;
|
|
56
|
+
/**
|
|
57
|
+
* Log tool execution start
|
|
58
|
+
*/
|
|
59
|
+
logToolStart(toolName: string, params: any): void;
|
|
60
|
+
/**
|
|
61
|
+
* Log tool execution success
|
|
62
|
+
*/
|
|
63
|
+
logToolSuccess(toolName: string, duration: number, responseData?: any, httpStatus?: number): void;
|
|
64
|
+
/**
|
|
65
|
+
* Log tool execution error
|
|
66
|
+
*/
|
|
67
|
+
logToolError(toolName: string, error: any, duration: number, params?: any): void;
|
|
68
|
+
/**
|
|
69
|
+
* Log authentication events
|
|
70
|
+
*/
|
|
71
|
+
logAuthEvent(event: string, success: boolean, metadata?: any): void;
|
|
72
|
+
/**
|
|
73
|
+
* Log rate limiting events
|
|
74
|
+
*/
|
|
75
|
+
logRateLimit(action: string, delayMs: number, metadata?: any): void;
|
|
76
|
+
/**
|
|
77
|
+
* Truncate large data objects to prevent oversized log entries
|
|
78
|
+
*/
|
|
79
|
+
private truncateIfNeeded;
|
|
80
|
+
/**
|
|
81
|
+
* Get logger status
|
|
82
|
+
*/
|
|
83
|
+
getStatus(): {
|
|
84
|
+
config: LoggerConfig;
|
|
85
|
+
batcherStatus?: any;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Shutdown logger and flush remaining logs
|
|
89
|
+
*/
|
|
90
|
+
shutdown(): Promise<void>;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/services/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger - Centralized logging service for notion-mcp
|
|
3
|
+
* Provides structured logging with centralized log shipping capability
|
|
4
|
+
*/
|
|
5
|
+
import { LogBatcher } from './log-batcher.js';
|
|
6
|
+
export class Logger {
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.batcher = null;
|
|
9
|
+
this.logLevelPriority = {
|
|
10
|
+
DEBUG: 0,
|
|
11
|
+
INFO: 1,
|
|
12
|
+
WARN: 2,
|
|
13
|
+
ERROR: 3,
|
|
14
|
+
FATAL: 4
|
|
15
|
+
};
|
|
16
|
+
this.config = config;
|
|
17
|
+
if (this.config.enableShipping && config.logShipper) {
|
|
18
|
+
this.batcher = new LogBatcher(config.logShipper);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Log a debug message
|
|
23
|
+
*/
|
|
24
|
+
debug(action, message, metadata) {
|
|
25
|
+
this.log('DEBUG', action, message, metadata);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Log an info message
|
|
29
|
+
*/
|
|
30
|
+
info(action, message, metadata) {
|
|
31
|
+
this.log('INFO', action, message, metadata);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Log a warning message
|
|
35
|
+
*/
|
|
36
|
+
warn(action, message, metadata) {
|
|
37
|
+
this.log('WARN', action, message, metadata);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Log an error message
|
|
41
|
+
*/
|
|
42
|
+
error(action, message, metadata) {
|
|
43
|
+
this.log('ERROR', action, message, metadata);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Log a fatal error message
|
|
47
|
+
*/
|
|
48
|
+
fatal(action, message, metadata) {
|
|
49
|
+
this.log('FATAL', action, message, metadata);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Core logging method
|
|
53
|
+
*/
|
|
54
|
+
log(level, action, message, metadata) {
|
|
55
|
+
// Check if this log level should be processed
|
|
56
|
+
if (this.logLevelPriority[level] < this.logLevelPriority[this.config.logLevel]) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const timestamp = new Date().toISOString();
|
|
60
|
+
const user = process.env.CORETEXT_USER || 'unknown';
|
|
61
|
+
const sessionId = this.batcher?.getSessionId() || `notion-mcp-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
|
|
62
|
+
const logEntry = {
|
|
63
|
+
timestamp,
|
|
64
|
+
sessionId,
|
|
65
|
+
user,
|
|
66
|
+
integration: '',
|
|
67
|
+
component: this.config.component,
|
|
68
|
+
level,
|
|
69
|
+
action,
|
|
70
|
+
message,
|
|
71
|
+
projectId: process.env.PROJECT_ID || '',
|
|
72
|
+
organizationId: process.env.ORGANIZATION_ID || '',
|
|
73
|
+
...(metadata && { metadata })
|
|
74
|
+
};
|
|
75
|
+
// Always log to console (stderr) for MCP protocol compliance
|
|
76
|
+
if (this.config.enableConsole) {
|
|
77
|
+
const componentPrefix = `-${this.config.component.toUpperCase()}`;
|
|
78
|
+
console.error(`[${componentPrefix}] ${JSON.stringify(logEntry)}`);
|
|
79
|
+
}
|
|
80
|
+
// Send to centralized logging if enabled
|
|
81
|
+
if (this.config.enableShipping && this.batcher) {
|
|
82
|
+
// Create full log entry matching API specification
|
|
83
|
+
const fullLogEntry = {
|
|
84
|
+
timestamp,
|
|
85
|
+
sessionId,
|
|
86
|
+
user,
|
|
87
|
+
integration: '',
|
|
88
|
+
component: this.config.component,
|
|
89
|
+
action,
|
|
90
|
+
message,
|
|
91
|
+
projectId: process.env.PROJECT_ID || '',
|
|
92
|
+
organizationId: process.env.ORGANIZATION_ID || '',
|
|
93
|
+
...(metadata && { metadata })
|
|
94
|
+
};
|
|
95
|
+
this.batcher.addStructuredLog(fullLogEntry);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Log HTTP request start
|
|
100
|
+
*/
|
|
101
|
+
logRequestStart(method, url, metadata) {
|
|
102
|
+
this.debug('HTTP_REQUEST_START', `${method} ${url}`, {
|
|
103
|
+
method,
|
|
104
|
+
url,
|
|
105
|
+
...metadata
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Log HTTP request success
|
|
110
|
+
*/
|
|
111
|
+
logRequestSuccess(method, url, status, duration, metadata) {
|
|
112
|
+
this.info('HTTP_REQUEST_SUCCESS', `${method} ${url} - ${status} (${duration}ms)`, {
|
|
113
|
+
method,
|
|
114
|
+
url,
|
|
115
|
+
status,
|
|
116
|
+
duration_ms: duration,
|
|
117
|
+
...metadata
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Log HTTP request error
|
|
122
|
+
*/
|
|
123
|
+
logRequestError(method, url, error, duration, metadata) {
|
|
124
|
+
this.error('HTTP_REQUEST_ERROR', `${method} ${url} - ${error.message || error}`, {
|
|
125
|
+
method,
|
|
126
|
+
url,
|
|
127
|
+
error: error.message || String(error),
|
|
128
|
+
duration_ms: duration,
|
|
129
|
+
status: error.status || error.response?.status,
|
|
130
|
+
...metadata
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Log tool execution start
|
|
135
|
+
*/
|
|
136
|
+
logToolStart(toolName, params) {
|
|
137
|
+
this.info(toolName, `Executing ${toolName}`, {
|
|
138
|
+
toolParams: params,
|
|
139
|
+
paramCount: Object.keys(params || {}).length,
|
|
140
|
+
executionId: `exec_${Date.now()}_${Math.random().toString(36).substring(2, 6)}`
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Log tool execution success
|
|
145
|
+
*/
|
|
146
|
+
logToolSuccess(toolName, duration, responseData, httpStatus) {
|
|
147
|
+
this.info(toolName, `${toolName} completed successfully`, {
|
|
148
|
+
duration_ms: duration,
|
|
149
|
+
responseData: this.truncateIfNeeded(responseData),
|
|
150
|
+
responseSize: responseData ? JSON.stringify(responseData).length : 0,
|
|
151
|
+
...(httpStatus && { httpStatus })
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Log tool execution error
|
|
156
|
+
*/
|
|
157
|
+
logToolError(toolName, error, duration, params) {
|
|
158
|
+
this.error(toolName, `${toolName} failed`, {
|
|
159
|
+
duration_ms: duration,
|
|
160
|
+
errorDetails: {
|
|
161
|
+
message: error.message || String(error),
|
|
162
|
+
stack: error.stack,
|
|
163
|
+
code: error.code,
|
|
164
|
+
status: error.status || error.response?.status
|
|
165
|
+
},
|
|
166
|
+
toolParams: params,
|
|
167
|
+
errorType: error.constructor?.name || 'unknown'
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Log authentication events
|
|
172
|
+
*/
|
|
173
|
+
logAuthEvent(event, success, metadata) {
|
|
174
|
+
const level = success ? 'INFO' : 'ERROR';
|
|
175
|
+
this.log(level, 'AUTH_EVENT', `Authentication ${event}: ${success ? 'success' : 'failed'}`, {
|
|
176
|
+
event,
|
|
177
|
+
success,
|
|
178
|
+
...metadata
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Log rate limiting events
|
|
183
|
+
*/
|
|
184
|
+
logRateLimit(action, delayMs, metadata) {
|
|
185
|
+
this.warn('RATE_LIMIT', `Rate limit applied: ${action}`, {
|
|
186
|
+
action,
|
|
187
|
+
delay_ms: delayMs,
|
|
188
|
+
...metadata
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Truncate large data objects to prevent oversized log entries
|
|
193
|
+
*/
|
|
194
|
+
truncateIfNeeded(data, maxSize = 10000) {
|
|
195
|
+
if (!data)
|
|
196
|
+
return data;
|
|
197
|
+
const jsonString = JSON.stringify(data);
|
|
198
|
+
if (jsonString.length <= maxSize)
|
|
199
|
+
return data;
|
|
200
|
+
return {
|
|
201
|
+
_truncated: true,
|
|
202
|
+
_originalSize: jsonString.length,
|
|
203
|
+
_data: `[TRUNCATED - Original size: ${jsonString.length} chars]`
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get logger status
|
|
208
|
+
*/
|
|
209
|
+
getStatus() {
|
|
210
|
+
return {
|
|
211
|
+
config: this.config,
|
|
212
|
+
...(this.batcher && { batcherStatus: this.batcher.getBatchStatus() })
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Shutdown logger and flush remaining logs
|
|
217
|
+
*/
|
|
218
|
+
async shutdown() {
|
|
219
|
+
if (this.batcher) {
|
|
220
|
+
await this.batcher.shutdown();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/services/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { Logger } from './logger.js';
|
|
3
|
+
import { RequestTracker } from './request-tracker.js';
|
|
4
|
+
export interface ProgressUpdate {
|
|
5
|
+
progress: number;
|
|
6
|
+
total?: number;
|
|
7
|
+
message?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class ProgressReporter {
|
|
10
|
+
private server;
|
|
11
|
+
private logger;
|
|
12
|
+
private requestTracker;
|
|
13
|
+
private progressStates;
|
|
14
|
+
private minUpdateInterval;
|
|
15
|
+
constructor(server: Server, logger: Logger, requestTracker: RequestTracker);
|
|
16
|
+
/**
|
|
17
|
+
* Report progress for a given token
|
|
18
|
+
*/
|
|
19
|
+
report(progressToken: string | number, update: ProgressUpdate): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Report progress with percentage helper
|
|
22
|
+
*/
|
|
23
|
+
reportPercentage(progressToken: string | number, percentage: number, message?: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Report progress for multi-step operations
|
|
26
|
+
*/
|
|
27
|
+
reportStep(progressToken: string | number, currentStep: number, totalSteps: number, message?: string): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Report progress for batch operations
|
|
30
|
+
*/
|
|
31
|
+
reportBatch(progressToken: string | number, processedItems: number, totalItems: number, itemType?: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Clean up progress state for a token
|
|
34
|
+
*/
|
|
35
|
+
cleanup(progressToken: string | number): void;
|
|
36
|
+
/**
|
|
37
|
+
* Clean up all progress states for completed requests
|
|
38
|
+
*/
|
|
39
|
+
cleanupCompletedRequests(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Create a progress callback function for use in async operations
|
|
42
|
+
*/
|
|
43
|
+
createProgressCallback(progressToken: string | number): (update: ProgressUpdate) => Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Create a simple percentage-based progress callback
|
|
46
|
+
*/
|
|
47
|
+
createPercentageCallback(progressToken: string | number): (percentage: number, message?: string) => Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Get statistics about progress reporting
|
|
50
|
+
*/
|
|
51
|
+
getStats(): {
|
|
52
|
+
activeProgressTokens: number;
|
|
53
|
+
progressStates: Array<{
|
|
54
|
+
token: string | number;
|
|
55
|
+
lastProgress: number;
|
|
56
|
+
updateCount: number;
|
|
57
|
+
}>;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Shutdown and clean up
|
|
61
|
+
*/
|
|
62
|
+
shutdown(): void;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=progress-reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-reporter.d.ts","sourceRoot":"","sources":["../../src/services/progress-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAQD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,iBAAiB,CAAe;gBAE5B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc;IAO1E;;OAEG;IACG,MAAM,CACV,aAAa,EAAE,MAAM,GAAG,MAAM,EAC9B,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;IA8EhB;;OAEG;IACG,gBAAgB,CACpB,aAAa,EAAE,MAAM,GAAG,MAAM,EAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAgBhB;;OAEG;IACG,UAAU,CACd,aAAa,EAAE,MAAM,GAAG,MAAM,EAC9B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAQhB;;OAEG;IACG,WAAW,CACf,aAAa,EAAE,MAAM,GAAG,MAAM,EAC9B,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,MAAgB,GACzB,OAAO,CAAC,IAAI,CAAC;IAShB;;OAEG;IACH,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAY7C;;OAEG;IACH,wBAAwB,IAAI,IAAI;IAkBhC;;OAEG;IACH,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC;IAMjG;;OAEG;IACH,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;IAMjH;;OAEG;IACH,QAAQ,IAAI;QACV,oBAAoB,EAAE,MAAM,CAAC;QAC7B,cAAc,EAAE,KAAK,CAAC;YACpB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;YACvB,YAAY,EAAE,MAAM,CAAC;YACrB,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;KACJ;IAaD;;OAEG;IACH,QAAQ,IAAI,IAAI;CAMjB"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
export class ProgressReporter {
|
|
2
|
+
constructor(server, logger, requestTracker) {
|
|
3
|
+
this.minUpdateInterval = 100; // Minimum 100ms between updates
|
|
4
|
+
this.server = server;
|
|
5
|
+
this.logger = logger;
|
|
6
|
+
this.requestTracker = requestTracker;
|
|
7
|
+
this.progressStates = new Map();
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Report progress for a given token
|
|
11
|
+
*/
|
|
12
|
+
async report(progressToken, update) {
|
|
13
|
+
// Validate that the progress token is still active
|
|
14
|
+
if (!this.requestTracker.isProgressTokenActive(progressToken)) {
|
|
15
|
+
this.logger.debug('PROGRESS_TOKEN_INACTIVE', 'Progress token no longer active', {
|
|
16
|
+
progressToken,
|
|
17
|
+
progress: update.progress
|
|
18
|
+
});
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
// Get or create progress state
|
|
22
|
+
const state = this.progressStates.get(progressToken);
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
// Validate progress value increases
|
|
25
|
+
if (state && update.progress <= state.lastProgress) {
|
|
26
|
+
this.logger.warn('PROGRESS_NOT_INCREASING', 'Progress value must increase', {
|
|
27
|
+
progressToken,
|
|
28
|
+
lastProgress: state.lastProgress,
|
|
29
|
+
newProgress: update.progress
|
|
30
|
+
});
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Check rate limiting
|
|
34
|
+
if (state && (now - state.lastUpdateTime) < this.minUpdateInterval) {
|
|
35
|
+
this.logger.debug('PROGRESS_RATE_LIMITED', 'Progress update rate limited', {
|
|
36
|
+
progressToken,
|
|
37
|
+
timeSinceLastUpdate: now - state.lastUpdateTime,
|
|
38
|
+
minInterval: this.minUpdateInterval
|
|
39
|
+
});
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
// Send progress notification
|
|
44
|
+
await this.server.notification({
|
|
45
|
+
method: "notifications/progress",
|
|
46
|
+
params: {
|
|
47
|
+
progressToken,
|
|
48
|
+
progress: update.progress,
|
|
49
|
+
...(update.total !== undefined && { total: update.total }),
|
|
50
|
+
...(update.message && { message: update.message })
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
// Update state
|
|
54
|
+
this.progressStates.set(progressToken, {
|
|
55
|
+
lastProgress: update.progress,
|
|
56
|
+
lastUpdateTime: now,
|
|
57
|
+
updateCount: (state?.updateCount ?? 0) + 1
|
|
58
|
+
});
|
|
59
|
+
// Get request context for better logging
|
|
60
|
+
const context = this.requestTracker.getRequestByProgressToken(progressToken);
|
|
61
|
+
this.logger.info('PROGRESS_REPORTED', 'Progress notification sent', {
|
|
62
|
+
progressToken,
|
|
63
|
+
progress: update.progress,
|
|
64
|
+
total: update.total,
|
|
65
|
+
hasMessage: !!update.message,
|
|
66
|
+
updateCount: (state?.updateCount ?? 0) + 1,
|
|
67
|
+
requestId: context?.requestId,
|
|
68
|
+
toolName: context?.toolName
|
|
69
|
+
});
|
|
70
|
+
// Clean up if progress is complete
|
|
71
|
+
if (update.total !== undefined && update.progress >= update.total) {
|
|
72
|
+
this.cleanup(progressToken);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
this.logger.error('PROGRESS_REPORT_ERROR', 'Failed to send progress notification', {
|
|
77
|
+
progressToken,
|
|
78
|
+
error: error instanceof Error ? error.message : String(error)
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Report progress with percentage helper
|
|
84
|
+
*/
|
|
85
|
+
async reportPercentage(progressToken, percentage, message) {
|
|
86
|
+
if (percentage < 0 || percentage > 100) {
|
|
87
|
+
this.logger.warn('PROGRESS_PERCENTAGE_INVALID', 'Invalid percentage value', {
|
|
88
|
+
progressToken,
|
|
89
|
+
percentage
|
|
90
|
+
});
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
await this.report(progressToken, {
|
|
94
|
+
progress: percentage,
|
|
95
|
+
total: 100,
|
|
96
|
+
message
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Report progress for multi-step operations
|
|
101
|
+
*/
|
|
102
|
+
async reportStep(progressToken, currentStep, totalSteps, message) {
|
|
103
|
+
await this.report(progressToken, {
|
|
104
|
+
progress: currentStep,
|
|
105
|
+
total: totalSteps,
|
|
106
|
+
message
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Report progress for batch operations
|
|
111
|
+
*/
|
|
112
|
+
async reportBatch(progressToken, processedItems, totalItems, itemType = 'items') {
|
|
113
|
+
const percentage = Math.round((processedItems / totalItems) * 100);
|
|
114
|
+
await this.report(progressToken, {
|
|
115
|
+
progress: processedItems,
|
|
116
|
+
total: totalItems,
|
|
117
|
+
message: `Processed ${processedItems} of ${totalItems} ${itemType} (${percentage}%)`
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Clean up progress state for a token
|
|
122
|
+
*/
|
|
123
|
+
cleanup(progressToken) {
|
|
124
|
+
const state = this.progressStates.get(progressToken);
|
|
125
|
+
if (state) {
|
|
126
|
+
this.logger.debug('PROGRESS_CLEANUP', 'Cleaning up progress state', {
|
|
127
|
+
progressToken,
|
|
128
|
+
finalProgress: state.lastProgress,
|
|
129
|
+
totalUpdates: state.updateCount
|
|
130
|
+
});
|
|
131
|
+
this.progressStates.delete(progressToken);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Clean up all progress states for completed requests
|
|
136
|
+
*/
|
|
137
|
+
cleanupCompletedRequests() {
|
|
138
|
+
let cleanedCount = 0;
|
|
139
|
+
for (const [progressToken] of this.progressStates.entries()) {
|
|
140
|
+
if (!this.requestTracker.isProgressTokenActive(progressToken)) {
|
|
141
|
+
this.progressStates.delete(progressToken);
|
|
142
|
+
cleanedCount++;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (cleanedCount > 0) {
|
|
146
|
+
this.logger.info('PROGRESS_CLEANUP_COMPLETED', 'Cleaned up inactive progress states', {
|
|
147
|
+
cleanedCount,
|
|
148
|
+
remainingStates: this.progressStates.size
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Create a progress callback function for use in async operations
|
|
154
|
+
*/
|
|
155
|
+
createProgressCallback(progressToken) {
|
|
156
|
+
return async (update) => {
|
|
157
|
+
await this.report(progressToken, update);
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Create a simple percentage-based progress callback
|
|
162
|
+
*/
|
|
163
|
+
createPercentageCallback(progressToken) {
|
|
164
|
+
return async (percentage, message) => {
|
|
165
|
+
await this.reportPercentage(progressToken, percentage, message);
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get statistics about progress reporting
|
|
170
|
+
*/
|
|
171
|
+
getStats() {
|
|
172
|
+
const progressStates = Array.from(this.progressStates.entries()).map(([token, state]) => ({
|
|
173
|
+
token,
|
|
174
|
+
lastProgress: state.lastProgress,
|
|
175
|
+
updateCount: state.updateCount
|
|
176
|
+
}));
|
|
177
|
+
return {
|
|
178
|
+
activeProgressTokens: this.progressStates.size,
|
|
179
|
+
progressStates
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Shutdown and clean up
|
|
184
|
+
*/
|
|
185
|
+
shutdown() {
|
|
186
|
+
this.logger.info('PROGRESS_REPORTER_SHUTDOWN', 'Shutting down progress reporter', {
|
|
187
|
+
activeStates: this.progressStates.size
|
|
188
|
+
});
|
|
189
|
+
this.progressStates.clear();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=progress-reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-reporter.js","sourceRoot":"","sources":["../../src/services/progress-reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Logger } from './logger.js';
|
|
2
|
+
export interface RequestContext {
|
|
3
|
+
requestId: string | number;
|
|
4
|
+
abortController: AbortController;
|
|
5
|
+
progressToken?: string | number;
|
|
6
|
+
startTime: number;
|
|
7
|
+
toolName?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class RequestTracker {
|
|
10
|
+
private activeRequests;
|
|
11
|
+
private progressTokens;
|
|
12
|
+
private logger;
|
|
13
|
+
constructor(logger: Logger);
|
|
14
|
+
/**
|
|
15
|
+
* Register a new request for tracking
|
|
16
|
+
*/
|
|
17
|
+
registerRequest(requestId: string | number, progressToken?: string | number, toolName?: string): RequestContext;
|
|
18
|
+
/**
|
|
19
|
+
* Get request context by ID
|
|
20
|
+
*/
|
|
21
|
+
getRequest(requestId: string | number): RequestContext | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Get request context by progress token
|
|
24
|
+
*/
|
|
25
|
+
getRequestByProgressToken(progressToken: string | number): RequestContext | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Cancel a request
|
|
28
|
+
*/
|
|
29
|
+
cancelRequest(requestId: string | number, reason?: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Clean up a completed or cancelled request
|
|
32
|
+
*/
|
|
33
|
+
cleanup(requestId: string | number): void;
|
|
34
|
+
/**
|
|
35
|
+
* Check if a request is still active
|
|
36
|
+
*/
|
|
37
|
+
isActive(requestId: string | number): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Check if a progress token is valid and active
|
|
40
|
+
*/
|
|
41
|
+
isProgressTokenActive(progressToken: string | number): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Get all active request IDs
|
|
44
|
+
*/
|
|
45
|
+
getActiveRequestIds(): (string | number)[];
|
|
46
|
+
/**
|
|
47
|
+
* Clean up old requests (called periodically)
|
|
48
|
+
*/
|
|
49
|
+
cleanupStaleRequests(maxAgeMs?: number): number;
|
|
50
|
+
/**
|
|
51
|
+
* Shutdown and clean up all requests
|
|
52
|
+
*/
|
|
53
|
+
shutdown(): void;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=request-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-tracker.d.ts","sourceRoot":"","sources":["../../src/services/request-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAM1B;;OAEG;IACH,eAAe,CACb,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAC/B,QAAQ,CAAC,EAAE,MAAM,GAChB,cAAc;IAmCjB;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,GAAG,SAAS;IAIlE;;OAEG;IACH,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,GAAG,SAAS;IAQrF;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAuCnE;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAwBzC;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAK7C;;OAEG;IACH,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAQ9D;;OAEG;IACH,mBAAmB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE;IAI1C;;OAEG;IACH,oBAAoB,CAAC,QAAQ,GAAE,MAAe,GAAG,MAAM;IAkCvD;;OAEG;IACH,QAAQ,IAAI,IAAI;CAgBjB"}
|