aws-runtime-bridge 1.9.79 → 1.9.81

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (596) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +0 -1
  2. package/dist/adapter/AcodeSdkAdapter.js +11 -1986
  3. package/dist/adapter/AdapterRegistry.d.ts +0 -1
  4. package/dist/adapter/AdapterRegistry.js +2 -100
  5. package/dist/adapter/ClaudeSdkAdapter.d.ts +0 -1
  6. package/dist/adapter/ClaudeSdkAdapter.js +4 -1300
  7. package/dist/adapter/CodexSdkAdapter.d.ts +0 -1
  8. package/dist/adapter/CodexSdkAdapter.js +4 -836
  9. package/dist/adapter/OpencodeSdkAdapter.d.ts +0 -1
  10. package/dist/adapter/OpencodeSdkAdapter.js +4 -879
  11. package/dist/adapter/SdkProviderSpi.d.ts +0 -1
  12. package/dist/adapter/SdkProviderSpi.js +2 -55
  13. package/dist/adapter/acode-tool-names.d.ts +0 -1
  14. package/dist/adapter/acode-tool-names.js +2 -37
  15. package/dist/adapter/idle-poll-loop.d.ts +0 -1
  16. package/dist/adapter/idle-poll-loop.js +2 -59
  17. package/dist/adapter/index.d.ts +0 -1
  18. package/dist/adapter/index.js +2 -11
  19. package/dist/adapter/instance-ai-config-resolver.d.ts +0 -1
  20. package/dist/adapter/instance-ai-config-resolver.js +2 -46
  21. package/dist/adapter/types.d.ts +0 -1
  22. package/dist/adapter/types.js +2 -443
  23. package/dist/adapters/cc-switch/common.d.ts +0 -1
  24. package/dist/adapters/cc-switch/common.js +2 -61
  25. package/dist/adapters/cc-switch/index.d.ts +0 -1
  26. package/dist/adapters/cc-switch/index.js +2 -57
  27. package/dist/adapters/cc-switch/mcp-acode.d.ts +0 -1
  28. package/dist/adapters/cc-switch/mcp-acode.js +2 -71
  29. package/dist/adapters/cc-switch/mcp-claude.d.ts +0 -1
  30. package/dist/adapters/cc-switch/mcp-claude.js +2 -89
  31. package/dist/adapters/cc-switch/mcp-claudecode.d.ts +0 -1
  32. package/dist/adapters/cc-switch/mcp-claudecode.js +2 -77
  33. package/dist/adapters/cc-switch/mcp-codex.d.ts +0 -1
  34. package/dist/adapters/cc-switch/mcp-codex.js +11 -249
  35. package/dist/adapters/cc-switch/mcp-opencode.d.ts +0 -1
  36. package/dist/adapters/cc-switch/mcp-opencode.js +2 -97
  37. package/dist/adapters/cc-switch/mcp-placeholder.d.ts +0 -1
  38. package/dist/adapters/cc-switch/mcp-placeholder.js +2 -19
  39. package/dist/adapters/cc-switch/skill-acode.d.ts +0 -1
  40. package/dist/adapters/cc-switch/skill-acode.js +2 -12
  41. package/dist/adapters/cc-switch/skill-claude.d.ts +0 -1
  42. package/dist/adapters/cc-switch/skill-claude.js +2 -11
  43. package/dist/adapters/cc-switch/skill-claudecode.d.ts +0 -1
  44. package/dist/adapters/cc-switch/skill-claudecode.js +2 -11
  45. package/dist/adapters/cc-switch/skill-codex.d.ts +0 -1
  46. package/dist/adapters/cc-switch/skill-codex.js +2 -6
  47. package/dist/adapters/cc-switch/skill-directory.d.ts +0 -1
  48. package/dist/adapters/cc-switch/skill-directory.js +3 -137
  49. package/dist/adapters/cc-switch/skill-opencode.d.ts +0 -1
  50. package/dist/adapters/cc-switch/skill-opencode.js +2 -11
  51. package/dist/adapters/cc-switch/skill-placeholder.d.ts +0 -1
  52. package/dist/adapters/cc-switch/skill-placeholder.js +2 -19
  53. package/dist/config.d.ts +0 -1
  54. package/dist/config.js +2 -290
  55. package/dist/index.d.ts +0 -1
  56. package/dist/index.js +2 -573
  57. package/dist/middleware/auth.d.ts +0 -1
  58. package/dist/middleware/auth.js +2 -98
  59. package/dist/routes/acode-todos.d.ts +0 -1
  60. package/dist/routes/acode-todos.js +2 -75
  61. package/dist/routes/ai-sources.d.ts +0 -1
  62. package/dist/routes/ai-sources.js +2 -132
  63. package/dist/routes/dashboard.d.ts +0 -1
  64. package/dist/routes/dashboard.js +182 -649
  65. package/dist/routes/events.d.ts +0 -1
  66. package/dist/routes/events.js +2 -22
  67. package/dist/routes/file-browser.d.ts +0 -1
  68. package/dist/routes/file-browser.js +2 -781
  69. package/dist/routes/file-diff-rollback.d.ts +0 -1
  70. package/dist/routes/file-diff-rollback.js +2 -301
  71. package/dist/routes/file-snapshot.d.ts +0 -1
  72. package/dist/routes/file-snapshot.js +2 -156
  73. package/dist/routes/git.d.ts +0 -1
  74. package/dist/routes/git.js +28 -1900
  75. package/dist/routes/instance.d.ts +0 -1
  76. package/dist/routes/instance.js +3 -748
  77. package/dist/routes/mcp.d.ts +0 -1
  78. package/dist/routes/mcp.js +2 -196
  79. package/dist/routes/processes.d.ts +0 -1
  80. package/dist/routes/processes.js +2 -252
  81. package/dist/routes/properties.d.ts +0 -1
  82. package/dist/routes/properties.js +2 -72
  83. package/dist/routes/pty.d.ts +0 -1
  84. package/dist/routes/pty.js +6 -560
  85. package/dist/routes/runtime-binding.d.ts +0 -1
  86. package/dist/routes/runtime-binding.js +2 -263
  87. package/dist/routes/sessions.d.ts +0 -1
  88. package/dist/routes/sessions.js +2 -758
  89. package/dist/routes/skills.d.ts +0 -1
  90. package/dist/routes/skills.js +2 -187
  91. package/dist/routes/sub-agents.d.ts +0 -1
  92. package/dist/routes/sub-agents.js +20 -279
  93. package/dist/routes/system-metrics.d.ts +0 -1
  94. package/dist/routes/system-metrics.js +2 -20
  95. package/dist/routes/task-context.d.ts +0 -1
  96. package/dist/routes/task-context.js +2 -78
  97. package/dist/routes/terminal.d.ts +0 -1
  98. package/dist/routes/terminal.js +54 -2882
  99. package/dist/routes/yml.d.ts +0 -1
  100. package/dist/routes/yml.js +2 -223
  101. package/dist/services/acode-package.d.ts +0 -1
  102. package/dist/services/acode-package.js +2 -111
  103. package/dist/services/agent-event-store.d.ts +0 -1
  104. package/dist/services/agent-event-store.js +2 -81
  105. package/dist/services/agent-process-manager.d.ts +0 -1
  106. package/dist/services/agent-process-manager.js +2 -796
  107. package/dist/services/ai-source-apply.d.ts +0 -1
  108. package/dist/services/ai-source-apply.js +2 -83
  109. package/dist/services/auto-register.d.ts +5 -1
  110. package/dist/services/auto-register.js +2 -1053
  111. package/dist/services/aws-client-agent-mcp.d.ts +0 -1
  112. package/dist/services/aws-client-agent-mcp.js +3 -337
  113. package/dist/services/bridge-package-publish-hooks.d.ts +0 -1
  114. package/dist/services/bridge-package-publish-hooks.js +2 -115
  115. package/dist/services/cc-switch-sdk.d.ts +0 -1
  116. package/dist/services/cc-switch-sdk.js +2 -135
  117. package/dist/services/cli-commands.d.ts +6 -1
  118. package/dist/services/cli-commands.js +6 -645
  119. package/dist/services/event-delta-pusher.d.ts +0 -1
  120. package/dist/services/event-delta-pusher.js +2 -95
  121. package/dist/services/fileSnapshotStore.d.ts +0 -1
  122. package/dist/services/fileSnapshotStore.js +2 -500
  123. package/dist/services/instance-ai-config-service.d.ts +0 -1
  124. package/dist/services/instance-ai-config-service.js +2 -174
  125. package/dist/services/instance-init-service.d.ts +0 -1
  126. package/dist/services/instance-init-service.js +2 -193
  127. package/dist/services/instance-service.d.ts +0 -1
  128. package/dist/services/instance-service.js +2 -237
  129. package/dist/services/instance-state.d.ts +0 -1
  130. package/dist/services/instance-state.js +2 -94
  131. package/dist/services/legacy-path-migration.d.ts +0 -1
  132. package/dist/services/legacy-path-migration.js +2 -66
  133. package/dist/services/lifecycle-state.d.ts +0 -1
  134. package/dist/services/lifecycle-state.js +3 -110
  135. package/dist/services/mcp-launch-binding-queue.d.ts +0 -1
  136. package/dist/services/mcp-launch-binding-queue.js +2 -175
  137. package/dist/services/orphan-monitor.d.ts +0 -1
  138. package/dist/services/orphan-monitor.js +2 -382
  139. package/dist/services/panel-auth.d.ts +0 -1
  140. package/dist/services/panel-auth.js +2 -168
  141. package/dist/services/process-detector.d.ts +0 -1
  142. package/dist/services/process-detector.js +18 -1019
  143. package/dist/services/process-registry.d.ts +0 -1
  144. package/dist/services/process-registry.js +2 -375
  145. package/dist/services/ring-buffer.d.ts +0 -1
  146. package/dist/services/ring-buffer.js +2 -103
  147. package/dist/services/runtime-binding.d.ts +0 -1
  148. package/dist/services/runtime-binding.js +6 -363
  149. package/dist/services/runtime-lifecycle-policy.d.ts +0 -1
  150. package/dist/services/runtime-lifecycle-policy.js +2 -35
  151. package/dist/services/session-output.d.ts +0 -1
  152. package/dist/services/session-output.js +5 -539
  153. package/dist/services/startup-config-wizard.d.ts +0 -1
  154. package/dist/services/startup-config-wizard.js +14 -258
  155. package/dist/services/sub-agent-manager-instance.d.ts +0 -1
  156. package/dist/services/sub-agent-manager-instance.js +2 -12
  157. package/dist/services/system-metrics.d.ts +0 -1
  158. package/dist/services/system-metrics.js +2 -252
  159. package/dist/services/terminal-persistence.d.ts +0 -1
  160. package/dist/services/terminal-persistence.js +2 -176
  161. package/dist/services/tool-installer.d.ts +0 -1
  162. package/dist/services/tool-installer.js +5 -751
  163. package/dist/services/tunnel-client.d.ts +0 -1
  164. package/dist/services/tunnel-client.js +2 -402
  165. package/dist/services/windows-service-manager.d.ts +3 -3
  166. package/dist/services/windows-service-manager.js +2 -59
  167. package/dist/services/workspace-files.d.ts +0 -1
  168. package/dist/services/workspace-files.js +2 -1275
  169. package/dist/services/workspace-watch.d.ts +0 -1
  170. package/dist/services/workspace-watch.js +2 -123
  171. package/dist/services/workspaceTaskChangeWatcher.d.ts +0 -1
  172. package/dist/services/workspaceTaskChangeWatcher.js +2 -483
  173. package/dist/types.d.ts +0 -1
  174. package/dist/types.js +1 -1
  175. package/dist/utils/file-utils.d.ts +0 -1
  176. package/dist/utils/file-utils.js +3 -208
  177. package/dist/utils/instance-ai-config-debug-logger.d.ts +0 -1
  178. package/dist/utils/instance-ai-config-debug-logger.js +4 -63
  179. package/dist/utils/logger.d.ts +0 -1
  180. package/dist/utils/logger.js +2 -154
  181. package/dist/utils/mcp-utils.d.ts +0 -1
  182. package/dist/utils/mcp-utils.js +2 -187
  183. package/dist/utils/path-utils.d.ts +0 -1
  184. package/dist/utils/path-utils.js +2 -44
  185. package/dist/utils/sdk-package-loader.d.ts +0 -1
  186. package/dist/utils/sdk-package-loader.js +2 -78
  187. package/dist/utils/validation.d.ts +0 -1
  188. package/dist/utils/validation.js +2 -53
  189. package/dist/utils/yaml-utils.d.ts +0 -1
  190. package/dist/utils/yaml-utils.js +2 -312
  191. package/node_modules/@cc-switch/sdk/dist/constants.d.ts +0 -1
  192. package/node_modules/@cc-switch/sdk/dist/constants.js +2 -63
  193. package/node_modules/@cc-switch/sdk/dist/errors.d.ts +0 -1
  194. package/node_modules/@cc-switch/sdk/dist/errors.js +2 -8
  195. package/node_modules/@cc-switch/sdk/dist/index.d.ts +0 -1
  196. package/node_modules/@cc-switch/sdk/dist/index.js +2 -9
  197. package/node_modules/@cc-switch/sdk/dist/schemas.d.ts +0 -1
  198. package/node_modules/@cc-switch/sdk/dist/schemas.js +2 -38
  199. package/node_modules/@cc-switch/sdk/dist/sdk.d.ts +0 -1
  200. package/node_modules/@cc-switch/sdk/dist/sdk.js +2 -470
  201. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts +0 -1
  202. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.js +4 -307
  203. package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts +0 -1
  204. package/node_modules/@cc-switch/sdk/dist/services/mcp-model.js +2 -37
  205. package/node_modules/@cc-switch/sdk/dist/services/mcp-service.d.ts +0 -1
  206. package/node_modules/@cc-switch/sdk/dist/services/mcp-service.js +2 -9
  207. package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts +0 -1
  208. package/node_modules/@cc-switch/sdk/dist/services/skill-model.js +2 -41
  209. package/node_modules/@cc-switch/sdk/dist/services/skill-service.d.ts +0 -1
  210. package/node_modules/@cc-switch/sdk/dist/services/skill-service.js +2 -9
  211. package/node_modules/@cc-switch/sdk/dist/state.d.ts +0 -1
  212. package/node_modules/@cc-switch/sdk/dist/state.js +2 -19
  213. package/node_modules/@cc-switch/sdk/dist/types.d.ts +0 -1
  214. package/node_modules/@cc-switch/sdk/dist/types.js +1 -1
  215. package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts +0 -1
  216. package/node_modules/@cc-switch/sdk/dist/utils/fs.js +3 -114
  217. package/node_modules/@cc-switch/sdk/dist/utils/id.d.ts +0 -1
  218. package/node_modules/@cc-switch/sdk/dist/utils/id.js +2 -12
  219. package/node_modules/@cc-switch/sdk/package.json +1 -1
  220. package/package/acode/dist/ask-user-question-tool.d.ts +0 -1
  221. package/package/acode/dist/ask-user-question-tool.js +4 -233
  222. package/package/acode/dist/built-in-file-tools.d.ts +0 -1
  223. package/package/acode/dist/built-in-file-tools.js +4 -966
  224. package/package/acode/dist/built-in-symbols-tool.d.ts +0 -1
  225. package/package/acode/dist/built-in-symbols-tool.js +2 -117
  226. package/package/acode/dist/builtins/commandArtifacts.d.ts +0 -1
  227. package/package/acode/dist/builtins/commandArtifacts.js +9 -97
  228. package/package/acode/dist/builtins/commandOutputEvents.d.ts +0 -1
  229. package/package/acode/dist/builtins/commandOutputEvents.js +2 -56
  230. package/package/acode/dist/builtins/shellCommandPreparation.d.ts +0 -1
  231. package/package/acode/dist/builtins/shellCommandPreparation.js +5 -44
  232. package/package/acode/dist/builtins/shellCommandResult.d.ts +0 -1
  233. package/package/acode/dist/builtins/shellCommandResult.js +2 -71
  234. package/package/acode/dist/builtins/shellCommandRunner.d.ts +0 -1
  235. package/package/acode/dist/builtins/shellCommandRunner.js +2 -115
  236. package/package/acode/dist/builtins/shellOutputDecoder.d.ts +0 -1
  237. package/package/acode/dist/builtins/shellOutputDecoder.js +2 -94
  238. package/package/acode/dist/cli.d.ts +0 -1
  239. package/package/acode/dist/cli.js +4 -38
  240. package/package/acode/dist/commands/commandLoader.d.ts +0 -1
  241. package/package/acode/dist/commands/commandLoader.js +2 -33
  242. package/package/acode/dist/commands/commandParser.d.ts +0 -1
  243. package/package/acode/dist/commands/commandParser.js +3 -77
  244. package/package/acode/dist/commands/commandRegistry.d.ts +0 -1
  245. package/package/acode/dist/commands/commandRegistry.js +2 -30
  246. package/package/acode/dist/compaction.d.ts +0 -1
  247. package/package/acode/dist/compaction.js +7 -919
  248. package/package/acode/dist/config.d.ts +0 -1
  249. package/package/acode/dist/config.js +5 -105
  250. package/package/acode/dist/fs-utils.d.ts +0 -1
  251. package/package/acode/dist/fs-utils.js +2 -79
  252. package/package/acode/dist/hooks/hookBus.d.ts +0 -1
  253. package/package/acode/dist/hooks/hookBus.js +2 -40
  254. package/package/acode/dist/index.d.ts +0 -1
  255. package/package/acode/dist/index.js +2 -19
  256. package/package/acode/dist/mcpToolNames.d.ts +0 -1
  257. package/package/acode/dist/mcpToolNames.js +2 -17
  258. package/package/acode/dist/parsers/ast-cache.d.ts +0 -1
  259. package/package/acode/dist/parsers/ast-cache.js +2 -76
  260. package/package/acode/dist/parsers/language-detector.d.ts +0 -1
  261. package/package/acode/dist/parsers/language-detector.js +2 -44
  262. package/package/acode/dist/parsers/language-queries.d.ts +0 -1
  263. package/package/acode/dist/parsers/language-queries.js +12 -602
  264. package/package/acode/dist/parsers/symbol-extractor.d.ts +0 -1
  265. package/package/acode/dist/parsers/symbol-extractor.js +3 -164
  266. package/package/acode/dist/parsers/tree-sitter-loader.d.ts +0 -1
  267. package/package/acode/dist/parsers/tree-sitter-loader.js +2 -64
  268. package/package/acode/dist/parsers/types.d.ts +0 -1
  269. package/package/acode/dist/parsers/types.js +1 -7
  270. package/package/acode/dist/runtime.d.ts +0 -1
  271. package/package/acode/dist/runtime.js +86 -3771
  272. package/package/acode/dist/skill-tool.d.ts +0 -1
  273. package/package/acode/dist/skill-tool.js +5 -174
  274. package/package/acode/dist/sub-agent-manager.d.ts +0 -1
  275. package/package/acode/dist/sub-agent-manager.js +2 -1159
  276. package/package/acode/dist/sub-agent-store.d.ts +0 -1
  277. package/package/acode/dist/sub-agent-store.js +4 -236
  278. package/package/acode/dist/sub-agent-tools.d.ts +0 -1
  279. package/package/acode/dist/sub-agent-tools.js +15 -369
  280. package/package/acode/dist/sub-agent-types.d.ts +0 -1
  281. package/package/acode/dist/sub-agent-types.js +1 -8
  282. package/package/acode/dist/todo-store.d.ts +0 -1
  283. package/package/acode/dist/todo-store.js +2 -73
  284. package/package/acode/dist/todo-tool.d.ts +0 -1
  285. package/package/acode/dist/todo-tool.js +5 -121
  286. package/package/acode/dist/types.d.ts +0 -1
  287. package/package/acode/dist/types.js +1 -1
  288. package/package/acode/package.json +2 -2
  289. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +0 -1
  290. package/package/aws-client-agent-mcp/dist/agent-client.js +2 -890
  291. package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts +0 -1
  292. package/package/aws-client-agent-mcp/dist/agent-client.test.js +0 -1
  293. package/package/aws-client-agent-mcp/dist/config.d.ts +0 -1
  294. package/package/aws-client-agent-mcp/dist/config.js +2 -243
  295. package/package/aws-client-agent-mcp/dist/config.test.d.ts +0 -1
  296. package/package/aws-client-agent-mcp/dist/config.test.js +0 -1
  297. package/package/aws-client-agent-mcp/dist/constants.d.ts +0 -1
  298. package/package/aws-client-agent-mcp/dist/constants.js +2 -24
  299. package/package/aws-client-agent-mcp/dist/context-manager.d.ts +0 -1
  300. package/package/aws-client-agent-mcp/dist/context-manager.js +2 -477
  301. package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +0 -1
  302. package/package/aws-client-agent-mcp/dist/context-manager.test.js +0 -1
  303. package/package/aws-client-agent-mcp/dist/http-client.d.ts +0 -1
  304. package/package/aws-client-agent-mcp/dist/http-client.js +2 -446
  305. package/package/aws-client-agent-mcp/dist/http-client.test.d.ts +0 -1
  306. package/package/aws-client-agent-mcp/dist/http-client.test.js +0 -1
  307. package/package/aws-client-agent-mcp/dist/index.d.ts +0 -1
  308. package/package/aws-client-agent-mcp/dist/index.js +2 -34
  309. package/package/aws-client-agent-mcp/dist/logger.d.ts +0 -1
  310. package/package/aws-client-agent-mcp/dist/logger.js +3 -178
  311. package/package/aws-client-agent-mcp/dist/logger.test.d.ts +0 -1
  312. package/package/aws-client-agent-mcp/dist/logger.test.js +0 -1
  313. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +0 -1
  314. package/package/aws-client-agent-mcp/dist/mcp-server.js +38 -2709
  315. package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts +0 -1
  316. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +0 -1
  317. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +0 -1
  318. package/package/aws-client-agent-mcp/dist/mcp-tools.js +22 -562
  319. package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts +0 -1
  320. package/package/aws-client-agent-mcp/dist/mcp-tools.test.js +0 -1
  321. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +0 -1
  322. package/package/aws-client-agent-mcp/dist/memory-store.js +4 -826
  323. package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts +0 -1
  324. package/package/aws-client-agent-mcp/dist/memory-store.test.js +0 -1
  325. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +0 -1
  326. package/package/aws-client-agent-mcp/dist/memory-tools.js +31 -294
  327. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +0 -1
  328. package/package/aws-client-agent-mcp/dist/message-buffer.js +2 -288
  329. package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts +0 -1
  330. package/package/aws-client-agent-mcp/dist/message-buffer.test.js +0 -1
  331. package/package/aws-client-agent-mcp/dist/messageContent.d.ts +0 -1
  332. package/package/aws-client-agent-mcp/dist/messageContent.js +2 -125
  333. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts +0 -1
  334. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js +2 -103
  335. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts +0 -1
  336. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js +0 -1
  337. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +0 -1
  338. package/package/aws-client-agent-mcp/dist/server-memory-store.js +2 -96
  339. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +0 -1
  340. package/package/aws-client-agent-mcp/dist/status-reporter.js +3 -327
  341. package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts +0 -1
  342. package/package/aws-client-agent-mcp/dist/status-reporter.test.js +0 -1
  343. package/package/aws-client-agent-mcp/dist/types.d.ts +0 -1
  344. package/package/aws-client-agent-mcp/dist/types.js +2 -9
  345. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +0 -1
  346. package/package/aws-client-agent-mcp/dist/websocket-client.js +2 -677
  347. package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts +0 -1
  348. package/package/aws-client-agent-mcp/dist/websocket-client.test.js +0 -1
  349. package/package/aws-client-agent-mcp/package.json +1 -1
  350. package/package/cc-switch-sdk/dist/constants.d.ts +0 -1
  351. package/package/cc-switch-sdk/dist/constants.js +2 -63
  352. package/package/cc-switch-sdk/dist/errors.d.ts +0 -1
  353. package/package/cc-switch-sdk/dist/errors.js +2 -8
  354. package/package/cc-switch-sdk/dist/index.d.ts +0 -1
  355. package/package/cc-switch-sdk/dist/index.js +2 -9
  356. package/package/cc-switch-sdk/dist/schemas.d.ts +0 -1
  357. package/package/cc-switch-sdk/dist/schemas.js +2 -38
  358. package/package/cc-switch-sdk/dist/sdk.d.ts +0 -1
  359. package/package/cc-switch-sdk/dist/sdk.js +2 -470
  360. package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts +0 -1
  361. package/package/cc-switch-sdk/dist/services/ai-config-service.js +4 -307
  362. package/package/cc-switch-sdk/dist/services/mcp-model.d.ts +0 -1
  363. package/package/cc-switch-sdk/dist/services/mcp-model.js +2 -37
  364. package/package/cc-switch-sdk/dist/services/mcp-service.d.ts +0 -1
  365. package/package/cc-switch-sdk/dist/services/mcp-service.js +2 -9
  366. package/package/cc-switch-sdk/dist/services/skill-model.d.ts +0 -1
  367. package/package/cc-switch-sdk/dist/services/skill-model.js +2 -41
  368. package/package/cc-switch-sdk/dist/services/skill-service.d.ts +0 -1
  369. package/package/cc-switch-sdk/dist/services/skill-service.js +2 -9
  370. package/package/cc-switch-sdk/dist/state.d.ts +0 -1
  371. package/package/cc-switch-sdk/dist/state.js +2 -19
  372. package/package/cc-switch-sdk/dist/types.d.ts +0 -1
  373. package/package/cc-switch-sdk/dist/types.js +1 -1
  374. package/package/cc-switch-sdk/dist/utils/fs.d.ts +0 -1
  375. package/package/cc-switch-sdk/dist/utils/fs.js +3 -114
  376. package/package/cc-switch-sdk/dist/utils/id.d.ts +0 -1
  377. package/package/cc-switch-sdk/dist/utils/id.js +2 -12
  378. package/package/cc-switch-sdk/package.json +1 -1
  379. package/package.json +4 -2
  380. package/dist/adapter/AcodeSdkAdapter.d.ts.map +0 -1
  381. package/dist/adapter/AdapterRegistry.d.ts.map +0 -1
  382. package/dist/adapter/ClaudeSdkAdapter.d.ts.map +0 -1
  383. package/dist/adapter/CodexSdkAdapter.d.ts.map +0 -1
  384. package/dist/adapter/OpencodeSdkAdapter.d.ts.map +0 -1
  385. package/dist/adapter/SdkProviderSpi.d.ts.map +0 -1
  386. package/dist/adapter/acode-tool-names.d.ts.map +0 -1
  387. package/dist/adapter/idle-poll-loop.d.ts.map +0 -1
  388. package/dist/adapter/index.d.ts.map +0 -1
  389. package/dist/adapter/instance-ai-config-resolver.d.ts.map +0 -1
  390. package/dist/adapter/types.d.ts.map +0 -1
  391. package/dist/adapters/cc-switch/common.d.ts.map +0 -1
  392. package/dist/adapters/cc-switch/index.d.ts.map +0 -1
  393. package/dist/adapters/cc-switch/mcp-acode.d.ts.map +0 -1
  394. package/dist/adapters/cc-switch/mcp-claude.d.ts.map +0 -1
  395. package/dist/adapters/cc-switch/mcp-claudecode.d.ts.map +0 -1
  396. package/dist/adapters/cc-switch/mcp-codex.d.ts.map +0 -1
  397. package/dist/adapters/cc-switch/mcp-opencode.d.ts.map +0 -1
  398. package/dist/adapters/cc-switch/mcp-placeholder.d.ts.map +0 -1
  399. package/dist/adapters/cc-switch/skill-acode.d.ts.map +0 -1
  400. package/dist/adapters/cc-switch/skill-claude.d.ts.map +0 -1
  401. package/dist/adapters/cc-switch/skill-claudecode.d.ts.map +0 -1
  402. package/dist/adapters/cc-switch/skill-codex.d.ts.map +0 -1
  403. package/dist/adapters/cc-switch/skill-directory.d.ts.map +0 -1
  404. package/dist/adapters/cc-switch/skill-opencode.d.ts.map +0 -1
  405. package/dist/adapters/cc-switch/skill-placeholder.d.ts.map +0 -1
  406. package/dist/config.d.ts.map +0 -1
  407. package/dist/index.d.ts.map +0 -1
  408. package/dist/middleware/auth.d.ts.map +0 -1
  409. package/dist/routes/acode-todos.d.ts.map +0 -1
  410. package/dist/routes/ai-sources.d.ts.map +0 -1
  411. package/dist/routes/dashboard.d.ts.map +0 -1
  412. package/dist/routes/events.d.ts.map +0 -1
  413. package/dist/routes/file-browser.d.ts.map +0 -1
  414. package/dist/routes/file-diff-rollback.d.ts.map +0 -1
  415. package/dist/routes/file-snapshot.d.ts.map +0 -1
  416. package/dist/routes/git.d.ts.map +0 -1
  417. package/dist/routes/instance.d.ts.map +0 -1
  418. package/dist/routes/mcp.d.ts.map +0 -1
  419. package/dist/routes/processes.d.ts.map +0 -1
  420. package/dist/routes/properties.d.ts.map +0 -1
  421. package/dist/routes/pty.d.ts.map +0 -1
  422. package/dist/routes/runtime-binding.d.ts.map +0 -1
  423. package/dist/routes/sessions.d.ts.map +0 -1
  424. package/dist/routes/skills.d.ts.map +0 -1
  425. package/dist/routes/sub-agents.d.ts.map +0 -1
  426. package/dist/routes/system-metrics.d.ts.map +0 -1
  427. package/dist/routes/task-context.d.ts.map +0 -1
  428. package/dist/routes/terminal.d.ts.map +0 -1
  429. package/dist/routes/yml.d.ts.map +0 -1
  430. package/dist/services/acode-package.d.ts.map +0 -1
  431. package/dist/services/agent-event-store.d.ts.map +0 -1
  432. package/dist/services/agent-process-manager.d.ts.map +0 -1
  433. package/dist/services/ai-source-apply.d.ts.map +0 -1
  434. package/dist/services/auto-register.d.ts.map +0 -1
  435. package/dist/services/aws-client-agent-mcp.d.ts.map +0 -1
  436. package/dist/services/bridge-package-publish-hooks.d.ts.map +0 -1
  437. package/dist/services/cc-switch-sdk.d.ts.map +0 -1
  438. package/dist/services/cli-commands.d.ts.map +0 -1
  439. package/dist/services/event-delta-pusher.d.ts.map +0 -1
  440. package/dist/services/fileSnapshotStore.d.ts.map +0 -1
  441. package/dist/services/instance-ai-config-service.d.ts.map +0 -1
  442. package/dist/services/instance-init-service.d.ts.map +0 -1
  443. package/dist/services/instance-service.d.ts.map +0 -1
  444. package/dist/services/instance-state.d.ts.map +0 -1
  445. package/dist/services/legacy-path-migration.d.ts.map +0 -1
  446. package/dist/services/lifecycle-state.d.ts.map +0 -1
  447. package/dist/services/mcp-launch-binding-queue.d.ts.map +0 -1
  448. package/dist/services/orphan-monitor.d.ts.map +0 -1
  449. package/dist/services/panel-auth.d.ts.map +0 -1
  450. package/dist/services/process-detector.d.ts.map +0 -1
  451. package/dist/services/process-registry.d.ts.map +0 -1
  452. package/dist/services/ring-buffer.d.ts.map +0 -1
  453. package/dist/services/runtime-binding.d.ts.map +0 -1
  454. package/dist/services/runtime-lifecycle-policy.d.ts.map +0 -1
  455. package/dist/services/session-output.d.ts.map +0 -1
  456. package/dist/services/startup-config-wizard.d.ts.map +0 -1
  457. package/dist/services/sub-agent-manager-instance.d.ts.map +0 -1
  458. package/dist/services/system-metrics.d.ts.map +0 -1
  459. package/dist/services/terminal-persistence.d.ts.map +0 -1
  460. package/dist/services/tool-installer.d.ts.map +0 -1
  461. package/dist/services/tunnel-client.d.ts.map +0 -1
  462. package/dist/services/windows-service-manager.d.ts.map +0 -1
  463. package/dist/services/workspace-files.d.ts.map +0 -1
  464. package/dist/services/workspace-watch.d.ts.map +0 -1
  465. package/dist/services/workspaceTaskChangeWatcher.d.ts.map +0 -1
  466. package/dist/types.d.ts.map +0 -1
  467. package/dist/utils/file-utils.d.ts.map +0 -1
  468. package/dist/utils/instance-ai-config-debug-logger.d.ts.map +0 -1
  469. package/dist/utils/logger.d.ts.map +0 -1
  470. package/dist/utils/mcp-utils.d.ts.map +0 -1
  471. package/dist/utils/path-utils.d.ts.map +0 -1
  472. package/dist/utils/sdk-package-loader.d.ts.map +0 -1
  473. package/dist/utils/validation.d.ts.map +0 -1
  474. package/dist/utils/yaml-utils.d.ts.map +0 -1
  475. package/node_modules/@cc-switch/sdk/dist/constants.d.ts.map +0 -1
  476. package/node_modules/@cc-switch/sdk/dist/errors.d.ts.map +0 -1
  477. package/node_modules/@cc-switch/sdk/dist/index.d.ts.map +0 -1
  478. package/node_modules/@cc-switch/sdk/dist/schemas.d.ts.map +0 -1
  479. package/node_modules/@cc-switch/sdk/dist/sdk.d.ts.map +0 -1
  480. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts.map +0 -1
  481. package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts.map +0 -1
  482. package/node_modules/@cc-switch/sdk/dist/services/mcp-service.d.ts.map +0 -1
  483. package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts.map +0 -1
  484. package/node_modules/@cc-switch/sdk/dist/services/skill-service.d.ts.map +0 -1
  485. package/node_modules/@cc-switch/sdk/dist/state.d.ts.map +0 -1
  486. package/node_modules/@cc-switch/sdk/dist/types.d.ts.map +0 -1
  487. package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts.map +0 -1
  488. package/node_modules/@cc-switch/sdk/dist/utils/id.d.ts.map +0 -1
  489. package/package/acode/dist/ask-user-question-tool.d.ts.map +0 -1
  490. package/package/acode/dist/built-in-file-tools.d.ts.map +0 -1
  491. package/package/acode/dist/built-in-symbols-tool.d.ts.map +0 -1
  492. package/package/acode/dist/builtins/commandArtifacts.d.ts.map +0 -1
  493. package/package/acode/dist/builtins/commandOutputEvents.d.ts.map +0 -1
  494. package/package/acode/dist/builtins/shellCommandPreparation.d.ts.map +0 -1
  495. package/package/acode/dist/builtins/shellCommandResult.d.ts.map +0 -1
  496. package/package/acode/dist/builtins/shellCommandRunner.d.ts.map +0 -1
  497. package/package/acode/dist/builtins/shellOutputDecoder.d.ts.map +0 -1
  498. package/package/acode/dist/cli.d.ts.map +0 -1
  499. package/package/acode/dist/commands/commandLoader.d.ts.map +0 -1
  500. package/package/acode/dist/commands/commandParser.d.ts.map +0 -1
  501. package/package/acode/dist/commands/commandRegistry.d.ts.map +0 -1
  502. package/package/acode/dist/compaction.d.ts.map +0 -1
  503. package/package/acode/dist/config.d.ts.map +0 -1
  504. package/package/acode/dist/fs-utils.d.ts.map +0 -1
  505. package/package/acode/dist/hooks/hookBus.d.ts.map +0 -1
  506. package/package/acode/dist/index.d.ts.map +0 -1
  507. package/package/acode/dist/mcpToolNames.d.ts.map +0 -1
  508. package/package/acode/dist/parsers/ast-cache.d.ts.map +0 -1
  509. package/package/acode/dist/parsers/language-detector.d.ts.map +0 -1
  510. package/package/acode/dist/parsers/language-queries.d.ts.map +0 -1
  511. package/package/acode/dist/parsers/symbol-extractor.d.ts.map +0 -1
  512. package/package/acode/dist/parsers/tree-sitter-loader.d.ts.map +0 -1
  513. package/package/acode/dist/parsers/types.d.ts.map +0 -1
  514. package/package/acode/dist/runtime.d.ts.map +0 -1
  515. package/package/acode/dist/skill-tool.d.ts.map +0 -1
  516. package/package/acode/dist/sub-agent-manager.d.ts.map +0 -1
  517. package/package/acode/dist/sub-agent-store.d.ts.map +0 -1
  518. package/package/acode/dist/sub-agent-tools.d.ts.map +0 -1
  519. package/package/acode/dist/sub-agent-types.d.ts.map +0 -1
  520. package/package/acode/dist/todo-store.d.ts.map +0 -1
  521. package/package/acode/dist/todo-tool.d.ts.map +0 -1
  522. package/package/acode/dist/types.d.ts.map +0 -1
  523. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +0 -1
  524. package/package/aws-client-agent-mcp/dist/agent-client.js.map +0 -1
  525. package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts.map +0 -1
  526. package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +0 -1
  527. package/package/aws-client-agent-mcp/dist/config.d.ts.map +0 -1
  528. package/package/aws-client-agent-mcp/dist/config.js.map +0 -1
  529. package/package/aws-client-agent-mcp/dist/config.test.d.ts.map +0 -1
  530. package/package/aws-client-agent-mcp/dist/config.test.js.map +0 -1
  531. package/package/aws-client-agent-mcp/dist/constants.d.ts.map +0 -1
  532. package/package/aws-client-agent-mcp/dist/constants.js.map +0 -1
  533. package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +0 -1
  534. package/package/aws-client-agent-mcp/dist/context-manager.js.map +0 -1
  535. package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts.map +0 -1
  536. package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +0 -1
  537. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +0 -1
  538. package/package/aws-client-agent-mcp/dist/http-client.js.map +0 -1
  539. package/package/aws-client-agent-mcp/dist/http-client.test.d.ts.map +0 -1
  540. package/package/aws-client-agent-mcp/dist/http-client.test.js.map +0 -1
  541. package/package/aws-client-agent-mcp/dist/index.d.ts.map +0 -1
  542. package/package/aws-client-agent-mcp/dist/index.js.map +0 -1
  543. package/package/aws-client-agent-mcp/dist/logger.d.ts.map +0 -1
  544. package/package/aws-client-agent-mcp/dist/logger.js.map +0 -1
  545. package/package/aws-client-agent-mcp/dist/logger.test.d.ts.map +0 -1
  546. package/package/aws-client-agent-mcp/dist/logger.test.js.map +0 -1
  547. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +0 -1
  548. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +0 -1
  549. package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts.map +0 -1
  550. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +0 -1
  551. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +0 -1
  552. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +0 -1
  553. package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts.map +0 -1
  554. package/package/aws-client-agent-mcp/dist/mcp-tools.test.js.map +0 -1
  555. package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +0 -1
  556. package/package/aws-client-agent-mcp/dist/memory-store.js.map +0 -1
  557. package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts.map +0 -1
  558. package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +0 -1
  559. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +0 -1
  560. package/package/aws-client-agent-mcp/dist/memory-tools.js.map +0 -1
  561. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +0 -1
  562. package/package/aws-client-agent-mcp/dist/message-buffer.js.map +0 -1
  563. package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts.map +0 -1
  564. package/package/aws-client-agent-mcp/dist/message-buffer.test.js.map +0 -1
  565. package/package/aws-client-agent-mcp/dist/messageContent.d.ts.map +0 -1
  566. package/package/aws-client-agent-mcp/dist/messageContent.js.map +0 -1
  567. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts.map +0 -1
  568. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js.map +0 -1
  569. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts.map +0 -1
  570. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js.map +0 -1
  571. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +0 -1
  572. package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +0 -1
  573. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +0 -1
  574. package/package/aws-client-agent-mcp/dist/status-reporter.js.map +0 -1
  575. package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts.map +0 -1
  576. package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +0 -1
  577. package/package/aws-client-agent-mcp/dist/types.d.ts.map +0 -1
  578. package/package/aws-client-agent-mcp/dist/types.js.map +0 -1
  579. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +0 -1
  580. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +0 -1
  581. package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts.map +0 -1
  582. package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +0 -1
  583. package/package/cc-switch-sdk/dist/constants.d.ts.map +0 -1
  584. package/package/cc-switch-sdk/dist/errors.d.ts.map +0 -1
  585. package/package/cc-switch-sdk/dist/index.d.ts.map +0 -1
  586. package/package/cc-switch-sdk/dist/schemas.d.ts.map +0 -1
  587. package/package/cc-switch-sdk/dist/sdk.d.ts.map +0 -1
  588. package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts.map +0 -1
  589. package/package/cc-switch-sdk/dist/services/mcp-model.d.ts.map +0 -1
  590. package/package/cc-switch-sdk/dist/services/mcp-service.d.ts.map +0 -1
  591. package/package/cc-switch-sdk/dist/services/skill-model.d.ts.map +0 -1
  592. package/package/cc-switch-sdk/dist/services/skill-service.d.ts.map +0 -1
  593. package/package/cc-switch-sdk/dist/state.d.ts.map +0 -1
  594. package/package/cc-switch-sdk/dist/types.d.ts.map +0 -1
  595. package/package/cc-switch-sdk/dist/utils/fs.d.ts.map +0 -1
  596. package/package/cc-switch-sdk/dist/utils/id.d.ts.map +0 -1
@@ -1,879 +1,4 @@
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 'node:child_process';
14
- import { EventEmitter } from 'node:events';
15
- import * as fs from 'node:fs';
16
- import * as net from 'node:net';
17
- import * as os from 'node:os';
18
- import * as path from 'node:path';
19
- import { v4 as uuidv4 } from 'uuid';
20
- import { BRIDGE_PACKAGE_ROOT, importBridgeSdkPackage } from '../utils/sdk-package-loader.js';
21
- import { logger as log } from '../utils/logger.js';
22
- import { IdlePollLoop } from './idle-poll-loop.js';
23
- import { getToolActionInfo, redactTransientClipboardPastePaths, redactTransientClipboardPastePathsInValue, } from './types.js';
24
- // ============ 可执行文件查找 ============
25
- /**
26
- * 查找 opencode 可执行文件
27
- * 优先级:用户配置的绝对路径 > Windows Volta exe > npm 全局目录 > 回退到 'opencode'
28
- */
29
- function findOpenCodeExecutable(configCommand) {
30
- if (configCommand && path.isAbsolute(configCommand) && fs.existsSync(configCommand)) {
31
- return configCommand;
32
- }
33
- const fallback = configCommand?.trim() || 'opencode';
34
- if (process.platform === 'win32') {
35
- const home = process.env.USERPROFILE || process.env.HOME || os.homedir();
36
- const localAppData = process.env.LOCALAPPDATA || '';
37
- // 1. Volta 安装的 opencode.exe(优先,不需要 shell)
38
- const voltaExeDirs = [
39
- path.join(localAppData, 'Volta', 'tools', 'shared', 'opencode-ai', 'node_modules', 'opencode-windows-x64', 'bin'),
40
- path.join(localAppData, 'Volta', 'tools', 'shared', 'opencode-ai', 'node_modules', 'opencode-windows-x64-baseline', 'bin'),
41
- ];
42
- for (const dir of voltaExeDirs) {
43
- const exePath = path.join(dir, 'opencode.exe');
44
- if (fs.existsSync(exePath)) {
45
- console.log(`[OpencodeSdkAdapter] Found opencode.exe: ${exePath}`);
46
- return exePath;
47
- }
48
- }
49
- // 2. npm 全局安装的 opencode.cmd
50
- const npmGlobalDirs = [
51
- path.join(home, 'AppData', 'Roaming', 'npm'),
52
- path.join(home, 'AppData', 'Local', 'Volta', 'bin'),
53
- ];
54
- for (const dir of npmGlobalDirs) {
55
- for (const name of ['opencode.cmd', 'opencode.exe', 'opencode']) {
56
- const candidate = path.join(dir, name);
57
- if (fs.existsSync(candidate)) {
58
- console.log(`[OpencodeSdkAdapter] Found ${name}: ${candidate}`);
59
- return candidate;
60
- }
61
- }
62
- }
63
- }
64
- return fallback;
65
- }
66
- // ============ 端口检测 ============
67
- async function findAvailablePort(startPort = 14096) {
68
- for (let port = startPort; port < startPort + 100; port++) {
69
- const available = await new Promise((resolve) => {
70
- const server = net.createServer();
71
- server.once('error', () => resolve(false));
72
- server.once('listening', () => {
73
- server.close(() => resolve(true));
74
- });
75
- server.listen(port, '127.0.0.1');
76
- });
77
- if (available)
78
- return port;
79
- }
80
- throw new Error(`No available port found in range ${startPort}–${startPort + 99}`);
81
- }
82
- function hasErrorCode(error) {
83
- return error instanceof Error && 'code' in error && typeof error.code === 'string';
84
- }
85
- function isMissingPackageError(error, packageName) {
86
- return hasErrorCode(error) && error.code === 'ERR_MODULE_NOT_FOUND' && error.message.includes(packageName);
87
- }
88
- // ============ 模型解析 ============
89
- /**
90
- * 解析 OpenCode 模型规格。
91
- * OpenCode 原生格式为 "provider/model"(如 "anthropic/claude-sonnet-4-5")。
92
- * 若用户只提供模型名(不含 "/"),则仅返回 modelID,providerID 留空让 OpenCode 自动选择。
93
- */
94
- function parseOpenCodeModelSpec(model) {
95
- if (!model || !model.trim())
96
- return undefined;
97
- const trimmed = model.trim();
98
- const slashIndex = trimmed.indexOf('/');
99
- if (slashIndex > 0) {
100
- return { providerID: trimmed.slice(0, slashIndex), modelID: trimmed.slice(slashIndex + 1) };
101
- }
102
- // 纯模型名,无 provider 前缀
103
- return { modelID: trimmed };
104
- }
105
- // ============ Adapter ============
106
- export class OpencodeSdkAdapter extends EventEmitter {
107
- constructor() {
108
- super(...arguments);
109
- this.providerId = 'opencode';
110
- this.displayName = 'OpenCode';
111
- this.sessions = new Map();
112
- }
113
- async startSession(sessionId, config) {
114
- console.log(`[OpencodeSdkAdapter] ★★★ 启动 OpenCode SDK 会话 ★★★ sessionId="${sessionId}", workingDirectory="${config.workingDirectory}"`);
115
- const session = {
116
- adapterSession: {
117
- sessionId,
118
- status: 'starting',
119
- messages: [],
120
- createdAt: new Date().toISOString(),
121
- totalUsage: { inputTokens: 0, outputTokens: 0 },
122
- },
123
- config,
124
- sseActive: false,
125
- pendingPermissions: new Map(),
126
- emittedToolStarts: new Set(),
127
- workingDirectory: config.workingDirectory,
128
- userMessageIds: new Set(),
129
- currentAssistantText: '',
130
- seenTextPartIds: new Set(),
131
- };
132
- this.sessions.set(sessionId, session);
133
- this.emit('status-change', sessionId, 'starting');
134
- try {
135
- // 步骤 1:找空闲端口
136
- const port = await findAvailablePort();
137
- session.port = port;
138
- console.log(`[OpencodeSdkAdapter] ★★★ 使用端口 ★★★ port=${port}`);
139
- // 步骤 2:启动 opencode serve 进程
140
- const openCodeCommand = findOpenCodeExecutable(config.command);
141
- console.log(`[OpencodeSdkAdapter] ★★★ 启动命令 ★★★ command="${openCodeCommand}"`);
142
- // ★ 关键:Windows 上 .cmd 必须使用 shell: true
143
- const useShell = openCodeCommand.endsWith('.cmd') ||
144
- openCodeCommand.endsWith('.CMD') ||
145
- (process.platform === 'win32' && !path.isAbsolute(openCodeCommand));
146
- console.log(`[OpencodeSdkAdapter] shell=${useShell}`);
147
- const env = { ...process.env, ...config.envOverrides };
148
- // ★ 通过 OPENCODE_CONFIG_CONTENT 注入运行时配置(OpenCode 标准 inline config,优先级 6)
149
- // 参考:https://opencode.ai/docs/config/ — "Inline config (OPENCODE_CONFIG_CONTENT env var) - runtime overrides"
150
- const inlineConfig = {};
151
- const parsedModel = parseOpenCodeModelSpec(config.model);
152
- if (parsedModel?.modelID) {
153
- inlineConfig.model = config.model.trim();
154
- }
155
- // 系统提示词:由 SDK 原生机制注入为 role=system,而非作为 user message
156
- if (config.systemPrompt && typeof config.systemPrompt === 'string') {
157
- inlineConfig.systemPrompt = config.systemPrompt;
158
- }
159
- if (Object.keys(inlineConfig).length > 0) {
160
- env.OPENCODE_CONFIG_CONTENT = JSON.stringify(inlineConfig);
161
- log.info(`[OpencodeSdkAdapter] OPENCODE_CONFIG_CONTENT keys=${Object.keys(inlineConfig).join(',')}`);
162
- }
163
- const proc = spawn(openCodeCommand, ['serve', '--port', String(port)], {
164
- cwd: config.workingDirectory,
165
- stdio: ['ignore', 'pipe', 'pipe'],
166
- env,
167
- shell: useShell,
168
- });
169
- session.serverProcess = proc;
170
- session.startupOutput = [];
171
- proc.stdout?.on('data', (d) => {
172
- const text = d.toString();
173
- this.recordStartupOutput(session, text);
174
- console.debug(`[OpencodeSdkAdapter] serve stdout: ${text.slice(0, 200)}`);
175
- });
176
- proc.stderr?.on('data', (d) => {
177
- const text = d.toString();
178
- this.recordStartupOutput(session, text);
179
- console.debug(`[OpencodeSdkAdapter] serve stderr: ${text.slice(0, 200)}`);
180
- });
181
- proc.on('error', (err) => {
182
- console.error(`[OpencodeSdkAdapter] Server process error:`, err);
183
- if (session.adapterSession.status !== 'terminated') {
184
- session.adapterSession.status = 'error';
185
- this.emit('status-change', sessionId, 'error');
186
- this.emitEvent({
187
- type: 'error',
188
- sessionId,
189
- timestamp: new Date().toISOString(),
190
- data: { text: `OpenCode server error: ${err.message}` },
191
- });
192
- }
193
- });
194
- proc.on('exit', (code) => {
195
- console.log(`[OpencodeSdkAdapter] Server exited with code ${code}`);
196
- session.sseActive = false;
197
- });
198
- const exitDuringStartup = new Promise((resolve) => {
199
- proc.once('exit', (code, signal) => resolve({ code, signal }));
200
- });
201
- // 步骤 3:创建 SDK 客户端
202
- const sdk = await this.loadSdk();
203
- const client = sdk.createOpencodeClient({
204
- baseUrl: `http://127.0.0.1:${port}`,
205
- });
206
- session.client = client;
207
- // 步骤 4:等待服务器就绪
208
- await Promise.race([
209
- this.waitForServer(client, config.workingDirectory, 10_000, port),
210
- exitDuringStartup.then((exitInfo) => {
211
- throw new Error(this.formatStartupExitMessage(exitInfo, session.startupOutput));
212
- }),
213
- ]);
214
- console.log(`[OpencodeSdkAdapter] ★★★ OpenCode server ready ★★★ port=${port}`);
215
- // 步骤 5:创建 OpenCode 会话
216
- const createResult = await client.session.create({
217
- body: { title: `aws-bridge-${sessionId.slice(0, 8)}` },
218
- query: { directory: config.workingDirectory },
219
- });
220
- const ocSession = createResult.data;
221
- if (!ocSession?.id) {
222
- throw new Error('OpenCode session.create() did not return an ID');
223
- }
224
- session.opencodeSessionId = ocSession.id;
225
- session.adapterSession.providerSessionId = ocSession.id;
226
- console.log(`[OpencodeSdkAdapter] ★★★ OpenCode 会话创建成功 ★★★ sessionId="${ocSession.id}"`);
227
- // 步骤 6:后台启动 SSE 事件订阅循环
228
- this.startSseLoop(sessionId, session);
229
- session.adapterSession.status = 'waiting_input';
230
- this.emit('status-change', sessionId, 'waiting_input', { usage: session.adapterSession.totalUsage });
231
- // 步骤 7:发送初始 Prompt
232
- if (config.initialPrompt) {
233
- this.dispatchInitialPrompt(sessionId, config.initialPrompt);
234
- }
235
- }
236
- catch (err) {
237
- const msg = err instanceof Error ? err.message : String(err);
238
- console.error(`[OpencodeSdkAdapter] startSession failed:`, err);
239
- session.adapterSession.status = 'error';
240
- this.emit('status-change', sessionId, 'error');
241
- this.emitEvent({
242
- type: 'error',
243
- sessionId,
244
- timestamp: new Date().toISOString(),
245
- data: { text: `OpenCode start failed: ${msg}` },
246
- });
247
- throw err;
248
- }
249
- }
250
- async sendMessage(sessionId, message, options) {
251
- const session = this.sessions.get(sessionId);
252
- if (!session)
253
- throw new Error(`Session ${sessionId} not found`);
254
- if (!session.client || !session.opencodeSessionId) {
255
- throw new Error(`Session ${sessionId} not ready`);
256
- }
257
- const userMsg = {
258
- id: uuidv4(),
259
- sessionId,
260
- role: 'user',
261
- content: message,
262
- timestamp: new Date().toISOString(),
263
- };
264
- session.adapterSession.messages.push(userMsg);
265
- this.emit('conversation-message', sessionId, userMsg);
266
- if (!options?.keepWaitingStatus) {
267
- session.adapterSession.status = 'thinking';
268
- this.emit('status-change', sessionId, 'thinking');
269
- this.stopIdleDetection(sessionId);
270
- }
271
- try {
272
- // ★ 实例级模型覆盖:per-message model override
273
- // 仅当模型含 "provider/model" 格式时传入(OpenCode SDK 要求 providerID + modelID)
274
- const parsedModel = parseOpenCodeModelSpec(session.config.model);
275
- const promptBody = {
276
- parts: [{ type: 'text', text: message }],
277
- };
278
- if (parsedModel?.providerID && parsedModel?.modelID) {
279
- promptBody.model = { providerID: parsedModel.providerID, modelID: parsedModel.modelID };
280
- console.log(`[OpencodeSdkAdapter] ★★★ per-message model ★★★ provider=${parsedModel.providerID}, model=${parsedModel.modelID}`);
281
- }
282
- await session.client.session.prompt({
283
- path: { id: session.opencodeSessionId },
284
- body: promptBody,
285
- query: { directory: session.workingDirectory },
286
- });
287
- }
288
- catch (err) {
289
- const msg = err instanceof Error ? err.message : String(err);
290
- this.emitEvent({
291
- type: 'error',
292
- sessionId,
293
- timestamp: new Date().toISOString(),
294
- data: { text: msg },
295
- });
296
- }
297
- }
298
- async sendConfirmation(sessionId, accept) {
299
- const session = this.sessions.get(sessionId);
300
- if (!session?.client || !session.opencodeSessionId)
301
- return;
302
- const response = accept ? 'once' : 'reject';
303
- const ocId = session.opencodeSessionId;
304
- for (const [permissionId] of session.pendingPermissions) {
305
- try {
306
- await session.client.postSessionIdPermissionsPermissionId({
307
- path: { id: ocId, permissionID: permissionId },
308
- body: { response },
309
- query: { directory: session.workingDirectory },
310
- });
311
- }
312
- catch (err) {
313
- console.warn(`[OpencodeSdkAdapter] Permission response failed:`, err);
314
- }
315
- }
316
- session.pendingPermissions.clear();
317
- }
318
- async sendQuestionAnswer(_sessionId, _answers) {
319
- // OpenCode 的 AskUserQuestion 通过 permission 机制处理
320
- }
321
- setIdleCommands(sessionId, commands) {
322
- const session = this.sessions.get(sessionId);
323
- if (session) {
324
- session.idleCommands = commands;
325
- if (session.adapterSession.status === 'waiting_input' && (commands.idleInputCommand || commands.nonInputCommand)) {
326
- this.startIdleDetection(sessionId);
327
- }
328
- }
329
- }
330
- async abortCurrentTurn(sessionId) {
331
- const session = this.sessions.get(sessionId);
332
- if (!session?.client || !session.opencodeSessionId)
333
- return;
334
- try {
335
- await session.client.session.abort({
336
- path: { id: session.opencodeSessionId },
337
- query: { directory: session.workingDirectory },
338
- });
339
- }
340
- catch (err) {
341
- console.warn(`[OpencodeSdkAdapter] Abort failed:`, err);
342
- }
343
- }
344
- async terminateSession(sessionId) {
345
- const session = this.sessions.get(sessionId);
346
- if (!session)
347
- return;
348
- this.stopIdleDetection(sessionId);
349
- session.sseActive = false;
350
- session.sseAbortController?.abort();
351
- if (session.serverProcess) {
352
- try {
353
- session.serverProcess.kill();
354
- }
355
- catch {
356
- // ignore
357
- }
358
- }
359
- session.adapterSession.status = 'terminated';
360
- this.emit('status-change', sessionId, 'terminated');
361
- this.emitEvent({
362
- type: 'session_complete',
363
- sessionId,
364
- timestamp: new Date().toISOString(),
365
- data: { exitCode: 0 },
366
- });
367
- this.sessions.delete(sessionId);
368
- }
369
- getConversation(sessionId) {
370
- return this.sessions.get(sessionId)?.adapterSession.messages ?? [];
371
- }
372
- hasSession(sessionId) {
373
- return this.sessions.has(sessionId);
374
- }
375
- getProviderSessionId(sessionId) {
376
- return this.sessions.get(sessionId)?.opencodeSessionId;
377
- }
378
- getSessionStatus(sessionId) {
379
- return this.sessions.get(sessionId)?.adapterSession.status;
380
- }
381
- getSessionPid(sessionId) {
382
- const session = this.sessions.get(sessionId);
383
- if (!session)
384
- return undefined;
385
- // OpenCode SDK 模式下 serverProcess 是 spawn 出来的子进程
386
- return session.serverProcess?.pid;
387
- }
388
- cleanup() {
389
- for (const [id] of this.sessions) {
390
- try {
391
- this.terminateSession(id);
392
- }
393
- catch {
394
- // ignore
395
- }
396
- }
397
- this.sessions.clear();
398
- }
399
- // ============ 私有方法 ============
400
- /**
401
- * 按需加载 OpenCode SDK:只有启动 OpenCode provider 时才解析依赖,
402
- * 避免 bridge 基础安装默认携带所有可选 runtime SDK。
403
- */
404
- async loadSdk() {
405
- if (!this.sdkModule) {
406
- try {
407
- this.sdkModule = await importBridgeSdkPackage('@opencode-ai/sdk');
408
- }
409
- catch (error) {
410
- if (isMissingPackageError(error, '@opencode-ai/sdk')) {
411
- throw new Error([
412
- 'OpenCode SDK provider is not installed.',
413
- '',
414
- 'aws-runtime-bridge keeps Codex/OpenCode provider SDKs optional to reduce default install size.',
415
- 'To use SDK mode with command "opencode", install the SDK into the aws-runtime-bridge package root:',
416
- '',
417
- ` npm install --prefix "${BRIDGE_PACKAGE_ROOT}" @opencode-ai/sdk@latest opencode-ai@latest`,
418
- '',
419
- 'If aws-runtime-bridge is installed locally, run the same command with that local package path.',
420
- '',
421
- `Original error: ${error instanceof Error ? error.message : String(error)}`,
422
- ].join('\n'));
423
- }
424
- throw error;
425
- }
426
- }
427
- return this.sdkModule;
428
- }
429
- async waitForServer(client, directory, timeoutMs, port) {
430
- const deadline = Date.now() + timeoutMs;
431
- while (Date.now() < deadline) {
432
- try {
433
- const result = await client.session.list({ query: { directory } });
434
- if (result.data !== undefined)
435
- return;
436
- }
437
- catch {
438
- // 服务器尚未就绪
439
- }
440
- await new Promise((r) => setTimeout(r, 300));
441
- }
442
- throw new Error(`OpenCode server (port ${port}) did not start within ${timeoutMs}ms`);
443
- }
444
- /**
445
- * 记录 OpenCode serve 启动阶段输出,用于进程提前退出时返回可诊断错误。
446
- */
447
- recordStartupOutput(session, text) {
448
- const normalized = text.trim();
449
- if (!normalized)
450
- return;
451
- session.startupOutput = [...(session.startupOutput ?? []), normalized].slice(-8);
452
- }
453
- /**
454
- * 将 OpenCode serve 提前退出信息转成前端可直接展示的错误文本。
455
- */
456
- formatStartupExitMessage(exitInfo, startupOutput) {
457
- const exitReason = exitInfo.signal
458
- ? `signal ${exitInfo.signal}`
459
- : `code ${exitInfo.code ?? 'unknown'}`;
460
- const output = (startupOutput ?? []).join('\n').trim();
461
- if (!output) {
462
- return `OpenCode server exited during startup (${exitReason}). Please check whether opencode serve can run in this workspace.`;
463
- }
464
- return `OpenCode server exited during startup (${exitReason}): ${output}`;
465
- }
466
- /**
467
- * 异步投递启动提示,避免首轮 OpenCode 处理耗时导致 /runtime/start 被前端误判为启动失败。
468
- */
469
- dispatchInitialPrompt(sessionId, initialPrompt) {
470
- void this.sendMessage(sessionId, initialPrompt).catch((err) => {
471
- const msg = err instanceof Error ? err.message : String(err);
472
- this.emitEvent({
473
- type: 'error',
474
- sessionId,
475
- timestamp: new Date().toISOString(),
476
- data: { text: `OpenCode initial prompt failed: ${msg}` },
477
- });
478
- });
479
- }
480
- startSseLoop(sessionId, session) {
481
- session.sseActive = true;
482
- const ac = new AbortController();
483
- session.sseAbortController = ac;
484
- this.runSseLoop(sessionId, session, ac).catch((err) => {
485
- if (!ac.signal.aborted) {
486
- console.error(`[OpencodeSdkAdapter] SSE loop error:`, err);
487
- }
488
- });
489
- }
490
- async runSseLoop(sessionId, session, ac) {
491
- if (!session.client)
492
- return;
493
- try {
494
- const sseResult = await session.client.event.subscribe({
495
- query: { directory: session.workingDirectory },
496
- signal: ac.signal,
497
- });
498
- for await (const event of sseResult.stream) {
499
- if (!session.sseActive || ac.signal.aborted)
500
- break;
501
- this.handleOpenCodeEvent(sessionId, session, event);
502
- }
503
- }
504
- catch (err) {
505
- if (ac.signal.aborted)
506
- return;
507
- console.error(`[OpencodeSdkAdapter] SSE stream ended:`, err);
508
- }
509
- }
510
- handleOpenCodeEvent(sessionId, session, event) {
511
- const ts = new Date().toISOString();
512
- const ocId = session.opencodeSessionId;
513
- switch (event.type) {
514
- case 'message.updated': {
515
- const msg = event.properties.info;
516
- if (msg.sessionID !== ocId)
517
- break;
518
- if (msg.role === 'user') {
519
- session.userMessageIds.add(msg.id);
520
- }
521
- else if (msg.role === 'assistant') {
522
- const tokens = msg.tokens;
523
- if (tokens) {
524
- session.adapterSession.totalUsage.inputTokens = Math.max(session.adapterSession.totalUsage.inputTokens, tokens.input);
525
- session.adapterSession.totalUsage.outputTokens = Math.max(session.adapterSession.totalUsage.outputTokens, tokens.output);
526
- }
527
- }
528
- break;
529
- }
530
- case 'message.part.updated': {
531
- const { part, delta } = event.properties;
532
- if (part.sessionID !== ocId)
533
- break;
534
- if (session.userMessageIds.has(part.messageID))
535
- break;
536
- this.handlePartUpdate(sessionId, session, part, delta, ts);
537
- break;
538
- }
539
- case 'session.idle': {
540
- if (event.properties.sessionID !== ocId)
541
- break;
542
- if (session.currentAssistantText) {
543
- const assistantMsg = {
544
- id: uuidv4(),
545
- sessionId,
546
- role: 'assistant',
547
- content: session.currentAssistantText,
548
- timestamp: ts,
549
- };
550
- session.adapterSession.messages.push(assistantMsg);
551
- session.currentAssistantText = '';
552
- }
553
- session.seenTextPartIds.clear();
554
- this.emitEvent({
555
- type: 'turn_complete',
556
- sessionId,
557
- timestamp: ts,
558
- data: { usage: session.adapterSession.totalUsage },
559
- });
560
- session.adapterSession.status = 'waiting_input';
561
- // ★ 修复:当空闲检测即将重新启动 poll_message 轮询时,在 status-change 中
562
- // 保留 idle 动作信息,避免 bridge 清空动作字段导致前端显示 "空闲"。
563
- // 核心场景:agent 处理完一轮消息后 session.idle 触发,此时 last action
564
- // 是工作工具(bash/edit_file 等),而非 idle/mcp。如果此处不传递动作信息,
565
- // bridge 的 shouldPreservePrevAction 判定会因 last action type 不匹配而
566
- // 跳过保留,轮询恢复前出现 "空闲" 闪显。
567
- const idleInputCommand = session.idleCommands?.idleInputCommand;
568
- const willResumePolling = Boolean(idleInputCommand && this.isMessagePollingIdleCommand(idleInputCommand));
569
- if (willResumePolling) {
570
- // 传递预置的 idle 动作信息,让 bridge 直接更新/保留 poll_message 动作显示
571
- this.emit('status-change', sessionId, 'waiting_input', {
572
- actionType: 'idle',
573
- actionLabel: '监听消息',
574
- actionDetail: 'aws-mcp/poll_message',
575
- usage: session.adapterSession.totalUsage,
576
- });
577
- }
578
- else {
579
- this.emit('status-change', sessionId, 'waiting_input', { usage: session.adapterSession.totalUsage });
580
- }
581
- this.startIdleDetection(sessionId);
582
- break;
583
- }
584
- case 'permission.updated': {
585
- const perm = event.properties;
586
- if (perm.sessionID !== ocId)
587
- break;
588
- const permId = perm.id;
589
- session.pendingPermissions.set(permId, perm);
590
- if (session.config.autoAccept && session.client && ocId) {
591
- session.client
592
- .postSessionIdPermissionsPermissionId({
593
- path: { id: ocId, permissionID: permId },
594
- body: { response: 'once' },
595
- query: { directory: session.workingDirectory },
596
- })
597
- .then(() => {
598
- session.pendingPermissions.delete(permId);
599
- })
600
- .catch((err) => {
601
- console.warn(`[OpencodeSdkAdapter] Auto-accept permission failed:`, err);
602
- });
603
- }
604
- else {
605
- this.emitEvent({
606
- type: 'permission_request',
607
- sessionId,
608
- timestamp: ts,
609
- data: {
610
- permissionPrompt: perm.title,
611
- toolName: perm.type,
612
- },
613
- });
614
- }
615
- break;
616
- }
617
- case 'session.error': {
618
- const { sessionID, error } = event.properties;
619
- if (sessionID && sessionID !== ocId)
620
- break;
621
- let errMsg = 'OpenCode session error';
622
- if (error) {
623
- const data = error.data;
624
- if (typeof data?.message === 'string') {
625
- errMsg = `${error.name}: ${data.message}`;
626
- }
627
- else {
628
- errMsg = error.name;
629
- }
630
- }
631
- this.emitEvent({
632
- type: 'error',
633
- sessionId,
634
- timestamp: ts,
635
- data: { text: errMsg },
636
- });
637
- break;
638
- }
639
- }
640
- }
641
- handlePartUpdate(sessionId, session, part, delta, ts) {
642
- switch (part.type) {
643
- case 'text': {
644
- let text;
645
- if (delta !== undefined) {
646
- text = delta;
647
- session.seenTextPartIds.add(part.id);
648
- }
649
- else if (!session.seenTextPartIds.has(part.id)) {
650
- text = part.text;
651
- if (text)
652
- session.seenTextPartIds.add(part.id);
653
- }
654
- else {
655
- break;
656
- }
657
- if (!text)
658
- break;
659
- session.currentAssistantText += text;
660
- this.emitEvent({
661
- type: 'text_delta',
662
- sessionId,
663
- timestamp: ts,
664
- data: { text },
665
- });
666
- break;
667
- }
668
- case 'reasoning': {
669
- const text = delta ?? part.text;
670
- if (!text)
671
- break;
672
- this.emitEvent({
673
- type: 'thinking',
674
- sessionId,
675
- timestamp: ts,
676
- data: { text },
677
- });
678
- break;
679
- }
680
- case 'tool': {
681
- const toolUseId = part.callID;
682
- const toolName = part.tool;
683
- const state = part.state;
684
- const toolInput = state.input;
685
- // 从 ToolPart.metadata 中提取 MCP server 信息(注意:metadata 在 part 上,不在 state 上)
686
- const metadata = part.metadata;
687
- // 调试日志:查看 metadata 内容
688
- if (metadata && Object.keys(metadata).length > 0) {
689
- console.log(`[OpencodeSdkAdapter] Tool "${toolName}" metadata:`, JSON.stringify(redactTransientClipboardPastePathsInValue(metadata)));
690
- }
691
- const displayToolInputValue = redactTransientClipboardPastePathsInValue(toolInput);
692
- const displayToolInput = displayToolInputValue && typeof displayToolInputValue === 'object' && !Array.isArray(displayToolInputValue)
693
- ? displayToolInputValue
694
- : {};
695
- const emitToolStart = () => {
696
- if (session.emittedToolStarts.has(toolUseId))
697
- return;
698
- session.emittedToolStarts.add(toolUseId);
699
- const actionInfo = { ...getToolActionInfo(toolName, toolInput, metadata), actionId: toolUseId };
700
- this.emitEvent({
701
- type: 'tool_use_start',
702
- sessionId,
703
- timestamp: ts,
704
- data: { toolName, toolInput: displayToolInput, toolUseId, ...actionInfo },
705
- });
706
- session.adapterSession.messages.push({
707
- id: uuidv4(),
708
- sessionId,
709
- role: 'tool_use',
710
- content: `${toolName}: ${JSON.stringify(displayToolInput).slice(0, 100)}`,
711
- timestamp: ts,
712
- toolName,
713
- toolInput: displayToolInput,
714
- toolUseId,
715
- });
716
- };
717
- if (state.status === 'running') {
718
- emitToolStart();
719
- const actionInfo = { ...getToolActionInfo(toolName, toolInput, metadata), actionId: toolUseId };
720
- this.emit('status-change', sessionId, 'tool_using', { ...actionInfo, usage: session.adapterSession.totalUsage });
721
- }
722
- else if (state.status === 'completed') {
723
- // 同步 todowrite 工具完成的 todo 到公共 TodoStore 路径,供 poll_message 提醒使用
724
- if (toolName === 'todowrite' || toolName === 'todo_write') {
725
- this.syncTodosFromToolCall(session, toolInput).catch((err) => {
726
- console.warn('[OpencodeSdkAdapter] 同步 todo 到文件失败:', err);
727
- });
728
- }
729
- emitToolStart();
730
- const output = redactTransientClipboardPastePaths(state.output);
731
- this.emitEvent({
732
- type: 'tool_use_end',
733
- sessionId,
734
- timestamp: ts,
735
- data: { toolName, toolResult: output, isError: false, toolUseId },
736
- });
737
- session.emittedToolStarts.delete(toolUseId);
738
- }
739
- else if (state.status === 'error') {
740
- emitToolStart();
741
- const errorStr = redactTransientClipboardPastePaths(state.error);
742
- this.emitEvent({
743
- type: 'tool_use_end',
744
- sessionId,
745
- timestamp: ts,
746
- data: { toolName, toolResult: errorStr, isError: true, toolUseId },
747
- });
748
- session.emittedToolStarts.delete(toolUseId);
749
- }
750
- break;
751
- }
752
- }
753
- }
754
- /**
755
- * 同步 todowrite 工具调用的 todo 到公共 TodoStore 路径 ~/.acode/todos/{agentId}.json。
756
- *
757
- * OpenCode 内置 todowrite 工具与 ACode 共享同一文件格式,确保 poll_message
758
- * 的 buildTodoReminderNotification() 能在 OpenCode runtime 下正确感知未完成 todo。
759
- *
760
- * 触发条件:
761
- * - toolName 为 todowrite 或 todo_write
762
- * - state.status 为 completed(工具调用成功完成)
763
- * - session.config.agentId 存在
764
- * - toolInput 包含有效的 todos 数组
765
- *
766
- * 写入格式(与 ACode TodoStore 一致):
767
- * { agentId, updatedAt, background, todos: [{content, status, priority}] }
768
- *
769
- * 测试替身可通过覆写 getTodoStoreDir 注入临时目录。
770
- */
771
- getTodoStoreDir() {
772
- return path.join(os.homedir(), '.acode', 'todos');
773
- }
774
- async syncTodosFromToolCall(session, toolInput) {
775
- const agentId = session.config.agentId;
776
- if (!agentId)
777
- return;
778
- const rawTodos = toolInput['todos'];
779
- if (!Array.isArray(rawTodos) || rawTodos.length === 0)
780
- return;
781
- // 校验并标准化为 TodoItem 格式
782
- const todos = [];
783
- for (const item of rawTodos) {
784
- if (item && typeof item === 'object') {
785
- const content = typeof item.content === 'string' ? item.content.trim() : '';
786
- const status = typeof item.status === 'string' ? item.status : '';
787
- const priority = typeof item.priority === 'string' ? item.priority : '';
788
- if (content && status && priority) {
789
- todos.push({ content, status, priority });
790
- }
791
- }
792
- }
793
- if (todos.length === 0)
794
- return;
795
- // 安全化 agentId 防止路径穿越
796
- const safe = String(agentId).replace(/[^a-zA-Z0-9_-]/g, '_');
797
- const todosDir = this.getTodoStoreDir();
798
- const target = path.join(todosDir, `${safe}.json`);
799
- const doc = {
800
- agentId,
801
- updatedAt: new Date().toISOString(),
802
- background: 'OpenCode runtime todos',
803
- todos,
804
- };
805
- await fs.promises.mkdir(todosDir, { recursive: true });
806
- const tmp = `${target}.tmp`;
807
- await fs.promises.writeFile(tmp, JSON.stringify(doc, null, 2), 'utf-8');
808
- await fs.promises.rename(tmp, target);
809
- }
810
- emitEvent(event) {
811
- this.emit('event', event);
812
- }
813
- startIdleDetection(sessionId) {
814
- this.stopIdleDetection(sessionId);
815
- const session = this.sessions.get(sessionId);
816
- const idleInputCommand = session?.idleCommands?.idleInputCommand;
817
- if (!session || !idleInputCommand)
818
- return;
819
- if (this.isMessagePollingIdleCommand(idleInputCommand)) {
820
- if (!session.idlePollLoop) {
821
- session.idlePollLoop = new IdlePollLoop({
822
- getStatus: () => this.sessions.get(sessionId)?.adapterSession.status,
823
- getCommand: () => this.sessions.get(sessionId)?.idleCommands?.idleInputCommand,
824
- isPollingCommand: (command) => this.isMessagePollingIdleCommand(command),
825
- dispatchPollingPrompt: (command) => this.sendMessage(sessionId, this.toIdlePrompt(command), { keepWaitingStatus: true }),
826
- dispatchRegularIdleCommand: (command) => this.sendMessage(sessionId, this.toIdlePrompt(command)),
827
- pollDelayMs: 1500,
828
- });
829
- }
830
- session.idlePollLoop.start();
831
- return;
832
- }
833
- if (!session.idlePollLoop) {
834
- session.idlePollLoop = new IdlePollLoop({
835
- getStatus: () => this.sessions.get(sessionId)?.adapterSession.status,
836
- getCommand: () => this.sessions.get(sessionId)?.idleCommands?.idleInputCommand,
837
- isPollingCommand: (command) => this.isMessagePollingIdleCommand(command),
838
- dispatchPollingPrompt: (command) => this.sendMessage(sessionId, this.toIdlePrompt(command), { keepWaitingStatus: true }),
839
- dispatchRegularIdleCommand: (command) => this.sendMessage(sessionId, this.toIdlePrompt(command)),
840
- pollDelayMs: 1500,
841
- });
842
- }
843
- const timer = setInterval(() => {
844
- this.checkIdleState(sessionId);
845
- }, 500);
846
- session.idleTimer = timer;
847
- }
848
- stopIdleDetection(sessionId) {
849
- const session = this.sessions.get(sessionId);
850
- session?.idlePollLoop?.stop();
851
- if (session?.idleTimer) {
852
- clearInterval(session.idleTimer);
853
- session.idleTimer = undefined;
854
- }
855
- }
856
- checkIdleState(sessionId) {
857
- const session = this.sessions.get(sessionId);
858
- if (!session || session.adapterSession.status !== 'waiting_input')
859
- return;
860
- if (!session.idleCommands?.idleInputCommand)
861
- return;
862
- void this.sendMessage(sessionId, this.toIdlePrompt(session.idleCommands.idleInputCommand));
863
- this.stopIdleDetection(sessionId);
864
- }
865
- toIdlePrompt(command) {
866
- const trimmed = command.trim();
867
- if (this.isMessagePollingIdleCommand(trimmed)) {
868
- return '系统提醒:当前工作已完成或运行时已进入空闲状态。请立即调用 poll_message 工具阻塞等待新消息和流程线任务提醒;收到流程任务提醒后调用 my_task 查看已由后台静默抢占的任务详情并直接处理;完成任务后调用 submit_task_result 提交结果,然后继续 poll_message。 调用 submit_task_result 时请一并传入 changeLog(本次处理的文件/内容变更日志,包含 operation 与 path),用于 AI 回退。';
869
- }
870
- return trimmed;
871
- }
872
- isMessagePollingIdleCommand(command) {
873
- const normalized = command.trim();
874
- if (!normalized)
875
- return false;
876
- const lower = normalized.toLowerCase();
877
- return lower.includes('poll_message') || lower.includes('get_message') || normalized.includes('取消息');
878
- }
879
- }
1
+ import{spawn as A}from"node:child_process";import{EventEmitter as E}from"node:events";import*as y from"node:fs";import*as x from"node:net";import*as O from"node:os";import*as h from"node:path";import{v4 as k}from"uuid";import{BRIDGE_PACKAGE_ROOT as T,importBridgeSdkPackage as _}from"../utils/sdk-package-loader.js";import{logger as $}from"../utils/logger.js";import{IdlePollLoop as D}from"./idle-poll-loop.js";import{getToolActionInfo as P,redactTransientClipboardPastePaths as C,redactTransientClipboardPastePathsInValue as I}from"./types.js";function M(d){if(d&&h.isAbsolute(d)&&y.existsSync(d))return d;const t=d?.trim()||"opencode";if(process.platform==="win32"){const e=process.env.USERPROFILE||process.env.HOME||O.homedir(),o=process.env.LOCALAPPDATA||"",r=[h.join(o,"Volta","tools","shared","opencode-ai","node_modules","opencode-windows-x64","bin"),h.join(o,"Volta","tools","shared","opencode-ai","node_modules","opencode-windows-x64-baseline","bin")];for(const s of r){const n=h.join(s,"opencode.exe");if(y.existsSync(n))return console.log(`[OpencodeSdkAdapter] Found opencode.exe: ${n}`),n}const i=[h.join(e,"AppData","Roaming","npm"),h.join(e,"AppData","Local","Volta","bin")];for(const s of i)for(const n of["opencode.cmd","opencode.exe","opencode"]){const a=h.join(s,n);if(y.existsSync(a))return console.log(`[OpencodeSdkAdapter] Found ${n}: ${a}`),a}}return t}async function L(d=14096){for(let t=d;t<d+100;t++)if(await new Promise(o=>{const r=x.createServer();r.once("error",()=>o(!1)),r.once("listening",()=>{r.close(()=>o(!0))}),r.listen(t,"127.0.0.1")}))return t;throw new Error(`No available port found in range ${d}\u2013${d+99}`)}function j(d){return d instanceof Error&&"code"in d&&typeof d.code=="string"}function N(d,t){return j(d)&&d.code==="ERR_MODULE_NOT_FOUND"&&d.message.includes(t)}function v(d){if(!d||!d.trim())return;const t=d.trim(),e=t.indexOf("/");return e>0?{providerID:t.slice(0,e),modelID:t.slice(e+1)}:{modelID:t}}class W extends E{constructor(){super(...arguments),this.providerId="opencode",this.displayName="OpenCode",this.sessions=new Map}async startSession(t,e){console.log(`[OpencodeSdkAdapter] \u2605\u2605\u2605 \u542F\u52A8 OpenCode SDK \u4F1A\u8BDD \u2605\u2605\u2605 sessionId="${t}", workingDirectory="${e.workingDirectory}"`);const o={adapterSession:{sessionId:t,status:"starting",messages:[],createdAt:new Date().toISOString(),totalUsage:{inputTokens:0,outputTokens:0}},config:e,sseActive:!1,pendingPermissions:new Map,emittedToolStarts:new Set,workingDirectory:e.workingDirectory,userMessageIds:new Set,currentAssistantText:"",seenTextPartIds:new Set};this.sessions.set(t,o),this.emit("status-change",t,"starting");try{const r=await L();o.port=r,console.log(`[OpencodeSdkAdapter] \u2605\u2605\u2605 \u4F7F\u7528\u7AEF\u53E3 \u2605\u2605\u2605 port=${r}`);const i=M(e.command);console.log(`[OpencodeSdkAdapter] \u2605\u2605\u2605 \u542F\u52A8\u547D\u4EE4 \u2605\u2605\u2605 command="${i}"`);const s=i.endsWith(".cmd")||i.endsWith(".CMD")||process.platform==="win32"&&!h.isAbsolute(i);console.log(`[OpencodeSdkAdapter] shell=${s}`);const n={...process.env,...e.envOverrides},a={};v(e.model)?.modelID&&(a.model=e.model.trim()),e.systemPrompt&&typeof e.systemPrompt=="string"&&(a.systemPrompt=e.systemPrompt),Object.keys(a).length>0&&(n.OPENCODE_CONFIG_CONTENT=JSON.stringify(a),$.info(`[OpencodeSdkAdapter] OPENCODE_CONFIG_CONTENT keys=${Object.keys(a).join(",")}`));const p=A(i,["serve","--port",String(r)],{cwd:e.workingDirectory,stdio:["ignore","pipe","pipe"],env:n,shell:s});o.serverProcess=p,o.startupOutput=[],p.stdout?.on("data",l=>{const f=l.toString();this.recordStartupOutput(o,f),console.debug(`[OpencodeSdkAdapter] serve stdout: ${f.slice(0,200)}`)}),p.stderr?.on("data",l=>{const f=l.toString();this.recordStartupOutput(o,f),console.debug(`[OpencodeSdkAdapter] serve stderr: ${f.slice(0,200)}`)}),p.on("error",l=>{console.error("[OpencodeSdkAdapter] Server process error:",l),o.adapterSession.status!=="terminated"&&(o.adapterSession.status="error",this.emit("status-change",t,"error"),this.emitEvent({type:"error",sessionId:t,timestamp:new Date().toISOString(),data:{text:`OpenCode server error: ${l.message}`}}))}),p.on("exit",l=>{console.log(`[OpencodeSdkAdapter] Server exited with code ${l}`),o.sseActive=!1});const c=new Promise(l=>{p.once("exit",(f,b)=>l({code:f,signal:b}))}),g=(await this.loadSdk()).createOpencodeClient({baseUrl:`http://127.0.0.1:${r}`});o.client=g,await Promise.race([this.waitForServer(g,e.workingDirectory,1e4,r),c.then(l=>{throw new Error(this.formatStartupExitMessage(l,o.startupOutput))})]),console.log(`[OpencodeSdkAdapter] \u2605\u2605\u2605 OpenCode server ready \u2605\u2605\u2605 port=${r}`);const w=(await g.session.create({body:{title:`aws-bridge-${t.slice(0,8)}`},query:{directory:e.workingDirectory}})).data;if(!w?.id)throw new Error("OpenCode session.create() did not return an ID");o.opencodeSessionId=w.id,o.adapterSession.providerSessionId=w.id,console.log(`[OpencodeSdkAdapter] \u2605\u2605\u2605 OpenCode \u4F1A\u8BDD\u521B\u5EFA\u6210\u529F \u2605\u2605\u2605 sessionId="${w.id}"`),this.startSseLoop(t,o),o.adapterSession.status="waiting_input",this.emit("status-change",t,"waiting_input",{usage:o.adapterSession.totalUsage}),e.initialPrompt&&this.dispatchInitialPrompt(t,e.initialPrompt)}catch(r){const i=r instanceof Error?r.message:String(r);throw console.error("[OpencodeSdkAdapter] startSession failed:",r),o.adapterSession.status="error",this.emit("status-change",t,"error"),this.emitEvent({type:"error",sessionId:t,timestamp:new Date().toISOString(),data:{text:`OpenCode start failed: ${i}`}}),r}}async sendMessage(t,e,o){const r=this.sessions.get(t);if(!r)throw new Error(`Session ${t} not found`);if(!r.client||!r.opencodeSessionId)throw new Error(`Session ${t} not ready`);const i={id:k(),sessionId:t,role:"user",content:e,timestamp:new Date().toISOString()};r.adapterSession.messages.push(i),this.emit("conversation-message",t,i),o?.keepWaitingStatus||(r.adapterSession.status="thinking",this.emit("status-change",t,"thinking"),this.stopIdleDetection(t));try{const s=v(r.config.model),n={parts:[{type:"text",text:e}]};s?.providerID&&s?.modelID&&(n.model={providerID:s.providerID,modelID:s.modelID},console.log(`[OpencodeSdkAdapter] \u2605\u2605\u2605 per-message model \u2605\u2605\u2605 provider=${s.providerID}, model=${s.modelID}`)),await r.client.session.prompt({path:{id:r.opencodeSessionId},body:n,query:{directory:r.workingDirectory}})}catch(s){const n=s instanceof Error?s.message:String(s);this.emitEvent({type:"error",sessionId:t,timestamp:new Date().toISOString(),data:{text:n}})}}async sendConfirmation(t,e){const o=this.sessions.get(t);if(!o?.client||!o.opencodeSessionId)return;const r=e?"once":"reject",i=o.opencodeSessionId;for(const[s]of o.pendingPermissions)try{await o.client.postSessionIdPermissionsPermissionId({path:{id:i,permissionID:s},body:{response:r},query:{directory:o.workingDirectory}})}catch(n){console.warn("[OpencodeSdkAdapter] Permission response failed:",n)}o.pendingPermissions.clear()}async sendQuestionAnswer(t,e){}setIdleCommands(t,e){const o=this.sessions.get(t);o&&(o.idleCommands=e,o.adapterSession.status==="waiting_input"&&(e.idleInputCommand||e.nonInputCommand)&&this.startIdleDetection(t))}async abortCurrentTurn(t){const e=this.sessions.get(t);if(!(!e?.client||!e.opencodeSessionId))try{await e.client.session.abort({path:{id:e.opencodeSessionId},query:{directory:e.workingDirectory}})}catch(o){console.warn("[OpencodeSdkAdapter] Abort failed:",o)}}async terminateSession(t){const e=this.sessions.get(t);if(e){if(this.stopIdleDetection(t),e.sseActive=!1,e.sseAbortController?.abort(),e.serverProcess)try{e.serverProcess.kill()}catch{}e.adapterSession.status="terminated",this.emit("status-change",t,"terminated"),this.emitEvent({type:"session_complete",sessionId:t,timestamp:new Date().toISOString(),data:{exitCode:0}}),this.sessions.delete(t)}}getConversation(t){return this.sessions.get(t)?.adapterSession.messages??[]}hasSession(t){return this.sessions.has(t)}getProviderSessionId(t){return this.sessions.get(t)?.opencodeSessionId}getSessionStatus(t){return this.sessions.get(t)?.adapterSession.status}getSessionPid(t){const e=this.sessions.get(t);if(e)return e.serverProcess?.pid}cleanup(){for(const[t]of this.sessions)try{this.terminateSession(t)}catch{}this.sessions.clear()}async loadSdk(){if(!this.sdkModule)try{this.sdkModule=await _("@opencode-ai/sdk")}catch(t){throw N(t,"@opencode-ai/sdk")?new Error(["OpenCode SDK provider is not installed.","","aws-runtime-bridge keeps Codex/OpenCode provider SDKs optional to reduce default install size.",'To use SDK mode with command "opencode", install the SDK into the aws-runtime-bridge package root:',"",` npm install --prefix "${T}" @opencode-ai/sdk@latest opencode-ai@latest`,"","If aws-runtime-bridge is installed locally, run the same command with that local package path.","",`Original error: ${t instanceof Error?t.message:String(t)}`].join(`
2
+ `)):t}return this.sdkModule}async waitForServer(t,e,o,r){const i=Date.now()+o;for(;Date.now()<i;){try{if((await t.session.list({query:{directory:e}})).data!==void 0)return}catch{}await new Promise(s=>setTimeout(s,300))}throw new Error(`OpenCode server (port ${r}) did not start within ${o}ms`)}recordStartupOutput(t,e){const o=e.trim();o&&(t.startupOutput=[...t.startupOutput??[],o].slice(-8))}formatStartupExitMessage(t,e){const o=t.signal?`signal ${t.signal}`:`code ${t.code??"unknown"}`,r=(e??[]).join(`
3
+ `).trim();return r?`OpenCode server exited during startup (${o}): ${r}`:`OpenCode server exited during startup (${o}). Please check whether opencode serve can run in this workspace.`}dispatchInitialPrompt(t,e){this.sendMessage(t,e).catch(o=>{const r=o instanceof Error?o.message:String(o);this.emitEvent({type:"error",sessionId:t,timestamp:new Date().toISOString(),data:{text:`OpenCode initial prompt failed: ${r}`}})})}startSseLoop(t,e){e.sseActive=!0;const o=new AbortController;e.sseAbortController=o,this.runSseLoop(t,e,o).catch(r=>{o.signal.aborted||console.error("[OpencodeSdkAdapter] SSE loop error:",r)})}async runSseLoop(t,e,o){if(e.client)try{const r=await e.client.event.subscribe({query:{directory:e.workingDirectory},signal:o.signal});for await(const i of r.stream){if(!e.sseActive||o.signal.aborted)break;this.handleOpenCodeEvent(t,e,i)}}catch(r){if(o.signal.aborted)return;console.error("[OpencodeSdkAdapter] SSE stream ended:",r)}}handleOpenCodeEvent(t,e,o){const r=new Date().toISOString(),i=e.opencodeSessionId;switch(o.type){case"message.updated":{const s=o.properties.info;if(s.sessionID!==i)break;if(s.role==="user")e.userMessageIds.add(s.id);else if(s.role==="assistant"){const n=s.tokens;n&&(e.adapterSession.totalUsage.inputTokens=Math.max(e.adapterSession.totalUsage.inputTokens,n.input),e.adapterSession.totalUsage.outputTokens=Math.max(e.adapterSession.totalUsage.outputTokens,n.output))}break}case"message.part.updated":{const{part:s,delta:n}=o.properties;if(s.sessionID!==i||e.userMessageIds.has(s.messageID))break;this.handlePartUpdate(t,e,s,n,r);break}case"session.idle":{if(o.properties.sessionID!==i)break;if(e.currentAssistantText){const a={id:k(),sessionId:t,role:"assistant",content:e.currentAssistantText,timestamp:r};e.adapterSession.messages.push(a),e.currentAssistantText=""}e.seenTextPartIds.clear(),this.emitEvent({type:"turn_complete",sessionId:t,timestamp:r,data:{usage:e.adapterSession.totalUsage}}),e.adapterSession.status="waiting_input";const s=e.idleCommands?.idleInputCommand;!!(s&&this.isMessagePollingIdleCommand(s))?this.emit("status-change",t,"waiting_input",{actionType:"idle",actionLabel:"\u76D1\u542C\u6D88\u606F",actionDetail:"aws-mcp/poll_message",usage:e.adapterSession.totalUsage}):this.emit("status-change",t,"waiting_input",{usage:e.adapterSession.totalUsage}),this.startIdleDetection(t);break}case"permission.updated":{const s=o.properties;if(s.sessionID!==i)break;const n=s.id;e.pendingPermissions.set(n,s),e.config.autoAccept&&e.client&&i?e.client.postSessionIdPermissionsPermissionId({path:{id:i,permissionID:n},body:{response:"once"},query:{directory:e.workingDirectory}}).then(()=>{e.pendingPermissions.delete(n)}).catch(a=>{console.warn("[OpencodeSdkAdapter] Auto-accept permission failed:",a)}):this.emitEvent({type:"permission_request",sessionId:t,timestamp:r,data:{permissionPrompt:s.title,toolName:s.type}});break}case"session.error":{const{sessionID:s,error:n}=o.properties;if(s&&s!==i)break;let a="OpenCode session error";if(n){const u=n.data;typeof u?.message=="string"?a=`${n.name}: ${u.message}`:a=n.name}this.emitEvent({type:"error",sessionId:t,timestamp:r,data:{text:a}});break}}}handlePartUpdate(t,e,o,r,i){switch(o.type){case"text":{let s;if(r!==void 0)s=r,e.seenTextPartIds.add(o.id);else if(!e.seenTextPartIds.has(o.id))s=o.text,s&&e.seenTextPartIds.add(o.id);else break;if(!s)break;e.currentAssistantText+=s,this.emitEvent({type:"text_delta",sessionId:t,timestamp:i,data:{text:s}});break}case"reasoning":{const s=r??o.text;if(!s)break;this.emitEvent({type:"thinking",sessionId:t,timestamp:i,data:{text:s}});break}case"tool":{const s=o.callID,n=o.tool,a=o.state,u=a.input,p=o.metadata;p&&Object.keys(p).length>0&&console.log(`[OpencodeSdkAdapter] Tool "${n}" metadata:`,JSON.stringify(I(p)));const c=I(u),S=c&&typeof c=="object"&&!Array.isArray(c)?c:{},g=()=>{if(e.emittedToolStarts.has(s))return;e.emittedToolStarts.add(s);const m={...P(n,u,p),actionId:s};this.emitEvent({type:"tool_use_start",sessionId:t,timestamp:i,data:{toolName:n,toolInput:S,toolUseId:s,...m}}),e.adapterSession.messages.push({id:k(),sessionId:t,role:"tool_use",content:`${n}: ${JSON.stringify(S).slice(0,100)}`,timestamp:i,toolName:n,toolInput:S,toolUseId:s})};if(a.status==="running"){g();const m={...P(n,u,p),actionId:s};this.emit("status-change",t,"tool_using",{...m,usage:e.adapterSession.totalUsage})}else if(a.status==="completed"){(n==="todowrite"||n==="todo_write")&&this.syncTodosFromToolCall(e,u).catch(w=>{console.warn("[OpencodeSdkAdapter] \u540C\u6B65 todo \u5230\u6587\u4EF6\u5931\u8D25:",w)}),g();const m=C(a.output);this.emitEvent({type:"tool_use_end",sessionId:t,timestamp:i,data:{toolName:n,toolResult:m,isError:!1,toolUseId:s}}),e.emittedToolStarts.delete(s)}else if(a.status==="error"){g();const m=C(a.error);this.emitEvent({type:"tool_use_end",sessionId:t,timestamp:i,data:{toolName:n,toolResult:m,isError:!0,toolUseId:s}}),e.emittedToolStarts.delete(s)}break}}}getTodoStoreDir(){return h.join(O.homedir(),".acode","todos")}async syncTodosFromToolCall(t,e){const o=t.config.agentId;if(!o)return;const r=e.todos;if(!Array.isArray(r)||r.length===0)return;const i=[];for(const c of r)if(c&&typeof c=="object"){const S=typeof c.content=="string"?c.content.trim():"",g=typeof c.status=="string"?c.status:"",m=typeof c.priority=="string"?c.priority:"";S&&g&&m&&i.push({content:S,status:g,priority:m})}if(i.length===0)return;const s=String(o).replace(/[^a-zA-Z0-9_-]/g,"_"),n=this.getTodoStoreDir(),a=h.join(n,`${s}.json`),u={agentId:o,updatedAt:new Date().toISOString(),background:"OpenCode runtime todos",todos:i};await y.promises.mkdir(n,{recursive:!0});const p=`${a}.tmp`;await y.promises.writeFile(p,JSON.stringify(u,null,2),"utf-8"),await y.promises.rename(p,a)}emitEvent(t){this.emit("event",t)}startIdleDetection(t){this.stopIdleDetection(t);const e=this.sessions.get(t),o=e?.idleCommands?.idleInputCommand;if(!e||!o)return;if(this.isMessagePollingIdleCommand(o)){e.idlePollLoop||(e.idlePollLoop=new D({getStatus:()=>this.sessions.get(t)?.adapterSession.status,getCommand:()=>this.sessions.get(t)?.idleCommands?.idleInputCommand,isPollingCommand:i=>this.isMessagePollingIdleCommand(i),dispatchPollingPrompt:i=>this.sendMessage(t,this.toIdlePrompt(i),{keepWaitingStatus:!0}),dispatchRegularIdleCommand:i=>this.sendMessage(t,this.toIdlePrompt(i)),pollDelayMs:1500})),e.idlePollLoop.start();return}e.idlePollLoop||(e.idlePollLoop=new D({getStatus:()=>this.sessions.get(t)?.adapterSession.status,getCommand:()=>this.sessions.get(t)?.idleCommands?.idleInputCommand,isPollingCommand:i=>this.isMessagePollingIdleCommand(i),dispatchPollingPrompt:i=>this.sendMessage(t,this.toIdlePrompt(i),{keepWaitingStatus:!0}),dispatchRegularIdleCommand:i=>this.sendMessage(t,this.toIdlePrompt(i)),pollDelayMs:1500}));const r=setInterval(()=>{this.checkIdleState(t)},500);e.idleTimer=r}stopIdleDetection(t){const e=this.sessions.get(t);e?.idlePollLoop?.stop(),e?.idleTimer&&(clearInterval(e.idleTimer),e.idleTimer=void 0)}checkIdleState(t){const e=this.sessions.get(t);!e||e.adapterSession.status!=="waiting_input"||e.idleCommands?.idleInputCommand&&(this.sendMessage(t,this.toIdlePrompt(e.idleCommands.idleInputCommand)),this.stopIdleDetection(t))}toIdlePrompt(t){const e=t.trim();return this.isMessagePollingIdleCommand(e)?"\u7CFB\u7EDF\u63D0\u9192\uFF1A\u5F53\u524D\u5DE5\u4F5C\u5DF2\u5B8C\u6210\u6216\u8FD0\u884C\u65F6\u5DF2\u8FDB\u5165\u7A7A\u95F2\u72B6\u6001\u3002\u8BF7\u7ACB\u5373\u8C03\u7528 poll_message \u5DE5\u5177\u963B\u585E\u7B49\u5F85\u65B0\u6D88\u606F\u548C\u6D41\u7A0B\u7EBF\u4EFB\u52A1\u63D0\u9192\uFF1B\u6536\u5230\u6D41\u7A0B\u4EFB\u52A1\u63D0\u9192\u540E\u8C03\u7528 my_task \u67E5\u770B\u5DF2\u7531\u540E\u53F0\u9759\u9ED8\u62A2\u5360\u7684\u4EFB\u52A1\u8BE6\u60C5\u5E76\u76F4\u63A5\u5904\u7406\uFF1B\u5B8C\u6210\u4EFB\u52A1\u540E\u8C03\u7528 submit_task_result \u63D0\u4EA4\u7ED3\u679C\uFF0C\u7136\u540E\u7EE7\u7EED poll_message\u3002 \u8C03\u7528 submit_task_result \u65F6\u8BF7\u4E00\u5E76\u4F20\u5165 changeLog\uFF08\u672C\u6B21\u5904\u7406\u7684\u6587\u4EF6/\u5185\u5BB9\u53D8\u66F4\u65E5\u5FD7\uFF0C\u5305\u542B operation \u4E0E path\uFF09\uFF0C\u7528\u4E8E AI \u56DE\u9000\u3002":e}isMessagePollingIdleCommand(t){const e=t.trim();if(!e)return!1;const o=e.toLowerCase();return o.includes("poll_message")||o.includes("get_message")||e.includes("\u53D6\u6D88\u606F")}}export{W as OpencodeSdkAdapter};
4
+