aws-runtime-bridge 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. package/README.md +56 -0
  2. package/dist/adapter/AdapterRegistry.d.ts +53 -0
  3. package/dist/adapter/AdapterRegistry.d.ts.map +1 -0
  4. package/dist/adapter/AdapterRegistry.js +100 -0
  5. package/dist/adapter/AdapterRegistry.test.d.ts +5 -0
  6. package/dist/adapter/AdapterRegistry.test.d.ts.map +1 -0
  7. package/dist/adapter/AdapterRegistry.test.js +109 -0
  8. package/dist/adapter/ClaudeSdkAdapter.d.ts +120 -0
  9. package/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -0
  10. package/dist/adapter/ClaudeSdkAdapter.js +1140 -0
  11. package/dist/adapter/ClaudeSdkAdapter.test.d.ts +2 -0
  12. package/dist/adapter/ClaudeSdkAdapter.test.d.ts.map +1 -0
  13. package/dist/adapter/ClaudeSdkAdapter.test.js +95 -0
  14. package/dist/adapter/CodexSdkAdapter.d.ts +48 -0
  15. package/dist/adapter/CodexSdkAdapter.d.ts.map +1 -0
  16. package/dist/adapter/CodexSdkAdapter.js +750 -0
  17. package/dist/adapter/CodexSdkAdapter.test.d.ts +2 -0
  18. package/dist/adapter/CodexSdkAdapter.test.d.ts.map +1 -0
  19. package/dist/adapter/CodexSdkAdapter.test.js +245 -0
  20. package/dist/adapter/OpencodeSdkAdapter.d.ts +45 -0
  21. package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -0
  22. package/dist/adapter/OpencodeSdkAdapter.js +622 -0
  23. package/dist/adapter/OpencodeSdkAdapter.test.d.ts +2 -0
  24. package/dist/adapter/OpencodeSdkAdapter.test.d.ts.map +1 -0
  25. package/dist/adapter/OpencodeSdkAdapter.test.js +14 -0
  26. package/dist/adapter/SdkProviderSpi.d.ts +15 -0
  27. package/dist/adapter/SdkProviderSpi.d.ts.map +1 -0
  28. package/dist/adapter/SdkProviderSpi.js +46 -0
  29. package/dist/adapter/adapter.test.d.ts +5 -0
  30. package/dist/adapter/adapter.test.d.ts.map +1 -0
  31. package/dist/adapter/adapter.test.js +180 -0
  32. package/dist/adapter/index.d.ts +11 -0
  33. package/dist/adapter/index.d.ts.map +1 -0
  34. package/dist/adapter/index.js +10 -0
  35. package/dist/adapter/types.d.ts +278 -0
  36. package/dist/adapter/types.d.ts.map +1 -0
  37. package/dist/adapter/types.js +278 -0
  38. package/dist/adapter/types.test.d.ts +2 -0
  39. package/dist/adapter/types.test.d.ts.map +1 -0
  40. package/dist/adapter/types.test.js +59 -0
  41. package/dist/adapters/cc-switch/common.d.ts +52 -0
  42. package/dist/adapters/cc-switch/common.d.ts.map +1 -0
  43. package/dist/adapters/cc-switch/common.js +61 -0
  44. package/dist/adapters/cc-switch/index.d.ts +25 -0
  45. package/dist/adapters/cc-switch/index.d.ts.map +1 -0
  46. package/dist/adapters/cc-switch/index.js +51 -0
  47. package/dist/adapters/cc-switch/mcp-claude.d.ts +15 -0
  48. package/dist/adapters/cc-switch/mcp-claude.d.ts.map +1 -0
  49. package/dist/adapters/cc-switch/mcp-claude.js +88 -0
  50. package/dist/adapters/cc-switch/mcp-claudecode.d.ts +15 -0
  51. package/dist/adapters/cc-switch/mcp-claudecode.d.ts.map +1 -0
  52. package/dist/adapters/cc-switch/mcp-claudecode.js +77 -0
  53. package/dist/adapters/cc-switch/mcp-codex.d.ts +17 -0
  54. package/dist/adapters/cc-switch/mcp-codex.d.ts.map +1 -0
  55. package/dist/adapters/cc-switch/mcp-codex.js +248 -0
  56. package/dist/adapters/cc-switch/mcp-codex.test.d.ts +2 -0
  57. package/dist/adapters/cc-switch/mcp-codex.test.d.ts.map +1 -0
  58. package/dist/adapters/cc-switch/mcp-codex.test.js +125 -0
  59. package/dist/adapters/cc-switch/mcp-opencode.d.ts +23 -0
  60. package/dist/adapters/cc-switch/mcp-opencode.d.ts.map +1 -0
  61. package/dist/adapters/cc-switch/mcp-opencode.js +100 -0
  62. package/dist/adapters/cc-switch/mcp-placeholder.d.ts +14 -0
  63. package/dist/adapters/cc-switch/mcp-placeholder.d.ts.map +1 -0
  64. package/dist/adapters/cc-switch/mcp-placeholder.js +19 -0
  65. package/dist/adapters/cc-switch/skill-claude.d.ts +15 -0
  66. package/dist/adapters/cc-switch/skill-claude.d.ts.map +1 -0
  67. package/dist/adapters/cc-switch/skill-claude.js +91 -0
  68. package/dist/adapters/cc-switch/skill-claudecode.d.ts +15 -0
  69. package/dist/adapters/cc-switch/skill-claudecode.d.ts.map +1 -0
  70. package/dist/adapters/cc-switch/skill-claudecode.js +91 -0
  71. package/dist/adapters/cc-switch/skill-opencode.d.ts +15 -0
  72. package/dist/adapters/cc-switch/skill-opencode.d.ts.map +1 -0
  73. package/dist/adapters/cc-switch/skill-opencode.js +95 -0
  74. package/dist/adapters/cc-switch/skill-placeholder.d.ts +14 -0
  75. package/dist/adapters/cc-switch/skill-placeholder.d.ts.map +1 -0
  76. package/dist/adapters/cc-switch/skill-placeholder.js +19 -0
  77. package/dist/config.d.ts +76 -0
  78. package/dist/config.d.ts.map +1 -0
  79. package/dist/config.js +109 -0
  80. package/dist/index.d.ts +8 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +503 -0
  83. package/dist/middleware/auth.d.ts +12 -0
  84. package/dist/middleware/auth.d.ts.map +1 -0
  85. package/dist/middleware/auth.js +18 -0
  86. package/dist/routes/ai-sources.d.ts +2 -0
  87. package/dist/routes/ai-sources.d.ts.map +1 -0
  88. package/dist/routes/ai-sources.js +136 -0
  89. package/dist/routes/ai-sources.test.d.ts +2 -0
  90. package/dist/routes/ai-sources.test.d.ts.map +1 -0
  91. package/dist/routes/ai-sources.test.js +148 -0
  92. package/dist/routes/aws-mcp.d.ts +10 -0
  93. package/dist/routes/aws-mcp.d.ts.map +1 -0
  94. package/dist/routes/aws-mcp.js +74 -0
  95. package/dist/routes/aws-mcp.test.d.ts +2 -0
  96. package/dist/routes/aws-mcp.test.d.ts.map +1 -0
  97. package/dist/routes/aws-mcp.test.js +42 -0
  98. package/dist/routes/file-browser.d.ts +7 -0
  99. package/dist/routes/file-browser.d.ts.map +1 -0
  100. package/dist/routes/file-browser.js +227 -0
  101. package/dist/routes/file-browser.test.d.ts +5 -0
  102. package/dist/routes/file-browser.test.d.ts.map +1 -0
  103. package/dist/routes/file-browser.test.js +88 -0
  104. package/dist/routes/git.d.ts +7 -0
  105. package/dist/routes/git.d.ts.map +1 -0
  106. package/dist/routes/git.js +470 -0
  107. package/dist/routes/git.test.d.ts +5 -0
  108. package/dist/routes/git.test.d.ts.map +1 -0
  109. package/dist/routes/git.test.js +87 -0
  110. package/dist/routes/instance.d.ts +3 -0
  111. package/dist/routes/instance.d.ts.map +1 -0
  112. package/dist/routes/instance.js +170 -0
  113. package/dist/routes/instance.test.d.ts +5 -0
  114. package/dist/routes/instance.test.d.ts.map +1 -0
  115. package/dist/routes/instance.test.js +64 -0
  116. package/dist/routes/mcp.d.ts +2 -0
  117. package/dist/routes/mcp.d.ts.map +1 -0
  118. package/dist/routes/mcp.js +171 -0
  119. package/dist/routes/mcp.test.d.ts +5 -0
  120. package/dist/routes/mcp.test.d.ts.map +1 -0
  121. package/dist/routes/mcp.test.js +84 -0
  122. package/dist/routes/memory.d.ts +13 -0
  123. package/dist/routes/memory.d.ts.map +1 -0
  124. package/dist/routes/memory.js +429 -0
  125. package/dist/routes/processes.d.ts +7 -0
  126. package/dist/routes/processes.d.ts.map +1 -0
  127. package/dist/routes/processes.js +245 -0
  128. package/dist/routes/properties.d.ts +7 -0
  129. package/dist/routes/properties.d.ts.map +1 -0
  130. package/dist/routes/properties.js +72 -0
  131. package/dist/routes/properties.test.d.ts +5 -0
  132. package/dist/routes/properties.test.d.ts.map +1 -0
  133. package/dist/routes/properties.test.js +72 -0
  134. package/dist/routes/sessions.d.ts +7 -0
  135. package/dist/routes/sessions.d.ts.map +1 -0
  136. package/dist/routes/sessions.js +808 -0
  137. package/dist/routes/sessions.test.d.ts +5 -0
  138. package/dist/routes/sessions.test.d.ts.map +1 -0
  139. package/dist/routes/sessions.test.js +70 -0
  140. package/dist/routes/skills.d.ts +2 -0
  141. package/dist/routes/skills.d.ts.map +1 -0
  142. package/dist/routes/skills.js +162 -0
  143. package/dist/routes/skills.test.d.ts +5 -0
  144. package/dist/routes/skills.test.d.ts.map +1 -0
  145. package/dist/routes/skills.test.js +42 -0
  146. package/dist/routes/terminal.d.ts +18 -0
  147. package/dist/routes/terminal.d.ts.map +1 -0
  148. package/dist/routes/terminal.js +663 -0
  149. package/dist/routes/terminal.test.d.ts +2 -0
  150. package/dist/routes/terminal.test.d.ts.map +1 -0
  151. package/dist/routes/terminal.test.js +91 -0
  152. package/dist/routes/yml.d.ts +7 -0
  153. package/dist/routes/yml.d.ts.map +1 -0
  154. package/dist/routes/yml.js +223 -0
  155. package/dist/routes/yml.test.d.ts +5 -0
  156. package/dist/routes/yml.test.d.ts.map +1 -0
  157. package/dist/routes/yml.test.js +58 -0
  158. package/dist/services/agent-process-manager.d.ts +241 -0
  159. package/dist/services/agent-process-manager.d.ts.map +1 -0
  160. package/dist/services/agent-process-manager.js +762 -0
  161. package/dist/services/auto-register.d.ts +94 -0
  162. package/dist/services/auto-register.d.ts.map +1 -0
  163. package/dist/services/auto-register.js +510 -0
  164. package/dist/services/aws-client-agent-mcp.d.ts +26 -0
  165. package/dist/services/aws-client-agent-mcp.d.ts.map +1 -0
  166. package/dist/services/aws-client-agent-mcp.js +142 -0
  167. package/dist/services/aws-client-agent-mcp.test.d.ts +2 -0
  168. package/dist/services/aws-client-agent-mcp.test.d.ts.map +1 -0
  169. package/dist/services/aws-client-agent-mcp.test.js +89 -0
  170. package/dist/services/aws-mcp-http.d.ts +11 -0
  171. package/dist/services/aws-mcp-http.d.ts.map +1 -0
  172. package/dist/services/aws-mcp-http.js +225 -0
  173. package/dist/services/aws-mcp-http.test.d.ts +2 -0
  174. package/dist/services/aws-mcp-http.test.d.ts.map +1 -0
  175. package/dist/services/aws-mcp-http.test.js +27 -0
  176. package/dist/services/cc-switch-sdk.d.ts +18 -0
  177. package/dist/services/cc-switch-sdk.d.ts.map +1 -0
  178. package/dist/services/cc-switch-sdk.js +117 -0
  179. package/dist/services/easytier-manager.d.ts +106 -0
  180. package/dist/services/easytier-manager.d.ts.map +1 -0
  181. package/dist/services/easytier-manager.js +331 -0
  182. package/dist/services/easytier-manager.test.d.ts +5 -0
  183. package/dist/services/easytier-manager.test.d.ts.map +1 -0
  184. package/dist/services/easytier-manager.test.js +98 -0
  185. package/dist/services/instance-init-service.d.ts +35 -0
  186. package/dist/services/instance-init-service.d.ts.map +1 -0
  187. package/dist/services/instance-init-service.js +190 -0
  188. package/dist/services/instance-service.d.ts +88 -0
  189. package/dist/services/instance-service.d.ts.map +1 -0
  190. package/dist/services/instance-service.js +236 -0
  191. package/dist/services/instance-state.d.ts +36 -0
  192. package/dist/services/instance-state.d.ts.map +1 -0
  193. package/dist/services/instance-state.js +79 -0
  194. package/dist/services/instance-state.test.d.ts +2 -0
  195. package/dist/services/instance-state.test.d.ts.map +1 -0
  196. package/dist/services/instance-state.test.js +213 -0
  197. package/dist/services/memory-service.d.ts +195 -0
  198. package/dist/services/memory-service.d.ts.map +1 -0
  199. package/dist/services/memory-service.js +650 -0
  200. package/dist/services/orphan-monitor.d.ts +94 -0
  201. package/dist/services/orphan-monitor.d.ts.map +1 -0
  202. package/dist/services/orphan-monitor.js +321 -0
  203. package/dist/services/process-detector.d.ts +175 -0
  204. package/dist/services/process-detector.d.ts.map +1 -0
  205. package/dist/services/process-detector.js +992 -0
  206. package/dist/services/process-registry.d.ts +208 -0
  207. package/dist/services/process-registry.d.ts.map +1 -0
  208. package/dist/services/process-registry.js +354 -0
  209. package/dist/services/session-lookup.d.ts +20 -0
  210. package/dist/services/session-lookup.d.ts.map +1 -0
  211. package/dist/services/session-lookup.js +43 -0
  212. package/dist/services/session-output.d.ts +56 -0
  213. package/dist/services/session-output.d.ts.map +1 -0
  214. package/dist/services/session-output.js +122 -0
  215. package/dist/services/session-output.test.d.ts +5 -0
  216. package/dist/services/session-output.test.d.ts.map +1 -0
  217. package/dist/services/session-output.test.js +68 -0
  218. package/dist/services/terminal-persistence.d.ts +51 -0
  219. package/dist/services/terminal-persistence.d.ts.map +1 -0
  220. package/dist/services/terminal-persistence.js +125 -0
  221. package/dist/services/terminal-persistence.test.d.ts +5 -0
  222. package/dist/services/terminal-persistence.test.d.ts.map +1 -0
  223. package/dist/services/terminal-persistence.test.js +88 -0
  224. package/dist/services/tool-installer.d.ts +15 -0
  225. package/dist/services/tool-installer.d.ts.map +1 -0
  226. package/dist/services/tool-installer.js +297 -0
  227. package/dist/services/tool-installer.test.d.ts +2 -0
  228. package/dist/services/tool-installer.test.d.ts.map +1 -0
  229. package/dist/services/tool-installer.test.js +102 -0
  230. package/dist/services/user-api-key-service.d.ts +28 -0
  231. package/dist/services/user-api-key-service.d.ts.map +1 -0
  232. package/dist/services/user-api-key-service.js +75 -0
  233. package/dist/services/workspace-files.d.ts +85 -0
  234. package/dist/services/workspace-files.d.ts.map +1 -0
  235. package/dist/services/workspace-files.js +224 -0
  236. package/dist/services/workspace-files.test.d.ts +2 -0
  237. package/dist/services/workspace-files.test.d.ts.map +1 -0
  238. package/dist/services/workspace-files.test.js +117 -0
  239. package/dist/types.d.ts +233 -0
  240. package/dist/types.d.ts.map +1 -0
  241. package/dist/types.js +1 -0
  242. package/dist/utils/file-utils.d.ts +13 -0
  243. package/dist/utils/file-utils.d.ts.map +1 -0
  244. package/dist/utils/file-utils.js +140 -0
  245. package/dist/utils/file-utils.test.d.ts +2 -0
  246. package/dist/utils/file-utils.test.d.ts.map +1 -0
  247. package/dist/utils/file-utils.test.js +201 -0
  248. package/dist/utils/logger.d.ts +39 -0
  249. package/dist/utils/logger.d.ts.map +1 -0
  250. package/dist/utils/logger.js +110 -0
  251. package/dist/utils/logger.test.d.ts +2 -0
  252. package/dist/utils/logger.test.d.ts.map +1 -0
  253. package/dist/utils/logger.test.js +93 -0
  254. package/dist/utils/mcp-utils.d.ts +73 -0
  255. package/dist/utils/mcp-utils.d.ts.map +1 -0
  256. package/dist/utils/mcp-utils.js +165 -0
  257. package/dist/utils/path-utils.d.ts +24 -0
  258. package/dist/utils/path-utils.d.ts.map +1 -0
  259. package/dist/utils/path-utils.js +44 -0
  260. package/dist/utils/validation.d.ts +23 -0
  261. package/dist/utils/validation.d.ts.map +1 -0
  262. package/dist/utils/validation.js +53 -0
  263. package/dist/utils/validation.test.d.ts +2 -0
  264. package/dist/utils/validation.test.d.ts.map +1 -0
  265. package/dist/utils/validation.test.js +88 -0
  266. package/dist/utils/yaml-utils.d.ts +73 -0
  267. package/dist/utils/yaml-utils.d.ts.map +1 -0
  268. package/dist/utils/yaml-utils.js +309 -0
  269. package/dist/utils/yaml-utils.test.d.ts +2 -0
  270. package/dist/utils/yaml-utils.test.d.ts.map +1 -0
  271. package/dist/utils/yaml-utils.test.js +363 -0
  272. package/package/aws-client-agent-mcp/README.md +288 -0
  273. package/package/aws-client-agent-mcp/dist/activity-reporter.d.ts +150 -0
  274. package/package/aws-client-agent-mcp/dist/activity-reporter.d.ts.map +1 -0
  275. package/package/aws-client-agent-mcp/dist/activity-reporter.js +353 -0
  276. package/package/aws-client-agent-mcp/dist/activity-reporter.js.map +1 -0
  277. package/package/aws-client-agent-mcp/dist/activity-reporter.test.d.ts +2 -0
  278. package/package/aws-client-agent-mcp/dist/activity-reporter.test.d.ts.map +1 -0
  279. package/package/aws-client-agent-mcp/dist/activity-reporter.test.js +75 -0
  280. package/package/aws-client-agent-mcp/dist/activity-reporter.test.js.map +1 -0
  281. package/package/aws-client-agent-mcp/dist/activity-types.d.ts +96 -0
  282. package/package/aws-client-agent-mcp/dist/activity-types.d.ts.map +1 -0
  283. package/package/aws-client-agent-mcp/dist/activity-types.js +141 -0
  284. package/package/aws-client-agent-mcp/dist/activity-types.js.map +1 -0
  285. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +165 -0
  286. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -0
  287. package/package/aws-client-agent-mcp/dist/agent-client.js +588 -0
  288. package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -0
  289. package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts +2 -0
  290. package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts.map +1 -0
  291. package/package/aws-client-agent-mcp/dist/agent-client.test.js +534 -0
  292. package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +1 -0
  293. package/package/aws-client-agent-mcp/dist/config.d.ts +21 -0
  294. package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -0
  295. package/package/aws-client-agent-mcp/dist/config.js +67 -0
  296. package/package/aws-client-agent-mcp/dist/config.js.map +1 -0
  297. package/package/aws-client-agent-mcp/dist/config.test.d.ts +2 -0
  298. package/package/aws-client-agent-mcp/dist/config.test.d.ts.map +1 -0
  299. package/package/aws-client-agent-mcp/dist/config.test.js +139 -0
  300. package/package/aws-client-agent-mcp/dist/config.test.js.map +1 -0
  301. package/package/aws-client-agent-mcp/dist/constants.d.ts +15 -0
  302. package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -0
  303. package/package/aws-client-agent-mcp/dist/constants.js +19 -0
  304. package/package/aws-client-agent-mcp/dist/constants.js.map +1 -0
  305. package/package/aws-client-agent-mcp/dist/http-client.d.ts +27 -0
  306. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -0
  307. package/package/aws-client-agent-mcp/dist/http-client.js +65 -0
  308. package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -0
  309. package/package/aws-client-agent-mcp/dist/http-client.test.d.ts +2 -0
  310. package/package/aws-client-agent-mcp/dist/http-client.test.d.ts.map +1 -0
  311. package/package/aws-client-agent-mcp/dist/http-client.test.js +228 -0
  312. package/package/aws-client-agent-mcp/dist/http-client.test.js.map +1 -0
  313. package/package/aws-client-agent-mcp/dist/index.d.ts +14 -0
  314. package/package/aws-client-agent-mcp/dist/index.d.ts.map +1 -0
  315. package/package/aws-client-agent-mcp/dist/index.js +30 -0
  316. package/package/aws-client-agent-mcp/dist/index.js.map +1 -0
  317. package/package/aws-client-agent-mcp/dist/logger.d.ts +7 -0
  318. package/package/aws-client-agent-mcp/dist/logger.d.ts.map +1 -0
  319. package/package/aws-client-agent-mcp/dist/logger.js +19 -0
  320. package/package/aws-client-agent-mcp/dist/logger.js.map +1 -0
  321. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +77 -0
  322. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -0
  323. package/package/aws-client-agent-mcp/dist/mcp-server.js +427 -0
  324. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -0
  325. package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts +2 -0
  326. package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts.map +1 -0
  327. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +624 -0
  328. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -0
  329. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +78 -0
  330. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -0
  331. package/package/aws-client-agent-mcp/dist/mcp-tools.js +420 -0
  332. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -0
  333. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +61 -0
  334. package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -0
  335. package/package/aws-client-agent-mcp/dist/memory-store.js +268 -0
  336. package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -0
  337. package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts +2 -0
  338. package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts.map +1 -0
  339. package/package/aws-client-agent-mcp/dist/memory-store.test.js +164 -0
  340. package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +1 -0
  341. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +74 -0
  342. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -0
  343. package/package/aws-client-agent-mcp/dist/message-buffer.js +159 -0
  344. package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -0
  345. package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts +2 -0
  346. package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts.map +1 -0
  347. package/package/aws-client-agent-mcp/dist/message-buffer.test.js +44 -0
  348. package/package/aws-client-agent-mcp/dist/message-buffer.test.js.map +1 -0
  349. package/package/aws-client-agent-mcp/dist/messageContent.d.ts +53 -0
  350. package/package/aws-client-agent-mcp/dist/messageContent.d.ts.map +1 -0
  351. package/package/aws-client-agent-mcp/dist/messageContent.js +125 -0
  352. package/package/aws-client-agent-mcp/dist/messageContent.js.map +1 -0
  353. package/package/aws-client-agent-mcp/dist/orchestration-tools.d.ts +19 -0
  354. package/package/aws-client-agent-mcp/dist/orchestration-tools.d.ts.map +1 -0
  355. package/package/aws-client-agent-mcp/dist/orchestration-tools.js +317 -0
  356. package/package/aws-client-agent-mcp/dist/orchestration-tools.js.map +1 -0
  357. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +66 -0
  358. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -0
  359. package/package/aws-client-agent-mcp/dist/status-reporter.js +220 -0
  360. package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -0
  361. package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts +2 -0
  362. package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts.map +1 -0
  363. package/package/aws-client-agent-mcp/dist/status-reporter.test.js +45 -0
  364. package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +1 -0
  365. package/package/aws-client-agent-mcp/dist/types.d.ts +286 -0
  366. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -0
  367. package/package/aws-client-agent-mcp/dist/types.js +9 -0
  368. package/package/aws-client-agent-mcp/dist/types.js.map +1 -0
  369. package/package/aws-client-agent-mcp/dist/user-config-reader.d.ts +63 -0
  370. package/package/aws-client-agent-mcp/dist/user-config-reader.d.ts.map +1 -0
  371. package/package/aws-client-agent-mcp/dist/user-config-reader.js +161 -0
  372. package/package/aws-client-agent-mcp/dist/user-config-reader.js.map +1 -0
  373. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +94 -0
  374. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -0
  375. package/package/aws-client-agent-mcp/dist/websocket-client.js +316 -0
  376. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -0
  377. package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts +2 -0
  378. package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts.map +1 -0
  379. package/package/aws-client-agent-mcp/dist/websocket-client.test.js +191 -0
  380. package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +1 -0
  381. package/package/aws-client-agent-mcp/package.json +51 -0
  382. package/package/cc-switch-sdk/README.md +541 -0
  383. package/package/cc-switch-sdk/dist/adapters/common.d.ts +38 -0
  384. package/package/cc-switch-sdk/dist/adapters/common.d.ts.map +1 -0
  385. package/package/cc-switch-sdk/dist/adapters/common.js +47 -0
  386. package/package/cc-switch-sdk/dist/adapters/index.d.ts +5 -0
  387. package/package/cc-switch-sdk/dist/adapters/index.d.ts.map +1 -0
  388. package/package/cc-switch-sdk/dist/adapters/index.js +28 -0
  389. package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts +10 -0
  390. package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts.map +1 -0
  391. package/package/cc-switch-sdk/dist/adapters/mcp-claude.js +39 -0
  392. package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts +10 -0
  393. package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts.map +1 -0
  394. package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.js +40 -0
  395. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts +18 -0
  396. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts.map +1 -0
  397. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.js +63 -0
  398. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts +2 -0
  399. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts.map +1 -0
  400. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.js +86 -0
  401. package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts +9 -0
  402. package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts.map +1 -0
  403. package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.js +14 -0
  404. package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts +10 -0
  405. package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts.map +1 -0
  406. package/package/cc-switch-sdk/dist/adapters/skill-claude.js +51 -0
  407. package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts +10 -0
  408. package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts.map +1 -0
  409. package/package/cc-switch-sdk/dist/adapters/skill-claudecode.js +51 -0
  410. package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts +10 -0
  411. package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts.map +1 -0
  412. package/package/cc-switch-sdk/dist/adapters/skill-opencode.js +51 -0
  413. package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts +9 -0
  414. package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts.map +1 -0
  415. package/package/cc-switch-sdk/dist/adapters/skill-placeholder.js +14 -0
  416. package/package/cc-switch-sdk/dist/constants.d.ts +9 -0
  417. package/package/cc-switch-sdk/dist/constants.d.ts.map +1 -0
  418. package/package/cc-switch-sdk/dist/constants.js +54 -0
  419. package/package/cc-switch-sdk/dist/errors.d.ts +6 -0
  420. package/package/cc-switch-sdk/dist/errors.d.ts.map +1 -0
  421. package/package/cc-switch-sdk/dist/errors.js +8 -0
  422. package/package/cc-switch-sdk/dist/index.d.ts +11 -0
  423. package/package/cc-switch-sdk/dist/index.d.ts.map +1 -0
  424. package/package/cc-switch-sdk/dist/index.js +9 -0
  425. package/package/cc-switch-sdk/dist/schemas.d.ts +8 -0
  426. package/package/cc-switch-sdk/dist/schemas.d.ts.map +1 -0
  427. package/package/cc-switch-sdk/dist/schemas.js +37 -0
  428. package/package/cc-switch-sdk/dist/sdk.d.ts +91 -0
  429. package/package/cc-switch-sdk/dist/sdk.d.ts.map +1 -0
  430. package/package/cc-switch-sdk/dist/sdk.js +427 -0
  431. package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts +75 -0
  432. package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts.map +1 -0
  433. package/package/cc-switch-sdk/dist/services/ai-config-service.js +280 -0
  434. package/package/cc-switch-sdk/dist/services/instance-service.d.ts +78 -0
  435. package/package/cc-switch-sdk/dist/services/instance-service.d.ts.map +1 -0
  436. package/package/cc-switch-sdk/dist/services/instance-service.js +180 -0
  437. package/package/cc-switch-sdk/dist/services/mcp-model.d.ts +17 -0
  438. package/package/cc-switch-sdk/dist/services/mcp-model.d.ts.map +1 -0
  439. package/package/cc-switch-sdk/dist/services/mcp-model.js +34 -0
  440. package/package/cc-switch-sdk/dist/services/mcp-service.d.ts +18 -0
  441. package/package/cc-switch-sdk/dist/services/mcp-service.d.ts.map +1 -0
  442. package/package/cc-switch-sdk/dist/services/mcp-service.js +9 -0
  443. package/package/cc-switch-sdk/dist/services/skill-model.d.ts +17 -0
  444. package/package/cc-switch-sdk/dist/services/skill-model.d.ts.map +1 -0
  445. package/package/cc-switch-sdk/dist/services/skill-model.js +38 -0
  446. package/package/cc-switch-sdk/dist/services/skill-service.d.ts +17 -0
  447. package/package/cc-switch-sdk/dist/services/skill-service.d.ts.map +1 -0
  448. package/package/cc-switch-sdk/dist/services/skill-service.js +9 -0
  449. package/package/cc-switch-sdk/dist/state.d.ts +4 -0
  450. package/package/cc-switch-sdk/dist/state.d.ts.map +1 -0
  451. package/package/cc-switch-sdk/dist/state.js +19 -0
  452. package/package/cc-switch-sdk/dist/types.d.ts +75 -0
  453. package/package/cc-switch-sdk/dist/types.d.ts.map +1 -0
  454. package/package/cc-switch-sdk/dist/types.js +1 -0
  455. package/package/cc-switch-sdk/dist/utils/fs.d.ts +10 -0
  456. package/package/cc-switch-sdk/dist/utils/fs.d.ts.map +1 -0
  457. package/package/cc-switch-sdk/dist/utils/fs.js +91 -0
  458. package/package/cc-switch-sdk/dist/utils/id.d.ts +4 -0
  459. package/package/cc-switch-sdk/dist/utils/id.d.ts.map +1 -0
  460. package/package/cc-switch-sdk/dist/utils/id.js +12 -0
  461. package/package/cc-switch-sdk/package.json +31 -0
  462. package/package.json +73 -0
@@ -0,0 +1,808 @@
1
+ /**
2
+ * 会话管理 API 路由
3
+ *
4
+ * 提供终端会话的查询和恢复功能
5
+ */
6
+ import { Router } from 'express';
7
+ import { v4 as uuidv4 } from 'uuid';
8
+ import { execSync } from 'child_process';
9
+ import pty from 'node-pty';
10
+ import { validateToken } from '../middleware/auth.js';
11
+ import { sessions, sendStatus, scheduleOutputFlush, flushSessionOutput } from '../services/session-output.js';
12
+ import { loadPersistedSessions, upsertPersistedSession, removePersistedSession, findPersistedSessionByAgentId } from '../services/terminal-persistence.js';
13
+ import { isProcessRunning, findOrphanProcessByAgentId, findOrphanProcessByWorkspace } from '../services/process-detector.js';
14
+ import { createLogger } from '../utils/logger.js';
15
+ // 导入 SDK 会话存储
16
+ import { sdkSessions } from './terminal.js';
17
+ // 导入 Adapter 注册�?
18
+ import { adapterRegistry } from '../adapter/index.js';
19
+ const log = createLogger('sessions');
20
+ export const sessionsRouter = Router();
21
+ /**
22
+ * 获取所有终端会话(PTY �?SDK�?
23
+ * GET /runtime/sessions
24
+ */
25
+ sessionsRouter.get('/sessions', validateToken, async (_req, res) => {
26
+ try {
27
+ // 1. 获取 PTY 会话
28
+ const activePtySessions = Array.from(sessions.entries()).map(([sessionId, session]) => ({
29
+ sessionId,
30
+ agentId: session.agentId,
31
+ workspacePath: session.workspacePath,
32
+ status: 'running',
33
+ mode: 'pty',
34
+ startedAt: null,
35
+ }));
36
+ // 2. 获取 SDK 会话
37
+ const activeSdkSessions = Array.from(sdkSessions.entries()).map(([sessionId, entry]) => ({
38
+ sessionId,
39
+ agentId: entry.agentId,
40
+ workspacePath: entry.workspacePath,
41
+ status: 'running',
42
+ mode: 'sdk',
43
+ startedAt: null,
44
+ }));
45
+ // 3. 合并活跃会话
46
+ const activeSessions = [...activePtySessions, ...activeSdkSessions];
47
+ const persistedSessions = await loadPersistedSessions();
48
+ const activeSessionIds = new Set(activeSessions.map(s => s.sessionId));
49
+ const persistedOnly = persistedSessions.filter(s => !activeSessionIds.has(s.sessionId));
50
+ const response = {
51
+ ok: true,
52
+ active: activeSessions,
53
+ persisted: persistedOnly,
54
+ };
55
+ res.json(response);
56
+ }
57
+ catch (error) {
58
+ const err = error;
59
+ res.status(500).json({ error: err.message });
60
+ }
61
+ });
62
+ /**
63
+ * 恢复终端会话
64
+ * POST /runtime/sessions/recover
65
+ *
66
+ * �?支持孤儿进程检测:
67
+ * 如果持久化会话中�?PID 且进程仍在运行,标记�?orphan_recovered
68
+ */
69
+ sessionsRouter.post('/sessions/recover', validateToken, async (req, res) => {
70
+ const { agentId, workspacePath, command } = req.body;
71
+ if (!agentId) {
72
+ res.status(400).json({ error: 'agentId is required' });
73
+ return;
74
+ }
75
+ try {
76
+ // 1. 检查是否已有活跃会�?
77
+ const existingSession = Array.from(sessions.entries()).find(([, s]) => s.agentId === agentId);
78
+ if (existingSession) {
79
+ res.json({
80
+ ok: true,
81
+ sessionId: existingSession[0],
82
+ agentId,
83
+ workspacePath: existingSession[1].workspacePath,
84
+ command: '',
85
+ status: 'running',
86
+ recovered: false,
87
+ message: 'Session already active',
88
+ });
89
+ return;
90
+ }
91
+ // 2. 检查是否有 SDK 活跃会话
92
+ const existingSdkSession = Array.from(sdkSessions.entries()).find(([, s]) => s.agentId === agentId);
93
+ if (existingSdkSession) {
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: 'running',
101
+ mode: 'sdk',
102
+ recovered: false,
103
+ message: 'SDK session already active',
104
+ });
105
+ return;
106
+ }
107
+ // 3. 获取持久化会话信�?
108
+ const persistedSession = await findPersistedSessionByAgentId(agentId);
109
+ // �?4. 检查孤儿进程(如果持久化会话中�?PID�?
110
+ let orphanDetected = false;
111
+ let orphanPid;
112
+ if (persistedSession?.pid && isProcessRunning(persistedSession.pid)) {
113
+ orphanDetected = true;
114
+ orphanPid = persistedSession.pid;
115
+ log.info(`[Recover] Detected orphan process for agentId=${agentId}, pid=${persistedSession.pid}`);
116
+ }
117
+ else if (persistedSession?.mode === 'sdk' || !persistedSession?.pid) {
118
+ // SDK 模式或无 PID,尝试通过 agentId 查找孤儿进程
119
+ const orphanProcess = findOrphanProcessByAgentId(agentId);
120
+ if (orphanProcess) {
121
+ orphanDetected = true;
122
+ orphanPid = orphanProcess.pid;
123
+ log.info(`[Recover] Found orphan process by agentId search: agentId=${agentId}, pid=${orphanProcess.pid}`);
124
+ }
125
+ }
126
+ const resolvedWorkspacePath = workspacePath || persistedSession?.workspacePath;
127
+ const resolvedCommand = command || persistedSession?.command || 'claude';
128
+ const resolvedMode = persistedSession?.mode || 'pty';
129
+ if (!resolvedWorkspacePath) {
130
+ res.status(400).json({ error: 'workspacePath is required (not found in persisted session)' });
131
+ return;
132
+ }
133
+ // �?5. 如果检测到孤儿进程,返回孤儿进程信息(不启动新进程�?
134
+ // �?aws-mcp-server 决定如何处理(可能需要清理或重新连接�?
135
+ if (orphanDetected && orphanPid) {
136
+ log.info(`[Recover] Returning orphan process info for agentId=${agentId}`);
137
+ res.json({
138
+ ok: true,
139
+ sessionId: persistedSession?.sessionId || uuidv4(),
140
+ agentId,
141
+ workspacePath: resolvedWorkspacePath,
142
+ command: resolvedCommand,
143
+ status: 'orphan_detected',
144
+ recovered: false,
145
+ orphan: {
146
+ pid: orphanPid,
147
+ message: 'Found orphan process still running. Manual intervention may be required.',
148
+ },
149
+ mode: resolvedMode,
150
+ });
151
+ return;
152
+ }
153
+ // 6. 无孤儿进程,启动新会�?
154
+ const sessionId = uuidv4();
155
+ const shell = process.platform === 'win32' ? 'powershell.exe' : 'bash';
156
+ const shellArgs = process.platform === 'win32' ? ['-NoLogo'] : [];
157
+ const terminal = pty.spawn(shell, shellArgs, {
158
+ name: 'xterm-color',
159
+ cols: 120,
160
+ rows: 30,
161
+ cwd: resolvedWorkspacePath,
162
+ env: {
163
+ ...process.env,
164
+ AWS_AGENT_ID: String(agentId),
165
+ },
166
+ });
167
+ sessions.set(sessionId, {
168
+ agentId,
169
+ workspacePath: resolvedWorkspacePath,
170
+ ptyProcess: terminal,
171
+ outputBuffer: '',
172
+ flushTimer: null,
173
+ flushInFlight: null,
174
+ seq: 0,
175
+ });
176
+ await upsertPersistedSession({
177
+ sessionId,
178
+ agentId,
179
+ workspacePath: resolvedWorkspacePath,
180
+ command: resolvedCommand,
181
+ startedAt: new Date().toISOString(),
182
+ status: 'running',
183
+ mode: resolvedMode,
184
+ pid: terminal.pid, // �?记录新进程的 PID
185
+ });
186
+ await sendStatus(agentId, sessionId, 'running');
187
+ terminal.onData((data) => {
188
+ const session = sessions.get(sessionId);
189
+ if (!session) {
190
+ return;
191
+ }
192
+ session.outputBuffer += data;
193
+ scheduleOutputFlush(sessionId);
194
+ });
195
+ terminal.onExit(async () => {
196
+ const session = sessions.get(sessionId);
197
+ if (session?.flushTimer) {
198
+ clearTimeout(session.flushTimer);
199
+ session.flushTimer = null;
200
+ }
201
+ await flushSessionOutput(sessionId);
202
+ sessions.delete(sessionId);
203
+ // 直接删除持久化会话,而不是改�?stopped,避免后续被恢复
204
+ await removePersistedSession(sessionId);
205
+ await sendStatus(agentId, null, 'stopped');
206
+ });
207
+ terminal.write(`${resolvedCommand}\r`);
208
+ const result = {
209
+ ok: true,
210
+ sessionId,
211
+ agentId,
212
+ workspacePath: resolvedWorkspacePath,
213
+ command: resolvedCommand,
214
+ status: 'running',
215
+ recovered: true,
216
+ };
217
+ res.json(result);
218
+ }
219
+ catch (error) {
220
+ const err = error;
221
+ log.error('Error:', err);
222
+ res.status(500).json({ error: err.message });
223
+ }
224
+ });
225
+ /**
226
+ * 搜索残留进程(孤儿进程)
227
+ * POST /runtime/search-orphan
228
+ *
229
+ * 根据 agentId 搜索标记了该 agentId 的残留进程(不在 runtime-bridge 管理范围内的进程�?
230
+ * 用于:当 agent.isOnline �?true �?runtime-bridge 没有管理它的会话时,手动搜索残留进程
231
+ *
232
+ * 改进策略�?
233
+ * 1. 检�?runtime-bridge 是否有活跃会�?
234
+ * 2. 通过进程命令�?环境变量搜索(findOrphanProcessByAgentId�?
235
+ * 3. 检查持久化会话中的 PID 是否存活(新增:即使进程列表匹配不到,PID 存活也报告)
236
+ */
237
+ sessionsRouter.post('/search-orphan', validateToken, async (req, res) => {
238
+ const { agentId, workspacePath } = req.body;
239
+ if (!agentId) {
240
+ res.status(400).json({ error: 'agentId is required' });
241
+ return;
242
+ }
243
+ try {
244
+ // 1. 首先检�?runtime-bridge 是否已经有活跃会�?
245
+ const activeSession = Array.from(sessions.entries()).find(([, s]) => s.agentId === agentId);
246
+ const activeSdkSession = Array.from(sdkSessions.entries()).find(([, s]) => s.agentId === agentId);
247
+ const hasActiveSession = activeSession || activeSdkSession;
248
+ // 2. 搜索标记了该 agentId 的进程(命令�?+ 环境变量 + 进程树匹配)
249
+ const orphanProcess = findOrphanProcessByAgentId(agentId);
250
+ // 3. 如果找到残留进程,返回进程信�?
251
+ if (orphanProcess) {
252
+ log.info(`[search-orphan] Found orphan process for agentId=${agentId}, pid=${orphanProcess.pid}`);
253
+ res.json({
254
+ ok: true,
255
+ agentId,
256
+ hasActiveSession,
257
+ found: true,
258
+ orphan: {
259
+ pid: orphanProcess.pid,
260
+ command: orphanProcess.command,
261
+ cwd: orphanProcess.cwd,
262
+ startedAt: orphanProcess.startedAt,
263
+ message: 'Found orphan process. Click terminate to stop it.',
264
+ },
265
+ });
266
+ return;
267
+ }
268
+ // 4. 检查持久化会话中的 PID 是否仍然存活
269
+ // 即使进程列表匹配不到(命令行特征未识别),PID 存活说明进程仍在运行
270
+ const persistedSession = await findPersistedSessionByAgentId(agentId);
271
+ if (persistedSession?.pid && isProcessRunning(persistedSession.pid)) {
272
+ log.info(`[search-orphan] Found orphan by persisted PID: agentId=${agentId}, pid=${persistedSession.pid}`);
273
+ res.json({
274
+ ok: true,
275
+ agentId,
276
+ hasActiveSession,
277
+ found: true,
278
+ orphan: {
279
+ pid: persistedSession.pid,
280
+ command: persistedSession.command || '(persisted session)',
281
+ message: 'Found orphan process by persisted PID. Click terminate to stop it.',
282
+ },
283
+ });
284
+ return;
285
+ }
286
+ // �?5. 通过工作目录宽泛搜索(当 agentId 和持久化 PID 都匹配不到时�?
287
+ // 前端传递的 workspacePath,或者从持久化会话中获取
288
+ const searchWorkspace = workspacePath || persistedSession?.workspacePath;
289
+ if (searchWorkspace) {
290
+ const workspaceOrphan = findOrphanProcessByWorkspace(searchWorkspace);
291
+ if (workspaceOrphan) {
292
+ log.info(`[search-orphan] Found orphan by workspace: agentId=${agentId}, pid=${workspaceOrphan.pid}, workspace=${searchWorkspace}`);
293
+ res.json({
294
+ ok: true,
295
+ agentId,
296
+ hasActiveSession,
297
+ found: true,
298
+ orphan: {
299
+ pid: workspaceOrphan.pid,
300
+ command: workspaceOrphan.command,
301
+ message: 'Found orphan process by workspace path. Click terminate to stop it.',
302
+ },
303
+ });
304
+ return;
305
+ }
306
+ }
307
+ // 6. 没找到残留进�?
308
+ log.info(`[search-orphan] No orphan process found for agentId=${agentId}, hasActiveSession=${!!hasActiveSession}`);
309
+ res.json({
310
+ ok: true,
311
+ agentId,
312
+ hasActiveSession: !!hasActiveSession,
313
+ found: false,
314
+ orphan: null,
315
+ message: hasActiveSession
316
+ ? 'Agent has active session in runtime-bridge'
317
+ : 'No orphan process and no active session found',
318
+ });
319
+ }
320
+ catch (error) {
321
+ const err = error;
322
+ log.error('[search-orphan] Error:', err);
323
+ res.status(500).json({ error: err.message });
324
+ }
325
+ });
326
+ /**
327
+ * 终止残留进程
328
+ * POST /runtime/terminate-orphan
329
+ *
330
+ * 终止�?search-orphan 找到的残留进�?
331
+ */
332
+ sessionsRouter.post('/terminate-orphan', validateToken, async (req, res) => {
333
+ const { agentId, pid } = req.body;
334
+ if (!agentId || !pid) {
335
+ res.status(400).json({ error: 'agentId and pid are required' });
336
+ return;
337
+ }
338
+ try {
339
+ // 1. 检查进程是否还在运�?
340
+ if (!isProcessRunning(pid)) {
341
+ res.json({
342
+ ok: true,
343
+ agentId,
344
+ pid,
345
+ terminated: false,
346
+ message: 'Process already terminated',
347
+ });
348
+ return;
349
+ }
350
+ // 2. 终止进程(在 Windows 上使�?taskkill,Unix 上使�?kill�?
351
+ const platform = process.platform;
352
+ let success = false;
353
+ if (platform === 'win32') {
354
+ try {
355
+ execSync(`taskkill /PID ${pid} /T /F`, { encoding: 'utf8', timeout: 5000 });
356
+ success = true;
357
+ }
358
+ catch (e) {
359
+ log.warn(`[terminate-orphan] taskkill failed for pid=${pid}:`, e);
360
+ }
361
+ }
362
+ else {
363
+ try {
364
+ process.kill(pid, 'SIGTERM');
365
+ success = true;
366
+ }
367
+ catch (e) {
368
+ log.warn(`[terminate-orphan] kill failed for pid=${pid}:`, e);
369
+ }
370
+ }
371
+ if (success) {
372
+ log.info(`[terminate-orphan] Terminated orphan process for agentId=${agentId}, pid=${pid}`);
373
+ res.json({
374
+ ok: true,
375
+ agentId,
376
+ pid,
377
+ terminated: true,
378
+ message: 'Orphan process terminated successfully',
379
+ });
380
+ }
381
+ else {
382
+ res.json({
383
+ ok: true,
384
+ agentId,
385
+ pid,
386
+ terminated: false,
387
+ message: 'Failed to terminate process',
388
+ });
389
+ }
390
+ }
391
+ catch (error) {
392
+ const err = error;
393
+ log.error('[terminate-orphan] Error:', err);
394
+ res.status(500).json({ error: err.message });
395
+ }
396
+ });
397
+ /**
398
+ * 根据 agentId 获取会话状�?
399
+ * GET /runtime/sessions/by-agent/:agentId
400
+ *
401
+ * 增强返回:包含进程健康状态、是否是孤儿进程等信�?
402
+ */
403
+ sessionsRouter.get('/sessions/by-agent/:agentId', validateToken, async (req, res) => {
404
+ const agentIdParam = req.params.agentId;
405
+ const agentId = Array.isArray(agentIdParam) ? agentIdParam[0] : agentIdParam;
406
+ if (!agentId) {
407
+ res.status(400).json({ error: 'agentId is required' });
408
+ return;
409
+ }
410
+ try {
411
+ // 1. 检查活�?PTY 会话
412
+ const activeSession = Array.from(sessions.entries()).find(([, s]) => s.agentId === agentId);
413
+ if (activeSession) {
414
+ res.json({
415
+ ok: true,
416
+ sessionId: activeSession[0],
417
+ agentId,
418
+ workspacePath: activeSession[1].workspacePath,
419
+ status: 'running',
420
+ isActive: true,
421
+ mode: 'pty',
422
+ pid: activeSession[1].ptyProcess.pid,
423
+ isManaged: true,
424
+ });
425
+ return;
426
+ }
427
+ // 2. 检查活�?SDK 会话
428
+ const activeSdkSession = Array.from(sdkSessions.entries()).find(([, s]) => s.agentId === agentId);
429
+ if (activeSdkSession) {
430
+ const adapter = adapterRegistry.get(activeSdkSession[1].providerId || 'claude-code');
431
+ const pid = adapter.getSessionPid?.(activeSdkSession[0]);
432
+ res.json({
433
+ ok: true,
434
+ sessionId: activeSdkSession[0],
435
+ agentId,
436
+ workspacePath: activeSdkSession[1].workspacePath,
437
+ status: 'running',
438
+ isActive: true,
439
+ mode: 'sdk',
440
+ pid,
441
+ isManaged: true,
442
+ providerId: activeSdkSession[1].providerId,
443
+ });
444
+ return;
445
+ }
446
+ // 3. 检查持久化会话
447
+ const persistedSession = await findPersistedSessionByAgentId(agentId);
448
+ if (persistedSession) {
449
+ // 检查进程是否仍在运�?
450
+ const { isProcessRunning } = await import('../services/process-detector.js');
451
+ const isProcessAlive = persistedSession.pid ? isProcessRunning(persistedSession.pid) : false;
452
+ res.json({
453
+ ok: true,
454
+ sessionId: persistedSession.sessionId,
455
+ agentId,
456
+ workspacePath: persistedSession.workspacePath,
457
+ command: persistedSession.command,
458
+ status: isProcessAlive ? 'orphan' : 'stopped',
459
+ startedAt: persistedSession.startedAt,
460
+ isActive: false,
461
+ mode: persistedSession.mode,
462
+ pid: persistedSession.pid,
463
+ isManaged: false,
464
+ isProcessAlive,
465
+ isOrphan: isProcessAlive, // 进程在运行但 bridge 未管�?
466
+ });
467
+ return;
468
+ }
469
+ res.json({
470
+ ok: true,
471
+ agentId,
472
+ status: 'none',
473
+ isActive: false,
474
+ isManaged: false,
475
+ });
476
+ }
477
+ catch (error) {
478
+ const err = error;
479
+ log.error('[sessions/by-agent] Error:', err);
480
+ res.status(500).json({ error: err.message });
481
+ }
482
+ });
483
+ /**
484
+ * 接管已存在的SDK会话
485
+ * POST /runtime/takeover-session
486
+ *
487
+ * 当aws-mcp-server重启后,用于重新获取bridge中已存在的SDK会话控制�?
488
+ * 不会启动新进程,只是重新建立会话关联
489
+ */
490
+ sessionsRouter.post('/takeover-session', validateToken, async (req, res) => {
491
+ const { agentId } = req.body;
492
+ if (!agentId) {
493
+ res.status(400).json({ error: 'agentId is required' });
494
+ return;
495
+ }
496
+ try {
497
+ // 1. 检查是否已有活跃PTY会话
498
+ const existingPtySession = Array.from(sessions.entries()).find(([, s]) => s.agentId === agentId);
499
+ if (existingPtySession) {
500
+ res.json({
501
+ ok: true,
502
+ agentId,
503
+ sessionId: existingPtySession[0],
504
+ mode: 'pty',
505
+ status: 'running',
506
+ isActive: true,
507
+ recovered: false,
508
+ message: 'PTY session already active',
509
+ });
510
+ return;
511
+ }
512
+ // 2. 检查是否已有活跃SDK会话
513
+ const existingSdkSession = Array.from(sdkSessions.entries()).find(([, s]) => s.agentId === agentId);
514
+ if (existingSdkSession) {
515
+ res.json({
516
+ ok: true,
517
+ agentId,
518
+ sessionId: existingSdkSession[0],
519
+ mode: 'sdk',
520
+ status: 'running',
521
+ isActive: true,
522
+ recovered: false,
523
+ message: 'SDK session already active',
524
+ });
525
+ return;
526
+ }
527
+ // 3. 查找持久化会�?
528
+ const persistedSession = await findPersistedSessionByAgentId(agentId);
529
+ if (!persistedSession) {
530
+ res.status(404).json({
531
+ error: 'No persisted session found for this agentId',
532
+ agentId,
533
+ });
534
+ return;
535
+ }
536
+ // 4. 检查SDK进程是否仍在运行
537
+ let isProcessAlive = false;
538
+ if (persistedSession.mode === 'sdk') {
539
+ // 对于SDK模式,尝试通过agentId查找进程
540
+ const orphanProcess = findOrphanProcessByAgentId(agentId);
541
+ isProcessAlive = !!orphanProcess;
542
+ if (!isProcessAlive && persistedSession.pid) {
543
+ // 如果通过agentId没找到,尝试通过PID检�?
544
+ isProcessAlive = isProcessRunning(persistedSession.pid);
545
+ }
546
+ }
547
+ else if (persistedSession.pid) {
548
+ // 对于PTY模式,检查PID
549
+ isProcessAlive = isProcessRunning(persistedSession.pid);
550
+ }
551
+ if (!isProcessAlive) {
552
+ log.info(`[takeover-session] Process not alive for agentId=${agentId}, mode=${persistedSession.mode}`);
553
+ res.json({
554
+ ok: false,
555
+ agentId,
556
+ status: 'process_not_alive',
557
+ isActive: false,
558
+ message: 'Agent process is no longer running',
559
+ });
560
+ return;
561
+ }
562
+ // 5. 进程仍在运行,恢复会话控�?
563
+ log.info(`[takeover-session] Taking over session for agentId=${agentId}, mode=${persistedSession.mode}, pid=${persistedSession.pid}`);
564
+ // 如果是SDK模式,检查是否已经有活跃的SDK会话(bridge重启后可能丢失)
565
+ if (persistedSession.mode === 'sdk') {
566
+ // 尝试通过进程检测找到实际的SDK进程
567
+ const orphanProcess = findOrphanProcessByAgentId(agentId);
568
+ if (orphanProcess) {
569
+ log.info(`[takeover-session] Found SDK process for agentId=${agentId}, pid=${orphanProcess.pid}`);
570
+ // �?重要:SDK模式下,进程仍在运行,但bridge的内存中可能没有sdkSessions记录
571
+ // 我们需要告诉aws-mcp-server这个session可以被接�?
572
+ // aws-mcp-server会通过WebSocket重新连接到这个SDK进程
573
+ res.json({
574
+ ok: true,
575
+ agentId,
576
+ sessionId: persistedSession.sessionId,
577
+ mode: 'sdk',
578
+ status: 'running',
579
+ isActive: true,
580
+ recovered: true,
581
+ pid: orphanProcess.pid || persistedSession.pid,
582
+ message: 'SDK session process found, can be taken over by aws-mcp-server',
583
+ });
584
+ }
585
+ else {
586
+ // 进程不在运行
587
+ res.json({
588
+ ok: false,
589
+ agentId,
590
+ status: 'process_not_alive',
591
+ isActive: false,
592
+ message: 'SDK process not found',
593
+ });
594
+ }
595
+ }
596
+ else {
597
+ // PTY模式,重新创建PTY会话
598
+ const sessionId = uuidv4();
599
+ const shell = process.platform === 'win32' ? 'powershell.exe' : 'bash';
600
+ const shellArgs = process.platform === 'win32' ? ['-NoLogo'] : [];
601
+ const terminal = pty.spawn(shell, shellArgs, {
602
+ name: 'xterm-color',
603
+ cols: 120,
604
+ rows: 30,
605
+ cwd: persistedSession.workspacePath,
606
+ env: {
607
+ ...process.env,
608
+ AWS_AGENT_ID: String(agentId),
609
+ },
610
+ });
611
+ sessions.set(sessionId, {
612
+ agentId,
613
+ workspacePath: persistedSession.workspacePath,
614
+ ptyProcess: terminal,
615
+ outputBuffer: '',
616
+ flushTimer: null,
617
+ flushInFlight: null,
618
+ seq: 0,
619
+ });
620
+ await upsertPersistedSession({
621
+ sessionId,
622
+ agentId,
623
+ workspacePath: persistedSession.workspacePath,
624
+ command: persistedSession.command,
625
+ startedAt: new Date().toISOString(),
626
+ status: 'running',
627
+ mode: 'pty',
628
+ pid: terminal.pid,
629
+ });
630
+ await sendStatus(agentId, sessionId, 'running');
631
+ terminal.onData((data) => {
632
+ const session = sessions.get(sessionId);
633
+ if (!session) {
634
+ return;
635
+ }
636
+ session.outputBuffer += data;
637
+ scheduleOutputFlush(sessionId);
638
+ });
639
+ terminal.onExit(async () => {
640
+ const session = sessions.get(sessionId);
641
+ if (session?.flushTimer) {
642
+ clearTimeout(session.flushTimer);
643
+ session.flushTimer = null;
644
+ }
645
+ await flushSessionOutput(sessionId);
646
+ sessions.delete(sessionId);
647
+ await removePersistedSession(sessionId);
648
+ await sendStatus(agentId, null, 'stopped');
649
+ });
650
+ res.json({
651
+ ok: true,
652
+ agentId,
653
+ sessionId,
654
+ mode: 'pty',
655
+ status: 'running',
656
+ isActive: true,
657
+ recovered: true,
658
+ pid: terminal.pid,
659
+ });
660
+ }
661
+ }
662
+ catch (error) {
663
+ const err = error;
664
+ log.error('[takeover-session] Error:', err);
665
+ res.status(500).json({ error: err.message });
666
+ }
667
+ });
668
+ /**
669
+ * 强制终止 Agent 进程树(包括所有子进程�?
670
+ * POST /runtime/terminate-tree
671
+ *
672
+ * 用于:当 Agent 脱离控制时,强制终止整个进程�?
673
+ */
674
+ sessionsRouter.post('/terminate-tree', validateToken, async (req, res) => {
675
+ const { agentId, sessionId } = req.body;
676
+ if (!agentId) {
677
+ res.status(400).json({ error: 'agentId is required' });
678
+ return;
679
+ }
680
+ try {
681
+ // 1. 查找会话(优先使�?sessionId,否则通过 agentId 查找�?
682
+ let targetSessionId = sessionId;
683
+ if (!targetSessionId) {
684
+ const persistedSession = await findPersistedSessionByAgentId(agentId);
685
+ if (!persistedSession) {
686
+ res.status(404).json({ error: 'Session not found for this agentId' });
687
+ return;
688
+ }
689
+ targetSessionId = persistedSession.sessionId;
690
+ }
691
+ // 2. 检查是否是活跃会话
692
+ const activeSession = sessions.get(targetSessionId);
693
+ const activeSdkSession = sdkSessions.get(targetSessionId);
694
+ let pid;
695
+ let mode;
696
+ if (activeSession) {
697
+ pid = activeSession.ptyProcess.pid;
698
+ mode = 'pty';
699
+ }
700
+ else if (activeSdkSession) {
701
+ const adapter = adapterRegistry.get(activeSdkSession.providerId || 'claude-code');
702
+ pid = adapter.getSessionPid?.(targetSessionId);
703
+ mode = 'sdk';
704
+ }
705
+ else {
706
+ // 非活跃会话,从持久化中获取 PID
707
+ const persistedSession = await findPersistedSessionByAgentId(agentId);
708
+ if (!persistedSession?.pid) {
709
+ res.status(404).json({ error: 'Session PID not found' });
710
+ return;
711
+ }
712
+ pid = persistedSession.pid;
713
+ mode = persistedSession.mode || 'pty';
714
+ }
715
+ // 3. 终止进程树
716
+ const { terminateProcessTree, waitForProcessExit } = await import('../services/process-detector.js');
717
+ // pid 此时一定存在(前面已经检查过)
718
+ if (!pid) {
719
+ res.status(404).json({ error: 'PID not found' });
720
+ return;
721
+ }
722
+ const result = terminateProcessTree(pid);
723
+ // 4. 等待进程完全终止(最多 5 秒)
724
+ const exited = waitForProcessExit(pid, 5000);
725
+ // 5. 清理持久化状�?
726
+ await import('../services/terminal-persistence.js').then(m => m.removePersistedSession(targetSessionId));
727
+ log.info(`[terminate-tree] Terminated process tree for agentId=${agentId}, pid=${pid}, mode=${mode}, terminated=${result.terminated}, failed=${result.failed}, exited=${exited}`);
728
+ res.json({
729
+ ok: true,
730
+ agentId,
731
+ pid,
732
+ mode,
733
+ terminated: result.terminated,
734
+ failed: result.failed,
735
+ exited,
736
+ message: exited
737
+ ? `Successfully terminated ${result.terminated} processes`
738
+ : `Terminated ${result.terminated} processes, but process ${pid} still running`,
739
+ });
740
+ }
741
+ catch (error) {
742
+ const err = error;
743
+ log.error('[terminate-tree] Error:', err);
744
+ res.status(500).json({ error: err.message });
745
+ }
746
+ });
747
+ /**
748
+ * 获取 Agent 健康状态
749
+ * GET /runtime/health/:agentId
750
+ *
751
+ * 返回:
752
+ * - 进程是否存活
753
+ * - CPU/内存使用率
754
+ * - 是否是孤儿进程(bridge 未管理)
755
+ * - 会话详细信息
756
+ */
757
+ sessionsRouter.get('/health/:agentId', validateToken, async (req, res) => {
758
+ const agentIdParam = req.params.agentId;
759
+ const agentId = Array.isArray(agentIdParam) ? agentIdParam[0] : agentIdParam;
760
+ if (!agentId) {
761
+ res.status(400).json({ error: 'agentId is required' });
762
+ return;
763
+ }
764
+ try {
765
+ // 1. 查找会话
766
+ const persistedSession = await findPersistedSessionByAgentId(agentId);
767
+ if (!persistedSession) {
768
+ res.status(404).json({ error: 'Session not found' });
769
+ return;
770
+ }
771
+ // 2. 检查是否是活跃会话
772
+ const activeSession = sessions.get(persistedSession.sessionId);
773
+ const activeSdkSession = sdkSessions.get(persistedSession.sessionId);
774
+ const isManaged = !!(activeSession || activeSdkSession);
775
+ // 3. 获取健康状态
776
+ const { checkProcessHealth } = await import('../services/process-detector.js');
777
+ const healthResponse = {
778
+ sessionId: persistedSession.sessionId,
779
+ mode: persistedSession.mode,
780
+ workspacePath: persistedSession.workspacePath,
781
+ isManaged,
782
+ isActive: !!(activeSession || activeSdkSession),
783
+ };
784
+ if (persistedSession.pid) {
785
+ const health = await checkProcessHealth(persistedSession.pid, agentId);
786
+ Object.assign(healthResponse, health);
787
+ }
788
+ else {
789
+ Object.assign(healthResponse, {
790
+ pid: 0,
791
+ alive: false,
792
+ cpu: 0,
793
+ memoryMB: 0,
794
+ status: 'dead',
795
+ lastUpdate: new Date(),
796
+ });
797
+ }
798
+ res.json({
799
+ agentId,
800
+ ...healthResponse,
801
+ });
802
+ }
803
+ catch (error) {
804
+ const err = error;
805
+ log.error('[health] Error:', err);
806
+ res.status(500).json({ error: err.message });
807
+ }
808
+ });