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,663 @@
1
+ /**
2
+ * 终端 API 路由
3
+ *
4
+ * 提供终端会话的启动、输入、调整大小和停止功能
5
+ * 支持 PTY 模式和 SDK 模式
6
+ */
7
+ import { Router } from 'express';
8
+ import pty from 'node-pty';
9
+ import { v4 as uuidv4 } from 'uuid';
10
+ import { adapterRegistry, registerSdkProviders, resolveSdkProviderIdByCommand, } from '../adapter/index.js';
11
+ import { validateToken } from '../middleware/auth.js';
12
+ import { getAgentProcessManager } from '../services/agent-process-manager.js';
13
+ import { AWS_MCP_SERVER_NAME, buildAwsMcpServerConfig } from '../services/aws-client-agent-mcp.js';
14
+ import { findClaudeCodeProcesses } from '../services/process-detector.js';
15
+ import { flushSessionOutput, scheduleOutputFlush, sendQuestionRequest, sendStatus, sessions } from '../services/session-output.js';
16
+ import { loadPersistedSessions, removePersistedSession, removePersistedSessionByAgentId, savePersistedSessions, upsertPersistedSession, } from '../services/terminal-persistence.js';
17
+ export const terminalRouter = Router();
18
+ // 导出 SDK 会话存储,供其他模块使用(如 sessions.ts)
19
+ export const sdkSessions = new Map();
20
+ export function resolveSdkProviderId(command) {
21
+ return resolveSdkProviderIdByCommand(command);
22
+ }
23
+ // ============ 初始化 Adapter ============
24
+ let adapterInitialized = false;
25
+ function ensureAdapterInitialized() {
26
+ if (adapterInitialized)
27
+ return;
28
+ registerSdkProviders(adapterRegistry, wireSdkAdapterEvents);
29
+ adapterInitialized = true;
30
+ }
31
+ function wireSdkAdapterEvents(adapter, definition) {
32
+ adapter.on('event', (event) => {
33
+ const entry = sdkSessions.get(event.sessionId);
34
+ if (entry) {
35
+ console.log(`[${definition.displayName} Adapter] Event: ${event.type} for session ${event.sessionId}`);
36
+ if (event.type === 'turn_complete' && event.data.usage) {
37
+ sendStatus(entry.agentId, event.sessionId, 'waiting_input', undefined, event.data.usage);
38
+ }
39
+ }
40
+ });
41
+ adapter.on('status-change', (sessionId, status, actionInfo) => {
42
+ const entry = sdkSessions.get(sessionId);
43
+ if (entry) {
44
+ console.log(`[${definition.displayName} Adapter] Status changed: ${status} for agent ${entry.agentId}`, actionInfo || '');
45
+ sendStatus(entry.agentId, sessionId, status, actionInfo);
46
+ }
47
+ });
48
+ adapter.on('ask-user-question', (data) => {
49
+ const entry = sdkSessions.get(data.sessionId);
50
+ if (entry) {
51
+ console.log(`[${definition.displayName} Adapter] AskUserQuestion for agent ${entry.agentId}`);
52
+ void sendQuestionRequest(entry.agentId, data.sessionId, Array.isArray(data.questions) ? data.questions : []);
53
+ }
54
+ });
55
+ adapter.on('permission-request', (data) => {
56
+ const entry = sdkSessions.get(data.sessionId);
57
+ if (entry) {
58
+ console.log(`[${definition.displayName} Adapter] Permission request: ${data.toolName} for agent ${entry.agentId}`);
59
+ }
60
+ });
61
+ }
62
+ /**
63
+ * 启动终端会话
64
+ * POST /runtime/start
65
+ * 支持 mode: 'pty' | 'sdk'
66
+ */
67
+ terminalRouter.post('/start', validateToken, async (req, res) => {
68
+ const { agentId, workspacePath, command, mode = 'pty' } = req.body || {};
69
+ if (!agentId || !workspacePath) {
70
+ res.status(400).json({ error: 'agentId and workspacePath are required' });
71
+ return;
72
+ }
73
+ // SDK 模式
74
+ if (mode === 'sdk') {
75
+ await startSdkSession(req, res);
76
+ return;
77
+ }
78
+ // PTY 模式(原有逻辑)
79
+ const oldSession = Array.from(sessions.entries()).find(([, value]) => value.agentId === agentId);
80
+ if (oldSession) {
81
+ try {
82
+ oldSession[1].ptyProcess.kill();
83
+ }
84
+ catch {
85
+ // ignore stale session cleanup errors
86
+ }
87
+ if (oldSession[1].flushTimer) {
88
+ clearTimeout(oldSession[1].flushTimer);
89
+ }
90
+ sessions.delete(oldSession[0]);
91
+ await removePersistedSession(oldSession[0]);
92
+ }
93
+ const sessionId = uuidv4();
94
+ const shell = process.platform === 'win32' ? 'powershell.exe' : 'bash';
95
+ const shellArgs = process.platform === 'win32' ? ['-NoLogo'] : [];
96
+ const actualCommand = command || 'claude';
97
+ const terminal = pty.spawn(shell, shellArgs, {
98
+ name: 'xterm-color',
99
+ cols: 120,
100
+ rows: 30,
101
+ cwd: workspacePath,
102
+ env: {
103
+ ...process.env,
104
+ AWS_AGENT_ID: String(agentId),
105
+ },
106
+ });
107
+ sessions.set(sessionId, {
108
+ agentId,
109
+ workspacePath,
110
+ ptyProcess: terminal,
111
+ outputBuffer: '',
112
+ flushTimer: null,
113
+ flushInFlight: null,
114
+ seq: 0,
115
+ });
116
+ await upsertPersistedSession({
117
+ sessionId,
118
+ agentId,
119
+ workspacePath,
120
+ command: actualCommand,
121
+ startedAt: new Date().toISOString(),
122
+ status: 'running',
123
+ mode: 'pty',
124
+ // ★ PTY 模式:记录 pty 进程的 PID
125
+ pid: terminal.pid,
126
+ });
127
+ // ★ 注册到进程管理器
128
+ const processManager = getAgentProcessManager();
129
+ await processManager.startProcess({
130
+ agentId,
131
+ sessionId,
132
+ pid: terminal.pid,
133
+ mode: 'pty',
134
+ workspacePath,
135
+ command: actualCommand,
136
+ });
137
+ await sendStatus(agentId, sessionId, 'running');
138
+ terminal.onData((data) => {
139
+ const session = sessions.get(sessionId);
140
+ if (!session) {
141
+ return;
142
+ }
143
+ session.outputBuffer += data;
144
+ scheduleOutputFlush(sessionId);
145
+ });
146
+ terminal.onExit(async () => {
147
+ const session = sessions.get(sessionId);
148
+ if (session?.flushTimer) {
149
+ clearTimeout(session.flushTimer);
150
+ session.flushTimer = null;
151
+ }
152
+ await flushSessionOutput(sessionId);
153
+ sessions.delete(sessionId);
154
+ // 直接删除持久化会话,而不是改成 stopped,避免后续被恢复
155
+ await removePersistedSession(sessionId);
156
+ // ★ 从进程管理器中移除
157
+ const processManager = getAgentProcessManager();
158
+ await processManager.removeProcess(agentId);
159
+ await sendStatus(agentId, null, 'stopped');
160
+ });
161
+ terminal.write(`${actualCommand}\r`);
162
+ res.json({
163
+ sessionId,
164
+ status: 'running',
165
+ agentId,
166
+ workspacePath,
167
+ command: actualCommand,
168
+ mode: 'pty',
169
+ });
170
+ });
171
+ /**
172
+ * 启动 SDK 会话
173
+ * 支持 MCP 配置和空闲命令
174
+ */
175
+ async function startSdkSession(req, res) {
176
+ const { agentId, workspacePath, command, autoAccept = true, initialPrompt,
177
+ // MCP 配置 - 加载 aws-client-agent-mcp
178
+ mcpConfigPath, extraMcpServers,
179
+ // 空闲命令配置
180
+ idleInputAutoCommand, nonInputAutoCommand, } = req.body || {};
181
+ let sessionId = null;
182
+ let agentForCleanup = null;
183
+ try {
184
+ ensureAdapterInitialized();
185
+ // 根据命令选择对应的 adapter
186
+ const normalizedCommand = (command || 'claude').toLowerCase();
187
+ const providerId = resolveSdkProviderId(command);
188
+ // ★ 特征日志:明确输出选择的 provider
189
+ console.log(`[Runtime] ★★★ SDK启动 ★★★ command="${command}", normalizedCommand="${normalizedCommand}", providerId="${providerId}"`);
190
+ const adapter = adapterRegistry.get(providerId);
191
+ sessionId = uuidv4();
192
+ agentForCleanup = agentId;
193
+ // 构建SDK配置
194
+ const config = {
195
+ command: command || 'claude',
196
+ workingDirectory: workspacePath,
197
+ autoAccept: Boolean(autoAccept),
198
+ initialPrompt,
199
+ // MCP 配置
200
+ mcpConfigPath,
201
+ extraMcpServers: {
202
+ // 默认加载 aws-mcp(用于 Agent 间通信)
203
+ [AWS_MCP_SERVER_NAME]: buildAwsMcpServerConfig({ agentId, workspacePath }),
204
+ ...(extraMcpServers || {}),
205
+ },
206
+ };
207
+ // 存储会话信息
208
+ sdkSessions.set(sessionId, {
209
+ agentId,
210
+ workspacePath,
211
+ sessionId,
212
+ config,
213
+ providerId, // 记录使用的 provider
214
+ });
215
+ // 启动 SDK 会话
216
+ await adapter.startSession(sessionId, config);
217
+ // ★ 尝试获取 SDK 进程的 PID(用于孤儿进程检测)
218
+ // SDK 不直接暴露 PID,通过进程检测服务查找匹配的进程
219
+ let sdkPid;
220
+ try {
221
+ // 等待一小段时间让进程启动
222
+ await new Promise(resolve => setTimeout(resolve, 500));
223
+ // 尝试通过 adapter 获取 PID(如果支持)
224
+ sdkPid = adapter.getSessionPid?.(sessionId);
225
+ // 如果 adapter 不支持,尝试通过进程检测服务查找
226
+ if (!sdkPid) {
227
+ const processes = findClaudeCodeProcesses();
228
+ // 查找匹配 agentId 或工作目录的进程
229
+ const matched = processes.find(p => p.agentId === agentId ||
230
+ p.cwd === workspacePath ||
231
+ p.command.includes(workspacePath));
232
+ if (matched) {
233
+ sdkPid = matched.pid;
234
+ console.log(`[Runtime] Found SDK process PID: ${sdkPid} for agentId=${agentId}`);
235
+ }
236
+ }
237
+ }
238
+ catch (pidError) {
239
+ console.warn(`[Runtime] Failed to get SDK PID for agentId=${agentId}:`, pidError);
240
+ }
241
+ // ★ 持久化会话信息(包含 PID)
242
+ await upsertPersistedSession({
243
+ sessionId,
244
+ agentId,
245
+ workspacePath,
246
+ command: config.command,
247
+ startedAt: new Date().toISOString(),
248
+ status: 'running',
249
+ mode: 'sdk',
250
+ pid: sdkPid,
251
+ providerSessionId: adapter.getProviderSessionId(sessionId),
252
+ });
253
+ // ★ 注册到进程管理器(如果有 PID)
254
+ if (sdkPid) {
255
+ const processManager = getAgentProcessManager();
256
+ await processManager.startProcess({
257
+ agentId,
258
+ sessionId,
259
+ pid: sdkPid,
260
+ mode: 'sdk',
261
+ workspacePath,
262
+ command: config.command,
263
+ });
264
+ }
265
+ // 存储空闲命令配置(用于SDK模式的空闲检测)
266
+ if (idleInputAutoCommand || nonInputAutoCommand) {
267
+ adapter.setIdleCommands?.(sessionId, {
268
+ idleInputCommand: idleInputAutoCommand || '',
269
+ nonInputCommand: nonInputAutoCommand || '',
270
+ });
271
+ }
272
+ res.json({
273
+ sessionId,
274
+ status: 'running',
275
+ agentId,
276
+ workspacePath,
277
+ command: config.command,
278
+ mode: 'sdk',
279
+ pid: sdkPid, // ★ 返回 PID 信息
280
+ });
281
+ }
282
+ catch (error) {
283
+ if (sessionId) {
284
+ sdkSessions.delete(sessionId);
285
+ await removePersistedSession(sessionId);
286
+ }
287
+ if (agentForCleanup) {
288
+ await removePersistedSessionByAgentId(agentForCleanup);
289
+ }
290
+ const errorMessage = error instanceof Error ? error.message : String(error);
291
+ res.status(500).json({ error: `Failed to start SDK session: ${errorMessage}` });
292
+ }
293
+ }
294
+ // ============ SDK 专用路由 ============
295
+ /**
296
+ * 发送消息到 SDK 会话
297
+ * POST /runtime/sdk/message
298
+ */
299
+ terminalRouter.post('/sdk/message', validateToken, async (req, res) => {
300
+ const { sessionId, message } = req.body || {};
301
+ if (!sessionId || !message) {
302
+ res.status(400).json({ error: 'sessionId and message are required' });
303
+ return;
304
+ }
305
+ const entry = sdkSessions.get(sessionId);
306
+ if (!entry) {
307
+ res.status(404).json({ error: 'SDK session not found' });
308
+ return;
309
+ }
310
+ try {
311
+ // 根据 providerId 获取对应的 adapter
312
+ const providerId = entry.providerId || 'claude-code';
313
+ const adapter = adapterRegistry.get(providerId);
314
+ await adapter.sendMessage(sessionId, message);
315
+ res.json({ ok: true });
316
+ }
317
+ catch (error) {
318
+ const errorMessage = error instanceof Error ? error.message : String(error);
319
+ res.status(500).json({ error: errorMessage });
320
+ }
321
+ });
322
+ /**
323
+ * 回答 AskUserQuestion
324
+ * POST /runtime/sdk/answer
325
+ */
326
+ terminalRouter.post('/sdk/answer', validateToken, async (req, res) => {
327
+ const { sessionId, answers } = req.body || {};
328
+ if (!sessionId || !answers) {
329
+ res.status(400).json({ error: 'sessionId and answers are required' });
330
+ return;
331
+ }
332
+ const entry = sdkSessions.get(sessionId);
333
+ if (!entry) {
334
+ res.status(404).json({ error: 'SDK session not found' });
335
+ return;
336
+ }
337
+ try {
338
+ // 根据 providerId 获取对应的 adapter
339
+ const providerId = entry.providerId || 'claude-code';
340
+ const adapter = adapterRegistry.get(providerId);
341
+ if (adapter.sendQuestionAnswer) {
342
+ await adapter.sendQuestionAnswer(sessionId, answers);
343
+ }
344
+ res.json({ ok: true });
345
+ }
346
+ catch (error) {
347
+ const errorMessage = error instanceof Error ? error.message : String(error);
348
+ res.status(500).json({ error: errorMessage });
349
+ }
350
+ });
351
+ /**
352
+ * 确认权限请求
353
+ * POST /runtime/sdk/confirm
354
+ */
355
+ terminalRouter.post('/sdk/confirm', validateToken, async (req, res) => {
356
+ const { sessionId, accept } = req.body || {};
357
+ if (!sessionId) {
358
+ res.status(400).json({ error: 'sessionId is required' });
359
+ return;
360
+ }
361
+ const entry = sdkSessions.get(sessionId);
362
+ if (!entry) {
363
+ res.status(404).json({ error: 'SDK session not found' });
364
+ return;
365
+ }
366
+ try {
367
+ // 根据 providerId 获取对应的 adapter
368
+ const providerId = entry.providerId || 'claude-code';
369
+ const adapter = adapterRegistry.get(providerId);
370
+ await adapter.sendConfirmation(sessionId, Boolean(accept));
371
+ res.json({ ok: true });
372
+ }
373
+ catch (error) {
374
+ const errorMessage = error instanceof Error ? error.message : String(error);
375
+ res.status(500).json({ error: errorMessage });
376
+ }
377
+ });
378
+ /**
379
+ * 中止当前轮次
380
+ * POST /runtime/sdk/abort
381
+ */
382
+ terminalRouter.post('/sdk/abort', validateToken, async (req, res) => {
383
+ const { sessionId } = req.body || {};
384
+ if (!sessionId) {
385
+ res.status(400).json({ error: 'sessionId is required' });
386
+ return;
387
+ }
388
+ const entry = sdkSessions.get(sessionId);
389
+ if (!entry) {
390
+ res.status(404).json({ error: 'SDK session not found' });
391
+ return;
392
+ }
393
+ try {
394
+ // 根据 providerId 获取对应的 adapter
395
+ const providerId = entry.providerId || 'claude-code';
396
+ const adapter = adapterRegistry.get(providerId);
397
+ await adapter.abortCurrentTurn(sessionId);
398
+ res.json({ ok: true });
399
+ }
400
+ catch (error) {
401
+ const errorMessage = error instanceof Error ? error.message : String(error);
402
+ res.status(500).json({ error: errorMessage });
403
+ }
404
+ });
405
+ /**
406
+ * 停止 SDK 会话
407
+ * POST /runtime/sdk/stop
408
+ */
409
+ terminalRouter.post('/sdk/stop', validateToken, async (req, res) => {
410
+ const { sessionId } = req.body || {};
411
+ if (!sessionId) {
412
+ res.status(400).json({ error: 'sessionId is required' });
413
+ return;
414
+ }
415
+ const entry = sdkSessions.get(sessionId);
416
+ if (!entry) {
417
+ res.json({ ok: true, status: 'stopped' });
418
+ return;
419
+ }
420
+ try {
421
+ // 根据 providerId 获取对应的 adapter
422
+ const providerId = entry.providerId || 'claude-code';
423
+ const adapter = adapterRegistry.get(providerId);
424
+ await adapter.terminateSession(sessionId);
425
+ sdkSessions.delete(sessionId);
426
+ await removePersistedSession(sessionId);
427
+ // ★ 从进程管理器中移除
428
+ const processManager = getAgentProcessManager();
429
+ await processManager.removeProcess(entry.agentId);
430
+ await sendStatus(entry.agentId, null, 'stopped');
431
+ res.json({ ok: true, status: 'stopped' });
432
+ }
433
+ catch (error) {
434
+ const errorMessage = error instanceof Error ? error.message : String(error);
435
+ res.status(500).json({ error: errorMessage });
436
+ }
437
+ });
438
+ /**
439
+ * 获取 SDK 会话状态
440
+ * GET /runtime/sdk/status/:sessionId
441
+ */
442
+ terminalRouter.get('/sdk/status/:sessionId', validateToken, (req, res) => {
443
+ const sessionId = req.params.sessionId;
444
+ if (!sessionId) {
445
+ res.status(400).json({ error: 'sessionId is required' });
446
+ return;
447
+ }
448
+ const entry = sdkSessions.get(sessionId);
449
+ if (!entry) {
450
+ res.status(404).json({ error: 'SDK session not found' });
451
+ return;
452
+ }
453
+ try {
454
+ // 根据 providerId 获取对应的 adapter
455
+ const providerId = entry.providerId || 'claude-code';
456
+ const adapter = adapterRegistry.get(providerId);
457
+ const status = adapter.getSessionStatus(sessionId);
458
+ const conversation = adapter.getConversation(sessionId);
459
+ res.json({
460
+ sessionId,
461
+ status,
462
+ agentId: entry.agentId,
463
+ workspacePath: entry.workspacePath,
464
+ messageCount: conversation.length,
465
+ });
466
+ }
467
+ catch (error) {
468
+ const errorMessage = error instanceof Error ? error.message : String(error);
469
+ res.status(500).json({ error: errorMessage });
470
+ }
471
+ });
472
+ // ============ PTY 模式原有路由 ============
473
+ /**
474
+ * 发送输入到终端(PTY 模式)
475
+ * POST /runtime/input
476
+ */
477
+ terminalRouter.post('/input', validateToken, (req, res) => {
478
+ const { sessionId, input } = req.body || {};
479
+ if (!sessionId || input === undefined || input === null) {
480
+ res.status(400).json({ error: 'sessionId and input are required' });
481
+ return;
482
+ }
483
+ const session = sessions.get(sessionId);
484
+ if (!session) {
485
+ res.status(404).json({ error: 'session not found' });
486
+ return;
487
+ }
488
+ session.ptyProcess.write(input);
489
+ res.json({ ok: true });
490
+ });
491
+ /**
492
+ * 调整终端大小(PTY 模式)
493
+ * POST /runtime/resize
494
+ */
495
+ terminalRouter.post('/resize', validateToken, (req, res) => {
496
+ const { sessionId, cols, rows } = req.body || {};
497
+ if (!sessionId || !cols || !rows) {
498
+ res.status(400).json({ error: 'sessionId, cols, rows are required' });
499
+ return;
500
+ }
501
+ const session = sessions.get(sessionId);
502
+ if (!session) {
503
+ res.status(404).json({ error: 'session not found' });
504
+ return;
505
+ }
506
+ session.ptyProcess.resize(Number(cols), Number(rows));
507
+ res.json({ ok: true, cols: Number(cols), rows: Number(rows) });
508
+ });
509
+ /**
510
+ * 停止终端会话(PTY 模式和 SDK 模式)
511
+ * POST /runtime/stop
512
+ */
513
+ terminalRouter.post('/stop', validateToken, async (req, res) => {
514
+ const { sessionId } = req.body || {};
515
+ if (!sessionId) {
516
+ res.status(400).json({ error: 'sessionId is required' });
517
+ return;
518
+ }
519
+ // 1. 检查是否是 SDK 会话
520
+ const sdkEntry = sdkSessions.get(sessionId);
521
+ if (sdkEntry) {
522
+ const agentId = sdkEntry.agentId;
523
+ try {
524
+ // 根据 providerId 获取对应的 adapter
525
+ const providerId = sdkEntry.providerId || 'claude-code';
526
+ const adapter = adapterRegistry.get(providerId);
527
+ await adapter.terminateSession(sessionId);
528
+ sdkSessions.delete(sessionId);
529
+ // 同时按 sessionId 和 agentId 删除,确保持久化会话被清除
530
+ await removePersistedSession(sessionId);
531
+ await removePersistedSessionByAgentId(agentId);
532
+ // ★ 从进程管理器中移除
533
+ const processManager = getAgentProcessManager();
534
+ await processManager.removeProcess(agentId);
535
+ await sendStatus(agentId, null, 'stopped');
536
+ res.json({ ok: true, status: 'stopped', mode: 'sdk' });
537
+ return;
538
+ }
539
+ catch (error) {
540
+ const errorMessage = error instanceof Error ? error.message : String(error);
541
+ // 即使终止失败,也清理会话记录
542
+ sdkSessions.delete(sessionId);
543
+ // 同时按 sessionId 和 agentId 删除,确保持久化会话被清除
544
+ await removePersistedSession(sessionId);
545
+ await removePersistedSessionByAgentId(agentId);
546
+ // ★ 也从进程管理器清理
547
+ const processManager = getAgentProcessManager();
548
+ await processManager.removeProcess(agentId);
549
+ console.error(`[Runtime] Failed to terminate SDK session ${sessionId}:`, errorMessage);
550
+ res.json({ ok: true, status: 'stopped', mode: 'sdk', warning: errorMessage });
551
+ return;
552
+ }
553
+ }
554
+ // 2. 检查是否是 PTY 会话
555
+ const session = sessions.get(sessionId);
556
+ if (!session) {
557
+ // 3. 会话不存在于内存,直接清理持久化记录,避免后续恢复
558
+ await removePersistedSession(sessionId);
559
+ // 也从进程管理器清理(通过持久化会话查找 agentId)
560
+ try {
561
+ const persistedSessions = await loadPersistedSessions();
562
+ const persistedSession = persistedSessions.find(p => p.sessionId === sessionId);
563
+ if (persistedSession) {
564
+ const processManager = getAgentProcessManager();
565
+ await processManager.removeProcess(persistedSession.agentId);
566
+ }
567
+ }
568
+ catch {
569
+ // ignore cleanup errors
570
+ }
571
+ res.json({ ok: true, status: 'stopped', mode: 'none' });
572
+ return;
573
+ }
574
+ // 4. 终止 PTY 进程
575
+ const agentId = session.agentId;
576
+ try {
577
+ session.ptyProcess.kill();
578
+ }
579
+ catch {
580
+ // ignore stop race errors
581
+ }
582
+ if (session.flushTimer) {
583
+ clearTimeout(session.flushTimer);
584
+ session.flushTimer = null;
585
+ }
586
+ await flushSessionOutput(sessionId);
587
+ sessions.delete(sessionId);
588
+ // 同时按 sessionId 和 agentId 删除,确保持久化会话被清除
589
+ await removePersistedSession(sessionId);
590
+ await removePersistedSessionByAgentId(agentId);
591
+ // ★ 从进程管理器中移除
592
+ const processManager = getAgentProcessManager();
593
+ await processManager.removeProcess(agentId);
594
+ await sendStatus(agentId, null, 'stopped');
595
+ res.json({ ok: true, status: 'stopped', mode: 'pty' });
596
+ });
597
+ /**
598
+ * 停止所有终端会话(PTY 和 SDK)
599
+ * POST /runtime/stop-all
600
+ * 用于 aws-mcp-server 重启时清理所有终端
601
+ */
602
+ terminalRouter.post('/stop-all', validateToken, async (_req, res) => {
603
+ const stoppedPty = [];
604
+ const stoppedSdk = [];
605
+ const errors = [];
606
+ // 1. 停止所有 PTY 会话
607
+ for (const [sessionId, session] of sessions.entries()) {
608
+ try {
609
+ if (session.flushTimer) {
610
+ clearTimeout(session.flushTimer);
611
+ session.flushTimer = null;
612
+ }
613
+ await flushSessionOutput(sessionId);
614
+ try {
615
+ session.ptyProcess.kill();
616
+ }
617
+ catch {
618
+ // ignore kill errors
619
+ }
620
+ sessions.delete(sessionId);
621
+ stoppedPty.push(sessionId);
622
+ await sendStatus(session.agentId, null, 'stopped');
623
+ }
624
+ catch (error) {
625
+ const errorMessage = error instanceof Error ? error.message : String(error);
626
+ errors.push(`PTY ${sessionId}: ${errorMessage}`);
627
+ }
628
+ }
629
+ // 2. 停止所有 SDK 会话
630
+ for (const [sessionId, entry] of sdkSessions.entries()) {
631
+ try {
632
+ // 根据 providerId 获取对应的 adapter
633
+ const providerId = entry.providerId || 'claude-code';
634
+ const adapter = adapterRegistry.get(providerId);
635
+ await adapter.terminateSession(sessionId);
636
+ sdkSessions.delete(sessionId);
637
+ stoppedSdk.push(sessionId);
638
+ await sendStatus(entry.agentId, null, 'stopped');
639
+ }
640
+ catch (error) {
641
+ const errorMessage = error instanceof Error ? error.message : String(error);
642
+ errors.push(`SDK ${sessionId}: ${errorMessage}`);
643
+ }
644
+ }
645
+ // 3. 清理持久化状态,避免 stop-all 后还能被恢复
646
+ // 直接清空整个持久化文件,确保不会有残留
647
+ try {
648
+ await savePersistedSessions([]);
649
+ console.log('[Runtime] 已清空所有持久化会话');
650
+ }
651
+ catch (error) {
652
+ const errorMessage = error instanceof Error ? error.message : String(error);
653
+ errors.push(`Persistence: ${errorMessage}`);
654
+ }
655
+ res.json({
656
+ ok: true,
657
+ stopped: {
658
+ pty: stoppedPty.length,
659
+ sdk: stoppedSdk.length,
660
+ },
661
+ errors: errors.length > 0 ? errors : undefined,
662
+ });
663
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=terminal.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.test.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.test.ts"],"names":[],"mappings":""}