aws-runtime-bridge 1.8.5 → 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.d.ts.map +1 -1
- package/dist/routes/instance.js +14 -31
- package/dist/routes/instance.test.js +224 -215
- 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
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/routes/instance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/routes/instance.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAqBrD,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAC/D,IAAI,CAEN;AAED,eAAO,MAAM,cAAc,4CAAW,CAAC;AAsJvC,wBAAgB,4BAA4B,CAAC,gBAAgB,EAAE,MAAM,GAAG;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QACJ,EAAE,EAAE,OAAO,CAAC;QACZ,aAAa,CAAC,EAAE,SAAS,CAAC;QAC1B,oBAAoB,EAAE,OAAO,CAAC;QAC9B,qBAAqB,EAAE,OAAO,CAAC;QAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAqCA;AAED,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,gBAAgB,CAAC;IAC/B,aAAa,EAAE,SAAS,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,iCAAiC;IACzC,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,8BAA8B,CAAC;IACtC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,aAAa,EAAE,SAAS,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,KAAK,EACZ,0BAA0B,EAAE,MAAM,GACjC,4BAA4B,CAiB9B;AAoDD;;;GAGG;AACH,wBAAgB,sCAAsC,CACpD,UAAU,EAAE,MAAM,EAAE,GACnB,iCAAiC,CAUnC;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAQhF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,MAAM,EAAE,EACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAC5C,MAAM,CAaR;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAC5C,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,OAAO,CAAC,CAAC,CAY3F"}
|
package/dist/routes/instance.js
CHANGED
|
@@ -4,21 +4,16 @@ import { spawn } from "node:child_process";
|
|
|
4
4
|
import { createHash, timingSafeEqual } from "node:crypto";
|
|
5
5
|
import { resolveSchedulerBaseUrlFrom } from "../config.js";
|
|
6
6
|
import { validateToken } from "../middleware/auth.js";
|
|
7
|
-
import { getConfiguredConnectionKeys, requestRuntimeAccessTokenRefreshForServer
|
|
8
|
-
import { discoverCcSwitchConfiguredItems, loadCcSwitchSdk
|
|
9
|
-
import { initInstance, syncLegacyStateFromSdk
|
|
7
|
+
import { getConfiguredConnectionKeys, requestRuntimeAccessTokenRefreshForServer } from "../services/auto-register.js";
|
|
8
|
+
import { discoverCcSwitchConfiguredItems, loadCcSwitchSdk } from "../services/cc-switch-sdk.js";
|
|
9
|
+
import { initInstance, syncLegacyStateFromSdk } from "../services/instance-init-service.js";
|
|
10
10
|
import { createBridgeLifecycleOperation, deliverPendingBridgeLifecycleNotifications, upsertBridgeLifecycleOperation, } from "../services/lifecycle-state.js";
|
|
11
11
|
import { loadInstanceState, saveInstanceState, } from "../services/instance-state.js";
|
|
12
12
|
import { getRuntimeAccessToken } from "../services/runtime-binding.js";
|
|
13
13
|
import { detectToolStatuses, ensureToolsInstalled, SUPPORTED_INSTALLABLE_TOOLS, SUPPORTED_UNINSTALLABLE_TOOLS, uninstallTools, } from "../services/tool-installer.js";
|
|
14
14
|
import { createLogger } from "../utils/logger.js";
|
|
15
15
|
const log = createLogger("instance");
|
|
16
|
-
const PANEL_TOOL_STATUS_KEYS = [
|
|
17
|
-
"acode",
|
|
18
|
-
"claude",
|
|
19
|
-
"opencode",
|
|
20
|
-
"codex",
|
|
21
|
-
];
|
|
16
|
+
const PANEL_TOOL_STATUS_KEYS = ["acode", "claude", "opencode", "codex"];
|
|
22
17
|
// ★★★ 导出 gracefulShutdown 的触发函数
|
|
23
18
|
// 用于 aws-mcp-server 通知 bridge 保留会话状态关闭
|
|
24
19
|
let gracefulShutdownFn = null;
|
|
@@ -254,9 +249,7 @@ export function buildAmbiguousSchedulerBaseUrlResponse(targetUrls) {
|
|
|
254
249
|
*/
|
|
255
250
|
export function buildToolStatusDetectionTargets(enabledTools) {
|
|
256
251
|
return Array.from(new Set([...enabledTools, ...PANEL_TOOL_STATUS_KEYS]
|
|
257
|
-
.map((tool) => String(tool || "")
|
|
258
|
-
.trim()
|
|
259
|
-
.toLowerCase())
|
|
252
|
+
.map((tool) => String(tool || "").trim().toLowerCase())
|
|
260
253
|
.filter(Boolean)));
|
|
261
254
|
}
|
|
262
255
|
/**
|
|
@@ -307,25 +300,17 @@ instanceRouter.get("/ping", validateToken, async (req, res) => {
|
|
|
307
300
|
}
|
|
308
301
|
const schedulerBaseUrl = schedulerBaseUrlResolution.url;
|
|
309
302
|
try {
|
|
310
|
-
|
|
311
|
-
let tokenRefreshed = false;
|
|
303
|
+
const runtimeAccessToken = getRuntimeAccessToken(undefined, schedulerBaseUrl);
|
|
312
304
|
if (!runtimeAccessToken) {
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
res
|
|
316
|
-
.status(401)
|
|
317
|
-
.json({ ok: false, error: "runtime_access_token_required" });
|
|
318
|
-
return;
|
|
319
|
-
}
|
|
320
|
-
runtimeAccessToken = refreshResult.runtimeAccessToken;
|
|
321
|
-
tokenRefreshed = true;
|
|
305
|
+
res.status(401).json({ ok: false, error: "runtime_access_token_required" });
|
|
306
|
+
return;
|
|
322
307
|
}
|
|
323
308
|
const schedulerPing = await pingSchedulerWithToken(schedulerBaseUrl, runtimeAccessToken);
|
|
324
309
|
res.json({
|
|
325
310
|
ok: true,
|
|
326
311
|
runtimeBridge: "healthy",
|
|
327
312
|
schedulerReachable: schedulerPing.schedulerReachable,
|
|
328
|
-
tokenRefreshed:
|
|
313
|
+
tokenRefreshed: schedulerPing.tokenRefreshed,
|
|
329
314
|
schedulerBaseUrl,
|
|
330
315
|
});
|
|
331
316
|
}
|
|
@@ -386,9 +371,7 @@ instanceRouter.post("/cc-switch/state", validateToken, async (req, res) => {
|
|
|
386
371
|
return;
|
|
387
372
|
}
|
|
388
373
|
try {
|
|
389
|
-
log.info("[cc-switch/state] Request received", {
|
|
390
|
-
agentId: String(agentId),
|
|
391
|
-
});
|
|
374
|
+
log.info("[cc-switch/state] Request received", { agentId: String(agentId) });
|
|
392
375
|
const sdk = await loadCcSwitchSdk(agentId);
|
|
393
376
|
const imported = await discoverCcSwitchConfiguredItems(sdk);
|
|
394
377
|
const synced = await syncLegacyStateFromSdk(agentId, sdk);
|
|
@@ -455,7 +438,9 @@ instanceRouter.post("/cc-switch/install-tools", validateToken, async (req, res)
|
|
|
455
438
|
agentId: String(agentId),
|
|
456
439
|
requestedTools,
|
|
457
440
|
});
|
|
458
|
-
res
|
|
441
|
+
res
|
|
442
|
+
.status(400)
|
|
443
|
+
.json({
|
|
459
444
|
error: `tools must include ${SUPPORTED_INSTALLABLE_TOOLS.join(", ")}`,
|
|
460
445
|
});
|
|
461
446
|
return;
|
|
@@ -548,9 +533,7 @@ instanceRouter.post("/cc-switch/uninstall-tools", validateToken, async (req, res
|
|
|
548
533
|
try {
|
|
549
534
|
const state = await loadInstanceState(agentId);
|
|
550
535
|
const uninstallableToolSet = new Set(uninstallableTools);
|
|
551
|
-
const enabledTools = (state.enabledTools || []).filter((tool) => !uninstallableToolSet.has(String(tool || "")
|
|
552
|
-
.trim()
|
|
553
|
-
.toLowerCase()));
|
|
536
|
+
const enabledTools = (state.enabledTools || []).filter((tool) => !uninstallableToolSet.has(String(tool || "").trim().toLowerCase()));
|
|
554
537
|
const uninstalledToolStatus = await uninstallTools(uninstallableTools);
|
|
555
538
|
const refreshedToolStatus = await detectToolStatuses([
|
|
556
539
|
...enabledTools,
|