aws-runtime-bridge 1.8.4 → 1.8.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/AcodeSdkAdapter.js +6 -98
- package/dist/adapter/AcodeSdkAdapter.test.js +2 -313
- package/dist/adapter/OpencodeSdkAdapter.js +1 -1
- package/dist/adapter/types.d.ts.map +1 -1
- package/dist/adapter/types.js +3 -7
- package/dist/config.d.ts +3 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -36
- package/dist/config.test.js +20 -24
- package/dist/routes/ai-sources.js +1 -5
- package/dist/routes/ai-sources.test.js +0 -21
- package/dist/routes/instance.test.js +70 -1
- package/dist/routes/runtime-binding.d.ts.map +1 -1
- package/dist/routes/runtime-binding.js +1 -36
- package/dist/routes/terminal.d.ts +0 -2
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +7 -109
- package/dist/routes/terminal.test.js +1 -118
- package/dist/services/mcp-launch-binding-queue.d.ts +0 -7
- package/dist/services/mcp-launch-binding-queue.d.ts.map +1 -1
- package/dist/services/mcp-launch-binding-queue.js +0 -25
- package/dist/services/session-output.d.ts +3 -7
- package/dist/services/session-output.d.ts.map +1 -1
- package/package/acode/dist/runtime.d.ts +0 -1
- package/package/acode/dist/runtime.d.ts.map +1 -1
- package/package/acode/dist/runtime.js +31 -265
- package/package/acode/dist/types.d.ts +1 -1
- package/package/acode/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts +0 -4
- package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/config.js +0 -15
- package/package/aws-client-agent-mcp/dist/config.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +0 -10
- package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.js +1 -79
- package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.test.js +265 -129
- package/package/aws-client-agent-mcp/dist/http-client.test.js.map +1 -1
- package/package.json +1 -1
package/dist/config.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
export declare const port: number;
|
|
8
8
|
/** 默认调度器基础 URL */
|
|
9
9
|
export declare const DEFAULT_SCHEDULER_BASE_URL = "http://localhost:8080";
|
|
10
|
-
export type SchedulerBaseUrlSource = "
|
|
10
|
+
export type SchedulerBaseUrlSource = "env" | "single-auto-register-target" | "request" | "default" | "ambiguous-auto-register-targets";
|
|
11
11
|
export interface SchedulerBaseUrlResolution {
|
|
12
12
|
url: string;
|
|
13
13
|
source: SchedulerBaseUrlSource;
|
|
@@ -20,7 +20,8 @@ export interface SchedulerBaseUrlResolution {
|
|
|
20
20
|
export declare function resolveSchedulerBaseUrl(): SchedulerBaseUrlResolution;
|
|
21
21
|
/**
|
|
22
22
|
* 解析调度中心基础 URL。
|
|
23
|
-
*
|
|
23
|
+
* 主流程:bridge 本机显式配置优先;未配置时,单个自动注册目标可作为宿主机部署的零额外配置回退;
|
|
24
|
+
* 服务端请求携带的 scheduler 地址仅作为本机无配置时的兜底,避免 Docker 容器内地址覆盖机器实例配置。
|
|
24
25
|
*/
|
|
25
26
|
export declare function resolveSchedulerBaseUrlFrom(requestSchedulerBaseUrl: unknown): SchedulerBaseUrlResolution;
|
|
26
27
|
/** 调度器基础 URL(兼容旧导入;请求处理应优先调用 resolveSchedulerBaseUrl 获取最新值) */
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,WAAW;AACX,eAAO,MAAM,IAAI,EAAE,MAElB,CAAC;AAEF,kBAAkB;AAClB,eAAO,MAAM,0BAA0B,0BAA0B,CAAC;AAElE,MAAM,MAAM,sBAAsB,GAC9B,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,WAAW;AACX,eAAO,MAAM,IAAI,EAAE,MAElB,CAAC;AAEF,kBAAkB;AAClB,eAAO,MAAM,0BAA0B,0BAA0B,CAAC;AAElE,MAAM,MAAM,sBAAsB,GAC9B,KAAK,GACL,6BAA6B,GAC7B,SAAS,GACT,SAAS,GACT,iCAAiC,CAAC;AAEtC,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,sBAAsB,CAAC;IAC/B,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AA+ED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,0BAA0B,CAEpE;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,uBAAuB,EAAE,OAAO,GAC/B,0BAA0B,CA6C5B;AAED,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,EAAE,MAEH,CAAC;AAE7B,cAAc;AACd,eAAO,MAAM,OAAO,EAAE,MAA8C,CAAC;AAErE,oCAAoC;AACpC,eAAO,MAAM,oBAAoB,EAAE,OACiB,CAAC;AAErD,8BAA8B;AAC9B,eAAO,MAAM,kBAAkB,EAAE,MAAM,EAMC,CAAC;AAEzC,gEAAgE;AAChE,wBAAgB,uBAAuB,IAAI,IAAI,CAAG;AAElD,eAAe;AACf,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,8CAA8C;AAC9C,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED,2BAA2B;AAC3B,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKlE;AAED,0BAA0B;AAC1B,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED,yBAAyB;AACzB,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,wBAAwB;AACxB,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED,sBAAsB;AACtB,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED,yBAAyB;AACzB,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED,4BAA4B;AAC5B,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED,2BAA2B;AAC3B,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED;;GAEG;AAEH,yBAAyB;AACzB,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,sBAAsB,EACrB,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1C,eAAe;AACf,eAAO,MAAM,mBAAmB,SACiB,CAAC;AAElD,iCAAiC;AACjC,eAAO,MAAM,2BAA2B,QAEvC,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,uBAAuB,QAEnC,CAAC;AAEF;;GAEG;AAEH,eAAe;AACf,eAAO,MAAM,qBAAqB,SAA2C,CAAC;AAE9E,YAAY;AACZ,eAAO,MAAM,uBAAuB,QAAkC,CAAC;AAEvE,iBAAiB;AACjB,eAAO,MAAM,sBAAsB,QAAiC,CAAC;AAErE,oBAAoB;AACpB,eAAO,MAAM,2BAA2B,QAAsC,CAAC;AAE/E,WAAW;AACX,eAAO,MAAM,0BAA0B,QAAqC,CAAC;AAE7E,WAAW;AACX,eAAO,MAAM,uBAAuB,QAAkC,CAAC;AAEvE,aAAa;AACb,eAAO,MAAM,4BAA4B,QACH,CAAC;AAEvC,kCAAkC;AAClC,eAAO,MAAM,wBAAwB,QAC4B,CAAC;AAElE,aAAa;AACb,eAAO,MAAM,yBAAyB,QAErC,CAAC;AAEF,iBAAiB;AACjB,eAAO,MAAM,4BAA4B,QAExC,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -41,19 +41,6 @@ function normalizeSchedulerHttpBaseUrl(value) {
|
|
|
41
41
|
return repaired.replace(/\/+$/, "");
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
-
function isLoopbackSchedulerBaseUrl(value) {
|
|
45
|
-
try {
|
|
46
|
-
const url = new URL(value);
|
|
47
|
-
const hostname = url.hostname.toLowerCase();
|
|
48
|
-
return (hostname === "localhost" ||
|
|
49
|
-
hostname === "127.0.0.1" ||
|
|
50
|
-
hostname === "::1" ||
|
|
51
|
-
hostname === "[::1]");
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
return /^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?(?:\/|$)/i.test(value);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
44
|
function getAutoRegisterConfigFilePath() {
|
|
58
45
|
const testHomeDir = String(process.env.AWS_TEST_HOME || "").trim();
|
|
59
46
|
return path.join(testHomeDir || homedir(), ".aws-bridge", "config.json");
|
|
@@ -93,30 +80,11 @@ export function resolveSchedulerBaseUrl() {
|
|
|
93
80
|
}
|
|
94
81
|
/**
|
|
95
82
|
* 解析调度中心基础 URL。
|
|
96
|
-
*
|
|
83
|
+
* 主流程:bridge 本机显式配置优先;未配置时,单个自动注册目标可作为宿主机部署的零额外配置回退;
|
|
84
|
+
* 服务端请求携带的 scheduler 地址仅作为本机无配置时的兜底,避免 Docker 容器内地址覆盖机器实例配置。
|
|
97
85
|
*/
|
|
98
86
|
export function resolveSchedulerBaseUrlFrom(requestSchedulerBaseUrl) {
|
|
99
|
-
const normalizedRequestSchedulerBaseUrl = normalizeSchedulerHttpBaseUrl(requestSchedulerBaseUrl);
|
|
100
87
|
const envSchedulerBaseUrl = normalizeSchedulerHttpBaseUrl(process.env.AWS_RUNTIME_SCHEDULER_BASE_URL);
|
|
101
|
-
const autoRegisterTargetUrls = readAutoRegisterTargetUrls();
|
|
102
|
-
const singleAutoRegisterTargetUrl = autoRegisterTargetUrls.length === 1 ? autoRegisterTargetUrls[0] : undefined;
|
|
103
|
-
if (normalizedRequestSchedulerBaseUrl) {
|
|
104
|
-
const localSchedulerBaseUrl = envSchedulerBaseUrl || singleAutoRegisterTargetUrl;
|
|
105
|
-
if (localSchedulerBaseUrl &&
|
|
106
|
-
isLoopbackSchedulerBaseUrl(normalizedRequestSchedulerBaseUrl) &&
|
|
107
|
-
!isLoopbackSchedulerBaseUrl(localSchedulerBaseUrl)) {
|
|
108
|
-
return {
|
|
109
|
-
url: localSchedulerBaseUrl,
|
|
110
|
-
source: envSchedulerBaseUrl ? "env" : "single-auto-register-target",
|
|
111
|
-
ambiguousTargetUrls: [],
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
return {
|
|
115
|
-
url: normalizedRequestSchedulerBaseUrl,
|
|
116
|
-
source: "request",
|
|
117
|
-
ambiguousTargetUrls: [],
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
88
|
if (envSchedulerBaseUrl) {
|
|
121
89
|
return {
|
|
122
90
|
url: envSchedulerBaseUrl,
|
|
@@ -124,13 +92,22 @@ export function resolveSchedulerBaseUrlFrom(requestSchedulerBaseUrl) {
|
|
|
124
92
|
ambiguousTargetUrls: [],
|
|
125
93
|
};
|
|
126
94
|
}
|
|
127
|
-
|
|
95
|
+
const autoRegisterTargetUrls = readAutoRegisterTargetUrls();
|
|
96
|
+
if (autoRegisterTargetUrls.length === 1) {
|
|
128
97
|
return {
|
|
129
|
-
url:
|
|
98
|
+
url: autoRegisterTargetUrls[0] || DEFAULT_SCHEDULER_BASE_URL,
|
|
130
99
|
source: "single-auto-register-target",
|
|
131
100
|
ambiguousTargetUrls: [],
|
|
132
101
|
};
|
|
133
102
|
}
|
|
103
|
+
const normalizedRequestSchedulerBaseUrl = normalizeSchedulerHttpBaseUrl(requestSchedulerBaseUrl);
|
|
104
|
+
if (normalizedRequestSchedulerBaseUrl) {
|
|
105
|
+
return {
|
|
106
|
+
url: normalizedRequestSchedulerBaseUrl,
|
|
107
|
+
source: "request",
|
|
108
|
+
ambiguousTargetUrls: [],
|
|
109
|
+
};
|
|
110
|
+
}
|
|
134
111
|
if (autoRegisterTargetUrls.length > 1) {
|
|
135
112
|
return {
|
|
136
113
|
url: DEFAULT_SCHEDULER_BASE_URL,
|
package/dist/config.test.js
CHANGED
|
@@ -42,52 +42,48 @@ afterEach(() => {
|
|
|
42
42
|
}
|
|
43
43
|
});
|
|
44
44
|
describe("scheduler base URL resolution", () => {
|
|
45
|
-
it("keeps
|
|
45
|
+
it("keeps explicit AWS_RUNTIME_SCHEDULER_BASE_URL before the server request URL", async () => {
|
|
46
46
|
const runtimeHome = createRuntimeHome();
|
|
47
47
|
useRuntimeHome(runtimeHome);
|
|
48
48
|
process.env.AWS_RUNTIME_SCHEDULER_BASE_URL = "http://env.local:7380";
|
|
49
49
|
writeBridgeConfig(runtimeHome, [{ serverUrl: "http://target.local:7380" }]);
|
|
50
50
|
const { resolveSchedulerBaseUrlFrom } = await import("./config.js");
|
|
51
51
|
expect(resolveSchedulerBaseUrlFrom("http://server.local:7380/api")).toEqual({
|
|
52
|
-
url: "http://
|
|
53
|
-
source: "
|
|
52
|
+
url: "http://env.local:7380",
|
|
53
|
+
source: "env",
|
|
54
54
|
ambiguousTargetUrls: [],
|
|
55
55
|
});
|
|
56
56
|
});
|
|
57
|
-
it("keeps
|
|
57
|
+
it("keeps a single auto-register target before the server request URL", async () => {
|
|
58
58
|
const runtimeHome = createRuntimeHome();
|
|
59
59
|
useRuntimeHome(runtimeHome);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
url: "http://explicit.local:7380",
|
|
66
|
-
source: "env",
|
|
60
|
+
writeBridgeConfig(runtimeHome, [{ serverUrl: "http://target.local:7380/api" }]);
|
|
61
|
+
const { resolveSchedulerBaseUrlFrom } = await import("./config.js");
|
|
62
|
+
expect(resolveSchedulerBaseUrlFrom("http://server.local:7380/api")).toEqual({
|
|
63
|
+
url: "http://target.local:7380",
|
|
64
|
+
source: "single-auto-register-target",
|
|
67
65
|
ambiguousTargetUrls: [],
|
|
68
66
|
});
|
|
69
67
|
});
|
|
70
|
-
it("
|
|
68
|
+
it("uses scheduler URL supplied by the server request when local bridge config is absent", async () => {
|
|
71
69
|
const runtimeHome = createRuntimeHome();
|
|
72
70
|
useRuntimeHome(runtimeHome);
|
|
73
|
-
process.env.AWS_RUNTIME_SCHEDULER_BASE_URL = "http://101.42.200.84:7380";
|
|
74
71
|
const { resolveSchedulerBaseUrlFrom } = await import("./config.js");
|
|
75
|
-
expect(resolveSchedulerBaseUrlFrom("http://
|
|
76
|
-
url: "http://
|
|
77
|
-
source: "
|
|
72
|
+
expect(resolveSchedulerBaseUrlFrom("http://server.local:7380/api")).toEqual({
|
|
73
|
+
url: "http://server.local:7380",
|
|
74
|
+
source: "request",
|
|
78
75
|
ambiguousTargetUrls: [],
|
|
79
76
|
});
|
|
80
77
|
});
|
|
81
|
-
it("
|
|
78
|
+
it("keeps explicit AWS_RUNTIME_SCHEDULER_BASE_URL as the highest priority", async () => {
|
|
82
79
|
const runtimeHome = createRuntimeHome();
|
|
83
80
|
useRuntimeHome(runtimeHome);
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
source: "single-auto-register-target",
|
|
81
|
+
process.env.AWS_RUNTIME_SCHEDULER_BASE_URL = "http://explicit.local:7380/path";
|
|
82
|
+
writeBridgeConfig(runtimeHome, [{ serverUrl: "http://target.local:7380" }]);
|
|
83
|
+
const { resolveSchedulerBaseUrl } = await import("./config.js");
|
|
84
|
+
expect(resolveSchedulerBaseUrl()).toEqual({
|
|
85
|
+
url: "http://explicit.local:7380",
|
|
86
|
+
source: "env",
|
|
91
87
|
ambiguousTargetUrls: [],
|
|
92
88
|
});
|
|
93
89
|
});
|
|
@@ -59,7 +59,7 @@ async function fetchRemoteModelList(baseUrl, apiKey) {
|
|
|
59
59
|
return normalizeListedModels(anthropicResponse.data);
|
|
60
60
|
}
|
|
61
61
|
aiSourcesRouter.post('/cc-switch/apply-ai-sources', validateToken, async (req, res) => {
|
|
62
|
-
const { agentId, template, ccSwitchEnabledTools, acodeTemplateId, claudecodeTemplateId, codexTemplateId, opencodeTemplateId,
|
|
62
|
+
const { agentId, template, ccSwitchEnabledTools, acodeTemplateId, claudecodeTemplateId, codexTemplateId, opencodeTemplateId, acode, claudecode, codex, opencode, } = req.body || {};
|
|
63
63
|
if (!agentId) {
|
|
64
64
|
res.status(400).json({ error: 'agentId is required' });
|
|
65
65
|
return;
|
|
@@ -81,10 +81,6 @@ aiSourcesRouter.post('/cc-switch/apply-ai-sources', validateToken, async (req, r
|
|
|
81
81
|
claudecodeTemplateId: String(claudecodeTemplateId || ''),
|
|
82
82
|
codexTemplateId: String(codexTemplateId || ''),
|
|
83
83
|
opencodeTemplateId: String(opencodeTemplateId || ''),
|
|
84
|
-
acodeModelEffort: String(acodeModelEffort || ''),
|
|
85
|
-
claudecodeModelEffort: String(claudecodeModelEffort || ''),
|
|
86
|
-
codexModelEffort: String(codexModelEffort || ''),
|
|
87
|
-
opencodeModelEffort: String(opencodeModelEffort || ''),
|
|
88
84
|
generatedFromUnifiedTemplate: appliedSummary.generatedFromUnifiedTemplate,
|
|
89
85
|
applied: appliedSummary.applied,
|
|
90
86
|
skippedTools: appliedSummary.skippedTools,
|
|
@@ -76,14 +76,6 @@ function buildModelListCandidates(baseUrl, protocol) {
|
|
|
76
76
|
: [`${normalizedBaseUrl}/models`, `${normalizedBaseUrl}/v1/models`];
|
|
77
77
|
return [...openAiCandidates, `${normalizedBaseUrl}/v1/models`];
|
|
78
78
|
}
|
|
79
|
-
function buildApplyAiSourcesResponse(body) {
|
|
80
|
-
return {
|
|
81
|
-
acodeModelEffort: String(body.acodeModelEffort || ''),
|
|
82
|
-
claudecodeModelEffort: String(body.claudecodeModelEffort || ''),
|
|
83
|
-
codexModelEffort: String(body.codexModelEffort || ''),
|
|
84
|
-
opencodeModelEffort: String(body.opencodeModelEffort || ''),
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
79
|
describe('ai source unified config generation', () => {
|
|
88
80
|
it('builds tool-specific configs from unified template fields', () => {
|
|
89
81
|
assert.deepEqual(buildUnifiedToolConfig({
|
|
@@ -153,17 +145,4 @@ describe('ai source unified config generation', () => {
|
|
|
153
145
|
model: 'gpt-test',
|
|
154
146
|
}).opencode.provider.default.options.baseURL).toBe('https://octopus.721579.xyz/v1');
|
|
155
147
|
});
|
|
156
|
-
it('echoes selected model effort metadata in apply-ai-sources responses', () => {
|
|
157
|
-
expect(buildApplyAiSourcesResponse({
|
|
158
|
-
acodeModelEffort: 'xhigh',
|
|
159
|
-
claudecodeModelEffort: 'high',
|
|
160
|
-
codexModelEffort: 'max',
|
|
161
|
-
opencodeModelEffort: 'high',
|
|
162
|
-
})).toEqual({
|
|
163
|
-
acodeModelEffort: 'xhigh',
|
|
164
|
-
claudecodeModelEffort: 'high',
|
|
165
|
-
codexModelEffort: 'max',
|
|
166
|
-
opencodeModelEffort: 'high',
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
148
|
});
|
|
@@ -40,6 +40,8 @@ vi.mock('node:child_process', async (importOriginal) => ({
|
|
|
40
40
|
afterEach(() => {
|
|
41
41
|
vi.useRealTimers();
|
|
42
42
|
vi.clearAllMocks();
|
|
43
|
+
delete process.env.AWS_RUNTIME_SCHEDULER_BASE_URL;
|
|
44
|
+
delete process.env.AWS_TEST_HOME;
|
|
43
45
|
});
|
|
44
46
|
function mockSpawnResult(exitCode, stdoutText = '', stderrText = '') {
|
|
45
47
|
spawnMock.mockImplementationOnce(() => {
|
|
@@ -293,7 +295,7 @@ describe('instance route validation', () => {
|
|
|
293
295
|
});
|
|
294
296
|
expect(status).not.toHaveBeenCalled();
|
|
295
297
|
});
|
|
296
|
-
it('
|
|
298
|
+
it('keeps explicit local scheduler config before server ping request header', async () => {
|
|
297
299
|
process.env.AWS_RUNTIME_SCHEDULER_BASE_URL = 'http://localhost:8080';
|
|
298
300
|
const { default: axios } = await import('axios');
|
|
299
301
|
const { getRuntimeAccessToken } = await import('../services/runtime-binding.js');
|
|
@@ -307,6 +309,34 @@ describe('instance route validation', () => {
|
|
|
307
309
|
const status = vi.fn(() => ({ json }));
|
|
308
310
|
const header = vi.fn((name) => (name === 'X-Scheduler-Base-Url' ? 'http://server.local:7380/api' : ''));
|
|
309
311
|
await handler?.({ header }, { json, status }, vi.fn());
|
|
312
|
+
expect(getRuntimeAccessToken).toHaveBeenCalledWith(undefined, 'http://localhost:8080');
|
|
313
|
+
expect(axios.get).toHaveBeenCalledWith('http://localhost:8080/api/runtime/ping', {
|
|
314
|
+
headers: { 'X-Runtime-Token': 'stale-runtime-token-123456' },
|
|
315
|
+
});
|
|
316
|
+
expect(json).toHaveBeenCalledWith({
|
|
317
|
+
ok: true,
|
|
318
|
+
runtimeBridge: 'healthy',
|
|
319
|
+
schedulerReachable: true,
|
|
320
|
+
tokenRefreshed: false,
|
|
321
|
+
schedulerBaseUrl: 'http://localhost:8080',
|
|
322
|
+
});
|
|
323
|
+
expect(status).not.toHaveBeenCalled();
|
|
324
|
+
});
|
|
325
|
+
it('uses scheduler base URL supplied by server ping request when bridge has no local scheduler config', async () => {
|
|
326
|
+
delete process.env.AWS_RUNTIME_SCHEDULER_BASE_URL;
|
|
327
|
+
process.env.AWS_TEST_HOME = `${process.cwd()}/.vitest-empty-bridge-home`;
|
|
328
|
+
const { default: axios } = await import('axios');
|
|
329
|
+
const { getRuntimeAccessToken } = await import('../services/runtime-binding.js');
|
|
330
|
+
const { instanceRouter } = await import('./instance.js');
|
|
331
|
+
vi.mocked(getRuntimeAccessToken).mockReturnValue('stale-runtime-token-123456');
|
|
332
|
+
vi.mocked(axios.get).mockReset();
|
|
333
|
+
vi.mocked(axios.get).mockResolvedValueOnce({ status: 200 });
|
|
334
|
+
const handler = instanceRouter.stack.find((layer) => layer.route?.path === '/ping')?.route?.stack[1]?.handle;
|
|
335
|
+
expect(handler).toBeTypeOf('function');
|
|
336
|
+
const json = vi.fn();
|
|
337
|
+
const status = vi.fn(() => ({ json }));
|
|
338
|
+
const header = vi.fn((name) => (name === 'X-Scheduler-Base-Url' ? 'http://server.local:7380/api' : ''));
|
|
339
|
+
await handler?.({ header }, { json, status }, vi.fn());
|
|
310
340
|
expect(getRuntimeAccessToken).toHaveBeenCalledWith(undefined, 'http://server.local:7380');
|
|
311
341
|
expect(axios.get).toHaveBeenCalledWith('http://server.local:7380/api/runtime/ping', {
|
|
312
342
|
headers: { 'X-Runtime-Token': 'stale-runtime-token-123456' },
|
|
@@ -320,6 +350,45 @@ describe('instance route validation', () => {
|
|
|
320
350
|
});
|
|
321
351
|
expect(status).not.toHaveBeenCalled();
|
|
322
352
|
});
|
|
353
|
+
it('keeps single auto-register scheduler config before server ping request header', async () => {
|
|
354
|
+
delete process.env.AWS_RUNTIME_SCHEDULER_BASE_URL;
|
|
355
|
+
const fs = await import('node:fs');
|
|
356
|
+
const path = await import('node:path');
|
|
357
|
+
const testHome = path.join(process.cwd(), '.vitest-single-target-bridge-home');
|
|
358
|
+
const configDir = path.join(testHome, '.aws-bridge');
|
|
359
|
+
fs.rmSync(testHome, { recursive: true, force: true });
|
|
360
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
361
|
+
fs.writeFileSync(path.join(configDir, 'config.json'), JSON.stringify({
|
|
362
|
+
autoRegisterTargets: [
|
|
363
|
+
{ serverUrl: 'http://bridge-config.local:7380/api' },
|
|
364
|
+
],
|
|
365
|
+
}), 'utf-8');
|
|
366
|
+
process.env.AWS_TEST_HOME = testHome;
|
|
367
|
+
const { default: axios } = await import('axios');
|
|
368
|
+
const { getRuntimeAccessToken } = await import('../services/runtime-binding.js');
|
|
369
|
+
const { instanceRouter } = await import('./instance.js');
|
|
370
|
+
vi.mocked(getRuntimeAccessToken).mockReturnValue('stale-runtime-token-123456');
|
|
371
|
+
vi.mocked(axios.get).mockReset();
|
|
372
|
+
vi.mocked(axios.get).mockResolvedValueOnce({ status: 200 });
|
|
373
|
+
const handler = instanceRouter.stack.find((layer) => layer.route?.path === '/ping')?.route?.stack[1]?.handle;
|
|
374
|
+
expect(handler).toBeTypeOf('function');
|
|
375
|
+
const json = vi.fn();
|
|
376
|
+
const status = vi.fn(() => ({ json }));
|
|
377
|
+
const header = vi.fn((name) => (name === 'X-Scheduler-Base-Url' ? 'http://server.local:7380/api' : ''));
|
|
378
|
+
await handler?.({ header }, { json, status }, vi.fn());
|
|
379
|
+
expect(getRuntimeAccessToken).toHaveBeenCalledWith(undefined, 'http://bridge-config.local:7380');
|
|
380
|
+
expect(axios.get).toHaveBeenCalledWith('http://bridge-config.local:7380/api/runtime/ping', {
|
|
381
|
+
headers: { 'X-Runtime-Token': 'stale-runtime-token-123456' },
|
|
382
|
+
});
|
|
383
|
+
expect(json).toHaveBeenCalledWith({
|
|
384
|
+
ok: true,
|
|
385
|
+
runtimeBridge: 'healthy',
|
|
386
|
+
schedulerReachable: true,
|
|
387
|
+
tokenRefreshed: false,
|
|
388
|
+
schedulerBaseUrl: 'http://bridge-config.local:7380',
|
|
389
|
+
});
|
|
390
|
+
expect(status).not.toHaveBeenCalled();
|
|
391
|
+
});
|
|
323
392
|
it('explains ambiguous auto-register scheduler targets without picking the first one', async () => {
|
|
324
393
|
const { buildAmbiguousSchedulerBaseUrlResponse } = await import('./instance.js');
|
|
325
394
|
const response = buildAmbiguousSchedulerBaseUrlResponse([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-binding.d.ts","sourceRoot":"","sources":["../../src/routes/runtime-binding.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,oBAAoB,4CAAW,CAAC;AAE7C,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,wBAAwB,GAC9B,yBAAyB,CAM3B;
|
|
1
|
+
{"version":3,"file":"runtime-binding.d.ts","sourceRoot":"","sources":["../../src/routes/runtime-binding.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,oBAAoB,4CAAW,CAAC;AAE7C,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,wBAAwB,GAC9B,yBAAyB,CAM3B;AAqMD,wBAAgB,6BAA6B,IAAI,IAAI,CAapD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Router } from "express";
|
|
2
2
|
import { validateToken } from "../middleware/auth.js";
|
|
3
|
-
import { claimMcpLaunchBinding,
|
|
3
|
+
import { claimMcpLaunchBinding, getMcpLaunchQueueSize } from "../services/mcp-launch-binding-queue.js";
|
|
4
4
|
import { clearRuntimeBinding, getRuntimeAccessToken, getRuntimeBindingPublicState, getRuntimePairingCode, hasRuntimeBinding, saveRuntimeBinding, validateRuntimeBindingToken, validateRuntimePairingCode, } from "../services/runtime-binding.js";
|
|
5
5
|
import { createLogger } from "../utils/logger.js";
|
|
6
6
|
const log = createLogger("runtime-binding-route");
|
|
@@ -133,41 +133,6 @@ runtimeBindingRouter.post("/binding/claim-agent", (req, res) => {
|
|
|
133
133
|
remainingQueueSize: getMcpLaunchQueueSize(workspacePath),
|
|
134
134
|
});
|
|
135
135
|
});
|
|
136
|
-
/**
|
|
137
|
-
* MCP node 在 401 后向 bridge 查询最新 session token 的端点。
|
|
138
|
-
* 仅接受本地回环请求,仅返回缓存中最新的 token。
|
|
139
|
-
*/
|
|
140
|
-
runtimeBindingRouter.post("/binding/refresh-token", (req, res) => {
|
|
141
|
-
if (!isLoopbackRequest(req)) {
|
|
142
|
-
res.status(403).json({ ok: false, error: "loopback request required" });
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
const { agentId, currentToken } = req.body || {};
|
|
146
|
-
const normalizedAgentId = String(agentId || "").trim();
|
|
147
|
-
if (!normalizedAgentId) {
|
|
148
|
-
res.status(400).json({ ok: false, error: "agentId is required" });
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
const latest = getLatestAgentToken(normalizedAgentId);
|
|
152
|
-
if (!latest) {
|
|
153
|
-
res.status(404).json({ ok: false, error: "no cached token for agent" });
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
// 如果最新 token 与当前 token 相同,说明服务端已撤销,bridge 侧没有更新的
|
|
157
|
-
const normalizedCurrent = String(currentToken || "").trim();
|
|
158
|
-
if (normalizedCurrent && latest.runtimeAccessToken === normalizedCurrent) {
|
|
159
|
-
res.status(409).json({
|
|
160
|
-
ok: false,
|
|
161
|
-
error: "token_unchanged",
|
|
162
|
-
message: "Bridge cached token is the same as current; token may be revoked server-side",
|
|
163
|
-
});
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
res.json({
|
|
167
|
-
ok: true,
|
|
168
|
-
runtimeAccessToken: latest.runtimeAccessToken,
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
136
|
runtimeBindingRouter.post("/binding/issue", validateToken, (req, res) => {
|
|
172
137
|
const { accessToken, instanceId, userId, schedulerBaseUrl } = req.body || {};
|
|
173
138
|
const nextToken = String(accessToken || "").trim();
|
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { TextDecoder } from "node:util";
|
|
8
8
|
import { type AdapterSessionConfig, type ProviderEvent, type RuntimeStatusActionInfo } from "../adapter/index.js";
|
|
9
|
-
import { type RuntimeOutputMetadata } from "../services/session-output.js";
|
|
10
9
|
import type { PersistedSession } from "../types.js";
|
|
11
10
|
export declare const terminalRouter: import("express-serve-static-core").Router;
|
|
12
11
|
export interface SdkSessionEntry {
|
|
@@ -92,7 +91,6 @@ export declare function buildClaudeCodeLaunchConfig(savedClaudeConfig: {
|
|
|
92
91
|
*/
|
|
93
92
|
export declare function buildToolResultTimelineActionInfo(event: ProviderEvent): RuntimeStatusActionInfo | undefined;
|
|
94
93
|
export declare function formatSdkOutputEvent(event: ProviderEvent): string | undefined;
|
|
95
|
-
export declare function buildSdkOutputMetadata(event: ProviderEvent): RuntimeOutputMetadata;
|
|
96
94
|
/**
|
|
97
95
|
* 主干流程:把 provider 事件转换为面板运行状态。
|
|
98
96
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAKxC,OAAO,EAOL,KAAK,oBAAoB,EAEzB,KAAK,aAAa,EAClB,KAAK,uBAAuB,
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/terminal.js
CHANGED
|
@@ -573,111 +573,6 @@ export function formatSdkOutputEvent(event) {
|
|
|
573
573
|
}
|
|
574
574
|
return undefined;
|
|
575
575
|
}
|
|
576
|
-
export function buildSdkOutputMetadata(event) {
|
|
577
|
-
const logMessage = formatSdkLogMessage(event);
|
|
578
|
-
return {
|
|
579
|
-
sourceEventType: event.type,
|
|
580
|
-
logCategory: "acode",
|
|
581
|
-
...(logMessage
|
|
582
|
-
? {
|
|
583
|
-
logLevel: event.type === "error" ? "error" : "info",
|
|
584
|
-
logMessage,
|
|
585
|
-
}
|
|
586
|
-
: {}),
|
|
587
|
-
};
|
|
588
|
-
}
|
|
589
|
-
function formatSdkLogMessage(event) {
|
|
590
|
-
if (event.type === "ai_request") {
|
|
591
|
-
const model = event.data.model || "unknown-model";
|
|
592
|
-
const endpoint = event.data.endpoint ? ` @ ${event.data.endpoint}` : "";
|
|
593
|
-
const toolCount = typeof event.data.toolCount === "number"
|
|
594
|
-
? `, tools=${event.data.toolCount}`
|
|
595
|
-
: "";
|
|
596
|
-
return `AI request started: ${model}${endpoint}${toolCount}`;
|
|
597
|
-
}
|
|
598
|
-
if (event.type === "tool_use_start") {
|
|
599
|
-
return formatSdkToolLogMessage(event, "开始");
|
|
600
|
-
}
|
|
601
|
-
if (event.type === "tool_use_end") {
|
|
602
|
-
return formatSdkToolLogMessage(event, "完成");
|
|
603
|
-
}
|
|
604
|
-
if (event.type === "turn_complete") {
|
|
605
|
-
const finishReason = event.data.finishReason
|
|
606
|
-
? `, finish=${event.data.finishReason}`
|
|
607
|
-
: "";
|
|
608
|
-
return `Turn completed${finishReason}`;
|
|
609
|
-
}
|
|
610
|
-
if (event.type === "session_complete") {
|
|
611
|
-
return `Session completed: exitCode=${event.data.exitCode ?? 0}`;
|
|
612
|
-
}
|
|
613
|
-
if (event.type === "error") {
|
|
614
|
-
return event.data.text || "ACode runtime error";
|
|
615
|
-
}
|
|
616
|
-
return undefined;
|
|
617
|
-
}
|
|
618
|
-
function formatSdkToolLogMessage(event, phaseLabel) {
|
|
619
|
-
const actionInfo = getToolActionInfo(event.data.toolName, event.data.toolInput);
|
|
620
|
-
const actionLabel = event.data.actionLabel || actionInfo.actionLabel || "调用工具";
|
|
621
|
-
const detail = resolveSdkToolLogDetail(event, actionInfo);
|
|
622
|
-
return detail
|
|
623
|
-
? `${phaseLabel}${actionLabel}: ${detail}`
|
|
624
|
-
: `${phaseLabel}${actionLabel}: ${event.data.actionDetail || event.data.toolName || "tool"}`;
|
|
625
|
-
}
|
|
626
|
-
function resolveSdkToolLogDetail(event, actionInfo) {
|
|
627
|
-
const input = event.data.toolInput;
|
|
628
|
-
if (actionInfo.actionType === "bash") {
|
|
629
|
-
return getCommandDisplayDetail(input) || event.data.actionDetail || actionInfo.actionDetail;
|
|
630
|
-
}
|
|
631
|
-
if (actionInfo.actionType === "read_file" ||
|
|
632
|
-
actionInfo.actionType === "edit_file" ||
|
|
633
|
-
actionInfo.actionType === "write_file") {
|
|
634
|
-
return getFileDisplayDetail(input) || event.data.actionDetail || actionInfo.actionDetail;
|
|
635
|
-
}
|
|
636
|
-
return event.data.actionDetail || actionInfo.actionDetail;
|
|
637
|
-
}
|
|
638
|
-
function getCommandDisplayDetail(input) {
|
|
639
|
-
const command = firstDisplayString(input?.command, input?.cmd);
|
|
640
|
-
if (command)
|
|
641
|
-
return command;
|
|
642
|
-
if (Array.isArray(input?.argv)) {
|
|
643
|
-
const argv = input.argv
|
|
644
|
-
.map((item) => String(item ?? "").trim())
|
|
645
|
-
.filter(Boolean)
|
|
646
|
-
.join(" ");
|
|
647
|
-
return argv ? redactTransientClipboardPastePaths(argv) : undefined;
|
|
648
|
-
}
|
|
649
|
-
return firstDisplayString(input?.args);
|
|
650
|
-
}
|
|
651
|
-
function getFileDisplayDetail(input) {
|
|
652
|
-
const paths = displayStringList(input?.paths);
|
|
653
|
-
if (paths.length > 0) {
|
|
654
|
-
return paths.length === 1
|
|
655
|
-
? paths[0]
|
|
656
|
-
: `${paths.length}个文件: ${paths.join(", ")}`;
|
|
657
|
-
}
|
|
658
|
-
return firstDisplayString(input?.file_path, input?.filePath, input?.path, input?.target_file, input?.targetFile);
|
|
659
|
-
}
|
|
660
|
-
function firstDisplayString(...values) {
|
|
661
|
-
for (const value of values) {
|
|
662
|
-
if (typeof value === "string" && value.trim()) {
|
|
663
|
-
return redactTransientClipboardPastePaths(value.trim());
|
|
664
|
-
}
|
|
665
|
-
if (Array.isArray(value)) {
|
|
666
|
-
const first = displayStringList(value)[0];
|
|
667
|
-
if (first)
|
|
668
|
-
return first;
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
return undefined;
|
|
672
|
-
}
|
|
673
|
-
function displayStringList(value) {
|
|
674
|
-
if (!Array.isArray(value))
|
|
675
|
-
return [];
|
|
676
|
-
return value
|
|
677
|
-
.map((item) => (typeof item === "string" ? item.trim() : ""))
|
|
678
|
-
.filter(Boolean)
|
|
679
|
-
.map((item) => redactTransientClipboardPastePaths(item));
|
|
680
|
-
}
|
|
681
576
|
function formatAiRequestDetail(data) {
|
|
682
577
|
const lines = [
|
|
683
578
|
data.model ? `模型: ${data.model}` : undefined,
|
|
@@ -722,7 +617,6 @@ export function resolveRuntimeStatusFromProviderEvent(event) {
|
|
|
722
617
|
}
|
|
723
618
|
if (event.type === "tool_use_start") {
|
|
724
619
|
const inferredAction = getToolActionInfo(event.data.toolName, event.data.toolInput);
|
|
725
|
-
const actionDetail = resolveSdkToolLogDetail(event, inferredAction);
|
|
726
620
|
if (event.data.actionType === "idle" ||
|
|
727
621
|
inferredAction.actionType === "idle") {
|
|
728
622
|
return {
|
|
@@ -730,7 +624,9 @@ export function resolveRuntimeStatusFromProviderEvent(event) {
|
|
|
730
624
|
actionInfo: {
|
|
731
625
|
actionType: event.data.actionType || inferredAction.actionType,
|
|
732
626
|
actionLabel: event.data.actionLabel || inferredAction.actionLabel,
|
|
733
|
-
actionDetail:
|
|
627
|
+
actionDetail: event.data.actionDetail ||
|
|
628
|
+
inferredAction.actionDetail ||
|
|
629
|
+
event.data.toolName,
|
|
734
630
|
actionId: event.data.actionId || event.data.toolUseId,
|
|
735
631
|
},
|
|
736
632
|
};
|
|
@@ -740,7 +636,9 @@ export function resolveRuntimeStatusFromProviderEvent(event) {
|
|
|
740
636
|
actionInfo: {
|
|
741
637
|
actionType: event.data.actionType || inferredAction.actionType,
|
|
742
638
|
actionLabel: event.data.actionLabel || inferredAction.actionLabel,
|
|
743
|
-
actionDetail:
|
|
639
|
+
actionDetail: event.data.actionDetail ||
|
|
640
|
+
inferredAction.actionDetail ||
|
|
641
|
+
event.data.toolName,
|
|
744
642
|
actionId: event.data.actionId || event.data.toolUseId,
|
|
745
643
|
},
|
|
746
644
|
};
|
|
@@ -772,7 +670,7 @@ function forwardSdkOutputEvent(event, entry) {
|
|
|
772
670
|
return;
|
|
773
671
|
}
|
|
774
672
|
entry.seq += 1;
|
|
775
|
-
void sendOutput(entry.agentId, output, event.sessionId, entry.seq,
|
|
673
|
+
void sendOutput(entry.agentId, output, event.sessionId, entry.seq, { sourceEventType: event.type }, { runtimeAccessToken: entry.runtimeAccessToken });
|
|
776
674
|
}
|
|
777
675
|
export function resolveSdkProviderId(command) {
|
|
778
676
|
return resolveSdkProviderIdByCommand(command);
|