@getpaseo/server 0.1.62 → 0.1.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (464) hide show
  1. package/README.md +4 -0
  2. package/dist/server/client/daemon-client-runtime-metrics.d.ts +6 -6
  3. package/dist/server/client/daemon-client-runtime-metrics.d.ts.map +1 -1
  4. package/dist/server/client/daemon-client-transport-types.d.ts +13 -13
  5. package/dist/server/client/daemon-client-transport-types.d.ts.map +1 -1
  6. package/dist/server/client/daemon-client-websocket-transport.d.ts +1 -1
  7. package/dist/server/client/daemon-client-websocket-transport.d.ts.map +1 -1
  8. package/dist/server/client/daemon-client-websocket-transport.js +5 -4
  9. package/dist/server/client/daemon-client-websocket-transport.js.map +1 -1
  10. package/dist/server/client/daemon-client.d.ts +59 -37
  11. package/dist/server/client/daemon-client.d.ts.map +1 -1
  12. package/dist/server/client/daemon-client.js +62 -17
  13. package/dist/server/client/daemon-client.js.map +1 -1
  14. package/dist/server/server/agent/agent-loading.d.ts.map +1 -1
  15. package/dist/server/server/agent/agent-loading.js +5 -3
  16. package/dist/server/server/agent/agent-loading.js.map +1 -1
  17. package/dist/server/server/agent/agent-manager.d.ts +45 -19
  18. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  19. package/dist/server/server/agent/agent-manager.js +393 -290
  20. package/dist/server/server/agent/agent-manager.js.map +1 -1
  21. package/dist/server/server/agent/agent-metadata-generator.d.ts +6 -6
  22. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
  23. package/dist/server/server/agent/agent-metadata-generator.js +46 -38
  24. package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
  25. package/dist/server/server/agent/agent-projections.d.ts +4 -6
  26. package/dist/server/server/agent/agent-projections.d.ts.map +1 -1
  27. package/dist/server/server/agent/agent-projections.js +59 -65
  28. package/dist/server/server/agent/agent-projections.js.map +1 -1
  29. package/dist/server/server/agent/agent-response-loop.d.ts +4 -4
  30. package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
  31. package/dist/server/server/agent/agent-response-loop.js +58 -45
  32. package/dist/server/server/agent/agent-response-loop.js.map +1 -1
  33. package/dist/server/server/agent/agent-sdk-types.d.ts +43 -40
  34. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  35. package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
  36. package/dist/server/server/agent/agent-storage.d.ts +2 -2
  37. package/dist/server/server/agent/agent-storage.d.ts.map +1 -1
  38. package/dist/server/server/agent/agent-storage.js +29 -36
  39. package/dist/server/server/agent/agent-storage.js.map +1 -1
  40. package/dist/server/server/agent/agent-stream-coalescer.d.ts +6 -6
  41. package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -1
  42. package/dist/server/server/agent/agent-timeline-store-types.d.ts +10 -10
  43. package/dist/server/server/agent/agent-timeline-store-types.d.ts.map +1 -1
  44. package/dist/server/server/agent/agent-timeline-store.d.ts +2 -2
  45. package/dist/server/server/agent/agent-timeline-store.d.ts.map +1 -1
  46. package/dist/server/server/agent/agent-timeline-store.js +85 -64
  47. package/dist/server/server/agent/agent-timeline-store.js.map +1 -1
  48. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  49. package/dist/server/server/agent/mcp-server.js +185 -148
  50. package/dist/server/server/agent/mcp-server.js.map +1 -1
  51. package/dist/server/server/agent/mcp-shared.d.ts +9 -2
  52. package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
  53. package/dist/server/server/agent/mcp-shared.js +2 -0
  54. package/dist/server/server/agent/mcp-shared.js.map +1 -1
  55. package/dist/server/server/agent/model-resolver.d.ts +2 -2
  56. package/dist/server/server/agent/model-resolver.d.ts.map +1 -1
  57. package/dist/server/server/agent/model-resolver.js +9 -5
  58. package/dist/server/server/agent/model-resolver.js.map +1 -1
  59. package/dist/server/server/agent/provider-launch-config.d.ts +28 -17
  60. package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
  61. package/dist/server/server/agent/provider-launch-config.js +20 -9
  62. package/dist/server/server/agent/provider-launch-config.js.map +1 -1
  63. package/dist/server/server/agent/provider-registry.d.ts +4 -2
  64. package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
  65. package/dist/server/server/agent/provider-registry.js +24 -21
  66. package/dist/server/server/agent/provider-registry.js.map +1 -1
  67. package/dist/server/server/agent/provider-snapshot-manager.d.ts +6 -5
  68. package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -1
  69. package/dist/server/server/agent/provider-snapshot-manager.js +40 -31
  70. package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
  71. package/dist/server/server/agent/providers/acp-agent.d.ts +11 -12
  72. package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
  73. package/dist/server/server/agent/providers/acp-agent.js +148 -122
  74. package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
  75. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +2 -0
  76. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts.map +1 -1
  77. package/dist/server/server/agent/providers/claude/sidechain-tracker.js +47 -45
  78. package/dist/server/server/agent/providers/claude/sidechain-tracker.js.map +1 -1
  79. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +2 -2
  80. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -1
  81. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +10 -5
  82. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -1
  83. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -1
  84. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +11 -2
  85. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
  86. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +2 -2
  87. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -1
  88. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +20 -13
  89. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
  90. package/dist/server/server/agent/providers/claude-agent.d.ts +20 -8
  91. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  92. package/dist/server/server/agent/providers/claude-agent.js +610 -460
  93. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  94. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +2 -2
  95. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts.map +1 -1
  96. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +2 -2
  97. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
  98. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +49 -44
  99. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
  100. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +27 -8
  101. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  102. package/dist/server/server/agent/providers/codex-app-server-agent.js +564 -492
  103. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  104. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts +2 -2
  105. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -1
  106. package/dist/server/server/agent/providers/codex-rollout-timeline.js +58 -47
  107. package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -1
  108. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +2 -2
  109. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +1 -1
  110. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +3 -3
  111. package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -1
  112. package/dist/server/server/agent/providers/diagnostic-utils.js +82 -9
  113. package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -1
  114. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +2 -2
  115. package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -1
  116. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -1
  117. package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -1
  118. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +2 -2
  119. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +1 -1
  120. package/dist/server/server/agent/providers/opencode-agent.d.ts +2 -2
  121. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  122. package/dist/server/server/agent/providers/opencode-agent.js +385 -360
  123. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  124. package/dist/server/server/agent/providers/pi-direct-agent.d.ts +1 -0
  125. package/dist/server/server/agent/providers/pi-direct-agent.d.ts.map +1 -1
  126. package/dist/server/server/agent/providers/pi-direct-agent.js +109 -140
  127. package/dist/server/server/agent/providers/pi-direct-agent.js.map +1 -1
  128. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -1
  129. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +3 -1
  130. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -1
  131. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +3 -3
  132. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  133. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +102 -73
  134. package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -1
  135. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +2 -2
  136. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -1
  137. package/dist/server/server/agent/stt-manager.d.ts.map +1 -1
  138. package/dist/server/server/agent/stt-manager.js +63 -53
  139. package/dist/server/server/agent/stt-manager.js.map +1 -1
  140. package/dist/server/server/agent/timeline-projection.d.ts +6 -6
  141. package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
  142. package/dist/server/server/agent/timeline-projection.js +11 -6
  143. package/dist/server/server/agent/timeline-projection.js.map +1 -1
  144. package/dist/server/server/agent/tts-manager.d.ts.map +1 -1
  145. package/dist/server/server/agent/tts-manager.js +1 -0
  146. package/dist/server/server/agent/tts-manager.js.map +1 -1
  147. package/dist/server/server/agent-attention-policy.d.ts +2 -2
  148. package/dist/server/server/agent-attention-policy.d.ts.map +1 -1
  149. package/dist/server/server/bootstrap.d.ts +4 -4
  150. package/dist/server/server/bootstrap.d.ts.map +1 -1
  151. package/dist/server/server/bootstrap.js +493 -485
  152. package/dist/server/server/bootstrap.js.map +1 -1
  153. package/dist/server/server/chat/chat-service.d.ts +1 -1
  154. package/dist/server/server/chat/chat-service.d.ts.map +1 -1
  155. package/dist/server/server/chat/chat-service.js +3 -3
  156. package/dist/server/server/chat/chat-service.js.map +1 -1
  157. package/dist/server/server/checkout-diff-manager.d.ts +2 -2
  158. package/dist/server/server/checkout-diff-manager.d.ts.map +1 -1
  159. package/dist/server/server/checkout-git-utils.d.ts +5 -3
  160. package/dist/server/server/checkout-git-utils.d.ts.map +1 -1
  161. package/dist/server/server/checkout-git-utils.js +1 -2
  162. package/dist/server/server/checkout-git-utils.js.map +1 -1
  163. package/dist/server/server/config.d.ts.map +1 -1
  164. package/dist/server/server/config.js +68 -39
  165. package/dist/server/server/config.js.map +1 -1
  166. package/dist/server/server/connection-offer.d.ts +2 -2
  167. package/dist/server/server/connection-offer.d.ts.map +1 -1
  168. package/dist/server/server/daemon-config-store.d.ts +5 -3
  169. package/dist/server/server/daemon-config-store.d.ts.map +1 -1
  170. package/dist/server/server/daemon-config-store.js +26 -0
  171. package/dist/server/server/daemon-config-store.js.map +1 -1
  172. package/dist/server/server/daemon-keypair.d.ts +2 -2
  173. package/dist/server/server/daemon-keypair.d.ts.map +1 -1
  174. package/dist/server/server/editor-targets.d.ts +4 -4
  175. package/dist/server/server/editor-targets.d.ts.map +1 -1
  176. package/dist/server/server/editor-targets.js +11 -15
  177. package/dist/server/server/editor-targets.js.map +1 -1
  178. package/dist/server/server/exports.d.ts +3 -3
  179. package/dist/server/server/exports.d.ts.map +1 -1
  180. package/dist/server/server/exports.js +1 -3
  181. package/dist/server/server/exports.js.map +1 -1
  182. package/dist/server/server/file-download/token-store.d.ts +4 -4
  183. package/dist/server/server/file-download/token-store.d.ts.map +1 -1
  184. package/dist/server/server/index.js +16 -12
  185. package/dist/server/server/index.js.map +1 -1
  186. package/dist/server/server/logger.d.ts +4 -4
  187. package/dist/server/server/logger.d.ts.map +1 -1
  188. package/dist/server/server/logger.js +26 -20
  189. package/dist/server/server/logger.js.map +1 -1
  190. package/dist/server/server/loop/rpc-schemas.d.ts +52 -52
  191. package/dist/server/server/loop-service.d.ts +13 -12
  192. package/dist/server/server/loop-service.d.ts.map +1 -1
  193. package/dist/server/server/loop-service.js +22 -18
  194. package/dist/server/server/loop-service.js.map +1 -1
  195. package/dist/server/server/package-version.d.ts +2 -2
  196. package/dist/server/server/package-version.d.ts.map +1 -1
  197. package/dist/server/server/package-version.js +19 -17
  198. package/dist/server/server/package-version.js.map +1 -1
  199. package/dist/server/server/pairing-offer.d.ts +2 -2
  200. package/dist/server/server/pairing-offer.d.ts.map +1 -1
  201. package/dist/server/server/paseo-env.d.ts +9 -0
  202. package/dist/server/server/paseo-env.d.ts.map +1 -0
  203. package/dist/server/server/paseo-env.js +70 -0
  204. package/dist/server/server/paseo-env.js.map +1 -0
  205. package/dist/server/server/paseo-worktree-archive-service.d.ts +4 -4
  206. package/dist/server/server/paseo-worktree-archive-service.d.ts.map +1 -1
  207. package/dist/server/server/paseo-worktree-archive-service.js +11 -11
  208. package/dist/server/server/paseo-worktree-archive-service.js.map +1 -1
  209. package/dist/server/server/persisted-config.d.ts +62 -62
  210. package/dist/server/server/persisted-config.d.ts.map +1 -1
  211. package/dist/server/server/persisted-config.js +4 -4
  212. package/dist/server/server/persisted-config.js.map +1 -1
  213. package/dist/server/server/persistence-hooks.d.ts +8 -9
  214. package/dist/server/server/persistence-hooks.d.ts.map +1 -1
  215. package/dist/server/server/persistence-hooks.js +4 -12
  216. package/dist/server/server/persistence-hooks.js.map +1 -1
  217. package/dist/server/server/pid-lock.js.map +1 -1
  218. package/dist/server/server/push/push-service.d.ts.map +1 -1
  219. package/dist/server/server/push/push-service.js +1 -3
  220. package/dist/server/server/push/push-service.js.map +1 -1
  221. package/dist/server/server/relay-transport.d.ts +8 -8
  222. package/dist/server/server/relay-transport.d.ts.map +1 -1
  223. package/dist/server/server/relay-transport.js +27 -16
  224. package/dist/server/server/relay-transport.js.map +1 -1
  225. package/dist/server/server/schedule/service.d.ts.map +1 -1
  226. package/dist/server/server/schedule/service.js +2 -2
  227. package/dist/server/server/schedule/service.js.map +1 -1
  228. package/dist/server/server/script-health-monitor.d.ts.map +1 -1
  229. package/dist/server/server/script-health-monitor.js +7 -6
  230. package/dist/server/server/script-health-monitor.js.map +1 -1
  231. package/dist/server/server/script-proxy.js +1 -1
  232. package/dist/server/server/script-proxy.js.map +1 -1
  233. package/dist/server/server/script-status-projection.d.ts +4 -4
  234. package/dist/server/server/script-status-projection.d.ts.map +1 -1
  235. package/dist/server/server/script-status-projection.js +54 -44
  236. package/dist/server/server/script-status-projection.js.map +1 -1
  237. package/dist/server/server/server-id.d.ts +4 -4
  238. package/dist/server/server/server-id.d.ts.map +1 -1
  239. package/dist/server/server/session.d.ts +45 -14
  240. package/dist/server/server/session.d.ts.map +1 -1
  241. package/dist/server/server/session.js +1098 -761
  242. package/dist/server/server/session.js.map +1 -1
  243. package/dist/server/server/speech/audio.js +1 -1
  244. package/dist/server/server/speech/audio.js.map +1 -1
  245. package/dist/server/server/speech/providers/local/config.d.ts +6 -6
  246. package/dist/server/server/speech/providers/local/config.d.ts.map +1 -1
  247. package/dist/server/server/speech/providers/local/config.js +41 -16
  248. package/dist/server/server/speech/providers/local/config.js.map +1 -1
  249. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts +2 -2
  250. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -1
  251. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +42 -19
  252. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -1
  253. package/dist/server/server/speech/providers/local/runtime.d.ts +4 -4
  254. package/dist/server/server/speech/providers/local/runtime.d.ts.map +1 -1
  255. package/dist/server/server/speech/providers/local/runtime.js +108 -77
  256. package/dist/server/server/speech/providers/local/runtime.js.map +1 -1
  257. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +2 -2
  258. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -1
  259. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +1 -4
  260. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -1
  261. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +2 -2
  262. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -1
  263. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +19 -19
  264. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -1
  265. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +28 -7
  266. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts.map +1 -1
  267. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -1
  268. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts +23 -4
  269. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts.map +1 -1
  270. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +35 -28
  271. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -1
  272. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts +5 -5
  273. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts.map +1 -1
  274. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +7 -7
  275. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +1 -1
  276. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +5 -0
  277. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -1
  278. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts.map +1 -1
  279. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +3 -1
  280. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -1
  281. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +2 -2
  282. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts.map +1 -1
  283. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +3 -1
  284. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -1
  285. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts.map +1 -1
  286. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +10 -4
  287. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -1
  288. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +2 -2
  289. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts.map +1 -1
  290. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts +2 -2
  291. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts.map +1 -1
  292. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +4 -1
  293. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -1
  294. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +2 -2
  295. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts.map +1 -1
  296. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +18 -11
  297. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -1
  298. package/dist/server/server/speech/providers/openai/config.d.ts +2 -2
  299. package/dist/server/server/speech/providers/openai/config.d.ts.map +1 -1
  300. package/dist/server/server/speech/providers/openai/config.js +58 -31
  301. package/dist/server/server/speech/providers/openai/config.js.map +1 -1
  302. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts.map +1 -1
  303. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +2 -2
  304. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js.map +1 -1
  305. package/dist/server/server/speech/providers/openai/runtime.d.ts +4 -4
  306. package/dist/server/server/speech/providers/openai/runtime.d.ts.map +1 -1
  307. package/dist/server/server/speech/providers/openai/runtime.js +37 -32
  308. package/dist/server/server/speech/providers/openai/runtime.js.map +1 -1
  309. package/dist/server/server/speech/providers/openai/stt.d.ts.map +1 -1
  310. package/dist/server/server/speech/providers/openai/stt.js +4 -3
  311. package/dist/server/server/speech/providers/openai/stt.js.map +1 -1
  312. package/dist/server/server/speech/providers/openai/tts.d.ts.map +1 -1
  313. package/dist/server/server/speech/providers/openai/tts.js +3 -2
  314. package/dist/server/server/speech/providers/openai/tts.js.map +1 -1
  315. package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -1
  316. package/dist/server/server/speech/speech-config-resolver.js +46 -17
  317. package/dist/server/server/speech/speech-config-resolver.js.map +1 -1
  318. package/dist/server/server/speech/speech-provider.d.ts +2 -2
  319. package/dist/server/server/speech/speech-provider.d.ts.map +1 -1
  320. package/dist/server/server/speech/speech-runtime.d.ts +6 -6
  321. package/dist/server/server/speech/speech-runtime.d.ts.map +1 -1
  322. package/dist/server/server/speech/speech-runtime.js +17 -17
  323. package/dist/server/server/speech/speech-runtime.js.map +1 -1
  324. package/dist/server/server/speech/speech-types.d.ts +2 -2
  325. package/dist/server/server/speech/speech-types.d.ts.map +1 -1
  326. package/dist/server/server/speech/turn-detection-provider.d.ts +2 -2
  327. package/dist/server/server/speech/turn-detection-provider.d.ts.map +1 -1
  328. package/dist/server/server/utils/diff-highlighter.d.ts +0 -3
  329. package/dist/server/server/utils/diff-highlighter.d.ts.map +1 -1
  330. package/dist/server/server/utils/diff-highlighter.js +67 -66
  331. package/dist/server/server/utils/diff-highlighter.js.map +1 -1
  332. package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -1
  333. package/dist/server/server/voice/voice-turn-controller.js +1 -0
  334. package/dist/server/server/voice/voice-turn-controller.js.map +1 -1
  335. package/dist/server/server/voice-types.d.ts +2 -2
  336. package/dist/server/server/voice-types.d.ts.map +1 -1
  337. package/dist/server/server/websocket-server.d.ts +31 -21
  338. package/dist/server/server/websocket-server.d.ts.map +1 -1
  339. package/dist/server/server/websocket-server.js +299 -197
  340. package/dist/server/server/websocket-server.js.map +1 -1
  341. package/dist/server/server/workspace-git-metadata.d.ts +2 -2
  342. package/dist/server/server/workspace-git-metadata.d.ts.map +1 -1
  343. package/dist/server/server/workspace-git-metadata.js +2 -32
  344. package/dist/server/server/workspace-git-metadata.js.map +1 -1
  345. package/dist/server/server/workspace-git-service.d.ts +8 -4
  346. package/dist/server/server/workspace-git-service.d.ts.map +1 -1
  347. package/dist/server/server/workspace-git-service.js +163 -115
  348. package/dist/server/server/workspace-git-service.js.map +1 -1
  349. package/dist/server/server/workspace-reconciliation-service.d.ts +5 -4
  350. package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -1
  351. package/dist/server/server/workspace-reconciliation-service.js +82 -82
  352. package/dist/server/server/workspace-reconciliation-service.js.map +1 -1
  353. package/dist/server/server/workspace-registry-bootstrap.d.ts.map +1 -1
  354. package/dist/server/server/workspace-registry-bootstrap.js +40 -33
  355. package/dist/server/server/workspace-registry-bootstrap.js.map +1 -1
  356. package/dist/server/server/workspace-registry-model.d.ts +19 -6
  357. package/dist/server/server/workspace-registry-model.d.ts.map +1 -1
  358. package/dist/server/server/workspace-registry-model.js +35 -21
  359. package/dist/server/server/workspace-registry-model.js.map +1 -1
  360. package/dist/server/server/workspace-registry.d.ts +2 -2
  361. package/dist/server/server/workspace-script-runtime-store.d.ts +2 -2
  362. package/dist/server/server/workspace-script-runtime-store.d.ts.map +1 -1
  363. package/dist/server/server/workspace-service-env.js +3 -3
  364. package/dist/server/server/workspace-service-env.js.map +1 -1
  365. package/dist/server/server/worktree-bootstrap.d.ts +4 -4
  366. package/dist/server/server/worktree-bootstrap.d.ts.map +1 -1
  367. package/dist/server/server/worktree-bootstrap.js +95 -67
  368. package/dist/server/server/worktree-bootstrap.js.map +1 -1
  369. package/dist/server/server/worktree-session.d.ts +8 -8
  370. package/dist/server/server/worktree-session.d.ts.map +1 -1
  371. package/dist/server/server/worktree-session.js +27 -19
  372. package/dist/server/server/worktree-session.js.map +1 -1
  373. package/dist/server/services/github-service.d.ts +1 -7
  374. package/dist/server/services/github-service.d.ts.map +1 -1
  375. package/dist/server/services/github-service.js +123 -143
  376. package/dist/server/services/github-service.js.map +1 -1
  377. package/dist/server/shared/agent-attention-notification.d.ts +9 -8
  378. package/dist/server/shared/agent-attention-notification.d.ts.map +1 -1
  379. package/dist/server/shared/agent-attention-notification.js +27 -17
  380. package/dist/server/shared/agent-attention-notification.js.map +1 -1
  381. package/dist/server/shared/daemon-endpoints.d.ts +2 -2
  382. package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
  383. package/dist/server/shared/daemon-endpoints.js +17 -2
  384. package/dist/server/shared/daemon-endpoints.js.map +1 -1
  385. package/dist/server/shared/messages.d.ts +21962 -3049
  386. package/dist/server/shared/messages.d.ts.map +1 -1
  387. package/dist/server/shared/messages.js +79 -2
  388. package/dist/server/shared/messages.js.map +1 -1
  389. package/dist/server/shared/terminal-stream-protocol.d.ts +2 -2
  390. package/dist/server/shared/terminal-stream-protocol.d.ts.map +1 -1
  391. package/dist/server/shared/tool-call-display.d.ts +2 -2
  392. package/dist/server/shared/tool-call-display.d.ts.map +1 -1
  393. package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
  394. package/dist/server/terminal/terminal-manager.js +1 -3
  395. package/dist/server/terminal/terminal-manager.js.map +1 -1
  396. package/dist/server/terminal/terminal-output-coalescer.d.ts +6 -6
  397. package/dist/server/terminal/terminal-output-coalescer.d.ts.map +1 -1
  398. package/dist/server/terminal/terminal.d.ts +3 -2
  399. package/dist/server/terminal/terminal.d.ts.map +1 -1
  400. package/dist/server/terminal/terminal.js +57 -19
  401. package/dist/server/terminal/terminal.js.map +1 -1
  402. package/dist/server/utils/checkout-git.d.ts +13 -12
  403. package/dist/server/utils/checkout-git.d.ts.map +1 -1
  404. package/dist/server/utils/checkout-git.js +351 -281
  405. package/dist/server/utils/checkout-git.js.map +1 -1
  406. package/dist/server/utils/directory-suggestions.js +12 -33
  407. package/dist/server/utils/directory-suggestions.js.map +1 -1
  408. package/dist/server/utils/executable.d.ts +1 -14
  409. package/dist/server/utils/executable.d.ts.map +1 -1
  410. package/dist/server/utils/executable.js +13 -49
  411. package/dist/server/utils/executable.js.map +1 -1
  412. package/dist/server/utils/github-remote.d.ts +13 -0
  413. package/dist/server/utils/github-remote.d.ts.map +1 -0
  414. package/dist/server/utils/github-remote.js +128 -0
  415. package/dist/server/utils/github-remote.js.map +1 -0
  416. package/dist/server/utils/paseo-config-file.d.ts +30 -0
  417. package/dist/server/utils/paseo-config-file.d.ts.map +1 -0
  418. package/dist/server/utils/paseo-config-file.js +90 -0
  419. package/dist/server/utils/paseo-config-file.js.map +1 -0
  420. package/dist/server/utils/paseo-config-schema.d.ts +290 -0
  421. package/dist/server/utils/paseo-config-schema.d.ts.map +1 -0
  422. package/dist/server/utils/paseo-config-schema.js +60 -0
  423. package/dist/server/utils/paseo-config-schema.js.map +1 -0
  424. package/dist/server/utils/project-icon.d.ts.map +1 -1
  425. package/dist/server/utils/project-icon.js +84 -109
  426. package/dist/server/utils/project-icon.js.map +1 -1
  427. package/dist/server/utils/promise-timeout.d.ts +2 -2
  428. package/dist/server/utils/promise-timeout.d.ts.map +1 -1
  429. package/dist/server/utils/run-git-command.d.ts +3 -1
  430. package/dist/server/utils/run-git-command.d.ts.map +1 -1
  431. package/dist/server/utils/run-git-command.js +10 -1
  432. package/dist/server/utils/run-git-command.js.map +1 -1
  433. package/dist/server/utils/script-hostname.d.ts +2 -2
  434. package/dist/server/utils/script-hostname.d.ts.map +1 -1
  435. package/dist/server/utils/spawn.d.ts +10 -3
  436. package/dist/server/utils/spawn.d.ts.map +1 -1
  437. package/dist/server/utils/spawn.js +30 -5
  438. package/dist/server/utils/spawn.js.map +1 -1
  439. package/dist/server/utils/windows-command.d.ts +15 -0
  440. package/dist/server/utils/windows-command.d.ts.map +1 -0
  441. package/dist/server/utils/windows-command.js +37 -0
  442. package/dist/server/utils/windows-command.js.map +1 -0
  443. package/dist/server/utils/worktree.d.ts +10 -7
  444. package/dist/server/utils/worktree.d.ts.map +1 -1
  445. package/dist/server/utils/worktree.js +64 -55
  446. package/dist/server/utils/worktree.js.map +1 -1
  447. package/dist/src/server/pid-lock.js.map +1 -1
  448. package/package.json +15 -20
  449. package/dist/server/server/agent/llm-openai.d.ts +0 -7
  450. package/dist/server/server/agent/llm-openai.d.ts.map +0 -1
  451. package/dist/server/server/agent/llm-openai.js +0 -8
  452. package/dist/server/server/agent/llm-openai.js.map +0 -1
  453. package/dist/server/server/agent/orchestrator.d.ts +0 -12
  454. package/dist/server/server/agent/orchestrator.d.ts.map +0 -1
  455. package/dist/server/server/agent/orchestrator.js +0 -12
  456. package/dist/server/server/agent/orchestrator.js.map +0 -1
  457. package/dist/server/server/types.d.ts +0 -5
  458. package/dist/server/server/types.d.ts.map +0 -1
  459. package/dist/server/server/types.js +0 -3
  460. package/dist/server/server/types.js.map +0 -1
  461. package/dist/server/server/workspace-registry.test-helpers.d.ts +0 -37
  462. package/dist/server/server/workspace-registry.test-helpers.d.ts.map +0 -1
  463. package/dist/server/server/workspace-registry.test-helpers.js +0 -121
  464. package/dist/server/server/workspace-registry.test-helpers.js.map +0 -1
@@ -80,7 +80,7 @@ import { AgentManager } from "./agent/agent-manager.js";
80
80
  import { AgentStorage } from "./agent/agent-storage.js";
81
81
  import { attachAgentStoragePersistence } from "./persistence-hooks.js";
82
82
  import { createAgentMcpServer } from "./agent/mcp-server.js";
83
- import { buildProviderRegistry, createAllClients, shutdownProviders, } from "./agent/provider-registry.js";
83
+ import { buildProviderRegistry, createClientsFromRegistry, shutdownProviders, } from "./agent/provider-registry.js";
84
84
  import { bootstrapWorkspaceRegistries } from "./workspace-registry-bootstrap.js";
85
85
  import { FileBackedProjectRegistry, FileBackedWorkspaceRegistry } from "./workspace-registry.js";
86
86
  import { FileBackedChatService } from "./chat/chat-service.js";
@@ -118,531 +118,539 @@ export async function createPaseoDaemon(config, rootLogger) {
118
118
  const daemonVersion = resolveDaemonVersion(import.meta.url);
119
119
  const daemonConfigStore = new DaemonConfigStore(config.paseoHome, {
120
120
  mcp: { injectIntoAgents: config.mcpInjectIntoAgents ?? true },
121
+ providers: Object.fromEntries(Object.entries(config.providerOverrides ?? {}).map(([providerId, override]) => [
122
+ providerId,
123
+ {
124
+ ...(override.enabled !== undefined ? { enabled: override.enabled } : {}),
125
+ ...(override.additionalModels ? { additionalModels: override.additionalModels } : {}),
126
+ },
127
+ ])),
121
128
  }, logger);
122
- try {
123
- const serverId = getOrCreateServerId(config.paseoHome, { logger });
124
- const daemonKeyPair = await loadOrCreateDaemonKeyPair(config.paseoHome, logger);
125
- let relayTransport = null;
126
- const staticDir = config.staticDir;
127
- const downloadTokenTtlMs = config.downloadTokenTtlMs ?? 60000;
128
- const downloadTokenStore = new DownloadTokenStore({ ttlMs: downloadTokenTtlMs });
129
- const listenTarget = parseListenString(config.listen);
130
- const app = express();
131
- let boundListenTarget = null;
132
- let workspaceRegistry = null;
133
- const scriptRouteStore = new ScriptRouteStore();
134
- const scriptRuntimeStore = new WorkspaceScriptRuntimeStore();
135
- const configuredHostnames = config.hostnames ?? config.allowedHosts;
136
- let wsServer = null;
137
- const scriptHealthMonitor = new ScriptHealthMonitor({
138
- routeStore: scriptRouteStore,
139
- onChange: createScriptStatusEmitter({
140
- sessions: () => wsServer?.listActiveSessions().map((session) => ({
141
- emit: (message) => session.emitServerMessage(message),
142
- })) ?? [],
143
- routeStore: scriptRouteStore,
144
- runtimeStore: scriptRuntimeStore,
145
- daemonPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
146
- resolveWorkspaceDirectory: async (workspaceId) => (await workspaceRegistry?.get(workspaceId))?.cwd ?? null,
147
- }),
148
- });
149
- const handleBranchChange = createBranchChangeRouteHandler({
129
+ const serverId = getOrCreateServerId(config.paseoHome, { logger });
130
+ const daemonKeyPair = await loadOrCreateDaemonKeyPair(config.paseoHome, logger);
131
+ let relayTransport = null;
132
+ const staticDir = config.staticDir;
133
+ const downloadTokenTtlMs = config.downloadTokenTtlMs ?? 60000;
134
+ const downloadTokenStore = new DownloadTokenStore({ ttlMs: downloadTokenTtlMs });
135
+ const listenTarget = parseListenString(config.listen);
136
+ const app = express();
137
+ let boundListenTarget = null;
138
+ let workspaceRegistry = null;
139
+ const scriptRouteStore = new ScriptRouteStore();
140
+ const scriptRuntimeStore = new WorkspaceScriptRuntimeStore();
141
+ const configuredHostnames = config.hostnames ?? config.allowedHosts;
142
+ let wsServer = null;
143
+ const scriptHealthMonitor = new ScriptHealthMonitor({
144
+ routeStore: scriptRouteStore,
145
+ onChange: createScriptStatusEmitter({
146
+ sessions: () => wsServer?.listActiveSessions().map((session) => ({
147
+ emit: (message) => session.emitServerMessage(message),
148
+ })) ?? [],
150
149
  routeStore: scriptRouteStore,
151
- onRoutesChanged: (workspaceId) => {
152
- scriptHealthMonitor.invalidateWorkspace(workspaceId);
153
- },
154
- logger,
155
- });
156
- // Host allowlist / DNS rebinding protection (vite-like semantics).
157
- // For non-TCP (unix sockets), skip host validation.
158
- if (listenTarget.type === "tcp") {
159
- app.use((req, res, next) => {
160
- const hostHeader = typeof req.headers.host === "string" ? req.headers.host : undefined;
161
- if (!isHostnameAllowed(hostHeader, configuredHostnames)) {
162
- res.status(403).json({ error: "Invalid Host header" });
163
- return;
164
- }
165
- next();
166
- });
167
- }
168
- // Script proxy — intercepts requests for registered *.localhost hostnames
169
- // and forwards them to the corresponding local script port. Placed after
170
- // the host allowlist (*.localhost is already allowed) but before CORS and
171
- // the rest of the routes so proxied requests skip unnecessary middleware.
172
- app.use(createScriptProxyMiddleware({ routeStore: scriptRouteStore, logger }));
173
- // CORS - allow same-origin + configured origins
174
- const allowedOrigins = new Set([
175
- ...config.corsAllowedOrigins,
176
- // Packaged desktop renderers use the custom paseo:// protocol scheme.
177
- "paseo://app",
178
- // For TCP, add localhost variants
179
- ...(listenTarget.type === "tcp"
180
- ? [
181
- `http://${listenTarget.host}:${listenTarget.port}`,
182
- `http://localhost:${listenTarget.port}`,
183
- `http://127.0.0.1:${listenTarget.port}`,
184
- ]
185
- : []),
186
- ]);
150
+ runtimeStore: scriptRuntimeStore,
151
+ daemonPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
152
+ resolveWorkspaceDirectory: async (workspaceId) => (await workspaceRegistry?.get(workspaceId))?.cwd ?? null,
153
+ }),
154
+ });
155
+ const handleBranchChange = createBranchChangeRouteHandler({
156
+ routeStore: scriptRouteStore,
157
+ onRoutesChanged: (workspaceId) => {
158
+ scriptHealthMonitor.invalidateWorkspace(workspaceId);
159
+ },
160
+ logger,
161
+ });
162
+ // Host allowlist / DNS rebinding protection (vite-like semantics).
163
+ // For non-TCP (unix sockets), skip host validation.
164
+ if (listenTarget.type === "tcp") {
187
165
  app.use((req, res, next) => {
188
- const origin = req.headers.origin;
189
- if (origin && (allowedOrigins.has("*") || allowedOrigins.has(origin))) {
190
- res.setHeader("Access-Control-Allow-Origin", origin);
191
- res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
192
- res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
193
- res.setHeader("Access-Control-Allow-Credentials", "true");
194
- }
195
- if (req.method === "OPTIONS") {
196
- res.status(204).end();
166
+ const hostHeader = typeof req.headers.host === "string" ? req.headers.host : undefined;
167
+ if (!isHostnameAllowed(hostHeader, configuredHostnames)) {
168
+ res.status(403).json({ error: "Invalid Host header" });
197
169
  return;
198
170
  }
199
171
  next();
200
172
  });
201
- // Serve static files from public directory
202
- app.use("/public", express.static(staticDir));
203
- // Middleware
204
- app.use(express.json());
205
- // Health check endpoint
206
- app.get("/api/health", (_req, res) => {
207
- res.json({ status: "ok", timestamp: new Date().toISOString() });
208
- });
209
- app.get("/api/status", (_req, res) => {
210
- res.json({
211
- status: "server_info",
212
- serverId,
213
- hostname: getHostname(),
214
- version: daemonVersion,
215
- listen: formatListenTarget(boundListenTarget ?? listenTarget),
216
- });
173
+ }
174
+ // Script proxy — intercepts requests for registered *.localhost hostnames
175
+ // and forwards them to the corresponding local script port. Placed after
176
+ // the host allowlist (*.localhost is already allowed) but before CORS and
177
+ // the rest of the routes so proxied requests skip unnecessary middleware.
178
+ app.use(createScriptProxyMiddleware({ routeStore: scriptRouteStore, logger }));
179
+ // CORS - allow same-origin + configured origins
180
+ const allowedOrigins = new Set([
181
+ ...config.corsAllowedOrigins,
182
+ // Packaged desktop renderers use the custom paseo:// protocol scheme.
183
+ "paseo://app",
184
+ // For TCP, add localhost variants
185
+ ...(listenTarget.type === "tcp"
186
+ ? [
187
+ `http://${listenTarget.host}:${listenTarget.port}`,
188
+ `http://localhost:${listenTarget.port}`,
189
+ `http://127.0.0.1:${listenTarget.port}`,
190
+ ]
191
+ : []),
192
+ ]);
193
+ app.use((req, res, next) => {
194
+ const origin = req.headers.origin;
195
+ if (origin && (allowedOrigins.has("*") || allowedOrigins.has(origin))) {
196
+ res.setHeader("Access-Control-Allow-Origin", origin);
197
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
198
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
199
+ res.setHeader("Access-Control-Allow-Credentials", "true");
200
+ }
201
+ if (req.method === "OPTIONS") {
202
+ res.status(204).end();
203
+ return;
204
+ }
205
+ next();
206
+ });
207
+ // Serve static files from public directory
208
+ app.use("/public", express.static(staticDir));
209
+ // Middleware
210
+ app.use(express.json());
211
+ // Health check endpoint
212
+ app.get("/api/health", (_req, res) => {
213
+ res.json({ status: "ok", timestamp: new Date().toISOString() });
214
+ });
215
+ app.get("/api/status", (_req, res) => {
216
+ res.json({
217
+ status: "server_info",
218
+ serverId,
219
+ hostname: getHostname(),
220
+ version: daemonVersion,
221
+ listen: formatListenTarget(boundListenTarget ?? listenTarget),
217
222
  });
218
- app.get("/api/files/download", async (req, res) => {
219
- const token = typeof req.query.token === "string" && req.query.token.trim().length > 0
220
- ? req.query.token.trim()
221
- : null;
222
- if (!token) {
223
- res.status(400).json({ error: "Missing download token" });
224
- return;
225
- }
226
- const entry = downloadTokenStore.consumeToken(token);
227
- if (!entry) {
228
- res.status(403).json({ error: "Invalid or expired token" });
223
+ });
224
+ const handleFileDownload = async (req, res) => {
225
+ const token = typeof req.query.token === "string" && req.query.token.trim().length > 0
226
+ ? req.query.token.trim()
227
+ : null;
228
+ if (!token) {
229
+ res.status(400).json({ error: "Missing download token" });
230
+ return;
231
+ }
232
+ const entry = downloadTokenStore.consumeToken(token);
233
+ if (!entry) {
234
+ res.status(403).json({ error: "Invalid or expired token" });
235
+ return;
236
+ }
237
+ try {
238
+ const fileStats = await stat(entry.absolutePath);
239
+ if (!fileStats.isFile()) {
240
+ res.status(404).json({ error: "File not found" });
229
241
  return;
230
242
  }
231
- try {
232
- const fileStats = await stat(entry.absolutePath);
233
- if (!fileStats.isFile()) {
234
- res.status(404).json({ error: "File not found" });
235
- return;
236
- }
237
- const safeFileName = entry.fileName.replace(/["\r\n]/g, "_");
238
- res.setHeader("Content-Type", entry.mimeType);
239
- res.setHeader("Content-Disposition", `attachment; filename="${safeFileName}"`);
240
- res.setHeader("Content-Length", entry.size.toString());
241
- const stream = createReadStream(entry.absolutePath);
242
- stream.on("error", (err) => {
243
- logger.error({ err }, "Failed to stream download");
244
- if (!res.headersSent) {
245
- res.status(500).json({ error: "Failed to read file" });
246
- }
247
- else {
248
- res.end();
249
- }
250
- });
251
- stream.pipe(res);
252
- }
253
- catch (err) {
254
- logger.error({ err }, "Failed to download file");
243
+ const safeFileName = entry.fileName.replace(/["\r\n]/g, "_");
244
+ res.setHeader("Content-Type", entry.mimeType);
245
+ res.setHeader("Content-Disposition", `attachment; filename="${safeFileName}"`);
246
+ res.setHeader("Content-Length", entry.size.toString());
247
+ const stream = createReadStream(entry.absolutePath);
248
+ stream.on("error", (err) => {
249
+ logger.error({ err }, "Failed to stream download");
255
250
  if (!res.headersSent) {
256
- res.status(404).json({ error: "File not found" });
251
+ res.status(500).json({ error: "Failed to read file" });
252
+ }
253
+ else {
254
+ res.end();
257
255
  }
256
+ });
257
+ stream.pipe(res);
258
+ }
259
+ catch (err) {
260
+ logger.error({ err }, "Failed to download file");
261
+ if (!res.headersSent) {
262
+ res.status(404).json({ error: "File not found" });
258
263
  }
259
- });
260
- const httpServer = createHTTPServer(app);
261
- // Script proxy WebSocket upgrade handler — must be registered before the
262
- // VoiceAssistantWebSocketServer attaches its own "upgrade" listener so that
263
- // script-bound upgrades are forwarded first. The handler is a no-op for
264
- // requests that don't match a registered script route.
265
- const scriptProxyUpgradeHandler = createScriptProxyUpgradeHandler({
266
- routeStore: scriptRouteStore,
267
- logger,
268
- });
269
- httpServer.on("upgrade", scriptProxyUpgradeHandler);
270
- const agentStorage = new AgentStorage(config.agentStoragePath, logger);
271
- const projectRegistry = new FileBackedProjectRegistry(path.join(config.paseoHome, "projects", "projects.json"), logger);
272
- workspaceRegistry = new FileBackedWorkspaceRegistry(path.join(config.paseoHome, "projects", "workspaces.json"), logger);
273
- const chatService = new FileBackedChatService({
274
- paseoHome: config.paseoHome,
275
- logger,
276
- });
277
- const terminalManager = createTerminalManager();
278
- const github = createGitHubService();
279
- const workspaceGitService = new WorkspaceGitServiceImpl({
280
- logger,
281
- paseoHome: config.paseoHome,
282
- deps: {
264
+ }
265
+ };
266
+ app.get("/api/files/download", (req, res) => {
267
+ void handleFileDownload(req, res);
268
+ });
269
+ const httpServer = createHTTPServer(app);
270
+ // Script proxy WebSocket upgrade handler — must be registered before the
271
+ // VoiceAssistantWebSocketServer attaches its own "upgrade" listener so that
272
+ // script-bound upgrades are forwarded first. The handler is a no-op for
273
+ // requests that don't match a registered script route.
274
+ const scriptProxyUpgradeHandler = createScriptProxyUpgradeHandler({
275
+ routeStore: scriptRouteStore,
276
+ logger,
277
+ });
278
+ httpServer.on("upgrade", scriptProxyUpgradeHandler);
279
+ const agentStorage = new AgentStorage(config.agentStoragePath, logger);
280
+ const projectRegistry = new FileBackedProjectRegistry(path.join(config.paseoHome, "projects", "projects.json"), logger);
281
+ workspaceRegistry = new FileBackedWorkspaceRegistry(path.join(config.paseoHome, "projects", "workspaces.json"), logger);
282
+ const chatService = new FileBackedChatService({
283
+ paseoHome: config.paseoHome,
284
+ logger,
285
+ });
286
+ const terminalManager = createTerminalManager();
287
+ const github = createGitHubService();
288
+ const workspaceGitService = new WorkspaceGitServiceImpl({
289
+ logger,
290
+ paseoHome: config.paseoHome,
291
+ deps: {
292
+ github,
293
+ },
294
+ });
295
+ const providerRegistry = buildProviderRegistry(logger, {
296
+ runtimeSettings: config.agentProviderSettings,
297
+ providerOverrides: config.providerOverrides,
298
+ workspaceGitService,
299
+ isDev: config.isDev === true,
300
+ });
301
+ const agentManager = new AgentManager({
302
+ clients: {
303
+ ...createClientsFromRegistry(providerRegistry, logger),
304
+ ...config.agentClients,
305
+ },
306
+ providerDefinitions: providerRegistry,
307
+ registry: agentStorage,
308
+ logger,
309
+ });
310
+ const detachAgentStoragePersistence = attachAgentStoragePersistence(logger, agentManager, agentStorage);
311
+ await agentStorage.initialize();
312
+ logger.info({ elapsed: elapsed() }, "Agent storage initialized");
313
+ await bootstrapWorkspaceRegistries({
314
+ paseoHome: config.paseoHome,
315
+ agentStorage,
316
+ projectRegistry,
317
+ workspaceRegistry,
318
+ workspaceGitService,
319
+ logger,
320
+ });
321
+ logger.info({ elapsed: elapsed() }, "Workspace registries bootstrapped");
322
+ await chatService.initialize();
323
+ logger.info({ elapsed: elapsed() }, "Chat service initialized");
324
+ const checkoutDiffManager = new CheckoutDiffManager({
325
+ logger,
326
+ paseoHome: config.paseoHome,
327
+ workspaceGitService,
328
+ });
329
+ const loopService = new LoopService({
330
+ paseoHome: config.paseoHome,
331
+ logger,
332
+ agentManager,
333
+ });
334
+ await loopService.initialize();
335
+ logger.info({ elapsed: elapsed() }, "Loop service initialized");
336
+ const scheduleService = new ScheduleService({
337
+ paseoHome: config.paseoHome,
338
+ logger,
339
+ agentManager,
340
+ agentStorage,
341
+ });
342
+ await scheduleService.start();
343
+ logger.info({ elapsed: elapsed() }, "Schedule service initialized");
344
+ logger.info({ elapsed: elapsed() }, "Loading persisted agent registry");
345
+ const persistedRecords = await agentStorage.list();
346
+ logger.info({ elapsed: elapsed() }, `Agent registry loaded (${persistedRecords.length} record${persistedRecords.length === 1 ? "" : "s"}); agents will initialize on demand`);
347
+ logger.info("Voice mode configured for agent-scoped resume flow (no dedicated voice assistant provider)");
348
+ logger.info({ elapsed: elapsed() }, "Preparing voice and MCP runtime");
349
+ const mcpEnabled = config.mcpEnabled ?? true;
350
+ let agentMcpBaseUrl = null;
351
+ if (mcpEnabled) {
352
+ const agentMcpRoute = "/mcp/agents";
353
+ const agentMcpTransports = new Map();
354
+ const archiveWorkspaceRecordForMcp = async (workspaceId) => {
355
+ const sessions = wsServer?.listActiveSessions() ?? [];
356
+ if (sessions.length > 0) {
357
+ await Promise.all(sessions.map((session) => session.archiveWorkspaceRecordForExternalMutation(workspaceId)));
358
+ return;
359
+ }
360
+ await archivePersistedWorkspaceRecord({
361
+ workspaceId,
362
+ workspaceRegistry,
363
+ projectRegistry,
364
+ });
365
+ };
366
+ const emitWorkspaceUpdatesForMcpArchive = async (cwds) => {
367
+ const cwdList = Array.from(cwds);
368
+ await Promise.all((wsServer?.listActiveSessions() ?? []).map((session) => session.emitWorkspaceUpdatesForExternalCwds(cwdList)));
369
+ };
370
+ const emitMcpArchiveSessionMessage = (message) => {
371
+ wsServer?.broadcast(wrapSessionMessage(message));
372
+ };
373
+ const createAgentMcpTransport = async (callerAgentId) => {
374
+ const agentMcpServer = await createAgentMcpServer({
375
+ agentManager,
376
+ agentStorage,
377
+ terminalManager,
378
+ getDaemonTcpPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
379
+ scheduleService,
380
+ providerRegistry,
283
381
  github,
284
- },
285
- });
286
- const agentManager = new AgentManager({
287
- clients: {
288
- ...createAllClients(logger, {
289
- runtimeSettings: config.agentProviderSettings,
290
- providerOverrides: config.providerOverrides,
291
- workspaceGitService,
292
- isDev: config.isDev === true,
293
- }),
294
- ...config.agentClients,
295
- },
296
- registry: agentStorage,
297
- logger,
298
- });
299
- const providerRegistry = buildProviderRegistry(logger, {
300
- runtimeSettings: config.agentProviderSettings,
301
- providerOverrides: config.providerOverrides,
302
- workspaceGitService,
303
- isDev: config.isDev === true,
304
- });
305
- const detachAgentStoragePersistence = attachAgentStoragePersistence(logger, agentManager, agentStorage);
306
- await agentStorage.initialize();
307
- logger.info({ elapsed: elapsed() }, "Agent storage initialized");
308
- await bootstrapWorkspaceRegistries({
309
- paseoHome: config.paseoHome,
310
- agentStorage,
311
- projectRegistry,
312
- workspaceRegistry,
313
- workspaceGitService,
314
- logger,
315
- });
316
- logger.info({ elapsed: elapsed() }, "Workspace registries bootstrapped");
317
- await chatService.initialize();
318
- logger.info({ elapsed: elapsed() }, "Chat service initialized");
319
- const checkoutDiffManager = new CheckoutDiffManager({
320
- logger,
321
- paseoHome: config.paseoHome,
322
- workspaceGitService,
323
- });
324
- const loopService = new LoopService({
325
- paseoHome: config.paseoHome,
326
- logger,
327
- agentManager,
328
- });
329
- await loopService.initialize();
330
- logger.info({ elapsed: elapsed() }, "Loop service initialized");
331
- const scheduleService = new ScheduleService({
332
- paseoHome: config.paseoHome,
333
- logger,
334
- agentManager,
335
- agentStorage,
336
- });
337
- await scheduleService.start();
338
- logger.info({ elapsed: elapsed() }, "Schedule service initialized");
339
- logger.info({ elapsed: elapsed() }, "Loading persisted agent registry");
340
- const persistedRecords = await agentStorage.list();
341
- logger.info({ elapsed: elapsed() }, `Agent registry loaded (${persistedRecords.length} record${persistedRecords.length === 1 ? "" : "s"}); agents will initialize on demand`);
342
- logger.info("Voice mode configured for agent-scoped resume flow (no dedicated voice assistant provider)");
343
- logger.info({ elapsed: elapsed() }, "Preparing voice and MCP runtime");
344
- const mcpEnabled = config.mcpEnabled ?? true;
345
- let agentMcpBaseUrl = null;
346
- if (mcpEnabled) {
347
- const agentMcpRoute = "/mcp/agents";
348
- const agentMcpTransports = new Map();
349
- const archiveWorkspaceRecordForMcp = async (workspaceId) => {
350
- const sessions = wsServer?.listActiveSessions() ?? [];
351
- if (sessions.length > 0) {
352
- await Promise.all(sessions.map((session) => session.archiveWorkspaceRecordForExternalMutation(workspaceId)));
353
- return;
354
- }
355
- await archivePersistedWorkspaceRecord({
356
- workspaceId,
357
- workspaceRegistry,
358
- projectRegistry,
359
- });
360
- };
361
- const emitWorkspaceUpdatesForMcpArchive = async (cwds) => {
362
- const cwdList = Array.from(cwds);
363
- await Promise.all((wsServer?.listActiveSessions() ?? []).map((session) => session.emitWorkspaceUpdatesForExternalCwds(cwdList)));
364
- };
365
- const emitMcpArchiveSessionMessage = (message) => {
366
- wsServer?.broadcast(wrapSessionMessage(message));
367
- };
368
- const createAgentMcpTransport = async (callerAgentId) => {
369
- const agentMcpServer = await createAgentMcpServer({
370
- agentManager,
371
- agentStorage,
372
- terminalManager,
373
- getDaemonTcpPort: () => boundListenTarget?.type === "tcp" ? boundListenTarget.port : null,
374
- scheduleService,
375
- providerRegistry,
376
- github,
377
- workspaceGitService,
378
- archiveWorkspaceRecord: archiveWorkspaceRecordForMcp,
379
- emitWorkspaceUpdatesForCwds: emitWorkspaceUpdatesForMcpArchive,
380
- emitSessionMessage: emitMcpArchiveSessionMessage,
381
- createPaseoWorktree: async (input, serviceOptions) => {
382
- const coreDeps = createWorktreeCoreDeps(github);
383
- const result = await createPaseoWorktree(input, {
384
- ...coreDeps,
385
- ...(serviceOptions?.resolveDefaultBranch
386
- ? {
387
- resolveDefaultBranch: serviceOptions.resolveDefaultBranch,
388
- }
389
- : {}),
390
- projectRegistry,
391
- workspaceRegistry,
392
- workspaceGitService,
393
- });
394
- await Promise.all(wsServer
395
- ?.listActiveSessions()
396
- .map((session) => session.warmWorkspaceGitDataForWorkspace(result.workspace)) ?? []);
397
- return result;
398
- },
399
- paseoHome: config.paseoHome,
400
- callerAgentId,
401
- enableVoiceTools: false,
402
- resolveSpeakHandler: (agentId) => wsServer?.resolveVoiceSpeakHandler(agentId) ?? null,
403
- resolveCallerContext: (agentId) => wsServer?.resolveVoiceCallerContext(agentId) ?? null,
404
- logger,
405
- });
406
- const transport = new StreamableHTTPServerTransport({
407
- sessionIdGenerator: () => randomUUID(),
408
- onsessioninitialized: (sessionId) => {
409
- agentMcpTransports.set(sessionId, transport);
410
- logger.debug({ sessionId }, "Agent MCP session initialized");
411
- },
412
- onsessionclosed: (sessionId) => {
413
- agentMcpTransports.delete(sessionId);
414
- logger.debug({ sessionId }, "Agent MCP session closed");
415
- },
416
- // NOTE: We enforce a Vite-like host allowlist at the app/websocket layer.
417
- // StreamableHTTPServerTransport's built-in check requires exact Host header matches.
418
- enableDnsRebindingProtection: false,
419
- });
420
- transport.onclose = () => {
382
+ workspaceGitService,
383
+ archiveWorkspaceRecord: archiveWorkspaceRecordForMcp,
384
+ emitWorkspaceUpdatesForCwds: emitWorkspaceUpdatesForMcpArchive,
385
+ emitSessionMessage: emitMcpArchiveSessionMessage,
386
+ createPaseoWorktree: async (input, serviceOptions) => {
387
+ const coreDeps = createWorktreeCoreDeps(github);
388
+ const result = await createPaseoWorktree(input, {
389
+ ...coreDeps,
390
+ ...(serviceOptions?.resolveDefaultBranch
391
+ ? {
392
+ resolveDefaultBranch: serviceOptions.resolveDefaultBranch,
393
+ }
394
+ : {}),
395
+ projectRegistry,
396
+ workspaceRegistry,
397
+ workspaceGitService,
398
+ });
399
+ await Promise.all(wsServer
400
+ ?.listActiveSessions()
401
+ .map((session) => session.warmWorkspaceGitDataForWorkspace(result.workspace)) ?? []);
402
+ return result;
403
+ },
404
+ paseoHome: config.paseoHome,
405
+ callerAgentId,
406
+ enableVoiceTools: false,
407
+ resolveSpeakHandler: (agentId) => wsServer?.resolveVoiceSpeakHandler(agentId) ?? null,
408
+ resolveCallerContext: (agentId) => wsServer?.resolveVoiceCallerContext(agentId) ?? null,
409
+ logger,
410
+ });
411
+ const transport = new StreamableHTTPServerTransport({
412
+ sessionIdGenerator: () => randomUUID(),
413
+ onsessioninitialized: (sessionId) => {
414
+ agentMcpTransports.set(sessionId, transport);
415
+ logger.debug({ sessionId }, "Agent MCP session initialized");
416
+ },
417
+ onsessionclosed: (sessionId) => {
418
+ agentMcpTransports.delete(sessionId);
419
+ logger.debug({ sessionId }, "Agent MCP session closed");
420
+ },
421
+ // NOTE: We enforce a Vite-like host allowlist at the app/websocket layer.
422
+ // StreamableHTTPServerTransport's built-in check requires exact Host header matches.
423
+ enableDnsRebindingProtection: false,
424
+ });
425
+ Object.assign(transport, {
426
+ onclose: () => {
421
427
  if (transport.sessionId) {
422
428
  agentMcpTransports.delete(transport.sessionId);
423
429
  }
424
- };
425
- transport.onerror = (err) => {
430
+ },
431
+ onerror: (err) => {
426
432
  logger.error({ err }, "Agent MCP transport error");
427
- };
428
- await agentMcpServer.connect(transport);
429
- return transport;
430
- };
431
- const handleAgentMcpRequest = async (req, res) => {
432
- if (config.mcpDebug) {
433
- logger.debug({
434
- method: req.method,
435
- url: req.originalUrl,
436
- sessionId: req.header("mcp-session-id"),
437
- authorization: req.header("authorization"),
438
- body: req.body,
439
- }, "Agent MCP request");
440
- }
441
- try {
442
- const sessionId = req.header("mcp-session-id");
443
- let transport = sessionId ? agentMcpTransports.get(sessionId) : undefined;
444
- if (!transport) {
445
- if (req.method !== "POST") {
446
- res.status(400).json({
447
- jsonrpc: "2.0",
448
- error: {
449
- code: -32000,
450
- message: "Missing or invalid MCP session",
451
- },
452
- id: null,
453
- });
454
- return;
455
- }
456
- if (!isInitializeRequest(req.body)) {
457
- res.status(400).json({
458
- jsonrpc: "2.0",
459
- error: {
460
- code: -32000,
461
- message: "Initialization request expected",
462
- },
463
- id: null,
464
- });
465
- return;
466
- }
467
- const callerAgentIdRaw = req.query.callerAgentId;
468
- const callerAgentId = typeof callerAgentIdRaw === "string"
469
- ? callerAgentIdRaw
470
- : Array.isArray(callerAgentIdRaw) && typeof callerAgentIdRaw[0] === "string"
471
- ? callerAgentIdRaw[0]
472
- : undefined;
473
- transport = await createAgentMcpTransport(callerAgentId);
474
- }
475
- await transport.handleRequest(req, res, req.body);
476
- }
477
- catch (err) {
478
- logger.error({ err }, "Failed to handle Agent MCP request");
479
- if (!res.headersSent) {
480
- res.status(500).json({
433
+ },
434
+ });
435
+ await agentMcpServer.connect(transport);
436
+ return transport;
437
+ };
438
+ const runAgentMcpRequest = async (req, res) => {
439
+ if (config.mcpDebug) {
440
+ logger.debug({
441
+ method: req.method,
442
+ url: req.originalUrl,
443
+ sessionId: req.header("mcp-session-id"),
444
+ authorization: req.header("authorization"),
445
+ body: req.body,
446
+ }, "Agent MCP request");
447
+ }
448
+ try {
449
+ const sessionId = req.header("mcp-session-id");
450
+ let transport = sessionId ? agentMcpTransports.get(sessionId) : undefined;
451
+ if (!transport) {
452
+ if (req.method !== "POST") {
453
+ res.status(400).json({
481
454
  jsonrpc: "2.0",
482
455
  error: {
483
- code: -32603,
484
- message: "Internal MCP server error",
456
+ code: -32000,
457
+ message: "Missing or invalid MCP session",
485
458
  },
486
459
  id: null,
487
460
  });
461
+ return;
488
462
  }
489
- }
490
- };
491
- app.post(agentMcpRoute, handleAgentMcpRequest);
492
- app.get(agentMcpRoute, handleAgentMcpRequest);
493
- app.delete(agentMcpRoute, handleAgentMcpRequest);
494
- logger.info({ route: agentMcpRoute }, "Agent MCP server mounted on main app");
495
- }
496
- else {
497
- logger.info("Agent MCP HTTP endpoint disabled");
498
- }
499
- const speechService = createSpeechService({
500
- logger,
501
- openaiConfig: config.openai,
502
- speechConfig: config.speech,
503
- });
504
- logger.info({ elapsed: elapsed() }, "Speech service created");
505
- logger.info({ elapsed: elapsed() }, "Bootstrap complete, ready to start listening");
506
- const start = async () => {
507
- // Start main HTTP server
508
- await new Promise((resolve, reject) => {
509
- const onError = (err) => {
510
- httpServer.off("listening", onListening);
511
- reject(err);
512
- };
513
- const onListening = () => {
514
- httpServer.off("error", onError);
515
- const logAndResolve = async () => {
516
- boundListenTarget = resolveBoundListenTarget(listenTarget, httpServer);
517
- const mcpBaseUrl = mcpEnabled ? createAgentMcpBaseUrl(boundListenTarget) : null;
518
- agentMcpBaseUrl = config.mcpInjectIntoAgents === false ? null : mcpBaseUrl;
519
- agentManager.setMcpBaseUrl(agentMcpBaseUrl);
520
- daemonConfigStore.onFieldChange("mcp.injectIntoAgents", (value) => {
521
- agentManager.setMcpBaseUrl(value ? mcpBaseUrl : null);
463
+ if (!isInitializeRequest(req.body)) {
464
+ res.status(400).json({
465
+ jsonrpc: "2.0",
466
+ error: {
467
+ code: -32000,
468
+ message: "Initialization request expected",
469
+ },
470
+ id: null,
522
471
  });
523
- const relayEnabled = config.relayEnabled ?? true;
524
- const relayEndpoint = config.relayEndpoint ?? "relay.paseo.sh:443";
525
- const relayPublicEndpoint = config.relayPublicEndpoint ?? relayEndpoint;
526
- const appBaseUrl = config.appBaseUrl ?? "https://app.paseo.sh";
527
- if (boundListenTarget.type === "tcp") {
528
- logger.info({
529
- host: boundListenTarget.host,
530
- port: boundListenTarget.port,
531
- elapsed: elapsed(),
532
- }, `Server listening on http://${boundListenTarget.host}:${boundListenTarget.port}`);
533
- }
534
- else {
535
- logger.info({ path: boundListenTarget.path, elapsed: elapsed() }, `Server listening on ${boundListenTarget.path}`);
536
- }
537
- wsServer = new VoiceAssistantWebSocketServer(httpServer, logger, serverId, agentManager, agentStorage, downloadTokenStore, config.paseoHome, daemonConfigStore, mcpBaseUrl, { allowedOrigins, hostnames: configuredHostnames }, speechService, terminalManager, {
538
- finalTimeoutMs: config.dictationFinalTimeoutMs,
539
- }, config.agentProviderSettings, config.providerOverrides, config.isDev === true, daemonVersion, (intent) => {
540
- try {
541
- config.onLifecycleIntent?.(intent);
542
- }
543
- catch (error) {
544
- logger.error({ err: error, intent }, "Failed to handle daemon lifecycle intent");
545
- }
546
- }, projectRegistry, workspaceRegistry, chatService, loopService, scheduleService, checkoutDiffManager, scriptRouteStore, scriptRuntimeStore, handleBranchChange, () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null), () => (boundListenTarget?.type === "tcp" ? boundListenTarget.host : null), (hostname) => scriptHealthMonitor.getHealthForHostname(hostname), workspaceGitService, github);
547
- if (typeof process.send === "function" && process.env.PASEO_SUPERVISED === "1") {
548
- process.send({
549
- type: "paseo:ready",
550
- listen: boundListenTarget.type === "tcp"
551
- ? `${boundListenTarget.host}:${boundListenTarget.port}`
552
- : boundListenTarget.path,
553
- });
554
- }
555
- if (relayEnabled) {
556
- const offer = await createConnectionOfferV2({
557
- serverId,
558
- daemonPublicKeyB64: daemonKeyPair.publicKeyB64,
559
- relay: { endpoint: relayPublicEndpoint },
560
- });
561
- encodeOfferToFragmentUrl({ offer, appBaseUrl });
562
- relayTransport?.stop().catch(() => undefined);
563
- relayTransport = startRelayTransport({
564
- logger,
565
- attachSocket: (ws, metadata) => {
566
- if (!wsServer) {
567
- throw new Error("WebSocket server not initialized");
568
- }
569
- return wsServer.attachExternalSocket(ws, metadata);
570
- },
571
- relayEndpoint,
572
- serverId,
573
- daemonKeyPair: daemonKeyPair.keyPair,
574
- });
575
- }
576
- };
577
- logAndResolve().then(resolve, reject);
578
- };
579
- httpServer.once("error", onError);
580
- httpServer.once("listening", onListening);
581
- if (listenTarget.type === "tcp") {
582
- httpServer.listen(listenTarget.port, listenTarget.host);
583
- }
584
- else {
585
- if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
586
- unlinkSync(listenTarget.path);
472
+ return;
473
+ }
474
+ const callerAgentIdRaw = req.query.callerAgentId;
475
+ let callerAgentId;
476
+ if (typeof callerAgentIdRaw === "string") {
477
+ callerAgentId = callerAgentIdRaw;
587
478
  }
588
- httpServer.listen(listenTarget.path);
479
+ else if (Array.isArray(callerAgentIdRaw) && typeof callerAgentIdRaw[0] === "string") {
480
+ callerAgentId = callerAgentIdRaw[0];
481
+ }
482
+ transport = await createAgentMcpTransport(callerAgentId);
589
483
  }
590
- });
591
- // Start speech service after listening so synchronous Sherpa native
592
- // model loading doesn't block the server from accepting connections.
593
- speechService.start();
594
- scriptHealthMonitor.start();
595
- };
596
- const stop = async () => {
597
- scriptHealthMonitor.stop();
598
- await closeAllAgents(logger, agentManager);
599
- await agentManager.flush().catch(() => undefined);
600
- detachAgentStoragePersistence();
601
- await agentStorage.flush().catch(() => undefined);
602
- await shutdownProviders(logger, {
603
- runtimeSettings: config.agentProviderSettings,
604
- providerOverrides: config.providerOverrides,
605
- });
606
- terminalManager.killAll();
607
- speechService.stop();
608
- await scheduleService.stop().catch(() => undefined);
609
- await relayTransport?.stop().catch(() => undefined);
610
- if (wsServer) {
611
- await wsServer.close();
484
+ await transport.handleRequest(req, res, req.body);
612
485
  }
613
- await new Promise((resolve) => {
614
- httpServer.close(() => resolve());
615
- });
616
- // Clean up socket files
617
- if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
618
- unlinkSync(listenTarget.path);
486
+ catch (err) {
487
+ logger.error({ err }, "Failed to handle Agent MCP request");
488
+ if (!res.headersSent) {
489
+ res.status(500).json({
490
+ jsonrpc: "2.0",
491
+ error: {
492
+ code: -32603,
493
+ message: "Internal MCP server error",
494
+ },
495
+ id: null,
496
+ });
497
+ }
619
498
  }
620
499
  };
621
- return {
622
- config,
623
- agentManager,
624
- agentStorage,
625
- terminalManager,
626
- scriptRouteStore,
627
- scriptRuntimeStore,
628
- start,
629
- stop,
630
- getListenTarget: () => boundListenTarget,
500
+ const handleAgentMcpRequest = (req, res) => {
501
+ void runAgentMcpRequest(req, res);
631
502
  };
503
+ app.post(agentMcpRoute, handleAgentMcpRequest);
504
+ app.get(agentMcpRoute, handleAgentMcpRequest);
505
+ app.delete(agentMcpRoute, handleAgentMcpRequest);
506
+ logger.info({ route: agentMcpRoute }, "Agent MCP server mounted on main app");
632
507
  }
633
- catch (err) {
634
- throw err;
508
+ else {
509
+ logger.info("Agent MCP HTTP endpoint disabled");
635
510
  }
511
+ const speechService = createSpeechService({
512
+ logger,
513
+ openaiConfig: config.openai,
514
+ speechConfig: config.speech,
515
+ });
516
+ logger.info({ elapsed: elapsed() }, "Speech service created");
517
+ logger.info({ elapsed: elapsed() }, "Bootstrap complete, ready to start listening");
518
+ const start = async () => {
519
+ // Start main HTTP server
520
+ await new Promise((resolve, reject) => {
521
+ const onError = (err) => {
522
+ httpServer.off("listening", onListening);
523
+ reject(err);
524
+ };
525
+ const onListening = () => {
526
+ httpServer.off("error", onError);
527
+ const logAndResolve = async () => {
528
+ boundListenTarget = resolveBoundListenTarget(listenTarget, httpServer);
529
+ const mcpBaseUrl = mcpEnabled ? createAgentMcpBaseUrl(boundListenTarget) : null;
530
+ agentMcpBaseUrl = config.mcpInjectIntoAgents === false ? null : mcpBaseUrl;
531
+ agentManager.setMcpBaseUrl(agentMcpBaseUrl);
532
+ daemonConfigStore.onFieldChange("mcp.injectIntoAgents", (value) => {
533
+ agentManager.setMcpBaseUrl(value ? mcpBaseUrl : null);
534
+ });
535
+ const relayEnabled = config.relayEnabled ?? true;
536
+ const relayEndpoint = config.relayEndpoint ?? "relay.paseo.sh:443";
537
+ const relayPublicEndpoint = config.relayPublicEndpoint ?? relayEndpoint;
538
+ const appBaseUrl = config.appBaseUrl ?? "https://app.paseo.sh";
539
+ if (boundListenTarget.type === "tcp") {
540
+ logger.info({
541
+ host: boundListenTarget.host,
542
+ port: boundListenTarget.port,
543
+ elapsed: elapsed(),
544
+ }, `Server listening on http://${boundListenTarget.host}:${boundListenTarget.port}`);
545
+ }
546
+ else {
547
+ logger.info({ path: boundListenTarget.path, elapsed: elapsed() }, `Server listening on ${boundListenTarget.path}`);
548
+ }
549
+ wsServer = new VoiceAssistantWebSocketServer(httpServer, logger, serverId, agentManager, agentStorage, downloadTokenStore, config.paseoHome, daemonConfigStore, mcpBaseUrl, { allowedOrigins, hostnames: configuredHostnames }, speechService, terminalManager, {
550
+ finalTimeoutMs: config.dictationFinalTimeoutMs,
551
+ }, config.agentProviderSettings, config.providerOverrides, config.isDev === true, daemonVersion, (intent) => {
552
+ try {
553
+ config.onLifecycleIntent?.(intent);
554
+ }
555
+ catch (error) {
556
+ logger.error({ err: error, intent }, "Failed to handle daemon lifecycle intent");
557
+ }
558
+ }, projectRegistry, workspaceRegistry, chatService, loopService, scheduleService, checkoutDiffManager, scriptRouteStore, scriptRuntimeStore, handleBranchChange, () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null), () => (boundListenTarget?.type === "tcp" ? boundListenTarget.host : null), (hostname) => scriptHealthMonitor.getHealthForHostname(hostname), workspaceGitService, github);
559
+ if (typeof process.send === "function" && process.env.PASEO_SUPERVISED === "1") {
560
+ process.send({
561
+ type: "paseo:ready",
562
+ listen: boundListenTarget.type === "tcp"
563
+ ? `${boundListenTarget.host}:${boundListenTarget.port}`
564
+ : boundListenTarget.path,
565
+ });
566
+ }
567
+ if (relayEnabled) {
568
+ const offer = await createConnectionOfferV2({
569
+ serverId,
570
+ daemonPublicKeyB64: daemonKeyPair.publicKeyB64,
571
+ relay: { endpoint: relayPublicEndpoint },
572
+ });
573
+ encodeOfferToFragmentUrl({ offer, appBaseUrl });
574
+ relayTransport?.stop().catch(() => undefined);
575
+ relayTransport = startRelayTransport({
576
+ logger,
577
+ attachSocket: (ws, metadata) => {
578
+ if (!wsServer) {
579
+ throw new Error("WebSocket server not initialized");
580
+ }
581
+ return wsServer.attachExternalSocket(ws, metadata);
582
+ },
583
+ relayEndpoint,
584
+ serverId,
585
+ daemonKeyPair: daemonKeyPair.keyPair,
586
+ });
587
+ }
588
+ };
589
+ logAndResolve().then(resolve, reject);
590
+ };
591
+ httpServer.once("error", onError);
592
+ httpServer.once("listening", onListening);
593
+ if (listenTarget.type === "tcp") {
594
+ httpServer.listen(listenTarget.port, listenTarget.host);
595
+ }
596
+ else {
597
+ if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
598
+ unlinkSync(listenTarget.path);
599
+ }
600
+ httpServer.listen(listenTarget.path);
601
+ }
602
+ });
603
+ // Start speech service after listening so synchronous Sherpa native
604
+ // model loading doesn't block the server from accepting connections.
605
+ speechService.start();
606
+ scriptHealthMonitor.start();
607
+ };
608
+ const stop = async () => {
609
+ scriptHealthMonitor.stop();
610
+ await closeAllAgents(logger, agentManager);
611
+ await agentManager.flush().catch(() => undefined);
612
+ detachAgentStoragePersistence();
613
+ await agentStorage.flush().catch(() => undefined);
614
+ await shutdownProviders(logger, {
615
+ runtimeSettings: config.agentProviderSettings,
616
+ providerOverrides: config.providerOverrides,
617
+ });
618
+ terminalManager.killAll();
619
+ speechService.stop();
620
+ await scheduleService.stop().catch(() => undefined);
621
+ await relayTransport?.stop().catch(() => undefined);
622
+ if (wsServer) {
623
+ await wsServer.close();
624
+ }
625
+ await new Promise((resolve) => {
626
+ httpServer.close(() => resolve());
627
+ });
628
+ // Clean up socket files
629
+ if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
630
+ unlinkSync(listenTarget.path);
631
+ }
632
+ };
633
+ return {
634
+ config,
635
+ agentManager,
636
+ agentStorage,
637
+ terminalManager,
638
+ scriptRouteStore,
639
+ scriptRuntimeStore,
640
+ start,
641
+ stop,
642
+ getListenTarget: () => boundListenTarget,
643
+ };
636
644
  }
637
645
  async function closeAllAgents(logger, agentManager) {
638
646
  const agents = agentManager.listAgents();
639
- for (const agent of agents) {
647
+ await Promise.all(agents.map(async (agent) => {
640
648
  try {
641
649
  await agentManager.closeAgent(agent.id);
642
650
  }
643
651
  catch (err) {
644
652
  logger.error({ err, agentId: agent.id }, "Failed to close agent");
645
653
  }
646
- }
654
+ }));
647
655
  }
648
656
  //# sourceMappingURL=bootstrap.js.map