aws-runtime-bridge 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/adapter.test.js +4 -4
- package/dist/adapter/types.d.ts.map +1 -1
- package/dist/adapter/types.js +0 -7
- package/dist/adapter/types.test.js +5 -53
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -2
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +4 -0
- package/dist/routes/instance.d.ts.map +1 -1
- package/dist/routes/instance.js +88 -34
- package/dist/routes/runtime-binding.d.ts.map +1 -1
- package/dist/routes/runtime-binding.js +59 -2
- package/dist/routes/sessions.js +1 -1
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +48 -14
- package/dist/routes/terminal.test.js +6 -2
- package/dist/services/agent-process-manager.js +4 -4
- package/dist/services/auto-register.d.ts +12 -1
- package/dist/services/auto-register.d.ts.map +1 -1
- package/dist/services/auto-register.js +206 -42
- package/dist/services/aws-client-agent-mcp.test.js +3 -0
- package/dist/services/mcp-launch-binding-queue.d.ts +36 -0
- package/dist/services/mcp-launch-binding-queue.d.ts.map +1 -0
- package/dist/services/mcp-launch-binding-queue.js +92 -0
- package/dist/services/mcp-launch-binding-queue.test.d.ts +2 -0
- package/dist/services/mcp-launch-binding-queue.test.d.ts.map +1 -0
- package/dist/services/mcp-launch-binding-queue.test.js +107 -0
- package/dist/services/orphan-monitor.js +1 -1
- package/dist/services/process-detector.d.ts +1 -1
- package/dist/services/process-detector.d.ts.map +1 -1
- package/dist/services/process-detector.js +2 -11
- package/dist/services/process-registry.d.ts +1 -0
- package/dist/services/process-registry.d.ts.map +1 -1
- package/dist/services/process-registry.js +129 -108
- package/dist/services/runtime-binding.d.ts +11 -1
- package/dist/services/runtime-binding.d.ts.map +1 -1
- package/dist/services/runtime-binding.js +130 -4
- package/dist/services/terminal-persistence.d.ts.map +1 -1
- package/dist/services/terminal-persistence.js +47 -37
- package/dist/services/terminal-persistence.test.js +47 -1
- package/dist/utils/file-utils.d.ts +3 -0
- package/dist/utils/file-utils.d.ts.map +1 -1
- package/dist/utils/file-utils.js +32 -0
- package/package/aws-client-agent-mcp/README.md +288 -288
- package/package.json +76 -76
- package/dist/routes/aws-mcp.d.ts +0 -10
- package/dist/routes/aws-mcp.d.ts.map +0 -1
- package/dist/routes/aws-mcp.js +0 -74
- package/dist/routes/aws-mcp.test.d.ts +0 -2
- package/dist/routes/aws-mcp.test.d.ts.map +0 -1
- package/dist/routes/aws-mcp.test.js +0 -42
- package/dist/routes/memory.d.ts +0 -13
- package/dist/routes/memory.d.ts.map +0 -1
- package/dist/routes/memory.js +0 -429
- package/dist/services/aws-mcp-http.d.ts +0 -11
- package/dist/services/aws-mcp-http.d.ts.map +0 -1
- package/dist/services/aws-mcp-http.js +0 -225
- package/dist/services/aws-mcp-http.test.d.ts +0 -2
- package/dist/services/aws-mcp-http.test.d.ts.map +0 -1
- package/dist/services/aws-mcp-http.test.js +0 -27
- package/dist/services/easytier-manager.d.ts +0 -106
- package/dist/services/easytier-manager.d.ts.map +0 -1
- package/dist/services/easytier-manager.js +0 -331
- package/dist/services/easytier-manager.test.d.ts +0 -5
- package/dist/services/easytier-manager.test.d.ts.map +0 -1
- package/dist/services/easytier-manager.test.js +0 -98
- package/dist/services/memory-service.d.ts +0 -195
- package/dist/services/memory-service.d.ts.map +0 -1
- package/dist/services/memory-service.js +0 -650
- package/dist/services/session-lookup.d.ts +0 -20
- package/dist/services/session-lookup.d.ts.map +0 -1
- package/dist/services/session-lookup.js +0 -43
- package/dist/services/user-api-key-service.d.ts +0 -28
- package/dist/services/user-api-key-service.d.ts.map +0 -1
- package/dist/services/user-api-key-service.js +0 -75
- package/node_modules/@cc-switch/sdk/dist/adapters/common.d.ts +0 -38
- package/node_modules/@cc-switch/sdk/dist/adapters/common.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/common.js +0 -47
- package/node_modules/@cc-switch/sdk/dist/adapters/index.d.ts +0 -5
- package/node_modules/@cc-switch/sdk/dist/adapters/index.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/index.js +0 -28
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claude.d.ts +0 -10
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claude.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claude.js +0 -39
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claudecode.d.ts +0 -10
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claudecode.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claudecode.js +0 -40
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.d.ts +0 -18
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.js +0 -63
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.test.d.ts +0 -2
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.test.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.test.js +0 -86
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-placeholder.d.ts +0 -9
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-placeholder.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-placeholder.js +0 -14
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-claude.d.ts +0 -10
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-claude.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-claude.js +0 -51
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-claudecode.d.ts +0 -10
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-claudecode.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-claudecode.js +0 -51
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-opencode.d.ts +0 -10
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-opencode.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-opencode.js +0 -51
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-placeholder.d.ts +0 -9
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-placeholder.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-placeholder.js +0 -14
- package/node_modules/@cc-switch/sdk/dist/services/instance-service.d.ts +0 -78
- package/node_modules/@cc-switch/sdk/dist/services/instance-service.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/instance-service.js +0 -180
- package/package/cc-switch-sdk/dist/adapters/common.d.ts +0 -38
- package/package/cc-switch-sdk/dist/adapters/common.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/common.js +0 -47
- package/package/cc-switch-sdk/dist/adapters/index.d.ts +0 -5
- package/package/cc-switch-sdk/dist/adapters/index.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/index.js +0 -28
- package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts +0 -10
- package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/mcp-claude.js +0 -39
- package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts +0 -10
- package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.js +0 -40
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts +0 -18
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.js +0 -63
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts +0 -2
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.js +0 -86
- package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts +0 -9
- package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.js +0 -14
- package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts +0 -10
- package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/skill-claude.js +0 -51
- package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts +0 -10
- package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/skill-claudecode.js +0 -51
- package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts +0 -10
- package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/skill-opencode.js +0 -51
- package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts +0 -9
- package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/skill-placeholder.js +0 -14
- package/package/cc-switch-sdk/dist/services/instance-service.d.ts +0 -78
- package/package/cc-switch-sdk/dist/services/instance-service.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/instance-service.js +0 -180
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface McpLaunchBindingInput {
|
|
2
|
+
agentId: string;
|
|
3
|
+
workspacePath: string;
|
|
4
|
+
serverUrl?: string;
|
|
5
|
+
mcpHttpUrl?: string;
|
|
6
|
+
runtimeAccessToken?: string;
|
|
7
|
+
userId?: string;
|
|
8
|
+
schedulerBaseUrl?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface McpLaunchBinding {
|
|
11
|
+
id: string;
|
|
12
|
+
agentId: string;
|
|
13
|
+
workspacePath: string;
|
|
14
|
+
serverUrl: string;
|
|
15
|
+
mcpHttpUrl: string;
|
|
16
|
+
runtimeAccessToken?: string;
|
|
17
|
+
userId?: string;
|
|
18
|
+
schedulerBaseUrl?: string;
|
|
19
|
+
enqueuedAt: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ClaimedMcpLaunchBinding extends McpLaunchBinding {
|
|
22
|
+
runtimeAccessToken?: string;
|
|
23
|
+
userId?: string;
|
|
24
|
+
schedulerBaseUrl?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface McpLaunchBindingClaimRequest {
|
|
27
|
+
agentId: unknown;
|
|
28
|
+
bindingId?: unknown;
|
|
29
|
+
workspacePath: unknown;
|
|
30
|
+
serverUrl?: unknown;
|
|
31
|
+
}
|
|
32
|
+
export declare function enqueueMcpLaunchBinding(input: McpLaunchBindingInput): McpLaunchBinding | null;
|
|
33
|
+
export declare function claimMcpLaunchBinding(request: McpLaunchBindingClaimRequest): ClaimedMcpLaunchBinding | null;
|
|
34
|
+
export declare function getMcpLaunchQueueSize(workspacePath: unknown): number;
|
|
35
|
+
export declare function clearMcpLaunchBindingQueues(): void;
|
|
36
|
+
//# sourceMappingURL=mcp-launch-binding-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-launch-binding-queue.d.ts","sourceRoot":"","sources":["../../src/services/mcp-launch-binding-queue.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAqCD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,qBAAqB,GAAG,gBAAgB,GAAG,IAAI,CAoB7F;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,uBAAuB,GAAG,IAAI,CAoC3G;AAED,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,OAAO,GAAG,MAAM,CAMpE;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAElD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { getRuntimeAccessToken, loadRuntimeBinding } from "./runtime-binding.js";
|
|
3
|
+
const launchBindings = [];
|
|
4
|
+
function normalizeWorkspacePath(workspacePath) {
|
|
5
|
+
const raw = String(workspacePath || "").trim();
|
|
6
|
+
if (!raw) {
|
|
7
|
+
return "";
|
|
8
|
+
}
|
|
9
|
+
return path.resolve(raw).toLowerCase();
|
|
10
|
+
}
|
|
11
|
+
function normalizeOptionalUrl(value) {
|
|
12
|
+
return String(value || "").trim();
|
|
13
|
+
}
|
|
14
|
+
function normalizeServerUrl(serverUrl) {
|
|
15
|
+
const raw = String(serverUrl || "").trim();
|
|
16
|
+
if (!raw) {
|
|
17
|
+
return "";
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const url = new URL(raw);
|
|
21
|
+
url.protocol = url.protocol.toLowerCase();
|
|
22
|
+
url.hostname = url.hostname.toLowerCase();
|
|
23
|
+
url.pathname = url.pathname.replace(/\/+$/, "");
|
|
24
|
+
return url.toString().replace(/\/+$/, "");
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return raw.replace(/\/+$/, "").toLowerCase();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function createBindingId(agentId) {
|
|
31
|
+
return `${agentId}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
|
|
32
|
+
}
|
|
33
|
+
export function enqueueMcpLaunchBinding(input) {
|
|
34
|
+
const agentId = String(input.agentId || "").trim();
|
|
35
|
+
const workspaceKey = normalizeWorkspacePath(input.workspacePath);
|
|
36
|
+
if (!agentId || !workspaceKey) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const binding = {
|
|
40
|
+
id: createBindingId(agentId),
|
|
41
|
+
agentId,
|
|
42
|
+
workspacePath: path.resolve(String(input.workspacePath)),
|
|
43
|
+
serverUrl: normalizeOptionalUrl(input.serverUrl || input.schedulerBaseUrl),
|
|
44
|
+
mcpHttpUrl: normalizeOptionalUrl(input.mcpHttpUrl),
|
|
45
|
+
runtimeAccessToken: normalizeOptionalUrl(input.runtimeAccessToken),
|
|
46
|
+
userId: normalizeOptionalUrl(input.userId),
|
|
47
|
+
schedulerBaseUrl: normalizeOptionalUrl(input.schedulerBaseUrl),
|
|
48
|
+
enqueuedAt: new Date().toISOString(),
|
|
49
|
+
};
|
|
50
|
+
launchBindings.push(binding);
|
|
51
|
+
return binding;
|
|
52
|
+
}
|
|
53
|
+
export function claimMcpLaunchBinding(request) {
|
|
54
|
+
const agentId = String(request.agentId || "").trim();
|
|
55
|
+
const bindingId = String(request.bindingId || "").trim();
|
|
56
|
+
const workspaceKey = normalizeWorkspacePath(request.workspacePath);
|
|
57
|
+
const serverKey = normalizeServerUrl(request.serverUrl);
|
|
58
|
+
if (!agentId || !bindingId || !workspaceKey || !serverKey) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
const bindingIndex = launchBindings.findIndex((binding) => binding.agentId === agentId &&
|
|
62
|
+
binding.id === bindingId &&
|
|
63
|
+
normalizeWorkspacePath(binding.workspacePath) === workspaceKey &&
|
|
64
|
+
normalizeServerUrl(binding.serverUrl || binding.schedulerBaseUrl) === serverKey);
|
|
65
|
+
if (bindingIndex < 0) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const [binding] = launchBindings.splice(bindingIndex, 1);
|
|
69
|
+
if (!binding) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
const runtimeState = loadRuntimeBinding();
|
|
73
|
+
const userId = binding.userId || runtimeState.userId;
|
|
74
|
+
const schedulerBaseUrl = binding.schedulerBaseUrl || runtimeState.schedulerBaseUrl;
|
|
75
|
+
const runtimeAccessToken = binding.runtimeAccessToken || getRuntimeAccessToken(userId, schedulerBaseUrl);
|
|
76
|
+
return {
|
|
77
|
+
...binding,
|
|
78
|
+
runtimeAccessToken,
|
|
79
|
+
userId,
|
|
80
|
+
schedulerBaseUrl,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export function getMcpLaunchQueueSize(workspacePath) {
|
|
84
|
+
const workspaceKey = normalizeWorkspacePath(workspacePath);
|
|
85
|
+
if (!workspaceKey) {
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
return launchBindings.filter((binding) => normalizeWorkspacePath(binding.workspacePath) === workspaceKey).length;
|
|
89
|
+
}
|
|
90
|
+
export function clearMcpLaunchBindingQueues() {
|
|
91
|
+
launchBindings.splice(0, launchBindings.length);
|
|
92
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-launch-binding-queue.test.d.ts","sourceRoot":"","sources":["../../src/services/mcp-launch-binding-queue.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
2
|
+
import { claimMcpLaunchBinding, clearMcpLaunchBindingQueues, enqueueMcpLaunchBinding, getMcpLaunchQueueSize, } from './mcp-launch-binding-queue.js';
|
|
3
|
+
describe('mcp launch binding queue', () => {
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
clearMcpLaunchBindingQueues();
|
|
6
|
+
});
|
|
7
|
+
it('claims same-workspace bindings only for the requested agent identity', () => {
|
|
8
|
+
const firstBinding = enqueueMcpLaunchBinding({
|
|
9
|
+
agentId: 'agent-a',
|
|
10
|
+
workspacePath: 'C:/repo/demo',
|
|
11
|
+
serverUrl: 'ws://server-a:7380/ws/agent',
|
|
12
|
+
runtimeAccessToken: 'token-a',
|
|
13
|
+
userId: 'user-a',
|
|
14
|
+
schedulerBaseUrl: 'http://server-a:7380',
|
|
15
|
+
});
|
|
16
|
+
const secondBinding = enqueueMcpLaunchBinding({
|
|
17
|
+
agentId: 'agent-b',
|
|
18
|
+
workspacePath: 'C:/repo/demo',
|
|
19
|
+
serverUrl: 'ws://server-a:7380/ws/agent',
|
|
20
|
+
runtimeAccessToken: 'token-b',
|
|
21
|
+
userId: 'user-b',
|
|
22
|
+
schedulerBaseUrl: 'http://server-a:7380',
|
|
23
|
+
});
|
|
24
|
+
expect(getMcpLaunchQueueSize('C:/repo/demo')).toBe(2);
|
|
25
|
+
const second = claimMcpLaunchBinding({
|
|
26
|
+
agentId: 'agent-b',
|
|
27
|
+
bindingId: secondBinding?.id,
|
|
28
|
+
workspacePath: 'C:/repo/demo',
|
|
29
|
+
serverUrl: 'ws://server-a:7380/ws/agent',
|
|
30
|
+
});
|
|
31
|
+
const first = claimMcpLaunchBinding({
|
|
32
|
+
agentId: 'agent-a',
|
|
33
|
+
bindingId: firstBinding?.id,
|
|
34
|
+
workspacePath: 'C:/repo/demo',
|
|
35
|
+
serverUrl: 'ws://server-a:7380/ws/agent',
|
|
36
|
+
});
|
|
37
|
+
expect(first?.agentId).toBe('agent-a');
|
|
38
|
+
expect(first?.runtimeAccessToken).toBe('token-a');
|
|
39
|
+
expect(second?.agentId).toBe('agent-b');
|
|
40
|
+
expect(second?.runtimeAccessToken).toBe('token-b');
|
|
41
|
+
expect(getMcpLaunchQueueSize('C:/repo/demo')).toBe(0);
|
|
42
|
+
});
|
|
43
|
+
it('does not consume a binding when the requested agent id does not match', () => {
|
|
44
|
+
const binding = enqueueMcpLaunchBinding({
|
|
45
|
+
agentId: 'agent-a',
|
|
46
|
+
workspacePath: 'C:/repo/demo',
|
|
47
|
+
serverUrl: 'ws://server:7380/ws/agent',
|
|
48
|
+
});
|
|
49
|
+
expect(claimMcpLaunchBinding({
|
|
50
|
+
agentId: 'agent-b',
|
|
51
|
+
bindingId: binding?.id,
|
|
52
|
+
workspacePath: 'C:/repo/demo',
|
|
53
|
+
serverUrl: 'ws://server:7380/ws/agent',
|
|
54
|
+
})).toBeNull();
|
|
55
|
+
expect(getMcpLaunchQueueSize('C:/repo/demo')).toBe(1);
|
|
56
|
+
expect(claimMcpLaunchBinding({
|
|
57
|
+
agentId: 'agent-a',
|
|
58
|
+
bindingId: binding?.id,
|
|
59
|
+
workspacePath: 'C:/repo/demo',
|
|
60
|
+
serverUrl: 'ws://server:7380/ws/agent',
|
|
61
|
+
})?.agentId).toBe('agent-a');
|
|
62
|
+
});
|
|
63
|
+
it('does not consume a binding when the binding id is missing or wrong', () => {
|
|
64
|
+
const binding = enqueueMcpLaunchBinding({
|
|
65
|
+
agentId: 'agent-a',
|
|
66
|
+
workspacePath: 'C:/repo/demo',
|
|
67
|
+
serverUrl: 'ws://server:7380/ws/agent',
|
|
68
|
+
});
|
|
69
|
+
expect(claimMcpLaunchBinding({
|
|
70
|
+
agentId: 'agent-a',
|
|
71
|
+
workspacePath: 'C:/repo/demo',
|
|
72
|
+
serverUrl: 'ws://server:7380/ws/agent',
|
|
73
|
+
})).toBeNull();
|
|
74
|
+
expect(claimMcpLaunchBinding({
|
|
75
|
+
agentId: 'agent-a',
|
|
76
|
+
bindingId: 'wrong-binding',
|
|
77
|
+
workspacePath: 'C:/repo/demo',
|
|
78
|
+
serverUrl: 'ws://server:7380/ws/agent',
|
|
79
|
+
})).toBeNull();
|
|
80
|
+
expect(getMcpLaunchQueueSize('C:/repo/demo')).toBe(1);
|
|
81
|
+
expect(claimMcpLaunchBinding({
|
|
82
|
+
agentId: 'agent-a',
|
|
83
|
+
bindingId: binding?.id,
|
|
84
|
+
workspacePath: 'C:/repo/demo',
|
|
85
|
+
serverUrl: 'ws://server:7380/ws/agent',
|
|
86
|
+
})?.agentId).toBe('agent-a');
|
|
87
|
+
});
|
|
88
|
+
it('matches by server URL as well as workspace path', () => {
|
|
89
|
+
const firstBinding = enqueueMcpLaunchBinding({ agentId: 'agent-a', workspacePath: 'C:/repo/demo', serverUrl: 'ws://server-a:7380/ws/agent' });
|
|
90
|
+
const secondBinding = enqueueMcpLaunchBinding({ agentId: 'agent-b', workspacePath: 'C:/repo/demo', serverUrl: 'ws://server-b:7380/ws/agent' });
|
|
91
|
+
expect(claimMcpLaunchBinding({ agentId: 'agent-b', bindingId: secondBinding?.id, workspacePath: 'C:/repo/demo', serverUrl: 'ws://server-b:7380/ws/agent' })?.agentId).toBe('agent-b');
|
|
92
|
+
expect(claimMcpLaunchBinding({ agentId: 'agent-a', bindingId: firstBinding?.id, workspacePath: 'C:/repo/demo', serverUrl: 'ws://server-a:7380/ws/agent' })?.agentId).toBe('agent-a');
|
|
93
|
+
});
|
|
94
|
+
it('does not mix different workspace paths', () => {
|
|
95
|
+
const firstBinding = enqueueMcpLaunchBinding({ agentId: 'agent-a', workspacePath: 'C:/repo/a', serverUrl: 'ws://server:7380/ws/agent' });
|
|
96
|
+
const secondBinding = enqueueMcpLaunchBinding({ agentId: 'agent-b', workspacePath: 'C:/repo/b', serverUrl: 'ws://server:7380/ws/agent' });
|
|
97
|
+
expect(claimMcpLaunchBinding({ agentId: 'agent-b', bindingId: secondBinding?.id, workspacePath: 'C:/repo/b', serverUrl: 'ws://server:7380/ws/agent' })?.agentId).toBe('agent-b');
|
|
98
|
+
expect(claimMcpLaunchBinding({ agentId: 'agent-a', bindingId: firstBinding?.id, workspacePath: 'C:/repo/a', serverUrl: 'ws://server:7380/ws/agent' })?.agentId).toBe('agent-a');
|
|
99
|
+
});
|
|
100
|
+
it('returns null for missing or invalid workspaces', () => {
|
|
101
|
+
expect(enqueueMcpLaunchBinding({ agentId: '', workspacePath: 'C:/repo/demo' })).toBeNull();
|
|
102
|
+
expect(enqueueMcpLaunchBinding({ agentId: 'agent-a', workspacePath: '' })).toBeNull();
|
|
103
|
+
expect(claimMcpLaunchBinding({ agentId: 'agent-a', workspacePath: 'C:/repo/missing', serverUrl: 'ws://server:7380/ws/agent' })).toBeNull();
|
|
104
|
+
expect(claimMcpLaunchBinding({ agentId: '', workspacePath: 'C:/repo/demo', serverUrl: 'ws://server:7380/ws/agent' })).toBeNull();
|
|
105
|
+
expect(claimMcpLaunchBinding({ agentId: 'agent-a', bindingId: 'binding-a', workspacePath: 'C:/repo/demo' })).toBeNull();
|
|
106
|
+
});
|
|
107
|
+
});
|
|
@@ -180,7 +180,7 @@ export class OrphanMonitor {
|
|
|
180
180
|
// 使用进程树终止
|
|
181
181
|
const result = terminateProcessTree(pid);
|
|
182
182
|
// 等待进程完全终止(最多 5 秒)
|
|
183
|
-
const exited = waitForProcessExit(pid, 5000);
|
|
183
|
+
const exited = await waitForProcessExit(pid, 5000);
|
|
184
184
|
if (result.terminated > 0 && exited) {
|
|
185
185
|
const event = {
|
|
186
186
|
type: 'orphan_cleaned',
|
|
@@ -81,7 +81,7 @@ export declare function terminateProcessTree(pid: number): {
|
|
|
81
81
|
* @param timeoutMs 超时时间(毫秒)
|
|
82
82
|
* @returns 是否成功终止
|
|
83
83
|
*/
|
|
84
|
-
export declare function waitForProcessExit(pid: number, timeoutMs?: number): boolean
|
|
84
|
+
export declare function waitForProcessExit(pid: number, timeoutMs?: number): Promise<boolean>;
|
|
85
85
|
/**
|
|
86
86
|
* 检测并收集所有孤儿进程信息
|
|
87
87
|
* 用于 runtime-bridge 启动时恢复控制
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-detector.d.ts","sourceRoot":"","sources":["../../src/services/process-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiCH;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAoBrD;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,WAAW,EAAE,CAkBvD;AA8LD;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAkBnF;AAiUD;;;;;;;;;;;GAWG;AACH,wBAAgB,4BAA4B,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAyD3F;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQrD;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAmCxF;AA2BD;;;;;;GAMG;AACH,
|
|
1
|
+
{"version":3,"file":"process-detector.d.ts","sourceRoot":"","sources":["../../src/services/process-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -715,7 +715,7 @@ function getChildProcesses(pid) {
|
|
|
715
715
|
* @param timeoutMs 超时时间(毫秒)
|
|
716
716
|
* @returns 是否成功终止
|
|
717
717
|
*/
|
|
718
|
-
export function waitForProcessExit(pid, timeoutMs = 5000) {
|
|
718
|
+
export async function waitForProcessExit(pid, timeoutMs = 5000) {
|
|
719
719
|
const startTime = Date.now();
|
|
720
720
|
while (Date.now() - startTime < timeoutMs) {
|
|
721
721
|
if (!isProcessRunning(pid)) {
|
|
@@ -724,16 +724,7 @@ export function waitForProcessExit(pid, timeoutMs = 5000) {
|
|
|
724
724
|
// 等待 100ms 后重试
|
|
725
725
|
const delay = Math.min(100, timeoutMs - (Date.now() - startTime));
|
|
726
726
|
if (delay > 0) {
|
|
727
|
-
|
|
728
|
-
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, delay);
|
|
729
|
-
}
|
|
730
|
-
catch {
|
|
731
|
-
// SharedArrayBuffer 不可用时回退到 setTimeout
|
|
732
|
-
const startWait = Date.now();
|
|
733
|
-
while (Date.now() - startWait < delay) {
|
|
734
|
-
// 忙等待
|
|
735
|
-
}
|
|
736
|
-
}
|
|
727
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
737
728
|
}
|
|
738
729
|
}
|
|
739
730
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-registry.d.ts","sourceRoot":"","sources":["../../src/services/process-registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC;AAEvG;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAE/D;;OAEG;IACH,OAAO;IAEP;;;;OAIG;WACW,WAAW,IAAI,eAAe;IAO5C;;OAEG;YACW,OAAO;
|
|
1
|
+
{"version":3,"file":"process-registry.d.ts","sourceRoot":"","sources":["../../src/services/process-registry.ts"],"names":[],"mappings":"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"}
|