proofscan 0.9.2 → 0.10.1
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/dist/cli.js +6 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +4 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/log.d.ts +10 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +126 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/proxy.d.ts +12 -0
- package/dist/commands/proxy.d.ts.map +1 -0
- package/dist/commands/proxy.js +220 -0
- package/dist/commands/proxy.js.map +1 -0
- package/dist/proxy/index.d.ts +10 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +10 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/logger.d.ts +110 -0
- package/dist/proxy/logger.d.ts.map +1 -0
- package/dist/proxy/logger.js +248 -0
- package/dist/proxy/logger.js.map +1 -0
- package/dist/proxy/mcp-server.d.ts +101 -0
- package/dist/proxy/mcp-server.d.ts.map +1 -0
- package/dist/proxy/mcp-server.js +391 -0
- package/dist/proxy/mcp-server.js.map +1 -0
- package/dist/proxy/request-router.d.ts +26 -0
- package/dist/proxy/request-router.d.ts.map +1 -0
- package/dist/proxy/request-router.js +90 -0
- package/dist/proxy/request-router.js.map +1 -0
- package/dist/proxy/runtime-state.d.ts +131 -0
- package/dist/proxy/runtime-state.d.ts.map +1 -0
- package/dist/proxy/runtime-state.js +241 -0
- package/dist/proxy/runtime-state.js.map +1 -0
- package/dist/proxy/tool-aggregator.d.ts +46 -0
- package/dist/proxy/tool-aggregator.d.ts.map +1 -0
- package/dist/proxy/tool-aggregator.js +112 -0
- package/dist/proxy/tool-aggregator.js.map +1 -0
- package/dist/proxy/types.d.ts +117 -0
- package/dist/proxy/types.d.ts.map +1 -0
- package/dist/proxy/types.js +21 -0
- package/dist/proxy/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proxy Logger Module (Phase 5.0+)
|
|
3
|
+
*
|
|
4
|
+
* Structured logging to stderr only (stdout reserved for JSON-RPC).
|
|
5
|
+
* Includes ring buffer for CLI log viewing.
|
|
6
|
+
*
|
|
7
|
+
* Log levels:
|
|
8
|
+
* - ERROR: Always output (red)
|
|
9
|
+
* - WARN: Always output (yellow)
|
|
10
|
+
* - INFO: Only when verbose mode enabled (no color)
|
|
11
|
+
*/
|
|
12
|
+
import { appendFile, readFile, writeFile } from 'fs/promises';
|
|
13
|
+
import { existsSync } from 'fs';
|
|
14
|
+
const COLORS = {
|
|
15
|
+
WARN: '\x1b[33m',
|
|
16
|
+
ERROR: '\x1b[31m',
|
|
17
|
+
RESET: '\x1b[0m',
|
|
18
|
+
};
|
|
19
|
+
export { COLORS as LOG_COLORS };
|
|
20
|
+
/** Global verbose flag - set by proxy command */
|
|
21
|
+
let verboseMode = false;
|
|
22
|
+
/** Global ring buffer instance */
|
|
23
|
+
let ringBuffer = null;
|
|
24
|
+
/**
|
|
25
|
+
* Log Ring Buffer
|
|
26
|
+
*
|
|
27
|
+
* Appends logs to JSONL file with automatic rotation.
|
|
28
|
+
* Oldest entries are discarded when maxLines is exceeded.
|
|
29
|
+
*/
|
|
30
|
+
export class LogRingBuffer {
|
|
31
|
+
config;
|
|
32
|
+
lineCount = 0;
|
|
33
|
+
pendingWrites = Promise.resolve();
|
|
34
|
+
constructor(config) {
|
|
35
|
+
this.config = config;
|
|
36
|
+
// Initialize line count asynchronously
|
|
37
|
+
this.initLineCount().catch(() => {
|
|
38
|
+
// Ignore initialization errors
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Initialize line count from existing file
|
|
43
|
+
*/
|
|
44
|
+
async initLineCount() {
|
|
45
|
+
if (!existsSync(this.config.logPath)) {
|
|
46
|
+
this.lineCount = 0;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const content = await readFile(this.config.logPath, 'utf-8');
|
|
51
|
+
this.lineCount = content.split('\n').filter((line) => line.trim()).length;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
this.lineCount = 0;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Append a log entry
|
|
59
|
+
*/
|
|
60
|
+
async append(entry) {
|
|
61
|
+
const line = JSON.stringify(entry) + '\n';
|
|
62
|
+
// Chain writes to avoid race conditions
|
|
63
|
+
this.pendingWrites = this.pendingWrites.then(async () => {
|
|
64
|
+
try {
|
|
65
|
+
await appendFile(this.config.logPath, line, 'utf-8');
|
|
66
|
+
this.lineCount++;
|
|
67
|
+
// Check if rotation needed
|
|
68
|
+
if (this.lineCount > this.config.maxLines) {
|
|
69
|
+
await this.rotate();
|
|
70
|
+
}
|
|
71
|
+
// Notify count change
|
|
72
|
+
if (this.config.onCountChange) {
|
|
73
|
+
this.config.onCountChange(this.lineCount);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Silently ignore write errors
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
await this.pendingWrites;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Read last N entries
|
|
84
|
+
*/
|
|
85
|
+
async tail(n, filter) {
|
|
86
|
+
if (!existsSync(this.config.logPath)) {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
const content = await readFile(this.config.logPath, 'utf-8');
|
|
91
|
+
const lines = content.split('\n').filter((line) => line.trim());
|
|
92
|
+
let entries = [];
|
|
93
|
+
for (const line of lines) {
|
|
94
|
+
try {
|
|
95
|
+
const entry = JSON.parse(line);
|
|
96
|
+
// Apply level filter if specified
|
|
97
|
+
if (filter?.level) {
|
|
98
|
+
const filterLevel = filter.level.toUpperCase();
|
|
99
|
+
const levelPriority = {
|
|
100
|
+
INFO: 0,
|
|
101
|
+
WARN: 1,
|
|
102
|
+
ERROR: 2,
|
|
103
|
+
};
|
|
104
|
+
const entryPriority = levelPriority[entry.level] ?? 0;
|
|
105
|
+
const filterPriority = levelPriority[filterLevel] ?? 0;
|
|
106
|
+
if (entryPriority < filterPriority) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
entries.push(entry);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Skip malformed lines
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Return last N entries
|
|
117
|
+
return entries.slice(-n);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get current line count
|
|
125
|
+
*/
|
|
126
|
+
getCount() {
|
|
127
|
+
return this.lineCount;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Rotate buffer (remove oldest entries when over limit)
|
|
131
|
+
*/
|
|
132
|
+
async rotate() {
|
|
133
|
+
try {
|
|
134
|
+
const content = await readFile(this.config.logPath, 'utf-8');
|
|
135
|
+
const lines = content.split('\n').filter((line) => line.trim());
|
|
136
|
+
// Keep only the newest maxLines/2 lines (aggressive rotation)
|
|
137
|
+
const keepCount = Math.floor(this.config.maxLines / 2);
|
|
138
|
+
const newLines = lines.slice(-keepCount);
|
|
139
|
+
await writeFile(this.config.logPath, newLines.join('\n') + '\n', 'utf-8');
|
|
140
|
+
this.lineCount = newLines.length;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Ignore rotation errors
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Clear the log file
|
|
148
|
+
*/
|
|
149
|
+
async clear() {
|
|
150
|
+
try {
|
|
151
|
+
await writeFile(this.config.logPath, '', 'utf-8');
|
|
152
|
+
this.lineCount = 0;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Ignore clear errors
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Initialize ring buffer (called on proxy start)
|
|
161
|
+
*/
|
|
162
|
+
export function initializeRingBuffer(config) {
|
|
163
|
+
ringBuffer = new LogRingBuffer(config);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get the current ring buffer instance
|
|
167
|
+
*/
|
|
168
|
+
export function getRingBuffer() {
|
|
169
|
+
return ringBuffer;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get current time in HH:MM:SS.mmm format
|
|
173
|
+
*/
|
|
174
|
+
function now() {
|
|
175
|
+
return new Date().toISOString().slice(11, 23);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Internal log function
|
|
179
|
+
*/
|
|
180
|
+
function log(level, msg, category) {
|
|
181
|
+
// INFO is only shown in verbose mode
|
|
182
|
+
if (level === 'INFO' && !verboseMode) {
|
|
183
|
+
// Still write to ring buffer even if not shown on stderr
|
|
184
|
+
writeToRingBuffer(level, msg, category);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const timestamp = now();
|
|
188
|
+
const categoryStr = category ? `[${category}] ` : '';
|
|
189
|
+
const prefix = `[${timestamp}] [${level}] ${categoryStr}`;
|
|
190
|
+
if (level === 'INFO') {
|
|
191
|
+
// INFO: no color
|
|
192
|
+
process.stderr.write(prefix + msg + '\n');
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
// WARN/ERROR: with color
|
|
196
|
+
const color = COLORS[level];
|
|
197
|
+
process.stderr.write(color + prefix + msg + COLORS.RESET + '\n');
|
|
198
|
+
}
|
|
199
|
+
// Write to ring buffer
|
|
200
|
+
writeToRingBuffer(level, msg, category);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Write to ring buffer if initialized
|
|
204
|
+
*/
|
|
205
|
+
function writeToRingBuffer(level, message, category) {
|
|
206
|
+
if (ringBuffer) {
|
|
207
|
+
ringBuffer
|
|
208
|
+
.append({
|
|
209
|
+
ts: new Date().toISOString(),
|
|
210
|
+
level,
|
|
211
|
+
category,
|
|
212
|
+
message,
|
|
213
|
+
})
|
|
214
|
+
.catch(() => {
|
|
215
|
+
// Silently ignore buffer write errors
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Set verbose mode (enables INFO logs)
|
|
221
|
+
*/
|
|
222
|
+
export function setVerbose(enabled) {
|
|
223
|
+
verboseMode = enabled;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Check if verbose mode is enabled
|
|
227
|
+
*/
|
|
228
|
+
export function isVerbose() {
|
|
229
|
+
return verboseMode;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Logger instance with optional category support
|
|
233
|
+
*/
|
|
234
|
+
export const logger = {
|
|
235
|
+
/**
|
|
236
|
+
* Info level - only shown when verbose mode is enabled
|
|
237
|
+
*/
|
|
238
|
+
info: (msg, category) => log('INFO', msg, category),
|
|
239
|
+
/**
|
|
240
|
+
* Warning level - always shown (yellow)
|
|
241
|
+
*/
|
|
242
|
+
warn: (msg, category) => log('WARN', msg, category),
|
|
243
|
+
/**
|
|
244
|
+
* Error level - always shown (red)
|
|
245
|
+
*/
|
|
246
|
+
error: (msg, category) => log('ERROR', msg, category),
|
|
247
|
+
};
|
|
248
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/proxy/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Proxy Server (Phase 5.0+)
|
|
3
|
+
*
|
|
4
|
+
* A stdio-based MCP server that aggregates tools from multiple backend
|
|
5
|
+
* connectors and routes requests accordingly.
|
|
6
|
+
*
|
|
7
|
+
* Supported methods:
|
|
8
|
+
* - initialize
|
|
9
|
+
* - notifications/initialized
|
|
10
|
+
* - tools/list
|
|
11
|
+
* - tools/call
|
|
12
|
+
*/
|
|
13
|
+
import { EventEmitter } from 'events';
|
|
14
|
+
import { type ProxyOptions } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* MCP Proxy Server
|
|
17
|
+
*
|
|
18
|
+
* Reads JSON-RPC from stdin, writes responses to stdout.
|
|
19
|
+
* All logging goes to stderr.
|
|
20
|
+
*/
|
|
21
|
+
export declare class McpProxyServer extends EventEmitter {
|
|
22
|
+
private readonly options;
|
|
23
|
+
private readonly aggregator;
|
|
24
|
+
private readonly router;
|
|
25
|
+
private readonly stateManager;
|
|
26
|
+
private buffer;
|
|
27
|
+
private initialized;
|
|
28
|
+
private running;
|
|
29
|
+
/** Current client info (extracted from initialize) */
|
|
30
|
+
private currentClient;
|
|
31
|
+
constructor(options: ProxyOptions);
|
|
32
|
+
/**
|
|
33
|
+
* Start the proxy server
|
|
34
|
+
*
|
|
35
|
+
* Begins reading from stdin and processing JSON-RPC messages.
|
|
36
|
+
*/
|
|
37
|
+
start(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Build connector summaries for status display
|
|
40
|
+
*/
|
|
41
|
+
private buildConnectorSummaries;
|
|
42
|
+
/**
|
|
43
|
+
* Stop the proxy server
|
|
44
|
+
*/
|
|
45
|
+
stop(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Handle incoming data from stdin
|
|
48
|
+
*/
|
|
49
|
+
private handleData;
|
|
50
|
+
/**
|
|
51
|
+
* Handle stdin end
|
|
52
|
+
*/
|
|
53
|
+
private handleEnd;
|
|
54
|
+
/**
|
|
55
|
+
* Handle stdin error
|
|
56
|
+
*/
|
|
57
|
+
private handleError;
|
|
58
|
+
/**
|
|
59
|
+
* Process buffered data and extract complete JSON-RPC messages
|
|
60
|
+
*
|
|
61
|
+
* Messages are newline-delimited JSON.
|
|
62
|
+
*/
|
|
63
|
+
private processBuffer;
|
|
64
|
+
/**
|
|
65
|
+
* Process a single JSON-RPC message
|
|
66
|
+
*/
|
|
67
|
+
private processMessage;
|
|
68
|
+
/**
|
|
69
|
+
* Handle a JSON-RPC request (requires response)
|
|
70
|
+
*/
|
|
71
|
+
private handleRequest;
|
|
72
|
+
/**
|
|
73
|
+
* Handle a JSON-RPC notification (no response)
|
|
74
|
+
*/
|
|
75
|
+
private handleNotification;
|
|
76
|
+
/**
|
|
77
|
+
* Handle initialize request
|
|
78
|
+
*/
|
|
79
|
+
private handleInitialize;
|
|
80
|
+
/**
|
|
81
|
+
* Handle tools/list request
|
|
82
|
+
*/
|
|
83
|
+
private handleToolsList;
|
|
84
|
+
/**
|
|
85
|
+
* Handle tools/call request
|
|
86
|
+
*/
|
|
87
|
+
private handleToolsCall;
|
|
88
|
+
/**
|
|
89
|
+
* Send a JSON-RPC response with result
|
|
90
|
+
*/
|
|
91
|
+
private sendResult;
|
|
92
|
+
/**
|
|
93
|
+
* Send a JSON-RPC error response
|
|
94
|
+
*/
|
|
95
|
+
private sendError;
|
|
96
|
+
/**
|
|
97
|
+
* Send a message to stdout
|
|
98
|
+
*/
|
|
99
|
+
private send;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=mcp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/proxy/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAStC,OAAO,EAEL,KAAK,YAAY,EASlB,MAAM,YAAY,CAAC;AAYpB;;;;;GAKG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IAExB,sDAAsD;IACtD,OAAO,CAAC,aAAa,CAGL;gBAEJ,OAAO,EAAE,YAAY;IAQjC;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqC5B;;OAEG;YACW,uBAAuB;IAyBrC;;OAEG;IACH,IAAI,IAAI,IAAI;IAuBZ;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB;;OAEG;IACH,OAAO,CAAC,SAAS;IAejB;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;YACW,cAAc;IA+C5B;;OAEG;YACW,aAAa;IA6B3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;YACW,gBAAgB;IAyC9B;;OAEG;YACW,eAAe;IAyB7B;;OAEG;YACW,eAAe;IAsC7B;;OAEG;IACH,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACH,OAAO,CAAC,SAAS;IAmBjB;;OAEG;IACH,OAAO,CAAC,IAAI;CAIb"}
|