aws-runtime-bridge 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -9
- package/dist/index.js +2 -0
- package/dist/routes/instance.d.ts +10 -0
- package/dist/routes/instance.d.ts.map +1 -1
- package/dist/routes/instance.js +37 -13
- package/dist/routes/instance.test.js +38 -1
- package/dist/services/auto-register.d.ts +4 -0
- package/dist/services/auto-register.d.ts.map +1 -1
- package/dist/services/auto-register.js +3 -34
- package/dist/services/startup-config-wizard.d.ts +15 -0
- package/dist/services/startup-config-wizard.d.ts.map +1 -0
- package/dist/services/startup-config-wizard.js +122 -0
- package/dist/services/startup-config-wizard.test.d.ts +2 -0
- package/dist/services/startup-config-wizard.test.d.ts.map +1 -0
- package/dist/services/startup-config-wizard.test.js +103 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +166 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/agent-client.js +602 -0
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/agent-client.test.js +534 -0
- package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/config.d.ts +22 -0
- package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/config.js +106 -0
- package/package/aws-client-agent-mcp/dist/config.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/config.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/config.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/config.test.js +139 -0
- package/package/aws-client-agent-mcp/dist/config.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/constants.d.ts +15 -0
- package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/constants.js +19 -0
- package/package/aws-client-agent-mcp/dist/constants.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +28 -0
- package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/http-client.js +96 -0
- package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/http-client.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/http-client.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/http-client.test.js +228 -0
- package/package/aws-client-agent-mcp/dist/http-client.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/index.d.ts +14 -0
- package/package/aws-client-agent-mcp/dist/index.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/index.js +30 -0
- package/package/aws-client-agent-mcp/dist/index.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/logger.d.ts +7 -0
- package/package/aws-client-agent-mcp/dist/logger.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/logger.js +19 -0
- package/package/aws-client-agent-mcp/dist/logger.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +77 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.js +438 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +624 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +78 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +420 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +61 -0
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/memory-store.js +268 -0
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/memory-store.test.js +164 -0
- package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +87 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.js +185 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.test.js +44 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts +53 -0
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/messageContent.js +125 -0
- package/package/aws-client-agent-mcp/dist/messageContent.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts +3 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js +50 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js +90 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +66 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.js +237 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js +19 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/types.d.ts +309 -0
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/types.js +9 -0
- package/package/aws-client-agent-mcp/dist/types.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +94 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.js +316 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js +191 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +1 -0
- package/package.json +3 -1
- package/scripts/ensure-bin-executable.mjs +31 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置管理模块
|
|
3
|
+
* 负责读取环境变量配置
|
|
4
|
+
*
|
|
5
|
+
* 注意:Agent 角色配置(roleName, prompt 等)由后端从 runtime-bridge 获取
|
|
6
|
+
* MCP 客户端只需要传递 workspacePath
|
|
7
|
+
*/
|
|
8
|
+
import { logger } from "./logger.js";
|
|
9
|
+
const DEFAULT_SERVER_URL = "ws://localhost:8080/ws/agent";
|
|
10
|
+
const DEFAULT_HEARTBEAT_INTERVAL = 3000; // 3秒发送一次心跳
|
|
11
|
+
const DEFAULT_HEARTBEAT_TIMEOUT = 9000; // 9秒未收到心跳响应则断开并重连
|
|
12
|
+
const DEFAULT_RECONNECT_INTERVAL = 200;
|
|
13
|
+
const DEFAULT_MAX_RECONNECT_ATTEMPTS = -1;
|
|
14
|
+
const DEFAULT_INTERNAL_API_KEY = "agentswork-internal-dev-key";
|
|
15
|
+
export class ConfigManager {
|
|
16
|
+
agentConfig = null;
|
|
17
|
+
serverConfig = null;
|
|
18
|
+
/**
|
|
19
|
+
* 加载配置
|
|
20
|
+
* MCP 客户端只提供 workspacePath,角色配置由后端从 runtime-bridge 获取
|
|
21
|
+
*/
|
|
22
|
+
loadConfig() {
|
|
23
|
+
const workspacePath = process.env.AWS_WORKSPACE_PATH || process.cwd();
|
|
24
|
+
this.agentConfig = {
|
|
25
|
+
roleName: process.env.AWS_ROLE_NAME || "",
|
|
26
|
+
agentId: process.env.AWS_AGENT_ID || undefined,
|
|
27
|
+
projectName: process.env.AWS_PROJECT_NAME || "default",
|
|
28
|
+
workspacePath: workspacePath,
|
|
29
|
+
prompt: process.env.AWS_PROMPT || "",
|
|
30
|
+
describe: "",
|
|
31
|
+
};
|
|
32
|
+
logger.info(`[Config] MCP 客户端配置已加载`);
|
|
33
|
+
logger.info(`[Config] 工作目录: ${this.agentConfig.workspacePath}`);
|
|
34
|
+
logger.info(`[Config] 项目名: ${this.agentConfig.projectName}`);
|
|
35
|
+
if (this.agentConfig.agentId) {
|
|
36
|
+
logger.info(`[Config] 预设 AgentID: ${this.agentConfig.agentId}`);
|
|
37
|
+
}
|
|
38
|
+
const internalApiKey = process.env.AWS_INTERNAL_API_KEY || DEFAULT_INTERNAL_API_KEY;
|
|
39
|
+
this.serverConfig = {
|
|
40
|
+
serverUrl: process.env.AWS_SERVER_URL || DEFAULT_SERVER_URL,
|
|
41
|
+
heartbeatInterval: parseInt(process.env.AWS_HEARTBEAT_INTERVAL ||
|
|
42
|
+
String(DEFAULT_HEARTBEAT_INTERVAL), 10),
|
|
43
|
+
heartbeatTimeout: parseInt(process.env.AWS_HEARTBEAT_TIMEOUT || String(DEFAULT_HEARTBEAT_TIMEOUT), 10),
|
|
44
|
+
reconnectInterval: DEFAULT_RECONNECT_INTERVAL,
|
|
45
|
+
maxReconnectAttempts: DEFAULT_MAX_RECONNECT_ATTEMPTS,
|
|
46
|
+
internalApiKey,
|
|
47
|
+
runtimeAccessToken: process.env.AWS_RUNTIME_ACCESS_TOKEN || undefined,
|
|
48
|
+
userId: process.env.AWS_USER_ID || undefined,
|
|
49
|
+
runtimeBridgeBaseUrl: process.env.AWS_RUNTIME_BRIDGE_BASE_URL || undefined,
|
|
50
|
+
mcpHttpUrl: process.env.AWS_MCP_HTTP_URL || undefined,
|
|
51
|
+
};
|
|
52
|
+
logger.info(`[Config] 服务器地址: ${this.serverConfig.serverUrl}`);
|
|
53
|
+
if (!process.env.AWS_INTERNAL_API_KEY) {
|
|
54
|
+
logger.warn("[Config] 未配置 AWS_INTERNAL_API_KEY,当前使用默认开发密钥");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
applyRuntimeLaunchBinding(binding) {
|
|
58
|
+
if (!this.agentConfig || !this.serverConfig) {
|
|
59
|
+
throw new Error("配置未加载,请先调用 loadConfig()");
|
|
60
|
+
}
|
|
61
|
+
const agentId = String(binding.agentId || "").trim();
|
|
62
|
+
if (agentId) {
|
|
63
|
+
this.agentConfig.agentId = agentId;
|
|
64
|
+
}
|
|
65
|
+
const workspacePath = String(binding.workspacePath || "").trim();
|
|
66
|
+
if (workspacePath) {
|
|
67
|
+
this.agentConfig.workspacePath = workspacePath;
|
|
68
|
+
}
|
|
69
|
+
const runtimeAccessToken = String(binding.runtimeAccessToken || "").trim();
|
|
70
|
+
if (runtimeAccessToken) {
|
|
71
|
+
this.serverConfig.runtimeAccessToken = runtimeAccessToken;
|
|
72
|
+
}
|
|
73
|
+
const userId = String(binding.userId || "").trim();
|
|
74
|
+
if (userId) {
|
|
75
|
+
this.serverConfig.userId = userId;
|
|
76
|
+
}
|
|
77
|
+
const serverUrl = String(binding.serverUrl || binding.schedulerBaseUrl || "").trim();
|
|
78
|
+
if (serverUrl) {
|
|
79
|
+
this.serverConfig.serverUrl = serverUrl.includes("/ws/agent")
|
|
80
|
+
? serverUrl
|
|
81
|
+
: `${serverUrl.replace(/\/$/, "")}/ws/agent`.replace(/^http:/, "ws:").replace(/^https:/, "wss:");
|
|
82
|
+
}
|
|
83
|
+
const mcpHttpUrl = String(binding.mcpHttpUrl || "").trim();
|
|
84
|
+
if (mcpHttpUrl) {
|
|
85
|
+
this.serverConfig.mcpHttpUrl = mcpHttpUrl;
|
|
86
|
+
}
|
|
87
|
+
else if (binding.schedulerBaseUrl) {
|
|
88
|
+
this.serverConfig.mcpHttpUrl = `${String(binding.schedulerBaseUrl).replace(/\/$/, "")}/mcp/call`;
|
|
89
|
+
}
|
|
90
|
+
logger.info(`[Config] 已应用 runtime-bridge 启动绑定: agentId=${this.agentConfig.agentId || "(空)"}`);
|
|
91
|
+
}
|
|
92
|
+
getAgentConfig() {
|
|
93
|
+
if (!this.agentConfig) {
|
|
94
|
+
throw new Error("配置未加载,请先调用 loadConfig()");
|
|
95
|
+
}
|
|
96
|
+
return this.agentConfig;
|
|
97
|
+
}
|
|
98
|
+
getServerConfig() {
|
|
99
|
+
if (!this.serverConfig) {
|
|
100
|
+
throw new Error("配置未加载,请先调用 loadConfig()");
|
|
101
|
+
}
|
|
102
|
+
return this.serverConfig;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export const configManager = new ConfigManager();
|
|
106
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
3
|
+
import { ConfigManager } from './config.js';
|
|
4
|
+
describe('ConfigManager', () => {
|
|
5
|
+
const originalEnv = { ...process.env };
|
|
6
|
+
let configManager;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
configManager = new ConfigManager();
|
|
9
|
+
// 清理环境变量
|
|
10
|
+
delete process.env.AWS_SERVER_URL;
|
|
11
|
+
delete process.env.AWS_HEARTBEAT_INTERVAL;
|
|
12
|
+
delete process.env.AWS_WORKSPACE_PATH;
|
|
13
|
+
delete process.env.AWS_ROLE_NAME;
|
|
14
|
+
delete process.env.AWS_AGENT_ID;
|
|
15
|
+
delete process.env.AWS_PROJECT_NAME;
|
|
16
|
+
delete process.env.AWS_PROMPT;
|
|
17
|
+
delete process.env.AWS_INTERNAL_API_KEY;
|
|
18
|
+
delete process.env.AWS_MCP_HTTP_URL;
|
|
19
|
+
});
|
|
20
|
+
afterEach(() => {
|
|
21
|
+
// 恢复环境变量
|
|
22
|
+
process.env = { ...originalEnv };
|
|
23
|
+
});
|
|
24
|
+
describe('loadConfig', () => {
|
|
25
|
+
it('loads default values when no env vars set', () => {
|
|
26
|
+
configManager.loadConfig();
|
|
27
|
+
const agentConfig = configManager.getAgentConfig();
|
|
28
|
+
const serverConfig = configManager.getServerConfig();
|
|
29
|
+
assert.equal(agentConfig.roleName, '');
|
|
30
|
+
assert.equal(agentConfig.projectName, 'default');
|
|
31
|
+
assert.equal(serverConfig.serverUrl, 'ws://localhost:8080/ws/agent');
|
|
32
|
+
assert.equal(serverConfig.heartbeatInterval, 15000);
|
|
33
|
+
});
|
|
34
|
+
it('loads custom server URL from env', () => {
|
|
35
|
+
process.env.AWS_SERVER_URL = 'wss://custom.example.com/ws/agent';
|
|
36
|
+
configManager.loadConfig();
|
|
37
|
+
const serverConfig = configManager.getServerConfig();
|
|
38
|
+
assert.equal(serverConfig.serverUrl, 'wss://custom.example.com/ws/agent');
|
|
39
|
+
});
|
|
40
|
+
it('loads custom heartbeat interval from env', () => {
|
|
41
|
+
process.env.AWS_HEARTBEAT_INTERVAL = '30000';
|
|
42
|
+
configManager.loadConfig();
|
|
43
|
+
const serverConfig = configManager.getServerConfig();
|
|
44
|
+
assert.equal(serverConfig.heartbeatInterval, 30000);
|
|
45
|
+
});
|
|
46
|
+
it('loads workspace path from env', () => {
|
|
47
|
+
process.env.AWS_WORKSPACE_PATH = '/custom/workspace';
|
|
48
|
+
configManager.loadConfig();
|
|
49
|
+
const agentConfig = configManager.getAgentConfig();
|
|
50
|
+
assert.equal(agentConfig.workspacePath, '/custom/workspace');
|
|
51
|
+
});
|
|
52
|
+
it('uses cwd as default workspace path', () => {
|
|
53
|
+
configManager.loadConfig();
|
|
54
|
+
const agentConfig = configManager.getAgentConfig();
|
|
55
|
+
assert.equal(agentConfig.workspacePath, process.cwd());
|
|
56
|
+
});
|
|
57
|
+
it('loads role name from env', () => {
|
|
58
|
+
process.env.AWS_ROLE_NAME = 'backend-expert';
|
|
59
|
+
configManager.loadConfig();
|
|
60
|
+
const agentConfig = configManager.getAgentConfig();
|
|
61
|
+
assert.equal(agentConfig.roleName, 'backend-expert');
|
|
62
|
+
});
|
|
63
|
+
it('loads agent ID from env', () => {
|
|
64
|
+
process.env.AWS_AGENT_ID = 'agent-123';
|
|
65
|
+
configManager.loadConfig();
|
|
66
|
+
const agentConfig = configManager.getAgentConfig();
|
|
67
|
+
assert.equal(agentConfig.agentId, 'agent-123');
|
|
68
|
+
});
|
|
69
|
+
it('loads project name from env', () => {
|
|
70
|
+
process.env.AWS_PROJECT_NAME = 'my-project';
|
|
71
|
+
configManager.loadConfig();
|
|
72
|
+
const agentConfig = configManager.getAgentConfig();
|
|
73
|
+
assert.equal(agentConfig.projectName, 'my-project');
|
|
74
|
+
});
|
|
75
|
+
it('loads prompt from env', () => {
|
|
76
|
+
process.env.AWS_PROMPT = 'You are a helpful assistant';
|
|
77
|
+
configManager.loadConfig();
|
|
78
|
+
const agentConfig = configManager.getAgentConfig();
|
|
79
|
+
assert.equal(agentConfig.prompt, 'You are a helpful assistant');
|
|
80
|
+
});
|
|
81
|
+
it('loads internal API key from env', () => {
|
|
82
|
+
process.env.AWS_INTERNAL_API_KEY = 'secret-key';
|
|
83
|
+
configManager.loadConfig();
|
|
84
|
+
const serverConfig = configManager.getServerConfig();
|
|
85
|
+
assert.equal(serverConfig.internalApiKey, 'secret-key');
|
|
86
|
+
});
|
|
87
|
+
it('uses default internal API key when not set', () => {
|
|
88
|
+
configManager.loadConfig();
|
|
89
|
+
const serverConfig = configManager.getServerConfig();
|
|
90
|
+
assert.equal(serverConfig.internalApiKey, 'agentswork-internal-dev-key');
|
|
91
|
+
});
|
|
92
|
+
it('loads mcpHttpUrl from env', () => {
|
|
93
|
+
process.env.AWS_MCP_HTTP_URL = 'http://custom:3000/mcp/call';
|
|
94
|
+
configManager.loadConfig();
|
|
95
|
+
const serverConfig = configManager.getServerConfig();
|
|
96
|
+
assert.equal(serverConfig.mcpHttpUrl, 'http://custom:3000/mcp/call');
|
|
97
|
+
});
|
|
98
|
+
it('sets undefined mcpHttpUrl when not set', () => {
|
|
99
|
+
configManager.loadConfig();
|
|
100
|
+
const serverConfig = configManager.getServerConfig();
|
|
101
|
+
assert.equal(serverConfig.mcpHttpUrl, undefined);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('getAgentConfig', () => {
|
|
105
|
+
it('throws error when config not loaded', () => {
|
|
106
|
+
assert.throws(() => configManager.getAgentConfig(), /配置未加载/);
|
|
107
|
+
});
|
|
108
|
+
it('returns config after loadConfig called', () => {
|
|
109
|
+
configManager.loadConfig();
|
|
110
|
+
const config = configManager.getAgentConfig();
|
|
111
|
+
assert.ok(config);
|
|
112
|
+
assert.ok(typeof config === 'object');
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe('getServerConfig', () => {
|
|
116
|
+
it('throws error when config not loaded', () => {
|
|
117
|
+
assert.throws(() => configManager.getServerConfig(), /配置未加载/);
|
|
118
|
+
});
|
|
119
|
+
it('returns config after loadConfig called', () => {
|
|
120
|
+
configManager.loadConfig();
|
|
121
|
+
const config = configManager.getServerConfig();
|
|
122
|
+
assert.ok(config);
|
|
123
|
+
assert.ok(typeof config === 'object');
|
|
124
|
+
assert.equal(config.reconnectInterval, 200);
|
|
125
|
+
assert.equal(config.maxReconnectAttempts, -1);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
describe('multiple loadConfig calls', () => {
|
|
129
|
+
it('overwrites previous config on subsequent calls', () => {
|
|
130
|
+
process.env.AWS_SERVER_URL = 'ws://first:8080/ws/agent';
|
|
131
|
+
configManager.loadConfig();
|
|
132
|
+
assert.equal(configManager.getServerConfig().serverUrl, 'ws://first:8080/ws/agent');
|
|
133
|
+
process.env.AWS_SERVER_URL = 'ws://second:8080/ws/agent';
|
|
134
|
+
configManager.loadConfig();
|
|
135
|
+
assert.equal(configManager.getServerConfig().serverUrl, 'ws://second:8080/ws/agent');
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,WAAW,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACvC,IAAI,aAA4B,CAAC;IAEjC,UAAU,CAAC,GAAG,EAAE;QACd,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QACpC,SAAS;QACT,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAClC,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;QAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACtC,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAChC,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACpC,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACxC,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,SAAS;QACT,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,aAAa,CAAC,UAAU,EAAE,CAAC;YAE3B,MAAM,WAAW,GAAG,aAAa,CAAC,cAAc,EAAE,CAAC;YACnD,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;YAErD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,8BAA8B,CAAC,CAAC;YACrE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,mCAAmC,CAAC;YACjE,aAAa,CAAC,UAAU,EAAE,CAAC;YAE3B,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,mCAAmC,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,OAAO,CAAC;YAC7C,aAAa,CAAC,UAAU,EAAE,CAAC;YAE3B,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;YACrD,aAAa,CAAC,UAAU,EAAE,CAAC;YAE3B,MAAM,WAAW,GAAG,aAAa,CAAC,cAAc,EAAE,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,aAAa,CAAC,UAAU,EAAE,CAAC;YAE3B,MAAM,WAAW,GAAG,aAAa,CAAC,cAAc,EAAE,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,gBAAgB,CAAC;YAC7C,aAAa,CAAC,UAAU,EAAE,CAAC;YAE3B,MAAM,WAAW,GAAG,aAAa,CAAC,cAAc,EAAE,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,WAAW,CAAC;YACvC,aAAa,CAAC,UAAU,EAAE,CAAC;YAE3B,MAAM,WAAW,GAAG,aAAa,CAAC,cAAc,EAAE,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,YAAY,CAAC;YAC5C,aAAa,CAAC,UAAU,EAAE,CAAC;YAE3B,MAAM,WAAW,GAAG,aAAa,CAAC,cAAc,EAAE,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,6BAA6B,CAAC;YACvD,aAAa,CAAC,UAAU,EAAE,CAAC;YAE3B,MAAM,WAAW,GAAG,aAAa,CAAC,cAAc,EAAE,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,YAAY,CAAC;YAChD,aAAa,CAAC,UAAU,EAAE,CAAC;YAE3B,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,aAAa,CAAC,UAAU,EAAE,CAAC;YAE3B,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,6BAA6B,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,6BAA6B,CAAC;YAC7D,aAAa,CAAC,UAAU,EAAE,CAAC;YAE3B,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,6BAA6B,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,aAAa,CAAC,UAAU,EAAE,CAAC;YAE3B,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,EACpC,OAAO,CACR,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,aAAa,CAAC,UAAU,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,cAAc,EAAE,CAAC;YAE9C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YAClB,MAAM,CAAC,EAAE,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,EACrC,OAAO,CACR,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,aAAa,CAAC,UAAU,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;YAE/C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YAClB,MAAM,CAAC,EAAE,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,0BAA0B,CAAC;YACxD,aAAa,CAAC,UAAU,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;YAEpF,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,2BAA2B,CAAC;YACzD,aAAa,CAAC,UAAU,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC,SAAS,EAAE,2BAA2B,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 常量定义
|
|
3
|
+
*/
|
|
4
|
+
export declare const DEFAULT_SERVER_URL = "ws://localhost:8080/ws/agent";
|
|
5
|
+
export declare const DEFAULT_HEARTBEAT_INTERVAL = 15000;
|
|
6
|
+
export declare const DEFAULT_RECONNECT_INTERVAL = 200;
|
|
7
|
+
export declare const DEFAULT_MAX_RECONNECT_ATTEMPTS = -1;
|
|
8
|
+
export declare const DEFAULT_INTERNAL_API_KEY = "agentswork-internal-dev-key";
|
|
9
|
+
export declare const REGISTER_RETRY_INTERVAL_MS = 5000;
|
|
10
|
+
export declare const REGISTER_MAX_RETRIES = -1;
|
|
11
|
+
export declare const MESSAGE_POLL_INTERVAL_MS = 1000;
|
|
12
|
+
export declare const MESSAGE_ERROR_RETRY_MS = 5000;
|
|
13
|
+
export declare const MCP_SERVER_NAME = "aws-client-agent-mcp";
|
|
14
|
+
export declare const MCP_SERVER_VERSION = "1.0.0";
|
|
15
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,kBAAkB,iCAAiC,CAAC;AACjE,eAAO,MAAM,0BAA0B,QAAQ,CAAC;AAChD,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,8BAA8B,KAAK,CAAC;AACjD,eAAO,MAAM,wBAAwB,gCAAgC,CAAC;AAGtE,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAGvC,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAC7C,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAG3C,eAAO,MAAM,eAAe,yBAAyB,CAAC;AACtD,eAAO,MAAM,kBAAkB,UAAU,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 常量定义
|
|
3
|
+
*/
|
|
4
|
+
// 服务器配置
|
|
5
|
+
export const DEFAULT_SERVER_URL = 'ws://localhost:8080/ws/agent';
|
|
6
|
+
export const DEFAULT_HEARTBEAT_INTERVAL = 15000;
|
|
7
|
+
export const DEFAULT_RECONNECT_INTERVAL = 200;
|
|
8
|
+
export const DEFAULT_MAX_RECONNECT_ATTEMPTS = -1; // -1 表示无限重试
|
|
9
|
+
export const DEFAULT_INTERNAL_API_KEY = 'agentswork-internal-dev-key';
|
|
10
|
+
// 注册配置
|
|
11
|
+
export const REGISTER_RETRY_INTERVAL_MS = 5000;
|
|
12
|
+
export const REGISTER_MAX_RETRIES = -1; // -1 表示无限重试
|
|
13
|
+
// 消息轮询配置
|
|
14
|
+
export const MESSAGE_POLL_INTERVAL_MS = 1000;
|
|
15
|
+
export const MESSAGE_ERROR_RETRY_MS = 5000;
|
|
16
|
+
// MCP Server 信息
|
|
17
|
+
export const MCP_SERVER_NAME = 'aws-client-agent-mcp';
|
|
18
|
+
export const MCP_SERVER_VERSION = '1.0.0';
|
|
19
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,QAAQ;AACR,MAAM,CAAC,MAAM,kBAAkB,GAAG,8BAA8B,CAAC;AACjE,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAChD,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAC9C,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY;AAC9D,MAAM,CAAC,MAAM,wBAAwB,GAAG,6BAA6B,CAAC;AAEtE,OAAO;AACP,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC;AAC/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY;AAEpD,SAAS;AACT,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAC7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAE3C,gBAAgB;AAChB,MAAM,CAAC,MAAM,eAAe,GAAG,sBAAsB,CAAC;AACtD,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP 客户端模块
|
|
3
|
+
* 封装 MCP Tool 的 HTTP 调用
|
|
4
|
+
*/
|
|
5
|
+
import type { ServerConfig } from "./types.js";
|
|
6
|
+
export interface McpToolResponse<T = unknown> {
|
|
7
|
+
error?: string;
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
}
|
|
10
|
+
export declare class HttpClient {
|
|
11
|
+
private serverConfig;
|
|
12
|
+
private mcpHttpUrl;
|
|
13
|
+
constructor(serverConfig: ServerConfig);
|
|
14
|
+
/**
|
|
15
|
+
* 调用 MCP Tool
|
|
16
|
+
*/
|
|
17
|
+
callTool<T = unknown>(toolName: string, args: Record<string, unknown>): Promise<T>;
|
|
18
|
+
private ensureRuntimeAccessToken;
|
|
19
|
+
/**
|
|
20
|
+
* 解析 MCP HTTP URL
|
|
21
|
+
*/
|
|
22
|
+
private resolveMcpHttpUrl;
|
|
23
|
+
/**
|
|
24
|
+
* 获取 MCP HTTP URL
|
|
25
|
+
*/
|
|
26
|
+
getMcpHttpUrl(): string;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,UAAU,CAAS;gBAEf,YAAY,EAAE,YAAY;IAKtC;;OAEG;IACG,QAAQ,CAAC,CAAC,GAAG,OAAO,EACxB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC;YAyCC,wBAAwB;IAuCtC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;OAEG;IACH,aAAa,IAAI,MAAM;CAGxB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP 客户端模块
|
|
3
|
+
* 封装 MCP Tool 的 HTTP 调用
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from "./logger.js";
|
|
6
|
+
export class HttpClient {
|
|
7
|
+
serverConfig;
|
|
8
|
+
mcpHttpUrl;
|
|
9
|
+
constructor(serverConfig) {
|
|
10
|
+
this.serverConfig = serverConfig;
|
|
11
|
+
this.mcpHttpUrl = this.resolveMcpHttpUrl();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 调用 MCP Tool
|
|
15
|
+
*/
|
|
16
|
+
async callTool(toolName, args) {
|
|
17
|
+
await this.ensureRuntimeAccessToken();
|
|
18
|
+
const headers = {
|
|
19
|
+
"Content-Type": "application/json",
|
|
20
|
+
};
|
|
21
|
+
if (this.serverConfig.internalApiKey) {
|
|
22
|
+
headers["X-Internal-API-Key"] = this.serverConfig.internalApiKey;
|
|
23
|
+
}
|
|
24
|
+
if (this.serverConfig.runtimeAccessToken) {
|
|
25
|
+
headers["X-Runtime-Token"] = this.serverConfig.runtimeAccessToken;
|
|
26
|
+
headers["Authorization"] =
|
|
27
|
+
`Bearer ${this.serverConfig.runtimeAccessToken}`;
|
|
28
|
+
}
|
|
29
|
+
const response = await fetch(this.mcpHttpUrl, {
|
|
30
|
+
method: "POST",
|
|
31
|
+
headers,
|
|
32
|
+
body: JSON.stringify({
|
|
33
|
+
tool: toolName,
|
|
34
|
+
arguments: args,
|
|
35
|
+
}),
|
|
36
|
+
});
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
throw new Error(`MCP Tool 调用失败: ${response.status} ${response.statusText}`);
|
|
39
|
+
}
|
|
40
|
+
const result = (await response.json());
|
|
41
|
+
if (result.error) {
|
|
42
|
+
throw new Error(`MCP Tool 错误: ${result.error}`);
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
async ensureRuntimeAccessToken() {
|
|
47
|
+
if (this.serverConfig.runtimeAccessToken ||
|
|
48
|
+
!this.serverConfig.runtimeBridgeBaseUrl) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const url = `${this.serverConfig.runtimeBridgeBaseUrl.replace(/\/$/, "")}/runtime/binding/request-token`;
|
|
52
|
+
logger.info("[HttpClient] runtime token missing, requesting one from runtime-bridge");
|
|
53
|
+
const response = await fetch(url, {
|
|
54
|
+
method: "POST",
|
|
55
|
+
headers: { "Content-Type": "application/json" },
|
|
56
|
+
body: JSON.stringify({
|
|
57
|
+
userId: this.serverConfig.userId,
|
|
58
|
+
serverUrl: this.serverConfig.serverUrl,
|
|
59
|
+
}),
|
|
60
|
+
});
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
throw new Error(`无法从 runtime-bridge 获取 runtime token: ${response.status} ${response.statusText}`);
|
|
63
|
+
}
|
|
64
|
+
const payload = (await response.json());
|
|
65
|
+
if (!payload.runtimeAccessToken) {
|
|
66
|
+
throw new Error(payload.error || "runtime-bridge 未返回 runtime token");
|
|
67
|
+
}
|
|
68
|
+
this.serverConfig.runtimeAccessToken = payload.runtimeAccessToken;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 解析 MCP HTTP URL
|
|
72
|
+
*/
|
|
73
|
+
resolveMcpHttpUrl() {
|
|
74
|
+
const configured = this.serverConfig.mcpHttpUrl;
|
|
75
|
+
if (configured && configured.trim().length > 0) {
|
|
76
|
+
const normalized = configured.trim();
|
|
77
|
+
if (normalized.endsWith("/mcp/call")) {
|
|
78
|
+
return normalized;
|
|
79
|
+
}
|
|
80
|
+
return `${normalized.replace(/\/$/, "")}/mcp/call`;
|
|
81
|
+
}
|
|
82
|
+
// 从 WebSocket URL 推导 HTTP URL
|
|
83
|
+
const wsUrl = this.serverConfig.serverUrl;
|
|
84
|
+
return wsUrl
|
|
85
|
+
.replace("ws://", "http://")
|
|
86
|
+
.replace("wss://", "https://")
|
|
87
|
+
.replace("/ws/agent", "/mcp/call");
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 获取 MCP HTTP URL
|
|
91
|
+
*/
|
|
92
|
+
getMcpHttpUrl() {
|
|
93
|
+
return this.mcpHttpUrl;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.test.d.ts","sourceRoot":"","sources":["../src/http-client.test.ts"],"names":[],"mappings":""}
|