aws-runtime-bridge 1.9.79 → 1.9.80

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 (596) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +0 -1
  2. package/dist/adapter/AcodeSdkAdapter.js +11 -1986
  3. package/dist/adapter/AdapterRegistry.d.ts +0 -1
  4. package/dist/adapter/AdapterRegistry.js +2 -100
  5. package/dist/adapter/ClaudeSdkAdapter.d.ts +0 -1
  6. package/dist/adapter/ClaudeSdkAdapter.js +4 -1300
  7. package/dist/adapter/CodexSdkAdapter.d.ts +0 -1
  8. package/dist/adapter/CodexSdkAdapter.js +4 -836
  9. package/dist/adapter/OpencodeSdkAdapter.d.ts +0 -1
  10. package/dist/adapter/OpencodeSdkAdapter.js +4 -879
  11. package/dist/adapter/SdkProviderSpi.d.ts +0 -1
  12. package/dist/adapter/SdkProviderSpi.js +2 -55
  13. package/dist/adapter/acode-tool-names.d.ts +0 -1
  14. package/dist/adapter/acode-tool-names.js +2 -37
  15. package/dist/adapter/idle-poll-loop.d.ts +0 -1
  16. package/dist/adapter/idle-poll-loop.js +2 -59
  17. package/dist/adapter/index.d.ts +0 -1
  18. package/dist/adapter/index.js +2 -11
  19. package/dist/adapter/instance-ai-config-resolver.d.ts +0 -1
  20. package/dist/adapter/instance-ai-config-resolver.js +2 -46
  21. package/dist/adapter/types.d.ts +0 -1
  22. package/dist/adapter/types.js +2 -443
  23. package/dist/adapters/cc-switch/common.d.ts +0 -1
  24. package/dist/adapters/cc-switch/common.js +2 -61
  25. package/dist/adapters/cc-switch/index.d.ts +0 -1
  26. package/dist/adapters/cc-switch/index.js +2 -57
  27. package/dist/adapters/cc-switch/mcp-acode.d.ts +0 -1
  28. package/dist/adapters/cc-switch/mcp-acode.js +2 -71
  29. package/dist/adapters/cc-switch/mcp-claude.d.ts +0 -1
  30. package/dist/adapters/cc-switch/mcp-claude.js +2 -89
  31. package/dist/adapters/cc-switch/mcp-claudecode.d.ts +0 -1
  32. package/dist/adapters/cc-switch/mcp-claudecode.js +2 -77
  33. package/dist/adapters/cc-switch/mcp-codex.d.ts +0 -1
  34. package/dist/adapters/cc-switch/mcp-codex.js +11 -249
  35. package/dist/adapters/cc-switch/mcp-opencode.d.ts +0 -1
  36. package/dist/adapters/cc-switch/mcp-opencode.js +2 -97
  37. package/dist/adapters/cc-switch/mcp-placeholder.d.ts +0 -1
  38. package/dist/adapters/cc-switch/mcp-placeholder.js +2 -19
  39. package/dist/adapters/cc-switch/skill-acode.d.ts +0 -1
  40. package/dist/adapters/cc-switch/skill-acode.js +2 -12
  41. package/dist/adapters/cc-switch/skill-claude.d.ts +0 -1
  42. package/dist/adapters/cc-switch/skill-claude.js +2 -11
  43. package/dist/adapters/cc-switch/skill-claudecode.d.ts +0 -1
  44. package/dist/adapters/cc-switch/skill-claudecode.js +2 -11
  45. package/dist/adapters/cc-switch/skill-codex.d.ts +0 -1
  46. package/dist/adapters/cc-switch/skill-codex.js +2 -6
  47. package/dist/adapters/cc-switch/skill-directory.d.ts +0 -1
  48. package/dist/adapters/cc-switch/skill-directory.js +3 -137
  49. package/dist/adapters/cc-switch/skill-opencode.d.ts +0 -1
  50. package/dist/adapters/cc-switch/skill-opencode.js +2 -11
  51. package/dist/adapters/cc-switch/skill-placeholder.d.ts +0 -1
  52. package/dist/adapters/cc-switch/skill-placeholder.js +2 -19
  53. package/dist/config.d.ts +0 -1
  54. package/dist/config.js +2 -290
  55. package/dist/index.d.ts +0 -1
  56. package/dist/index.js +2 -573
  57. package/dist/middleware/auth.d.ts +0 -1
  58. package/dist/middleware/auth.js +2 -98
  59. package/dist/routes/acode-todos.d.ts +0 -1
  60. package/dist/routes/acode-todos.js +2 -75
  61. package/dist/routes/ai-sources.d.ts +0 -1
  62. package/dist/routes/ai-sources.js +2 -132
  63. package/dist/routes/dashboard.d.ts +0 -1
  64. package/dist/routes/dashboard.js +182 -649
  65. package/dist/routes/events.d.ts +0 -1
  66. package/dist/routes/events.js +2 -22
  67. package/dist/routes/file-browser.d.ts +0 -1
  68. package/dist/routes/file-browser.js +2 -781
  69. package/dist/routes/file-diff-rollback.d.ts +0 -1
  70. package/dist/routes/file-diff-rollback.js +2 -301
  71. package/dist/routes/file-snapshot.d.ts +0 -1
  72. package/dist/routes/file-snapshot.js +2 -156
  73. package/dist/routes/git.d.ts +0 -1
  74. package/dist/routes/git.js +28 -1900
  75. package/dist/routes/instance.d.ts +0 -1
  76. package/dist/routes/instance.js +3 -748
  77. package/dist/routes/mcp.d.ts +0 -1
  78. package/dist/routes/mcp.js +2 -196
  79. package/dist/routes/processes.d.ts +0 -1
  80. package/dist/routes/processes.js +2 -252
  81. package/dist/routes/properties.d.ts +0 -1
  82. package/dist/routes/properties.js +2 -72
  83. package/dist/routes/pty.d.ts +0 -1
  84. package/dist/routes/pty.js +6 -560
  85. package/dist/routes/runtime-binding.d.ts +0 -1
  86. package/dist/routes/runtime-binding.js +2 -263
  87. package/dist/routes/sessions.d.ts +0 -1
  88. package/dist/routes/sessions.js +2 -758
  89. package/dist/routes/skills.d.ts +0 -1
  90. package/dist/routes/skills.js +2 -187
  91. package/dist/routes/sub-agents.d.ts +0 -1
  92. package/dist/routes/sub-agents.js +20 -279
  93. package/dist/routes/system-metrics.d.ts +0 -1
  94. package/dist/routes/system-metrics.js +2 -20
  95. package/dist/routes/task-context.d.ts +0 -1
  96. package/dist/routes/task-context.js +2 -78
  97. package/dist/routes/terminal.d.ts +0 -1
  98. package/dist/routes/terminal.js +54 -2882
  99. package/dist/routes/yml.d.ts +0 -1
  100. package/dist/routes/yml.js +2 -223
  101. package/dist/services/acode-package.d.ts +0 -1
  102. package/dist/services/acode-package.js +2 -111
  103. package/dist/services/agent-event-store.d.ts +0 -1
  104. package/dist/services/agent-event-store.js +2 -81
  105. package/dist/services/agent-process-manager.d.ts +0 -1
  106. package/dist/services/agent-process-manager.js +2 -796
  107. package/dist/services/ai-source-apply.d.ts +0 -1
  108. package/dist/services/ai-source-apply.js +2 -83
  109. package/dist/services/auto-register.d.ts +0 -1
  110. package/dist/services/auto-register.js +2 -1053
  111. package/dist/services/aws-client-agent-mcp.d.ts +0 -1
  112. package/dist/services/aws-client-agent-mcp.js +3 -337
  113. package/dist/services/bridge-package-publish-hooks.d.ts +0 -1
  114. package/dist/services/bridge-package-publish-hooks.js +2 -115
  115. package/dist/services/cc-switch-sdk.d.ts +0 -1
  116. package/dist/services/cc-switch-sdk.js +2 -135
  117. package/dist/services/cli-commands.d.ts +6 -1
  118. package/dist/services/cli-commands.js +6 -645
  119. package/dist/services/event-delta-pusher.d.ts +0 -1
  120. package/dist/services/event-delta-pusher.js +2 -95
  121. package/dist/services/fileSnapshotStore.d.ts +0 -1
  122. package/dist/services/fileSnapshotStore.js +2 -500
  123. package/dist/services/instance-ai-config-service.d.ts +0 -1
  124. package/dist/services/instance-ai-config-service.js +2 -174
  125. package/dist/services/instance-init-service.d.ts +0 -1
  126. package/dist/services/instance-init-service.js +2 -193
  127. package/dist/services/instance-service.d.ts +0 -1
  128. package/dist/services/instance-service.js +2 -237
  129. package/dist/services/instance-state.d.ts +0 -1
  130. package/dist/services/instance-state.js +2 -94
  131. package/dist/services/legacy-path-migration.d.ts +0 -1
  132. package/dist/services/legacy-path-migration.js +2 -66
  133. package/dist/services/lifecycle-state.d.ts +0 -1
  134. package/dist/services/lifecycle-state.js +3 -110
  135. package/dist/services/mcp-launch-binding-queue.d.ts +0 -1
  136. package/dist/services/mcp-launch-binding-queue.js +2 -175
  137. package/dist/services/orphan-monitor.d.ts +0 -1
  138. package/dist/services/orphan-monitor.js +2 -382
  139. package/dist/services/panel-auth.d.ts +0 -1
  140. package/dist/services/panel-auth.js +2 -168
  141. package/dist/services/process-detector.d.ts +0 -1
  142. package/dist/services/process-detector.js +18 -1019
  143. package/dist/services/process-registry.d.ts +0 -1
  144. package/dist/services/process-registry.js +2 -375
  145. package/dist/services/ring-buffer.d.ts +0 -1
  146. package/dist/services/ring-buffer.js +2 -103
  147. package/dist/services/runtime-binding.d.ts +0 -1
  148. package/dist/services/runtime-binding.js +6 -363
  149. package/dist/services/runtime-lifecycle-policy.d.ts +0 -1
  150. package/dist/services/runtime-lifecycle-policy.js +2 -35
  151. package/dist/services/session-output.d.ts +0 -1
  152. package/dist/services/session-output.js +5 -539
  153. package/dist/services/startup-config-wizard.d.ts +0 -1
  154. package/dist/services/startup-config-wizard.js +14 -258
  155. package/dist/services/sub-agent-manager-instance.d.ts +0 -1
  156. package/dist/services/sub-agent-manager-instance.js +2 -12
  157. package/dist/services/system-metrics.d.ts +0 -1
  158. package/dist/services/system-metrics.js +2 -252
  159. package/dist/services/terminal-persistence.d.ts +0 -1
  160. package/dist/services/terminal-persistence.js +2 -176
  161. package/dist/services/tool-installer.d.ts +0 -1
  162. package/dist/services/tool-installer.js +5 -751
  163. package/dist/services/tunnel-client.d.ts +0 -1
  164. package/dist/services/tunnel-client.js +2 -402
  165. package/dist/services/windows-service-manager.d.ts +3 -3
  166. package/dist/services/windows-service-manager.js +2 -59
  167. package/dist/services/workspace-files.d.ts +0 -1
  168. package/dist/services/workspace-files.js +2 -1275
  169. package/dist/services/workspace-watch.d.ts +0 -1
  170. package/dist/services/workspace-watch.js +2 -123
  171. package/dist/services/workspaceTaskChangeWatcher.d.ts +0 -1
  172. package/dist/services/workspaceTaskChangeWatcher.js +2 -483
  173. package/dist/types.d.ts +0 -1
  174. package/dist/types.js +1 -1
  175. package/dist/utils/file-utils.d.ts +0 -1
  176. package/dist/utils/file-utils.js +3 -208
  177. package/dist/utils/instance-ai-config-debug-logger.d.ts +0 -1
  178. package/dist/utils/instance-ai-config-debug-logger.js +4 -63
  179. package/dist/utils/logger.d.ts +0 -1
  180. package/dist/utils/logger.js +2 -154
  181. package/dist/utils/mcp-utils.d.ts +0 -1
  182. package/dist/utils/mcp-utils.js +2 -187
  183. package/dist/utils/path-utils.d.ts +0 -1
  184. package/dist/utils/path-utils.js +2 -44
  185. package/dist/utils/sdk-package-loader.d.ts +0 -1
  186. package/dist/utils/sdk-package-loader.js +2 -78
  187. package/dist/utils/validation.d.ts +0 -1
  188. package/dist/utils/validation.js +2 -53
  189. package/dist/utils/yaml-utils.d.ts +0 -1
  190. package/dist/utils/yaml-utils.js +2 -312
  191. package/node_modules/@cc-switch/sdk/dist/constants.d.ts +0 -1
  192. package/node_modules/@cc-switch/sdk/dist/constants.js +2 -63
  193. package/node_modules/@cc-switch/sdk/dist/errors.d.ts +0 -1
  194. package/node_modules/@cc-switch/sdk/dist/errors.js +2 -8
  195. package/node_modules/@cc-switch/sdk/dist/index.d.ts +0 -1
  196. package/node_modules/@cc-switch/sdk/dist/index.js +2 -9
  197. package/node_modules/@cc-switch/sdk/dist/schemas.d.ts +0 -1
  198. package/node_modules/@cc-switch/sdk/dist/schemas.js +2 -38
  199. package/node_modules/@cc-switch/sdk/dist/sdk.d.ts +0 -1
  200. package/node_modules/@cc-switch/sdk/dist/sdk.js +2 -470
  201. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts +0 -1
  202. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.js +4 -307
  203. package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts +0 -1
  204. package/node_modules/@cc-switch/sdk/dist/services/mcp-model.js +2 -37
  205. package/node_modules/@cc-switch/sdk/dist/services/mcp-service.d.ts +0 -1
  206. package/node_modules/@cc-switch/sdk/dist/services/mcp-service.js +2 -9
  207. package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts +0 -1
  208. package/node_modules/@cc-switch/sdk/dist/services/skill-model.js +2 -41
  209. package/node_modules/@cc-switch/sdk/dist/services/skill-service.d.ts +0 -1
  210. package/node_modules/@cc-switch/sdk/dist/services/skill-service.js +2 -9
  211. package/node_modules/@cc-switch/sdk/dist/state.d.ts +0 -1
  212. package/node_modules/@cc-switch/sdk/dist/state.js +2 -19
  213. package/node_modules/@cc-switch/sdk/dist/types.d.ts +0 -1
  214. package/node_modules/@cc-switch/sdk/dist/types.js +1 -1
  215. package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts +0 -1
  216. package/node_modules/@cc-switch/sdk/dist/utils/fs.js +3 -114
  217. package/node_modules/@cc-switch/sdk/dist/utils/id.d.ts +0 -1
  218. package/node_modules/@cc-switch/sdk/dist/utils/id.js +2 -12
  219. package/node_modules/@cc-switch/sdk/package.json +1 -1
  220. package/package/acode/dist/ask-user-question-tool.d.ts +0 -1
  221. package/package/acode/dist/ask-user-question-tool.js +4 -233
  222. package/package/acode/dist/built-in-file-tools.d.ts +0 -1
  223. package/package/acode/dist/built-in-file-tools.js +4 -966
  224. package/package/acode/dist/built-in-symbols-tool.d.ts +0 -1
  225. package/package/acode/dist/built-in-symbols-tool.js +2 -117
  226. package/package/acode/dist/builtins/commandArtifacts.d.ts +0 -1
  227. package/package/acode/dist/builtins/commandArtifacts.js +9 -97
  228. package/package/acode/dist/builtins/commandOutputEvents.d.ts +0 -1
  229. package/package/acode/dist/builtins/commandOutputEvents.js +2 -56
  230. package/package/acode/dist/builtins/shellCommandPreparation.d.ts +0 -1
  231. package/package/acode/dist/builtins/shellCommandPreparation.js +5 -44
  232. package/package/acode/dist/builtins/shellCommandResult.d.ts +0 -1
  233. package/package/acode/dist/builtins/shellCommandResult.js +2 -71
  234. package/package/acode/dist/builtins/shellCommandRunner.d.ts +0 -1
  235. package/package/acode/dist/builtins/shellCommandRunner.js +2 -115
  236. package/package/acode/dist/builtins/shellOutputDecoder.d.ts +0 -1
  237. package/package/acode/dist/builtins/shellOutputDecoder.js +2 -94
  238. package/package/acode/dist/cli.d.ts +0 -1
  239. package/package/acode/dist/cli.js +4 -38
  240. package/package/acode/dist/commands/commandLoader.d.ts +0 -1
  241. package/package/acode/dist/commands/commandLoader.js +2 -33
  242. package/package/acode/dist/commands/commandParser.d.ts +0 -1
  243. package/package/acode/dist/commands/commandParser.js +3 -77
  244. package/package/acode/dist/commands/commandRegistry.d.ts +0 -1
  245. package/package/acode/dist/commands/commandRegistry.js +2 -30
  246. package/package/acode/dist/compaction.d.ts +0 -1
  247. package/package/acode/dist/compaction.js +7 -919
  248. package/package/acode/dist/config.d.ts +0 -1
  249. package/package/acode/dist/config.js +5 -105
  250. package/package/acode/dist/fs-utils.d.ts +0 -1
  251. package/package/acode/dist/fs-utils.js +2 -79
  252. package/package/acode/dist/hooks/hookBus.d.ts +0 -1
  253. package/package/acode/dist/hooks/hookBus.js +2 -40
  254. package/package/acode/dist/index.d.ts +0 -1
  255. package/package/acode/dist/index.js +2 -19
  256. package/package/acode/dist/mcpToolNames.d.ts +0 -1
  257. package/package/acode/dist/mcpToolNames.js +2 -17
  258. package/package/acode/dist/parsers/ast-cache.d.ts +0 -1
  259. package/package/acode/dist/parsers/ast-cache.js +2 -76
  260. package/package/acode/dist/parsers/language-detector.d.ts +0 -1
  261. package/package/acode/dist/parsers/language-detector.js +2 -44
  262. package/package/acode/dist/parsers/language-queries.d.ts +0 -1
  263. package/package/acode/dist/parsers/language-queries.js +12 -602
  264. package/package/acode/dist/parsers/symbol-extractor.d.ts +0 -1
  265. package/package/acode/dist/parsers/symbol-extractor.js +3 -164
  266. package/package/acode/dist/parsers/tree-sitter-loader.d.ts +0 -1
  267. package/package/acode/dist/parsers/tree-sitter-loader.js +2 -64
  268. package/package/acode/dist/parsers/types.d.ts +0 -1
  269. package/package/acode/dist/parsers/types.js +1 -7
  270. package/package/acode/dist/runtime.d.ts +0 -1
  271. package/package/acode/dist/runtime.js +86 -3771
  272. package/package/acode/dist/skill-tool.d.ts +0 -1
  273. package/package/acode/dist/skill-tool.js +5 -174
  274. package/package/acode/dist/sub-agent-manager.d.ts +0 -1
  275. package/package/acode/dist/sub-agent-manager.js +2 -1159
  276. package/package/acode/dist/sub-agent-store.d.ts +0 -1
  277. package/package/acode/dist/sub-agent-store.js +4 -236
  278. package/package/acode/dist/sub-agent-tools.d.ts +0 -1
  279. package/package/acode/dist/sub-agent-tools.js +15 -369
  280. package/package/acode/dist/sub-agent-types.d.ts +0 -1
  281. package/package/acode/dist/sub-agent-types.js +1 -8
  282. package/package/acode/dist/todo-store.d.ts +0 -1
  283. package/package/acode/dist/todo-store.js +2 -73
  284. package/package/acode/dist/todo-tool.d.ts +0 -1
  285. package/package/acode/dist/todo-tool.js +5 -121
  286. package/package/acode/dist/types.d.ts +0 -1
  287. package/package/acode/dist/types.js +1 -1
  288. package/package/acode/package.json +2 -2
  289. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +0 -1
  290. package/package/aws-client-agent-mcp/dist/agent-client.js +2 -890
  291. package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts +0 -1
  292. package/package/aws-client-agent-mcp/dist/agent-client.test.js +0 -1
  293. package/package/aws-client-agent-mcp/dist/config.d.ts +0 -1
  294. package/package/aws-client-agent-mcp/dist/config.js +2 -243
  295. package/package/aws-client-agent-mcp/dist/config.test.d.ts +0 -1
  296. package/package/aws-client-agent-mcp/dist/config.test.js +0 -1
  297. package/package/aws-client-agent-mcp/dist/constants.d.ts +0 -1
  298. package/package/aws-client-agent-mcp/dist/constants.js +2 -24
  299. package/package/aws-client-agent-mcp/dist/context-manager.d.ts +0 -1
  300. package/package/aws-client-agent-mcp/dist/context-manager.js +2 -477
  301. package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +0 -1
  302. package/package/aws-client-agent-mcp/dist/context-manager.test.js +0 -1
  303. package/package/aws-client-agent-mcp/dist/http-client.d.ts +0 -1
  304. package/package/aws-client-agent-mcp/dist/http-client.js +2 -446
  305. package/package/aws-client-agent-mcp/dist/http-client.test.d.ts +0 -1
  306. package/package/aws-client-agent-mcp/dist/http-client.test.js +0 -1
  307. package/package/aws-client-agent-mcp/dist/index.d.ts +0 -1
  308. package/package/aws-client-agent-mcp/dist/index.js +2 -34
  309. package/package/aws-client-agent-mcp/dist/logger.d.ts +0 -1
  310. package/package/aws-client-agent-mcp/dist/logger.js +3 -178
  311. package/package/aws-client-agent-mcp/dist/logger.test.d.ts +0 -1
  312. package/package/aws-client-agent-mcp/dist/logger.test.js +0 -1
  313. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +0 -1
  314. package/package/aws-client-agent-mcp/dist/mcp-server.js +38 -2709
  315. package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts +0 -1
  316. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +0 -1
  317. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +0 -1
  318. package/package/aws-client-agent-mcp/dist/mcp-tools.js +22 -562
  319. package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts +0 -1
  320. package/package/aws-client-agent-mcp/dist/mcp-tools.test.js +0 -1
  321. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +0 -1
  322. package/package/aws-client-agent-mcp/dist/memory-store.js +4 -826
  323. package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts +0 -1
  324. package/package/aws-client-agent-mcp/dist/memory-store.test.js +0 -1
  325. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +0 -1
  326. package/package/aws-client-agent-mcp/dist/memory-tools.js +31 -294
  327. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +0 -1
  328. package/package/aws-client-agent-mcp/dist/message-buffer.js +2 -288
  329. package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts +0 -1
  330. package/package/aws-client-agent-mcp/dist/message-buffer.test.js +0 -1
  331. package/package/aws-client-agent-mcp/dist/messageContent.d.ts +0 -1
  332. package/package/aws-client-agent-mcp/dist/messageContent.js +2 -125
  333. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts +0 -1
  334. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js +2 -103
  335. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts +0 -1
  336. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js +0 -1
  337. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +0 -1
  338. package/package/aws-client-agent-mcp/dist/server-memory-store.js +2 -96
  339. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +0 -1
  340. package/package/aws-client-agent-mcp/dist/status-reporter.js +3 -327
  341. package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts +0 -1
  342. package/package/aws-client-agent-mcp/dist/status-reporter.test.js +0 -1
  343. package/package/aws-client-agent-mcp/dist/types.d.ts +0 -1
  344. package/package/aws-client-agent-mcp/dist/types.js +2 -9
  345. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +0 -1
  346. package/package/aws-client-agent-mcp/dist/websocket-client.js +2 -677
  347. package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts +0 -1
  348. package/package/aws-client-agent-mcp/dist/websocket-client.test.js +0 -1
  349. package/package/aws-client-agent-mcp/package.json +1 -1
  350. package/package/cc-switch-sdk/dist/constants.d.ts +0 -1
  351. package/package/cc-switch-sdk/dist/constants.js +2 -63
  352. package/package/cc-switch-sdk/dist/errors.d.ts +0 -1
  353. package/package/cc-switch-sdk/dist/errors.js +2 -8
  354. package/package/cc-switch-sdk/dist/index.d.ts +0 -1
  355. package/package/cc-switch-sdk/dist/index.js +2 -9
  356. package/package/cc-switch-sdk/dist/schemas.d.ts +0 -1
  357. package/package/cc-switch-sdk/dist/schemas.js +2 -38
  358. package/package/cc-switch-sdk/dist/sdk.d.ts +0 -1
  359. package/package/cc-switch-sdk/dist/sdk.js +2 -470
  360. package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts +0 -1
  361. package/package/cc-switch-sdk/dist/services/ai-config-service.js +4 -307
  362. package/package/cc-switch-sdk/dist/services/mcp-model.d.ts +0 -1
  363. package/package/cc-switch-sdk/dist/services/mcp-model.js +2 -37
  364. package/package/cc-switch-sdk/dist/services/mcp-service.d.ts +0 -1
  365. package/package/cc-switch-sdk/dist/services/mcp-service.js +2 -9
  366. package/package/cc-switch-sdk/dist/services/skill-model.d.ts +0 -1
  367. package/package/cc-switch-sdk/dist/services/skill-model.js +2 -41
  368. package/package/cc-switch-sdk/dist/services/skill-service.d.ts +0 -1
  369. package/package/cc-switch-sdk/dist/services/skill-service.js +2 -9
  370. package/package/cc-switch-sdk/dist/state.d.ts +0 -1
  371. package/package/cc-switch-sdk/dist/state.js +2 -19
  372. package/package/cc-switch-sdk/dist/types.d.ts +0 -1
  373. package/package/cc-switch-sdk/dist/types.js +1 -1
  374. package/package/cc-switch-sdk/dist/utils/fs.d.ts +0 -1
  375. package/package/cc-switch-sdk/dist/utils/fs.js +3 -114
  376. package/package/cc-switch-sdk/dist/utils/id.d.ts +0 -1
  377. package/package/cc-switch-sdk/dist/utils/id.js +2 -12
  378. package/package/cc-switch-sdk/package.json +1 -1
  379. package/package.json +4 -2
  380. package/dist/adapter/AcodeSdkAdapter.d.ts.map +0 -1
  381. package/dist/adapter/AdapterRegistry.d.ts.map +0 -1
  382. package/dist/adapter/ClaudeSdkAdapter.d.ts.map +0 -1
  383. package/dist/adapter/CodexSdkAdapter.d.ts.map +0 -1
  384. package/dist/adapter/OpencodeSdkAdapter.d.ts.map +0 -1
  385. package/dist/adapter/SdkProviderSpi.d.ts.map +0 -1
  386. package/dist/adapter/acode-tool-names.d.ts.map +0 -1
  387. package/dist/adapter/idle-poll-loop.d.ts.map +0 -1
  388. package/dist/adapter/index.d.ts.map +0 -1
  389. package/dist/adapter/instance-ai-config-resolver.d.ts.map +0 -1
  390. package/dist/adapter/types.d.ts.map +0 -1
  391. package/dist/adapters/cc-switch/common.d.ts.map +0 -1
  392. package/dist/adapters/cc-switch/index.d.ts.map +0 -1
  393. package/dist/adapters/cc-switch/mcp-acode.d.ts.map +0 -1
  394. package/dist/adapters/cc-switch/mcp-claude.d.ts.map +0 -1
  395. package/dist/adapters/cc-switch/mcp-claudecode.d.ts.map +0 -1
  396. package/dist/adapters/cc-switch/mcp-codex.d.ts.map +0 -1
  397. package/dist/adapters/cc-switch/mcp-opencode.d.ts.map +0 -1
  398. package/dist/adapters/cc-switch/mcp-placeholder.d.ts.map +0 -1
  399. package/dist/adapters/cc-switch/skill-acode.d.ts.map +0 -1
  400. package/dist/adapters/cc-switch/skill-claude.d.ts.map +0 -1
  401. package/dist/adapters/cc-switch/skill-claudecode.d.ts.map +0 -1
  402. package/dist/adapters/cc-switch/skill-codex.d.ts.map +0 -1
  403. package/dist/adapters/cc-switch/skill-directory.d.ts.map +0 -1
  404. package/dist/adapters/cc-switch/skill-opencode.d.ts.map +0 -1
  405. package/dist/adapters/cc-switch/skill-placeholder.d.ts.map +0 -1
  406. package/dist/config.d.ts.map +0 -1
  407. package/dist/index.d.ts.map +0 -1
  408. package/dist/middleware/auth.d.ts.map +0 -1
  409. package/dist/routes/acode-todos.d.ts.map +0 -1
  410. package/dist/routes/ai-sources.d.ts.map +0 -1
  411. package/dist/routes/dashboard.d.ts.map +0 -1
  412. package/dist/routes/events.d.ts.map +0 -1
  413. package/dist/routes/file-browser.d.ts.map +0 -1
  414. package/dist/routes/file-diff-rollback.d.ts.map +0 -1
  415. package/dist/routes/file-snapshot.d.ts.map +0 -1
  416. package/dist/routes/git.d.ts.map +0 -1
  417. package/dist/routes/instance.d.ts.map +0 -1
  418. package/dist/routes/mcp.d.ts.map +0 -1
  419. package/dist/routes/processes.d.ts.map +0 -1
  420. package/dist/routes/properties.d.ts.map +0 -1
  421. package/dist/routes/pty.d.ts.map +0 -1
  422. package/dist/routes/runtime-binding.d.ts.map +0 -1
  423. package/dist/routes/sessions.d.ts.map +0 -1
  424. package/dist/routes/skills.d.ts.map +0 -1
  425. package/dist/routes/sub-agents.d.ts.map +0 -1
  426. package/dist/routes/system-metrics.d.ts.map +0 -1
  427. package/dist/routes/task-context.d.ts.map +0 -1
  428. package/dist/routes/terminal.d.ts.map +0 -1
  429. package/dist/routes/yml.d.ts.map +0 -1
  430. package/dist/services/acode-package.d.ts.map +0 -1
  431. package/dist/services/agent-event-store.d.ts.map +0 -1
  432. package/dist/services/agent-process-manager.d.ts.map +0 -1
  433. package/dist/services/ai-source-apply.d.ts.map +0 -1
  434. package/dist/services/auto-register.d.ts.map +0 -1
  435. package/dist/services/aws-client-agent-mcp.d.ts.map +0 -1
  436. package/dist/services/bridge-package-publish-hooks.d.ts.map +0 -1
  437. package/dist/services/cc-switch-sdk.d.ts.map +0 -1
  438. package/dist/services/cli-commands.d.ts.map +0 -1
  439. package/dist/services/event-delta-pusher.d.ts.map +0 -1
  440. package/dist/services/fileSnapshotStore.d.ts.map +0 -1
  441. package/dist/services/instance-ai-config-service.d.ts.map +0 -1
  442. package/dist/services/instance-init-service.d.ts.map +0 -1
  443. package/dist/services/instance-service.d.ts.map +0 -1
  444. package/dist/services/instance-state.d.ts.map +0 -1
  445. package/dist/services/legacy-path-migration.d.ts.map +0 -1
  446. package/dist/services/lifecycle-state.d.ts.map +0 -1
  447. package/dist/services/mcp-launch-binding-queue.d.ts.map +0 -1
  448. package/dist/services/orphan-monitor.d.ts.map +0 -1
  449. package/dist/services/panel-auth.d.ts.map +0 -1
  450. package/dist/services/process-detector.d.ts.map +0 -1
  451. package/dist/services/process-registry.d.ts.map +0 -1
  452. package/dist/services/ring-buffer.d.ts.map +0 -1
  453. package/dist/services/runtime-binding.d.ts.map +0 -1
  454. package/dist/services/runtime-lifecycle-policy.d.ts.map +0 -1
  455. package/dist/services/session-output.d.ts.map +0 -1
  456. package/dist/services/startup-config-wizard.d.ts.map +0 -1
  457. package/dist/services/sub-agent-manager-instance.d.ts.map +0 -1
  458. package/dist/services/system-metrics.d.ts.map +0 -1
  459. package/dist/services/terminal-persistence.d.ts.map +0 -1
  460. package/dist/services/tool-installer.d.ts.map +0 -1
  461. package/dist/services/tunnel-client.d.ts.map +0 -1
  462. package/dist/services/windows-service-manager.d.ts.map +0 -1
  463. package/dist/services/workspace-files.d.ts.map +0 -1
  464. package/dist/services/workspace-watch.d.ts.map +0 -1
  465. package/dist/services/workspaceTaskChangeWatcher.d.ts.map +0 -1
  466. package/dist/types.d.ts.map +0 -1
  467. package/dist/utils/file-utils.d.ts.map +0 -1
  468. package/dist/utils/instance-ai-config-debug-logger.d.ts.map +0 -1
  469. package/dist/utils/logger.d.ts.map +0 -1
  470. package/dist/utils/mcp-utils.d.ts.map +0 -1
  471. package/dist/utils/path-utils.d.ts.map +0 -1
  472. package/dist/utils/sdk-package-loader.d.ts.map +0 -1
  473. package/dist/utils/validation.d.ts.map +0 -1
  474. package/dist/utils/yaml-utils.d.ts.map +0 -1
  475. package/node_modules/@cc-switch/sdk/dist/constants.d.ts.map +0 -1
  476. package/node_modules/@cc-switch/sdk/dist/errors.d.ts.map +0 -1
  477. package/node_modules/@cc-switch/sdk/dist/index.d.ts.map +0 -1
  478. package/node_modules/@cc-switch/sdk/dist/schemas.d.ts.map +0 -1
  479. package/node_modules/@cc-switch/sdk/dist/sdk.d.ts.map +0 -1
  480. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts.map +0 -1
  481. package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts.map +0 -1
  482. package/node_modules/@cc-switch/sdk/dist/services/mcp-service.d.ts.map +0 -1
  483. package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts.map +0 -1
  484. package/node_modules/@cc-switch/sdk/dist/services/skill-service.d.ts.map +0 -1
  485. package/node_modules/@cc-switch/sdk/dist/state.d.ts.map +0 -1
  486. package/node_modules/@cc-switch/sdk/dist/types.d.ts.map +0 -1
  487. package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts.map +0 -1
  488. package/node_modules/@cc-switch/sdk/dist/utils/id.d.ts.map +0 -1
  489. package/package/acode/dist/ask-user-question-tool.d.ts.map +0 -1
  490. package/package/acode/dist/built-in-file-tools.d.ts.map +0 -1
  491. package/package/acode/dist/built-in-symbols-tool.d.ts.map +0 -1
  492. package/package/acode/dist/builtins/commandArtifacts.d.ts.map +0 -1
  493. package/package/acode/dist/builtins/commandOutputEvents.d.ts.map +0 -1
  494. package/package/acode/dist/builtins/shellCommandPreparation.d.ts.map +0 -1
  495. package/package/acode/dist/builtins/shellCommandResult.d.ts.map +0 -1
  496. package/package/acode/dist/builtins/shellCommandRunner.d.ts.map +0 -1
  497. package/package/acode/dist/builtins/shellOutputDecoder.d.ts.map +0 -1
  498. package/package/acode/dist/cli.d.ts.map +0 -1
  499. package/package/acode/dist/commands/commandLoader.d.ts.map +0 -1
  500. package/package/acode/dist/commands/commandParser.d.ts.map +0 -1
  501. package/package/acode/dist/commands/commandRegistry.d.ts.map +0 -1
  502. package/package/acode/dist/compaction.d.ts.map +0 -1
  503. package/package/acode/dist/config.d.ts.map +0 -1
  504. package/package/acode/dist/fs-utils.d.ts.map +0 -1
  505. package/package/acode/dist/hooks/hookBus.d.ts.map +0 -1
  506. package/package/acode/dist/index.d.ts.map +0 -1
  507. package/package/acode/dist/mcpToolNames.d.ts.map +0 -1
  508. package/package/acode/dist/parsers/ast-cache.d.ts.map +0 -1
  509. package/package/acode/dist/parsers/language-detector.d.ts.map +0 -1
  510. package/package/acode/dist/parsers/language-queries.d.ts.map +0 -1
  511. package/package/acode/dist/parsers/symbol-extractor.d.ts.map +0 -1
  512. package/package/acode/dist/parsers/tree-sitter-loader.d.ts.map +0 -1
  513. package/package/acode/dist/parsers/types.d.ts.map +0 -1
  514. package/package/acode/dist/runtime.d.ts.map +0 -1
  515. package/package/acode/dist/skill-tool.d.ts.map +0 -1
  516. package/package/acode/dist/sub-agent-manager.d.ts.map +0 -1
  517. package/package/acode/dist/sub-agent-store.d.ts.map +0 -1
  518. package/package/acode/dist/sub-agent-tools.d.ts.map +0 -1
  519. package/package/acode/dist/sub-agent-types.d.ts.map +0 -1
  520. package/package/acode/dist/todo-store.d.ts.map +0 -1
  521. package/package/acode/dist/todo-tool.d.ts.map +0 -1
  522. package/package/acode/dist/types.d.ts.map +0 -1
  523. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +0 -1
  524. package/package/aws-client-agent-mcp/dist/agent-client.js.map +0 -1
  525. package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts.map +0 -1
  526. package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +0 -1
  527. package/package/aws-client-agent-mcp/dist/config.d.ts.map +0 -1
  528. package/package/aws-client-agent-mcp/dist/config.js.map +0 -1
  529. package/package/aws-client-agent-mcp/dist/config.test.d.ts.map +0 -1
  530. package/package/aws-client-agent-mcp/dist/config.test.js.map +0 -1
  531. package/package/aws-client-agent-mcp/dist/constants.d.ts.map +0 -1
  532. package/package/aws-client-agent-mcp/dist/constants.js.map +0 -1
  533. package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +0 -1
  534. package/package/aws-client-agent-mcp/dist/context-manager.js.map +0 -1
  535. package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts.map +0 -1
  536. package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +0 -1
  537. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +0 -1
  538. package/package/aws-client-agent-mcp/dist/http-client.js.map +0 -1
  539. package/package/aws-client-agent-mcp/dist/http-client.test.d.ts.map +0 -1
  540. package/package/aws-client-agent-mcp/dist/http-client.test.js.map +0 -1
  541. package/package/aws-client-agent-mcp/dist/index.d.ts.map +0 -1
  542. package/package/aws-client-agent-mcp/dist/index.js.map +0 -1
  543. package/package/aws-client-agent-mcp/dist/logger.d.ts.map +0 -1
  544. package/package/aws-client-agent-mcp/dist/logger.js.map +0 -1
  545. package/package/aws-client-agent-mcp/dist/logger.test.d.ts.map +0 -1
  546. package/package/aws-client-agent-mcp/dist/logger.test.js.map +0 -1
  547. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +0 -1
  548. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +0 -1
  549. package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts.map +0 -1
  550. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +0 -1
  551. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +0 -1
  552. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +0 -1
  553. package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts.map +0 -1
  554. package/package/aws-client-agent-mcp/dist/mcp-tools.test.js.map +0 -1
  555. package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +0 -1
  556. package/package/aws-client-agent-mcp/dist/memory-store.js.map +0 -1
  557. package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts.map +0 -1
  558. package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +0 -1
  559. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +0 -1
  560. package/package/aws-client-agent-mcp/dist/memory-tools.js.map +0 -1
  561. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +0 -1
  562. package/package/aws-client-agent-mcp/dist/message-buffer.js.map +0 -1
  563. package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts.map +0 -1
  564. package/package/aws-client-agent-mcp/dist/message-buffer.test.js.map +0 -1
  565. package/package/aws-client-agent-mcp/dist/messageContent.d.ts.map +0 -1
  566. package/package/aws-client-agent-mcp/dist/messageContent.js.map +0 -1
  567. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts.map +0 -1
  568. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js.map +0 -1
  569. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts.map +0 -1
  570. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js.map +0 -1
  571. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +0 -1
  572. package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +0 -1
  573. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +0 -1
  574. package/package/aws-client-agent-mcp/dist/status-reporter.js.map +0 -1
  575. package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts.map +0 -1
  576. package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +0 -1
  577. package/package/aws-client-agent-mcp/dist/types.d.ts.map +0 -1
  578. package/package/aws-client-agent-mcp/dist/types.js.map +0 -1
  579. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +0 -1
  580. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +0 -1
  581. package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts.map +0 -1
  582. package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +0 -1
  583. package/package/cc-switch-sdk/dist/constants.d.ts.map +0 -1
  584. package/package/cc-switch-sdk/dist/errors.d.ts.map +0 -1
  585. package/package/cc-switch-sdk/dist/index.d.ts.map +0 -1
  586. package/package/cc-switch-sdk/dist/schemas.d.ts.map +0 -1
  587. package/package/cc-switch-sdk/dist/sdk.d.ts.map +0 -1
  588. package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts.map +0 -1
  589. package/package/cc-switch-sdk/dist/services/mcp-model.d.ts.map +0 -1
  590. package/package/cc-switch-sdk/dist/services/mcp-service.d.ts.map +0 -1
  591. package/package/cc-switch-sdk/dist/services/skill-model.d.ts.map +0 -1
  592. package/package/cc-switch-sdk/dist/services/skill-service.d.ts.map +0 -1
  593. package/package/cc-switch-sdk/dist/state.d.ts.map +0 -1
  594. package/package/cc-switch-sdk/dist/types.d.ts.map +0 -1
  595. package/package/cc-switch-sdk/dist/utils/fs.d.ts.map +0 -1
  596. package/package/cc-switch-sdk/dist/utils/id.d.ts.map +0 -1
@@ -1,796 +1,2 @@
1
- /**
2
- * Agent Process Manager
3
- *
4
- * Core lifecycle manager for agent processes on the bridge machine.
5
- * Provides comprehensive process management including creation, discovery,
6
- * monitoring, termination, and orphan reclamation capabilities.
7
- */
8
- import { execSync } from 'node:child_process';
9
- import os from 'node:os';
10
- import { createLogger } from '../utils/logger.js';
11
- import { getProcessRegistry } from './process-registry.js';
12
- import { isProcessRunning, findClaudeCodeProcesses, findOrphanProcessByAgentId, terminateProcessTree, waitForProcessExit, checkProcessHealth, } from './process-detector.js';
13
- import { loadPersistedSessions } from './terminal-persistence.js';
14
- const log = createLogger('agent-process-manager');
15
- /**
16
- * Agent Process Manager
17
- *
18
- * Manages the complete lifecycle of agent processes including:
19
- * - Creation: Register and verify new processes
20
- * - Discovery: Scan for managed, orphan, and unknown processes
21
- * - Monitoring: Health checks and heartbeat tracking
22
- * - Termination: Graceful stop with escalation strategy
23
- * - Orphan Reclamation: Adopt or terminate orphan processes
24
- */
25
- export class AgentProcessManager {
26
- /**
27
- * Private constructor - use getAgentProcessManager() for singleton access
28
- */
29
- constructor() {
30
- this.registry = getProcessRegistry();
31
- }
32
- /**
33
- * Get the singleton instance
34
- */
35
- static getInstance() {
36
- if (AgentProcessManager.instance === null) {
37
- AgentProcessManager.instance = new AgentProcessManager();
38
- }
39
- return AgentProcessManager.instance;
40
- }
41
- // =============================================================================
42
- // CREATION PHASE
43
- // =============================================================================
44
- /**
45
- * Start a new process and register it in the process registry
46
- *
47
- * Flow:
48
- * 1. Register process with state='creating'
49
- * 2. Verify it's running
50
- * 3. Update state to 'running'
51
- *
52
- * @param config - Process configuration
53
- * @throws Error if process registration fails or process is not running
54
- */
55
- async startProcess(config) {
56
- const { agentId, sessionId, pid, mode, workspacePath, command } = config;
57
- log.info(`[startProcess] Starting process: agentId=${agentId}, pid=${pid}, mode=${mode}`);
58
- // Step 1: Register with 'creating' state
59
- await this.registry.register({
60
- agentId,
61
- sessionId,
62
- pid,
63
- mode,
64
- state: 'creating',
65
- workspacePath,
66
- command,
67
- });
68
- // Step 2: Verify process is running
69
- log.debug(`[startProcess] Verifying process is running: pid=${pid}`);
70
- const isRunning = isProcessRunning(pid);
71
- if (!isRunning) {
72
- log.error(`[startProcess] Process not running after registration: agentId=${agentId}, pid=${pid}`);
73
- // Mark as terminated since it's not actually running
74
- await this.registry.markTerminated(agentId);
75
- throw new Error(`Process ${pid} is not running`);
76
- }
77
- // Step 3: Update state to 'running'
78
- await this.registry.update(agentId, { state: 'running' });
79
- await this.registry.updateHeartbeat(agentId);
80
- log.info(`[startProcess] Process started successfully: agentId=${agentId}, pid=${pid}`);
81
- }
82
- // =============================================================================
83
- // DISCOVERY PHASE
84
- // =============================================================================
85
- /**
86
- * Discover all agent processes on the system
87
- *
88
- * Scans OS for all agent processes, compares with registry, and returns
89
- * a list of discovered processes with their management status.
90
- *
91
- * @returns Array of discovered processes with management status
92
- */
93
- async discoverAllProcesses() {
94
- log.debug('[discoverAllProcesses] Scanning for all agent processes');
95
- // Get all processes from OS
96
- const osProcesses = await findClaudeCodeProcesses();
97
- const managedProcesses = this.registry.getAll();
98
- const discovered = [];
99
- // Create a set of managed PIDs for quick lookup
100
- const managedPids = new Set(managedProcesses.map(p => p.pid));
101
- const managedAgentIds = new Set(managedProcesses.map(p => p.agentId));
102
- const pidToRecord = new Map(managedProcesses.map(p => [p.pid, p]));
103
- // Check each OS process
104
- for (const proc of osProcesses) {
105
- const isManagedByPid = managedPids.has(proc.pid);
106
- const isManagedByAgentId = proc.agentId && managedAgentIds.has(proc.agentId);
107
- const recordByPid = pidToRecord.get(proc.pid);
108
- // ★ 关键修复:当命令行中无法提取 agentId 但 PID 匹配注册表时,继承注册表的 agentId
109
- const resolvedAgentId = proc.agentId || recordByPid?.agentId;
110
- if (isManagedByPid || isManagedByAgentId) {
111
- // Process is managed - find its record
112
- const record = managedProcesses.find(p => p.pid === proc.pid || p.agentId === proc.agentId || p.agentId === resolvedAgentId);
113
- discovered.push({
114
- ...proc,
115
- agentId: resolvedAgentId,
116
- managementStatus: 'managed',
117
- sessionId: record?.sessionId,
118
- });
119
- }
120
- else if (resolvedAgentId) {
121
- // Process has agentId but not in registry - it's an orphan
122
- discovered.push({
123
- ...proc,
124
- agentId: resolvedAgentId,
125
- managementStatus: 'orphan',
126
- });
127
- }
128
- else {
129
- // Unknown agent process
130
- discovered.push({
131
- ...proc,
132
- agentId: resolvedAgentId,
133
- managementStatus: 'unknown',
134
- });
135
- }
136
- }
137
- // Also check registry processes that might not be in OS scan
138
- for (const record of managedProcesses) {
139
- const found = discovered.find(p => p.pid === record.pid);
140
- if (!found) {
141
- // Process is in registry but not found in OS scan
142
- const isAlive = isProcessRunning(record.pid);
143
- discovered.push({
144
- pid: record.pid,
145
- command: record.command,
146
- agentId: record.agentId,
147
- managementStatus: isAlive ? 'managed' : 'orphan',
148
- sessionId: record.sessionId,
149
- });
150
- }
151
- }
152
- log.debug(`[discoverAllProcesses] Discovered ${discovered.length} processes: ` +
153
- `${discovered.filter(p => p.managementStatus === 'managed').length} managed, ` +
154
- `${discovered.filter(p => p.managementStatus === 'orphan').length} orphans, ` +
155
- `${discovered.filter(p => p.managementStatus === 'unknown').length} unknown`);
156
- return discovered;
157
- }
158
- // =============================================================================
159
- // MONITORING PHASE
160
- // =============================================================================
161
- /**
162
- * Check health of all registered processes
163
- *
164
- * Updates heartbeat and health status in registry for each managed process.
165
- *
166
- * @returns Map of agentId to health status
167
- */
168
- async healthCheckAll() {
169
- log.debug('[healthCheckAll] Starting health check for all processes');
170
- const results = new Map();
171
- const managedProcesses = this.registry.getAll();
172
- const promises = managedProcesses.map(async (record) => {
173
- const health = await this.healthCheck(record.agentId);
174
- results.set(record.agentId, health);
175
- return health;
176
- });
177
- await Promise.all(promises);
178
- log.debug(`[healthCheckAll] Completed health check for ${managedProcesses.length} processes`);
179
- return results;
180
- }
181
- /**
182
- * Check health of a single process
183
- *
184
- * @param agentId - Agent ID to check
185
- * @returns Health status of the process
186
- */
187
- async healthCheck(agentId) {
188
- const record = this.registry.get(agentId);
189
- if (!record) {
190
- log.warn(`[healthCheck] Process not found in registry: agentId=${agentId}`);
191
- return {
192
- pid: -1,
193
- agentId,
194
- alive: false,
195
- cpu: 0,
196
- memoryMB: 0,
197
- status: 'dead',
198
- lastUpdate: new Date(),
199
- };
200
- }
201
- // Check process health
202
- const health = await checkProcessHealth(record.pid, agentId);
203
- // Update registry with health info
204
- const healthStatus = {
205
- cpu: health.cpu,
206
- memoryMB: health.memoryMB,
207
- status: health.status,
208
- };
209
- await this.registry.updateHealth(agentId, healthStatus);
210
- if (health.alive) {
211
- await this.registry.updateHeartbeat(agentId);
212
- }
213
- else if (record.state !== 'terminated' && record.state !== 'orphaned') {
214
- // Process died unexpectedly - mark as orphaned
215
- log.warn(`[healthCheck] Process died unexpectedly: agentId=${agentId}, pid=${record.pid}`);
216
- await this.registry.markOrphaned(agentId);
217
- }
218
- return health;
219
- }
220
- // =============================================================================
221
- // TERMINATION PHASE (with escalation strategy)
222
- // =============================================================================
223
- /**
224
- * Stop a process with graceful escalation strategy
225
- *
226
- * Escalation levels:
227
- * Level 1: SIGTERM → wait 3s
228
- * Level 2: taskkill /T /F (Win) or kill -9 (Unix) → wait 3s
229
- * Level 3: terminateProcessTree → wait 5s
230
- * Level 4: mark as "unstoppable", return failure
231
- *
232
- * @param agentId - Agent ID to stop
233
- * @returns Termination result with details
234
- */
235
- async stopProcess(agentId) {
236
- const record = this.registry.get(agentId);
237
- if (!record) {
238
- return {
239
- success: false,
240
- agentId,
241
- pid: -1,
242
- level: 0,
243
- terminated: 0,
244
- failed: 0,
245
- message: `Process not found in registry: ${agentId}`,
246
- };
247
- }
248
- const { pid } = record;
249
- log.info(`[stopProcess] Stopping process: agentId=${agentId}, pid=${pid}`);
250
- // Check if already stopped
251
- if (!isProcessRunning(pid)) {
252
- log.info(`[stopProcess] Process already stopped: agentId=${agentId}, pid=${pid}`);
253
- await this.registry.markTerminated(agentId);
254
- return {
255
- success: true,
256
- agentId,
257
- pid,
258
- level: 0,
259
- terminated: 1,
260
- failed: 0,
261
- message: 'Process was already stopped',
262
- };
263
- }
264
- // Update state to 'stopping'
265
- await this.registry.update(agentId, { state: 'stopping' });
266
- // Level 1: SIGTERM
267
- log.debug(`[stopProcess] Level 1: Sending SIGTERM to pid=${pid}`);
268
- const sigtermResult = this.sendSigterm(pid);
269
- if (sigtermResult) {
270
- const exited = await waitForProcessExit(pid, 3000);
271
- if (exited) {
272
- await this.registry.markTerminated(agentId);
273
- log.info(`[stopProcess] Process stopped at Level 1: agentId=${agentId}, pid=${pid}`);
274
- return {
275
- success: true,
276
- agentId,
277
- pid,
278
- level: 1,
279
- terminated: 1,
280
- failed: 0,
281
- message: 'Process terminated with SIGTERM',
282
- };
283
- }
284
- }
285
- // Level 2: Force kill (taskkill /F or kill -9)
286
- log.debug(`[stopProcess] Level 2: Force killing pid=${pid}`);
287
- const forceKillResult = this.sendForceKill(pid);
288
- if (forceKillResult) {
289
- const exited = await waitForProcessExit(pid, 3000);
290
- if (exited) {
291
- await this.registry.markTerminated(agentId);
292
- log.info(`[stopProcess] Process stopped at Level 2: agentId=${agentId}, pid=${pid}`);
293
- return {
294
- success: true,
295
- agentId,
296
- pid,
297
- level: 2,
298
- terminated: 1,
299
- failed: 0,
300
- message: 'Process terminated with force kill',
301
- };
302
- }
303
- }
304
- // Level 3: Terminate process tree
305
- log.debug(`[stopProcess] Level 3: Terminating process tree for pid=${pid}`);
306
- const treeResult = await terminateProcessTree(pid);
307
- // Wait for process tree to terminate
308
- const treeExited = await waitForProcessExit(pid, 5000);
309
- if (treeExited) {
310
- await this.registry.markTerminated(agentId);
311
- log.info(`[stopProcess] Process stopped at Level 3: agentId=${agentId}, pid=${pid}, terminated=${treeResult.terminated}, failed=${treeResult.failed}`);
312
- return {
313
- success: true,
314
- agentId,
315
- pid,
316
- level: 3,
317
- terminated: treeResult.terminated,
318
- failed: treeResult.failed,
319
- message: `Process tree terminated (${treeResult.terminated} processes)`,
320
- };
321
- }
322
- // Level 4: Process is unstoppable
323
- log.error(`[stopProcess] Level 4: Process is unstoppable: agentId=${agentId}, pid=${pid}`);
324
- // Check final state
325
- const finalStatus = isProcessRunning(pid) ? 'still running' : 'terminated';
326
- if (finalStatus === 'terminated') {
327
- await this.registry.markTerminated(agentId);
328
- return {
329
- success: true,
330
- agentId,
331
- pid,
332
- level: 4,
333
- terminated: 1,
334
- failed: 0,
335
- message: 'Process eventually terminated after all escalation levels',
336
- };
337
- }
338
- return {
339
- success: false,
340
- agentId,
341
- pid,
342
- level: 4,
343
- terminated: treeResult.terminated,
344
- failed: treeResult.failed + 1,
345
- message: 'Process could not be terminated - marked as unstoppable',
346
- };
347
- }
348
- /**
349
- * Send SIGTERM to a process
350
- */
351
- sendSigterm(pid) {
352
- try {
353
- process.kill(pid, 'SIGTERM');
354
- return true;
355
- }
356
- catch (error) {
357
- log.debug(`[sendSigterm] Failed to send SIGTERM to ${pid}:`, error);
358
- return false;
359
- }
360
- }
361
- /**
362
- * Send force kill (SIGKILL on Unix, taskkill /F on Windows)
363
- */
364
- sendForceKill(pid) {
365
- try {
366
- if (os.platform() === 'win32') {
367
- execSync(`taskkill /PID ${pid} /F`, { encoding: 'utf8', timeout: 5000, windowsHide: true });
368
- }
369
- else {
370
- process.kill(pid, 'SIGKILL');
371
- }
372
- return true;
373
- }
374
- catch (error) {
375
- log.debug(`[sendForceKill] Failed to force kill ${pid}:`, error);
376
- return false;
377
- }
378
- }
379
- /**
380
- * Force kill a process immediately using terminateProcessTree
381
- *
382
- * This bypasses the graceful escalation and uses the most aggressive
383
- * termination method immediately.
384
- *
385
- * @param agentId - Agent ID to force kill
386
- * @returns Termination result
387
- */
388
- async forceKill(agentId) {
389
- const record = this.registry.get(agentId);
390
- if (!record) {
391
- return {
392
- success: false,
393
- agentId,
394
- pid: -1,
395
- level: 0,
396
- terminated: 0,
397
- failed: 0,
398
- message: `Process not found in registry: ${agentId}`,
399
- };
400
- }
401
- const { pid } = record;
402
- log.info(`[forceKill] Force killing process: agentId=${agentId}, pid=${pid}`);
403
- // Update state
404
- await this.registry.update(agentId, { state: 'stopping' });
405
- // Direct process tree termination
406
- const result = await terminateProcessTree(pid);
407
- // Wait briefly for termination
408
- const exited = await waitForProcessExit(pid, 2000);
409
- if (exited) {
410
- await this.registry.markTerminated(agentId);
411
- log.info(`[forceKill] Process terminated: agentId=${agentId}, pid=${pid}`);
412
- return {
413
- success: true,
414
- agentId,
415
- pid,
416
- level: 3, // Same level as tree termination
417
- terminated: result.terminated,
418
- failed: result.failed,
419
- message: `Process force killed (${result.terminated} processes terminated)`,
420
- };
421
- }
422
- log.error(`[forceKill] Process could not be force killed: agentId=${agentId}, pid=${pid}`);
423
- return {
424
- success: false,
425
- agentId,
426
- pid,
427
- level: 3,
428
- terminated: result.terminated,
429
- failed: result.failed + 1,
430
- message: 'Force kill failed - process may require manual intervention',
431
- };
432
- }
433
- // =============================================================================
434
- // ORPHAN RECLAMATION
435
- // =============================================================================
436
- /**
437
- * Reclaim an orphan process by agentId
438
- *
439
- * Finds an orphan process by agentId, and either:
440
- * - Adopts it into the registry (if found and not managed)
441
- * - Terminates it (if adoption fails or process is problematic)
442
- *
443
- * @param agentId - Agent ID to find and reclaim
444
- * @returns Reclamation result
445
- */
446
- async reclaimOrphan(agentId) {
447
- log.info(`[reclaimOrphan] Attempting to reclaim orphan: agentId=${agentId}`);
448
- // Check if already managed
449
- if (this.registry.isManaged(agentId)) {
450
- const record = this.registry.get(agentId);
451
- if (!record) {
452
- return { success: false, pid: -1, action: 'failed' };
453
- }
454
- log.info(`[reclaimOrphan] Process already managed: agentId=${agentId}, pid=${record.pid}`);
455
- return {
456
- success: true,
457
- pid: record.pid,
458
- action: 'adopted',
459
- };
460
- }
461
- // Find orphan process
462
- const orphan = await findOrphanProcessByAgentId(agentId);
463
- if (!orphan) {
464
- log.warn(`[reclaimOrphan] No orphan process found: agentId=${agentId}`);
465
- return {
466
- success: false,
467
- pid: -1,
468
- action: 'failed',
469
- };
470
- }
471
- // Verify the process is still running
472
- if (!isProcessRunning(orphan.pid)) {
473
- log.warn(`[reclaimOrphan] Orphan process not running: agentId=${agentId}, pid=${orphan.pid}`);
474
- return {
475
- success: false,
476
- pid: orphan.pid,
477
- action: 'failed',
478
- };
479
- }
480
- // Check if this PID is already managed by a different agent
481
- if (this.registry.isManagedByPid(orphan.pid)) {
482
- const existingRecord = this.registry.getByPid(orphan.pid);
483
- if (!existingRecord) {
484
- // Race condition - PID was just removed, proceed with adoption inline
485
- try {
486
- const sessions = await loadPersistedSessions();
487
- const session = sessions.find(s => s.agentId === agentId);
488
- await this.registry.register({
489
- agentId,
490
- sessionId: session?.sessionId || `reclaimed-${Date.now()}`,
491
- pid: orphan.pid,
492
- mode: 'sdk',
493
- state: 'running',
494
- workspacePath: session?.workspacePath || orphan.cwd || '',
495
- command: orphan.command || session?.command || '',
496
- metadata: { reclaimedAt: new Date().toISOString(), wasOrphan: true },
497
- });
498
- return { success: true, pid: orphan.pid, action: 'adopted' };
499
- }
500
- catch {
501
- await terminateProcessTree(orphan.pid);
502
- return { success: false, pid: orphan.pid, action: 'terminated' };
503
- }
504
- }
505
- log.warn(`[reclaimOrphan] PID already managed by different agent: pid=${orphan.pid}, existingAgentId=${existingRecord.agentId}`);
506
- // If it's the same agentId, just update - this shouldn't happen but handle it
507
- if (existingRecord.agentId === agentId) {
508
- return {
509
- success: true,
510
- pid: orphan.pid,
511
- action: 'adopted',
512
- };
513
- }
514
- // Different agent - this is a conflict, terminate the orphan
515
- log.warn(`[reclaimOrphan] Terminating conflicting orphan: agentId=${agentId}, pid=${orphan.pid}`);
516
- await terminateProcessTree(orphan.pid);
517
- return {
518
- success: true,
519
- pid: orphan.pid,
520
- action: 'terminated',
521
- };
522
- }
523
- // Try to adopt the orphan - load persisted sessions for metadata
524
- const sessions = await loadPersistedSessions();
525
- const session = sessions.find(s => s.agentId === agentId);
526
- try {
527
- await this.registry.register({
528
- agentId,
529
- sessionId: session?.sessionId || `reclaimed-${Date.now()}`,
530
- pid: orphan.pid,
531
- mode: 'sdk',
532
- state: 'running',
533
- workspacePath: session?.workspacePath || orphan.cwd || '',
534
- command: orphan.command || session?.command || '',
535
- metadata: {
536
- reclaimedAt: new Date().toISOString(),
537
- wasOrphan: true,
538
- },
539
- });
540
- log.info(`[reclaimOrphan] Successfully adopted orphan: agentId=${agentId}, pid=${orphan.pid}`);
541
- return {
542
- success: true,
543
- pid: orphan.pid,
544
- action: 'adopted',
545
- };
546
- }
547
- catch (error) {
548
- log.error(`[reclaimOrphan] Failed to adopt orphan: agentId=${agentId}, pid=${orphan.pid}`, error);
549
- // If adoption fails, terminate the process
550
- await terminateProcessTree(orphan.pid);
551
- return {
552
- success: false,
553
- pid: orphan.pid,
554
- action: 'terminated',
555
- };
556
- }
557
- }
558
- /**
559
- * Scan all orphans and attempt to reclaim each
560
- *
561
- * @returns Array of reclamation results
562
- */
563
- async scanAndReclaimAll() {
564
- log.info('[scanAndReclaimAll] Scanning for all orphan processes');
565
- const results = [];
566
- // Load persisted sessions to find potential orphans
567
- const sessions = await loadPersistedSessions();
568
- // Find all agent processes
569
- const allProcesses = await findClaudeCodeProcesses();
570
- const managedPids = new Set(this.registry.getAll().map(p => p.pid));
571
- // Identify orphan processes
572
- const orphans = allProcesses.filter(proc => {
573
- // Not managed by PID
574
- if (managedPids.has(proc.pid))
575
- return false;
576
- // Has agentId but not managed - this is an orphan
577
- if (proc.agentId && !this.registry.isManaged(proc.agentId)) {
578
- return true;
579
- }
580
- return false;
581
- });
582
- log.info(`[scanAndReclaimAll] Found ${orphans.length} orphan processes`);
583
- // Try to reclaim each orphan
584
- for (const orphan of orphans) {
585
- if (!orphan.agentId) {
586
- // No agentId - can't reclaim, just terminate
587
- log.warn(`[scanAndReclaimAll] Orphan without agentId, terminating: pid=${orphan.pid}`);
588
- await terminateProcessTree(orphan.pid);
589
- results.push({
590
- agentId: 'unknown',
591
- pid: orphan.pid,
592
- action: 'terminated',
593
- });
594
- continue;
595
- }
596
- const result = await this.reclaimOrphan(orphan.agentId);
597
- results.push({
598
- agentId: orphan.agentId,
599
- pid: result.pid,
600
- action: result.action,
601
- });
602
- }
603
- // Also check persisted sessions for orphans that might not be in the process list
604
- for (const session of sessions) {
605
- if (session.agentId && !this.registry.isManaged(session.agentId)) {
606
- const orphanByAgentId = await findOrphanProcessByAgentId(session.agentId);
607
- if (orphanByAgentId) {
608
- const result = await this.reclaimOrphan(session.agentId);
609
- // Avoid duplicates
610
- const existing = results.find(r => r.agentId === session.agentId);
611
- if (!existing) {
612
- results.push({
613
- agentId: session.agentId,
614
- pid: result.pid,
615
- action: result.action,
616
- });
617
- }
618
- }
619
- }
620
- }
621
- log.info(`[scanAndReclaimAll] Reclamation complete: ${results.length} processes processed`);
622
- return results;
623
- }
624
- // =============================================================================
625
- // REGISTRY INTEGRATION
626
- // =============================================================================
627
- /**
628
- * Mark a process as orphaned in the registry
629
- *
630
- * @param agentId - Agent ID to mark
631
- * @returns Whether the operation succeeded
632
- */
633
- async markOrphaned(agentId) {
634
- log.info(`[markOrphaned] Marking process as orphaned: agentId=${agentId}`);
635
- return await this.registry.markOrphaned(agentId);
636
- }
637
- /**
638
- * Check if a process is managed
639
- *
640
- * @param agentId - Agent ID to check
641
- * @returns Whether the process is managed
642
- */
643
- isManaged(agentId) {
644
- return this.registry.isManaged(agentId);
645
- }
646
- /**
647
- * Get all managed processes
648
- *
649
- * @returns Array of all managed process records
650
- */
651
- getAllManagedProcesses() {
652
- return this.registry.getAll();
653
- }
654
- /**
655
- * Get managed processes by state
656
- *
657
- * @param state - Process state to filter by
658
- * @returns Array of process records matching the state
659
- */
660
- getManagedProcessesByState(state) {
661
- return this.registry.getByState(state);
662
- }
663
- /**
664
- * Find processes running on the machine that are NOT in registry
665
- *
666
- * @returns Array of unmanaged process info
667
- */
668
- async getUnmanagedProcesses() {
669
- const allProcesses = await findClaudeCodeProcesses();
670
- const managedPids = new Set(this.registry.getAll().map(p => p.pid));
671
- const managedAgentIds = new Set(this.registry.getAll().map(p => p.agentId));
672
- return allProcesses.filter(proc => {
673
- // Not managed by PID
674
- if (managedPids.has(proc.pid))
675
- return false;
676
- // Not managed by agentId
677
- if (proc.agentId && managedAgentIds.has(proc.agentId))
678
- return false;
679
- return true;
680
- });
681
- }
682
- /**
683
- * Rebuild the process registry from persisted sessions (e.g. on startup)
684
- *
685
- * Scans all persisted sessions, checks which processes are still running,
686
- * and registers them with appropriate state.
687
- *
688
- * @param sessions - Array of persisted session data
689
- */
690
- async rebuildRegistry(sessions) {
691
- log.info(`[rebuildRegistry] Rebuilding registry from ${sessions.length} persisted sessions`);
692
- // Clear existing registry
693
- await this.registry.clear();
694
- for (const session of sessions) {
695
- if (!session.pid) {
696
- log.debug(`[rebuildRegistry] Skipping session without PID: agentId=${session.agentId}`);
697
- continue;
698
- }
699
- const isRunning = isProcessRunning(session.pid);
700
- const state = isRunning ? 'running' : 'unknown';
701
- try {
702
- await this.registry.register({
703
- agentId: session.agentId,
704
- sessionId: session.sessionId,
705
- pid: session.pid,
706
- mode: 'sdk',
707
- state,
708
- workspacePath: session.workspacePath || '',
709
- command: session.command || '',
710
- metadata: {
711
- rebuiltAt: new Date().toISOString(),
712
- wasRunningOnStartup: isRunning,
713
- },
714
- });
715
- log.debug(`[rebuildRegistry] Registered: agentId=${session.agentId}, pid=${session.pid}, state=${state}`);
716
- }
717
- catch (error) {
718
- log.warn(`[rebuildRegistry] Failed to register: agentId=${session.agentId}`, error);
719
- }
720
- }
721
- const stats = this.registry.getStats();
722
- log.info(`[rebuildRegistry] Registry rebuilt: total=${stats.total}, running=${stats.running}, unknown=${stats.unknown}`);
723
- }
724
- /**
725
- * Get process statistics
726
- *
727
- * @returns Statistics for all managed processes
728
- */
729
- getStats() {
730
- return this.registry.getStats();
731
- }
732
- /**
733
- * Clean up stale registry entries
734
- *
735
- * Removes records where:
736
- * - state is 'terminated' or 'unknown'
737
- * - the process is no longer running
738
- *
739
- * This prevents dead entries from accumulating and inflating counts.
740
- *
741
- * @returns Number of entries removed
742
- */
743
- async cleanupStaleRegistry() {
744
- const allRecords = this.registry.getAll();
745
- let removed = 0;
746
- for (const record of allRecords) {
747
- if ((record.state === 'terminated' || record.state === 'unknown') &&
748
- !isProcessRunning(record.pid)) {
749
- await this.registry.remove(record.agentId);
750
- removed++;
751
- log.debug(`[cleanupStaleRegistry] Removed stale entry: agentId=${record.agentId}, pid=${record.pid}, state=${record.state}`);
752
- }
753
- }
754
- if (removed > 0) {
755
- log.info(`[cleanupStaleRegistry] Cleaned up ${removed} stale registry entries`);
756
- }
757
- return removed;
758
- }
759
- /**
760
- * Remove a process from registry
761
- *
762
- * @param agentId - Agent ID to remove
763
- * @returns Whether the operation succeeded
764
- */
765
- async removeProcess(agentId) {
766
- log.info(`[removeProcess] Removing process from registry: agentId=${agentId}`);
767
- return await this.registry.remove(agentId);
768
- }
769
- /**
770
- * Get a single process record
771
- *
772
- * @param agentId - Agent ID to get
773
- * @returns Process record or undefined
774
- */
775
- getProcess(agentId) {
776
- return this.registry.get(agentId);
777
- }
778
- /**
779
- * Get a process record by PID
780
- *
781
- * @param pid - Process ID to get
782
- * @returns Process record or undefined
783
- */
784
- getProcessByPid(pid) {
785
- return this.registry.getByPid(pid);
786
- }
787
- }
788
- AgentProcessManager.instance = null;
789
- /**
790
- * Get the AgentProcessManager singleton instance
791
- *
792
- * @returns AgentProcessManager instance
793
- */
794
- export function getAgentProcessManager() {
795
- return AgentProcessManager.getInstance();
796
- }
1
+ import{execSync as I}from"node:child_process";import k from"node:os";import{createLogger as S}from"../utils/logger.js";import{getProcessRegistry as R}from"./process-registry.js";import{isProcessRunning as l,findClaudeCodeProcesses as y,findOrphanProcessByAgentId as $,terminateProcessTree as g,waitForProcessExit as m,checkProcessHealth as v}from"./process-detector.js";import{loadPersistedSessions as w}from"./terminal-persistence.js";const r=S("agent-process-manager");class p{constructor(){this.registry=R()}static getInstance(){return p.instance===null&&(p.instance=new p),p.instance}async startProcess(e){const{agentId:s,sessionId:t,pid:a,mode:o,workspacePath:n,command:i}=e;if(r.info(`[startProcess] Starting process: agentId=${s}, pid=${a}, mode=${o}`),await this.registry.register({agentId:s,sessionId:t,pid:a,mode:o,state:"creating",workspacePath:n,command:i}),r.debug(`[startProcess] Verifying process is running: pid=${a}`),!l(a))throw r.error(`[startProcess] Process not running after registration: agentId=${s}, pid=${a}`),await this.registry.markTerminated(s),new Error(`Process ${a} is not running`);await this.registry.update(s,{state:"running"}),await this.registry.updateHeartbeat(s),r.info(`[startProcess] Process started successfully: agentId=${s}, pid=${a}`)}async discoverAllProcesses(){r.debug("[discoverAllProcesses] Scanning for all agent processes");const e=await y(),s=this.registry.getAll(),t=[],a=new Set(s.map(i=>i.pid)),o=new Set(s.map(i=>i.agentId)),n=new Map(s.map(i=>[i.pid,i]));for(const i of e){const d=a.has(i.pid),c=i.agentId&&o.has(i.agentId),h=n.get(i.pid),u=i.agentId||h?.agentId;if(d||c){const P=s.find(f=>f.pid===i.pid||f.agentId===i.agentId||f.agentId===u);t.push({...i,agentId:u,managementStatus:"managed",sessionId:P?.sessionId})}else u?t.push({...i,agentId:u,managementStatus:"orphan"}):t.push({...i,agentId:u,managementStatus:"unknown"})}for(const i of s)if(!t.find(c=>c.pid===i.pid)){const c=l(i.pid);t.push({pid:i.pid,command:i.command,agentId:i.agentId,managementStatus:c?"managed":"orphan",sessionId:i.sessionId})}return r.debug(`[discoverAllProcesses] Discovered ${t.length} processes: ${t.filter(i=>i.managementStatus==="managed").length} managed, ${t.filter(i=>i.managementStatus==="orphan").length} orphans, ${t.filter(i=>i.managementStatus==="unknown").length} unknown`),t}async healthCheckAll(){r.debug("[healthCheckAll] Starting health check for all processes");const e=new Map,s=this.registry.getAll(),t=s.map(async a=>{const o=await this.healthCheck(a.agentId);return e.set(a.agentId,o),o});return await Promise.all(t),r.debug(`[healthCheckAll] Completed health check for ${s.length} processes`),e}async healthCheck(e){const s=this.registry.get(e);if(!s)return r.warn(`[healthCheck] Process not found in registry: agentId=${e}`),{pid:-1,agentId:e,alive:!1,cpu:0,memoryMB:0,status:"dead",lastUpdate:new Date};const t=await v(s.pid,e),a={cpu:t.cpu,memoryMB:t.memoryMB,status:t.status};return await this.registry.updateHealth(e,a),t.alive?await this.registry.updateHeartbeat(e):s.state!=="terminated"&&s.state!=="orphaned"&&(r.warn(`[healthCheck] Process died unexpectedly: agentId=${e}, pid=${s.pid}`),await this.registry.markOrphaned(e)),t}async stopProcess(e){const s=this.registry.get(e);if(!s)return{success:!1,agentId:e,pid:-1,level:0,terminated:0,failed:0,message:`Process not found in registry: ${e}`};const{pid:t}=s;if(r.info(`[stopProcess] Stopping process: agentId=${e}, pid=${t}`),!l(t))return r.info(`[stopProcess] Process already stopped: agentId=${e}, pid=${t}`),await this.registry.markTerminated(e),{success:!0,agentId:e,pid:t,level:0,terminated:1,failed:0,message:"Process was already stopped"};if(await this.registry.update(e,{state:"stopping"}),r.debug(`[stopProcess] Level 1: Sending SIGTERM to pid=${t}`),this.sendSigterm(t)&&await m(t,3e3))return await this.registry.markTerminated(e),r.info(`[stopProcess] Process stopped at Level 1: agentId=${e}, pid=${t}`),{success:!0,agentId:e,pid:t,level:1,terminated:1,failed:0,message:"Process terminated with SIGTERM"};if(r.debug(`[stopProcess] Level 2: Force killing pid=${t}`),this.sendForceKill(t)&&await m(t,3e3))return await this.registry.markTerminated(e),r.info(`[stopProcess] Process stopped at Level 2: agentId=${e}, pid=${t}`),{success:!0,agentId:e,pid:t,level:2,terminated:1,failed:0,message:"Process terminated with force kill"};r.debug(`[stopProcess] Level 3: Terminating process tree for pid=${t}`);const n=await g(t);return await m(t,5e3)?(await this.registry.markTerminated(e),r.info(`[stopProcess] Process stopped at Level 3: agentId=${e}, pid=${t}, terminated=${n.terminated}, failed=${n.failed}`),{success:!0,agentId:e,pid:t,level:3,terminated:n.terminated,failed:n.failed,message:`Process tree terminated (${n.terminated} processes)`}):(r.error(`[stopProcess] Level 4: Process is unstoppable: agentId=${e}, pid=${t}`),(l(t)?"still running":"terminated")==="terminated"?(await this.registry.markTerminated(e),{success:!0,agentId:e,pid:t,level:4,terminated:1,failed:0,message:"Process eventually terminated after all escalation levels"}):{success:!1,agentId:e,pid:t,level:4,terminated:n.terminated,failed:n.failed+1,message:"Process could not be terminated - marked as unstoppable"})}sendSigterm(e){try{return process.kill(e,"SIGTERM"),!0}catch(s){return r.debug(`[sendSigterm] Failed to send SIGTERM to ${e}:`,s),!1}}sendForceKill(e){try{return k.platform()==="win32"?I(`taskkill /PID ${e} /F`,{encoding:"utf8",timeout:5e3,windowsHide:!0}):process.kill(e,"SIGKILL"),!0}catch(s){return r.debug(`[sendForceKill] Failed to force kill ${e}:`,s),!1}}async forceKill(e){const s=this.registry.get(e);if(!s)return{success:!1,agentId:e,pid:-1,level:0,terminated:0,failed:0,message:`Process not found in registry: ${e}`};const{pid:t}=s;r.info(`[forceKill] Force killing process: agentId=${e}, pid=${t}`),await this.registry.update(e,{state:"stopping"});const a=await g(t);return await m(t,2e3)?(await this.registry.markTerminated(e),r.info(`[forceKill] Process terminated: agentId=${e}, pid=${t}`),{success:!0,agentId:e,pid:t,level:3,terminated:a.terminated,failed:a.failed,message:`Process force killed (${a.terminated} processes terminated)`}):(r.error(`[forceKill] Process could not be force killed: agentId=${e}, pid=${t}`),{success:!1,agentId:e,pid:t,level:3,terminated:a.terminated,failed:a.failed+1,message:"Force kill failed - process may require manual intervention"})}async reclaimOrphan(e){if(r.info(`[reclaimOrphan] Attempting to reclaim orphan: agentId=${e}`),this.registry.isManaged(e)){const o=this.registry.get(e);return o?(r.info(`[reclaimOrphan] Process already managed: agentId=${e}, pid=${o.pid}`),{success:!0,pid:o.pid,action:"adopted"}):{success:!1,pid:-1,action:"failed"}}const s=await $(e);if(!s)return r.warn(`[reclaimOrphan] No orphan process found: agentId=${e}`),{success:!1,pid:-1,action:"failed"};if(!l(s.pid))return r.warn(`[reclaimOrphan] Orphan process not running: agentId=${e}, pid=${s.pid}`),{success:!1,pid:s.pid,action:"failed"};if(this.registry.isManagedByPid(s.pid)){const o=this.registry.getByPid(s.pid);if(!o)try{const i=(await w()).find(d=>d.agentId===e);return await this.registry.register({agentId:e,sessionId:i?.sessionId||`reclaimed-${Date.now()}`,pid:s.pid,mode:"sdk",state:"running",workspacePath:i?.workspacePath||s.cwd||"",command:s.command||i?.command||"",metadata:{reclaimedAt:new Date().toISOString(),wasOrphan:!0}}),{success:!0,pid:s.pid,action:"adopted"}}catch{return await g(s.pid),{success:!1,pid:s.pid,action:"terminated"}}return r.warn(`[reclaimOrphan] PID already managed by different agent: pid=${s.pid}, existingAgentId=${o.agentId}`),o.agentId===e?{success:!0,pid:s.pid,action:"adopted"}:(r.warn(`[reclaimOrphan] Terminating conflicting orphan: agentId=${e}, pid=${s.pid}`),await g(s.pid),{success:!0,pid:s.pid,action:"terminated"})}const a=(await w()).find(o=>o.agentId===e);try{return await this.registry.register({agentId:e,sessionId:a?.sessionId||`reclaimed-${Date.now()}`,pid:s.pid,mode:"sdk",state:"running",workspacePath:a?.workspacePath||s.cwd||"",command:s.command||a?.command||"",metadata:{reclaimedAt:new Date().toISOString(),wasOrphan:!0}}),r.info(`[reclaimOrphan] Successfully adopted orphan: agentId=${e}, pid=${s.pid}`),{success:!0,pid:s.pid,action:"adopted"}}catch(o){return r.error(`[reclaimOrphan] Failed to adopt orphan: agentId=${e}, pid=${s.pid}`,o),await g(s.pid),{success:!1,pid:s.pid,action:"terminated"}}}async scanAndReclaimAll(){r.info("[scanAndReclaimAll] Scanning for all orphan processes");const e=[],s=await w(),t=await y(),a=new Set(this.registry.getAll().map(n=>n.pid)),o=t.filter(n=>a.has(n.pid)?!1:!!(n.agentId&&!this.registry.isManaged(n.agentId)));r.info(`[scanAndReclaimAll] Found ${o.length} orphan processes`);for(const n of o){if(!n.agentId){r.warn(`[scanAndReclaimAll] Orphan without agentId, terminating: pid=${n.pid}`),await g(n.pid),e.push({agentId:"unknown",pid:n.pid,action:"terminated"});continue}const i=await this.reclaimOrphan(n.agentId);e.push({agentId:n.agentId,pid:i.pid,action:i.action})}for(const n of s)if(n.agentId&&!this.registry.isManaged(n.agentId)&&await $(n.agentId)){const d=await this.reclaimOrphan(n.agentId);e.find(h=>h.agentId===n.agentId)||e.push({agentId:n.agentId,pid:d.pid,action:d.action})}return r.info(`[scanAndReclaimAll] Reclamation complete: ${e.length} processes processed`),e}async markOrphaned(e){return r.info(`[markOrphaned] Marking process as orphaned: agentId=${e}`),await this.registry.markOrphaned(e)}isManaged(e){return this.registry.isManaged(e)}getAllManagedProcesses(){return this.registry.getAll()}getManagedProcessesByState(e){return this.registry.getByState(e)}async getUnmanagedProcesses(){const e=await y(),s=new Set(this.registry.getAll().map(a=>a.pid)),t=new Set(this.registry.getAll().map(a=>a.agentId));return e.filter(a=>!(s.has(a.pid)||a.agentId&&t.has(a.agentId)))}async rebuildRegistry(e){r.info(`[rebuildRegistry] Rebuilding registry from ${e.length} persisted sessions`),await this.registry.clear();for(const t of e){if(!t.pid){r.debug(`[rebuildRegistry] Skipping session without PID: agentId=${t.agentId}`);continue}const a=l(t.pid),o=a?"running":"unknown";try{await this.registry.register({agentId:t.agentId,sessionId:t.sessionId,pid:t.pid,mode:"sdk",state:o,workspacePath:t.workspacePath||"",command:t.command||"",metadata:{rebuiltAt:new Date().toISOString(),wasRunningOnStartup:a}}),r.debug(`[rebuildRegistry] Registered: agentId=${t.agentId}, pid=${t.pid}, state=${o}`)}catch(n){r.warn(`[rebuildRegistry] Failed to register: agentId=${t.agentId}`,n)}}const s=this.registry.getStats();r.info(`[rebuildRegistry] Registry rebuilt: total=${s.total}, running=${s.running}, unknown=${s.unknown}`)}getStats(){return this.registry.getStats()}async cleanupStaleRegistry(){const e=this.registry.getAll();let s=0;for(const t of e)(t.state==="terminated"||t.state==="unknown")&&!l(t.pid)&&(await this.registry.remove(t.agentId),s++,r.debug(`[cleanupStaleRegistry] Removed stale entry: agentId=${t.agentId}, pid=${t.pid}, state=${t.state}`));return s>0&&r.info(`[cleanupStaleRegistry] Cleaned up ${s} stale registry entries`),s}async removeProcess(e){return r.info(`[removeProcess] Removing process from registry: agentId=${e}`),await this.registry.remove(e)}getProcess(e){return this.registry.get(e)}getProcessByPid(e){return this.registry.getByPid(e)}}p.instance=null;function T(){return p.getInstance()}export{p as AgentProcessManager,T as getAgentProcessManager};
2
+