@camerontaylor/paseo-server 0.8.0-fork.1

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 (928) hide show
  1. package/.env.example +31 -0
  2. package/README.md +111 -0
  3. package/dist/scripts/dev-runner.js +37 -0
  4. package/dist/scripts/mcp-stdio-socket-bridge-cli.mjs +62 -0
  5. package/dist/scripts/supervisor-entrypoint.js +160 -0
  6. package/dist/scripts/supervisor-log-config.js +31 -0
  7. package/dist/scripts/supervisor.js +313 -0
  8. package/dist/server/executable-resolution/executable-resolution.d.ts +10 -0
  9. package/dist/server/executable-resolution/executable-resolution.js +121 -0
  10. package/dist/server/executable-resolution/windows.d.ts +18 -0
  11. package/dist/server/executable-resolution/windows.js +65 -0
  12. package/dist/server/server/agent/activity-curator.d.ts +40 -0
  13. package/dist/server/server/agent/activity-curator.js +243 -0
  14. package/dist/server/server/agent/agent-archive.d.ts +11 -0
  15. package/dist/server/server/agent/agent-archive.js +16 -0
  16. package/dist/server/server/agent/agent-configuration-validator.d.ts +18 -0
  17. package/dist/server/server/agent/agent-configuration-validator.js +42 -0
  18. package/dist/server/server/agent/agent-loading.d.ts +17 -0
  19. package/dist/server/server/agent/agent-loading.js +88 -0
  20. package/dist/server/server/agent/agent-manager.d.ts +555 -0
  21. package/dist/server/server/agent/agent-manager.js +3930 -0
  22. package/dist/server/server/agent/agent-owner.d.ts +12 -0
  23. package/dist/server/server/agent/agent-owner.js +12 -0
  24. package/dist/server/server/agent/agent-projections.d.ts +26 -0
  25. package/dist/server/server/agent/agent-projections.js +414 -0
  26. package/dist/server/server/agent/agent-prompt.d.ts +91 -0
  27. package/dist/server/server/agent/agent-prompt.js +359 -0
  28. package/dist/server/server/agent/agent-response-loop.d.ts +72 -0
  29. package/dist/server/server/agent/agent-response-loop.js +336 -0
  30. package/dist/server/server/agent/agent-run-state.d.ts +76 -0
  31. package/dist/server/server/agent/agent-run-state.js +212 -0
  32. package/dist/server/server/agent/agent-sdk-types.d.ts +742 -0
  33. package/dist/server/server/agent/agent-sdk-types.js +25 -0
  34. package/dist/server/server/agent/agent-storage.d.ts +148 -0
  35. package/dist/server/server/agent/agent-storage.js +401 -0
  36. package/dist/server/server/agent/agent-stream-coalescer.d.ts +43 -0
  37. package/dist/server/server/agent/agent-stream-coalescer.js +187 -0
  38. package/dist/server/server/agent/agent-timeline-content.d.ts +6 -0
  39. package/dist/server/server/agent/agent-timeline-content.js +62 -0
  40. package/dist/server/server/agent/agent-timeline-store-types.d.ts +54 -0
  41. package/dist/server/server/agent/agent-timeline-store-types.js +2 -0
  42. package/dist/server/server/agent/agent-timeline-store.d.ts +31 -0
  43. package/dist/server/server/agent/agent-timeline-store.js +249 -0
  44. package/dist/server/server/agent/audio-utils.d.ts +3 -0
  45. package/dist/server/server/agent/audio-utils.js +19 -0
  46. package/dist/server/server/agent/create-agent/create.d.ts +102 -0
  47. package/dist/server/server/agent/create-agent/create.js +362 -0
  48. package/dist/server/server/agent/create-agent/intent.d.ts +25 -0
  49. package/dist/server/server/agent/create-agent/intent.js +30 -0
  50. package/dist/server/server/agent/create-agent-lifecycle-dispatch.d.ts +65 -0
  51. package/dist/server/server/agent/create-agent-lifecycle-dispatch.js +166 -0
  52. package/dist/server/server/agent/create-agent-mode.d.ts +13 -0
  53. package/dist/server/server/agent/create-agent-mode.js +65 -0
  54. package/dist/server/server/agent/create-agent-title.d.ts +10 -0
  55. package/dist/server/server/agent/create-agent-title.js +34 -0
  56. package/dist/server/server/agent/dictation-debug.d.ts +13 -0
  57. package/dist/server/server/agent/dictation-debug.js +50 -0
  58. package/dist/server/server/agent/import-sessions.d.ts +57 -0
  59. package/dist/server/server/agent/import-sessions.js +240 -0
  60. package/dist/server/server/agent/lifecycle-command.d.ts +73 -0
  61. package/dist/server/server/agent/lifecycle-command.js +99 -0
  62. package/dist/server/server/agent/mcp-server.d.ts +5 -0
  63. package/dist/server/server/agent/mcp-server.js +31 -0
  64. package/dist/server/server/agent/mcp-shared.d.ts +181 -0
  65. package/dist/server/server/agent/mcp-shared.js +199 -0
  66. package/dist/server/server/agent/mutable-provider-config-owner.d.ts +8 -0
  67. package/dist/server/server/agent/mutable-provider-config-owner.js +35 -0
  68. package/dist/server/server/agent/paseo-tool-policy.d.ts +9 -0
  69. package/dist/server/server/agent/paseo-tool-policy.js +16 -0
  70. package/dist/server/server/agent/pcm16-resampler.d.ts +14 -0
  71. package/dist/server/server/agent/pcm16-resampler.js +63 -0
  72. package/dist/server/server/agent/permission-response.d.ts +15 -0
  73. package/dist/server/server/agent/permission-response.js +14 -0
  74. package/dist/server/server/agent/plugin-provider.d.ts +16 -0
  75. package/dist/server/server/agent/plugin-provider.js +1356 -0
  76. package/dist/server/server/agent/prompt-attachments.d.ts +12 -0
  77. package/dist/server/server/agent/prompt-attachments.js +182 -0
  78. package/dist/server/server/agent/provider-history-timestamps.d.ts +2 -0
  79. package/dist/server/server/agent/provider-history-timestamps.js +16 -0
  80. package/dist/server/server/agent/provider-launch-config.d.ts +43 -0
  81. package/dist/server/server/agent/provider-launch-config.js +167 -0
  82. package/dist/server/server/agent/provider-notices.d.ts +4 -0
  83. package/dist/server/server/agent/provider-notices.js +9 -0
  84. package/dist/server/server/agent/provider-options.d.ts +19 -0
  85. package/dist/server/server/agent/provider-options.js +53 -0
  86. package/dist/server/server/agent/provider-refresh-deadline.d.ts +11 -0
  87. package/dist/server/server/agent/provider-refresh-deadline.js +65 -0
  88. package/dist/server/server/agent/provider-registry.d.ts +72 -0
  89. package/dist/server/server/agent/provider-registry.js +604 -0
  90. package/dist/server/server/agent/provider-runtime.d.ts +16 -0
  91. package/dist/server/server/agent/provider-runtime.js +35 -0
  92. package/dist/server/server/agent/provider-session-import.d.ts +10 -0
  93. package/dist/server/server/agent/provider-session-import.js +55 -0
  94. package/dist/server/server/agent/provider-snapshot-manager.d.ts +166 -0
  95. package/dist/server/server/agent/provider-snapshot-manager.js +843 -0
  96. package/dist/server/server/agent/provider-subagents/store.d.ts +68 -0
  97. package/dist/server/server/agent/provider-subagents/store.js +111 -0
  98. package/dist/server/server/agent/providers/acp-agent.d.ts +703 -0
  99. package/dist/server/server/agent/providers/acp-agent.js +3412 -0
  100. package/dist/server/server/agent/providers/claude/agent.d.ts +74 -0
  101. package/dist/server/server/agent/providers/claude/agent.js +5236 -0
  102. package/dist/server/server/agent/providers/claude/feature-definitions.d.ts +8 -0
  103. package/dist/server/server/agent/providers/claude/feature-definitions.js +24 -0
  104. package/dist/server/server/agent/providers/claude/hooks.d.ts +12 -0
  105. package/dist/server/server/agent/providers/claude/hooks.js +20 -0
  106. package/dist/server/server/agent/providers/claude/model-manifest.d.ts +147 -0
  107. package/dist/server/server/agent/providers/claude/model-manifest.js +342 -0
  108. package/dist/server/server/agent/providers/claude/models.d.ts +28 -0
  109. package/dist/server/server/agent/providers/claude/models.js +141 -0
  110. package/dist/server/server/agent/providers/claude/options.d.ts +85 -0
  111. package/dist/server/server/agent/providers/claude/options.js +93 -0
  112. package/dist/server/server/agent/providers/claude/partial-json.d.ts +5 -0
  113. package/dist/server/server/agent/providers/claude/partial-json.js +306 -0
  114. package/dist/server/server/agent/providers/claude/project-dir.d.ts +6 -0
  115. package/dist/server/server/agent/providers/claude/project-dir.js +57 -0
  116. package/dist/server/server/agent/providers/claude/query.d.ts +17 -0
  117. package/dist/server/server/agent/providers/claude/query.js +86 -0
  118. package/dist/server/server/agent/providers/claude/rewind.d.ts +30 -0
  119. package/dist/server/server/agent/providers/claude/rewind.js +30 -0
  120. package/dist/server/server/agent/providers/claude/side-question.d.ts +16 -0
  121. package/dist/server/server/agent/providers/claude/side-question.js +57 -0
  122. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +35 -0
  123. package/dist/server/server/agent/providers/claude/sidechain-tracker.js +392 -0
  124. package/dist/server/server/agent/providers/claude/subagents/live-source.d.ts +161 -0
  125. package/dist/server/server/agent/providers/claude/subagents/live-source.js +415 -0
  126. package/dist/server/server/agent/providers/claude/subagents/observation.d.ts +53 -0
  127. package/dist/server/server/agent/providers/claude/subagents/observation.js +57 -0
  128. package/dist/server/server/agent/providers/claude/subagents/presentation.d.ts +12 -0
  129. package/dist/server/server/agent/providers/claude/subagents/presentation.js +41 -0
  130. package/dist/server/server/agent/providers/claude/subagents/replay-source.d.ts +70 -0
  131. package/dist/server/server/agent/providers/claude/subagents/replay-source.js +305 -0
  132. package/dist/server/server/agent/providers/claude/subagents/workflow-output.d.ts +4 -0
  133. package/dist/server/server/agent/providers/claude/subagents/workflow-output.js +86 -0
  134. package/dist/server/server/agent/providers/claude/subagents/workflow-replay-source.d.ts +38 -0
  135. package/dist/server/server/agent/providers/claude/subagents/workflow-replay-source.js +225 -0
  136. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +37 -0
  137. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +296 -0
  138. package/dist/server/server/agent/providers/claude/task-state.d.ts +18 -0
  139. package/dist/server/server/agent/providers/claude/task-state.js +185 -0
  140. package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.d.ts +24 -0
  141. package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.js +23 -0
  142. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts +3 -0
  143. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +130 -0
  144. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +16 -0
  145. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +129 -0
  146. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +101 -0
  147. package/dist/server/server/agent/providers/codex/app-server-transport.js +290 -0
  148. package/dist/server/server/agent/providers/codex/async-questions.d.ts +18 -0
  149. package/dist/server/server/agent/providers/codex/async-questions.js +135 -0
  150. package/dist/server/server/agent/providers/codex/options.d.ts +59 -0
  151. package/dist/server/server/agent/providers/codex/options.js +82 -0
  152. package/dist/server/server/agent/providers/codex/rewind.d.ts +24 -0
  153. package/dist/server/server/agent/providers/codex/rewind.js +77 -0
  154. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +12 -0
  155. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js +104 -0
  156. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +24 -0
  157. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +909 -0
  158. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +384 -0
  159. package/dist/server/server/agent/providers/codex-app-server-agent.js +5877 -0
  160. package/dist/server/server/agent/providers/codex-feature-definitions.d.ts +11 -0
  161. package/dist/server/server/agent/providers/codex-feature-definitions.js +55 -0
  162. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +26 -0
  163. package/dist/server/server/agent/providers/copilot-acp-agent.js +187 -0
  164. package/dist/server/server/agent/providers/cursor-acp-agent.d.ts +17 -0
  165. package/dist/server/server/agent/providers/cursor-acp-agent.js +31 -0
  166. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +36 -0
  167. package/dist/server/server/agent/providers/diagnostic-utils.js +356 -0
  168. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +55 -0
  169. package/dist/server/server/agent/providers/generic-acp-agent.js +178 -0
  170. package/dist/server/server/agent/providers/gjc-acp-agent.d.ts +155 -0
  171. package/dist/server/server/agent/providers/gjc-acp-agent.js +588 -0
  172. package/dist/server/server/agent/providers/jsonl-frame-decoder.d.ts +17 -0
  173. package/dist/server/server/agent/providers/jsonl-frame-decoder.js +149 -0
  174. package/dist/server/server/agent/providers/jsonl-rpc-process.d.ts +63 -0
  175. package/dist/server/server/agent/providers/jsonl-rpc-process.js +207 -0
  176. package/dist/server/server/agent/providers/kimi-acp-agent.d.ts +35 -0
  177. package/dist/server/server/agent/providers/kimi-acp-agent.js +65 -0
  178. package/dist/server/server/agent/providers/kiro-acp-agent.d.ts +17 -0
  179. package/dist/server/server/agent/providers/kiro-acp-agent.js +78 -0
  180. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +111 -0
  181. package/dist/server/server/agent/providers/mock-load-test-agent.js +1340 -0
  182. package/dist/server/server/agent/providers/mock-slow-provider.d.ts +14 -0
  183. package/dist/server/server/agent/providers/mock-slow-provider.js +40 -0
  184. package/dist/server/server/agent/providers/omp/advisor-message.d.ts +11 -0
  185. package/dist/server/server/agent/providers/omp/advisor-message.js +80 -0
  186. package/dist/server/server/agent/providers/omp/agent.d.ts +178 -0
  187. package/dist/server/server/agent/providers/omp/agent.js +1952 -0
  188. package/dist/server/server/agent/providers/omp/cli-runtime.d.ts +22 -0
  189. package/dist/server/server/agent/providers/omp/cli-runtime.js +208 -0
  190. package/dist/server/server/agent/providers/omp/commands.d.ts +8 -0
  191. package/dist/server/server/agent/providers/omp/commands.js +62 -0
  192. package/dist/server/server/agent/providers/omp/custom-message.d.ts +7 -0
  193. package/dist/server/server/agent/providers/omp/custom-message.js +4 -0
  194. package/dist/server/server/agent/providers/omp/event-mapper.d.ts +13 -0
  195. package/dist/server/server/agent/providers/omp/event-mapper.js +267 -0
  196. package/dist/server/server/agent/providers/omp/history-hooks.d.ts +3 -0
  197. package/dist/server/server/agent/providers/omp/history-hooks.js +13 -0
  198. package/dist/server/server/agent/providers/omp/history.d.ts +19 -0
  199. package/dist/server/server/agent/providers/omp/history.js +306 -0
  200. package/dist/server/server/agent/providers/omp/host-tools.d.ts +14 -0
  201. package/dist/server/server/agent/providers/omp/host-tools.js +196 -0
  202. package/dist/server/server/agent/providers/omp/map-omp-model.d.ts +11 -0
  203. package/dist/server/server/agent/providers/omp/map-omp-model.js +67 -0
  204. package/dist/server/server/agent/providers/omp/message-history.d.ts +38 -0
  205. package/dist/server/server/agent/providers/omp/message-history.js +216 -0
  206. package/dist/server/server/agent/providers/omp/protocol-session.d.ts +13 -0
  207. package/dist/server/server/agent/providers/omp/protocol-session.js +39 -0
  208. package/dist/server/server/agent/providers/omp/provider-config.d.ts +43 -0
  209. package/dist/server/server/agent/providers/omp/provider-config.js +120 -0
  210. package/dist/server/server/agent/providers/omp/rpc-types.d.ts +2040 -0
  211. package/dist/server/server/agent/providers/omp/rpc-types.js +551 -0
  212. package/dist/server/server/agent/providers/omp/rpc-ui-permission-mapper.d.ts +24 -0
  213. package/dist/server/server/agent/providers/omp/rpc-ui-permission-mapper.js +156 -0
  214. package/dist/server/server/agent/providers/omp/runtime.d.ts +85 -0
  215. package/dist/server/server/agent/providers/omp/runtime.js +62 -0
  216. package/dist/server/server/agent/providers/omp/session-descriptor.d.ts +16 -0
  217. package/dist/server/server/agent/providers/omp/session-descriptor.js +389 -0
  218. package/dist/server/server/agent/providers/omp/subagent-card-tracker.d.ts +33 -0
  219. package/dist/server/server/agent/providers/omp/subagent-card-tracker.js +264 -0
  220. package/dist/server/server/agent/providers/omp/subagent-index.d.ts +13 -0
  221. package/dist/server/server/agent/providers/omp/subagent-index.js +111 -0
  222. package/dist/server/server/agent/providers/omp/subagent-title.d.ts +2 -0
  223. package/dist/server/server/agent/providers/omp/subagent-title.js +14 -0
  224. package/dist/server/server/agent/providers/omp/system-notice.d.ts +8 -0
  225. package/dist/server/server/agent/providers/omp/system-notice.js +68 -0
  226. package/dist/server/server/agent/providers/omp/todo-mapper.d.ts +9 -0
  227. package/dist/server/server/agent/providers/omp/todo-mapper.js +52 -0
  228. package/dist/server/server/agent/providers/omp/tool-call-detail.d.ts +110 -0
  229. package/dist/server/server/agent/providers/omp/tool-call-detail.js +288 -0
  230. package/dist/server/server/agent/providers/omp/tool-call-id.d.ts +4 -0
  231. package/dist/server/server/agent/providers/omp/tool-call-id.js +34 -0
  232. package/dist/server/server/agent/providers/omp/tool-call-mapper.d.ts +7 -0
  233. package/dist/server/server/agent/providers/omp/tool-call-mapper.js +98 -0
  234. package/dist/server/server/agent/providers/omp/usage-poller.d.ts +32 -0
  235. package/dist/server/server/agent/providers/omp/usage-poller.js +141 -0
  236. package/dist/server/server/agent/providers/opencode/bridge-plugin.bundle.mjs +14678 -0
  237. package/dist/server/server/agent/providers/opencode/bridge.d.ts +39 -0
  238. package/dist/server/server/agent/providers/opencode/bridge.js +249 -0
  239. package/dist/server/server/agent/providers/opencode/event-consumer.d.ts +60 -0
  240. package/dist/server/server/agent/providers/opencode/event-consumer.js +221 -0
  241. package/dist/server/server/agent/providers/opencode/options.d.ts +156 -0
  242. package/dist/server/server/agent/providers/opencode/options.js +62 -0
  243. package/dist/server/server/agent/providers/opencode/paths.d.ts +2 -0
  244. package/dist/server/server/agent/providers/opencode/paths.js +7 -0
  245. package/dist/server/server/agent/providers/opencode/rewind.d.ts +18 -0
  246. package/dist/server/server/agent/providers/opencode/rewind.js +14 -0
  247. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +101 -0
  248. package/dist/server/server/agent/providers/opencode/server-manager.js +513 -0
  249. package/dist/server/server/agent/providers/opencode/side-question.d.ts +78 -0
  250. package/dist/server/server/agent/providers/opencode/side-question.js +172 -0
  251. package/dist/server/server/agent/providers/opencode/subagent-presentation.d.ts +36 -0
  252. package/dist/server/server/agent/providers/opencode/subagent-presentation.js +62 -0
  253. package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +22 -0
  254. package/dist/server/server/agent/providers/opencode/test-server-manager.js +43 -0
  255. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +3 -0
  256. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +256 -0
  257. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +13 -0
  258. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +53 -0
  259. package/dist/server/server/agent/providers/opencode-agent.d.ts +393 -0
  260. package/dist/server/server/agent/providers/opencode-agent.js +4106 -0
  261. package/dist/server/server/agent/providers/pi/agent.d.ts +164 -0
  262. package/dist/server/server/agent/providers/pi/agent.js +2236 -0
  263. package/dist/server/server/agent/providers/pi/cli-runtime.d.ts +21 -0
  264. package/dist/server/server/agent/providers/pi/cli-runtime.js +177 -0
  265. package/dist/server/server/agent/providers/pi/history-mapper.d.ts +36 -0
  266. package/dist/server/server/agent/providers/pi/history-mapper.js +212 -0
  267. package/dist/server/server/agent/providers/pi/rewind.d.ts +8 -0
  268. package/dist/server/server/agent/providers/pi/rewind.js +8 -0
  269. package/dist/server/server/agent/providers/pi/rpc-types.d.ts +252 -0
  270. package/dist/server/server/agent/providers/pi/rpc-types.js +2 -0
  271. package/dist/server/server/agent/providers/pi/runtime.d.ts +77 -0
  272. package/dist/server/server/agent/providers/pi/runtime.js +65 -0
  273. package/dist/server/server/agent/providers/pi/session-descriptor.d.ts +16 -0
  274. package/dist/server/server/agent/providers/pi/session-descriptor.js +355 -0
  275. package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts +113 -0
  276. package/dist/server/server/agent/providers/pi/tool-call-mapper.js +340 -0
  277. package/dist/server/server/agent/providers/pi/usage-poller.d.ts +32 -0
  278. package/dist/server/server/agent/providers/pi/usage-poller.js +141 -0
  279. package/dist/server/server/agent/providers/provider-image-output.d.ts +25 -0
  280. package/dist/server/server/agent/providers/provider-image-output.js +165 -0
  281. package/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
  282. package/dist/server/server/agent/providers/provider-runner.js +81 -0
  283. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +884 -0
  284. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +778 -0
  285. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +25 -0
  286. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +208 -0
  287. package/dist/server/server/agent/providers/trae-acp-agent.d.ts +15 -0
  288. package/dist/server/server/agent/providers/trae-acp-agent.js +18 -0
  289. package/dist/server/server/agent/recordings-debug.d.ts +3 -0
  290. package/dist/server/server/agent/recordings-debug.js +19 -0
  291. package/dist/server/server/agent/rewind/rewind.d.ts +10 -0
  292. package/dist/server/server/agent/rewind/rewind.js +29 -0
  293. package/dist/server/server/agent/rewind/test-rewind-session.d.ts +48 -0
  294. package/dist/server/server/agent/rewind/test-rewind-session.js +88 -0
  295. package/dist/server/server/agent/runtime-mcp-config.d.ts +14 -0
  296. package/dist/server/server/agent/runtime-mcp-config.js +53 -0
  297. package/dist/server/server/agent/side-conversations/store.d.ts +33 -0
  298. package/dist/server/server/agent/side-conversations/store.js +62 -0
  299. package/dist/server/server/agent/stale-provider-session-error.d.ts +6 -0
  300. package/dist/server/server/agent/stale-provider-session-error.js +11 -0
  301. package/dist/server/server/agent/structured-generation-providers.d.ts +29 -0
  302. package/dist/server/server/agent/structured-generation-providers.js +193 -0
  303. package/dist/server/server/agent/stt-debug.d.ts +10 -0
  304. package/dist/server/server/agent/stt-debug.js +33 -0
  305. package/dist/server/server/agent/stt-manager.d.ts +38 -0
  306. package/dist/server/server/agent/stt-manager.js +246 -0
  307. package/dist/server/server/agent/system-prompt.d.ts +2 -0
  308. package/dist/server/server/agent/system-prompt.js +8 -0
  309. package/dist/server/server/agent/timeline-append.d.ts +10 -0
  310. package/dist/server/server/agent/timeline-append.js +27 -0
  311. package/dist/server/server/agent/timeline-page-bounds.d.ts +19 -0
  312. package/dist/server/server/agent/timeline-page-bounds.js +37 -0
  313. package/dist/server/server/agent/timeline-projection.d.ts +74 -0
  314. package/dist/server/server/agent/timeline-projection.js +467 -0
  315. package/dist/server/server/agent/timeline-prompt-index.d.ts +12 -0
  316. package/dist/server/server/agent/timeline-prompt-index.js +23 -0
  317. package/dist/server/server/agent/tools/paseo-tool-serialization.d.ts +4 -0
  318. package/dist/server/server/agent/tools/paseo-tool-serialization.js +58 -0
  319. package/dist/server/server/agent/tools/paseo-tools.d.ts +62 -0
  320. package/dist/server/server/agent/tools/paseo-tools.js +2445 -0
  321. package/dist/server/server/agent/tools/types.d.ts +39 -0
  322. package/dist/server/server/agent/tools/types.js +2 -0
  323. package/dist/server/server/agent/tts-debug.d.ts +8 -0
  324. package/dist/server/server/agent/tts-debug.js +24 -0
  325. package/dist/server/server/agent/tts-manager.d.ts +41 -0
  326. package/dist/server/server/agent/tts-manager.js +375 -0
  327. package/dist/server/server/agent-attention-policy.d.ts +29 -0
  328. package/dist/server/server/agent-attention-policy.js +36 -0
  329. package/dist/server/server/agent-history-search.d.ts +48 -0
  330. package/dist/server/server/agent-history-search.js +129 -0
  331. package/dist/server/server/atomic-file.d.ts +3 -0
  332. package/dist/server/server/atomic-file.js +19 -0
  333. package/dist/server/server/auth.d.ts +38 -0
  334. package/dist/server/server/auth.js +122 -0
  335. package/dist/server/server/authorization/index.d.ts +18 -0
  336. package/dist/server/server/authorization/index.js +47 -0
  337. package/dist/server/server/authorization/operation-permissions.d.ts +8 -0
  338. package/dist/server/server/authorization/operation-permissions.js +438 -0
  339. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +40 -0
  340. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +64 -0
  341. package/dist/server/server/auto-archive-on-merge/index.d.ts +13 -0
  342. package/dist/server/server/auto-archive-on-merge/index.js +77 -0
  343. package/dist/server/server/bootstrap.d.ts +166 -0
  344. package/dist/server/server/bootstrap.js +1388 -0
  345. package/dist/server/server/browser-tools/broker.d.ts +45 -0
  346. package/dist/server/server/browser-tools/broker.js +390 -0
  347. package/dist/server/server/browser-tools/errors.d.ts +22 -0
  348. package/dist/server/server/browser-tools/errors.js +27 -0
  349. package/dist/server/server/browser-tools/policy.d.ts +10 -0
  350. package/dist/server/server/browser-tools/policy.js +16 -0
  351. package/dist/server/server/browser-tools/tools.d.ts +16 -0
  352. package/dist/server/server/browser-tools/tools.js +796 -0
  353. package/dist/server/server/checkout/status-projection.d.ts +19 -0
  354. package/dist/server/server/checkout/status-projection.js +127 -0
  355. package/dist/server/server/checkout-diff-manager.d.ts +48 -0
  356. package/dist/server/server/checkout-diff-manager.js +284 -0
  357. package/dist/server/server/checkout-git-utils.d.ts +11 -0
  358. package/dist/server/server/checkout-git-utils.js +34 -0
  359. package/dist/server/server/client-message-id.d.ts +3 -0
  360. package/dist/server/server/client-message-id.js +12 -0
  361. package/dist/server/server/config.d.ts +26 -0
  362. package/dist/server/server/config.js +594 -0
  363. package/dist/server/server/connection-offer.d.ts +20 -0
  364. package/dist/server/server/connection-offer.js +59 -0
  365. package/dist/server/server/creation/index.d.ts +41 -0
  366. package/dist/server/server/creation/index.js +250 -0
  367. package/dist/server/server/daemon-config-store.d.ts +63 -0
  368. package/dist/server/server/daemon-config-store.js +524 -0
  369. package/dist/server/server/daemon-keypair.d.ts +8 -0
  370. package/dist/server/server/daemon-keypair.js +42 -0
  371. package/dist/server/server/daemon-version.d.ts +5 -0
  372. package/dist/server/server/daemon-version.js +22 -0
  373. package/dist/server/server/daemon-worker.d.ts +2 -0
  374. package/dist/server/server/daemon-worker.js +287 -0
  375. package/dist/server/server/dictation/dictation-stream-manager.d.ts +88 -0
  376. package/dist/server/server/dictation/dictation-stream-manager.js +578 -0
  377. package/dist/server/server/directory-sync/index.d.ts +45 -0
  378. package/dist/server/server/directory-sync/index.js +98 -0
  379. package/dist/server/server/directory-sync/internal/versioned-collection.d.ts +56 -0
  380. package/dist/server/server/directory-sync/internal/versioned-collection.js +94 -0
  381. package/dist/server/server/exports.d.ts +24 -0
  382. package/dist/server/server/exports.js +24 -0
  383. package/dist/server/server/file-download/token-store.d.ts +24 -0
  384. package/dist/server/server/file-download/token-store.js +40 -0
  385. package/dist/server/server/file-explorer/observer.d.ts +32 -0
  386. package/dist/server/server/file-explorer/observer.js +130 -0
  387. package/dist/server/server/file-explorer/service.d.ts +125 -0
  388. package/dist/server/server/file-explorer/service.js +663 -0
  389. package/dist/server/server/file-observer/index.d.ts +43 -0
  390. package/dist/server/server/file-observer/index.js +114 -0
  391. package/dist/server/server/file-observer/internal/contracts.d.ts +26 -0
  392. package/dist/server/server/file-observer/internal/contracts.js +2 -0
  393. package/dist/server/server/file-observer/internal/linux.d.ts +4 -0
  394. package/dist/server/server/file-observer/internal/linux.js +260 -0
  395. package/dist/server/server/file-observer/internal/native-recursive.d.ts +9 -0
  396. package/dist/server/server/file-observer/internal/native-recursive.js +577 -0
  397. package/dist/server/server/file-observer/internal/observation.d.ts +21 -0
  398. package/dist/server/server/file-observer/internal/observation.js +129 -0
  399. package/dist/server/server/file-observer/internal/paths.d.ts +10 -0
  400. package/dist/server/server/file-observer/internal/paths.js +43 -0
  401. package/dist/server/server/file-upload/index.d.ts +27 -0
  402. package/dist/server/server/file-upload/index.js +158 -0
  403. package/dist/server/server/git-metadata-event-rules.d.ts +123 -0
  404. package/dist/server/server/git-metadata-event-rules.js +152 -0
  405. package/dist/server/server/hostnames.d.ts +13 -0
  406. package/dist/server/server/hostnames.js +94 -0
  407. package/dist/server/server/hub/daemon-executions.d.ts +89 -0
  408. package/dist/server/server/hub/daemon-executions.js +287 -0
  409. package/dist/server/server/hub/execution-controller.d.ts +30 -0
  410. package/dist/server/server/hub/execution-controller.js +220 -0
  411. package/dist/server/server/hub/relationship-controller.d.ts +116 -0
  412. package/dist/server/server/hub/relationship-controller.js +534 -0
  413. package/dist/server/server/hub/relationship-remote.d.ts +68 -0
  414. package/dist/server/server/hub/relationship-remote.js +159 -0
  415. package/dist/server/server/hub/relationship-retry.d.ts +7 -0
  416. package/dist/server/server/hub/relationship-retry.js +15 -0
  417. package/dist/server/server/json-utils.d.ts +11 -0
  418. package/dist/server/server/json-utils.js +45 -0
  419. package/dist/server/server/lifecycle-reasons.d.ts +4 -0
  420. package/dist/server/server/lifecycle-reasons.js +6 -0
  421. package/dist/server/server/logger.d.ts +29 -0
  422. package/dist/server/server/logger.js +127 -0
  423. package/dist/server/server/managed-processes/managed-processes.d.ts +76 -0
  424. package/dist/server/server/managed-processes/managed-processes.js +326 -0
  425. package/dist/server/server/messages.d.ts +9 -0
  426. package/dist/server/server/messages.js +29 -0
  427. package/dist/server/server/migrations/backfill-workspace-id.migration.d.ts +9 -0
  428. package/dist/server/server/migrations/backfill-workspace-id.migration.js +64 -0
  429. package/dist/server/server/orchestration-skills/index.d.ts +18 -0
  430. package/dist/server/server/orchestration-skills/index.js +18 -0
  431. package/dist/server/server/orchestration-skills/internal/controller.d.ts +39 -0
  432. package/dist/server/server/orchestration-skills/internal/controller.js +108 -0
  433. package/dist/server/server/orchestration-skills/internal/operations.d.ts +43 -0
  434. package/dist/server/server/orchestration-skills/internal/operations.js +178 -0
  435. package/dist/server/server/orchestration-skills/internal/paths.d.ts +4 -0
  436. package/dist/server/server/orchestration-skills/internal/paths.js +21 -0
  437. package/dist/server/server/orchestration-skills/internal/selection-store.d.ts +12 -0
  438. package/dist/server/server/orchestration-skills/internal/selection-store.js +39 -0
  439. package/dist/server/server/orchestration-skills/internal/sync.d.ts +21 -0
  440. package/dist/server/server/orchestration-skills/internal/sync.js +177 -0
  441. package/dist/server/server/orchestration-skills/internal/transaction.d.ts +22 -0
  442. package/dist/server/server/orchestration-skills/internal/transaction.js +483 -0
  443. package/dist/server/server/package-version.d.ts +19 -0
  444. package/dist/server/server/package-version.js +60 -0
  445. package/dist/server/server/pagination/cursor.d.ts +16 -0
  446. package/dist/server/server/pagination/cursor.js +62 -0
  447. package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
  448. package/dist/server/server/pagination/sortable-pager.js +68 -0
  449. package/dist/server/server/pairing-offer.d.ts +18 -0
  450. package/dist/server/server/pairing-offer.js +47 -0
  451. package/dist/server/server/pairing-qr.d.ts +2 -0
  452. package/dist/server/server/pairing-qr.js +15 -0
  453. package/dist/server/server/paseo-env.d.ts +13 -0
  454. package/dist/server/server/paseo-env.js +54 -0
  455. package/dist/server/server/paseo-home.d.ts +2 -0
  456. package/dist/server/server/paseo-home.js +19 -0
  457. package/dist/server/server/paseo-worktree-service.d.ts +45 -0
  458. package/dist/server/server/paseo-worktree-service.js +191 -0
  459. package/dist/server/server/path-utils.d.ts +5 -0
  460. package/dist/server/server/path-utils.js +34 -0
  461. package/dist/server/server/persisted-config.d.ts +397 -0
  462. package/dist/server/server/persisted-config.js +411 -0
  463. package/dist/server/server/persistence-hooks.d.ts +32 -0
  464. package/dist/server/server/persistence-hooks.js +96 -0
  465. package/dist/server/server/pid-lock.d.ts +44 -0
  466. package/dist/server/server/pid-lock.js +285 -0
  467. package/dist/server/server/plugins/compiler-imports.d.ts +13 -0
  468. package/dist/server/server/plugins/compiler-imports.js +90 -0
  469. package/dist/server/server/plugins/compiler.d.ts +10 -0
  470. package/dist/server/server/plugins/compiler.js +354 -0
  471. package/dist/server/server/plugins/daemon-transport.d.ts +9 -0
  472. package/dist/server/server/plugins/daemon-transport.js +68 -0
  473. package/dist/server/server/plugins/index.d.ts +102 -0
  474. package/dist/server/server/plugins/index.js +575 -0
  475. package/dist/server/server/plugins/lifecycle/index.d.ts +40 -0
  476. package/dist/server/server/plugins/lifecycle/index.js +200 -0
  477. package/dist/server/server/plugins/managed-source.d.ts +50 -0
  478. package/dist/server/server/plugins/managed-source.js +327 -0
  479. package/dist/server/server/plugins/manifest.d.ts +12 -0
  480. package/dist/server/server/plugins/manifest.js +26 -0
  481. package/dist/server/server/plugins/plugin-process-protocol.d.ts +120 -0
  482. package/dist/server/server/plugins/plugin-process-protocol.js +154 -0
  483. package/dist/server/server/plugins/plugin-process.d.ts +2 -0
  484. package/dist/server/server/plugins/plugin-process.js +419 -0
  485. package/dist/server/server/plugins/plugin-sdk-specifiers.d.ts +5 -0
  486. package/dist/server/server/plugins/plugin-sdk-specifiers.js +23 -0
  487. package/dist/server/server/plugins/plugin-session-identity.d.ts +4 -0
  488. package/dist/server/server/plugins/plugin-session-identity.js +11 -0
  489. package/dist/server/server/plugins/preparation.d.ts +4 -0
  490. package/dist/server/server/plugins/preparation.js +49 -0
  491. package/dist/server/server/plugins/provider-icon.d.ts +2 -0
  492. package/dist/server/server/plugins/provider-icon.js +55 -0
  493. package/dist/server/server/plugins/runtime.d.ts +83 -0
  494. package/dist/server/server/plugins/runtime.js +836 -0
  495. package/dist/server/server/plugins/session-socket.d.ts +23 -0
  496. package/dist/server/server/plugins/session-socket.js +82 -0
  497. package/dist/server/server/plugins/settings/index.d.ts +96 -0
  498. package/dist/server/server/plugins/settings/index.js +115 -0
  499. package/dist/server/server/private-files.d.ts +6 -0
  500. package/dist/server/server/private-files.js +37 -0
  501. package/dist/server/server/process-diagnostics.d.ts +17 -0
  502. package/dist/server/server/process-diagnostics.js +22 -0
  503. package/dist/server/server/project-directory-service.d.ts +30 -0
  504. package/dist/server/server/project-directory-service.js +120 -0
  505. package/dist/server/server/project-key.d.ts +14 -0
  506. package/dist/server/server/project-key.js +44 -0
  507. package/dist/server/server/push/index.d.ts +16 -0
  508. package/dist/server/server/push/index.js +26 -0
  509. package/dist/server/server/push/push-service.d.ts +19 -0
  510. package/dist/server/server/push/push-service.js +66 -0
  511. package/dist/server/server/push/token-store.d.ts +22 -0
  512. package/dist/server/server/push/token-store.js +125 -0
  513. package/dist/server/server/relay-runtime.d.ts +27 -0
  514. package/dist/server/server/relay-runtime.js +46 -0
  515. package/dist/server/server/relay-transport.d.ts +33 -0
  516. package/dist/server/server/relay-transport.js +481 -0
  517. package/dist/server/server/request-receipts/index.d.ts +33 -0
  518. package/dist/server/server/request-receipts/index.js +131 -0
  519. package/dist/server/server/resolve-workspace-id-for-path.d.ts +3 -0
  520. package/dist/server/server/resolve-workspace-id-for-path.js +41 -0
  521. package/dist/server/server/resolve-worktree-creation-intent.d.ts +44 -0
  522. package/dist/server/server/resolve-worktree-creation-intent.js +186 -0
  523. package/dist/server/server/schedule/cron.d.ts +4 -0
  524. package/dist/server/server/schedule/cron.js +83 -0
  525. package/dist/server/server/schedule/service.d.ts +75 -0
  526. package/dist/server/server/schedule/service.js +810 -0
  527. package/dist/server/server/schedule/store.d.ts +27 -0
  528. package/dist/server/server/schedule/store.js +190 -0
  529. package/dist/server/server/script-health-monitor.d.ts +39 -0
  530. package/dist/server/server/script-health-monitor.js +159 -0
  531. package/dist/server/server/script-proxy.d.ts +3 -0
  532. package/dist/server/server/script-proxy.js +2 -0
  533. package/dist/server/server/script-route-branch-handler.d.ts +10 -0
  534. package/dist/server/server/script-route-branch-handler.js +11 -0
  535. package/dist/server/server/script-status-projection.d.ts +36 -0
  536. package/dist/server/server/script-status-projection.js +200 -0
  537. package/dist/server/server/server-id.d.ts +17 -0
  538. package/dist/server/server/server-id.js +68 -0
  539. package/dist/server/server/service-proxy.d.ts +237 -0
  540. package/dist/server/server/service-proxy.js +679 -0
  541. package/dist/server/server/session/agent-config/agent-config-session.d.ts +75 -0
  542. package/dist/server/server/session/agent-config/agent-config-session.js +151 -0
  543. package/dist/server/server/session/agent-updates/agent-updates-service.d.ts +65 -0
  544. package/dist/server/server/session/agent-updates/agent-updates-service.js +266 -0
  545. package/dist/server/server/session/checkout/checkout-session.d.ts +150 -0
  546. package/dist/server/server/session/checkout/checkout-session.js +1187 -0
  547. package/dist/server/server/session/checkout/git-metadata-generator.d.ts +53 -0
  548. package/dist/server/server/session/checkout/git-metadata-generator.js +159 -0
  549. package/dist/server/server/session/daemon/daemon-self-update-session-controller.d.ts +34 -0
  550. package/dist/server/server/session/daemon/daemon-self-update-session-controller.js +90 -0
  551. package/dist/server/server/session/daemon/daemon-self-updater.d.ts +33 -0
  552. package/dist/server/server/session/daemon/daemon-self-updater.js +60 -0
  553. package/dist/server/server/session/daemon/daemon-session.d.ts +90 -0
  554. package/dist/server/server/session/daemon/daemon-session.js +224 -0
  555. package/dist/server/server/session/daemon/diagnostics.d.ts +41 -0
  556. package/dist/server/server/session/daemon/diagnostics.js +431 -0
  557. package/dist/server/server/session/daemon/install-origin.d.ts +7 -0
  558. package/dist/server/server/session/daemon/install-origin.js +64 -0
  559. package/dist/server/server/session/daemon/npm-global-cli.d.ts +29 -0
  560. package/dist/server/server/session/daemon/npm-global-cli.js +98 -0
  561. package/dist/server/server/session/files/workspace-files-session.d.ts +55 -0
  562. package/dist/server/server/session/files/workspace-files-session.js +359 -0
  563. package/dist/server/server/session/git-mutation/git-mutation-service.d.ts +32 -0
  564. package/dist/server/server/session/git-mutation/git-mutation-service.js +74 -0
  565. package/dist/server/server/session/project-config/project-config-session.d.ts +35 -0
  566. package/dist/server/server/session/project-config/project-config-session.js +143 -0
  567. package/dist/server/server/session/project-config/worktree-setup-commit-status.d.ts +6 -0
  568. package/dist/server/server/session/project-config/worktree-setup-commit-status.js +38 -0
  569. package/dist/server/server/session/provider/provider-catalog-session.d.ts +78 -0
  570. package/dist/server/server/session/provider/provider-catalog-session.js +388 -0
  571. package/dist/server/server/session/schedule/schedule-session.d.ts +47 -0
  572. package/dist/server/server/session/schedule/schedule-session.js +188 -0
  573. package/dist/server/server/session/voice/voice-session.d.ts +166 -0
  574. package/dist/server/server/session/voice/voice-session.js +904 -0
  575. package/dist/server/server/session/voice/voice-turn-controller.d.ts +38 -0
  576. package/dist/server/server/session/voice/voice-turn-controller.js +393 -0
  577. package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.d.ts +42 -0
  578. package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.js +170 -0
  579. package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.d.ts +59 -0
  580. package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.js +326 -0
  581. package/dist/server/server/session/workspace-recovery/workspace-recovery-service.d.ts +30 -0
  582. package/dist/server/server/session/workspace-recovery/workspace-recovery-service.js +178 -0
  583. package/dist/server/server/session/workspace-scripts/workspace-scripts-service.d.ts +54 -0
  584. package/dist/server/server/session/workspace-scripts/workspace-scripts-service.js +156 -0
  585. package/dist/server/server/session.d.ts +555 -0
  586. package/dist/server/server/session.js +6540 -0
  587. package/dist/server/server/speech/audio.d.ts +10 -0
  588. package/dist/server/server/speech/audio.js +101 -0
  589. package/dist/server/server/speech/provider-resolver.d.ts +3 -0
  590. package/dist/server/server/speech/provider-resolver.js +7 -0
  591. package/dist/server/server/speech/providers/local/config.d.ts +30 -0
  592. package/dist/server/server/speech/providers/local/config.js +134 -0
  593. package/dist/server/server/speech/providers/local/models.d.ts +12 -0
  594. package/dist/server/server/speech/providers/local/models.js +18 -0
  595. package/dist/server/server/speech/providers/local/runtime.d.ts +31 -0
  596. package/dist/server/server/speech/providers/local/runtime.js +135 -0
  597. package/dist/server/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
  598. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +56 -0
  599. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +74 -0
  600. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +17 -0
  601. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +145 -0
  602. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +49 -0
  603. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +73 -0
  604. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +9 -0
  605. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +107 -0
  606. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts +28 -0
  607. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +137 -0
  608. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +21 -0
  609. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +133 -0
  610. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +18 -0
  611. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  612. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +21 -0
  613. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +101 -0
  614. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts +19 -0
  615. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js +49 -0
  616. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts +38 -0
  617. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js +176 -0
  618. package/dist/server/server/speech/providers/local/worker-bytes.d.ts +4 -0
  619. package/dist/server/server/speech/providers/local/worker-bytes.js +9 -0
  620. package/dist/server/server/speech/providers/local/worker-client.d.ts +93 -0
  621. package/dist/server/server/speech/providers/local/worker-client.js +590 -0
  622. package/dist/server/server/speech/providers/local/worker-process.d.ts +2 -0
  623. package/dist/server/server/speech/providers/local/worker-process.js +270 -0
  624. package/dist/server/server/speech/providers/local/worker-protocol.d.ts +95 -0
  625. package/dist/server/server/speech/providers/local/worker-protocol.js +2 -0
  626. package/dist/server/server/speech/providers/openai/config.d.ts +19 -0
  627. package/dist/server/server/speech/providers/openai/config.js +148 -0
  628. package/dist/server/server/speech/providers/openai/runtime.d.ts +29 -0
  629. package/dist/server/server/speech/providers/openai/runtime.js +102 -0
  630. package/dist/server/server/speech/providers/openai/stt.d.ts +23 -0
  631. package/dist/server/server/speech/providers/openai/stt.js +209 -0
  632. package/dist/server/server/speech/providers/openai/tts.d.ts +19 -0
  633. package/dist/server/server/speech/providers/openai/tts.js +48 -0
  634. package/dist/server/server/speech/speech-config-resolver.d.ts +11 -0
  635. package/dist/server/server/speech/speech-config-resolver.js +132 -0
  636. package/dist/server/server/speech/speech-provider.d.ts +59 -0
  637. package/dist/server/server/speech/speech-provider.js +2 -0
  638. package/dist/server/server/speech/speech-runtime.d.ts +45 -0
  639. package/dist/server/server/speech/speech-runtime.js +571 -0
  640. package/dist/server/server/speech/speech-types.d.ts +22 -0
  641. package/dist/server/server/speech/speech-types.js +8 -0
  642. package/dist/server/server/speech/turn-detection-provider.d.ts +23 -0
  643. package/dist/server/server/speech/turn-detection-provider.js +2 -0
  644. package/dist/server/server/utils/diff-highlighter.d.ts +57 -0
  645. package/dist/server/server/utils/diff-highlighter.js +304 -0
  646. package/dist/server/server/voice-config.d.ts +15 -0
  647. package/dist/server/server/voice-config.js +54 -0
  648. package/dist/server/server/voice-permission-policy.d.ts +4 -0
  649. package/dist/server/server/voice-permission-policy.js +13 -0
  650. package/dist/server/server/voice-types.d.ts +12 -0
  651. package/dist/server/server/voice-types.js +2 -0
  652. package/dist/server/server/watcher-liveness-canary.d.ts +11 -0
  653. package/dist/server/server/watcher-liveness-canary.js +53 -0
  654. package/dist/server/server/web-ui.d.ts +10 -0
  655. package/dist/server/server/web-ui.js +205 -0
  656. package/dist/server/server/websocket/encrypted-relay-socket.d.ts +23 -0
  657. package/dist/server/server/websocket/encrypted-relay-socket.js +64 -0
  658. package/dist/server/server/websocket/physical-socket.d.ts +36 -0
  659. package/dist/server/server/websocket/physical-socket.js +95 -0
  660. package/dist/server/server/websocket/runtime-metrics.d.ts +95 -0
  661. package/dist/server/server/websocket/runtime-metrics.js +148 -0
  662. package/dist/server/server/websocket-server.d.ts +214 -0
  663. package/dist/server/server/websocket-server.js +2258 -0
  664. package/dist/server/server/workspace-archive-service.d.ts +63 -0
  665. package/dist/server/server/workspace-archive-service.js +355 -0
  666. package/dist/server/server/workspace-auto-name.d.ts +55 -0
  667. package/dist/server/server/workspace-auto-name.js +127 -0
  668. package/dist/server/server/workspace-automation-gate.d.ts +16 -0
  669. package/dist/server/server/workspace-automation-gate.js +35 -0
  670. package/dist/server/server/workspace-bootstrap-dedupe.d.ts +34 -0
  671. package/dist/server/server/workspace-bootstrap-dedupe.js +23 -0
  672. package/dist/server/server/workspace-directory.d.ts +99 -0
  673. package/dist/server/server/workspace-directory.js +467 -0
  674. package/dist/server/server/workspace-git-fetch.d.ts +33 -0
  675. package/dist/server/server/workspace-git-fetch.js +108 -0
  676. package/dist/server/server/workspace-git-metadata.d.ts +8 -0
  677. package/dist/server/server/workspace-git-metadata.js +24 -0
  678. package/dist/server/server/workspace-git-service.d.ts +348 -0
  679. package/dist/server/server/workspace-git-service.js +2534 -0
  680. package/dist/server/server/workspace-labels/index.d.ts +14 -0
  681. package/dist/server/server/workspace-labels/index.js +10 -0
  682. package/dist/server/server/workspace-labels/internal/catalog-store.d.ts +50 -0
  683. package/dist/server/server/workspace-labels/internal/catalog-store.js +203 -0
  684. package/dist/server/server/workspace-labels/internal/sequence.d.ts +43 -0
  685. package/dist/server/server/workspace-labels/internal/sequence.js +80 -0
  686. package/dist/server/server/workspace-labels/internal/service.d.ts +57 -0
  687. package/dist/server/server/workspace-labels/internal/service.js +224 -0
  688. package/dist/server/server/workspace-reconciliation-service.d.ts +103 -0
  689. package/dist/server/server/workspace-reconciliation-service.js +379 -0
  690. package/dist/server/server/workspace-registry-bootstrap-legacy.d.ts +21 -0
  691. package/dist/server/server/workspace-registry-bootstrap-legacy.js +57 -0
  692. package/dist/server/server/workspace-registry-bootstrap.d.ts +14 -0
  693. package/dist/server/server/workspace-registry-bootstrap.js +155 -0
  694. package/dist/server/server/workspace-registry-model.d.ts +56 -0
  695. package/dist/server/server/workspace-registry-model.js +150 -0
  696. package/dist/server/server/workspace-registry.d.ts +228 -0
  697. package/dist/server/server/workspace-registry.js +468 -0
  698. package/dist/server/server/workspace-script-runtime-store.d.ts +28 -0
  699. package/dist/server/server/workspace-script-runtime-store.js +78 -0
  700. package/dist/server/server/workspace-service-env.d.ts +18 -0
  701. package/dist/server/server/workspace-service-env.js +85 -0
  702. package/dist/server/server/workspace-service-port-allocator.d.ts +11 -0
  703. package/dist/server/server/workspace-service-port-allocator.js +89 -0
  704. package/dist/server/server/workspace-service-port-registry.d.ts +24 -0
  705. package/dist/server/server/workspace-service-port-registry.js +172 -0
  706. package/dist/server/server/workspace-setup-runtime.d.ts +7 -0
  707. package/dist/server/server/workspace-setup-runtime.js +30 -0
  708. package/dist/server/server/workspace-source.d.ts +7 -0
  709. package/dist/server/server/workspace-source.js +15 -0
  710. package/dist/server/server/worktree/commands.d.ts +55 -0
  711. package/dist/server/server/worktree/commands.js +99 -0
  712. package/dist/server/server/worktree-bootstrap.d.ts +86 -0
  713. package/dist/server/server/worktree-bootstrap.js +753 -0
  714. package/dist/server/server/worktree-branch-name-generator.d.ts +35 -0
  715. package/dist/server/server/worktree-branch-name-generator.js +89 -0
  716. package/dist/server/server/worktree-core.d.ts +32 -0
  717. package/dist/server/server/worktree-core.js +114 -0
  718. package/dist/server/server/worktree-errors.d.ts +12 -0
  719. package/dist/server/server/worktree-errors.js +28 -0
  720. package/dist/server/server/worktree-session.d.ts +165 -0
  721. package/dist/server/server/worktree-session.js +594 -0
  722. package/dist/server/services/forge-cli-command.d.ts +128 -0
  723. package/dist/server/services/forge-cli-command.js +212 -0
  724. package/dist/server/services/forge-registry.d.ts +25 -0
  725. package/dist/server/services/forge-registry.js +155 -0
  726. package/dist/server/services/forge-resolver.d.ts +38 -0
  727. package/dist/server/services/forge-resolver.js +191 -0
  728. package/dist/server/services/forge-service.d.ts +430 -0
  729. package/dist/server/services/forge-service.js +50 -0
  730. package/dist/server/services/gitea-facts.d.ts +11 -0
  731. package/dist/server/services/gitea-facts.js +4 -0
  732. package/dist/server/services/gitea-service.d.ts +62 -0
  733. package/dist/server/services/gitea-service.js +1844 -0
  734. package/dist/server/services/github-facts.d.ts +27 -0
  735. package/dist/server/services/github-facts.js +4 -0
  736. package/dist/server/services/github-service.d.ts +76 -0
  737. package/dist/server/services/github-service.js +3297 -0
  738. package/dist/server/services/gitlab-facts.d.ts +26 -0
  739. package/dist/server/services/gitlab-facts.js +4 -0
  740. package/dist/server/services/gitlab-service.d.ts +43 -0
  741. package/dist/server/services/gitlab-service.js +1092 -0
  742. package/dist/server/services/quota-fetcher/manifest.d.ts +5 -0
  743. package/dist/server/services/quota-fetcher/manifest.js +118 -0
  744. package/dist/server/services/quota-fetcher/provider.d.ts +18 -0
  745. package/dist/server/services/quota-fetcher/provider.js +2 -0
  746. package/dist/server/services/quota-fetcher/providers/claude.d.ts +40 -0
  747. package/dist/server/services/quota-fetcher/providers/claude.js +389 -0
  748. package/dist/server/services/quota-fetcher/providers/codex.d.ts +23 -0
  749. package/dist/server/services/quota-fetcher/providers/codex.js +167 -0
  750. package/dist/server/services/quota-fetcher/providers/copilot.d.ts +21 -0
  751. package/dist/server/services/quota-fetcher/providers/copilot.js +77 -0
  752. package/dist/server/services/quota-fetcher/providers/cursor.d.ts +19 -0
  753. package/dist/server/services/quota-fetcher/providers/cursor.js +185 -0
  754. package/dist/server/services/quota-fetcher/providers/grok.d.ts +23 -0
  755. package/dist/server/services/quota-fetcher/providers/grok.js +137 -0
  756. package/dist/server/services/quota-fetcher/providers/kimi.d.ts +23 -0
  757. package/dist/server/services/quota-fetcher/providers/kimi.js +260 -0
  758. package/dist/server/services/quota-fetcher/providers/minimax.d.ts +29 -0
  759. package/dist/server/services/quota-fetcher/providers/minimax.js +227 -0
  760. package/dist/server/services/quota-fetcher/providers/zai.d.ts +17 -0
  761. package/dist/server/services/quota-fetcher/providers/zai.js +58 -0
  762. package/dist/server/services/quota-fetcher/service.d.ts +34 -0
  763. package/dist/server/services/quota-fetcher/service.js +74 -0
  764. package/dist/server/services/quota-fetcher/usage.d.ts +39 -0
  765. package/dist/server/services/quota-fetcher/usage.js +78 -0
  766. package/dist/server/skills/paseo/SKILL.md +129 -0
  767. package/dist/server/skills/paseo-advisor/SKILL.md +63 -0
  768. package/dist/server/skills/paseo-committee/SKILL.md +46 -0
  769. package/dist/server/skills/paseo-handoff/SKILL.md +65 -0
  770. package/dist/server/skills/paseo-help/SKILL.md +92 -0
  771. package/dist/server/skills/paseo-plugin/SKILL.md +639 -0
  772. package/dist/server/terminal/activity/terminal-activity-tracker.d.ts +21 -0
  773. package/dist/server/terminal/activity/terminal-activity-tracker.js +65 -0
  774. package/dist/server/terminal/agent-hooks/agent-hook-installer.d.ts +62 -0
  775. package/dist/server/terminal/agent-hooks/agent-hook-installer.js +117 -0
  776. package/dist/server/terminal/agent-hooks/claude/claude-settings.d.ts +7 -0
  777. package/dist/server/terminal/agent-hooks/claude/claude-settings.js +88 -0
  778. package/dist/server/terminal/agent-hooks/claude/claude.d.ts +4 -0
  779. package/dist/server/terminal/agent-hooks/claude/claude.js +47 -0
  780. package/dist/server/terminal/agent-hooks/codex/codex-settings.d.ts +7 -0
  781. package/dist/server/terminal/agent-hooks/codex/codex-settings.js +99 -0
  782. package/dist/server/terminal/agent-hooks/codex/codex.d.ts +4 -0
  783. package/dist/server/terminal/agent-hooks/codex/codex.js +30 -0
  784. package/dist/server/terminal/agent-hooks/opencode/opencode-plugin.d.ts +4 -0
  785. package/dist/server/terminal/agent-hooks/opencode/opencode-plugin.js +81 -0
  786. package/dist/server/terminal/agent-hooks/opencode/opencode.d.ts +3 -0
  787. package/dist/server/terminal/agent-hooks/opencode/opencode.js +23 -0
  788. package/dist/server/terminal/agent-hooks/provider-registry.d.ts +24 -0
  789. package/dist/server/terminal/agent-hooks/provider-registry.js +36 -0
  790. package/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.d.ts +10 -0
  791. package/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.js +26 -0
  792. package/dist/server/terminal/shell-integration/zsh/.zshenv +17 -0
  793. package/dist/server/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
  794. package/dist/server/terminal/terminal-capture.d.ts +12 -0
  795. package/dist/server/terminal/terminal-capture.js +43 -0
  796. package/dist/server/terminal/terminal-manager-factory.d.ts +6 -0
  797. package/dist/server/terminal/terminal-manager-factory.js +5 -0
  798. package/dist/server/terminal/terminal-manager.d.ts +80 -0
  799. package/dist/server/terminal/terminal-manager.js +321 -0
  800. package/dist/server/terminal/terminal-output-coalescer.d.ts +34 -0
  801. package/dist/server/terminal/terminal-output-coalescer.js +73 -0
  802. package/dist/server/terminal/terminal-restore.d.ts +18 -0
  803. package/dist/server/terminal/terminal-restore.js +52 -0
  804. package/dist/server/terminal/terminal-session-controller.d.ts +90 -0
  805. package/dist/server/terminal/terminal-session-controller.js +849 -0
  806. package/dist/server/terminal/terminal-size-ownership.d.ts +9 -0
  807. package/dist/server/terminal/terminal-size-ownership.js +23 -0
  808. package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
  809. package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
  810. package/dist/server/terminal/terminal-worker-process.js +308 -0
  811. package/dist/server/terminal/terminal-worker-protocol.d.ts +121 -0
  812. package/dist/server/terminal/terminal-worker-protocol.js +2 -0
  813. package/dist/server/terminal/terminal.d.ts +151 -0
  814. package/dist/server/terminal/terminal.js +1234 -0
  815. package/dist/server/terminal/worker-terminal-manager.d.ts +20 -0
  816. package/dist/server/terminal/worker-terminal-manager.js +688 -0
  817. package/dist/server/utils/build-metadata-prompt.d.ts +19 -0
  818. package/dist/server/utils/build-metadata-prompt.js +29 -0
  819. package/dist/server/utils/checkout-git.d.ts +317 -0
  820. package/dist/server/utils/checkout-git.js +2886 -0
  821. package/dist/server/utils/directory-suggestions.d.ts +29 -0
  822. package/dist/server/utils/directory-suggestions.js +596 -0
  823. package/dist/server/utils/git-command-runtime-metrics.d.ts +67 -0
  824. package/dist/server/utils/git-command-runtime-metrics.js +126 -0
  825. package/dist/server/utils/git-command-trace.d.ts +29 -0
  826. package/dist/server/utils/git-command-trace.js +74 -0
  827. package/dist/server/utils/git-process-scheduler.d.ts +34 -0
  828. package/dist/server/utils/git-process-scheduler.js +112 -0
  829. package/dist/server/utils/git-rev-parse-path.d.ts +3 -0
  830. package/dist/server/utils/git-rev-parse-path.js +21 -0
  831. package/dist/server/utils/paseo-config-file.d.ts +30 -0
  832. package/dist/server/utils/paseo-config-file.js +90 -0
  833. package/dist/server/utils/path.d.ts +27 -0
  834. package/dist/server/utils/path.js +156 -0
  835. package/dist/server/utils/project-custom-icon.d.ts +40 -0
  836. package/dist/server/utils/project-custom-icon.js +144 -0
  837. package/dist/server/utils/project-icon.d.ts +54 -0
  838. package/dist/server/utils/project-icon.js +445 -0
  839. package/dist/server/utils/promise-timeout.d.ts +9 -0
  840. package/dist/server/utils/promise-timeout.js +25 -0
  841. package/dist/server/utils/run-git-command.d.ts +59 -0
  842. package/dist/server/utils/run-git-command.js +393 -0
  843. package/dist/server/utils/spawn.d.ts +26 -0
  844. package/dist/server/utils/spawn.js +60 -0
  845. package/dist/server/utils/ssh-hostname.d.ts +8 -0
  846. package/dist/server/utils/ssh-hostname.js +60 -0
  847. package/dist/server/utils/string-command-shell.d.ts +13 -0
  848. package/dist/server/utils/string-command-shell.js +37 -0
  849. package/dist/server/utils/tree-kill.d.ts +19 -0
  850. package/dist/server/utils/tree-kill.js +77 -0
  851. package/dist/server/utils/windows-command.d.ts +15 -0
  852. package/dist/server/utils/windows-command.js +41 -0
  853. package/dist/server/utils/worktree-metadata.d.ts +77 -0
  854. package/dist/server/utils/worktree-metadata.js +280 -0
  855. package/dist/server/utils/worktree.d.ts +232 -0
  856. package/dist/server/utils/worktree.js +1193 -0
  857. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css +1 -0
  858. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.br +0 -0
  859. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.gz +0 -0
  860. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-29f33408b1a3c5b435c5202d62a36719.js +1 -0
  861. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-29f33408b1a3c5b435c5202d62a36719.js.br +0 -0
  862. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-29f33408b1a3c5b435c5202d62a36719.js.gz +0 -0
  863. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-41547ee520dfff946caa727824742a5c.js +1 -0
  864. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-41547ee520dfff946caa727824742a5c.js.br +0 -0
  865. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-41547ee520dfff946caa727824742a5c.js.gz +0 -0
  866. package/dist/server/web-ui/_expo/static/js/web/index-03b99be4265ac4a2bc5a6d602fd59cc4.js +16819 -0
  867. package/dist/server/web-ui/_expo/static/js/web/index-03b99be4265ac4a2bc5a6d602fd59cc4.js.br +0 -0
  868. package/dist/server/web-ui/_expo/static/js/web/index-03b99be4265ac4a2bc5a6d602fd59cc4.js.gz +0 -0
  869. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-5444610146b0794f1e7d9edad4522d41.js +1 -0
  870. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-5444610146b0794f1e7d9edad4522d41.js.br +0 -0
  871. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-5444610146b0794f1e7d9edad4522d41.js.gz +0 -0
  872. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-88b083190031a44788be59103814f511.js +3 -0
  873. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-88b083190031a44788be59103814f511.js.br +0 -0
  874. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-88b083190031a44788be59103814f511.js.gz +0 -0
  875. package/dist/server/web-ui/apple-touch-icon.png +0 -0
  876. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
  877. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
  878. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
  879. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
  880. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
  881. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
  882. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
  883. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
  884. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
  885. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
  886. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
  887. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
  888. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
  889. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
  890. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
  891. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
  892. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
  893. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
  894. package/dist/server/web-ui/assets/assets/images/favicon-dark-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  895. package/dist/server/web-ui/assets/assets/images/favicon-dark-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  896. package/dist/server/web-ui/assets/assets/images/favicon-dark.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  897. package/dist/server/web-ui/assets/assets/images/favicon-light-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  898. package/dist/server/web-ui/assets/assets/images/favicon-light-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  899. package/dist/server/web-ui/assets/assets/images/favicon-light.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  900. package/dist/server/web-ui/assets/assets/images/notification-icon.3bf81d33ddbf380606bdd248ba83e158.png +0 -0
  901. package/dist/server/web-ui/favicon.ico +0 -0
  902. package/dist/server/web-ui/index.html +90 -0
  903. package/dist/server/web-ui/index.html.br +0 -0
  904. package/dist/server/web-ui/index.html.gz +0 -0
  905. package/dist/server/web-ui/manifest.json +27 -0
  906. package/dist/server/web-ui/manifest.json.br +0 -0
  907. package/dist/server/web-ui/manifest.json.gz +0 -0
  908. package/dist/server/web-ui/metadata.json +1 -0
  909. package/dist/server/web-ui/metadata.json.br +1 -0
  910. package/dist/server/web-ui/metadata.json.gz +0 -0
  911. package/dist/server/web-ui/pwa-icon-192.png +0 -0
  912. package/dist/server/web-ui/pwa-icon-512.png +0 -0
  913. package/dist/server/web-ui/robots.txt +2 -0
  914. package/dist/src/executable-resolution/executable-resolution.js +121 -0
  915. package/dist/src/executable-resolution/windows.js +65 -0
  916. package/dist/src/server/agent/provider-launch-config.js +167 -0
  917. package/dist/src/server/paseo-env.js +54 -0
  918. package/dist/src/server/paseo-home.js +19 -0
  919. package/dist/src/server/persisted-config.js +411 -0
  920. package/dist/src/server/pid-lock.js +285 -0
  921. package/dist/src/server/private-files.js +37 -0
  922. package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  923. package/dist/src/terminal/shell-integration/zsh/.zshenv +17 -0
  924. package/dist/src/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
  925. package/dist/src/utils/spawn.js +60 -0
  926. package/dist/src/utils/tree-kill.js +77 -0
  927. package/dist/src/utils/windows-command.js +41 -0
  928. package/package.json +125 -0
@@ -0,0 +1,1388 @@
1
+ import { describeHookWorkspace } from "./plugins/lifecycle/index.js";
2
+ import express from "express";
3
+ import { createServer as createHTTPServer } from "http";
4
+ import { constants, existsSync, unlinkSync } from "fs";
5
+ import { open, rm } from "fs/promises";
6
+ import { randomUUID } from "node:crypto";
7
+ import { hostname as getHostname } from "node:os";
8
+ import path from "node:path";
9
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
10
+ import { z } from "zod";
11
+ import { createBranchChangeRouteHandler } from "./script-route-branch-handler.js";
12
+ function resolveBoundListenTarget(listenTarget, httpServer) {
13
+ if (listenTarget.type !== "tcp") {
14
+ return listenTarget;
15
+ }
16
+ const address = httpServer.address();
17
+ if (!address || typeof address === "string") {
18
+ throw new Error("HTTP server did not expose a TCP address after listening");
19
+ }
20
+ return {
21
+ type: "tcp",
22
+ host: listenTarget.host,
23
+ port: address.port,
24
+ };
25
+ }
26
+ // Matches a Windows drive-letter path like C:\ or D:\
27
+ const WINDOWS_DRIVE_RE = /^[A-Za-z]:\\/;
28
+ export function parseListenString(listen) {
29
+ // 1. Windows named pipes: \\.\pipe\... or pipe://...
30
+ if (listen.startsWith("\\\\.\\pipe\\") || listen.startsWith("pipe://")) {
31
+ return {
32
+ type: "pipe",
33
+ path: listen.startsWith("pipe://") ? listen.slice("pipe://".length) : listen,
34
+ };
35
+ }
36
+ // 2. Explicit unix:// prefix
37
+ if (listen.startsWith("unix://")) {
38
+ return { type: "socket", path: listen.slice(7) };
39
+ }
40
+ // 3. Reject Windows absolute drive paths — they are not Unix sockets
41
+ if (WINDOWS_DRIVE_RE.test(listen)) {
42
+ throw new Error(`Invalid listen string (Windows path is not a valid listen target): ${listen}`);
43
+ }
44
+ // 4. POSIX absolute path (/ or ~) — Unix socket
45
+ if (listen.startsWith("/") || listen.startsWith("~")) {
46
+ return { type: "socket", path: listen };
47
+ }
48
+ // 5. Pure numeric — TCP port on 127.0.0.1
49
+ const trimmed = listen.trim();
50
+ if (/^\d+$/.test(trimmed)) {
51
+ const port = parseInt(trimmed, 10);
52
+ return { type: "tcp", host: "127.0.0.1", port };
53
+ }
54
+ // 6. host:port — TCP
55
+ if (listen.includes(":")) {
56
+ const lastColonIdx = listen.lastIndexOf(":");
57
+ const host = listen.slice(0, lastColonIdx);
58
+ const portStr = listen.slice(lastColonIdx + 1);
59
+ const parsedPort = parseInt(portStr, 10);
60
+ if (!Number.isFinite(parsedPort)) {
61
+ throw new Error(`Invalid port in listen string: ${listen}`);
62
+ }
63
+ const cleanHost = host.startsWith("[") && host.endsWith("]") ? host.slice(1, -1) : host;
64
+ return { type: "tcp", host: cleanHost || "127.0.0.1", port: parsedPort };
65
+ }
66
+ throw new Error(`Invalid listen string: ${listen}`);
67
+ }
68
+ function formatListenTarget(listenTarget) {
69
+ if (!listenTarget) {
70
+ return null;
71
+ }
72
+ if (listenTarget.type === "tcp") {
73
+ return `${listenTarget.host}:${listenTarget.port}`;
74
+ }
75
+ return listenTarget.path;
76
+ }
77
+ export async function fanOutReconciledWorkspaceUpdates(input) {
78
+ await Promise.all(Array.from(input.sessions, async (session) => {
79
+ try {
80
+ await session.syncWorkspaceGitObserversForExternalWorkspaceIds(input.workspaceIds);
81
+ }
82
+ catch (error) {
83
+ input.logger.warn({ err: error }, "Failed to sync workspace Git observers after reconciliation");
84
+ }
85
+ try {
86
+ await session.emitWorkspaceUpdatesForExternalWorkspaceIds(input.workspaceIds);
87
+ }
88
+ catch (error) {
89
+ input.logger.warn({ err: error }, "Failed to emit workspace updates after reconciliation");
90
+ }
91
+ }));
92
+ }
93
+ import { VoiceAssistantWebSocketServer } from "./websocket-server.js";
94
+ import { WorkspaceSetupRuntime } from "./workspace-setup-runtime.js";
95
+ import { createWorkspaceLabelService } from "./workspace-labels/index.js";
96
+ import { createGitHubService } from "../services/github-service.js";
97
+ import { ProviderUsageService } from "../services/quota-fetcher/service.js";
98
+ import { createPaseoWorktree as createRegisteredPaseoWorktree } from "./paseo-worktree-service.js";
99
+ import { createWorkspaceProvisioningService } from "./session/workspace-provisioning/workspace-provisioning-service.js";
100
+ import { createPaseoWorktreeWorkflow } from "./worktree-session.js";
101
+ import { DownloadTokenStore } from "./file-download/token-store.js";
102
+ import { createSpeechService } from "./speech/speech-runtime.js";
103
+ import { AgentManager } from "./agent/agent-manager.js";
104
+ import { AgentStorage } from "./agent/agent-storage.js";
105
+ import { attachAgentStoragePersistence } from "./persistence-hooks.js";
106
+ import { createAgentMcpServer } from "./agent/mcp-server.js";
107
+ import { createPaseoToolCatalog, } from "./agent/tools/paseo-tools.js";
108
+ import { createAgentProviderRuntime } from "./agent/provider-runtime.js";
109
+ import { bootstrapWorkspaceRegistries } from "./workspace-registry-bootstrap.js";
110
+ import { WorkspaceReconciliationService } from "./workspace-reconciliation-service.js";
111
+ import { FileBackedProjectRegistry, FileBackedWorkspaceRegistry, } from "./workspace-registry.js";
112
+ import { CheckoutDiffManager } from "./checkout-diff-manager.js";
113
+ import { ScheduleService } from "./schedule/service.js";
114
+ import { DaemonConfigStore } from "./daemon-config-store.js";
115
+ import { createOrchestrationSkills } from "./orchestration-skills/index.js";
116
+ import { resolveConfigFromPersisted } from "./config.js";
117
+ import { resolvePaseoToolPolicy } from "./agent/paseo-tool-policy.js";
118
+ import { BrowserToolsBroker } from "./browser-tools/broker.js";
119
+ import { DaemonConfigBrowserToolsPolicy } from "./browser-tools/policy.js";
120
+ import { WorkspaceGitServiceImpl } from "./workspace-git-service.js";
121
+ import { resolveWorkspaceIdForPath } from "./resolve-workspace-id-for-path.js";
122
+ import { archiveByScope, archivePersistedWorkspaceRecord, killTerminalsForWorkspace, } from "./workspace-archive-service.js";
123
+ import { setupAutoArchiveOnMerge } from "./auto-archive-on-merge/index.js";
124
+ import { wrapSessionMessage } from "./messages.js";
125
+ import { createConfiguredTerminalManager } from "../terminal/terminal-manager-factory.js";
126
+ import { applyTerminalAgentHookSetting } from "../terminal/agent-hooks/terminal-agent-hook-setting.js";
127
+ import { loadOrCreateDaemonKeyPair } from "./daemon-keypair.js";
128
+ import { createRelayRuntime } from "./relay-runtime.js";
129
+ import { getOrCreateServerId } from "./server-id.js";
130
+ import { resolveDaemonVersion } from "./daemon-version.js";
131
+ import { loadPersistedConfig } from "./persisted-config.js";
132
+ import { createServiceProxySubsystem } from "./service-proxy.js";
133
+ import { releaseWorkspaceServicePortPlan } from "./workspace-service-port-registry.js";
134
+ import { ScriptHealthMonitor } from "./script-health-monitor.js";
135
+ import { createScriptStatusEmitter } from "./script-status-projection.js";
136
+ import { WorkspaceScriptRuntimeStore } from "./workspace-script-runtime-store.js";
137
+ import { createWorkspaceScriptsService } from "./session/workspace-scripts/workspace-scripts-service.js";
138
+ import { assertWorkspaceAutomationAllowedForWorkspace } from "./workspace-automation-gate.js";
139
+ import { spawnWorkspaceScript } from "./worktree-bootstrap.js";
140
+ import { createManagedProcessRegistry, createSystemManagedProcessTable, } from "./managed-processes/managed-processes.js";
141
+ import { terminateWithTreeKill } from "../utils/tree-kill.js";
142
+ import { isHostnameAllowed } from "./hostnames.js";
143
+ import { createRequireBearerMiddleware, isAgentMcpRequestAuthorized, } from "./auth.js";
144
+ import { createWebUiMiddleware } from "./web-ui.js";
145
+ import { WorkspaceAutoName } from "./workspace-auto-name.js";
146
+ import { createGitMutationService } from "./session/git-mutation/git-mutation-service.js";
147
+ import { workspaceIdsOnCheckout } from "./workspace-directory.js";
148
+ import { configureGitProcessPolicy } from "../utils/run-git-command.js";
149
+ import { resolveGitProcessPolicy } from "../utils/git-process-scheduler.js";
150
+ import { resolveFirstAgentPromptTitle } from "./agent/create-agent-title.js";
151
+ import { createAgentCommand, } from "./agent/create-agent/create.js";
152
+ import { archiveAgentCommand, cancelAgentRunCommand } from "./agent/lifecycle-command.js";
153
+ import { CreateAgentLifecycleDispatch } from "./agent/create-agent-lifecycle-dispatch.js";
154
+ import { HubRelationshipController, } from "./hub/relationship-controller.js";
155
+ import { DirectHubRelationshipRemote, } from "./hub/relationship-remote.js";
156
+ import { DaemonExecutions } from "./hub/daemon-executions.js";
157
+ import { PluginService } from "./plugins/index.js";
158
+ import { ManagedPluginSources } from "./plugins/managed-source.js";
159
+ const MCP_DEBUG_BATCH_LIMIT = 10;
160
+ const MCP_DEBUG_SECRET = "[redacted]";
161
+ const DOWNLOAD_OPEN_FLAGS = process.platform === "win32" ? constants.O_RDONLY : constants.O_RDONLY | constants.O_NOFOLLOW;
162
+ function formatHostForHttpUrl(host) {
163
+ return host.includes(":") && !host.startsWith("[") ? `[${host}]` : host;
164
+ }
165
+ function resolveAgentMcpClientHost(host) {
166
+ if (host === "0.0.0.0") {
167
+ return "127.0.0.1";
168
+ }
169
+ if (host === "::" || host === "[::]") {
170
+ return "::1";
171
+ }
172
+ return host;
173
+ }
174
+ function createAgentMcpBaseUrl(listenTarget) {
175
+ if (!listenTarget || listenTarget.type !== "tcp") {
176
+ return null;
177
+ }
178
+ const host = resolveAgentMcpClientHost(listenTarget.host);
179
+ return new URL("/mcp/agents", `http://${formatHostForHttpUrl(host)}:${listenTarget.port}`).toString();
180
+ }
181
+ function createTerminalActivityUrl(listenTarget) {
182
+ if (!listenTarget || listenTarget.type !== "tcp") {
183
+ return null;
184
+ }
185
+ const host = resolveAgentMcpClientHost(listenTarget.host);
186
+ return new URL("/api/terminal-activity", `http://${formatHostForHttpUrl(host)}:${listenTarget.port}`).toString();
187
+ }
188
+ const TerminalActivityReportSchema = z.object({
189
+ terminalId: z.string().min(1),
190
+ token: z.string().min(1),
191
+ state: z.enum(["running", "idle", "needs-input"]),
192
+ });
193
+ const TERMINAL_ACTIVITY_STATE_MAP = {
194
+ running: "working",
195
+ idle: "idle",
196
+ "needs-input": "attention",
197
+ };
198
+ const LOOPBACK_REMOTE_ADDRESSES = new Set(["127.0.0.1", "::1", "::ffff:127.0.0.1"]);
199
+ function isLoopbackRemoteAddress(remoteAddress) {
200
+ return remoteAddress !== undefined && LOOPBACK_REMOTE_ADDRESSES.has(remoteAddress);
201
+ }
202
+ export function createTerminalActivityRouteHandler(terminalManager) {
203
+ return async (req, res) => {
204
+ if (!isLoopbackRemoteAddress(req.socket.remoteAddress)) {
205
+ res.status(403).json({ error: "Forbidden" });
206
+ return;
207
+ }
208
+ const parsed = TerminalActivityReportSchema.safeParse(req.body);
209
+ if (!parsed.success) {
210
+ res.status(400).json({ error: "Invalid terminal activity report" });
211
+ return;
212
+ }
213
+ const validation = terminalManager.validateTerminalActivityToken(parsed.data.terminalId, parsed.data.token);
214
+ if (validation !== "valid") {
215
+ res.status(403).json({ error: "Forbidden" });
216
+ return;
217
+ }
218
+ try {
219
+ const updated = await terminalManager.setTerminalActivity(parsed.data.terminalId, TERMINAL_ACTIVITY_STATE_MAP[parsed.data.state]);
220
+ if (!updated) {
221
+ res.status(403).json({ error: "Forbidden" });
222
+ return;
223
+ }
224
+ res.status(204).end();
225
+ }
226
+ catch {
227
+ res.status(500).json({ error: "Failed to update terminal activity" });
228
+ }
229
+ };
230
+ }
231
+ function describeMcpRequest(value) {
232
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
233
+ return { shape: value === null ? "null" : typeof value };
234
+ }
235
+ const request = value;
236
+ return {
237
+ shape: "request",
238
+ ...(typeof request.jsonrpc === "string" ? { jsonrpc: request.jsonrpc } : {}),
239
+ ...(typeof request.method === "string" ? { method: request.method } : {}),
240
+ hasId: "id" in request,
241
+ hasParams: "params" in request,
242
+ };
243
+ }
244
+ function describeMcpDebugPayload(value) {
245
+ if (!Array.isArray(value))
246
+ return describeMcpRequest(value);
247
+ const sampled = value.slice(0, MCP_DEBUG_BATCH_LIMIT).map(describeMcpRequest);
248
+ return {
249
+ shape: "batch",
250
+ count: value.length,
251
+ sampled,
252
+ ...(sampled.length < value.length ? { skipped: value.length - sampled.length } : {}),
253
+ };
254
+ }
255
+ function createBootstrapManagedProcessRegistry(config, logger) {
256
+ if (config.managedProcesses) {
257
+ return config.managedProcesses;
258
+ }
259
+ return createManagedProcessRegistry({
260
+ paseoHome: config.paseoHome,
261
+ processTable: createSystemManagedProcessTable(),
262
+ terminateProcess: terminateWithTreeKill,
263
+ logger,
264
+ });
265
+ }
266
+ async function reconcileManagedProcessLedger(managedProcesses, logger) {
267
+ const reapResult = await managedProcesses.reapStale();
268
+ if (reapResult.checked > 0 || reapResult.errors.length > 0) {
269
+ logger.info(reapResult, "Managed helper process ledger reconciled");
270
+ }
271
+ }
272
+ function mountWebUi(app, config, logger) {
273
+ app.use(createWebUiMiddleware({
274
+ enabled: config.webUi?.enabled ?? false,
275
+ distDir: config.webUi?.distDir ?? null,
276
+ label: getHostname(),
277
+ logger,
278
+ }));
279
+ }
280
+ function resolveExpressTrustProxySetting(config) {
281
+ return config.trustedProxies ?? ["loopback"];
282
+ }
283
+ export function createInitialMutableDaemonConfig(config) {
284
+ const providers = config.providerOverrides ?? {};
285
+ const initialConfig = {
286
+ relay: { enabled: config.relayEnabled ?? true },
287
+ mcp: {
288
+ enabled: config.mcpEnabled ?? true,
289
+ injectIntoAgents: config.mcpInjectIntoAgents ?? true,
290
+ },
291
+ ...(config.hostnames !== undefined ? { hostnames: config.hostnames } : {}),
292
+ cors: { allowedOrigins: config.corsAllowedOrigins },
293
+ trustedProxies: config.trustedProxies ?? ["loopback"],
294
+ git: config.git ?? resolveGitProcessPolicy({ env: process.env }),
295
+ app: { baseUrl: config.appBaseUrl ?? "https://app.paseo.sh" },
296
+ ...(config.providerCatalogRefreshTimeoutMs !== undefined
297
+ ? { catalogRefreshTimeoutMs: config.providerCatalogRefreshTimeoutMs }
298
+ : {}),
299
+ browserTools: { enabled: config.browserToolsEnabled ?? false },
300
+ providers,
301
+ metadataGeneration: {
302
+ providers: config.metadataGeneration?.providers ?? [],
303
+ },
304
+ autoArchiveAfterMerge: config.autoArchiveAfterMerge ?? false,
305
+ enableTerminalAgentHooks: config.enableTerminalAgentHooks ?? false,
306
+ appendSystemPrompt: config.appendSystemPrompt ?? "",
307
+ pluginsEnabled: config.pluginsEnabled ?? false,
308
+ plugins: config.plugins ?? {},
309
+ skills: { selection: config.skillSelection },
310
+ };
311
+ if (config.terminalProfiles !== undefined) {
312
+ initialConfig.terminalProfiles = config.terminalProfiles;
313
+ }
314
+ if (config.agentProfiles !== undefined) {
315
+ initialConfig.agentProfiles = config.agentProfiles;
316
+ }
317
+ return initialConfig;
318
+ }
319
+ export async function createPaseoDaemon(config, rootLogger, dependencies = {}) {
320
+ configureGitProcessPolicy(config.git ?? resolveGitProcessPolicy({ env: process.env }));
321
+ const logger = rootLogger.child({ module: "bootstrap" });
322
+ const obsoleteTimelineDirectory = path.join(config.paseoHome, "agent-timelines");
323
+ await rm(obsoleteTimelineDirectory, { recursive: true, force: true }).catch((error) => {
324
+ logger.warn({ err: error, path: obsoleteTimelineDirectory }, "Failed to remove obsolete agent timeline data");
325
+ });
326
+ const bootstrapStart = performance.now();
327
+ const elapsed = () => `${(performance.now() - bootstrapStart).toFixed(0)}ms`;
328
+ const daemonVersion = config.daemonVersion ?? resolveDaemonVersion(import.meta.url);
329
+ const initialMutableConfig = createInitialMutableDaemonConfig(config);
330
+ const daemonConfigStore = new DaemonConfigStore(config.paseoHome, initialMutableConfig, logger, {
331
+ relayEnabledMutable: config.relayEnabledMutable ?? true,
332
+ startupPersisted: config.configReload?.startupPersisted,
333
+ reloadSource: {
334
+ resolve: (persisted) => {
335
+ const reloaded = resolveConfigFromPersisted(config.paseoHome, persisted, {
336
+ env: config.configReload?.env ?? process.env,
337
+ cli: config.configReload?.cli,
338
+ relayEnabledFallback: config.configReload?.relayEnabledFallback,
339
+ });
340
+ return {
341
+ mutable: createInitialMutableDaemonConfig(reloaded),
342
+ overrideControlledPaths: reloaded.configReload?.overrideControlledPaths ?? [],
343
+ };
344
+ },
345
+ },
346
+ });
347
+ const orchestrationSkills = createOrchestrationSkills(daemonConfigStore);
348
+ void orchestrationSkills.autoUpdate().catch((error) => {
349
+ logger.error({ err: error }, "Failed to maintain orchestration skills at startup");
350
+ });
351
+ const browserToolsPolicy = new DaemonConfigBrowserToolsPolicy(daemonConfigStore);
352
+ const browserToolsBroker = new BrowserToolsBroker({});
353
+ const pluginRuntime = new PluginService(logger, daemonConfigStore, daemonVersion, {
354
+ managedSources: new ManagedPluginSources(config.paseoHome),
355
+ settingsDirectory: path.join(config.paseoHome, "plugin-settings"),
356
+ });
357
+ const serverId = getOrCreateServerId(config.paseoHome, { logger });
358
+ const daemonKeyPair = await loadOrCreateDaemonKeyPair(config.paseoHome, logger);
359
+ const managedProcesses = createBootstrapManagedProcessRegistry(config, logger);
360
+ // Reconcile the helper-process ledger in the background so it never blocks the
361
+ // daemon from coming up; terminating a live leftover can take a few seconds.
362
+ // Best-effort, so a failure is logged here rather than crashing startup.
363
+ void reconcileManagedProcessLedger(managedProcesses, logger).catch((error) => {
364
+ logger.warn({ err: error }, "Failed to reconcile managed helper process ledger");
365
+ });
366
+ let relayRuntime = null;
367
+ const staticDir = config.staticDir;
368
+ const downloadTokenTtlMs = config.downloadTokenTtlMs ?? 60000;
369
+ const downloadTokenStore = new DownloadTokenStore({
370
+ ttlMs: downloadTokenTtlMs,
371
+ });
372
+ // Capability token authenticating the daemon's own agents to the loopback
373
+ // Agent MCP endpoint (/mcp/agents). Random per daemon run, injected only into
374
+ // local agent configs and the daemon's own MCP client — never sent to remote
375
+ // clients — so it cannot be replayed off-box. This lets the injected MCP
376
+ // authenticate even when the daemon password is set via the app (hash only,
377
+ // no plaintext available). Mirrors the /api/files/download capability-token
378
+ // pattern.
379
+ const agentMcpAuthToken = randomUUID();
380
+ const listenTarget = parseListenString(config.listen);
381
+ const app = express();
382
+ app.set("trust proxy", resolveExpressTrustProxySetting(config));
383
+ daemonConfigStore.onFieldChange("trustedProxies", (value) => {
384
+ app.set("trust proxy", value ?? ["loopback"]);
385
+ });
386
+ let boundListenTarget = null;
387
+ let workspaceRegistry = null;
388
+ const terminalManager = createConfiguredTerminalManager({
389
+ getTerminalActivityUrl: () => createTerminalActivityUrl(boundListenTarget),
390
+ });
391
+ applyTerminalAgentHookSetting({ store: daemonConfigStore, logger });
392
+ const serviceProxyPublicBaseUrl = config.serviceProxy?.publicBaseUrl
393
+ ? config.serviceProxy.publicBaseUrl
394
+ : null;
395
+ const serviceProxy = createServiceProxySubsystem({
396
+ logger,
397
+ publicBaseUrl: serviceProxyPublicBaseUrl,
398
+ });
399
+ const scriptRuntimeStore = new WorkspaceScriptRuntimeStore();
400
+ const workspaceSetupRuntime = new WorkspaceSetupRuntime();
401
+ let configuredHostnames = config.hostnames ?? config.allowedHosts;
402
+ let appBaseUrl = config.appBaseUrl ?? "https://app.paseo.sh";
403
+ daemonConfigStore.onFieldChange("hostnames", (value) => {
404
+ configuredHostnames = value;
405
+ });
406
+ daemonConfigStore.onFieldChange("app.baseUrl", (value) => {
407
+ appBaseUrl = typeof value === "string" ? value : "https://app.paseo.sh";
408
+ });
409
+ let wsServer = null;
410
+ let serviceProxyListenTarget = null;
411
+ const scriptHealthMonitor = new ScriptHealthMonitor({
412
+ serviceProxy,
413
+ onChange: createScriptStatusEmitter({
414
+ sessions: () => wsServer?.listSessions().map((session) => ({
415
+ emit: (message) => session.emitServerMessage(message),
416
+ })) ?? [],
417
+ serviceProxy,
418
+ runtimeStore: scriptRuntimeStore,
419
+ daemonPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
420
+ resolveWorkspaceDirectory: async (workspaceId) => (await workspaceRegistry?.get(workspaceId))?.cwd ?? null,
421
+ logger,
422
+ serviceProxyPublicBaseUrl,
423
+ }),
424
+ });
425
+ const handleBranchChange = createBranchChangeRouteHandler({
426
+ serviceProxy,
427
+ onRoutesChanged: (workspaceId) => {
428
+ scriptHealthMonitor.invalidateWorkspace(workspaceId);
429
+ },
430
+ logger,
431
+ });
432
+ // Service proxy classifies service hosts before daemon auth/route fallthrough.
433
+ // Registered service hosts proxy directly; known service namespaces without a
434
+ // route return 404 and never reach daemon APIs.
435
+ app.use(serviceProxy.middleware());
436
+ // Host allowlist / DNS rebinding protection (vite-like semantics).
437
+ // For non-TCP (unix sockets), skip host validation.
438
+ if (listenTarget.type === "tcp") {
439
+ app.use((req, res, next) => {
440
+ const hostHeader = typeof req.headers.host === "string" ? req.headers.host : undefined;
441
+ if (!isHostnameAllowed(hostHeader, configuredHostnames)) {
442
+ res.status(403).json({ error: "Invalid Host header" });
443
+ return;
444
+ }
445
+ next();
446
+ });
447
+ }
448
+ // CORS - allow same-origin + configured origins
449
+ const fixedAllowedOrigins = [
450
+ // Packaged desktop renderers use the custom paseo:// protocol scheme.
451
+ "paseo://app",
452
+ // For TCP, add localhost variants
453
+ ...(listenTarget.type === "tcp"
454
+ ? [
455
+ `http://${listenTarget.host}:${listenTarget.port}`,
456
+ `http://localhost:${listenTarget.port}`,
457
+ `http://127.0.0.1:${listenTarget.port}`,
458
+ ]
459
+ : []),
460
+ ];
461
+ const allowedOrigins = new Set([...config.corsAllowedOrigins, ...fixedAllowedOrigins]);
462
+ daemonConfigStore.onFieldChange("cors.allowedOrigins", (value) => {
463
+ allowedOrigins.clear();
464
+ for (const origin of [...(value ?? []), ...fixedAllowedOrigins]) {
465
+ allowedOrigins.add(origin);
466
+ }
467
+ });
468
+ app.use((req, res, next) => {
469
+ const origin = req.headers.origin;
470
+ if (origin && (allowedOrigins.has("*") || allowedOrigins.has(origin))) {
471
+ res.setHeader("Access-Control-Allow-Origin", origin);
472
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
473
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
474
+ res.setHeader("Access-Control-Allow-Credentials", "true");
475
+ }
476
+ if (req.method === "OPTIONS") {
477
+ res.status(204).end();
478
+ return;
479
+ }
480
+ next();
481
+ });
482
+ // Local, harmless, and token-gated; deliberately skips daemon auth.
483
+ app.post("/api/terminal-activity", express.json(), createTerminalActivityRouteHandler(terminalManager));
484
+ // Serve the bundled browser web UI when enabled. Mounted after service-proxy
485
+ // classification and host/CORS handling, but before daemon bearer auth, so
486
+ // static app files load without the daemon password while API/WebSocket calls
487
+ // remain protected.
488
+ mountWebUi(app, config, logger);
489
+ app.use(createRequireBearerMiddleware(config.auth, (context) => {
490
+ logger.warn(context, "Rejected HTTP request with invalid daemon password");
491
+ }));
492
+ app.use(express.json());
493
+ // Serve static files from public directory
494
+ app.use("/public", express.static(staticDir));
495
+ // Health check endpoint
496
+ app.get("/api/health", (_req, res) => {
497
+ res.json({ status: "ok", timestamp: new Date().toISOString() });
498
+ });
499
+ app.get("/api/status", (_req, res) => {
500
+ res.json({
501
+ status: "server_info",
502
+ serverId,
503
+ hostname: getHostname(),
504
+ version: daemonVersion,
505
+ listen: formatListenTarget(boundListenTarget ?? listenTarget),
506
+ });
507
+ });
508
+ const handleFileDownload = async (req, res) => {
509
+ const token = typeof req.query.token === "string" && req.query.token.trim().length > 0
510
+ ? req.query.token.trim()
511
+ : null;
512
+ if (!token) {
513
+ res.status(400).json({ error: "Missing download token" });
514
+ return;
515
+ }
516
+ const entry = downloadTokenStore.consumeToken(token);
517
+ if (!entry) {
518
+ res.status(403).json({ error: "Invalid or expired token" });
519
+ return;
520
+ }
521
+ let fileHandle = null;
522
+ try {
523
+ fileHandle = await open(entry.absolutePath, DOWNLOAD_OPEN_FLAGS);
524
+ const fileStats = await fileHandle.stat();
525
+ if (!fileStats.isFile()) {
526
+ res.status(404).json({ error: "File not found" });
527
+ return;
528
+ }
529
+ const safeFileName = entry.fileName.replace(/["\r\n]/g, "_");
530
+ res.setHeader("Content-Type", entry.mimeType);
531
+ res.setHeader("Content-Disposition", `attachment; filename="${safeFileName}"`);
532
+ res.setHeader("Content-Length", fileStats.size.toString());
533
+ const stream = fileHandle.createReadStream();
534
+ fileHandle = null;
535
+ stream.on("error", (err) => {
536
+ logger.error({ err }, "Failed to stream download");
537
+ if (!res.headersSent) {
538
+ res.status(500).json({ error: "Failed to read file" });
539
+ }
540
+ else {
541
+ res.end();
542
+ }
543
+ });
544
+ stream.pipe(res);
545
+ }
546
+ catch (err) {
547
+ logger.error({ err }, "Failed to download file");
548
+ if (!res.headersSent) {
549
+ res.status(404).json({ error: "File not found" });
550
+ }
551
+ }
552
+ finally {
553
+ await fileHandle?.close().catch(() => undefined);
554
+ }
555
+ };
556
+ app.get("/api/files/download", (req, res) => {
557
+ void handleFileDownload(req, res);
558
+ });
559
+ const httpServer = createHTTPServer(app);
560
+ // Script proxy WebSocket upgrade handler — must be registered before the
561
+ // VoiceAssistantWebSocketServer attaches its own "upgrade" listener so that
562
+ // script-bound upgrades are forwarded first. The handler is a no-op for
563
+ // requests that don't match a registered script route.
564
+ httpServer.on("upgrade", serviceProxy.upgradeHandler({ passthroughUnknown: true }));
565
+ if (config.serviceProxy?.standaloneListen) {
566
+ serviceProxyListenTarget = parseListenString(config.serviceProxy.standaloneListen);
567
+ }
568
+ const agentStorage = new AgentStorage(config.agentStoragePath, logger);
569
+ const projectRegistry = new FileBackedProjectRegistry(path.join(config.paseoHome, "projects", "projects.json"), logger);
570
+ workspaceRegistry = new FileBackedWorkspaceRegistry(path.join(config.paseoHome, "projects", "workspaces.json"), logger);
571
+ const workspaceLabelService = createWorkspaceLabelService({
572
+ paseoHome: config.paseoHome,
573
+ workspaceRegistry,
574
+ });
575
+ const github = createGitHubService();
576
+ const workspaceGitService = new WorkspaceGitServiceImpl({
577
+ logger,
578
+ paseoHome: config.paseoHome,
579
+ worktreesRoot: config.worktreesRoot,
580
+ deps: {
581
+ forgeOverrides: { github },
582
+ },
583
+ });
584
+ workspaceRegistry.subscribeToMutations((mutation) => {
585
+ if (mutation.kind === "archive" && mutation.workspace) {
586
+ pluginRuntime.emit("workspace.archived", {
587
+ workspace: describeHookWorkspace(mutation.workspace),
588
+ });
589
+ }
590
+ });
591
+ const workspaceProvisioning = createWorkspaceProvisioningService({
592
+ lifecycle: pluginRuntime,
593
+ serverId,
594
+ projectRegistry,
595
+ workspaceRegistry,
596
+ workspaceGitService,
597
+ logger,
598
+ });
599
+ const agentProviderRuntime = await createAgentProviderRuntime({
600
+ paseoHome: config.paseoHome,
601
+ logger,
602
+ snapshotManager: {
603
+ refreshTimeoutMs: config.providerCatalogRefreshTimeoutMs,
604
+ runtimeSettings: config.agentProviderSettings,
605
+ providerOverrides: config.providerOverrides,
606
+ workspaceGitService,
607
+ managedProcesses,
608
+ isDev: config.isDev === true,
609
+ extraClients: config.agentClients,
610
+ },
611
+ });
612
+ const providerSnapshotManager = agentProviderRuntime.snapshotManager;
613
+ daemonConfigStore.onFieldChange("catalogRefreshTimeoutMs", (value) => {
614
+ providerSnapshotManager.setRefreshTimeoutMs(typeof value === "number" ? value : undefined);
615
+ });
616
+ daemonConfigStore.onFieldChange("git.maxProcessesPerSecond", () => {
617
+ const git = daemonConfigStore.get().git;
618
+ if (git)
619
+ configureGitProcessPolicy(git);
620
+ });
621
+ daemonConfigStore.onFieldChange("git.maxProcessConcurrency", () => {
622
+ const git = daemonConfigStore.get().git;
623
+ if (git)
624
+ configureGitProcessPolicy(git);
625
+ });
626
+ const initialAgentManagerState = providerSnapshotManager.getAgentManagerProviderState();
627
+ const agentManager = new AgentManager({
628
+ pluginLifecycle: pluginRuntime,
629
+ clients: initialAgentManagerState.clients,
630
+ providerDefinitions: initialAgentManagerState.providerDefinitions,
631
+ registry: agentStorage,
632
+ appendSystemPrompt: config.appendSystemPrompt,
633
+ onWorkspaceStateMayHaveChanged: ({ cwd }) => {
634
+ workspaceGitService.onWorkspaceStateMayHaveChanged(cwd);
635
+ },
636
+ mcpAuthToken: agentMcpAuthToken,
637
+ resolvePaseoToolPolicy: (provider) => resolvePaseoToolPolicy(provider, daemonConfigStore.get().providers),
638
+ logger,
639
+ });
640
+ const syncPluginProviders = () => {
641
+ agentManager.updateProviderRegistry(providerSnapshotManager.replacePluginProviders(pluginRuntime.getProviderRegistrations()));
642
+ };
643
+ const unsubscribePluginProviders = pluginRuntime.subscribeProviderRegistrations(syncPluginProviders);
644
+ const detachAgentStoragePersistence = attachAgentStoragePersistence(logger, agentManager, agentStorage);
645
+ await agentStorage.initialize();
646
+ logger.info({ elapsed: elapsed() }, "Agent storage initialized");
647
+ await bootstrapWorkspaceRegistries({
648
+ serverId,
649
+ paseoHome: config.paseoHome,
650
+ agentStorage,
651
+ projectRegistry,
652
+ workspaceRegistry,
653
+ workspaceGitService,
654
+ logger,
655
+ });
656
+ await workspaceLabelService.initialize();
657
+ logger.info({ elapsed: elapsed() }, "Workspace registries bootstrapped");
658
+ const teardownArchivedWorkspaceRuntime = (workspaceId) => {
659
+ scriptRuntimeStore.removeForWorkspace(workspaceId);
660
+ releaseWorkspaceServicePortPlan(workspaceId);
661
+ };
662
+ const workspaceReconciliation = new WorkspaceReconciliationService({
663
+ serverId,
664
+ projectRegistry,
665
+ workspaceRegistry,
666
+ logger,
667
+ workspaceGitService,
668
+ onProjectUpdate: (update) => wsServer?.publishProjectUpdate(update),
669
+ onWorkspaceArchived: teardownArchivedWorkspaceRuntime,
670
+ onWorkspacesChanged: async (workspaceIds) => {
671
+ await fanOutReconciledWorkspaceUpdates({
672
+ sessions: wsServer?.listSessions() ?? [],
673
+ workspaceIds,
674
+ logger,
675
+ });
676
+ },
677
+ });
678
+ await workspaceReconciliation.start();
679
+ void workspaceReconciliation.reconcileNow().catch((error) => {
680
+ logger.warn({ err: error }, "Initial workspace reconciliation failed");
681
+ });
682
+ const checkoutDiffManager = new CheckoutDiffManager({
683
+ logger,
684
+ paseoHome: config.paseoHome,
685
+ workspaceGitService,
686
+ });
687
+ const archiveWorkspaceRecordExternal = async (workspaceId, context) => {
688
+ const existingWorkspace = await archivePersistedWorkspaceRecord({
689
+ workspaceId,
690
+ workspaceRegistry,
691
+ context,
692
+ });
693
+ if (!existingWorkspace || existingWorkspace.archivedAt)
694
+ return;
695
+ teardownArchivedWorkspaceRuntime(workspaceId);
696
+ };
697
+ // external path→workspace adapter, not ownership: archive-by-path requests that
698
+ // arrive with a worktree path and no workspaceId (old clients / CLI).
699
+ const findWorkspaceIdForCwdExternal = async (cwd) => {
700
+ return resolveWorkspaceIdForPath(cwd, await workspaceRegistry.list());
701
+ };
702
+ const ensureWorkspaceForCreateExternal = async (cwd, firstAgentContext) => {
703
+ const workspace = await workspaceProvisioning.createWorkspaceForDirectory(cwd, resolveFirstAgentPromptTitle(firstAgentContext));
704
+ if (firstAgentContext) {
705
+ workspaceAutoName.scheduleForDirectory({
706
+ workspaceId: workspace.workspaceId,
707
+ cwd: workspace.cwd,
708
+ firstAgentContext,
709
+ });
710
+ }
711
+ return workspace.workspaceId;
712
+ };
713
+ const listActiveWorkspacesExternal = async () => {
714
+ const workspaces = await workspaceRegistry.list();
715
+ return workspaces
716
+ .filter((workspace) => !workspace.archivedAt)
717
+ .map((workspace) => ({
718
+ workspaceId: workspace.workspaceId,
719
+ cwd: workspace.cwd,
720
+ kind: workspace.kind,
721
+ worktreeRoot: workspace.worktreeRoot,
722
+ isPaseoOwnedWorktree: workspace.isPaseoOwnedWorktree,
723
+ mainRepoRoot: workspace.mainRepoRoot,
724
+ }));
725
+ };
726
+ const markWorkspaceArchivingExternal = (workspaceIds, archivingAt) => {
727
+ const workspaceIdList = Array.from(workspaceIds);
728
+ for (const session of wsServer?.listSessions() ?? []) {
729
+ session.markWorkspaceArchivingForExternalMutation(workspaceIdList, archivingAt);
730
+ }
731
+ };
732
+ const clearWorkspaceArchivingExternal = (workspaceIds) => {
733
+ const workspaceIdList = Array.from(workspaceIds);
734
+ for (const session of wsServer?.listSessions() ?? []) {
735
+ session.clearWorkspaceArchivingForExternalMutation(workspaceIdList);
736
+ }
737
+ };
738
+ const emitWorkspaceUpdatesExternal = async (workspaceIds) => {
739
+ const workspaceIdList = Array.from(workspaceIds);
740
+ await Promise.all((wsServer?.listSessions() ?? []).map((session) => session.emitWorkspaceUpdatesForExternalWorkspaceIds(workspaceIdList)));
741
+ };
742
+ const ensureWorkspaceForCreateAndBroadcastExternal = async (cwd, firstAgentContext) => {
743
+ const workspaceId = await ensureWorkspaceForCreateExternal(cwd, firstAgentContext);
744
+ await emitWorkspaceUpdatesExternal([workspaceId]);
745
+ return workspaceId;
746
+ };
747
+ const emitWorkspaceUpdateForCwdExternal = async (cwd) => {
748
+ const workspaceIds = workspaceIdsOnCheckout(await workspaceRegistry.list(), cwd);
749
+ await emitWorkspaceUpdatesExternal(workspaceIds);
750
+ };
751
+ const emitExternalSessionMessage = (message) => {
752
+ wsServer?.broadcast(wrapSessionMessage(message));
753
+ };
754
+ const workspaceAutoName = new WorkspaceAutoName({
755
+ agentManager,
756
+ workspaceRegistry,
757
+ workspaceGitService,
758
+ providerSnapshotManager,
759
+ readDaemonConfig: () => ({ metadataGeneration: daemonConfigStore.get().metadataGeneration }),
760
+ gitMutation: createGitMutationService({
761
+ workspaceGitService,
762
+ logger,
763
+ }),
764
+ emitWorkspaceUpdateForCwd: emitWorkspaceUpdateForCwdExternal,
765
+ emitWorkspaceUpdateForWorkspaceId: async (workspaceId) => {
766
+ await emitWorkspaceUpdatesExternal([workspaceId]);
767
+ },
768
+ logger,
769
+ });
770
+ setupAutoArchiveOnMerge({
771
+ paseoHome: config.paseoHome,
772
+ paseoWorktreesBaseRoot: config.worktreesRoot,
773
+ daemonConfigStore,
774
+ workspaceGitService,
775
+ github,
776
+ agentManager,
777
+ agentStorage,
778
+ terminalManager,
779
+ logger,
780
+ findWorkspaceIdForCwd: findWorkspaceIdForCwdExternal,
781
+ listActiveWorkspaces: listActiveWorkspacesExternal,
782
+ getAutoArchivedChangeRequestUrl: async (workspaceId) => (await workspaceRegistry.get(workspaceId))?.autoArchivedChangeRequestUrl ?? null,
783
+ archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
784
+ markWorkspaceArchiving: markWorkspaceArchivingExternal,
785
+ clearWorkspaceArchiving: clearWorkspaceArchivingExternal,
786
+ emitWorkspaceUpdatesForWorkspaceIds: emitWorkspaceUpdatesExternal,
787
+ });
788
+ const createPaseoWorktreeForTools = async (input, serviceOptions) => {
789
+ return createPaseoWorktreeWorkflow({
790
+ paseoHome: config.paseoHome,
791
+ worktreesRoot: config.worktreesRoot,
792
+ createPaseoWorktree: async (workflowInput, workflowOptions) => {
793
+ return createRegisteredPaseoWorktree(workflowInput, {
794
+ github,
795
+ ...(workflowOptions?.resolveDefaultBranch
796
+ ? {
797
+ resolveDefaultBranch: workflowOptions.resolveDefaultBranch,
798
+ }
799
+ : {}),
800
+ workspaceGitService,
801
+ workspaceProvisioning,
802
+ });
803
+ },
804
+ warmWorkspaceGitData: async (workspace) => {
805
+ await Promise.all(wsServer
806
+ ?.listSessions()
807
+ .map((session) => session.warmWorkspaceGitDataForWorkspace(workspace)) ?? []);
808
+ },
809
+ autoNameWorkspaceBranchForFirstAgent: (autoNameInput) => workspaceAutoName.scheduleForWorktree(autoNameInput),
810
+ emitWorkspaceUpdateForWorkspaceId: async (workspaceId) => {
811
+ await emitWorkspaceUpdatesExternal([workspaceId]);
812
+ },
813
+ cacheWorkspaceSetupSnapshot: () => { },
814
+ startWorkspaceSetup: (workspaceId, operation) => workspaceSetupRuntime.start(workspaceId, operation),
815
+ assertWorkspaceAutomationAllowed: (guardedWorkspaceId) => assertWorkspaceAutomationAllowedForWorkspace(workspaceRegistry, guardedWorkspaceId),
816
+ emit: emitExternalSessionMessage,
817
+ sessionLogger: logger,
818
+ terminalManager,
819
+ archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
820
+ serviceProxy,
821
+ scriptRuntimeStore,
822
+ getDaemonTcpPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
823
+ getDaemonTcpHost: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.host : null),
824
+ serviceProxyPublicBaseUrl,
825
+ onScriptsChanged: null,
826
+ }, input, serviceOptions);
827
+ };
828
+ const createAgentCommandDependencies = {
829
+ agentManager,
830
+ agentStorage,
831
+ logger,
832
+ paseoHome: config.paseoHome,
833
+ worktreesRoot: config.worktreesRoot,
834
+ terminalManager,
835
+ providerSnapshotManager,
836
+ createPaseoWorktree: createPaseoWorktreeForTools,
837
+ ensureWorkspaceForCreate: ensureWorkspaceForCreateAndBroadcastExternal,
838
+ };
839
+ const createAgent = (input) => createAgentCommand(createAgentCommandDependencies, input);
840
+ const archiveWorkspaceByIdExternal = (workspaceId, requestId) => archiveByScope({
841
+ paseoHome: config.paseoHome,
842
+ paseoWorktreesBaseRoot: config.worktreesRoot,
843
+ github,
844
+ workspaceGitService,
845
+ agentManager,
846
+ agentStorage,
847
+ findWorkspaceIdForCwd: findWorkspaceIdForCwdExternal,
848
+ listActiveWorkspaces: listActiveWorkspacesExternal,
849
+ getWorkspace: (workspaceIdToGet) => workspaceRegistry.get(workspaceIdToGet),
850
+ archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
851
+ emitWorkspaceUpdatesForWorkspaceIds: emitWorkspaceUpdatesExternal,
852
+ markWorkspaceArchiving: markWorkspaceArchivingExternal,
853
+ clearWorkspaceArchiving: clearWorkspaceArchivingExternal,
854
+ killTerminalsForWorkspace: (workspaceIdToKill) => killTerminalsForWorkspace({ terminalManager, sessionLogger: logger }, workspaceIdToKill),
855
+ stopWorkspaceSetup: (workspaceIdToStop) => workspaceSetupRuntime.stop(workspaceIdToStop),
856
+ assertWorkspaceAutomationAllowed: (guardedWorkspaceId) => assertWorkspaceAutomationAllowedForWorkspace(workspaceRegistry, guardedWorkspaceId),
857
+ sessionLogger: logger,
858
+ }, { scope: { kind: "workspace", workspaceId }, requestId });
859
+ const hubAgentLifecycle = new CreateAgentLifecycleDispatch({
860
+ paseoHome: config.paseoHome,
861
+ worktreesRoot: config.worktreesRoot,
862
+ agentManager,
863
+ agentStorage,
864
+ github,
865
+ workspaceGitService,
866
+ createPaseoWorktreeWorkflow: createPaseoWorktreeForTools,
867
+ archiveAgentForClose: (agentId) => archiveAgentCommand({ agentManager, agentStorage, logger }, agentId),
868
+ findWorkspaceIdForCwd: findWorkspaceIdForCwdExternal,
869
+ listActiveWorkspaces: listActiveWorkspacesExternal,
870
+ archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
871
+ emit: emitExternalSessionMessage,
872
+ emitAgentRemove: async () => undefined,
873
+ emitWorkspaceUpdatesForWorkspaceIds: emitWorkspaceUpdatesExternal,
874
+ markWorkspaceArchiving: markWorkspaceArchivingExternal,
875
+ clearWorkspaceArchiving: clearWorkspaceArchivingExternal,
876
+ killTerminalsForWorkspace: (workspaceId) => killTerminalsForWorkspace({ terminalManager, sessionLogger: logger }, workspaceId),
877
+ logger,
878
+ });
879
+ const hubRelationships = new HubRelationshipController({
880
+ paseoHome: config.paseoHome,
881
+ hostname: getHostname(),
882
+ serverId,
883
+ daemonPublicKey: daemonKeyPair.publicKeyB64,
884
+ logger,
885
+ remote: dependencies.hubRelationshipRemote ?? new DirectHubRelationshipRemote(),
886
+ clock: dependencies.hubRelationshipClock,
887
+ retryPolicy: dependencies.hubRelationshipRetryPolicy,
888
+ createDaemonId: dependencies.createHubDaemonId,
889
+ attachSocket: async (socket, options) => {
890
+ if (!wsServer)
891
+ throw new Error("WebSocket server is not running");
892
+ await wsServer.attachExternalSocket(socket, { transport: "hub", hubDaemonId: options.daemonId }, {
893
+ principalId: options.principalId,
894
+ permissions: options.permissions,
895
+ hubExecutionAgents: options.agents,
896
+ }, options.sessionProtocol === "legacy"
897
+ ? {
898
+ type: "hello",
899
+ clientId: `hub:${options.daemonId}`,
900
+ clientType: "hub",
901
+ protocolVersion: 1,
902
+ }
903
+ : undefined);
904
+ },
905
+ updateAttachedPermissions: (principalId, permissions) => {
906
+ if (!wsServer)
907
+ throw new Error("WebSocket server is not running");
908
+ wsServer.updatePrincipalPermissions(principalId, permissions);
909
+ },
910
+ createExecutionAgents: (daemonId) => new DaemonExecutions({
911
+ daemonId,
912
+ agentManager,
913
+ agentStorage,
914
+ createAgent,
915
+ interruptAgent: (agentId) => cancelAgentRunCommand({ agentManager, logger }, agentId),
916
+ archiveWorkspace: archiveWorkspaceByIdExternal,
917
+ cleanupFailedCreate: (input) => hubAgentLifecycle.cleanupCreatedWorktreeAfterFailedAgentCreate(input),
918
+ }),
919
+ });
920
+ const createScheduleLocalWorkspaceExternal = async (input) => {
921
+ const workspace = await workspaceProvisioning.createWorkspaceForDirectory(input.cwd, resolveFirstAgentPromptTitle(input.firstAgentContext));
922
+ workspaceAutoName.scheduleForDirectory({
923
+ workspaceId: workspace.workspaceId,
924
+ cwd: workspace.cwd,
925
+ firstAgentContext: input.firstAgentContext,
926
+ });
927
+ await emitWorkspaceUpdatesExternal([workspace.workspaceId]);
928
+ return workspace;
929
+ };
930
+ const createSchedulePaseoWorktreeExternal = async (input) => {
931
+ const result = await createPaseoWorktreeForTools({
932
+ cwd: input.cwd,
933
+ firstAgentContext: input.firstAgentContext,
934
+ });
935
+ await emitWorkspaceUpdatesExternal([result.workspace.workspaceId]);
936
+ return result;
937
+ };
938
+ const archiveScheduleWorkspaceExternal = async (workspaceId) => {
939
+ await archiveByScope({
940
+ paseoHome: config.paseoHome,
941
+ paseoWorktreesBaseRoot: config.worktreesRoot,
942
+ github,
943
+ workspaceGitService,
944
+ agentManager,
945
+ agentStorage,
946
+ findWorkspaceIdForCwd: findWorkspaceIdForCwdExternal,
947
+ listActiveWorkspaces: listActiveWorkspacesExternal,
948
+ getWorkspace: (workspaceIdToGet) => workspaceRegistry.get(workspaceIdToGet),
949
+ archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
950
+ emitWorkspaceUpdatesForWorkspaceIds: emitWorkspaceUpdatesExternal,
951
+ markWorkspaceArchiving: markWorkspaceArchivingExternal,
952
+ clearWorkspaceArchiving: clearWorkspaceArchivingExternal,
953
+ killTerminalsForWorkspace: (workspaceIdToKill) => killTerminalsForWorkspace({
954
+ terminalManager,
955
+ sessionLogger: logger,
956
+ }, workspaceIdToKill),
957
+ stopWorkspaceSetup: (workspaceIdToStop) => workspaceSetupRuntime.stop(workspaceIdToStop),
958
+ assertWorkspaceAutomationAllowed: (guardedWorkspaceId) => assertWorkspaceAutomationAllowedForWorkspace(workspaceRegistry, guardedWorkspaceId),
959
+ sessionLogger: logger,
960
+ }, {
961
+ scope: { kind: "workspace", workspaceId },
962
+ requestId: "schedule-run-finish",
963
+ });
964
+ };
965
+ const scheduleService = new ScheduleService({
966
+ paseoHome: config.paseoHome,
967
+ logger,
968
+ agentManager,
969
+ agentStorage,
970
+ createAgent,
971
+ createDirectoryWorkspace: createScheduleLocalWorkspaceExternal,
972
+ createPaseoWorktreeWorkspace: createSchedulePaseoWorktreeExternal,
973
+ archiveWorkspace: archiveScheduleWorkspaceExternal,
974
+ });
975
+ await scheduleService.start();
976
+ agentManager.setAgentArchivedCallback(async (agentId) => {
977
+ try {
978
+ await scheduleService.completeForAgent(agentId);
979
+ }
980
+ catch (error) {
981
+ logger.warn({ err: error, agentId }, "Failed to complete schedules for archived agent");
982
+ }
983
+ });
984
+ logger.info({ elapsed: elapsed() }, "Schedule service initialized");
985
+ logger.info({ elapsed: elapsed() }, "Loading persisted agent registry");
986
+ const persistedRecords = await agentStorage.list();
987
+ logger.info({ elapsed: elapsed() }, `Agent registry loaded (${persistedRecords.length} record${persistedRecords.length === 1 ? "" : "s"}); agents will initialize on demand`);
988
+ logger.info("Voice mode configured for agent-scoped resume flow (no dedicated voice assistant provider)");
989
+ logger.info({ elapsed: elapsed() }, "Preparing voice and MCP runtime");
990
+ const createAgentToolHostDependencies = (runtime) => ({
991
+ agentManager,
992
+ agentStorage,
993
+ terminalManager,
994
+ getDaemonTcpPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
995
+ scheduleService,
996
+ providerSnapshotManager,
997
+ daemonConfigStore,
998
+ github,
999
+ workspaceGitService,
1000
+ findWorkspaceIdForCwd: findWorkspaceIdForCwdExternal,
1001
+ listActiveWorkspaces: listActiveWorkspacesExternal,
1002
+ archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
1003
+ emitWorkspaceUpdatesForWorkspaceIds: emitWorkspaceUpdatesExternal,
1004
+ workspaceRegistry,
1005
+ projectRegistry,
1006
+ createDirectoryWorkspace: async (cwd, title, projectId) => {
1007
+ const workspace = await workspaceProvisioning.createWorkspaceForDirectory(cwd, title, projectId);
1008
+ await emitWorkspaceUpdatesExternal([workspace.workspaceId]);
1009
+ return workspace;
1010
+ },
1011
+ workspaceScripts: createWorkspaceScriptsService({
1012
+ serviceProxy,
1013
+ scriptRuntimeStore,
1014
+ terminalManager,
1015
+ workspaceRegistry,
1016
+ projectRegistry,
1017
+ workspaceGitService,
1018
+ getDaemonTcpPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
1019
+ getDaemonTcpHost: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.host : null),
1020
+ serviceProxyPublicBaseUrl,
1021
+ resolveScriptHealth: (hostname) => scriptHealthMonitor.getHealthForHostname(hostname),
1022
+ logger,
1023
+ // MCP operations do not belong to one WebSocket session, so lifecycle
1024
+ // status updates fan out to every connected client.
1025
+ emit: (message) => wsServer?.broadcast(wrapSessionMessage(message)),
1026
+ spawnWorkspaceScript,
1027
+ assertAutomationAllowed: (workspaceId) => assertWorkspaceAutomationAllowedForWorkspace(workspaceRegistry, workspaceId),
1028
+ globalServicePorts: loadPersistedConfig(config.paseoHome).worktrees?.servicePorts,
1029
+ }),
1030
+ markWorkspaceArchiving: markWorkspaceArchivingExternal,
1031
+ clearWorkspaceArchiving: clearWorkspaceArchivingExternal,
1032
+ ensureWorkspaceForCreate: createAgentCommandDependencies.ensureWorkspaceForCreate,
1033
+ createPaseoWorktree: createAgentCommandDependencies.createPaseoWorktree,
1034
+ browserToolsEnabled: browserToolsPolicy.isEnabled(),
1035
+ browserToolsBroker,
1036
+ paseoToolPolicy: runtime.paseoToolPolicy ??
1037
+ (runtime.callerAgentId ? agentManager.getPaseoToolPolicy(runtime.callerAgentId) : undefined),
1038
+ paseoHome: config.paseoHome,
1039
+ worktreesRoot: config.worktreesRoot,
1040
+ callerAgentId: runtime.callerAgentId,
1041
+ enableVoiceTools: runtime.enableVoiceTools,
1042
+ voiceOnly: runtime.voiceOnly,
1043
+ resolveSpeakHandler: (agentId) => wsServer?.resolveVoiceSpeakHandler(agentId) ?? null,
1044
+ resolveCallerContext: (agentId) => wsServer?.resolveVoiceCallerContext(agentId) ?? null,
1045
+ logger,
1046
+ });
1047
+ const createAgentToolCatalog = (runtime) => createPaseoToolCatalog(createAgentToolHostDependencies(runtime));
1048
+ const setAgentProviderToolsEnabled = (enabled) => {
1049
+ agentProviderRuntime.setPaseoToolCatalog(enabled ? createAgentToolCatalog({}) : null);
1050
+ };
1051
+ agentManager.setPaseoToolCatalogFactory(createAgentToolCatalog);
1052
+ agentManager.setPaseoToolsEnabled(config.mcpInjectIntoAgents !== false);
1053
+ setAgentProviderToolsEnabled(config.mcpEnabled !== false && config.mcpInjectIntoAgents !== false);
1054
+ let mcpEnabled = config.mcpEnabled ?? true;
1055
+ let agentMcpBaseUrl = null;
1056
+ {
1057
+ const agentMcpRoute = "/mcp/agents";
1058
+ const createAgentMcpSession = async (callerAgentId) => {
1059
+ const agentMcpServer = await createAgentMcpServer(createAgentToolHostDependencies({
1060
+ callerAgentId,
1061
+ paseoToolPolicy: callerAgentId
1062
+ ? agentManager.getPaseoToolPolicy(callerAgentId)
1063
+ : undefined,
1064
+ }));
1065
+ // Stateless mode: each HTTP request builds a fresh server + transport that is
1066
+ // torn down when the response closes, so no per-session state is retained between
1067
+ // requests. The agent control plane only lists and calls tools, neither of which
1068
+ // needs cross-request state, so sessions would only pin memory for the life of the
1069
+ // daemon (agents that exit without a clean DELETE never get reaped).
1070
+ const transport = new StreamableHTTPServerTransport({
1071
+ sessionIdGenerator: undefined,
1072
+ // NOTE: We enforce a Vite-like host allowlist at the app/websocket layer.
1073
+ // StreamableHTTPServerTransport's built-in check requires exact Host header matches.
1074
+ enableDnsRebindingProtection: false,
1075
+ });
1076
+ Object.assign(transport, {
1077
+ onerror: (err) => {
1078
+ logger.error({ err }, "Agent MCP transport error");
1079
+ },
1080
+ });
1081
+ await agentMcpServer.connect(transport);
1082
+ return { server: agentMcpServer, transport };
1083
+ };
1084
+ const runAgentMcpRequest = async (req, res) => {
1085
+ if (!mcpEnabled) {
1086
+ res.status(404).json({ error: "Agent MCP endpoint disabled" });
1087
+ return;
1088
+ }
1089
+ // This route is exempt from the global daemon-password middleware, so it
1090
+ // authenticates here using the injected capability token (or a valid
1091
+ // daemon password). Without this, a password-protected daemon would be
1092
+ // wide open on its agent control plane.
1093
+ if (!(await isAgentMcpRequestAuthorized({
1094
+ password: config.auth?.password,
1095
+ capabilityToken: agentMcpAuthToken,
1096
+ authorizationHeader: req.header("authorization"),
1097
+ }))) {
1098
+ res.status(401).json({ error: "Unauthorized" });
1099
+ return;
1100
+ }
1101
+ if (config.mcpDebug) {
1102
+ logger.debug({
1103
+ method: req.method,
1104
+ url: req.originalUrl,
1105
+ sessionId: req.header("mcp-session-id"),
1106
+ authorization: req.header("authorization") ? MCP_DEBUG_SECRET : undefined,
1107
+ body: describeMcpDebugPayload(req.body),
1108
+ }, "Agent MCP request");
1109
+ }
1110
+ try {
1111
+ // Stateless: GET (standalone SSE) and DELETE (session termination) have no
1112
+ // meaning without sessions. The MCP client tolerates 405 on the GET stream
1113
+ // and never issues a DELETE because it is never handed a session id.
1114
+ if (req.method !== "POST") {
1115
+ res.status(405).json({
1116
+ jsonrpc: "2.0",
1117
+ error: {
1118
+ code: -32000,
1119
+ message: "Method not allowed",
1120
+ },
1121
+ id: null,
1122
+ });
1123
+ return;
1124
+ }
1125
+ const callerAgentIdRaw = req.query.callerAgentId;
1126
+ let callerAgentId;
1127
+ if (typeof callerAgentIdRaw === "string") {
1128
+ callerAgentId = callerAgentIdRaw;
1129
+ }
1130
+ else if (Array.isArray(callerAgentIdRaw) && typeof callerAgentIdRaw[0] === "string") {
1131
+ callerAgentId = callerAgentIdRaw[0];
1132
+ }
1133
+ const { server, transport } = await createAgentMcpSession(callerAgentId);
1134
+ res.on("close", () => {
1135
+ void transport.close();
1136
+ void server.close();
1137
+ });
1138
+ await transport.handleRequest(req, res, req.body);
1139
+ }
1140
+ catch (err) {
1141
+ logger.error({ err }, "Failed to handle Agent MCP request");
1142
+ if (!res.headersSent) {
1143
+ res.status(500).json({
1144
+ jsonrpc: "2.0",
1145
+ error: {
1146
+ code: -32603,
1147
+ message: "Internal MCP server error",
1148
+ },
1149
+ id: null,
1150
+ });
1151
+ }
1152
+ }
1153
+ };
1154
+ const handleAgentMcpRequest = (req, res) => {
1155
+ void runAgentMcpRequest(req, res);
1156
+ };
1157
+ app.post(agentMcpRoute, handleAgentMcpRequest);
1158
+ app.get(agentMcpRoute, handleAgentMcpRequest);
1159
+ app.delete(agentMcpRoute, handleAgentMcpRequest);
1160
+ logger.info({ route: agentMcpRoute, enabled: mcpEnabled }, "Agent MCP route mounted");
1161
+ }
1162
+ const speechService = createSpeechService({
1163
+ logger,
1164
+ openaiConfig: config.openai,
1165
+ speechConfig: config.speech,
1166
+ });
1167
+ logger.info({ elapsed: elapsed() }, "Speech service created");
1168
+ logger.info({ elapsed: elapsed() }, "Bootstrap complete, ready to start listening");
1169
+ const start = async () => {
1170
+ let mainStarted = false;
1171
+ try {
1172
+ if (serviceProxyListenTarget) {
1173
+ const boundServiceProxyTarget = await serviceProxy.startStandalone({
1174
+ listenTarget: serviceProxyListenTarget,
1175
+ });
1176
+ serviceProxyListenTarget = boundServiceProxyTarget;
1177
+ logger.info({
1178
+ listen: formatListenTarget(serviceProxyListenTarget),
1179
+ publicBaseUrl: serviceProxyPublicBaseUrl,
1180
+ elapsed: elapsed(),
1181
+ }, "Service proxy listening");
1182
+ }
1183
+ // Start main HTTP server
1184
+ await new Promise((resolve, reject) => {
1185
+ const onError = (err) => {
1186
+ httpServer.off("listening", onListening);
1187
+ reject(err);
1188
+ };
1189
+ const onListening = () => {
1190
+ httpServer.off("error", onError);
1191
+ mainStarted = true;
1192
+ const logAndResolve = async () => {
1193
+ boundListenTarget = resolveBoundListenTarget(listenTarget, httpServer);
1194
+ const mcpBaseUrl = createAgentMcpBaseUrl(boundListenTarget);
1195
+ agentMcpBaseUrl =
1196
+ !mcpEnabled || config.mcpInjectIntoAgents === false ? null : mcpBaseUrl;
1197
+ agentManager.setMcpBaseUrl(agentMcpBaseUrl);
1198
+ agentManager.setPaseoToolsEnabled(mcpEnabled && config.mcpInjectIntoAgents !== false);
1199
+ daemonConfigStore.onFieldChange("mcp.enabled", (value) => {
1200
+ mcpEnabled = value !== false;
1201
+ const inject = daemonConfigStore.get().mcp.injectIntoAgents !== false;
1202
+ agentManager.setMcpBaseUrl(mcpEnabled && inject ? mcpBaseUrl : null);
1203
+ agentManager.setPaseoToolsEnabled(mcpEnabled && inject);
1204
+ setAgentProviderToolsEnabled(mcpEnabled && inject);
1205
+ });
1206
+ daemonConfigStore.onFieldChange("mcp.injectIntoAgents", (value) => {
1207
+ agentManager.setMcpBaseUrl(mcpEnabled && value ? mcpBaseUrl : null);
1208
+ agentManager.setPaseoToolsEnabled(mcpEnabled && value !== false);
1209
+ setAgentProviderToolsEnabled(mcpEnabled && value !== false);
1210
+ });
1211
+ daemonConfigStore.onFieldChange("appendSystemPrompt", (value) => {
1212
+ agentManager.setAppendSystemPrompt(typeof value === "string" ? value : "");
1213
+ });
1214
+ const relayEnabled = config.relayEnabled ?? true;
1215
+ const relayEndpoint = config.relayEndpoint ?? "relay.paseo.sh:443";
1216
+ const relayPublicEndpoint = config.relayPublicEndpoint ?? relayEndpoint;
1217
+ const relayUseTls = config.relayUseTls ?? relayEndpoint === "relay.paseo.sh:443";
1218
+ const relayPublicUseTls = config.relayPublicUseTls ?? relayUseTls;
1219
+ if (boundListenTarget.type === "tcp") {
1220
+ logger.info({
1221
+ host: boundListenTarget.host,
1222
+ port: boundListenTarget.port,
1223
+ authRequired: !!config.auth?.password,
1224
+ elapsed: elapsed(),
1225
+ }, `Server listening on http://${boundListenTarget.host}:${boundListenTarget.port}`);
1226
+ }
1227
+ else {
1228
+ logger.info({
1229
+ path: boundListenTarget.path,
1230
+ authRequired: !!config.auth?.password,
1231
+ elapsed: elapsed(),
1232
+ }, `Server listening on ${boundListenTarget.path}`);
1233
+ }
1234
+ if (config.auth?.password) {
1235
+ logger.info("Daemon password authentication enabled");
1236
+ }
1237
+ wsServer = new VoiceAssistantWebSocketServer(httpServer, logger, serverId, agentManager, agentStorage, downloadTokenStore, config.paseoHome, daemonConfigStore, mcpBaseUrl, {
1238
+ getAllowedOrigins: () => allowedOrigins,
1239
+ getHostnames: () => configuredHostnames,
1240
+ daemonStatusRpc: dependencies.serverFeatureOverrides?.daemonStatusRpc,
1241
+ relayConfig: dependencies.serverFeatureOverrides?.relayConfig,
1242
+ startPaused: true,
1243
+ }, workspaceAutoName, config.auth, speechService, terminalManager, {
1244
+ finalTimeoutMs: config.dictationFinalTimeoutMs,
1245
+ }, daemonVersion, (intent) => {
1246
+ try {
1247
+ config.onLifecycleIntent?.(intent);
1248
+ }
1249
+ catch (error) {
1250
+ logger.error({ err: error, intent }, "Failed to handle daemon lifecycle intent");
1251
+ }
1252
+ }, projectRegistry, workspaceRegistry, scheduleService, checkoutDiffManager, serviceProxy, scriptRuntimeStore, handleBranchChange, () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null), () => (boundListenTarget?.type === "tcp" ? boundListenTarget.host : null), (hostname) => scriptHealthMonitor.getHealthForHostname(hostname), workspaceGitService, github, config.pushNotificationSender, providerSnapshotManager, {
1253
+ listen: formatListenTarget(boundListenTarget ?? listenTarget),
1254
+ worktreesRoot: config.worktreesRoot,
1255
+ get appBaseUrl() {
1256
+ return appBaseUrl;
1257
+ },
1258
+ desktopManaged: config.desktopManaged === true,
1259
+ getRelayConfig: () => relayRuntime?.getConfig() ?? {
1260
+ enabled: daemonConfigStore.get().relay?.enabled ?? relayEnabled,
1261
+ endpoint: relayEndpoint,
1262
+ publicEndpoint: relayPublicEndpoint,
1263
+ useTls: relayUseTls,
1264
+ publicUseTls: relayPublicUseTls,
1265
+ },
1266
+ }, serviceProxyPublicBaseUrl, browserToolsBroker, hubRelationships, workspaceSetupRuntime, pluginRuntime, orchestrationSkills, workspaceLabelService, new ProviderUsageService({
1267
+ logger,
1268
+ providerConfigs: daemonConfigStore.get().providers,
1269
+ }));
1270
+ pluginRuntime.bindPaseoSessionHost(wsServer);
1271
+ await pluginRuntime.start();
1272
+ wsServer.beginAcceptingConnections();
1273
+ relayRuntime = createRelayRuntime({
1274
+ config: {
1275
+ enabled: relayEnabled,
1276
+ endpoint: relayEndpoint,
1277
+ publicEndpoint: relayPublicEndpoint,
1278
+ useTls: relayUseTls,
1279
+ publicUseTls: relayPublicUseTls,
1280
+ },
1281
+ logger,
1282
+ attachSocket: async (ws, metadata) => {
1283
+ if (!wsServer)
1284
+ throw new Error("WebSocket server is not ready");
1285
+ await wsServer.attachExternalSocket(ws, metadata);
1286
+ },
1287
+ serverId,
1288
+ daemonKeyPair: daemonKeyPair.keyPair,
1289
+ });
1290
+ daemonConfigStore.onFieldChange("relay.enabled", (value) => {
1291
+ relayRuntime?.setEnabled(value === true);
1292
+ });
1293
+ await hubRelationships.start();
1294
+ };
1295
+ logAndResolve().then(resolve, reject);
1296
+ };
1297
+ httpServer.once("error", onError);
1298
+ httpServer.once("listening", onListening);
1299
+ if (listenTarget.type === "tcp") {
1300
+ httpServer.listen(listenTarget.port, listenTarget.host);
1301
+ }
1302
+ else {
1303
+ if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
1304
+ unlinkSync(listenTarget.path);
1305
+ }
1306
+ httpServer.listen(listenTarget.path);
1307
+ }
1308
+ });
1309
+ // Start speech service after listening so synchronous Sherpa native
1310
+ // model loading doesn't block the server from accepting connections.
1311
+ speechService.start();
1312
+ scriptHealthMonitor.start();
1313
+ }
1314
+ catch (error) {
1315
+ unsubscribePluginProviders();
1316
+ await pluginRuntime.stopAllPlugins().catch(() => undefined);
1317
+ await serviceProxy.stopStandalone().catch(() => undefined);
1318
+ await agentProviderRuntime.shutdown().catch(() => undefined);
1319
+ if (mainStarted) {
1320
+ httpServer.closeAllConnections();
1321
+ await new Promise((resolve) => httpServer.close(() => resolve()));
1322
+ }
1323
+ throw error;
1324
+ }
1325
+ };
1326
+ const stop = async () => {
1327
+ await pluginRuntime.stopAllPlugins();
1328
+ unsubscribePluginProviders();
1329
+ await hubRelationships.stop();
1330
+ workspaceReconciliation.dispose();
1331
+ scriptHealthMonitor.stop();
1332
+ // Freeze both ingress and registration before taking the agent closure snapshot.
1333
+ wsServer?.prepareForShutdown();
1334
+ agentManager.prepareForShutdown();
1335
+ await closeAllAgents(logger, agentManager);
1336
+ await agentManager.flushForShutdown().catch(() => undefined);
1337
+ detachAgentStoragePersistence();
1338
+ await agentStorage.flush().catch(() => undefined);
1339
+ await agentProviderRuntime.shutdown();
1340
+ terminalManager.killAll();
1341
+ await speechService.stop();
1342
+ await scheduleService.stop().catch(() => undefined);
1343
+ await relayRuntime?.stop().catch(() => undefined);
1344
+ if (wsServer) {
1345
+ await wsServer.close();
1346
+ }
1347
+ await serviceProxy.stopStandalone();
1348
+ // Force-drop remaining sockets so httpServer.close() resolves promptly.
1349
+ // We've already closed wsServer (which sent ws-layer close frames) and
1350
+ // stopped every other service, so anything still attached is a TCP
1351
+ // socket whose higher-level shutdown hasn't fully released it (e.g.
1352
+ // upgraded WS sockets in the closing handshake, or HTTP keep-alive
1353
+ // sockets in CLOSE_WAIT). closeIdleConnections() does not catch
1354
+ // upgraded sockets, so we use closeAllConnections() here.
1355
+ httpServer.closeAllConnections();
1356
+ await new Promise((resolve) => {
1357
+ httpServer.close(() => resolve());
1358
+ });
1359
+ // Clean up socket files
1360
+ if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
1361
+ unlinkSync(listenTarget.path);
1362
+ }
1363
+ };
1364
+ return {
1365
+ config,
1366
+ agentManager,
1367
+ agentStorage,
1368
+ terminalManager,
1369
+ serviceProxy,
1370
+ scriptRuntimeStore,
1371
+ browserToolsBroker,
1372
+ start,
1373
+ stop,
1374
+ getListenTarget: () => boundListenTarget,
1375
+ };
1376
+ }
1377
+ async function closeAllAgents(logger, agentManager) {
1378
+ const agents = agentManager.listAgents();
1379
+ await Promise.all(agents.map(async (agent) => {
1380
+ try {
1381
+ await agentManager.closeAgent(agent.id);
1382
+ }
1383
+ catch (err) {
1384
+ logger.error({ err, agentId: agent.id }, "Failed to close agent");
1385
+ }
1386
+ }));
1387
+ }
1388
+ //# sourceMappingURL=bootstrap.js.map