agent-tower 0.6.0-beta.11 → 0.6.0-beta.13

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 (204) hide show
  1. package/dist/app.d.ts.map +1 -1
  2. package/dist/app.js +4 -0
  3. package/dist/app.js.map +1 -1
  4. package/dist/cli.js +39 -19
  5. package/dist/cli.js.map +1 -1
  6. package/dist/executors/__tests__/base.executor.test.js +133 -1
  7. package/dist/executors/__tests__/base.executor.test.js.map +1 -1
  8. package/dist/executors/__tests__/stdin-prompt.executors.test.js +18 -0
  9. package/dist/executors/__tests__/stdin-prompt.executors.test.js.map +1 -1
  10. package/dist/executors/base.executor.d.ts +8 -0
  11. package/dist/executors/base.executor.d.ts.map +1 -1
  12. package/dist/executors/base.executor.js +336 -56
  13. package/dist/executors/base.executor.js.map +1 -1
  14. package/dist/executors/index.d.ts +2 -1
  15. package/dist/executors/index.d.ts.map +1 -1
  16. package/dist/executors/index.js +1 -1
  17. package/dist/executors/index.js.map +1 -1
  18. package/dist/executors/start-error.d.ts +17 -0
  19. package/dist/executors/start-error.d.ts.map +1 -1
  20. package/dist/executors/start-error.js +36 -1
  21. package/dist/executors/start-error.js.map +1 -1
  22. package/dist/index.js +39 -29
  23. package/dist/index.js.map +1 -1
  24. package/dist/mcp/http-client.test.js +20 -0
  25. package/dist/mcp/http-client.test.js.map +1 -1
  26. package/dist/mcp/tools/__tests__/sessions.test.d.ts +2 -0
  27. package/dist/mcp/tools/__tests__/sessions.test.d.ts.map +1 -0
  28. package/dist/mcp/tools/__tests__/sessions.test.js +33 -0
  29. package/dist/mcp/tools/__tests__/sessions.test.js.map +1 -0
  30. package/dist/routes/__tests__/sessions-runtime.test.js +75 -3
  31. package/dist/routes/__tests__/sessions-runtime.test.js.map +1 -1
  32. package/dist/routes/conversations.d.ts.map +1 -1
  33. package/dist/routes/conversations.js +5 -1
  34. package/dist/routes/conversations.js.map +1 -1
  35. package/dist/routes/sessions.d.ts.map +1 -1
  36. package/dist/routes/sessions.js +13 -2
  37. package/dist/routes/sessions.js.map +1 -1
  38. package/dist/routes/team-runs.d.ts.map +1 -1
  39. package/dist/routes/team-runs.js +13 -1
  40. package/dist/routes/team-runs.js.map +1 -1
  41. package/dist/runtime/__tests__/acp-driver-lifecycle.test.js +86 -0
  42. package/dist/runtime/__tests__/acp-driver-lifecycle.test.js.map +1 -1
  43. package/dist/runtime/__tests__/acp-process-manager.test.js +393 -6
  44. package/dist/runtime/__tests__/acp-process-manager.test.js.map +1 -1
  45. package/dist/runtime/__tests__/cli-driver-lifecycle.test.d.ts +2 -0
  46. package/dist/runtime/__tests__/cli-driver-lifecycle.test.d.ts.map +1 -0
  47. package/dist/runtime/__tests__/cli-driver-lifecycle.test.js +244 -0
  48. package/dist/runtime/__tests__/cli-driver-lifecycle.test.js.map +1 -0
  49. package/dist/runtime/__tests__/launch-cleanup-registry.test.d.ts +2 -0
  50. package/dist/runtime/__tests__/launch-cleanup-registry.test.d.ts.map +1 -0
  51. package/dist/runtime/__tests__/launch-cleanup-registry.test.js +154 -0
  52. package/dist/runtime/__tests__/launch-cleanup-registry.test.js.map +1 -0
  53. package/dist/runtime/__tests__/runtime-coordinator.test.js +117 -1
  54. package/dist/runtime/__tests__/runtime-coordinator.test.js.map +1 -1
  55. package/dist/runtime/__tests__/server-entry-shutdown.test.d.ts +2 -0
  56. package/dist/runtime/__tests__/server-entry-shutdown.test.d.ts.map +1 -0
  57. package/dist/runtime/__tests__/server-entry-shutdown.test.js +38 -0
  58. package/dist/runtime/__tests__/server-entry-shutdown.test.js.map +1 -0
  59. package/dist/runtime/__tests__/shutdown-coordinator.test.d.ts +2 -0
  60. package/dist/runtime/__tests__/shutdown-coordinator.test.d.ts.map +1 -0
  61. package/dist/runtime/__tests__/shutdown-coordinator.test.js +28 -0
  62. package/dist/runtime/__tests__/shutdown-coordinator.test.js.map +1 -0
  63. package/dist/runtime/acp/acp-driver.d.ts.map +1 -1
  64. package/dist/runtime/acp/acp-driver.js +108 -35
  65. package/dist/runtime/acp/acp-driver.js.map +1 -1
  66. package/dist/runtime/acp/agents/managed-directory.d.ts.map +1 -1
  67. package/dist/runtime/acp/agents/managed-directory.js +3 -1
  68. package/dist/runtime/acp/agents/managed-directory.js.map +1 -1
  69. package/dist/runtime/acp/agents/managed-directory.test.d.ts +2 -0
  70. package/dist/runtime/acp/agents/managed-directory.test.d.ts.map +1 -0
  71. package/dist/runtime/acp/agents/managed-directory.test.js +25 -0
  72. package/dist/runtime/acp/agents/managed-directory.test.js.map +1 -0
  73. package/dist/runtime/acp/launch-cleanup-registry.d.ts +32 -0
  74. package/dist/runtime/acp/launch-cleanup-registry.d.ts.map +1 -0
  75. package/dist/runtime/acp/launch-cleanup-registry.js +176 -0
  76. package/dist/runtime/acp/launch-cleanup-registry.js.map +1 -0
  77. package/dist/runtime/acp/process-manager.d.ts +58 -0
  78. package/dist/runtime/acp/process-manager.d.ts.map +1 -1
  79. package/dist/runtime/acp/process-manager.js +489 -33
  80. package/dist/runtime/acp/process-manager.js.map +1 -1
  81. package/dist/runtime/cli-driver.d.ts.map +1 -1
  82. package/dist/runtime/cli-driver.js +230 -46
  83. package/dist/runtime/cli-driver.js.map +1 -1
  84. package/dist/runtime/contracts.d.ts +21 -2
  85. package/dist/runtime/contracts.d.ts.map +1 -1
  86. package/dist/runtime/index.d.ts +1 -0
  87. package/dist/runtime/index.d.ts.map +1 -1
  88. package/dist/runtime/index.js +1 -0
  89. package/dist/runtime/index.js.map +1 -1
  90. package/dist/runtime/runtime-coordinator.d.ts +8 -1
  91. package/dist/runtime/runtime-coordinator.d.ts.map +1 -1
  92. package/dist/runtime/runtime-coordinator.js +118 -18
  93. package/dist/runtime/runtime-coordinator.js.map +1 -1
  94. package/dist/runtime/server-entry-shutdown.d.ts +12 -0
  95. package/dist/runtime/server-entry-shutdown.d.ts.map +1 -0
  96. package/dist/runtime/server-entry-shutdown.js +23 -0
  97. package/dist/runtime/server-entry-shutdown.js.map +1 -0
  98. package/dist/runtime/shutdown-coordinator.d.ts +17 -0
  99. package/dist/runtime/shutdown-coordinator.d.ts.map +1 -0
  100. package/dist/runtime/shutdown-coordinator.js +67 -0
  101. package/dist/runtime/shutdown-coordinator.js.map +1 -0
  102. package/dist/services/__tests__/conversation.service.test.js +160 -0
  103. package/dist/services/__tests__/conversation.service.test.js.map +1 -1
  104. package/dist/services/__tests__/database-maintenance.service.test.js +97 -0
  105. package/dist/services/__tests__/database-maintenance.service.test.js.map +1 -1
  106. package/dist/services/__tests__/member-heartbeat-scheduler.test.js +6 -0
  107. package/dist/services/__tests__/member-heartbeat-scheduler.test.js.map +1 -1
  108. package/dist/services/__tests__/member-heartbeat.test.js +7 -11
  109. package/dist/services/__tests__/member-heartbeat.test.js.map +1 -1
  110. package/dist/services/__tests__/session-manager.lifecycle.test.js +402 -12
  111. package/dist/services/__tests__/session-manager.lifecycle.test.js.map +1 -1
  112. package/dist/services/__tests__/session-manager.team-run.test.js +422 -29
  113. package/dist/services/__tests__/session-manager.team-run.test.js.map +1 -1
  114. package/dist/services/__tests__/team-queue-recovery.integration.test.js +1 -0
  115. package/dist/services/__tests__/team-queue-recovery.integration.test.js.map +1 -1
  116. package/dist/services/__tests__/team-reconciler.service.test.js +1282 -4
  117. package/dist/services/__tests__/team-reconciler.service.test.js.map +1 -1
  118. package/dist/services/__tests__/team-run.service.test.js +161 -1
  119. package/dist/services/__tests__/team-run.service.test.js.map +1 -1
  120. package/dist/services/__tests__/team-scheduler.service.test.js +334 -6
  121. package/dist/services/__tests__/team-scheduler.service.test.js.map +1 -1
  122. package/dist/services/conversation.service.d.ts.map +1 -1
  123. package/dist/services/conversation.service.js +21 -2
  124. package/dist/services/conversation.service.js.map +1 -1
  125. package/dist/services/database-maintenance.service.d.ts.map +1 -1
  126. package/dist/services/database-maintenance.service.js +68 -17
  127. package/dist/services/database-maintenance.service.js.map +1 -1
  128. package/dist/services/member-heartbeat-scheduler.d.ts +6 -5
  129. package/dist/services/member-heartbeat-scheduler.d.ts.map +1 -1
  130. package/dist/services/member-heartbeat-scheduler.js +7 -5
  131. package/dist/services/member-heartbeat-scheduler.js.map +1 -1
  132. package/dist/services/session-manager.d.ts +124 -14
  133. package/dist/services/session-manager.d.ts.map +1 -1
  134. package/dist/services/session-manager.js +1035 -116
  135. package/dist/services/session-manager.js.map +1 -1
  136. package/dist/services/session-runtime-cleanup-gate.d.ts +25 -0
  137. package/dist/services/session-runtime-cleanup-gate.d.ts.map +1 -0
  138. package/dist/services/session-runtime-cleanup-gate.js +284 -0
  139. package/dist/services/session-runtime-cleanup-gate.js.map +1 -0
  140. package/dist/services/task.service.d.ts +2 -2
  141. package/dist/services/team-member-admission-barrier.d.ts +3 -0
  142. package/dist/services/team-member-admission-barrier.d.ts.map +1 -0
  143. package/dist/services/team-member-admission-barrier.js +26 -0
  144. package/dist/services/team-member-admission-barrier.js.map +1 -0
  145. package/dist/services/team-reconciler.service.d.ts +30 -7
  146. package/dist/services/team-reconciler.service.d.ts.map +1 -1
  147. package/dist/services/team-reconciler.service.js +528 -111
  148. package/dist/services/team-reconciler.service.js.map +1 -1
  149. package/dist/services/team-run.service.d.ts.map +1 -1
  150. package/dist/services/team-run.service.js +37 -13
  151. package/dist/services/team-run.service.js.map +1 -1
  152. package/dist/services/team-scheduler.service.d.ts +8 -6
  153. package/dist/services/team-scheduler.service.d.ts.map +1 -1
  154. package/dist/services/team-scheduler.service.js +323 -120
  155. package/dist/services/team-scheduler.service.js.map +1 -1
  156. package/dist/services/workspace-background-process-manager.d.ts.map +1 -1
  157. package/dist/services/workspace-background-process-manager.js +2 -5
  158. package/dist/services/workspace-background-process-manager.js.map +1 -1
  159. package/dist/services/workspace.service.d.ts +15 -8
  160. package/dist/services/workspace.service.d.ts.map +1 -1
  161. package/dist/socket/index.d.ts.map +1 -1
  162. package/dist/socket/index.js +27 -14
  163. package/dist/socket/index.js.map +1 -1
  164. package/dist/utils/__tests__/unix-process-identity.test.d.ts +2 -0
  165. package/dist/utils/__tests__/unix-process-identity.test.d.ts.map +1 -0
  166. package/dist/utils/__tests__/unix-process-identity.test.js +73 -0
  167. package/dist/utils/__tests__/unix-process-identity.test.js.map +1 -0
  168. package/dist/utils/error-log.d.ts +2 -0
  169. package/dist/utils/error-log.d.ts.map +1 -1
  170. package/dist/utils/error-log.js +40 -3
  171. package/dist/utils/error-log.js.map +1 -1
  172. package/dist/utils/error-log.test.js +14 -2
  173. package/dist/utils/error-log.test.js.map +1 -1
  174. package/dist/utils/process-launch.d.ts +2 -2
  175. package/dist/utils/process-launch.d.ts.map +1 -1
  176. package/dist/utils/process-launch.js +339 -79
  177. package/dist/utils/process-launch.js.map +1 -1
  178. package/dist/utils/process-launch.test.js +168 -10
  179. package/dist/utils/process-launch.test.js.map +1 -1
  180. package/dist/utils/spawned-process-identity.d.ts +7 -0
  181. package/dist/utils/spawned-process-identity.d.ts.map +1 -0
  182. package/dist/utils/spawned-process-identity.js +36 -0
  183. package/dist/utils/spawned-process-identity.js.map +1 -0
  184. package/dist/utils/tree-cleanup-channel.d.ts +18 -0
  185. package/dist/utils/tree-cleanup-channel.d.ts.map +1 -0
  186. package/dist/utils/tree-cleanup-channel.js +16 -0
  187. package/dist/utils/tree-cleanup-channel.js.map +1 -0
  188. package/dist/utils/tree-cleanup-channel.test.d.ts +2 -0
  189. package/dist/utils/tree-cleanup-channel.test.d.ts.map +1 -0
  190. package/dist/utils/tree-cleanup-channel.test.js +15 -0
  191. package/dist/utils/tree-cleanup-channel.test.js.map +1 -0
  192. package/dist/utils/unix-process-identity.d.ts +13 -1
  193. package/dist/utils/unix-process-identity.d.ts.map +1 -1
  194. package/dist/utils/unix-process-identity.js +146 -25
  195. package/dist/utils/unix-process-identity.js.map +1 -1
  196. package/node_modules/@agent-tower/shared/dist/types.d.ts +1 -0
  197. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
  198. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
  199. package/package.json +1 -1
  200. package/prisma/migrations/20260824000000_add_execution_process_ownership/migration.sql +10 -0
  201. package/prisma/migrations/20260824010000_add_runtime_cleanup_recovery/migration.sql +10 -0
  202. package/prisma/migrations/20260824020000_add_runtime_launch_admission/migration.sql +72 -0
  203. package/prisma/migrations/20260826000000_add_conversation_turn_queue/migration.sql +19 -0
  204. package/prisma/schema.prisma +50 -7
@@ -1,9 +1,11 @@
1
1
  import { execFileSync, spawn, spawnSync } from 'node:child_process';
2
- import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { chmodSync, existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { randomUUID } from 'node:crypto';
3
4
  import os from 'node:os';
4
5
  import path from 'node:path';
5
6
  import { describe, expect, it } from 'vitest';
6
7
  import { buildWindowsCmdShimCommandLine, buildPtyWrapperEnv, buildPtyCommand, buildPtyCommandWithStdin, buildUnixPathWithUserBinFallbacks, buildWindowsPathWithUserBinFallbacks, getDefaultTerminalShell, getNodeRuntimeCommand, normalizeCommandLookupOutput, } from './process-launch.js';
8
+ import { createTreeCleanupChannel } from './tree-cleanup-channel.js';
7
9
  function isAlive(pid) {
8
10
  try {
9
11
  process.kill(pid, 0);
@@ -25,8 +27,11 @@ async function waitUntil(predicate, timeoutMs) {
25
27
  /** 启动 wrapper 运行 childScript,等待 child 打印的孙进程 PID */
26
28
  function spawnWrapperWithGrandchild(childScript) {
27
29
  const invocation = buildPtyCommand(process.execPath, ['-e', childScript]);
30
+ const ownershipToken = randomUUID();
31
+ const env = buildPtyWrapperEnv({ ...process.env }, {}, ownershipToken);
28
32
  const wrapper = spawn(invocation.command, invocation.args, {
29
33
  stdio: ['ignore', 'pipe', 'inherit'],
34
+ env,
30
35
  });
31
36
  const grandPid = new Promise((resolve, reject) => {
32
37
  let buf = '';
@@ -38,7 +43,7 @@ function spawnWrapperWithGrandchild(childScript) {
38
43
  });
39
44
  setTimeout(() => reject(new Error('timed out waiting for grandchild pid')), 5000).unref();
40
45
  });
41
- return { wrapper, grandPid };
46
+ return { wrapper, grandPid, ownershipToken };
42
47
  }
43
48
  describe('process-launch', () => {
44
49
  it('should add bundled node runtime env only to the PTY wrapper env', () => {
@@ -47,6 +52,7 @@ describe('process-launch', () => {
47
52
  AGENT_TOWER_URL: 'http://127.0.0.1:42232',
48
53
  }, {
49
54
  AGENT_TOWER_NODE_RUNTIME: 'C:\\Program Files\\Agent Tower\\resources\\runtime\\node\\node.exe',
55
+ ELECTRON_RUN_AS_NODE: '1',
50
56
  });
51
57
  expect(wrapperEnv).toMatchObject({
52
58
  PATH: '/usr/bin',
@@ -91,6 +97,12 @@ describe('process-launch', () => {
91
97
  };
92
98
  expect(buildPtyWrapperEnv(agentEnv, {})).toEqual(agentEnv);
93
99
  });
100
+ it('should keep completion capability out of wrapped child env', () => {
101
+ const wrapperEnv = buildPtyWrapperEnv({ PATH: '/usr/bin' }, { AGENT_TOWER_TREE_CLEANUP_CHANNEL: '127.0.0.1:1234', AGENT_TOWER_TREE_CLEANUP_SECRET: 'parent-secret' }, 'launch-token', { AGENT_TOWER_TREE_CLEANUP_CHANNEL: '127.0.0.1:4321', AGENT_TOWER_TREE_CLEANUP_SECRET: 'launch-secret' });
102
+ expect(wrapperEnv).not.toHaveProperty('AGENT_TOWER_TREE_CLEANUP_CHANNEL');
103
+ expect(wrapperEnv).not.toHaveProperty('AGENT_TOWER_TREE_CLEANUP_SECRET');
104
+ expect(wrapperEnv).not.toHaveProperty('AGENT_TOWER_TREE_CLEANUP_EVIDENCE');
105
+ });
94
106
  it('should strip packaged node-mode env before spawning the wrapped child', () => {
95
107
  const originalNodeRuntime = process.env.AGENT_TOWER_NODE_RUNTIME;
96
108
  delete process.env.AGENT_TOWER_NODE_RUNTIME;
@@ -220,13 +232,59 @@ describe('process-launch', () => {
220
232
  const invocation = buildPtyCommand('C:\\Tools\\cursor-agent.cmd', ['--print']);
221
233
  expect(invocation.args[1]).toContain('windowsHide: true');
222
234
  });
223
- it('should keep Unix wrapper signals behind the identity adapter without child fallback', () => {
235
+ it('should keep Unix group signals identity-validated with a handle-bound fallback', () => {
224
236
  const invocation = buildPtyCommand(process.execPath, ['-e', 'setTimeout(() => {}, 1000)']);
225
237
  const wrapperScript = invocation.args[1] ?? '';
226
238
  const directChildSignals = wrapperScript.match(/child\.kill\(signal\)/g) ?? [];
227
239
  expect(wrapperScript).toContain('unixIdentityAdapter.signalGroup(signal)');
240
+ expect(wrapperScript).toContain('process.kill(-child.pid, signal)');
241
+ expect(wrapperScript).toContain("child['kill'](signal)");
228
242
  expect(directChildSignals).toHaveLength(1);
229
243
  });
244
+ it('should use the Windows descendant-tree kill contract', () => {
245
+ const invocation = buildPtyCommand('C:\\Tools\\codex.cmd', ['--print']);
246
+ const wrapperScript = invocation.args[1] ?? '';
247
+ expect(wrapperScript).toContain("spawnSync('taskkill', ['/PID', String(child.pid), '/T', '/F']");
248
+ expect(wrapperScript).toContain('terminateWindowsTree()');
249
+ });
250
+ it('should fail closed for unavailable process probes with bounded backoff', () => {
251
+ const invocation = buildPtyCommand('C:\\Tools\\codex.cmd', ['--print']);
252
+ const wrapperScript = invocation.args[1] ?? '';
253
+ expect(wrapperScript).toContain("'PROBE_UNAVAILABLE'");
254
+ expect(wrapperScript).toContain("'IDENTITY_INCOMPLETE'");
255
+ expect(wrapperScript).toContain("'CLEAN_EMPTY'");
256
+ expect(wrapperScript).toContain('scheduleTreePoll');
257
+ expect(wrapperScript).not.toContain('treeExitPoll = setInterval');
258
+ });
259
+ it('should force a stable C locale for Unix process identity probes', () => {
260
+ const invocation = buildPtyCommand(process.execPath, ['-e', 'process.exit(0)']);
261
+ const wrapperScript = invocation.args[1] ?? '';
262
+ expect(wrapperScript).toContain("probeEnv.LC_ALL = 'C'");
263
+ expect(wrapperScript).toContain("probeEnv.LANG = 'C'");
264
+ });
265
+ it.skipIf(process.platform === 'win32')('should keep the wrapper alive when a process probe returns an empty snapshot', async () => {
266
+ const directory = mkdtempSync(path.join(os.tmpdir(), 'agent-tower-empty-probe-'));
267
+ const fakePs = path.join(directory, 'ps');
268
+ writeFileSync(fakePs, '#!/bin/sh\nexit 0\n');
269
+ chmodSync(fakePs, 0o755);
270
+ const invocation = buildPtyCommand(process.execPath, ['-e', 'process.exit(0)']);
271
+ const wrapper = spawn(invocation.command, invocation.args, {
272
+ stdio: ['ignore', 'ignore', 'ignore'],
273
+ env: buildPtyWrapperEnv({
274
+ ...process.env,
275
+ PATH: `${directory}:${process.env.PATH ?? ''}`,
276
+ }, {}, randomUUID()),
277
+ });
278
+ try {
279
+ await new Promise((resolve) => setTimeout(resolve, 400));
280
+ expect(wrapper.exitCode).toBeNull();
281
+ }
282
+ finally {
283
+ wrapper.kill('SIGKILL');
284
+ await new Promise((resolve) => wrapper.once('exit', () => resolve()));
285
+ rmSync(directory, { recursive: true, force: true });
286
+ }
287
+ }, 5_000);
230
288
  it('should allow overriding the node-like runtime command', () => {
231
289
  const original = process.env.AGENT_TOWER_NODE_RUNTIME;
232
290
  process.env.AGENT_TOWER_NODE_RUNTIME = '/tmp/agent-tower-node-runtime';
@@ -302,21 +360,24 @@ describe('process-launch', () => {
302
360
  args: [],
303
361
  });
304
362
  });
305
- it.skipIf(process.platform === 'win32')('should kill grandchild processes when the wrapper receives a termination signal', async () => {
306
- // child 启动一个长睡眠孙进程后自己也保持运行
363
+ it.skipIf(process.platform === 'win32')('should hard-escalate the verified wrapper tree when the child ignores termination', async () => {
364
+ // The benign helper ignores graceful signals. The wrapper must retain
365
+ // ownership long enough to escalate its known process group, so an
366
+ // identity-failure cleanup cannot mistake wrapper exit for tree exit.
307
367
  const { wrapper, grandPid } = spawnWrapperWithGrandchild(`
308
368
  const { spawn } = require('node:child_process');
309
- const grand = spawn(process.execPath, ['-e', 'setTimeout(() => {}, 60000)'], { stdio: 'ignore' });
369
+ const grand = spawn(process.execPath, ['-e', "process.on('SIGINT',()=>{});process.on('SIGTERM',()=>{});setInterval(()=>{},60000)"], { stdio: 'ignore' });
310
370
  process.stdout.write('GRAND:' + grand.pid + '\\n');
371
+ process.on('SIGINT', () => {});
372
+ process.on('SIGTERM', () => {});
311
373
  setTimeout(() => {}, 60000);
312
374
  `);
313
375
  const pid = await grandPid;
314
376
  expect(isAlive(pid)).toBe(true);
315
- wrapper.kill('SIGTERM');
377
+ wrapper.kill('SIGINT');
316
378
  await new Promise((resolve) => wrapper.on('exit', resolve));
317
- // killTree 应通过进程组信号清掉孙进程,而不仅是直接 child
318
- expect(await waitUntil(() => !isAlive(pid), 3000)).toBe(true);
319
- });
379
+ expect(await waitUntil(() => !isAlive(pid), 8000)).toBe(true);
380
+ }, 15_000);
320
381
  it.skipIf(process.platform === 'win32')('should sweep leftover grandchildren after the child exits normally', async () => {
321
382
  // child 留下一个后台孙进程后立即正常退出
322
383
  const { wrapper, grandPid } = spawnWrapperWithGrandchild(`
@@ -330,5 +391,102 @@ describe('process-launch', () => {
330
391
  // exitWithChildResult 应在退出前对 child 进程组发 SIGHUP 清扫残留
331
392
  expect(await waitUntil(() => !isAlive(pid), 3000)).toBe(true);
332
393
  });
394
+ it.skipIf(process.platform === 'win32')('should discover and clean a detached descendant in a new process group', async () => {
395
+ const { wrapper, grandPid } = spawnWrapperWithGrandchild(`
396
+ const { spawn } = require('node:child_process');
397
+ const grand = spawn(process.execPath, ['-e', "process.on('SIGHUP',()=>{});setInterval(()=>{},60000)"], { stdio: 'ignore', detached: true });
398
+ grand.unref();
399
+ process.stdout.write('GRAND:' + grand.pid + '\\n');
400
+ `);
401
+ const pid = await grandPid;
402
+ await new Promise((resolve) => wrapper.on('exit', resolve));
403
+ expect(await waitUntil(() => !isAlive(pid), 8_000)).toBe(true);
404
+ }, 15_000);
405
+ it.skipIf(process.platform === 'win32')('should clean a descendant that does not inherit the ownership marker', async () => {
406
+ const { wrapper, grandPid } = spawnWrapperWithGrandchild(`
407
+ const { spawn } = require('node:child_process');
408
+ const childEnv = { ...process.env };
409
+ delete childEnv.AGENT_TOWER_PROCESS_IDENTITY;
410
+ const grand = spawn(process.execPath, ['-e', 'setInterval(() => {}, 60000)'], {
411
+ stdio: 'ignore',
412
+ env: childEnv,
413
+ });
414
+ process.stdout.write('GRAND:' + grand.pid + '\\n');
415
+ setTimeout(() => process.exit(0), 250);
416
+ `);
417
+ const pid = await grandPid;
418
+ await new Promise((resolve) => wrapper.on('exit', resolve));
419
+ expect(await waitUntil(() => !isAlive(pid), 3_000)).toBe(true);
420
+ }, 10_000);
421
+ it.skipIf(process.platform === 'win32')('should keep completion parent-owned and hide it from the child', async () => {
422
+ const channel = await createTreeCleanupChannel();
423
+ const invocation = buildPtyCommand(process.execPath, [
424
+ '-e',
425
+ "process.stdout.write(JSON.stringify({ channel: process.env.AGENT_TOWER_TREE_CLEANUP_CHANNEL ?? null, secret: process.env.AGENT_TOWER_TREE_CLEANUP_SECRET ?? null, legacy: process.env.AGENT_TOWER_TREE_CLEANUP_EVIDENCE ?? null }))",
426
+ ]);
427
+ const child = spawn(invocation.command, invocation.args, {
428
+ stdio: ['ignore', 'pipe', 'inherit'],
429
+ env: buildPtyWrapperEnv({ ...process.env }, {}, randomUUID(), channel.env),
430
+ });
431
+ let output = '';
432
+ child.stdout.on('data', (chunk) => { output += String(chunk); });
433
+ await new Promise((resolve, reject) => {
434
+ child.once('error', reject);
435
+ child.once('exit', () => resolve());
436
+ });
437
+ expect(JSON.parse(output)).toEqual({ channel: null, secret: null, legacy: null });
438
+ expect(channel.isCompleted()).toBe(false);
439
+ channel.markCompleted();
440
+ expect(channel.isCompleted()).toBe(true);
441
+ channel.close();
442
+ }, 10_000);
443
+ it.skipIf(process.platform === 'win32')('should fail closed on a transient ps probe failure and recover before cleanup', async () => {
444
+ const directory = mkdtempSync(path.join(os.tmpdir(), 'agent-tower-ps-probe-'));
445
+ const modeFile = path.join(directory, 'mode');
446
+ const fakePs = path.join(directory, 'ps');
447
+ writeFileSync(fakePs, '#!/bin/sh\nif test -f "$AGENT_TOWER_TEST_PS_MODE" && grep -q fail "$AGENT_TOWER_TEST_PS_MODE"; then exit 1; fi\nexec /bin/ps "$@"\n');
448
+ chmodSync(fakePs, 0o755);
449
+ writeFileSync(modeFile, 'ok');
450
+ const invocation = buildPtyCommand(process.execPath, [
451
+ '-e',
452
+ [
453
+ "const {spawn}=require('node:child_process');",
454
+ "const grand=spawn(process.execPath,['-e','process.on(\\'SIGHUP\\',()=>{});setInterval(()=>{},60000)'],{stdio:'ignore'});",
455
+ "process.stdout.write('GRAND:'+grand.pid+'\\n');",
456
+ 'setTimeout(() => process.exit(0), 250);',
457
+ ].join(''),
458
+ ]);
459
+ const wrapper = spawn(invocation.command, invocation.args, {
460
+ stdio: ['ignore', 'pipe', 'inherit'],
461
+ env: {
462
+ ...buildPtyWrapperEnv({ ...process.env }, {}, randomUUID()),
463
+ PATH: `${directory}:${process.env.PATH ?? ''}`,
464
+ AGENT_TOWER_TEST_PS_MODE: modeFile,
465
+ },
466
+ });
467
+ let output = '';
468
+ wrapper.stdout.on('data', (chunk) => { output += String(chunk); });
469
+ const grandPid = await new Promise((resolve, reject) => {
470
+ const timer = setTimeout(() => reject(new Error('timed out waiting for grandchild')), 5_000);
471
+ wrapper.stdout.on('data', () => {
472
+ const match = output.match(/GRAND:(\d+)/);
473
+ if (match) {
474
+ clearTimeout(timer);
475
+ resolve(Number(match[1]));
476
+ }
477
+ });
478
+ });
479
+ writeFileSync(modeFile, 'fail');
480
+ await new Promise((resolve) => setTimeout(resolve, 350));
481
+ expect(isAlive(wrapper.pid)).toBe(true);
482
+ expect(isAlive(grandPid)).toBe(true);
483
+ writeFileSync(modeFile, 'ok');
484
+ await new Promise((resolve, reject) => {
485
+ wrapper.once('error', reject);
486
+ wrapper.once('exit', () => resolve());
487
+ });
488
+ expect(await waitUntil(() => !isAlive(grandPid), 8_000)).toBe(true);
489
+ rmSync(directory, { recursive: true, force: true });
490
+ }, 20_000);
333
491
  });
334
492
  //# sourceMappingURL=process-launch.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-launch.test.js","sourceRoot":"","sources":["../../src/utils/process-launch.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process-launch.test.js","sourceRoot":"","sources":["../../src/utils/process-launch.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface SpawnedProcessIdentity {
2
+ processGroupId: string;
3
+ birthMarker: string;
4
+ ownershipToken: string;
5
+ }
6
+ export declare function captureSpawnedProcessIdentity(pid: number, ownershipToken: string, platform?: NodeJS.Platform): Promise<SpawnedProcessIdentity | null>;
7
+ //# sourceMappingURL=spawned-process-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawned-process-identity.d.ts","sourceRoot":"","sources":["../../src/utils/spawned-process-identity.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,EACtB,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CA8BxC"}
@@ -0,0 +1,36 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { createUnixProcessIdentityAdapter } from './unix-process-identity.js';
4
+ const execFileAsync = promisify(execFile);
5
+ export async function captureSpawnedProcessIdentity(pid, ownershipToken, platform = process.platform) {
6
+ if (platform !== 'win32') {
7
+ const identity = await createUnixProcessIdentityAdapter(platform).captureProcess(pid, ownershipToken);
8
+ return identity ? {
9
+ processGroupId: String(identity.pgid),
10
+ birthMarker: identity.birthIdentity,
11
+ ownershipToken,
12
+ } : null;
13
+ }
14
+ const script = [
15
+ `Get-CimInstance Win32_Process -Filter \"ProcessId = ${pid}\"`,
16
+ 'Select-Object -ExpandProperty CreationDate',
17
+ ].join(' | ');
18
+ try {
19
+ const { stdout } = await execFileAsync('powershell.exe', [
20
+ '-NoProfile',
21
+ '-NonInteractive',
22
+ '-Command',
23
+ script,
24
+ ], { encoding: 'utf8', windowsHide: true });
25
+ const birthMarker = stdout.trim();
26
+ return birthMarker ? {
27
+ processGroupId: String(pid),
28
+ birthMarker,
29
+ ownershipToken,
30
+ } : null;
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ //# sourceMappingURL=spawned-process-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawned-process-identity.js","sourceRoot":"","sources":["../../src/utils/spawned-process-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAE9E,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAQ1C,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,GAAW,EACX,cAAsB,EACtB,WAA4B,OAAO,CAAC,QAAQ;IAE5C,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,gCAAgC,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACtG,OAAO,QAAQ,CAAC,CAAC,CAAC;YAChB,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACrC,WAAW,EAAE,QAAQ,CAAC,aAAa;YACnC,cAAc;SACf,CAAC,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG;QACb,uDAAuD,GAAG,IAAI;QAC9D,4CAA4C;KAC7C,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,gBAAgB,EAAE;YACvD,YAAY;YACZ,iBAAiB;YACjB,UAAU;YACV,MAAM;SACP,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAClC,OAAO,WAAW,CAAC,CAAC,CAAC;YACnB,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC;YAC3B,WAAW;YACX,cAAc;SACf,CAAC,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Parent-owned cleanup completion latch.
3
+ *
4
+ * The previous implementation exposed a TCP endpoint and bearer secret in the
5
+ * wrapper environment. An Agent child can inspect its parent environment on
6
+ * Unix, so that was not an origin proof. Completion is now an in-process
7
+ * capability: only the parent launch owner receives `markCompleted`, and the
8
+ * wrapper has no completion material to inherit or echo.
9
+ */
10
+ export interface TreeCleanupChannel {
11
+ /** Deliberately empty: no completion endpoint, secret, or evidence path. */
12
+ readonly env: Record<string, string>;
13
+ isCompleted(): boolean;
14
+ markCompleted(): void;
15
+ close(): void;
16
+ }
17
+ export declare function createTreeCleanupChannel(): Promise<TreeCleanupChannel>;
18
+ //# sourceMappingURL=tree-cleanup-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-cleanup-channel.d.ts","sourceRoot":"","sources":["../../src/utils/tree-cleanup-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,WAAW,IAAI,OAAO,CAAC;IACvB,aAAa,IAAI,IAAI,CAAC;IACtB,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAa5E"}
@@ -0,0 +1,16 @@
1
+ export async function createTreeCleanupChannel() {
2
+ let completed = false;
3
+ let closed = false;
4
+ return {
5
+ env: {},
6
+ isCompleted: () => completed,
7
+ markCompleted: () => {
8
+ if (!closed)
9
+ completed = true;
10
+ },
11
+ close: () => {
12
+ closed = true;
13
+ },
14
+ };
15
+ }
16
+ //# sourceMappingURL=tree-cleanup-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-cleanup-channel.js","sourceRoot":"","sources":["../../src/utils/tree-cleanup-channel.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,OAAO;QACL,GAAG,EAAE,EAAE;QACP,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS;QAC5B,aAAa,EAAE,GAAG,EAAE;YAClB,IAAI,CAAC,MAAM;gBAAE,SAAS,GAAG,IAAI,CAAC;QAChC,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tree-cleanup-channel.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-cleanup-channel.test.d.ts","sourceRoot":"","sources":["../../src/utils/tree-cleanup-channel.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createTreeCleanupChannel } from './tree-cleanup-channel.js';
3
+ describe('tree cleanup completion channel', () => {
4
+ it('does not expose a discoverable or writable child capability', async () => {
5
+ const channel = await createTreeCleanupChannel();
6
+ expect(channel.isCompleted()).toBe(false);
7
+ expect(channel.env).toEqual({});
8
+ channel.markCompleted();
9
+ expect(channel.isCompleted()).toBe(true);
10
+ channel.close();
11
+ channel.markCompleted();
12
+ expect(channel.isCompleted()).toBe(true);
13
+ });
14
+ });
15
+ //# sourceMappingURL=tree-cleanup-channel.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-cleanup-channel.test.js","sourceRoot":"","sources":["../../src/utils/tree-cleanup-channel.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,OAAO,GAAG,MAAM,wBAAwB,EAAE,CAAC;QACjD,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,aAAa,EAAE,CAAC;QACxB,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,aAAa,EAAE,CAAC;QACxB,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,3 +1,5 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { readdir, readFile } from 'node:fs/promises';
1
3
  export declare const PROCESS_IDENTITY_ENV = "AGENT_TOWER_PROCESS_IDENTITY";
2
4
  export declare const PTY_WRAPPER_IDENTITY_SEED_ENV = "AGENT_TOWER_PTY_IDENTITY_SEED";
3
5
  export interface UnixProcessIdentity {
@@ -13,11 +15,21 @@ export interface UnixProcessGroupIdentity {
13
15
  export interface UnixProcessIdentityAdapter {
14
16
  captureProcess(pid: number, ownershipToken: string): Promise<UnixProcessIdentity | null>;
15
17
  captureDescendantGroups(root: UnixProcessIdentity): Promise<UnixProcessGroupIdentity[]>;
18
+ /**
19
+ * Capture all processes carrying an ownership token, including descendants
20
+ * that were re-parented after the launch root exited.
21
+ */
22
+ captureOwnedGroups?(ownershipToken: string, processGroupId?: number): Promise<UnixProcessGroupIdentity[]>;
16
23
  isProcessAlive(identity: UnixProcessIdentity): Promise<boolean>;
17
24
  isProcessGroupAlive(identity: UnixProcessGroupIdentity): Promise<boolean>;
18
25
  signalProcess(identity: UnixProcessIdentity, signal: NodeJS.Signals): Promise<boolean>;
19
26
  signalProcessGroup(identity: UnixProcessGroupIdentity, signal: NodeJS.Signals): Promise<boolean>;
20
27
  }
28
+ export interface UnixProcessIdentityAdapterDependencies {
29
+ execFile?: typeof execFile;
30
+ readFile?: typeof readFile;
31
+ readdir?: typeof readdir;
32
+ }
21
33
  export declare function unixProcessIdentityMatches(expected: UnixProcessIdentity, current: UnixProcessIdentity | null): boolean;
22
- export declare function createUnixProcessIdentityAdapter(platform?: NodeJS.Platform): UnixProcessIdentityAdapter;
34
+ export declare function createUnixProcessIdentityAdapter(platform?: NodeJS.Platform, dependencies?: UnixProcessIdentityAdapterDependencies): UnixProcessIdentityAdapter;
23
35
  //# sourceMappingURL=unix-process-identity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"unix-process-identity.d.ts","sourceRoot":"","sources":["../../src/utils/unix-process-identity.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,iCAAiC,CAAC;AACnE,eAAO,MAAM,6BAA6B,kCAAkC,CAAC;AAS7E,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,0BAA0B;IACzC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IACzF,uBAAuB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC;IACxF,cAAc,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE,mBAAmB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1E,aAAa,CAAC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvF,kBAAkB,CAAC,QAAQ,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClG;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,EAAE,mBAAmB,GAAG,IAAI,GAClC,OAAO,CAMT;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,0BAA0B,CAE5B"}
1
+ {"version":3,"file":"unix-process-identity.d.ts","sourceRoot":"","sources":["../../src/utils/unix-process-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAErD,eAAO,MAAM,oBAAoB,iCAAiC,CAAC;AACnE,eAAO,MAAM,6BAA6B,kCAAkC,CAAC;AAU7E,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,0BAA0B;IACzC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IACzF,uBAAuB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC;IACxF;;;OAGG;IACH,kBAAkB,CAAC,CACjB,cAAc,EAAE,MAAM,EACtB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC;IACvC,cAAc,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE,mBAAmB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1E,aAAa,CAAC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvF,kBAAkB,CAAC,QAAQ,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClG;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,OAAO,CAAC;CAC1B;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,EAAE,mBAAmB,GAAG,IAAI,GAClC,OAAO,CAMT;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,YAAY,GAAE,sCAA2C,GACxD,0BAA0B,CAM5B"}