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.
Files changed (40) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
  2. package/dist/adapter/AcodeSdkAdapter.js +6 -98
  3. package/dist/adapter/AcodeSdkAdapter.test.js +2 -313
  4. package/dist/adapter/OpencodeSdkAdapter.js +1 -1
  5. package/dist/adapter/types.d.ts.map +1 -1
  6. package/dist/adapter/types.js +3 -7
  7. package/dist/config.d.ts +3 -2
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +13 -36
  10. package/dist/config.test.js +20 -24
  11. package/dist/routes/ai-sources.js +1 -5
  12. package/dist/routes/ai-sources.test.js +0 -21
  13. package/dist/routes/instance.test.js +70 -1
  14. package/dist/routes/runtime-binding.d.ts.map +1 -1
  15. package/dist/routes/runtime-binding.js +1 -36
  16. package/dist/routes/terminal.d.ts +0 -2
  17. package/dist/routes/terminal.d.ts.map +1 -1
  18. package/dist/routes/terminal.js +7 -109
  19. package/dist/routes/terminal.test.js +1 -118
  20. package/dist/services/mcp-launch-binding-queue.d.ts +0 -7
  21. package/dist/services/mcp-launch-binding-queue.d.ts.map +1 -1
  22. package/dist/services/mcp-launch-binding-queue.js +0 -25
  23. package/dist/services/session-output.d.ts +3 -7
  24. package/dist/services/session-output.d.ts.map +1 -1
  25. package/package/acode/dist/runtime.d.ts +0 -1
  26. package/package/acode/dist/runtime.d.ts.map +1 -1
  27. package/package/acode/dist/runtime.js +31 -265
  28. package/package/acode/dist/types.d.ts +1 -1
  29. package/package/acode/dist/types.d.ts.map +1 -1
  30. package/package/aws-client-agent-mcp/dist/config.d.ts +0 -4
  31. package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -1
  32. package/package/aws-client-agent-mcp/dist/config.js +0 -15
  33. package/package/aws-client-agent-mcp/dist/config.js.map +1 -1
  34. package/package/aws-client-agent-mcp/dist/http-client.d.ts +0 -10
  35. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
  36. package/package/aws-client-agent-mcp/dist/http-client.js +1 -79
  37. package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
  38. package/package/aws-client-agent-mcp/dist/http-client.test.js +265 -129
  39. package/package/aws-client-agent-mcp/dist/http-client.test.js.map +1 -1
  40. 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 = "request" | "env" | "single-auto-register-target" | "default" | "ambiguous-auto-register-targets";
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
- * 主流程:服务端请求携带的 scheduler 地址优先;再读显式环境变量;最后回退到单个自动注册目标或默认值。
23
+ * 主流程:bridge 本机显式配置优先;未配置时,单个自动注册目标可作为宿主机部署的零额外配置回退;
24
+ * 服务端请求携带的 scheduler 地址仅作为本机无配置时的兜底,避免 Docker 容器内地址覆盖机器实例配置。
24
25
  */
25
26
  export declare function resolveSchedulerBaseUrlFrom(requestSchedulerBaseUrl: unknown): SchedulerBaseUrlResolution;
26
27
  /** 调度器基础 URL(兼容旧导入;请求处理应优先调用 resolveSchedulerBaseUrl 获取最新值) */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
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
- * 主流程:服务端请求携带的 scheduler 地址优先;再读显式环境变量;最后回退到单个自动注册目标或默认值。
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
- if (singleAutoRegisterTargetUrl) {
95
+ const autoRegisterTargetUrls = readAutoRegisterTargetUrls();
96
+ if (autoRegisterTargetUrls.length === 1) {
128
97
  return {
129
- url: singleAutoRegisterTargetUrl || DEFAULT_SCHEDULER_BASE_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,
@@ -42,52 +42,48 @@ afterEach(() => {
42
42
  }
43
43
  });
44
44
  describe("scheduler base URL resolution", () => {
45
- it("keeps scheduler URL supplied by the server request as the highest priority", async () => {
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://server.local:7380",
53
- source: "request",
52
+ url: "http://env.local:7380",
53
+ source: "env",
54
54
  ambiguousTargetUrls: [],
55
55
  });
56
56
  });
57
- it("keeps explicit AWS_RUNTIME_SCHEDULER_BASE_URL as the highest priority", async () => {
57
+ it("keeps a single auto-register target before the server request URL", async () => {
58
58
  const runtimeHome = createRuntimeHome();
59
59
  useRuntimeHome(runtimeHome);
60
- process.env.AWS_RUNTIME_SCHEDULER_BASE_URL =
61
- "http://explicit.local:7380/path";
62
- writeBridgeConfig(runtimeHome, [{ serverUrl: "http://target.local:7380" }]);
63
- const { resolveSchedulerBaseUrl } = await import("./config.js");
64
- expect(resolveSchedulerBaseUrl()).toEqual({
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("ignores a server-supplied loopback URL when bridge has an explicit external scheduler URL", async () => {
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://127.0.0.1:7380/api")).toEqual({
76
- url: "http://101.42.200.84:7380",
77
- source: "env",
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("uses a single external auto-register target instead of a server-supplied loopback URL", async () => {
78
+ it("keeps explicit AWS_RUNTIME_SCHEDULER_BASE_URL as the highest priority", async () => {
82
79
  const runtimeHome = createRuntimeHome();
83
80
  useRuntimeHome(runtimeHome);
84
- writeBridgeConfig(runtimeHome, [
85
- { serverUrl: "http://101.42.200.84:7380" },
86
- ]);
87
- const { resolveSchedulerBaseUrlFrom } = await import("./config.js");
88
- expect(resolveSchedulerBaseUrlFrom("http://127.0.0.1:7380/api")).toEqual({
89
- url: "http://101.42.200.84:7380",
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, acodeModelEffort, claudecodeModelEffort, codexModelEffort, opencodeModelEffort, acode, claudecode, codex, opencode, } = req.body || {};
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('uses scheduler base URL supplied by server ping request before local bridge config', async () => {
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;AAgPD,wBAAgB,6BAA6B,IAAI,IAAI,CAapD"}
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, getLatestAgentToken, getMcpLaunchQueueSize } from "../services/mcp-launch-binding-queue.js";
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":"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"}
1
+ {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.ts"],"names":[],"mappings":"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"}
@@ -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: actionDetail || event.data.actionDetail || inferredAction.actionDetail || event.data.toolName,
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: actionDetail || event.data.actionDetail || inferredAction.actionDetail || event.data.toolName,
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, buildSdkOutputMetadata(event), { runtimeAccessToken: entry.runtimeAccessToken });
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);