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,622 @@
1
+ /**
2
+ * OpenCode SDK Adapter
3
+ *
4
+ * 主干流程:
5
+ * 1. spawn `opencode serve --port <port>` 进程(使用 shell: true)
6
+ * 2. 创建 SDK 客户端连接到该端口
7
+ * 3. 通过 client.session.create() 创建 OpenCode 会话
8
+ * 4. 订阅 SSE 事件流并映射到统一 ProviderEvent
9
+ * 5. 通过 client.session.prompt() 发送用户消息
10
+ *
11
+ * 参考:spectrai-community/src/main/adapter/OpenCodeSdkAdapter.ts
12
+ */
13
+ import { spawn } from 'child_process';
14
+ import { EventEmitter } from 'node:events';
15
+ import * as fs from 'fs';
16
+ import * as net from 'net';
17
+ import * as os from 'os';
18
+ import * as path from 'path';
19
+ import { v4 as uuidv4 } from 'uuid';
20
+ import { createOpencodeClient, } from '@opencode-ai/sdk';
21
+ import { getToolActionInfo } from './types.js';
22
+ // ============ 可执行文件查找 ============
23
+ /**
24
+ * 查找 opencode 可执行文件
25
+ * 优先级:用户配置的绝对路径 > Windows Volta exe > npm 全局目录 > 回退到 'opencode'
26
+ */
27
+ function findOpenCodeExecutable(configCommand) {
28
+ if (configCommand && path.isAbsolute(configCommand) && fs.existsSync(configCommand)) {
29
+ return configCommand;
30
+ }
31
+ const fallback = configCommand?.trim() || 'opencode';
32
+ if (process.platform === 'win32') {
33
+ const home = process.env.USERPROFILE || process.env.HOME || os.homedir();
34
+ const localAppData = process.env.LOCALAPPDATA || '';
35
+ // 1. Volta 安装的 opencode.exe(优先,不需要 shell)
36
+ const voltaExeDirs = [
37
+ path.join(localAppData, 'Volta', 'tools', 'shared', 'opencode-ai', 'node_modules', 'opencode-windows-x64', 'bin'),
38
+ path.join(localAppData, 'Volta', 'tools', 'shared', 'opencode-ai', 'node_modules', 'opencode-windows-x64-baseline', 'bin'),
39
+ ];
40
+ for (const dir of voltaExeDirs) {
41
+ const exePath = path.join(dir, 'opencode.exe');
42
+ if (fs.existsSync(exePath)) {
43
+ console.log(`[OpencodeSdkAdapter] Found opencode.exe: ${exePath}`);
44
+ return exePath;
45
+ }
46
+ }
47
+ // 2. npm 全局安装的 opencode.cmd
48
+ const npmGlobalDirs = [
49
+ path.join(home, 'AppData', 'Roaming', 'npm'),
50
+ path.join(home, 'AppData', 'Local', 'Volta', 'bin'),
51
+ ];
52
+ for (const dir of npmGlobalDirs) {
53
+ for (const name of ['opencode.cmd', 'opencode.exe', 'opencode']) {
54
+ const candidate = path.join(dir, name);
55
+ if (fs.existsSync(candidate)) {
56
+ console.log(`[OpencodeSdkAdapter] Found ${name}: ${candidate}`);
57
+ return candidate;
58
+ }
59
+ }
60
+ }
61
+ }
62
+ return fallback;
63
+ }
64
+ // ============ 端口检测 ============
65
+ async function findAvailablePort(startPort = 14096) {
66
+ for (let port = startPort; port < startPort + 100; port++) {
67
+ const available = await new Promise((resolve) => {
68
+ const server = net.createServer();
69
+ server.once('error', () => resolve(false));
70
+ server.once('listening', () => {
71
+ server.close(() => resolve(true));
72
+ });
73
+ server.listen(port, '127.0.0.1');
74
+ });
75
+ if (available)
76
+ return port;
77
+ }
78
+ throw new Error(`No available port found in range ${startPort}–${startPort + 99}`);
79
+ }
80
+ // ============ Adapter ============
81
+ export class OpencodeSdkAdapter extends EventEmitter {
82
+ constructor() {
83
+ super(...arguments);
84
+ this.providerId = 'opencode';
85
+ this.displayName = 'OpenCode';
86
+ this.sessions = new Map();
87
+ }
88
+ async startSession(sessionId, config) {
89
+ console.log(`[OpencodeSdkAdapter] ★★★ 启动 OpenCode SDK 会话 ★★★ sessionId="${sessionId}", workingDirectory="${config.workingDirectory}"`);
90
+ const session = {
91
+ adapterSession: {
92
+ sessionId,
93
+ status: 'starting',
94
+ messages: [],
95
+ createdAt: new Date().toISOString(),
96
+ totalUsage: { inputTokens: 0, outputTokens: 0 },
97
+ },
98
+ config,
99
+ sseActive: false,
100
+ pendingPermissions: new Map(),
101
+ emittedToolStarts: new Set(),
102
+ workingDirectory: config.workingDirectory,
103
+ userMessageIds: new Set(),
104
+ currentAssistantText: '',
105
+ seenTextPartIds: new Set(),
106
+ };
107
+ this.sessions.set(sessionId, session);
108
+ this.emit('status-change', sessionId, 'starting');
109
+ try {
110
+ // 步骤 1:找空闲端口
111
+ const port = await findAvailablePort();
112
+ session.port = port;
113
+ console.log(`[OpencodeSdkAdapter] ★★★ 使用端口 ★★★ port=${port}`);
114
+ // 步骤 2:启动 opencode serve 进程
115
+ const openCodeCommand = findOpenCodeExecutable(config.command);
116
+ console.log(`[OpencodeSdkAdapter] ★★★ 启动命令 ★★★ command="${openCodeCommand}"`);
117
+ // ★ 关键:Windows 上 .cmd 必须使用 shell: true
118
+ const useShell = openCodeCommand.endsWith('.cmd') ||
119
+ openCodeCommand.endsWith('.CMD') ||
120
+ (process.platform === 'win32' && !path.isAbsolute(openCodeCommand));
121
+ console.log(`[OpencodeSdkAdapter] shell=${useShell}`);
122
+ const env = { ...process.env, ...config.envOverrides };
123
+ const proc = spawn(openCodeCommand, ['serve', '--port', String(port)], {
124
+ cwd: config.workingDirectory,
125
+ stdio: ['ignore', 'pipe', 'pipe'],
126
+ env,
127
+ shell: useShell,
128
+ });
129
+ session.serverProcess = proc;
130
+ proc.stdout?.on('data', (d) => {
131
+ console.debug(`[OpencodeSdkAdapter] serve stdout: ${d.toString().slice(0, 200)}`);
132
+ });
133
+ proc.stderr?.on('data', (d) => {
134
+ console.debug(`[OpencodeSdkAdapter] serve stderr: ${d.toString().slice(0, 200)}`);
135
+ });
136
+ proc.on('error', (err) => {
137
+ console.error(`[OpencodeSdkAdapter] Server process error:`, err);
138
+ if (session.adapterSession.status !== 'terminated') {
139
+ session.adapterSession.status = 'error';
140
+ this.emit('status-change', sessionId, 'error');
141
+ this.emitEvent({
142
+ type: 'error',
143
+ sessionId,
144
+ timestamp: new Date().toISOString(),
145
+ data: { text: `OpenCode server error: ${err.message}` },
146
+ });
147
+ }
148
+ });
149
+ proc.on('exit', (code) => {
150
+ console.log(`[OpencodeSdkAdapter] Server exited with code ${code}`);
151
+ session.sseActive = false;
152
+ });
153
+ // 步骤 3:创建 SDK 客户端
154
+ const client = createOpencodeClient({
155
+ baseUrl: `http://127.0.0.1:${port}`,
156
+ });
157
+ session.client = client;
158
+ // 步骤 4:等待服务器就绪
159
+ await this.waitForServer(client, config.workingDirectory, 10_000, port);
160
+ console.log(`[OpencodeSdkAdapter] ★★★ OpenCode server ready ★★★ port=${port}`);
161
+ // 步骤 5:创建 OpenCode 会话
162
+ const createResult = await client.session.create({
163
+ body: { title: `aws-bridge-${sessionId.slice(0, 8)}` },
164
+ query: { directory: config.workingDirectory },
165
+ });
166
+ const ocSession = createResult.data;
167
+ if (!ocSession?.id) {
168
+ throw new Error('OpenCode session.create() did not return an ID');
169
+ }
170
+ session.opencodeSessionId = ocSession.id;
171
+ session.adapterSession.providerSessionId = ocSession.id;
172
+ console.log(`[OpencodeSdkAdapter] ★★★ OpenCode 会话创建成功 ★★★ sessionId="${ocSession.id}"`);
173
+ // 步骤 6:后台启动 SSE 事件订阅循环
174
+ this.startSseLoop(sessionId, session);
175
+ session.adapterSession.status = 'waiting_input';
176
+ this.emit('status-change', sessionId, 'waiting_input');
177
+ // 步骤 7:发送初始 Prompt
178
+ if (config.initialPrompt) {
179
+ await this.sendMessage(sessionId, config.initialPrompt);
180
+ }
181
+ }
182
+ catch (err) {
183
+ const msg = err instanceof Error ? err.message : String(err);
184
+ console.error(`[OpencodeSdkAdapter] startSession failed:`, err);
185
+ session.adapterSession.status = 'error';
186
+ this.emit('status-change', sessionId, 'error');
187
+ this.emitEvent({
188
+ type: 'error',
189
+ sessionId,
190
+ timestamp: new Date().toISOString(),
191
+ data: { text: `OpenCode start failed: ${msg}` },
192
+ });
193
+ throw err;
194
+ }
195
+ }
196
+ async sendMessage(sessionId, message) {
197
+ const session = this.sessions.get(sessionId);
198
+ if (!session)
199
+ throw new Error(`Session ${sessionId} not found`);
200
+ if (!session.client || !session.opencodeSessionId) {
201
+ throw new Error(`Session ${sessionId} not ready`);
202
+ }
203
+ const userMsg = {
204
+ id: uuidv4(),
205
+ sessionId,
206
+ role: 'user',
207
+ content: message,
208
+ timestamp: new Date().toISOString(),
209
+ };
210
+ session.adapterSession.messages.push(userMsg);
211
+ this.emit('conversation-message', sessionId, userMsg);
212
+ session.adapterSession.status = 'thinking';
213
+ this.emit('status-change', sessionId, 'thinking');
214
+ this.stopIdleDetection(sessionId);
215
+ try {
216
+ await session.client.session.prompt({
217
+ path: { id: session.opencodeSessionId },
218
+ body: {
219
+ parts: [{ type: 'text', text: message }],
220
+ },
221
+ query: { directory: session.workingDirectory },
222
+ });
223
+ }
224
+ catch (err) {
225
+ const msg = err instanceof Error ? err.message : String(err);
226
+ this.emitEvent({
227
+ type: 'error',
228
+ sessionId,
229
+ timestamp: new Date().toISOString(),
230
+ data: { text: msg },
231
+ });
232
+ }
233
+ }
234
+ async sendConfirmation(sessionId, accept) {
235
+ const session = this.sessions.get(sessionId);
236
+ if (!session?.client || !session.opencodeSessionId)
237
+ return;
238
+ const response = accept ? 'once' : 'reject';
239
+ const ocId = session.opencodeSessionId;
240
+ for (const [permissionId] of session.pendingPermissions) {
241
+ try {
242
+ await session.client.postSessionIdPermissionsPermissionId({
243
+ path: { id: ocId, permissionID: permissionId },
244
+ body: { response },
245
+ query: { directory: session.workingDirectory },
246
+ });
247
+ }
248
+ catch (err) {
249
+ console.warn(`[OpencodeSdkAdapter] Permission response failed:`, err);
250
+ }
251
+ }
252
+ session.pendingPermissions.clear();
253
+ }
254
+ async sendQuestionAnswer(_sessionId, _answers) {
255
+ // OpenCode 的 AskUserQuestion 通过 permission 机制处理
256
+ }
257
+ setIdleCommands(sessionId, commands) {
258
+ const session = this.sessions.get(sessionId);
259
+ if (session) {
260
+ session.idleCommands = commands;
261
+ }
262
+ }
263
+ async abortCurrentTurn(sessionId) {
264
+ const session = this.sessions.get(sessionId);
265
+ if (!session?.client || !session.opencodeSessionId)
266
+ return;
267
+ try {
268
+ await session.client.session.abort({
269
+ path: { id: session.opencodeSessionId },
270
+ query: { directory: session.workingDirectory },
271
+ });
272
+ }
273
+ catch (err) {
274
+ console.warn(`[OpencodeSdkAdapter] Abort failed:`, err);
275
+ }
276
+ }
277
+ async terminateSession(sessionId) {
278
+ const session = this.sessions.get(sessionId);
279
+ if (!session)
280
+ return;
281
+ this.stopIdleDetection(sessionId);
282
+ session.sseActive = false;
283
+ session.sseAbortController?.abort();
284
+ if (session.serverProcess) {
285
+ try {
286
+ session.serverProcess.kill();
287
+ }
288
+ catch {
289
+ // ignore
290
+ }
291
+ }
292
+ session.adapterSession.status = 'terminated';
293
+ this.emit('status-change', sessionId, 'terminated');
294
+ this.emitEvent({
295
+ type: 'session_complete',
296
+ sessionId,
297
+ timestamp: new Date().toISOString(),
298
+ data: { exitCode: 0 },
299
+ });
300
+ this.sessions.delete(sessionId);
301
+ }
302
+ getConversation(sessionId) {
303
+ return this.sessions.get(sessionId)?.adapterSession.messages ?? [];
304
+ }
305
+ hasSession(sessionId) {
306
+ return this.sessions.has(sessionId);
307
+ }
308
+ getProviderSessionId(sessionId) {
309
+ return this.sessions.get(sessionId)?.opencodeSessionId;
310
+ }
311
+ getSessionStatus(sessionId) {
312
+ return this.sessions.get(sessionId)?.adapterSession.status;
313
+ }
314
+ getSessionPid(sessionId) {
315
+ const session = this.sessions.get(sessionId);
316
+ if (!session)
317
+ return undefined;
318
+ // OpenCode SDK 模式下 serverProcess 是 spawn 出来的子进程
319
+ return session.serverProcess?.pid;
320
+ }
321
+ cleanup() {
322
+ for (const [id] of this.sessions) {
323
+ try {
324
+ this.terminateSession(id);
325
+ }
326
+ catch {
327
+ // ignore
328
+ }
329
+ }
330
+ this.sessions.clear();
331
+ }
332
+ // ============ 私有方法 ============
333
+ async waitForServer(client, directory, timeoutMs, port) {
334
+ const deadline = Date.now() + timeoutMs;
335
+ while (Date.now() < deadline) {
336
+ try {
337
+ const result = await client.session.list({ query: { directory } });
338
+ if (result.data !== undefined)
339
+ return;
340
+ }
341
+ catch {
342
+ // 服务器尚未就绪
343
+ }
344
+ await new Promise((r) => setTimeout(r, 300));
345
+ }
346
+ throw new Error(`OpenCode server (port ${port}) did not start within ${timeoutMs}ms`);
347
+ }
348
+ startSseLoop(sessionId, session) {
349
+ session.sseActive = true;
350
+ const ac = new AbortController();
351
+ session.sseAbortController = ac;
352
+ this.runSseLoop(sessionId, session, ac).catch((err) => {
353
+ if (!ac.signal.aborted) {
354
+ console.error(`[OpencodeSdkAdapter] SSE loop error:`, err);
355
+ }
356
+ });
357
+ }
358
+ async runSseLoop(sessionId, session, ac) {
359
+ if (!session.client)
360
+ return;
361
+ try {
362
+ const sseResult = await session.client.event.subscribe({
363
+ query: { directory: session.workingDirectory },
364
+ signal: ac.signal,
365
+ });
366
+ for await (const event of sseResult.stream) {
367
+ if (!session.sseActive || ac.signal.aborted)
368
+ break;
369
+ this.handleOpenCodeEvent(sessionId, session, event);
370
+ }
371
+ }
372
+ catch (err) {
373
+ if (ac.signal.aborted)
374
+ return;
375
+ console.error(`[OpencodeSdkAdapter] SSE stream ended:`, err);
376
+ }
377
+ }
378
+ handleOpenCodeEvent(sessionId, session, event) {
379
+ const ts = new Date().toISOString();
380
+ const ocId = session.opencodeSessionId;
381
+ switch (event.type) {
382
+ case 'message.updated': {
383
+ const msg = event.properties.info;
384
+ if (msg.sessionID !== ocId)
385
+ break;
386
+ if (msg.role === 'user') {
387
+ session.userMessageIds.add(msg.id);
388
+ }
389
+ else if (msg.role === 'assistant') {
390
+ const tokens = msg.tokens;
391
+ if (tokens) {
392
+ session.adapterSession.totalUsage.inputTokens = Math.max(session.adapterSession.totalUsage.inputTokens, tokens.input);
393
+ session.adapterSession.totalUsage.outputTokens = Math.max(session.adapterSession.totalUsage.outputTokens, tokens.output);
394
+ }
395
+ }
396
+ break;
397
+ }
398
+ case 'message.part.updated': {
399
+ const { part, delta } = event.properties;
400
+ if (part.sessionID !== ocId)
401
+ break;
402
+ if (session.userMessageIds.has(part.messageID))
403
+ break;
404
+ this.handlePartUpdate(sessionId, session, part, delta, ts);
405
+ break;
406
+ }
407
+ case 'session.idle': {
408
+ if (event.properties.sessionID !== ocId)
409
+ break;
410
+ if (session.currentAssistantText) {
411
+ const assistantMsg = {
412
+ id: uuidv4(),
413
+ sessionId,
414
+ role: 'assistant',
415
+ content: session.currentAssistantText,
416
+ timestamp: ts,
417
+ };
418
+ session.adapterSession.messages.push(assistantMsg);
419
+ session.currentAssistantText = '';
420
+ }
421
+ session.seenTextPartIds.clear();
422
+ this.emitEvent({
423
+ type: 'turn_complete',
424
+ sessionId,
425
+ timestamp: ts,
426
+ data: { usage: session.adapterSession.totalUsage },
427
+ });
428
+ session.adapterSession.status = 'waiting_input';
429
+ this.emit('status-change', sessionId, 'waiting_input');
430
+ this.startIdleDetection(sessionId);
431
+ break;
432
+ }
433
+ case 'permission.updated': {
434
+ const perm = event.properties;
435
+ if (perm.sessionID !== ocId)
436
+ break;
437
+ const permId = perm.id;
438
+ session.pendingPermissions.set(permId, perm);
439
+ if (session.config.autoAccept && session.client && ocId) {
440
+ session.client
441
+ .postSessionIdPermissionsPermissionId({
442
+ path: { id: ocId, permissionID: permId },
443
+ body: { response: 'once' },
444
+ query: { directory: session.workingDirectory },
445
+ })
446
+ .then(() => {
447
+ session.pendingPermissions.delete(permId);
448
+ })
449
+ .catch((err) => {
450
+ console.warn(`[OpencodeSdkAdapter] Auto-accept permission failed:`, err);
451
+ });
452
+ }
453
+ else {
454
+ this.emitEvent({
455
+ type: 'permission_request',
456
+ sessionId,
457
+ timestamp: ts,
458
+ data: {
459
+ permissionPrompt: perm.title,
460
+ toolName: perm.type,
461
+ },
462
+ });
463
+ }
464
+ break;
465
+ }
466
+ case 'session.error': {
467
+ const { sessionID, error } = event.properties;
468
+ if (sessionID && sessionID !== ocId)
469
+ break;
470
+ let errMsg = 'OpenCode session error';
471
+ if (error) {
472
+ const data = error.data;
473
+ if (typeof data?.message === 'string') {
474
+ errMsg = `${error.name}: ${data.message}`;
475
+ }
476
+ else {
477
+ errMsg = error.name;
478
+ }
479
+ }
480
+ this.emitEvent({
481
+ type: 'error',
482
+ sessionId,
483
+ timestamp: ts,
484
+ data: { text: errMsg },
485
+ });
486
+ break;
487
+ }
488
+ }
489
+ }
490
+ handlePartUpdate(sessionId, session, part, delta, ts) {
491
+ switch (part.type) {
492
+ case 'text': {
493
+ let text;
494
+ if (delta !== undefined) {
495
+ text = delta;
496
+ session.seenTextPartIds.add(part.id);
497
+ }
498
+ else if (!session.seenTextPartIds.has(part.id)) {
499
+ text = part.text;
500
+ if (text)
501
+ session.seenTextPartIds.add(part.id);
502
+ }
503
+ else {
504
+ break;
505
+ }
506
+ if (!text)
507
+ break;
508
+ session.currentAssistantText += text;
509
+ this.emitEvent({
510
+ type: 'text_delta',
511
+ sessionId,
512
+ timestamp: ts,
513
+ data: { text },
514
+ });
515
+ break;
516
+ }
517
+ case 'reasoning': {
518
+ const text = delta ?? part.text;
519
+ if (!text)
520
+ break;
521
+ this.emitEvent({
522
+ type: 'thinking',
523
+ sessionId,
524
+ timestamp: ts,
525
+ data: { text },
526
+ });
527
+ break;
528
+ }
529
+ case 'tool': {
530
+ const toolUseId = part.callID;
531
+ const toolName = part.tool;
532
+ const state = part.state;
533
+ const toolInput = state.input;
534
+ // 从 ToolPart.metadata 中提取 MCP server 信息(注意:metadata 在 part 上,不在 state 上)
535
+ const metadata = part.metadata;
536
+ // 调试日志:查看 metadata 内容
537
+ if (metadata && Object.keys(metadata).length > 0) {
538
+ console.log(`[OpencodeSdkAdapter] Tool "${toolName}" metadata:`, JSON.stringify(metadata));
539
+ }
540
+ const emitToolStart = () => {
541
+ if (session.emittedToolStarts.has(toolUseId))
542
+ return;
543
+ session.emittedToolStarts.add(toolUseId);
544
+ const actionInfo = getToolActionInfo(toolName, toolInput, metadata);
545
+ this.emitEvent({
546
+ type: 'tool_use_start',
547
+ sessionId,
548
+ timestamp: ts,
549
+ data: { toolName, toolInput, toolUseId, ...actionInfo },
550
+ });
551
+ session.adapterSession.messages.push({
552
+ id: uuidv4(),
553
+ sessionId,
554
+ role: 'tool_use',
555
+ content: `${toolName}: ${JSON.stringify(toolInput).slice(0, 100)}`,
556
+ timestamp: ts,
557
+ toolName,
558
+ toolInput,
559
+ toolUseId,
560
+ });
561
+ };
562
+ if (state.status === 'running') {
563
+ emitToolStart();
564
+ const actionInfo = getToolActionInfo(toolName, toolInput, metadata);
565
+ this.emit('status-change', sessionId, 'tool_using', actionInfo);
566
+ }
567
+ else if (state.status === 'completed') {
568
+ emitToolStart();
569
+ const output = state.output;
570
+ this.emitEvent({
571
+ type: 'tool_use_end',
572
+ sessionId,
573
+ timestamp: ts,
574
+ data: { toolName, toolResult: output, isError: false, toolUseId },
575
+ });
576
+ session.emittedToolStarts.delete(toolUseId);
577
+ }
578
+ else if (state.status === 'error') {
579
+ emitToolStart();
580
+ const errorStr = state.error;
581
+ this.emitEvent({
582
+ type: 'tool_use_end',
583
+ sessionId,
584
+ timestamp: ts,
585
+ data: { toolName, toolResult: errorStr, isError: true, toolUseId },
586
+ });
587
+ session.emittedToolStarts.delete(toolUseId);
588
+ }
589
+ break;
590
+ }
591
+ }
592
+ }
593
+ emitEvent(event) {
594
+ this.emit('event', event);
595
+ }
596
+ startIdleDetection(sessionId) {
597
+ this.stopIdleDetection(sessionId);
598
+ const session = this.sessions.get(sessionId);
599
+ if (!session?.idleCommands?.idleInputCommand)
600
+ return;
601
+ const timer = setInterval(() => {
602
+ this.checkIdleState(sessionId);
603
+ }, 500);
604
+ session.idleTimer = timer;
605
+ }
606
+ stopIdleDetection(sessionId) {
607
+ const session = this.sessions.get(sessionId);
608
+ if (session?.idleTimer) {
609
+ clearInterval(session.idleTimer);
610
+ session.idleTimer = undefined;
611
+ }
612
+ }
613
+ checkIdleState(sessionId) {
614
+ const session = this.sessions.get(sessionId);
615
+ if (!session || session.adapterSession.status !== 'waiting_input')
616
+ return;
617
+ if (!session.idleCommands?.idleInputCommand)
618
+ return;
619
+ void this.sendMessage(sessionId, session.idleCommands.idleInputCommand);
620
+ this.stopIdleDetection(sessionId);
621
+ }
622
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=OpencodeSdkAdapter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpencodeSdkAdapter.test.d.ts","sourceRoot":"","sources":["../../src/adapter/OpencodeSdkAdapter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { OpencodeSdkAdapter } from './OpencodeSdkAdapter.js';
3
+ describe('OpencodeSdkAdapter', () => {
4
+ it('should expose opencode provider identity', () => {
5
+ const adapter = new OpencodeSdkAdapter();
6
+ expect(adapter.providerId).toBe('opencode');
7
+ expect(adapter.displayName).toBe('OpenCode');
8
+ });
9
+ it('should start with no active sessions', () => {
10
+ const adapter = new OpencodeSdkAdapter();
11
+ expect(adapter.hasSession('missing-session')).toBe(false);
12
+ expect(adapter.getSessionStatus('missing-session')).toBeUndefined();
13
+ });
14
+ });
@@ -0,0 +1,15 @@
1
+ import type { AdapterRegistry } from './AdapterRegistry.js';
2
+ import type { BaseProviderAdapter } from './types.js';
3
+ export interface SdkProviderDefinition {
4
+ runtimeMode: string;
5
+ providerId: string;
6
+ displayName: string;
7
+ defaultCommand: string;
8
+ commandMatchers: string[];
9
+ createAdapter: () => BaseProviderAdapter;
10
+ }
11
+ export declare const SDK_PROVIDER_DEFINITIONS: SdkProviderDefinition[];
12
+ export declare function resolveSdkProviderByCommand(command?: string): SdkProviderDefinition;
13
+ export declare function resolveSdkProviderIdByCommand(command?: string): string;
14
+ export declare function registerSdkProviders(registry: AdapterRegistry, wireAdapterEvents: (adapter: BaseProviderAdapter, definition: SdkProviderDefinition) => void): void;
15
+ //# sourceMappingURL=SdkProviderSpi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SdkProviderSpi.d.ts","sourceRoot":"","sources":["../../src/adapter/SdkProviderSpi.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,mBAAmB,CAAC;CAC1C;AAED,eAAO,MAAM,wBAAwB,EAAE,qBAAqB,EAyB3D,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAOnF;AAED,wBAAgB,6BAA6B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,iBAAiB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,qBAAqB,KAAK,IAAI,GAC3F,IAAI,CASN"}