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.
Files changed (148) hide show
  1. package/dist/adapter/adapter.test.js +4 -4
  2. package/dist/adapter/types.d.ts.map +1 -1
  3. package/dist/adapter/types.js +0 -7
  4. package/dist/adapter/types.test.js +5 -53
  5. package/dist/config.d.ts +1 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +2 -2
  8. package/dist/middleware/auth.d.ts.map +1 -1
  9. package/dist/middleware/auth.js +4 -0
  10. package/dist/routes/instance.d.ts.map +1 -1
  11. package/dist/routes/instance.js +88 -34
  12. package/dist/routes/runtime-binding.d.ts.map +1 -1
  13. package/dist/routes/runtime-binding.js +59 -2
  14. package/dist/routes/sessions.js +1 -1
  15. package/dist/routes/terminal.d.ts.map +1 -1
  16. package/dist/routes/terminal.js +48 -14
  17. package/dist/routes/terminal.test.js +6 -2
  18. package/dist/services/agent-process-manager.js +4 -4
  19. package/dist/services/auto-register.d.ts +12 -1
  20. package/dist/services/auto-register.d.ts.map +1 -1
  21. package/dist/services/auto-register.js +206 -42
  22. package/dist/services/aws-client-agent-mcp.test.js +3 -0
  23. package/dist/services/mcp-launch-binding-queue.d.ts +36 -0
  24. package/dist/services/mcp-launch-binding-queue.d.ts.map +1 -0
  25. package/dist/services/mcp-launch-binding-queue.js +92 -0
  26. package/dist/services/mcp-launch-binding-queue.test.d.ts +2 -0
  27. package/dist/services/mcp-launch-binding-queue.test.d.ts.map +1 -0
  28. package/dist/services/mcp-launch-binding-queue.test.js +107 -0
  29. package/dist/services/orphan-monitor.js +1 -1
  30. package/dist/services/process-detector.d.ts +1 -1
  31. package/dist/services/process-detector.d.ts.map +1 -1
  32. package/dist/services/process-detector.js +2 -11
  33. package/dist/services/process-registry.d.ts +1 -0
  34. package/dist/services/process-registry.d.ts.map +1 -1
  35. package/dist/services/process-registry.js +129 -108
  36. package/dist/services/runtime-binding.d.ts +11 -1
  37. package/dist/services/runtime-binding.d.ts.map +1 -1
  38. package/dist/services/runtime-binding.js +130 -4
  39. package/dist/services/terminal-persistence.d.ts.map +1 -1
  40. package/dist/services/terminal-persistence.js +47 -37
  41. package/dist/services/terminal-persistence.test.js +47 -1
  42. package/dist/utils/file-utils.d.ts +3 -0
  43. package/dist/utils/file-utils.d.ts.map +1 -1
  44. package/dist/utils/file-utils.js +32 -0
  45. package/package/aws-client-agent-mcp/README.md +288 -288
  46. package/package.json +76 -76
  47. package/dist/routes/aws-mcp.d.ts +0 -10
  48. package/dist/routes/aws-mcp.d.ts.map +0 -1
  49. package/dist/routes/aws-mcp.js +0 -74
  50. package/dist/routes/aws-mcp.test.d.ts +0 -2
  51. package/dist/routes/aws-mcp.test.d.ts.map +0 -1
  52. package/dist/routes/aws-mcp.test.js +0 -42
  53. package/dist/routes/memory.d.ts +0 -13
  54. package/dist/routes/memory.d.ts.map +0 -1
  55. package/dist/routes/memory.js +0 -429
  56. package/dist/services/aws-mcp-http.d.ts +0 -11
  57. package/dist/services/aws-mcp-http.d.ts.map +0 -1
  58. package/dist/services/aws-mcp-http.js +0 -225
  59. package/dist/services/aws-mcp-http.test.d.ts +0 -2
  60. package/dist/services/aws-mcp-http.test.d.ts.map +0 -1
  61. package/dist/services/aws-mcp-http.test.js +0 -27
  62. package/dist/services/easytier-manager.d.ts +0 -106
  63. package/dist/services/easytier-manager.d.ts.map +0 -1
  64. package/dist/services/easytier-manager.js +0 -331
  65. package/dist/services/easytier-manager.test.d.ts +0 -5
  66. package/dist/services/easytier-manager.test.d.ts.map +0 -1
  67. package/dist/services/easytier-manager.test.js +0 -98
  68. package/dist/services/memory-service.d.ts +0 -195
  69. package/dist/services/memory-service.d.ts.map +0 -1
  70. package/dist/services/memory-service.js +0 -650
  71. package/dist/services/session-lookup.d.ts +0 -20
  72. package/dist/services/session-lookup.d.ts.map +0 -1
  73. package/dist/services/session-lookup.js +0 -43
  74. package/dist/services/user-api-key-service.d.ts +0 -28
  75. package/dist/services/user-api-key-service.d.ts.map +0 -1
  76. package/dist/services/user-api-key-service.js +0 -75
  77. package/node_modules/@cc-switch/sdk/dist/adapters/common.d.ts +0 -38
  78. package/node_modules/@cc-switch/sdk/dist/adapters/common.d.ts.map +0 -1
  79. package/node_modules/@cc-switch/sdk/dist/adapters/common.js +0 -47
  80. package/node_modules/@cc-switch/sdk/dist/adapters/index.d.ts +0 -5
  81. package/node_modules/@cc-switch/sdk/dist/adapters/index.d.ts.map +0 -1
  82. package/node_modules/@cc-switch/sdk/dist/adapters/index.js +0 -28
  83. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claude.d.ts +0 -10
  84. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claude.d.ts.map +0 -1
  85. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claude.js +0 -39
  86. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claudecode.d.ts +0 -10
  87. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claudecode.d.ts.map +0 -1
  88. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claudecode.js +0 -40
  89. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.d.ts +0 -18
  90. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.d.ts.map +0 -1
  91. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.js +0 -63
  92. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.test.d.ts +0 -2
  93. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.test.d.ts.map +0 -1
  94. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.test.js +0 -86
  95. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-placeholder.d.ts +0 -9
  96. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-placeholder.d.ts.map +0 -1
  97. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-placeholder.js +0 -14
  98. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claude.d.ts +0 -10
  99. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claude.d.ts.map +0 -1
  100. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claude.js +0 -51
  101. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claudecode.d.ts +0 -10
  102. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claudecode.d.ts.map +0 -1
  103. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claudecode.js +0 -51
  104. package/node_modules/@cc-switch/sdk/dist/adapters/skill-opencode.d.ts +0 -10
  105. package/node_modules/@cc-switch/sdk/dist/adapters/skill-opencode.d.ts.map +0 -1
  106. package/node_modules/@cc-switch/sdk/dist/adapters/skill-opencode.js +0 -51
  107. package/node_modules/@cc-switch/sdk/dist/adapters/skill-placeholder.d.ts +0 -9
  108. package/node_modules/@cc-switch/sdk/dist/adapters/skill-placeholder.d.ts.map +0 -1
  109. package/node_modules/@cc-switch/sdk/dist/adapters/skill-placeholder.js +0 -14
  110. package/node_modules/@cc-switch/sdk/dist/services/instance-service.d.ts +0 -78
  111. package/node_modules/@cc-switch/sdk/dist/services/instance-service.d.ts.map +0 -1
  112. package/node_modules/@cc-switch/sdk/dist/services/instance-service.js +0 -180
  113. package/package/cc-switch-sdk/dist/adapters/common.d.ts +0 -38
  114. package/package/cc-switch-sdk/dist/adapters/common.d.ts.map +0 -1
  115. package/package/cc-switch-sdk/dist/adapters/common.js +0 -47
  116. package/package/cc-switch-sdk/dist/adapters/index.d.ts +0 -5
  117. package/package/cc-switch-sdk/dist/adapters/index.d.ts.map +0 -1
  118. package/package/cc-switch-sdk/dist/adapters/index.js +0 -28
  119. package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts +0 -10
  120. package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts.map +0 -1
  121. package/package/cc-switch-sdk/dist/adapters/mcp-claude.js +0 -39
  122. package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts +0 -10
  123. package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts.map +0 -1
  124. package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.js +0 -40
  125. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts +0 -18
  126. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts.map +0 -1
  127. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.js +0 -63
  128. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts +0 -2
  129. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts.map +0 -1
  130. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.js +0 -86
  131. package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts +0 -9
  132. package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts.map +0 -1
  133. package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.js +0 -14
  134. package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts +0 -10
  135. package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts.map +0 -1
  136. package/package/cc-switch-sdk/dist/adapters/skill-claude.js +0 -51
  137. package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts +0 -10
  138. package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts.map +0 -1
  139. package/package/cc-switch-sdk/dist/adapters/skill-claudecode.js +0 -51
  140. package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts +0 -10
  141. package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts.map +0 -1
  142. package/package/cc-switch-sdk/dist/adapters/skill-opencode.js +0 -51
  143. package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts +0 -9
  144. package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts.map +0 -1
  145. package/package/cc-switch-sdk/dist/adapters/skill-placeholder.js +0 -14
  146. package/package/cc-switch-sdk/dist/services/instance-service.d.ts +0 -78
  147. package/package/cc-switch-sdk/dist/services/instance-service.d.ts.map +0 -1
  148. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-launch-binding-queue.test.d.ts.map
@@ -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":"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"}
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
- try {
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;
@@ -72,6 +72,7 @@ export declare class ProcessRegistry {
72
72
  * 持久化注册表状态到文件
73
73
  */
74
74
  private persist;
75
+ private mutate;
75
76
  /**
76
77
  * 注册新进程
77
78
  *
@@ -1 +1 @@
1
- {"version":3,"file":"process-registry.d.ts","sourceRoot":"","sources":["../../src/services/process-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process-registry.d.ts","sourceRoot":"","sources":["../../src/services/process-registry.ts"],"names":[],"mappings":"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"}