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
package/dist/index.js ADDED
@@ -0,0 +1,503 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Runtime Bridge 服务主入口
4
+ *
5
+ * 提供 Agent 运行时与调度器之间的桥接功能
6
+ */
7
+ import express from "express";
8
+ import cors from "cors";
9
+ import { existsSync, readFileSync } from "node:fs";
10
+ import path from "node:path";
11
+ import os from "node:os";
12
+ import { allowedCorsOrigins, port, validateProductionToken } from "./config.js";
13
+ import { propertiesRouter } from "./routes/properties.js";
14
+ import { ymlRouter } from "./routes/yml.js";
15
+ import { instanceRouter, setGracefulShutdownFn } from "./routes/instance.js";
16
+ import { skillsRouter } from "./routes/skills.js";
17
+ import { mcpRouter } from "./routes/mcp.js";
18
+ import { terminalRouter, sdkSessions } from "./routes/terminal.js";
19
+ import { sessionsRouter } from "./routes/sessions.js";
20
+ import { gitRouter } from "./routes/git.js";
21
+ import { fileBrowserRouter } from "./routes/file-browser.js";
22
+ import { aiSourcesRouter } from "./routes/ai-sources.js";
23
+ import { processesRouter } from "./routes/processes.js";
24
+ import { sessions, flushSessionOutput } from "./services/session-output.js";
25
+ import { loadPersistedSessions, savePersistedSessions } from "./services/terminal-persistence.js";
26
+ import { detectOrphanProcesses } from "./services/process-detector.js";
27
+ import { startOrphanMonitor, stopOrphanMonitor } from "./services/orphan-monitor.js";
28
+ import { getAgentProcessManager } from "./services/agent-process-manager.js";
29
+ import { adapterRegistry } from "./adapter/index.js";
30
+ import { logger } from "./utils/logger.js";
31
+ import { autoRegister, unregister, bridgeRestartCleanup } from "./services/auto-register.js";
32
+ import { ensureAwsClientAgentMcpReleased } from "./services/aws-client-agent-mcp.js";
33
+ // 验证生产环境配置
34
+ validateProductionToken();
35
+ ensureAwsClientAgentMcpReleased();
36
+ // ★ 启动时自动注册
37
+ async function performAutoRegister() {
38
+ try {
39
+ const success = await autoRegister();
40
+ if (success) {
41
+ logger.info("[runtime-bridge] 自动注册成功");
42
+ }
43
+ else {
44
+ // 检查注册状态
45
+ const { loadConfig } = await import("./services/auto-register.js");
46
+ const config = loadConfig();
47
+ // 判断是否有配置(配置文件存在或环境变量设置了必填项)
48
+ const hasConfig = config.tenantId && config.userKey;
49
+ if (hasConfig && config.enabled) {
50
+ // 有配置但注册失败,服务启动失败
51
+ logger.error("[runtime-bridge] 自动注册已启用但注册失败,服务启动失败");
52
+ logger.error("[runtime-bridge] 请检查调度中心是否可达、配置是否正确");
53
+ process.exitCode = 1;
54
+ }
55
+ else {
56
+ // 没有配置,正常启动服务
57
+ logger.info("[runtime-bridge] 自动注册未配置,继续启动服务");
58
+ logger.info("[runtime-bridge] 要启用自动注册,请创建配置文件 ~/.aws-bridge/config.json");
59
+ }
60
+ }
61
+ }
62
+ catch (error) {
63
+ const err = error;
64
+ logger.warn("[runtime-bridge] 自动注册出错:", err.message);
65
+ }
66
+ }
67
+ performAutoRegister()
68
+ .then(() => {
69
+ // ★★★ Bridge 重启清理
70
+ // 在注册完成后执行清理,确保调度中心将该 bridge 关联的所有 Agent 设置为离线
71
+ // 这样可以确保 bridge 重启后,之前启动的 Agent 显示为"离线+停止"状态
72
+ return performBridgeRestartCleanup();
73
+ })
74
+ .catch(err => {
75
+ logger.warn("[runtime-bridge] 自动注册或清理出错:", err);
76
+ });
77
+ // ★★★ Bridge 重启清理
78
+ // 在启动时通知调度中心清理该 bridge 关联的所有 Agent 状态
79
+ // 这样可以确保 bridge 重启后,之前启动的 Agent 显示为"离线+停止"状态
80
+ async function performBridgeRestartCleanup() {
81
+ try {
82
+ // 只有在已注册的情况下才执行清理
83
+ const { getRegistrationState } = await import("./services/auto-register.js");
84
+ const state = getRegistrationState();
85
+ if (!state.registered || !state.instanceId) {
86
+ logger.info("[runtime-bridge] 实例未注册,跳过 Bridge 重启清理");
87
+ return;
88
+ }
89
+ logger.info("[runtime-bridge] ★ Bridge 重启,正在通知调度中心清理 Agent 状态...");
90
+ const result = await bridgeRestartCleanup();
91
+ if (result.success) {
92
+ logger.info(`[runtime-bridge] ★ Bridge 重启清理成功,清理了 ${result.agentCount || 0} 个 Agent`);
93
+ }
94
+ else {
95
+ logger.warn(`[runtime-bridge] ★ Bridge 重启清理失败: ${result.error}`);
96
+ }
97
+ }
98
+ catch (error) {
99
+ const err = error;
100
+ logger.warn("[runtime-bridge] Bridge 重启清理出错:", err.message);
101
+ }
102
+ }
103
+ // ★ 启动时重建进程注册表
104
+ async function rebuildProcessRegistry() {
105
+ try {
106
+ const persistedSessions = await loadPersistedSessions();
107
+ if (persistedSessions.length === 0) {
108
+ logger.info("[runtime-bridge] 无持久化会话,跳过进程注册表重建");
109
+ return;
110
+ }
111
+ const manager = getAgentProcessManager();
112
+ await manager.rebuildRegistry(persistedSessions.map(s => ({
113
+ agentId: s.agentId,
114
+ sessionId: s.sessionId,
115
+ pid: s.pid,
116
+ workspacePath: s.workspacePath,
117
+ command: s.command,
118
+ mode: s.mode || 'pty',
119
+ })));
120
+ logger.info(`[runtime-bridge] 进程注册表重建完成: ${persistedSessions.length} 条记录`);
121
+ }
122
+ catch (error) {
123
+ const err = error;
124
+ logger.warn("[runtime-bridge] 进程注册表重建失败:", err.message);
125
+ }
126
+ }
127
+ rebuildProcessRegistry().catch(err => {
128
+ logger.warn("[runtime-bridge] 进程注册表重建出错:", err);
129
+ });
130
+ // ★ 启动时检测孤儿进程并自动清理
131
+ // ★★★ 修复:bridge 重启时清理所有 agent 进程(包括 SDK 模式)
132
+ // 因为 bridge 重启意味着整个运行环境重启,所有 agent 都应该被清理
133
+ // ★★★ 例外:如果存在 .preserve-sessions 标记文件,说明是 aws-mcp-server 重启,需要保留会话
134
+ async function detectOrphansOnStartup() {
135
+ try {
136
+ // ★★★ 检查是否存在保留会话标记文件
137
+ const fs = await import('fs/promises');
138
+ const path = await import('path');
139
+ const os = await import('os');
140
+ const restartFlagFile = path.join(os.tmpdir(), 'agentswork-runtime-bridge', '.preserve-sessions');
141
+ let preserveSessions = false;
142
+ try {
143
+ const flagContent = await fs.readFile(restartFlagFile, 'utf-8');
144
+ const flag = JSON.parse(flagContent);
145
+ preserveSessions = flag.preserveSessions === true;
146
+ // 读取后删除标记文件
147
+ await fs.unlink(restartFlagFile);
148
+ logger.info(`[runtime-bridge] ★ 检测到保留会话标记,preserveSessions=${preserveSessions}`);
149
+ }
150
+ catch {
151
+ // 标记文件不存在,正常启动
152
+ }
153
+ const persistedSessions = await loadPersistedSessions();
154
+ if (persistedSessions.length === 0) {
155
+ logger.info("[runtime-bridge] 启动时无持久化会话,无需检测孤儿进程");
156
+ return;
157
+ }
158
+ // ★★★ 如果是 aws-mcp-server 重启触发的 bridge 启动,保留会话
159
+ if (preserveSessions) {
160
+ logger.info(`[runtime-bridge] ★ aws-mcp-server 重启恢复场景,保留 ${persistedSessions.length} 个会话`);
161
+ // 重建进程注册表
162
+ const manager = getAgentProcessManager();
163
+ await manager.rebuildRegistry(persistedSessions.map(s => ({
164
+ agentId: s.agentId,
165
+ sessionId: s.sessionId,
166
+ pid: s.pid,
167
+ workspacePath: s.workspacePath,
168
+ command: s.command,
169
+ mode: s.mode || 'pty',
170
+ })));
171
+ return;
172
+ }
173
+ logger.info(`[runtime-bridge] ★ Bridge 重启,检测 ${persistedSessions.length} 个持久化会话的孤儿进程...`);
174
+ // ★★★ 修复:不再区分 SDK 和 PTY 模式,全部清理
175
+ // bridge 重启 = 整个运行环境重启,所有 agent 都应该被终止
176
+ const orphans = detectOrphanProcesses(persistedSessions.map(s => ({
177
+ agentId: s.agentId,
178
+ pid: s.pid,
179
+ workspacePath: s.workspacePath,
180
+ command: s.command,
181
+ })));
182
+ if (orphans.length > 0) {
183
+ logger.warn(`[runtime-bridge] ★ 检测到 ${orphans.length} 个孤儿进程仍在运行:`);
184
+ for (const orphan of orphans) {
185
+ logger.warn(` - agentId=${orphan.agentId}, pid=${orphan.process.pid}, command=${orphan.process.command?.slice(0, 50)}`);
186
+ }
187
+ // ★ 自动清理所有孤儿进程
188
+ logger.info("[runtime-bridge] 正在自动清理所有孤儿进程...");
189
+ for (const orphan of orphans) {
190
+ try {
191
+ if (orphan.process.pid) {
192
+ // 使用跨平台方式终止进程
193
+ if (process.platform === 'win32') {
194
+ const { execSync } = await import('child_process');
195
+ execSync(`taskkill /PID ${orphan.process.pid} /T /F`, { encoding: 'utf8', timeout: 3000 });
196
+ logger.info(`[runtime-bridge] 已自动终止孤儿进程: agentId=${orphan.agentId}, PID=${orphan.process.pid}`);
197
+ }
198
+ else {
199
+ process.kill(orphan.process.pid, 'SIGKILL');
200
+ logger.info(`[runtime-bridge] 已自动终止孤儿进程: agentId=${orphan.agentId}, PID=${orphan.process.pid}`);
201
+ }
202
+ }
203
+ }
204
+ catch (killError) {
205
+ const err = killError;
206
+ logger.warn(`[runtime-bridge] 自动终止孤儿进程失败: agentId=${orphan.agentId}, PID=${orphan.process.pid}, error=${err.message}`);
207
+ }
208
+ }
209
+ // 等待进程完全终止
210
+ await new Promise(resolve => setTimeout(resolve, 1000));
211
+ }
212
+ // ★★★ 修复:bridge 重启后清空所有持久化会话
213
+ // 不再保留任何会话,因为所有 agent 都应该被清理
214
+ await savePersistedSessions([]);
215
+ logger.info(`[runtime-bridge] ★ Bridge 重启完成,已清空所有持久化会话(清理了 ${orphans.length} 个孤儿进程)`);
216
+ }
217
+ catch (error) {
218
+ const err = error;
219
+ logger.warn("[runtime-bridge] 启动时孤儿进程检测失败:", err.message);
220
+ }
221
+ }
222
+ // 执行孤儿进程检测
223
+ detectOrphansOnStartup().catch(err => {
224
+ logger.warn("[runtime-bridge] 孤儿进程检测出错:", err);
225
+ });
226
+ // ★ 启动孤儿进程定期监控
227
+ startOrphanMonitor().catch(err => {
228
+ logger.warn("[runtime-bridge] 启动孤儿进程监控失败:", err);
229
+ });
230
+ // 创建 Express 应用
231
+ const app = express();
232
+ // 中间件配置
233
+ app.use(cors({
234
+ origin(origin, callback) {
235
+ if (!origin || allowedCorsOrigins.includes(origin)) {
236
+ callback(null, true);
237
+ return;
238
+ }
239
+ callback(new Error(`[runtime-bridge] CORS origin is not allowed: ${origin}`));
240
+ },
241
+ }));
242
+ app.use(express.json({ limit: "1mb" }));
243
+ // 注册路由
244
+ app.use("/runtime", propertiesRouter);
245
+ app.use("/runtime", ymlRouter);
246
+ app.use("/runtime", instanceRouter);
247
+ app.use("/runtime", skillsRouter);
248
+ app.use("/runtime", mcpRouter);
249
+ app.use("/runtime", terminalRouter);
250
+ app.use("/runtime", sessionsRouter);
251
+ app.use("/runtime", processesRouter);
252
+ app.use("/runtime", gitRouter);
253
+ app.use("/runtime", aiSourcesRouter);
254
+ app.use("/api/file-browser", fileBrowserRouter);
255
+ /**
256
+ * 启动 HTTP 服务并对端口占用给出可诊断错误,避免未捕获异常直接崩溃。
257
+ */
258
+ function startServer() {
259
+ const server = app.listen(port, () => {
260
+ logger.info(`[runtime-bridge] listening on ${port}`);
261
+ });
262
+ server.on("error", (error) => {
263
+ if (error.code === "EADDRINUSE") {
264
+ logger.error(`[runtime-bridge] port ${port} is already in use. ` +
265
+ "Stop the existing runtime-bridge process or set AWS_RUNTIME_BRIDGE_PORT to another port before starting.");
266
+ process.exitCode = 1;
267
+ return;
268
+ }
269
+ logger.error("[runtime-bridge] failed to start server:", error);
270
+ process.exitCode = 1;
271
+ });
272
+ return server;
273
+ }
274
+ /**
275
+ * 优雅关闭处理
276
+ *
277
+ * 在收到终止信号时:
278
+ * 1. 停止所有 PTY 会话(杀死终端进程)
279
+ * 2. 停止所有 SDK 会话(终止 Agent 进程)
280
+ * 3. 验证所有进程已终止
281
+ * 4. 清空持久化状态(避免恢复残留会话)
282
+ * 5. 关闭 HTTP 服务器
283
+ *
284
+ * ★★★ 修复:添加 preserveSessions 参数
285
+ * - preserveSessions=true: aws-mcp-server 触发的关闭,保留会话状态
286
+ * - preserveSessions=false: bridge 自己关闭,清理所有会话
287
+ */
288
+ let isShuttingDown = false;
289
+ async function gracefulShutdown(signal, server, preserveSessions = false) {
290
+ if (isShuttingDown) {
291
+ logger.info(`[runtime-bridge] 已在关闭中,忽略 ${signal}`);
292
+ return;
293
+ }
294
+ isShuttingDown = true;
295
+ // ★★★ 防御性检测:如果 preserveSessions 未显式设为 true,
296
+ // 检查 .preserve-sessions 标记文件是否存在。
297
+ // 这是为了覆盖所有调用路径(包括非信号处理器路径)都能正确识别 aws-mcp-server 重启场景。
298
+ if (!preserveSessions) {
299
+ const flagExists = checkPreserveFlagSync();
300
+ if (flagExists) {
301
+ preserveSessions = true;
302
+ logger.info(`[runtime-bridge] ★ 检测到 .preserve-sessions 标记文件,自动升级为保留会话模式`);
303
+ }
304
+ }
305
+ logger.info(`[runtime-bridge] 收到 ${signal} 信号,开始优雅关闭... (preserveSessions=${preserveSessions})`);
306
+ const startTime = Date.now();
307
+ try {
308
+ // 1. 停止所有 PTY 会话
309
+ const ptyCount = sessions.size;
310
+ logger.info(`[runtime-bridge] 正在停止 ${ptyCount} 个 PTY 会话...`);
311
+ for (const [sessionId, session] of sessions.entries()) {
312
+ try {
313
+ // 清理定时器
314
+ if (session.flushTimer) {
315
+ clearTimeout(session.flushTimer);
316
+ session.flushTimer = null;
317
+ }
318
+ // 刷新剩余输出
319
+ try {
320
+ await flushSessionOutput(sessionId);
321
+ }
322
+ catch {
323
+ // 忽略刷新错误
324
+ }
325
+ // 杀死 PTY 进程
326
+ try {
327
+ session.ptyProcess.kill();
328
+ logger.info(`[runtime-bridge] PTY 会话 ${sessionId} 已终止 (PID: ${session.ptyProcess.pid})`);
329
+ }
330
+ catch {
331
+ // 忽略终止错误
332
+ }
333
+ sessions.delete(sessionId);
334
+ }
335
+ catch (e) {
336
+ const err = e;
337
+ logger.error(`[runtime-bridge] PTY 会话 ${sessionId} 终止失败:`, err.message);
338
+ }
339
+ }
340
+ // 2. 停止所有 SDK 会话
341
+ const sdkCount = sdkSessions.size;
342
+ logger.info(`[runtime-bridge] 正在停止 ${sdkCount} 个 SDK 会话...`);
343
+ for (const [sessionId, entry] of sdkSessions.entries()) {
344
+ try {
345
+ const providerId = entry.providerId || "claude-code";
346
+ const adapter = adapterRegistry.get(providerId);
347
+ // 尝试获取 PID 用于日志
348
+ let pidInfo = '';
349
+ try {
350
+ const pid = adapter.getSessionPid?.(sessionId);
351
+ if (pid) {
352
+ pidInfo = ` (PID: ${pid})`;
353
+ }
354
+ }
355
+ catch {
356
+ // 忽略 PID 获取错误
357
+ }
358
+ await adapter.terminateSession(sessionId);
359
+ logger.info(`[runtime-bridge] SDK 会话 ${sessionId} 已终止${pidInfo}`);
360
+ sdkSessions.delete(sessionId);
361
+ }
362
+ catch (e) {
363
+ const err = e;
364
+ logger.error(`[runtime-bridge] SDK 会话 ${sessionId} 终止失败:`, err.message);
365
+ // 即使失败也从内存中移除
366
+ sdkSessions.delete(sessionId);
367
+ }
368
+ }
369
+ // 3. 停止孤儿进程监控
370
+ logger.info("[runtime-bridge] 正在停止孤儿进程监控...");
371
+ stopOrphanMonitor();
372
+ // 4. ★ 验证所有进程已终止(等待一小段时间让进程完全退出)
373
+ logger.info("[runtime-bridge] 等待进程完全终止...");
374
+ await new Promise(resolve => setTimeout(resolve, 1000));
375
+ // 5. 检查是否还有残留进程,如果有则强制终止
376
+ try {
377
+ const { detectOrphanProcesses, terminateProcessTree } = await import("./services/process-detector.js");
378
+ const { loadPersistedSessions } = await import("./services/terminal-persistence.js");
379
+ const persistedSessions = await loadPersistedSessions();
380
+ if (persistedSessions.length > 0) {
381
+ const orphans = detectOrphanProcesses(persistedSessions.map(s => ({
382
+ agentId: s.agentId,
383
+ pid: s.pid,
384
+ workspacePath: s.workspacePath,
385
+ command: s.command,
386
+ })));
387
+ if (orphans.length > 0) {
388
+ logger.warn(`[runtime-bridge] 检测到 ${orphans.length} 个残留进程,正在强制终止...`);
389
+ for (const orphan of orphans) {
390
+ if (orphan.process.pid) {
391
+ // 使用进程树终止(跨平台)
392
+ const result = terminateProcessTree(orphan.process.pid);
393
+ logger.info(`[runtime-bridge] 已强制终止残留进程树:agentId=${orphan.agentId}, PID=${orphan.process.pid}, 终止了 ${result.terminated} 个进程`);
394
+ }
395
+ }
396
+ }
397
+ }
398
+ }
399
+ catch (checkError) {
400
+ const err = checkError;
401
+ logger.warn("[runtime-bridge] 残留进程检查失败:", err.message);
402
+ }
403
+ // 6. 注销实例
404
+ logger.info("[runtime-bridge] 正在注销实例...");
405
+ try {
406
+ await unregister();
407
+ }
408
+ catch (e) {
409
+ const err = e;
410
+ logger.error("[runtime-bridge] 注销实例失败:", err.message);
411
+ }
412
+ // 7. ★★★ 修复:根据 preserveSessions 决定是否清空持久化状态
413
+ // - preserveSessions=true (aws-mcp-server 触发): 保留会话状态,aws-mcp-server 重启后可恢复
414
+ // - preserveSessions=false (bridge 自己关闭): 清空所有会话,agent 应被清理
415
+ if (!preserveSessions) {
416
+ logger.info("[runtime-bridge] 正在清空持久化会话状态...");
417
+ try {
418
+ await savePersistedSessions([]);
419
+ }
420
+ catch (e) {
421
+ const err = e;
422
+ logger.error("[runtime-bridge] 清空持久化状态失败:", err.message);
423
+ }
424
+ }
425
+ else {
426
+ logger.info("[runtime-bridge] ★ 保留持久化会话状态(aws-mcp-server 重启恢复场景)");
427
+ }
428
+ // 8. 关闭 HTTP 服务器
429
+ const elapsed = Date.now() - startTime;
430
+ logger.info(`[runtime-bridge] 优雅关闭完成 (耗时 ${elapsed}ms),停止 ${ptyCount} PTY + ${sdkCount} SDK 会话`);
431
+ server.close(() => {
432
+ logger.info("[runtime-bridge] HTTP 服务器已关闭");
433
+ process.exit(0);
434
+ });
435
+ // 强制退出超时(防止卡住)
436
+ setTimeout(() => {
437
+ logger.warn("[runtime-bridge] 优雅关闭超时,强制退出");
438
+ process.exit(1);
439
+ }, 8000); // 增加到 8 秒,给进程终止更多时间
440
+ }
441
+ catch (e) {
442
+ const err = e;
443
+ logger.error("[runtime-bridge] 优雅关闭过程中发生错误:", err);
444
+ process.exit(1);
445
+ }
446
+ }
447
+ // 启动服务器
448
+ const server = startServer();
449
+ /**
450
+ * ★★★ 修复:同步检测 .preserve-sessions 标记文件
451
+ *
452
+ * 当 aws-mcp-server 调用 /runtime/prepare-restart 后,
453
+ * 会在临时目录创建该标记文件。桥接器收到 SIGTERM/SIGINT 时,
454
+ * 应检查此文件来决定是否保留会话。
455
+ *
456
+ * 信号处理器必须使用同步 I/O,因为异步操作在信号上下文中不可靠。
457
+ */
458
+ const RESTART_FLAG_FILE = path.join(os.tmpdir(), 'agentswork-runtime-bridge', '.preserve-sessions');
459
+ function checkPreserveFlagSync() {
460
+ try {
461
+ if (existsSync(RESTART_FLAG_FILE)) {
462
+ const content = readFileSync(RESTART_FLAG_FILE, 'utf-8');
463
+ const flag = JSON.parse(content);
464
+ return flag.preserveSessions === true;
465
+ }
466
+ }
467
+ catch {
468
+ // 文件不存在或无法解析,按不保留处理
469
+ }
470
+ return false;
471
+ }
472
+ // ★★★ 设置 gracefulShutdown 函数引用,供 instance router 使用
473
+ setGracefulShutdownFn(async (signal, preserveSessions) => {
474
+ await gracefulShutdown(signal, server, preserveSessions);
475
+ });
476
+ // 注册终止信号处理器
477
+ // ★★★ 修复:收到终止信号时先检查 aws-mcp-server 是否已调用 prepare-restart
478
+ // 如果标记文件存在,说明是 aws-mcp-server 重启场景,需要保留会话状态
479
+ process.on("SIGTERM", () => {
480
+ const preserve = checkPreserveFlagSync();
481
+ gracefulShutdown("SIGTERM", server, preserve);
482
+ });
483
+ process.on("SIGINT", () => {
484
+ const preserve = checkPreserveFlagSync();
485
+ gracefulShutdown("SIGINT", server, preserve);
486
+ });
487
+ // Windows 支持(Ctrl+C 在 Windows 上触发 SIGBREAK)
488
+ if (process.platform === "win32") {
489
+ process.on("SIGBREAK", () => {
490
+ const preserve = checkPreserveFlagSync();
491
+ gracefulShutdown("SIGBREAK", server, preserve);
492
+ });
493
+ }
494
+ // 未捕获异常处理
495
+ process.on("uncaughtException", (error) => {
496
+ logger.error("[runtime-bridge] 未捕获异常:", error);
497
+ // ★ 未捕获异常时不检查标记文件 — 异常重启需要完整清理
498
+ gracefulShutdown("uncaughtException", server);
499
+ });
500
+ process.on("unhandledRejection", (reason, promise) => {
501
+ logger.error("[runtime-bridge] 未处理的 Promise 拒绝:", reason);
502
+ // 不立即退出,只记录错误
503
+ });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Token 验证中间件
3
+ *
4
+ * 验证请求头中的 X-Runtime-Token 是否与配置的 runtimeToken 匹配
5
+ */
6
+ import type { Request, Response, NextFunction } from 'express';
7
+ /**
8
+ * Token 验证中间件
9
+ * 检查请求头中的 X-Runtime-Token 是否有效
10
+ */
11
+ export declare function validateToken(req: Request, res: Response, next: NextFunction): void;
12
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG/D;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAOnF"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Token 验证中间件
3
+ *
4
+ * 验证请求头中的 X-Runtime-Token 是否与配置的 runtimeToken 匹配
5
+ */
6
+ import { runtimeToken } from '../config.js';
7
+ /**
8
+ * Token 验证中间件
9
+ * 检查请求头中的 X-Runtime-Token 是否有效
10
+ */
11
+ export function validateToken(req, res, next) {
12
+ const token = req.header('X-Runtime-Token');
13
+ if (token !== runtimeToken) {
14
+ res.status(401).json({ error: 'unauthorized' });
15
+ return;
16
+ }
17
+ next();
18
+ }
@@ -0,0 +1,2 @@
1
+ export declare const aiSourcesRouter: import("express-serve-static-core").Router;
2
+ //# sourceMappingURL=ai-sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sources.d.ts","sourceRoot":"","sources":["../../src/routes/ai-sources.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,eAAe,4CAAW,CAAC"}
@@ -0,0 +1,136 @@
1
+ import { Router } from 'express';
2
+ import axios from 'axios';
3
+ import { validateToken } from '../middleware/auth.js';
4
+ import { getAiConfigService } from '../services/cc-switch-sdk.js';
5
+ import { buildToolSpecificAiConfig, } from '@cc-switch/sdk';
6
+ import { createLogger } from '../utils/logger.js';
7
+ const log = createLogger('ai-sources');
8
+ export const aiSourcesRouter = Router();
9
+ function normalizeListedModels(payload) {
10
+ if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
11
+ return [];
12
+ }
13
+ const payloadRecord = payload;
14
+ const data = Array.isArray(payloadRecord.data) ? payloadRecord.data : [];
15
+ const ids = new Set();
16
+ for (const item of data) {
17
+ if (!item || typeof item !== 'object' || Array.isArray(item)) {
18
+ continue;
19
+ }
20
+ const id = String(item.id || '').trim();
21
+ if (id) {
22
+ ids.add(id);
23
+ }
24
+ }
25
+ return [...ids];
26
+ }
27
+ async function fetchRemoteModelList(baseUrl, apiKey) {
28
+ const normalizedBaseUrl = baseUrl.replace(/\/+$/, '');
29
+ const openAiCandidates = normalizedBaseUrl.endsWith('/v1')
30
+ ? [`${normalizedBaseUrl}/models`]
31
+ : [`${normalizedBaseUrl}/models`, `${normalizedBaseUrl}/v1/models`];
32
+ for (const candidate of openAiCandidates) {
33
+ try {
34
+ const response = await axios.get(candidate, {
35
+ headers: {
36
+ Authorization: `Bearer ${apiKey}`,
37
+ },
38
+ timeout: 10000,
39
+ });
40
+ const models = normalizeListedModels(response.data);
41
+ if (models.length > 0) {
42
+ return models;
43
+ }
44
+ }
45
+ catch {
46
+ // continue probing next compatible endpoint
47
+ }
48
+ }
49
+ const anthropicCandidate = `${normalizedBaseUrl.endsWith('/v1') ? normalizedBaseUrl : `${normalizedBaseUrl}/v1`}/models`;
50
+ const anthropicResponse = await axios.get(anthropicCandidate, {
51
+ headers: {
52
+ 'x-api-key': apiKey,
53
+ 'anthropic-version': '2023-06-01',
54
+ },
55
+ timeout: 10000,
56
+ });
57
+ return normalizeListedModels(anthropicResponse.data);
58
+ }
59
+ aiSourcesRouter.post('/cc-switch/apply-ai-sources', validateToken, async (req, res) => {
60
+ const { agentId, template, claudecodeTemplateId, codexTemplateId, opencodeTemplateId, claudecode, codex, opencode, } = req.body || {};
61
+ if (!agentId) {
62
+ res.status(400).json({ error: 'agentId is required' });
63
+ return;
64
+ }
65
+ try {
66
+ const aiConfigService = getAiConfigService();
67
+ const generatedConfig = template ? buildToolSpecificAiConfig({
68
+ baseUrl: String(template?.baseUrl || ''),
69
+ apiKey: String(template?.apiKey || ''),
70
+ model: String(template?.model || ''),
71
+ models: Array.isArray(template?.models)
72
+ ? template.models.map((item) => String(item || '').trim()).filter(Boolean)
73
+ : undefined,
74
+ }) : null;
75
+ const claudeSource = generatedConfig?.claudecode || claudecode;
76
+ const codexSource = generatedConfig?.codex || codex;
77
+ const opencodeSource = generatedConfig?.opencode || opencode;
78
+ let mergedClaude = null;
79
+ let mergedCodex = null;
80
+ let mergedOpencode = null;
81
+ if (claudeSource && typeof claudeSource === 'object') {
82
+ mergedClaude = await aiConfigService.applyClaudeCodeConfig(claudeSource);
83
+ }
84
+ if (codexSource && typeof codexSource === 'object') {
85
+ mergedCodex = await aiConfigService.applyCodexConfig(codexSource);
86
+ }
87
+ if (opencodeSource && typeof opencodeSource === 'object') {
88
+ mergedOpencode = await aiConfigService.applyOpenCodeConfig(opencodeSource);
89
+ }
90
+ res.json({
91
+ ok: true,
92
+ agentId: String(agentId),
93
+ claudecodeTemplateId: String(claudecodeTemplateId || ''),
94
+ codexTemplateId: String(codexTemplateId || ''),
95
+ opencodeTemplateId: String(opencodeTemplateId || ''),
96
+ generatedFromUnifiedTemplate: Boolean(generatedConfig),
97
+ applied: {
98
+ claudecode: claudeSource && typeof claudeSource === 'object' ? Object.keys(claudeSource) : [],
99
+ codex: codexSource && typeof codexSource === 'object' ? Object.keys(codexSource) : [],
100
+ opencode: opencodeSource && typeof opencodeSource === 'object' ? Object.keys(opencodeSource) : [],
101
+ },
102
+ });
103
+ }
104
+ catch (error) {
105
+ const err = error;
106
+ log.error('Failed to apply AI sources', {
107
+ error: err?.message,
108
+ agentId: String(agentId || ''),
109
+ });
110
+ res.status(400).json({ error: err?.message || 'apply ai sources failed' });
111
+ }
112
+ });
113
+ aiSourcesRouter.post('/cc-switch/list-ai-models', validateToken, async (req, res) => {
114
+ const { baseUrl, apiKey } = req.body || {};
115
+ const normalizedBaseUrl = String(baseUrl || '').trim();
116
+ const normalizedApiKey = String(apiKey || '').trim();
117
+ if (!normalizedBaseUrl || !normalizedApiKey) {
118
+ res.status(400).json({ error: 'baseUrl and apiKey are required' });
119
+ return;
120
+ }
121
+ try {
122
+ const models = await fetchRemoteModelList(normalizedBaseUrl, normalizedApiKey);
123
+ res.json({
124
+ ok: true,
125
+ models,
126
+ });
127
+ }
128
+ catch (error) {
129
+ const err = error;
130
+ log.error('Failed to list remote AI models', {
131
+ error: err?.message,
132
+ baseUrl: normalizedBaseUrl,
133
+ });
134
+ res.status(400).json({ error: err?.message || 'list ai models failed' });
135
+ }
136
+ });