aws-runtime-bridge 1.9.79 → 1.9.81

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 +5 -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,758 +1,2 @@
1
- /**
2
- * 会话管理 API 路由
3
- *
4
- * 提供 SDK Agent 会话的查询和恢复功能
5
- */
6
- import { execSync } from 'node:child_process';
7
- import { Router } from 'express';
8
- import { adapterRegistry } from '../adapter/index.js';
9
- import { validateToken } from '../middleware/auth.js';
10
- import { isProcessRunning, findOrphanProcessByAgentId, findOrphanProcessByWorkspace } from '../services/process-detector.js';
11
- import { findPersistedSessionByAgentId, loadPersistedSessions, removePersistedSession, } from '../services/terminal-persistence.js';
12
- import { createLogger } from '../utils/logger.js';
13
- import { sdkSessions, cleanupSdkSessionByAgentId } from './terminal.js';
14
- const log = createLogger('sessions');
15
- export const sessionsRouter = Router();
16
- /**
17
- * 解析 active SDK 会话快照状态。
18
- * 主流程:优先使用 adapter 细粒度状态,其次使用 terminal 路由内存里的最近 runtimeStatus,最后兼容旧会话回退 running。
19
- */
20
- export function resolveActiveSdkSessionSnapshotStatus(adapterStatus, currentRuntimeStatus, currentRuntimeActionType) {
21
- const normalizedAdapterStatus = String(adapterStatus || '').trim();
22
- if (normalizedAdapterStatus) {
23
- const normalizedRuntimeStatus = String(currentRuntimeStatus || '').trim();
24
- const normalizedActionType = String(currentRuntimeActionType || '').trim().toLowerCase();
25
- if (normalizedAdapterStatus.toLowerCase() === 'tool_using' &&
26
- normalizedRuntimeStatus.toLowerCase() === 'waiting_input' &&
27
- normalizedActionType === 'idle') {
28
- return normalizedRuntimeStatus;
29
- }
30
- return normalizedAdapterStatus;
31
- }
32
- const normalizedRuntimeStatus = String(currentRuntimeStatus || '').trim();
33
- return normalizedRuntimeStatus || 'running';
34
- }
35
- /**
36
- * 获取所有 SDK Agent 会话
37
- * GET /runtime/sessions
38
- */
39
- sessionsRouter.get('/sessions', validateToken, async (_req, res) => {
40
- try {
41
- // 1. 获取 SDK 会话
42
- const activeSdkSessions = Array.from(sdkSessions.entries()).map(([sessionId, entry]) => {
43
- const adapter = adapterRegistry.get(entry.providerId || 'claude-code');
44
- const status = resolveActiveSdkSessionSnapshotStatus(adapter.getSessionStatus(sessionId), entry.currentRuntimeStatus, entry.currentRuntimeActionType);
45
- return {
46
- sessionId,
47
- agentId: entry.agentId,
48
- workspacePath: entry.workspacePath,
49
- status,
50
- runtimeStatus: status,
51
- runtimeActionType: entry.currentRuntimeActionType,
52
- runtimeActionLabel: entry.currentRuntimeActionLabel,
53
- runtimeActionDetail: entry.currentRuntimeActionDetail,
54
- mode: 'sdk',
55
- startedAt: null,
56
- };
57
- });
58
- // 2. SDK-only:活跃会话全部来自 SDK adapter。
59
- const activeSessions = activeSdkSessions;
60
- const persistedSessions = await loadPersistedSessions();
61
- const activeSessionIds = new Set(activeSessions.map(s => s.sessionId));
62
- const persistedOnly = persistedSessions.filter(s => !activeSessionIds.has(s.sessionId));
63
- const response = {
64
- ok: true,
65
- active: activeSessions,
66
- persisted: persistedOnly,
67
- };
68
- res.json(response);
69
- }
70
- catch (error) {
71
- const err = error;
72
- res.status(500).json({ error: err.message });
73
- }
74
- });
75
- /**
76
- * 恢复终端会话
77
- * POST /runtime/sessions/recover
78
- *
79
- * �?支持孤儿进程检测:
80
- * 如果持久化会话中�?PID 且进程仍在运行,标记�?orphan_recovered
81
- */
82
- sessionsRouter.post('/sessions/recover', validateToken, async (req, res) => {
83
- const { agentId, workspacePath, command } = req.body;
84
- if (!agentId) {
85
- res.status(400).json({ error: 'agentId is required' });
86
- return;
87
- }
88
- try {
89
- // 1. 检查是否有 SDK 活跃会话
90
- const existingSdkSession = Array.from(sdkSessions.entries()).find(([, s]) => s.agentId === agentId);
91
- if (existingSdkSession) {
92
- const adapter = adapterRegistry.get(existingSdkSession[1].providerId || 'claude-code');
93
- const status = resolveActiveSdkSessionSnapshotStatus(adapter.getSessionStatus(existingSdkSession[0]), existingSdkSession[1].currentRuntimeStatus, existingSdkSession[1].currentRuntimeActionType);
94
- res.json({
95
- ok: true,
96
- sessionId: existingSdkSession[0],
97
- agentId,
98
- workspacePath: existingSdkSession[1].workspacePath,
99
- command: existingSdkSession[1].config.command,
100
- status,
101
- runtimeStatus: status,
102
- runtimeActionType: existingSdkSession[1].currentRuntimeActionType,
103
- runtimeActionLabel: existingSdkSession[1].currentRuntimeActionLabel,
104
- runtimeActionDetail: existingSdkSession[1].currentRuntimeActionDetail,
105
- mode: 'sdk',
106
- recovered: false,
107
- message: 'SDK session already active',
108
- });
109
- return;
110
- }
111
- // 3. 获取持久化会话信�?
112
- const persistedSession = await findPersistedSessionByAgentId(agentId);
113
- // �?4. 检查孤儿进程(如果持久化会话中�?PID�?
114
- let orphanDetected = false;
115
- let orphanPid;
116
- if (persistedSession?.pid && isProcessRunning(persistedSession.pid)) {
117
- orphanDetected = true;
118
- orphanPid = persistedSession.pid;
119
- log.info(`[Recover] Detected orphan process for agentId=${agentId}, pid=${persistedSession.pid}`);
120
- }
121
- else if (persistedSession?.mode === 'sdk' || !persistedSession?.pid) {
122
- // SDK 模式或无 PID,尝试通过 agentId 查找孤儿进程
123
- const orphanProcess = await findOrphanProcessByAgentId(agentId);
124
- if (orphanProcess) {
125
- orphanDetected = true;
126
- orphanPid = orphanProcess.pid;
127
- log.info(`[Recover] Found orphan process by agentId search: agentId=${agentId}, pid=${orphanProcess.pid}`);
128
- }
129
- }
130
- const resolvedWorkspacePath = workspacePath || persistedSession?.workspacePath;
131
- const resolvedCommand = command || persistedSession?.command || 'acode';
132
- const resolvedMode = persistedSession?.mode || 'sdk';
133
- if (!resolvedWorkspacePath) {
134
- res.status(400).json({ error: 'workspacePath is required (not found in persisted session)' });
135
- return;
136
- }
137
- // �?5. 如果检测到孤儿进程,返回孤儿进程信息(不启动新进程�?
138
- // �?aws-mcp-server 决定如何处理(可能需要清理或重新连接�?
139
- if (orphanDetected && orphanPid) {
140
- log.info(`[Recover] Returning orphan process info for agentId=${agentId}`);
141
- res.json({
142
- ok: true,
143
- sessionId: persistedSession?.sessionId || '',
144
- agentId,
145
- workspacePath: resolvedWorkspacePath,
146
- command: resolvedCommand,
147
- status: 'orphan_detected',
148
- runtimeStatus: persistedSession?.runtimeStatus,
149
- runtimeActionType: persistedSession?.runtimeActionType,
150
- runtimeActionLabel: persistedSession?.runtimeActionLabel,
151
- runtimeActionDetail: persistedSession?.runtimeActionDetail,
152
- recovered: false,
153
- orphan: {
154
- pid: orphanPid,
155
- message: 'Found orphan process still running. Manual intervention may be required.',
156
- },
157
- mode: resolvedMode,
158
- });
159
- return;
160
- }
161
- // 6. SDK-only 恢复不再创建本地终端;由上游重新调用 /runtime/start 创建新的 SDK 会话。
162
- await removePersistedSession(persistedSession?.sessionId || '');
163
- const result = {
164
- ok: false,
165
- sessionId: persistedSession?.sessionId || '',
166
- agentId,
167
- workspacePath: resolvedWorkspacePath,
168
- command: resolvedCommand,
169
- status: 'stopped',
170
- recovered: false,
171
- message: 'No active SDK session found; start a new SDK runtime session instead.',
172
- };
173
- res.json(result);
174
- }
175
- catch (error) {
176
- const err = error;
177
- log.error('Error:', err);
178
- res.status(500).json({ error: err.message });
179
- }
180
- });
181
- /**
182
- * 搜索残留进程(孤儿进程)
183
- * POST /runtime/search-orphan
184
- *
185
- * 根据 agentId 搜索标记了该 agentId 的残留进程(不在 runtime-bridge 管理范围内的进程�?
186
- * 用于:当 agent.isOnline �?true �?runtime-bridge 没有管理它的会话时,手动搜索残留进程
187
- *
188
- * 改进策略�?
189
- * 1. 检�?runtime-bridge 是否有活跃会�?
190
- * 2. 通过进程命令�?环境变量搜索(findOrphanProcessByAgentId�?
191
- * 3. 检查持久化会话中的 PID 是否存活(新增:即使进程列表匹配不到,PID 存活也报告)
192
- */
193
- sessionsRouter.post('/search-orphan', validateToken, async (req, res) => {
194
- const { agentId, workspacePath } = req.body;
195
- if (!agentId) {
196
- res.status(400).json({ error: 'agentId is required' });
197
- return;
198
- }
199
- try {
200
- // 1. 首先检查 runtime-bridge 是否已经有活跃 SDK 会话
201
- // ★ 同时检测陈旧会话:进程已死但 sdkSessions 中仍有残留条目时,清理并视为无活跃会话
202
- const activeSdkSessionEntry = Array.from(sdkSessions.entries()).find(([, s]) => s.agentId === agentId);
203
- let hasActiveSession = false;
204
- let activeSessionPid;
205
- let activeSessionCommand;
206
- if (activeSdkSessionEntry) {
207
- const [activeSessionId, activeEntry] = activeSdkSessionEntry;
208
- const adapter = adapterRegistry.get(activeEntry.providerId || 'claude-code');
209
- activeSessionPid = adapter.getSessionPid?.(activeSessionId);
210
- activeSessionCommand = activeEntry.config?.command;
211
- const isPidAlive = activeSessionPid ? isProcessRunning(activeSessionPid) : false;
212
- const sessionStatus = adapter.getSessionStatus(activeSessionId);
213
- const isSessionDeadStatus = sessionStatus === 'completed' ||
214
- sessionStatus === 'terminated' ||
215
- sessionStatus === 'error';
216
- if (isPidAlive) {
217
- // 外部 CLI provider(claude-code/opencode):进程存活,视为活跃会话
218
- hasActiveSession = true;
219
- }
220
- else if (activeSessionPid && !isPidAlive) {
221
- // PID 存在但进程已死亡 - 清理陈旧会话
222
- log.info(`[search-orphan] Cleaning up stale SDK session (process dead): agentId=${agentId}, sessionId=${activeSessionId}, pid=${activeSessionPid}`);
223
- sdkSessions.delete(activeSessionId);
224
- await removePersistedSession(activeSessionId);
225
- }
226
- else if (isSessionDeadStatus) {
227
- // 无 PID(in-process provider 如 ACode)且会话已结束 - 清理陈旧会话
228
- log.info(`[search-orphan] Cleaning up stale in-process SDK session (status=${sessionStatus}): agentId=${agentId}, sessionId=${activeSessionId}`);
229
- try {
230
- await adapter.terminateSession(activeSessionId);
231
- }
232
- catch (e) {
233
- log.warn(`[search-orphan] Failed to terminate stale in-process session: ${e}`);
234
- }
235
- sdkSessions.delete(activeSessionId);
236
- await removePersistedSession(activeSessionId);
237
- }
238
- else {
239
- // 无 PID 且会话仍存活(in-process provider,如 ACode)
240
- // WebSocket 断开导致前端显示 LOST,但 in-process 运行时仍在运行且不可达
241
- // 终止会话以释放资源,然后清理
242
- log.info(`[search-orphan] Terminating unreachable in-process SDK session: agentId=${agentId}, sessionId=${activeSessionId}, status=${sessionStatus || 'unknown'}`);
243
- try {
244
- await adapter.abortCurrentTurn(activeSessionId).catch(() => { });
245
- await adapter.terminateSession(activeSessionId);
246
- }
247
- catch (e) {
248
- log.warn(`[search-orphan] Failed to terminate in-process session: ${e}`);
249
- }
250
- sdkSessions.delete(activeSessionId);
251
- await removePersistedSession(activeSessionId);
252
- }
253
- }
254
- // 2. 搜索标记了该 agentId 的进程(命令 + 环境变量 + 进程树匹配)
255
- const orphanProcess = await findOrphanProcessByAgentId(agentId);
256
- // 3. 如果找到残留进程,返回进程信息
257
- if (orphanProcess) {
258
- log.info(`[search-orphan] Found orphan process for agentId=${agentId}, pid=${orphanProcess.pid}`);
259
- res.json({
260
- ok: true,
261
- agentId,
262
- hasActiveSession,
263
- found: true,
264
- orphan: {
265
- pid: orphanProcess.pid,
266
- command: orphanProcess.command,
267
- cwd: orphanProcess.cwd,
268
- startedAt: orphanProcess.startedAt,
269
- message: 'Found orphan process. Click terminate to stop it.',
270
- },
271
- });
272
- return;
273
- }
274
- // 3.5 活跃会话的进程仍然存活时,将其作为可终止的残留进程返回
275
- // 场景:WebSocket 断开导致前端显示 LOST/zombie,但 SDK 进程仍在运行且不可达
276
- // 用户可以通过终止该进程来清理僵尸状态
277
- if (hasActiveSession && activeSessionPid) {
278
- log.info(`[search-orphan] Active session process still running, reporting as terminable orphan: agentId=${agentId}, pid=${activeSessionPid}`);
279
- res.json({
280
- ok: true,
281
- agentId,
282
- hasActiveSession: true,
283
- found: true,
284
- orphan: {
285
- pid: activeSessionPid,
286
- command: activeSessionCommand || '(active SDK session)',
287
- message: 'Found active SDK session process. Click terminate to stop it.',
288
- },
289
- });
290
- return;
291
- }
292
- // 4. 检查持久化会话中的 PID 是否仍然存活
293
- // 即使进程列表匹配不到(命令行特征未识别),PID 存活说明进程仍在运行
294
- const persistedSession = await findPersistedSessionByAgentId(agentId);
295
- if (persistedSession?.pid && isProcessRunning(persistedSession.pid)) {
296
- log.info(`[search-orphan] Found orphan by persisted PID: agentId=${agentId}, pid=${persistedSession.pid}`);
297
- res.json({
298
- ok: true,
299
- agentId,
300
- hasActiveSession,
301
- found: true,
302
- orphan: {
303
- pid: persistedSession.pid,
304
- command: persistedSession.command || '(persisted session)',
305
- message: 'Found orphan process by persisted PID. Click terminate to stop it.',
306
- },
307
- });
308
- return;
309
- }
310
- // �?5. 通过工作目录宽泛搜索(当 agentId 和持久化 PID 都匹配不到时�?
311
- // 前端传递的 workspacePath,或者从持久化会话中获取
312
- const searchWorkspace = workspacePath || persistedSession?.workspacePath;
313
- if (searchWorkspace) {
314
- const workspaceOrphan = await findOrphanProcessByWorkspace(searchWorkspace);
315
- if (workspaceOrphan) {
316
- log.info(`[search-orphan] Found orphan by workspace: agentId=${agentId}, pid=${workspaceOrphan.pid}, workspace=${searchWorkspace}`);
317
- res.json({
318
- ok: true,
319
- agentId,
320
- hasActiveSession,
321
- found: true,
322
- orphan: {
323
- pid: workspaceOrphan.pid,
324
- command: workspaceOrphan.command,
325
- message: 'Found orphan process by workspace path. Click terminate to stop it.',
326
- },
327
- });
328
- return;
329
- }
330
- }
331
- // 6. 没找到残留进�?
332
- log.info(`[search-orphan] No orphan process found for agentId=${agentId}, hasActiveSession=${!!hasActiveSession}`);
333
- res.json({
334
- ok: true,
335
- agentId,
336
- hasActiveSession: !!hasActiveSession,
337
- found: false,
338
- orphan: null,
339
- message: hasActiveSession
340
- ? 'Agent has active session in runtime-bridge'
341
- : 'No orphan process and no active session found',
342
- });
343
- }
344
- catch (error) {
345
- const err = error;
346
- log.error('[search-orphan] Error:', err);
347
- res.status(500).json({ error: err.message });
348
- }
349
- });
350
- /**
351
- * 终止残留进程
352
- * POST /runtime/terminate-orphan
353
- *
354
- * 终止�?search-orphan 找到的残留进�?
355
- */
356
- sessionsRouter.post('/terminate-orphan', validateToken, async (req, res) => {
357
- const { agentId, pid } = req.body;
358
- if (!agentId || !pid) {
359
- res.status(400).json({ error: 'agentId and pid are required' });
360
- return;
361
- }
362
- try {
363
- // 0. 清理 sdkSessions 中匹配 agentId 的活跃会话条目
364
- // 场景:/search-orphan 将活跃会话的 PID 作为残留进程返回,用户终止该进程后需要清理 bridge 侧的会话状态
365
- const activeSessionEntry = Array.from(sdkSessions.entries()).find(([, s]) => s.agentId === agentId);
366
- if (activeSessionEntry) {
367
- const [activeSessionId, activeEntry] = activeSessionEntry;
368
- const adapter = adapterRegistry.get(activeEntry.providerId || 'claude-code');
369
- try {
370
- await adapter.terminateSession(activeSessionId);
371
- }
372
- catch (e) {
373
- log.warn(`[terminate-orphan] Failed to terminate SDK session for agentId=${agentId}:`, e);
374
- }
375
- sdkSessions.delete(activeSessionId);
376
- await removePersistedSession(activeSessionId);
377
- log.info(`[terminate-orphan] Cleaned up SDK session for agentId=${agentId}, sessionId=${activeSessionId}`);
378
- }
379
- // 1. 检查进程是否还在运行
380
- if (!isProcessRunning(pid)) {
381
- res.json({
382
- ok: true,
383
- agentId,
384
- pid,
385
- terminated: false,
386
- message: 'Process already terminated',
387
- });
388
- return;
389
- }
390
- // 2. 终止进程(在 Windows 上使�?taskkill,Unix 上使�?kill�?
391
- const platform = process.platform;
392
- let success = false;
393
- if (platform === 'win32') {
394
- try {
395
- execSync(`taskkill /PID ${pid} /T /F`, { encoding: 'utf8', timeout: 5000 });
396
- success = true;
397
- }
398
- catch (e) {
399
- log.warn(`[terminate-orphan] taskkill failed for pid=${pid}:`, e);
400
- }
401
- }
402
- else {
403
- try {
404
- process.kill(pid, 'SIGTERM');
405
- success = true;
406
- }
407
- catch (e) {
408
- log.warn(`[terminate-orphan] kill failed for pid=${pid}:`, e);
409
- }
410
- }
411
- if (success) {
412
- log.info(`[terminate-orphan] Terminated orphan process for agentId=${agentId}, pid=${pid}`);
413
- res.json({
414
- ok: true,
415
- agentId,
416
- pid,
417
- terminated: true,
418
- message: 'Orphan process terminated successfully',
419
- });
420
- }
421
- else {
422
- res.json({
423
- ok: true,
424
- agentId,
425
- pid,
426
- terminated: false,
427
- message: 'Failed to terminate process',
428
- });
429
- }
430
- }
431
- catch (error) {
432
- const err = error;
433
- log.error('[terminate-orphan] Error:', err);
434
- res.status(500).json({ error: err.message });
435
- }
436
- });
437
- /**
438
- * 根据 agentId 获取会话状�?
439
- * GET /runtime/sessions/by-agent/:agentId
440
- *
441
- * 增强返回:包含进程健康状态、是否是孤儿进程等信�?
442
- */
443
- sessionsRouter.get('/sessions/by-agent/:agentId', validateToken, async (req, res) => {
444
- const agentIdParam = req.params.agentId;
445
- const agentId = Array.isArray(agentIdParam) ? agentIdParam[0] : agentIdParam;
446
- if (!agentId) {
447
- res.status(400).json({ error: 'agentId is required' });
448
- return;
449
- }
450
- try {
451
- // 1. 检查活跃 SDK 会话
452
- const activeSdkSession = Array.from(sdkSessions.entries()).find(([, s]) => s.agentId === agentId);
453
- if (activeSdkSession) {
454
- const adapter = adapterRegistry.get(activeSdkSession[1].providerId || 'claude-code');
455
- const pid = adapter.getSessionPid?.(activeSdkSession[0]);
456
- const status = resolveActiveSdkSessionSnapshotStatus(adapter.getSessionStatus(activeSdkSession[0]), activeSdkSession[1].currentRuntimeStatus, activeSdkSession[1].currentRuntimeActionType);
457
- res.json({
458
- ok: true,
459
- sessionId: activeSdkSession[0],
460
- agentId,
461
- workspacePath: activeSdkSession[1].workspacePath,
462
- status,
463
- runtimeStatus: status,
464
- isActive: true,
465
- mode: 'sdk',
466
- pid,
467
- isManaged: true,
468
- providerId: activeSdkSession[1].providerId,
469
- });
470
- return;
471
- }
472
- // 2. 检查持久化会话
473
- const persistedSession = await findPersistedSessionByAgentId(agentId);
474
- if (persistedSession) {
475
- // 检查进程是否仍在运�?
476
- const { isProcessRunning } = await import('../services/process-detector.js');
477
- const isProcessAlive = persistedSession.pid ? isProcessRunning(persistedSession.pid) : false;
478
- res.json({
479
- ok: true,
480
- sessionId: persistedSession.sessionId,
481
- agentId,
482
- workspacePath: persistedSession.workspacePath,
483
- command: persistedSession.command,
484
- status: isProcessAlive ? 'orphan' : 'stopped',
485
- runtimeStatus: persistedSession.runtimeStatus,
486
- runtimeActionType: persistedSession.runtimeActionType,
487
- runtimeActionLabel: persistedSession.runtimeActionLabel,
488
- runtimeActionDetail: persistedSession.runtimeActionDetail,
489
- startedAt: persistedSession.startedAt,
490
- isActive: false,
491
- mode: persistedSession.mode,
492
- pid: persistedSession.pid,
493
- isManaged: false,
494
- isProcessAlive,
495
- isOrphan: isProcessAlive, // 进程在运行但 bridge 未管�?
496
- });
497
- return;
498
- }
499
- res.json({
500
- ok: true,
501
- agentId,
502
- status: 'none',
503
- isActive: false,
504
- isManaged: false,
505
- });
506
- }
507
- catch (error) {
508
- const err = error;
509
- log.error('[sessions/by-agent] Error:', err);
510
- res.status(500).json({ error: err.message });
511
- }
512
- });
513
- /**
514
- * 接管已存在的SDK会话
515
- * POST /runtime/takeover-session
516
- *
517
- * 当aws-mcp-server重启后,用于重新获取bridge中已存在的SDK会话控制�?
518
- * 不会启动新进程,只是重新建立会话关联
519
- */
520
- sessionsRouter.post('/takeover-session', validateToken, async (req, res) => {
521
- const { agentId } = req.body;
522
- if (!agentId) {
523
- res.status(400).json({ error: 'agentId is required' });
524
- return;
525
- }
526
- try {
527
- // 1. 检查是否已有活跃 SDK 会话
528
- const existingSdkSession = Array.from(sdkSessions.entries()).find(([, s]) => s.agentId === agentId);
529
- if (existingSdkSession) {
530
- res.json({
531
- ok: true,
532
- agentId,
533
- sessionId: existingSdkSession[0],
534
- mode: 'sdk',
535
- status: 'running',
536
- isActive: true,
537
- recovered: false,
538
- message: 'SDK session already active',
539
- });
540
- return;
541
- }
542
- // 2. 查找持久化会�?
543
- const persistedSession = await findPersistedSessionByAgentId(agentId);
544
- if (!persistedSession) {
545
- res.status(404).json({
546
- error: 'No persisted session found for this agentId',
547
- agentId,
548
- });
549
- return;
550
- }
551
- // 3. 检查 SDK 进程是否仍在运行
552
- let isProcessAlive = false;
553
- if (persistedSession.mode === 'sdk') {
554
- // 对于SDK模式,尝试通过agentId查找进程
555
- const orphanProcess = await findOrphanProcessByAgentId(agentId);
556
- isProcessAlive = !!orphanProcess;
557
- if (!isProcessAlive && persistedSession.pid) {
558
- // 如果通过agentId没找到,尝试通过PID检�?
559
- isProcessAlive = isProcessRunning(persistedSession.pid);
560
- }
561
- }
562
- if (!isProcessAlive) {
563
- log.info(`[takeover-session] Process not alive for agentId=${agentId}, mode=${persistedSession.mode}`);
564
- res.json({
565
- ok: false,
566
- agentId,
567
- status: 'process_not_alive',
568
- isActive: false,
569
- message: 'Agent process is no longer running',
570
- });
571
- return;
572
- }
573
- // 5. 进程仍在运行,恢复会话控�?
574
- log.info(`[takeover-session] Taking over session for agentId=${agentId}, mode=${persistedSession.mode}, pid=${persistedSession.pid}`);
575
- // 如果是SDK模式,检查是否已经有活跃的SDK会话(bridge重启后可能丢失)
576
- if (persistedSession.mode === 'sdk') {
577
- // 尝试通过进程检测找到实际的SDK进程
578
- const orphanProcess = await findOrphanProcessByAgentId(agentId);
579
- if (orphanProcess) {
580
- log.info(`[takeover-session] Found SDK process for agentId=${agentId}, pid=${orphanProcess.pid}`);
581
- // �?重要:SDK模式下,进程仍在运行,但bridge的内存中可能没有sdkSessions记录
582
- // 我们需要告诉aws-mcp-server这个session可以被接�?
583
- // aws-mcp-server会通过WebSocket重新连接到这个SDK进程
584
- res.json({
585
- ok: true,
586
- agentId,
587
- sessionId: persistedSession.sessionId,
588
- mode: 'sdk',
589
- status: 'running',
590
- isActive: true,
591
- recovered: true,
592
- pid: orphanProcess.pid || persistedSession.pid,
593
- message: 'SDK session process found, can be taken over by aws-mcp-server',
594
- });
595
- }
596
- else {
597
- // 进程不在运行
598
- res.json({
599
- ok: false,
600
- agentId,
601
- status: 'process_not_alive',
602
- isActive: false,
603
- message: 'SDK process not found',
604
- });
605
- }
606
- }
607
- else {
608
- res.status(410).json({
609
- error: 'Session takeover is no longer supported; start a new SDK runtime session.',
610
- agentId,
611
- mode: 'sdk',
612
- });
613
- }
614
- }
615
- catch (error) {
616
- const err = error;
617
- log.error('[takeover-session] Error:', err);
618
- res.status(500).json({ error: err.message });
619
- }
620
- });
621
- /**
622
- * 强制终止 Agent 进程树(包括所有子进程�?
623
- * POST /runtime/terminate-tree
624
- *
625
- * 用于:当 Agent 脱离控制时,强制终止整个进程�?
626
- */
627
- sessionsRouter.post('/terminate-tree', validateToken, async (req, res) => {
628
- const { agentId, sessionId } = req.body;
629
- if (!agentId) {
630
- res.status(400).json({ error: 'agentId is required' });
631
- return;
632
- }
633
- try {
634
- // 1. 查找会话(优先使�?sessionId,否则通过 agentId 查找�?
635
- let targetSessionId = sessionId;
636
- if (!targetSessionId) {
637
- const persistedSession = await findPersistedSessionByAgentId(agentId);
638
- if (!persistedSession) {
639
- res.status(404).json({ error: 'Session not found for this agentId' });
640
- return;
641
- }
642
- targetSessionId = persistedSession.sessionId;
643
- }
644
- // 2. 检查是否是活跃会话
645
- const activeSdkSession = sdkSessions.get(targetSessionId);
646
- let pid;
647
- let mode;
648
- if (activeSdkSession) {
649
- const adapter = adapterRegistry.get(activeSdkSession.providerId || 'claude-code');
650
- pid = adapter.getSessionPid?.(targetSessionId);
651
- mode = 'sdk';
652
- }
653
- else {
654
- // 非活跃会话,从持久化中获取 PID
655
- const persistedSession = await findPersistedSessionByAgentId(agentId);
656
- if (!persistedSession?.pid) {
657
- res.status(404).json({ error: 'Session PID not found' });
658
- return;
659
- }
660
- pid = persistedSession.pid;
661
- mode = persistedSession.mode || 'sdk';
662
- }
663
- // 3. 终止进程树
664
- const { terminateProcessTree, waitForProcessExit } = await import('../services/process-detector.js');
665
- // pid 此时一定存在(前面已经检查过)
666
- if (!pid) {
667
- res.status(404).json({ error: 'PID not found' });
668
- return;
669
- }
670
- const result = await terminateProcessTree(pid);
671
- // 4. 等待进程完全终止(最多 5 秒)
672
- const exited = await waitForProcessExit(pid, 5000);
673
- // ★ 关键修复:terminate-tree 后清理 bridge 内部内存状态
674
- // 防止 sdkSessions 残留条目阻塞后续启动
675
- cleanupSdkSessionByAgentId(agentId);
676
- // 5. 清理持久化状�?
677
- await import('../services/terminal-persistence.js').then(m => m.removePersistedSession(targetSessionId));
678
- log.info(`[terminate-tree] Terminated process tree for agentId=${agentId}, pid=${pid}, mode=${mode}, terminated=${result.terminated}, failed=${result.failed}, exited=${exited}`);
679
- res.json({
680
- ok: true,
681
- agentId,
682
- pid,
683
- mode,
684
- terminated: result.terminated,
685
- failed: result.failed,
686
- exited,
687
- message: exited
688
- ? `Successfully terminated ${result.terminated} processes`
689
- : `Terminated ${result.terminated} processes, but process ${pid} still running`,
690
- });
691
- }
692
- catch (error) {
693
- const err = error;
694
- log.error('[terminate-tree] Error:', err);
695
- res.status(500).json({ error: err.message });
696
- }
697
- });
698
- /**
699
- * 获取 Agent 健康状态
700
- * GET /runtime/health/:agentId
701
- *
702
- * 返回:
703
- * - 进程是否存活
704
- * - CPU/内存使用率
705
- * - 是否是孤儿进程(bridge 未管理)
706
- * - 会话详细信息
707
- */
708
- sessionsRouter.get('/health/:agentId', validateToken, async (req, res) => {
709
- const agentIdParam = req.params.agentId;
710
- const agentId = Array.isArray(agentIdParam) ? agentIdParam[0] : agentIdParam;
711
- if (!agentId) {
712
- res.status(400).json({ error: 'agentId is required' });
713
- return;
714
- }
715
- try {
716
- // 1. 查找会话
717
- const persistedSession = await findPersistedSessionByAgentId(agentId);
718
- if (!persistedSession) {
719
- res.status(404).json({ error: 'Session not found' });
720
- return;
721
- }
722
- // 2. 检查是否是活跃会话
723
- const activeSdkSession = sdkSessions.get(persistedSession.sessionId);
724
- const isManaged = !!activeSdkSession;
725
- // 3. 获取健康状态
726
- const { checkProcessHealth } = await import('../services/process-detector.js');
727
- const healthResponse = {
728
- sessionId: persistedSession.sessionId,
729
- mode: persistedSession.mode,
730
- workspacePath: persistedSession.workspacePath,
731
- isManaged,
732
- isActive: !!activeSdkSession,
733
- };
734
- if (persistedSession.pid) {
735
- const health = await checkProcessHealth(persistedSession.pid, agentId);
736
- Object.assign(healthResponse, health);
737
- }
738
- else {
739
- Object.assign(healthResponse, {
740
- pid: 0,
741
- alive: false,
742
- cpu: 0,
743
- memoryMB: 0,
744
- status: 'dead',
745
- lastUpdate: new Date(),
746
- });
747
- }
748
- res.json({
749
- agentId,
750
- ...healthResponse,
751
- });
752
- }
753
- catch (error) {
754
- const err = error;
755
- log.error('[health] Error:', err);
756
- res.status(500).json({ error: err.message });
757
- }
758
- });
1
+ import{execSync as b}from"node:child_process";import{Router as R}from"express";import{adapterRegistry as k}from"../adapter/index.js";import{validateToken as h}from"../middleware/auth.js";import{isProcessRunning as y,findOrphanProcessByAgentId as P,findOrphanProcessByWorkspace as T}from"../services/process-detector.js";import{findPersistedSessionByAgentId as I,loadPersistedSessions as F,removePersistedSession as A}from"../services/terminal-persistence.js";import{createLogger as K}from"../utils/logger.js";import{sdkSessions as g,cleanupSdkSessionByAgentId as C}from"./terminal.js";const c=K("sessions"),S=R();function j(m,n,e){const r=String(m||"").trim();if(r){const s=String(n||"").trim(),t=String(e||"").trim().toLowerCase();return r.toLowerCase()==="tool_using"&&s.toLowerCase()==="waiting_input"&&t==="idle"?s:r}return String(n||"").trim()||"running"}S.get("/sessions",h,async(m,n)=>{try{const r=Array.from(g.entries()).map(([d,p])=>{const u=k.get(p.providerId||"claude-code"),a=j(u.getSessionStatus(d),p.currentRuntimeStatus,p.currentRuntimeActionType);return{sessionId:d,agentId:p.agentId,workspacePath:p.workspacePath,status:a,runtimeStatus:a,runtimeActionType:p.currentRuntimeActionType,runtimeActionLabel:p.currentRuntimeActionLabel,runtimeActionDetail:p.currentRuntimeActionDetail,mode:"sdk",startedAt:null}}),o=await F(),s=new Set(r.map(d=>d.sessionId)),t=o.filter(d=>!s.has(d.sessionId)),i={ok:!0,active:r,persisted:t};n.json(i)}catch(e){const r=e;n.status(500).json({error:r.message})}}),S.post("/sessions/recover",h,async(m,n)=>{const{agentId:e,workspacePath:r,command:o}=m.body;if(!e){n.status(400).json({error:"agentId is required"});return}try{const s=Array.from(g.entries()).find(([,f])=>f.agentId===e);if(s){const f=k.get(s[1].providerId||"claude-code"),v=j(f.getSessionStatus(s[0]),s[1].currentRuntimeStatus,s[1].currentRuntimeActionType);n.json({ok:!0,sessionId:s[0],agentId:e,workspacePath:s[1].workspacePath,command:s[1].config.command,status:v,runtimeStatus:v,runtimeActionType:s[1].currentRuntimeActionType,runtimeActionLabel:s[1].currentRuntimeActionLabel,runtimeActionDetail:s[1].currentRuntimeActionDetail,mode:"sdk",recovered:!1,message:"SDK session already active"});return}const t=await I(e);let i=!1,d;if(t?.pid&&y(t.pid))i=!0,d=t.pid,c.info(`[Recover] Detected orphan process for agentId=${e}, pid=${t.pid}`);else if(t?.mode==="sdk"||!t?.pid){const f=await P(e);f&&(i=!0,d=f.pid,c.info(`[Recover] Found orphan process by agentId search: agentId=${e}, pid=${f.pid}`))}const p=r||t?.workspacePath,u=o||t?.command||"acode",a=t?.mode||"sdk";if(!p){n.status(400).json({error:"workspacePath is required (not found in persisted session)"});return}if(i&&d){c.info(`[Recover] Returning orphan process info for agentId=${e}`),n.json({ok:!0,sessionId:t?.sessionId||"",agentId:e,workspacePath:p,command:u,status:"orphan_detected",runtimeStatus:t?.runtimeStatus,runtimeActionType:t?.runtimeActionType,runtimeActionLabel:t?.runtimeActionLabel,runtimeActionDetail:t?.runtimeActionDetail,recovered:!1,orphan:{pid:d,message:"Found orphan process still running. Manual intervention may be required."},mode:a});return}await A(t?.sessionId||"");const l={ok:!1,sessionId:t?.sessionId||"",agentId:e,workspacePath:p,command:u,status:"stopped",recovered:!1,message:"No active SDK session found; start a new SDK runtime session instead."};n.json(l)}catch(s){const t=s;c.error("Error:",t),n.status(500).json({error:t.message})}}),S.post("/search-orphan",h,async(m,n)=>{const{agentId:e,workspacePath:r}=m.body;if(!e){n.status(400).json({error:"agentId is required"});return}try{const o=Array.from(g.entries()).find(([,a])=>a.agentId===e);let s=!1,t,i;if(o){const[a,l]=o,f=k.get(l.providerId||"claude-code");t=f.getSessionPid?.(a),i=l.config?.command;const v=t?y(t):!1,w=f.getSessionStatus(a),D=w==="completed"||w==="terminated"||w==="error";if(v)s=!0;else if(t&&!v)c.info(`[search-orphan] Cleaning up stale SDK session (process dead): agentId=${e}, sessionId=${a}, pid=${t}`),g.delete(a),await A(a);else if(D){c.info(`[search-orphan] Cleaning up stale in-process SDK session (status=${w}): agentId=${e}, sessionId=${a}`);try{await f.terminateSession(a)}catch($){c.warn(`[search-orphan] Failed to terminate stale in-process session: ${$}`)}g.delete(a),await A(a)}else{c.info(`[search-orphan] Terminating unreachable in-process SDK session: agentId=${e}, sessionId=${a}, status=${w||"unknown"}`);try{await f.abortCurrentTurn(a).catch(()=>{}),await f.terminateSession(a)}catch($){c.warn(`[search-orphan] Failed to terminate in-process session: ${$}`)}g.delete(a),await A(a)}}const d=await P(e);if(d){c.info(`[search-orphan] Found orphan process for agentId=${e}, pid=${d.pid}`),n.json({ok:!0,agentId:e,hasActiveSession:s,found:!0,orphan:{pid:d.pid,command:d.command,cwd:d.cwd,startedAt:d.startedAt,message:"Found orphan process. Click terminate to stop it."}});return}if(s&&t){c.info(`[search-orphan] Active session process still running, reporting as terminable orphan: agentId=${e}, pid=${t}`),n.json({ok:!0,agentId:e,hasActiveSession:!0,found:!0,orphan:{pid:t,command:i||"(active SDK session)",message:"Found active SDK session process. Click terminate to stop it."}});return}const p=await I(e);if(p?.pid&&y(p.pid)){c.info(`[search-orphan] Found orphan by persisted PID: agentId=${e}, pid=${p.pid}`),n.json({ok:!0,agentId:e,hasActiveSession:s,found:!0,orphan:{pid:p.pid,command:p.command||"(persisted session)",message:"Found orphan process by persisted PID. Click terminate to stop it."}});return}const u=r||p?.workspacePath;if(u){const a=await T(u);if(a){c.info(`[search-orphan] Found orphan by workspace: agentId=${e}, pid=${a.pid}, workspace=${u}`),n.json({ok:!0,agentId:e,hasActiveSession:s,found:!0,orphan:{pid:a.pid,command:a.command,message:"Found orphan process by workspace path. Click terminate to stop it."}});return}}c.info(`[search-orphan] No orphan process found for agentId=${e}, hasActiveSession=${!!s}`),n.json({ok:!0,agentId:e,hasActiveSession:!!s,found:!1,orphan:null,message:s?"Agent has active session in runtime-bridge":"No orphan process and no active session found"})}catch(o){const s=o;c.error("[search-orphan] Error:",s),n.status(500).json({error:s.message})}}),S.post("/terminate-orphan",h,async(m,n)=>{const{agentId:e,pid:r}=m.body;if(!e||!r){n.status(400).json({error:"agentId and pid are required"});return}try{const o=Array.from(g.entries()).find(([,i])=>i.agentId===e);if(o){const[i,d]=o,p=k.get(d.providerId||"claude-code");try{await p.terminateSession(i)}catch(u){c.warn(`[terminate-orphan] Failed to terminate SDK session for agentId=${e}:`,u)}g.delete(i),await A(i),c.info(`[terminate-orphan] Cleaned up SDK session for agentId=${e}, sessionId=${i}`)}if(!y(r)){n.json({ok:!0,agentId:e,pid:r,terminated:!1,message:"Process already terminated"});return}const s=process.platform;let t=!1;if(s==="win32")try{b(`taskkill /PID ${r} /T /F`,{encoding:"utf8",timeout:5e3}),t=!0}catch(i){c.warn(`[terminate-orphan] taskkill failed for pid=${r}:`,i)}else try{process.kill(r,"SIGTERM"),t=!0}catch(i){c.warn(`[terminate-orphan] kill failed for pid=${r}:`,i)}t?(c.info(`[terminate-orphan] Terminated orphan process for agentId=${e}, pid=${r}`),n.json({ok:!0,agentId:e,pid:r,terminated:!0,message:"Orphan process terminated successfully"})):n.json({ok:!0,agentId:e,pid:r,terminated:!1,message:"Failed to terminate process"})}catch(o){const s=o;c.error("[terminate-orphan] Error:",s),n.status(500).json({error:s.message})}}),S.get("/sessions/by-agent/:agentId",h,async(m,n)=>{const e=m.params.agentId,r=Array.isArray(e)?e[0]:e;if(!r){n.status(400).json({error:"agentId is required"});return}try{const o=Array.from(g.entries()).find(([,t])=>t.agentId===r);if(o){const t=k.get(o[1].providerId||"claude-code"),i=t.getSessionPid?.(o[0]),d=j(t.getSessionStatus(o[0]),o[1].currentRuntimeStatus,o[1].currentRuntimeActionType);n.json({ok:!0,sessionId:o[0],agentId:r,workspacePath:o[1].workspacePath,status:d,runtimeStatus:d,isActive:!0,mode:"sdk",pid:i,isManaged:!0,providerId:o[1].providerId});return}const s=await I(r);if(s){const{isProcessRunning:t}=await import("../services/process-detector.js"),i=s.pid?t(s.pid):!1;n.json({ok:!0,sessionId:s.sessionId,agentId:r,workspacePath:s.workspacePath,command:s.command,status:i?"orphan":"stopped",runtimeStatus:s.runtimeStatus,runtimeActionType:s.runtimeActionType,runtimeActionLabel:s.runtimeActionLabel,runtimeActionDetail:s.runtimeActionDetail,startedAt:s.startedAt,isActive:!1,mode:s.mode,pid:s.pid,isManaged:!1,isProcessAlive:i,isOrphan:i});return}n.json({ok:!0,agentId:r,status:"none",isActive:!1,isManaged:!1})}catch(o){const s=o;c.error("[sessions/by-agent] Error:",s),n.status(500).json({error:s.message})}}),S.post("/takeover-session",h,async(m,n)=>{const{agentId:e}=m.body;if(!e){n.status(400).json({error:"agentId is required"});return}try{const r=Array.from(g.entries()).find(([,t])=>t.agentId===e);if(r){n.json({ok:!0,agentId:e,sessionId:r[0],mode:"sdk",status:"running",isActive:!0,recovered:!1,message:"SDK session already active"});return}const o=await I(e);if(!o){n.status(404).json({error:"No persisted session found for this agentId",agentId:e});return}let s=!1;if(o.mode==="sdk"&&(s=!!await P(e),!s&&o.pid&&(s=y(o.pid))),!s){c.info(`[takeover-session] Process not alive for agentId=${e}, mode=${o.mode}`),n.json({ok:!1,agentId:e,status:"process_not_alive",isActive:!1,message:"Agent process is no longer running"});return}if(c.info(`[takeover-session] Taking over session for agentId=${e}, mode=${o.mode}, pid=${o.pid}`),o.mode==="sdk"){const t=await P(e);t?(c.info(`[takeover-session] Found SDK process for agentId=${e}, pid=${t.pid}`),n.json({ok:!0,agentId:e,sessionId:o.sessionId,mode:"sdk",status:"running",isActive:!0,recovered:!0,pid:t.pid||o.pid,message:"SDK session process found, can be taken over by aws-mcp-server"})):n.json({ok:!1,agentId:e,status:"process_not_alive",isActive:!1,message:"SDK process not found"})}else n.status(410).json({error:"Session takeover is no longer supported; start a new SDK runtime session.",agentId:e,mode:"sdk"})}catch(r){const o=r;c.error("[takeover-session] Error:",o),n.status(500).json({error:o.message})}}),S.post("/terminate-tree",h,async(m,n)=>{const{agentId:e,sessionId:r}=m.body;if(!e){n.status(400).json({error:"agentId is required"});return}try{let o=r;if(!o){const l=await I(e);if(!l){n.status(404).json({error:"Session not found for this agentId"});return}o=l.sessionId}const s=g.get(o);let t,i;if(s)t=k.get(s.providerId||"claude-code").getSessionPid?.(o),i="sdk";else{const l=await I(e);if(!l?.pid){n.status(404).json({error:"Session PID not found"});return}t=l.pid,i=l.mode||"sdk"}const{terminateProcessTree:d,waitForProcessExit:p}=await import("../services/process-detector.js");if(!t){n.status(404).json({error:"PID not found"});return}const u=await d(t),a=await p(t,5e3);C(e),await import("../services/terminal-persistence.js").then(l=>l.removePersistedSession(o)),c.info(`[terminate-tree] Terminated process tree for agentId=${e}, pid=${t}, mode=${i}, terminated=${u.terminated}, failed=${u.failed}, exited=${a}`),n.json({ok:!0,agentId:e,pid:t,mode:i,terminated:u.terminated,failed:u.failed,exited:a,message:a?`Successfully terminated ${u.terminated} processes`:`Terminated ${u.terminated} processes, but process ${t} still running`})}catch(o){const s=o;c.error("[terminate-tree] Error:",s),n.status(500).json({error:s.message})}}),S.get("/health/:agentId",h,async(m,n)=>{const e=m.params.agentId,r=Array.isArray(e)?e[0]:e;if(!r){n.status(400).json({error:"agentId is required"});return}try{const o=await I(r);if(!o){n.status(404).json({error:"Session not found"});return}const s=g.get(o.sessionId),t=!!s,{checkProcessHealth:i}=await import("../services/process-detector.js"),d={sessionId:o.sessionId,mode:o.mode,workspacePath:o.workspacePath,isManaged:t,isActive:!!s};if(o.pid){const p=await i(o.pid,r);Object.assign(d,p)}else Object.assign(d,{pid:0,alive:!1,cpu:0,memoryMB:0,status:"dead",lastUpdate:new Date});n.json({agentId:r,...d})}catch(o){const s=o;c.error("[health] Error:",s),n.status(500).json({error:s.message})}});export{j as resolveActiveSdkSessionSnapshotStatus,S as sessionsRouter};
2
+