agentdog 1.1.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/LICENSE +22 -0
- package/README.md +244 -0
- package/dist/adapters/adapter-factory.d.ts +21 -0
- package/dist/adapters/adapter-factory.d.ts.map +1 -0
- package/dist/adapters/adapter-factory.js +157 -0
- package/dist/adapters/adapter-factory.js.map +1 -0
- package/dist/adapters/http-sse-adapter.d.ts +49 -0
- package/dist/adapters/http-sse-adapter.d.ts.map +1 -0
- package/dist/adapters/http-sse-adapter.js +485 -0
- package/dist/adapters/http-sse-adapter.js.map +1 -0
- package/dist/adapters/stdio-adapter.d.ts +69 -0
- package/dist/adapters/stdio-adapter.d.ts.map +1 -0
- package/dist/adapters/stdio-adapter.js +664 -0
- package/dist/adapters/stdio-adapter.js.map +1 -0
- package/dist/adapters/streamable-http-adapter.d.ts +38 -0
- package/dist/adapters/streamable-http-adapter.d.ts.map +1 -0
- package/dist/adapters/streamable-http-adapter.js +321 -0
- package/dist/adapters/streamable-http-adapter.js.map +1 -0
- package/dist/ai-gateway/anthropic-errors.d.ts +4 -0
- package/dist/ai-gateway/anthropic-errors.d.ts.map +1 -0
- package/dist/ai-gateway/anthropic-errors.js +17 -0
- package/dist/ai-gateway/anthropic-errors.js.map +1 -0
- package/dist/ai-gateway/auth.d.ts +3 -0
- package/dist/ai-gateway/auth.d.ts.map +1 -0
- package/dist/ai-gateway/auth.js +14 -0
- package/dist/ai-gateway/auth.js.map +1 -0
- package/dist/ai-gateway/auth.test.d.ts +2 -0
- package/dist/ai-gateway/auth.test.d.ts.map +1 -0
- package/dist/ai-gateway/auth.test.js +57 -0
- package/dist/ai-gateway/auth.test.js.map +1 -0
- package/dist/ai-gateway/count-tokens.d.ts +5 -0
- package/dist/ai-gateway/count-tokens.d.ts.map +1 -0
- package/dist/ai-gateway/count-tokens.js +37 -0
- package/dist/ai-gateway/count-tokens.js.map +1 -0
- package/dist/ai-gateway/count-tokens.test.d.ts +2 -0
- package/dist/ai-gateway/count-tokens.test.d.ts.map +1 -0
- package/dist/ai-gateway/count-tokens.test.js +19 -0
- package/dist/ai-gateway/count-tokens.test.js.map +1 -0
- package/dist/ai-gateway/dialects.d.ts +4 -0
- package/dist/ai-gateway/dialects.d.ts.map +1 -0
- package/dist/ai-gateway/dialects.js +15 -0
- package/dist/ai-gateway/dialects.js.map +1 -0
- package/dist/ai-gateway/gateway-server.d.ts +15 -0
- package/dist/ai-gateway/gateway-server.d.ts.map +1 -0
- package/dist/ai-gateway/gateway-server.js +121 -0
- package/dist/ai-gateway/gateway-server.js.map +1 -0
- package/dist/ai-gateway/integration.test.d.ts +2 -0
- package/dist/ai-gateway/integration.test.d.ts.map +1 -0
- package/dist/ai-gateway/integration.test.js +205 -0
- package/dist/ai-gateway/integration.test.js.map +1 -0
- package/dist/ai-gateway/ir/anthropic-in.d.ts +3 -0
- package/dist/ai-gateway/ir/anthropic-in.d.ts.map +1 -0
- package/dist/ai-gateway/ir/anthropic-in.js +121 -0
- package/dist/ai-gateway/ir/anthropic-in.js.map +1 -0
- package/dist/ai-gateway/ir/anthropic-in.test.d.ts +2 -0
- package/dist/ai-gateway/ir/anthropic-in.test.d.ts.map +1 -0
- package/dist/ai-gateway/ir/anthropic-in.test.js +93 -0
- package/dist/ai-gateway/ir/anthropic-in.test.js.map +1 -0
- package/dist/ai-gateway/ir/anthropic-sse.d.ts +22 -0
- package/dist/ai-gateway/ir/anthropic-sse.d.ts.map +1 -0
- package/dist/ai-gateway/ir/anthropic-sse.js +200 -0
- package/dist/ai-gateway/ir/anthropic-sse.js.map +1 -0
- package/dist/ai-gateway/ir/anthropic-sse.test.d.ts +2 -0
- package/dist/ai-gateway/ir/anthropic-sse.test.d.ts.map +1 -0
- package/dist/ai-gateway/ir/anthropic-sse.test.js +101 -0
- package/dist/ai-gateway/ir/anthropic-sse.test.js.map +1 -0
- package/dist/ai-gateway/ir/gemini-out.d.ts +20 -0
- package/dist/ai-gateway/ir/gemini-out.d.ts.map +1 -0
- package/dist/ai-gateway/ir/gemini-out.js +218 -0
- package/dist/ai-gateway/ir/gemini-out.js.map +1 -0
- package/dist/ai-gateway/ir/gemini-out.test.d.ts +2 -0
- package/dist/ai-gateway/ir/gemini-out.test.d.ts.map +1 -0
- package/dist/ai-gateway/ir/gemini-out.test.js +125 -0
- package/dist/ai-gateway/ir/gemini-out.test.js.map +1 -0
- package/dist/ai-gateway/ir/openai-out.d.ts +17 -0
- package/dist/ai-gateway/ir/openai-out.d.ts.map +1 -0
- package/dist/ai-gateway/ir/openai-out.js +226 -0
- package/dist/ai-gateway/ir/openai-out.js.map +1 -0
- package/dist/ai-gateway/ir/openai-out.test.d.ts +2 -0
- package/dist/ai-gateway/ir/openai-out.test.d.ts.map +1 -0
- package/dist/ai-gateway/ir/openai-out.test.js +144 -0
- package/dist/ai-gateway/ir/openai-out.test.js.map +1 -0
- package/dist/ai-gateway/ir/types.d.ts +77 -0
- package/dist/ai-gateway/ir/types.d.ts.map +1 -0
- package/dist/ai-gateway/ir/types.js +4 -0
- package/dist/ai-gateway/ir/types.js.map +1 -0
- package/dist/ai-gateway/ir-channel.d.ts +15 -0
- package/dist/ai-gateway/ir-channel.d.ts.map +1 -0
- package/dist/ai-gateway/ir-channel.js +120 -0
- package/dist/ai-gateway/ir-channel.js.map +1 -0
- package/dist/ai-gateway/model-router.d.ts +11 -0
- package/dist/ai-gateway/model-router.d.ts.map +1 -0
- package/dist/ai-gateway/model-router.js +27 -0
- package/dist/ai-gateway/model-router.js.map +1 -0
- package/dist/ai-gateway/model-router.test.d.ts +2 -0
- package/dist/ai-gateway/model-router.test.d.ts.map +1 -0
- package/dist/ai-gateway/model-router.test.js +43 -0
- package/dist/ai-gateway/model-router.test.js.map +1 -0
- package/dist/ai-gateway/passthrough.d.ts +9 -0
- package/dist/ai-gateway/passthrough.d.ts.map +1 -0
- package/dist/ai-gateway/passthrough.js +81 -0
- package/dist/ai-gateway/passthrough.js.map +1 -0
- package/dist/ai-gateway/passthrough.test.d.ts +2 -0
- package/dist/ai-gateway/passthrough.test.d.ts.map +1 -0
- package/dist/ai-gateway/passthrough.test.js +108 -0
- package/dist/ai-gateway/passthrough.test.js.map +1 -0
- package/dist/ai-gateway/upstream/model-lister.d.ts +13 -0
- package/dist/ai-gateway/upstream/model-lister.d.ts.map +1 -0
- package/dist/ai-gateway/upstream/model-lister.js +61 -0
- package/dist/ai-gateway/upstream/model-lister.js.map +1 -0
- package/dist/ai-gateway/upstream/provider-client.d.ts +20 -0
- package/dist/ai-gateway/upstream/provider-client.d.ts.map +1 -0
- package/dist/ai-gateway/upstream/provider-client.js +76 -0
- package/dist/ai-gateway/upstream/provider-client.js.map +1 -0
- package/dist/ai-gateway/upstream/provider-client.test.d.ts +2 -0
- package/dist/ai-gateway/upstream/provider-client.test.d.ts.map +1 -0
- package/dist/ai-gateway/upstream/provider-client.test.js +69 -0
- package/dist/ai-gateway/upstream/provider-client.test.js.map +1 -0
- package/dist/cli/cli-main.d.ts +7 -0
- package/dist/cli/cli-main.d.ts.map +1 -0
- package/dist/cli/cli-main.js +116 -0
- package/dist/cli/cli-main.js.map +1 -0
- package/dist/cli/cli-router.d.ts +20 -0
- package/dist/cli/cli-router.d.ts.map +1 -0
- package/dist/cli/cli-router.js +271 -0
- package/dist/cli/cli-router.js.map +1 -0
- package/dist/cli/cli-utils.d.ts +30 -0
- package/dist/cli/cli-utils.d.ts.map +1 -0
- package/dist/cli/cli-utils.js +219 -0
- package/dist/cli/cli-utils.js.map +1 -0
- package/dist/cli/commands/audit-commands.d.ts +30 -0
- package/dist/cli/commands/audit-commands.d.ts.map +1 -0
- package/dist/cli/commands/audit-commands.js +417 -0
- package/dist/cli/commands/audit-commands.js.map +1 -0
- package/dist/cli/commands/autostart-command.d.ts +21 -0
- package/dist/cli/commands/autostart-command.d.ts.map +1 -0
- package/dist/cli/commands/autostart-command.js +243 -0
- package/dist/cli/commands/autostart-command.js.map +1 -0
- package/dist/cli/commands/autostart-command.test.d.ts +2 -0
- package/dist/cli/commands/autostart-command.test.d.ts.map +1 -0
- package/dist/cli/commands/autostart-command.test.js +35 -0
- package/dist/cli/commands/autostart-command.test.js.map +1 -0
- package/dist/cli/commands/config-commands.d.ts +30 -0
- package/dist/cli/commands/config-commands.d.ts.map +1 -0
- package/dist/cli/commands/config-commands.js +1013 -0
- package/dist/cli/commands/config-commands.js.map +1 -0
- package/dist/cli/commands/daemon-commands.d.ts +76 -0
- package/dist/cli/commands/daemon-commands.d.ts.map +1 -0
- package/dist/cli/commands/daemon-commands.js +451 -0
- package/dist/cli/commands/daemon-commands.js.map +1 -0
- package/dist/cli/commands/detect-commands.d.ts +17 -0
- package/dist/cli/commands/detect-commands.d.ts.map +1 -0
- package/dist/cli/commands/detect-commands.js +293 -0
- package/dist/cli/commands/detect-commands.js.map +1 -0
- package/dist/cli/commands/diagnose-commands.d.ts +19 -0
- package/dist/cli/commands/diagnose-commands.d.ts.map +1 -0
- package/dist/cli/commands/diagnose-commands.js +326 -0
- package/dist/cli/commands/diagnose-commands.js.map +1 -0
- package/dist/cli/commands/optimize-commands.d.ts +14 -0
- package/dist/cli/commands/optimize-commands.d.ts.map +1 -0
- package/dist/cli/commands/optimize-commands.js +189 -0
- package/dist/cli/commands/optimize-commands.js.map +1 -0
- package/dist/cli/commands/proxy-command.d.ts +27 -0
- package/dist/cli/commands/proxy-command.d.ts.map +1 -0
- package/dist/cli/commands/proxy-command.js +212 -0
- package/dist/cli/commands/proxy-command.js.map +1 -0
- package/dist/cli/commands/start-command.d.ts +22 -0
- package/dist/cli/commands/start-command.d.ts.map +1 -0
- package/dist/cli/commands/start-command.js +275 -0
- package/dist/cli/commands/start-command.js.map +1 -0
- package/dist/config/config-manager.d.ts +125 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +569 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/config-manager.test.d.ts +2 -0
- package/dist/config/config-manager.test.d.ts.map +1 -0
- package/dist/config/config-manager.test.js +209 -0
- package/dist/config/config-manager.test.js.map +1 -0
- package/dist/core/auto-config-generator.d.ts +55 -0
- package/dist/core/auto-config-generator.d.ts.map +1 -0
- package/dist/core/auto-config-generator.js +278 -0
- package/dist/core/auto-config-generator.js.map +1 -0
- package/dist/core/mcpdog-server.d.ts +49 -0
- package/dist/core/mcpdog-server.d.ts.map +1 -0
- package/dist/core/mcpdog-server.js +552 -0
- package/dist/core/mcpdog-server.js.map +1 -0
- package/dist/core/protocol-detector.d.ts +56 -0
- package/dist/core/protocol-detector.d.ts.map +1 -0
- package/dist/core/protocol-detector.js +365 -0
- package/dist/core/protocol-detector.js.map +1 -0
- package/dist/daemon/daemon-client.d.ts +34 -0
- package/dist/daemon/daemon-client.d.ts.map +1 -0
- package/dist/daemon/daemon-client.js +130 -0
- package/dist/daemon/daemon-client.js.map +1 -0
- package/dist/daemon/daemon-client.test.d.ts +2 -0
- package/dist/daemon/daemon-client.test.d.ts.map +1 -0
- package/dist/daemon/daemon-client.test.js +77 -0
- package/dist/daemon/daemon-client.test.js.map +1 -0
- package/dist/daemon/daemon-info.d.ts +7 -0
- package/dist/daemon/daemon-info.d.ts.map +1 -0
- package/dist/daemon/daemon-info.js +34 -0
- package/dist/daemon/daemon-info.js.map +1 -0
- package/dist/daemon/daemon-info.test.d.ts +2 -0
- package/dist/daemon/daemon-info.test.d.ts.map +1 -0
- package/dist/daemon/daemon-info.test.js +57 -0
- package/dist/daemon/daemon-info.test.js.map +1 -0
- package/dist/daemon/daemon-web-server.ai.test.d.ts +2 -0
- package/dist/daemon/daemon-web-server.ai.test.d.ts.map +1 -0
- package/dist/daemon/daemon-web-server.ai.test.js +119 -0
- package/dist/daemon/daemon-web-server.ai.test.js.map +1 -0
- package/dist/daemon/daemon-web-server.d.ts +59 -0
- package/dist/daemon/daemon-web-server.d.ts.map +1 -0
- package/dist/daemon/daemon-web-server.js +1236 -0
- package/dist/daemon/daemon-web-server.js.map +1 -0
- package/dist/daemon/daemon-web-server.test.d.ts +2 -0
- package/dist/daemon/daemon-web-server.test.d.ts.map +1 -0
- package/dist/daemon/daemon-web-server.test.js +93 -0
- package/dist/daemon/daemon-web-server.test.js.map +1 -0
- package/dist/daemon/mcpdog-daemon.d.ts +42 -0
- package/dist/daemon/mcpdog-daemon.d.ts.map +1 -0
- package/dist/daemon/mcpdog-daemon.js +302 -0
- package/dist/daemon/mcpdog-daemon.js.map +1 -0
- package/dist/daemon/stdio-proxy.d.ts +17 -0
- package/dist/daemon/stdio-proxy.d.ts.map +1 -0
- package/dist/daemon/stdio-proxy.js +143 -0
- package/dist/daemon/stdio-proxy.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +198 -0
- package/dist/index.js.map +1 -0
- package/dist/intent-analyzer.d.ts +27 -0
- package/dist/intent-analyzer.d.ts.map +1 -0
- package/dist/intent-analyzer.js +140 -0
- package/dist/intent-analyzer.js.map +1 -0
- package/dist/logging/server-log-manager.d.ts +75 -0
- package/dist/logging/server-log-manager.d.ts.map +1 -0
- package/dist/logging/server-log-manager.js +185 -0
- package/dist/logging/server-log-manager.js.map +1 -0
- package/dist/mcp-registry.d.ts +35 -0
- package/dist/mcp-registry.d.ts.map +1 -0
- package/dist/mcp-registry.js +166 -0
- package/dist/mcp-registry.js.map +1 -0
- package/dist/middleware/auth.d.ts +5 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +81 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/mock-tool-database.d.ts +41 -0
- package/dist/mock-tool-database.d.ts.map +1 -0
- package/dist/mock-tool-database.js +461 -0
- package/dist/mock-tool-database.js.map +1 -0
- package/dist/proxy-server-manager.d.ts +11 -0
- package/dist/proxy-server-manager.d.ts.map +1 -0
- package/dist/proxy-server-manager.js +144 -0
- package/dist/proxy-server-manager.js.map +1 -0
- package/dist/router/tool-router.d.ts +61 -0
- package/dist/router/tool-router.d.ts.map +1 -0
- package/dist/router/tool-router.js +539 -0
- package/dist/router/tool-router.js.map +1 -0
- package/dist/router/tool-router.test.d.ts +2 -0
- package/dist/router/tool-router.test.d.ts.map +1 -0
- package/dist/router/tool-router.test.js +113 -0
- package/dist/router/tool-router.test.js.map +1 -0
- package/dist/streamable-http-server.d.ts +27 -0
- package/dist/streamable-http-server.d.ts.map +1 -0
- package/dist/streamable-http-server.js +302 -0
- package/dist/streamable-http-server.js.map +1 -0
- package/dist/tool-finder.d.ts +21 -0
- package/dist/tool-finder.d.ts.map +1 -0
- package/dist/tool-finder.js +86 -0
- package/dist/tool-finder.js.map +1 -0
- package/dist/tool-recommender.d.ts +23 -0
- package/dist/tool-recommender.d.ts.map +1 -0
- package/dist/tool-recommender.js +200 -0
- package/dist/tool-recommender.js.map +1 -0
- package/dist/types/index.d.ts +145 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/server-name-validator.d.ts +47 -0
- package/dist/utils/server-name-validator.d.ts.map +1 -0
- package/dist/utils/server-name-validator.js +156 -0
- package/dist/utils/server-name-validator.js.map +1 -0
- package/dist/web/web-server.d.ts +44 -0
- package/dist/web/web-server.d.ts.map +1 -0
- package/dist/web/web-server.js +500 -0
- package/dist/web/web-server.js.map +1 -0
- package/package.json +68 -0
- package/web/dist/assets/index-DMVhVtNU.css +1 -0
- package/web/dist/assets/index-VMXIgcOH.js +92 -0
- package/web/dist/assets/index-VMXIgcOH.js.map +1 -0
- package/web/dist/index.html +14 -0
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import axios from 'axios';
|
|
3
|
+
import * as EventSourceLib from 'eventsource';
|
|
4
|
+
// @ts-ignore - CommonJS module in ESM context
|
|
5
|
+
const EventSource = EventSourceLib.EventSource;
|
|
6
|
+
export class HttpSseAdapter extends EventEmitter {
|
|
7
|
+
name;
|
|
8
|
+
config;
|
|
9
|
+
isConnected = false;
|
|
10
|
+
httpClient;
|
|
11
|
+
sseEventSource; // Use any type to avoid EventSource type complexity
|
|
12
|
+
requestId = 1;
|
|
13
|
+
pendingRequests = new Map();
|
|
14
|
+
baseUrl;
|
|
15
|
+
sseUrl;
|
|
16
|
+
dynamicEndpoint; // Dynamic endpoint obtained from SSE
|
|
17
|
+
sessionId; // MCP Session ID
|
|
18
|
+
sessionMode = 'auto'; // Session mode
|
|
19
|
+
reconnectTimer;
|
|
20
|
+
isReconnecting = false;
|
|
21
|
+
isDisabled = false; // Whether disabled, should not auto-reconnect if disabled
|
|
22
|
+
constructor(name, config) {
|
|
23
|
+
super();
|
|
24
|
+
this.name = name;
|
|
25
|
+
this.config = config;
|
|
26
|
+
if (config.transport !== 'http-sse') {
|
|
27
|
+
throw new Error(`Invalid transport for HttpSseAdapter: ${config.transport}`);
|
|
28
|
+
}
|
|
29
|
+
const httpUrl = config.url || config.endpoint;
|
|
30
|
+
if (!httpUrl) {
|
|
31
|
+
throw new Error('URL or endpoint is required for http-sse transport');
|
|
32
|
+
}
|
|
33
|
+
this.baseUrl = httpUrl;
|
|
34
|
+
this.sseUrl = config.sseEndpoint || `${this.baseUrl}/sse`;
|
|
35
|
+
// Set session mode
|
|
36
|
+
this.sessionMode = config.sessionMode || 'auto';
|
|
37
|
+
// Create HTTP client
|
|
38
|
+
this.httpClient = axios.create({
|
|
39
|
+
baseURL: this.baseUrl,
|
|
40
|
+
timeout: config.timeout || 30000,
|
|
41
|
+
headers: {
|
|
42
|
+
'Content-Type': 'application/json',
|
|
43
|
+
'Accept': 'text/event-stream, application/json',
|
|
44
|
+
...(config.headers || {}),
|
|
45
|
+
...(config.apiKey && { 'Authorization': `Bearer ${config.apiKey}` })
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async connect() {
|
|
50
|
+
if (this.isConnected) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
console.error(`Connecting to ${this.name} via HTTP+SSE: ${this.baseUrl}`);
|
|
55
|
+
// 1. Establish SSE connection
|
|
56
|
+
await this.connectSSE();
|
|
57
|
+
// 2. Wait for dynamic endpoint to be set (give some time to receive endpoint event)
|
|
58
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
59
|
+
// 3. Initialize handshake
|
|
60
|
+
await this.initialize();
|
|
61
|
+
// Mark as connected, let router manage tool list fetching
|
|
62
|
+
this.isConnected = true;
|
|
63
|
+
console.error(`Connected to ${this.name}`);
|
|
64
|
+
this.emit('connected', { serverName: this.name });
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
this.cleanup();
|
|
68
|
+
throw new Error(`Failed to connect to ${this.name}: ${error.message}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async disconnect() {
|
|
72
|
+
if (!this.isConnected) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
console.error(`Disconnecting from ${this.name}`);
|
|
76
|
+
// Cancel all pending requests
|
|
77
|
+
for (const [id, pending] of this.pendingRequests) {
|
|
78
|
+
clearTimeout(pending.timeout);
|
|
79
|
+
pending.reject(new Error('Connection closed'));
|
|
80
|
+
}
|
|
81
|
+
this.pendingRequests.clear();
|
|
82
|
+
this.cleanup();
|
|
83
|
+
this.isConnected = false;
|
|
84
|
+
console.error(`Disconnected from ${this.name}`);
|
|
85
|
+
this.emit('disconnected', { serverName: this.name });
|
|
86
|
+
}
|
|
87
|
+
async connectSSE() {
|
|
88
|
+
return new Promise((resolve, reject) => {
|
|
89
|
+
try {
|
|
90
|
+
const sseOptions = {
|
|
91
|
+
headers: {
|
|
92
|
+
'Accept': 'text/event-stream',
|
|
93
|
+
'Cache-Control': 'no-cache',
|
|
94
|
+
...(this.config.headers || {}),
|
|
95
|
+
...(this.config.apiKey && { 'Authorization': `Bearer ${this.config.apiKey}` })
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
console.error(`Establishing SSE connection to ${this.sseUrl}`);
|
|
99
|
+
this.sseEventSource = new EventSource(this.sseUrl, sseOptions);
|
|
100
|
+
// Set event handler
|
|
101
|
+
this.setupSSEHandlers(resolve, reject);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
reject(error);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
setupSSEHandlers(resolve, reject) {
|
|
109
|
+
if (!this.sseEventSource) {
|
|
110
|
+
reject?.(new Error('SSE EventSource not initialized'));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
// Connection successful
|
|
114
|
+
this.sseEventSource.onopen = (event) => {
|
|
115
|
+
console.error(`SSE connection opened for ${this.name}`);
|
|
116
|
+
if (resolve) {
|
|
117
|
+
resolve();
|
|
118
|
+
resolve = undefined; // Avoid duplicate calls
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
// Receive message
|
|
122
|
+
this.sseEventSource.onmessage = (event) => {
|
|
123
|
+
try {
|
|
124
|
+
// Handle typed SSE events
|
|
125
|
+
if (event.type === 'endpoint' || event.lastEventId === 'endpoint') {
|
|
126
|
+
this.dynamicEndpoint = event.data;
|
|
127
|
+
console.error(`Updated dynamic endpoint for ${this.name}: ${this.dynamicEndpoint}`);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const message = JSON.parse(event.data);
|
|
131
|
+
this.handleSSEMessage(message);
|
|
132
|
+
// Check if it's an MCP response
|
|
133
|
+
if (message.id && (message.result || message.error)) {
|
|
134
|
+
this.handleMCPResponse(message);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
// May be plain text message, try to handle as endpoint
|
|
139
|
+
if (event.data && event.data.startsWith('/mcp/messages/')) {
|
|
140
|
+
this.dynamicEndpoint = event.data;
|
|
141
|
+
console.error(`Updated dynamic endpoint from text for ${this.name}: ${this.dynamicEndpoint}`);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
console.error(`Failed to parse SSE message from ${this.name}:`, event.data);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
// Connection error
|
|
149
|
+
this.sseEventSource.onerror = (event) => {
|
|
150
|
+
console.error(`SSE connection error for ${this.name}:`, event);
|
|
151
|
+
if (reject) {
|
|
152
|
+
reject(new Error(`SSE connection failed for ${this.name}`));
|
|
153
|
+
reject = undefined;
|
|
154
|
+
}
|
|
155
|
+
else if (this.isConnected && !this.isReconnecting) {
|
|
156
|
+
// Connection lost, try to reconnect
|
|
157
|
+
this.handleSSEDisconnection();
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
// Listen for MCP response messages
|
|
161
|
+
this.sseEventSource.addEventListener('mcp-response', (event) => {
|
|
162
|
+
try {
|
|
163
|
+
const response = JSON.parse(event.data);
|
|
164
|
+
this.handleMCPResponse(response);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
console.error(`Failed to parse MCP response from ${this.name}:`, event.data);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
// Listen for MCP notifications
|
|
171
|
+
this.sseEventSource.addEventListener('mcp-notification', (event) => {
|
|
172
|
+
try {
|
|
173
|
+
const notification = JSON.parse(event.data);
|
|
174
|
+
this.handleMCPNotification(notification);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
console.error(`Failed to parse MCP notification from ${this.name}:`, event.data);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
// Listen for endpoint events
|
|
181
|
+
this.sseEventSource.addEventListener('endpoint', (event) => {
|
|
182
|
+
this.dynamicEndpoint = event.data;
|
|
183
|
+
console.error(`Received endpoint event for ${this.name}: ${this.dynamicEndpoint}`);
|
|
184
|
+
// Extract sessionId (if exists)
|
|
185
|
+
this.extractSessionId();
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
extractSessionId() {
|
|
189
|
+
if (!this.dynamicEndpoint) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
try {
|
|
193
|
+
// Extract sessionId from URL query parameters
|
|
194
|
+
const url = new URL(this.dynamicEndpoint, this.baseUrl);
|
|
195
|
+
const urlSessionId = url.searchParams.get('sessionId');
|
|
196
|
+
if (urlSessionId) {
|
|
197
|
+
this.sessionId = urlSessionId;
|
|
198
|
+
console.error(`Extracted sessionId from URL for ${this.name}: ${this.sessionId}`);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
// Extract sessionId from path (e.g., /mcp/messages/session-id-here)
|
|
202
|
+
const pathMatch = this.dynamicEndpoint.match(/\/mcp\/messages\/([^/?]+)/);
|
|
203
|
+
if (pathMatch && pathMatch[1]) {
|
|
204
|
+
this.sessionId = pathMatch[1];
|
|
205
|
+
console.error(`Extracted sessionId from path for ${this.name}: ${this.sessionId}`);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
// If sessionMode is required but no sessionId found, log warning
|
|
209
|
+
if (this.sessionMode === 'required' && !this.sessionId) {
|
|
210
|
+
console.error(`Warning: Session mode is required but no sessionId found in endpoint: ${this.dynamicEndpoint}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
console.error(`Failed to extract sessionId from endpoint ${this.dynamicEndpoint}:`, error);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
async initialize() {
|
|
218
|
+
const initRequest = {
|
|
219
|
+
jsonrpc: '2.0',
|
|
220
|
+
id: this.getNextRequestId(),
|
|
221
|
+
method: 'initialize',
|
|
222
|
+
params: {
|
|
223
|
+
protocolVersion: '2024-11-05',
|
|
224
|
+
capabilities: {
|
|
225
|
+
tools: {}
|
|
226
|
+
},
|
|
227
|
+
clientInfo: {
|
|
228
|
+
name: 'mcpdog',
|
|
229
|
+
version: '2.0.0'
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
const response = await this.sendRequest(initRequest);
|
|
234
|
+
if (response.error) {
|
|
235
|
+
throw new Error(`Initialize failed: ${response.error.message}`);
|
|
236
|
+
}
|
|
237
|
+
// Send initialized notification (some servers like GitHub Copilot may not support this)
|
|
238
|
+
try {
|
|
239
|
+
await this.sendNotification({
|
|
240
|
+
jsonrpc: '2.0',
|
|
241
|
+
method: 'notifications/initialized'
|
|
242
|
+
});
|
|
243
|
+
console.error(`Sent initialized notification to ${this.name}`);
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
console.warn(`Failed to send initialized notification to ${this.name} (this is normal for some servers like GitHub Copilot):`, error.message);
|
|
247
|
+
// Don't throw error - some servers don't support this notification
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
async getTools() {
|
|
251
|
+
const request = {
|
|
252
|
+
jsonrpc: '2.0',
|
|
253
|
+
id: this.getNextRequestId(),
|
|
254
|
+
method: 'tools/list',
|
|
255
|
+
params: {}
|
|
256
|
+
};
|
|
257
|
+
const response = await this.sendRequest(request);
|
|
258
|
+
if (response.error) {
|
|
259
|
+
throw new Error(`Failed to get tools: ${response.error.message}`);
|
|
260
|
+
}
|
|
261
|
+
return response.result?.tools || [];
|
|
262
|
+
}
|
|
263
|
+
async callTool(name, args) {
|
|
264
|
+
const request = {
|
|
265
|
+
jsonrpc: '2.0',
|
|
266
|
+
id: this.getNextRequestId(),
|
|
267
|
+
method: 'tools/call',
|
|
268
|
+
params: {
|
|
269
|
+
name,
|
|
270
|
+
arguments: args
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
return this.sendRequest(request);
|
|
274
|
+
}
|
|
275
|
+
async sendRequest(request) {
|
|
276
|
+
// Allow sending initialize request during connection process
|
|
277
|
+
if (!this.isConnected && !this.sseEventSource) {
|
|
278
|
+
throw new Error(`Not connected to ${this.name}`);
|
|
279
|
+
}
|
|
280
|
+
return new Promise(async (resolve, reject) => {
|
|
281
|
+
const timeout = setTimeout(() => {
|
|
282
|
+
this.pendingRequests.delete(request.id);
|
|
283
|
+
reject(new Error(`Request timeout for ${this.name}`));
|
|
284
|
+
}, this.config.timeout || 30000);
|
|
285
|
+
this.pendingRequests.set(request.id, {
|
|
286
|
+
resolve,
|
|
287
|
+
reject,
|
|
288
|
+
timeout
|
|
289
|
+
});
|
|
290
|
+
try {
|
|
291
|
+
// Use dynamic endpoint or fall back to default endpoint
|
|
292
|
+
let endpoint = this.dynamicEndpoint || '/mcp';
|
|
293
|
+
console.error(`Sending request to ${this.name} via: ${endpoint}`);
|
|
294
|
+
// If dynamic endpoint and relative path, need to construct full URL
|
|
295
|
+
if (this.dynamicEndpoint && this.dynamicEndpoint.startsWith('/')) {
|
|
296
|
+
const url = new URL(this.dynamicEndpoint, this.baseUrl);
|
|
297
|
+
endpoint = url.pathname + url.search;
|
|
298
|
+
}
|
|
299
|
+
// Prepare request headers, including session info (if any)
|
|
300
|
+
const requestHeaders = {};
|
|
301
|
+
if (this.sessionId && this.sessionMode !== 'disabled') {
|
|
302
|
+
requestHeaders['Mcp-Session-Id'] = this.sessionId;
|
|
303
|
+
console.error(`Adding session header for ${this.name}: Mcp-Session-Id=${this.sessionId}`);
|
|
304
|
+
}
|
|
305
|
+
// Send request via HTTP POST
|
|
306
|
+
const response = await this.httpClient.post(endpoint, request, {
|
|
307
|
+
headers: requestHeaders
|
|
308
|
+
});
|
|
309
|
+
// Handle synchronous response
|
|
310
|
+
if (response.data && response.data.id === request.id) {
|
|
311
|
+
const pending = this.pendingRequests.get(request.id);
|
|
312
|
+
if (pending) {
|
|
313
|
+
this.pendingRequests.delete(request.id);
|
|
314
|
+
clearTimeout(pending.timeout);
|
|
315
|
+
pending.resolve(response.data);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
this.pendingRequests.delete(request.id);
|
|
321
|
+
clearTimeout(timeout);
|
|
322
|
+
// Check for session-related errors
|
|
323
|
+
if (error.response?.status === 404 && this.sessionId) {
|
|
324
|
+
console.error(`Session expired for ${this.name}, sessionId: ${this.sessionId}`);
|
|
325
|
+
// Clear expired sessionId, trigger reconnect to get new session
|
|
326
|
+
this.sessionId = undefined;
|
|
327
|
+
this.handleSSEDisconnection();
|
|
328
|
+
}
|
|
329
|
+
reject(new Error(`Failed to send request to ${this.name}: ${error.message}`));
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
async sendNotification(notification) {
|
|
334
|
+
if (!this.isConnected) {
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
try {
|
|
338
|
+
// Use dynamic endpoint or fall back to default endpoint
|
|
339
|
+
let endpoint = this.dynamicEndpoint || '/mcp';
|
|
340
|
+
// Prepare request headers, including session info (if any)
|
|
341
|
+
const requestHeaders = {};
|
|
342
|
+
if (this.sessionId && this.sessionMode !== 'disabled') {
|
|
343
|
+
requestHeaders['Mcp-Session-Id'] = this.sessionId;
|
|
344
|
+
}
|
|
345
|
+
await this.httpClient.post(endpoint, notification, {
|
|
346
|
+
headers: requestHeaders
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
console.error(`Failed to send notification to ${this.name}:`, error);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
getNextRequestId() {
|
|
354
|
+
return this.requestId++;
|
|
355
|
+
}
|
|
356
|
+
handleSSEMessage(message) {
|
|
357
|
+
// Handle generic SSE message
|
|
358
|
+
console.error(`Received SSE message from ${this.name}:`, message);
|
|
359
|
+
// Check if it's an endpoint message
|
|
360
|
+
if (message.endpoint) {
|
|
361
|
+
this.dynamicEndpoint = message.endpoint;
|
|
362
|
+
console.error(`Updated dynamic endpoint for ${this.name}: ${this.dynamicEndpoint}`);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
handleMCPResponse(response) {
|
|
366
|
+
// Handle MCP response
|
|
367
|
+
const pending = this.pendingRequests.get(response.id);
|
|
368
|
+
if (pending) {
|
|
369
|
+
this.pendingRequests.delete(response.id);
|
|
370
|
+
clearTimeout(pending.timeout);
|
|
371
|
+
pending.resolve(response);
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
console.warn(`Received response for unknown request ID: ${response.id}`);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
handleMCPNotification(notification) {
|
|
378
|
+
console.error(`Received MCP notification from ${this.name}:`, notification.method);
|
|
379
|
+
if (notification.method === 'notifications/tools/list_changed') {
|
|
380
|
+
// Tool list changed, notify router for unified handling
|
|
381
|
+
this.emit('tools-changed', { serverName: this.name });
|
|
382
|
+
}
|
|
383
|
+
// Forward notification to upper layer
|
|
384
|
+
this.emit('notification', { serverName: this.name, notification });
|
|
385
|
+
}
|
|
386
|
+
handleSSEDisconnection() {
|
|
387
|
+
if (this.isReconnecting) {
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
// If server is disabled, should not auto-reconnect
|
|
391
|
+
if (this.isDisabled) {
|
|
392
|
+
console.error(`❌ ${this.name} is disabled, no auto-reconnect`);
|
|
393
|
+
this.isConnected = false;
|
|
394
|
+
this.emit('disconnected', {
|
|
395
|
+
serverName: this.name,
|
|
396
|
+
error: new Error('SSE connection lost - server disabled')
|
|
397
|
+
});
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
this.isConnected = false;
|
|
401
|
+
this.isReconnecting = true;
|
|
402
|
+
console.error(`SSE connection lost for ${this.name}, attempting reconnection...`);
|
|
403
|
+
this.emit('disconnected', {
|
|
404
|
+
serverName: this.name,
|
|
405
|
+
error: new Error('SSE connection lost')
|
|
406
|
+
});
|
|
407
|
+
// Start reconnect timer
|
|
408
|
+
const reconnectInterval = this.config.sseReconnectInterval || 5000;
|
|
409
|
+
this.reconnectTimer = setTimeout(() => {
|
|
410
|
+
this.attemptReconnection();
|
|
411
|
+
}, reconnectInterval);
|
|
412
|
+
}
|
|
413
|
+
async attemptReconnection() {
|
|
414
|
+
if (!this.isReconnecting) {
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
try {
|
|
418
|
+
console.error(`Attempting to reconnect ${this.name}...`);
|
|
419
|
+
// Clean up old connection
|
|
420
|
+
this.cleanup();
|
|
421
|
+
// Reconnect
|
|
422
|
+
await this.connect();
|
|
423
|
+
this.isReconnecting = false;
|
|
424
|
+
console.error(`Successfully reconnected ${this.name}`);
|
|
425
|
+
}
|
|
426
|
+
catch (error) {
|
|
427
|
+
console.error(`Reconnection failed for ${this.name}:`, error.message);
|
|
428
|
+
// Continue trying to reconnect
|
|
429
|
+
const reconnectInterval = this.config.sseReconnectInterval || 5000;
|
|
430
|
+
this.reconnectTimer = setTimeout(() => {
|
|
431
|
+
this.attemptReconnection();
|
|
432
|
+
}, reconnectInterval * 2); // Exponential backoff
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
cleanup() {
|
|
436
|
+
if (this.reconnectTimer) {
|
|
437
|
+
clearTimeout(this.reconnectTimer);
|
|
438
|
+
this.reconnectTimer = undefined;
|
|
439
|
+
}
|
|
440
|
+
if (this.sseEventSource) {
|
|
441
|
+
this.sseEventSource.close();
|
|
442
|
+
this.sseEventSource = undefined;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
// Get current tool list (fetch in real-time from server)
|
|
446
|
+
async getCachedTools() {
|
|
447
|
+
if (!this.isConnected)
|
|
448
|
+
return [];
|
|
449
|
+
return await this.getTools();
|
|
450
|
+
}
|
|
451
|
+
// Check if specific tool is available (check in real-time from server)
|
|
452
|
+
async hasTools(toolName) {
|
|
453
|
+
if (!this.isConnected)
|
|
454
|
+
return false;
|
|
455
|
+
const tools = await this.getTools();
|
|
456
|
+
return tools.some(tool => tool.name === toolName);
|
|
457
|
+
}
|
|
458
|
+
// Get connection status information
|
|
459
|
+
getStatus() {
|
|
460
|
+
return {
|
|
461
|
+
name: this.name,
|
|
462
|
+
connected: this.isConnected,
|
|
463
|
+
toolCount: 0, // Tool count managed by router
|
|
464
|
+
pendingRequests: this.pendingRequests.size,
|
|
465
|
+
endpoint: this.baseUrl
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
// Disable adapter, prevent auto-reconnect
|
|
469
|
+
disable() {
|
|
470
|
+
console.error(`🚫 Disabling ${this.name} - no auto-reconnect`);
|
|
471
|
+
this.isDisabled = true;
|
|
472
|
+
// Clear reconnect timer
|
|
473
|
+
if (this.reconnectTimer) {
|
|
474
|
+
clearTimeout(this.reconnectTimer);
|
|
475
|
+
this.reconnectTimer = undefined;
|
|
476
|
+
}
|
|
477
|
+
this.isReconnecting = false;
|
|
478
|
+
}
|
|
479
|
+
// Re-enable adapter, allow auto-reconnect
|
|
480
|
+
enable() {
|
|
481
|
+
console.error(`✅ Enabling ${this.name} - auto-reconnect allowed`);
|
|
482
|
+
this.isDisabled = false;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
//# sourceMappingURL=http-sse-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-sse-adapter.js","sourceRoot":"","sources":["../../src/adapters/http-sse-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { MCPServerConfig, MCPTool, MCPRequest, MCPResponse, ServerAdapter } from '../types/index.js';
|
|
3
|
+
export declare class StdioAdapter extends EventEmitter implements ServerAdapter {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly config: MCPServerConfig;
|
|
6
|
+
isConnected: boolean;
|
|
7
|
+
private process?;
|
|
8
|
+
private requestId;
|
|
9
|
+
private pendingRequests;
|
|
10
|
+
private buffer;
|
|
11
|
+
private stderrBuffer;
|
|
12
|
+
private crashCount;
|
|
13
|
+
private lastCrashTime;
|
|
14
|
+
private isRecovering;
|
|
15
|
+
private crashHistory;
|
|
16
|
+
private isBlacklisted;
|
|
17
|
+
private blacklistUntil;
|
|
18
|
+
private isDisabled;
|
|
19
|
+
constructor(name: string, config: MCPServerConfig);
|
|
20
|
+
connect(): Promise<void>;
|
|
21
|
+
disconnect(): Promise<void>;
|
|
22
|
+
private setupProcessHandlers;
|
|
23
|
+
private handleStdoutData;
|
|
24
|
+
private handleMessage;
|
|
25
|
+
private handleNotification;
|
|
26
|
+
private initialize;
|
|
27
|
+
getTools(): Promise<MCPTool[]>;
|
|
28
|
+
callTool(name: string, args: any): Promise<MCPResponse>;
|
|
29
|
+
sendRequest(request: MCPRequest): Promise<MCPResponse>;
|
|
30
|
+
private sendNotification;
|
|
31
|
+
private getNextRequestId;
|
|
32
|
+
private cleanup;
|
|
33
|
+
getCachedTools(): Promise<MCPTool[]>;
|
|
34
|
+
hasTools(toolName: string): Promise<boolean>;
|
|
35
|
+
getStatus(): {
|
|
36
|
+
name: string;
|
|
37
|
+
connected: boolean;
|
|
38
|
+
toolCount: number;
|
|
39
|
+
pendingRequests: number;
|
|
40
|
+
crashCount: number;
|
|
41
|
+
recentCrashes: number;
|
|
42
|
+
isBlacklisted: boolean;
|
|
43
|
+
blacklistRemaining?: number;
|
|
44
|
+
};
|
|
45
|
+
clearBlacklist(): void;
|
|
46
|
+
getCrashStats(): {
|
|
47
|
+
totalCrashes: number;
|
|
48
|
+
recentCrashes: number;
|
|
49
|
+
crashHistory: string[];
|
|
50
|
+
isBlacklisted: boolean;
|
|
51
|
+
nextAttemptIn?: number;
|
|
52
|
+
};
|
|
53
|
+
private checkAndUpdateBlacklist;
|
|
54
|
+
private shouldAttemptReconnect;
|
|
55
|
+
private getReconnectDelay;
|
|
56
|
+
private attemptRecovery;
|
|
57
|
+
forceReconnect(): Promise<void>;
|
|
58
|
+
disable(): void;
|
|
59
|
+
enable(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Log environment variable debug information
|
|
62
|
+
*/
|
|
63
|
+
private logEnvironmentVariables;
|
|
64
|
+
/**
|
|
65
|
+
* Check if environment variable is sensitive
|
|
66
|
+
*/
|
|
67
|
+
private isSensitiveEnvVar;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=stdio-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/stdio-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGrG,qBAAa,YAAa,SAAQ,YAAa,YAAW,aAAa;IACrE,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,MAAM,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,OAAO,CAAS;IAEpC,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,eAAe,CAIR;IAEf,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,YAAY,CAAc;IAGlC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,UAAU,CAAkB;gBAExB,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe;IAU3C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAyFxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BjC,OAAO,CAAC,oBAAoB;IAwG5B,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,kBAAkB;YAcZ,UAAU;IAiClB,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAiB9B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC;IAqCvD,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IA8D5D,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,OAAO;IAwBT,cAAc,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAMpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOlD,SAAS,IAAI;QACX,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,OAAO,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,OAAO,CAAC;QACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B;IAeD,cAAc,IAAI,IAAI;IAWtB,aAAa,IAAI;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,aAAa,EAAE,OAAO,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB;IAYD,OAAO,CAAC,uBAAuB;IAkC/B,OAAO,CAAC,sBAAsB;IAoC9B,OAAO,CAAC,iBAAiB;YA2BX,eAAe;IAiCvB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrC,OAAO,IAAI,IAAI;IAMf,MAAM,IAAI,IAAI;IAKd;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA4C/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAU1B"}
|