@getpaseo/server 0.1.83 → 0.1.85

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 (785) hide show
  1. package/dist/server/server/agent/activity-curator.js +2 -2
  2. package/dist/server/server/agent/agent-manager.d.ts +6 -1
  3. package/dist/server/server/agent/agent-manager.js +37 -6
  4. package/dist/server/server/agent/agent-metadata-generator.js +1 -1
  5. package/dist/server/server/agent/agent-prompt.d.ts +2 -1
  6. package/dist/server/server/agent/agent-response-loop.js +1 -1
  7. package/dist/server/server/agent/agent-sdk-types.d.ts +32 -1
  8. package/dist/server/server/agent/agent-storage.d.ts +53 -53
  9. package/dist/server/server/agent/create-agent/create.d.ts +87 -0
  10. package/dist/server/server/agent/create-agent/create.js +264 -0
  11. package/dist/server/server/agent/create-agent-lifecycle-dispatch.js +0 -1
  12. package/dist/server/server/agent/create-agent-mode.d.ts +3 -1
  13. package/dist/server/server/agent/create-agent-mode.js +22 -0
  14. package/dist/server/server/agent/create-agent-title.js +1 -1
  15. package/dist/server/server/agent/import-sessions.d.ts +3 -3
  16. package/dist/server/server/agent/import-sessions.js +2 -2
  17. package/dist/server/server/agent/lifecycle-command.d.ts +59 -0
  18. package/dist/server/server/agent/lifecycle-command.js +84 -0
  19. package/dist/server/server/agent/mcp-server.d.ts +2 -4
  20. package/dist/server/server/agent/mcp-server.js +201 -391
  21. package/dist/server/server/agent/mcp-shared.d.ts +12 -11
  22. package/dist/server/server/agent/permission-response.d.ts +15 -0
  23. package/dist/server/server/agent/permission-response.js +14 -0
  24. package/dist/server/server/agent/prompt-attachments.d.ts +1 -1
  25. package/dist/server/server/agent/provider-launch-config.d.ts +23 -348
  26. package/dist/server/server/agent/provider-launch-config.js +84 -106
  27. package/dist/server/server/agent/provider-registry.d.ts +6 -3
  28. package/dist/server/server/agent/provider-registry.js +23 -4
  29. package/dist/server/server/agent/provider-snapshot-manager.d.ts +76 -6
  30. package/dist/server/server/agent/provider-snapshot-manager.js +177 -10
  31. package/dist/server/server/agent/providers/acp-agent.js +15 -14
  32. package/dist/server/server/agent/providers/claude/agent.js +28 -59
  33. package/dist/server/server/agent/providers/claude/models.js +19 -5
  34. package/dist/server/server/agent/providers/claude/sidechain-tracker.js +1 -1
  35. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +2 -2
  36. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +1 -1
  37. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js +1 -1
  38. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +1 -1
  39. package/dist/server/server/agent/providers/codex-app-server-agent.js +33 -25
  40. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +1 -1
  41. package/dist/server/server/agent/providers/copilot-acp-agent.js +9 -12
  42. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +12 -3
  43. package/dist/server/server/agent/providers/diagnostic-utils.js +41 -1
  44. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +1 -0
  45. package/dist/server/server/agent/providers/generic-acp-agent.js +22 -26
  46. package/dist/server/server/agent/providers/mock-load-test-agent.js +1 -1
  47. package/dist/server/server/agent/providers/mock-slow-provider.d.ts +16 -0
  48. package/dist/server/server/agent/providers/mock-slow-provider.js +45 -0
  49. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +20 -3
  50. package/dist/server/server/agent/providers/opencode-agent.d.ts +11 -2
  51. package/dist/server/server/agent/providers/opencode-agent.js +128 -34
  52. package/dist/server/server/agent/providers/pi/agent.d.ts +5 -2
  53. package/dist/server/server/agent/providers/pi/agent.js +192 -28
  54. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +2 -2
  55. package/dist/server/server/agent-attention-policy.d.ts +1 -1
  56. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +0 -2
  57. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +0 -1
  58. package/dist/server/server/bootstrap.js +31 -17
  59. package/dist/server/server/chat/chat-service.d.ts +1 -1
  60. package/dist/server/server/chat/chat-service.js +1 -1
  61. package/dist/server/server/checkout/status-projection.d.ts +1 -1
  62. package/dist/server/server/config.js +1 -1
  63. package/dist/server/server/connection-offer.d.ts +1 -1
  64. package/dist/server/server/connection-offer.js +1 -1
  65. package/dist/server/server/daemon-config-store.d.ts +3 -3
  66. package/dist/server/server/daemon-config-store.js +1 -1
  67. package/dist/server/server/editor-targets.d.ts +1 -1
  68. package/dist/server/server/exports.d.ts +7 -9
  69. package/dist/server/server/exports.js +6 -7
  70. package/dist/server/server/loop-service.d.ts +65 -65
  71. package/dist/server/server/loop-service.js +1 -1
  72. package/dist/server/server/messages.d.ts +2 -2
  73. package/dist/server/server/messages.js +2 -2
  74. package/dist/server/server/package-version.d.ts +2 -2
  75. package/dist/server/server/paseo-worktree-archive-service.d.ts +2 -6
  76. package/dist/server/server/paseo-worktree-archive-service.js +13 -33
  77. package/dist/server/server/paseo-worktree-service.d.ts +1 -1
  78. package/dist/server/server/persisted-config.d.ts +118 -118
  79. package/dist/server/server/persisted-config.js +1 -46
  80. package/dist/server/server/persistence-hooks.d.ts +1 -4
  81. package/dist/server/server/persistence-hooks.js +1 -15
  82. package/dist/server/server/pid-lock.d.ts +2 -2
  83. package/dist/server/server/relay-transport.js +1 -2
  84. package/dist/server/server/schedule/cron.d.ts +1 -1
  85. package/dist/server/server/schedule/service.d.ts +2 -1
  86. package/dist/server/server/schedule/service.js +17 -1
  87. package/dist/server/server/schedule/store.d.ts +1 -1
  88. package/dist/server/server/schedule/store.js +1 -1
  89. package/dist/server/server/script-status-projection.d.ts +2 -2
  90. package/dist/server/server/session.d.ts +6 -18
  91. package/dist/server/server/session.js +147 -313
  92. package/dist/server/server/speech/providers/local/runtime.js +16 -79
  93. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +7 -75
  94. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +6 -108
  95. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +32 -57
  96. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +1 -1
  97. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +10 -24
  98. package/dist/server/server/voice-permission-policy.js +1 -1
  99. package/dist/server/server/websocket-server.d.ts +2 -5
  100. package/dist/server/server/websocket-server.js +9 -30
  101. package/dist/server/server/workspace-directory.js +1 -1
  102. package/dist/server/server/workspace-git-service.d.ts +5 -2
  103. package/dist/server/server/workspace-git-service.js +73 -17
  104. package/dist/server/server/workspace-registry-model.d.ts +1 -1
  105. package/dist/server/server/workspace-registry.d.ts +7 -7
  106. package/dist/server/server/worktree/commands.d.ts +51 -0
  107. package/dist/server/server/worktree/commands.js +84 -0
  108. package/dist/server/server/worktree-branch-name-generator.d.ts +1 -1
  109. package/dist/server/server/worktree-core.d.ts +1 -1
  110. package/dist/server/server/worktree-session.d.ts +1 -1
  111. package/dist/server/server/worktree-session.js +32 -39
  112. package/dist/server/services/github-service.d.ts +1 -1
  113. package/dist/server/terminal/terminal-restore.d.ts +1 -1
  114. package/dist/server/terminal/terminal-restore.js +2 -2
  115. package/dist/server/terminal/terminal-session-controller.d.ts +1 -1
  116. package/dist/server/terminal/terminal-session-controller.js +1 -1
  117. package/dist/server/terminal/terminal-worker-protocol.d.ts +1 -1
  118. package/dist/server/terminal/terminal.d.ts +1 -1
  119. package/dist/server/terminal/terminal.js +1 -1
  120. package/dist/server/terminal/worker-terminal-manager.js +1 -1
  121. package/dist/server/utils/build-metadata-prompt.js +1 -1
  122. package/dist/server/utils/checkout-git.d.ts +32 -1
  123. package/dist/server/utils/checkout-git.js +182 -41
  124. package/dist/server/utils/github-remote.d.ts +2 -2
  125. package/dist/server/utils/github-remote.js +2 -2
  126. package/dist/server/utils/paseo-config-file.d.ts +2 -2
  127. package/dist/server/utils/paseo-config-file.js +2 -2
  128. package/dist/server/utils/run-git-command.d.ts +17 -0
  129. package/dist/server/utils/run-git-command.js +86 -0
  130. package/dist/server/utils/worktree.d.ts +3 -3
  131. package/dist/server/utils/worktree.js +4 -4
  132. package/dist/src/server/agent/provider-launch-config.js +84 -106
  133. package/dist/src/server/persisted-config.js +1 -46
  134. package/package.json +7 -13
  135. package/dist/scripts/dev-runner.js.map +0 -1
  136. package/dist/scripts/supervisor-entrypoint.js.map +0 -1
  137. package/dist/scripts/supervisor-log-config.js.map +0 -1
  138. package/dist/scripts/supervisor.js.map +0 -1
  139. package/dist/server/client/daemon-client-relay-e2ee-transport.d.ts +0 -8
  140. package/dist/server/client/daemon-client-relay-e2ee-transport.d.ts.map +0 -1
  141. package/dist/server/client/daemon-client-relay-e2ee-transport.js +0 -161
  142. package/dist/server/client/daemon-client-relay-e2ee-transport.js.map +0 -1
  143. package/dist/server/client/daemon-client-runtime-metrics.d.ts +0 -39
  144. package/dist/server/client/daemon-client-runtime-metrics.d.ts.map +0 -1
  145. package/dist/server/client/daemon-client-runtime-metrics.js +0 -173
  146. package/dist/server/client/daemon-client-runtime-metrics.js.map +0 -1
  147. package/dist/server/client/daemon-client-transport-types.d.ts +0 -36
  148. package/dist/server/client/daemon-client-transport-types.d.ts.map +0 -1
  149. package/dist/server/client/daemon-client-transport-types.js +0 -2
  150. package/dist/server/client/daemon-client-transport-types.js.map +0 -1
  151. package/dist/server/client/daemon-client-transport-utils.d.ts +0 -9
  152. package/dist/server/client/daemon-client-transport-utils.d.ts.map +0 -1
  153. package/dist/server/client/daemon-client-transport-utils.js +0 -121
  154. package/dist/server/client/daemon-client-transport-utils.js.map +0 -1
  155. package/dist/server/client/daemon-client-transport.d.ts +0 -5
  156. package/dist/server/client/daemon-client-transport.d.ts.map +0 -1
  157. package/dist/server/client/daemon-client-transport.js +0 -4
  158. package/dist/server/client/daemon-client-transport.js.map +0 -1
  159. package/dist/server/client/daemon-client-websocket-transport.d.ts +0 -8
  160. package/dist/server/client/daemon-client-websocket-transport.d.ts.map +0 -1
  161. package/dist/server/client/daemon-client-websocket-transport.js +0 -120
  162. package/dist/server/client/daemon-client-websocket-transport.js.map +0 -1
  163. package/dist/server/client/daemon-client.d.ts +0 -880
  164. package/dist/server/client/daemon-client.d.ts.map +0 -1
  165. package/dist/server/client/daemon-client.js +0 -3504
  166. package/dist/server/client/daemon-client.js.map +0 -1
  167. package/dist/server/client/terminal-stream-router.d.ts +0 -28
  168. package/dist/server/client/terminal-stream-router.d.ts.map +0 -1
  169. package/dist/server/client/terminal-stream-router.js +0 -108
  170. package/dist/server/client/terminal-stream-router.js.map +0 -1
  171. package/dist/server/server/agent/activity-curator.d.ts.map +0 -1
  172. package/dist/server/server/agent/activity-curator.js.map +0 -1
  173. package/dist/server/server/agent/agent-archive.d.ts.map +0 -1
  174. package/dist/server/server/agent/agent-archive.js.map +0 -1
  175. package/dist/server/server/agent/agent-loading.d.ts.map +0 -1
  176. package/dist/server/server/agent/agent-loading.js.map +0 -1
  177. package/dist/server/server/agent/agent-manager.d.ts.map +0 -1
  178. package/dist/server/server/agent/agent-manager.js.map +0 -1
  179. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +0 -1
  180. package/dist/server/server/agent/agent-metadata-generator.js.map +0 -1
  181. package/dist/server/server/agent/agent-projections.d.ts.map +0 -1
  182. package/dist/server/server/agent/agent-projections.js.map +0 -1
  183. package/dist/server/server/agent/agent-prompt.d.ts.map +0 -1
  184. package/dist/server/server/agent/agent-prompt.js.map +0 -1
  185. package/dist/server/server/agent/agent-response-loop.d.ts.map +0 -1
  186. package/dist/server/server/agent/agent-response-loop.js.map +0 -1
  187. package/dist/server/server/agent/agent-sdk-types.d.ts.map +0 -1
  188. package/dist/server/server/agent/agent-sdk-types.js.map +0 -1
  189. package/dist/server/server/agent/agent-storage.d.ts.map +0 -1
  190. package/dist/server/server/agent/agent-storage.js.map +0 -1
  191. package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +0 -1
  192. package/dist/server/server/agent/agent-stream-coalescer.js.map +0 -1
  193. package/dist/server/server/agent/agent-timeline-store-types.d.ts.map +0 -1
  194. package/dist/server/server/agent/agent-timeline-store-types.js.map +0 -1
  195. package/dist/server/server/agent/agent-timeline-store.d.ts.map +0 -1
  196. package/dist/server/server/agent/agent-timeline-store.js.map +0 -1
  197. package/dist/server/server/agent/agent-title-limits.d.ts +0 -3
  198. package/dist/server/server/agent/agent-title-limits.d.ts.map +0 -1
  199. package/dist/server/server/agent/agent-title-limits.js +0 -3
  200. package/dist/server/server/agent/agent-title-limits.js.map +0 -1
  201. package/dist/server/server/agent/audio-utils.d.ts.map +0 -1
  202. package/dist/server/server/agent/audio-utils.js.map +0 -1
  203. package/dist/server/server/agent/create-agent-lifecycle-dispatch.d.ts.map +0 -1
  204. package/dist/server/server/agent/create-agent-lifecycle-dispatch.js.map +0 -1
  205. package/dist/server/server/agent/create-agent-mode.d.ts.map +0 -1
  206. package/dist/server/server/agent/create-agent-mode.js.map +0 -1
  207. package/dist/server/server/agent/create-agent-title.d.ts.map +0 -1
  208. package/dist/server/server/agent/create-agent-title.js.map +0 -1
  209. package/dist/server/server/agent/dictation-debug.d.ts.map +0 -1
  210. package/dist/server/server/agent/dictation-debug.js.map +0 -1
  211. package/dist/server/server/agent/foreground-run-state.d.ts.map +0 -1
  212. package/dist/server/server/agent/foreground-run-state.js.map +0 -1
  213. package/dist/server/server/agent/import-sessions.d.ts.map +0 -1
  214. package/dist/server/server/agent/import-sessions.js.map +0 -1
  215. package/dist/server/server/agent/mcp-server.d.ts.map +0 -1
  216. package/dist/server/server/agent/mcp-server.js.map +0 -1
  217. package/dist/server/server/agent/mcp-shared.d.ts.map +0 -1
  218. package/dist/server/server/agent/mcp-shared.js.map +0 -1
  219. package/dist/server/server/agent/model-resolver.d.ts +0 -11
  220. package/dist/server/server/agent/model-resolver.d.ts.map +0 -1
  221. package/dist/server/server/agent/model-resolver.js +0 -27
  222. package/dist/server/server/agent/model-resolver.js.map +0 -1
  223. package/dist/server/server/agent/pcm16-resampler.d.ts.map +0 -1
  224. package/dist/server/server/agent/pcm16-resampler.js.map +0 -1
  225. package/dist/server/server/agent/prompt-attachments.d.ts.map +0 -1
  226. package/dist/server/server/agent/prompt-attachments.js.map +0 -1
  227. package/dist/server/server/agent/provider-history-timestamps.d.ts.map +0 -1
  228. package/dist/server/server/agent/provider-history-timestamps.js.map +0 -1
  229. package/dist/server/server/agent/provider-launch-config.d.ts.map +0 -1
  230. package/dist/server/server/agent/provider-launch-config.js.map +0 -1
  231. package/dist/server/server/agent/provider-manifest.d.ts +0 -33
  232. package/dist/server/server/agent/provider-manifest.d.ts.map +0 -1
  233. package/dist/server/server/agent/provider-manifest.js +0 -211
  234. package/dist/server/server/agent/provider-manifest.js.map +0 -1
  235. package/dist/server/server/agent/provider-registry.d.ts.map +0 -1
  236. package/dist/server/server/agent/provider-registry.js.map +0 -1
  237. package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +0 -1
  238. package/dist/server/server/agent/provider-snapshot-manager.js.map +0 -1
  239. package/dist/server/server/agent/providers/acp-agent.d.ts.map +0 -1
  240. package/dist/server/server/agent/providers/acp-agent.js.map +0 -1
  241. package/dist/server/server/agent/providers/claude/agent.d.ts.map +0 -1
  242. package/dist/server/server/agent/providers/claude/agent.js.map +0 -1
  243. package/dist/server/server/agent/providers/claude/models.d.ts.map +0 -1
  244. package/dist/server/server/agent/providers/claude/models.js.map +0 -1
  245. package/dist/server/server/agent/providers/claude/partial-json.d.ts.map +0 -1
  246. package/dist/server/server/agent/providers/claude/partial-json.js.map +0 -1
  247. package/dist/server/server/agent/providers/claude/project-dir.d.ts.map +0 -1
  248. package/dist/server/server/agent/providers/claude/project-dir.js.map +0 -1
  249. package/dist/server/server/agent/providers/claude/query.d.ts.map +0 -1
  250. package/dist/server/server/agent/providers/claude/query.js.map +0 -1
  251. package/dist/server/server/agent/providers/claude/rewind.d.ts.map +0 -1
  252. package/dist/server/server/agent/providers/claude/rewind.js.map +0 -1
  253. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts.map +0 -1
  254. package/dist/server/server/agent/providers/claude/sidechain-tracker.js.map +0 -1
  255. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +0 -1
  256. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +0 -1
  257. package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.d.ts.map +0 -1
  258. package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.js.map +0 -1
  259. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +0 -1
  260. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +0 -1
  261. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +0 -1
  262. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +0 -1
  263. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts.map +0 -1
  264. package/dist/server/server/agent/providers/codex/app-server-transport.js.map +0 -1
  265. package/dist/server/server/agent/providers/codex/rewind.d.ts.map +0 -1
  266. package/dist/server/server/agent/providers/codex/rewind.js.map +0 -1
  267. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts.map +0 -1
  268. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js.map +0 -1
  269. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts.map +0 -1
  270. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js.map +0 -1
  271. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +0 -1
  272. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +0 -1
  273. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +0 -1
  274. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +0 -1
  275. package/dist/server/server/agent/providers/codex-feature-definitions.d.ts.map +0 -1
  276. package/dist/server/server/agent/providers/codex-feature-definitions.js.map +0 -1
  277. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +0 -1
  278. package/dist/server/server/agent/providers/copilot-acp-agent.js.map +0 -1
  279. package/dist/server/server/agent/providers/cursor-acp-agent.d.ts.map +0 -1
  280. package/dist/server/server/agent/providers/cursor-acp-agent.js.map +0 -1
  281. package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +0 -1
  282. package/dist/server/server/agent/providers/diagnostic-utils.js.map +0 -1
  283. package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +0 -1
  284. package/dist/server/server/agent/providers/generic-acp-agent.js.map +0 -1
  285. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +0 -1
  286. package/dist/server/server/agent/providers/mock-load-test-agent.js.map +0 -1
  287. package/dist/server/server/agent/providers/opencode/rewind.d.ts.map +0 -1
  288. package/dist/server/server/agent/providers/opencode/rewind.js.map +0 -1
  289. package/dist/server/server/agent/providers/opencode/runtime.d.ts.map +0 -1
  290. package/dist/server/server/agent/providers/opencode/runtime.js.map +0 -1
  291. package/dist/server/server/agent/providers/opencode/server-manager.d.ts.map +0 -1
  292. package/dist/server/server/agent/providers/opencode/server-manager.js.map +0 -1
  293. package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts.map +0 -1
  294. package/dist/server/server/agent/providers/opencode/test-server-manager.js.map +0 -1
  295. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.d.ts.map +0 -1
  296. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.js.map +0 -1
  297. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts.map +0 -1
  298. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js.map +0 -1
  299. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +0 -1
  300. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +0 -1
  301. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +0 -1
  302. package/dist/server/server/agent/providers/opencode-agent.js.map +0 -1
  303. package/dist/server/server/agent/providers/pi/agent.d.ts.map +0 -1
  304. package/dist/server/server/agent/providers/pi/agent.js.map +0 -1
  305. package/dist/server/server/agent/providers/pi/cli-runtime.d.ts.map +0 -1
  306. package/dist/server/server/agent/providers/pi/cli-runtime.js.map +0 -1
  307. package/dist/server/server/agent/providers/pi/history-mapper.d.ts.map +0 -1
  308. package/dist/server/server/agent/providers/pi/history-mapper.js.map +0 -1
  309. package/dist/server/server/agent/providers/pi/rewind.d.ts.map +0 -1
  310. package/dist/server/server/agent/providers/pi/rewind.js.map +0 -1
  311. package/dist/server/server/agent/providers/pi/rpc-types.d.ts.map +0 -1
  312. package/dist/server/server/agent/providers/pi/rpc-types.js.map +0 -1
  313. package/dist/server/server/agent/providers/pi/runtime.d.ts.map +0 -1
  314. package/dist/server/server/agent/providers/pi/runtime.js.map +0 -1
  315. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts.map +0 -1
  316. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js.map +0 -1
  317. package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts.map +0 -1
  318. package/dist/server/server/agent/providers/pi/tool-call-mapper.js.map +0 -1
  319. package/dist/server/server/agent/providers/provider-image-output.d.ts.map +0 -1
  320. package/dist/server/server/agent/providers/provider-image-output.js.map +0 -1
  321. package/dist/server/server/agent/providers/provider-runner.d.ts.map +0 -1
  322. package/dist/server/server/agent/providers/provider-runner.js.map +0 -1
  323. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +0 -1
  324. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +0 -1
  325. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +0 -1
  326. package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +0 -1
  327. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +0 -1
  328. package/dist/server/server/agent/providers/tool-call-mapper-utils.js.map +0 -1
  329. package/dist/server/server/agent/recordings-debug.d.ts.map +0 -1
  330. package/dist/server/server/agent/recordings-debug.js.map +0 -1
  331. package/dist/server/server/agent/rewind/rewind.d.ts.map +0 -1
  332. package/dist/server/server/agent/rewind/rewind.js.map +0 -1
  333. package/dist/server/server/agent/rewind/test-rewind-session.d.ts.map +0 -1
  334. package/dist/server/server/agent/rewind/test-rewind-session.js.map +0 -1
  335. package/dist/server/server/agent/stt-debug.d.ts.map +0 -1
  336. package/dist/server/server/agent/stt-debug.js.map +0 -1
  337. package/dist/server/server/agent/stt-manager.d.ts.map +0 -1
  338. package/dist/server/server/agent/stt-manager.js.map +0 -1
  339. package/dist/server/server/agent/system-prompt.d.ts.map +0 -1
  340. package/dist/server/server/agent/system-prompt.js.map +0 -1
  341. package/dist/server/server/agent/timeline-append.d.ts.map +0 -1
  342. package/dist/server/server/agent/timeline-append.js.map +0 -1
  343. package/dist/server/server/agent/timeline-projection.d.ts.map +0 -1
  344. package/dist/server/server/agent/timeline-projection.js.map +0 -1
  345. package/dist/server/server/agent/tool-name-normalization.d.ts +0 -9
  346. package/dist/server/server/agent/tool-name-normalization.d.ts.map +0 -1
  347. package/dist/server/server/agent/tool-name-normalization.js +0 -82
  348. package/dist/server/server/agent/tool-name-normalization.js.map +0 -1
  349. package/dist/server/server/agent/tts-debug.d.ts.map +0 -1
  350. package/dist/server/server/agent/tts-debug.js.map +0 -1
  351. package/dist/server/server/agent/tts-manager.d.ts.map +0 -1
  352. package/dist/server/server/agent/tts-manager.js.map +0 -1
  353. package/dist/server/server/agent/wait-for-agent-tracker.d.ts.map +0 -1
  354. package/dist/server/server/agent/wait-for-agent-tracker.js.map +0 -1
  355. package/dist/server/server/agent-attention-policy.d.ts.map +0 -1
  356. package/dist/server/server/agent-attention-policy.js.map +0 -1
  357. package/dist/server/server/auth.d.ts.map +0 -1
  358. package/dist/server/server/auth.js.map +0 -1
  359. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts.map +0 -1
  360. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js.map +0 -1
  361. package/dist/server/server/auto-archive-on-merge/index.d.ts.map +0 -1
  362. package/dist/server/server/auto-archive-on-merge/index.js.map +0 -1
  363. package/dist/server/server/bootstrap.d.ts.map +0 -1
  364. package/dist/server/server/bootstrap.js.map +0 -1
  365. package/dist/server/server/chat/chat-mentions.d.ts.map +0 -1
  366. package/dist/server/server/chat/chat-mentions.js.map +0 -1
  367. package/dist/server/server/chat/chat-rpc-schemas.d.ts +0 -728
  368. package/dist/server/server/chat/chat-rpc-schemas.d.ts.map +0 -1
  369. package/dist/server/server/chat/chat-rpc-schemas.js +0 -103
  370. package/dist/server/server/chat/chat-rpc-schemas.js.map +0 -1
  371. package/dist/server/server/chat/chat-service.d.ts.map +0 -1
  372. package/dist/server/server/chat/chat-service.js.map +0 -1
  373. package/dist/server/server/chat/chat-types.d.ts +0 -75
  374. package/dist/server/server/chat/chat-types.d.ts.map +0 -1
  375. package/dist/server/server/chat/chat-types.js +0 -22
  376. package/dist/server/server/chat/chat-types.js.map +0 -1
  377. package/dist/server/server/checkout/status-projection.d.ts.map +0 -1
  378. package/dist/server/server/checkout/status-projection.js.map +0 -1
  379. package/dist/server/server/checkout-diff-manager.d.ts.map +0 -1
  380. package/dist/server/server/checkout-diff-manager.js.map +0 -1
  381. package/dist/server/server/checkout-git-utils.d.ts.map +0 -1
  382. package/dist/server/server/checkout-git-utils.js.map +0 -1
  383. package/dist/server/server/client-message-id.d.ts.map +0 -1
  384. package/dist/server/server/client-message-id.js.map +0 -1
  385. package/dist/server/server/config.d.ts.map +0 -1
  386. package/dist/server/server/config.js.map +0 -1
  387. package/dist/server/server/connection-offer.d.ts.map +0 -1
  388. package/dist/server/server/connection-offer.js.map +0 -1
  389. package/dist/server/server/daemon-config-store.d.ts.map +0 -1
  390. package/dist/server/server/daemon-config-store.js.map +0 -1
  391. package/dist/server/server/daemon-keypair.d.ts.map +0 -1
  392. package/dist/server/server/daemon-keypair.js.map +0 -1
  393. package/dist/server/server/daemon-version.d.ts.map +0 -1
  394. package/dist/server/server/daemon-version.js.map +0 -1
  395. package/dist/server/server/daemon-worker.d.ts.map +0 -1
  396. package/dist/server/server/daemon-worker.js.map +0 -1
  397. package/dist/server/server/dictation/dictation-stream-manager.d.ts.map +0 -1
  398. package/dist/server/server/dictation/dictation-stream-manager.js.map +0 -1
  399. package/dist/server/server/editor-targets.d.ts.map +0 -1
  400. package/dist/server/server/editor-targets.js.map +0 -1
  401. package/dist/server/server/exports.d.ts.map +0 -1
  402. package/dist/server/server/exports.js.map +0 -1
  403. package/dist/server/server/file-download/token-store.d.ts.map +0 -1
  404. package/dist/server/server/file-download/token-store.js.map +0 -1
  405. package/dist/server/server/file-explorer/service.d.ts.map +0 -1
  406. package/dist/server/server/file-explorer/service.js.map +0 -1
  407. package/dist/server/server/hostnames.d.ts.map +0 -1
  408. package/dist/server/server/hostnames.js.map +0 -1
  409. package/dist/server/server/json-utils.d.ts.map +0 -1
  410. package/dist/server/server/json-utils.js.map +0 -1
  411. package/dist/server/server/logger.d.ts.map +0 -1
  412. package/dist/server/server/logger.js.map +0 -1
  413. package/dist/server/server/loop/rpc-schemas.d.ts +0 -3005
  414. package/dist/server/server/loop/rpc-schemas.d.ts.map +0 -1
  415. package/dist/server/server/loop/rpc-schemas.js +0 -163
  416. package/dist/server/server/loop/rpc-schemas.js.map +0 -1
  417. package/dist/server/server/loop-service.d.ts.map +0 -1
  418. package/dist/server/server/loop-service.js.map +0 -1
  419. package/dist/server/server/messages.d.ts.map +0 -1
  420. package/dist/server/server/messages.js.map +0 -1
  421. package/dist/server/server/package-version.d.ts.map +0 -1
  422. package/dist/server/server/package-version.js.map +0 -1
  423. package/dist/server/server/pagination/cursor.d.ts.map +0 -1
  424. package/dist/server/server/pagination/cursor.js.map +0 -1
  425. package/dist/server/server/pagination/sortable-pager.d.ts.map +0 -1
  426. package/dist/server/server/pagination/sortable-pager.js.map +0 -1
  427. package/dist/server/server/pairing-offer.d.ts.map +0 -1
  428. package/dist/server/server/pairing-offer.js.map +0 -1
  429. package/dist/server/server/pairing-qr.d.ts.map +0 -1
  430. package/dist/server/server/pairing-qr.js.map +0 -1
  431. package/dist/server/server/paseo-env.d.ts.map +0 -1
  432. package/dist/server/server/paseo-env.js.map +0 -1
  433. package/dist/server/server/paseo-home.d.ts.map +0 -1
  434. package/dist/server/server/paseo-home.js.map +0 -1
  435. package/dist/server/server/paseo-worktree-archive-service.d.ts.map +0 -1
  436. package/dist/server/server/paseo-worktree-archive-service.js.map +0 -1
  437. package/dist/server/server/paseo-worktree-service.d.ts.map +0 -1
  438. package/dist/server/server/paseo-worktree-service.js.map +0 -1
  439. package/dist/server/server/path-utils.d.ts.map +0 -1
  440. package/dist/server/server/path-utils.js.map +0 -1
  441. package/dist/server/server/persisted-config.d.ts.map +0 -1
  442. package/dist/server/server/persisted-config.js.map +0 -1
  443. package/dist/server/server/persistence-hooks.d.ts.map +0 -1
  444. package/dist/server/server/persistence-hooks.js.map +0 -1
  445. package/dist/server/server/pid-lock.d.ts.map +0 -1
  446. package/dist/server/server/pid-lock.js.map +0 -1
  447. package/dist/server/server/private-files.d.ts.map +0 -1
  448. package/dist/server/server/private-files.js.map +0 -1
  449. package/dist/server/server/push/notifications.d.ts.map +0 -1
  450. package/dist/server/server/push/notifications.js.map +0 -1
  451. package/dist/server/server/push/push-service.d.ts.map +0 -1
  452. package/dist/server/server/push/push-service.js.map +0 -1
  453. package/dist/server/server/push/token-store.d.ts.map +0 -1
  454. package/dist/server/server/push/token-store.js.map +0 -1
  455. package/dist/server/server/relay-transport.d.ts.map +0 -1
  456. package/dist/server/server/relay-transport.js.map +0 -1
  457. package/dist/server/server/resolve-worktree-creation-intent.d.ts.map +0 -1
  458. package/dist/server/server/resolve-worktree-creation-intent.js.map +0 -1
  459. package/dist/server/server/schedule/cron.d.ts.map +0 -1
  460. package/dist/server/server/schedule/cron.js.map +0 -1
  461. package/dist/server/server/schedule/rpc-schemas.d.ts +0 -3909
  462. package/dist/server/server/schedule/rpc-schemas.d.ts.map +0 -1
  463. package/dist/server/server/schedule/rpc-schemas.js +0 -151
  464. package/dist/server/server/schedule/rpc-schemas.js.map +0 -1
  465. package/dist/server/server/schedule/service.d.ts.map +0 -1
  466. package/dist/server/server/schedule/service.js.map +0 -1
  467. package/dist/server/server/schedule/store.d.ts.map +0 -1
  468. package/dist/server/server/schedule/store.js.map +0 -1
  469. package/dist/server/server/schedule/types.d.ts +0 -726
  470. package/dist/server/server/schedule/types.d.ts.map +0 -1
  471. package/dist/server/server/schedule/types.js +0 -73
  472. package/dist/server/server/schedule/types.js.map +0 -1
  473. package/dist/server/server/script-health-monitor.d.ts.map +0 -1
  474. package/dist/server/server/script-health-monitor.js.map +0 -1
  475. package/dist/server/server/script-proxy.d.ts.map +0 -1
  476. package/dist/server/server/script-proxy.js.map +0 -1
  477. package/dist/server/server/script-route-branch-handler.d.ts.map +0 -1
  478. package/dist/server/server/script-route-branch-handler.js.map +0 -1
  479. package/dist/server/server/script-status-projection.d.ts.map +0 -1
  480. package/dist/server/server/script-status-projection.js.map +0 -1
  481. package/dist/server/server/server-id.d.ts.map +0 -1
  482. package/dist/server/server/server-id.js.map +0 -1
  483. package/dist/server/server/session.d.ts.map +0 -1
  484. package/dist/server/server/session.js.map +0 -1
  485. package/dist/server/server/speech/audio.d.ts.map +0 -1
  486. package/dist/server/server/speech/audio.js.map +0 -1
  487. package/dist/server/server/speech/provider-resolver.d.ts.map +0 -1
  488. package/dist/server/server/speech/provider-resolver.js.map +0 -1
  489. package/dist/server/server/speech/providers/local/config.d.ts.map +0 -1
  490. package/dist/server/server/speech/providers/local/config.js.map +0 -1
  491. package/dist/server/server/speech/providers/local/models.d.ts.map +0 -1
  492. package/dist/server/server/speech/providers/local/models.js.map +0 -1
  493. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts +0 -24
  494. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +0 -1
  495. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +0 -459
  496. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +0 -1
  497. package/dist/server/server/speech/providers/local/runtime.d.ts.map +0 -1
  498. package/dist/server/server/speech/providers/local/runtime.js.map +0 -1
  499. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +0 -1
  500. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +0 -1
  501. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +0 -1
  502. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +0 -1
  503. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts.map +0 -1
  504. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +0 -1
  505. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts +0 -56
  506. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts.map +0 -1
  507. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +0 -91
  508. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +0 -1
  509. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts +0 -7
  510. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts.map +0 -1
  511. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.js +0 -11
  512. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.js.map +0 -1
  513. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +0 -1
  514. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +0 -1
  515. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts.map +0 -1
  516. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +0 -1
  517. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts.map +0 -1
  518. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +0 -1
  519. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts +0 -23
  520. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts.map +0 -1
  521. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +0 -116
  522. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +0 -1
  523. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts.map +0 -1
  524. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js.map +0 -1
  525. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts +0 -23
  526. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts.map +0 -1
  527. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +0 -141
  528. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +0 -1
  529. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts.map +0 -1
  530. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +0 -1
  531. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts.map +0 -1
  532. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js.map +0 -1
  533. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts.map +0 -1
  534. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js.map +0 -1
  535. package/dist/server/server/speech/providers/openai/config.d.ts.map +0 -1
  536. package/dist/server/server/speech/providers/openai/config.js.map +0 -1
  537. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts.map +0 -1
  538. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js.map +0 -1
  539. package/dist/server/server/speech/providers/openai/runtime.d.ts.map +0 -1
  540. package/dist/server/server/speech/providers/openai/runtime.js.map +0 -1
  541. package/dist/server/server/speech/providers/openai/stt.d.ts.map +0 -1
  542. package/dist/server/server/speech/providers/openai/stt.js.map +0 -1
  543. package/dist/server/server/speech/providers/openai/tts.d.ts.map +0 -1
  544. package/dist/server/server/speech/providers/openai/tts.js.map +0 -1
  545. package/dist/server/server/speech/speech-config-resolver.d.ts.map +0 -1
  546. package/dist/server/server/speech/speech-config-resolver.js.map +0 -1
  547. package/dist/server/server/speech/speech-provider.d.ts.map +0 -1
  548. package/dist/server/server/speech/speech-provider.js.map +0 -1
  549. package/dist/server/server/speech/speech-runtime.d.ts.map +0 -1
  550. package/dist/server/server/speech/speech-runtime.js.map +0 -1
  551. package/dist/server/server/speech/speech-types.d.ts.map +0 -1
  552. package/dist/server/server/speech/speech-types.js.map +0 -1
  553. package/dist/server/server/speech/turn-detection-provider.d.ts.map +0 -1
  554. package/dist/server/server/speech/turn-detection-provider.js.map +0 -1
  555. package/dist/server/server/utils/diff-highlighter.d.ts.map +0 -1
  556. package/dist/server/server/utils/diff-highlighter.js.map +0 -1
  557. package/dist/server/server/voice/voice-turn-controller.d.ts.map +0 -1
  558. package/dist/server/server/voice/voice-turn-controller.js.map +0 -1
  559. package/dist/server/server/voice-config.d.ts.map +0 -1
  560. package/dist/server/server/voice-config.js.map +0 -1
  561. package/dist/server/server/voice-permission-policy.d.ts.map +0 -1
  562. package/dist/server/server/voice-permission-policy.js.map +0 -1
  563. package/dist/server/server/voice-types.d.ts.map +0 -1
  564. package/dist/server/server/voice-types.js.map +0 -1
  565. package/dist/server/server/websocket/runtime-metrics.d.ts.map +0 -1
  566. package/dist/server/server/websocket/runtime-metrics.js.map +0 -1
  567. package/dist/server/server/websocket-server.d.ts.map +0 -1
  568. package/dist/server/server/websocket-server.js.map +0 -1
  569. package/dist/server/server/workspace-archive-service.d.ts.map +0 -1
  570. package/dist/server/server/workspace-archive-service.js.map +0 -1
  571. package/dist/server/server/workspace-directory.d.ts.map +0 -1
  572. package/dist/server/server/workspace-directory.js.map +0 -1
  573. package/dist/server/server/workspace-git-metadata.d.ts.map +0 -1
  574. package/dist/server/server/workspace-git-metadata.js.map +0 -1
  575. package/dist/server/server/workspace-git-service.d.ts.map +0 -1
  576. package/dist/server/server/workspace-git-service.js.map +0 -1
  577. package/dist/server/server/workspace-reconciliation-service.d.ts.map +0 -1
  578. package/dist/server/server/workspace-reconciliation-service.js.map +0 -1
  579. package/dist/server/server/workspace-registry-bootstrap.d.ts.map +0 -1
  580. package/dist/server/server/workspace-registry-bootstrap.js.map +0 -1
  581. package/dist/server/server/workspace-registry-model.d.ts.map +0 -1
  582. package/dist/server/server/workspace-registry-model.js.map +0 -1
  583. package/dist/server/server/workspace-registry.d.ts.map +0 -1
  584. package/dist/server/server/workspace-registry.js.map +0 -1
  585. package/dist/server/server/workspace-script-runtime-store.d.ts.map +0 -1
  586. package/dist/server/server/workspace-script-runtime-store.js.map +0 -1
  587. package/dist/server/server/workspace-service-env.d.ts.map +0 -1
  588. package/dist/server/server/workspace-service-env.js.map +0 -1
  589. package/dist/server/server/workspace-service-port-registry.d.ts.map +0 -1
  590. package/dist/server/server/workspace-service-port-registry.js.map +0 -1
  591. package/dist/server/server/worktree-bootstrap.d.ts.map +0 -1
  592. package/dist/server/server/worktree-bootstrap.js.map +0 -1
  593. package/dist/server/server/worktree-branch-name-generator.d.ts.map +0 -1
  594. package/dist/server/server/worktree-branch-name-generator.js.map +0 -1
  595. package/dist/server/server/worktree-core.d.ts.map +0 -1
  596. package/dist/server/server/worktree-core.js.map +0 -1
  597. package/dist/server/server/worktree-errors.d.ts.map +0 -1
  598. package/dist/server/server/worktree-errors.js.map +0 -1
  599. package/dist/server/server/worktree-session.d.ts.map +0 -1
  600. package/dist/server/server/worktree-session.js.map +0 -1
  601. package/dist/server/services/github-service.d.ts.map +0 -1
  602. package/dist/server/services/github-service.js.map +0 -1
  603. package/dist/server/shared/agent-attention-notification.d.ts +0 -41
  604. package/dist/server/shared/agent-attention-notification.d.ts.map +0 -1
  605. package/dist/server/shared/agent-attention-notification.js +0 -140
  606. package/dist/server/shared/agent-attention-notification.js.map +0 -1
  607. package/dist/server/shared/agent-labels.d.ts +0 -2
  608. package/dist/server/shared/agent-labels.d.ts.map +0 -1
  609. package/dist/server/shared/agent-labels.js +0 -2
  610. package/dist/server/shared/agent-labels.js.map +0 -1
  611. package/dist/server/shared/agent-lifecycle.d.ts +0 -3
  612. package/dist/server/shared/agent-lifecycle.d.ts.map +0 -1
  613. package/dist/server/shared/agent-lifecycle.js +0 -8
  614. package/dist/server/shared/agent-lifecycle.js.map +0 -1
  615. package/dist/server/shared/agent-state-bucket.d.ts +0 -13
  616. package/dist/server/shared/agent-state-bucket.d.ts.map +0 -1
  617. package/dist/server/shared/agent-state-bucket.js +0 -41
  618. package/dist/server/shared/agent-state-bucket.js.map +0 -1
  619. package/dist/server/shared/binary-frames/file-transfer.d.ts +0 -56
  620. package/dist/server/shared/binary-frames/file-transfer.d.ts.map +0 -1
  621. package/dist/server/shared/binary-frames/file-transfer.js +0 -108
  622. package/dist/server/shared/binary-frames/file-transfer.js.map +0 -1
  623. package/dist/server/shared/binary-frames/index.d.ts +0 -3
  624. package/dist/server/shared/binary-frames/index.d.ts.map +0 -1
  625. package/dist/server/shared/binary-frames/index.js +0 -3
  626. package/dist/server/shared/binary-frames/index.js.map +0 -1
  627. package/dist/server/shared/binary-frames/terminal.d.ts +0 -37
  628. package/dist/server/shared/binary-frames/terminal.d.ts.map +0 -1
  629. package/dist/server/shared/binary-frames/terminal.js +0 -101
  630. package/dist/server/shared/binary-frames/terminal.js.map +0 -1
  631. package/dist/server/shared/client-capabilities.d.ts +0 -5
  632. package/dist/server/shared/client-capabilities.d.ts.map +0 -1
  633. package/dist/server/shared/client-capabilities.js +0 -4
  634. package/dist/server/shared/client-capabilities.js.map +0 -1
  635. package/dist/server/shared/connection-offer.d.ts +0 -80
  636. package/dist/server/shared/connection-offer.d.ts.map +0 -1
  637. package/dist/server/shared/connection-offer.js +0 -53
  638. package/dist/server/shared/connection-offer.js.map +0 -1
  639. package/dist/server/shared/daemon-endpoints.d.ts +0 -47
  640. package/dist/server/shared/daemon-endpoints.d.ts.map +0 -1
  641. package/dist/server/shared/daemon-endpoints.js +0 -201
  642. package/dist/server/shared/daemon-endpoints.js.map +0 -1
  643. package/dist/server/shared/error-utils.d.ts +0 -11
  644. package/dist/server/shared/error-utils.d.ts.map +0 -1
  645. package/dist/server/shared/error-utils.js +0 -27
  646. package/dist/server/shared/error-utils.js.map +0 -1
  647. package/dist/server/shared/git-remote.d.ts +0 -16
  648. package/dist/server/shared/git-remote.d.ts.map +0 -1
  649. package/dist/server/shared/git-remote.js +0 -72
  650. package/dist/server/shared/git-remote.js.map +0 -1
  651. package/dist/server/shared/host-connection-schema.d.ts +0 -23
  652. package/dist/server/shared/host-connection-schema.d.ts.map +0 -1
  653. package/dist/server/shared/host-connection-schema.js +0 -9
  654. package/dist/server/shared/host-connection-schema.js.map +0 -1
  655. package/dist/server/shared/importable-providers.d.ts +0 -7
  656. package/dist/server/shared/importable-providers.d.ts.map +0 -1
  657. package/dist/server/shared/importable-providers.js +0 -7
  658. package/dist/server/shared/importable-providers.js.map +0 -1
  659. package/dist/server/shared/literal-union.d.ts +0 -2
  660. package/dist/server/shared/literal-union.d.ts.map +0 -1
  661. package/dist/server/shared/literal-union.js +0 -2
  662. package/dist/server/shared/literal-union.js.map +0 -1
  663. package/dist/server/shared/messages.d.ts +0 -141002
  664. package/dist/server/shared/messages.d.ts.map +0 -1
  665. package/dist/server/shared/messages.js +0 -3320
  666. package/dist/server/shared/messages.js.map +0 -1
  667. package/dist/server/shared/path-utils.d.ts +0 -2
  668. package/dist/server/shared/path-utils.d.ts.map +0 -1
  669. package/dist/server/shared/path-utils.js +0 -16
  670. package/dist/server/shared/path-utils.js.map +0 -1
  671. package/dist/server/shared/terminal-input-mode.d.ts +0 -26
  672. package/dist/server/shared/terminal-input-mode.d.ts.map +0 -1
  673. package/dist/server/shared/terminal-input-mode.js +0 -151
  674. package/dist/server/shared/terminal-input-mode.js.map +0 -1
  675. package/dist/server/shared/terminal-snapshot.d.ts +0 -3
  676. package/dist/server/shared/terminal-snapshot.d.ts.map +0 -1
  677. package/dist/server/shared/terminal-snapshot.js +0 -165
  678. package/dist/server/shared/terminal-snapshot.js.map +0 -1
  679. package/dist/server/shared/tool-call-display.d.ts +0 -11
  680. package/dist/server/shared/tool-call-display.d.ts.map +0 -1
  681. package/dist/server/shared/tool-call-display.js +0 -135
  682. package/dist/server/shared/tool-call-display.js.map +0 -1
  683. package/dist/server/terminal/terminal-capture.d.ts.map +0 -1
  684. package/dist/server/terminal/terminal-capture.js.map +0 -1
  685. package/dist/server/terminal/terminal-manager-factory.d.ts.map +0 -1
  686. package/dist/server/terminal/terminal-manager-factory.js.map +0 -1
  687. package/dist/server/terminal/terminal-manager.d.ts.map +0 -1
  688. package/dist/server/terminal/terminal-manager.js.map +0 -1
  689. package/dist/server/terminal/terminal-output-coalescer.d.ts.map +0 -1
  690. package/dist/server/terminal/terminal-output-coalescer.js.map +0 -1
  691. package/dist/server/terminal/terminal-restore.d.ts.map +0 -1
  692. package/dist/server/terminal/terminal-restore.js.map +0 -1
  693. package/dist/server/terminal/terminal-session-controller.d.ts.map +0 -1
  694. package/dist/server/terminal/terminal-session-controller.js.map +0 -1
  695. package/dist/server/terminal/terminal-worker-process.d.ts.map +0 -1
  696. package/dist/server/terminal/terminal-worker-process.js.map +0 -1
  697. package/dist/server/terminal/terminal-worker-protocol.d.ts.map +0 -1
  698. package/dist/server/terminal/terminal-worker-protocol.js.map +0 -1
  699. package/dist/server/terminal/terminal.d.ts.map +0 -1
  700. package/dist/server/terminal/terminal.js.map +0 -1
  701. package/dist/server/terminal/worker-terminal-manager.d.ts.map +0 -1
  702. package/dist/server/terminal/worker-terminal-manager.js.map +0 -1
  703. package/dist/server/utils/branch-slug.d.ts +0 -14
  704. package/dist/server/utils/branch-slug.d.ts.map +0 -1
  705. package/dist/server/utils/branch-slug.js +0 -49
  706. package/dist/server/utils/branch-slug.js.map +0 -1
  707. package/dist/server/utils/build-metadata-prompt.d.ts.map +0 -1
  708. package/dist/server/utils/build-metadata-prompt.js.map +0 -1
  709. package/dist/server/utils/checkout-git.d.ts.map +0 -1
  710. package/dist/server/utils/checkout-git.js.map +0 -1
  711. package/dist/server/utils/directory-suggestions.d.ts.map +0 -1
  712. package/dist/server/utils/directory-suggestions.js.map +0 -1
  713. package/dist/server/utils/executable.d.ts.map +0 -1
  714. package/dist/server/utils/executable.js.map +0 -1
  715. package/dist/server/utils/git-rev-parse-path.d.ts.map +0 -1
  716. package/dist/server/utils/git-rev-parse-path.js.map +0 -1
  717. package/dist/server/utils/github-remote.d.ts.map +0 -1
  718. package/dist/server/utils/github-remote.js.map +0 -1
  719. package/dist/server/utils/paseo-config-file.d.ts.map +0 -1
  720. package/dist/server/utils/paseo-config-file.js.map +0 -1
  721. package/dist/server/utils/paseo-config-schema.d.ts +0 -915
  722. package/dist/server/utils/paseo-config-schema.d.ts.map +0 -1
  723. package/dist/server/utils/paseo-config-schema.js +0 -77
  724. package/dist/server/utils/paseo-config-schema.js.map +0 -1
  725. package/dist/server/utils/path.d.ts.map +0 -1
  726. package/dist/server/utils/path.js.map +0 -1
  727. package/dist/server/utils/project-icon.d.ts.map +0 -1
  728. package/dist/server/utils/project-icon.js.map +0 -1
  729. package/dist/server/utils/promise-timeout.d.ts.map +0 -1
  730. package/dist/server/utils/promise-timeout.js.map +0 -1
  731. package/dist/server/utils/run-git-command.d.ts.map +0 -1
  732. package/dist/server/utils/run-git-command.js.map +0 -1
  733. package/dist/server/utils/script-hostname.d.ts.map +0 -1
  734. package/dist/server/utils/script-hostname.js.map +0 -1
  735. package/dist/server/utils/spawn.d.ts.map +0 -1
  736. package/dist/server/utils/spawn.js.map +0 -1
  737. package/dist/server/utils/string-command-shell.d.ts.map +0 -1
  738. package/dist/server/utils/string-command-shell.js.map +0 -1
  739. package/dist/server/utils/tree-kill.d.ts.map +0 -1
  740. package/dist/server/utils/tree-kill.js.map +0 -1
  741. package/dist/server/utils/windows-command.d.ts.map +0 -1
  742. package/dist/server/utils/windows-command.js.map +0 -1
  743. package/dist/server/utils/worktree-metadata.d.ts.map +0 -1
  744. package/dist/server/utils/worktree-metadata.js.map +0 -1
  745. package/dist/server/utils/worktree.d.ts.map +0 -1
  746. package/dist/server/utils/worktree.js.map +0 -1
  747. package/dist/server/utils/wrap-user-instructions.d.ts.map +0 -1
  748. package/dist/server/utils/wrap-user-instructions.js.map +0 -1
  749. package/dist/src/server/agent/agent-sdk-types.js +0 -22
  750. package/dist/src/server/agent/agent-sdk-types.js.map +0 -1
  751. package/dist/src/server/agent/agent-title-limits.js +0 -3
  752. package/dist/src/server/agent/agent-title-limits.js.map +0 -1
  753. package/dist/src/server/agent/provider-launch-config.js.map +0 -1
  754. package/dist/src/server/agent/provider-manifest.js +0 -211
  755. package/dist/src/server/agent/provider-manifest.js.map +0 -1
  756. package/dist/src/server/chat/chat-rpc-schemas.js +0 -103
  757. package/dist/src/server/chat/chat-rpc-schemas.js.map +0 -1
  758. package/dist/src/server/chat/chat-types.js +0 -22
  759. package/dist/src/server/chat/chat-types.js.map +0 -1
  760. package/dist/src/server/loop/rpc-schemas.js +0 -163
  761. package/dist/src/server/loop/rpc-schemas.js.map +0 -1
  762. package/dist/src/server/paseo-env.js.map +0 -1
  763. package/dist/src/server/paseo-home.js.map +0 -1
  764. package/dist/src/server/persisted-config.js.map +0 -1
  765. package/dist/src/server/pid-lock.js.map +0 -1
  766. package/dist/src/server/private-files.js.map +0 -1
  767. package/dist/src/server/schedule/rpc-schemas.js +0 -151
  768. package/dist/src/server/schedule/rpc-schemas.js.map +0 -1
  769. package/dist/src/server/schedule/types.js +0 -73
  770. package/dist/src/server/schedule/types.js.map +0 -1
  771. package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js.map +0 -1
  772. package/dist/src/shared/agent-lifecycle.js +0 -8
  773. package/dist/src/shared/agent-lifecycle.js.map +0 -1
  774. package/dist/src/shared/client-capabilities.js +0 -4
  775. package/dist/src/shared/client-capabilities.js.map +0 -1
  776. package/dist/src/shared/literal-union.js +0 -2
  777. package/dist/src/shared/literal-union.js.map +0 -1
  778. package/dist/src/shared/messages.js +0 -3320
  779. package/dist/src/shared/messages.js.map +0 -1
  780. package/dist/src/utils/executable.js.map +0 -1
  781. package/dist/src/utils/paseo-config-schema.js +0 -77
  782. package/dist/src/utils/paseo-config-schema.js.map +0 -1
  783. package/dist/src/utils/spawn.js.map +0 -1
  784. package/dist/src/utils/windows-command.js.map +0 -1
  785. package/src/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
@@ -1,3504 +0,0 @@
1
- import { CLIENT_CAPS } from "../shared/client-capabilities.js";
2
- import { AgentCreateFailedStatusPayloadSchema, AgentCreatedStatusPayloadSchema, AgentRefreshedStatusPayloadSchema, AgentResumedStatusPayloadSchema, parseServerInfoStatusPayload, RestartRequestedStatusPayloadSchema, ShutdownRequestedStatusPayloadSchema, SessionInboundMessageSchema, WSOutboundMessageSchema, } from "../shared/messages.js";
3
- import { isRelayClientWebSocketUrl } from "../shared/daemon-endpoints.js";
4
- import { asUint8Array, decodeFileTransferFrame, decodeTerminalStreamFrame, FileTransferOpcode, TerminalStreamOpcode, } from "../shared/binary-frames/index.js";
5
- import { createRelayE2eeTransportFactory, createWebSocketTransportFactory, decodeMessageData, defaultWebSocketFactory, describeTransportClose, describeTransportError, } from "./daemon-client-transport.js";
6
- import { DaemonClientRuntimeMetrics } from "./daemon-client-runtime-metrics.js";
7
- import { TerminalStreamRouter } from "./terminal-stream-router.js";
8
- const consoleLogger = {
9
- debug: () => { },
10
- info: (obj, msg) => console.log(msg, obj),
11
- warn: (obj, msg) => console.warn(msg, obj),
12
- error: (obj, msg) => console.error(msg, obj),
13
- };
14
- const perfNow = typeof performance !== "undefined" && typeof performance.now === "function"
15
- ? () => performance.now()
16
- : () => Date.now();
17
- function normalizePassword(value) {
18
- if (typeof value !== "string") {
19
- return null;
20
- }
21
- return value.length > 0 ? value : null;
22
- }
23
- class DaemonRpcError extends Error {
24
- constructor(params) {
25
- const parts = [params.error];
26
- if (params.requestType)
27
- parts.push(`requestType=${params.requestType}`);
28
- if (params.code)
29
- parts.push(`code=${params.code}`);
30
- super(parts.join(" "));
31
- this.name = "DaemonRpcError";
32
- this.requestId = params.requestId;
33
- this.requestType = params.requestType;
34
- this.code = params.code;
35
- }
36
- }
37
- const DEFAULT_RECONNECT_BASE_DELAY_MS = 1500;
38
- const DEFAULT_RECONNECT_MAX_DELAY_MS = 30000;
39
- const DEFAULT_CONNECT_TIMEOUT_MS = 15000;
40
- const DEFAULT_LIVENESS_TIMEOUT_MS = 5000;
41
- const LIVENESS_FAILURE_RECONNECT_THRESHOLD = 2;
42
- /** Default timeout for waiting for connection before sending queued messages */
43
- const DEFAULT_SEND_QUEUE_TIMEOUT_MS = 10000;
44
- const DEFAULT_DICTATION_FINISH_ACCEPT_TIMEOUT_MS = 15000;
45
- const DEFAULT_DICTATION_FINISH_FALLBACK_TIMEOUT_MS = 5 * 60 * 1000;
46
- const DEFAULT_DICTATION_FINISH_TIMEOUT_GRACE_MS = 5000;
47
- function isWaiterTimeoutError(error) {
48
- return error instanceof Error && error.message.startsWith("Timeout waiting for message");
49
- }
50
- function normalizeClientId(value) {
51
- if (typeof value !== "string") {
52
- return null;
53
- }
54
- const trimmed = value.trim();
55
- return trimmed.length > 0 ? trimmed : null;
56
- }
57
- function decodeBase64ToBytes(base64) {
58
- const binary = globalThis.atob(base64);
59
- const bytes = new Uint8Array(binary.length);
60
- for (let index = 0; index < binary.length; index += 1) {
61
- bytes[index] = binary.charCodeAt(index);
62
- }
63
- return bytes;
64
- }
65
- function legacyExplorerFileToBytes(file) {
66
- let bytes;
67
- if (file.encoding === "base64" && file.content) {
68
- bytes = decodeBase64ToBytes(file.content);
69
- }
70
- else if (file.encoding === "utf-8" && file.content) {
71
- bytes = new TextEncoder().encode(file.content);
72
- }
73
- else {
74
- bytes = new Uint8Array();
75
- }
76
- return {
77
- bytes,
78
- mime: file.mimeType ?? "application/octet-stream",
79
- size: file.size,
80
- path: file.path,
81
- kind: file.kind,
82
- modifiedAt: file.modifiedAt,
83
- };
84
- }
85
- function binaryFileKind(mime, encoding) {
86
- if (mime.startsWith("image/")) {
87
- return "image";
88
- }
89
- if (encoding === "utf-8" || mime.startsWith("text/") || mime === "application/json") {
90
- return "text";
91
- }
92
- return "binary";
93
- }
94
- function concatByteChunks(chunks, size) {
95
- const bytes = new Uint8Array(size);
96
- let offset = 0;
97
- for (const chunk of chunks) {
98
- bytes.set(chunk, offset);
99
- offset += chunk.byteLength;
100
- }
101
- return bytes;
102
- }
103
- function hashForLog(value) {
104
- let hash = 0;
105
- for (let index = 0; index < value.length; index += 1) {
106
- hash = (hash * 31 + value.charCodeAt(index)) | 0;
107
- }
108
- return `h_${Math.abs(hash).toString(16)}`;
109
- }
110
- function toReasonCode(reason) {
111
- if (!reason) {
112
- return null;
113
- }
114
- const normalized = reason.toLowerCase();
115
- if (normalized.includes("timed out")) {
116
- return "connect_timeout";
117
- }
118
- if (normalized.includes("disposed")) {
119
- return "disposed";
120
- }
121
- if (normalized.includes("client closed")) {
122
- return "client_closed";
123
- }
124
- if (normalized.includes("transport")) {
125
- return "transport_error";
126
- }
127
- if (normalized.includes("failed to connect")) {
128
- return "connect_failed";
129
- }
130
- return "unknown";
131
- }
132
- export class DaemonClient {
133
- constructor(config) {
134
- this.config = config;
135
- this.transport = null;
136
- this.transportCleanup = [];
137
- this.rawMessageListeners = new Set();
138
- this.messageHandlers = new Map();
139
- this.eventListeners = new Set();
140
- this.waiters = new Set();
141
- this.checkoutStatusInFlight = new Map();
142
- this.connectionListeners = new Set();
143
- this.reconnectTimeout = null;
144
- this.connectTimeout = null;
145
- this.pendingGenericTransportErrorTimeout = null;
146
- this.reconnectAttempt = 0;
147
- this.shouldReconnect = true;
148
- this.connectPromise = null;
149
- this.connectResolve = null;
150
- this.connectReject = null;
151
- this.lastErrorValue = null;
152
- this.connectionState = { status: "idle" };
153
- this.checkoutDiffSubscriptions = new Map();
154
- this.terminalDirectorySubscriptions = new Set();
155
- this.terminalStreams = new TerminalStreamRouter();
156
- this.pendingBinaryFileReads = new Map();
157
- this.activeBinaryFileTransfers = new Map();
158
- this.completedBinaryFileReads = new Map();
159
- this.pendingSendQueue = [];
160
- this.lastServerInfoMessage = null;
161
- this.runtimeMetricsInterval = null;
162
- this.runtimeMetrics = null;
163
- this.livenessProbe = null;
164
- this.consecutiveLivenessFailures = 0;
165
- this.logger = config.logger ?? consoleLogger;
166
- this.logConnectionPath = isRelayClientWebSocketUrl(this.config.url) ? "relay" : "direct";
167
- let parsedUrlForLog = null;
168
- try {
169
- parsedUrlForLog = new URL(this.config.url);
170
- }
171
- catch {
172
- parsedUrlForLog = null;
173
- }
174
- const parsedServerIdForLog = normalizeClientId(parsedUrlForLog?.searchParams.get("serverId"));
175
- this.logServerId = parsedServerIdForLog ?? parsedUrlForLog?.host ?? null;
176
- const resolvedClientId = normalizeClientId(this.config.clientId);
177
- if (!resolvedClientId) {
178
- throw new Error("Daemon client requires a non-empty clientId");
179
- }
180
- this.config.clientId = resolvedClientId;
181
- this.logClientIdHash = hashForLog(resolvedClientId);
182
- this.logGeneration =
183
- typeof this.config.runtimeGeneration === "number" &&
184
- Number.isFinite(this.config.runtimeGeneration)
185
- ? this.config.runtimeGeneration
186
- : null;
187
- const runtimeMetricsIntervalMs = typeof config.runtimeMetricsIntervalMs === "number" && config.runtimeMetricsIntervalMs > 0
188
- ? config.runtimeMetricsIntervalMs
189
- : 0;
190
- if (runtimeMetricsIntervalMs > 0) {
191
- const runtimeMetricsWindowMs = typeof config.runtimeMetricsWindowMs === "number" && config.runtimeMetricsWindowMs > 0
192
- ? Math.max(config.runtimeMetricsWindowMs, runtimeMetricsIntervalMs)
193
- : undefined;
194
- this.runtimeMetrics = new DaemonClientRuntimeMetrics(this.logger, {
195
- connectionPath: this.logConnectionPath,
196
- serverId: this.logServerId,
197
- getConnectionStatus: () => this.connectionState.status,
198
- }, runtimeMetricsWindowMs ? { windowMs: runtimeMetricsWindowMs } : undefined);
199
- this.runtimeMetricsInterval = setInterval(() => {
200
- this.runtimeMetrics?.flush();
201
- }, runtimeMetricsIntervalMs);
202
- }
203
- }
204
- // ============================================================================
205
- // Connection
206
- // ============================================================================
207
- async connect() {
208
- if (this.connectionState.status === "disposed") {
209
- throw new Error("Daemon client is disposed");
210
- }
211
- if (this.connectionState.status === "connected") {
212
- return;
213
- }
214
- if (this.connectPromise) {
215
- return this.connectPromise;
216
- }
217
- this.shouldReconnect = true;
218
- this.connectPromise = new Promise((resolve, reject) => {
219
- this.connectResolve = resolve;
220
- this.connectReject = reject;
221
- this.attemptConnect();
222
- });
223
- return this.connectPromise;
224
- }
225
- attemptConnect() {
226
- if (this.connectionState.status === "disposed") {
227
- this.rejectConnect(new Error("Daemon client is disposed"));
228
- return;
229
- }
230
- if (!this.shouldReconnect) {
231
- this.rejectConnect(new Error("Daemon client is closed"));
232
- return;
233
- }
234
- if (this.connectionState.status === "connecting") {
235
- return;
236
- }
237
- const headers = {};
238
- const password = normalizePassword(this.config.password);
239
- if (password) {
240
- headers.Authorization = `Bearer ${password}`;
241
- }
242
- else if (this.config.authHeader) {
243
- headers.Authorization = this.config.authHeader;
244
- }
245
- const protocols = password ? [`paseo.bearer.${password}`] : undefined;
246
- try {
247
- // Reconnect can overlap with browser close/error delivery ordering.
248
- // Always dispose previous transport before constructing the next one.
249
- this.disposeTransport();
250
- const baseTransportFactory = this.config.transportFactory ??
251
- createWebSocketTransportFactory(this.config.webSocketFactory ?? defaultWebSocketFactory);
252
- const shouldUseRelayE2ee = this.config.e2ee?.enabled === true && isRelayClientWebSocketUrl(this.config.url);
253
- let transportFactory = baseTransportFactory;
254
- if (shouldUseRelayE2ee) {
255
- const daemonPublicKeyB64 = this.config.e2ee?.daemonPublicKeyB64;
256
- if (!daemonPublicKeyB64) {
257
- throw new Error("daemonPublicKeyB64 is required for relay E2EE");
258
- }
259
- transportFactory = createRelayE2eeTransportFactory({
260
- baseFactory: baseTransportFactory,
261
- daemonPublicKeyB64,
262
- logger: this.logger,
263
- });
264
- }
265
- const transportUrl = this.resolveTransportUrlForAttempt();
266
- const transport = transportFactory({
267
- url: transportUrl,
268
- headers,
269
- ...(protocols ? { protocols } : {}),
270
- });
271
- this.transport = transport;
272
- this.lastServerInfoMessage = null;
273
- this.updateConnectionState({
274
- status: "connecting",
275
- attempt: this.reconnectAttempt,
276
- }, { event: "CONNECT_REQUEST" });
277
- this.resetConnectTimeout();
278
- const timeoutMs = Math.max(1, this.config.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS);
279
- this.connectTimeout = setTimeout(() => {
280
- if (this.connectionState.status !== "connecting") {
281
- return;
282
- }
283
- this.lastErrorValue = "Connection timed out";
284
- this.disposeTransport(1001, "Connection timed out");
285
- this.scheduleReconnect({
286
- reason: "Connection timed out",
287
- event: "CONNECT_TIMEOUT",
288
- reasonCode: "connect_timeout",
289
- });
290
- }, timeoutMs);
291
- this.transportCleanup = [
292
- transport.onOpen(() => {
293
- if (this.pendingGenericTransportErrorTimeout) {
294
- clearTimeout(this.pendingGenericTransportErrorTimeout);
295
- this.pendingGenericTransportErrorTimeout = null;
296
- }
297
- this.lastErrorValue = null;
298
- this.sendHelloMessage();
299
- }),
300
- transport.onClose((event) => {
301
- this.resetConnectTimeout();
302
- if (this.pendingGenericTransportErrorTimeout) {
303
- clearTimeout(this.pendingGenericTransportErrorTimeout);
304
- this.pendingGenericTransportErrorTimeout = null;
305
- }
306
- const reason = describeTransportClose(event);
307
- if (reason) {
308
- this.lastErrorValue = reason;
309
- }
310
- this.scheduleReconnect({
311
- reason,
312
- event: "TRANSPORT_CLOSE",
313
- reasonCode: "transport_closed",
314
- });
315
- }),
316
- transport.onError((event) => {
317
- this.resetConnectTimeout();
318
- const reason = describeTransportError(event);
319
- const isGeneric = reason === "Transport error";
320
- // Browser WebSocket.onerror often provides no useful details and is followed
321
- // by a close event (often with code 1006). Prefer surfacing the close details
322
- // instead of immediately disconnecting with a generic "Transport error".
323
- if (isGeneric) {
324
- this.lastErrorValue ?? (this.lastErrorValue = reason);
325
- if (!this.pendingGenericTransportErrorTimeout) {
326
- this.pendingGenericTransportErrorTimeout = setTimeout(() => {
327
- this.pendingGenericTransportErrorTimeout = null;
328
- if (this.connectionState.status === "connected" ||
329
- this.connectionState.status === "connecting") {
330
- this.lastErrorValue = reason;
331
- this.scheduleReconnect({
332
- reason,
333
- event: "TRANSPORT_ERROR",
334
- reasonCode: "transport_error",
335
- });
336
- }
337
- }, 250);
338
- }
339
- return;
340
- }
341
- if (this.pendingGenericTransportErrorTimeout) {
342
- clearTimeout(this.pendingGenericTransportErrorTimeout);
343
- this.pendingGenericTransportErrorTimeout = null;
344
- }
345
- this.lastErrorValue = reason;
346
- this.scheduleReconnect({
347
- reason,
348
- event: "TRANSPORT_ERROR",
349
- reasonCode: "transport_error",
350
- });
351
- }),
352
- transport.onMessage((data) => this.handleTransportMessage(data)),
353
- ];
354
- }
355
- catch (error) {
356
- this.resetConnectTimeout();
357
- const message = error instanceof Error ? error.message : "Failed to connect";
358
- this.lastErrorValue = message;
359
- this.scheduleReconnect({
360
- reason: message,
361
- event: "CONNECT_FAILED",
362
- reasonCode: "connect_failed",
363
- });
364
- this.rejectConnect(error instanceof Error ? error : new Error(message));
365
- }
366
- }
367
- resolveConnect() {
368
- if (this.connectResolve) {
369
- this.connectResolve();
370
- }
371
- this.connectPromise = null;
372
- this.connectResolve = null;
373
- this.connectReject = null;
374
- }
375
- rejectConnect(error) {
376
- if (this.connectReject) {
377
- this.connectReject(error);
378
- }
379
- this.connectPromise = null;
380
- this.connectResolve = null;
381
- this.connectReject = null;
382
- }
383
- async close() {
384
- if (this.connectionState.status === "disposed") {
385
- return;
386
- }
387
- this.shouldReconnect = false;
388
- this.connectPromise = null;
389
- this.connectResolve = null;
390
- this.connectReject = null;
391
- if (this.reconnectTimeout) {
392
- clearTimeout(this.reconnectTimeout);
393
- this.reconnectTimeout = null;
394
- }
395
- this.resetConnectTimeout();
396
- this.disposeTransport(1000, "Client closed");
397
- this.clearWaiters(new Error("Daemon client closed"));
398
- this.rejectPendingSendQueue(new Error("Daemon client closed"));
399
- this.rejectLivenessProbe(new Error("Daemon client closed"));
400
- this.terminalStreams.clearSlots();
401
- this.lastServerInfoMessage = null;
402
- if (this.runtimeMetricsInterval) {
403
- clearInterval(this.runtimeMetricsInterval);
404
- this.runtimeMetricsInterval = null;
405
- this.runtimeMetrics?.flush({ final: true });
406
- this.runtimeMetrics = null;
407
- }
408
- this.updateConnectionState({ status: "disposed" }, { event: "DISPOSE", reason: "Client closed", reasonCode: "disposed" });
409
- }
410
- ensureConnected() {
411
- if (this.connectionState.status === "disposed") {
412
- return;
413
- }
414
- if (!this.shouldReconnect) {
415
- this.shouldReconnect = true;
416
- }
417
- if (this.connectionState.status === "connected" ||
418
- this.connectionState.status === "connecting") {
419
- return;
420
- }
421
- void this.connect();
422
- }
423
- getConnectionState() {
424
- return this.connectionState;
425
- }
426
- subscribeConnectionStatus(listener) {
427
- this.connectionListeners.add(listener);
428
- listener(this.connectionState);
429
- return () => {
430
- this.connectionListeners.delete(listener);
431
- };
432
- }
433
- get isConnected() {
434
- return this.connectionState.status === "connected";
435
- }
436
- get isConnecting() {
437
- return this.connectionState.status === "connecting";
438
- }
439
- get lastError() {
440
- return this.lastErrorValue;
441
- }
442
- // ============================================================================
443
- // Message Subscription
444
- // ============================================================================
445
- subscribe(handler) {
446
- this.eventListeners.add(handler);
447
- return () => this.eventListeners.delete(handler);
448
- }
449
- subscribeRawMessages(handler) {
450
- this.rawMessageListeners.add(handler);
451
- return () => {
452
- this.rawMessageListeners.delete(handler);
453
- };
454
- }
455
- on(arg1, arg2) {
456
- if (typeof arg1 === "function") {
457
- return this.subscribe(arg1);
458
- }
459
- const type = arg1;
460
- const handler = arg2;
461
- if (!this.messageHandlers.has(type)) {
462
- this.messageHandlers.set(type, new Set());
463
- }
464
- this.messageHandlers.get(type).add(handler);
465
- return () => {
466
- const handlers = this.messageHandlers.get(type);
467
- if (!handlers) {
468
- return;
469
- }
470
- handlers.delete(handler);
471
- if (handlers.size === 0) {
472
- this.messageHandlers.delete(type);
473
- }
474
- };
475
- }
476
- // ============================================================================
477
- // Core Send Helpers
478
- // ============================================================================
479
- /**
480
- * Send a session message. For fire-and-forget messages (heartbeats, etc.),
481
- * failures are suppressed if `suppressSendErrors` is configured.
482
- * For RPC methods that wait for responses, use `sendSessionMessageOrThrow` instead.
483
- */
484
- sendSessionMessage(message) {
485
- if (!this.transport || this.connectionState.status !== "connected") {
486
- if (this.config.suppressSendErrors) {
487
- return;
488
- }
489
- throw new Error(`Transport not connected (status: ${this.connectionState.status})`);
490
- }
491
- const payload = SessionInboundMessageSchema.parse(message);
492
- try {
493
- this.transport.send(JSON.stringify({ type: "session", message: payload }));
494
- }
495
- catch (error) {
496
- if (this.config.suppressSendErrors) {
497
- return;
498
- }
499
- throw error instanceof Error ? error : new Error(String(error));
500
- }
501
- }
502
- sendBinaryFrame(frame) {
503
- if (!this.transport || this.connectionState.status !== "connected") {
504
- if (this.config.suppressSendErrors) {
505
- return;
506
- }
507
- throw new Error(`Transport not connected (status: ${this.connectionState.status})`);
508
- }
509
- try {
510
- this.transport.send(frame);
511
- }
512
- catch (error) {
513
- if (this.config.suppressSendErrors) {
514
- return;
515
- }
516
- throw error instanceof Error ? error : new Error(String(error));
517
- }
518
- }
519
- /**
520
- * Send a session message for RPC methods that create waiters.
521
- * If the connection is still being established ("connecting"), the message
522
- * is queued and will be sent once connected (or rejected after timeout).
523
- * This prevents waiters from hanging forever when called during connection.
524
- */
525
- sendSessionMessageOrThrow(message) {
526
- const status = this.connectionState.status;
527
- // If connected, send immediately
528
- if (this.transport && status === "connected") {
529
- const payload = SessionInboundMessageSchema.parse(message);
530
- this.transport.send(JSON.stringify({ type: "session", message: payload }));
531
- return Promise.resolve();
532
- }
533
- // If connecting, queue the message to be sent once connected
534
- if (status === "connecting") {
535
- return new Promise((resolve, reject) => {
536
- const timeoutHandle = setTimeout(() => {
537
- // Remove from queue
538
- const idx = this.pendingSendQueue.findIndex((p) => p.resolve === resolve);
539
- if (idx !== -1) {
540
- this.pendingSendQueue.splice(idx, 1);
541
- }
542
- reject(new Error(`Timed out waiting for connection to send message`));
543
- }, DEFAULT_SEND_QUEUE_TIMEOUT_MS);
544
- this.pendingSendQueue.push({ message, resolve, reject, timeoutHandle });
545
- });
546
- }
547
- // Not connected and not connecting - fail immediately
548
- return Promise.reject(new Error(`Transport not connected (status: ${status})`));
549
- }
550
- /**
551
- * Flush pending send queue - called when connection is established.
552
- */
553
- flushPendingSendQueue() {
554
- const queue = this.pendingSendQueue;
555
- this.pendingSendQueue = [];
556
- for (const pending of queue) {
557
- clearTimeout(pending.timeoutHandle);
558
- try {
559
- if (this.transport && this.connectionState.status === "connected") {
560
- const payload = SessionInboundMessageSchema.parse(pending.message);
561
- this.transport.send(JSON.stringify({ type: "session", message: payload }));
562
- pending.resolve();
563
- }
564
- else {
565
- pending.reject(new Error("Connection lost before message could be sent"));
566
- }
567
- }
568
- catch (error) {
569
- pending.reject(error instanceof Error ? error : new Error(String(error)));
570
- }
571
- }
572
- }
573
- /**
574
- * Reject all pending sends - called when connection fails or is closed.
575
- */
576
- rejectPendingSendQueue(error) {
577
- const queue = this.pendingSendQueue;
578
- this.pendingSendQueue = [];
579
- for (const pending of queue) {
580
- clearTimeout(pending.timeoutHandle);
581
- pending.reject(error);
582
- }
583
- }
584
- async sendRequest(params) {
585
- const { promise, cancel } = this.waitForWithCancel((msg) => {
586
- if (msg.type === "rpc_error" && msg.payload.requestId === params.requestId) {
587
- return {
588
- kind: "error",
589
- error: new DaemonRpcError({
590
- requestId: msg.payload.requestId,
591
- error: msg.payload.error,
592
- requestType: msg.payload.requestType,
593
- code: msg.payload.code,
594
- }),
595
- };
596
- }
597
- const value = params.select(msg);
598
- if (value === null) {
599
- return null;
600
- }
601
- return { kind: "ok", value };
602
- }, params.timeout, params.options);
603
- try {
604
- await this.sendSessionMessageOrThrow(params.message);
605
- }
606
- catch (error) {
607
- const err = error instanceof Error ? error : new Error(String(error));
608
- cancel(err);
609
- void promise.catch(() => undefined);
610
- throw err;
611
- }
612
- const result = await promise;
613
- if (result.kind === "error") {
614
- throw result.error;
615
- }
616
- return result.value;
617
- }
618
- async sendCorrelatedRequest(params) {
619
- return this.sendRequest({
620
- requestId: params.requestId,
621
- message: params.message,
622
- timeout: params.timeout,
623
- options: params.options,
624
- select: (msg) => {
625
- const correlated = msg;
626
- if (correlated.type !== params.responseType) {
627
- return null;
628
- }
629
- const payload = correlated.payload;
630
- if (payload.requestId !== params.requestId) {
631
- return null;
632
- }
633
- if (!params.selectPayload) {
634
- return payload;
635
- }
636
- return params.selectPayload(payload);
637
- },
638
- });
639
- }
640
- sendCorrelatedSessionRequest(params) {
641
- const resolvedRequestId = this.createRequestId(params.requestId);
642
- const message = SessionInboundMessageSchema.parse({
643
- ...params.message,
644
- requestId: resolvedRequestId,
645
- });
646
- return this.sendCorrelatedRequest({
647
- requestId: resolvedRequestId,
648
- message,
649
- responseType: params.responseType,
650
- timeout: params.timeout,
651
- options: { skipQueue: true },
652
- ...(params.selectPayload ? { selectPayload: params.selectPayload } : {}),
653
- });
654
- }
655
- sendNamespacedCorrelatedSessionRequest(params) {
656
- const responseType = params.message.type.replace(/\.request$/, ".response");
657
- return this.sendCorrelatedSessionRequest({
658
- ...params,
659
- responseType,
660
- });
661
- }
662
- sendSessionMessageStrict(message) {
663
- if (!this.transport || this.connectionState.status !== "connected") {
664
- throw new Error("Transport not connected");
665
- }
666
- const payload = SessionInboundMessageSchema.parse(message);
667
- try {
668
- this.transport.send(JSON.stringify({ type: "session", message: payload }));
669
- }
670
- catch (error) {
671
- throw error instanceof Error ? error : new Error(String(error));
672
- }
673
- }
674
- async clearAgentAttention(agentId) {
675
- const requestId = this.createRequestId();
676
- const message = SessionInboundMessageSchema.parse({
677
- type: "clear_agent_attention",
678
- agentId,
679
- requestId,
680
- });
681
- await this.sendRequest({
682
- requestId,
683
- message,
684
- timeout: 15000,
685
- options: { skipQueue: true },
686
- select: (msg) => {
687
- if (msg.type !== "clear_agent_attention_response") {
688
- return null;
689
- }
690
- if (msg.payload.requestId !== requestId) {
691
- return null;
692
- }
693
- return msg.payload;
694
- },
695
- });
696
- }
697
- sendHeartbeat(params) {
698
- this.sendSessionMessage({
699
- type: "client_heartbeat",
700
- deviceType: params.deviceType,
701
- focusedAgentId: params.focusedAgentId,
702
- lastActivityAt: params.lastActivityAt,
703
- appVisible: params.appVisible,
704
- appVisibilityChangedAt: params.appVisibilityChangedAt,
705
- });
706
- }
707
- registerPushToken(token) {
708
- this.sendSessionMessage({
709
- type: "register_push_token",
710
- token,
711
- });
712
- }
713
- async ping(params) {
714
- const requestId = params?.requestId ?? `ping-${Date.now()}-${Math.random().toString(36).slice(2)}`;
715
- const clientSentAt = Date.now();
716
- const payload = await this.sendRequest({
717
- requestId,
718
- message: { type: "ping", requestId, clientSentAt },
719
- timeout: params?.timeoutMs ?? 5000,
720
- select: (msg) => {
721
- if (msg.type !== "pong")
722
- return null;
723
- if (msg.payload.requestId !== requestId)
724
- return null;
725
- if (typeof msg.payload.serverReceivedAt !== "number")
726
- return null;
727
- if (typeof msg.payload.serverSentAt !== "number")
728
- return null;
729
- return msg.payload;
730
- },
731
- });
732
- return {
733
- requestId,
734
- clientSentAt,
735
- serverReceivedAt: payload.serverReceivedAt,
736
- serverSentAt: payload.serverSentAt,
737
- rttMs: Date.now() - clientSentAt,
738
- };
739
- }
740
- checkLiveness(params) {
741
- if (this.connectionState.status !== "connected" || !this.transport) {
742
- return Promise.reject(new Error(`Transport not connected (status: ${this.connectionState.status})`));
743
- }
744
- if (this.livenessProbe) {
745
- return this.livenessProbe.promise;
746
- }
747
- const startedAt = perfNow();
748
- const timeoutMs = Math.max(1, params?.timeoutMs ?? DEFAULT_LIVENESS_TIMEOUT_MS);
749
- let resolveProbe = null;
750
- let rejectProbe = null;
751
- const promise = new Promise((resolve, reject) => {
752
- resolveProbe = resolve;
753
- rejectProbe = reject;
754
- });
755
- const probe = {
756
- promise,
757
- resolve: (value) => resolveProbe?.(value),
758
- reject: (error) => rejectProbe?.(error),
759
- timeoutHandle: setTimeout(() => {
760
- if (this.livenessProbe !== probe) {
761
- return;
762
- }
763
- this.livenessProbe = null;
764
- const error = new Error(`Liveness check timed out (${timeoutMs}ms)`);
765
- probe.reject(error);
766
- this.recordLivenessFailure(error);
767
- }, timeoutMs),
768
- startedAt,
769
- };
770
- this.livenessProbe = probe;
771
- try {
772
- this.transport.send(JSON.stringify({ type: "ping" }));
773
- }
774
- catch (error) {
775
- this.clearLivenessProbe();
776
- const err = error instanceof Error ? error : new Error(String(error));
777
- this.recordLivenessFailure(err);
778
- return Promise.reject(err);
779
- }
780
- return promise;
781
- }
782
- // ============================================================================
783
- // Agent RPCs (requestId-correlated)
784
- // ============================================================================
785
- async fetchAgents(options) {
786
- const resolvedRequestId = this.createRequestId(options?.requestId);
787
- const message = SessionInboundMessageSchema.parse({
788
- type: "fetch_agents_request",
789
- requestId: resolvedRequestId,
790
- ...(options?.scope ? { scope: options.scope } : {}),
791
- ...(options?.filter ? { filter: options.filter } : {}),
792
- ...(options?.sort ? { sort: options.sort } : {}),
793
- ...(options?.page ? { page: options.page } : {}),
794
- ...(options?.subscribe ? { subscribe: options.subscribe } : {}),
795
- });
796
- return this.sendRequest({
797
- requestId: resolvedRequestId,
798
- message,
799
- timeout: 10000,
800
- options: { skipQueue: true },
801
- select: (msg) => {
802
- if (msg.type !== "fetch_agents_response") {
803
- return null;
804
- }
805
- if (msg.payload.requestId !== resolvedRequestId) {
806
- return null;
807
- }
808
- return msg.payload;
809
- },
810
- });
811
- }
812
- async fetchAgentHistory(options) {
813
- const resolvedRequestId = this.createRequestId(options?.requestId);
814
- const message = SessionInboundMessageSchema.parse({
815
- type: "fetch_agent_history_request",
816
- requestId: resolvedRequestId,
817
- ...(options?.filter ? { filter: options.filter } : {}),
818
- ...(options?.sort ? { sort: options.sort } : {}),
819
- ...(options?.page ? { page: options.page } : {}),
820
- });
821
- return this.sendRequest({
822
- requestId: resolvedRequestId,
823
- message,
824
- timeout: 10000,
825
- options: { skipQueue: true },
826
- select: (msg) => {
827
- if (msg.type !== "fetch_agent_history_response") {
828
- return null;
829
- }
830
- if (msg.payload.requestId !== resolvedRequestId) {
831
- return null;
832
- }
833
- return msg.payload;
834
- },
835
- });
836
- }
837
- async fetchRecentProviderSessions(options) {
838
- const resolvedRequestId = this.createRequestId(options?.requestId);
839
- const message = SessionInboundMessageSchema.parse({
840
- type: "fetch_recent_provider_sessions_request",
841
- requestId: resolvedRequestId,
842
- ...(options?.cwd ? { cwd: options.cwd } : {}),
843
- ...(options?.providers ? { providers: options.providers } : {}),
844
- ...(options?.since ? { since: options.since } : {}),
845
- ...(options?.limit ? { limit: options.limit } : {}),
846
- });
847
- return this.sendRequest({
848
- requestId: resolvedRequestId,
849
- message,
850
- timeout: 10000,
851
- options: { skipQueue: true },
852
- select: (msg) => {
853
- if (msg.type !== "fetch_recent_provider_sessions_response") {
854
- return null;
855
- }
856
- if (msg.payload.requestId !== resolvedRequestId) {
857
- return null;
858
- }
859
- return msg.payload;
860
- },
861
- });
862
- }
863
- async fetchWorkspaces(options) {
864
- const resolvedRequestId = this.createRequestId(options?.requestId);
865
- const message = SessionInboundMessageSchema.parse({
866
- type: "fetch_workspaces_request",
867
- requestId: resolvedRequestId,
868
- ...(options?.filter ? { filter: options.filter } : {}),
869
- ...(options?.sort ? { sort: options.sort } : {}),
870
- ...(options?.page ? { page: options.page } : {}),
871
- ...(options?.subscribe ? { subscribe: options.subscribe } : {}),
872
- });
873
- return this.sendRequest({
874
- requestId: resolvedRequestId,
875
- message,
876
- timeout: 10000,
877
- options: { skipQueue: true },
878
- select: (msg) => {
879
- if (msg.type !== "fetch_workspaces_response") {
880
- return null;
881
- }
882
- if (msg.payload.requestId !== resolvedRequestId) {
883
- return null;
884
- }
885
- return msg.payload;
886
- },
887
- });
888
- }
889
- async openProject(cwd, requestId) {
890
- return this.sendCorrelatedSessionRequest({
891
- requestId,
892
- message: {
893
- type: "open_project_request",
894
- cwd,
895
- },
896
- responseType: "open_project_response",
897
- timeout: 10000,
898
- });
899
- }
900
- async startWorkspaceScript(workspaceId, scriptName, requestId) {
901
- return this.sendCorrelatedSessionRequest({
902
- requestId,
903
- message: {
904
- type: "start_workspace_script_request",
905
- workspaceId,
906
- scriptName,
907
- },
908
- responseType: "start_workspace_script_response",
909
- timeout: 10000,
910
- });
911
- }
912
- async listAvailableEditors(requestId) {
913
- return this.sendCorrelatedSessionRequest({
914
- requestId,
915
- message: {
916
- type: "list_available_editors_request",
917
- },
918
- responseType: "list_available_editors_response",
919
- timeout: 10000,
920
- });
921
- }
922
- async openInEditor(path, editorId, requestId) {
923
- return this.sendCorrelatedSessionRequest({
924
- requestId,
925
- message: {
926
- type: "open_in_editor_request",
927
- path,
928
- editorId,
929
- },
930
- responseType: "open_in_editor_response",
931
- timeout: 10000,
932
- });
933
- }
934
- async archiveWorkspace(workspaceId, requestId) {
935
- return this.sendCorrelatedSessionRequest({
936
- requestId,
937
- message: {
938
- type: "archive_workspace_request",
939
- workspaceId,
940
- },
941
- responseType: "archive_workspace_response",
942
- timeout: 10000,
943
- });
944
- }
945
- async fetchWorkspaceSetupStatus(workspaceId, requestId) {
946
- return this.sendCorrelatedSessionRequest({
947
- requestId,
948
- message: {
949
- type: "workspace_setup_status_request",
950
- workspaceId,
951
- },
952
- responseType: "workspace_setup_status_response",
953
- timeout: 10000,
954
- });
955
- }
956
- async fetchAgent(agentId, requestId) {
957
- const resolvedRequestId = this.createRequestId(requestId);
958
- const message = SessionInboundMessageSchema.parse({
959
- type: "fetch_agent_request",
960
- requestId: resolvedRequestId,
961
- agentId,
962
- });
963
- const payload = await this.sendRequest({
964
- requestId: resolvedRequestId,
965
- message,
966
- timeout: 10000,
967
- options: { skipQueue: true },
968
- select: (msg) => {
969
- if (msg.type !== "fetch_agent_response") {
970
- return null;
971
- }
972
- if (msg.payload.requestId !== resolvedRequestId) {
973
- return null;
974
- }
975
- return msg.payload;
976
- },
977
- });
978
- if (payload.error) {
979
- throw new Error(payload.error);
980
- }
981
- if (!payload.agent) {
982
- return null;
983
- }
984
- return { agent: payload.agent, project: payload.project ?? null };
985
- }
986
- resubscribeCheckoutDiffSubscriptions() {
987
- if (this.checkoutDiffSubscriptions.size === 0) {
988
- return;
989
- }
990
- for (const [subscriptionId, subscription] of this.checkoutDiffSubscriptions) {
991
- const message = SessionInboundMessageSchema.parse({
992
- type: "subscribe_checkout_diff_request",
993
- subscriptionId,
994
- cwd: subscription.cwd,
995
- compare: subscription.compare,
996
- requestId: this.createRequestId(),
997
- });
998
- this.sendSessionMessage(message);
999
- }
1000
- }
1001
- resubscribeTerminalDirectorySubscriptions() {
1002
- if (this.terminalDirectorySubscriptions.size === 0) {
1003
- return;
1004
- }
1005
- for (const cwd of this.terminalDirectorySubscriptions) {
1006
- this.sendSessionMessage({
1007
- type: "subscribe_terminals_request",
1008
- cwd,
1009
- });
1010
- }
1011
- }
1012
- // ============================================================================
1013
- // Agent Lifecycle
1014
- // ============================================================================
1015
- async createAgent(options) {
1016
- const requestId = this.createRequestId(options.requestId);
1017
- const config = resolveAgentConfig(options);
1018
- const message = SessionInboundMessageSchema.parse({
1019
- type: "create_agent_request",
1020
- requestId,
1021
- config,
1022
- ...(options.env ? { env: options.env } : {}),
1023
- ...(options.workspaceId !== undefined ? { workspaceId: options.workspaceId } : {}),
1024
- ...(options.initialPrompt ? { initialPrompt: options.initialPrompt } : {}),
1025
- ...(options.clientMessageId ? { clientMessageId: options.clientMessageId } : {}),
1026
- ...(options.outputSchema ? { outputSchema: options.outputSchema } : {}),
1027
- ...(options.images && options.images.length > 0 ? { images: options.images } : {}),
1028
- ...(options.attachments && options.attachments.length > 0
1029
- ? { attachments: options.attachments }
1030
- : {}),
1031
- ...(options.git ? { git: options.git } : {}),
1032
- ...(options.worktree ? { worktree: options.worktree } : {}),
1033
- ...(options.autoArchive !== undefined ? { autoArchive: options.autoArchive } : {}),
1034
- ...(options.worktreeName ? { worktreeName: options.worktreeName } : {}),
1035
- ...(options.labels && Object.keys(options.labels).length > 0
1036
- ? { labels: options.labels }
1037
- : {}),
1038
- });
1039
- const status = await this.sendRequest({
1040
- requestId,
1041
- message,
1042
- timeout: 60000,
1043
- options: { skipQueue: true },
1044
- select: (msg) => {
1045
- if (msg.type !== "status") {
1046
- return null;
1047
- }
1048
- const created = AgentCreatedStatusPayloadSchema.safeParse(msg.payload);
1049
- if (created.success && created.data.requestId === requestId) {
1050
- return created.data;
1051
- }
1052
- const failed = AgentCreateFailedStatusPayloadSchema.safeParse(msg.payload);
1053
- if (failed.success && failed.data.requestId === requestId) {
1054
- return failed.data;
1055
- }
1056
- return null;
1057
- },
1058
- });
1059
- if (status.status === "agent_create_failed") {
1060
- throw new Error(status.error);
1061
- }
1062
- return status.agent;
1063
- }
1064
- async deleteAgent(agentId) {
1065
- const requestId = this.createRequestId();
1066
- const message = SessionInboundMessageSchema.parse({
1067
- type: "delete_agent_request",
1068
- agentId,
1069
- requestId,
1070
- });
1071
- await this.sendRequest({
1072
- requestId,
1073
- message,
1074
- timeout: 10000,
1075
- options: { skipQueue: true },
1076
- select: (msg) => {
1077
- if (msg.type !== "agent_deleted") {
1078
- return null;
1079
- }
1080
- if (msg.payload.requestId !== requestId) {
1081
- return null;
1082
- }
1083
- return msg.payload;
1084
- },
1085
- });
1086
- }
1087
- async archiveAgent(agentId) {
1088
- const requestId = this.createRequestId();
1089
- const message = SessionInboundMessageSchema.parse({
1090
- type: "archive_agent_request",
1091
- agentId,
1092
- requestId,
1093
- });
1094
- const result = await this.sendRequest({
1095
- requestId,
1096
- message,
1097
- timeout: 10000,
1098
- options: { skipQueue: true },
1099
- select: (msg) => {
1100
- if (msg.type !== "agent_archived") {
1101
- return null;
1102
- }
1103
- if (msg.payload.requestId !== requestId) {
1104
- return null;
1105
- }
1106
- return msg.payload;
1107
- },
1108
- });
1109
- return { archivedAt: result.archivedAt };
1110
- }
1111
- async updateAgent(agentId, updates) {
1112
- const requestId = this.createRequestId();
1113
- const message = SessionInboundMessageSchema.parse({
1114
- type: "update_agent_request",
1115
- agentId,
1116
- ...(updates.name !== undefined ? { name: updates.name } : {}),
1117
- ...(updates.labels && Object.keys(updates.labels).length > 0
1118
- ? { labels: updates.labels }
1119
- : {}),
1120
- requestId,
1121
- });
1122
- const payload = await this.sendRequest({
1123
- requestId,
1124
- message,
1125
- timeout: 10000,
1126
- options: { skipQueue: true },
1127
- select: (msg) => {
1128
- if (msg.type !== "update_agent_response") {
1129
- return null;
1130
- }
1131
- if (msg.payload.requestId !== requestId) {
1132
- return null;
1133
- }
1134
- return msg.payload;
1135
- },
1136
- });
1137
- if (!payload.accepted) {
1138
- throw new Error(payload.error ?? "updateAgent rejected");
1139
- }
1140
- }
1141
- async renameProject(projectId, customName, requestId) {
1142
- const payload = await this.sendCorrelatedSessionRequest({
1143
- requestId,
1144
- message: {
1145
- type: "project.rename.request",
1146
- projectId,
1147
- customName,
1148
- },
1149
- responseType: "project.rename.response",
1150
- timeout: 10000,
1151
- });
1152
- if (!payload.accepted) {
1153
- throw new Error(payload.error ?? "renameProject rejected");
1154
- }
1155
- return { customName: payload.customName };
1156
- }
1157
- async resumeAgent(handle, overrides) {
1158
- const requestId = this.createRequestId();
1159
- const message = SessionInboundMessageSchema.parse({
1160
- type: "resume_agent_request",
1161
- requestId,
1162
- handle,
1163
- ...(overrides ? { overrides } : {}),
1164
- });
1165
- const status = await this.sendRequest({
1166
- requestId,
1167
- message,
1168
- timeout: 15000,
1169
- options: { skipQueue: true },
1170
- select: (msg) => {
1171
- if (msg.type !== "status") {
1172
- return null;
1173
- }
1174
- const resumed = AgentResumedStatusPayloadSchema.safeParse(msg.payload);
1175
- if (resumed.success && resumed.data.requestId === requestId) {
1176
- return resumed.data;
1177
- }
1178
- return null;
1179
- },
1180
- });
1181
- return status.agent;
1182
- }
1183
- async importAgent(input) {
1184
- const requestId = this.createRequestId();
1185
- const message = SessionInboundMessageSchema.parse({
1186
- type: "import_agent_request",
1187
- requestId,
1188
- ...("providerId" in input
1189
- ? { providerId: input.providerId, providerHandleId: input.providerHandleId }
1190
- : { provider: input.provider, sessionId: input.sessionId }),
1191
- ...(input.cwd ? { cwd: input.cwd } : {}),
1192
- ...(input.labels && Object.keys(input.labels).length > 0 ? { labels: input.labels } : {}),
1193
- });
1194
- const status = await this.sendRequest({
1195
- requestId,
1196
- message,
1197
- timeout: 15000,
1198
- options: { skipQueue: true },
1199
- select: (msg) => {
1200
- if (msg.type !== "status") {
1201
- return null;
1202
- }
1203
- const resumed = AgentResumedStatusPayloadSchema.safeParse(msg.payload);
1204
- if (resumed.success && resumed.data.requestId === requestId) {
1205
- return resumed.data;
1206
- }
1207
- const failed = AgentCreateFailedStatusPayloadSchema.safeParse(msg.payload);
1208
- if (failed.success && failed.data.requestId === requestId) {
1209
- return failed.data;
1210
- }
1211
- return null;
1212
- },
1213
- });
1214
- if (status.status === "agent_create_failed") {
1215
- throw new Error(status.error);
1216
- }
1217
- return status.agent;
1218
- }
1219
- async refreshAgent(agentId, requestId) {
1220
- const resolvedRequestId = this.createRequestId(requestId);
1221
- const message = SessionInboundMessageSchema.parse({
1222
- type: "refresh_agent_request",
1223
- agentId,
1224
- requestId: resolvedRequestId,
1225
- });
1226
- return this.sendRequest({
1227
- requestId: resolvedRequestId,
1228
- message,
1229
- timeout: 15000,
1230
- options: { skipQueue: true },
1231
- select: (msg) => {
1232
- if (msg.type !== "status") {
1233
- return null;
1234
- }
1235
- const refreshed = AgentRefreshedStatusPayloadSchema.safeParse(msg.payload);
1236
- if (refreshed.success && refreshed.data.requestId === resolvedRequestId) {
1237
- return refreshed.data;
1238
- }
1239
- return null;
1240
- },
1241
- });
1242
- }
1243
- async fetchAgentTimeline(agentId, options = {}) {
1244
- const resolvedRequestId = this.createRequestId(options.requestId);
1245
- const message = SessionInboundMessageSchema.parse({
1246
- type: "fetch_agent_timeline_request",
1247
- agentId,
1248
- requestId: resolvedRequestId,
1249
- ...(options.direction ? { direction: options.direction } : {}),
1250
- ...(options.cursor ? { cursor: options.cursor } : {}),
1251
- ...(typeof options.limit === "number" ? { limit: options.limit } : {}),
1252
- ...(options.projection ? { projection: options.projection } : {}),
1253
- });
1254
- const payload = await this.sendRequest({
1255
- requestId: resolvedRequestId,
1256
- message,
1257
- timeout: 15000,
1258
- options: { skipQueue: true },
1259
- select: (msg) => {
1260
- if (msg.type !== "fetch_agent_timeline_response") {
1261
- return null;
1262
- }
1263
- if (msg.payload.requestId !== resolvedRequestId) {
1264
- return null;
1265
- }
1266
- return msg.payload;
1267
- },
1268
- });
1269
- if (payload.error) {
1270
- throw new Error(payload.error);
1271
- }
1272
- return payload;
1273
- }
1274
- // ============================================================================
1275
- // Agent Interaction
1276
- // ============================================================================
1277
- async sendAgentMessage(agentId, text, options) {
1278
- const requestId = this.createRequestId();
1279
- const messageId = options?.messageId ?? crypto.randomUUID();
1280
- const message = SessionInboundMessageSchema.parse({
1281
- type: "send_agent_message_request",
1282
- requestId,
1283
- agentId,
1284
- text,
1285
- ...(messageId ? { messageId } : {}),
1286
- ...(options?.images ? { images: options.images } : {}),
1287
- ...(options?.attachments ? { attachments: options.attachments } : {}),
1288
- });
1289
- const payload = await this.sendRequest({
1290
- requestId,
1291
- message,
1292
- timeout: 15000,
1293
- options: { skipQueue: true },
1294
- select: (msg) => {
1295
- if (msg.type !== "send_agent_message_response") {
1296
- return null;
1297
- }
1298
- if (msg.payload.requestId !== requestId) {
1299
- return null;
1300
- }
1301
- return msg.payload;
1302
- },
1303
- });
1304
- if (!payload.accepted) {
1305
- throw new Error(payload.error ?? "sendAgentMessage rejected");
1306
- }
1307
- }
1308
- async sendMessage(agentId, text, options) {
1309
- await this.sendAgentMessage(agentId, text, options);
1310
- }
1311
- async rewindAgent(agentId, messageId, mode) {
1312
- const requestId = this.createRequestId();
1313
- const message = SessionInboundMessageSchema.parse({
1314
- type: "agent.rewind.request",
1315
- requestId,
1316
- agentId,
1317
- messageId,
1318
- mode,
1319
- });
1320
- const payload = await this.sendRequest({
1321
- requestId,
1322
- message,
1323
- timeout: 15000,
1324
- options: { skipQueue: true },
1325
- select: (msg) => {
1326
- if (msg.type !== "agent.rewind.response") {
1327
- return null;
1328
- }
1329
- if (msg.payload.requestId !== requestId) {
1330
- return null;
1331
- }
1332
- return msg.payload;
1333
- },
1334
- });
1335
- if (!payload.ok) {
1336
- throw new Error(payload.error ?? "Agent rewind failed");
1337
- }
1338
- return payload;
1339
- }
1340
- async cancelAgent(agentId) {
1341
- const requestId = this.createRequestId();
1342
- const message = SessionInboundMessageSchema.parse({
1343
- type: "cancel_agent_request",
1344
- agentId,
1345
- requestId,
1346
- });
1347
- await this.sendRequest({
1348
- requestId,
1349
- message,
1350
- timeout: 15000,
1351
- options: { skipQueue: true },
1352
- select: (msg) => {
1353
- if (msg.type !== "cancel_agent_response") {
1354
- return null;
1355
- }
1356
- if (msg.payload.requestId !== requestId) {
1357
- return null;
1358
- }
1359
- return msg.payload;
1360
- },
1361
- });
1362
- }
1363
- async setAgentMode(agentId, modeId) {
1364
- const requestId = this.createRequestId();
1365
- const message = SessionInboundMessageSchema.parse({
1366
- type: "set_agent_mode_request",
1367
- agentId,
1368
- modeId,
1369
- requestId,
1370
- });
1371
- const payload = await this.sendRequest({
1372
- requestId,
1373
- message,
1374
- timeout: 15000,
1375
- options: { skipQueue: true },
1376
- select: (msg) => {
1377
- if (msg.type !== "set_agent_mode_response") {
1378
- return null;
1379
- }
1380
- if (msg.payload.requestId !== requestId) {
1381
- return null;
1382
- }
1383
- return msg.payload;
1384
- },
1385
- });
1386
- if (!payload.accepted) {
1387
- throw new Error(payload.error ?? "setAgentMode rejected");
1388
- }
1389
- }
1390
- async setAgentModel(agentId, modelId) {
1391
- const requestId = this.createRequestId();
1392
- const message = SessionInboundMessageSchema.parse({
1393
- type: "set_agent_model_request",
1394
- agentId,
1395
- modelId,
1396
- requestId,
1397
- });
1398
- const payload = await this.sendRequest({
1399
- requestId,
1400
- message,
1401
- timeout: 15000,
1402
- options: { skipQueue: true },
1403
- select: (msg) => {
1404
- if (msg.type !== "set_agent_model_response") {
1405
- return null;
1406
- }
1407
- if (msg.payload.requestId !== requestId) {
1408
- return null;
1409
- }
1410
- return msg.payload;
1411
- },
1412
- });
1413
- if (!payload.accepted) {
1414
- throw new Error(payload.error ?? "setAgentModel rejected");
1415
- }
1416
- }
1417
- async setAgentFeature(agentId, featureId, value) {
1418
- const requestId = this.createRequestId();
1419
- const message = SessionInboundMessageSchema.parse({
1420
- type: "set_agent_feature_request",
1421
- agentId,
1422
- featureId,
1423
- value,
1424
- requestId,
1425
- });
1426
- const payload = await this.sendRequest({
1427
- requestId,
1428
- message,
1429
- timeout: 15000,
1430
- options: { skipQueue: true },
1431
- select: (msg) => {
1432
- if (msg.type !== "set_agent_feature_response") {
1433
- return null;
1434
- }
1435
- if (msg.payload.requestId !== requestId) {
1436
- return null;
1437
- }
1438
- return msg.payload;
1439
- },
1440
- });
1441
- if (!payload.accepted) {
1442
- throw new Error(payload.error ?? "setAgentFeature rejected");
1443
- }
1444
- }
1445
- async setAgentThinkingOption(agentId, thinkingOptionId) {
1446
- const requestId = this.createRequestId();
1447
- const message = SessionInboundMessageSchema.parse({
1448
- type: "set_agent_thinking_request",
1449
- agentId,
1450
- thinkingOptionId,
1451
- requestId,
1452
- });
1453
- const payload = await this.sendRequest({
1454
- requestId,
1455
- message,
1456
- timeout: 15000,
1457
- options: { skipQueue: true },
1458
- select: (msg) => {
1459
- if (msg.type !== "set_agent_thinking_response") {
1460
- return null;
1461
- }
1462
- if (msg.payload.requestId !== requestId) {
1463
- return null;
1464
- }
1465
- return msg.payload;
1466
- },
1467
- });
1468
- if (!payload.accepted) {
1469
- throw new Error(payload.error ?? "setAgentThinkingOption rejected");
1470
- }
1471
- }
1472
- async restartServer(reason, requestId) {
1473
- const resolvedRequestId = this.createRequestId(requestId);
1474
- const message = SessionInboundMessageSchema.parse({
1475
- type: "restart_server_request",
1476
- ...(reason && reason.trim().length > 0 ? { reason } : {}),
1477
- requestId: resolvedRequestId,
1478
- });
1479
- return this.sendRequest({
1480
- requestId: resolvedRequestId,
1481
- message,
1482
- timeout: 10000,
1483
- options: { skipQueue: true },
1484
- select: (msg) => {
1485
- if (msg.type !== "status") {
1486
- return null;
1487
- }
1488
- const restarted = RestartRequestedStatusPayloadSchema.safeParse(msg.payload);
1489
- if (!restarted.success) {
1490
- return null;
1491
- }
1492
- if (restarted.data.requestId !== resolvedRequestId) {
1493
- return null;
1494
- }
1495
- return restarted.data;
1496
- },
1497
- });
1498
- }
1499
- async shutdownServer(requestId) {
1500
- const resolvedRequestId = this.createRequestId(requestId);
1501
- const message = SessionInboundMessageSchema.parse({
1502
- type: "shutdown_server_request",
1503
- requestId: resolvedRequestId,
1504
- });
1505
- return this.sendRequest({
1506
- requestId: resolvedRequestId,
1507
- message,
1508
- timeout: 10000,
1509
- options: { skipQueue: true },
1510
- select: (msg) => {
1511
- if (msg.type !== "status") {
1512
- return null;
1513
- }
1514
- const shutdown = ShutdownRequestedStatusPayloadSchema.safeParse(msg.payload);
1515
- if (!shutdown.success) {
1516
- return null;
1517
- }
1518
- if (shutdown.data.requestId !== resolvedRequestId) {
1519
- return null;
1520
- }
1521
- return shutdown.data;
1522
- },
1523
- });
1524
- }
1525
- // ============================================================================
1526
- // Audio / Voice
1527
- // ============================================================================
1528
- async setVoiceMode(enabled, agentId) {
1529
- const requestId = this.createRequestId();
1530
- const message = SessionInboundMessageSchema.parse({
1531
- type: "set_voice_mode",
1532
- enabled,
1533
- ...(agentId ? { agentId } : {}),
1534
- requestId,
1535
- });
1536
- const response = await this.sendRequest({
1537
- requestId,
1538
- message,
1539
- timeout: 10000,
1540
- select: (msg) => {
1541
- if (msg.type !== "set_voice_mode_response") {
1542
- return null;
1543
- }
1544
- if (msg.payload.requestId !== requestId) {
1545
- return null;
1546
- }
1547
- return msg.payload;
1548
- },
1549
- });
1550
- if (!response.accepted) {
1551
- const codeSuffix = typeof response.reasonCode === "string" && response.reasonCode.trim().length > 0
1552
- ? ` (${response.reasonCode})`
1553
- : "";
1554
- throw new Error((response.error ?? "Failed to set voice mode") + codeSuffix);
1555
- }
1556
- return response;
1557
- }
1558
- async sendVoiceAudioChunk(audio, format, isLast = false) {
1559
- this.sendSessionMessage({ type: "voice_audio_chunk", audio, format, isLast });
1560
- }
1561
- async startDictationStream(dictationId, format) {
1562
- const ack = this.waitForWithCancel((msg) => {
1563
- if (msg.type !== "dictation_stream_ack") {
1564
- return null;
1565
- }
1566
- if (msg.payload.dictationId !== dictationId) {
1567
- return null;
1568
- }
1569
- if (msg.payload.ackSeq !== -1) {
1570
- return null;
1571
- }
1572
- return msg.payload;
1573
- }, 30000, { skipQueue: true });
1574
- const ackPromise = ack.promise.then(() => undefined);
1575
- const streamError = this.waitForWithCancel((msg) => {
1576
- if (msg.type !== "dictation_stream_error") {
1577
- return null;
1578
- }
1579
- if (msg.payload.dictationId !== dictationId) {
1580
- return null;
1581
- }
1582
- return msg.payload;
1583
- }, 30000, { skipQueue: true });
1584
- const errorPromise = streamError.promise.then((payload) => {
1585
- throw new Error(payload.error);
1586
- });
1587
- const cleanupError = new Error("Cancelled dictation start waiter");
1588
- try {
1589
- this.sendSessionMessageStrict({ type: "dictation_stream_start", dictationId, format });
1590
- await Promise.race([ackPromise, errorPromise]);
1591
- }
1592
- finally {
1593
- ack.cancel(cleanupError);
1594
- streamError.cancel(cleanupError);
1595
- void ackPromise.catch(() => undefined);
1596
- void errorPromise.catch(() => undefined);
1597
- }
1598
- }
1599
- sendDictationStreamChunk(dictationId, seq, audio, format) {
1600
- this.sendSessionMessageStrict({
1601
- type: "dictation_stream_chunk",
1602
- dictationId,
1603
- seq,
1604
- audio,
1605
- format,
1606
- });
1607
- }
1608
- async finishDictationStream(dictationId, finalSeq) {
1609
- const final = this.waitForWithCancel((msg) => {
1610
- if (msg.type !== "dictation_stream_final") {
1611
- return null;
1612
- }
1613
- if (msg.payload.dictationId !== dictationId) {
1614
- return null;
1615
- }
1616
- return msg.payload;
1617
- }, 0, { skipQueue: true });
1618
- const streamError = this.waitForWithCancel((msg) => {
1619
- if (msg.type !== "dictation_stream_error") {
1620
- return null;
1621
- }
1622
- if (msg.payload.dictationId !== dictationId) {
1623
- return null;
1624
- }
1625
- return msg.payload;
1626
- }, 0, { skipQueue: true });
1627
- const finishAccepted = this.waitForWithCancel((msg) => {
1628
- if (msg.type !== "dictation_stream_finish_accepted") {
1629
- return null;
1630
- }
1631
- if (msg.payload.dictationId !== dictationId) {
1632
- return null;
1633
- }
1634
- return msg.payload;
1635
- }, DEFAULT_DICTATION_FINISH_ACCEPT_TIMEOUT_MS, { skipQueue: true });
1636
- const finalPromise = final.promise;
1637
- const errorPromise = streamError.promise.then((payload) => {
1638
- throw new Error(payload.error);
1639
- });
1640
- const finishAcceptedPromise = finishAccepted.promise;
1641
- const finalOutcomePromise = finalPromise.then((payload) => ({
1642
- kind: "final",
1643
- payload,
1644
- }));
1645
- const errorOutcomePromise = errorPromise.then(() => ({
1646
- kind: "error",
1647
- error: new Error("Unexpected dictation stream error state"),
1648
- }), (error) => ({
1649
- kind: "error",
1650
- error: error instanceof Error ? error : new Error(String(error)),
1651
- }));
1652
- const finishAcceptedOutcomePromise = finishAcceptedPromise.then((payload) => ({ kind: "accepted", payload }), (error) => {
1653
- if (isWaiterTimeoutError(error)) {
1654
- return { kind: "accepted_timeout" };
1655
- }
1656
- return {
1657
- kind: "accepted_error",
1658
- error: error instanceof Error ? error : new Error(String(error)),
1659
- };
1660
- });
1661
- const waitForFinalResult = async (timeoutMs) => {
1662
- if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
1663
- const outcome = await Promise.race([finalOutcomePromise, errorOutcomePromise]);
1664
- if (outcome.kind === "error") {
1665
- throw outcome.error;
1666
- }
1667
- return outcome.payload;
1668
- }
1669
- let timeoutHandle = null;
1670
- const timeoutPromise = new Promise((resolve) => {
1671
- timeoutHandle = setTimeout(() => resolve({ kind: "timeout" }), timeoutMs);
1672
- });
1673
- const outcome = await Promise.race([
1674
- finalOutcomePromise,
1675
- errorOutcomePromise,
1676
- timeoutPromise,
1677
- ]);
1678
- if (timeoutHandle) {
1679
- clearTimeout(timeoutHandle);
1680
- }
1681
- if (outcome.kind === "timeout") {
1682
- throw new Error(`Timeout waiting for dictation finalization (${timeoutMs}ms)`);
1683
- }
1684
- if (outcome.kind === "error") {
1685
- throw outcome.error;
1686
- }
1687
- return outcome.payload;
1688
- };
1689
- const cleanupError = new Error("Cancelled dictation finish waiter");
1690
- try {
1691
- this.sendSessionMessageStrict({ type: "dictation_stream_finish", dictationId, finalSeq });
1692
- const firstOutcome = await Promise.race([
1693
- finalOutcomePromise,
1694
- errorOutcomePromise,
1695
- finishAcceptedOutcomePromise,
1696
- ]);
1697
- if (firstOutcome.kind === "final") {
1698
- return firstOutcome.payload;
1699
- }
1700
- if (firstOutcome.kind === "error") {
1701
- throw firstOutcome.error;
1702
- }
1703
- if (firstOutcome.kind === "accepted") {
1704
- return await waitForFinalResult(firstOutcome.payload.timeoutMs + DEFAULT_DICTATION_FINISH_TIMEOUT_GRACE_MS);
1705
- }
1706
- return await waitForFinalResult(DEFAULT_DICTATION_FINISH_FALLBACK_TIMEOUT_MS);
1707
- }
1708
- finally {
1709
- final.cancel(cleanupError);
1710
- streamError.cancel(cleanupError);
1711
- finishAccepted.cancel(cleanupError);
1712
- void finalPromise.catch(() => undefined);
1713
- void errorPromise.catch(() => undefined);
1714
- void finishAcceptedPromise.catch(() => undefined);
1715
- }
1716
- }
1717
- cancelDictationStream(dictationId) {
1718
- this.sendSessionMessageStrict({ type: "dictation_stream_cancel", dictationId });
1719
- }
1720
- async abortRequest() {
1721
- this.sendSessionMessage({ type: "abort_request" });
1722
- }
1723
- async audioPlayed(id) {
1724
- this.sendSessionMessage({ type: "audio_played", id });
1725
- }
1726
- // ============================================================================
1727
- // Git Operations
1728
- // ============================================================================
1729
- async getCheckoutStatus(cwd, options) {
1730
- const requestId = options?.requestId;
1731
- if (!requestId) {
1732
- const existing = this.checkoutStatusInFlight.get(cwd);
1733
- if (existing) {
1734
- return existing;
1735
- }
1736
- }
1737
- const resolvedRequestId = this.createRequestId(requestId);
1738
- const message = SessionInboundMessageSchema.parse({
1739
- type: "checkout_status_request",
1740
- cwd,
1741
- requestId: resolvedRequestId,
1742
- });
1743
- const responsePromise = this.sendRequest({
1744
- requestId: resolvedRequestId,
1745
- message,
1746
- timeout: 60000,
1747
- options: { skipQueue: true },
1748
- select: (msg) => {
1749
- if (msg.type !== "checkout_status_response") {
1750
- return null;
1751
- }
1752
- if (msg.payload.requestId !== resolvedRequestId) {
1753
- return null;
1754
- }
1755
- return msg.payload;
1756
- },
1757
- });
1758
- if (!requestId) {
1759
- this.checkoutStatusInFlight.set(cwd, responsePromise);
1760
- void responsePromise
1761
- .finally(() => {
1762
- if (this.checkoutStatusInFlight.get(cwd) === responsePromise) {
1763
- this.checkoutStatusInFlight.delete(cwd);
1764
- }
1765
- })
1766
- .catch(() => undefined);
1767
- }
1768
- return responsePromise;
1769
- }
1770
- normalizeCheckoutDiffCompare(compare) {
1771
- if (compare.mode === "uncommitted") {
1772
- return compare.ignoreWhitespace === true
1773
- ? { mode: "uncommitted", ignoreWhitespace: true }
1774
- : { mode: "uncommitted" };
1775
- }
1776
- const trimmedBaseRef = compare.baseRef?.trim();
1777
- if (!trimmedBaseRef) {
1778
- return compare.ignoreWhitespace === true
1779
- ? { mode: "base", ignoreWhitespace: true }
1780
- : { mode: "base" };
1781
- }
1782
- return compare.ignoreWhitespace === true
1783
- ? { mode: "base", baseRef: trimmedBaseRef, ignoreWhitespace: true }
1784
- : { mode: "base", baseRef: trimmedBaseRef };
1785
- }
1786
- async getCheckoutDiff(cwd, compare, requestId) {
1787
- const oneShotSubscriptionId = `oneshot-checkout-diff:${crypto.randomUUID()}`;
1788
- try {
1789
- const payload = await this.subscribeCheckoutDiff(cwd, compare, {
1790
- subscriptionId: oneShotSubscriptionId,
1791
- requestId,
1792
- });
1793
- return {
1794
- cwd: payload.cwd,
1795
- files: payload.files,
1796
- error: payload.error,
1797
- requestId: payload.requestId,
1798
- };
1799
- }
1800
- finally {
1801
- try {
1802
- this.unsubscribeCheckoutDiff(oneShotSubscriptionId);
1803
- }
1804
- catch {
1805
- // Ignore disconnect races during one-shot cleanup.
1806
- }
1807
- }
1808
- }
1809
- async subscribeCheckoutDiff(cwd, compare, options) {
1810
- const subscriptionId = options?.subscriptionId ?? crypto.randomUUID();
1811
- const normalizedCompare = this.normalizeCheckoutDiffCompare(compare);
1812
- const previousSubscription = this.checkoutDiffSubscriptions.get(subscriptionId) ?? null;
1813
- this.checkoutDiffSubscriptions.set(subscriptionId, {
1814
- cwd,
1815
- compare: normalizedCompare,
1816
- });
1817
- const resolvedRequestId = this.createRequestId(options?.requestId);
1818
- const message = SessionInboundMessageSchema.parse({
1819
- type: "subscribe_checkout_diff_request",
1820
- subscriptionId,
1821
- cwd,
1822
- compare: normalizedCompare,
1823
- requestId: resolvedRequestId,
1824
- });
1825
- try {
1826
- return await this.sendCorrelatedRequest({
1827
- requestId: resolvedRequestId,
1828
- message,
1829
- responseType: "subscribe_checkout_diff_response",
1830
- timeout: 60000,
1831
- options: { skipQueue: true },
1832
- selectPayload: (payload) => {
1833
- if (payload.subscriptionId !== subscriptionId) {
1834
- return null;
1835
- }
1836
- return payload;
1837
- },
1838
- });
1839
- }
1840
- catch (error) {
1841
- if (previousSubscription) {
1842
- this.checkoutDiffSubscriptions.set(subscriptionId, previousSubscription);
1843
- }
1844
- else {
1845
- this.checkoutDiffSubscriptions.delete(subscriptionId);
1846
- }
1847
- throw error;
1848
- }
1849
- }
1850
- unsubscribeCheckoutDiff(subscriptionId) {
1851
- this.checkoutDiffSubscriptions.delete(subscriptionId);
1852
- this.sendSessionMessage({
1853
- type: "unsubscribe_checkout_diff_request",
1854
- subscriptionId,
1855
- });
1856
- }
1857
- async checkoutCommit(cwd, input, requestId) {
1858
- return this.sendCorrelatedSessionRequest({
1859
- requestId,
1860
- message: {
1861
- type: "checkout_commit_request",
1862
- cwd,
1863
- message: input.message,
1864
- addAll: input.addAll,
1865
- },
1866
- responseType: "checkout_commit_response",
1867
- timeout: 60000,
1868
- });
1869
- }
1870
- async checkoutMerge(cwd, input, requestId) {
1871
- return this.sendCorrelatedSessionRequest({
1872
- requestId,
1873
- message: {
1874
- type: "checkout_merge_request",
1875
- cwd,
1876
- baseRef: input.baseRef,
1877
- strategy: input.strategy,
1878
- requireCleanTarget: input.requireCleanTarget,
1879
- },
1880
- responseType: "checkout_merge_response",
1881
- timeout: 60000,
1882
- });
1883
- }
1884
- async checkoutMergeFromBase(cwd, input, requestId) {
1885
- return this.sendCorrelatedSessionRequest({
1886
- requestId,
1887
- message: {
1888
- type: "checkout_merge_from_base_request",
1889
- cwd,
1890
- baseRef: input.baseRef,
1891
- requireCleanTarget: input.requireCleanTarget,
1892
- },
1893
- responseType: "checkout_merge_from_base_response",
1894
- timeout: 60000,
1895
- });
1896
- }
1897
- async checkoutPull(cwd, requestId) {
1898
- return this.sendCorrelatedSessionRequest({
1899
- requestId,
1900
- message: {
1901
- type: "checkout_pull_request",
1902
- cwd,
1903
- },
1904
- responseType: "checkout_pull_response",
1905
- timeout: 60000,
1906
- });
1907
- }
1908
- async checkoutPush(cwd, requestId) {
1909
- return this.sendCorrelatedSessionRequest({
1910
- requestId,
1911
- message: {
1912
- type: "checkout_push_request",
1913
- cwd,
1914
- },
1915
- responseType: "checkout_push_response",
1916
- timeout: 60000,
1917
- });
1918
- }
1919
- async checkoutPrCreate(cwd, input, requestId) {
1920
- return this.sendCorrelatedSessionRequest({
1921
- requestId,
1922
- message: {
1923
- type: "checkout_pr_create_request",
1924
- cwd,
1925
- title: input.title,
1926
- body: input.body,
1927
- baseRef: input.baseRef,
1928
- },
1929
- responseType: "checkout_pr_create_response",
1930
- timeout: 60000,
1931
- });
1932
- }
1933
- async checkoutPrMerge(cwd, input, requestId) {
1934
- return this.sendCorrelatedSessionRequest({
1935
- requestId,
1936
- message: {
1937
- type: "checkout_pr_merge_request",
1938
- cwd,
1939
- mergeMethod: input.method,
1940
- },
1941
- responseType: "checkout_pr_merge_response",
1942
- timeout: 60000,
1943
- });
1944
- }
1945
- async checkoutGithubSetAutoMerge(cwd, input, requestId) {
1946
- return this.sendNamespacedCorrelatedSessionRequest({
1947
- requestId,
1948
- message: {
1949
- type: "checkout.github.set_auto_merge.request",
1950
- cwd,
1951
- enabled: input.enabled,
1952
- ...(input.enabled ? { mergeMethod: input.method } : {}),
1953
- },
1954
- timeout: 60000,
1955
- });
1956
- }
1957
- async checkoutPrStatus(cwd, requestId) {
1958
- return this.sendCorrelatedSessionRequest({
1959
- requestId,
1960
- message: {
1961
- type: "checkout_pr_status_request",
1962
- cwd,
1963
- },
1964
- responseType: "checkout_pr_status_response",
1965
- timeout: 60000,
1966
- });
1967
- }
1968
- async pullRequestTimeline(input, requestId) {
1969
- return this.sendCorrelatedSessionRequest({
1970
- requestId,
1971
- message: {
1972
- type: "pull_request_timeline_request",
1973
- cwd: input.cwd,
1974
- prNumber: input.prNumber,
1975
- repoOwner: input.repoOwner,
1976
- repoName: input.repoName,
1977
- },
1978
- responseType: "pull_request_timeline_response",
1979
- timeout: 60000,
1980
- });
1981
- }
1982
- async checkoutSwitchBranch(cwd, branch, requestId) {
1983
- return this.sendCorrelatedSessionRequest({
1984
- requestId,
1985
- message: {
1986
- type: "checkout_switch_branch_request",
1987
- cwd,
1988
- branch,
1989
- },
1990
- responseType: "checkout_switch_branch_response",
1991
- timeout: 30000,
1992
- });
1993
- }
1994
- async renameBranch(input) {
1995
- return this.sendCorrelatedSessionRequest({
1996
- requestId: input.requestId,
1997
- message: {
1998
- type: "checkout.rename_branch.request",
1999
- cwd: input.cwd,
2000
- branch: input.branch,
2001
- },
2002
- responseType: "checkout.rename_branch.response",
2003
- timeout: 30000,
2004
- });
2005
- }
2006
- async stashSave(cwd, options, requestId) {
2007
- return this.sendCorrelatedSessionRequest({
2008
- requestId,
2009
- message: {
2010
- type: "stash_save_request",
2011
- cwd,
2012
- branch: options?.branch,
2013
- },
2014
- responseType: "stash_save_response",
2015
- timeout: 30000,
2016
- });
2017
- }
2018
- async stashPop(cwd, stashIndex, requestId) {
2019
- return this.sendCorrelatedSessionRequest({
2020
- requestId,
2021
- message: {
2022
- type: "stash_pop_request",
2023
- cwd,
2024
- stashIndex,
2025
- },
2026
- responseType: "stash_pop_response",
2027
- timeout: 30000,
2028
- });
2029
- }
2030
- async stashList(cwd, options, requestId) {
2031
- return this.sendCorrelatedSessionRequest({
2032
- requestId,
2033
- message: {
2034
- type: "stash_list_request",
2035
- cwd,
2036
- paseoOnly: options?.paseoOnly,
2037
- },
2038
- responseType: "stash_list_response",
2039
- timeout: 10000,
2040
- });
2041
- }
2042
- async getPaseoWorktreeList(input, requestId) {
2043
- return this.sendCorrelatedSessionRequest({
2044
- requestId,
2045
- message: {
2046
- type: "paseo_worktree_list_request",
2047
- cwd: input.cwd,
2048
- repoRoot: input.repoRoot,
2049
- },
2050
- responseType: "paseo_worktree_list_response",
2051
- timeout: 60000,
2052
- });
2053
- }
2054
- async archivePaseoWorktree(input, requestId) {
2055
- return this.sendCorrelatedSessionRequest({
2056
- requestId,
2057
- message: {
2058
- type: "paseo_worktree_archive_request",
2059
- worktreePath: input.worktreePath,
2060
- repoRoot: input.repoRoot,
2061
- branchName: input.branchName,
2062
- },
2063
- responseType: "paseo_worktree_archive_response",
2064
- timeout: 60000,
2065
- });
2066
- }
2067
- async createPaseoWorktree(input, requestId) {
2068
- return this.sendCorrelatedSessionRequest({
2069
- requestId,
2070
- message: {
2071
- type: "create_paseo_worktree_request",
2072
- cwd: input.cwd,
2073
- ...(input.projectId !== undefined ? { projectId: input.projectId } : {}),
2074
- worktreeSlug: input.worktreeSlug,
2075
- ...(input.firstAgentContext !== undefined
2076
- ? { firstAgentContext: input.firstAgentContext }
2077
- : {}),
2078
- ...(input.refName !== undefined ? { refName: input.refName } : {}),
2079
- ...(input.action !== undefined ? { action: input.action } : {}),
2080
- ...(input.githubPrNumber !== undefined ? { githubPrNumber: input.githubPrNumber } : {}),
2081
- },
2082
- responseType: "create_paseo_worktree_response",
2083
- timeout: 60000,
2084
- });
2085
- }
2086
- async validateBranch(options, requestId) {
2087
- return this.sendCorrelatedSessionRequest({
2088
- requestId,
2089
- message: {
2090
- type: "validate_branch_request",
2091
- cwd: options.cwd,
2092
- branchName: options.branchName,
2093
- },
2094
- responseType: "validate_branch_response",
2095
- timeout: 10000,
2096
- });
2097
- }
2098
- async getBranchSuggestions(options, requestId) {
2099
- return this.sendCorrelatedSessionRequest({
2100
- requestId,
2101
- message: {
2102
- type: "branch_suggestions_request",
2103
- cwd: options.cwd,
2104
- query: options.query,
2105
- limit: options.limit,
2106
- },
2107
- responseType: "branch_suggestions_response",
2108
- timeout: 10000,
2109
- });
2110
- }
2111
- async searchGitHub(options, requestId) {
2112
- return this.sendCorrelatedSessionRequest({
2113
- requestId,
2114
- message: {
2115
- type: "github_search_request",
2116
- cwd: options.cwd,
2117
- query: options.query,
2118
- limit: options.limit,
2119
- kinds: options.kinds,
2120
- },
2121
- responseType: "github_search_response",
2122
- timeout: 15000,
2123
- });
2124
- }
2125
- async getDirectorySuggestions(options, requestId) {
2126
- return this.sendCorrelatedSessionRequest({
2127
- requestId,
2128
- message: {
2129
- type: "directory_suggestions_request",
2130
- query: options.query,
2131
- cwd: options.cwd,
2132
- includeFiles: options.includeFiles,
2133
- includeDirectories: options.includeDirectories,
2134
- matchMode: options.matchMode,
2135
- limit: options.limit,
2136
- },
2137
- responseType: "directory_suggestions_response",
2138
- timeout: 10000,
2139
- });
2140
- }
2141
- // ============================================================================
2142
- // File Explorer
2143
- // ============================================================================
2144
- async requestFileExplorer(cwd, path, mode, requestId, acceptBinary = false) {
2145
- return this.sendCorrelatedSessionRequest({
2146
- requestId,
2147
- message: {
2148
- type: "file_explorer_request",
2149
- cwd,
2150
- path,
2151
- mode,
2152
- ...(acceptBinary ? { acceptBinary: true } : {}),
2153
- },
2154
- responseType: "file_explorer_response",
2155
- timeout: 10000,
2156
- });
2157
- }
2158
- async listDirectory(cwd, path, requestId) {
2159
- const payload = await this.requestFileExplorer(cwd, path, "list", requestId);
2160
- if (payload.error) {
2161
- throw new Error(payload.error);
2162
- }
2163
- if (!payload.directory) {
2164
- throw new Error("Directory listing unavailable.");
2165
- }
2166
- return payload.directory;
2167
- }
2168
- async readFile(cwd, path, requestId) {
2169
- const resolvedRequestId = this.createRequestId(requestId);
2170
- this.pendingBinaryFileReads.set(resolvedRequestId, { cwd, path });
2171
- try {
2172
- const payload = await this.requestFileExplorer(cwd, path, "file", resolvedRequestId, true);
2173
- if (payload.error) {
2174
- throw new Error(payload.error);
2175
- }
2176
- const binaryResult = this.completedBinaryFileReads.get(resolvedRequestId);
2177
- if (binaryResult) {
2178
- this.completedBinaryFileReads.delete(resolvedRequestId);
2179
- return binaryResult;
2180
- }
2181
- if (!payload.file) {
2182
- throw new Error("File unavailable.");
2183
- }
2184
- return legacyExplorerFileToBytes(payload.file);
2185
- }
2186
- finally {
2187
- this.pendingBinaryFileReads.delete(resolvedRequestId);
2188
- this.activeBinaryFileTransfers.delete(resolvedRequestId);
2189
- }
2190
- }
2191
- async requestDownloadToken(cwd, path, requestId) {
2192
- return this.sendCorrelatedSessionRequest({
2193
- requestId,
2194
- message: {
2195
- type: "file_download_token_request",
2196
- cwd,
2197
- path,
2198
- },
2199
- responseType: "file_download_token_response",
2200
- timeout: 10000,
2201
- });
2202
- }
2203
- async requestProjectIcon(cwd, requestId) {
2204
- return this.sendCorrelatedSessionRequest({
2205
- requestId,
2206
- message: {
2207
- type: "project_icon_request",
2208
- cwd,
2209
- },
2210
- responseType: "project_icon_response",
2211
- timeout: 10000,
2212
- });
2213
- }
2214
- // ============================================================================
2215
- // Provider Models / Commands
2216
- // ============================================================================
2217
- async listProviderModels(provider, options) {
2218
- return this.sendCorrelatedSessionRequest({
2219
- requestId: options?.requestId,
2220
- message: {
2221
- type: "list_provider_models_request",
2222
- provider,
2223
- cwd: options?.cwd,
2224
- },
2225
- responseType: "list_provider_models_response",
2226
- // Provider SDK cold starts (especially model discovery) can exceed 30s.
2227
- timeout: 45000,
2228
- });
2229
- }
2230
- async listProviderModes(provider, options) {
2231
- return this.sendCorrelatedSessionRequest({
2232
- requestId: options?.requestId,
2233
- message: {
2234
- type: "list_provider_modes_request",
2235
- provider,
2236
- cwd: options?.cwd,
2237
- },
2238
- responseType: "list_provider_modes_response",
2239
- timeout: 45000,
2240
- });
2241
- }
2242
- async listProviderFeatures(draftConfig, options) {
2243
- return this.sendCorrelatedSessionRequest({
2244
- requestId: options?.requestId,
2245
- message: {
2246
- type: "list_provider_features_request",
2247
- draftConfig,
2248
- },
2249
- responseType: "list_provider_features_response",
2250
- timeout: 45000,
2251
- });
2252
- }
2253
- async listAvailableProviders(options) {
2254
- return this.sendCorrelatedSessionRequest({
2255
- requestId: options?.requestId,
2256
- message: {
2257
- type: "list_available_providers_request",
2258
- },
2259
- responseType: "list_available_providers_response",
2260
- timeout: 30000,
2261
- });
2262
- }
2263
- async getProvidersSnapshot(options) {
2264
- return this.sendCorrelatedSessionRequest({
2265
- requestId: options?.requestId,
2266
- message: {
2267
- type: "get_providers_snapshot_request",
2268
- cwd: options?.cwd,
2269
- },
2270
- responseType: "get_providers_snapshot_response",
2271
- timeout: 10000,
2272
- });
2273
- }
2274
- async getDaemonConfig(requestId) {
2275
- return this.sendCorrelatedSessionRequest({
2276
- requestId,
2277
- message: {
2278
- type: "get_daemon_config_request",
2279
- },
2280
- responseType: "get_daemon_config_response",
2281
- timeout: 10000,
2282
- });
2283
- }
2284
- async getDaemonStatus(requestId) {
2285
- return this.sendCorrelatedSessionRequest({
2286
- requestId,
2287
- message: {
2288
- type: "daemon.get_status.request",
2289
- },
2290
- responseType: "daemon.get_status.response",
2291
- timeout: 10000,
2292
- });
2293
- }
2294
- async getDaemonPairingOffer(requestId) {
2295
- return this.sendCorrelatedSessionRequest({
2296
- requestId,
2297
- message: {
2298
- type: "daemon.get_pairing_offer.request",
2299
- },
2300
- responseType: "daemon.get_pairing_offer.response",
2301
- timeout: 10000,
2302
- });
2303
- }
2304
- async patchDaemonConfig(config, requestId) {
2305
- return this.sendCorrelatedSessionRequest({
2306
- requestId,
2307
- message: {
2308
- type: "set_daemon_config_request",
2309
- config,
2310
- },
2311
- responseType: "set_daemon_config_response",
2312
- timeout: 10000,
2313
- });
2314
- }
2315
- async readProjectConfig(repoRoot, requestId) {
2316
- return this.sendCorrelatedSessionRequest({
2317
- requestId,
2318
- message: {
2319
- type: "read_project_config_request",
2320
- repoRoot,
2321
- },
2322
- responseType: "read_project_config_response",
2323
- timeout: 10000,
2324
- });
2325
- }
2326
- async writeProjectConfig(input) {
2327
- return this.sendCorrelatedSessionRequest({
2328
- requestId: input.requestId,
2329
- message: {
2330
- type: "write_project_config_request",
2331
- repoRoot: input.repoRoot,
2332
- config: input.config,
2333
- expectedRevision: input.expectedRevision,
2334
- },
2335
- responseType: "write_project_config_response",
2336
- timeout: 10000,
2337
- });
2338
- }
2339
- async refreshProvidersSnapshot(options) {
2340
- return this.sendCorrelatedSessionRequest({
2341
- requestId: options?.requestId,
2342
- message: {
2343
- type: "refresh_providers_snapshot_request",
2344
- cwd: options?.cwd,
2345
- providers: options?.providers,
2346
- },
2347
- responseType: "refresh_providers_snapshot_response",
2348
- timeout: 60000,
2349
- });
2350
- }
2351
- async getProviderDiagnostic(provider, options) {
2352
- return this.sendCorrelatedSessionRequest({
2353
- requestId: options?.requestId,
2354
- message: {
2355
- type: "provider_diagnostic_request",
2356
- provider,
2357
- },
2358
- responseType: "provider_diagnostic_response",
2359
- timeout: 30000,
2360
- });
2361
- }
2362
- async listCommands(agentId, requestIdOrOptions) {
2363
- const requestId = typeof requestIdOrOptions === "string" ? requestIdOrOptions : requestIdOrOptions?.requestId;
2364
- const draftConfig = typeof requestIdOrOptions === "string" ? undefined : requestIdOrOptions?.draftConfig;
2365
- return this.sendCorrelatedSessionRequest({
2366
- requestId,
2367
- message: {
2368
- type: "list_commands_request",
2369
- agentId,
2370
- ...(draftConfig ? { draftConfig } : {}),
2371
- },
2372
- responseType: "list_commands_response",
2373
- timeout: 30000,
2374
- });
2375
- }
2376
- // ============================================================================
2377
- // Permissions
2378
- // ============================================================================
2379
- async respondToPermission(agentId, requestId, response) {
2380
- this.sendSessionMessage({
2381
- type: "agent_permission_response",
2382
- agentId,
2383
- requestId,
2384
- response,
2385
- });
2386
- }
2387
- async respondToPermissionAndWait(agentId, requestId, response, timeout = 15000) {
2388
- const message = SessionInboundMessageSchema.parse({
2389
- type: "agent_permission_response",
2390
- agentId,
2391
- requestId,
2392
- response,
2393
- });
2394
- return this.sendRequest({
2395
- requestId,
2396
- message,
2397
- timeout,
2398
- options: { skipQueue: true },
2399
- select: (msg) => {
2400
- if (msg.type !== "agent_permission_resolved") {
2401
- return null;
2402
- }
2403
- if (msg.payload.requestId !== requestId) {
2404
- return null;
2405
- }
2406
- if (msg.payload.agentId !== agentId) {
2407
- return null;
2408
- }
2409
- return msg.payload;
2410
- },
2411
- });
2412
- }
2413
- // ============================================================================
2414
- // Waiting / Streaming Helpers
2415
- // ============================================================================
2416
- async waitForAgentUpsert(agentId, predicate, timeout = 60000) {
2417
- const initialResult = await this.fetchAgent(agentId).catch(() => null);
2418
- if (initialResult && predicate(initialResult.agent)) {
2419
- return initialResult.agent;
2420
- }
2421
- const deadline = Date.now() + timeout;
2422
- return await new Promise((resolve, reject) => {
2423
- let settled = false;
2424
- let pollInFlight = false;
2425
- let pollTimer = null;
2426
- let timeoutTimer = null;
2427
- let unsubscribe = null;
2428
- const finish = (result) => {
2429
- if (settled) {
2430
- return;
2431
- }
2432
- settled = true;
2433
- if (timeoutTimer) {
2434
- clearTimeout(timeoutTimer);
2435
- timeoutTimer = null;
2436
- }
2437
- if (pollTimer) {
2438
- clearInterval(pollTimer);
2439
- pollTimer = null;
2440
- }
2441
- if (unsubscribe) {
2442
- unsubscribe();
2443
- unsubscribe = null;
2444
- }
2445
- if (result.kind === "ok") {
2446
- resolve(result.snapshot);
2447
- return;
2448
- }
2449
- reject(result.error);
2450
- };
2451
- const maybeResolve = (snapshot) => {
2452
- if (!snapshot) {
2453
- return false;
2454
- }
2455
- if (!predicate(snapshot)) {
2456
- return false;
2457
- }
2458
- finish({ kind: "ok", snapshot });
2459
- return true;
2460
- };
2461
- const poll = async () => {
2462
- if (settled || pollInFlight) {
2463
- return;
2464
- }
2465
- pollInFlight = true;
2466
- try {
2467
- const result = await this.fetchAgent(agentId).catch(() => null);
2468
- maybeResolve(result?.agent ?? null);
2469
- }
2470
- finally {
2471
- pollInFlight = false;
2472
- }
2473
- };
2474
- unsubscribe = this.on("agent_update", (message) => {
2475
- if (settled) {
2476
- return;
2477
- }
2478
- if (message.payload.kind !== "upsert") {
2479
- return;
2480
- }
2481
- const snapshot = message.payload.agent;
2482
- if (snapshot.id !== agentId) {
2483
- return;
2484
- }
2485
- maybeResolve(snapshot);
2486
- });
2487
- const remaining = Math.max(1, deadline - Date.now());
2488
- timeoutTimer = setTimeout(() => {
2489
- finish({
2490
- kind: "error",
2491
- error: new Error(`Timed out waiting for agent ${agentId}`),
2492
- });
2493
- }, remaining);
2494
- pollTimer = setInterval(() => {
2495
- void poll();
2496
- }, 250);
2497
- void poll();
2498
- });
2499
- }
2500
- async waitForFinish(agentId, timeout = 60000) {
2501
- const requestId = this.createRequestId();
2502
- const hasTimeout = Number.isFinite(timeout) && timeout > 0;
2503
- const message = SessionInboundMessageSchema.parse({
2504
- type: "wait_for_finish_request",
2505
- requestId,
2506
- agentId,
2507
- ...(hasTimeout ? { timeoutMs: timeout } : {}),
2508
- });
2509
- const payload = await this.sendCorrelatedRequest({
2510
- requestId,
2511
- message,
2512
- responseType: "wait_for_finish_response",
2513
- timeout: hasTimeout ? timeout + 5000 : 0,
2514
- options: { skipQueue: true },
2515
- });
2516
- return {
2517
- status: payload.status,
2518
- final: payload.final,
2519
- error: payload.error,
2520
- lastMessage: payload.lastMessage,
2521
- };
2522
- }
2523
- // ============================================================================
2524
- // Terminals
2525
- // ============================================================================
2526
- subscribeTerminals(input) {
2527
- this.terminalDirectorySubscriptions.add(input.cwd);
2528
- if (!this.transport || this.connectionState.status !== "connected") {
2529
- return;
2530
- }
2531
- this.sendSessionMessage({
2532
- type: "subscribe_terminals_request",
2533
- cwd: input.cwd,
2534
- });
2535
- }
2536
- unsubscribeTerminals(input) {
2537
- this.terminalDirectorySubscriptions.delete(input.cwd);
2538
- if (!this.transport || this.connectionState.status !== "connected") {
2539
- return;
2540
- }
2541
- this.sendSessionMessage({
2542
- type: "unsubscribe_terminals_request",
2543
- cwd: input.cwd,
2544
- });
2545
- }
2546
- async listTerminals(cwd, requestId) {
2547
- const resolvedRequestId = this.createRequestId(requestId);
2548
- const message = SessionInboundMessageSchema.parse({
2549
- type: "list_terminals_request",
2550
- ...(cwd === undefined ? {} : { cwd }),
2551
- requestId: resolvedRequestId,
2552
- });
2553
- return this.sendCorrelatedRequest({
2554
- requestId: resolvedRequestId,
2555
- message,
2556
- responseType: "list_terminals_response",
2557
- timeout: 10000,
2558
- options: { skipQueue: true },
2559
- });
2560
- }
2561
- async createTerminal(cwd, name, requestId, options) {
2562
- const resolvedRequestId = this.createRequestId(requestId);
2563
- const message = SessionInboundMessageSchema.parse({
2564
- type: "create_terminal_request",
2565
- cwd,
2566
- name,
2567
- agentId: options?.agentId,
2568
- command: options?.command,
2569
- args: options?.args,
2570
- requestId: resolvedRequestId,
2571
- });
2572
- return this.sendCorrelatedRequest({
2573
- requestId: resolvedRequestId,
2574
- message,
2575
- responseType: "create_terminal_response",
2576
- timeout: 10000,
2577
- options: { skipQueue: true },
2578
- });
2579
- }
2580
- async renameTerminal(input) {
2581
- return this.sendCorrelatedSessionRequest({
2582
- requestId: input.requestId,
2583
- message: {
2584
- type: "terminal.rename.request",
2585
- terminalId: input.terminalId,
2586
- title: input.title,
2587
- },
2588
- responseType: "terminal.rename.response",
2589
- timeout: 10000,
2590
- });
2591
- }
2592
- async subscribeTerminal(terminalId, optionsOrRequestId) {
2593
- const restore = typeof optionsOrRequestId === "object" ? optionsOrRequestId.restore : undefined;
2594
- const requestId = typeof optionsOrRequestId === "object" ? optionsOrRequestId.requestId : optionsOrRequestId;
2595
- const resolvedRequestId = this.createRequestId(requestId);
2596
- const message = SessionInboundMessageSchema.parse({
2597
- type: "subscribe_terminal_request",
2598
- terminalId,
2599
- requestId: resolvedRequestId,
2600
- ...(restore ? { restore } : {}),
2601
- });
2602
- const payload = await this.sendCorrelatedRequest({
2603
- requestId: resolvedRequestId,
2604
- message,
2605
- responseType: "subscribe_terminal_response",
2606
- timeout: 10000,
2607
- options: { skipQueue: true },
2608
- });
2609
- if (payload.error === null) {
2610
- this.terminalStreams.setSlot(terminalId, payload.slot);
2611
- }
2612
- return payload;
2613
- }
2614
- unsubscribeTerminal(terminalId) {
2615
- this.terminalStreams.removeTerminal(terminalId);
2616
- this.sendSessionMessage({
2617
- type: "unsubscribe_terminal_request",
2618
- terminalId,
2619
- });
2620
- }
2621
- sendTerminalInput(terminalId, message) {
2622
- const frame = this.terminalStreams.encodeInput(terminalId, message);
2623
- if (frame) {
2624
- this.sendBinaryFrame(frame);
2625
- return;
2626
- }
2627
- this.sendSessionMessage({
2628
- type: "terminal_input",
2629
- terminalId,
2630
- message,
2631
- });
2632
- }
2633
- async killTerminal(terminalId, requestId) {
2634
- const resolvedRequestId = this.createRequestId(requestId);
2635
- const message = SessionInboundMessageSchema.parse({
2636
- type: "kill_terminal_request",
2637
- terminalId,
2638
- requestId: resolvedRequestId,
2639
- });
2640
- return this.sendCorrelatedRequest({
2641
- requestId: resolvedRequestId,
2642
- message,
2643
- responseType: "kill_terminal_response",
2644
- timeout: 10000,
2645
- options: { skipQueue: true },
2646
- });
2647
- }
2648
- async closeItems(input, requestId) {
2649
- const resolvedRequestId = this.createRequestId(requestId);
2650
- const message = SessionInboundMessageSchema.parse({
2651
- type: "close_items_request",
2652
- agentIds: input.agentIds ?? [],
2653
- terminalIds: input.terminalIds ?? [],
2654
- requestId: resolvedRequestId,
2655
- });
2656
- return this.sendCorrelatedRequest({
2657
- requestId: resolvedRequestId,
2658
- message,
2659
- responseType: "close_items_response",
2660
- timeout: 10000,
2661
- options: { skipQueue: true },
2662
- });
2663
- }
2664
- async captureTerminal(terminalId, options, requestId) {
2665
- const resolvedRequestId = this.createRequestId(requestId);
2666
- const message = SessionInboundMessageSchema.parse({
2667
- type: "capture_terminal_request",
2668
- terminalId,
2669
- ...(options?.start === undefined ? {} : { start: options.start }),
2670
- ...(options?.end === undefined ? {} : { end: options.end }),
2671
- ...(options?.stripAnsi === undefined ? {} : { stripAnsi: options.stripAnsi }),
2672
- requestId: resolvedRequestId,
2673
- });
2674
- return this.sendCorrelatedRequest({
2675
- requestId: resolvedRequestId,
2676
- message,
2677
- responseType: "capture_terminal_response",
2678
- timeout: 10000,
2679
- options: { skipQueue: true },
2680
- });
2681
- }
2682
- async createChatRoom(options) {
2683
- return this.sendCorrelatedSessionRequest({
2684
- requestId: options.requestId,
2685
- message: {
2686
- type: "chat/create",
2687
- name: options.name,
2688
- ...(options.purpose ? { purpose: options.purpose } : {}),
2689
- },
2690
- responseType: "chat/create/response",
2691
- timeout: 10000,
2692
- });
2693
- }
2694
- async listChatRooms(requestId) {
2695
- return this.sendCorrelatedSessionRequest({
2696
- requestId,
2697
- message: {
2698
- type: "chat/list",
2699
- },
2700
- responseType: "chat/list/response",
2701
- timeout: 10000,
2702
- });
2703
- }
2704
- async inspectChatRoom(options) {
2705
- return this.sendCorrelatedSessionRequest({
2706
- requestId: options.requestId,
2707
- message: {
2708
- type: "chat/inspect",
2709
- room: options.room,
2710
- },
2711
- responseType: "chat/inspect/response",
2712
- timeout: 10000,
2713
- });
2714
- }
2715
- async deleteChatRoom(options) {
2716
- return this.sendCorrelatedSessionRequest({
2717
- requestId: options.requestId,
2718
- message: {
2719
- type: "chat/delete",
2720
- room: options.room,
2721
- },
2722
- responseType: "chat/delete/response",
2723
- timeout: 10000,
2724
- });
2725
- }
2726
- async postChatMessage(options) {
2727
- return this.sendCorrelatedSessionRequest({
2728
- requestId: options.requestId,
2729
- message: {
2730
- type: "chat/post",
2731
- room: options.room,
2732
- body: options.body,
2733
- ...(options.authorAgentId ? { authorAgentId: options.authorAgentId } : {}),
2734
- ...(options.replyToMessageId ? { replyToMessageId: options.replyToMessageId } : {}),
2735
- },
2736
- responseType: "chat/post/response",
2737
- timeout: 10000,
2738
- });
2739
- }
2740
- async readChatMessages(options) {
2741
- return this.sendCorrelatedSessionRequest({
2742
- requestId: options.requestId,
2743
- message: {
2744
- type: "chat/read",
2745
- room: options.room,
2746
- ...(typeof options.limit === "number" ? { limit: options.limit } : {}),
2747
- ...(options.since ? { since: options.since } : {}),
2748
- ...(options.authorAgentId ? { authorAgentId: options.authorAgentId } : {}),
2749
- },
2750
- responseType: "chat/read/response",
2751
- timeout: 10000,
2752
- });
2753
- }
2754
- async waitForChatMessages(options) {
2755
- return this.sendCorrelatedSessionRequest({
2756
- requestId: options.requestId,
2757
- message: {
2758
- type: "chat/wait",
2759
- room: options.room,
2760
- ...(options.afterMessageId ? { afterMessageId: options.afterMessageId } : {}),
2761
- ...(typeof options.timeoutMs === "number" ? { timeoutMs: options.timeoutMs } : {}),
2762
- },
2763
- responseType: "chat/wait/response",
2764
- timeout: (options.timeoutMs ?? 0) + 10000,
2765
- });
2766
- }
2767
- async scheduleCreate(options) {
2768
- return this.sendCorrelatedSessionRequest({
2769
- requestId: options.requestId,
2770
- message: {
2771
- type: "schedule/create",
2772
- prompt: options.prompt,
2773
- cadence: options.cadence,
2774
- target: options.target,
2775
- ...(options.name ? { name: options.name } : {}),
2776
- ...(typeof options.maxRuns === "number" ? { maxRuns: options.maxRuns } : {}),
2777
- ...(options.expiresAt ? { expiresAt: options.expiresAt } : {}),
2778
- ...(typeof options.runOnCreate === "boolean" ? { runOnCreate: options.runOnCreate } : {}),
2779
- },
2780
- responseType: "schedule/create/response",
2781
- timeout: 10000,
2782
- });
2783
- }
2784
- async scheduleList(requestId) {
2785
- return this.sendCorrelatedSessionRequest({
2786
- requestId,
2787
- message: {
2788
- type: "schedule/list",
2789
- },
2790
- responseType: "schedule/list/response",
2791
- timeout: 10000,
2792
- });
2793
- }
2794
- async scheduleInspect(options) {
2795
- return this.sendCorrelatedSessionRequest({
2796
- requestId: options.requestId,
2797
- message: {
2798
- type: "schedule/inspect",
2799
- scheduleId: options.id,
2800
- },
2801
- responseType: "schedule/inspect/response",
2802
- timeout: 10000,
2803
- });
2804
- }
2805
- async scheduleLogs(options) {
2806
- return this.sendCorrelatedSessionRequest({
2807
- requestId: options.requestId,
2808
- message: {
2809
- type: "schedule/logs",
2810
- scheduleId: options.id,
2811
- },
2812
- responseType: "schedule/logs/response",
2813
- timeout: 10000,
2814
- });
2815
- }
2816
- async schedulePause(options) {
2817
- return this.sendCorrelatedSessionRequest({
2818
- requestId: options.requestId,
2819
- message: {
2820
- type: "schedule/pause",
2821
- scheduleId: options.id,
2822
- },
2823
- responseType: "schedule/pause/response",
2824
- timeout: 10000,
2825
- });
2826
- }
2827
- async scheduleResume(options) {
2828
- return this.sendCorrelatedSessionRequest({
2829
- requestId: options.requestId,
2830
- message: {
2831
- type: "schedule/resume",
2832
- scheduleId: options.id,
2833
- },
2834
- responseType: "schedule/resume/response",
2835
- timeout: 10000,
2836
- });
2837
- }
2838
- async scheduleDelete(options) {
2839
- return this.sendCorrelatedSessionRequest({
2840
- requestId: options.requestId,
2841
- message: {
2842
- type: "schedule/delete",
2843
- scheduleId: options.id,
2844
- },
2845
- responseType: "schedule/delete/response",
2846
- timeout: 10000,
2847
- });
2848
- }
2849
- async scheduleRunOnce(options) {
2850
- return this.sendCorrelatedSessionRequest({
2851
- requestId: options.requestId,
2852
- message: {
2853
- type: "schedule/run-once",
2854
- scheduleId: options.id,
2855
- },
2856
- responseType: "schedule/run-once/response",
2857
- timeout: 10000,
2858
- });
2859
- }
2860
- async scheduleUpdate(options) {
2861
- return this.sendCorrelatedSessionRequest({
2862
- requestId: options.requestId,
2863
- message: {
2864
- type: "schedule/update",
2865
- scheduleId: options.id,
2866
- ...(options.name !== undefined ? { name: options.name } : {}),
2867
- ...(options.prompt !== undefined ? { prompt: options.prompt } : {}),
2868
- ...(options.cadence !== undefined ? { cadence: options.cadence } : {}),
2869
- ...(options.newAgentConfig !== undefined ? { newAgentConfig: options.newAgentConfig } : {}),
2870
- ...(options.maxRuns !== undefined ? { maxRuns: options.maxRuns } : {}),
2871
- ...(options.expiresAt !== undefined ? { expiresAt: options.expiresAt } : {}),
2872
- },
2873
- responseType: "schedule/update/response",
2874
- timeout: 10000,
2875
- });
2876
- }
2877
- async loopRun(options) {
2878
- return this.sendCorrelatedSessionRequest({
2879
- requestId: options.requestId,
2880
- message: {
2881
- type: "loop/run",
2882
- prompt: options.prompt,
2883
- cwd: options.cwd,
2884
- ...(options.provider ? { provider: options.provider } : {}),
2885
- ...(options.model ? { model: options.model } : {}),
2886
- ...(options.modeId ? { modeId: options.modeId } : {}),
2887
- ...(options.verifierProvider ? { verifierProvider: options.verifierProvider } : {}),
2888
- ...(options.verifierModel ? { verifierModel: options.verifierModel } : {}),
2889
- ...(options.verifierModeId ? { verifierModeId: options.verifierModeId } : {}),
2890
- ...(options.verifyPrompt ? { verifyPrompt: options.verifyPrompt } : {}),
2891
- ...(options.verifyChecks && options.verifyChecks.length > 0
2892
- ? { verifyChecks: options.verifyChecks }
2893
- : {}),
2894
- ...(options.name ? { name: options.name } : {}),
2895
- ...(typeof options.sleepMs === "number" ? { sleepMs: options.sleepMs } : {}),
2896
- ...(typeof options.maxIterations === "number"
2897
- ? { maxIterations: options.maxIterations }
2898
- : {}),
2899
- ...(typeof options.maxTimeMs === "number" ? { maxTimeMs: options.maxTimeMs } : {}),
2900
- },
2901
- responseType: "loop/run/response",
2902
- timeout: 15000,
2903
- });
2904
- }
2905
- async loopList(requestId) {
2906
- return this.sendCorrelatedSessionRequest({
2907
- requestId,
2908
- message: {
2909
- type: "loop/list",
2910
- },
2911
- responseType: "loop/list/response",
2912
- timeout: 10000,
2913
- });
2914
- }
2915
- async loopInspect(options) {
2916
- const normalized = typeof options === "string" ? { id: options } : options;
2917
- return this.sendCorrelatedSessionRequest({
2918
- requestId: normalized.requestId,
2919
- message: {
2920
- type: "loop/inspect",
2921
- id: normalized.id,
2922
- },
2923
- responseType: "loop/inspect/response",
2924
- timeout: 10000,
2925
- });
2926
- }
2927
- async loopLogs(options, afterSeq) {
2928
- const normalized = typeof options === "string" ? { id: options, afterSeq } : options;
2929
- return this.sendCorrelatedSessionRequest({
2930
- requestId: normalized.requestId,
2931
- message: {
2932
- type: "loop/logs",
2933
- id: normalized.id,
2934
- ...(typeof normalized.afterSeq === "number" ? { afterSeq: normalized.afterSeq } : {}),
2935
- },
2936
- responseType: "loop/logs/response",
2937
- timeout: 10000,
2938
- });
2939
- }
2940
- async loopStop(options) {
2941
- const normalized = typeof options === "string" ? { id: options } : options;
2942
- return this.sendCorrelatedSessionRequest({
2943
- requestId: normalized.requestId,
2944
- message: {
2945
- type: "loop/stop",
2946
- id: normalized.id,
2947
- },
2948
- responseType: "loop/stop/response",
2949
- timeout: 10000,
2950
- });
2951
- }
2952
- onTerminalStreamEvent(handler) {
2953
- return this.terminalStreams.onEvent(handler);
2954
- }
2955
- async waitForTerminalStreamEvent(predicate, timeout = 5000) {
2956
- return new Promise((resolve, reject) => {
2957
- const timeoutHandle = setTimeout(() => {
2958
- unsubscribe();
2959
- reject(new Error(`Timeout waiting for terminal stream event (${timeout}ms)`));
2960
- }, timeout);
2961
- const unsubscribe = this.onTerminalStreamEvent((event) => {
2962
- if (!predicate(event)) {
2963
- return;
2964
- }
2965
- clearTimeout(timeoutHandle);
2966
- unsubscribe();
2967
- resolve(event);
2968
- });
2969
- });
2970
- }
2971
- // ============================================================================
2972
- // Internals
2973
- // ============================================================================
2974
- createRequestId(requestId) {
2975
- return requestId ?? crypto.randomUUID();
2976
- }
2977
- getLastServerInfoMessage() {
2978
- return this.lastServerInfoMessage;
2979
- }
2980
- resolveTransportUrlForAttempt() {
2981
- return this.config.url;
2982
- }
2983
- sendHelloMessage() {
2984
- if (!this.transport) {
2985
- this.scheduleReconnect({
2986
- reason: "Transport unavailable before hello",
2987
- event: "HELLO_TRANSPORT_MISSING",
2988
- reasonCode: "transport_error",
2989
- });
2990
- return;
2991
- }
2992
- try {
2993
- this.transport.send(JSON.stringify({
2994
- type: "hello",
2995
- clientId: this.config.clientId,
2996
- clientType: this.config.clientType ?? "cli",
2997
- protocolVersion: 1,
2998
- capabilities: {
2999
- [CLIENT_CAPS.reasoningMergeEnum]: true,
3000
- },
3001
- ...(this.config.appVersion ? { appVersion: this.config.appVersion } : {}),
3002
- }));
3003
- }
3004
- catch (error) {
3005
- const message = error instanceof Error ? error.message : "Failed to send hello message";
3006
- this.lastErrorValue = message;
3007
- this.scheduleReconnect({
3008
- reason: message,
3009
- event: "HELLO_SEND_FAILED",
3010
- reasonCode: "transport_error",
3011
- });
3012
- }
3013
- }
3014
- disposeTransport(code = 1001, reason = "Reconnecting") {
3015
- this.cleanupTransport();
3016
- if (this.transport) {
3017
- try {
3018
- this.transport.close(code, reason);
3019
- }
3020
- catch {
3021
- // no-op
3022
- }
3023
- this.transport = null;
3024
- }
3025
- }
3026
- cleanupTransport() {
3027
- this.resetConnectTimeout();
3028
- if (this.pendingGenericTransportErrorTimeout) {
3029
- clearTimeout(this.pendingGenericTransportErrorTimeout);
3030
- this.pendingGenericTransportErrorTimeout = null;
3031
- }
3032
- for (const cleanup of this.transportCleanup) {
3033
- try {
3034
- cleanup();
3035
- }
3036
- catch {
3037
- // no-op
3038
- }
3039
- }
3040
- this.transportCleanup = [];
3041
- }
3042
- resetConnectTimeout() {
3043
- if (!this.connectTimeout) {
3044
- return;
3045
- }
3046
- clearTimeout(this.connectTimeout);
3047
- this.connectTimeout = null;
3048
- }
3049
- handleTransportMessage(data) {
3050
- const rawData = data && typeof data === "object" && "data" in data ? data.data : data;
3051
- if (typeof Blob !== "undefined" &&
3052
- rawData instanceof Blob &&
3053
- typeof rawData.arrayBuffer === "function") {
3054
- void rawData
3055
- .arrayBuffer()
3056
- .then((buffer) => {
3057
- this.handleTransportMessage(buffer);
3058
- return;
3059
- })
3060
- .catch(() => {
3061
- // Ignore failed blob decoding and allow reconnect logic to recover.
3062
- });
3063
- return;
3064
- }
3065
- const rawBytes = asUint8Array(rawData);
3066
- if (rawBytes && this.tryHandleBinaryFrame(rawBytes)) {
3067
- return;
3068
- }
3069
- const payload = decodeMessageData(rawData);
3070
- if (!payload) {
3071
- return;
3072
- }
3073
- this.handleJsonPayload(payload, rawBytes?.byteLength);
3074
- }
3075
- handleJsonPayload(payload, rawBytesLength) {
3076
- const bytes = rawBytesLength ?? payload.length;
3077
- const startMs = perfNow();
3078
- let parsedJson;
3079
- try {
3080
- parsedJson = JSON.parse(payload);
3081
- }
3082
- catch {
3083
- return;
3084
- }
3085
- const parsed = WSOutboundMessageSchema.safeParse(parsedJson);
3086
- if (!parsed.success) {
3087
- const msgType = parsedJson != null &&
3088
- typeof parsedJson === "object" &&
3089
- "type" in parsedJson &&
3090
- typeof parsedJson.type === "string"
3091
- ? parsedJson.type
3092
- : "unknown";
3093
- this.logger.warn({ msgType, error: parsed.error.message }, "Message validation failed");
3094
- return;
3095
- }
3096
- this.consecutiveLivenessFailures = 0;
3097
- if (parsed.data.type === "pong") {
3098
- this.resolveLivenessProbe();
3099
- this.runtimeMetrics?.recordMessage("pong", bytes, perfNow() - startMs);
3100
- return;
3101
- }
3102
- this.handleSessionMessage(parsed.data.message);
3103
- const msgType = parsed.data.message.type;
3104
- this.runtimeMetrics?.recordMessage(msgType, bytes, perfNow() - startMs);
3105
- if (parsed.data.message.type === "agent_stream") {
3106
- this.runtimeMetrics?.recordAgentStream(parsed.data.message.payload);
3107
- }
3108
- }
3109
- tryHandleBinaryFrame(rawBytes) {
3110
- const fileFrame = decodeFileTransferFrame(rawBytes);
3111
- if (fileFrame) {
3112
- this.handleFileTransferFrame(fileFrame);
3113
- this.runtimeMetrics?.recordBinaryFrame("other", rawBytes.byteLength, 0);
3114
- return true;
3115
- }
3116
- const frame = decodeTerminalStreamFrame(rawBytes);
3117
- if (!frame) {
3118
- return false;
3119
- }
3120
- const binaryStartMs = perfNow();
3121
- this.terminalStreams.handleFrame(frame);
3122
- let frameKind = "other";
3123
- if (frame.opcode === TerminalStreamOpcode.Output) {
3124
- frameKind = "output";
3125
- }
3126
- else if (frame.opcode === TerminalStreamOpcode.Snapshot) {
3127
- frameKind = "snapshot";
3128
- }
3129
- else if (frame.opcode === TerminalStreamOpcode.Restore) {
3130
- frameKind = "output";
3131
- }
3132
- this.runtimeMetrics?.recordBinaryFrame(frameKind, rawBytes.byteLength, perfNow() - binaryStartMs);
3133
- return true;
3134
- }
3135
- handleFileTransferFrame(frame) {
3136
- if (frame.opcode === FileTransferOpcode.FileBegin) {
3137
- const pending = this.pendingBinaryFileReads.get(frame.requestId);
3138
- if (!pending) {
3139
- return;
3140
- }
3141
- this.activeBinaryFileTransfers.set(frame.requestId, {
3142
- ...pending,
3143
- mime: frame.metadata.mime,
3144
- size: frame.metadata.size,
3145
- encoding: frame.metadata.encoding,
3146
- modifiedAt: frame.metadata.modifiedAt,
3147
- chunks: [],
3148
- });
3149
- return;
3150
- }
3151
- const transfer = this.activeBinaryFileTransfers.get(frame.requestId);
3152
- if (!transfer) {
3153
- return;
3154
- }
3155
- if (frame.opcode === FileTransferOpcode.FileChunk) {
3156
- transfer.chunks.push(frame.payload);
3157
- return;
3158
- }
3159
- const bytes = concatByteChunks(transfer.chunks, transfer.size);
3160
- this.activeBinaryFileTransfers.delete(frame.requestId);
3161
- this.completedBinaryFileReads.set(frame.requestId, {
3162
- bytes,
3163
- mime: transfer.mime,
3164
- size: transfer.size,
3165
- path: transfer.path,
3166
- kind: binaryFileKind(transfer.mime, transfer.encoding),
3167
- modifiedAt: transfer.modifiedAt,
3168
- });
3169
- this.handleSessionMessage({
3170
- type: "file_explorer_response",
3171
- payload: {
3172
- cwd: transfer.cwd,
3173
- path: transfer.path,
3174
- mode: "file",
3175
- directory: null,
3176
- file: null,
3177
- error: null,
3178
- requestId: frame.requestId,
3179
- },
3180
- });
3181
- }
3182
- updateConnectionState(next, metadata) {
3183
- const previous = this.connectionState;
3184
- this.connectionState = next;
3185
- const reasonFromNext = next.status === "disconnected" && typeof next.reason === "string" ? next.reason : null;
3186
- const reason = metadata?.reason ?? reasonFromNext;
3187
- const reasonCode = metadata?.reasonCode ?? toReasonCode(reason);
3188
- this.logger.debug({
3189
- serverId: this.logServerId,
3190
- clientIdHash: this.logClientIdHash,
3191
- from: previous.status,
3192
- to: next.status,
3193
- event: metadata?.event ?? "STATE_UPDATE",
3194
- connectionPath: this.logConnectionPath,
3195
- generation: this.logGeneration,
3196
- reasonCode,
3197
- reason,
3198
- }, "DaemonClientTransition");
3199
- for (const listener of this.connectionListeners) {
3200
- try {
3201
- listener(next);
3202
- }
3203
- catch {
3204
- // no-op
3205
- }
3206
- }
3207
- }
3208
- setReconnectEnabled(enabled) {
3209
- this.config = { ...this.config, reconnect: { ...this.config.reconnect, enabled } };
3210
- }
3211
- scheduleReconnect(input) {
3212
- if (this.reconnectTimeout) {
3213
- clearTimeout(this.reconnectTimeout);
3214
- this.reconnectTimeout = null;
3215
- }
3216
- const wasDisposed = this.connectionState.status === "disposed";
3217
- const reason = input?.reason;
3218
- if (typeof reason === "string" && reason.trim().length > 0) {
3219
- this.lastErrorValue = reason.trim();
3220
- }
3221
- // Clear all pending waiters and queued sends since the connection was lost
3222
- // and responses from the previous connection will never arrive.
3223
- this.clearWaiters(new Error(reason ?? "Connection lost"));
3224
- this.rejectPendingSendQueue(new Error(reason ?? "Connection lost"));
3225
- this.rejectLivenessProbe(new Error(reason ?? "Connection lost"));
3226
- this.terminalStreams.clearSlots();
3227
- this.lastServerInfoMessage = null;
3228
- if (wasDisposed) {
3229
- this.rejectConnect(new Error(reason ?? "Daemon client is disposed"));
3230
- return;
3231
- }
3232
- this.emitDisconnectedStateForReconnect(reason, input);
3233
- if (!this.shouldReconnect || this.config.reconnect?.enabled === false) {
3234
- this.rejectConnect(new Error(reason ?? "Transport disconnected before connect"));
3235
- return;
3236
- }
3237
- this.armReconnectTimer();
3238
- }
3239
- emitDisconnectedStateForReconnect(reason, input) {
3240
- this.updateConnectionState({
3241
- status: "disconnected",
3242
- ...(reason ? { reason } : {}),
3243
- }, {
3244
- event: input?.event ?? "TRANSPORT_CLOSE",
3245
- ...(reason ? { reason } : {}),
3246
- ...(input?.reasonCode ? { reasonCode: input.reasonCode } : {}),
3247
- });
3248
- }
3249
- armReconnectTimer() {
3250
- const attempt = this.reconnectAttempt;
3251
- const baseDelay = this.config.reconnect?.baseDelayMs ?? DEFAULT_RECONNECT_BASE_DELAY_MS;
3252
- const maxDelay = this.config.reconnect?.maxDelayMs ?? DEFAULT_RECONNECT_MAX_DELAY_MS;
3253
- const delay = Math.min(baseDelay * 2 ** attempt, maxDelay);
3254
- this.reconnectAttempt = attempt + 1;
3255
- this.reconnectTimeout = setTimeout(() => {
3256
- this.reconnectTimeout = null;
3257
- if (!this.shouldReconnect) {
3258
- return;
3259
- }
3260
- this.attemptConnect();
3261
- }, delay);
3262
- }
3263
- resolveLivenessProbe() {
3264
- const probe = this.livenessProbe;
3265
- if (!probe) {
3266
- return;
3267
- }
3268
- this.livenessProbe = null;
3269
- clearTimeout(probe.timeoutHandle);
3270
- probe.resolve({ rttMs: perfNow() - probe.startedAt });
3271
- }
3272
- clearLivenessProbe() {
3273
- const probe = this.livenessProbe;
3274
- if (!probe) {
3275
- return;
3276
- }
3277
- this.livenessProbe = null;
3278
- clearTimeout(probe.timeoutHandle);
3279
- }
3280
- rejectLivenessProbe(error) {
3281
- const probe = this.livenessProbe;
3282
- if (!probe) {
3283
- return;
3284
- }
3285
- this.livenessProbe = null;
3286
- clearTimeout(probe.timeoutHandle);
3287
- probe.reject(error);
3288
- }
3289
- recordLivenessFailure(error) {
3290
- this.consecutiveLivenessFailures += 1;
3291
- if (this.consecutiveLivenessFailures < LIVENESS_FAILURE_RECONNECT_THRESHOLD) {
3292
- return;
3293
- }
3294
- this.consecutiveLivenessFailures = 0;
3295
- this.lastErrorValue = error.message;
3296
- this.disposeTransport(1001, "Liveness check timed out");
3297
- this.scheduleReconnect({
3298
- reason: error.message,
3299
- event: "LIVENESS_TIMEOUT",
3300
- reasonCode: "liveness_timeout",
3301
- });
3302
- }
3303
- handleSessionMessage(msg) {
3304
- if (msg.type === "status") {
3305
- const serverInfo = parseServerInfoStatusPayload(msg.payload);
3306
- if (serverInfo) {
3307
- this.lastServerInfoMessage = serverInfo;
3308
- if (this.connectionState.status === "connecting") {
3309
- this.resetConnectTimeout();
3310
- this.reconnectAttempt = 0;
3311
- this.updateConnectionState({ status: "connected" }, { event: "HELLO_SERVER_INFO" });
3312
- this.resubscribeCheckoutDiffSubscriptions();
3313
- this.resubscribeTerminalDirectorySubscriptions();
3314
- this.flushPendingSendQueue();
3315
- this.resolveConnect();
3316
- }
3317
- }
3318
- }
3319
- if (msg.type === "terminal_stream_exit") {
3320
- this.terminalStreams.removeTerminal(msg.payload.terminalId);
3321
- }
3322
- if (this.rawMessageListeners.size > 0) {
3323
- for (const handler of this.rawMessageListeners) {
3324
- try {
3325
- handler(msg);
3326
- }
3327
- catch {
3328
- // no-op
3329
- }
3330
- }
3331
- }
3332
- const handlers = this.messageHandlers.get(msg.type);
3333
- if (handlers) {
3334
- for (const handler of handlers) {
3335
- try {
3336
- handler(msg);
3337
- }
3338
- catch {
3339
- // no-op
3340
- }
3341
- }
3342
- }
3343
- const event = this.toEvent(msg);
3344
- if (event) {
3345
- for (const handler of this.eventListeners) {
3346
- handler(event);
3347
- }
3348
- }
3349
- this.resolveWaiters(msg);
3350
- }
3351
- resolveWaiters(msg) {
3352
- for (const waiter of Array.from(this.waiters)) {
3353
- const result = waiter.predicate(msg);
3354
- if (result !== null) {
3355
- this.waiters.delete(waiter);
3356
- if (waiter.timeoutHandle) {
3357
- clearTimeout(waiter.timeoutHandle);
3358
- }
3359
- waiter.resolve(result);
3360
- }
3361
- }
3362
- }
3363
- clearWaiters(error) {
3364
- for (const waiter of Array.from(this.waiters)) {
3365
- if (waiter.timeoutHandle) {
3366
- clearTimeout(waiter.timeoutHandle);
3367
- }
3368
- waiter.reject(error);
3369
- }
3370
- this.waiters.clear();
3371
- }
3372
- toEvent(msg) {
3373
- switch (msg.type) {
3374
- case "agent_update":
3375
- return {
3376
- type: "agent_update",
3377
- agentId: msg.payload.kind === "upsert" ? msg.payload.agent.id : msg.payload.agentId,
3378
- payload: msg.payload,
3379
- };
3380
- case "workspace_update":
3381
- return {
3382
- type: "workspace_update",
3383
- workspaceId: msg.payload.kind === "upsert" ? msg.payload.workspace.id : msg.payload.id,
3384
- payload: msg.payload,
3385
- };
3386
- case "workspace_setup_progress":
3387
- return {
3388
- type: "workspace_setup_progress",
3389
- workspaceId: msg.payload.workspaceId,
3390
- payload: msg.payload,
3391
- };
3392
- case "agent_stream":
3393
- return {
3394
- type: "agent_stream",
3395
- agentId: msg.payload.agentId,
3396
- event: msg.payload.event,
3397
- timestamp: msg.payload.timestamp,
3398
- ...(typeof msg.payload.seq === "number" ? { seq: msg.payload.seq } : {}),
3399
- ...(typeof msg.payload.epoch === "string" ? { epoch: msg.payload.epoch } : {}),
3400
- };
3401
- case "status":
3402
- return { type: "status", payload: msg.payload };
3403
- case "agent_deleted":
3404
- return { type: "agent_deleted", agentId: msg.payload.agentId };
3405
- case "agent_permission_request":
3406
- return {
3407
- type: "agent_permission_request",
3408
- agentId: msg.payload.agentId,
3409
- request: msg.payload.request,
3410
- };
3411
- case "agent_permission_resolved":
3412
- return {
3413
- type: "agent_permission_resolved",
3414
- agentId: msg.payload.agentId,
3415
- requestId: msg.payload.requestId,
3416
- resolution: msg.payload.resolution,
3417
- };
3418
- case "providers_snapshot_update":
3419
- return {
3420
- type: "providers_snapshot_update",
3421
- payload: msg.payload,
3422
- };
3423
- default:
3424
- return null;
3425
- }
3426
- }
3427
- waitForWithCancel(predicate, timeout = 30000, _options) {
3428
- // Capture stack trace at call site, not inside setTimeout
3429
- const timeoutError = new Error(`Timeout waiting for message (${timeout}ms)`);
3430
- let waiter = null;
3431
- let settled = false;
3432
- let rejectFn = null;
3433
- const promise = new Promise((resolve, reject) => {
3434
- const wrappedResolve = (value) => {
3435
- if (settled)
3436
- return;
3437
- settled = true;
3438
- resolve(value);
3439
- };
3440
- const wrappedReject = (error) => {
3441
- if (settled)
3442
- return;
3443
- settled = true;
3444
- reject(error);
3445
- };
3446
- rejectFn = wrappedReject;
3447
- const timeoutHandle = timeout > 0
3448
- ? setTimeout(() => {
3449
- if (waiter) {
3450
- this.waiters.delete(waiter);
3451
- }
3452
- wrappedReject(timeoutError);
3453
- }, timeout)
3454
- : null;
3455
- waiter = {
3456
- predicate,
3457
- resolve: wrappedResolve,
3458
- reject: wrappedReject,
3459
- timeoutHandle,
3460
- };
3461
- this.waiters.add(waiter);
3462
- });
3463
- const cancel = (error) => {
3464
- if (settled) {
3465
- return;
3466
- }
3467
- if (waiter) {
3468
- this.waiters.delete(waiter);
3469
- if (waiter.timeoutHandle) {
3470
- clearTimeout(waiter.timeoutHandle);
3471
- }
3472
- }
3473
- if (rejectFn) {
3474
- rejectFn(error);
3475
- return;
3476
- }
3477
- // Extremely unlikely: cancel called before the Promise executor ran.
3478
- queueMicrotask(() => {
3479
- if (!settled && rejectFn) {
3480
- rejectFn(error);
3481
- }
3482
- });
3483
- };
3484
- return { promise, cancel };
3485
- }
3486
- }
3487
- function resolveAgentConfig(options) {
3488
- const { config, provider, cwd, env: _env, workspaceId: _workspaceId, initialPrompt: _initialPrompt, images: _images, git: _git, worktreeName: _worktreeName, requestId: _requestId, labels: _labels, ...overrides } = options;
3489
- const baseConfig = {
3490
- ...(provider ? { provider } : {}),
3491
- ...(cwd ? { cwd } : {}),
3492
- ...overrides,
3493
- };
3494
- const merged = config ? { ...baseConfig, ...config } : baseConfig;
3495
- if (!merged.provider || !merged.cwd) {
3496
- throw new Error("createAgent requires provider and cwd");
3497
- }
3498
- return {
3499
- ...merged,
3500
- provider: merged.provider,
3501
- cwd: merged.cwd,
3502
- };
3503
- }
3504
- //# sourceMappingURL=daemon-client.js.map