@hyperdrive.bot/paseo-server 0.2.6

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 (804) 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 +141 -0
  6. package/dist/scripts/supervisor-log-config.js +31 -0
  7. package/dist/scripts/supervisor.js +252 -0
  8. package/dist/server/executable-resolution/executable-resolution.d.ts +10 -0
  9. package/dist/server/executable-resolution/executable-resolution.js +118 -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/extensions/daemon-backend.d.ts +11 -0
  13. package/dist/server/extensions/daemon-backend.js +146 -0
  14. package/dist/server/extensions/extension-host-manager.d.ts +48 -0
  15. package/dist/server/extensions/extension-host-manager.js +141 -0
  16. package/dist/server/extensions/extension-loader.d.ts +11 -0
  17. package/dist/server/extensions/extension-loader.js +47 -0
  18. package/dist/server/extensions/extension-service.d.ts +17 -0
  19. package/dist/server/extensions/extension-service.js +76 -0
  20. package/dist/server/server/agent/activity-curator.d.ts +28 -0
  21. package/dist/server/server/agent/activity-curator.js +227 -0
  22. package/dist/server/server/agent/agent-archive.d.ts +11 -0
  23. package/dist/server/server/agent/agent-archive.js +16 -0
  24. package/dist/server/server/agent/agent-loading.d.ts +12 -0
  25. package/dist/server/server/agent/agent-loading.js +55 -0
  26. package/dist/server/server/agent/agent-manager.d.ts +462 -0
  27. package/dist/server/server/agent/agent-manager.js +2955 -0
  28. package/dist/server/server/agent/agent-projections.d.ts +26 -0
  29. package/dist/server/server/agent/agent-projections.js +404 -0
  30. package/dist/server/server/agent/agent-prompt.d.ts +76 -0
  31. package/dist/server/server/agent/agent-prompt.js +230 -0
  32. package/dist/server/server/agent/agent-response-loop.d.ts +67 -0
  33. package/dist/server/server/agent/agent-response-loop.js +326 -0
  34. package/dist/server/server/agent/agent-routes.d.ts +18 -0
  35. package/dist/server/server/agent/agent-routes.js +107 -0
  36. package/dist/server/server/agent/agent-sdk-types.d.ts +677 -0
  37. package/dist/server/server/agent/agent-sdk-types.js +22 -0
  38. package/dist/server/server/agent/agent-storage.d.ts +152 -0
  39. package/dist/server/server/agent/agent-storage.js +342 -0
  40. package/dist/server/server/agent/agent-stream-coalescer.d.ts +41 -0
  41. package/dist/server/server/agent/agent-stream-coalescer.js +166 -0
  42. package/dist/server/server/agent/agent-timeline-store-types.d.ts +50 -0
  43. package/dist/server/server/agent/agent-timeline-store-types.js +2 -0
  44. package/dist/server/server/agent/agent-timeline-store.d.ts +27 -0
  45. package/dist/server/server/agent/agent-timeline-store.js +230 -0
  46. package/dist/server/server/agent/audio-utils.d.ts +3 -0
  47. package/dist/server/server/agent/audio-utils.js +19 -0
  48. package/dist/server/server/agent/create-agent/create.d.ts +83 -0
  49. package/dist/server/server/agent/create-agent/create.js +289 -0
  50. package/dist/server/server/agent/create-agent-lifecycle-dispatch.d.ts +54 -0
  51. package/dist/server/server/agent/create-agent-lifecycle-dispatch.js +152 -0
  52. package/dist/server/server/agent/create-agent-mode.d.ts +13 -0
  53. package/dist/server/server/agent/create-agent-mode.js +62 -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/foreground-run-state.d.ts +50 -0
  59. package/dist/server/server/agent/foreground-run-state.js +160 -0
  60. package/dist/server/server/agent/import-sessions.d.ts +47 -0
  61. package/dist/server/server/agent/import-sessions.js +145 -0
  62. package/dist/server/server/agent/lifecycle-command.d.ts +73 -0
  63. package/dist/server/server/agent/lifecycle-command.js +92 -0
  64. package/dist/server/server/agent/mcp-server.d.ts +22 -0
  65. package/dist/server/server/agent/mcp-server.js +544 -0
  66. package/dist/server/server/agent/mcp-shared.d.ts +193 -0
  67. package/dist/server/server/agent/mcp-shared.js +197 -0
  68. package/dist/server/server/agent/pcm16-resampler.d.ts +14 -0
  69. package/dist/server/server/agent/pcm16-resampler.js +63 -0
  70. package/dist/server/server/agent/permission-response.d.ts +15 -0
  71. package/dist/server/server/agent/permission-response.js +14 -0
  72. package/dist/server/server/agent/prompt-attachments.d.ts +7 -0
  73. package/dist/server/server/agent/prompt-attachments.js +90 -0
  74. package/dist/server/server/agent/provider-history-timestamps.d.ts +2 -0
  75. package/dist/server/server/agent/provider-history-timestamps.js +16 -0
  76. package/dist/server/server/agent/provider-launch-config.d.ts +51 -0
  77. package/dist/server/server/agent/provider-launch-config.js +183 -0
  78. package/dist/server/server/agent/provider-notices.d.ts +3 -0
  79. package/dist/server/server/agent/provider-notices.js +5 -0
  80. package/dist/server/server/agent/provider-registry.d.ts +49 -0
  81. package/dist/server/server/agent/provider-registry.js +578 -0
  82. package/dist/server/server/agent/provider-session-import.d.ts +10 -0
  83. package/dist/server/server/agent/provider-session-import.js +49 -0
  84. package/dist/server/server/agent/provider-snapshot-manager.d.ts +137 -0
  85. package/dist/server/server/agent/provider-snapshot-manager.js +694 -0
  86. package/dist/server/server/agent/providers/acp-agent.d.ts +354 -0
  87. package/dist/server/server/agent/providers/acp-agent.js +2438 -0
  88. package/dist/server/server/agent/providers/claude/agent.d.ts +341 -0
  89. package/dist/server/server/agent/providers/claude/agent.js +4606 -0
  90. package/dist/server/server/agent/providers/claude/background-shell-kill-keys.d.ts +32 -0
  91. package/dist/server/server/agent/providers/claude/background-shell-kill-keys.js +34 -0
  92. package/dist/server/server/agent/providers/claude/background-task-tracker.d.ts +49 -0
  93. package/dist/server/server/agent/providers/claude/background-task-tracker.js +119 -0
  94. package/dist/server/server/agent/providers/claude/feature-definitions.d.ts +8 -0
  95. package/dist/server/server/agent/providers/claude/feature-definitions.js +24 -0
  96. package/dist/server/server/agent/providers/claude/hook-handler.d.ts +37 -0
  97. package/dist/server/server/agent/providers/claude/hook-handler.js +193 -0
  98. package/dist/server/server/agent/providers/claude/hooks/event-translator.d.ts +49 -0
  99. package/dist/server/server/agent/providers/claude/hooks/event-translator.js +151 -0
  100. package/dist/server/server/agent/providers/claude/image-compression.d.ts +10 -0
  101. package/dist/server/server/agent/providers/claude/image-compression.js +32 -0
  102. package/dist/server/server/agent/providers/claude/model-manifest.d.ts +104 -0
  103. package/dist/server/server/agent/providers/claude/model-manifest.js +221 -0
  104. package/dist/server/server/agent/providers/claude/models.d.ts +11 -0
  105. package/dist/server/server/agent/providers/claude/models.js +97 -0
  106. package/dist/server/server/agent/providers/claude/partial-json.d.ts +5 -0
  107. package/dist/server/server/agent/providers/claude/partial-json.js +306 -0
  108. package/dist/server/server/agent/providers/claude/project-dir.d.ts +6 -0
  109. package/dist/server/server/agent/providers/claude/project-dir.js +57 -0
  110. package/dist/server/server/agent/providers/claude/pty-session-launcher.d.ts +41 -0
  111. package/dist/server/server/agent/providers/claude/pty-session-launcher.js +131 -0
  112. package/dist/server/server/agent/providers/claude/resume-source.d.ts +11 -0
  113. package/dist/server/server/agent/providers/claude/resume-source.js +37 -0
  114. package/dist/server/server/agent/providers/claude/rewind.d.ts +30 -0
  115. package/dist/server/server/agent/providers/claude/rewind.js +30 -0
  116. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +22 -0
  117. package/dist/server/server/agent/providers/claude/sidechain-tracker.js +232 -0
  118. package/dist/server/server/agent/providers/claude/spawn-config-writer.d.ts +70 -0
  119. package/dist/server/server/agent/providers/claude/spawn-config-writer.js +229 -0
  120. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +47 -0
  121. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +292 -0
  122. package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.d.ts +24 -0
  123. package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.js +23 -0
  124. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts +3 -0
  125. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +130 -0
  126. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +16 -0
  127. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +129 -0
  128. package/dist/server/server/agent/providers/claude/transport/claude-paths.d.ts +31 -0
  129. package/dist/server/server/agent/providers/claude/transport/claude-paths.js +63 -0
  130. package/dist/server/server/agent/providers/claude/transport/continue-flag.d.ts +31 -0
  131. package/dist/server/server/agent/providers/claude/transport/continue-flag.js +42 -0
  132. package/dist/server/server/agent/providers/claude/transport/pty-query.d.ts +62 -0
  133. package/dist/server/server/agent/providers/claude/transport/pty-query.js +265 -0
  134. package/dist/server/server/agent/providers/claude/transport/pty.d.ts +50 -0
  135. package/dist/server/server/agent/providers/claude/transport/pty.js +211 -0
  136. package/dist/server/server/agent/providers/claude/transport/redact.d.ts +2 -0
  137. package/dist/server/server/agent/providers/claude/transport/redact.js +5 -0
  138. package/dist/server/server/agent/providers/claude/transport/sdk.d.ts +63 -0
  139. package/dist/server/server/agent/providers/claude/transport/sdk.js +207 -0
  140. package/dist/server/server/agent/providers/claude/transport/transcript-sdk-reader.d.ts +27 -0
  141. package/dist/server/server/agent/providers/claude/transport/transcript-sdk-reader.js +162 -0
  142. package/dist/server/server/agent/providers/claude/transport/transcript-tailer.d.ts +28 -0
  143. package/dist/server/server/agent/providers/claude/transport/transcript-tailer.js +166 -0
  144. package/dist/server/server/agent/providers/claude/transport/truncate-session.d.ts +41 -0
  145. package/dist/server/server/agent/providers/claude/transport/truncate-session.js +86 -0
  146. package/dist/server/server/agent/providers/claude/transport/types.d.ts +47 -0
  147. package/dist/server/server/agent/providers/claude/transport/types.js +2 -0
  148. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +90 -0
  149. package/dist/server/server/agent/providers/codex/app-server-transport.js +262 -0
  150. package/dist/server/server/agent/providers/codex/rewind.d.ts +21 -0
  151. package/dist/server/server/agent/providers/codex/rewind.js +46 -0
  152. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts +36 -0
  153. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js +217 -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 +830 -0
  158. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +308 -0
  159. package/dist/server/server/agent/providers/codex-app-server-agent.js +4514 -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 +45 -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 +15 -0
  165. package/dist/server/server/agent/providers/cursor-acp-agent.js +18 -0
  166. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +36 -0
  167. package/dist/server/server/agent/providers/diagnostic-utils.js +355 -0
  168. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +42 -0
  169. package/dist/server/server/agent/providers/generic-acp-agent.js +161 -0
  170. package/dist/server/server/agent/providers/kiro-acp-agent.d.ts +17 -0
  171. package/dist/server/server/agent/providers/kiro-acp-agent.js +78 -0
  172. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +85 -0
  173. package/dist/server/server/agent/providers/mock-load-test-agent.js +1010 -0
  174. package/dist/server/server/agent/providers/mock-slow-provider.d.ts +14 -0
  175. package/dist/server/server/agent/providers/mock-slow-provider.js +39 -0
  176. package/dist/server/server/agent/providers/opencode/paths.d.ts +2 -0
  177. package/dist/server/server/agent/providers/opencode/paths.js +7 -0
  178. package/dist/server/server/agent/providers/opencode/rewind.d.ts +18 -0
  179. package/dist/server/server/agent/providers/opencode/rewind.js +14 -0
  180. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +91 -0
  181. package/dist/server/server/agent/providers/opencode/server-manager.js +425 -0
  182. package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +25 -0
  183. package/dist/server/server/agent/providers/opencode/test-server-manager.js +39 -0
  184. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-harness.d.ts +92 -0
  185. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-harness.js +268 -0
  186. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +3 -0
  187. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +256 -0
  188. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +13 -0
  189. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +53 -0
  190. package/dist/server/server/agent/providers/opencode-agent.d.ts +286 -0
  191. package/dist/server/server/agent/providers/opencode-agent.js +2857 -0
  192. package/dist/server/server/agent/providers/pi/agent.d.ts +137 -0
  193. package/dist/server/server/agent/providers/pi/agent.js +1650 -0
  194. package/dist/server/server/agent/providers/pi/cli-runtime.d.ts +21 -0
  195. package/dist/server/server/agent/providers/pi/cli-runtime.js +233 -0
  196. package/dist/server/server/agent/providers/pi/history-mapper.d.ts +9 -0
  197. package/dist/server/server/agent/providers/pi/history-mapper.js +140 -0
  198. package/dist/server/server/agent/providers/pi/rewind.d.ts +8 -0
  199. package/dist/server/server/agent/providers/pi/rewind.js +8 -0
  200. package/dist/server/server/agent/providers/pi/rpc-types.d.ts +208 -0
  201. package/dist/server/server/agent/providers/pi/rpc-types.js +2 -0
  202. package/dist/server/server/agent/providers/pi/runtime.d.ts +57 -0
  203. package/dist/server/server/agent/providers/pi/runtime.js +56 -0
  204. package/dist/server/server/agent/providers/pi/session-descriptor.d.ts +16 -0
  205. package/dist/server/server/agent/providers/pi/session-descriptor.js +346 -0
  206. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts +83 -0
  207. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js +184 -0
  208. package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts +112 -0
  209. package/dist/server/server/agent/providers/pi/tool-call-mapper.js +284 -0
  210. package/dist/server/server/agent/providers/provider-image-output.d.ts +25 -0
  211. package/dist/server/server/agent/providers/provider-image-output.js +111 -0
  212. package/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
  213. package/dist/server/server/agent/providers/provider-runner.js +81 -0
  214. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts +3 -0
  215. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +60 -0
  216. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +884 -0
  217. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +778 -0
  218. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +25 -0
  219. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +208 -0
  220. package/dist/server/server/agent/recordings-debug.d.ts +3 -0
  221. package/dist/server/server/agent/recordings-debug.js +19 -0
  222. package/dist/server/server/agent/render-file-attachment.d.ts +29 -0
  223. package/dist/server/server/agent/render-file-attachment.js +41 -0
  224. package/dist/server/server/agent/resolve-resume-cwd.d.ts +14 -0
  225. package/dist/server/server/agent/resolve-resume-cwd.js +49 -0
  226. package/dist/server/server/agent/rewind/rewind.d.ts +10 -0
  227. package/dist/server/server/agent/rewind/rewind.js +29 -0
  228. package/dist/server/server/agent/rewind/test-rewind-session.d.ts +48 -0
  229. package/dist/server/server/agent/rewind/test-rewind-session.js +88 -0
  230. package/dist/server/server/agent/runtime-mcp-config.d.ts +14 -0
  231. package/dist/server/server/agent/runtime-mcp-config.js +53 -0
  232. package/dist/server/server/agent/session-digest-generator.d.ts +37 -0
  233. package/dist/server/server/agent/session-digest-generator.js +115 -0
  234. package/dist/server/server/agent/session-digest.d.ts +35 -0
  235. package/dist/server/server/agent/session-digest.js +104 -0
  236. package/dist/server/server/agent/structured-generation-providers.d.ts +29 -0
  237. package/dist/server/server/agent/structured-generation-providers.js +236 -0
  238. package/dist/server/server/agent/stt-debug.d.ts +10 -0
  239. package/dist/server/server/agent/stt-debug.js +33 -0
  240. package/dist/server/server/agent/stt-manager.d.ts +38 -0
  241. package/dist/server/server/agent/stt-manager.js +246 -0
  242. package/dist/server/server/agent/system-prompt.d.ts +2 -0
  243. package/dist/server/server/agent/system-prompt.js +8 -0
  244. package/dist/server/server/agent/timeline-append.d.ts +10 -0
  245. package/dist/server/server/agent/timeline-append.js +27 -0
  246. package/dist/server/server/agent/timeline-projection.d.ts +71 -0
  247. package/dist/server/server/agent/timeline-projection.js +373 -0
  248. package/dist/server/server/agent/tools/paseo-tools.d.ts +54 -0
  249. package/dist/server/server/agent/tools/paseo-tools.js +2197 -0
  250. package/dist/server/server/agent/tools/types.d.ts +36 -0
  251. package/dist/server/server/agent/tools/types.js +2 -0
  252. package/dist/server/server/agent/tts-debug.d.ts +8 -0
  253. package/dist/server/server/agent/tts-debug.js +24 -0
  254. package/dist/server/server/agent/tts-manager.d.ts +41 -0
  255. package/dist/server/server/agent/tts-manager.js +375 -0
  256. package/dist/server/server/agent/wait-for-agent-tracker.d.ts +15 -0
  257. package/dist/server/server/agent/wait-for-agent-tracker.js +53 -0
  258. package/dist/server/server/agent-attention-policy.d.ts +29 -0
  259. package/dist/server/server/agent-attention-policy.js +36 -0
  260. package/dist/server/server/atomic-file.d.ts +3 -0
  261. package/dist/server/server/atomic-file.js +19 -0
  262. package/dist/server/server/auth.d.ts +38 -0
  263. package/dist/server/server/auth.js +143 -0
  264. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +40 -0
  265. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +92 -0
  266. package/dist/server/server/auto-archive-on-merge/index.d.ts +8 -0
  267. package/dist/server/server/auto-archive-on-merge/index.js +15 -0
  268. package/dist/server/server/bootstrap.d.ts +126 -0
  269. package/dist/server/server/bootstrap.js +1193 -0
  270. package/dist/server/server/browser-tools/broker.d.ts +45 -0
  271. package/dist/server/server/browser-tools/broker.js +390 -0
  272. package/dist/server/server/browser-tools/errors.d.ts +22 -0
  273. package/dist/server/server/browser-tools/errors.js +27 -0
  274. package/dist/server/server/browser-tools/policy.d.ts +10 -0
  275. package/dist/server/server/browser-tools/policy.js +16 -0
  276. package/dist/server/server/browser-tools/tools.d.ts +16 -0
  277. package/dist/server/server/browser-tools/tools.js +845 -0
  278. package/dist/server/server/chat/chat-mentions.d.ts +47 -0
  279. package/dist/server/server/chat/chat-mentions.js +113 -0
  280. package/dist/server/server/chat/chat-service.d.ts +78 -0
  281. package/dist/server/server/chat/chat-service.js +337 -0
  282. package/dist/server/server/checkout/status-projection.d.ts +19 -0
  283. package/dist/server/server/checkout/status-projection.js +102 -0
  284. package/dist/server/server/checkout-diff-manager.d.ts +41 -0
  285. package/dist/server/server/checkout-diff-manager.js +189 -0
  286. package/dist/server/server/checkout-git-utils.d.ts +11 -0
  287. package/dist/server/server/checkout-git-utils.js +34 -0
  288. package/dist/server/server/client-message-id.d.ts +3 -0
  289. package/dist/server/server/client-message-id.js +12 -0
  290. package/dist/server/server/config.d.ts +17 -0
  291. package/dist/server/server/config.js +320 -0
  292. package/dist/server/server/connection-offer.d.ts +20 -0
  293. package/dist/server/server/connection-offer.js +59 -0
  294. package/dist/server/server/daemon-config-store.d.ts +25 -0
  295. package/dist/server/server/daemon-config-store.js +194 -0
  296. package/dist/server/server/daemon-keypair.d.ts +8 -0
  297. package/dist/server/server/daemon-keypair.js +42 -0
  298. package/dist/server/server/daemon-version.d.ts +5 -0
  299. package/dist/server/server/daemon-version.js +22 -0
  300. package/dist/server/server/daemon-worker.d.ts +2 -0
  301. package/dist/server/server/daemon-worker.js +251 -0
  302. package/dist/server/server/dictation/dictation-stream-manager.d.ts +87 -0
  303. package/dist/server/server/dictation/dictation-stream-manager.js +572 -0
  304. package/dist/server/server/editor-targets.d.ts +18 -0
  305. package/dist/server/server/editor-targets.js +109 -0
  306. package/dist/server/server/exports.d.ts +24 -0
  307. package/dist/server/server/exports.js +24 -0
  308. package/dist/server/server/file-download/token-store.d.ts +24 -0
  309. package/dist/server/server/file-download/token-store.js +40 -0
  310. package/dist/server/server/file-explorer/file-download-frames.d.ts +27 -0
  311. package/dist/server/server/file-explorer/file-download-frames.js +47 -0
  312. package/dist/server/server/file-explorer/service.d.ts +75 -0
  313. package/dist/server/server/file-explorer/service.js +308 -0
  314. package/dist/server/server/file-upload/index.d.ts +27 -0
  315. package/dist/server/server/file-upload/index.js +158 -0
  316. package/dist/server/server/hostnames.d.ts +13 -0
  317. package/dist/server/server/hostnames.js +94 -0
  318. package/dist/server/server/json-utils.d.ts +11 -0
  319. package/dist/server/server/json-utils.js +45 -0
  320. package/dist/server/server/lifecycle-reasons.d.ts +4 -0
  321. package/dist/server/server/lifecycle-reasons.js +6 -0
  322. package/dist/server/server/logger.d.ts +29 -0
  323. package/dist/server/server/logger.js +125 -0
  324. package/dist/server/server/loop-service.d.ts +234 -0
  325. package/dist/server/server/loop-service.js +769 -0
  326. package/dist/server/server/managed-processes/managed-processes.d.ts +76 -0
  327. package/dist/server/server/managed-processes/managed-processes.js +326 -0
  328. package/dist/server/server/meetings/capture-http.d.ts +3 -0
  329. package/dist/server/server/meetings/capture-http.js +71 -0
  330. package/dist/server/server/meetings/capture-orchestrator.d.ts +123 -0
  331. package/dist/server/server/meetings/capture-orchestrator.js +531 -0
  332. package/dist/server/server/meetings/capture-stream-ws.d.ts +42 -0
  333. package/dist/server/server/meetings/capture-stream-ws.js +68 -0
  334. package/dist/server/server/meetings/live-transcription.d.ts +57 -0
  335. package/dist/server/server/meetings/live-transcription.js +280 -0
  336. package/dist/server/server/meetings/meetings-http.d.ts +42 -0
  337. package/dist/server/server/meetings/meetings-http.js +266 -0
  338. package/dist/server/server/messages.d.ts +9 -0
  339. package/dist/server/server/messages.js +29 -0
  340. package/dist/server/server/migrations/backfill-workspace-id.migration.d.ts +9 -0
  341. package/dist/server/server/migrations/backfill-workspace-id.migration.js +64 -0
  342. package/dist/server/server/monitoring/telemetry.d.ts +13 -0
  343. package/dist/server/server/monitoring/telemetry.js +21 -0
  344. package/dist/server/server/package-version.d.ts +19 -0
  345. package/dist/server/server/package-version.js +60 -0
  346. package/dist/server/server/pagination/cursor.d.ts +16 -0
  347. package/dist/server/server/pagination/cursor.js +62 -0
  348. package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
  349. package/dist/server/server/pagination/sortable-pager.js +68 -0
  350. package/dist/server/server/pairing-offer.d.ts +18 -0
  351. package/dist/server/server/pairing-offer.js +47 -0
  352. package/dist/server/server/pairing-qr.d.ts +7 -0
  353. package/dist/server/server/pairing-qr.js +45 -0
  354. package/dist/server/server/paseo-env.d.ts +13 -0
  355. package/dist/server/server/paseo-env.js +53 -0
  356. package/dist/server/server/paseo-home.d.ts +2 -0
  357. package/dist/server/server/paseo-home.js +19 -0
  358. package/dist/server/server/paseo-worktree-service.d.ts +52 -0
  359. package/dist/server/server/paseo-worktree-service.js +294 -0
  360. package/dist/server/server/path-utils.d.ts +5 -0
  361. package/dist/server/server/path-utils.js +34 -0
  362. package/dist/server/server/persisted-config.d.ts +333 -0
  363. package/dist/server/server/persisted-config.js +402 -0
  364. package/dist/server/server/persistence-hooks.d.ts +32 -0
  365. package/dist/server/server/persistence-hooks.js +97 -0
  366. package/dist/server/server/pid-lock.d.ts +32 -0
  367. package/dist/server/server/pid-lock.js +170 -0
  368. package/dist/server/server/private-files.d.ts +6 -0
  369. package/dist/server/server/private-files.js +37 -0
  370. package/dist/server/server/process-diagnostics.d.ts +17 -0
  371. package/dist/server/server/process-diagnostics.js +22 -0
  372. package/dist/server/server/push/categories.d.ts +35 -0
  373. package/dist/server/server/push/categories.js +40 -0
  374. package/dist/server/server/push/expo-worker.d.ts +51 -0
  375. package/dist/server/server/push/expo-worker.js +149 -0
  376. package/dist/server/server/push/index.d.ts +39 -0
  377. package/dist/server/server/push/index.js +45 -0
  378. package/dist/server/server/push/notifications.d.ts +9 -0
  379. package/dist/server/server/push/notifications.js +15 -0
  380. package/dist/server/server/push/push-service.d.ts +20 -0
  381. package/dist/server/server/push/push-service.js +66 -0
  382. package/dist/server/server/push/routes.d.ts +28 -0
  383. package/dist/server/server/push/routes.js +74 -0
  384. package/dist/server/server/push/subscriptions.d.ts +42 -0
  385. package/dist/server/server/push/subscriptions.js +112 -0
  386. package/dist/server/server/push/token-store.d.ts +29 -0
  387. package/dist/server/server/push/token-store.js +78 -0
  388. package/dist/server/server/push/triggers.d.ts +68 -0
  389. package/dist/server/server/push/triggers.js +103 -0
  390. package/dist/server/server/push/vapid-keys.d.ts +15 -0
  391. package/dist/server/server/push/vapid-keys.js +52 -0
  392. package/dist/server/server/push/web-worker.d.ts +44 -0
  393. package/dist/server/server/push/web-worker.js +99 -0
  394. package/dist/server/server/relay-transport.d.ts +31 -0
  395. package/dist/server/server/relay-transport.js +514 -0
  396. package/dist/server/server/resolve-workspace-id-for-path.d.ts +3 -0
  397. package/dist/server/server/resolve-workspace-id-for-path.js +41 -0
  398. package/dist/server/server/resolve-worktree-creation-intent.d.ts +32 -0
  399. package/dist/server/server/resolve-worktree-creation-intent.js +121 -0
  400. package/dist/server/server/schedule/cron.d.ts +4 -0
  401. package/dist/server/server/schedule/cron.js +81 -0
  402. package/dist/server/server/schedule/service.d.ts +52 -0
  403. package/dist/server/server/schedule/service.js +628 -0
  404. package/dist/server/server/schedule/store.d.ts +13 -0
  405. package/dist/server/server/schedule/store.js +57 -0
  406. package/dist/server/server/script-health-monitor.d.ts +39 -0
  407. package/dist/server/server/script-health-monitor.js +159 -0
  408. package/dist/server/server/script-proxy.d.ts +3 -0
  409. package/dist/server/server/script-proxy.js +2 -0
  410. package/dist/server/server/script-route-branch-handler.d.ts +10 -0
  411. package/dist/server/server/script-route-branch-handler.js +11 -0
  412. package/dist/server/server/script-status-projection.d.ts +36 -0
  413. package/dist/server/server/script-status-projection.js +200 -0
  414. package/dist/server/server/server-id.d.ts +17 -0
  415. package/dist/server/server/server-id.js +68 -0
  416. package/dist/server/server/service-proxy.d.ts +237 -0
  417. package/dist/server/server/service-proxy.js +714 -0
  418. package/dist/server/server/session/agent-config/agent-config-session.d.ts +50 -0
  419. package/dist/server/server/session/agent-config/agent-config-session.js +98 -0
  420. package/dist/server/server/session/agent-updates/agent-updates-service.d.ts +59 -0
  421. package/dist/server/server/session/agent-updates/agent-updates-service.js +220 -0
  422. package/dist/server/server/session/chat/chat-schedule-loop-session.d.ts +120 -0
  423. package/dist/server/server/session/chat/chat-schedule-loop-session.js +489 -0
  424. package/dist/server/server/session/checkout/checkout-session.d.ts +140 -0
  425. package/dist/server/server/session/checkout/checkout-session.js +927 -0
  426. package/dist/server/server/session/checkout/git-metadata-generator.d.ts +53 -0
  427. package/dist/server/server/session/checkout/git-metadata-generator.js +159 -0
  428. package/dist/server/server/session/daemon/daemon-self-update-session-controller.d.ts +32 -0
  429. package/dist/server/server/session/daemon/daemon-self-update-session-controller.js +88 -0
  430. package/dist/server/server/session/daemon/daemon-self-updater.d.ts +32 -0
  431. package/dist/server/server/session/daemon/daemon-self-updater.js +56 -0
  432. package/dist/server/server/session/daemon/daemon-session.d.ts +76 -0
  433. package/dist/server/server/session/daemon/daemon-session.js +148 -0
  434. package/dist/server/server/session/daemon/diagnostics.d.ts +41 -0
  435. package/dist/server/server/session/daemon/diagnostics.js +431 -0
  436. package/dist/server/server/session/daemon/install-origin.d.ts +7 -0
  437. package/dist/server/server/session/daemon/install-origin.js +64 -0
  438. package/dist/server/server/session/daemon/npm-global-cli.d.ts +29 -0
  439. package/dist/server/server/session/daemon/npm-global-cli.js +98 -0
  440. package/dist/server/server/session/files/workspace-files-session.d.ts +43 -0
  441. package/dist/server/server/session/files/workspace-files-session.js +218 -0
  442. package/dist/server/server/session/git-mutation/git-mutation-service.d.ts +34 -0
  443. package/dist/server/server/session/git-mutation/git-mutation-service.js +71 -0
  444. package/dist/server/server/session/project-config/project-config-session.d.ts +34 -0
  445. package/dist/server/server/session/project-config/project-config-session.js +125 -0
  446. package/dist/server/server/session/provider/provider-catalog-session.d.ts +74 -0
  447. package/dist/server/server/session/provider/provider-catalog-session.js +343 -0
  448. package/dist/server/server/session/session-rename-route.d.ts +4 -0
  449. package/dist/server/server/session/session-rename-route.js +71 -0
  450. package/dist/server/server/session/session-rename-service.d.ts +25 -0
  451. package/dist/server/server/session/session-rename-service.js +76 -0
  452. package/dist/server/server/session/voice/voice-session.d.ts +166 -0
  453. package/dist/server/server/session/voice/voice-session.js +893 -0
  454. package/dist/server/server/session/voice/voice-turn-controller.d.ts +38 -0
  455. package/dist/server/server/session/voice/voice-turn-controller.js +393 -0
  456. package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.d.ts +36 -0
  457. package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.js +134 -0
  458. package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.d.ts +34 -0
  459. package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.js +190 -0
  460. package/dist/server/server/session/workspace-scripts/workspace-scripts-service.d.ts +41 -0
  461. package/dist/server/server/session/workspace-scripts/workspace-scripts-service.js +100 -0
  462. package/dist/server/server/session.d.ts +562 -0
  463. package/dist/server/server/session.js +5787 -0
  464. package/dist/server/server/speech/audio.d.ts +10 -0
  465. package/dist/server/server/speech/audio.js +101 -0
  466. package/dist/server/server/speech/provider-resolver.d.ts +3 -0
  467. package/dist/server/server/speech/provider-resolver.js +7 -0
  468. package/dist/server/server/speech/providers/local/config.d.ts +30 -0
  469. package/dist/server/server/speech/providers/local/config.js +134 -0
  470. package/dist/server/server/speech/providers/local/models.d.ts +11 -0
  471. package/dist/server/server/speech/providers/local/models.js +17 -0
  472. package/dist/server/server/speech/providers/local/runtime.d.ts +31 -0
  473. package/dist/server/server/speech/providers/local/runtime.js +135 -0
  474. package/dist/server/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
  475. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +56 -0
  476. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +74 -0
  477. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +15 -0
  478. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +142 -0
  479. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +49 -0
  480. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +73 -0
  481. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +9 -0
  482. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +107 -0
  483. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts +28 -0
  484. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +137 -0
  485. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +21 -0
  486. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +133 -0
  487. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +18 -0
  488. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  489. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +21 -0
  490. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +101 -0
  491. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts +19 -0
  492. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js +49 -0
  493. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts +38 -0
  494. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js +176 -0
  495. package/dist/server/server/speech/providers/local/worker-bytes.d.ts +4 -0
  496. package/dist/server/server/speech/providers/local/worker-bytes.js +9 -0
  497. package/dist/server/server/speech/providers/local/worker-client.d.ts +93 -0
  498. package/dist/server/server/speech/providers/local/worker-client.js +611 -0
  499. package/dist/server/server/speech/providers/local/worker-process.d.ts +2 -0
  500. package/dist/server/server/speech/providers/local/worker-process.js +270 -0
  501. package/dist/server/server/speech/providers/local/worker-protocol.d.ts +95 -0
  502. package/dist/server/server/speech/providers/local/worker-protocol.js +2 -0
  503. package/dist/server/server/speech/providers/openai/config.d.ts +19 -0
  504. package/dist/server/server/speech/providers/openai/config.js +148 -0
  505. package/dist/server/server/speech/providers/openai/runtime.d.ts +29 -0
  506. package/dist/server/server/speech/providers/openai/runtime.js +102 -0
  507. package/dist/server/server/speech/providers/openai/stt.d.ts +23 -0
  508. package/dist/server/server/speech/providers/openai/stt.js +209 -0
  509. package/dist/server/server/speech/providers/openai/tts.d.ts +19 -0
  510. package/dist/server/server/speech/providers/openai/tts.js +48 -0
  511. package/dist/server/server/speech/speech-config-resolver.d.ts +11 -0
  512. package/dist/server/server/speech/speech-config-resolver.js +132 -0
  513. package/dist/server/server/speech/speech-provider.d.ts +59 -0
  514. package/dist/server/server/speech/speech-provider.js +2 -0
  515. package/dist/server/server/speech/speech-runtime.d.ts +45 -0
  516. package/dist/server/server/speech/speech-runtime.js +562 -0
  517. package/dist/server/server/speech/speech-types.d.ts +22 -0
  518. package/dist/server/server/speech/speech-types.js +8 -0
  519. package/dist/server/server/speech/turn-detection-provider.d.ts +23 -0
  520. package/dist/server/server/speech/turn-detection-provider.js +2 -0
  521. package/dist/server/server/uploads/file-attachment-validation.d.ts +61 -0
  522. package/dist/server/server/uploads/file-attachment-validation.js +56 -0
  523. package/dist/server/server/uploads/staging-service.d.ts +91 -0
  524. package/dist/server/server/uploads/staging-service.js +144 -0
  525. package/dist/server/server/utils/diff-highlighter.d.ts +57 -0
  526. package/dist/server/server/utils/diff-highlighter.js +279 -0
  527. package/dist/server/server/voice/voice-turn-controller.d.ts +38 -0
  528. package/dist/server/server/voice/voice-turn-controller.js +393 -0
  529. package/dist/server/server/voice-config.d.ts +15 -0
  530. package/dist/server/server/voice-config.js +54 -0
  531. package/dist/server/server/voice-permission-policy.d.ts +4 -0
  532. package/dist/server/server/voice-permission-policy.js +13 -0
  533. package/dist/server/server/voice-types.d.ts +12 -0
  534. package/dist/server/server/voice-types.js +2 -0
  535. package/dist/server/server/watch/composer-dictate.d.ts +42 -0
  536. package/dist/server/server/watch/composer-dictate.js +37 -0
  537. package/dist/server/server/watch/notification-action.d.ts +38 -0
  538. package/dist/server/server/watch/notification-action.js +54 -0
  539. package/dist/server/server/watch/notification-registry.d.ts +16 -0
  540. package/dist/server/server/watch/notification-registry.js +2 -0
  541. package/dist/server/server/web-ui.d.ts +10 -0
  542. package/dist/server/server/web-ui.js +205 -0
  543. package/dist/server/server/websocket/runtime-metrics.d.ts +94 -0
  544. package/dist/server/server/websocket/runtime-metrics.js +148 -0
  545. package/dist/server/server/websocket-server.d.ts +193 -0
  546. package/dist/server/server/websocket-server.js +1768 -0
  547. package/dist/server/server/workflow/workflow-feature.d.ts +2 -0
  548. package/dist/server/server/workflow/workflow-feature.js +8 -0
  549. package/dist/server/server/workflow/workflow-http-routes.d.ts +27 -0
  550. package/dist/server/server/workflow/workflow-http-routes.js +97 -0
  551. package/dist/server/server/workflow/workflow-manager.d.ts +228 -0
  552. package/dist/server/server/workflow/workflow-manager.js +444 -0
  553. package/dist/server/server/workflow/workflow-progress.d.ts +95 -0
  554. package/dist/server/server/workflow/workflow-progress.js +178 -0
  555. package/dist/server/server/workflow/workflow-storage.d.ts +36 -0
  556. package/dist/server/server/workflow/workflow-storage.js +143 -0
  557. package/dist/server/server/workspace/all-sessions-route.d.ts +32 -0
  558. package/dist/server/server/workspace/all-sessions-route.js +138 -0
  559. package/dist/server/server/workspace/session-openable.d.ts +16 -0
  560. package/dist/server/server/workspace/session-openable.js +48 -0
  561. package/dist/server/server/workspace/sessions-route.d.ts +15 -0
  562. package/dist/server/server/workspace/sessions-route.js +108 -0
  563. package/dist/server/server/workspace/sessions-search-route.d.ts +68 -0
  564. package/dist/server/server/workspace/sessions-search-route.js +203 -0
  565. package/dist/server/server/workspace-archive-service.d.ts +65 -0
  566. package/dist/server/server/workspace-archive-service.js +229 -0
  567. package/dist/server/server/workspace-auto-name.d.ts +55 -0
  568. package/dist/server/server/workspace-auto-name.js +128 -0
  569. package/dist/server/server/workspace-bootstrap-dedupe.d.ts +34 -0
  570. package/dist/server/server/workspace-bootstrap-dedupe.js +23 -0
  571. package/dist/server/server/workspace-directory.d.ts +93 -0
  572. package/dist/server/server/workspace-directory.js +422 -0
  573. package/dist/server/server/workspace-git-metadata.d.ts +24 -0
  574. package/dist/server/server/workspace-git-metadata.js +55 -0
  575. package/dist/server/server/workspace-git-service.d.ts +257 -0
  576. package/dist/server/server/workspace-git-service.js +1386 -0
  577. package/dist/server/server/workspace-reconciliation-service.d.ts +57 -0
  578. package/dist/server/server/workspace-reconciliation-service.js +278 -0
  579. package/dist/server/server/workspace-registry-bootstrap.d.ts +13 -0
  580. package/dist/server/server/workspace-registry-bootstrap.js +121 -0
  581. package/dist/server/server/workspace-registry-model.d.ts +55 -0
  582. package/dist/server/server/workspace-registry-model.js +190 -0
  583. package/dist/server/server/workspace-registry.d.ts +117 -0
  584. package/dist/server/server/workspace-registry.js +194 -0
  585. package/dist/server/server/workspace-script-runtime-store.d.ts +28 -0
  586. package/dist/server/server/workspace-script-runtime-store.js +78 -0
  587. package/dist/server/server/workspace-service-env.d.ts +18 -0
  588. package/dist/server/server/workspace-service-env.js +85 -0
  589. package/dist/server/server/workspace-service-port-registry.d.ts +19 -0
  590. package/dist/server/server/workspace-service-port-registry.js +59 -0
  591. package/dist/server/server/worktree/commands.d.ts +55 -0
  592. package/dist/server/server/worktree/commands.js +107 -0
  593. package/dist/server/server/worktree-bootstrap.d.ts +76 -0
  594. package/dist/server/server/worktree-bootstrap.js +720 -0
  595. package/dist/server/server/worktree-branch-name-generator.d.ts +35 -0
  596. package/dist/server/server/worktree-branch-name-generator.js +91 -0
  597. package/dist/server/server/worktree-core.d.ts +31 -0
  598. package/dist/server/server/worktree-core.js +105 -0
  599. package/dist/server/server/worktree-errors.d.ts +12 -0
  600. package/dist/server/server/worktree-errors.js +28 -0
  601. package/dist/server/server/worktree-session.d.ts +152 -0
  602. package/dist/server/server/worktree-session.js +466 -0
  603. package/dist/server/services/github-service.d.ts +337 -0
  604. package/dist/server/services/github-service.js +2101 -0
  605. package/dist/server/services/quota-fetcher/manifest.d.ts +4 -0
  606. package/dist/server/services/quota-fetcher/manifest.js +52 -0
  607. package/dist/server/services/quota-fetcher/provider.d.ts +17 -0
  608. package/dist/server/services/quota-fetcher/provider.js +2 -0
  609. package/dist/server/services/quota-fetcher/providers/claude.d.ts +26 -0
  610. package/dist/server/services/quota-fetcher/providers/claude.js +217 -0
  611. package/dist/server/services/quota-fetcher/providers/codex.d.ts +23 -0
  612. package/dist/server/services/quota-fetcher/providers/codex.js +211 -0
  613. package/dist/server/services/quota-fetcher/providers/copilot.d.ts +17 -0
  614. package/dist/server/services/quota-fetcher/providers/copilot.js +75 -0
  615. package/dist/server/services/quota-fetcher/providers/cursor.d.ts +17 -0
  616. package/dist/server/services/quota-fetcher/providers/cursor.js +123 -0
  617. package/dist/server/services/quota-fetcher/providers/grok.d.ts +18 -0
  618. package/dist/server/services/quota-fetcher/providers/grok.js +89 -0
  619. package/dist/server/services/quota-fetcher/providers/kimi.d.ts +20 -0
  620. package/dist/server/services/quota-fetcher/providers/kimi.js +89 -0
  621. package/dist/server/services/quota-fetcher/providers/minimax.d.ts +29 -0
  622. package/dist/server/services/quota-fetcher/providers/minimax.js +227 -0
  623. package/dist/server/services/quota-fetcher/providers/zai.d.ts +17 -0
  624. package/dist/server/services/quota-fetcher/providers/zai.js +58 -0
  625. package/dist/server/services/quota-fetcher/service.d.ts +28 -0
  626. package/dist/server/services/quota-fetcher/service.js +58 -0
  627. package/dist/server/services/quota-fetcher/usage.d.ts +22 -0
  628. package/dist/server/services/quota-fetcher/usage.js +49 -0
  629. package/dist/server/terminal/activity/terminal-activity-tracker.d.ts +20 -0
  630. package/dist/server/terminal/activity/terminal-activity-tracker.js +59 -0
  631. package/dist/server/terminal/agent-hooks/agent-hook-installer.d.ts +62 -0
  632. package/dist/server/terminal/agent-hooks/agent-hook-installer.js +117 -0
  633. package/dist/server/terminal/agent-hooks/claude/claude-settings.d.ts +7 -0
  634. package/dist/server/terminal/agent-hooks/claude/claude-settings.js +88 -0
  635. package/dist/server/terminal/agent-hooks/claude/claude.d.ts +4 -0
  636. package/dist/server/terminal/agent-hooks/claude/claude.js +47 -0
  637. package/dist/server/terminal/agent-hooks/codex/codex-settings.d.ts +7 -0
  638. package/dist/server/terminal/agent-hooks/codex/codex-settings.js +99 -0
  639. package/dist/server/terminal/agent-hooks/codex/codex.d.ts +4 -0
  640. package/dist/server/terminal/agent-hooks/codex/codex.js +30 -0
  641. package/dist/server/terminal/agent-hooks/opencode/opencode-plugin.d.ts +4 -0
  642. package/dist/server/terminal/agent-hooks/opencode/opencode-plugin.js +46 -0
  643. package/dist/server/terminal/agent-hooks/opencode/opencode.d.ts +3 -0
  644. package/dist/server/terminal/agent-hooks/opencode/opencode.js +23 -0
  645. package/dist/server/terminal/agent-hooks/provider-registry.d.ts +24 -0
  646. package/dist/server/terminal/agent-hooks/provider-registry.js +36 -0
  647. package/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.d.ts +10 -0
  648. package/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.js +26 -0
  649. package/dist/server/terminal/shell-integration/zsh/.zshenv +17 -0
  650. package/dist/server/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
  651. package/dist/server/terminal/terminal-capture.d.ts +12 -0
  652. package/dist/server/terminal/terminal-capture.js +43 -0
  653. package/dist/server/terminal/terminal-manager-factory.d.ts +6 -0
  654. package/dist/server/terminal/terminal-manager-factory.js +5 -0
  655. package/dist/server/terminal/terminal-manager.d.ts +78 -0
  656. package/dist/server/terminal/terminal-manager.js +319 -0
  657. package/dist/server/terminal/terminal-output-coalescer.d.ts +34 -0
  658. package/dist/server/terminal/terminal-output-coalescer.js +73 -0
  659. package/dist/server/terminal/terminal-restore.d.ts +18 -0
  660. package/dist/server/terminal/terminal-restore.js +52 -0
  661. package/dist/server/terminal/terminal-session-controller.d.ts +85 -0
  662. package/dist/server/terminal/terminal-session-controller.js +819 -0
  663. package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
  664. package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
  665. package/dist/server/terminal/terminal-worker-process.js +304 -0
  666. package/dist/server/terminal/terminal-worker-protocol.d.ts +119 -0
  667. package/dist/server/terminal/terminal-worker-protocol.js +2 -0
  668. package/dist/server/terminal/terminal.d.ts +151 -0
  669. package/dist/server/terminal/terminal.js +1161 -0
  670. package/dist/server/terminal/worker-terminal-manager.d.ts +20 -0
  671. package/dist/server/terminal/worker-terminal-manager.js +688 -0
  672. package/dist/server/utils/build-metadata-prompt.d.ts +19 -0
  673. package/dist/server/utils/build-metadata-prompt.js +29 -0
  674. package/dist/server/utils/checkout-git.d.ts +253 -0
  675. package/dist/server/utils/checkout-git.js +2238 -0
  676. package/dist/server/utils/directory-suggestions.d.ts +26 -0
  677. package/dist/server/utils/directory-suggestions.js +830 -0
  678. package/dist/server/utils/git-rev-parse-path.d.ts +3 -0
  679. package/dist/server/utils/git-rev-parse-path.js +21 -0
  680. package/dist/server/utils/github-remote.d.ts +9 -0
  681. package/dist/server/utils/github-remote.js +62 -0
  682. package/dist/server/utils/paseo-config-file.d.ts +30 -0
  683. package/dist/server/utils/paseo-config-file.js +90 -0
  684. package/dist/server/utils/path.d.ts +18 -0
  685. package/dist/server/utils/path.js +123 -0
  686. package/dist/server/utils/project-icon.d.ts +39 -0
  687. package/dist/server/utils/project-icon.js +364 -0
  688. package/dist/server/utils/promise-timeout.d.ts +9 -0
  689. package/dist/server/utils/promise-timeout.js +25 -0
  690. package/dist/server/utils/run-git-command.d.ts +37 -0
  691. package/dist/server/utils/run-git-command.js +232 -0
  692. package/dist/server/utils/spawn.d.ts +33 -0
  693. package/dist/server/utils/spawn.js +71 -0
  694. package/dist/server/utils/string-command-shell.d.ts +10 -0
  695. package/dist/server/utils/string-command-shell.js +21 -0
  696. package/dist/server/utils/tree-kill.d.ts +18 -0
  697. package/dist/server/utils/tree-kill.js +77 -0
  698. package/dist/server/utils/windows-command.d.ts +15 -0
  699. package/dist/server/utils/windows-command.js +41 -0
  700. package/dist/server/utils/worktree-metadata.d.ts +39 -0
  701. package/dist/server/utils/worktree-metadata.js +174 -0
  702. package/dist/server/utils/worktree.d.ts +205 -0
  703. package/dist/server/utils/worktree.js +1119 -0
  704. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css +1 -0
  705. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.br +0 -0
  706. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.gz +0 -0
  707. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-127b8d280bb901a810b0c9fa094d4945.js +5 -0
  708. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-127b8d280bb901a810b0c9fa094d4945.js.br +0 -0
  709. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-127b8d280bb901a810b0c9fa094d4945.js.gz +0 -0
  710. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-127b8d280bb901a810b0c9fa094d4945.js.map.br +0 -0
  711. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-127b8d280bb901a810b0c9fa094d4945.js.map.gz +0 -0
  712. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-0e6ed782245f4dda6e0a73171a133d45.js +3 -0
  713. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-0e6ed782245f4dda6e0a73171a133d45.js.br +0 -0
  714. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-0e6ed782245f4dda6e0a73171a133d45.js.gz +0 -0
  715. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-0e6ed782245f4dda6e0a73171a133d45.js.map.br +0 -0
  716. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-0e6ed782245f4dda6e0a73171a133d45.js.map.gz +0 -0
  717. package/dist/server/web-ui/_expo/static/js/web/index-b31c4d6fb6383454381e43410736cb89.js +16533 -0
  718. package/dist/server/web-ui/_expo/static/js/web/index-b31c4d6fb6383454381e43410736cb89.js.br +0 -0
  719. package/dist/server/web-ui/_expo/static/js/web/index-b31c4d6fb6383454381e43410736cb89.js.gz +0 -0
  720. package/dist/server/web-ui/_expo/static/js/web/index-b31c4d6fb6383454381e43410736cb89.js.map.br +0 -0
  721. package/dist/server/web-ui/_expo/static/js/web/index-b31c4d6fb6383454381e43410736cb89.js.map.gz +0 -0
  722. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-0d03551c4ea3780f5b81db6a7aebb017.js +3 -0
  723. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-0d03551c4ea3780f5b81db6a7aebb017.js.br +0 -0
  724. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-0d03551c4ea3780f5b81db6a7aebb017.js.gz +0 -0
  725. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-0d03551c4ea3780f5b81db6a7aebb017.js.map.br +0 -0
  726. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-0d03551c4ea3780f5b81db6a7aebb017.js.map.gz +0 -0
  727. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-feda55adc8031781db083743ca73cbc3.js +5 -0
  728. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-feda55adc8031781db083743ca73cbc3.js.br +0 -0
  729. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-feda55adc8031781db083743ca73cbc3.js.gz +0 -0
  730. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-feda55adc8031781db083743ca73cbc3.js.map.br +0 -0
  731. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-feda55adc8031781db083743ca73cbc3.js.map.gz +0 -0
  732. package/dist/server/web-ui/_expo/static/js/web/profiler-593c9481537cb12f4b6c17ef48bcba1c.js +11 -0
  733. package/dist/server/web-ui/_expo/static/js/web/profiler-593c9481537cb12f4b6c17ef48bcba1c.js.br +0 -0
  734. package/dist/server/web-ui/_expo/static/js/web/profiler-593c9481537cb12f4b6c17ef48bcba1c.js.gz +0 -0
  735. package/dist/server/web-ui/_expo/static/js/web/profiler-593c9481537cb12f4b6c17ef48bcba1c.js.map.br +0 -0
  736. package/dist/server/web-ui/_expo/static/js/web/profiler-593c9481537cb12f4b6c17ef48bcba1c.js.map.gz +0 -0
  737. package/dist/server/web-ui/_expo/static/js/web/startRecording-533a4fe1acfc37460ac2912610062d3a.js +60 -0
  738. package/dist/server/web-ui/_expo/static/js/web/startRecording-533a4fe1acfc37460ac2912610062d3a.js.br +0 -0
  739. package/dist/server/web-ui/_expo/static/js/web/startRecording-533a4fe1acfc37460ac2912610062d3a.js.gz +0 -0
  740. package/dist/server/web-ui/_expo/static/js/web/startRecording-533a4fe1acfc37460ac2912610062d3a.js.map.br +0 -0
  741. package/dist/server/web-ui/_expo/static/js/web/startRecording-533a4fe1acfc37460ac2912610062d3a.js.map.gz +0 -0
  742. package/dist/server/web-ui/apple-touch-icon.png +0 -0
  743. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
  744. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
  745. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
  746. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
  747. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
  748. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
  749. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
  750. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
  751. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
  752. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
  753. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
  754. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
  755. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
  756. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
  757. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
  758. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
  759. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
  760. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
  761. package/dist/server/web-ui/assets/assets/images/editor-apps/antigravity.6e91a685c33435e0b466a56db86cf141.png +0 -0
  762. package/dist/server/web-ui/assets/assets/images/editor-apps/cursor.c31d6bce4fe9aadc3fe59962f4c4fcf3.png +0 -0
  763. package/dist/server/web-ui/assets/assets/images/editor-apps/file-explorer.3e15e8f72c825c85ce336bcb0cdef776.png +0 -0
  764. package/dist/server/web-ui/assets/assets/images/editor-apps/finder.7f68fc2c475621a672e1be09309d5567.png +0 -0
  765. package/dist/server/web-ui/assets/assets/images/editor-apps/vscode.832bdb4c685d930f1c864c793703600b.png +0 -0
  766. package/dist/server/web-ui/assets/assets/images/editor-apps/webstorm.aa5dc2cd8c20cc0a155c4c5c5ab3c5f5.png +0 -0
  767. package/dist/server/web-ui/assets/assets/images/editor-apps/zed.f3a670b7f9aa226da4fe53fb86f1abbd.png +0 -0
  768. package/dist/server/web-ui/assets/assets/images/favicon-dark-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  769. package/dist/server/web-ui/assets/assets/images/favicon-dark-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  770. package/dist/server/web-ui/assets/assets/images/favicon-dark.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  771. package/dist/server/web-ui/assets/assets/images/favicon-light-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  772. package/dist/server/web-ui/assets/assets/images/favicon-light-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  773. package/dist/server/web-ui/assets/assets/images/favicon-light.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  774. package/dist/server/web-ui/assets/assets/images/notification-icon.3bf81d33ddbf380606bdd248ba83e158.png +0 -0
  775. package/dist/server/web-ui/favicon.ico +0 -0
  776. package/dist/server/web-ui/index.html +90 -0
  777. package/dist/server/web-ui/index.html.br +0 -0
  778. package/dist/server/web-ui/index.html.gz +0 -0
  779. package/dist/server/web-ui/manifest.json +27 -0
  780. package/dist/server/web-ui/manifest.json.br +0 -0
  781. package/dist/server/web-ui/manifest.json.gz +0 -0
  782. package/dist/server/web-ui/metadata.json +1 -0
  783. package/dist/server/web-ui/metadata.json.br +1 -0
  784. package/dist/server/web-ui/metadata.json.gz +0 -0
  785. package/dist/server/web-ui/pwa-icon-192.png +0 -0
  786. package/dist/server/web-ui/pwa-icon-512.png +0 -0
  787. package/dist/server/web-ui/robots.txt +2 -0
  788. package/dist/server/web-ui/service-worker.js +87 -0
  789. package/dist/server/web-ui/service-worker.js.br +0 -0
  790. package/dist/server/web-ui/service-worker.js.gz +0 -0
  791. package/dist/src/executable-resolution/executable-resolution.js +118 -0
  792. package/dist/src/executable-resolution/windows.js +65 -0
  793. package/dist/src/server/agent/provider-launch-config.js +183 -0
  794. package/dist/src/server/paseo-env.js +53 -0
  795. package/dist/src/server/paseo-home.js +19 -0
  796. package/dist/src/server/persisted-config.js +402 -0
  797. package/dist/src/server/pid-lock.js +170 -0
  798. package/dist/src/server/private-files.js +37 -0
  799. package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  800. package/dist/src/terminal/shell-integration/zsh/.zshenv +17 -0
  801. package/dist/src/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
  802. package/dist/src/utils/spawn.js +71 -0
  803. package/dist/src/utils/windows-command.js +41 -0
  804. package/package.json +143 -0
@@ -0,0 +1,1193 @@
1
+ import express from "express";
2
+ import { createServer as createHTTPServer } from "http";
3
+ import { constants, existsSync, unlinkSync } from "fs";
4
+ import { open } from "fs/promises";
5
+ import { randomUUID } from "node:crypto";
6
+ import { hostname as getHostname } from "node:os";
7
+ import path from "node:path";
8
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
9
+ import { z } from "zod";
10
+ import { createBranchChangeRouteHandler } from "./script-route-branch-handler.js";
11
+ function resolveBoundListenTarget(listenTarget, httpServer) {
12
+ if (listenTarget.type !== "tcp") {
13
+ return listenTarget;
14
+ }
15
+ const address = httpServer.address();
16
+ if (!address || typeof address === "string") {
17
+ throw new Error("HTTP server did not expose a TCP address after listening");
18
+ }
19
+ return {
20
+ type: "tcp",
21
+ host: listenTarget.host,
22
+ port: address.port,
23
+ };
24
+ }
25
+ // Matches a Windows drive-letter path like C:\ or D:\
26
+ const WINDOWS_DRIVE_RE = /^[A-Za-z]:\\/;
27
+ export function parseListenString(listen) {
28
+ // 1. Windows named pipes: \\.\pipe\... or pipe://...
29
+ if (listen.startsWith("\\\\.\\pipe\\") || listen.startsWith("pipe://")) {
30
+ return {
31
+ type: "pipe",
32
+ path: listen.startsWith("pipe://") ? listen.slice("pipe://".length) : listen,
33
+ };
34
+ }
35
+ // 2. Explicit unix:// prefix
36
+ if (listen.startsWith("unix://")) {
37
+ return { type: "socket", path: listen.slice(7) };
38
+ }
39
+ // 3. Reject Windows absolute drive paths — they are not Unix sockets
40
+ if (WINDOWS_DRIVE_RE.test(listen)) {
41
+ throw new Error(`Invalid listen string (Windows path is not a valid listen target): ${listen}`);
42
+ }
43
+ // 4. POSIX absolute path (/ or ~) — Unix socket
44
+ if (listen.startsWith("/") || listen.startsWith("~")) {
45
+ return { type: "socket", path: listen };
46
+ }
47
+ // 5. Pure numeric — TCP port on 127.0.0.1
48
+ const trimmed = listen.trim();
49
+ if (/^\d+$/.test(trimmed)) {
50
+ const port = parseInt(trimmed, 10);
51
+ return { type: "tcp", host: "127.0.0.1", port };
52
+ }
53
+ // 6. host:port — TCP
54
+ if (listen.includes(":")) {
55
+ const lastColonIdx = listen.lastIndexOf(":");
56
+ const host = listen.slice(0, lastColonIdx);
57
+ const portStr = listen.slice(lastColonIdx + 1);
58
+ const parsedPort = parseInt(portStr, 10);
59
+ if (!Number.isFinite(parsedPort)) {
60
+ throw new Error(`Invalid port in listen string: ${listen}`);
61
+ }
62
+ const cleanHost = host.startsWith("[") && host.endsWith("]") ? host.slice(1, -1) : host;
63
+ return { type: "tcp", host: cleanHost || "127.0.0.1", port: parsedPort };
64
+ }
65
+ throw new Error(`Invalid listen string: ${listen}`);
66
+ }
67
+ function formatListenTarget(listenTarget) {
68
+ if (!listenTarget) {
69
+ return null;
70
+ }
71
+ if (listenTarget.type === "tcp") {
72
+ return `${listenTarget.host}:${listenTarget.port}`;
73
+ }
74
+ return listenTarget.path;
75
+ }
76
+ import { VoiceAssistantWebSocketServer } from "./websocket-server.js";
77
+ import { createPushSubsystem } from "./push/index.js";
78
+ import { registerPushRoutes } from "./push/routes.js";
79
+ import { registerAllSessionsRoute } from "./workspace/all-sessions-route.js";
80
+ import { registerSessionsSearchRoute } from "./workspace/sessions-search-route.js";
81
+ import { registerWorkspaceSessionsRoute } from "./workspace/sessions-route.js";
82
+ import { PushSubscriptionStore } from "./push/subscriptions.js";
83
+ import { loadOrGenerateVapidKeys } from "./push/vapid-keys.js";
84
+ import { createGitHubService } from "../services/github-service.js";
85
+ import { createPaseoWorktree as createRegisteredPaseoWorktree, createLocalCheckoutWorkspace, } from "./paseo-worktree-service.js";
86
+ import { createPaseoWorktreeWorkflow } from "./worktree-session.js";
87
+ import { DownloadTokenStore } from "./file-download/token-store.js";
88
+ import { registerMeetingsRoutes } from "./meetings/meetings-http.js";
89
+ import { registerCaptureRoutes } from "./meetings/capture-http.js";
90
+ import { getCaptureStreamWs } from "./meetings/capture-stream-ws.js";
91
+ import { createSpeechService } from "./speech/speech-runtime.js";
92
+ import { AgentManager } from "./agent/agent-manager.js";
93
+ import { scheduleSessionDigestRefresh } from "./agent/session-digest-generator.js";
94
+ import { registerAgentRoutes } from "./agent/agent-routes.js";
95
+ import { AgentStorage } from "./agent/agent-storage.js";
96
+ import { attachAgentStoragePersistence } from "./persistence-hooks.js";
97
+ import { WorkflowStorage } from "./workflow/workflow-storage.js";
98
+ import { WORKFLOWS_FEATURE_ENABLED } from "./workflow/workflow-feature.js";
99
+ import { registerWorkflowHttpRoutes } from "./workflow/workflow-http-routes.js";
100
+ import { WorkflowManager } from "./workflow/workflow-manager.js";
101
+ import { createAgentMcpServer } from "./agent/mcp-server.js";
102
+ import { createPaseoToolCatalog, } from "./agent/tools/paseo-tools.js";
103
+ import { ProviderSnapshotManager } from "./agent/provider-snapshot-manager.js";
104
+ import { bootstrapWorkspaceRegistries } from "./workspace-registry-bootstrap.js";
105
+ import { WorkspaceReconciliationService } from "./workspace-reconciliation-service.js";
106
+ import { FileBackedProjectRegistry, FileBackedWorkspaceRegistry } from "./workspace-registry.js";
107
+ import { FileBackedChatService } from "./chat/chat-service.js";
108
+ import { CheckoutDiffManager } from "./checkout-diff-manager.js";
109
+ import { LoopService } from "./loop-service.js";
110
+ import { ScheduleService } from "./schedule/service.js";
111
+ import { createExtensionService } from "../extensions/extension-service.js";
112
+ import { DaemonConfigStore } from "./daemon-config-store.js";
113
+ import { BrowserToolsBroker } from "./browser-tools/broker.js";
114
+ import { DaemonConfigBrowserToolsPolicy } from "./browser-tools/policy.js";
115
+ import { WorkspaceGitServiceImpl } from "./workspace-git-service.js";
116
+ import { resolveWorkspaceIdForPath } from "./resolve-workspace-id-for-path.js";
117
+ import { archivePersistedWorkspaceRecord, } from "./workspace-archive-service.js";
118
+ import { setupAutoArchiveOnMerge } from "./auto-archive-on-merge/index.js";
119
+ import { wrapSessionMessage } from "./messages.js";
120
+ import { createConfiguredTerminalManager } from "../terminal/terminal-manager-factory.js";
121
+ import { applyTerminalAgentHookSetting } from "../terminal/agent-hooks/terminal-agent-hook-setting.js";
122
+ import { createConnectionOfferV2, encodeOfferToFragmentUrl } from "./connection-offer.js";
123
+ import { loadOrCreateDaemonKeyPair } from "./daemon-keypair.js";
124
+ import { startRelayTransport } from "./relay-transport.js";
125
+ import { getOrCreateServerId } from "./server-id.js";
126
+ import { resolveDaemonVersion } from "./daemon-version.js";
127
+ import { createServiceProxySubsystem } from "./service-proxy.js";
128
+ import { ScriptHealthMonitor } from "./script-health-monitor.js";
129
+ import { createScriptStatusEmitter } from "./script-status-projection.js";
130
+ import { WorkspaceScriptRuntimeStore } from "./workspace-script-runtime-store.js";
131
+ import { createManagedProcessRegistry, createSystemManagedProcessTable, } from "./managed-processes/managed-processes.js";
132
+ import { terminateWithTreeKill } from "../utils/tree-kill.js";
133
+ import { isHostnameAllowed } from "./hostnames.js";
134
+ import { createRequireBearerMiddleware, isAgentMcpRequestAuthorized, } from "./auth.js";
135
+ import { createWebUiMiddleware } from "./web-ui.js";
136
+ import { registerSessionRenameRoute } from "./session/session-rename-route.js";
137
+ import { WorkspaceAutoName } from "./workspace-auto-name.js";
138
+ import { createGitMutationService } from "./session/git-mutation/git-mutation-service.js";
139
+ import { workspaceIdsOnCheckout } from "./workspace-directory.js";
140
+ import { resolveFirstAgentPromptTitle } from "./agent/create-agent-title.js";
141
+ const MAX_MCP_DEBUG_BATCH_ITEMS = 10;
142
+ const REDACTED_LOG_VALUE = "[redacted]";
143
+ const DOWNLOAD_OPEN_FLAGS = process.platform === "win32" ? constants.O_RDONLY : constants.O_RDONLY | constants.O_NOFOLLOW;
144
+ function formatHostForHttpUrl(host) {
145
+ return host.includes(":") && !host.startsWith("[") ? `[${host}]` : host;
146
+ }
147
+ function resolveAgentMcpClientHost(host) {
148
+ if (host === "0.0.0.0") {
149
+ return "127.0.0.1";
150
+ }
151
+ if (host === "::" || host === "[::]") {
152
+ return "::1";
153
+ }
154
+ return host;
155
+ }
156
+ function createAgentMcpBaseUrl(listenTarget) {
157
+ if (!listenTarget || listenTarget.type !== "tcp") {
158
+ return null;
159
+ }
160
+ const host = resolveAgentMcpClientHost(listenTarget.host);
161
+ return new URL("/mcp/agents", `http://${formatHostForHttpUrl(host)}:${listenTarget.port}`).toString();
162
+ }
163
+ function createTerminalActivityUrl(listenTarget) {
164
+ if (!listenTarget || listenTarget.type !== "tcp") {
165
+ return null;
166
+ }
167
+ const host = resolveAgentMcpClientHost(listenTarget.host);
168
+ return new URL("/api/terminal-activity", `http://${formatHostForHttpUrl(host)}:${listenTarget.port}`).toString();
169
+ }
170
+ const TerminalActivityReportSchema = z.object({
171
+ terminalId: z.string().min(1),
172
+ token: z.string().min(1),
173
+ state: z.enum(["running", "idle", "needs-input"]),
174
+ });
175
+ const TERMINAL_ACTIVITY_STATE_MAP = {
176
+ running: "working",
177
+ idle: "idle",
178
+ "needs-input": "attention",
179
+ };
180
+ const LOOPBACK_REMOTE_ADDRESSES = new Set(["127.0.0.1", "::1", "::ffff:127.0.0.1"]);
181
+ function isLoopbackRemoteAddress(remoteAddress) {
182
+ return remoteAddress !== undefined && LOOPBACK_REMOTE_ADDRESSES.has(remoteAddress);
183
+ }
184
+ export function createTerminalActivityRouteHandler(terminalManager) {
185
+ return async (req, res) => {
186
+ if (!isLoopbackRemoteAddress(req.socket.remoteAddress)) {
187
+ res.status(403).json({ error: "Forbidden" });
188
+ return;
189
+ }
190
+ const parsed = TerminalActivityReportSchema.safeParse(req.body);
191
+ if (!parsed.success) {
192
+ res.status(400).json({ error: "Invalid terminal activity report" });
193
+ return;
194
+ }
195
+ const validation = terminalManager.validateTerminalActivityToken(parsed.data.terminalId, parsed.data.token);
196
+ if (validation !== "valid") {
197
+ res.status(403).json({ error: "Forbidden" });
198
+ return;
199
+ }
200
+ try {
201
+ const updated = await terminalManager.setTerminalActivity(parsed.data.terminalId, TERMINAL_ACTIVITY_STATE_MAP[parsed.data.state]);
202
+ if (!updated) {
203
+ res.status(403).json({ error: "Forbidden" });
204
+ return;
205
+ }
206
+ res.status(204).end();
207
+ }
208
+ catch {
209
+ res.status(500).json({ error: "Failed to update terminal activity" });
210
+ }
211
+ };
212
+ }
213
+ function summarizeAgentMcpDebugMessage(body) {
214
+ if (!body || typeof body !== "object" || Array.isArray(body)) {
215
+ return {
216
+ type: body === null ? "null" : typeof body,
217
+ };
218
+ }
219
+ const record = body;
220
+ const method = typeof record.method === "string" ? record.method : undefined;
221
+ return {
222
+ type: "object",
223
+ ...(typeof record.jsonrpc === "string" ? { jsonrpc: record.jsonrpc } : {}),
224
+ ...(method ? { method } : {}),
225
+ hasId: Object.prototype.hasOwnProperty.call(record, "id"),
226
+ hasParams: Object.prototype.hasOwnProperty.call(record, "params"),
227
+ };
228
+ }
229
+ function summarizeAgentMcpDebugBody(body) {
230
+ if (!Array.isArray(body)) {
231
+ return summarizeAgentMcpDebugMessage(body);
232
+ }
233
+ const messages = body.slice(0, MAX_MCP_DEBUG_BATCH_ITEMS).map(summarizeAgentMcpDebugMessage);
234
+ return {
235
+ type: "batch",
236
+ count: body.length,
237
+ messages,
238
+ ...(body.length > messages.length ? { omitted: body.length - messages.length } : {}),
239
+ };
240
+ }
241
+ function createBootstrapManagedProcessRegistry(config, logger) {
242
+ if (config.managedProcesses) {
243
+ return config.managedProcesses;
244
+ }
245
+ return createManagedProcessRegistry({
246
+ paseoHome: config.paseoHome,
247
+ processTable: createSystemManagedProcessTable(),
248
+ terminateProcess: terminateWithTreeKill,
249
+ logger,
250
+ });
251
+ }
252
+ async function reconcileManagedProcessLedger(managedProcesses, logger) {
253
+ const reapResult = await managedProcesses.reapStale();
254
+ if (reapResult.checked > 0 || reapResult.errors.length > 0) {
255
+ logger.info(reapResult, "Managed helper process ledger reconciled");
256
+ }
257
+ }
258
+ function mountWebUi(app, config, logger) {
259
+ app.use(createWebUiMiddleware({
260
+ enabled: config.webUi?.enabled ?? false,
261
+ distDir: config.webUi?.distDir ?? null,
262
+ label: getHostname(),
263
+ logger,
264
+ }));
265
+ }
266
+ function resolveExpressTrustProxySetting(config) {
267
+ return config.trustedProxies ?? ["loopback"];
268
+ }
269
+ function createInitialMutableDaemonConfig(config) {
270
+ const providers = Object.fromEntries(Object.entries(config.providerOverrides ?? {}).map(([providerId, override]) => {
271
+ const providerConfig = {};
272
+ if (override.enabled !== undefined) {
273
+ providerConfig.enabled = override.enabled;
274
+ }
275
+ if (override.additionalModels) {
276
+ providerConfig.additionalModels = override.additionalModels;
277
+ }
278
+ return [providerId, providerConfig];
279
+ }));
280
+ const initialConfig = {
281
+ mcp: { injectIntoAgents: config.mcpInjectIntoAgents ?? true },
282
+ browserTools: { enabled: config.browserToolsEnabled ?? false },
283
+ providers,
284
+ metadataGeneration: {
285
+ providers: config.metadataGeneration?.providers ?? [],
286
+ },
287
+ autoArchiveAfterMerge: config.autoArchiveAfterMerge ?? false,
288
+ enableTerminalAgentHooks: config.enableTerminalAgentHooks ?? false,
289
+ appendSystemPrompt: config.appendSystemPrompt ?? "",
290
+ };
291
+ if (config.terminalProfiles !== undefined) {
292
+ initialConfig.terminalProfiles = config.terminalProfiles;
293
+ }
294
+ return initialConfig;
295
+ }
296
+ export async function createPaseoDaemon(config, rootLogger) {
297
+ const logger = rootLogger.child({ module: "bootstrap" });
298
+ const bootstrapStart = performance.now();
299
+ const elapsed = () => `${(performance.now() - bootstrapStart).toFixed(0)}ms`;
300
+ const daemonVersion = resolveDaemonVersion(import.meta.url);
301
+ const daemonConfigStore = new DaemonConfigStore(config.paseoHome, createInitialMutableDaemonConfig(config), logger);
302
+ const browserToolsPolicy = new DaemonConfigBrowserToolsPolicy(daemonConfigStore);
303
+ const browserToolsBroker = new BrowserToolsBroker({});
304
+ const serverId = getOrCreateServerId(config.paseoHome, { logger });
305
+ const daemonKeyPair = await loadOrCreateDaemonKeyPair(config.paseoHome, logger);
306
+ const managedProcesses = createBootstrapManagedProcessRegistry(config, logger);
307
+ // Reconcile the helper-process ledger in the background so it never blocks the
308
+ // daemon from coming up; terminating a live leftover can take a few seconds.
309
+ // Best-effort, so a failure is logged here rather than crashing startup.
310
+ void reconcileManagedProcessLedger(managedProcesses, logger).catch((error) => {
311
+ logger.warn({ err: error }, "Failed to reconcile managed helper process ledger");
312
+ });
313
+ let relayTransport = null;
314
+ const staticDir = config.staticDir;
315
+ const downloadTokenTtlMs = config.downloadTokenTtlMs ?? 60000;
316
+ const downloadTokenStore = new DownloadTokenStore({
317
+ ttlMs: downloadTokenTtlMs,
318
+ });
319
+ // Capability token authenticating the daemon's own agents to the loopback
320
+ // Agent MCP endpoint (/mcp/agents). Random per daemon run, injected only into
321
+ // local agent configs and the daemon's own MCP client — never sent to remote
322
+ // clients — so it cannot be replayed off-box. This lets the injected MCP
323
+ // authenticate even when the daemon password is set via the app (hash only,
324
+ // no plaintext available). Mirrors the /api/files/download capability-token
325
+ // pattern.
326
+ const agentMcpAuthToken = randomUUID();
327
+ const listenTarget = parseListenString(config.listen);
328
+ const app = express();
329
+ app.set("trust proxy", resolveExpressTrustProxySetting(config));
330
+ let boundListenTarget = null;
331
+ let workspaceRegistry = null;
332
+ const terminalManager = createConfiguredTerminalManager({
333
+ getTerminalActivityUrl: () => createTerminalActivityUrl(boundListenTarget),
334
+ });
335
+ applyTerminalAgentHookSetting({ store: daemonConfigStore, logger });
336
+ const serviceProxyPublicBaseUrl = config.serviceProxy?.publicBaseUrl
337
+ ? config.serviceProxy.publicBaseUrl
338
+ : null;
339
+ const serviceProxy = createServiceProxySubsystem({
340
+ logger,
341
+ publicBaseUrl: serviceProxyPublicBaseUrl,
342
+ });
343
+ const scriptRuntimeStore = new WorkspaceScriptRuntimeStore();
344
+ const configuredHostnames = config.hostnames ?? config.allowedHosts;
345
+ let wsServer = null;
346
+ let pushSubsystem = null;
347
+ let serviceProxyListenTarget = null;
348
+ const scriptHealthMonitor = new ScriptHealthMonitor({
349
+ serviceProxy,
350
+ onChange: createScriptStatusEmitter({
351
+ sessions: () => wsServer?.listActiveSessions().map((session) => ({
352
+ emit: (message) => session.emitServerMessage(message),
353
+ })) ?? [],
354
+ serviceProxy,
355
+ runtimeStore: scriptRuntimeStore,
356
+ daemonPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
357
+ resolveWorkspaceDirectory: async (workspaceId) => (await workspaceRegistry?.get(workspaceId))?.cwd ?? null,
358
+ logger,
359
+ serviceProxyPublicBaseUrl,
360
+ }),
361
+ });
362
+ const handleBranchChange = createBranchChangeRouteHandler({
363
+ serviceProxy,
364
+ onRoutesChanged: (workspaceId) => {
365
+ scriptHealthMonitor.invalidateWorkspace(workspaceId);
366
+ },
367
+ logger,
368
+ });
369
+ // Service proxy classifies service hosts before daemon auth/route fallthrough.
370
+ // Registered service hosts proxy directly; known service namespaces without a
371
+ // route return 404 and never reach daemon APIs.
372
+ app.use(serviceProxy.middleware());
373
+ // Host allowlist / DNS rebinding protection (vite-like semantics).
374
+ // For non-TCP (unix sockets), skip host validation.
375
+ if (listenTarget.type === "tcp") {
376
+ app.use((req, res, next) => {
377
+ const hostHeader = typeof req.headers.host === "string" ? req.headers.host : undefined;
378
+ if (!isHostnameAllowed(hostHeader, configuredHostnames)) {
379
+ res.status(403).json({ error: "Invalid Host header" });
380
+ return;
381
+ }
382
+ next();
383
+ });
384
+ }
385
+ // CORS - allow same-origin + configured origins
386
+ const allowedOrigins = new Set([
387
+ ...config.corsAllowedOrigins,
388
+ // Packaged desktop renderers use the custom paseo:// protocol scheme.
389
+ "paseo://app",
390
+ // For TCP, add localhost variants
391
+ ...(listenTarget.type === "tcp"
392
+ ? [
393
+ `http://${listenTarget.host}:${listenTarget.port}`,
394
+ `http://localhost:${listenTarget.port}`,
395
+ `http://127.0.0.1:${listenTarget.port}`,
396
+ ]
397
+ : []),
398
+ ]);
399
+ app.use((req, res, next) => {
400
+ const origin = req.headers.origin;
401
+ if (origin && (allowedOrigins.has("*") || allowedOrigins.has(origin))) {
402
+ res.setHeader("Access-Control-Allow-Origin", origin);
403
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
404
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
405
+ res.setHeader("Access-Control-Allow-Credentials", "true");
406
+ }
407
+ if (req.method === "OPTIONS") {
408
+ res.status(204).end();
409
+ return;
410
+ }
411
+ next();
412
+ });
413
+ // Local, harmless, and token-gated; deliberately skips daemon auth.
414
+ app.post("/api/terminal-activity", express.json(), createTerminalActivityRouteHandler(terminalManager));
415
+ // Serve the bundled browser web UI when enabled. Mounted after service-proxy
416
+ // classification and host/CORS handling, but before daemon bearer auth, so
417
+ // static app files load without the daemon password while API/WebSocket calls
418
+ // remain protected.
419
+ mountWebUi(app, config, logger);
420
+ app.use(createRequireBearerMiddleware(config.auth, (context) => {
421
+ logger.warn(context, "Rejected HTTP request with invalid daemon password");
422
+ }));
423
+ app.use(express.json());
424
+ // Serve static files from public directory
425
+ app.use("/public", express.static(staticDir));
426
+ // Health check endpoint
427
+ app.get("/api/health", (_req, res) => {
428
+ res.json({ status: "ok", timestamp: new Date().toISOString() });
429
+ });
430
+ // MEETINGS BACKEND (B) — serve real meeting data from the engine's meetings.db
431
+ registerMeetingsRoutes(app);
432
+ // CAPTURE — start/stop/status for a live meeting capture session (spawns meetcap)
433
+ registerCaptureRoutes(app);
434
+ app.get("/api/status", (_req, res) => {
435
+ res.json({
436
+ status: "server_info",
437
+ serverId,
438
+ hostname: getHostname(),
439
+ version: daemonVersion,
440
+ listen: formatListenTarget(boundListenTarget ?? listenTarget),
441
+ });
442
+ });
443
+ const handleFileDownload = async (req, res) => {
444
+ const token = typeof req.query.token === "string" && req.query.token.trim().length > 0
445
+ ? req.query.token.trim()
446
+ : null;
447
+ if (!token) {
448
+ res.status(400).json({ error: "Missing download token" });
449
+ return;
450
+ }
451
+ const entry = downloadTokenStore.consumeToken(token);
452
+ if (!entry) {
453
+ res.status(403).json({ error: "Invalid or expired token" });
454
+ return;
455
+ }
456
+ let fileHandle = null;
457
+ try {
458
+ fileHandle = await open(entry.absolutePath, DOWNLOAD_OPEN_FLAGS);
459
+ const fileStats = await fileHandle.stat();
460
+ if (!fileStats.isFile()) {
461
+ res.status(404).json({ error: "File not found" });
462
+ return;
463
+ }
464
+ const safeFileName = entry.fileName.replace(/["\r\n]/g, "_");
465
+ res.setHeader("Content-Type", entry.mimeType);
466
+ res.setHeader("Content-Disposition", `attachment; filename="${safeFileName}"`);
467
+ res.setHeader("Content-Length", fileStats.size.toString());
468
+ const stream = fileHandle.createReadStream();
469
+ fileHandle = null;
470
+ stream.on("error", (err) => {
471
+ logger.error({ err }, "Failed to stream download");
472
+ if (!res.headersSent) {
473
+ res.status(500).json({ error: "Failed to read file" });
474
+ }
475
+ else {
476
+ res.end();
477
+ }
478
+ });
479
+ stream.pipe(res);
480
+ }
481
+ catch (err) {
482
+ logger.error({ err }, "Failed to download file");
483
+ if (!res.headersSent) {
484
+ res.status(404).json({ error: "File not found" });
485
+ }
486
+ }
487
+ finally {
488
+ await fileHandle?.close().catch(() => undefined);
489
+ }
490
+ };
491
+ app.get("/api/files/download", (req, res) => {
492
+ void handleFileDownload(req, res);
493
+ });
494
+ // Story PASEO-CHAT-ACTIONS-V1-story-3.2: tab rename persistence.
495
+ // Loopback-bound, single-user trust model — same as the other /api/* routes.
496
+ // Provider-specific hook wiring lives in session-rename-route.ts so provider
497
+ // names stay out of this generic bootstrap file.
498
+ registerSessionRenameRoute(app, logger);
499
+ // Push subscription endpoint (Story PASEO-CHAT-ACTIONS-V1-story-1.002).
500
+ // Loopback-bound, single-user trust model — no auth. Persists to
501
+ // $PASEO_HOME/push-subscriptions.json with mode 0600.
502
+ const pushSubscriptionStore = new PushSubscriptionStore(logger, path.join(config.paseoHome, "push-subscriptions.json"));
503
+ // Story 1.4 — VAPID key pair for Web Push delivery.
504
+ const vapidKeys = loadOrGenerateVapidKeys(path.join(config.paseoHome, "vapid-keys.json"), logger);
505
+ registerPushRoutes(app, pushSubscriptionStore, logger, {
506
+ vapidPublicKey: vapidKeys.publicKey,
507
+ });
508
+ const httpServer = createHTTPServer(app);
509
+ // Script proxy WebSocket upgrade handler — must be registered before the
510
+ // VoiceAssistantWebSocketServer attaches its own "upgrade" listener so that
511
+ // script-bound upgrades are forwarded first. The handler is a no-op for
512
+ // requests that don't match a registered script route.
513
+ httpServer.on("upgrade", serviceProxy.upgradeHandler({ passthroughUnknown: true }));
514
+ // Capture-stream WebSocket (meetings live capture). Registered BEFORE the VoiceAssistant `/ws`
515
+ // server attaches so it gets first claim on `/api/meetings/capture/stream`; it no-ops on every
516
+ // other URL, so `/ws`, script-proxy, and relay upgrades pass through untouched.
517
+ httpServer.on("upgrade", getCaptureStreamWs().upgrade);
518
+ if (config.serviceProxy?.standaloneListen) {
519
+ serviceProxyListenTarget = parseListenString(config.serviceProxy.standaloneListen);
520
+ }
521
+ const agentStorage = new AgentStorage(config.agentStoragePath, logger);
522
+ const projectRegistry = new FileBackedProjectRegistry(path.join(config.paseoHome, "projects", "projects.json"), logger);
523
+ workspaceRegistry = new FileBackedWorkspaceRegistry(path.join(config.paseoHome, "projects", "workspaces.json"), logger);
524
+ // Story PASEO-CHAT-ACTIONS-V1-story-3.003 — GET /workspace/:id/sessions.
525
+ registerWorkspaceSessionsRoute(app, workspaceRegistry, logger);
526
+ // MARRA CUSTOMIZATION — GET /sessions (global; walks the agent transcript
527
+ // dirs). Powers the cross-workspace "find any session" mode in the command
528
+ // palette. Provider-specific paths are resolved inside the route module.
529
+ registerAllSessionsRoute(app, logger);
530
+ // MARRA CUSTOMIZATION — GET /sessions/search?q=… spawns the recall CLI to
531
+ // do FTS across every supported agent's transcripts and returns ranked
532
+ // snippets. Powers the FTS mode of the command palette.
533
+ registerSessionsSearchRoute(app, logger);
534
+ const chatService = new FileBackedChatService({
535
+ paseoHome: config.paseoHome,
536
+ logger,
537
+ });
538
+ const github = createGitHubService();
539
+ const workspaceGitService = new WorkspaceGitServiceImpl({
540
+ logger,
541
+ paseoHome: config.paseoHome,
542
+ worktreesRoot: config.worktreesRoot,
543
+ deps: {
544
+ github,
545
+ },
546
+ });
547
+ const providerSnapshotLogger = logger.child({ module: "provider-snapshot-manager" });
548
+ const providerSnapshotManager = new ProviderSnapshotManager({
549
+ logger: providerSnapshotLogger,
550
+ runtimeSettings: config.agentProviderSettings,
551
+ providerOverrides: config.providerOverrides,
552
+ workspaceGitService,
553
+ managedProcesses,
554
+ isDev: config.isDev === true,
555
+ extraClients: config.agentClients,
556
+ });
557
+ const initialAgentManagerState = providerSnapshotManager.getAgentManagerProviderState();
558
+ const agentManager = new AgentManager({
559
+ clients: initialAgentManagerState.clients,
560
+ providerDefinitions: initialAgentManagerState.providerDefinitions,
561
+ registry: agentStorage,
562
+ appendSystemPrompt: config.appendSystemPrompt,
563
+ onWorkspaceStateMayHaveChanged: ({ cwd }) => {
564
+ workspaceGitService.onWorkspaceStateMayHaveChanged(cwd);
565
+ },
566
+ mcpAuthToken: agentMcpAuthToken,
567
+ logger,
568
+ });
569
+ // Session digest (docs/session-digest.md §4.3 + §5): on the running→idle
570
+ // "finished" transition, refresh the digest — derive keyFiles deterministically
571
+ // and regenerate summary/accomplishments via the borrowed-provider rail (the
572
+ // same one auto-title uses; the daemon holds no API key of its own). Debounced +
573
+ // coalesced inside the scheduler; internal agents never broadcast attention.
574
+ agentManager.addAgentAttentionListener((params) => {
575
+ if (params.reason !== "finished") {
576
+ return;
577
+ }
578
+ const agent = agentManager.getAgent(params.agentId);
579
+ if (!agent || agent.internal) {
580
+ return;
581
+ }
582
+ scheduleSessionDigestRefresh({
583
+ agentManager,
584
+ agentId: params.agentId,
585
+ cwd: agent.cwd,
586
+ providerSnapshotManager,
587
+ daemonConfig: null,
588
+ currentSelection: {
589
+ provider: agent.provider,
590
+ model: agent.runtimeInfo?.model ?? agent.config.model ?? null,
591
+ thinkingOptionId: agent.runtimeInfo?.thinkingOptionId ?? agent.config.thinkingOptionId ?? null,
592
+ },
593
+ logger,
594
+ });
595
+ });
596
+ // Epic 1, Story 1.2 — first-class workflow entity. WorkflowManager orchestrates
597
+ // only; every child is spawned through agentManager.createAgent (one-directional:
598
+ // workflow -> agent, never the reverse). Storage is the flat $PASEO_HOME/workflows
599
+ // path from Story 1.1.
600
+ const workflowStorage = new WorkflowStorage(path.join(config.paseoHome, "workflows"), logger);
601
+ const workflowManager = new WorkflowManager({
602
+ agentManager,
603
+ storage: workflowStorage,
604
+ });
605
+ // Story 2.1 — read-only HTTP status + SSE phase-transition routes. Gated on the
606
+ // same WORKFLOWS_FEATURE_ENABLED constant as the server_info handshake flag.
607
+ registerWorkflowHttpRoutes(app, { manager: workflowManager, featureEnabled: WORKFLOWS_FEATURE_ENABLED }, logger);
608
+ // Story PASEO-CHAT-ACTIONS-V1 stories 2.2 + 2.4 — rewind + edit HTTP routes.
609
+ // Reuse truncate-session.ts (Story 2.1) under the hood. Loopback-only, gated
610
+ // by the same Bearer-token auth middleware as the rest of the API.
611
+ registerAgentRoutes(app, agentManager, logger);
612
+ const detachAgentStoragePersistence = attachAgentStoragePersistence(logger, agentManager, agentStorage);
613
+ await agentStorage.initialize();
614
+ logger.info({ elapsed: elapsed() }, "Agent storage initialized");
615
+ await bootstrapWorkspaceRegistries({
616
+ paseoHome: config.paseoHome,
617
+ agentStorage,
618
+ projectRegistry,
619
+ workspaceRegistry,
620
+ workspaceGitService,
621
+ logger,
622
+ });
623
+ logger.info({ elapsed: elapsed() }, "Workspace registries bootstrapped");
624
+ const workspaceReconciliation = new WorkspaceReconciliationService({
625
+ projectRegistry,
626
+ workspaceRegistry,
627
+ logger,
628
+ workspaceGitService,
629
+ });
630
+ void (async () => {
631
+ try {
632
+ const result = await workspaceReconciliation.runOnce();
633
+ logger.info({
634
+ elapsed: elapsed(),
635
+ changeCount: result.changesApplied.length,
636
+ }, "Workspace registries reconciled");
637
+ }
638
+ catch (error) {
639
+ logger.error({ err: error }, "Background workspace reconciliation failed");
640
+ }
641
+ })();
642
+ await chatService.initialize();
643
+ logger.info({ elapsed: elapsed() }, "Chat service initialized");
644
+ const checkoutDiffManager = new CheckoutDiffManager({
645
+ logger,
646
+ paseoHome: config.paseoHome,
647
+ workspaceGitService,
648
+ });
649
+ const loopService = new LoopService({
650
+ paseoHome: config.paseoHome,
651
+ logger,
652
+ agentManager,
653
+ providerSnapshotManager,
654
+ });
655
+ await loopService.initialize();
656
+ logger.info({ elapsed: elapsed() }, "Loop service initialized");
657
+ const scheduleService = new ScheduleService({
658
+ paseoHome: config.paseoHome,
659
+ logger,
660
+ agentManager,
661
+ agentStorage,
662
+ providerSnapshotManager,
663
+ });
664
+ await scheduleService.start();
665
+ agentManager.setAgentArchivedCallback(async (agentId) => {
666
+ try {
667
+ await scheduleService.completeForAgent(agentId);
668
+ }
669
+ catch (error) {
670
+ logger.warn({ err: error, agentId }, "Failed to complete schedules for archived agent");
671
+ }
672
+ });
673
+ logger.info({ elapsed: elapsed() }, "Schedule service initialized");
674
+ // Plugin platform (opt-in via HYPERPASEO_EXTENSIONS=1). Discovers installed
675
+ // extensions and runs each in its own extension-host process, wired to the
676
+ // daemon backend. No-op by default — zero impact on standard daemon behavior.
677
+ const extensionService = createExtensionService({
678
+ agentManager,
679
+ serverId,
680
+ paseoHome: config.paseoHome,
681
+ logger,
682
+ });
683
+ logger.info({ elapsed: elapsed() }, "Loading persisted agent registry");
684
+ const persistedRecords = await agentStorage.list();
685
+ logger.info({ elapsed: elapsed() }, `Agent registry loaded (${persistedRecords.length} record${persistedRecords.length === 1 ? "" : "s"}); agents will initialize on demand`);
686
+ logger.info("Voice mode configured for agent-scoped resume flow (no dedicated voice assistant provider)");
687
+ logger.info({ elapsed: elapsed() }, "Preparing voice and MCP runtime");
688
+ const archiveWorkspaceRecordExternal = async (workspaceId) => {
689
+ const sessions = wsServer?.listActiveSessions() ?? [];
690
+ if (sessions.length > 0) {
691
+ await Promise.all(sessions.map((session) => session.archiveWorkspaceRecordForExternalMutation(workspaceId)));
692
+ return;
693
+ }
694
+ await archivePersistedWorkspaceRecord({
695
+ workspaceId,
696
+ workspaceRegistry,
697
+ });
698
+ };
699
+ // external path→workspace adapter, not ownership: archive-by-path requests that
700
+ // arrive with a worktree path and no workspaceId (old clients / CLI).
701
+ const findWorkspaceIdForCwdExternal = async (cwd) => {
702
+ return resolveWorkspaceIdForPath(cwd, await workspaceRegistry.list());
703
+ };
704
+ const ensureWorkspaceForCreateExternal = async (cwd, firstAgentContext) => {
705
+ const workspace = await createLocalCheckoutWorkspace({ cwd, title: resolveFirstAgentPromptTitle(firstAgentContext) }, { projectRegistry, workspaceRegistry, workspaceGitService });
706
+ if (firstAgentContext) {
707
+ workspaceAutoName.scheduleForDirectory({
708
+ workspaceId: workspace.workspaceId,
709
+ cwd: workspace.cwd,
710
+ firstAgentContext,
711
+ });
712
+ }
713
+ return workspace.workspaceId;
714
+ };
715
+ const listActiveWorkspacesExternal = async () => {
716
+ const workspaces = await workspaceRegistry.list();
717
+ return workspaces
718
+ .filter((workspace) => !workspace.archivedAt)
719
+ .map((workspace) => ({
720
+ workspaceId: workspace.workspaceId,
721
+ cwd: workspace.cwd,
722
+ kind: workspace.kind,
723
+ }));
724
+ };
725
+ const markWorkspaceArchivingExternal = (workspaceIds, archivingAt) => {
726
+ const workspaceIdList = Array.from(workspaceIds);
727
+ for (const session of wsServer?.listActiveSessions() ?? []) {
728
+ session.markWorkspaceArchivingForExternalMutation(workspaceIdList, archivingAt);
729
+ }
730
+ };
731
+ const clearWorkspaceArchivingExternal = (workspaceIds) => {
732
+ const workspaceIdList = Array.from(workspaceIds);
733
+ for (const session of wsServer?.listActiveSessions() ?? []) {
734
+ session.clearWorkspaceArchivingForExternalMutation(workspaceIdList);
735
+ }
736
+ };
737
+ const emitWorkspaceUpdatesExternal = async (workspaceIds) => {
738
+ const workspaceIdList = Array.from(workspaceIds);
739
+ await Promise.all((wsServer?.listActiveSessions() ?? []).map((session) => session.emitWorkspaceUpdatesForExternalWorkspaceIds(workspaceIdList)));
740
+ };
741
+ const emitWorkspaceUpdateForCwdExternal = async (cwd) => {
742
+ const workspaceIds = workspaceIdsOnCheckout(await workspaceRegistry.list(), cwd);
743
+ await emitWorkspaceUpdatesExternal(workspaceIds);
744
+ };
745
+ const emitExternalSessionMessage = (message) => {
746
+ wsServer?.broadcast(wrapSessionMessage(message));
747
+ };
748
+ const workspaceAutoName = new WorkspaceAutoName({
749
+ agentManager,
750
+ workspaceRegistry,
751
+ workspaceGitService,
752
+ providerSnapshotManager,
753
+ readDaemonConfig: () => ({ metadataGeneration: daemonConfigStore.get().metadataGeneration }),
754
+ gitMutation: createGitMutationService({
755
+ workspaceGitService,
756
+ github,
757
+ logger,
758
+ }),
759
+ emitWorkspaceUpdateForCwd: emitWorkspaceUpdateForCwdExternal,
760
+ emitWorkspaceUpdateForWorkspaceId: async (workspaceId) => {
761
+ await emitWorkspaceUpdatesExternal([workspaceId]);
762
+ },
763
+ logger,
764
+ });
765
+ setupAutoArchiveOnMerge({
766
+ paseoHome: config.paseoHome,
767
+ paseoWorktreesBaseRoot: config.worktreesRoot,
768
+ daemonConfigStore,
769
+ workspaceGitService,
770
+ github,
771
+ agentManager,
772
+ agentStorage,
773
+ terminalManager,
774
+ logger,
775
+ findWorkspaceIdForCwd: findWorkspaceIdForCwdExternal,
776
+ listActiveWorkspaces: listActiveWorkspacesExternal,
777
+ archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
778
+ markWorkspaceArchiving: markWorkspaceArchivingExternal,
779
+ clearWorkspaceArchiving: clearWorkspaceArchivingExternal,
780
+ emitWorkspaceUpdatesForWorkspaceIds: emitWorkspaceUpdatesExternal,
781
+ });
782
+ const createPaseoWorktreeForTools = async (input, serviceOptions) => {
783
+ return createPaseoWorktreeWorkflow({
784
+ paseoHome: config.paseoHome,
785
+ worktreesRoot: config.worktreesRoot,
786
+ createPaseoWorktree: async (workflowInput, workflowOptions) => {
787
+ return createRegisteredPaseoWorktree(workflowInput, {
788
+ github,
789
+ ...(workflowOptions?.resolveDefaultBranch
790
+ ? {
791
+ resolveDefaultBranch: workflowOptions.resolveDefaultBranch,
792
+ }
793
+ : {}),
794
+ projectRegistry,
795
+ workspaceRegistry,
796
+ workspaceGitService,
797
+ });
798
+ },
799
+ warmWorkspaceGitData: async (workspace) => {
800
+ await Promise.all(wsServer
801
+ ?.listActiveSessions()
802
+ .map((session) => session.warmWorkspaceGitDataForWorkspace(workspace)) ?? []);
803
+ },
804
+ autoNameWorkspaceBranchForFirstAgent: (autoNameInput) => workspaceAutoName.scheduleForWorktree(autoNameInput),
805
+ emitWorkspaceUpdateForWorkspaceId: async (workspaceId) => {
806
+ await emitWorkspaceUpdatesExternal([workspaceId]);
807
+ },
808
+ cacheWorkspaceSetupSnapshot: () => { },
809
+ emit: emitExternalSessionMessage,
810
+ sessionLogger: logger,
811
+ terminalManager,
812
+ archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
813
+ serviceProxy,
814
+ scriptRuntimeStore,
815
+ getDaemonTcpPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
816
+ getDaemonTcpHost: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.host : null),
817
+ serviceProxyPublicBaseUrl,
818
+ onScriptsChanged: null,
819
+ }, input, serviceOptions);
820
+ };
821
+ const createAgentToolHostDependencies = (runtime) => ({
822
+ agentManager,
823
+ agentStorage,
824
+ terminalManager,
825
+ getDaemonTcpPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
826
+ scheduleService,
827
+ providerSnapshotManager,
828
+ github,
829
+ workspaceGitService,
830
+ findWorkspaceIdForCwd: findWorkspaceIdForCwdExternal,
831
+ listActiveWorkspaces: listActiveWorkspacesExternal,
832
+ archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
833
+ emitWorkspaceUpdatesForWorkspaceIds: emitWorkspaceUpdatesExternal,
834
+ workspaceRegistry,
835
+ markWorkspaceArchiving: markWorkspaceArchivingExternal,
836
+ clearWorkspaceArchiving: clearWorkspaceArchivingExternal,
837
+ ensureWorkspaceForCreate: ensureWorkspaceForCreateExternal,
838
+ createPaseoWorktree: createPaseoWorktreeForTools,
839
+ browserToolsEnabled: browserToolsPolicy.isEnabled(),
840
+ browserToolsBroker,
841
+ paseoHome: config.paseoHome,
842
+ worktreesRoot: config.worktreesRoot,
843
+ callerAgentId: runtime.callerAgentId,
844
+ enableVoiceTools: runtime.enableVoiceTools,
845
+ voiceOnly: runtime.voiceOnly,
846
+ resolveSpeakHandler: (agentId) => wsServer?.resolveVoiceSpeakHandler(agentId) ?? null,
847
+ resolveCallerContext: (agentId) => wsServer?.resolveVoiceCallerContext(agentId) ?? null,
848
+ logger,
849
+ });
850
+ const createAgentToolCatalog = (runtime) => createPaseoToolCatalog(createAgentToolHostDependencies(runtime));
851
+ agentManager.setPaseoToolCatalogFactory(createAgentToolCatalog);
852
+ agentManager.setPaseoToolsEnabled(config.mcpInjectIntoAgents !== false);
853
+ const mcpEnabled = config.mcpEnabled ?? true;
854
+ let agentMcpBaseUrl = null;
855
+ if (mcpEnabled) {
856
+ const agentMcpRoute = "/mcp/agents";
857
+ const createAgentMcpSession = async (callerAgentId) => {
858
+ // Adopt the converged host-dependency factory, then thread the daemon-owned
859
+ // workflowManager so the additive `workflow_*` MCP tools register.
860
+ const agentMcpServer = await createAgentMcpServer({
861
+ ...createAgentToolHostDependencies({ callerAgentId }),
862
+ workflowManager,
863
+ // API-389: let the open_url MCP tool push to the user's paired client(s).
864
+ broadcastToClients: emitExternalSessionMessage,
865
+ });
866
+ // Stateless mode: each HTTP request builds a fresh server + transport that is
867
+ // torn down when the response closes, so no per-session state is retained between
868
+ // requests. The agent control plane only lists and calls tools, neither of which
869
+ // needs cross-request state, so sessions would only pin memory for the life of the
870
+ // daemon (agents that exit without a clean DELETE never get reaped).
871
+ const transport = new StreamableHTTPServerTransport({
872
+ sessionIdGenerator: undefined,
873
+ // NOTE: We enforce a Vite-like host allowlist at the app/websocket layer.
874
+ // StreamableHTTPServerTransport's built-in check requires exact Host header matches.
875
+ enableDnsRebindingProtection: false,
876
+ });
877
+ Object.assign(transport, {
878
+ onerror: (err) => {
879
+ logger.error({ err }, "Agent MCP transport error");
880
+ },
881
+ });
882
+ await agentMcpServer.connect(transport);
883
+ return { server: agentMcpServer, transport };
884
+ };
885
+ const runAgentMcpRequest = async (req, res) => {
886
+ // This route is exempt from the global daemon-password middleware, so it
887
+ // authenticates here using the injected capability token (or a valid
888
+ // daemon password). Without this, a password-protected daemon would be
889
+ // wide open on its agent control plane.
890
+ if (!(await isAgentMcpRequestAuthorized({
891
+ password: config.auth?.password,
892
+ capabilityToken: agentMcpAuthToken,
893
+ authorizationHeader: req.header("authorization"),
894
+ }))) {
895
+ res.status(401).json({ error: "Unauthorized" });
896
+ return;
897
+ }
898
+ if (config.mcpDebug) {
899
+ logger.debug({
900
+ method: req.method,
901
+ url: req.originalUrl,
902
+ sessionId: req.header("mcp-session-id"),
903
+ authorization: req.header("authorization") ? REDACTED_LOG_VALUE : undefined,
904
+ body: summarizeAgentMcpDebugBody(req.body),
905
+ }, "Agent MCP request");
906
+ }
907
+ try {
908
+ // Stateless: GET (standalone SSE) and DELETE (session termination) have no
909
+ // meaning without sessions. The MCP client tolerates 405 on the GET stream
910
+ // and never issues a DELETE because it is never handed a session id.
911
+ if (req.method !== "POST") {
912
+ res.status(405).json({
913
+ jsonrpc: "2.0",
914
+ error: {
915
+ code: -32000,
916
+ message: "Method not allowed",
917
+ },
918
+ id: null,
919
+ });
920
+ return;
921
+ }
922
+ const callerAgentIdRaw = req.query.callerAgentId;
923
+ let callerAgentId;
924
+ if (typeof callerAgentIdRaw === "string") {
925
+ callerAgentId = callerAgentIdRaw;
926
+ }
927
+ else if (Array.isArray(callerAgentIdRaw) && typeof callerAgentIdRaw[0] === "string") {
928
+ callerAgentId = callerAgentIdRaw[0];
929
+ }
930
+ const { server, transport } = await createAgentMcpSession(callerAgentId);
931
+ res.on("close", () => {
932
+ void transport.close();
933
+ void server.close();
934
+ });
935
+ await transport.handleRequest(req, res, req.body);
936
+ }
937
+ catch (err) {
938
+ logger.error({ err }, "Failed to handle Agent MCP request");
939
+ if (!res.headersSent) {
940
+ res.status(500).json({
941
+ jsonrpc: "2.0",
942
+ error: {
943
+ code: -32603,
944
+ message: "Internal MCP server error",
945
+ },
946
+ id: null,
947
+ });
948
+ }
949
+ }
950
+ };
951
+ const handleAgentMcpRequest = (req, res) => {
952
+ void runAgentMcpRequest(req, res);
953
+ };
954
+ app.post(agentMcpRoute, handleAgentMcpRequest);
955
+ app.get(agentMcpRoute, handleAgentMcpRequest);
956
+ app.delete(agentMcpRoute, handleAgentMcpRequest);
957
+ logger.info({ route: agentMcpRoute }, "Agent MCP server mounted on main app");
958
+ }
959
+ else {
960
+ logger.info("Agent MCP HTTP endpoint disabled");
961
+ }
962
+ const speechService = createSpeechService({
963
+ logger,
964
+ openaiConfig: config.openai,
965
+ speechConfig: config.speech,
966
+ });
967
+ logger.info({ elapsed: elapsed() }, "Speech service created");
968
+ logger.info({ elapsed: elapsed() }, "Bootstrap complete, ready to start listening");
969
+ const start = async () => {
970
+ let mainStarted = false;
971
+ try {
972
+ if (serviceProxyListenTarget) {
973
+ const boundServiceProxyTarget = await serviceProxy.startStandalone({
974
+ listenTarget: serviceProxyListenTarget,
975
+ });
976
+ serviceProxyListenTarget = boundServiceProxyTarget;
977
+ logger.info({
978
+ listen: formatListenTarget(serviceProxyListenTarget),
979
+ publicBaseUrl: serviceProxyPublicBaseUrl,
980
+ elapsed: elapsed(),
981
+ }, "Service proxy listening");
982
+ }
983
+ // Start main HTTP server
984
+ await new Promise((resolve, reject) => {
985
+ const onError = (err) => {
986
+ httpServer.off("listening", onListening);
987
+ reject(err);
988
+ };
989
+ const onListening = () => {
990
+ httpServer.off("error", onError);
991
+ mainStarted = true;
992
+ const logAndResolve = async () => {
993
+ boundListenTarget = resolveBoundListenTarget(listenTarget, httpServer);
994
+ const mcpBaseUrl = mcpEnabled ? createAgentMcpBaseUrl(boundListenTarget) : null;
995
+ agentMcpBaseUrl = config.mcpInjectIntoAgents === false ? null : mcpBaseUrl;
996
+ agentManager.setMcpBaseUrl(agentMcpBaseUrl);
997
+ agentManager.setPaseoToolsEnabled(config.mcpInjectIntoAgents !== false);
998
+ daemonConfigStore.onFieldChange("mcp.injectIntoAgents", (value) => {
999
+ agentManager.setMcpBaseUrl(value ? mcpBaseUrl : null);
1000
+ agentManager.setPaseoToolsEnabled(value !== false);
1001
+ });
1002
+ daemonConfigStore.onFieldChange("appendSystemPrompt", (value) => {
1003
+ agentManager.setAppendSystemPrompt(typeof value === "string" ? value : "");
1004
+ });
1005
+ const relayEnabled = config.relayEnabled ?? true;
1006
+ const relayEndpoint = config.relayEndpoint ?? "relay.paseo.sh:443";
1007
+ const relayPublicEndpoint = config.relayPublicEndpoint ?? relayEndpoint;
1008
+ const relayUseTls = config.relayUseTls ?? relayEndpoint === "relay.paseo.sh:443";
1009
+ const relayPublicUseTls = config.relayPublicUseTls ?? relayUseTls;
1010
+ const appBaseUrl = config.appBaseUrl ?? "https://app.paseo.sh";
1011
+ if (boundListenTarget.type === "tcp") {
1012
+ logger.info({
1013
+ host: boundListenTarget.host,
1014
+ port: boundListenTarget.port,
1015
+ authRequired: !!config.auth?.password,
1016
+ elapsed: elapsed(),
1017
+ }, `Server listening on http://${boundListenTarget.host}:${boundListenTarget.port}`);
1018
+ }
1019
+ else {
1020
+ logger.info({
1021
+ path: boundListenTarget.path,
1022
+ authRequired: !!config.auth?.password,
1023
+ elapsed: elapsed(),
1024
+ }, `Server listening on ${boundListenTarget.path}`);
1025
+ }
1026
+ if (config.auth?.password) {
1027
+ logger.info("Daemon password authentication enabled");
1028
+ }
1029
+ // Push subsystem wires the pushTrigger channel onto the AgentManager
1030
+ // attention bus alongside WebSocketServer. Stories 1.3/1.4 will attach
1031
+ // their delivery workers to `pushSubsystem.triggerEmitter.on(...)`.
1032
+ // The PASEO_PUSH_ENABLED=false kill switch is honored inside the emitter.
1033
+ pushSubsystem = createPushSubsystem({
1034
+ agentManager,
1035
+ serverId,
1036
+ logger,
1037
+ subscriptionStore: pushSubscriptionStore,
1038
+ vapidKeys,
1039
+ });
1040
+ wsServer = new VoiceAssistantWebSocketServer(httpServer, logger, serverId, agentManager, agentStorage, downloadTokenStore, config.paseoHome, daemonConfigStore, mcpBaseUrl, { allowedOrigins, hostnames: configuredHostnames }, workspaceAutoName, config.auth, speechService, terminalManager, {
1041
+ finalTimeoutMs: config.dictationFinalTimeoutMs,
1042
+ }, daemonVersion, (intent) => {
1043
+ try {
1044
+ config.onLifecycleIntent?.(intent);
1045
+ }
1046
+ catch (error) {
1047
+ logger.error({ err: error, intent }, "Failed to handle daemon lifecycle intent");
1048
+ }
1049
+ }, projectRegistry, workspaceRegistry, chatService, loopService, 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, {
1050
+ listen: formatListenTarget(boundListenTarget ?? listenTarget),
1051
+ worktreesRoot: config.worktreesRoot,
1052
+ appBaseUrl: config.appBaseUrl,
1053
+ relay: {
1054
+ enabled: relayEnabled,
1055
+ endpoint: relayEndpoint,
1056
+ publicEndpoint: relayPublicEndpoint,
1057
+ useTls: relayUseTls,
1058
+ publicUseTls: relayPublicUseTls,
1059
+ },
1060
+ },
1061
+ // Story 1.3 — inject the WorkflowManager so Session can serve
1062
+ // `workflow.*` RPCs (Session -> WorkflowManager, one-directional).
1063
+ workflowManager, serviceProxyPublicBaseUrl, browserToolsBroker);
1064
+ // Story 1.3 bridge: re-publish Expo tokens registered via the legacy
1065
+ // `register_push_token` WebSocket message into the Story 1.2
1066
+ // PushSubscriptionStore so the Expo Push worker sees them.
1067
+ wsServer.setExpoTokenBridge((token) => {
1068
+ pushSubscriptionStore.upsert({ type: "expo", token });
1069
+ });
1070
+ // Chat-actions ws bridges (2026-05): expose the Story 1.2 push
1071
+ // subscription store + VAPID public key to every Session so
1072
+ // relay-connected clients can persist subscriptions and fetch the
1073
+ // VAPID key without round-tripping the HTTP /push/* routes
1074
+ // (which are unreachable over the relay transport).
1075
+ wsServer.setPushSubscriptionBridge(pushSubscriptionStore, vapidKeys.publicKey);
1076
+ // COMPAT(extensions): route client-invoked plugin commands to the
1077
+ // extension-service. No-op until HYPERPASEO_EXTENSIONS=1 spawns hosts
1078
+ // (executeCommand then throws "no extension provides …" → ok:false).
1079
+ wsServer.setExtensionExecuteCommand((commandId, args) => extensionService.executeCommand(commandId, args));
1080
+ if (relayEnabled) {
1081
+ const offer = await createConnectionOfferV2({
1082
+ serverId,
1083
+ daemonPublicKeyB64: daemonKeyPair.publicKeyB64,
1084
+ relay: {
1085
+ endpoint: relayPublicEndpoint,
1086
+ useTls: relayPublicUseTls,
1087
+ },
1088
+ });
1089
+ encodeOfferToFragmentUrl({ offer, appBaseUrl });
1090
+ relayTransport?.stop().catch(() => undefined);
1091
+ relayTransport = startRelayTransport({
1092
+ logger,
1093
+ attachSocket: (ws, metadata) => {
1094
+ if (!wsServer) {
1095
+ throw new Error("WebSocket server not initialized");
1096
+ }
1097
+ return wsServer.attachExternalSocket(ws, metadata);
1098
+ },
1099
+ relayEndpoint,
1100
+ relayUseTls,
1101
+ serverId,
1102
+ daemonKeyPair: daemonKeyPair.keyPair,
1103
+ });
1104
+ }
1105
+ };
1106
+ logAndResolve().then(resolve, reject);
1107
+ };
1108
+ httpServer.once("error", onError);
1109
+ httpServer.once("listening", onListening);
1110
+ if (listenTarget.type === "tcp") {
1111
+ httpServer.listen(listenTarget.port, listenTarget.host);
1112
+ }
1113
+ else {
1114
+ if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
1115
+ unlinkSync(listenTarget.path);
1116
+ }
1117
+ httpServer.listen(listenTarget.path);
1118
+ }
1119
+ });
1120
+ // Start speech service after listening so synchronous Sherpa native
1121
+ // model loading doesn't block the server from accepting connections.
1122
+ speechService.start();
1123
+ scriptHealthMonitor.start();
1124
+ await extensionService.start();
1125
+ }
1126
+ catch (error) {
1127
+ await serviceProxy.stopStandalone().catch(() => undefined);
1128
+ if (mainStarted) {
1129
+ httpServer.closeAllConnections();
1130
+ await new Promise((resolve) => httpServer.close(() => resolve()));
1131
+ }
1132
+ throw error;
1133
+ }
1134
+ };
1135
+ const stop = async () => {
1136
+ scriptHealthMonitor.stop();
1137
+ await extensionService.stop().catch(() => undefined);
1138
+ await closeAllAgents(logger, agentManager);
1139
+ await agentManager.flush().catch(() => undefined);
1140
+ detachAgentStoragePersistence();
1141
+ await agentStorage.flush().catch(() => undefined);
1142
+ await providerSnapshotManager.shutdown();
1143
+ terminalManager.killAll();
1144
+ speechService.stop();
1145
+ await scheduleService.stop().catch(() => undefined);
1146
+ await relayTransport?.stop().catch(() => undefined);
1147
+ if (wsServer) {
1148
+ await wsServer.close();
1149
+ }
1150
+ pushSubsystem?.dispose();
1151
+ await serviceProxy.stopStandalone();
1152
+ // Force-drop remaining sockets so httpServer.close() resolves promptly.
1153
+ // We've already closed wsServer (which sent ws-layer close frames) and
1154
+ // stopped every other service, so anything still attached is a TCP
1155
+ // socket whose higher-level shutdown hasn't fully released it (e.g.
1156
+ // upgraded WS sockets in the closing handshake, or HTTP keep-alive
1157
+ // sockets in CLOSE_WAIT). closeIdleConnections() does not catch
1158
+ // upgraded sockets, so we use closeAllConnections() here.
1159
+ httpServer.closeAllConnections();
1160
+ await new Promise((resolve) => {
1161
+ httpServer.close(() => resolve());
1162
+ });
1163
+ // Clean up socket files
1164
+ if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
1165
+ unlinkSync(listenTarget.path);
1166
+ }
1167
+ };
1168
+ return {
1169
+ config,
1170
+ agentManager,
1171
+ agentStorage,
1172
+ workflowManager,
1173
+ terminalManager,
1174
+ serviceProxy,
1175
+ scriptRuntimeStore,
1176
+ browserToolsBroker,
1177
+ start,
1178
+ stop,
1179
+ getListenTarget: () => boundListenTarget,
1180
+ };
1181
+ }
1182
+ async function closeAllAgents(logger, agentManager) {
1183
+ const agents = agentManager.listAgents();
1184
+ await Promise.all(agents.map(async (agent) => {
1185
+ try {
1186
+ await agentManager.closeAgent(agent.id);
1187
+ }
1188
+ catch (err) {
1189
+ logger.error({ err, agentId: agent.id }, "Failed to close agent");
1190
+ }
1191
+ }));
1192
+ }
1193
+ //# sourceMappingURL=bootstrap.js.map