@getpaseo/server 0.1.62 → 0.1.65

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 (590) hide show
  1. package/README.md +4 -0
  2. package/dist/server/client/daemon-client-runtime-metrics.d.ts +6 -6
  3. package/dist/server/client/daemon-client-runtime-metrics.d.ts.map +1 -1
  4. package/dist/server/client/daemon-client-transport-types.d.ts +15 -13
  5. package/dist/server/client/daemon-client-transport-types.d.ts.map +1 -1
  6. package/dist/server/client/daemon-client-websocket-transport.d.ts +3 -2
  7. package/dist/server/client/daemon-client-websocket-transport.d.ts.map +1 -1
  8. package/dist/server/client/daemon-client-websocket-transport.js +9 -8
  9. package/dist/server/client/daemon-client-websocket-transport.js.map +1 -1
  10. package/dist/server/client/daemon-client.d.ts +88 -56
  11. package/dist/server/client/daemon-client.d.ts.map +1 -1
  12. package/dist/server/client/daemon-client.js +264 -111
  13. package/dist/server/client/daemon-client.js.map +1 -1
  14. package/dist/server/client/terminal-stream-router.d.ts +24 -0
  15. package/dist/server/client/terminal-stream-router.d.ts.map +1 -0
  16. package/dist/server/client/terminal-stream-router.js +100 -0
  17. package/dist/server/client/terminal-stream-router.js.map +1 -0
  18. package/dist/server/server/agent/activity-curator.d.ts +6 -3
  19. package/dist/server/server/agent/activity-curator.d.ts.map +1 -1
  20. package/dist/server/server/agent/activity-curator.js +45 -138
  21. package/dist/server/server/agent/activity-curator.js.map +1 -1
  22. package/dist/server/server/agent/agent-loading.d.ts.map +1 -1
  23. package/dist/server/server/agent/agent-loading.js +5 -3
  24. package/dist/server/server/agent/agent-loading.js.map +1 -1
  25. package/dist/server/server/agent/agent-manager.d.ts +46 -31
  26. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  27. package/dist/server/server/agent/agent-manager.js +457 -419
  28. package/dist/server/server/agent/agent-manager.js.map +1 -1
  29. package/dist/server/server/agent/agent-metadata-generator.d.ts +6 -11
  30. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
  31. package/dist/server/server/agent/agent-metadata-generator.js +3 -85
  32. package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
  33. package/dist/server/server/agent/agent-projections.d.ts +4 -6
  34. package/dist/server/server/agent/agent-projections.d.ts.map +1 -1
  35. package/dist/server/server/agent/agent-projections.js +59 -65
  36. package/dist/server/server/agent/agent-projections.js.map +1 -1
  37. package/dist/server/server/agent/agent-response-loop.d.ts +4 -4
  38. package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
  39. package/dist/server/server/agent/agent-response-loop.js +58 -45
  40. package/dist/server/server/agent/agent-response-loop.js.map +1 -1
  41. package/dist/server/server/agent/agent-sdk-types.d.ts +58 -41
  42. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  43. package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
  44. package/dist/server/server/agent/agent-storage.d.ts +2 -2
  45. package/dist/server/server/agent/agent-storage.d.ts.map +1 -1
  46. package/dist/server/server/agent/agent-storage.js +29 -36
  47. package/dist/server/server/agent/agent-storage.js.map +1 -1
  48. package/dist/server/server/agent/agent-stream-coalescer.d.ts +7 -7
  49. package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -1
  50. package/dist/server/server/agent/agent-stream-coalescer.js +1 -1
  51. package/dist/server/server/agent/agent-stream-coalescer.js.map +1 -1
  52. package/dist/server/server/agent/agent-timeline-store-types.d.ts +10 -10
  53. package/dist/server/server/agent/agent-timeline-store-types.d.ts.map +1 -1
  54. package/dist/server/server/agent/agent-timeline-store.d.ts +2 -2
  55. package/dist/server/server/agent/agent-timeline-store.d.ts.map +1 -1
  56. package/dist/server/server/agent/agent-timeline-store.js +103 -85
  57. package/dist/server/server/agent/agent-timeline-store.js.map +1 -1
  58. package/dist/server/server/agent/foreground-run-state.d.ts +50 -0
  59. package/dist/server/server/agent/foreground-run-state.d.ts.map +1 -0
  60. package/dist/server/server/agent/foreground-run-state.js +162 -0
  61. package/dist/server/server/agent/foreground-run-state.js.map +1 -0
  62. package/dist/server/server/agent/mcp-server.d.ts +5 -3
  63. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  64. package/dist/server/server/agent/mcp-server.js +282 -234
  65. package/dist/server/server/agent/mcp-server.js.map +1 -1
  66. package/dist/server/server/agent/mcp-shared.d.ts +9 -2
  67. package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
  68. package/dist/server/server/agent/mcp-shared.js +9 -1
  69. package/dist/server/server/agent/mcp-shared.js.map +1 -1
  70. package/dist/server/server/agent/model-resolver.d.ts +2 -2
  71. package/dist/server/server/agent/model-resolver.d.ts.map +1 -1
  72. package/dist/server/server/agent/model-resolver.js +9 -5
  73. package/dist/server/server/agent/model-resolver.js.map +1 -1
  74. package/dist/server/server/agent/prompt-attachments.d.ts +4 -3
  75. package/dist/server/server/agent/prompt-attachments.d.ts.map +1 -1
  76. package/dist/server/server/agent/prompt-attachments.js +43 -4
  77. package/dist/server/server/agent/prompt-attachments.js.map +1 -1
  78. package/dist/server/server/agent/provider-launch-config.d.ts +28 -17
  79. package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
  80. package/dist/server/server/agent/provider-launch-config.js +20 -9
  81. package/dist/server/server/agent/provider-launch-config.js.map +1 -1
  82. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
  83. package/dist/server/server/agent/provider-manifest.js +7 -0
  84. package/dist/server/server/agent/provider-manifest.js.map +1 -1
  85. package/dist/server/server/agent/provider-registry.d.ts +4 -2
  86. package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
  87. package/dist/server/server/agent/provider-registry.js +24 -21
  88. package/dist/server/server/agent/provider-registry.js.map +1 -1
  89. package/dist/server/server/agent/provider-snapshot-manager.d.ts +6 -5
  90. package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -1
  91. package/dist/server/server/agent/provider-snapshot-manager.js +40 -31
  92. package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
  93. package/dist/server/server/agent/providers/acp-agent.d.ts +49 -13
  94. package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
  95. package/dist/server/server/agent/providers/acp-agent.js +404 -261
  96. package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
  97. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +2 -0
  98. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts.map +1 -1
  99. package/dist/server/server/agent/providers/claude/sidechain-tracker.js +47 -45
  100. package/dist/server/server/agent/providers/claude/sidechain-tracker.js.map +1 -1
  101. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +2 -2
  102. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -1
  103. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +10 -5
  104. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -1
  105. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -1
  106. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +11 -2
  107. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
  108. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +2 -2
  109. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -1
  110. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +83 -206
  111. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
  112. package/dist/server/server/agent/providers/claude-agent.d.ts +20 -8
  113. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  114. package/dist/server/server/agent/providers/claude-agent.js +654 -554
  115. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  116. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +2 -2
  117. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts.map +1 -1
  118. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +2 -2
  119. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
  120. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +174 -185
  121. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
  122. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +62 -13
  123. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  124. package/dist/server/server/agent/providers/codex-app-server-agent.js +873 -646
  125. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  126. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts +2 -2
  127. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -1
  128. package/dist/server/server/agent/providers/codex-rollout-timeline.js +58 -47
  129. package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -1
  130. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +2 -2
  131. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +1 -1
  132. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +3 -3
  133. package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -1
  134. package/dist/server/server/agent/providers/diagnostic-utils.js +82 -9
  135. package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -1
  136. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +2 -2
  137. package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -1
  138. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +6 -2
  139. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -1
  140. package/dist/server/server/agent/providers/mock-load-test-agent.js +294 -113
  141. package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -1
  142. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +1 -1
  143. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts.map +1 -1
  144. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +94 -2
  145. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js.map +1 -1
  146. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +2 -2
  147. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +1 -1
  148. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +24 -115
  149. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +1 -1
  150. package/dist/server/server/agent/providers/opencode-agent.d.ts +104 -3
  151. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  152. package/dist/server/server/agent/providers/opencode-agent.js +786 -503
  153. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  154. package/dist/server/server/agent/providers/pi-direct-agent.d.ts +1 -0
  155. package/dist/server/server/agent/providers/pi-direct-agent.d.ts.map +1 -1
  156. package/dist/server/server/agent/providers/pi-direct-agent.js +109 -140
  157. package/dist/server/server/agent/providers/pi-direct-agent.js.map +1 -1
  158. package/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
  159. package/dist/server/server/agent/providers/provider-runner.d.ts.map +1 -0
  160. package/dist/server/server/agent/providers/provider-runner.js +80 -0
  161. package/dist/server/server/agent/providers/provider-runner.js.map +1 -0
  162. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -1
  163. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +3 -1
  164. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -1
  165. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +9 -6
  166. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  167. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +102 -73
  168. package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -1
  169. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +4 -2
  170. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -1
  171. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +31 -0
  172. package/dist/server/server/agent/providers/tool-call-mapper-utils.js.map +1 -1
  173. package/dist/server/server/agent/stt-manager.d.ts.map +1 -1
  174. package/dist/server/server/agent/stt-manager.js +63 -53
  175. package/dist/server/server/agent/stt-manager.js.map +1 -1
  176. package/dist/server/server/agent/timeline-projection.d.ts +27 -11
  177. package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
  178. package/dist/server/server/agent/timeline-projection.js +70 -15
  179. package/dist/server/server/agent/timeline-projection.js.map +1 -1
  180. package/dist/server/server/agent/tts-manager.d.ts.map +1 -1
  181. package/dist/server/server/agent/tts-manager.js +1 -0
  182. package/dist/server/server/agent/tts-manager.js.map +1 -1
  183. package/dist/server/server/agent-attention-policy.d.ts +2 -2
  184. package/dist/server/server/agent-attention-policy.d.ts.map +1 -1
  185. package/dist/server/server/auth.d.ts +25 -0
  186. package/dist/server/server/auth.d.ts.map +1 -0
  187. package/dist/server/server/auth.js +93 -0
  188. package/dist/server/server/auth.js.map +1 -0
  189. package/dist/server/server/bootstrap.d.ts +7 -5
  190. package/dist/server/server/bootstrap.d.ts.map +1 -1
  191. package/dist/server/server/bootstrap.js +550 -485
  192. package/dist/server/server/bootstrap.js.map +1 -1
  193. package/dist/server/server/chat/chat-service.d.ts +1 -1
  194. package/dist/server/server/chat/chat-service.d.ts.map +1 -1
  195. package/dist/server/server/chat/chat-service.js +3 -3
  196. package/dist/server/server/chat/chat-service.js.map +1 -1
  197. package/dist/server/server/checkout-diff-manager.d.ts +2 -2
  198. package/dist/server/server/checkout-diff-manager.d.ts.map +1 -1
  199. package/dist/server/server/checkout-git-utils.d.ts +5 -3
  200. package/dist/server/server/checkout-git-utils.d.ts.map +1 -1
  201. package/dist/server/server/checkout-git-utils.js +1 -2
  202. package/dist/server/server/checkout-git-utils.js.map +1 -1
  203. package/dist/server/server/config.d.ts.map +1 -1
  204. package/dist/server/server/config.js +79 -39
  205. package/dist/server/server/config.js.map +1 -1
  206. package/dist/server/server/connection-offer.d.ts +2 -2
  207. package/dist/server/server/connection-offer.d.ts.map +1 -1
  208. package/dist/server/server/daemon-config-store.d.ts +5 -3
  209. package/dist/server/server/daemon-config-store.d.ts.map +1 -1
  210. package/dist/server/server/daemon-config-store.js +26 -0
  211. package/dist/server/server/daemon-config-store.js.map +1 -1
  212. package/dist/server/server/daemon-keypair.d.ts +2 -2
  213. package/dist/server/server/daemon-keypair.d.ts.map +1 -1
  214. package/dist/server/server/editor-targets.d.ts +4 -4
  215. package/dist/server/server/editor-targets.d.ts.map +1 -1
  216. package/dist/server/server/editor-targets.js +11 -15
  217. package/dist/server/server/editor-targets.js.map +1 -1
  218. package/dist/server/server/exports.d.ts +10 -4
  219. package/dist/server/server/exports.d.ts.map +1 -1
  220. package/dist/server/server/exports.js +7 -4
  221. package/dist/server/server/exports.js.map +1 -1
  222. package/dist/server/server/file-download/token-store.d.ts +4 -4
  223. package/dist/server/server/file-download/token-store.d.ts.map +1 -1
  224. package/dist/server/server/file-explorer/service.d.ts +10 -0
  225. package/dist/server/server/file-explorer/service.d.ts.map +1 -1
  226. package/dist/server/server/file-explorer/service.js +38 -4
  227. package/dist/server/server/file-explorer/service.js.map +1 -1
  228. package/dist/server/server/index.js +25 -18
  229. package/dist/server/server/index.js.map +1 -1
  230. package/dist/server/server/logger.d.ts +4 -4
  231. package/dist/server/server/logger.d.ts.map +1 -1
  232. package/dist/server/server/logger.js +41 -21
  233. package/dist/server/server/logger.js.map +1 -1
  234. package/dist/server/server/loop/rpc-schemas.d.ts +52 -52
  235. package/dist/server/server/loop-service.d.ts +13 -12
  236. package/dist/server/server/loop-service.d.ts.map +1 -1
  237. package/dist/server/server/loop-service.js +22 -18
  238. package/dist/server/server/loop-service.js.map +1 -1
  239. package/dist/server/server/package-version.d.ts +2 -2
  240. package/dist/server/server/package-version.d.ts.map +1 -1
  241. package/dist/server/server/package-version.js +19 -17
  242. package/dist/server/server/package-version.js.map +1 -1
  243. package/dist/server/server/pagination/cursor.d.ts +16 -0
  244. package/dist/server/server/pagination/cursor.d.ts.map +1 -0
  245. package/dist/server/server/pagination/cursor.js +62 -0
  246. package/dist/server/server/pagination/cursor.js.map +1 -0
  247. package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
  248. package/dist/server/server/pagination/sortable-pager.d.ts.map +1 -0
  249. package/dist/server/server/pagination/sortable-pager.js +68 -0
  250. package/dist/server/server/pagination/sortable-pager.js.map +1 -0
  251. package/dist/server/server/pairing-offer.d.ts +2 -2
  252. package/dist/server/server/pairing-offer.d.ts.map +1 -1
  253. package/dist/server/server/paseo-env.d.ts +9 -0
  254. package/dist/server/server/paseo-env.d.ts.map +1 -0
  255. package/dist/server/server/paseo-env.js +70 -0
  256. package/dist/server/server/paseo-env.js.map +1 -0
  257. package/dist/server/server/paseo-worktree-archive-service.d.ts +7 -5
  258. package/dist/server/server/paseo-worktree-archive-service.d.ts.map +1 -1
  259. package/dist/server/server/paseo-worktree-archive-service.js +70 -62
  260. package/dist/server/server/paseo-worktree-archive-service.js.map +1 -1
  261. package/dist/server/server/paseo-worktree-service.d.ts +13 -0
  262. package/dist/server/server/paseo-worktree-service.d.ts.map +1 -1
  263. package/dist/server/server/paseo-worktree-service.js +72 -3
  264. package/dist/server/server/paseo-worktree-service.js.map +1 -1
  265. package/dist/server/server/persisted-config.d.ts +87 -62
  266. package/dist/server/server/persisted-config.d.ts.map +1 -1
  267. package/dist/server/server/persisted-config.js +13 -4
  268. package/dist/server/server/persisted-config.js.map +1 -1
  269. package/dist/server/server/persistence-hooks.d.ts +8 -9
  270. package/dist/server/server/persistence-hooks.d.ts.map +1 -1
  271. package/dist/server/server/persistence-hooks.js +4 -12
  272. package/dist/server/server/persistence-hooks.js.map +1 -1
  273. package/dist/server/server/pid-lock.js.map +1 -1
  274. package/dist/server/server/push/push-service.d.ts.map +1 -1
  275. package/dist/server/server/push/push-service.js +1 -3
  276. package/dist/server/server/push/push-service.js.map +1 -1
  277. package/dist/server/server/relay-transport.d.ts +8 -8
  278. package/dist/server/server/relay-transport.d.ts.map +1 -1
  279. package/dist/server/server/relay-transport.js +43 -20
  280. package/dist/server/server/relay-transport.js.map +1 -1
  281. package/dist/server/server/resolve-worktree-creation-intent.d.ts +0 -10
  282. package/dist/server/server/resolve-worktree-creation-intent.d.ts.map +1 -1
  283. package/dist/server/server/resolve-worktree-creation-intent.js +1 -45
  284. package/dist/server/server/resolve-worktree-creation-intent.js.map +1 -1
  285. package/dist/server/server/schedule/service.d.ts.map +1 -1
  286. package/dist/server/server/schedule/service.js +2 -2
  287. package/dist/server/server/schedule/service.js.map +1 -1
  288. package/dist/server/server/script-health-monitor.d.ts.map +1 -1
  289. package/dist/server/server/script-health-monitor.js +7 -6
  290. package/dist/server/server/script-health-monitor.js.map +1 -1
  291. package/dist/server/server/script-proxy.js +1 -1
  292. package/dist/server/server/script-proxy.js.map +1 -1
  293. package/dist/server/server/script-status-projection.d.ts +10 -5
  294. package/dist/server/server/script-status-projection.d.ts.map +1 -1
  295. package/dist/server/server/script-status-projection.js +66 -47
  296. package/dist/server/server/script-status-projection.js.map +1 -1
  297. package/dist/server/server/server-id.d.ts +4 -4
  298. package/dist/server/server/server-id.d.ts.map +1 -1
  299. package/dist/server/server/session.d.ts +64 -65
  300. package/dist/server/server/session.d.ts.map +1 -1
  301. package/dist/server/server/session.js +1356 -1734
  302. package/dist/server/server/session.js.map +1 -1
  303. package/dist/server/server/speech/audio.js +1 -1
  304. package/dist/server/server/speech/audio.js.map +1 -1
  305. package/dist/server/server/speech/providers/local/config.d.ts +6 -6
  306. package/dist/server/server/speech/providers/local/config.d.ts.map +1 -1
  307. package/dist/server/server/speech/providers/local/config.js +41 -16
  308. package/dist/server/server/speech/providers/local/config.js.map +1 -1
  309. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts +2 -2
  310. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -1
  311. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +42 -19
  312. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -1
  313. package/dist/server/server/speech/providers/local/runtime.d.ts +4 -4
  314. package/dist/server/server/speech/providers/local/runtime.d.ts.map +1 -1
  315. package/dist/server/server/speech/providers/local/runtime.js +108 -77
  316. package/dist/server/server/speech/providers/local/runtime.js.map +1 -1
  317. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +2 -2
  318. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -1
  319. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +1 -4
  320. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -1
  321. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +2 -2
  322. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -1
  323. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +19 -19
  324. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -1
  325. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +28 -7
  326. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts.map +1 -1
  327. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -1
  328. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts +23 -4
  329. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts.map +1 -1
  330. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +35 -28
  331. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -1
  332. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts +5 -5
  333. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts.map +1 -1
  334. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +7 -7
  335. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +1 -1
  336. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +5 -0
  337. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -1
  338. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts.map +1 -1
  339. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +3 -1
  340. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -1
  341. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +2 -2
  342. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts.map +1 -1
  343. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +3 -1
  344. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -1
  345. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts.map +1 -1
  346. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +10 -4
  347. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -1
  348. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +2 -2
  349. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts.map +1 -1
  350. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts +2 -2
  351. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts.map +1 -1
  352. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +4 -1
  353. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -1
  354. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +2 -2
  355. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts.map +1 -1
  356. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +18 -11
  357. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -1
  358. package/dist/server/server/speech/providers/openai/config.d.ts +2 -2
  359. package/dist/server/server/speech/providers/openai/config.d.ts.map +1 -1
  360. package/dist/server/server/speech/providers/openai/config.js +58 -31
  361. package/dist/server/server/speech/providers/openai/config.js.map +1 -1
  362. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts.map +1 -1
  363. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +2 -2
  364. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js.map +1 -1
  365. package/dist/server/server/speech/providers/openai/runtime.d.ts +4 -4
  366. package/dist/server/server/speech/providers/openai/runtime.d.ts.map +1 -1
  367. package/dist/server/server/speech/providers/openai/runtime.js +37 -32
  368. package/dist/server/server/speech/providers/openai/runtime.js.map +1 -1
  369. package/dist/server/server/speech/providers/openai/stt.d.ts.map +1 -1
  370. package/dist/server/server/speech/providers/openai/stt.js +4 -3
  371. package/dist/server/server/speech/providers/openai/stt.js.map +1 -1
  372. package/dist/server/server/speech/providers/openai/tts.d.ts.map +1 -1
  373. package/dist/server/server/speech/providers/openai/tts.js +3 -2
  374. package/dist/server/server/speech/providers/openai/tts.js.map +1 -1
  375. package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -1
  376. package/dist/server/server/speech/speech-config-resolver.js +46 -17
  377. package/dist/server/server/speech/speech-config-resolver.js.map +1 -1
  378. package/dist/server/server/speech/speech-provider.d.ts +2 -2
  379. package/dist/server/server/speech/speech-provider.d.ts.map +1 -1
  380. package/dist/server/server/speech/speech-runtime.d.ts +6 -6
  381. package/dist/server/server/speech/speech-runtime.d.ts.map +1 -1
  382. package/dist/server/server/speech/speech-runtime.js +17 -17
  383. package/dist/server/server/speech/speech-runtime.js.map +1 -1
  384. package/dist/server/server/speech/speech-types.d.ts +2 -2
  385. package/dist/server/server/speech/speech-types.d.ts.map +1 -1
  386. package/dist/server/server/speech/turn-detection-provider.d.ts +2 -2
  387. package/dist/server/server/speech/turn-detection-provider.d.ts.map +1 -1
  388. package/dist/server/server/utils/diff-highlighter.d.ts +0 -3
  389. package/dist/server/server/utils/diff-highlighter.d.ts.map +1 -1
  390. package/dist/server/server/utils/diff-highlighter.js +67 -66
  391. package/dist/server/server/utils/diff-highlighter.js.map +1 -1
  392. package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -1
  393. package/dist/server/server/voice/voice-turn-controller.js +1 -0
  394. package/dist/server/server/voice/voice-turn-controller.js.map +1 -1
  395. package/dist/server/server/voice-types.d.ts +2 -2
  396. package/dist/server/server/voice-types.d.ts.map +1 -1
  397. package/dist/server/server/websocket-server.d.ts +34 -22
  398. package/dist/server/server/websocket-server.d.ts.map +1 -1
  399. package/dist/server/server/websocket-server.js +360 -205
  400. package/dist/server/server/websocket-server.js.map +1 -1
  401. package/dist/server/server/workspace-directory.d.ts +69 -0
  402. package/dist/server/server/workspace-directory.d.ts.map +1 -0
  403. package/dist/server/server/workspace-directory.js +229 -0
  404. package/dist/server/server/workspace-directory.js.map +1 -0
  405. package/dist/server/server/workspace-git-metadata.d.ts +2 -2
  406. package/dist/server/server/workspace-git-metadata.d.ts.map +1 -1
  407. package/dist/server/server/workspace-git-metadata.js +2 -32
  408. package/dist/server/server/workspace-git-metadata.js.map +1 -1
  409. package/dist/server/server/workspace-git-service.d.ts +8 -4
  410. package/dist/server/server/workspace-git-service.d.ts.map +1 -1
  411. package/dist/server/server/workspace-git-service.js +163 -115
  412. package/dist/server/server/workspace-git-service.js.map +1 -1
  413. package/dist/server/server/workspace-reconciliation-service.d.ts +5 -4
  414. package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -1
  415. package/dist/server/server/workspace-reconciliation-service.js +82 -82
  416. package/dist/server/server/workspace-reconciliation-service.js.map +1 -1
  417. package/dist/server/server/workspace-registry-bootstrap.d.ts.map +1 -1
  418. package/dist/server/server/workspace-registry-bootstrap.js +40 -33
  419. package/dist/server/server/workspace-registry-bootstrap.js.map +1 -1
  420. package/dist/server/server/workspace-registry-model.d.ts +19 -6
  421. package/dist/server/server/workspace-registry-model.d.ts.map +1 -1
  422. package/dist/server/server/workspace-registry-model.js +35 -21
  423. package/dist/server/server/workspace-registry-model.js.map +1 -1
  424. package/dist/server/server/workspace-registry.d.ts +2 -2
  425. package/dist/server/server/workspace-script-runtime-store.d.ts +2 -2
  426. package/dist/server/server/workspace-script-runtime-store.d.ts.map +1 -1
  427. package/dist/server/server/workspace-service-env.js +3 -3
  428. package/dist/server/server/workspace-service-env.js.map +1 -1
  429. package/dist/server/server/worktree-bootstrap.d.ts +4 -4
  430. package/dist/server/server/worktree-bootstrap.d.ts.map +1 -1
  431. package/dist/server/server/worktree-bootstrap.js +101 -69
  432. package/dist/server/server/worktree-bootstrap.js.map +1 -1
  433. package/dist/server/server/worktree-core.d.ts +2 -0
  434. package/dist/server/server/worktree-core.d.ts.map +1 -1
  435. package/dist/server/server/worktree-core.js.map +1 -1
  436. package/dist/server/server/worktree-errors.d.ts +1 -1
  437. package/dist/server/server/worktree-errors.d.ts.map +1 -1
  438. package/dist/server/server/worktree-errors.js +1 -4
  439. package/dist/server/server/worktree-errors.js.map +1 -1
  440. package/dist/server/server/worktree-session.d.ts +54 -27
  441. package/dist/server/server/worktree-session.d.ts.map +1 -1
  442. package/dist/server/server/worktree-session.js +95 -44
  443. package/dist/server/server/worktree-session.js.map +1 -1
  444. package/dist/server/services/github-service.d.ts +1 -7
  445. package/dist/server/services/github-service.d.ts.map +1 -1
  446. package/dist/server/services/github-service.js +123 -143
  447. package/dist/server/services/github-service.js.map +1 -1
  448. package/dist/server/shared/agent-attention-notification.d.ts +9 -8
  449. package/dist/server/shared/agent-attention-notification.d.ts.map +1 -1
  450. package/dist/server/shared/agent-attention-notification.js +27 -17
  451. package/dist/server/shared/agent-attention-notification.js.map +1 -1
  452. package/dist/server/shared/binary-frames/file-transfer.d.ts +56 -0
  453. package/dist/server/shared/binary-frames/file-transfer.d.ts.map +1 -0
  454. package/dist/server/shared/binary-frames/file-transfer.js +108 -0
  455. package/dist/server/shared/binary-frames/file-transfer.js.map +1 -0
  456. package/dist/server/shared/binary-frames/index.d.ts +3 -0
  457. package/dist/server/shared/binary-frames/index.d.ts.map +1 -0
  458. package/dist/server/shared/binary-frames/index.js +3 -0
  459. package/dist/server/shared/binary-frames/index.js.map +1 -0
  460. package/dist/server/shared/{terminal-stream-protocol.d.ts → binary-frames/terminal.d.ts} +4 -4
  461. package/dist/server/shared/binary-frames/terminal.d.ts.map +1 -0
  462. package/dist/server/shared/{terminal-stream-protocol.js → binary-frames/terminal.js} +2 -2
  463. package/dist/server/shared/binary-frames/terminal.js.map +1 -0
  464. package/dist/server/shared/client-capabilities.d.ts +5 -0
  465. package/dist/server/shared/client-capabilities.d.ts.map +1 -0
  466. package/dist/server/shared/client-capabilities.js +4 -0
  467. package/dist/server/shared/client-capabilities.js.map +1 -0
  468. package/dist/server/shared/connection-offer.d.ts +8 -0
  469. package/dist/server/shared/connection-offer.d.ts.map +1 -1
  470. package/dist/server/shared/connection-offer.js +35 -0
  471. package/dist/server/shared/connection-offer.js.map +1 -1
  472. package/dist/server/shared/daemon-endpoints.d.ts +18 -3
  473. package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
  474. package/dist/server/shared/daemon-endpoints.js +82 -8
  475. package/dist/server/shared/daemon-endpoints.js.map +1 -1
  476. package/dist/server/shared/host-connection-schema.d.ts +23 -0
  477. package/dist/server/shared/host-connection-schema.d.ts.map +1 -0
  478. package/dist/server/shared/host-connection-schema.js +9 -0
  479. package/dist/server/shared/host-connection-schema.js.map +1 -0
  480. package/dist/server/shared/messages.d.ts +25073 -3453
  481. package/dist/server/shared/messages.d.ts.map +1 -1
  482. package/dist/server/shared/messages.js +152 -36
  483. package/dist/server/shared/messages.js.map +1 -1
  484. package/dist/server/shared/tool-call-display.d.ts +2 -2
  485. package/dist/server/shared/tool-call-display.d.ts.map +1 -1
  486. package/dist/server/terminal/terminal-manager-factory.d.ts +7 -0
  487. package/dist/server/terminal/terminal-manager-factory.d.ts.map +1 -0
  488. package/dist/server/terminal/terminal-manager-factory.js +13 -0
  489. package/dist/server/terminal/terminal-manager-factory.js.map +1 -0
  490. package/dist/server/terminal/terminal-manager.d.ts +7 -1
  491. package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
  492. package/dist/server/terminal/terminal-manager.js +15 -4
  493. package/dist/server/terminal/terminal-manager.js.map +1 -1
  494. package/dist/server/terminal/terminal-output-coalescer.d.ts +6 -6
  495. package/dist/server/terminal/terminal-output-coalescer.d.ts.map +1 -1
  496. package/dist/server/terminal/terminal-session-controller.d.ts +63 -0
  497. package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -0
  498. package/dist/server/terminal/terminal-session-controller.js +615 -0
  499. package/dist/server/terminal/terminal-session-controller.js.map +1 -0
  500. package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
  501. package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
  502. package/dist/server/terminal/terminal-worker-process.d.ts.map +1 -0
  503. package/dist/server/terminal/terminal-worker-process.js +221 -0
  504. package/dist/server/terminal/terminal-worker-process.js.map +1 -0
  505. package/dist/server/terminal/terminal-worker-protocol.d.ts +113 -0
  506. package/dist/server/terminal/terminal-worker-protocol.d.ts.map +1 -0
  507. package/dist/server/terminal/terminal-worker-protocol.js +2 -0
  508. package/dist/server/terminal/terminal-worker-protocol.js.map +1 -0
  509. package/dist/server/terminal/terminal.d.ts +10 -2
  510. package/dist/server/terminal/terminal.d.ts.map +1 -1
  511. package/dist/server/terminal/terminal.js +79 -28
  512. package/dist/server/terminal/terminal.js.map +1 -1
  513. package/dist/server/terminal/worker-terminal-manager.d.ts +19 -0
  514. package/dist/server/terminal/worker-terminal-manager.d.ts.map +1 -0
  515. package/dist/server/terminal/worker-terminal-manager.js +466 -0
  516. package/dist/server/terminal/worker-terminal-manager.js.map +1 -0
  517. package/dist/server/utils/checkout-git.d.ts +13 -12
  518. package/dist/server/utils/checkout-git.d.ts.map +1 -1
  519. package/dist/server/utils/checkout-git.js +351 -281
  520. package/dist/server/utils/checkout-git.js.map +1 -1
  521. package/dist/server/utils/directory-suggestions.d.ts.map +1 -1
  522. package/dist/server/utils/directory-suggestions.js +22 -34
  523. package/dist/server/utils/directory-suggestions.js.map +1 -1
  524. package/dist/server/utils/executable.d.ts +1 -14
  525. package/dist/server/utils/executable.d.ts.map +1 -1
  526. package/dist/server/utils/executable.js +13 -49
  527. package/dist/server/utils/executable.js.map +1 -1
  528. package/dist/server/utils/github-remote.d.ts +13 -0
  529. package/dist/server/utils/github-remote.d.ts.map +1 -0
  530. package/dist/server/utils/github-remote.js +128 -0
  531. package/dist/server/utils/github-remote.js.map +1 -0
  532. package/dist/server/utils/paseo-config-file.d.ts +30 -0
  533. package/dist/server/utils/paseo-config-file.d.ts.map +1 -0
  534. package/dist/server/utils/paseo-config-file.js +90 -0
  535. package/dist/server/utils/paseo-config-file.js.map +1 -0
  536. package/dist/server/utils/paseo-config-schema.d.ts +290 -0
  537. package/dist/server/utils/paseo-config-schema.d.ts.map +1 -0
  538. package/dist/server/utils/paseo-config-schema.js +60 -0
  539. package/dist/server/utils/paseo-config-schema.js.map +1 -0
  540. package/dist/server/utils/process-tree.d.ts +25 -0
  541. package/dist/server/utils/process-tree.d.ts.map +1 -0
  542. package/dist/server/utils/process-tree.js +96 -0
  543. package/dist/server/utils/process-tree.js.map +1 -0
  544. package/dist/server/utils/project-icon.d.ts.map +1 -1
  545. package/dist/server/utils/project-icon.js +84 -109
  546. package/dist/server/utils/project-icon.js.map +1 -1
  547. package/dist/server/utils/promise-timeout.d.ts +2 -2
  548. package/dist/server/utils/promise-timeout.d.ts.map +1 -1
  549. package/dist/server/utils/run-git-command.d.ts +3 -1
  550. package/dist/server/utils/run-git-command.d.ts.map +1 -1
  551. package/dist/server/utils/run-git-command.js +10 -1
  552. package/dist/server/utils/run-git-command.js.map +1 -1
  553. package/dist/server/utils/script-hostname.d.ts +2 -2
  554. package/dist/server/utils/script-hostname.d.ts.map +1 -1
  555. package/dist/server/utils/spawn.d.ts +10 -3
  556. package/dist/server/utils/spawn.d.ts.map +1 -1
  557. package/dist/server/utils/spawn.js +30 -5
  558. package/dist/server/utils/spawn.js.map +1 -1
  559. package/dist/server/utils/windows-command.d.ts +15 -0
  560. package/dist/server/utils/windows-command.d.ts.map +1 -0
  561. package/dist/server/utils/windows-command.js +41 -0
  562. package/dist/server/utils/windows-command.js.map +1 -0
  563. package/dist/server/utils/worktree-metadata.d.ts +44 -0
  564. package/dist/server/utils/worktree-metadata.d.ts.map +1 -1
  565. package/dist/server/utils/worktree-metadata.js +58 -0
  566. package/dist/server/utils/worktree-metadata.js.map +1 -1
  567. package/dist/server/utils/worktree.d.ts +23 -8
  568. package/dist/server/utils/worktree.d.ts.map +1 -1
  569. package/dist/server/utils/worktree.js +81 -63
  570. package/dist/server/utils/worktree.js.map +1 -1
  571. package/dist/src/server/pid-lock.js.map +1 -1
  572. package/package.json +17 -21
  573. package/dist/server/server/agent/llm-openai.d.ts +0 -7
  574. package/dist/server/server/agent/llm-openai.d.ts.map +0 -1
  575. package/dist/server/server/agent/llm-openai.js +0 -8
  576. package/dist/server/server/agent/llm-openai.js.map +0 -1
  577. package/dist/server/server/agent/orchestrator.d.ts +0 -12
  578. package/dist/server/server/agent/orchestrator.d.ts.map +0 -1
  579. package/dist/server/server/agent/orchestrator.js +0 -12
  580. package/dist/server/server/agent/orchestrator.js.map +0 -1
  581. package/dist/server/server/types.d.ts +0 -5
  582. package/dist/server/server/types.d.ts.map +0 -1
  583. package/dist/server/server/types.js +0 -3
  584. package/dist/server/server/types.js.map +0 -1
  585. package/dist/server/server/workspace-registry.test-helpers.d.ts +0 -37
  586. package/dist/server/server/workspace-registry.test-helpers.d.ts.map +0 -1
  587. package/dist/server/server/workspace-registry.test-helpers.js +0 -121
  588. package/dist/server/server/workspace-registry.test-helpers.js.map +0 -1
  589. package/dist/server/shared/terminal-stream-protocol.d.ts.map +0 -1
  590. package/dist/server/shared/terminal-stream-protocol.js.map +0 -1
@@ -1,18 +1,21 @@
1
1
  import { WebSocketServer } from "ws";
2
2
  import { basename, join } from "path";
3
3
  import { hostname as getHostname } from "node:os";
4
+ import { applyMutableProviderConfigToOverrides } from "./daemon-config-store.js";
4
5
  import { WSInboundMessageSchema, wrapSessionMessage, } from "./messages.js";
5
- import { asUint8Array, decodeTerminalStreamFrame } from "../shared/terminal-stream-protocol.js";
6
+ import { asUint8Array, decodeTerminalStreamFrame } from "../shared/binary-frames/index.js";
6
7
  import { isHostnameAllowed } from "./hostnames.js";
7
8
  import { Session } from "./session.js";
8
9
  import { ProviderSnapshotManager } from "./agent/provider-snapshot-manager.js";
9
- import { buildProviderRegistry } from "./agent/provider-registry.js";
10
+ import { buildProviderRegistry, createClientsFromRegistry } from "./agent/provider-registry.js";
10
11
  import { buildWorkspaceGitMetadataFromSnapshot } from "./workspace-git-metadata.js";
11
12
  import { PushTokenStore } from "./push/token-store.js";
12
13
  import { PushService } from "./push/push-service.js";
13
14
  import { computeNotificationPlan } from "./agent-attention-policy.js";
14
15
  import { buildAgentAttentionNotificationPayload, findLatestPermissionRequest, } from "../shared/agent-attention-notification.js";
15
16
  import { createGitHubService } from "../services/github-service.js";
17
+ import { extractWsBearerProtocol, extractWsBearerToken, isBearerTokenValid, } from "./auth.js";
18
+ const WS_CLOSE_DAEMON_AUTH_FAILED = 4401;
16
19
  function createFallbackWorkspaceGitSnapshot(cwd) {
17
20
  return {
18
21
  cwd,
@@ -44,6 +47,15 @@ function createFallbackWorkspaceGitService() {
44
47
  unsubscribe: () => { },
45
48
  }),
46
49
  peekSnapshot: () => null,
50
+ getCheckout: async (cwd) => ({
51
+ cwd,
52
+ isGit: false,
53
+ currentBranch: null,
54
+ remoteUrl: null,
55
+ worktreeRoot: null,
56
+ isPaseoOwnedWorktree: false,
57
+ mainRepoRoot: null,
58
+ }),
47
59
  getSnapshot: async (cwd) => createFallbackWorkspaceGitSnapshot(cwd),
48
60
  getCheckoutDiff: async () => ({ diff: "" }),
49
61
  validateBranchRef: async () => ({ kind: "not-found" }),
@@ -169,11 +181,27 @@ export class MissingDaemonVersionError extends Error {
169
181
  this.name = "MissingDaemonVersionError";
170
182
  }
171
183
  }
184
+ function requireWebSocketServices(params) {
185
+ const { chatService, loopService, scheduleService, checkoutDiffManager } = params;
186
+ if (!chatService) {
187
+ throw new Error("VoiceAssistantWebSocketServer requires a chat service.");
188
+ }
189
+ if (!loopService) {
190
+ throw new Error("VoiceAssistantWebSocketServer requires a loop service.");
191
+ }
192
+ if (!scheduleService) {
193
+ throw new Error("VoiceAssistantWebSocketServer requires a schedule service.");
194
+ }
195
+ if (!checkoutDiffManager) {
196
+ throw new Error("VoiceAssistantWebSocketServer requires a checkout diff manager.");
197
+ }
198
+ return { chatService, loopService, scheduleService, checkoutDiffManager };
199
+ }
172
200
  /**
173
201
  * WebSocket server that only accepts sockets + parses/forwards messages to the session layer.
174
202
  */
175
203
  export class VoiceAssistantWebSocketServer {
176
- constructor(server, logger, serverId, agentManager, agentStorage, downloadTokenStore, paseoHome, daemonConfigStore, mcpBaseUrl, wsConfig, speech, terminalManager, dictation, agentProviderRuntimeSettings, providerOverrides, isDev, daemonVersion, onLifecycleIntent, projectRegistry, workspaceRegistry, chatService, loopService, scheduleService, checkoutDiffManager, scriptRouteStore, scriptRuntimeStore, onBranchChanged, getDaemonTcpPort, getDaemonTcpHost, resolveScriptHealth, workspaceGitService, github) {
204
+ constructor(server, logger, serverId, agentManager, agentStorage, downloadTokenStore, paseoHome, daemonConfigStore, mcpBaseUrl, wsConfig, auth, speech, terminalManager, dictation, agentProviderRuntimeSettings, providerOverrides, isDev, daemonVersion, onLifecycleIntent, projectRegistry, workspaceRegistry, chatService, loopService, scheduleService, checkoutDiffManager, scriptRouteStore, scriptRuntimeStore, onBranchChanged, getDaemonTcpPort, getDaemonTcpHost, resolveScriptHealth, workspaceGitService, github) {
177
205
  this.pendingConnections = new Map();
178
206
  this.sessions = new Map();
179
207
  this.externalSessionsByKey = new Map();
@@ -220,47 +248,43 @@ export class VoiceAssistantWebSocketServer {
220
248
  this.agentStorage = agentStorage;
221
249
  this.projectRegistry = projectRegistry ?? createNoopProjectRegistry();
222
250
  this.workspaceRegistry = workspaceRegistry ?? createNoopWorkspaceRegistry();
223
- if (!chatService) {
224
- throw new Error("VoiceAssistantWebSocketServer requires a chat service.");
225
- }
226
- this.chatService = chatService;
227
- if (!loopService) {
228
- throw new Error("VoiceAssistantWebSocketServer requires a loop service.");
229
- }
230
- this.loopService = loopService;
231
- if (!scheduleService) {
232
- throw new Error("VoiceAssistantWebSocketServer requires a schedule service.");
233
- }
234
- this.scheduleService = scheduleService;
235
- if (!checkoutDiffManager) {
236
- throw new Error("VoiceAssistantWebSocketServer requires a checkout diff manager.");
237
- }
238
- this.checkoutDiffManager = checkoutDiffManager;
251
+ const requiredServices = requireWebSocketServices({
252
+ chatService,
253
+ loopService,
254
+ scheduleService,
255
+ checkoutDiffManager,
256
+ });
257
+ this.chatService = requiredServices.chatService;
258
+ this.loopService = requiredServices.loopService;
259
+ this.scheduleService = requiredServices.scheduleService;
260
+ this.checkoutDiffManager = requiredServices.checkoutDiffManager;
239
261
  this.github = github ?? createGitHubService();
240
262
  this.workspaceGitService = workspaceGitService ?? createFallbackWorkspaceGitService();
241
263
  this.downloadTokenStore = downloadTokenStore;
242
264
  this.paseoHome = paseoHome;
243
265
  this.daemonConfigStore = daemonConfigStore;
244
266
  this.mcpBaseUrl = mcpBaseUrl;
245
- this.speech = speech ?? null;
246
- this.terminalManager = terminalManager ?? null;
247
- this.dictation = dictation ?? null;
248
- this.agentProviderRuntimeSettings = agentProviderRuntimeSettings;
249
- this.providerOverrides = providerOverrides;
250
- this.isDev = isDev === true;
267
+ this.assignOptionalServices({
268
+ speech,
269
+ terminalManager,
270
+ dictation,
271
+ agentProviderRuntimeSettings,
272
+ providerOverrides,
273
+ isDev,
274
+ onLifecycleIntent,
275
+ scriptRouteStore,
276
+ scriptRuntimeStore,
277
+ onBranchChanged,
278
+ getDaemonTcpPort,
279
+ getDaemonTcpHost,
280
+ resolveScriptHealth,
281
+ });
251
282
  const providerSnapshotLogger = this.logger.child({ module: "provider-snapshot-manager" });
252
283
  this.providerSnapshotManager = new ProviderSnapshotManager(buildProviderRegistry(providerSnapshotLogger, {
253
284
  runtimeSettings: this.agentProviderRuntimeSettings,
254
285
  providerOverrides: this.providerOverrides,
255
286
  isDev: this.isDev,
256
287
  }), providerSnapshotLogger);
257
- this.onLifecycleIntent = onLifecycleIntent ?? null;
258
- this.scriptRouteStore = scriptRouteStore ?? null;
259
- this.scriptRuntimeStore = scriptRuntimeStore ?? null;
260
- this.onBranchChanged = onBranchChanged ?? null;
261
- this.getDaemonTcpPort = getDaemonTcpPort ?? null;
262
- this.getDaemonTcpHost = getDaemonTcpHost ?? null;
263
- this.resolveScriptHealth = resolveScriptHealth ?? null;
264
288
  this.serverCapabilities = buildServerCapabilities({
265
289
  readiness: this.speech?.getReadiness() ?? null,
266
290
  });
@@ -269,6 +293,15 @@ export class VoiceAssistantWebSocketServer {
269
293
  this.publishSpeechReadiness(snapshot);
270
294
  }) ?? null;
271
295
  this.unsubscribeDaemonConfigChange = this.daemonConfigStore.onChange((config) => {
296
+ this.providerOverrides = applyMutableProviderConfigToOverrides(this.providerOverrides, config.providers);
297
+ const registry = buildProviderRegistry(providerSnapshotLogger, {
298
+ runtimeSettings: this.agentProviderRuntimeSettings,
299
+ providerOverrides: this.providerOverrides,
300
+ isDev: this.isDev,
301
+ });
302
+ const clients = createClientsFromRegistry(registry, providerSnapshotLogger);
303
+ this.providerSnapshotManager.replaceRegistry(registry);
304
+ this.agentManager.updateProviderRegistry({ providerDefinitions: registry, clients });
272
305
  this.broadcastDaemonConfigChanged(config);
273
306
  });
274
307
  const pushLogger = this.logger.child({ module: "push" });
@@ -279,42 +312,84 @@ export class VoiceAssistantWebSocketServer {
279
312
  this.logger.warn({ err, agentId: params.agentId }, "Failed to broadcast agent attention");
280
313
  });
281
314
  });
315
+ this.wss = this.createWebSocketServer(server, wsConfig, auth);
316
+ this.startRuntimeMetricsInterval();
317
+ this.logger.info("WebSocket server initialized on /ws");
318
+ }
319
+ assignOptionalServices(params) {
320
+ this.speech = params.speech ?? null;
321
+ this.terminalManager = params.terminalManager ?? null;
322
+ this.dictation = params.dictation ?? null;
323
+ this.agentProviderRuntimeSettings = params.agentProviderRuntimeSettings;
324
+ this.providerOverrides = params.providerOverrides;
325
+ this.isDev = params.isDev === true;
326
+ this.onLifecycleIntent = params.onLifecycleIntent ?? null;
327
+ this.scriptRouteStore = params.scriptRouteStore ?? null;
328
+ this.scriptRuntimeStore = params.scriptRuntimeStore ?? null;
329
+ this.onBranchChanged = params.onBranchChanged ?? null;
330
+ this.getDaemonTcpPort = params.getDaemonTcpPort ?? null;
331
+ this.getDaemonTcpHost = params.getDaemonTcpHost ?? null;
332
+ this.resolveScriptHealth = params.resolveScriptHealth ?? null;
333
+ }
334
+ createWebSocketServer(server, wsConfig, auth) {
282
335
  const { allowedOrigins, hostnames } = wsConfig;
283
- this.wss = new WebSocketServer({
336
+ const password = auth?.password;
337
+ const wss = new WebSocketServer({
284
338
  server,
285
339
  path: "/ws",
340
+ handleProtocols: (protocols) => selectWebSocketProtocol(protocols, password),
286
341
  verifyClient: ({ req }, callback) => {
287
- const requestMetadata = extractSocketRequestMetadata(req);
288
- const origin = requestMetadata.origin;
289
- const requestHost = requestMetadata.host ?? null;
290
- if (requestHost && !isHostnameAllowed(requestHost, hostnames)) {
291
- this.incrementRuntimeCounter("hostRejected");
292
- this.logger.warn({ ...requestMetadata, host: requestHost }, "Rejected connection from disallowed host");
293
- callback(false, 403, "Host not allowed");
294
- return;
295
- }
296
- const sameOrigin = !!origin &&
297
- !!requestHost &&
298
- (origin === `http://${requestHost}` || origin === `https://${requestHost}`);
299
- if (!origin || allowedOrigins.has("*") || allowedOrigins.has(origin) || sameOrigin) {
300
- callback(true);
301
- }
302
- else {
303
- this.incrementRuntimeCounter("originRejected");
304
- this.logger.warn({ ...requestMetadata, origin }, "Rejected connection from origin");
305
- callback(false, 403, "Origin not allowed");
306
- }
342
+ this.verifyWsUpgrade(req, allowedOrigins, hostnames, callback);
307
343
  },
308
344
  });
309
- this.wss.on("connection", (ws, request) => {
310
- void this.attachSocket(ws, request);
345
+ wss.on("connection", (ws, request) => {
346
+ void this.attachAuthenticatedSocket(ws, request, password);
311
347
  });
348
+ return wss;
349
+ }
350
+ startRuntimeMetricsInterval() {
312
351
  const runtimeMetricsInterval = setInterval(() => {
313
352
  this.flushRuntimeMetrics();
314
353
  }, WS_RUNTIME_METRICS_FLUSH_MS);
315
354
  this.runtimeMetricsInterval = runtimeMetricsInterval;
316
355
  runtimeMetricsInterval.unref?.();
317
- this.logger.info("WebSocket server initialized on /ws");
356
+ }
357
+ verifyWsUpgrade(req, allowedOrigins, hostnames, callback) {
358
+ const requestMetadata = extractSocketRequestMetadata(req);
359
+ const origin = requestMetadata.origin;
360
+ const requestHost = requestMetadata.host ?? null;
361
+ if (requestHost && !isHostnameAllowed(requestHost, hostnames)) {
362
+ this.incrementRuntimeCounter("hostRejected");
363
+ this.logger.warn({ ...requestMetadata, host: requestHost }, "Rejected connection from disallowed host");
364
+ callback(false, 403, "Host not allowed");
365
+ return;
366
+ }
367
+ const sameOrigin = !!origin &&
368
+ !!requestHost &&
369
+ (origin === `http://${requestHost}` || origin === `https://${requestHost}`);
370
+ if (!origin || allowedOrigins.has("*") || allowedOrigins.has(origin) || sameOrigin) {
371
+ callback(true);
372
+ }
373
+ else {
374
+ this.incrementRuntimeCounter("originRejected");
375
+ this.logger.warn({ ...requestMetadata, origin }, "Rejected connection from origin");
376
+ callback(false, 403, "Origin not allowed");
377
+ }
378
+ }
379
+ async attachAuthenticatedSocket(ws, request, password) {
380
+ if (password) {
381
+ const requestMetadata = extractSocketRequestMetadata(request);
382
+ const protocol = extractWsBearerProtocol(request.headers["sec-websocket-protocol"]);
383
+ const token = extractWsBearerToken(protocol);
384
+ const isAuthorized = isBearerTokenValid({ password, token });
385
+ if (!isAuthorized) {
386
+ const reason = token === null ? "Password required" : "Incorrect password";
387
+ this.logger.warn({ ...requestMetadata, hasToken: token !== null }, "Rejected WebSocket connection with invalid daemon password");
388
+ ws.close(WS_CLOSE_DAEMON_AUTH_FAILED, reason);
389
+ return;
390
+ }
391
+ }
392
+ await this.attachSocket(ws, request);
318
393
  }
319
394
  broadcast(message) {
320
395
  const payload = JSON.stringify(message);
@@ -406,18 +481,31 @@ export class VoiceAssistantWebSocketServer {
406
481
  this.wss.close();
407
482
  }
408
483
  sendToClient(ws, message) {
409
- // WebSocket.OPEN = 1
410
- if (ws.readyState === 1) {
484
+ // WebSocket.OPEN = 1. The check is a fast path; the socket can still
485
+ // transition to closed between here and ws.send(), so guard the send too —
486
+ // a synchronous throw here would propagate as an uncaughtException.
487
+ if (ws.readyState !== 1) {
488
+ return;
489
+ }
490
+ try {
411
491
  ws.send(JSON.stringify(message));
412
492
  this.recordOutboundMessage(message, ws);
413
493
  }
494
+ catch (err) {
495
+ this.logger.warn({ err }, "ws_send_failed");
496
+ }
414
497
  }
415
498
  sendBinaryToClient(ws, frame) {
416
499
  if (ws.readyState !== 1) {
417
500
  return;
418
501
  }
419
- ws.send(frame);
420
- this.recordOutboundBinaryFrame(ws);
502
+ try {
503
+ ws.send(frame);
504
+ this.recordOutboundBinaryFrame(ws);
505
+ }
506
+ catch (err) {
507
+ this.logger.warn({ err }, "ws_send_binary_failed");
508
+ }
421
509
  }
422
510
  sendToConnection(connection, message) {
423
511
  for (const ws of connection.sockets) {
@@ -475,11 +563,12 @@ export class VoiceAssistantWebSocketServer {
475
563
  }, "Client connected; awaiting hello");
476
564
  }
477
565
  createSessionConnection(params) {
478
- const { ws, clientId, appVersion, connectionLogger } = params;
566
+ const { ws, clientId, appVersion, clientCapabilities, connectionLogger } = params;
479
567
  let connection = null;
480
568
  const session = new Session({
481
569
  clientId,
482
570
  appVersion,
571
+ clientCapabilities,
483
572
  onMessage: (msg) => {
484
573
  if (!connection) {
485
574
  return;
@@ -554,6 +643,7 @@ export class VoiceAssistantWebSocketServer {
554
643
  session,
555
644
  clientId,
556
645
  appVersion,
646
+ clientCapabilities,
557
647
  connectionLogger,
558
648
  sockets: new Set([ws]),
559
649
  externalDisconnectCleanupTimeout: null,
@@ -613,6 +703,12 @@ export class VoiceAssistantWebSocketServer {
613
703
  existing.appVersion = newAppVersion;
614
704
  existing.session.updateAppVersion(newAppVersion);
615
705
  }
706
+ const newClientCapabilities = message.capabilities ?? null;
707
+ if (JSON.stringify(existing.clientCapabilities ?? null) !==
708
+ JSON.stringify(newClientCapabilities ?? null)) {
709
+ existing.clientCapabilities = newClientCapabilities;
710
+ existing.session.updateClientCapabilities(newClientCapabilities);
711
+ }
616
712
  existing.sockets.add(ws);
617
713
  this.sessions.set(ws, existing);
618
714
  this.sendToClient(ws, this.createServerInfoMessage());
@@ -629,6 +725,7 @@ export class VoiceAssistantWebSocketServer {
629
725
  ws,
630
726
  clientId,
631
727
  appVersion: message.appVersion ?? null,
728
+ clientCapabilities: message.capabilities ?? null,
632
729
  connectionLogger,
633
730
  });
634
731
  this.sessions.set(ws, connection);
@@ -678,16 +775,20 @@ export class VoiceAssistantWebSocketServer {
678
775
  this.broadcast(this.createDaemonConfigChangedMessage(config));
679
776
  }
680
777
  bindSocketHandlers(ws) {
681
- ws.on("message", (data) => {
778
+ ws.on("message", (...args) => {
779
+ const data = args[0];
682
780
  void this.handleRawMessage(ws, data);
683
781
  });
684
- ws.on("close", async (code, reason) => {
782
+ ws.on("close", async (...args) => {
783
+ const code = args[0];
784
+ const reason = args[1];
685
785
  await this.detachSocket(ws, {
686
786
  code: typeof code === "number" ? code : undefined,
687
787
  reason,
688
788
  });
689
789
  });
690
- ws.on("error", async (error) => {
790
+ ws.on("error", async (...args) => {
791
+ const error = args[0];
691
792
  const err = error instanceof Error ? error : new Error(String(error));
692
793
  const active = this.sessions.get(ws);
693
794
  const pending = this.pendingConnections.get(ws);
@@ -768,81 +869,126 @@ export class VoiceAssistantWebSocketServer {
768
869
  connection.connectionLogger.trace({ clientId: connection.clientId, totalSessions: this.sessions.size }, logMessage);
769
870
  await connection.session.cleanup();
770
871
  }
872
+ handleInvalidInboundMessage(args) {
873
+ const { ws, parsed, parsedMessage, pendingConnection, activeConnection, log } = args;
874
+ this.incrementRuntimeCounter("validationFailed");
875
+ if (pendingConnection) {
876
+ pendingConnection.connectionLogger.warn({ error: parsedMessage.error.message }, "Rejected pending message before hello");
877
+ this.clearPendingConnection(ws);
878
+ try {
879
+ ws.close(WS_CLOSE_INVALID_HELLO, "Invalid hello");
880
+ }
881
+ catch {
882
+ // ignore close errors
883
+ }
884
+ return;
885
+ }
886
+ const requestInfo = extractRequestInfoFromUnknownWsInbound(parsed);
887
+ const isUnknownSchema = requestInfo?.requestId != null &&
888
+ typeof parsed === "object" &&
889
+ parsed != null &&
890
+ "type" in parsed &&
891
+ parsed.type === "session";
892
+ log.warn({
893
+ clientId: activeConnection?.clientId,
894
+ requestId: requestInfo?.requestId,
895
+ requestType: requestInfo?.requestType,
896
+ error: parsedMessage.error.message,
897
+ }, "WS inbound message validation failed");
898
+ if (requestInfo) {
899
+ this.sendToClient(ws, wrapSessionMessage({
900
+ type: "rpc_error",
901
+ payload: {
902
+ requestId: requestInfo.requestId,
903
+ requestType: requestInfo.requestType,
904
+ error: isUnknownSchema ? "Unknown request schema" : "Invalid message",
905
+ code: isUnknownSchema ? "unknown_schema" : "invalid_message",
906
+ },
907
+ }));
908
+ return;
909
+ }
910
+ const errorMessage = `Invalid message: ${parsedMessage.error.message}`;
911
+ this.sendToClient(ws, wrapSessionMessage({
912
+ type: "status",
913
+ payload: {
914
+ status: "error",
915
+ message: errorMessage,
916
+ },
917
+ }));
918
+ }
919
+ maybeHandleBinaryFrame(params) {
920
+ const { ws, buffer, activeConnection, log } = params;
921
+ const asBytes = asUint8Array(buffer);
922
+ if (!asBytes) {
923
+ return false;
924
+ }
925
+ const frame = decodeTerminalStreamFrame(asBytes);
926
+ if (!frame) {
927
+ return false;
928
+ }
929
+ if (!activeConnection) {
930
+ this.incrementRuntimeCounter("binaryBeforeHelloRejected");
931
+ log.warn("Rejected binary frame before hello");
932
+ this.clearPendingConnection(ws);
933
+ try {
934
+ ws.close(WS_CLOSE_INVALID_HELLO, "Session message before hello");
935
+ }
936
+ catch {
937
+ // ignore close errors
938
+ }
939
+ return true;
940
+ }
941
+ activeConnection.session.handleBinaryFrame(frame);
942
+ return true;
943
+ }
944
+ handlePendingConnectionMessage(params) {
945
+ const { ws, message, pendingConnection } = params;
946
+ if (message.type === "hello") {
947
+ this.handleHello({
948
+ ws,
949
+ message,
950
+ pending: pendingConnection,
951
+ });
952
+ return;
953
+ }
954
+ pendingConnection.connectionLogger.warn({
955
+ messageType: message.type,
956
+ }, "Rejected pending message before hello");
957
+ this.incrementRuntimeCounter("pendingMessageRejectedBeforeHello");
958
+ this.clearPendingConnection(ws);
959
+ try {
960
+ ws.close(WS_CLOSE_INVALID_HELLO, "Session message before hello");
961
+ }
962
+ catch {
963
+ // ignore close errors
964
+ }
965
+ }
771
966
  async handleRawMessage(ws, data) {
772
967
  const activeConnection = this.sessions.get(ws);
773
968
  const pendingConnection = this.pendingConnections.get(ws);
774
969
  const log = activeConnection?.connectionLogger ?? pendingConnection?.connectionLogger ?? this.logger;
775
970
  try {
776
971
  const buffer = bufferFromWsData(data);
777
- const asBytes = asUint8Array(buffer);
778
- if (asBytes) {
779
- const frame = decodeTerminalStreamFrame(asBytes);
780
- if (frame) {
781
- if (!activeConnection) {
782
- this.incrementRuntimeCounter("binaryBeforeHelloRejected");
783
- log.warn("Rejected binary frame before hello");
784
- this.clearPendingConnection(ws);
785
- try {
786
- ws.close(WS_CLOSE_INVALID_HELLO, "Session message before hello");
787
- }
788
- catch {
789
- // ignore close errors
790
- }
791
- return;
792
- }
793
- activeConnection.session.handleBinaryFrame(frame);
794
- return;
795
- }
972
+ const binaryHandled = this.maybeHandleBinaryFrame({
973
+ ws,
974
+ buffer,
975
+ activeConnection,
976
+ log,
977
+ });
978
+ if (binaryHandled) {
979
+ return;
796
980
  }
797
981
  const parsed = JSON.parse(buffer.toString());
798
982
  const parsedMessage = WSInboundMessageSchema.safeParse(parsed);
799
983
  if (!parsedMessage.success) {
800
- this.incrementRuntimeCounter("validationFailed");
801
- if (pendingConnection) {
802
- pendingConnection.connectionLogger.warn({
803
- error: parsedMessage.error.message,
804
- }, "Rejected pending message before hello");
805
- this.clearPendingConnection(ws);
806
- try {
807
- ws.close(WS_CLOSE_INVALID_HELLO, "Invalid hello");
808
- }
809
- catch {
810
- // ignore close errors
811
- }
812
- return;
813
- }
814
- const requestInfo = extractRequestInfoFromUnknownWsInbound(parsed);
815
- const isUnknownSchema = requestInfo?.requestId != null &&
816
- typeof parsed === "object" &&
817
- parsed != null &&
818
- "type" in parsed &&
819
- parsed.type === "session";
820
- log.warn({
821
- clientId: activeConnection?.clientId,
822
- requestId: requestInfo?.requestId,
823
- requestType: requestInfo?.requestType,
824
- error: parsedMessage.error.message,
825
- }, "WS inbound message validation failed");
826
- if (requestInfo) {
827
- this.sendToClient(ws, wrapSessionMessage({
828
- type: "rpc_error",
829
- payload: {
830
- requestId: requestInfo.requestId,
831
- requestType: requestInfo.requestType,
832
- error: isUnknownSchema ? "Unknown request schema" : "Invalid message",
833
- code: isUnknownSchema ? "unknown_schema" : "invalid_message",
834
- },
835
- }));
836
- return;
837
- }
838
- const errorMessage = `Invalid message: ${parsedMessage.error.message}`;
839
- this.sendToClient(ws, wrapSessionMessage({
840
- type: "status",
841
- payload: {
842
- status: "error",
843
- message: errorMessage,
844
- },
845
- }));
984
+ this.handleInvalidInboundMessage({
985
+ ws,
986
+ parsed,
987
+ parsedMessage,
988
+ pendingConnection,
989
+ activeConnection,
990
+ log,
991
+ });
846
992
  return;
847
993
  }
848
994
  const message = parsedMessage.data;
@@ -855,25 +1001,11 @@ export class VoiceAssistantWebSocketServer {
855
1001
  return;
856
1002
  }
857
1003
  if (pendingConnection) {
858
- if (message.type === "hello") {
859
- this.handleHello({
860
- ws,
861
- message,
862
- pending: pendingConnection,
863
- });
864
- return;
865
- }
866
- pendingConnection.connectionLogger.warn({
867
- messageType: message.type,
868
- }, "Rejected pending message before hello");
869
- this.incrementRuntimeCounter("pendingMessageRejectedBeforeHello");
870
- this.clearPendingConnection(ws);
871
- try {
872
- ws.close(WS_CLOSE_INVALID_HELLO, "Session message before hello");
873
- }
874
- catch {
875
- // ignore close errors
876
- }
1004
+ this.handlePendingConnectionMessage({
1005
+ ws,
1006
+ message,
1007
+ pendingConnection,
1008
+ });
877
1009
  return;
878
1010
  }
879
1011
  if (!activeConnection) {
@@ -893,74 +1025,85 @@ export class VoiceAssistantWebSocketServer {
893
1025
  return;
894
1026
  }
895
1027
  if (message.type === "session") {
896
- this.recordInboundSessionRequestType(message.message.type);
897
- const startMs = performance.now();
898
- await activeConnection.session.handleMessage(message.message);
899
- const durationMs = performance.now() - startMs;
900
- this.recordRequestLatency(message.message.type, durationMs);
901
- if (durationMs >= SLOW_REQUEST_THRESHOLD_MS) {
902
- activeConnection.connectionLogger.warn({
903
- requestType: message.message.type,
904
- durationMs: Math.round(durationMs),
905
- inflightRequests: activeConnection.session.getRuntimeMetrics().inflightRequests,
906
- }, "ws_slow_request");
907
- }
1028
+ await this.dispatchSessionMessage(activeConnection, message);
908
1029
  }
909
1030
  }
910
1031
  catch (error) {
911
- const err = error instanceof Error ? error : new Error(String(error));
912
- let rawPayload = null;
913
- let parsedPayload = null;
1032
+ this.handleRawMessageError({ ws, data, error, log });
1033
+ }
1034
+ }
1035
+ async dispatchSessionMessage(activeConnection, message) {
1036
+ this.recordInboundSessionRequestType(message.message.type);
1037
+ const startMs = performance.now();
1038
+ await activeConnection.session.handleMessage(message.message);
1039
+ const durationMs = performance.now() - startMs;
1040
+ this.recordRequestLatency(message.message.type, durationMs);
1041
+ if (durationMs >= SLOW_REQUEST_THRESHOLD_MS) {
1042
+ activeConnection.connectionLogger.warn({
1043
+ requestType: message.message.type,
1044
+ durationMs: Math.round(durationMs),
1045
+ inflightRequests: activeConnection.session.getRuntimeMetrics().inflightRequests,
1046
+ }, "ws_slow_request");
1047
+ }
1048
+ }
1049
+ handleRawMessageError(params) {
1050
+ const { ws, data, error, log } = params;
1051
+ const err = error instanceof Error ? error : new Error(String(error));
1052
+ const { rawPayload, parsedPayload } = this.decodeRawMessagePayloadForError(data);
1053
+ const trimmedRawPayload = typeof rawPayload === "string" && rawPayload.length > 2000
1054
+ ? `${rawPayload.slice(0, 2000)}... (truncated)`
1055
+ : rawPayload;
1056
+ log.error({
1057
+ err,
1058
+ rawPayload: trimmedRawPayload,
1059
+ parsedPayload,
1060
+ }, "Failed to parse/handle message");
1061
+ if (this.pendingConnections.has(ws)) {
1062
+ this.clearPendingConnection(ws);
914
1063
  try {
915
- const buffer = bufferFromWsData(data);
916
- rawPayload = buffer.toString();
917
- parsedPayload = JSON.parse(rawPayload);
918
- }
919
- catch (payloadError) {
920
- rawPayload = rawPayload ?? "<unreadable>";
921
- parsedPayload = parsedPayload ?? rawPayload;
922
- const payloadErr = payloadError instanceof Error ? payloadError : new Error(String(payloadError));
923
- this.logger.error({ err: payloadErr }, "Failed to decode raw payload");
924
- }
925
- const trimmedRawPayload = typeof rawPayload === "string" && rawPayload.length > 2000
926
- ? `${rawPayload.slice(0, 2000)}... (truncated)`
927
- : rawPayload;
928
- log.error({
929
- err,
930
- rawPayload: trimmedRawPayload,
931
- parsedPayload,
932
- }, "Failed to parse/handle message");
933
- if (this.pendingConnections.has(ws)) {
934
- this.clearPendingConnection(ws);
935
- try {
936
- ws.close(WS_CLOSE_INVALID_HELLO, "Invalid hello");
937
- }
938
- catch {
939
- // ignore close errors
940
- }
941
- return;
1064
+ ws.close(WS_CLOSE_INVALID_HELLO, "Invalid hello");
942
1065
  }
943
- const requestInfo = extractRequestInfoFromUnknownWsInbound(parsedPayload);
944
- if (requestInfo) {
945
- this.sendToClient(ws, wrapSessionMessage({
946
- type: "rpc_error",
947
- payload: {
948
- requestId: requestInfo.requestId,
949
- requestType: requestInfo.requestType,
950
- error: "Invalid message",
951
- code: "invalid_message",
952
- },
953
- }));
954
- return;
1066
+ catch {
1067
+ // ignore close errors
955
1068
  }
1069
+ return;
1070
+ }
1071
+ const requestInfo = extractRequestInfoFromUnknownWsInbound(parsedPayload);
1072
+ if (requestInfo) {
956
1073
  this.sendToClient(ws, wrapSessionMessage({
957
- type: "status",
1074
+ type: "rpc_error",
958
1075
  payload: {
959
- status: "error",
960
- message: `Invalid message: ${err.message}`,
1076
+ requestId: requestInfo.requestId,
1077
+ requestType: requestInfo.requestType,
1078
+ error: "Invalid message",
1079
+ code: "invalid_message",
961
1080
  },
962
1081
  }));
1082
+ return;
963
1083
  }
1084
+ this.sendToClient(ws, wrapSessionMessage({
1085
+ type: "status",
1086
+ payload: {
1087
+ status: "error",
1088
+ message: `Invalid message: ${err.message}`,
1089
+ },
1090
+ }));
1091
+ }
1092
+ decodeRawMessagePayloadForError(data) {
1093
+ let rawPayload = null;
1094
+ let parsedPayload = null;
1095
+ try {
1096
+ const buffer = bufferFromWsData(data);
1097
+ rawPayload = buffer.toString();
1098
+ parsedPayload = JSON.parse(rawPayload);
1099
+ }
1100
+ catch (payloadError) {
1101
+ rawPayload = rawPayload ?? "<unreadable>";
1102
+ parsedPayload = parsedPayload ?? rawPayload;
1103
+ const payloadErr = payloadError instanceof Error ? payloadError : new Error(String(payloadError));
1104
+ this.logger.error({ err: payloadErr }, "Failed to decode raw payload");
1105
+ }
1106
+ return { rawPayload, parsedPayload };
964
1107
  }
965
1108
  incrementRuntimeCounter(counter) {
966
1109
  this.runtimeCounters[counter] += 1;
@@ -1198,6 +1341,18 @@ function extractSocketRequestMetadata(request) {
1198
1341
  ...(remoteAddress ? { remoteAddress } : {}),
1199
1342
  };
1200
1343
  }
1344
+ function selectWebSocketProtocol(protocols, password) {
1345
+ if (!password) {
1346
+ return protocols.values().next().value ?? false;
1347
+ }
1348
+ for (const protocol of protocols) {
1349
+ const token = extractWsBearerToken(protocol);
1350
+ if (token !== null) {
1351
+ return protocol;
1352
+ }
1353
+ }
1354
+ return false;
1355
+ }
1201
1356
  function stringifyCloseReason(reason) {
1202
1357
  if (typeof reason === "string") {
1203
1358
  return reason.length > 0 ? reason : null;