@getpaseo/server 0.1.61 → 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 +50 -19
  240. package/dist/server/server/session.d.ts.map +1 -1
  241. package/dist/server/server/session.js +1116 -783
  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 +33 -23
  338. package/dist/server/server/websocket-server.d.ts.map +1 -1
  339. package/dist/server/server/websocket-server.js +349 -241
  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 +17 -13
  346. package/dist/server/server/workspace-git-service.d.ts.map +1 -1
  347. package/dist/server/server/workspace-git-service.js +232 -140
  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 +2 -7
  374. package/dist/server/services/github-service.d.ts.map +1 -1
  375. package/dist/server/services/github-service.js +156 -157
  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 +416 -282
  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
@@ -8,7 +8,20 @@ import { AGENT_STREAM_COALESCE_DEFAULT_WINDOW_MS, AgentStreamCoalescer, } from "
8
8
  import { getAgentProviderDefinition } from "./provider-manifest.js";
9
9
  const RELOAD_SESSION_CLOSE_TIMEOUT_MS = 3000;
10
10
  const INTERRUPT_SESSION_TIMEOUT_MS = 2000;
11
+ function formatProviderList(providers) {
12
+ return providers.length > 0 ? providers.join(", ") : "none";
13
+ }
11
14
  export { AGENT_LIFECYCLE_STATUSES };
15
+ function resolveInitialAttention(input) {
16
+ if (input == null || !input.requiresAttention) {
17
+ return { requiresAttention: false };
18
+ }
19
+ return {
20
+ requiresAttention: true,
21
+ attentionReason: input.attentionReason,
22
+ attentionTimestamp: new Date(input.attentionTimestamp),
23
+ };
24
+ }
12
25
  const SYSTEM_ERROR_PREFIX = "[System Error]";
13
26
  function attachPersistenceCwd(handle, cwd) {
14
27
  if (!handle) {
@@ -17,28 +30,30 @@ function attachPersistenceCwd(handle, cwd) {
17
30
  return {
18
31
  ...handle,
19
32
  metadata: {
20
- ...(handle.metadata ?? {}),
33
+ ...handle.metadata,
21
34
  cwd,
22
35
  },
23
36
  };
24
37
  }
25
- const BUSY_STATUSES = ["initializing", "running"];
38
+ const BUSY_STATUSES = new Set(["initializing", "running"]);
26
39
  const AgentIdSchema = z.string().uuid();
27
40
  function isAgentBusy(status) {
28
- return BUSY_STATUSES.includes(status);
41
+ return BUSY_STATUSES.has(status);
29
42
  }
30
43
  function isTurnTerminalEvent(event) {
31
44
  return (event.type === "turn_completed" ||
32
45
  event.type === "turn_failed" ||
33
46
  event.type === "turn_canceled");
34
47
  }
48
+ function abortMessage(reason, fallbackMessage) {
49
+ if (typeof reason === "string")
50
+ return reason;
51
+ if (reason instanceof Error)
52
+ return reason.message;
53
+ return fallbackMessage;
54
+ }
35
55
  function createAbortError(signal, fallbackMessage) {
36
- const reason = signal?.reason;
37
- const message = typeof reason === "string"
38
- ? reason
39
- : reason instanceof Error
40
- ? reason.message
41
- : fallbackMessage;
56
+ const message = abortMessage(signal?.reason, fallbackMessage);
42
57
  return Object.assign(new Error(message), { name: "AbortError" });
43
58
  }
44
59
  function validateAgentId(agentId, source) {
@@ -55,9 +70,34 @@ function normalizeMessageId(messageId) {
55
70
  const trimmed = messageId.trim();
56
71
  return trimmed.length > 0 ? trimmed : undefined;
57
72
  }
73
+ function isDuplicateLegacyUserMessage(item, canonicalUserMessagesById) {
74
+ if (item.type !== "user_message") {
75
+ return false;
76
+ }
77
+ const eventMessageId = normalizeMessageId(item.messageId);
78
+ if (!eventMessageId) {
79
+ return false;
80
+ }
81
+ return canonicalUserMessagesById.get(eventMessageId) === item.text;
82
+ }
83
+ function buildExplicitTimelineSeedForRegister(now, options) {
84
+ const hasTimeline = Boolean(options?.timeline?.length);
85
+ const hasTimelineRows = Boolean(options?.timelineRows?.length);
86
+ const hasTimelineNextSeq = options?.timelineNextSeq !== undefined;
87
+ if (!hasTimeline && !hasTimelineRows && !hasTimelineNextSeq) {
88
+ return null;
89
+ }
90
+ return {
91
+ items: options?.timeline,
92
+ rows: options?.timelineRows,
93
+ nextSeq: options?.timelineNextSeq,
94
+ timestamp: (options?.updatedAt ?? options?.createdAt ?? now).toISOString(),
95
+ };
96
+ }
58
97
  export class AgentManager {
59
98
  constructor(options) {
60
99
  this.clients = new Map();
100
+ this.providerEnabled = new Map();
61
101
  this.agents = new Map();
62
102
  this.timelineStore = new InMemoryAgentTimelineStore();
63
103
  this.agentsAwaitingInitialSnapshotPersist = new Set();
@@ -84,17 +124,26 @@ export class AgentManager {
84
124
  this.notifyForegroundTurnWaiters(agentId, event);
85
125
  },
86
126
  });
87
- if (options?.clients) {
88
- for (const [provider, client] of Object.entries(options.clients)) {
89
- if (client) {
90
- this.registerClient(provider, client);
91
- }
92
- }
93
- }
127
+ this.updateProviderRegistry({
128
+ providerDefinitions: options.providerDefinitions ?? {},
129
+ clients: options.clients ?? {},
130
+ });
94
131
  }
95
132
  registerClient(provider, client) {
96
133
  this.clients.set(provider, client);
97
134
  }
135
+ updateProviderRegistry(input) {
136
+ for (const [provider, definition] of Object.entries(input.providerDefinitions)) {
137
+ if (definition) {
138
+ this.providerEnabled.set(provider, definition.enabled);
139
+ }
140
+ }
141
+ for (const [provider, client] of Object.entries(input.clients)) {
142
+ if (client) {
143
+ this.clients.set(provider, client);
144
+ }
145
+ }
146
+ }
98
147
  getRegisteredProviderIds() {
99
148
  return Array.from(this.clients.keys());
100
149
  }
@@ -187,9 +236,7 @@ export class AgentManager {
187
236
  listAgents() {
188
237
  return Array.from(this.agents.values())
189
238
  .filter((agent) => !agent.internal)
190
- .map((agent) => ({
191
- ...agent,
192
- }));
239
+ .map((agent) => Object.assign({}, agent));
193
240
  }
194
241
  async listPersistedAgents(options) {
195
242
  if (options?.provider) {
@@ -199,21 +246,17 @@ export class AgentManager {
199
246
  }
200
247
  return client.listPersistedAgents({ limit: options.limit });
201
248
  }
202
- const descriptors = [];
203
- for (const [provider, client] of this.clients.entries()) {
204
- if (!client.listPersistedAgents) {
205
- continue;
206
- }
249
+ const providerEntries = Array.from(this.clients.entries()).filter(([, client]) => !!client.listPersistedAgents);
250
+ const descriptorLists = await Promise.all(providerEntries.map(async ([provider, client]) => {
207
251
  try {
208
- const entries = await client.listPersistedAgents({
209
- limit: options?.limit,
210
- });
211
- descriptors.push(...entries);
252
+ return await client.listPersistedAgents({ limit: options?.limit });
212
253
  }
213
254
  catch (error) {
214
255
  this.logger.warn({ err: error, provider }, "Failed to list persisted agents for provider");
256
+ return [];
215
257
  }
216
- }
258
+ }));
259
+ const descriptors = descriptorLists.flat();
217
260
  const limit = options?.limit ?? 20;
218
261
  return descriptors
219
262
  .sort((a, b) => b.lastActivityAt.getTime() - a.lastActivityAt.getTime())
@@ -322,16 +365,15 @@ export class AgentManager {
322
365
  type: "http",
323
366
  url: `${this.mcpBaseUrl}?callerAgentId=${resolvedAgentId}`,
324
367
  },
325
- ...(config.mcpServers ?? {}),
368
+ ...config.mcpServers,
326
369
  },
327
370
  };
371
+ this.requireEnabledProvider(injectedConfig.provider);
328
372
  const normalizedConfig = await this.normalizeConfig(injectedConfig);
329
373
  const launchContext = this.buildLaunchContext(resolvedAgentId);
330
- const client = this.requireClient(normalizedConfig.provider);
331
- const available = await client.isAvailable();
332
- if (!available) {
333
- throw new Error(`Provider '${normalizedConfig.provider}' is not available. Please ensure the CLI is installed.`);
334
- }
374
+ const client = await this.requireAvailableClient({
375
+ provider: normalizedConfig.provider,
376
+ });
335
377
  const session = await client.createSession(normalizedConfig, launchContext);
336
378
  return this.registerSession(session, normalizedConfig, resolvedAgentId, {
337
379
  labels: options?.labels,
@@ -443,10 +485,10 @@ export class AgentManager {
443
485
  try {
444
486
  return await Promise.race([
445
487
  operation,
446
- new Promise((resolve) => {
488
+ new Promise((resolvePromise) => {
447
489
  timer = setTimeout(() => {
448
490
  didTimeOut = true;
449
- resolve("timed_out");
491
+ resolvePromise("timed_out");
450
492
  }, options.timeoutMs);
451
493
  }),
452
494
  ]);
@@ -766,10 +808,9 @@ export class AgentManager {
766
808
  const agent = existingAgent;
767
809
  agent.pendingReplacement = false;
768
810
  agent.lastError = undefined;
769
- const self = this;
770
- const pendingRun = self.createPendingForegroundRun();
771
- self.pendingForegroundRuns.set(agentId, pendingRun);
772
- const streamForwarder = (async function* streamForwarder() {
811
+ const pendingRun = this.createPendingForegroundRun();
812
+ this.pendingForegroundRuns.set(agentId, pendingRun);
813
+ const streamForwarder = async function* streamForwarder() {
773
814
  let turnId;
774
815
  let waiter = null;
775
816
  try {
@@ -778,20 +819,20 @@ export class AgentManager {
778
819
  }
779
820
  catch (error) {
780
821
  const errorMsg = error instanceof Error ? error.message : "Failed to start turn";
781
- self.handleStreamEvent(agent, {
822
+ this.handleStreamEvent(agent, {
782
823
  type: "turn_failed",
783
824
  provider: agent.provider,
784
825
  error: errorMsg,
785
826
  });
786
- self.finalizeForegroundTurn(agent);
827
+ this.finalizeForegroundTurn(agent);
787
828
  throw error;
788
829
  }
789
830
  pendingRun.started = true;
790
831
  agent.activeForegroundTurnId = turnId;
791
832
  agent.lifecycle = "running";
792
- self.touchUpdatedAt(agent);
793
- self.emitState(agent);
794
- self.logger.trace({
833
+ this.touchUpdatedAt(agent);
834
+ this.emitState(agent);
835
+ this.logger.trace({
795
836
  agentId,
796
837
  lifecycle: agent.lifecycle,
797
838
  activeForegroundTurnId: agent.activeForegroundTurnId,
@@ -801,8 +842,8 @@ export class AgentManager {
801
842
  let queueResolve = null;
802
843
  let done = false;
803
844
  let resolveSettled;
804
- const settledPromise = new Promise((resolve) => {
805
- resolveSettled = resolve;
845
+ const settledPromise = new Promise((resolvePromise) => {
846
+ resolveSettled = resolvePromise;
806
847
  });
807
848
  waiter = {
808
849
  turnId,
@@ -832,8 +873,8 @@ export class AgentManager {
832
873
  if (waiter.settled) {
833
874
  break;
834
875
  }
835
- await new Promise((resolve) => {
836
- queueResolve = resolve;
876
+ await new Promise((resolvePromise) => {
877
+ queueResolve = resolvePromise;
837
878
  });
838
879
  }
839
880
  }
@@ -841,14 +882,14 @@ export class AgentManager {
841
882
  finally {
842
883
  if (waiter) {
843
884
  agent.foregroundTurnWaiters.delete(waiter);
844
- self.settleForegroundTurnWaiter(waiter);
885
+ this.settleForegroundTurnWaiter(waiter);
845
886
  }
846
- self.settlePendingForegroundRun(agentId, pendingRun.token);
887
+ this.settlePendingForegroundRun(agentId, pendingRun.token);
847
888
  if (!agent.activeForegroundTurnId) {
848
- await self.refreshRuntimeInfo(agent);
889
+ await this.refreshRuntimeInfo(agent);
849
890
  }
850
891
  }
851
- })();
892
+ }.call(this);
852
893
  return streamForwarder;
853
894
  }
854
895
  finalizeForegroundTurn(agent, turnId) {
@@ -859,11 +900,17 @@ export class AgentManager {
859
900
  mutableAgent.activeForegroundTurnId = null;
860
901
  const terminalError = mutableAgent.lastError;
861
902
  const shouldHoldBusyForReplacement = mutableAgent.pendingReplacement && !terminalError;
862
- mutableAgent.lifecycle = shouldHoldBusyForReplacement
863
- ? "running"
864
- : terminalError
865
- ? "error"
866
- : "idle";
903
+ let nextLifecycle;
904
+ if (shouldHoldBusyForReplacement) {
905
+ nextLifecycle = "running";
906
+ }
907
+ else if (terminalError) {
908
+ nextLifecycle = "error";
909
+ }
910
+ else {
911
+ nextLifecycle = "idle";
912
+ }
913
+ mutableAgent.lifecycle = nextLifecycle;
867
914
  const persistenceHandle = mutableAgent.session.describePersistence() ??
868
915
  (mutableAgent.runtimeInfo?.sessionId
869
916
  ? { provider: mutableAgent.provider, sessionId: mutableAgent.runtimeInfo.sessionId }
@@ -894,29 +941,28 @@ export class AgentManager {
894
941
  agent.lifecycle = "running";
895
942
  this.touchUpdatedAt(agent);
896
943
  this.emitState(agent);
897
- const self = this;
898
- return (async function* replaceRunForwarder() {
944
+ return async function* replaceRunForwarder() {
899
945
  try {
900
- await self.cancelAgentRun(agentId);
901
- const nextRun = self.streamAgent(agentId, prompt, options);
946
+ await this.cancelAgentRun(agentId);
947
+ const nextRun = this.streamAgent(agentId, prompt, options);
902
948
  for await (const event of nextRun) {
903
949
  yield event;
904
950
  }
905
951
  }
906
952
  catch (error) {
907
- const latest = self.agents.get(agentId);
953
+ const latest = this.agents.get(agentId);
908
954
  if (latest) {
909
955
  const latestActive = latest;
910
956
  latestActive.pendingReplacement = false;
911
957
  if (!latestActive.activeForegroundTurnId && latestActive.lifecycle === "running") {
912
958
  latestActive.lifecycle = "idle";
913
- self.touchUpdatedAt(latestActive);
914
- self.emitState(latestActive);
959
+ this.touchUpdatedAt(latestActive);
960
+ this.emitState(latestActive);
915
961
  }
916
962
  }
917
963
  throw error;
918
964
  }
919
- })();
965
+ }.call(this);
920
966
  }
921
967
  async waitForAgentRunStart(agentId, options) {
922
968
  const snapshot = this.getAgent(agentId);
@@ -933,7 +979,7 @@ export class AgentManager {
933
979
  if (options?.signal?.aborted) {
934
980
  throw createAbortError(options.signal, "wait_for_agent_start aborted");
935
981
  }
936
- await new Promise((resolve, reject) => {
982
+ await new Promise((resolvePromise, reject) => {
937
983
  if (options?.signal?.aborted) {
938
984
  reject(createAbortError(options.signal, "wait_for_agent_start aborted"));
939
985
  return;
@@ -962,7 +1008,7 @@ export class AgentManager {
962
1008
  };
963
1009
  const finishOk = () => {
964
1010
  cleanup();
965
- resolve();
1011
+ resolvePromise();
966
1012
  };
967
1013
  const finishErr = (error) => {
968
1014
  cleanup();
@@ -1045,19 +1091,19 @@ export class AgentManager {
1045
1091
  // Wait briefly for the event to propagate if there's an active foreground turn.
1046
1092
  if (foregroundTurnId) {
1047
1093
  const waiter = Array.from(agent.foregroundTurnWaiters).find((candidate) => candidate.turnId === foregroundTurnId);
1048
- const timeout = new Promise((resolve) => setTimeout(resolve, 2000));
1094
+ const timeout = new Promise((resolvePromise) => setTimeout(resolvePromise, 2000));
1049
1095
  if (waiter) {
1050
1096
  await Promise.race([waiter.settledPromise, timeout]);
1051
1097
  }
1052
1098
  else if (agent.activeForegroundTurnId === foregroundTurnId) {
1053
1099
  await Promise.race([
1054
- new Promise((resolve) => {
1100
+ new Promise((resolvePromise) => {
1055
1101
  const unsubscribe = this.subscribe((event) => {
1056
1102
  if (event.type === "agent_state" &&
1057
1103
  event.agent.id === agentId &&
1058
1104
  !event.agent.activeForegroundTurnId) {
1059
1105
  unsubscribe();
1060
- resolve();
1106
+ resolvePromise();
1061
1107
  }
1062
1108
  }, { agentId, replayState: false });
1063
1109
  }),
@@ -1073,7 +1119,7 @@ export class AgentManager {
1073
1119
  }
1074
1120
  }
1075
1121
  else if (pendingRun) {
1076
- const timeout = new Promise((resolve) => setTimeout(resolve, 2000));
1122
+ const timeout = new Promise((resolvePromise) => setTimeout(resolvePromise, 2000));
1077
1123
  await Promise.race([pendingRun.settledPromise, timeout]);
1078
1124
  }
1079
1125
  // If the foreground turn is still stuck after the timeout, force-dispatch a
@@ -1179,7 +1225,7 @@ export class AgentManager {
1179
1225
  return null;
1180
1226
  }
1181
1227
  return {
1182
- text: chunks.reverse().join(""),
1228
+ text: chunks.toReversed().join(""),
1183
1229
  startsAtBeginning,
1184
1230
  };
1185
1231
  }
@@ -1256,7 +1302,7 @@ export class AgentManager {
1256
1302
  if (options?.signal?.aborted) {
1257
1303
  throw createAbortError(options.signal, "wait_for_agent aborted");
1258
1304
  }
1259
- return await new Promise((resolve, reject) => {
1305
+ return await new Promise((resolvePromise, reject) => {
1260
1306
  // Bug #1 Fix: Check abort signal AGAIN inside Promise constructor
1261
1307
  // to avoid race condition between pre-Promise check and abort listener registration
1262
1308
  if (options?.signal?.aborted) {
@@ -1302,11 +1348,12 @@ export class AgentManager {
1302
1348
  cleanup();
1303
1349
  void this.getLastAssistantMessage(agentId)
1304
1350
  .then((lastMessage) => {
1305
- resolve({
1351
+ resolvePromise({
1306
1352
  status: currentStatus,
1307
1353
  permission,
1308
1354
  lastMessage,
1309
1355
  });
1356
+ return;
1310
1357
  })
1311
1358
  .catch(reject);
1312
1359
  };
@@ -1368,31 +1415,57 @@ export class AgentManager {
1368
1415
  }
1369
1416
  const initialPersistedTitle = await this.resolveInitialPersistedTitle(resolvedAgentId, config);
1370
1417
  const now = new Date();
1371
- const explicitTimelineSeed = options?.timeline?.length ||
1372
- options?.timelineRows?.length ||
1373
- options?.timelineNextSeq !== undefined
1374
- ? {
1375
- items: options?.timeline,
1376
- rows: options?.timelineRows,
1377
- nextSeq: options?.timelineNextSeq,
1378
- timestamp: (options?.updatedAt ?? options?.createdAt ?? now).toISOString(),
1379
- }
1380
- : null;
1418
+ const { durableTimelineHasRows } = await this.initializeAgentTimelineForRegister({
1419
+ agentId: resolvedAgentId,
1420
+ now,
1421
+ options,
1422
+ });
1423
+ const managed = this.buildManagedAgentForRegister({
1424
+ resolvedAgentId,
1425
+ session,
1426
+ config,
1427
+ now,
1428
+ durableTimelineHasRows,
1429
+ options,
1430
+ });
1431
+ this.agents.set(resolvedAgentId, managed);
1432
+ // Initialize previousStatus to track transitions
1433
+ this.previousStatuses.set(resolvedAgentId, managed.lifecycle);
1434
+ await this.refreshRuntimeInfo(managed);
1435
+ await this.persistSnapshot(managed, {
1436
+ workspaceId: options?.workspaceId,
1437
+ title: initialPersistedTitle,
1438
+ });
1439
+ this.emitState(managed, { persist: false });
1440
+ await this.refreshSessionState(managed);
1441
+ managed.lifecycle = "idle";
1442
+ await this.persistSnapshot(managed, { workspaceId: options?.workspaceId });
1443
+ this.emitState(managed, { persist: false });
1444
+ this.subscribeToSession(managed);
1445
+ return { ...managed };
1446
+ }
1447
+ async initializeAgentTimelineForRegister(params) {
1448
+ const { agentId, now, options } = params;
1449
+ const explicitTimelineSeed = buildExplicitTimelineSeedForRegister(now, options);
1381
1450
  const shouldSeedFromDurable = !explicitTimelineSeed &&
1382
- !this.timelineStore.has(resolvedAgentId) &&
1451
+ !this.timelineStore.has(agentId) &&
1383
1452
  this.durableTimelineStore !== undefined;
1384
1453
  const durableTimelineSeed = shouldSeedFromDurable
1385
- ? await this.loadCommittedTimelineSeed(resolvedAgentId, now)
1454
+ ? await this.loadCommittedTimelineSeed(agentId, now)
1386
1455
  : null;
1387
1456
  const durableTimelineHasRows = durableTimelineSeed != null && (durableTimelineSeed.nextSeq ?? 1) > 1;
1388
1457
  const timelineSeed = explicitTimelineSeed ?? durableTimelineSeed;
1389
- if (timelineSeed || !this.timelineStore.has(resolvedAgentId)) {
1390
- this.timelineStore.initialize(resolvedAgentId, timelineSeed ?? { timestamp: now.toISOString() });
1458
+ if (timelineSeed || !this.timelineStore.has(agentId)) {
1459
+ this.timelineStore.initialize(agentId, timelineSeed ?? { timestamp: now.toISOString() });
1391
1460
  }
1392
1461
  if (options?.timelineRows?.length) {
1393
- this.enqueueDurableTimelineBulkInsert(resolvedAgentId, options.timelineRows);
1462
+ this.enqueueDurableTimelineBulkInsert(agentId, options.timelineRows);
1394
1463
  }
1395
- const managed = {
1464
+ return { durableTimelineHasRows };
1465
+ }
1466
+ buildManagedAgentForRegister(params) {
1467
+ const { resolvedAgentId, session, config, now, durableTimelineHasRows, options } = params;
1468
+ return {
1396
1469
  id: resolvedAgentId,
1397
1470
  provider: config.provider,
1398
1471
  cwd: config.cwd,
@@ -1418,33 +1491,10 @@ export class AgentManager {
1418
1491
  lastUserMessageAt: options?.lastUserMessageAt ?? null,
1419
1492
  lastUsage: options?.lastUsage,
1420
1493
  lastError: options?.lastError,
1421
- attention: options?.attention != null
1422
- ? options.attention.requiresAttention
1423
- ? {
1424
- requiresAttention: true,
1425
- attentionReason: options.attention.attentionReason,
1426
- attentionTimestamp: new Date(options.attention.attentionTimestamp),
1427
- }
1428
- : { requiresAttention: false }
1429
- : { requiresAttention: false },
1494
+ attention: resolveInitialAttention(options?.attention),
1430
1495
  internal: config.internal ?? false,
1431
1496
  labels: options?.labels ?? {},
1432
1497
  };
1433
- this.agents.set(resolvedAgentId, managed);
1434
- // Initialize previousStatus to track transitions
1435
- this.previousStatuses.set(resolvedAgentId, managed.lifecycle);
1436
- await this.refreshRuntimeInfo(managed);
1437
- await this.persistSnapshot(managed, {
1438
- workspaceId: options?.workspaceId,
1439
- title: initialPersistedTitle,
1440
- });
1441
- this.emitState(managed, { persist: false });
1442
- await this.refreshSessionState(managed);
1443
- managed.lifecycle = "idle";
1444
- await this.persistSnapshot(managed, { workspaceId: options?.workspaceId });
1445
- this.emitState(managed, { persist: false });
1446
- this.subscribeToSession(managed);
1447
- return { ...managed };
1448
1498
  }
1449
1499
  async loadCommittedTimelineSeed(agentId, now) {
1450
1500
  if (!this.durableTimelineStore) {
@@ -1507,6 +1557,7 @@ export class AgentManager {
1507
1557
  return;
1508
1558
  }
1509
1559
  await this.dispatchSessionEvent(current, event);
1560
+ return;
1510
1561
  })
1511
1562
  .catch((err) => {
1512
1563
  this.logger.error({ err, agentId, eventType: event.type }, "Failed to process session event");
@@ -1554,8 +1605,8 @@ export class AgentManager {
1554
1605
  }
1555
1606
  createPendingForegroundRun() {
1556
1607
  let resolveSettled;
1557
- const settledPromise = new Promise((resolve) => {
1558
- resolveSettled = resolve;
1608
+ const settledPromise = new Promise((resolvePromise) => {
1609
+ resolveSettled = resolvePromise;
1559
1610
  });
1560
1611
  return {
1561
1612
  token: randomUUID(),
@@ -1671,14 +1722,8 @@ export class AgentManager {
1671
1722
  if (event.type !== "timeline") {
1672
1723
  continue;
1673
1724
  }
1674
- if (event.item.type === "user_message") {
1675
- const eventMessageId = normalizeMessageId(event.item.messageId);
1676
- if (eventMessageId) {
1677
- const canonicalText = canonicalUserMessagesById.get(eventMessageId);
1678
- if (canonicalText === event.item.text) {
1679
- continue;
1680
- }
1681
- }
1725
+ if (isDuplicateLegacyUserMessage(event.item, canonicalUserMessagesById)) {
1726
+ continue;
1682
1727
  }
1683
1728
  this.recordTimeline(agent.id, event.item);
1684
1729
  }
@@ -1718,185 +1763,212 @@ export class AgentManager {
1718
1763
  }
1719
1764
  this.agentStreamCoalescer.flushFor(agent.id);
1720
1765
  }
1721
- let shouldDispatchEvent = true;
1722
- let shouldNotifyWaiters = true;
1766
+ const flags = { shouldDispatchEvent: true, shouldNotifyWaiters: true };
1767
+ const dispatchPromise = this.dispatchStreamEventByType({
1768
+ agent,
1769
+ event,
1770
+ options,
1771
+ isForegroundEvent,
1772
+ eventTurnId,
1773
+ flags,
1774
+ });
1775
+ if (dispatchPromise) {
1776
+ await dispatchPromise;
1777
+ }
1778
+ if (!options?.fromHistory && isForegroundEvent && isTurnTerminalEvent(event)) {
1779
+ this.finalizeForegroundTurn(agent, eventTurnId);
1780
+ }
1781
+ if (!options?.fromHistory && flags.shouldDispatchEvent) {
1782
+ this.dispatchStream(agent.id, event);
1783
+ }
1784
+ return flags.shouldNotifyWaiters;
1785
+ }
1786
+ dispatchStreamEventByType(params) {
1787
+ const { agent, event, options, isForegroundEvent, eventTurnId, flags } = params;
1723
1788
  switch (event.type) {
1724
1789
  case "thread_started":
1725
- {
1726
- const previousSessionId = agent.persistence?.sessionId ?? null;
1727
- const handle = agent.session.describePersistence();
1728
- if (handle) {
1729
- agent.persistence = attachPersistenceCwd(handle, agent.cwd);
1730
- if (agent.persistence?.sessionId !== previousSessionId) {
1731
- this.emitState(agent);
1732
- }
1733
- }
1734
- void this.refreshRuntimeInfo(agent);
1735
- }
1736
- break;
1790
+ this.onStreamThreadStarted(agent);
1791
+ return undefined;
1737
1792
  case "usage_updated":
1738
1793
  agent.lastUsage = event.usage;
1739
1794
  this.emitState(agent);
1740
- break;
1795
+ return undefined;
1741
1796
  case "timeline":
1742
- {
1743
- // Skip provider-replayed user_message items during history hydration.
1744
- if (options?.fromHistory && event.item.type === "user_message") {
1745
- const eventMessageId = normalizeMessageId(event.item.messageId);
1746
- if (eventMessageId) {
1747
- const canonicalText = options?.canonicalUserMessagesById?.get(eventMessageId);
1748
- if (canonicalText === event.item.text) {
1749
- shouldDispatchEvent = false;
1750
- shouldNotifyWaiters = false;
1751
- break;
1752
- }
1753
- }
1754
- }
1755
- // Suppress user_message echoes for the active foreground turn.
1756
- if (!options?.fromHistory && event.item.type === "user_message" && isForegroundEvent) {
1757
- const eventMessageId = normalizeMessageId(event.item.messageId);
1758
- if (eventMessageId &&
1759
- (await this.hasCommittedUserMessageFromStores(agent.id, {
1760
- messageId: eventMessageId,
1761
- text: event.item.text,
1762
- }))) {
1763
- break;
1764
- }
1765
- }
1766
- if (options?.fromHistory) {
1767
- this.recordTimeline(agent.id, event.item);
1768
- shouldDispatchEvent = false;
1769
- shouldNotifyWaiters = false;
1770
- break;
1771
- }
1772
- this.recordAndDispatchTimelineItem(agent.id, event.item, event.provider, event.turnId);
1773
- if (event.item.type === "user_message") {
1774
- agent.lastUserMessageAt = new Date();
1775
- this.emitState(agent);
1776
- }
1777
- shouldDispatchEvent = false;
1778
- shouldNotifyWaiters = true;
1779
- }
1780
- break;
1797
+ return this.onStreamTimelineEvent({ agent, event, options, isForegroundEvent, flags });
1781
1798
  case "turn_completed":
1782
- this.logger.trace({
1783
- agentId: agent.id,
1784
- lifecycle: agent.lifecycle,
1785
- activeForegroundTurnId: agent.activeForegroundTurnId,
1786
- eventTurnId,
1787
- }, "handleStreamEvent: turn_completed");
1788
- agent.lastUsage = event.usage;
1789
- agent.lastError = undefined;
1790
- // For autonomous turns (not foreground), transition to idle
1791
- // unless a replacement is pending (avoid idle flash during replace)
1792
- if (!isForegroundEvent && agent.lifecycle !== "idle" && !agent.pendingReplacement) {
1793
- agent.lifecycle = "idle";
1794
- this.emitState(agent);
1795
- }
1796
- void this.refreshRuntimeInfo(agent);
1797
- break;
1799
+ this.onStreamTurnCompleted({ agent, event, eventTurnId, isForegroundEvent });
1800
+ return undefined;
1798
1801
  case "turn_failed":
1799
- this.logger.warn({
1800
- agentId: agent.id,
1801
- lifecycle: agent.lifecycle,
1802
- activeForegroundTurnId: agent.activeForegroundTurnId,
1802
+ return this.onStreamTurnFailed({
1803
+ agent,
1804
+ event,
1803
1805
  eventTurnId,
1804
- error: event.error,
1805
- code: event.code,
1806
- diagnostic: event.diagnostic,
1807
- }, "handleStreamEvent: turn_failed");
1808
- // For autonomous turns, set error state directly
1809
- if (!isForegroundEvent) {
1810
- agent.lifecycle = "error";
1811
- }
1812
- agent.lastError = event.error;
1813
- await this.appendSystemErrorTimelineMessage(agent, event.provider, this.formatTurnFailedMessage(event), options);
1814
- for (const [requestId] of agent.pendingPermissions) {
1815
- agent.pendingPermissions.delete(requestId);
1816
- if (!options?.fromHistory) {
1817
- this.dispatchStream(agent.id, {
1818
- type: "permission_resolved",
1819
- provider: event.provider,
1820
- requestId,
1821
- resolution: { behavior: "deny", message: "Turn failed" },
1822
- });
1823
- }
1824
- }
1825
- if (!isForegroundEvent) {
1826
- this.emitState(agent);
1827
- }
1828
- break;
1806
+ isForegroundEvent,
1807
+ options,
1808
+ });
1829
1809
  case "turn_canceled":
1830
- this.logger.trace({
1831
- agentId: agent.id,
1832
- lifecycle: agent.lifecycle,
1833
- activeForegroundTurnId: agent.activeForegroundTurnId,
1834
- eventTurnId,
1835
- }, "handleStreamEvent: turn_canceled");
1836
- // For autonomous turns, transition to idle
1837
- // unless a replacement is pending (avoid idle flash during replace)
1838
- if (!isForegroundEvent && !agent.pendingReplacement) {
1839
- agent.lifecycle = "idle";
1840
- }
1841
- agent.lastError = undefined;
1842
- for (const [requestId] of agent.pendingPermissions) {
1843
- agent.pendingPermissions.delete(requestId);
1844
- if (!options?.fromHistory) {
1845
- this.dispatchStream(agent.id, {
1846
- type: "permission_resolved",
1847
- provider: event.provider,
1848
- requestId,
1849
- resolution: { behavior: "deny", message: "Interrupted" },
1850
- });
1851
- }
1852
- }
1853
- if (!isForegroundEvent) {
1854
- this.emitState(agent);
1855
- }
1856
- break;
1810
+ this.onStreamTurnCanceled({ agent, event, eventTurnId, isForegroundEvent, options });
1811
+ return undefined;
1857
1812
  case "turn_started":
1858
- this.logger.trace({
1859
- agentId: agent.id,
1860
- lifecycle: agent.lifecycle,
1861
- activeForegroundTurnId: agent.activeForegroundTurnId,
1862
- eventTurnId,
1863
- }, "handleStreamEvent: turn_started");
1864
- // For autonomous turn_started (no foreground match), set running
1865
- if (!isForegroundEvent) {
1866
- agent.lifecycle = "running";
1867
- this.emitState(agent);
1868
- }
1869
- break;
1813
+ this.onStreamTurnStarted({ agent, eventTurnId, isForegroundEvent });
1814
+ return undefined;
1870
1815
  case "permission_requested":
1871
- {
1872
- const hadPendingPermissions = agent.pendingPermissions.size > 0;
1873
- agent.pendingPermissions.set(event.request.id, event.request);
1874
- if (!hadPendingPermissions && !agent.internal) {
1875
- this.broadcastAgentAttention(agent, "permission");
1876
- }
1877
- }
1878
- this.emitState(agent);
1879
- break;
1816
+ this.onStreamPermissionRequested(agent, event);
1817
+ return undefined;
1880
1818
  case "permission_resolved":
1881
- agent.pendingPermissions.delete(event.requestId);
1882
- if (!options?.fromHistory && agent.inFlightPermissionResponses.has(event.requestId)) {
1883
- agent.bufferedPermissionResolutions.set(event.requestId, event);
1884
- shouldDispatchEvent = false;
1885
- break;
1886
- }
1887
- this.emitState(agent);
1888
- break;
1819
+ this.onStreamPermissionResolved({ agent, event, options, flags });
1820
+ return undefined;
1889
1821
  default:
1890
- break;
1822
+ return undefined;
1891
1823
  }
1892
- if (!options?.fromHistory && isForegroundEvent && isTurnTerminalEvent(event)) {
1893
- this.finalizeForegroundTurn(agent, eventTurnId);
1824
+ }
1825
+ onStreamThreadStarted(agent) {
1826
+ const previousSessionId = agent.persistence?.sessionId ?? null;
1827
+ const handle = agent.session.describePersistence();
1828
+ if (handle) {
1829
+ agent.persistence = attachPersistenceCwd(handle, agent.cwd);
1830
+ if (agent.persistence?.sessionId !== previousSessionId) {
1831
+ this.emitState(agent);
1832
+ }
1894
1833
  }
1895
- // Skip dispatching individual stream events during history replay.
1896
- if (!options?.fromHistory && shouldDispatchEvent) {
1897
- this.dispatchStream(agent.id, event);
1834
+ void this.refreshRuntimeInfo(agent);
1835
+ }
1836
+ async onStreamTimelineEvent(params) {
1837
+ const { agent, event, options, isForegroundEvent, flags } = params;
1838
+ // Skip provider-replayed user_message items during history hydration.
1839
+ if (options?.fromHistory && event.item.type === "user_message") {
1840
+ const eventMessageId = normalizeMessageId(event.item.messageId);
1841
+ if (eventMessageId) {
1842
+ const canonicalText = options?.canonicalUserMessagesById?.get(eventMessageId);
1843
+ if (canonicalText === event.item.text) {
1844
+ flags.shouldDispatchEvent = false;
1845
+ flags.shouldNotifyWaiters = false;
1846
+ return;
1847
+ }
1848
+ }
1849
+ }
1850
+ // Suppress user_message echoes for the active foreground turn.
1851
+ if (!options?.fromHistory && event.item.type === "user_message" && isForegroundEvent) {
1852
+ const eventMessageId = normalizeMessageId(event.item.messageId);
1853
+ if (eventMessageId &&
1854
+ (await this.hasCommittedUserMessageFromStores(agent.id, {
1855
+ messageId: eventMessageId,
1856
+ text: event.item.text,
1857
+ }))) {
1858
+ return;
1859
+ }
1860
+ }
1861
+ if (options?.fromHistory) {
1862
+ this.recordTimeline(agent.id, event.item);
1863
+ flags.shouldDispatchEvent = false;
1864
+ flags.shouldNotifyWaiters = false;
1865
+ return;
1866
+ }
1867
+ this.recordAndDispatchTimelineItem(agent.id, event.item, event.provider, event.turnId);
1868
+ if (event.item.type === "user_message") {
1869
+ agent.lastUserMessageAt = new Date();
1870
+ this.emitState(agent);
1871
+ }
1872
+ flags.shouldDispatchEvent = false;
1873
+ flags.shouldNotifyWaiters = true;
1874
+ }
1875
+ onStreamTurnCompleted(params) {
1876
+ const { agent, event, eventTurnId, isForegroundEvent } = params;
1877
+ this.logger.trace({
1878
+ agentId: agent.id,
1879
+ lifecycle: agent.lifecycle,
1880
+ activeForegroundTurnId: agent.activeForegroundTurnId,
1881
+ eventTurnId,
1882
+ }, "handleStreamEvent: turn_completed");
1883
+ agent.lastUsage = event.usage;
1884
+ agent.lastError = undefined;
1885
+ if (!isForegroundEvent && agent.lifecycle !== "idle" && !agent.pendingReplacement) {
1886
+ agent.lifecycle = "idle";
1887
+ this.emitState(agent);
1888
+ }
1889
+ void this.refreshRuntimeInfo(agent);
1890
+ }
1891
+ async onStreamTurnFailed(params) {
1892
+ const { agent, event, eventTurnId, isForegroundEvent, options } = params;
1893
+ this.logger.warn({
1894
+ agentId: agent.id,
1895
+ lifecycle: agent.lifecycle,
1896
+ activeForegroundTurnId: agent.activeForegroundTurnId,
1897
+ eventTurnId,
1898
+ error: event.error,
1899
+ code: event.code,
1900
+ diagnostic: event.diagnostic,
1901
+ }, "handleStreamEvent: turn_failed");
1902
+ if (!isForegroundEvent) {
1903
+ agent.lifecycle = "error";
1904
+ }
1905
+ agent.lastError = event.error;
1906
+ await this.appendSystemErrorTimelineMessage(agent, event.provider, this.formatTurnFailedMessage(event), options);
1907
+ this.resolvePendingPermissionsForAgent(agent, event.provider, options, "Turn failed");
1908
+ if (!isForegroundEvent) {
1909
+ this.emitState(agent);
1910
+ }
1911
+ }
1912
+ onStreamTurnCanceled(params) {
1913
+ const { agent, event, eventTurnId, isForegroundEvent, options } = params;
1914
+ this.logger.trace({
1915
+ agentId: agent.id,
1916
+ lifecycle: agent.lifecycle,
1917
+ activeForegroundTurnId: agent.activeForegroundTurnId,
1918
+ eventTurnId,
1919
+ }, "handleStreamEvent: turn_canceled");
1920
+ if (!isForegroundEvent && !agent.pendingReplacement) {
1921
+ agent.lifecycle = "idle";
1922
+ }
1923
+ agent.lastError = undefined;
1924
+ this.resolvePendingPermissionsForAgent(agent, event.provider, options, "Interrupted");
1925
+ if (!isForegroundEvent) {
1926
+ this.emitState(agent);
1927
+ }
1928
+ }
1929
+ onStreamTurnStarted(params) {
1930
+ const { agent, eventTurnId, isForegroundEvent } = params;
1931
+ this.logger.trace({
1932
+ agentId: agent.id,
1933
+ lifecycle: agent.lifecycle,
1934
+ activeForegroundTurnId: agent.activeForegroundTurnId,
1935
+ eventTurnId,
1936
+ }, "handleStreamEvent: turn_started");
1937
+ if (!isForegroundEvent) {
1938
+ agent.lifecycle = "running";
1939
+ this.emitState(agent);
1940
+ }
1941
+ }
1942
+ onStreamPermissionRequested(agent, event) {
1943
+ const hadPendingPermissions = agent.pendingPermissions.size > 0;
1944
+ agent.pendingPermissions.set(event.request.id, event.request);
1945
+ if (!hadPendingPermissions && !agent.internal) {
1946
+ this.broadcastAgentAttention(agent, "permission");
1947
+ }
1948
+ this.emitState(agent);
1949
+ }
1950
+ onStreamPermissionResolved(params) {
1951
+ const { agent, event, options, flags } = params;
1952
+ agent.pendingPermissions.delete(event.requestId);
1953
+ if (!options?.fromHistory && agent.inFlightPermissionResponses.has(event.requestId)) {
1954
+ agent.bufferedPermissionResolutions.set(event.requestId, event);
1955
+ flags.shouldDispatchEvent = false;
1956
+ return;
1957
+ }
1958
+ this.emitState(agent);
1959
+ }
1960
+ resolvePendingPermissionsForAgent(agent, provider, options, message) {
1961
+ for (const [requestId] of agent.pendingPermissions) {
1962
+ agent.pendingPermissions.delete(requestId);
1963
+ if (!options?.fromHistory) {
1964
+ this.dispatchStream(agent.id, {
1965
+ type: "permission_resolved",
1966
+ provider,
1967
+ requestId,
1968
+ resolution: { behavior: "deny", message },
1969
+ });
1970
+ }
1898
1971
  }
1899
- return shouldNotifyWaiters;
1900
1972
  }
1901
1973
  recordAndDispatchTimelineItem(agentId, item, provider, turnId) {
1902
1974
  const row = this.recordTimeline(agentId, item);
@@ -2102,12 +2174,12 @@ export class AgentManager {
2102
2174
  if (error instanceof Error &&
2103
2175
  "code" in error &&
2104
2176
  error.code === "ENOENT") {
2105
- throw new Error(`Working directory does not exist: ${normalized.cwd}`);
2177
+ throw new Error(`Working directory does not exist: ${normalized.cwd}`, { cause: error });
2106
2178
  }
2107
2179
  if (error instanceof Error) {
2108
2180
  throw error;
2109
2181
  }
2110
- throw new Error(`Failed to access working directory: ${normalized.cwd}`);
2182
+ throw new Error(`Failed to access working directory: ${normalized.cwd}`, { cause: error });
2111
2183
  }
2112
2184
  }
2113
2185
  if (typeof normalized.model === "string") {
@@ -2147,6 +2219,37 @@ export class AgentManager {
2147
2219
  },
2148
2220
  };
2149
2221
  }
2222
+ async requireAvailableClient(options) {
2223
+ const client = this.clients.get(options.provider);
2224
+ if (!client) {
2225
+ const configuredProviders = this.getConfiguredProviderIds();
2226
+ throw new Error(`Unknown provider '${options.provider}'. Configured providers: ${formatProviderList(configuredProviders)}.`);
2227
+ }
2228
+ let unavailableReason = null;
2229
+ try {
2230
+ const available = await client.isAvailable();
2231
+ if (available) {
2232
+ return client;
2233
+ }
2234
+ }
2235
+ catch (error) {
2236
+ unavailableReason = error instanceof Error ? error.message : String(error);
2237
+ }
2238
+ const availableProviders = (await this.listProviderAvailability())
2239
+ .filter((entry) => entry.available)
2240
+ .map((entry) => entry.provider);
2241
+ const providerList = formatProviderList(availableProviders);
2242
+ const reason = unavailableReason ? ` Reason: ${unavailableReason}.` : "";
2243
+ throw new Error(`Provider '${options.provider}' is not available.${reason} Available providers: ${providerList}. Use one of those providers, or install/configure '${options.provider}'.`);
2244
+ }
2245
+ requireEnabledProvider(provider) {
2246
+ if (this.providerEnabled.get(provider) === false) {
2247
+ throw new Error(`Provider '${provider}' is disabled`);
2248
+ }
2249
+ }
2250
+ getConfiguredProviderIds() {
2251
+ return Array.from(new Set([...this.providerEnabled.keys(), ...this.clients.keys()]));
2252
+ }
2150
2253
  requireClient(provider) {
2151
2254
  const client = this.clients.get(provider);
2152
2255
  if (!client) {