@getpaseo/server 0.1.62 → 0.1.63

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 (464) hide show
  1. package/README.md +4 -0
  2. package/dist/server/client/daemon-client-runtime-metrics.d.ts +6 -6
  3. package/dist/server/client/daemon-client-runtime-metrics.d.ts.map +1 -1
  4. package/dist/server/client/daemon-client-transport-types.d.ts +13 -13
  5. package/dist/server/client/daemon-client-transport-types.d.ts.map +1 -1
  6. package/dist/server/client/daemon-client-websocket-transport.d.ts +1 -1
  7. package/dist/server/client/daemon-client-websocket-transport.d.ts.map +1 -1
  8. package/dist/server/client/daemon-client-websocket-transport.js +5 -4
  9. package/dist/server/client/daemon-client-websocket-transport.js.map +1 -1
  10. package/dist/server/client/daemon-client.d.ts +59 -37
  11. package/dist/server/client/daemon-client.d.ts.map +1 -1
  12. package/dist/server/client/daemon-client.js +62 -17
  13. package/dist/server/client/daemon-client.js.map +1 -1
  14. package/dist/server/server/agent/agent-loading.d.ts.map +1 -1
  15. package/dist/server/server/agent/agent-loading.js +5 -3
  16. package/dist/server/server/agent/agent-loading.js.map +1 -1
  17. package/dist/server/server/agent/agent-manager.d.ts +45 -19
  18. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  19. package/dist/server/server/agent/agent-manager.js +393 -290
  20. package/dist/server/server/agent/agent-manager.js.map +1 -1
  21. package/dist/server/server/agent/agent-metadata-generator.d.ts +6 -6
  22. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
  23. package/dist/server/server/agent/agent-metadata-generator.js +46 -38
  24. package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
  25. package/dist/server/server/agent/agent-projections.d.ts +4 -6
  26. package/dist/server/server/agent/agent-projections.d.ts.map +1 -1
  27. package/dist/server/server/agent/agent-projections.js +59 -65
  28. package/dist/server/server/agent/agent-projections.js.map +1 -1
  29. package/dist/server/server/agent/agent-response-loop.d.ts +4 -4
  30. package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
  31. package/dist/server/server/agent/agent-response-loop.js +58 -45
  32. package/dist/server/server/agent/agent-response-loop.js.map +1 -1
  33. package/dist/server/server/agent/agent-sdk-types.d.ts +43 -40
  34. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  35. package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
  36. package/dist/server/server/agent/agent-storage.d.ts +2 -2
  37. package/dist/server/server/agent/agent-storage.d.ts.map +1 -1
  38. package/dist/server/server/agent/agent-storage.js +29 -36
  39. package/dist/server/server/agent/agent-storage.js.map +1 -1
  40. package/dist/server/server/agent/agent-stream-coalescer.d.ts +6 -6
  41. package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -1
  42. package/dist/server/server/agent/agent-timeline-store-types.d.ts +10 -10
  43. package/dist/server/server/agent/agent-timeline-store-types.d.ts.map +1 -1
  44. package/dist/server/server/agent/agent-timeline-store.d.ts +2 -2
  45. package/dist/server/server/agent/agent-timeline-store.d.ts.map +1 -1
  46. package/dist/server/server/agent/agent-timeline-store.js +85 -64
  47. package/dist/server/server/agent/agent-timeline-store.js.map +1 -1
  48. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  49. package/dist/server/server/agent/mcp-server.js +185 -148
  50. package/dist/server/server/agent/mcp-server.js.map +1 -1
  51. package/dist/server/server/agent/mcp-shared.d.ts +9 -2
  52. package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
  53. package/dist/server/server/agent/mcp-shared.js +2 -0
  54. package/dist/server/server/agent/mcp-shared.js.map +1 -1
  55. package/dist/server/server/agent/model-resolver.d.ts +2 -2
  56. package/dist/server/server/agent/model-resolver.d.ts.map +1 -1
  57. package/dist/server/server/agent/model-resolver.js +9 -5
  58. package/dist/server/server/agent/model-resolver.js.map +1 -1
  59. package/dist/server/server/agent/provider-launch-config.d.ts +28 -17
  60. package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
  61. package/dist/server/server/agent/provider-launch-config.js +20 -9
  62. package/dist/server/server/agent/provider-launch-config.js.map +1 -1
  63. package/dist/server/server/agent/provider-registry.d.ts +4 -2
  64. package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
  65. package/dist/server/server/agent/provider-registry.js +24 -21
  66. package/dist/server/server/agent/provider-registry.js.map +1 -1
  67. package/dist/server/server/agent/provider-snapshot-manager.d.ts +6 -5
  68. package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -1
  69. package/dist/server/server/agent/provider-snapshot-manager.js +40 -31
  70. package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
  71. package/dist/server/server/agent/providers/acp-agent.d.ts +11 -12
  72. package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
  73. package/dist/server/server/agent/providers/acp-agent.js +148 -122
  74. package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
  75. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +2 -0
  76. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts.map +1 -1
  77. package/dist/server/server/agent/providers/claude/sidechain-tracker.js +47 -45
  78. package/dist/server/server/agent/providers/claude/sidechain-tracker.js.map +1 -1
  79. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +2 -2
  80. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -1
  81. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +10 -5
  82. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -1
  83. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -1
  84. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +11 -2
  85. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
  86. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +2 -2
  87. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -1
  88. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +20 -13
  89. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
  90. package/dist/server/server/agent/providers/claude-agent.d.ts +20 -8
  91. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  92. package/dist/server/server/agent/providers/claude-agent.js +610 -460
  93. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  94. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +2 -2
  95. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts.map +1 -1
  96. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +2 -2
  97. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
  98. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +49 -44
  99. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
  100. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +27 -8
  101. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  102. package/dist/server/server/agent/providers/codex-app-server-agent.js +564 -492
  103. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  104. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts +2 -2
  105. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -1
  106. package/dist/server/server/agent/providers/codex-rollout-timeline.js +58 -47
  107. package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -1
  108. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +2 -2
  109. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +1 -1
  110. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +3 -3
  111. package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -1
  112. package/dist/server/server/agent/providers/diagnostic-utils.js +82 -9
  113. package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -1
  114. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +2 -2
  115. package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -1
  116. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -1
  117. package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -1
  118. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +2 -2
  119. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +1 -1
  120. package/dist/server/server/agent/providers/opencode-agent.d.ts +2 -2
  121. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  122. package/dist/server/server/agent/providers/opencode-agent.js +385 -360
  123. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  124. package/dist/server/server/agent/providers/pi-direct-agent.d.ts +1 -0
  125. package/dist/server/server/agent/providers/pi-direct-agent.d.ts.map +1 -1
  126. package/dist/server/server/agent/providers/pi-direct-agent.js +109 -140
  127. package/dist/server/server/agent/providers/pi-direct-agent.js.map +1 -1
  128. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -1
  129. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +3 -1
  130. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -1
  131. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +3 -3
  132. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  133. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +102 -73
  134. package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -1
  135. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +2 -2
  136. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -1
  137. package/dist/server/server/agent/stt-manager.d.ts.map +1 -1
  138. package/dist/server/server/agent/stt-manager.js +63 -53
  139. package/dist/server/server/agent/stt-manager.js.map +1 -1
  140. package/dist/server/server/agent/timeline-projection.d.ts +6 -6
  141. package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
  142. package/dist/server/server/agent/timeline-projection.js +11 -6
  143. package/dist/server/server/agent/timeline-projection.js.map +1 -1
  144. package/dist/server/server/agent/tts-manager.d.ts.map +1 -1
  145. package/dist/server/server/agent/tts-manager.js +1 -0
  146. package/dist/server/server/agent/tts-manager.js.map +1 -1
  147. package/dist/server/server/agent-attention-policy.d.ts +2 -2
  148. package/dist/server/server/agent-attention-policy.d.ts.map +1 -1
  149. package/dist/server/server/bootstrap.d.ts +4 -4
  150. package/dist/server/server/bootstrap.d.ts.map +1 -1
  151. package/dist/server/server/bootstrap.js +493 -485
  152. package/dist/server/server/bootstrap.js.map +1 -1
  153. package/dist/server/server/chat/chat-service.d.ts +1 -1
  154. package/dist/server/server/chat/chat-service.d.ts.map +1 -1
  155. package/dist/server/server/chat/chat-service.js +3 -3
  156. package/dist/server/server/chat/chat-service.js.map +1 -1
  157. package/dist/server/server/checkout-diff-manager.d.ts +2 -2
  158. package/dist/server/server/checkout-diff-manager.d.ts.map +1 -1
  159. package/dist/server/server/checkout-git-utils.d.ts +5 -3
  160. package/dist/server/server/checkout-git-utils.d.ts.map +1 -1
  161. package/dist/server/server/checkout-git-utils.js +1 -2
  162. package/dist/server/server/checkout-git-utils.js.map +1 -1
  163. package/dist/server/server/config.d.ts.map +1 -1
  164. package/dist/server/server/config.js +68 -39
  165. package/dist/server/server/config.js.map +1 -1
  166. package/dist/server/server/connection-offer.d.ts +2 -2
  167. package/dist/server/server/connection-offer.d.ts.map +1 -1
  168. package/dist/server/server/daemon-config-store.d.ts +5 -3
  169. package/dist/server/server/daemon-config-store.d.ts.map +1 -1
  170. package/dist/server/server/daemon-config-store.js +26 -0
  171. package/dist/server/server/daemon-config-store.js.map +1 -1
  172. package/dist/server/server/daemon-keypair.d.ts +2 -2
  173. package/dist/server/server/daemon-keypair.d.ts.map +1 -1
  174. package/dist/server/server/editor-targets.d.ts +4 -4
  175. package/dist/server/server/editor-targets.d.ts.map +1 -1
  176. package/dist/server/server/editor-targets.js +11 -15
  177. package/dist/server/server/editor-targets.js.map +1 -1
  178. package/dist/server/server/exports.d.ts +3 -3
  179. package/dist/server/server/exports.d.ts.map +1 -1
  180. package/dist/server/server/exports.js +1 -3
  181. package/dist/server/server/exports.js.map +1 -1
  182. package/dist/server/server/file-download/token-store.d.ts +4 -4
  183. package/dist/server/server/file-download/token-store.d.ts.map +1 -1
  184. package/dist/server/server/index.js +16 -12
  185. package/dist/server/server/index.js.map +1 -1
  186. package/dist/server/server/logger.d.ts +4 -4
  187. package/dist/server/server/logger.d.ts.map +1 -1
  188. package/dist/server/server/logger.js +26 -20
  189. package/dist/server/server/logger.js.map +1 -1
  190. package/dist/server/server/loop/rpc-schemas.d.ts +52 -52
  191. package/dist/server/server/loop-service.d.ts +13 -12
  192. package/dist/server/server/loop-service.d.ts.map +1 -1
  193. package/dist/server/server/loop-service.js +22 -18
  194. package/dist/server/server/loop-service.js.map +1 -1
  195. package/dist/server/server/package-version.d.ts +2 -2
  196. package/dist/server/server/package-version.d.ts.map +1 -1
  197. package/dist/server/server/package-version.js +19 -17
  198. package/dist/server/server/package-version.js.map +1 -1
  199. package/dist/server/server/pairing-offer.d.ts +2 -2
  200. package/dist/server/server/pairing-offer.d.ts.map +1 -1
  201. package/dist/server/server/paseo-env.d.ts +9 -0
  202. package/dist/server/server/paseo-env.d.ts.map +1 -0
  203. package/dist/server/server/paseo-env.js +70 -0
  204. package/dist/server/server/paseo-env.js.map +1 -0
  205. package/dist/server/server/paseo-worktree-archive-service.d.ts +4 -4
  206. package/dist/server/server/paseo-worktree-archive-service.d.ts.map +1 -1
  207. package/dist/server/server/paseo-worktree-archive-service.js +11 -11
  208. package/dist/server/server/paseo-worktree-archive-service.js.map +1 -1
  209. package/dist/server/server/persisted-config.d.ts +62 -62
  210. package/dist/server/server/persisted-config.d.ts.map +1 -1
  211. package/dist/server/server/persisted-config.js +4 -4
  212. package/dist/server/server/persisted-config.js.map +1 -1
  213. package/dist/server/server/persistence-hooks.d.ts +8 -9
  214. package/dist/server/server/persistence-hooks.d.ts.map +1 -1
  215. package/dist/server/server/persistence-hooks.js +4 -12
  216. package/dist/server/server/persistence-hooks.js.map +1 -1
  217. package/dist/server/server/pid-lock.js.map +1 -1
  218. package/dist/server/server/push/push-service.d.ts.map +1 -1
  219. package/dist/server/server/push/push-service.js +1 -3
  220. package/dist/server/server/push/push-service.js.map +1 -1
  221. package/dist/server/server/relay-transport.d.ts +8 -8
  222. package/dist/server/server/relay-transport.d.ts.map +1 -1
  223. package/dist/server/server/relay-transport.js +27 -16
  224. package/dist/server/server/relay-transport.js.map +1 -1
  225. package/dist/server/server/schedule/service.d.ts.map +1 -1
  226. package/dist/server/server/schedule/service.js +2 -2
  227. package/dist/server/server/schedule/service.js.map +1 -1
  228. package/dist/server/server/script-health-monitor.d.ts.map +1 -1
  229. package/dist/server/server/script-health-monitor.js +7 -6
  230. package/dist/server/server/script-health-monitor.js.map +1 -1
  231. package/dist/server/server/script-proxy.js +1 -1
  232. package/dist/server/server/script-proxy.js.map +1 -1
  233. package/dist/server/server/script-status-projection.d.ts +4 -4
  234. package/dist/server/server/script-status-projection.d.ts.map +1 -1
  235. package/dist/server/server/script-status-projection.js +54 -44
  236. package/dist/server/server/script-status-projection.js.map +1 -1
  237. package/dist/server/server/server-id.d.ts +4 -4
  238. package/dist/server/server/server-id.d.ts.map +1 -1
  239. package/dist/server/server/session.d.ts +45 -14
  240. package/dist/server/server/session.d.ts.map +1 -1
  241. package/dist/server/server/session.js +1098 -761
  242. package/dist/server/server/session.js.map +1 -1
  243. package/dist/server/server/speech/audio.js +1 -1
  244. package/dist/server/server/speech/audio.js.map +1 -1
  245. package/dist/server/server/speech/providers/local/config.d.ts +6 -6
  246. package/dist/server/server/speech/providers/local/config.d.ts.map +1 -1
  247. package/dist/server/server/speech/providers/local/config.js +41 -16
  248. package/dist/server/server/speech/providers/local/config.js.map +1 -1
  249. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts +2 -2
  250. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -1
  251. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +42 -19
  252. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -1
  253. package/dist/server/server/speech/providers/local/runtime.d.ts +4 -4
  254. package/dist/server/server/speech/providers/local/runtime.d.ts.map +1 -1
  255. package/dist/server/server/speech/providers/local/runtime.js +108 -77
  256. package/dist/server/server/speech/providers/local/runtime.js.map +1 -1
  257. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +2 -2
  258. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -1
  259. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +1 -4
  260. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -1
  261. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +2 -2
  262. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -1
  263. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +19 -19
  264. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -1
  265. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +28 -7
  266. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts.map +1 -1
  267. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -1
  268. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts +23 -4
  269. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts.map +1 -1
  270. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +35 -28
  271. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -1
  272. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts +5 -5
  273. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts.map +1 -1
  274. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +7 -7
  275. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +1 -1
  276. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +5 -0
  277. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -1
  278. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts.map +1 -1
  279. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +3 -1
  280. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -1
  281. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +2 -2
  282. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts.map +1 -1
  283. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +3 -1
  284. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -1
  285. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts.map +1 -1
  286. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +10 -4
  287. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -1
  288. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +2 -2
  289. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts.map +1 -1
  290. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts +2 -2
  291. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts.map +1 -1
  292. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +4 -1
  293. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -1
  294. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +2 -2
  295. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts.map +1 -1
  296. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +18 -11
  297. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -1
  298. package/dist/server/server/speech/providers/openai/config.d.ts +2 -2
  299. package/dist/server/server/speech/providers/openai/config.d.ts.map +1 -1
  300. package/dist/server/server/speech/providers/openai/config.js +58 -31
  301. package/dist/server/server/speech/providers/openai/config.js.map +1 -1
  302. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts.map +1 -1
  303. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +2 -2
  304. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js.map +1 -1
  305. package/dist/server/server/speech/providers/openai/runtime.d.ts +4 -4
  306. package/dist/server/server/speech/providers/openai/runtime.d.ts.map +1 -1
  307. package/dist/server/server/speech/providers/openai/runtime.js +37 -32
  308. package/dist/server/server/speech/providers/openai/runtime.js.map +1 -1
  309. package/dist/server/server/speech/providers/openai/stt.d.ts.map +1 -1
  310. package/dist/server/server/speech/providers/openai/stt.js +4 -3
  311. package/dist/server/server/speech/providers/openai/stt.js.map +1 -1
  312. package/dist/server/server/speech/providers/openai/tts.d.ts.map +1 -1
  313. package/dist/server/server/speech/providers/openai/tts.js +3 -2
  314. package/dist/server/server/speech/providers/openai/tts.js.map +1 -1
  315. package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -1
  316. package/dist/server/server/speech/speech-config-resolver.js +46 -17
  317. package/dist/server/server/speech/speech-config-resolver.js.map +1 -1
  318. package/dist/server/server/speech/speech-provider.d.ts +2 -2
  319. package/dist/server/server/speech/speech-provider.d.ts.map +1 -1
  320. package/dist/server/server/speech/speech-runtime.d.ts +6 -6
  321. package/dist/server/server/speech/speech-runtime.d.ts.map +1 -1
  322. package/dist/server/server/speech/speech-runtime.js +17 -17
  323. package/dist/server/server/speech/speech-runtime.js.map +1 -1
  324. package/dist/server/server/speech/speech-types.d.ts +2 -2
  325. package/dist/server/server/speech/speech-types.d.ts.map +1 -1
  326. package/dist/server/server/speech/turn-detection-provider.d.ts +2 -2
  327. package/dist/server/server/speech/turn-detection-provider.d.ts.map +1 -1
  328. package/dist/server/server/utils/diff-highlighter.d.ts +0 -3
  329. package/dist/server/server/utils/diff-highlighter.d.ts.map +1 -1
  330. package/dist/server/server/utils/diff-highlighter.js +67 -66
  331. package/dist/server/server/utils/diff-highlighter.js.map +1 -1
  332. package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -1
  333. package/dist/server/server/voice/voice-turn-controller.js +1 -0
  334. package/dist/server/server/voice/voice-turn-controller.js.map +1 -1
  335. package/dist/server/server/voice-types.d.ts +2 -2
  336. package/dist/server/server/voice-types.d.ts.map +1 -1
  337. package/dist/server/server/websocket-server.d.ts +31 -21
  338. package/dist/server/server/websocket-server.d.ts.map +1 -1
  339. package/dist/server/server/websocket-server.js +299 -197
  340. package/dist/server/server/websocket-server.js.map +1 -1
  341. package/dist/server/server/workspace-git-metadata.d.ts +2 -2
  342. package/dist/server/server/workspace-git-metadata.d.ts.map +1 -1
  343. package/dist/server/server/workspace-git-metadata.js +2 -32
  344. package/dist/server/server/workspace-git-metadata.js.map +1 -1
  345. package/dist/server/server/workspace-git-service.d.ts +8 -4
  346. package/dist/server/server/workspace-git-service.d.ts.map +1 -1
  347. package/dist/server/server/workspace-git-service.js +163 -115
  348. package/dist/server/server/workspace-git-service.js.map +1 -1
  349. package/dist/server/server/workspace-reconciliation-service.d.ts +5 -4
  350. package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -1
  351. package/dist/server/server/workspace-reconciliation-service.js +82 -82
  352. package/dist/server/server/workspace-reconciliation-service.js.map +1 -1
  353. package/dist/server/server/workspace-registry-bootstrap.d.ts.map +1 -1
  354. package/dist/server/server/workspace-registry-bootstrap.js +40 -33
  355. package/dist/server/server/workspace-registry-bootstrap.js.map +1 -1
  356. package/dist/server/server/workspace-registry-model.d.ts +19 -6
  357. package/dist/server/server/workspace-registry-model.d.ts.map +1 -1
  358. package/dist/server/server/workspace-registry-model.js +35 -21
  359. package/dist/server/server/workspace-registry-model.js.map +1 -1
  360. package/dist/server/server/workspace-registry.d.ts +2 -2
  361. package/dist/server/server/workspace-script-runtime-store.d.ts +2 -2
  362. package/dist/server/server/workspace-script-runtime-store.d.ts.map +1 -1
  363. package/dist/server/server/workspace-service-env.js +3 -3
  364. package/dist/server/server/workspace-service-env.js.map +1 -1
  365. package/dist/server/server/worktree-bootstrap.d.ts +4 -4
  366. package/dist/server/server/worktree-bootstrap.d.ts.map +1 -1
  367. package/dist/server/server/worktree-bootstrap.js +95 -67
  368. package/dist/server/server/worktree-bootstrap.js.map +1 -1
  369. package/dist/server/server/worktree-session.d.ts +8 -8
  370. package/dist/server/server/worktree-session.d.ts.map +1 -1
  371. package/dist/server/server/worktree-session.js +27 -19
  372. package/dist/server/server/worktree-session.js.map +1 -1
  373. package/dist/server/services/github-service.d.ts +1 -7
  374. package/dist/server/services/github-service.d.ts.map +1 -1
  375. package/dist/server/services/github-service.js +123 -143
  376. package/dist/server/services/github-service.js.map +1 -1
  377. package/dist/server/shared/agent-attention-notification.d.ts +9 -8
  378. package/dist/server/shared/agent-attention-notification.d.ts.map +1 -1
  379. package/dist/server/shared/agent-attention-notification.js +27 -17
  380. package/dist/server/shared/agent-attention-notification.js.map +1 -1
  381. package/dist/server/shared/daemon-endpoints.d.ts +2 -2
  382. package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
  383. package/dist/server/shared/daemon-endpoints.js +17 -2
  384. package/dist/server/shared/daemon-endpoints.js.map +1 -1
  385. package/dist/server/shared/messages.d.ts +21962 -3049
  386. package/dist/server/shared/messages.d.ts.map +1 -1
  387. package/dist/server/shared/messages.js +79 -2
  388. package/dist/server/shared/messages.js.map +1 -1
  389. package/dist/server/shared/terminal-stream-protocol.d.ts +2 -2
  390. package/dist/server/shared/terminal-stream-protocol.d.ts.map +1 -1
  391. package/dist/server/shared/tool-call-display.d.ts +2 -2
  392. package/dist/server/shared/tool-call-display.d.ts.map +1 -1
  393. package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
  394. package/dist/server/terminal/terminal-manager.js +1 -3
  395. package/dist/server/terminal/terminal-manager.js.map +1 -1
  396. package/dist/server/terminal/terminal-output-coalescer.d.ts +6 -6
  397. package/dist/server/terminal/terminal-output-coalescer.d.ts.map +1 -1
  398. package/dist/server/terminal/terminal.d.ts +3 -2
  399. package/dist/server/terminal/terminal.d.ts.map +1 -1
  400. package/dist/server/terminal/terminal.js +57 -19
  401. package/dist/server/terminal/terminal.js.map +1 -1
  402. package/dist/server/utils/checkout-git.d.ts +13 -12
  403. package/dist/server/utils/checkout-git.d.ts.map +1 -1
  404. package/dist/server/utils/checkout-git.js +351 -281
  405. package/dist/server/utils/checkout-git.js.map +1 -1
  406. package/dist/server/utils/directory-suggestions.js +12 -33
  407. package/dist/server/utils/directory-suggestions.js.map +1 -1
  408. package/dist/server/utils/executable.d.ts +1 -14
  409. package/dist/server/utils/executable.d.ts.map +1 -1
  410. package/dist/server/utils/executable.js +13 -49
  411. package/dist/server/utils/executable.js.map +1 -1
  412. package/dist/server/utils/github-remote.d.ts +13 -0
  413. package/dist/server/utils/github-remote.d.ts.map +1 -0
  414. package/dist/server/utils/github-remote.js +128 -0
  415. package/dist/server/utils/github-remote.js.map +1 -0
  416. package/dist/server/utils/paseo-config-file.d.ts +30 -0
  417. package/dist/server/utils/paseo-config-file.d.ts.map +1 -0
  418. package/dist/server/utils/paseo-config-file.js +90 -0
  419. package/dist/server/utils/paseo-config-file.js.map +1 -0
  420. package/dist/server/utils/paseo-config-schema.d.ts +290 -0
  421. package/dist/server/utils/paseo-config-schema.d.ts.map +1 -0
  422. package/dist/server/utils/paseo-config-schema.js +60 -0
  423. package/dist/server/utils/paseo-config-schema.js.map +1 -0
  424. package/dist/server/utils/project-icon.d.ts.map +1 -1
  425. package/dist/server/utils/project-icon.js +84 -109
  426. package/dist/server/utils/project-icon.js.map +1 -1
  427. package/dist/server/utils/promise-timeout.d.ts +2 -2
  428. package/dist/server/utils/promise-timeout.d.ts.map +1 -1
  429. package/dist/server/utils/run-git-command.d.ts +3 -1
  430. package/dist/server/utils/run-git-command.d.ts.map +1 -1
  431. package/dist/server/utils/run-git-command.js +10 -1
  432. package/dist/server/utils/run-git-command.js.map +1 -1
  433. package/dist/server/utils/script-hostname.d.ts +2 -2
  434. package/dist/server/utils/script-hostname.d.ts.map +1 -1
  435. package/dist/server/utils/spawn.d.ts +10 -3
  436. package/dist/server/utils/spawn.d.ts.map +1 -1
  437. package/dist/server/utils/spawn.js +30 -5
  438. package/dist/server/utils/spawn.js.map +1 -1
  439. package/dist/server/utils/windows-command.d.ts +15 -0
  440. package/dist/server/utils/windows-command.d.ts.map +1 -0
  441. package/dist/server/utils/windows-command.js +37 -0
  442. package/dist/server/utils/windows-command.js.map +1 -0
  443. package/dist/server/utils/worktree.d.ts +10 -7
  444. package/dist/server/utils/worktree.d.ts.map +1 -1
  445. package/dist/server/utils/worktree.js +64 -55
  446. package/dist/server/utils/worktree.js.map +1 -1
  447. package/dist/src/server/pid-lock.js.map +1 -1
  448. package/package.json +15 -20
  449. package/dist/server/server/agent/llm-openai.d.ts +0 -7
  450. package/dist/server/server/agent/llm-openai.d.ts.map +0 -1
  451. package/dist/server/server/agent/llm-openai.js +0 -8
  452. package/dist/server/server/agent/llm-openai.js.map +0 -1
  453. package/dist/server/server/agent/orchestrator.d.ts +0 -12
  454. package/dist/server/server/agent/orchestrator.d.ts.map +0 -1
  455. package/dist/server/server/agent/orchestrator.js +0 -12
  456. package/dist/server/server/agent/orchestrator.js.map +0 -1
  457. package/dist/server/server/types.d.ts +0 -5
  458. package/dist/server/server/types.d.ts.map +0 -1
  459. package/dist/server/server/types.js +0 -3
  460. package/dist/server/server/types.js.map +0 -1
  461. package/dist/server/server/workspace-registry.test-helpers.d.ts +0 -37
  462. package/dist/server/server/workspace-registry.test-helpers.d.ts.map +0 -1
  463. package/dist/server/server/workspace-registry.test-helpers.js +0 -121
  464. package/dist/server/server/workspace-registry.test-helpers.js.map +0 -1
@@ -2,7 +2,7 @@ import { homedir } from "node:os";
2
2
  import { createOpencodeClient, } from "@opencode-ai/sdk/v2/client";
3
3
  import net from "node:net";
4
4
  import { z } from "zod";
5
- import { applyProviderEnv, resolveProviderCommandPrefix, } from "../provider-launch-config.js";
5
+ import { createProviderEnvSpec, resolveProviderCommandPrefix, } from "../provider-launch-config.js";
6
6
  import { findExecutable, isCommandAvailable } from "../../../utils/executable.js";
7
7
  import { withTimeout } from "../../../utils/promise-timeout.js";
8
8
  import { spawnProcess } from "../../../utils/spawn.js";
@@ -140,20 +140,18 @@ function toOpenCodeMcpConfig(config) {
140
140
  enabled: true,
141
141
  };
142
142
  }
143
- function stringifyUnknownError(error) {
144
- if (typeof error === "string") {
145
- return error;
146
- }
147
- try {
148
- return JSON.stringify(error);
143
+ function toTerminalTurnEvent(event) {
144
+ if (event.type === "turn_failed") {
145
+ return {
146
+ type: "turn_failed",
147
+ provider: "opencode",
148
+ error: toDiagnosticErrorMessage(event.error),
149
+ };
149
150
  }
150
- catch {
151
- return String(error);
151
+ if (event.type === "turn_completed" || event.type === "turn_canceled") {
152
+ return event;
152
153
  }
153
- }
154
- function normalizeTurnFailureError(error) {
155
- const normalized = stringifyUnknownError(error).trim();
156
- return normalized.length > 0 ? normalized : "Unknown error";
154
+ return null;
157
155
  }
158
156
  function isOpenCodeNotFoundError(error) {
159
157
  return (typeof error === "object" &&
@@ -171,14 +169,14 @@ async function reconcileOpenCodeSessionClose(params) {
171
169
  if (response.error && !isOpenCodeNotFoundError(response.error)) {
172
170
  logger.warn({
173
171
  sessionId,
174
- error: normalizeTurnFailureError(response.error),
172
+ error: toDiagnosticErrorMessage(response.error),
175
173
  }, "Failed to abort OpenCode session during close");
176
174
  }
177
175
  }
178
176
  catch (error) {
179
177
  logger.warn({
180
178
  sessionId,
181
- error: normalizeTurnFailureError(error),
179
+ error: toDiagnosticErrorMessage(error),
182
180
  }, "Failed to abort OpenCode session during close");
183
181
  }
184
182
  try {
@@ -190,14 +188,14 @@ async function reconcileOpenCodeSessionClose(params) {
190
188
  if (response.error && !isOpenCodeNotFoundError(response.error)) {
191
189
  logger.warn({
192
190
  sessionId,
193
- error: normalizeTurnFailureError(response.error),
191
+ error: toDiagnosticErrorMessage(response.error),
194
192
  }, "Failed to archive OpenCode session during close");
195
193
  }
196
194
  }
197
195
  catch (error) {
198
196
  logger.warn({
199
197
  sessionId,
200
- error: normalizeTurnFailureError(error),
198
+ error: toDiagnosticErrorMessage(error),
201
199
  }, "Failed to archive OpenCode session during close");
202
200
  }
203
201
  }
@@ -216,18 +214,19 @@ function isOpenCodeHeadersTimeoutFailure(error) {
216
214
  if (!current) {
217
215
  continue;
218
216
  }
219
- const normalized = stringifyUnknownError(current).trim().toLowerCase();
217
+ const normalized = toDiagnosticErrorMessage(current).trim().toLowerCase();
220
218
  if (normalized) {
221
219
  diagnostics.add(normalized);
222
220
  }
223
221
  if (typeof current === "object") {
224
222
  const record = current;
225
223
  for (const value of [record.message, record.code, record.name]) {
226
- if (typeof value === "string") {
227
- const diagnostic = value.trim().toLowerCase();
228
- if (diagnostic) {
229
- diagnostics.add(diagnostic);
230
- }
224
+ if (typeof value !== "string") {
225
+ continue;
226
+ }
227
+ const diagnostic = value.trim().toLowerCase();
228
+ if (diagnostic) {
229
+ diagnostics.add(diagnostic);
231
230
  }
232
231
  }
233
232
  if (record.cause) {
@@ -238,7 +237,7 @@ function isOpenCodeHeadersTimeoutFailure(error) {
238
237
  return [...diagnostics].some((diagnostic) => OPENCODE_HEADERS_TIMEOUT_TOKENS.some((token) => diagnostic.includes(token)));
239
238
  }
240
239
  function isAlreadyPresentMcpError(error) {
241
- const normalized = stringifyUnknownError(error).toLowerCase();
240
+ const normalized = toDiagnosticErrorMessage(error).toLowerCase();
242
241
  return MCP_ALREADY_PRESENT_ERROR_TOKENS.some((token) => normalized.includes(token));
243
242
  }
244
243
  async function findAvailablePort() {
@@ -602,16 +601,39 @@ export class OpenCodeServerManager {
602
601
  return new Promise((resolve, reject) => {
603
602
  const serverProcess = spawnProcess(launchPrefix.command, [...launchPrefix.args, "serve", "--port", String(port)], {
604
603
  stdio: ["ignore", "pipe", "pipe"],
605
- env: applyProviderEnv(process.env, this.runtimeSettings),
604
+ ...createProviderEnvSpec({ runtimeSettings: this.runtimeSettings }),
606
605
  });
607
606
  let started = false;
607
+ let stderrBuffer = "";
608
+ let stdoutBuffer = "";
609
+ const STARTUP_BUFFER_CAP = 8192;
610
+ const appendCapped = (current, chunk) => {
611
+ if (current.length >= STARTUP_BUFFER_CAP) {
612
+ return current;
613
+ }
614
+ const remaining = STARTUP_BUFFER_CAP - current.length;
615
+ return current + chunk.slice(0, remaining);
616
+ };
617
+ const buildStartupErrorMessage = (headline) => {
618
+ const sections = [headline];
619
+ const stderrTrimmed = stderrBuffer.trim();
620
+ if (stderrTrimmed.length > 0) {
621
+ sections.push(`stderr: ${stderrTrimmed}`);
622
+ }
623
+ const stdoutTrimmed = stdoutBuffer.trim();
624
+ if (stdoutTrimmed.length > 0) {
625
+ sections.push(`stdout: ${stdoutTrimmed}`);
626
+ }
627
+ return sections.join("\n");
628
+ };
608
629
  const timeout = setTimeout(() => {
609
630
  if (!started) {
610
- reject(new Error("OpenCode server startup timeout"));
631
+ reject(new Error(buildStartupErrorMessage("OpenCode server startup timeout")));
611
632
  }
612
633
  }, 30000);
613
634
  serverProcess.stdout?.on("data", (data) => {
614
635
  const output = data.toString();
636
+ stdoutBuffer = appendCapped(stdoutBuffer, output);
615
637
  if (output.includes("listening on") && !started) {
616
638
  started = true;
617
639
  clearTimeout(timeout);
@@ -625,16 +647,19 @@ export class OpenCodeServerManager {
625
647
  }
626
648
  });
627
649
  serverProcess.stderr?.on("data", (data) => {
628
- this.logger.error({ stderr: data.toString().trim() }, "OpenCode server stderr");
650
+ const output = data.toString();
651
+ stderrBuffer = appendCapped(stderrBuffer, output);
652
+ this.logger.error({ stderr: output.trim() }, "OpenCode server stderr");
629
653
  });
630
654
  serverProcess.on("error", (error) => {
631
655
  clearTimeout(timeout);
632
- reject(error);
656
+ const headline = error instanceof Error ? error.message : String(error);
657
+ reject(new Error(buildStartupErrorMessage(headline)));
633
658
  });
634
659
  serverProcess.on("exit", (code) => {
635
660
  if (!started) {
636
661
  clearTimeout(timeout);
637
- reject(new Error(`OpenCode server exited with code ${code}`));
662
+ reject(new Error(buildStartupErrorMessage(`OpenCode server exited with code ${code}`)));
638
663
  }
639
664
  if (this.currentServer?.process === serverProcess) {
640
665
  this.currentServer = null;
@@ -652,9 +677,7 @@ export class OpenCodeServerManager {
652
677
  ...(this.currentServer ? [this.currentServer] : []),
653
678
  ...Array.from(this.retiredServers),
654
679
  ];
655
- for (const server of servers) {
656
- await this.killServer(server);
657
- }
680
+ await Promise.all(servers.map((server) => this.killServer(server)));
658
681
  this.currentServer = null;
659
682
  this.retiredServers.clear();
660
683
  }
@@ -671,13 +694,21 @@ export class OpenCodeServerManager {
671
694
  return;
672
695
  }
673
696
  await new Promise((resolve) => {
697
+ let pendingResolve = resolve;
698
+ const settle = () => {
699
+ if (!pendingResolve)
700
+ return;
701
+ const fn = pendingResolve;
702
+ pendingResolve = null;
703
+ fn();
704
+ };
674
705
  const timeout = setTimeout(() => {
675
706
  server.process.kill("SIGKILL");
676
- resolve();
707
+ settle();
677
708
  }, 5000);
678
709
  server.process.on("exit", () => {
679
710
  clearTimeout(timeout);
680
- resolve();
711
+ settle();
681
712
  });
682
713
  server.process.kill("SIGTERM");
683
714
  });
@@ -839,7 +870,7 @@ export class OpenCodeAgentClient {
839
870
  serverStatus = `Running (${url})`;
840
871
  }
841
872
  catch (error) {
842
- serverStatus = `Unavailable (${normalizeTurnFailureError(error)})`;
873
+ serverStatus = `Unavailable (${toDiagnosticErrorMessage(error)})`;
843
874
  }
844
875
  if (available) {
845
876
  try {
@@ -1039,310 +1070,316 @@ export function translateOpenCodeEvent(event, state) {
1039
1070
  const events = [];
1040
1071
  switch (event.type) {
1041
1072
  case "session.created":
1042
- case "session.updated": {
1043
- if (event.properties.info.id === state.sessionId) {
1044
- events.push({
1045
- type: "thread_started",
1046
- sessionId: state.sessionId,
1047
- provider: "opencode",
1048
- });
1049
- }
1050
- break;
1051
- }
1052
- case "message.updated": {
1053
- const info = event.properties.info;
1054
- if (info.sessionID !== state.sessionId) {
1055
- break;
1056
- }
1057
- state.messageRoles.set(info.id, info.role);
1058
- if (info.role === "assistant") {
1059
- const modelLookupKey = resolveOpenCodeModelLookupKeyFromAssistantMessage(info);
1060
- if (modelLookupKey) {
1061
- const contextWindowMaxTokens = state.modelContextWindowsByModelKey?.get(modelLookupKey);
1062
- if (contextWindowMaxTokens !== undefined) {
1063
- state.onAssistantModelContextWindowResolved?.(contextWindowMaxTokens);
1064
- }
1065
- }
1066
- if (!state.emittedStructuredMessageIds.has(info.id) && info.time?.completed !== undefined) {
1067
- const text = stringifyStructuredAssistantMessage(info.structured);
1068
- if (text) {
1069
- state.emittedStructuredMessageIds.add(info.id);
1070
- events.push({
1071
- type: "timeline",
1072
- provider: "opencode",
1073
- item: { type: "assistant_message", text },
1074
- });
1075
- }
1076
- }
1077
- }
1078
- break;
1079
- }
1080
- case "message.part.updated": {
1081
- const part = event.properties.part;
1082
- if (part.sessionID !== state.sessionId) {
1083
- break;
1084
- }
1085
- const messageRole = state.messageRoles.get(part.messageID);
1086
- state.partTypes.set(part.id, part.type);
1087
- if (part.type === "text") {
1088
- const partKey = resolvePartDedupeKey(part, "text");
1089
- if (messageRole === "user") {
1090
- break;
1091
- }
1092
- if (part.time?.end) {
1093
- if (partKey && state.streamedPartKeys.delete(partKey)) {
1094
- break;
1095
- }
1096
- if (part.text) {
1097
- events.push({
1098
- type: "timeline",
1099
- provider: "opencode",
1100
- item: { type: "assistant_message", text: part.text },
1101
- });
1102
- }
1103
- }
1104
- }
1105
- else if (part.type === "reasoning") {
1106
- const partKey = resolvePartDedupeKey(part, "reasoning");
1107
- if (part.time.end) {
1108
- if (partKey && state.streamedPartKeys.delete(partKey)) {
1109
- break;
1110
- }
1111
- if (part.text) {
1112
- events.push({
1113
- type: "timeline",
1114
- provider: "opencode",
1115
- item: { type: "reasoning", text: part.text },
1116
- });
1117
- }
1118
- }
1119
- }
1120
- else if (part.type === "tool") {
1121
- const parsedToolPart = OpencodeToolPartToTimelineItemSchema.safeParse(part);
1122
- if (parsedToolPart.success && parsedToolPart.data) {
1123
- events.push({
1124
- type: "timeline",
1125
- provider: "opencode",
1126
- item: parsedToolPart.data,
1127
- });
1128
- }
1129
- }
1130
- else if (part.type === "compaction") {
1131
- events.push({
1132
- type: "timeline",
1133
- provider: "opencode",
1134
- item: createCompactionTimelineItem("loading", part.auto ? "auto" : "manual"),
1135
- });
1136
- }
1137
- else if (part.type === "step-finish") {
1138
- mergeOpenCodeStepFinishUsage(state.accumulatedUsage, part);
1139
- if (hasNormalizedOpenCodeUsage(state.accumulatedUsage)) {
1140
- events.push({
1141
- type: "usage_updated",
1142
- provider: "opencode",
1143
- usage: { ...state.accumulatedUsage },
1144
- });
1145
- }
1146
- }
1073
+ case "session.updated":
1074
+ appendOpenCodeSessionCreatedOrUpdated(event, state, events);
1147
1075
  break;
1148
- }
1149
- case "message.part.delta": {
1150
- const { sessionID, messageID, partID, field, delta } = event.properties;
1151
- if (sessionID !== state.sessionId) {
1152
- break;
1153
- }
1154
- if (!delta || !field) {
1155
- break;
1156
- }
1157
- const messageRole = messageID ? state.messageRoles.get(messageID) : undefined;
1158
- const knownPartType = partID ? state.partTypes.get(partID) : undefined;
1159
- const isReasoning = knownPartType === "reasoning" || field === "reasoning";
1160
- if (isReasoning) {
1161
- if (partID) {
1162
- state.streamedPartKeys.add(`reasoning:${partID}`);
1163
- }
1164
- events.push({
1165
- type: "timeline",
1166
- provider: "opencode",
1167
- item: { type: "reasoning", text: delta },
1168
- });
1169
- }
1170
- else if (field === "text") {
1171
- if (messageRole === "user") {
1172
- break;
1173
- }
1174
- if (partID) {
1175
- state.streamedPartKeys.add(`text:${partID}`);
1176
- }
1177
- events.push({
1178
- type: "timeline",
1179
- provider: "opencode",
1180
- item: { type: "assistant_message", text: delta },
1181
- });
1182
- }
1076
+ case "message.updated":
1077
+ appendOpenCodeMessageUpdated(event, state, events);
1183
1078
  break;
1184
- }
1185
- case "permission.asked": {
1186
- if (event.properties.sessionID !== state.sessionId) {
1187
- break;
1188
- }
1189
- const metadata = readOpenCodeRecord(event.properties.metadata);
1190
- const tool = readOpenCodeRecord(event.properties.tool);
1191
- const patterns = Array.isArray(event.properties.patterns)
1192
- ? event.properties.patterns.filter((value) => typeof value === "string")
1193
- : [];
1194
- const command = readPermissionField(metadata, PERMISSION_COMMAND_KEYS);
1195
- const cwd = readPermissionField(metadata, PERMISSION_CWD_KEYS);
1196
- const reason = readPermissionField(metadata, PERMISSION_REASON_KEYS);
1197
- const input = buildOpenCodePermissionInput({
1198
- patterns,
1199
- metadata,
1200
- tool,
1201
- command,
1202
- });
1203
- const detail = buildOpenCodePermissionDetail({
1204
- permission: event.properties.permission,
1205
- input,
1206
- command,
1207
- cwd,
1208
- });
1209
- const description = buildOpenCodePermissionDescription({
1210
- reason,
1211
- patterns,
1212
- });
1213
- events.push({
1214
- type: "permission_requested",
1215
- provider: "opencode",
1216
- request: {
1217
- id: event.properties.id,
1218
- provider: "opencode",
1219
- name: event.properties.permission,
1220
- kind: "tool",
1221
- title: toHumanReadablePermissionTitle(event.properties.permission),
1222
- ...(description ? { description } : {}),
1223
- input,
1224
- detail,
1225
- },
1226
- });
1079
+ case "message.part.updated":
1080
+ appendOpenCodeMessagePartUpdated(event, state, events);
1227
1081
  break;
1228
- }
1229
- case "question.asked": {
1230
- if (event.properties.sessionID !== state.sessionId) {
1231
- break;
1232
- }
1233
- const questions = event.properties.questions.flatMap((q) => {
1234
- if (!q.question || !q.header) {
1235
- return [];
1236
- }
1237
- const options = q.options?.map((o) => ({
1238
- label: o.label,
1239
- ...(o.description ? { description: o.description } : {}),
1240
- })) ?? [];
1241
- return [
1242
- {
1243
- question: q.question,
1244
- header: q.header,
1245
- options,
1246
- ...(q.multiple === true ? { multiSelect: true } : {}),
1247
- },
1248
- ];
1249
- });
1250
- if (questions.length === 0) {
1251
- break;
1252
- }
1253
- events.push({
1254
- type: "permission_requested",
1255
- provider: "opencode",
1256
- request: {
1257
- id: event.properties.id,
1258
- provider: "opencode",
1259
- name: "question",
1260
- kind: "question",
1261
- title: "Question",
1262
- input: { questions },
1263
- metadata: {
1264
- source: "opencode_question",
1265
- ...(event.properties.tool ?? {}),
1266
- },
1267
- },
1268
- });
1082
+ case "message.part.delta":
1083
+ appendOpenCodeMessagePartDelta(event, state, events);
1269
1084
  break;
1270
- }
1271
- case "todo.updated": {
1272
- if (event.properties.sessionID !== state.sessionId) {
1273
- break;
1274
- }
1275
- events.push({
1276
- type: "timeline",
1277
- provider: "opencode",
1278
- item: mapOpenCodeTodosToTimelineItems(event.properties.todos),
1279
- });
1085
+ case "permission.asked":
1086
+ appendOpenCodePermissionAsked(event, state, events);
1280
1087
  break;
1281
- }
1282
- case "session.compacted": {
1283
- if (event.properties.sessionID !== state.sessionId) {
1284
- break;
1285
- }
1286
- events.push({
1287
- type: "timeline",
1288
- provider: "opencode",
1289
- item: createCompactionTimelineItem("completed"),
1290
- });
1088
+ case "question.asked":
1089
+ appendOpenCodeQuestionAsked(event, state, events);
1291
1090
  break;
1292
- }
1293
- case "session.idle": {
1091
+ case "todo.updated":
1294
1092
  if (event.properties.sessionID === state.sessionId) {
1295
- state.streamedPartKeys.clear();
1296
- state.partTypes.clear();
1297
1093
  events.push({
1298
- type: "turn_completed",
1094
+ type: "timeline",
1299
1095
  provider: "opencode",
1300
- usage: undefined,
1096
+ item: mapOpenCodeTodosToTimelineItems(event.properties.todos),
1301
1097
  });
1302
1098
  }
1303
1099
  break;
1304
- }
1305
- case "session.error": {
1100
+ case "session.compacted":
1306
1101
  if (event.properties.sessionID === state.sessionId) {
1307
- state.streamedPartKeys.clear();
1308
- state.partTypes.clear();
1309
1102
  events.push({
1310
- type: "turn_failed",
1103
+ type: "timeline",
1311
1104
  provider: "opencode",
1312
- error: normalizeTurnFailureError(event.properties.error),
1105
+ item: createCompactionTimelineItem("completed"),
1313
1106
  });
1314
1107
  }
1315
1108
  break;
1316
- }
1317
- case "session.status": {
1318
- if (event.properties.sessionID !== state.sessionId) {
1319
- break;
1320
- }
1321
- const { status } = event.properties;
1322
- if (status.type === "idle") {
1323
- state.streamedPartKeys.clear();
1324
- state.partTypes.clear();
1325
- events.push({
1326
- type: "turn_completed",
1327
- provider: "opencode",
1328
- usage: undefined,
1329
- });
1109
+ case "session.idle":
1110
+ if (event.properties.sessionID === state.sessionId) {
1111
+ resetOpenCodeTurnTrackingState(state);
1112
+ events.push({ type: "turn_completed", provider: "opencode", usage: undefined });
1330
1113
  }
1331
- else if (status.type === "retry" && isFatalOpenCodeRetryMessage(status.message)) {
1332
- state.streamedPartKeys.clear();
1333
- state.partTypes.clear();
1114
+ break;
1115
+ case "session.error":
1116
+ if (event.properties.sessionID === state.sessionId) {
1117
+ resetOpenCodeTurnTrackingState(state);
1334
1118
  events.push({
1335
1119
  type: "turn_failed",
1336
1120
  provider: "opencode",
1337
- error: normalizeTurnFailureError(status.message),
1121
+ error: toDiagnosticErrorMessage(event.properties.error),
1338
1122
  });
1339
1123
  }
1340
- // "retry" and "busy" are transient — no terminal event.
1341
1124
  break;
1342
- }
1125
+ case "session.status":
1126
+ appendOpenCodeSessionStatus(event, state, events);
1127
+ break;
1343
1128
  }
1344
1129
  return events;
1345
1130
  }
1131
+ function resetOpenCodeTurnTrackingState(state) {
1132
+ state.streamedPartKeys.clear();
1133
+ state.partTypes.clear();
1134
+ }
1135
+ function appendOpenCodeSessionCreatedOrUpdated(event, state, events) {
1136
+ if (event.properties.info.id === state.sessionId) {
1137
+ events.push({
1138
+ type: "thread_started",
1139
+ sessionId: state.sessionId,
1140
+ provider: "opencode",
1141
+ });
1142
+ }
1143
+ }
1144
+ function appendOpenCodeMessageUpdated(event, state, events) {
1145
+ const info = event.properties.info;
1146
+ if (info.sessionID !== state.sessionId) {
1147
+ return;
1148
+ }
1149
+ state.messageRoles.set(info.id, info.role);
1150
+ if (info.role !== "assistant") {
1151
+ return;
1152
+ }
1153
+ const modelLookupKey = resolveOpenCodeModelLookupKeyFromAssistantMessage(info);
1154
+ if (modelLookupKey) {
1155
+ const contextWindowMaxTokens = state.modelContextWindowsByModelKey?.get(modelLookupKey);
1156
+ if (contextWindowMaxTokens !== undefined) {
1157
+ state.onAssistantModelContextWindowResolved?.(contextWindowMaxTokens);
1158
+ }
1159
+ }
1160
+ if (state.emittedStructuredMessageIds.has(info.id) || info.time?.completed === undefined) {
1161
+ return;
1162
+ }
1163
+ const text = stringifyStructuredAssistantMessage(info.structured);
1164
+ if (!text) {
1165
+ return;
1166
+ }
1167
+ state.emittedStructuredMessageIds.add(info.id);
1168
+ events.push({
1169
+ type: "timeline",
1170
+ provider: "opencode",
1171
+ item: { type: "assistant_message", text },
1172
+ });
1173
+ }
1174
+ function appendOpenCodeMessagePartUpdated(event, state, events) {
1175
+ const part = event.properties.part;
1176
+ if (part.sessionID !== state.sessionId) {
1177
+ return;
1178
+ }
1179
+ const messageRole = state.messageRoles.get(part.messageID);
1180
+ state.partTypes.set(part.id, part.type);
1181
+ if (part.type === "text") {
1182
+ appendOpenCodeTextPart(part, messageRole, state, events);
1183
+ return;
1184
+ }
1185
+ if (part.type === "reasoning") {
1186
+ appendOpenCodeReasoningPart(part, state, events);
1187
+ return;
1188
+ }
1189
+ if (part.type === "tool") {
1190
+ const parsedToolPart = OpencodeToolPartToTimelineItemSchema.safeParse(part);
1191
+ if (parsedToolPart.success && parsedToolPart.data) {
1192
+ events.push({ type: "timeline", provider: "opencode", item: parsedToolPart.data });
1193
+ }
1194
+ return;
1195
+ }
1196
+ if (part.type === "compaction") {
1197
+ events.push({
1198
+ type: "timeline",
1199
+ provider: "opencode",
1200
+ item: createCompactionTimelineItem("loading", part.auto ? "auto" : "manual"),
1201
+ });
1202
+ return;
1203
+ }
1204
+ if (part.type === "step-finish") {
1205
+ mergeOpenCodeStepFinishUsage(state.accumulatedUsage, part);
1206
+ if (hasNormalizedOpenCodeUsage(state.accumulatedUsage)) {
1207
+ events.push({
1208
+ type: "usage_updated",
1209
+ provider: "opencode",
1210
+ usage: { ...state.accumulatedUsage },
1211
+ });
1212
+ }
1213
+ }
1214
+ }
1215
+ function appendOpenCodeTextPart(part, messageRole, state, events) {
1216
+ if (messageRole === "user") {
1217
+ return;
1218
+ }
1219
+ if (!part.time?.end) {
1220
+ return;
1221
+ }
1222
+ const partKey = resolvePartDedupeKey(part, "text");
1223
+ if (partKey && state.streamedPartKeys.delete(partKey)) {
1224
+ return;
1225
+ }
1226
+ if (part.text) {
1227
+ events.push({
1228
+ type: "timeline",
1229
+ provider: "opencode",
1230
+ item: { type: "assistant_message", text: part.text },
1231
+ });
1232
+ }
1233
+ }
1234
+ function appendOpenCodeReasoningPart(part, state, events) {
1235
+ if (!part.time.end) {
1236
+ return;
1237
+ }
1238
+ const partKey = resolvePartDedupeKey(part, "reasoning");
1239
+ if (partKey && state.streamedPartKeys.delete(partKey)) {
1240
+ return;
1241
+ }
1242
+ if (part.text) {
1243
+ events.push({
1244
+ type: "timeline",
1245
+ provider: "opencode",
1246
+ item: { type: "reasoning", text: part.text },
1247
+ });
1248
+ }
1249
+ }
1250
+ function appendOpenCodeMessagePartDelta(event, state, events) {
1251
+ const { sessionID, messageID, partID, field, delta } = event.properties;
1252
+ if (sessionID !== state.sessionId) {
1253
+ return;
1254
+ }
1255
+ if (!delta || !field) {
1256
+ return;
1257
+ }
1258
+ const messageRole = messageID ? state.messageRoles.get(messageID) : undefined;
1259
+ const knownPartType = partID ? state.partTypes.get(partID) : undefined;
1260
+ const isReasoning = knownPartType === "reasoning" || field === "reasoning";
1261
+ if (isReasoning) {
1262
+ if (partID) {
1263
+ state.streamedPartKeys.add(`reasoning:${partID}`);
1264
+ }
1265
+ events.push({
1266
+ type: "timeline",
1267
+ provider: "opencode",
1268
+ item: { type: "reasoning", text: delta },
1269
+ });
1270
+ return;
1271
+ }
1272
+ if (field !== "text") {
1273
+ return;
1274
+ }
1275
+ if (messageRole === "user") {
1276
+ return;
1277
+ }
1278
+ if (partID) {
1279
+ state.streamedPartKeys.add(`text:${partID}`);
1280
+ }
1281
+ events.push({
1282
+ type: "timeline",
1283
+ provider: "opencode",
1284
+ item: { type: "assistant_message", text: delta },
1285
+ });
1286
+ }
1287
+ function appendOpenCodePermissionAsked(event, state, events) {
1288
+ if (event.properties.sessionID !== state.sessionId) {
1289
+ return;
1290
+ }
1291
+ const metadata = readOpenCodeRecord(event.properties.metadata);
1292
+ const tool = readOpenCodeRecord(event.properties.tool);
1293
+ const patterns = Array.isArray(event.properties.patterns)
1294
+ ? event.properties.patterns.filter((value) => typeof value === "string")
1295
+ : [];
1296
+ const command = readPermissionField(metadata, PERMISSION_COMMAND_KEYS);
1297
+ const cwd = readPermissionField(metadata, PERMISSION_CWD_KEYS);
1298
+ const reason = readPermissionField(metadata, PERMISSION_REASON_KEYS);
1299
+ const input = buildOpenCodePermissionInput({ patterns, metadata, tool, command });
1300
+ const detail = buildOpenCodePermissionDetail({
1301
+ permission: event.properties.permission,
1302
+ input,
1303
+ command,
1304
+ cwd,
1305
+ });
1306
+ const description = buildOpenCodePermissionDescription({ reason, patterns });
1307
+ events.push({
1308
+ type: "permission_requested",
1309
+ provider: "opencode",
1310
+ request: {
1311
+ id: event.properties.id,
1312
+ provider: "opencode",
1313
+ name: event.properties.permission,
1314
+ kind: "tool",
1315
+ title: toHumanReadablePermissionTitle(event.properties.permission),
1316
+ ...(description ? { description } : {}),
1317
+ input,
1318
+ detail,
1319
+ },
1320
+ });
1321
+ }
1322
+ function appendOpenCodeQuestionAsked(event, state, events) {
1323
+ if (event.properties.sessionID !== state.sessionId) {
1324
+ return;
1325
+ }
1326
+ const questions = event.properties.questions.flatMap((q) => {
1327
+ if (!q.question || !q.header) {
1328
+ return [];
1329
+ }
1330
+ const options = q.options?.map((o) => ({
1331
+ label: o.label,
1332
+ ...(o.description ? { description: o.description } : {}),
1333
+ })) ?? [];
1334
+ return [
1335
+ {
1336
+ question: q.question,
1337
+ header: q.header,
1338
+ options,
1339
+ ...(q.multiple === true ? { multiSelect: true } : {}),
1340
+ },
1341
+ ];
1342
+ });
1343
+ if (questions.length === 0) {
1344
+ return;
1345
+ }
1346
+ events.push({
1347
+ type: "permission_requested",
1348
+ provider: "opencode",
1349
+ request: {
1350
+ id: event.properties.id,
1351
+ provider: "opencode",
1352
+ name: "question",
1353
+ kind: "question",
1354
+ title: "Question",
1355
+ input: { questions },
1356
+ metadata: {
1357
+ source: "opencode_question",
1358
+ ...event.properties.tool,
1359
+ },
1360
+ },
1361
+ });
1362
+ }
1363
+ function appendOpenCodeSessionStatus(event, state, events) {
1364
+ if (event.properties.sessionID !== state.sessionId) {
1365
+ return;
1366
+ }
1367
+ const { status } = event.properties;
1368
+ if (status.type === "idle") {
1369
+ resetOpenCodeTurnTrackingState(state);
1370
+ events.push({ type: "turn_completed", provider: "opencode", usage: undefined });
1371
+ return;
1372
+ }
1373
+ if (status.type === "retry" && isFatalOpenCodeRetryMessage(status.message)) {
1374
+ resetOpenCodeTurnTrackingState(state);
1375
+ events.push({
1376
+ type: "turn_failed",
1377
+ provider: "opencode",
1378
+ error: toDiagnosticErrorMessage(status.message),
1379
+ });
1380
+ }
1381
+ // "retry" and "busy" are transient — no terminal event.
1382
+ }
1346
1383
  class OpenCodeAgentSession {
1347
1384
  constructor(config, client, sessionId, logger, modelContextWindowsByModelKey = new Map(), releaseServer) {
1348
1385
  this.provider = "opencode";
@@ -1526,12 +1563,13 @@ class OpenCodeAgentSession {
1526
1563
  }, "OpenCode slash command hit a header timeout; waiting for SSE terminal event");
1527
1564
  return;
1528
1565
  }
1529
- const errorMsg = normalizeTurnFailureError(response.error);
1566
+ const errorMsg = toDiagnosticErrorMessage(response.error);
1530
1567
  this.finishForegroundTurn({ type: "turn_failed", provider: "opencode", error: errorMsg }, turnId);
1531
1568
  }
1532
1569
  else {
1533
1570
  this.finishForegroundTurn({ type: "turn_completed", provider: "opencode", usage: undefined }, turnId);
1534
1571
  }
1572
+ return;
1535
1573
  })
1536
1574
  .catch((err) => {
1537
1575
  if (isOpenCodeHeadersTimeoutFailure(err)) {
@@ -1542,7 +1580,7 @@ class OpenCodeAgentSession {
1542
1580
  }, "OpenCode slash command hit a header timeout; waiting for SSE terminal event");
1543
1581
  return;
1544
1582
  }
1545
- this.finishForegroundTurn({ type: "turn_failed", provider: "opencode", error: normalizeTurnFailureError(err) }, turnId);
1583
+ this.finishForegroundTurn({ type: "turn_failed", provider: "opencode", error: toDiagnosticErrorMessage(err) }, turnId);
1546
1584
  });
1547
1585
  }
1548
1586
  else {
@@ -1569,15 +1607,16 @@ class OpenCodeAgentSession {
1569
1607
  this.finishForegroundTurn({
1570
1608
  type: "turn_failed",
1571
1609
  provider: "opencode",
1572
- error: normalizeTurnFailureError(promptResponse.error),
1610
+ error: toDiagnosticErrorMessage(promptResponse.error),
1573
1611
  }, turnId);
1574
1612
  }
1613
+ return;
1575
1614
  })
1576
1615
  .catch((error) => {
1577
1616
  this.finishForegroundTurn({
1578
1617
  type: "turn_failed",
1579
1618
  provider: "opencode",
1580
- error: normalizeTurnFailureError(error),
1619
+ error: toDiagnosticErrorMessage(error),
1581
1620
  }, turnId);
1582
1621
  });
1583
1622
  }
@@ -1604,19 +1643,9 @@ class OpenCodeAgentSession {
1604
1643
  if (e.type === "timeline" && e.item.type === "tool_call") {
1605
1644
  this.trackToolCall(e.item);
1606
1645
  }
1607
- if (e.type === "turn_completed" ||
1608
- e.type === "turn_failed" ||
1609
- e.type === "turn_canceled") {
1610
- if (e.type === "turn_failed") {
1611
- this.finishForegroundTurn({
1612
- type: "turn_failed",
1613
- provider: "opencode",
1614
- error: normalizeTurnFailureError(e.error),
1615
- }, turnId);
1616
- }
1617
- else {
1618
- this.finishForegroundTurn(e, turnId);
1619
- }
1646
+ const terminalEvent = toTerminalTurnEvent(e);
1647
+ if (terminalEvent) {
1648
+ this.finishForegroundTurn(terminalEvent, turnId);
1620
1649
  return;
1621
1650
  }
1622
1651
  this.notifySubscribers(e, turnId);
@@ -1635,7 +1664,7 @@ class OpenCodeAgentSession {
1635
1664
  this.finishForegroundTurn({
1636
1665
  type: "turn_failed",
1637
1666
  provider: "opencode",
1638
- error: normalizeTurnFailureError(error),
1667
+ error: toDiagnosticErrorMessage(error),
1639
1668
  }, turnId);
1640
1669
  }
1641
1670
  }
@@ -1729,34 +1758,33 @@ class OpenCodeAgentSession {
1729
1758
  else {
1730
1759
  let emittedAssistantText = false;
1731
1760
  for (const part of parts) {
1732
- if (part.type === "text") {
1733
- if (part.text) {
1734
- emittedAssistantText = true;
1735
- yield {
1736
- type: "timeline",
1737
- provider: "opencode",
1738
- item: { type: "assistant_message", text: part.text },
1739
- };
1740
- }
1761
+ if (part.type === "text" && part.text) {
1762
+ emittedAssistantText = true;
1763
+ yield {
1764
+ type: "timeline",
1765
+ provider: "opencode",
1766
+ item: { type: "assistant_message", text: part.text },
1767
+ };
1768
+ continue;
1769
+ }
1770
+ if (part.type === "reasoning" && part.text) {
1771
+ yield {
1772
+ type: "timeline",
1773
+ provider: "opencode",
1774
+ item: { type: "reasoning", text: part.text },
1775
+ };
1776
+ continue;
1741
1777
  }
1742
- else if (part.type === "reasoning") {
1743
- if (part.text) {
1744
- yield {
1745
- type: "timeline",
1746
- provider: "opencode",
1747
- item: { type: "reasoning", text: part.text },
1748
- };
1749
- }
1778
+ if (part.type !== "tool") {
1779
+ continue;
1750
1780
  }
1751
- else if (part.type === "tool") {
1752
- const parsedToolPart = OpencodeToolPartToTimelineItemSchema.safeParse(part);
1753
- if (parsedToolPart.success && parsedToolPart.data) {
1754
- yield {
1755
- type: "timeline",
1756
- provider: "opencode",
1757
- item: parsedToolPart.data,
1758
- };
1759
- }
1781
+ const parsedToolPart = OpencodeToolPartToTimelineItemSchema.safeParse(part);
1782
+ if (parsedToolPart.success && parsedToolPart.data) {
1783
+ yield {
1784
+ type: "timeline",
1785
+ provider: "opencode",
1786
+ item: parsedToolPart.data,
1787
+ };
1760
1788
  }
1761
1789
  }
1762
1790
  if (!emittedAssistantText) {
@@ -1950,10 +1978,7 @@ class OpenCodeAgentSession {
1950
1978
  }
1951
1979
  }
1952
1980
  async configureMcpServers(mcpServers) {
1953
- for (const [name, serverConfig] of Object.entries(mcpServers)) {
1954
- const mappedConfig = toOpenCodeMcpConfig(serverConfig);
1955
- await this.registerMcpServer(name, mappedConfig);
1956
- }
1981
+ await Promise.all(Object.entries(mcpServers).map(([name, serverConfig]) => this.registerMcpServer(name, toOpenCodeMcpConfig(serverConfig))));
1957
1982
  }
1958
1983
  async registerMcpServer(name, config) {
1959
1984
  await this.runMcpOperation("add", name, () => this.client.mcp.add({
@@ -1975,7 +2000,7 @@ class OpenCodeAgentSession {
1975
2000
  if (isAlreadyPresentMcpError(error)) {
1976
2001
  return;
1977
2002
  }
1978
- throw new Error(`Failed to ${operation} OpenCode MCP server '${name}': ${stringifyUnknownError(error)}`);
2003
+ throw new Error(`Failed to ${operation} OpenCode MCP server '${name}': ${toDiagnosticErrorMessage(error)}`);
1979
2004
  }
1980
2005
  translateEvent(event) {
1981
2006
  const translated = translateOpenCodeEvent(event, {