@defai.digital/ax-cli 3.8.1 → 3.8.3
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 +51 -1
- package/dist/agent/llm-agent.d.ts +2 -0
- package/dist/agent/llm-agent.js +185 -98
- package/dist/agent/llm-agent.js.map +1 -1
- package/dist/analyzers/git/churn-calculator.d.ts +1 -0
- package/dist/analyzers/git/churn-calculator.js +17 -2
- package/dist/analyzers/git/churn-calculator.js.map +1 -1
- package/dist/llm/client.js +17 -6
- package/dist/llm/client.js.map +1 -1
- package/dist/mcp/client-v2.js +1 -3
- package/dist/mcp/client-v2.js.map +1 -1
- package/dist/mcp/content-length-transport.d.ts +71 -0
- package/dist/mcp/content-length-transport.js +190 -0
- package/dist/mcp/content-length-transport.js.map +1 -0
- package/dist/mcp/mutex.js +13 -6
- package/dist/mcp/mutex.js.map +1 -1
- package/dist/mcp/reconnection.js +10 -1
- package/dist/mcp/reconnection.js.map +1 -1
- package/dist/mcp/transports.d.ts +9 -0
- package/dist/mcp/transports.js +23 -6
- package/dist/mcp/transports.js.map +1 -1
- package/dist/ui/hooks/use-enhanced-input.js +464 -98
- package/dist/ui/hooks/use-enhanced-input.js.map +1 -1
- package/dist/utils/rate-limiter.js +13 -1
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/token-counter.js +15 -5
- package/dist/utils/token-counter.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content-Length framing transport for MCP SDK
|
|
3
|
+
*
|
|
4
|
+
* The MCP SDK uses NDJSON (newline-delimited JSON) format by default,
|
|
5
|
+
* but some MCP servers (like AutomatosX) use Content-Length framing
|
|
6
|
+
* (similar to LSP - Language Server Protocol).
|
|
7
|
+
*
|
|
8
|
+
* This transport wrapper converts between the two formats:
|
|
9
|
+
* - Outgoing: Wraps JSON messages with Content-Length headers
|
|
10
|
+
* - Incoming: Parses Content-Length framed messages
|
|
11
|
+
*/
|
|
12
|
+
import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
13
|
+
import { JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js";
|
|
14
|
+
import { EventEmitter } from "events";
|
|
15
|
+
/**
|
|
16
|
+
* Configuration for the Content-Length stdio transport
|
|
17
|
+
*/
|
|
18
|
+
export interface ContentLengthStdioConfig {
|
|
19
|
+
command: string;
|
|
20
|
+
args?: string[];
|
|
21
|
+
env?: Record<string, string>;
|
|
22
|
+
cwd?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Stdio transport that uses Content-Length framing instead of NDJSON.
|
|
26
|
+
*
|
|
27
|
+
* Message format:
|
|
28
|
+
* ```
|
|
29
|
+
* Content-Length: <byte-length>\r\n
|
|
30
|
+
* \r\n
|
|
31
|
+
* <JSON-RPC message>
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare class ContentLengthStdioTransport extends EventEmitter implements Transport {
|
|
35
|
+
private process?;
|
|
36
|
+
private buffer;
|
|
37
|
+
private config;
|
|
38
|
+
private _started;
|
|
39
|
+
onmessage?: (message: JSONRPCMessage) => void;
|
|
40
|
+
onerror?: (error: Error) => void;
|
|
41
|
+
onclose?: () => void;
|
|
42
|
+
constructor(config: ContentLengthStdioConfig);
|
|
43
|
+
/**
|
|
44
|
+
* Start the transport (spawn the subprocess)
|
|
45
|
+
*/
|
|
46
|
+
start(): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Handle incoming data with Content-Length framing
|
|
49
|
+
*/
|
|
50
|
+
private handleData;
|
|
51
|
+
/**
|
|
52
|
+
* Read a single Content-Length framed message from buffer
|
|
53
|
+
*/
|
|
54
|
+
private readMessage;
|
|
55
|
+
/**
|
|
56
|
+
* Send a message with Content-Length framing
|
|
57
|
+
*/
|
|
58
|
+
send(message: JSONRPCMessage): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Close the transport
|
|
61
|
+
*/
|
|
62
|
+
close(): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Get the process ID
|
|
65
|
+
*/
|
|
66
|
+
get pid(): number | undefined;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Factory function to create Content-Length transport
|
|
70
|
+
*/
|
|
71
|
+
export declare function createContentLengthTransport(config: ContentLengthStdioConfig): ContentLengthStdioTransport;
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content-Length framing transport for MCP SDK
|
|
3
|
+
*
|
|
4
|
+
* The MCP SDK uses NDJSON (newline-delimited JSON) format by default,
|
|
5
|
+
* but some MCP servers (like AutomatosX) use Content-Length framing
|
|
6
|
+
* (similar to LSP - Language Server Protocol).
|
|
7
|
+
*
|
|
8
|
+
* This transport wrapper converts between the two formats:
|
|
9
|
+
* - Outgoing: Wraps JSON messages with Content-Length headers
|
|
10
|
+
* - Incoming: Parses Content-Length framed messages
|
|
11
|
+
*/
|
|
12
|
+
import { spawn } from "child_process";
|
|
13
|
+
import { JSONRPCMessageSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
14
|
+
import { EventEmitter } from "events";
|
|
15
|
+
/**
|
|
16
|
+
* Stdio transport that uses Content-Length framing instead of NDJSON.
|
|
17
|
+
*
|
|
18
|
+
* Message format:
|
|
19
|
+
* ```
|
|
20
|
+
* Content-Length: <byte-length>\r\n
|
|
21
|
+
* \r\n
|
|
22
|
+
* <JSON-RPC message>
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export class ContentLengthStdioTransport extends EventEmitter {
|
|
26
|
+
process;
|
|
27
|
+
buffer = Buffer.alloc(0);
|
|
28
|
+
config;
|
|
29
|
+
_started = false;
|
|
30
|
+
// Transport callbacks (required by Transport interface)
|
|
31
|
+
onmessage;
|
|
32
|
+
onerror;
|
|
33
|
+
onclose;
|
|
34
|
+
constructor(config) {
|
|
35
|
+
super();
|
|
36
|
+
this.config = config;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Start the transport (spawn the subprocess)
|
|
40
|
+
*/
|
|
41
|
+
async start() {
|
|
42
|
+
if (this._started) {
|
|
43
|
+
throw new Error("Transport already started");
|
|
44
|
+
}
|
|
45
|
+
this._started = true;
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
try {
|
|
48
|
+
this.process = spawn(this.config.command, this.config.args || [], {
|
|
49
|
+
stdio: ["pipe", "pipe", "inherit"], // Inherit stderr for debugging
|
|
50
|
+
env: {
|
|
51
|
+
...process.env,
|
|
52
|
+
...this.config.env,
|
|
53
|
+
},
|
|
54
|
+
cwd: this.config.cwd,
|
|
55
|
+
});
|
|
56
|
+
this.process.on("error", (error) => {
|
|
57
|
+
this.onerror?.(error);
|
|
58
|
+
reject(error);
|
|
59
|
+
});
|
|
60
|
+
this.process.on("spawn", () => {
|
|
61
|
+
resolve();
|
|
62
|
+
});
|
|
63
|
+
this.process.on("close", (code) => {
|
|
64
|
+
this.onclose?.();
|
|
65
|
+
this.emit("close", code);
|
|
66
|
+
});
|
|
67
|
+
this.process.stdout?.on("data", (chunk) => {
|
|
68
|
+
this.handleData(chunk);
|
|
69
|
+
});
|
|
70
|
+
this.process.stdout?.on("error", (error) => {
|
|
71
|
+
this.onerror?.(error);
|
|
72
|
+
});
|
|
73
|
+
this.process.stdin?.on("error", (error) => {
|
|
74
|
+
this.onerror?.(error);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
reject(error);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Handle incoming data with Content-Length framing
|
|
84
|
+
*/
|
|
85
|
+
handleData(chunk) {
|
|
86
|
+
// Append to buffer
|
|
87
|
+
this.buffer = Buffer.concat([this.buffer, chunk]);
|
|
88
|
+
// Process all complete messages in buffer
|
|
89
|
+
while (true) {
|
|
90
|
+
const message = this.readMessage();
|
|
91
|
+
if (!message)
|
|
92
|
+
break;
|
|
93
|
+
try {
|
|
94
|
+
// Validate and emit message
|
|
95
|
+
const parsed = JSONRPCMessageSchema.parse(message);
|
|
96
|
+
this.onmessage?.(parsed);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
this.onerror?.(error instanceof Error ? error : new Error(String(error)));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Read a single Content-Length framed message from buffer
|
|
105
|
+
*/
|
|
106
|
+
readMessage() {
|
|
107
|
+
// Look for Content-Length header
|
|
108
|
+
const headerEnd = this.buffer.indexOf("\r\n\r\n");
|
|
109
|
+
if (headerEnd === -1)
|
|
110
|
+
return null;
|
|
111
|
+
// Parse headers
|
|
112
|
+
const headerSection = this.buffer.toString("utf8", 0, headerEnd);
|
|
113
|
+
const contentLengthMatch = headerSection.match(/Content-Length:\s*(\d+)/i);
|
|
114
|
+
if (!contentLengthMatch) {
|
|
115
|
+
// Invalid format - try to find next message
|
|
116
|
+
this.buffer = this.buffer.subarray(headerEnd + 4);
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
const contentLength = parseInt(contentLengthMatch[1], 10);
|
|
120
|
+
const messageStart = headerEnd + 4; // Skip \r\n\r\n
|
|
121
|
+
const messageEnd = messageStart + contentLength;
|
|
122
|
+
// Check if we have the complete message
|
|
123
|
+
if (this.buffer.length < messageEnd) {
|
|
124
|
+
return null; // Wait for more data
|
|
125
|
+
}
|
|
126
|
+
// Extract message
|
|
127
|
+
const messageBuffer = this.buffer.subarray(messageStart, messageEnd);
|
|
128
|
+
const messageStr = messageBuffer.toString("utf8");
|
|
129
|
+
// Remove processed data from buffer
|
|
130
|
+
this.buffer = this.buffer.subarray(messageEnd);
|
|
131
|
+
try {
|
|
132
|
+
return JSON.parse(messageStr);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Send a message with Content-Length framing
|
|
140
|
+
*/
|
|
141
|
+
send(message) {
|
|
142
|
+
return new Promise((resolve, reject) => {
|
|
143
|
+
if (!this.process?.stdin?.writable) {
|
|
144
|
+
reject(new Error("Not connected"));
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// Serialize message
|
|
148
|
+
const body = JSON.stringify(message);
|
|
149
|
+
const contentLength = Buffer.byteLength(body, "utf8");
|
|
150
|
+
// Format with Content-Length header
|
|
151
|
+
const framed = `Content-Length: ${contentLength}\r\n\r\n${body}`;
|
|
152
|
+
// Write to stdin
|
|
153
|
+
const success = this.process.stdin.write(framed, (error) => {
|
|
154
|
+
if (error) {
|
|
155
|
+
reject(error);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
resolve();
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
if (success) {
|
|
162
|
+
resolve();
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Close the transport
|
|
168
|
+
*/
|
|
169
|
+
async close() {
|
|
170
|
+
if (this.process) {
|
|
171
|
+
this.process.kill();
|
|
172
|
+
this.process = undefined;
|
|
173
|
+
}
|
|
174
|
+
this.buffer = Buffer.alloc(0);
|
|
175
|
+
this._started = false;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get the process ID
|
|
179
|
+
*/
|
|
180
|
+
get pid() {
|
|
181
|
+
return this.process?.pid;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Factory function to create Content-Length transport
|
|
186
|
+
*/
|
|
187
|
+
export function createContentLengthTransport(config) {
|
|
188
|
+
return new ContentLengthStdioTransport(config);
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=content-length-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-length-transport.js","sourceRoot":"","sources":["../../src/mcp/content-length-transport.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/mutex.js
CHANGED
|
@@ -15,13 +15,17 @@ export class Mutex {
|
|
|
15
15
|
* Returns a release function that must be called when done
|
|
16
16
|
*/
|
|
17
17
|
async acquire() {
|
|
18
|
-
//
|
|
19
|
-
|
|
18
|
+
// BUG FIX: Use a loop to handle the race condition where another caller
|
|
19
|
+
// could acquire the lock between our queue notification and lock acquisition.
|
|
20
|
+
// This implements a proper "test-and-set" pattern for async mutexes.
|
|
21
|
+
while (this.locked) {
|
|
20
22
|
await new Promise(resolve => {
|
|
21
23
|
this.queue.push(resolve);
|
|
22
24
|
});
|
|
25
|
+
// After being notified, re-check if lock is available
|
|
26
|
+
// Another waiter might have been notified simultaneously
|
|
23
27
|
}
|
|
24
|
-
// Acquire lock
|
|
28
|
+
// Acquire lock
|
|
25
29
|
this.locked = true;
|
|
26
30
|
// Return release function
|
|
27
31
|
return () => {
|
|
@@ -32,10 +36,13 @@ export class Mutex {
|
|
|
32
36
|
* Release the mutex lock
|
|
33
37
|
*/
|
|
34
38
|
release() {
|
|
35
|
-
// Release lock
|
|
36
|
-
|
|
37
|
-
//
|
|
39
|
+
// BUG FIX: Release lock AFTER notifying next waiter to prevent
|
|
40
|
+
// new callers from sneaking in before queued waiters.
|
|
41
|
+
// Get next waiter first while still holding the lock.
|
|
38
42
|
const next = this.queue.shift();
|
|
43
|
+
// Now release the lock
|
|
44
|
+
this.locked = false;
|
|
45
|
+
// Notify next waiting operation (they will re-acquire in their loop)
|
|
39
46
|
if (next) {
|
|
40
47
|
next();
|
|
41
48
|
}
|
package/dist/mcp/mutex.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutex.js","sourceRoot":"","sources":["../../src/mcp/mutex.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,OAAO,KAAK;IACR,MAAM,GAAG,KAAK,CAAC;IACf,KAAK,GAAsB,EAAE,CAAC;IAEtC;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,
|
|
1
|
+
{"version":3,"file":"mutex.js","sourceRoot":"","sources":["../../src/mcp/mutex.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/reconnection.js
CHANGED
|
@@ -61,7 +61,16 @@ export class ReconnectionManager extends EventEmitter {
|
|
|
61
61
|
maxAttempts: this.strategy.maxRetries,
|
|
62
62
|
delayMs: delay
|
|
63
63
|
});
|
|
64
|
+
// BUG FIX: Clear any existing timer before scheduling a new one
|
|
65
|
+
// This prevents orphaned timer references when reconnection is rescheduled
|
|
66
|
+
const existingTimer = this.reconnectTimers.get(serverName);
|
|
67
|
+
if (existingTimer) {
|
|
68
|
+
clearTimeout(existingTimer);
|
|
69
|
+
}
|
|
64
70
|
const timer = setTimeout(async () => {
|
|
71
|
+
// BUG FIX: Remove timer reference immediately when it fires
|
|
72
|
+
// This ensures cancelReconnection won't try to clear an already-fired timer
|
|
73
|
+
this.reconnectTimers.delete(serverName);
|
|
65
74
|
this.updateState(serverName, {
|
|
66
75
|
serverName,
|
|
67
76
|
attempts: attempts + 1,
|
|
@@ -108,7 +117,7 @@ export class ReconnectionManager extends EventEmitter {
|
|
|
108
117
|
maxAttempts: this.strategy.maxRetries,
|
|
109
118
|
error: errorMessage
|
|
110
119
|
});
|
|
111
|
-
// Schedule next attempt
|
|
120
|
+
// Schedule next attempt (timer reference is already cleared above)
|
|
112
121
|
await this.scheduleReconnection(serverName, config, reconnectFn);
|
|
113
122
|
}
|
|
114
123
|
}, delay);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconnection.js","sourceRoot":"","sources":["../../src/mcp/reconnection.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"reconnection.js","sourceRoot":"","sources":["../../src/mcp/reconnection.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/transports.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
2
2
|
import { EventEmitter } from "events";
|
|
3
3
|
export type TransportType = 'stdio' | 'http' | 'sse' | 'streamable_http';
|
|
4
|
+
/**
|
|
5
|
+
* Framing protocol for stdio transport.
|
|
6
|
+
* - 'ndjson': Newline-delimited JSON (MCP SDK default)
|
|
7
|
+
* - 'content-length': Content-Length header framing (LSP-style, used by AutomatosX)
|
|
8
|
+
*/
|
|
9
|
+
export type StdioFraming = 'ndjson' | 'content-length';
|
|
4
10
|
export interface TransportConfig {
|
|
5
11
|
type: TransportType;
|
|
6
12
|
command?: string;
|
|
@@ -8,6 +14,8 @@ export interface TransportConfig {
|
|
|
8
14
|
env?: Record<string, string>;
|
|
9
15
|
url?: string;
|
|
10
16
|
headers?: Record<string, string>;
|
|
17
|
+
/** Framing protocol for stdio (default: 'content-length' for better compatibility) */
|
|
18
|
+
framing?: StdioFraming;
|
|
11
19
|
}
|
|
12
20
|
export interface MCPTransport {
|
|
13
21
|
connect(): Promise<Transport>;
|
|
@@ -19,6 +27,7 @@ export declare class StdioTransport implements MCPTransport {
|
|
|
19
27
|
private command;
|
|
20
28
|
private args;
|
|
21
29
|
private env?;
|
|
30
|
+
private framing;
|
|
22
31
|
constructor(config: TransportConfig);
|
|
23
32
|
connect(): Promise<Transport>;
|
|
24
33
|
disconnect(): Promise<void>;
|
package/dist/mcp/transports.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
2
2
|
import { EventEmitter } from "events";
|
|
3
3
|
import axios from "axios";
|
|
4
|
+
import { ContentLengthStdioTransport } from "./content-length-transport.js";
|
|
4
5
|
export class StdioTransport {
|
|
5
6
|
transport;
|
|
6
7
|
command;
|
|
7
8
|
args;
|
|
8
9
|
env;
|
|
10
|
+
framing;
|
|
9
11
|
constructor(config) {
|
|
10
12
|
if (!config.command) {
|
|
11
13
|
throw new Error('Command is required for stdio transport');
|
|
@@ -13,6 +15,8 @@ export class StdioTransport {
|
|
|
13
15
|
this.command = config.command;
|
|
14
16
|
this.args = config.args || [];
|
|
15
17
|
this.env = config.env;
|
|
18
|
+
// Default to content-length for better compatibility with servers like AutomatosX
|
|
19
|
+
this.framing = config.framing || 'content-length';
|
|
16
20
|
}
|
|
17
21
|
async connect() {
|
|
18
22
|
// Create transport with environment variables to suppress verbose output
|
|
@@ -25,12 +29,25 @@ export class StdioTransport {
|
|
|
25
29
|
DEBUG: '',
|
|
26
30
|
NODE_ENV: 'production'
|
|
27
31
|
};
|
|
28
|
-
this.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
if (this.framing === 'content-length') {
|
|
33
|
+
// Use Content-Length framing (LSP-style) for better compatibility
|
|
34
|
+
this.transport = new ContentLengthStdioTransport({
|
|
35
|
+
command: this.command,
|
|
36
|
+
args: this.args,
|
|
37
|
+
env
|
|
38
|
+
});
|
|
39
|
+
// ContentLengthStdioTransport implements Transport directly
|
|
40
|
+
return this.transport;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// Use NDJSON framing (MCP SDK default)
|
|
44
|
+
this.transport = new StdioClientTransport({
|
|
45
|
+
command: this.command,
|
|
46
|
+
args: this.args,
|
|
47
|
+
env
|
|
48
|
+
});
|
|
49
|
+
return this.transport;
|
|
50
|
+
}
|
|
34
51
|
}
|
|
35
52
|
async disconnect() {
|
|
36
53
|
// Handle transport cleanup with error handling to ensure process cleanup runs
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transports.js","sourceRoot":"","sources":["../../src/mcp/transports.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAwB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"transports.js","sourceRoot":"","sources":["../../src/mcp/transports.ts"],"names":[],"mappings":"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"}
|