@hyperdrive.bot/fleet-server 0.3.99

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 (991) 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 +156 -0
  6. package/dist/scripts/supervisor-log-config.js +31 -0
  7. package/dist/scripts/supervisor.js +345 -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-list-filter.d.ts +76 -0
  25. package/dist/server/server/agent/agent-list-filter.js +184 -0
  26. package/dist/server/server/agent/agent-loading.d.ts +12 -0
  27. package/dist/server/server/agent/agent-loading.js +76 -0
  28. package/dist/server/server/agent/agent-manager.d.ts +628 -0
  29. package/dist/server/server/agent/agent-manager.js +3370 -0
  30. package/dist/server/server/agent/agent-projections.d.ts +65 -0
  31. package/dist/server/server/agent/agent-projections.js +548 -0
  32. package/dist/server/server/agent/agent-prompt.d.ts +65 -0
  33. package/dist/server/server/agent/agent-prompt.js +271 -0
  34. package/dist/server/server/agent/agent-response-loop.d.ts +67 -0
  35. package/dist/server/server/agent/agent-response-loop.js +326 -0
  36. package/dist/server/server/agent/agent-routes.d.ts +18 -0
  37. package/dist/server/server/agent/agent-routes.js +107 -0
  38. package/dist/server/server/agent/agent-sdk-types.d.ts +809 -0
  39. package/dist/server/server/agent/agent-sdk-types.js +22 -0
  40. package/dist/server/server/agent/agent-storage.d.ts +209 -0
  41. package/dist/server/server/agent/agent-storage.js +365 -0
  42. package/dist/server/server/agent/agent-stream-coalescer.d.ts +41 -0
  43. package/dist/server/server/agent/agent-stream-coalescer.js +166 -0
  44. package/dist/server/server/agent/agent-timeline-store-types.d.ts +50 -0
  45. package/dist/server/server/agent/agent-timeline-store-types.js +2 -0
  46. package/dist/server/server/agent/agent-timeline-store.d.ts +27 -0
  47. package/dist/server/server/agent/agent-timeline-store.js +277 -0
  48. package/dist/server/server/agent/audio-utils.d.ts +3 -0
  49. package/dist/server/server/agent/audio-utils.js +19 -0
  50. package/dist/server/server/agent/authorship-ledger.d.ts +139 -0
  51. package/dist/server/server/agent/authorship-ledger.js +207 -0
  52. package/dist/server/server/agent/authorship-markup.d.ts +198 -0
  53. package/dist/server/server/agent/authorship-markup.js +288 -0
  54. package/dist/server/server/agent/blocker-log.d.ts +81 -0
  55. package/dist/server/server/agent/blocker-log.js +113 -0
  56. package/dist/server/server/agent/card-move-log.d.ts +66 -0
  57. package/dist/server/server/agent/card-move-log.js +113 -0
  58. package/dist/server/server/agent/create-agent/create.d.ts +126 -0
  59. package/dist/server/server/agent/create-agent/create.js +378 -0
  60. package/dist/server/server/agent/create-agent/routine.d.ts +45 -0
  61. package/dist/server/server/agent/create-agent/routine.js +53 -0
  62. package/dist/server/server/agent/create-agent-lifecycle-dispatch.d.ts +54 -0
  63. package/dist/server/server/agent/create-agent-lifecycle-dispatch.js +152 -0
  64. package/dist/server/server/agent/create-agent-mode.d.ts +13 -0
  65. package/dist/server/server/agent/create-agent-mode.js +62 -0
  66. package/dist/server/server/agent/create-agent-title.d.ts +10 -0
  67. package/dist/server/server/agent/create-agent-title.js +34 -0
  68. package/dist/server/server/agent/dictation-debug.d.ts +13 -0
  69. package/dist/server/server/agent/dictation-debug.js +50 -0
  70. package/dist/server/server/agent/foreground-run-state.d.ts +50 -0
  71. package/dist/server/server/agent/foreground-run-state.js +160 -0
  72. package/dist/server/server/agent/import-sessions.d.ts +52 -0
  73. package/dist/server/server/agent/import-sessions.js +170 -0
  74. package/dist/server/server/agent/jarvis-judge.d.ts +157 -0
  75. package/dist/server/server/agent/jarvis-judge.js +289 -0
  76. package/dist/server/server/agent/judge-relay-gate.d.ts +70 -0
  77. package/dist/server/server/agent/judge-relay-gate.js +92 -0
  78. package/dist/server/server/agent/lifecycle-command.d.ts +75 -0
  79. package/dist/server/server/agent/lifecycle-command.js +97 -0
  80. package/dist/server/server/agent/mcp-server.d.ts +22 -0
  81. package/dist/server/server/agent/mcp-server.js +653 -0
  82. package/dist/server/server/agent/mcp-shared.d.ts +239 -0
  83. package/dist/server/server/agent/mcp-shared.js +200 -0
  84. package/dist/server/server/agent/output-language.d.ts +16 -0
  85. package/dist/server/server/agent/output-language.js +62 -0
  86. package/dist/server/server/agent/pcm16-resampler.d.ts +14 -0
  87. package/dist/server/server/agent/pcm16-resampler.js +63 -0
  88. package/dist/server/server/agent/permission-response.d.ts +15 -0
  89. package/dist/server/server/agent/permission-response.js +14 -0
  90. package/dist/server/server/agent/prompt-attachments.d.ts +7 -0
  91. package/dist/server/server/agent/prompt-attachments.js +90 -0
  92. package/dist/server/server/agent/provider-config-reload.d.ts +27 -0
  93. package/dist/server/server/agent/provider-config-reload.js +65 -0
  94. package/dist/server/server/agent/provider-history-timestamps.d.ts +2 -0
  95. package/dist/server/server/agent/provider-history-timestamps.js +16 -0
  96. package/dist/server/server/agent/provider-launch-config.d.ts +51 -0
  97. package/dist/server/server/agent/provider-launch-config.js +183 -0
  98. package/dist/server/server/agent/provider-notices.d.ts +3 -0
  99. package/dist/server/server/agent/provider-notices.js +5 -0
  100. package/dist/server/server/agent/provider-registry-contract.d.ts +40 -0
  101. package/dist/server/server/agent/provider-registry-contract.js +28 -0
  102. package/dist/server/server/agent/provider-registry.d.ts +97 -0
  103. package/dist/server/server/agent/provider-registry.js +686 -0
  104. package/dist/server/server/agent/provider-session-import.d.ts +10 -0
  105. package/dist/server/server/agent/provider-session-import.js +49 -0
  106. package/dist/server/server/agent/provider-snapshot-manager.d.ts +166 -0
  107. package/dist/server/server/agent/provider-snapshot-manager.js +760 -0
  108. package/dist/server/server/agent/providers/acp-agent.d.ts +354 -0
  109. package/dist/server/server/agent/providers/acp-agent.js +2438 -0
  110. package/dist/server/server/agent/providers/claude/agent.d.ts +491 -0
  111. package/dist/server/server/agent/providers/claude/agent.js +5128 -0
  112. package/dist/server/server/agent/providers/claude/background-shell-kill-keys.d.ts +32 -0
  113. package/dist/server/server/agent/providers/claude/background-shell-kill-keys.js +34 -0
  114. package/dist/server/server/agent/providers/claude/background-task-tracker.d.ts +217 -0
  115. package/dist/server/server/agent/providers/claude/background-task-tracker.js +511 -0
  116. package/dist/server/server/agent/providers/claude/background-work-kinds.d.ts +124 -0
  117. package/dist/server/server/agent/providers/claude/background-work-kinds.js +96 -0
  118. package/dist/server/server/agent/providers/claude/feature-definitions.d.ts +8 -0
  119. package/dist/server/server/agent/providers/claude/feature-definitions.js +24 -0
  120. package/dist/server/server/agent/providers/claude/hook-handler.d.ts +37 -0
  121. package/dist/server/server/agent/providers/claude/hook-handler.js +193 -0
  122. package/dist/server/server/agent/providers/claude/hooks/event-translator.d.ts +49 -0
  123. package/dist/server/server/agent/providers/claude/hooks/event-translator.js +151 -0
  124. package/dist/server/server/agent/providers/claude/image-compression.d.ts +10 -0
  125. package/dist/server/server/agent/providers/claude/image-compression.js +32 -0
  126. package/dist/server/server/agent/providers/claude/model-manifest.d.ts +116 -0
  127. package/dist/server/server/agent/providers/claude/model-manifest.js +279 -0
  128. package/dist/server/server/agent/providers/claude/models.d.ts +11 -0
  129. package/dist/server/server/agent/providers/claude/models.js +97 -0
  130. package/dist/server/server/agent/providers/claude/partial-json.d.ts +5 -0
  131. package/dist/server/server/agent/providers/claude/partial-json.js +306 -0
  132. package/dist/server/server/agent/providers/claude/project-dir.d.ts +6 -0
  133. package/dist/server/server/agent/providers/claude/project-dir.js +57 -0
  134. package/dist/server/server/agent/providers/claude/pty-session-launcher.d.ts +62 -0
  135. package/dist/server/server/agent/providers/claude/pty-session-launcher.js +175 -0
  136. package/dist/server/server/agent/providers/claude/resume-source.d.ts +11 -0
  137. package/dist/server/server/agent/providers/claude/resume-source.js +37 -0
  138. package/dist/server/server/agent/providers/claude/rewind.d.ts +30 -0
  139. package/dist/server/server/agent/providers/claude/rewind.js +30 -0
  140. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +22 -0
  141. package/dist/server/server/agent/providers/claude/sidechain-tracker.js +232 -0
  142. package/dist/server/server/agent/providers/claude/spawn-config-writer.d.ts +70 -0
  143. package/dist/server/server/agent/providers/claude/spawn-config-writer.js +229 -0
  144. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +47 -0
  145. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +292 -0
  146. package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.d.ts +24 -0
  147. package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.js +23 -0
  148. package/dist/server/server/agent/providers/claude/tool-allowlist-guard.d.ts +41 -0
  149. package/dist/server/server/agent/providers/claude/tool-allowlist-guard.js +95 -0
  150. package/dist/server/server/agent/providers/claude/tool-allowlist.d.ts +68 -0
  151. package/dist/server/server/agent/providers/claude/tool-allowlist.js +133 -0
  152. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts +3 -0
  153. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +130 -0
  154. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +16 -0
  155. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +129 -0
  156. package/dist/server/server/agent/providers/claude/transport/claude-paths.d.ts +31 -0
  157. package/dist/server/server/agent/providers/claude/transport/claude-paths.js +63 -0
  158. package/dist/server/server/agent/providers/claude/transport/continue-flag.d.ts +31 -0
  159. package/dist/server/server/agent/providers/claude/transport/continue-flag.js +42 -0
  160. package/dist/server/server/agent/providers/claude/transport/pty-query.d.ts +493 -0
  161. package/dist/server/server/agent/providers/claude/transport/pty-query.js +2075 -0
  162. package/dist/server/server/agent/providers/claude/transport/pty.d.ts +153 -0
  163. package/dist/server/server/agent/providers/claude/transport/pty.js +367 -0
  164. package/dist/server/server/agent/providers/claude/transport/redact.d.ts +8 -0
  165. package/dist/server/server/agent/providers/claude/transport/redact.js +33 -0
  166. package/dist/server/server/agent/providers/claude/transport/sdk.d.ts +65 -0
  167. package/dist/server/server/agent/providers/claude/transport/sdk.js +219 -0
  168. package/dist/server/server/agent/providers/claude/transport/tmux.d.ts +141 -0
  169. package/dist/server/server/agent/providers/claude/transport/tmux.js +218 -0
  170. package/dist/server/server/agent/providers/claude/transport/transcript-sdk-reader.d.ts +53 -0
  171. package/dist/server/server/agent/providers/claude/transport/transcript-sdk-reader.js +243 -0
  172. package/dist/server/server/agent/providers/claude/transport/transcript-tailer.d.ts +28 -0
  173. package/dist/server/server/agent/providers/claude/transport/transcript-tailer.js +166 -0
  174. package/dist/server/server/agent/providers/claude/transport/truncate-session.d.ts +50 -0
  175. package/dist/server/server/agent/providers/claude/transport/truncate-session.js +121 -0
  176. package/dist/server/server/agent/providers/claude/transport/turn-id-reconciler.d.ts +36 -0
  177. package/dist/server/server/agent/providers/claude/transport/turn-id-reconciler.js +75 -0
  178. package/dist/server/server/agent/providers/claude/transport/types.d.ts +61 -0
  179. package/dist/server/server/agent/providers/claude/transport/types.js +2 -0
  180. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +90 -0
  181. package/dist/server/server/agent/providers/codex/app-server-transport.js +262 -0
  182. package/dist/server/server/agent/providers/codex/rewind.d.ts +21 -0
  183. package/dist/server/server/agent/providers/codex/rewind.js +46 -0
  184. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts +36 -0
  185. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js +217 -0
  186. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +12 -0
  187. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js +104 -0
  188. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +24 -0
  189. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +830 -0
  190. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +308 -0
  191. package/dist/server/server/agent/providers/codex-app-server-agent.js +4515 -0
  192. package/dist/server/server/agent/providers/codex-feature-definitions.d.ts +11 -0
  193. package/dist/server/server/agent/providers/codex-feature-definitions.js +45 -0
  194. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +26 -0
  195. package/dist/server/server/agent/providers/copilot-acp-agent.js +187 -0
  196. package/dist/server/server/agent/providers/cursor-acp-agent.d.ts +15 -0
  197. package/dist/server/server/agent/providers/cursor-acp-agent.js +18 -0
  198. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +36 -0
  199. package/dist/server/server/agent/providers/diagnostic-utils.js +355 -0
  200. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +42 -0
  201. package/dist/server/server/agent/providers/generic-acp-agent.js +161 -0
  202. package/dist/server/server/agent/providers/kiro-acp-agent.d.ts +17 -0
  203. package/dist/server/server/agent/providers/kiro-acp-agent.js +78 -0
  204. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +85 -0
  205. package/dist/server/server/agent/providers/mock-load-test-agent.js +1010 -0
  206. package/dist/server/server/agent/providers/mock-slow-provider.d.ts +14 -0
  207. package/dist/server/server/agent/providers/mock-slow-provider.js +39 -0
  208. package/dist/server/server/agent/providers/opencode/paths.d.ts +2 -0
  209. package/dist/server/server/agent/providers/opencode/paths.js +7 -0
  210. package/dist/server/server/agent/providers/opencode/rewind.d.ts +18 -0
  211. package/dist/server/server/agent/providers/opencode/rewind.js +14 -0
  212. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +91 -0
  213. package/dist/server/server/agent/providers/opencode/server-manager.js +425 -0
  214. package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +25 -0
  215. package/dist/server/server/agent/providers/opencode/test-server-manager.js +39 -0
  216. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-harness.d.ts +92 -0
  217. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-harness.js +268 -0
  218. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +3 -0
  219. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +256 -0
  220. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +13 -0
  221. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +53 -0
  222. package/dist/server/server/agent/providers/opencode-agent.d.ts +293 -0
  223. package/dist/server/server/agent/providers/opencode-agent.js +2908 -0
  224. package/dist/server/server/agent/providers/pi/agent.d.ts +137 -0
  225. package/dist/server/server/agent/providers/pi/agent.js +1651 -0
  226. package/dist/server/server/agent/providers/pi/cli-runtime.d.ts +21 -0
  227. package/dist/server/server/agent/providers/pi/cli-runtime.js +233 -0
  228. package/dist/server/server/agent/providers/pi/history-mapper.d.ts +9 -0
  229. package/dist/server/server/agent/providers/pi/history-mapper.js +140 -0
  230. package/dist/server/server/agent/providers/pi/rewind.d.ts +8 -0
  231. package/dist/server/server/agent/providers/pi/rewind.js +8 -0
  232. package/dist/server/server/agent/providers/pi/rpc-types.d.ts +208 -0
  233. package/dist/server/server/agent/providers/pi/rpc-types.js +2 -0
  234. package/dist/server/server/agent/providers/pi/runtime.d.ts +57 -0
  235. package/dist/server/server/agent/providers/pi/runtime.js +56 -0
  236. package/dist/server/server/agent/providers/pi/session-descriptor.d.ts +16 -0
  237. package/dist/server/server/agent/providers/pi/session-descriptor.js +346 -0
  238. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts +83 -0
  239. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js +184 -0
  240. package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts +112 -0
  241. package/dist/server/server/agent/providers/pi/tool-call-mapper.js +284 -0
  242. package/dist/server/server/agent/providers/provider-image-output.d.ts +25 -0
  243. package/dist/server/server/agent/providers/provider-image-output.js +111 -0
  244. package/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
  245. package/dist/server/server/agent/providers/provider-runner.js +81 -0
  246. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts +3 -0
  247. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +60 -0
  248. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +884 -0
  249. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +778 -0
  250. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +25 -0
  251. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +208 -0
  252. package/dist/server/server/agent/recordings-debug.d.ts +3 -0
  253. package/dist/server/server/agent/recordings-debug.js +19 -0
  254. package/dist/server/server/agent/render-file-attachment.d.ts +29 -0
  255. package/dist/server/server/agent/render-file-attachment.js +41 -0
  256. package/dist/server/server/agent/resolve-resume-cwd.d.ts +14 -0
  257. package/dist/server/server/agent/resolve-resume-cwd.js +49 -0
  258. package/dist/server/server/agent/rewind/rewind.d.ts +10 -0
  259. package/dist/server/server/agent/rewind/rewind.js +29 -0
  260. package/dist/server/server/agent/rewind/test-rewind-session.d.ts +48 -0
  261. package/dist/server/server/agent/rewind/test-rewind-session.js +88 -0
  262. package/dist/server/server/agent/runtime-mcp-config.d.ts +14 -0
  263. package/dist/server/server/agent/runtime-mcp-config.js +53 -0
  264. package/dist/server/server/agent/session-digest-generator.d.ts +64 -0
  265. package/dist/server/server/agent/session-digest-generator.js +306 -0
  266. package/dist/server/server/agent/session-digest.d.ts +81 -0
  267. package/dist/server/server/agent/session-digest.js +226 -0
  268. package/dist/server/server/agent/structured-generation-providers.d.ts +29 -0
  269. package/dist/server/server/agent/structured-generation-providers.js +236 -0
  270. package/dist/server/server/agent/stt-debug.d.ts +10 -0
  271. package/dist/server/server/agent/stt-debug.js +33 -0
  272. package/dist/server/server/agent/stt-manager.d.ts +47 -0
  273. package/dist/server/server/agent/stt-manager.js +263 -0
  274. package/dist/server/server/agent/system-prompt.d.ts +2 -0
  275. package/dist/server/server/agent/system-prompt.js +8 -0
  276. package/dist/server/server/agent/timeline-append.d.ts +10 -0
  277. package/dist/server/server/agent/timeline-append.js +27 -0
  278. package/dist/server/server/agent/timeline-projection.d.ts +71 -0
  279. package/dist/server/server/agent/timeline-projection.js +373 -0
  280. package/dist/server/server/agent/tools/paseo-tools.d.ts +66 -0
  281. package/dist/server/server/agent/tools/paseo-tools.js +2616 -0
  282. package/dist/server/server/agent/tools/read-only-surface.d.ts +53 -0
  283. package/dist/server/server/agent/tools/read-only-surface.js +69 -0
  284. package/dist/server/server/agent/tools/types.d.ts +41 -0
  285. package/dist/server/server/agent/tools/types.js +2 -0
  286. package/dist/server/server/agent/tts-debug.d.ts +8 -0
  287. package/dist/server/server/agent/tts-debug.js +24 -0
  288. package/dist/server/server/agent/tts-manager.d.ts +41 -0
  289. package/dist/server/server/agent/tts-manager.js +375 -0
  290. package/dist/server/server/agent/wait-for-agent-tracker.d.ts +15 -0
  291. package/dist/server/server/agent/wait-for-agent-tracker.js +53 -0
  292. package/dist/server/server/agent-attention-policy.d.ts +29 -0
  293. package/dist/server/server/agent-attention-policy.js +36 -0
  294. package/dist/server/server/atomic-file.d.ts +3 -0
  295. package/dist/server/server/atomic-file.js +19 -0
  296. package/dist/server/server/auth.d.ts +68 -0
  297. package/dist/server/server/auth.js +207 -0
  298. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +40 -0
  299. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +92 -0
  300. package/dist/server/server/auto-archive-on-merge/index.d.ts +8 -0
  301. package/dist/server/server/auto-archive-on-merge/index.js +15 -0
  302. package/dist/server/server/bootstrap.d.ts +163 -0
  303. package/dist/server/server/bootstrap.js +1597 -0
  304. package/dist/server/server/browser-tools/broker.d.ts +45 -0
  305. package/dist/server/server/browser-tools/broker.js +390 -0
  306. package/dist/server/server/browser-tools/errors.d.ts +22 -0
  307. package/dist/server/server/browser-tools/errors.js +27 -0
  308. package/dist/server/server/browser-tools/policy.d.ts +10 -0
  309. package/dist/server/server/browser-tools/policy.js +16 -0
  310. package/dist/server/server/browser-tools/tools.d.ts +16 -0
  311. package/dist/server/server/browser-tools/tools.js +845 -0
  312. package/dist/server/server/chat/chat-mentions.d.ts +47 -0
  313. package/dist/server/server/chat/chat-mentions.js +113 -0
  314. package/dist/server/server/chat/chat-service.d.ts +78 -0
  315. package/dist/server/server/chat/chat-service.js +337 -0
  316. package/dist/server/server/checkout/status-projection.d.ts +19 -0
  317. package/dist/server/server/checkout/status-projection.js +102 -0
  318. package/dist/server/server/checkout-diff-manager.d.ts +41 -0
  319. package/dist/server/server/checkout-diff-manager.js +189 -0
  320. package/dist/server/server/checkout-git-utils.d.ts +11 -0
  321. package/dist/server/server/checkout-git-utils.js +34 -0
  322. package/dist/server/server/client-message-id.d.ts +3 -0
  323. package/dist/server/server/client-message-id.js +12 -0
  324. package/dist/server/server/config.d.ts +20 -0
  325. package/dist/server/server/config.js +427 -0
  326. package/dist/server/server/connection-offer.d.ts +20 -0
  327. package/dist/server/server/connection-offer.js +59 -0
  328. package/dist/server/server/daemon-config-store.d.ts +78 -0
  329. package/dist/server/server/daemon-config-store.js +320 -0
  330. package/dist/server/server/daemon-keypair.d.ts +8 -0
  331. package/dist/server/server/daemon-keypair.js +42 -0
  332. package/dist/server/server/daemon-version.d.ts +5 -0
  333. package/dist/server/server/daemon-version.js +22 -0
  334. package/dist/server/server/daemon-worker.d.ts +2 -0
  335. package/dist/server/server/daemon-worker.js +251 -0
  336. package/dist/server/server/dictation/dictation-stream-manager.d.ts +95 -0
  337. package/dist/server/server/dictation/dictation-stream-manager.js +581 -0
  338. package/dist/server/server/editor-targets.d.ts +18 -0
  339. package/dist/server/server/editor-targets.js +109 -0
  340. package/dist/server/server/ensure-workspace-for-create.d.ts +30 -0
  341. package/dist/server/server/ensure-workspace-for-create.js +20 -0
  342. package/dist/server/server/exports.d.ts +28 -0
  343. package/dist/server/server/exports.js +31 -0
  344. package/dist/server/server/file-download/token-store.d.ts +24 -0
  345. package/dist/server/server/file-download/token-store.js +40 -0
  346. package/dist/server/server/file-explorer/file-download-frames.d.ts +27 -0
  347. package/dist/server/server/file-explorer/file-download-frames.js +47 -0
  348. package/dist/server/server/file-explorer/mime-types.d.ts +58 -0
  349. package/dist/server/server/file-explorer/mime-types.js +212 -0
  350. package/dist/server/server/file-explorer/service.d.ts +97 -0
  351. package/dist/server/server/file-explorer/service.js +362 -0
  352. package/dist/server/server/file-upload/index.d.ts +27 -0
  353. package/dist/server/server/file-upload/index.js +158 -0
  354. package/dist/server/server/fleet/decision-service.d.ts +47 -0
  355. package/dist/server/server/fleet/decision-service.js +156 -0
  356. package/dist/server/server/fleet/fleet-controls.d.ts +77 -0
  357. package/dist/server/server/fleet/fleet-controls.js +217 -0
  358. package/dist/server/server/fleet/fleet-reader.d.ts +106 -0
  359. package/dist/server/server/fleet/fleet-reader.js +470 -0
  360. package/dist/server/server/fleet/fleet-scaffold.d.ts +26 -0
  361. package/dist/server/server/fleet/fleet-scaffold.js +48 -0
  362. package/dist/server/server/fleet/fleet-scheduler.d.ts +75 -0
  363. package/dist/server/server/fleet/fleet-scheduler.js +186 -0
  364. package/dist/server/server/fleet/fleet-service.d.ts +75 -0
  365. package/dist/server/server/fleet/fleet-service.js +134 -0
  366. package/dist/server/server/hostnames.d.ts +13 -0
  367. package/dist/server/server/hostnames.js +94 -0
  368. package/dist/server/server/ingestion/adapters.d.ts +21 -0
  369. package/dist/server/server/ingestion/adapters.js +27 -0
  370. package/dist/server/server/ingestion/apply.d.ts +220 -0
  371. package/dist/server/server/ingestion/apply.js +345 -0
  372. package/dist/server/server/ingestion/backfill.d.ts +123 -0
  373. package/dist/server/server/ingestion/backfill.js +160 -0
  374. package/dist/server/server/ingestion/cap-limiter.d.ts +148 -0
  375. package/dist/server/server/ingestion/cap-limiter.js +264 -0
  376. package/dist/server/server/ingestion/cohort-recorder-memory.d.ts +25 -0
  377. package/dist/server/server/ingestion/cohort-recorder-memory.js +78 -0
  378. package/dist/server/server/ingestion/cohort-recorder-store.d.ts +12 -0
  379. package/dist/server/server/ingestion/cohort-recorder-store.js +99 -0
  380. package/dist/server/server/ingestion/cohort-resume.d.ts +22 -0
  381. package/dist/server/server/ingestion/cohort-resume.js +171 -0
  382. package/dist/server/server/ingestion/cohort-store.d.ts +227 -0
  383. package/dist/server/server/ingestion/cohort-store.js +462 -0
  384. package/dist/server/server/ingestion/composio/gateway.d.ts +8 -0
  385. package/dist/server/server/ingestion/composio/gateway.js +469 -0
  386. package/dist/server/server/ingestion/dry-run.d.ts +70 -0
  387. package/dist/server/server/ingestion/dry-run.js +142 -0
  388. package/dist/server/server/ingestion/errors.d.ts +48 -0
  389. package/dist/server/server/ingestion/errors.js +63 -0
  390. package/dist/server/server/ingestion/external-user-id.d.ts +24 -0
  391. package/dist/server/server/ingestion/external-user-id.js +35 -0
  392. package/dist/server/server/ingestion/filters/store.d.ts +28 -0
  393. package/dist/server/server/ingestion/filters/store.js +74 -0
  394. package/dist/server/server/ingestion/fingerprint.d.ts +13 -0
  395. package/dist/server/server/ingestion/fingerprint.js +31 -0
  396. package/dist/server/server/ingestion/grouping.d.ts +26 -0
  397. package/dist/server/server/ingestion/grouping.js +116 -0
  398. package/dist/server/server/ingestion/hard-failure.d.ts +73 -0
  399. package/dist/server/server/ingestion/hard-failure.js +125 -0
  400. package/dist/server/server/ingestion/health.d.ts +38 -0
  401. package/dist/server/server/ingestion/health.js +90 -0
  402. package/dist/server/server/ingestion/ledger-schema.d.ts +99 -0
  403. package/dist/server/server/ingestion/ledger-schema.js +359 -0
  404. package/dist/server/server/ingestion/ledger.d.ts +562 -0
  405. package/dist/server/server/ingestion/ledger.js +881 -0
  406. package/dist/server/server/ingestion/match.d.ts +57 -0
  407. package/dist/server/server/ingestion/match.js +102 -0
  408. package/dist/server/server/ingestion/pipedream/gateway.d.ts +8 -0
  409. package/dist/server/server/ingestion/pipedream/gateway.js +282 -0
  410. package/dist/server/server/ingestion/presets.d.ts +57 -0
  411. package/dist/server/server/ingestion/presets.js +57 -0
  412. package/dist/server/server/ingestion/reconcile/artifact-kind.d.ts +19 -0
  413. package/dist/server/server/ingestion/reconcile/artifact-kind.js +65 -0
  414. package/dist/server/server/ingestion/reconcile/calendar.d.ts +19 -0
  415. package/dist/server/server/ingestion/reconcile/calendar.js +110 -0
  416. package/dist/server/server/ingestion/reconcile/constants.d.ts +60 -0
  417. package/dist/server/server/ingestion/reconcile/constants.js +62 -0
  418. package/dist/server/server/ingestion/reconcile/github.d.ts +21 -0
  419. package/dist/server/server/ingestion/reconcile/github.js +83 -0
  420. package/dist/server/server/ingestion/reconcile/gitlab.d.ts +23 -0
  421. package/dist/server/server/ingestion/reconcile/gitlab.js +94 -0
  422. package/dist/server/server/ingestion/reconcile/gmail.d.ts +9 -0
  423. package/dist/server/server/ingestion/reconcile/gmail.js +141 -0
  424. package/dist/server/server/ingestion/reconcile/jira.d.ts +17 -0
  425. package/dist/server/server/ingestion/reconcile/jira.js +76 -0
  426. package/dist/server/server/ingestion/reconcile/kinds.d.ts +16 -0
  427. package/dist/server/server/ingestion/reconcile/kinds.js +59 -0
  428. package/dist/server/server/ingestion/reconcile/mcp-call.d.ts +18 -0
  429. package/dist/server/server/ingestion/reconcile/mcp-call.js +105 -0
  430. package/dist/server/server/ingestion/reconcile/payload.d.ts +38 -0
  431. package/dist/server/server/ingestion/reconcile/payload.js +82 -0
  432. package/dist/server/server/ingestion/reconcile/registry.d.ts +40 -0
  433. package/dist/server/server/ingestion/reconcile/registry.js +72 -0
  434. package/dist/server/server/ingestion/reconcile/runner.d.ts +43 -0
  435. package/dist/server/server/ingestion/reconcile/runner.js +91 -0
  436. package/dist/server/server/ingestion/reconcile/sentry.d.ts +20 -0
  437. package/dist/server/server/ingestion/reconcile/sentry.js +85 -0
  438. package/dist/server/server/ingestion/reconcile/service.d.ts +134 -0
  439. package/dist/server/server/ingestion/reconcile/service.js +409 -0
  440. package/dist/server/server/ingestion/reconcile/signature-guard.d.ts +30 -0
  441. package/dist/server/server/ingestion/reconcile/signature-guard.js +82 -0
  442. package/dist/server/server/ingestion/reconcile/testing/fake-mcp-server.d.ts +68 -0
  443. package/dist/server/server/ingestion/reconcile/testing/fake-mcp-server.js +158 -0
  444. package/dist/server/server/ingestion/reconcile/types.d.ts +65 -0
  445. package/dist/server/server/ingestion/reconcile/types.js +11 -0
  446. package/dist/server/server/ingestion/reconcile/verdict-mapping.d.ts +54 -0
  447. package/dist/server/server/ingestion/reconcile/verdict-mapping.js +82 -0
  448. package/dist/server/server/ingestion/resolve-items.d.ts +23 -0
  449. package/dist/server/server/ingestion/resolve-items.js +54 -0
  450. package/dist/server/server/ingestion/run-projection.d.ts +35 -0
  451. package/dist/server/server/ingestion/run-projection.js +76 -0
  452. package/dist/server/server/ingestion/service.d.ts +147 -0
  453. package/dist/server/server/ingestion/service.js +364 -0
  454. package/dist/server/server/ingestion/sources/store.d.ts +27 -0
  455. package/dist/server/server/ingestion/sources/store.js +71 -0
  456. package/dist/server/server/ingestion/testing/claim-and-hang.d.ts +2 -0
  457. package/dist/server/server/ingestion/testing/claim-and-hang.js +21 -0
  458. package/dist/server/server/ingestion/testing/cohort-crash.d.ts +2 -0
  459. package/dist/server/server/ingestion/testing/cohort-crash.js +89 -0
  460. package/dist/server/server/ingestion/types.d.ts +226 -0
  461. package/dist/server/server/ingestion/types.js +18 -0
  462. package/dist/server/server/ingestion/utc-day.d.ts +27 -0
  463. package/dist/server/server/ingestion/utc-day.js +44 -0
  464. package/dist/server/server/json-utils.d.ts +11 -0
  465. package/dist/server/server/json-utils.js +45 -0
  466. package/dist/server/server/lifecycle-reasons.d.ts +4 -0
  467. package/dist/server/server/lifecycle-reasons.js +6 -0
  468. package/dist/server/server/logger.d.ts +29 -0
  469. package/dist/server/server/logger.js +125 -0
  470. package/dist/server/server/loop-service.d.ts +234 -0
  471. package/dist/server/server/loop-service.js +769 -0
  472. package/dist/server/server/managed-processes/managed-processes.d.ts +76 -0
  473. package/dist/server/server/managed-processes/managed-processes.js +326 -0
  474. package/dist/server/server/meetings/capture-http.d.ts +3 -0
  475. package/dist/server/server/meetings/capture-http.js +71 -0
  476. package/dist/server/server/meetings/capture-orchestrator.d.ts +123 -0
  477. package/dist/server/server/meetings/capture-orchestrator.js +531 -0
  478. package/dist/server/server/meetings/capture-stream-ws.d.ts +42 -0
  479. package/dist/server/server/meetings/capture-stream-ws.js +68 -0
  480. package/dist/server/server/meetings/live-transcription.d.ts +57 -0
  481. package/dist/server/server/meetings/live-transcription.js +280 -0
  482. package/dist/server/server/meetings/meetings-http.d.ts +42 -0
  483. package/dist/server/server/meetings/meetings-http.js +266 -0
  484. package/dist/server/server/messages.d.ts +9 -0
  485. package/dist/server/server/messages.js +29 -0
  486. package/dist/server/server/migrations/backfill-workspace-id.migration.d.ts +9 -0
  487. package/dist/server/server/migrations/backfill-workspace-id.migration.js +64 -0
  488. package/dist/server/server/monitoring/telemetry.d.ts +13 -0
  489. package/dist/server/server/monitoring/telemetry.js +21 -0
  490. package/dist/server/server/package-version.d.ts +19 -0
  491. package/dist/server/server/package-version.js +60 -0
  492. package/dist/server/server/pagination/cursor.d.ts +16 -0
  493. package/dist/server/server/pagination/cursor.js +62 -0
  494. package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
  495. package/dist/server/server/pagination/sortable-pager.js +68 -0
  496. package/dist/server/server/pairing-offer.d.ts +18 -0
  497. package/dist/server/server/pairing-offer.js +47 -0
  498. package/dist/server/server/pairing-qr.d.ts +7 -0
  499. package/dist/server/server/pairing-qr.js +45 -0
  500. package/dist/server/server/paseo-env.d.ts +13 -0
  501. package/dist/server/server/paseo-env.js +53 -0
  502. package/dist/server/server/paseo-home.d.ts +2 -0
  503. package/dist/server/server/paseo-home.js +19 -0
  504. package/dist/server/server/paseo-worktree-service.d.ts +52 -0
  505. package/dist/server/server/paseo-worktree-service.js +294 -0
  506. package/dist/server/server/path-utils.d.ts +5 -0
  507. package/dist/server/server/path-utils.js +34 -0
  508. package/dist/server/server/persisted-config.d.ts +390 -0
  509. package/dist/server/server/persisted-config.js +424 -0
  510. package/dist/server/server/persistence-hooks.d.ts +32 -0
  511. package/dist/server/server/persistence-hooks.js +99 -0
  512. package/dist/server/server/pid-lock.d.ts +32 -0
  513. package/dist/server/server/pid-lock.js +170 -0
  514. package/dist/server/server/private-files.d.ts +6 -0
  515. package/dist/server/server/private-files.js +37 -0
  516. package/dist/server/server/process-diagnostics.d.ts +17 -0
  517. package/dist/server/server/process-diagnostics.js +22 -0
  518. package/dist/server/server/push/categories.d.ts +35 -0
  519. package/dist/server/server/push/categories.js +40 -0
  520. package/dist/server/server/push/expo-worker.d.ts +51 -0
  521. package/dist/server/server/push/expo-worker.js +188 -0
  522. package/dist/server/server/push/index.d.ts +39 -0
  523. package/dist/server/server/push/index.js +45 -0
  524. package/dist/server/server/push/notifications.d.ts +9 -0
  525. package/dist/server/server/push/notifications.js +15 -0
  526. package/dist/server/server/push/push-service.d.ts +20 -0
  527. package/dist/server/server/push/push-service.js +66 -0
  528. package/dist/server/server/push/routes.d.ts +28 -0
  529. package/dist/server/server/push/routes.js +74 -0
  530. package/dist/server/server/push/subscriptions.d.ts +42 -0
  531. package/dist/server/server/push/subscriptions.js +112 -0
  532. package/dist/server/server/push/token-store.d.ts +29 -0
  533. package/dist/server/server/push/token-store.js +78 -0
  534. package/dist/server/server/push/triggers.d.ts +68 -0
  535. package/dist/server/server/push/triggers.js +103 -0
  536. package/dist/server/server/push/vapid-keys.d.ts +15 -0
  537. package/dist/server/server/push/vapid-keys.js +52 -0
  538. package/dist/server/server/push/web-worker.d.ts +44 -0
  539. package/dist/server/server/push/web-worker.js +99 -0
  540. package/dist/server/server/reference-enricher.d.ts +41 -0
  541. package/dist/server/server/reference-enricher.js +392 -0
  542. package/dist/server/server/relay-transport.d.ts +31 -0
  543. package/dist/server/server/relay-transport.js +545 -0
  544. package/dist/server/server/resolve-workspace-id-for-path.d.ts +4 -0
  545. package/dist/server/server/resolve-workspace-id-for-path.js +71 -0
  546. package/dist/server/server/resolve-worktree-creation-intent.d.ts +32 -0
  547. package/dist/server/server/resolve-worktree-creation-intent.js +121 -0
  548. package/dist/server/server/restart-manifest.d.ts +83 -0
  549. package/dist/server/server/restart-manifest.js +122 -0
  550. package/dist/server/server/resume-after-restart.d.ts +50 -0
  551. package/dist/server/server/resume-after-restart.js +108 -0
  552. package/dist/server/server/schedule/create-cadence.d.ts +22 -0
  553. package/dist/server/server/schedule/create-cadence.js +70 -0
  554. package/dist/server/server/schedule/cron.d.ts +8 -0
  555. package/dist/server/server/schedule/cron.js +114 -0
  556. package/dist/server/server/schedule/service.d.ts +207 -0
  557. package/dist/server/server/schedule/service.js +867 -0
  558. package/dist/server/server/schedule/source-prompt.d.ts +42 -0
  559. package/dist/server/server/schedule/source-prompt.js +87 -0
  560. package/dist/server/server/schedule/store.d.ts +13 -0
  561. package/dist/server/server/schedule/store.js +57 -0
  562. package/dist/server/server/script-health-monitor.d.ts +39 -0
  563. package/dist/server/server/script-health-monitor.js +159 -0
  564. package/dist/server/server/script-proxy.d.ts +3 -0
  565. package/dist/server/server/script-proxy.js +2 -0
  566. package/dist/server/server/script-route-branch-handler.d.ts +10 -0
  567. package/dist/server/server/script-route-branch-handler.js +11 -0
  568. package/dist/server/server/script-status-projection.d.ts +36 -0
  569. package/dist/server/server/script-status-projection.js +200 -0
  570. package/dist/server/server/search/extract.d.ts +53 -0
  571. package/dist/server/server/search/extract.js +222 -0
  572. package/dist/server/server/search/index-store.d.ts +83 -0
  573. package/dist/server/server/search/index-store.js +241 -0
  574. package/dist/server/server/search/indexer.d.ts +69 -0
  575. package/dist/server/server/search/indexer.js +362 -0
  576. package/dist/server/server/search/resolve-cwd.d.ts +40 -0
  577. package/dist/server/server/search/resolve-cwd.js +109 -0
  578. package/dist/server/server/search/session-search-service.d.ts +59 -0
  579. package/dist/server/server/search/session-search-service.js +171 -0
  580. package/dist/server/server/server-id.d.ts +17 -0
  581. package/dist/server/server/server-id.js +68 -0
  582. package/dist/server/server/service-proxy.d.ts +237 -0
  583. package/dist/server/server/service-proxy.js +714 -0
  584. package/dist/server/server/session/agent-config/agent-config-session.d.ts +50 -0
  585. package/dist/server/server/session/agent-config/agent-config-session.js +98 -0
  586. package/dist/server/server/session/agent-updates/agent-updates-service.d.ts +59 -0
  587. package/dist/server/server/session/agent-updates/agent-updates-service.js +220 -0
  588. package/dist/server/server/session/chat/chat-ingestion-session.d.ts +285 -0
  589. package/dist/server/server/session/chat/chat-ingestion-session.js +504 -0
  590. package/dist/server/server/session/chat/chat-schedule-loop-session.d.ts +175 -0
  591. package/dist/server/server/session/chat/chat-schedule-loop-session.js +720 -0
  592. package/dist/server/server/session/checkout/checkout-session.d.ts +140 -0
  593. package/dist/server/server/session/checkout/checkout-session.js +927 -0
  594. package/dist/server/server/session/checkout/git-metadata-generator.d.ts +53 -0
  595. package/dist/server/server/session/checkout/git-metadata-generator.js +159 -0
  596. package/dist/server/server/session/daemon/daemon-self-update-session-controller.d.ts +32 -0
  597. package/dist/server/server/session/daemon/daemon-self-update-session-controller.js +88 -0
  598. package/dist/server/server/session/daemon/daemon-self-updater.d.ts +32 -0
  599. package/dist/server/server/session/daemon/daemon-self-updater.js +56 -0
  600. package/dist/server/server/session/daemon/daemon-session.d.ts +89 -0
  601. package/dist/server/server/session/daemon/daemon-session.js +179 -0
  602. package/dist/server/server/session/daemon/diagnostics.d.ts +41 -0
  603. package/dist/server/server/session/daemon/diagnostics.js +431 -0
  604. package/dist/server/server/session/daemon/install-origin.d.ts +7 -0
  605. package/dist/server/server/session/daemon/install-origin.js +64 -0
  606. package/dist/server/server/session/daemon/npm-global-cli.d.ts +29 -0
  607. package/dist/server/server/session/daemon/npm-global-cli.js +98 -0
  608. package/dist/server/server/session/files/workspace-files-session.d.ts +53 -0
  609. package/dist/server/server/session/files/workspace-files-session.js +245 -0
  610. package/dist/server/server/session/git-mutation/git-mutation-service.d.ts +34 -0
  611. package/dist/server/server/session/git-mutation/git-mutation-service.js +71 -0
  612. package/dist/server/server/session/ingestion/source-session.d.ts +78 -0
  613. package/dist/server/server/session/ingestion/source-session.js +191 -0
  614. package/dist/server/server/session/project-config/project-config-session.d.ts +34 -0
  615. package/dist/server/server/session/project-config/project-config-session.js +125 -0
  616. package/dist/server/server/session/provider/provider-catalog-session.d.ts +105 -0
  617. package/dist/server/server/session/provider/provider-catalog-session.js +364 -0
  618. package/dist/server/server/session/session-rename-route.d.ts +4 -0
  619. package/dist/server/server/session/session-rename-route.js +71 -0
  620. package/dist/server/server/session/session-rename-service.d.ts +25 -0
  621. package/dist/server/server/session/session-rename-service.js +76 -0
  622. package/dist/server/server/session/voice/voice-session.d.ts +166 -0
  623. package/dist/server/server/session/voice/voice-session.js +899 -0
  624. package/dist/server/server/session/voice/voice-turn-controller.d.ts +38 -0
  625. package/dist/server/server/session/voice/voice-turn-controller.js +393 -0
  626. package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.d.ts +36 -0
  627. package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.js +134 -0
  628. package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.d.ts +46 -0
  629. package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.js +214 -0
  630. package/dist/server/server/session/workspace-scripts/workspace-scripts-service.d.ts +41 -0
  631. package/dist/server/server/session/workspace-scripts/workspace-scripts-service.js +100 -0
  632. package/dist/server/server/session.d.ts +677 -0
  633. package/dist/server/server/session.js +6531 -0
  634. package/dist/server/server/speech/audio.d.ts +10 -0
  635. package/dist/server/server/speech/audio.js +101 -0
  636. package/dist/server/server/speech/provider-resolver.d.ts +3 -0
  637. package/dist/server/server/speech/provider-resolver.js +7 -0
  638. package/dist/server/server/speech/providers/local/config.d.ts +30 -0
  639. package/dist/server/server/speech/providers/local/config.js +134 -0
  640. package/dist/server/server/speech/providers/local/models.d.ts +11 -0
  641. package/dist/server/server/speech/providers/local/models.js +17 -0
  642. package/dist/server/server/speech/providers/local/runtime.d.ts +31 -0
  643. package/dist/server/server/speech/providers/local/runtime.js +135 -0
  644. package/dist/server/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
  645. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +56 -0
  646. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +74 -0
  647. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +15 -0
  648. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +142 -0
  649. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +49 -0
  650. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +73 -0
  651. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +9 -0
  652. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +107 -0
  653. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts +28 -0
  654. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +137 -0
  655. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +21 -0
  656. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +133 -0
  657. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +18 -0
  658. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  659. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +21 -0
  660. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +101 -0
  661. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts +19 -0
  662. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js +49 -0
  663. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts +38 -0
  664. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js +176 -0
  665. package/dist/server/server/speech/providers/local/worker-bytes.d.ts +4 -0
  666. package/dist/server/server/speech/providers/local/worker-bytes.js +9 -0
  667. package/dist/server/server/speech/providers/local/worker-client.d.ts +93 -0
  668. package/dist/server/server/speech/providers/local/worker-client.js +611 -0
  669. package/dist/server/server/speech/providers/local/worker-process.d.ts +2 -0
  670. package/dist/server/server/speech/providers/local/worker-process.js +270 -0
  671. package/dist/server/server/speech/providers/local/worker-protocol.d.ts +95 -0
  672. package/dist/server/server/speech/providers/local/worker-protocol.js +2 -0
  673. package/dist/server/server/speech/providers/openai/config.d.ts +19 -0
  674. package/dist/server/server/speech/providers/openai/config.js +148 -0
  675. package/dist/server/server/speech/providers/openai/runtime.d.ts +29 -0
  676. package/dist/server/server/speech/providers/openai/runtime.js +102 -0
  677. package/dist/server/server/speech/providers/openai/stt.d.ts +23 -0
  678. package/dist/server/server/speech/providers/openai/stt.js +209 -0
  679. package/dist/server/server/speech/providers/openai/tts.d.ts +19 -0
  680. package/dist/server/server/speech/providers/openai/tts.js +48 -0
  681. package/dist/server/server/speech/speech-config-resolver.d.ts +11 -0
  682. package/dist/server/server/speech/speech-config-resolver.js +132 -0
  683. package/dist/server/server/speech/speech-provider.d.ts +59 -0
  684. package/dist/server/server/speech/speech-provider.js +2 -0
  685. package/dist/server/server/speech/speech-runtime.d.ts +45 -0
  686. package/dist/server/server/speech/speech-runtime.js +562 -0
  687. package/dist/server/server/speech/speech-types.d.ts +22 -0
  688. package/dist/server/server/speech/speech-types.js +8 -0
  689. package/dist/server/server/speech/turn-detection-provider.d.ts +23 -0
  690. package/dist/server/server/speech/turn-detection-provider.js +2 -0
  691. package/dist/server/server/tenant-token-verifier.d.ts +43 -0
  692. package/dist/server/server/tenant-token-verifier.js +79 -0
  693. package/dist/server/server/update/installer.d.ts +70 -0
  694. package/dist/server/server/update/installer.js +181 -0
  695. package/dist/server/server/update/registry.d.ts +47 -0
  696. package/dist/server/server/update/registry.js +95 -0
  697. package/dist/server/server/update/slots.d.ts +45 -0
  698. package/dist/server/server/update/slots.js +97 -0
  699. package/dist/server/server/update/state.d.ts +41 -0
  700. package/dist/server/server/update/state.js +65 -0
  701. package/dist/server/server/uploads/file-attachment-validation.d.ts +61 -0
  702. package/dist/server/server/uploads/file-attachment-validation.js +56 -0
  703. package/dist/server/server/uploads/staging-service.d.ts +91 -0
  704. package/dist/server/server/uploads/staging-service.js +144 -0
  705. package/dist/server/server/utils/diff-highlighter.d.ts +57 -0
  706. package/dist/server/server/utils/diff-highlighter.js +279 -0
  707. package/dist/server/server/voice/voice-turn-controller.d.ts +38 -0
  708. package/dist/server/server/voice/voice-turn-controller.js +393 -0
  709. package/dist/server/server/voice-config.d.ts +15 -0
  710. package/dist/server/server/voice-config.js +54 -0
  711. package/dist/server/server/voice-permission-policy.d.ts +4 -0
  712. package/dist/server/server/voice-permission-policy.js +13 -0
  713. package/dist/server/server/voice-types.d.ts +12 -0
  714. package/dist/server/server/voice-types.js +2 -0
  715. package/dist/server/server/watch/composer-dictate.d.ts +42 -0
  716. package/dist/server/server/watch/composer-dictate.js +37 -0
  717. package/dist/server/server/watch/notification-action.d.ts +38 -0
  718. package/dist/server/server/watch/notification-action.js +54 -0
  719. package/dist/server/server/watch/notification-registry.d.ts +16 -0
  720. package/dist/server/server/watch/notification-registry.js +2 -0
  721. package/dist/server/server/web-ui.d.ts +10 -0
  722. package/dist/server/server/web-ui.js +247 -0
  723. package/dist/server/server/websocket/runtime-metrics.d.ts +94 -0
  724. package/dist/server/server/websocket/runtime-metrics.js +148 -0
  725. package/dist/server/server/websocket-server.d.ts +231 -0
  726. package/dist/server/server/websocket-server.js +1853 -0
  727. package/dist/server/server/whatsapp-bridge.d.ts +74 -0
  728. package/dist/server/server/whatsapp-bridge.js +142 -0
  729. package/dist/server/server/workflow/workflow-agent-resolution.d.ts +82 -0
  730. package/dist/server/server/workflow/workflow-agent-resolution.js +105 -0
  731. package/dist/server/server/workflow/workflow-feature.d.ts +2 -0
  732. package/dist/server/server/workflow/workflow-feature.js +8 -0
  733. package/dist/server/server/workflow/workflow-http-routes.d.ts +27 -0
  734. package/dist/server/server/workflow/workflow-http-routes.js +97 -0
  735. package/dist/server/server/workflow/workflow-manager.d.ts +363 -0
  736. package/dist/server/server/workflow/workflow-manager.js +852 -0
  737. package/dist/server/server/workflow/workflow-progress.d.ts +148 -0
  738. package/dist/server/server/workflow/workflow-progress.js +274 -0
  739. package/dist/server/server/workflow/workflow-storage.d.ts +36 -0
  740. package/dist/server/server/workflow/workflow-storage.js +143 -0
  741. package/dist/server/server/workspace/all-sessions-route.d.ts +32 -0
  742. package/dist/server/server/workspace/all-sessions-route.js +218 -0
  743. package/dist/server/server/workspace/recall-search-feature.d.ts +2 -0
  744. package/dist/server/server/workspace/recall-search-feature.js +31 -0
  745. package/dist/server/server/workspace/session-openable.d.ts +16 -0
  746. package/dist/server/server/workspace/session-openable.js +48 -0
  747. package/dist/server/server/workspace/sessions-route.d.ts +15 -0
  748. package/dist/server/server/workspace/sessions-route.js +108 -0
  749. package/dist/server/server/workspace/sessions-search-route.d.ts +40 -0
  750. package/dist/server/server/workspace/sessions-search-route.js +74 -0
  751. package/dist/server/server/workspace-archive-service.d.ts +65 -0
  752. package/dist/server/server/workspace-archive-service.js +229 -0
  753. package/dist/server/server/workspace-auto-name.d.ts +55 -0
  754. package/dist/server/server/workspace-auto-name.js +128 -0
  755. package/dist/server/server/workspace-bootstrap-dedupe.d.ts +34 -0
  756. package/dist/server/server/workspace-bootstrap-dedupe.js +23 -0
  757. package/dist/server/server/workspace-directory.d.ts +93 -0
  758. package/dist/server/server/workspace-directory.js +440 -0
  759. package/dist/server/server/workspace-git-metadata.d.ts +24 -0
  760. package/dist/server/server/workspace-git-metadata.js +55 -0
  761. package/dist/server/server/workspace-git-service.d.ts +257 -0
  762. package/dist/server/server/workspace-git-service.js +1386 -0
  763. package/dist/server/server/workspace-reconciliation-service.d.ts +57 -0
  764. package/dist/server/server/workspace-reconciliation-service.js +278 -0
  765. package/dist/server/server/workspace-registry-bootstrap.d.ts +13 -0
  766. package/dist/server/server/workspace-registry-bootstrap.js +121 -0
  767. package/dist/server/server/workspace-registry-model.d.ts +55 -0
  768. package/dist/server/server/workspace-registry-model.js +190 -0
  769. package/dist/server/server/workspace-registry.d.ts +117 -0
  770. package/dist/server/server/workspace-registry.js +194 -0
  771. package/dist/server/server/workspace-script-runtime-store.d.ts +28 -0
  772. package/dist/server/server/workspace-script-runtime-store.js +78 -0
  773. package/dist/server/server/workspace-service-env.d.ts +18 -0
  774. package/dist/server/server/workspace-service-env.js +85 -0
  775. package/dist/server/server/workspace-service-port-registry.d.ts +19 -0
  776. package/dist/server/server/workspace-service-port-registry.js +59 -0
  777. package/dist/server/server/worktree/commands.d.ts +55 -0
  778. package/dist/server/server/worktree/commands.js +107 -0
  779. package/dist/server/server/worktree-bootstrap.d.ts +76 -0
  780. package/dist/server/server/worktree-bootstrap.js +720 -0
  781. package/dist/server/server/worktree-branch-name-generator.d.ts +35 -0
  782. package/dist/server/server/worktree-branch-name-generator.js +91 -0
  783. package/dist/server/server/worktree-core.d.ts +31 -0
  784. package/dist/server/server/worktree-core.js +105 -0
  785. package/dist/server/server/worktree-errors.d.ts +12 -0
  786. package/dist/server/server/worktree-errors.js +28 -0
  787. package/dist/server/server/worktree-session.d.ts +152 -0
  788. package/dist/server/server/worktree-session.js +466 -0
  789. package/dist/server/services/github-service.d.ts +337 -0
  790. package/dist/server/services/github-service.js +2101 -0
  791. package/dist/server/services/quota-fetcher/manifest.d.ts +4 -0
  792. package/dist/server/services/quota-fetcher/manifest.js +52 -0
  793. package/dist/server/services/quota-fetcher/provider.d.ts +17 -0
  794. package/dist/server/services/quota-fetcher/provider.js +2 -0
  795. package/dist/server/services/quota-fetcher/providers/claude.d.ts +26 -0
  796. package/dist/server/services/quota-fetcher/providers/claude.js +217 -0
  797. package/dist/server/services/quota-fetcher/providers/codex.d.ts +23 -0
  798. package/dist/server/services/quota-fetcher/providers/codex.js +211 -0
  799. package/dist/server/services/quota-fetcher/providers/copilot.d.ts +17 -0
  800. package/dist/server/services/quota-fetcher/providers/copilot.js +75 -0
  801. package/dist/server/services/quota-fetcher/providers/cursor.d.ts +17 -0
  802. package/dist/server/services/quota-fetcher/providers/cursor.js +123 -0
  803. package/dist/server/services/quota-fetcher/providers/grok.d.ts +18 -0
  804. package/dist/server/services/quota-fetcher/providers/grok.js +89 -0
  805. package/dist/server/services/quota-fetcher/providers/kimi.d.ts +20 -0
  806. package/dist/server/services/quota-fetcher/providers/kimi.js +89 -0
  807. package/dist/server/services/quota-fetcher/providers/minimax.d.ts +29 -0
  808. package/dist/server/services/quota-fetcher/providers/minimax.js +227 -0
  809. package/dist/server/services/quota-fetcher/providers/zai.d.ts +17 -0
  810. package/dist/server/services/quota-fetcher/providers/zai.js +58 -0
  811. package/dist/server/services/quota-fetcher/service.d.ts +28 -0
  812. package/dist/server/services/quota-fetcher/service.js +58 -0
  813. package/dist/server/services/quota-fetcher/usage.d.ts +22 -0
  814. package/dist/server/services/quota-fetcher/usage.js +49 -0
  815. package/dist/server/terminal/activity/terminal-activity-tracker.d.ts +20 -0
  816. package/dist/server/terminal/activity/terminal-activity-tracker.js +59 -0
  817. package/dist/server/terminal/agent-hooks/agent-hook-installer.d.ts +62 -0
  818. package/dist/server/terminal/agent-hooks/agent-hook-installer.js +117 -0
  819. package/dist/server/terminal/agent-hooks/claude/claude-settings.d.ts +7 -0
  820. package/dist/server/terminal/agent-hooks/claude/claude-settings.js +88 -0
  821. package/dist/server/terminal/agent-hooks/claude/claude.d.ts +4 -0
  822. package/dist/server/terminal/agent-hooks/claude/claude.js +47 -0
  823. package/dist/server/terminal/agent-hooks/codex/codex-settings.d.ts +7 -0
  824. package/dist/server/terminal/agent-hooks/codex/codex-settings.js +99 -0
  825. package/dist/server/terminal/agent-hooks/codex/codex.d.ts +4 -0
  826. package/dist/server/terminal/agent-hooks/codex/codex.js +30 -0
  827. package/dist/server/terminal/agent-hooks/opencode/opencode-plugin.d.ts +4 -0
  828. package/dist/server/terminal/agent-hooks/opencode/opencode-plugin.js +46 -0
  829. package/dist/server/terminal/agent-hooks/opencode/opencode.d.ts +3 -0
  830. package/dist/server/terminal/agent-hooks/opencode/opencode.js +23 -0
  831. package/dist/server/terminal/agent-hooks/provider-registry.d.ts +24 -0
  832. package/dist/server/terminal/agent-hooks/provider-registry.js +36 -0
  833. package/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.d.ts +10 -0
  834. package/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.js +26 -0
  835. package/dist/server/terminal/shell-integration/zsh/.zshenv +17 -0
  836. package/dist/server/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
  837. package/dist/server/terminal/terminal-capture.d.ts +12 -0
  838. package/dist/server/terminal/terminal-capture.js +43 -0
  839. package/dist/server/terminal/terminal-manager-factory.d.ts +6 -0
  840. package/dist/server/terminal/terminal-manager-factory.js +5 -0
  841. package/dist/server/terminal/terminal-manager.d.ts +78 -0
  842. package/dist/server/terminal/terminal-manager.js +319 -0
  843. package/dist/server/terminal/terminal-output-coalescer.d.ts +34 -0
  844. package/dist/server/terminal/terminal-output-coalescer.js +73 -0
  845. package/dist/server/terminal/terminal-restore.d.ts +18 -0
  846. package/dist/server/terminal/terminal-restore.js +52 -0
  847. package/dist/server/terminal/terminal-session-controller.d.ts +85 -0
  848. package/dist/server/terminal/terminal-session-controller.js +819 -0
  849. package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
  850. package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
  851. package/dist/server/terminal/terminal-worker-process.js +304 -0
  852. package/dist/server/terminal/terminal-worker-protocol.d.ts +119 -0
  853. package/dist/server/terminal/terminal-worker-protocol.js +2 -0
  854. package/dist/server/terminal/terminal.d.ts +151 -0
  855. package/dist/server/terminal/terminal.js +1161 -0
  856. package/dist/server/terminal/worker-terminal-manager.d.ts +20 -0
  857. package/dist/server/terminal/worker-terminal-manager.js +688 -0
  858. package/dist/server/utils/build-metadata-prompt.d.ts +19 -0
  859. package/dist/server/utils/build-metadata-prompt.js +29 -0
  860. package/dist/server/utils/checkout-git.d.ts +253 -0
  861. package/dist/server/utils/checkout-git.js +2238 -0
  862. package/dist/server/utils/directory-suggestions.d.ts +26 -0
  863. package/dist/server/utils/directory-suggestions.js +860 -0
  864. package/dist/server/utils/git-rev-parse-path.d.ts +3 -0
  865. package/dist/server/utils/git-rev-parse-path.js +21 -0
  866. package/dist/server/utils/github-remote.d.ts +9 -0
  867. package/dist/server/utils/github-remote.js +62 -0
  868. package/dist/server/utils/paseo-config-file.d.ts +30 -0
  869. package/dist/server/utils/paseo-config-file.js +90 -0
  870. package/dist/server/utils/path.d.ts +18 -0
  871. package/dist/server/utils/path.js +123 -0
  872. package/dist/server/utils/project-icon.d.ts +39 -0
  873. package/dist/server/utils/project-icon.js +364 -0
  874. package/dist/server/utils/promise-timeout.d.ts +9 -0
  875. package/dist/server/utils/promise-timeout.js +25 -0
  876. package/dist/server/utils/run-git-command.d.ts +37 -0
  877. package/dist/server/utils/run-git-command.js +232 -0
  878. package/dist/server/utils/spawn.d.ts +33 -0
  879. package/dist/server/utils/spawn.js +71 -0
  880. package/dist/server/utils/string-command-shell.d.ts +10 -0
  881. package/dist/server/utils/string-command-shell.js +21 -0
  882. package/dist/server/utils/tree-kill.d.ts +18 -0
  883. package/dist/server/utils/tree-kill.js +77 -0
  884. package/dist/server/utils/windows-command.d.ts +15 -0
  885. package/dist/server/utils/windows-command.js +41 -0
  886. package/dist/server/utils/worktree-metadata.d.ts +39 -0
  887. package/dist/server/utils/worktree-metadata.js +174 -0
  888. package/dist/server/utils/worktree.d.ts +205 -0
  889. package/dist/server/utils/worktree.js +1119 -0
  890. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css +1 -0
  891. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.br +0 -0
  892. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.gz +0 -0
  893. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-67f19cbfce758da6aa23c38c2dbd6a33.js +5 -0
  894. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-67f19cbfce758da6aa23c38c2dbd6a33.js.br +0 -0
  895. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-67f19cbfce758da6aa23c38c2dbd6a33.js.gz +0 -0
  896. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-67f19cbfce758da6aa23c38c2dbd6a33.js.map.br +0 -0
  897. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-67f19cbfce758da6aa23c38c2dbd6a33.js.map.gz +0 -0
  898. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6888615a6b700f975c1f78501ad8577c.js +3 -0
  899. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6888615a6b700f975c1f78501ad8577c.js.br +0 -0
  900. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6888615a6b700f975c1f78501ad8577c.js.gz +0 -0
  901. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6888615a6b700f975c1f78501ad8577c.js.map.br +0 -0
  902. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6888615a6b700f975c1f78501ad8577c.js.map.gz +0 -0
  903. package/dist/server/web-ui/_expo/static/js/web/index-dc1e81e7cbad84d30a01c48dcc9a5a3e.js +16683 -0
  904. package/dist/server/web-ui/_expo/static/js/web/index-dc1e81e7cbad84d30a01c48dcc9a5a3e.js.br +0 -0
  905. package/dist/server/web-ui/_expo/static/js/web/index-dc1e81e7cbad84d30a01c48dcc9a5a3e.js.gz +0 -0
  906. package/dist/server/web-ui/_expo/static/js/web/index-dc1e81e7cbad84d30a01c48dcc9a5a3e.js.map.br +0 -0
  907. package/dist/server/web-ui/_expo/static/js/web/index-dc1e81e7cbad84d30a01c48dcc9a5a3e.js.map.gz +0 -0
  908. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-991ae7fd00f9fed45084fbb39160e8b8.js +3 -0
  909. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-991ae7fd00f9fed45084fbb39160e8b8.js.br +0 -0
  910. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-991ae7fd00f9fed45084fbb39160e8b8.js.gz +0 -0
  911. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-991ae7fd00f9fed45084fbb39160e8b8.js.map.br +0 -0
  912. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-991ae7fd00f9fed45084fbb39160e8b8.js.map.gz +0 -0
  913. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-fdb4d787a259ce350f76280ca0e2bfa2.js +5 -0
  914. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-fdb4d787a259ce350f76280ca0e2bfa2.js.br +0 -0
  915. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-fdb4d787a259ce350f76280ca0e2bfa2.js.gz +0 -0
  916. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-fdb4d787a259ce350f76280ca0e2bfa2.js.map.br +0 -0
  917. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-fdb4d787a259ce350f76280ca0e2bfa2.js.map.gz +0 -0
  918. package/dist/server/web-ui/_expo/static/js/web/profiler-9502a8e721925a6353ec45f7613f537e.js +11 -0
  919. package/dist/server/web-ui/_expo/static/js/web/profiler-9502a8e721925a6353ec45f7613f537e.js.br +0 -0
  920. package/dist/server/web-ui/_expo/static/js/web/profiler-9502a8e721925a6353ec45f7613f537e.js.gz +0 -0
  921. package/dist/server/web-ui/_expo/static/js/web/profiler-9502a8e721925a6353ec45f7613f537e.js.map.br +0 -0
  922. package/dist/server/web-ui/_expo/static/js/web/profiler-9502a8e721925a6353ec45f7613f537e.js.map.gz +0 -0
  923. package/dist/server/web-ui/_expo/static/js/web/startRecording-4ed5094aa059a0fc724f5ae70dd2f693.js +60 -0
  924. package/dist/server/web-ui/_expo/static/js/web/startRecording-4ed5094aa059a0fc724f5ae70dd2f693.js.br +0 -0
  925. package/dist/server/web-ui/_expo/static/js/web/startRecording-4ed5094aa059a0fc724f5ae70dd2f693.js.gz +0 -0
  926. package/dist/server/web-ui/_expo/static/js/web/startRecording-4ed5094aa059a0fc724f5ae70dd2f693.js.map.br +0 -0
  927. package/dist/server/web-ui/_expo/static/js/web/startRecording-4ed5094aa059a0fc724f5ae70dd2f693.js.map.gz +0 -0
  928. package/dist/server/web-ui/apple-touch-icon.png +0 -0
  929. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
  930. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
  931. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
  932. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
  933. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
  934. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
  935. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
  936. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
  937. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
  938. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
  939. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
  940. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
  941. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
  942. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
  943. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
  944. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
  945. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
  946. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
  947. package/dist/server/web-ui/assets/assets/images/editor-apps/antigravity.6e91a685c33435e0b466a56db86cf141.png +0 -0
  948. package/dist/server/web-ui/assets/assets/images/editor-apps/cursor.c31d6bce4fe9aadc3fe59962f4c4fcf3.png +0 -0
  949. package/dist/server/web-ui/assets/assets/images/editor-apps/file-explorer.3e15e8f72c825c85ce336bcb0cdef776.png +0 -0
  950. package/dist/server/web-ui/assets/assets/images/editor-apps/finder.7f68fc2c475621a672e1be09309d5567.png +0 -0
  951. package/dist/server/web-ui/assets/assets/images/editor-apps/vscode.832bdb4c685d930f1c864c793703600b.png +0 -0
  952. package/dist/server/web-ui/assets/assets/images/editor-apps/webstorm.aa5dc2cd8c20cc0a155c4c5c5ab3c5f5.png +0 -0
  953. package/dist/server/web-ui/assets/assets/images/editor-apps/zed.f3a670b7f9aa226da4fe53fb86f1abbd.png +0 -0
  954. package/dist/server/web-ui/assets/assets/images/favicon-dark-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  955. package/dist/server/web-ui/assets/assets/images/favicon-dark-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  956. package/dist/server/web-ui/assets/assets/images/favicon-dark.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  957. package/dist/server/web-ui/assets/assets/images/favicon-light-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  958. package/dist/server/web-ui/assets/assets/images/favicon-light-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  959. package/dist/server/web-ui/assets/assets/images/favicon-light.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  960. package/dist/server/web-ui/assets/assets/images/notification-icon.3bf81d33ddbf380606bdd248ba83e158.png +0 -0
  961. package/dist/server/web-ui/favicon.ico +0 -0
  962. package/dist/server/web-ui/index.html +196 -0
  963. package/dist/server/web-ui/index.html.br +0 -0
  964. package/dist/server/web-ui/index.html.gz +0 -0
  965. package/dist/server/web-ui/manifest.json +27 -0
  966. package/dist/server/web-ui/manifest.json.br +0 -0
  967. package/dist/server/web-ui/manifest.json.gz +0 -0
  968. package/dist/server/web-ui/metadata.json +1 -0
  969. package/dist/server/web-ui/metadata.json.br +1 -0
  970. package/dist/server/web-ui/metadata.json.gz +0 -0
  971. package/dist/server/web-ui/pwa-icon-192.png +0 -0
  972. package/dist/server/web-ui/pwa-icon-512.png +0 -0
  973. package/dist/server/web-ui/robots.txt +2 -0
  974. package/dist/server/web-ui/service-worker.js +87 -0
  975. package/dist/server/web-ui/service-worker.js.br +0 -0
  976. package/dist/server/web-ui/service-worker.js.gz +0 -0
  977. package/dist/src/executable-resolution/executable-resolution.js +118 -0
  978. package/dist/src/executable-resolution/windows.js +65 -0
  979. package/dist/src/server/agent/provider-launch-config.js +183 -0
  980. package/dist/src/server/paseo-env.js +53 -0
  981. package/dist/src/server/paseo-home.js +19 -0
  982. package/dist/src/server/persisted-config.js +424 -0
  983. package/dist/src/server/pid-lock.js +170 -0
  984. package/dist/src/server/private-files.js +37 -0
  985. package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  986. package/dist/src/server/update/slots.js +97 -0
  987. package/dist/src/terminal/shell-integration/zsh/.zshenv +17 -0
  988. package/dist/src/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
  989. package/dist/src/utils/spawn.js +71 -0
  990. package/dist/src/utils/windows-command.js +41 -0
  991. package/package.json +146 -0
@@ -0,0 +1,1597 @@
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, userInfo } 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 { CardMoveLog } from "./agent/card-move-log.js";
95
+ import { BlockerLog } from "./agent/blocker-log.js";
96
+ import { AUTHORSHIP_ENV_FLAG, createAuthorshipLedger } from "./agent/authorship-ledger.js";
97
+ import { AUTHORSHIP_MARKUP_ENV_FLAG, AUTHORSHIP_SPEAKER_ENV, createAuthorshipMarkup, } from "./agent/authorship-markup.js";
98
+ import { JudgeRelayGate } from "./agent/judge-relay-gate.js";
99
+ import { JarvisJudge } from "./agent/jarvis-judge.js";
100
+ import { registerAgentRoutes } from "./agent/agent-routes.js";
101
+ import { AgentStorage } from "./agent/agent-storage.js";
102
+ import { attachAgentStoragePersistence } from "./persistence-hooks.js";
103
+ import { writeRestartManifest } from "./restart-manifest.js";
104
+ import { collectInFlightAgentIds, resumeAgentsAfterRestart } from "./resume-after-restart.js";
105
+ import { WorkflowStorage } from "./workflow/workflow-storage.js";
106
+ import { WORKFLOWS_FEATURE_ENABLED } from "./workflow/workflow-feature.js";
107
+ import { registerWorkflowHttpRoutes } from "./workflow/workflow-http-routes.js";
108
+ import { WorkflowManager } from "./workflow/workflow-manager.js";
109
+ import { createAgentMcpServer } from "./agent/mcp-server.js";
110
+ import { createPaseoToolCatalog, } from "./agent/tools/paseo-tools.js";
111
+ import { ProviderSnapshotManager } from "./agent/provider-snapshot-manager.js";
112
+ import { bootstrapWorkspaceRegistries } from "./workspace-registry-bootstrap.js";
113
+ import { WorkspaceReconciliationService } from "./workspace-reconciliation-service.js";
114
+ import { FileBackedProjectRegistry, FileBackedWorkspaceRegistry } from "./workspace-registry.js";
115
+ import { FileBackedChatService } from "./chat/chat-service.js";
116
+ import { CheckoutDiffManager } from "./checkout-diff-manager.js";
117
+ import { LoopService } from "./loop-service.js";
118
+ import { ScheduleService } from "./schedule/service.js";
119
+ import { IngestionService } from "./ingestion/service.js";
120
+ import { FilterStore, filtersDir } from "./ingestion/filters/store.js";
121
+ import { SourceStore } from "./ingestion/sources/store.js";
122
+ import { resolveSourceGateway } from "./ingestion/adapters.js";
123
+ import { CapLimiter } from "./ingestion/cap-limiter.js";
124
+ import { IngestionLedger } from "./ingestion/ledger.js";
125
+ import { InMemoryCohortRecorder } from "./ingestion/cohort-recorder-memory.js";
126
+ import { CohortStoreRecorder } from "./ingestion/cohort-recorder-store.js";
127
+ import { CohortStore } from "./ingestion/cohort-store.js";
128
+ import { resumeCohorts } from "./ingestion/cohort-resume.js";
129
+ import { resolveMatchedItems } from "./ingestion/resolve-items.js";
130
+ import { BACKFILL_WINDOW_OPTIONS_DAYS } from "./ingestion/backfill.js";
131
+ import { createExtensionService } from "../extensions/extension-service.js";
132
+ import { DaemonConfigStore } from "./daemon-config-store.js";
133
+ import { BrowserToolsBroker } from "./browser-tools/broker.js";
134
+ import { DaemonConfigBrowserToolsPolicy } from "./browser-tools/policy.js";
135
+ import { WorkspaceGitServiceImpl } from "./workspace-git-service.js";
136
+ import { resolveWorkspaceIdForPath } from "./resolve-workspace-id-for-path.js";
137
+ import { ensureWorkspaceForCreate } from "./ensure-workspace-for-create.js";
138
+ import { archivePersistedWorkspaceRecord, } from "./workspace-archive-service.js";
139
+ import { setupAutoArchiveOnMerge } from "./auto-archive-on-merge/index.js";
140
+ import { wrapSessionMessage } from "./messages.js";
141
+ import { createConfiguredTerminalManager } from "../terminal/terminal-manager-factory.js";
142
+ import { applyTerminalAgentHookSetting } from "../terminal/agent-hooks/terminal-agent-hook-setting.js";
143
+ import { createConnectionOfferV2, encodeOfferToFragmentUrl } from "./connection-offer.js";
144
+ import { loadOrCreateDaemonKeyPair } from "./daemon-keypair.js";
145
+ import { startRelayTransport } from "./relay-transport.js";
146
+ import { getOrCreateServerId } from "./server-id.js";
147
+ import { resolveDaemonVersion } from "./daemon-version.js";
148
+ import { createServiceProxySubsystem } from "./service-proxy.js";
149
+ import { ScriptHealthMonitor } from "./script-health-monitor.js";
150
+ import { createScriptStatusEmitter } from "./script-status-projection.js";
151
+ import { WorkspaceScriptRuntimeStore } from "./workspace-script-runtime-store.js";
152
+ import { createManagedProcessRegistry, createSystemManagedProcessTable, } from "./managed-processes/managed-processes.js";
153
+ import { terminateWithTreeKill } from "../utils/tree-kill.js";
154
+ import { isHostnameAllowed } from "./hostnames.js";
155
+ import { createRequireBearerMiddleware, isAgentMcpRequestAuthorized, } from "./auth.js";
156
+ import { createWebUiMiddleware } from "./web-ui.js";
157
+ import { registerSessionRenameRoute } from "./session/session-rename-route.js";
158
+ import { WorkspaceAutoName } from "./workspace-auto-name.js";
159
+ import { createGitMutationService } from "./session/git-mutation/git-mutation-service.js";
160
+ import { workspaceIdsOnCheckout } from "./workspace-directory.js";
161
+ import { resolveFirstAgentPromptTitle } from "./agent/create-agent-title.js";
162
+ const MAX_MCP_DEBUG_BATCH_ITEMS = 10;
163
+ const REDACTED_LOG_VALUE = "[redacted]";
164
+ const DOWNLOAD_OPEN_FLAGS = process.platform === "win32" ? constants.O_RDONLY : constants.O_RDONLY | constants.O_NOFOLLOW;
165
+ function formatHostForHttpUrl(host) {
166
+ return host.includes(":") && !host.startsWith("[") ? `[${host}]` : host;
167
+ }
168
+ function resolveAgentMcpClientHost(host) {
169
+ if (host === "0.0.0.0") {
170
+ return "127.0.0.1";
171
+ }
172
+ if (host === "::" || host === "[::]") {
173
+ return "::1";
174
+ }
175
+ return host;
176
+ }
177
+ function createAgentMcpBaseUrl(listenTarget) {
178
+ if (!listenTarget || listenTarget.type !== "tcp") {
179
+ return null;
180
+ }
181
+ const host = resolveAgentMcpClientHost(listenTarget.host);
182
+ return new URL("/mcp/agents", `http://${formatHostForHttpUrl(host)}:${listenTarget.port}`).toString();
183
+ }
184
+ function createTerminalActivityUrl(listenTarget) {
185
+ if (!listenTarget || listenTarget.type !== "tcp") {
186
+ return null;
187
+ }
188
+ const host = resolveAgentMcpClientHost(listenTarget.host);
189
+ return new URL("/api/terminal-activity", `http://${formatHostForHttpUrl(host)}:${listenTarget.port}`).toString();
190
+ }
191
+ const TerminalActivityReportSchema = z.object({
192
+ terminalId: z.string().min(1),
193
+ token: z.string().min(1),
194
+ state: z.enum(["running", "idle", "needs-input"]),
195
+ });
196
+ const TERMINAL_ACTIVITY_STATE_MAP = {
197
+ running: "working",
198
+ idle: "idle",
199
+ "needs-input": "attention",
200
+ };
201
+ const LOOPBACK_REMOTE_ADDRESSES = new Set(["127.0.0.1", "::1", "::ffff:127.0.0.1"]);
202
+ function isLoopbackRemoteAddress(remoteAddress) {
203
+ return remoteAddress !== undefined && LOOPBACK_REMOTE_ADDRESSES.has(remoteAddress);
204
+ }
205
+ export function createTerminalActivityRouteHandler(terminalManager) {
206
+ return async (req, res) => {
207
+ if (!isLoopbackRemoteAddress(req.socket.remoteAddress)) {
208
+ res.status(403).json({ error: "Forbidden" });
209
+ return;
210
+ }
211
+ const parsed = TerminalActivityReportSchema.safeParse(req.body);
212
+ if (!parsed.success) {
213
+ res.status(400).json({ error: "Invalid terminal activity report" });
214
+ return;
215
+ }
216
+ const validation = terminalManager.validateTerminalActivityToken(parsed.data.terminalId, parsed.data.token);
217
+ if (validation !== "valid") {
218
+ res.status(403).json({ error: "Forbidden" });
219
+ return;
220
+ }
221
+ try {
222
+ const updated = await terminalManager.setTerminalActivity(parsed.data.terminalId, TERMINAL_ACTIVITY_STATE_MAP[parsed.data.state]);
223
+ if (!updated) {
224
+ res.status(403).json({ error: "Forbidden" });
225
+ return;
226
+ }
227
+ res.status(204).end();
228
+ }
229
+ catch {
230
+ res.status(500).json({ error: "Failed to update terminal activity" });
231
+ }
232
+ };
233
+ }
234
+ function summarizeAgentMcpDebugMessage(body) {
235
+ if (!body || typeof body !== "object" || Array.isArray(body)) {
236
+ return {
237
+ type: body === null ? "null" : typeof body,
238
+ };
239
+ }
240
+ const record = body;
241
+ const method = typeof record.method === "string" ? record.method : undefined;
242
+ return {
243
+ type: "object",
244
+ ...(typeof record.jsonrpc === "string" ? { jsonrpc: record.jsonrpc } : {}),
245
+ ...(method ? { method } : {}),
246
+ hasId: Object.prototype.hasOwnProperty.call(record, "id"),
247
+ hasParams: Object.prototype.hasOwnProperty.call(record, "params"),
248
+ };
249
+ }
250
+ function summarizeAgentMcpDebugBody(body) {
251
+ if (!Array.isArray(body)) {
252
+ return summarizeAgentMcpDebugMessage(body);
253
+ }
254
+ const messages = body.slice(0, MAX_MCP_DEBUG_BATCH_ITEMS).map(summarizeAgentMcpDebugMessage);
255
+ return {
256
+ type: "batch",
257
+ count: body.length,
258
+ messages,
259
+ ...(body.length > messages.length ? { omitted: body.length - messages.length } : {}),
260
+ };
261
+ }
262
+ function createBootstrapManagedProcessRegistry(config, logger) {
263
+ if (config.managedProcesses) {
264
+ return config.managedProcesses;
265
+ }
266
+ return createManagedProcessRegistry({
267
+ paseoHome: config.paseoHome,
268
+ processTable: createSystemManagedProcessTable(),
269
+ terminateProcess: terminateWithTreeKill,
270
+ logger,
271
+ });
272
+ }
273
+ async function reconcileManagedProcessLedger(managedProcesses, logger) {
274
+ const reapResult = await managedProcesses.reapStale();
275
+ if (reapResult.checked > 0 || reapResult.errors.length > 0) {
276
+ logger.info(reapResult, "Managed helper process ledger reconciled");
277
+ }
278
+ }
279
+ function mountWebUi(app, config, logger) {
280
+ app.use(createWebUiMiddleware({
281
+ enabled: config.webUi?.enabled ?? false,
282
+ distDir: config.webUi?.distDir ?? null,
283
+ label: getHostname(),
284
+ logger,
285
+ }));
286
+ }
287
+ function resolveExpressTrustProxySetting(config) {
288
+ return config.trustedProxies ?? ["loopback"];
289
+ }
290
+ /**
291
+ * Builds the config object broadcast to every connected client.
292
+ *
293
+ * Exported for the ingestion config-no-leak test: MutableDaemonConfigSchema is
294
+ * `.passthrough()`, so nothing downstream strips an unknown key. This function
295
+ * enumerating its output field by field, never spreading its input, is the only
296
+ * thing keeping a daemon-side secret off the wire.
297
+ */
298
+ export function createInitialMutableDaemonConfig(config) {
299
+ const providers = Object.fromEntries(Object.entries(config.providerOverrides ?? {}).map(([providerId, override]) => {
300
+ const providerConfig = {};
301
+ if (override.enabled !== undefined) {
302
+ providerConfig.enabled = override.enabled;
303
+ }
304
+ if (override.additionalModels) {
305
+ providerConfig.additionalModels = override.additionalModels;
306
+ }
307
+ return [providerId, providerConfig];
308
+ }));
309
+ const initialConfig = {
310
+ mcp: { injectIntoAgents: config.mcpInjectIntoAgents ?? true },
311
+ browserTools: { enabled: config.browserToolsEnabled ?? false },
312
+ providers,
313
+ metadataGeneration: {
314
+ providers: config.metadataGeneration?.providers ?? [],
315
+ },
316
+ autoArchiveAfterMerge: config.autoArchiveAfterMerge ?? false,
317
+ ingestionReconcileEnabled: config.ingestionReconcileEnabled ?? true,
318
+ ingestionReconcileStaleMs: config.ingestionReconcileStaleMs ?? 60000,
319
+ enableTerminalAgentHooks: config.enableTerminalAgentHooks ?? false,
320
+ appendSystemPrompt: config.appendSystemPrompt ?? "",
321
+ };
322
+ if (config.terminalProfiles !== undefined) {
323
+ initialConfig.terminalProfiles = config.terminalProfiles;
324
+ }
325
+ // Left undefined when the daemon has never stored a board. The client reads
326
+ // that as "nothing to adopt yet" and seeds the daemon from its own local board
327
+ // on first connect, so upgrading never wipes the columns you already had.
328
+ if (config.kanbanBoard !== undefined) {
329
+ initialConfig.kanbanBoard = config.kanbanBoard;
330
+ }
331
+ return initialConfig;
332
+ }
333
+ /**
334
+ * The aggregator gateway resolver: the injected one, or the real registry.
335
+ *
336
+ * A module function rather than an inline `??` because the daemon factory sits
337
+ * exactly on the repo's complexity ceiling, and one more branch tips it over.
338
+ */
339
+ /**
340
+ * The daemon's ONE cohort store and the recorder `applySelection` writes through.
341
+ *
342
+ * A module function rather than two inline ternaries in `createPaseoDaemon`, for
343
+ * the same reason `buildCohortResumerOption` below is one: that function sits on
344
+ * the repo's complexity ceiling, and a guard reads better beside its reason.
345
+ *
346
+ * With a ledger: sqlite-backed, over the LEDGER'S OWN HANDLE, so a cohort
347
+ * survives a restart. Without one: the in-memory recorder, which is honest about
348
+ * not surviving a restart and is still strictly better than an apply that can
349
+ * dispatch sessions with nowhere to record having done so.
350
+ */
351
+ function buildCohortRecording(ledger) {
352
+ if (!ledger) {
353
+ return { store: undefined, recorder: new InMemoryCohortRecorder() };
354
+ }
355
+ const store = new CohortStore({ db: ledger.database, now: () => Date.now() });
356
+ return { store, recorder: new CohortStoreRecorder(store) };
357
+ }
358
+ /**
359
+ * The `cohortResumer` option for `ScheduleService`, or nothing at all.
360
+ *
361
+ * A module function rather than an inline ternary in `createPaseoDaemon`: the
362
+ * three-way guard pushed that function past the repo's complexity ceiling, and
363
+ * the guard reads better next to the reason for it anyway - the same call
364
+ * `createChatIngestionSession` makes one file over.
365
+ *
366
+ * Returns `{}` when there is no ledger, no limiter or no store, because a resume
367
+ * that could not claim, could not count against the day's cap, or had nothing to
368
+ * read would dispatch sessions with no ceiling and no memory of having done so.
369
+ */
370
+ function buildCohortResumerOption(deps) {
371
+ const { store, limiter, ledger } = deps;
372
+ if (!store || !limiter || !ledger) {
373
+ return {};
374
+ }
375
+ return {
376
+ cohortResumer: () => resumeCohorts({
377
+ store,
378
+ filterResolver: (filterId) => deps.filterStore.get(filterId),
379
+ resolveItems: (filter, itemKeys) => resolveMatchedItems({
380
+ filter,
381
+ sourceStore: deps.sourceStore,
382
+ gatewayResolver: deps.gatewayResolver,
383
+ itemKeys,
384
+ windowDays: Math.max(...BACKFILL_WINDOW_OPTIONS_DAYS),
385
+ now: () => Date.now(),
386
+ }),
387
+ ledger,
388
+ schedule: deps.schedule(),
389
+ cohorts: deps.cohorts,
390
+ limiter,
391
+ runIdFactory: () => randomUUID(),
392
+ logger: deps.logger,
393
+ }),
394
+ };
395
+ }
396
+ function resolveIngestionGatewayResolver(config, ingestionConfig) {
397
+ return (config.ingestionGatewayResolver ??
398
+ ((kind) => resolveSourceGateway(kind, { config: ingestionConfig })));
399
+ }
400
+ /**
401
+ * Every ingestion collaborator the daemon needs, built in one place.
402
+ *
403
+ * Extracted from `createPaseoDaemon` purely to keep its branch count under the
404
+ * oxlint complexity cap: the `??` config defaults and the ledger-conditional
405
+ * limiter are three decision points that belong to ingestion, not to daemon
406
+ * startup. Construction order and behaviour are unchanged.
407
+ */
408
+ function buildIngestionCollaborators(config, ingestionLedger) {
409
+ // Undefined when the ledger is: a limiter with nowhere durable to count would
410
+ // be an in-memory counter that resets on every restart, which is the exact
411
+ // failure the on-disk budget exists to prevent.
412
+ //
413
+ // ONE instance, TWO counters (Epic 5, Story 5.2). `admit`/`spent` spend the
414
+ // APPLY budget, a row in `ingestion_dispatch_budget`, on disk, surviving
415
+ // restarts, bounding outward artifacts. `admitDryRun`/`spentDryRun` spend the
416
+ // DRY-RUN budget, a Map on this object, in memory, reset by a restart, bounding
417
+ // only token spend. They are deliberately separate numbers on deliberately
418
+ // different substrates: a rehearsal must never consume the day's real
419
+ // allowance, and a restart must never hand back the day's real allowance.
420
+ const capLimiter = ingestionLedger ? new CapLimiter({ store: ingestionLedger }) : undefined;
421
+ // The ingestion collaborators are built HERE, above `ScheduleService`, rather
422
+ // than beside `IngestionService` further down, because `start()` runs the
423
+ // cohort resume and therefore needs the store to already exist. Every one of
424
+ // them is a pure constructor over config or a directory - no connection, no
425
+ // network - so moving them up costs nothing and removes a late-binding hazard.
426
+ const ingestionConfig = config.ingestion ?? {
427
+ pipedream: { environment: "development", allowedOrigins: [] },
428
+ composio: {},
429
+ };
430
+ // EXACTLY ONE cohort store per daemon, for the same reason there is exactly
431
+ // one ledger: two would be two answers to "what did that apply dispatch", and
432
+ // the client that asked second would get the emptier one.
433
+ //
434
+ // Story 5.4: sqlite-backed, over the LEDGER'S OWN HANDLE (`ingestionLedger.database`),
435
+ // so a cohort survives a restart and a half-dispatched batch is finished rather
436
+ // than orphaned. No second `new DatabaseSync(...)` anywhere in this file.
437
+ //
438
+ // The in-memory recorder remains the fallback for a daemon whose sqlite could
439
+ // not be opened. It is honest about what it cannot do - a cohort in that map is
440
+ // gone after a restart - and it is strictly better than an apply that can
441
+ // dispatch sessions with nowhere to record having done so.
442
+ const { store: ingestionCohortStore, recorder: ingestionCohorts } = buildCohortRecording(ingestionLedger);
443
+ const ingestionFilterStore = new FilterStore(filtersDir(config.paseoHome));
444
+ const ingestionSourceStore = new SourceStore(path.join(config.paseoHome, "sources"));
445
+ const ingestionGatewayResolver = resolveIngestionGatewayResolver(config, ingestionConfig);
446
+ return {
447
+ capLimiter,
448
+ ingestionCohortStore,
449
+ ingestionCohorts,
450
+ ingestionFilterStore,
451
+ ingestionSourceStore,
452
+ ingestionGatewayResolver,
453
+ };
454
+ }
455
+ export async function createPaseoDaemon(config, rootLogger) {
456
+ const logger = rootLogger.child({ module: "bootstrap" });
457
+ const bootstrapStart = performance.now();
458
+ const elapsed = () => `${(performance.now() - bootstrapStart).toFixed(0)}ms`;
459
+ const daemonVersion = resolveDaemonVersion(import.meta.url);
460
+ const daemonConfigStore = new DaemonConfigStore(config.paseoHome, createInitialMutableDaemonConfig(config), logger);
461
+ const browserToolsPolicy = new DaemonConfigBrowserToolsPolicy(daemonConfigStore);
462
+ const browserToolsBroker = new BrowserToolsBroker({});
463
+ const serverId = getOrCreateServerId(config.paseoHome, { logger });
464
+ const daemonKeyPair = await loadOrCreateDaemonKeyPair(config.paseoHome, logger);
465
+ const managedProcesses = createBootstrapManagedProcessRegistry(config, logger);
466
+ // Reconcile the helper-process ledger in the background so it never blocks the
467
+ // daemon from coming up; terminating a live leftover can take a few seconds.
468
+ // Best-effort, so a failure is logged here rather than crashing startup.
469
+ void reconcileManagedProcessLedger(managedProcesses, logger).catch((error) => {
470
+ logger.warn({ err: error }, "Failed to reconcile managed helper process ledger");
471
+ });
472
+ let relayTransport = null;
473
+ const staticDir = config.staticDir;
474
+ const downloadTokenTtlMs = config.downloadTokenTtlMs ?? 60000;
475
+ const downloadTokenStore = new DownloadTokenStore({
476
+ ttlMs: downloadTokenTtlMs,
477
+ });
478
+ // Capability token authenticating the daemon's own agents to the loopback
479
+ // Agent MCP endpoint (/mcp/agents). Random per daemon run, injected only into
480
+ // local agent configs and the daemon's own MCP client — never sent to remote
481
+ // clients — so it cannot be replayed off-box. This lets the injected MCP
482
+ // authenticate even when the daemon password is set via the app (hash only,
483
+ // no plaintext available). Mirrors the /api/files/download capability-token
484
+ // pattern.
485
+ const agentMcpAuthToken = randomUUID();
486
+ const listenTarget = parseListenString(config.listen);
487
+ const app = express();
488
+ app.set("trust proxy", resolveExpressTrustProxySetting(config));
489
+ let boundListenTarget = null;
490
+ let workspaceRegistry = null;
491
+ const terminalManager = createConfiguredTerminalManager({
492
+ getTerminalActivityUrl: () => createTerminalActivityUrl(boundListenTarget),
493
+ });
494
+ applyTerminalAgentHookSetting({ store: daemonConfigStore, logger });
495
+ const serviceProxyPublicBaseUrl = config.serviceProxy?.publicBaseUrl
496
+ ? config.serviceProxy.publicBaseUrl
497
+ : null;
498
+ const serviceProxy = createServiceProxySubsystem({
499
+ logger,
500
+ publicBaseUrl: serviceProxyPublicBaseUrl,
501
+ });
502
+ const scriptRuntimeStore = new WorkspaceScriptRuntimeStore();
503
+ const configuredHostnames = config.hostnames ?? config.allowedHosts;
504
+ let wsServer = null;
505
+ let pushSubsystem = null;
506
+ let serviceProxyListenTarget = null;
507
+ const scriptHealthMonitor = new ScriptHealthMonitor({
508
+ serviceProxy,
509
+ onChange: createScriptStatusEmitter({
510
+ sessions: () => wsServer?.listActiveSessions().map((session) => ({
511
+ emit: (message) => session.emitServerMessage(message),
512
+ })) ?? [],
513
+ serviceProxy,
514
+ runtimeStore: scriptRuntimeStore,
515
+ daemonPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
516
+ resolveWorkspaceDirectory: async (workspaceId) => (await workspaceRegistry?.get(workspaceId))?.cwd ?? null,
517
+ logger,
518
+ serviceProxyPublicBaseUrl,
519
+ }),
520
+ });
521
+ const handleBranchChange = createBranchChangeRouteHandler({
522
+ serviceProxy,
523
+ onRoutesChanged: (workspaceId) => {
524
+ scriptHealthMonitor.invalidateWorkspace(workspaceId);
525
+ },
526
+ logger,
527
+ });
528
+ // Service proxy classifies service hosts before daemon auth/route fallthrough.
529
+ // Registered service hosts proxy directly; known service namespaces without a
530
+ // route return 404 and never reach daemon APIs.
531
+ app.use(serviceProxy.middleware());
532
+ // Host allowlist / DNS rebinding protection (vite-like semantics).
533
+ // For non-TCP (unix sockets), skip host validation.
534
+ if (listenTarget.type === "tcp") {
535
+ app.use((req, res, next) => {
536
+ const hostHeader = typeof req.headers.host === "string" ? req.headers.host : undefined;
537
+ if (!isHostnameAllowed(hostHeader, configuredHostnames)) {
538
+ res.status(403).json({ error: "Invalid Host header" });
539
+ return;
540
+ }
541
+ next();
542
+ });
543
+ }
544
+ // CORS - allow same-origin + configured origins
545
+ const allowedOrigins = new Set([
546
+ ...config.corsAllowedOrigins,
547
+ // Packaged desktop renderers use the custom paseo:// protocol scheme.
548
+ "paseo://app",
549
+ // For TCP, add localhost variants
550
+ ...(listenTarget.type === "tcp"
551
+ ? [
552
+ `http://${listenTarget.host}:${listenTarget.port}`,
553
+ `http://localhost:${listenTarget.port}`,
554
+ `http://127.0.0.1:${listenTarget.port}`,
555
+ ]
556
+ : []),
557
+ ]);
558
+ app.use((req, res, next) => {
559
+ const origin = req.headers.origin;
560
+ if (origin && (allowedOrigins.has("*") || allowedOrigins.has(origin))) {
561
+ res.setHeader("Access-Control-Allow-Origin", origin);
562
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
563
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
564
+ res.setHeader("Access-Control-Allow-Credentials", "true");
565
+ }
566
+ if (req.method === "OPTIONS") {
567
+ res.status(204).end();
568
+ return;
569
+ }
570
+ next();
571
+ });
572
+ // Local, harmless, and token-gated; deliberately skips daemon auth.
573
+ app.post("/api/terminal-activity", express.json(), createTerminalActivityRouteHandler(terminalManager));
574
+ // Serve the bundled browser web UI when enabled. Mounted after service-proxy
575
+ // classification and host/CORS handling, but before daemon bearer auth, so
576
+ // static app files load without the daemon password while API/WebSocket calls
577
+ // remain protected.
578
+ mountWebUi(app, config, logger);
579
+ app.use(createRequireBearerMiddleware(config.auth, (context) => {
580
+ logger.warn(context, "Rejected HTTP request with invalid daemon password");
581
+ }));
582
+ app.use(express.json());
583
+ // Serve static files from public directory
584
+ app.use("/public", express.static(staticDir));
585
+ // Health check endpoint
586
+ app.get("/api/health", (_req, res) => {
587
+ res.json({ status: "ok", timestamp: new Date().toISOString() });
588
+ });
589
+ // MEETINGS BACKEND (B) — serve real meeting data from the engine's meetings.db
590
+ registerMeetingsRoutes(app);
591
+ // CAPTURE — start/stop/status for a live meeting capture session (spawns meetcap)
592
+ registerCaptureRoutes(app);
593
+ app.get("/api/status", (_req, res) => {
594
+ res.json({
595
+ status: "server_info",
596
+ serverId,
597
+ hostname: getHostname(),
598
+ version: daemonVersion,
599
+ listen: formatListenTarget(boundListenTarget ?? listenTarget),
600
+ });
601
+ });
602
+ const handleFileDownload = async (req, res) => {
603
+ const token = typeof req.query.token === "string" && req.query.token.trim().length > 0
604
+ ? req.query.token.trim()
605
+ : null;
606
+ if (!token) {
607
+ res.status(400).json({ error: "Missing download token" });
608
+ return;
609
+ }
610
+ const entry = downloadTokenStore.consumeToken(token);
611
+ if (!entry) {
612
+ res.status(403).json({ error: "Invalid or expired token" });
613
+ return;
614
+ }
615
+ let fileHandle = null;
616
+ try {
617
+ fileHandle = await open(entry.absolutePath, DOWNLOAD_OPEN_FLAGS);
618
+ const fileStats = await fileHandle.stat();
619
+ if (!fileStats.isFile()) {
620
+ res.status(404).json({ error: "File not found" });
621
+ return;
622
+ }
623
+ const safeFileName = entry.fileName.replace(/["\r\n]/g, "_");
624
+ res.setHeader("Content-Type", entry.mimeType);
625
+ res.setHeader("Content-Disposition", `attachment; filename="${safeFileName}"`);
626
+ res.setHeader("Content-Length", fileStats.size.toString());
627
+ const stream = fileHandle.createReadStream();
628
+ fileHandle = null;
629
+ stream.on("error", (err) => {
630
+ logger.error({ err }, "Failed to stream download");
631
+ if (!res.headersSent) {
632
+ res.status(500).json({ error: "Failed to read file" });
633
+ }
634
+ else {
635
+ res.end();
636
+ }
637
+ });
638
+ stream.pipe(res);
639
+ }
640
+ catch (err) {
641
+ logger.error({ err }, "Failed to download file");
642
+ if (!res.headersSent) {
643
+ res.status(404).json({ error: "File not found" });
644
+ }
645
+ }
646
+ finally {
647
+ await fileHandle?.close().catch(() => undefined);
648
+ }
649
+ };
650
+ app.get("/api/files/download", (req, res) => {
651
+ void handleFileDownload(req, res);
652
+ });
653
+ // Story PASEO-CHAT-ACTIONS-V1-story-3.2: tab rename persistence.
654
+ // Loopback-bound, single-user trust model — same as the other /api/* routes.
655
+ // Provider-specific hook wiring lives in session-rename-route.ts so provider
656
+ // names stay out of this generic bootstrap file.
657
+ registerSessionRenameRoute(app, logger);
658
+ // Push subscription endpoint (Story PASEO-CHAT-ACTIONS-V1-story-1.002).
659
+ // Loopback-bound, single-user trust model — no auth. Persists to
660
+ // $PASEO_HOME/push-subscriptions.json with mode 0600.
661
+ const pushSubscriptionStore = new PushSubscriptionStore(logger, path.join(config.paseoHome, "push-subscriptions.json"));
662
+ // Story 1.4 — VAPID key pair for Web Push delivery.
663
+ const vapidKeys = loadOrGenerateVapidKeys(path.join(config.paseoHome, "vapid-keys.json"), logger);
664
+ registerPushRoutes(app, pushSubscriptionStore, logger, {
665
+ vapidPublicKey: vapidKeys.publicKey,
666
+ });
667
+ const httpServer = createHTTPServer(app);
668
+ // Script proxy WebSocket upgrade handler — must be registered before the
669
+ // VoiceAssistantWebSocketServer attaches its own "upgrade" listener so that
670
+ // script-bound upgrades are forwarded first. The handler is a no-op for
671
+ // requests that don't match a registered script route.
672
+ httpServer.on("upgrade", serviceProxy.upgradeHandler({ passthroughUnknown: true }));
673
+ // Capture-stream WebSocket (meetings live capture). Registered BEFORE the VoiceAssistant `/ws`
674
+ // server attaches so it gets first claim on `/api/meetings/capture/stream`; it no-ops on every
675
+ // other URL, so `/ws`, script-proxy, and relay upgrades pass through untouched.
676
+ httpServer.on("upgrade", getCaptureStreamWs().upgrade);
677
+ if (config.serviceProxy?.standaloneListen) {
678
+ serviceProxyListenTarget = parseListenString(config.serviceProxy.standaloneListen);
679
+ }
680
+ const agentStorage = new AgentStorage(config.agentStoragePath, logger);
681
+ const projectRegistry = new FileBackedProjectRegistry(path.join(config.paseoHome, "projects", "projects.json"), logger);
682
+ workspaceRegistry = new FileBackedWorkspaceRegistry(path.join(config.paseoHome, "projects", "workspaces.json"), logger);
683
+ // Story PASEO-CHAT-ACTIONS-V1-story-3.003 — GET /workspace/:id/sessions.
684
+ registerWorkspaceSessionsRoute(app, workspaceRegistry, logger);
685
+ // MARRA CUSTOMIZATION — GET /sessions (global; walks the agent transcript
686
+ // dirs). Powers the cross-workspace "find any session" mode in the command
687
+ // palette. Provider-specific paths are resolved inside the route module.
688
+ registerAllSessionsRoute(app, logger);
689
+ // MARRA CUSTOMIZATION — GET /sessions/search?q=… spawns the recall CLI to
690
+ // do FTS across every supported agent's transcripts and returns ranked
691
+ // snippets. Powers the FTS mode of the command palette.
692
+ registerSessionsSearchRoute(app, logger);
693
+ const chatService = new FileBackedChatService({
694
+ paseoHome: config.paseoHome,
695
+ logger,
696
+ });
697
+ const github = createGitHubService();
698
+ const workspaceGitService = new WorkspaceGitServiceImpl({
699
+ logger,
700
+ paseoHome: config.paseoHome,
701
+ worktreesRoot: config.worktreesRoot,
702
+ deps: {
703
+ github,
704
+ },
705
+ });
706
+ const providerSnapshotLogger = logger.child({ module: "provider-snapshot-manager" });
707
+ const providerSnapshotManager = new ProviderSnapshotManager({
708
+ logger: providerSnapshotLogger,
709
+ runtimeSettings: config.agentProviderSettings,
710
+ providerOverrides: config.providerOverrides,
711
+ workspaceGitService,
712
+ managedProcesses,
713
+ isDev: config.isDev === true,
714
+ extraClients: config.agentClients,
715
+ });
716
+ // Jarvis substrate (JARVIS-V1-SPEC §3.2). Append-only kanban move history.
717
+ // Prospective only: nothing before this ships is recoverable, which is why the
718
+ // spec sequences it ahead of every other piece.
719
+ const cardMoveLog = new CardMoveLog({ dir: config.paseoHome, logger });
720
+ // Blocker history. Same prospective-only property as the move log, and it
721
+ // answers a different question: not "how often was this deferred" but "who or
722
+ // what has kept blocking it". mergeDigest overwrites digest.blockers on every
723
+ // derivation, so without this the signal is destroyed on each idle.
724
+ const blockerLog = new BlockerLog({ dir: config.paseoHome, logger });
725
+ // Human-authorship ledger (multiplayer architecture §4). OFF BY DEFAULT:
726
+ // opt in with PASEO_AUTHORSHIP_ENABLED=true. Same prospective-only property
727
+ // as the two logs above and a sharper deadline, because paseo is the only
728
+ // component that ever sees the human and the turn together - a provider
729
+ // transcript records that a message came from `human`, never which one.
730
+ //
731
+ // Disabled yields undefined, and AgentManager's call site is `?.`, so the
732
+ // feature costs nothing and touches no disk until it is switched on.
733
+ const authorshipLedger = createAuthorshipLedger({
734
+ dir: config.paseoHome,
735
+ logger,
736
+ flag: process.env[AUTHORSHIP_ENV_FLAG],
737
+ });
738
+ // Prompt attribution (multiplayer architecture 4.6). OFF BY DEFAULT: opt in
739
+ // with PASEO_AUTHORSHIP_MARKUP=true. Unlike the ledger this REWRITES the
740
+ // prompt and lands permanently in the provider transcript, so the flag is
741
+ // strict and separate: enabling history must not silently enable injection.
742
+ //
743
+ // The speaker name is a placeholder until per-user identity exists. A daemon
744
+ // has one principal today, so this names the daemon's user, not a person in a
745
+ // shared session. Truthful, low-information, and the only thing that changes
746
+ // when identity lands.
747
+ const authorshipMarkup = createAuthorshipMarkup({
748
+ flag: process.env[AUTHORSHIP_MARKUP_ENV_FLAG],
749
+ speaker: process.env[AUTHORSHIP_SPEAKER_ENV] ?? userInfo().username,
750
+ });
751
+ // Jarvis judge config (§5, §9.1). Env-driven in v1 to avoid protocol churn
752
+ // while the feature is still being shaped.
753
+ // Gate for the judge's one mutating capability. Enabled only when the judge
754
+ // itself is, so an unconfigured deployment cannot expose relay_to_agent.
755
+ const judgeRelayGate = new JudgeRelayGate({
756
+ enabled: Boolean(process.env.PASEO_JARVIS_AGENT_ID?.trim()),
757
+ });
758
+ const jarvisJudgeConfig = {
759
+ agentId: process.env.PASEO_JARVIS_AGENT_ID?.trim() || null,
760
+ shadow: process.env.PASEO_JARVIS_SHADOW === "1",
761
+ };
762
+ const initialAgentManagerState = providerSnapshotManager.getAgentManagerProviderState();
763
+ const agentManager = new AgentManager({
764
+ clients: initialAgentManagerState.clients,
765
+ providerDefinitions: initialAgentManagerState.providerDefinitions,
766
+ registry: agentStorage,
767
+ cardMoveLog,
768
+ blockerLog,
769
+ authorshipLedger,
770
+ authorshipMarkup,
771
+ appendSystemPrompt: config.appendSystemPrompt,
772
+ onWorkspaceStateMayHaveChanged: ({ cwd }) => {
773
+ workspaceGitService.onWorkspaceStateMayHaveChanged(cwd);
774
+ },
775
+ mcpAuthToken: agentMcpAuthToken,
776
+ logger,
777
+ });
778
+ // Session digest (docs/session-digest.md §4.3 + §5): on the running→idle
779
+ // "finished" transition, refresh the digest — derive keyFiles deterministically
780
+ // and regenerate summary/accomplishments via the borrowed-provider rail (the
781
+ // same one auto-title uses; the daemon holds no API key of its own). Debounced +
782
+ // coalesced inside the scheduler; internal agents never broadcast attention.
783
+ // Jarvis judge (JARVIS-V1-SPEC §5.1). Constructed before the attention
784
+ // listener because the listener has to ORDER the two: see below.
785
+ const jarvisJudge = new JarvisJudge({
786
+ agentManager,
787
+ agentStorage,
788
+ cardMoveLog,
789
+ blockerLog,
790
+ relayGate: judgeRelayGate,
791
+ config: jarvisJudgeConfig,
792
+ logger,
793
+ });
794
+ if (jarvisJudge.enabled) {
795
+ logger.info({ judgeAgentId: jarvisJudgeConfig.agentId, shadow: jarvisJudgeConfig.shadow }, "Jarvis judge enabled");
796
+ // Resolve the judge NOW rather than waiting for the first event. An archived
797
+ // judge emits nothing, so a purely event-driven probe would keep advertising
798
+ // the feature as healthy in exactly the case where it is dead. Best-effort:
799
+ // a storage hiccup here must not block daemon startup.
800
+ void jarvisJudge.refreshAvailability().catch((error) => {
801
+ logger.warn({ err: error }, "Jarvis availability probe failed");
802
+ });
803
+ }
804
+ agentManager.addAgentAttentionListener((params) => {
805
+ // Never let a judge failure take down attention handling for everyone else.
806
+ const wakeJudge = () => {
807
+ void jarvisJudge.handleAttention({ agentId: params.agentId, reason: params.reason });
808
+ };
809
+ // `error` and `permission` have no derivation step, so nothing to wait for.
810
+ if (params.reason !== "finished") {
811
+ if (jarvisJudge.enabled) {
812
+ wakeJudge();
813
+ }
814
+ return;
815
+ }
816
+ const agent = agentManager.getAgent(params.agentId);
817
+ if (!agent || agent.internal) {
818
+ return;
819
+ }
820
+ // ORDERING IS LOAD-BEARING, and getting it wrong is invisible.
821
+ //
822
+ // The digest refresh and the judge both hang off this one `finished` event.
823
+ // Fired in parallel, the judge wins the race every time and reads a digest
824
+ // that has not been written yet, so its briefing carries no summary, no
825
+ // blockers and no deadline. It then correctly concludes there is nothing
826
+ // worth saying and answers "quiet" forever. No error is raised anywhere: the
827
+ // feature looks healthy and delivers nothing. Verified live in the docker lab
828
+ // before this chaining existed.
829
+ //
830
+ // So the judge is woken from onSettled, which fires on success, skip AND
831
+ // failure. A judge that only ran on the happy path would go quiet exactly
832
+ // when something broke.
833
+ scheduleSessionDigestRefresh({
834
+ agentManager,
835
+ agentId: params.agentId,
836
+ cwd: agent.cwd,
837
+ providerSnapshotManager,
838
+ daemonConfig: null,
839
+ currentSelection: {
840
+ provider: agent.provider,
841
+ model: agent.runtimeInfo?.model ?? agent.config.model ?? null,
842
+ thinkingOptionId: agent.runtimeInfo?.thinkingOptionId ?? agent.config.thinkingOptionId ?? null,
843
+ },
844
+ logger,
845
+ onSettled: jarvisJudge.enabled ? wakeJudge : undefined,
846
+ });
847
+ });
848
+ // Epic 1, Story 1.2 — first-class workflow entity. WorkflowManager orchestrates
849
+ // only; every child is spawned through agentManager.createAgent (one-directional:
850
+ // workflow -> agent, never the reverse). Storage is the flat $PASEO_HOME/workflows
851
+ // path from Story 1.1.
852
+ const workflowStorage = new WorkflowStorage(path.join(config.paseoHome, "workflows"), logger);
853
+ const workflowManager = new WorkflowManager({
854
+ agentManager,
855
+ storage: workflowStorage,
856
+ logger,
857
+ });
858
+ // Story 2.1 — read-only HTTP status + SSE phase-transition routes. Gated on the
859
+ // same WORKFLOWS_FEATURE_ENABLED constant as the server_info handshake flag.
860
+ registerWorkflowHttpRoutes(app, { manager: workflowManager, featureEnabled: WORKFLOWS_FEATURE_ENABLED }, logger);
861
+ // Story PASEO-CHAT-ACTIONS-V1 stories 2.2 + 2.4 — rewind + edit HTTP routes.
862
+ // Reuse truncate-session.ts (Story 2.1) under the hood. Loopback-only, gated
863
+ // by the same Bearer-token auth middleware as the rest of the API.
864
+ registerAgentRoutes(app, agentManager, logger);
865
+ const detachAgentStoragePersistence = attachAgentStoragePersistence(logger, agentManager, agentStorage);
866
+ await agentStorage.initialize();
867
+ logger.info({ elapsed: elapsed() }, "Agent storage initialized");
868
+ await bootstrapWorkspaceRegistries({
869
+ paseoHome: config.paseoHome,
870
+ agentStorage,
871
+ projectRegistry,
872
+ workspaceRegistry,
873
+ workspaceGitService,
874
+ logger,
875
+ });
876
+ logger.info({ elapsed: elapsed() }, "Workspace registries bootstrapped");
877
+ const workspaceReconciliation = new WorkspaceReconciliationService({
878
+ projectRegistry,
879
+ workspaceRegistry,
880
+ logger,
881
+ workspaceGitService,
882
+ });
883
+ void (async () => {
884
+ try {
885
+ const result = await workspaceReconciliation.runOnce();
886
+ logger.info({
887
+ elapsed: elapsed(),
888
+ changeCount: result.changesApplied.length,
889
+ }, "Workspace registries reconciled");
890
+ }
891
+ catch (error) {
892
+ logger.error({ err: error }, "Background workspace reconciliation failed");
893
+ }
894
+ })();
895
+ await chatService.initialize();
896
+ logger.info({ elapsed: elapsed() }, "Chat service initialized");
897
+ const checkoutDiffManager = new CheckoutDiffManager({
898
+ logger,
899
+ paseoHome: config.paseoHome,
900
+ workspaceGitService,
901
+ });
902
+ const loopService = new LoopService({
903
+ paseoHome: config.paseoHome,
904
+ logger,
905
+ agentManager,
906
+ providerSnapshotManager,
907
+ });
908
+ await loopService.initialize();
909
+ logger.info({ elapsed: elapsed() }, "Loop service initialized");
910
+ // EXACTLY ONE IngestionLedger per daemon. Do not construct a second one anywhere:
911
+ // the manual (Apply now) path and the tick path must share this instance, and
912
+ // Story 3.4's CapLimiter derives its daily budget from these same rows. A second
913
+ // connection would also be a second writer to the same sqlite file.
914
+ //
915
+ // Constructing it can throw (node:sqlite missing, or the file unreadable/locked).
916
+ // That is caught HERE rather than left to propagate: a host without a working
917
+ // ledger must still boot and still run clock schedules. Fail-loud for ingestion
918
+ // belongs where a { type: "source" } cadence arms, not at daemon boot (epic D1).
919
+ let ingestionLedger;
920
+ try {
921
+ ingestionLedger = new IngestionLedger({ paseoHome: config.paseoHome });
922
+ }
923
+ catch (error) {
924
+ ingestionLedger = undefined;
925
+ logger.warn({ err: error }, "Ingestion ledger unavailable; source-triggered filters will not arm. Clock schedules are unaffected");
926
+ }
927
+ // EXACTLY ONE CapLimiter per daemon, over that same ledger. Do not construct a
928
+ // second one anywhere.
929
+ //
930
+ // A second instance would NOT double the day's allowance - the budget is a row
931
+ // in `ingestion_dispatch_budget`, not a field in memory, so two limiters over
932
+ // the same PASEO_HOME still spend one budget. The rule stands anyway, for two
933
+ // reasons. It would duplicate the prepared-statement set for no gain. And, the
934
+ // load-bearing one: a second construction is a signal that a future reader
935
+ // believed the budget was per-instance, and that belief is one refactor away
936
+ // from being true (someone caches `used` in a field to save a query). Two
937
+ // guards, one of which fails loudly.
938
+ //
939
+ const { capLimiter, ingestionCohortStore, ingestionCohorts, ingestionFilterStore, ingestionSourceStore, ingestionGatewayResolver, } = buildIngestionCollaborators(config, ingestionLedger);
940
+ // Explicit annotation breaks the inference cycle: this options object passes
941
+ // `schedule: () => scheduleService`, so inferring the type from the initializer
942
+ // is circular (TS7022/TS7023). The lazy closure itself is correct and intended.
943
+ const scheduleService = new ScheduleService({
944
+ paseoHome: config.paseoHome,
945
+ logger,
946
+ agentManager,
947
+ agentStorage,
948
+ providerSnapshotManager,
949
+ ledger: ingestionLedger,
950
+ capLimiter,
951
+ // Story 5.4. A CALLBACK, never a `CohortStore` import inside `service.ts`:
952
+ // deleting this one line is the whole rollback, and it leaves
953
+ // `cohort-store.ts` as code nothing in the scheduler names.
954
+ ...buildCohortResumerOption({
955
+ store: ingestionCohortStore,
956
+ limiter: capLimiter,
957
+ ledger: ingestionLedger,
958
+ filterStore: ingestionFilterStore,
959
+ sourceStore: ingestionSourceStore,
960
+ gatewayResolver: ingestionGatewayResolver,
961
+ cohorts: ingestionCohorts,
962
+ // Referenced lazily inside the returned closure: `start()` is called after
963
+ // this `const` is assigned, so the binding is initialized by the time the
964
+ // resumer can run. The scheduler is the daemon's ONE new-agent minting
965
+ // path, and a resumed group must mint through it like any other.
966
+ schedule: () => scheduleService,
967
+ logger,
968
+ }),
969
+ });
970
+ await scheduleService.start();
971
+ agentManager.setAgentArchivedCallback(async (agentId) => {
972
+ try {
973
+ await scheduleService.completeForAgent(agentId);
974
+ }
975
+ catch (error) {
976
+ logger.warn({ err: error, agentId }, "Failed to complete schedules for archived agent");
977
+ }
978
+ });
979
+ logger.info({ elapsed: elapsed() }, "Schedule service initialized");
980
+ // Ingestion sources. `config.ingestion` is optional on PaseoDaemonConfig, so
981
+ // fall back to an empty block rather than asserting: with no aggregator
982
+ // credentials the service is inert by design (no timer, no filesystem, no
983
+ // network) and simply logs that the health sweep is disabled.
984
+ const ingestionService = new IngestionService({
985
+ paseoHome: config.paseoHome,
986
+ serverId,
987
+ logger,
988
+ config: config.ingestion ?? {
989
+ pipedream: { environment: "development", allowedOrigins: [] },
990
+ composio: {},
991
+ },
992
+ });
993
+ await ingestionService.start();
994
+ logger.info({ elapsed: elapsed() }, "Ingestion service initialized");
995
+ // The read-only ingestion PREVIEW collaborators (Story 5.1).
996
+ //
997
+ // Wired beside IngestionService rather than through it, because that service
998
+ // states an invariant it must keep: no gateway, no McpTarget and no
999
+ // IngestionConfig ever leaves it. The backfill needs a gateway, so it
1000
+ // resolves one from `adapters.ts` - the SAME single factory the service uses,
1001
+ // so there is one resolver definition, not two.
1002
+ //
1003
+ // `ingestionSourceStore` is a second SourceStore over the same directory, and
1004
+ // that is safe in a way a second IngestionLedger would not be: SourceStore
1005
+ // holds no connection and caches nothing, every method re-reads from disk,
1006
+ // and `ensureDir` is idempotent. The ledger below is the ONE instance,
1007
+ // shared, exactly as its own comment requires.
1008
+ // Plugin platform (opt-in via HYPERPASEO_EXTENSIONS=1). Discovers installed
1009
+ // extensions and runs each in its own extension-host process, wired to the
1010
+ // daemon backend. No-op by default — zero impact on standard daemon behavior.
1011
+ const extensionService = createExtensionService({
1012
+ agentManager,
1013
+ serverId,
1014
+ paseoHome: config.paseoHome,
1015
+ logger,
1016
+ });
1017
+ logger.info({ elapsed: elapsed() }, "Loading persisted agent registry");
1018
+ const persistedRecords = await agentStorage.list();
1019
+ logger.info({ elapsed: elapsed() }, `Agent registry loaded (${persistedRecords.length} record${persistedRecords.length === 1 ? "" : "s"}); agents will initialize on demand`);
1020
+ logger.info("Voice mode configured for agent-scoped resume flow (no dedicated voice assistant provider)");
1021
+ logger.info({ elapsed: elapsed() }, "Preparing voice and MCP runtime");
1022
+ const archiveWorkspaceRecordExternal = async (workspaceId) => {
1023
+ const sessions = wsServer?.listActiveSessions() ?? [];
1024
+ if (sessions.length > 0) {
1025
+ await Promise.all(sessions.map((session) => session.archiveWorkspaceRecordForExternalMutation(workspaceId)));
1026
+ return;
1027
+ }
1028
+ await archivePersistedWorkspaceRecord({
1029
+ workspaceId,
1030
+ workspaceRegistry,
1031
+ });
1032
+ };
1033
+ // external path→workspace adapter, not ownership: archive-by-path requests that
1034
+ // arrive with a worktree path and no workspaceId (old clients / CLI).
1035
+ const findWorkspaceIdForCwdExternal = async (cwd) => {
1036
+ return resolveWorkspaceIdForPath(cwd, await workspaceRegistry.list());
1037
+ };
1038
+ // Every create that arrives without a workspaceId (MCP create_agent, CLI,
1039
+ // agent-spawned terminals). Reuses the live workspace owning the cwd instead
1040
+ // of minting one per call — see ensure-workspace-for-create.ts for why the
1041
+ // lookup lives at this caller and not inside createLocalCheckoutWorkspace.
1042
+ const ensureWorkspaceForCreateExternal = async (cwd, firstAgentContext) => {
1043
+ const { workspaceId } = await ensureWorkspaceForCreate(cwd, firstAgentContext, {
1044
+ listWorkspaces: () => workspaceRegistry.list(),
1045
+ createWorkspace: (input) => createLocalCheckoutWorkspace(input, {
1046
+ projectRegistry,
1047
+ workspaceRegistry,
1048
+ workspaceGitService,
1049
+ }),
1050
+ scheduleAutoName: (input) => workspaceAutoName.scheduleForDirectory(input),
1051
+ resolveTitle: resolveFirstAgentPromptTitle,
1052
+ });
1053
+ return workspaceId;
1054
+ };
1055
+ const listActiveWorkspacesExternal = async () => {
1056
+ const workspaces = await workspaceRegistry.list();
1057
+ return workspaces
1058
+ .filter((workspace) => !workspace.archivedAt)
1059
+ .map((workspace) => ({
1060
+ workspaceId: workspace.workspaceId,
1061
+ cwd: workspace.cwd,
1062
+ kind: workspace.kind,
1063
+ }));
1064
+ };
1065
+ const markWorkspaceArchivingExternal = (workspaceIds, archivingAt) => {
1066
+ const workspaceIdList = Array.from(workspaceIds);
1067
+ for (const session of wsServer?.listActiveSessions() ?? []) {
1068
+ session.markWorkspaceArchivingForExternalMutation(workspaceIdList, archivingAt);
1069
+ }
1070
+ };
1071
+ const clearWorkspaceArchivingExternal = (workspaceIds) => {
1072
+ const workspaceIdList = Array.from(workspaceIds);
1073
+ for (const session of wsServer?.listActiveSessions() ?? []) {
1074
+ session.clearWorkspaceArchivingForExternalMutation(workspaceIdList);
1075
+ }
1076
+ };
1077
+ const emitWorkspaceUpdatesExternal = async (workspaceIds) => {
1078
+ const workspaceIdList = Array.from(workspaceIds);
1079
+ await Promise.all((wsServer?.listActiveSessions() ?? []).map((session) => session.emitWorkspaceUpdatesForExternalWorkspaceIds(workspaceIdList)));
1080
+ };
1081
+ const emitWorkspaceUpdateForCwdExternal = async (cwd) => {
1082
+ const workspaceIds = workspaceIdsOnCheckout(await workspaceRegistry.list(), cwd);
1083
+ await emitWorkspaceUpdatesExternal(workspaceIds);
1084
+ };
1085
+ const emitExternalSessionMessage = (message) => {
1086
+ wsServer?.broadcast(wrapSessionMessage(message));
1087
+ };
1088
+ const workspaceAutoName = new WorkspaceAutoName({
1089
+ agentManager,
1090
+ workspaceRegistry,
1091
+ workspaceGitService,
1092
+ providerSnapshotManager,
1093
+ readDaemonConfig: () => ({ metadataGeneration: daemonConfigStore.get().metadataGeneration }),
1094
+ gitMutation: createGitMutationService({
1095
+ workspaceGitService,
1096
+ github,
1097
+ logger,
1098
+ }),
1099
+ emitWorkspaceUpdateForCwd: emitWorkspaceUpdateForCwdExternal,
1100
+ emitWorkspaceUpdateForWorkspaceId: async (workspaceId) => {
1101
+ await emitWorkspaceUpdatesExternal([workspaceId]);
1102
+ },
1103
+ logger,
1104
+ });
1105
+ setupAutoArchiveOnMerge({
1106
+ paseoHome: config.paseoHome,
1107
+ paseoWorktreesBaseRoot: config.worktreesRoot,
1108
+ daemonConfigStore,
1109
+ workspaceGitService,
1110
+ github,
1111
+ agentManager,
1112
+ agentStorage,
1113
+ terminalManager,
1114
+ logger,
1115
+ findWorkspaceIdForCwd: findWorkspaceIdForCwdExternal,
1116
+ listActiveWorkspaces: listActiveWorkspacesExternal,
1117
+ archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
1118
+ markWorkspaceArchiving: markWorkspaceArchivingExternal,
1119
+ clearWorkspaceArchiving: clearWorkspaceArchivingExternal,
1120
+ emitWorkspaceUpdatesForWorkspaceIds: emitWorkspaceUpdatesExternal,
1121
+ });
1122
+ const createPaseoWorktreeForTools = async (input, serviceOptions) => {
1123
+ return createPaseoWorktreeWorkflow({
1124
+ paseoHome: config.paseoHome,
1125
+ worktreesRoot: config.worktreesRoot,
1126
+ createPaseoWorktree: async (workflowInput, workflowOptions) => {
1127
+ return createRegisteredPaseoWorktree(workflowInput, {
1128
+ github,
1129
+ ...(workflowOptions?.resolveDefaultBranch
1130
+ ? {
1131
+ resolveDefaultBranch: workflowOptions.resolveDefaultBranch,
1132
+ }
1133
+ : {}),
1134
+ projectRegistry,
1135
+ workspaceRegistry,
1136
+ workspaceGitService,
1137
+ });
1138
+ },
1139
+ warmWorkspaceGitData: async (workspace) => {
1140
+ await Promise.all(wsServer
1141
+ ?.listActiveSessions()
1142
+ .map((session) => session.warmWorkspaceGitDataForWorkspace(workspace)) ?? []);
1143
+ },
1144
+ autoNameWorkspaceBranchForFirstAgent: (autoNameInput) => workspaceAutoName.scheduleForWorktree(autoNameInput),
1145
+ emitWorkspaceUpdateForWorkspaceId: async (workspaceId) => {
1146
+ await emitWorkspaceUpdatesExternal([workspaceId]);
1147
+ },
1148
+ cacheWorkspaceSetupSnapshot: () => { },
1149
+ emit: emitExternalSessionMessage,
1150
+ sessionLogger: logger,
1151
+ terminalManager,
1152
+ archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
1153
+ serviceProxy,
1154
+ scriptRuntimeStore,
1155
+ getDaemonTcpPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
1156
+ getDaemonTcpHost: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.host : null),
1157
+ serviceProxyPublicBaseUrl,
1158
+ onScriptsChanged: null,
1159
+ }, input, serviceOptions);
1160
+ };
1161
+ const createAgentToolHostDependencies = (runtime) => ({
1162
+ agentManager,
1163
+ agentStorage,
1164
+ terminalManager,
1165
+ getDaemonTcpPort: () => (boundListenTarget?.type === "tcp" ? boundListenTarget.port : null),
1166
+ scheduleService,
1167
+ providerSnapshotManager,
1168
+ github,
1169
+ workspaceGitService,
1170
+ findWorkspaceIdForCwd: findWorkspaceIdForCwdExternal,
1171
+ listActiveWorkspaces: listActiveWorkspacesExternal,
1172
+ archiveWorkspaceRecord: archiveWorkspaceRecordExternal,
1173
+ emitWorkspaceUpdatesForWorkspaceIds: emitWorkspaceUpdatesExternal,
1174
+ workspaceRegistry,
1175
+ markWorkspaceArchiving: markWorkspaceArchivingExternal,
1176
+ clearWorkspaceArchiving: clearWorkspaceArchivingExternal,
1177
+ ensureWorkspaceForCreate: ensureWorkspaceForCreateExternal,
1178
+ createPaseoWorktree: createPaseoWorktreeForTools,
1179
+ browserToolsEnabled: browserToolsPolicy.isEnabled(),
1180
+ browserToolsBroker,
1181
+ paseoHome: config.paseoHome,
1182
+ worktreesRoot: config.worktreesRoot,
1183
+ callerAgentId: runtime.callerAgentId,
1184
+ enableVoiceTools: runtime.enableVoiceTools,
1185
+ voiceOnly: runtime.voiceOnly,
1186
+ // JARVIS-V1-SPEC §6, HARD REQUIREMENT. The judge reads untrusted transcripts,
1187
+ // so it must not hold a mutating tool. Keyed on identity rather than on a
1188
+ // mode, because a mode is something the agent itself could change.
1189
+ readOnly: runtime.readOnly ||
1190
+ (jarvisJudgeConfig.agentId !== null && runtime.callerAgentId === jarvisJudgeConfig.agentId),
1191
+ // Only the judge's own tool sessions get the relay tool, and even then its
1192
+ // handler refuses unless a human turn is driving. Identity-keyed, like the
1193
+ // read-only surface, so the agent cannot grant it to itself.
1194
+ judgeRelayGate: jarvisJudgeConfig.agentId !== null && runtime.callerAgentId === jarvisJudgeConfig.agentId
1195
+ ? judgeRelayGate
1196
+ : undefined,
1197
+ resolveSpeakHandler: (agentId) => wsServer?.resolveVoiceSpeakHandler(agentId) ?? null,
1198
+ resolveCallerContext: (agentId) => wsServer?.resolveVoiceCallerContext(agentId) ?? null,
1199
+ logger,
1200
+ });
1201
+ const createAgentToolCatalog = (runtime) => createPaseoToolCatalog(createAgentToolHostDependencies(runtime));
1202
+ agentManager.setPaseoToolCatalogFactory(createAgentToolCatalog);
1203
+ agentManager.setPaseoToolsEnabled(config.mcpInjectIntoAgents !== false);
1204
+ const mcpEnabled = config.mcpEnabled ?? true;
1205
+ let agentMcpBaseUrl = null;
1206
+ if (mcpEnabled) {
1207
+ const agentMcpRoute = "/mcp/agents";
1208
+ const createAgentMcpSession = async (callerAgentId) => {
1209
+ // Adopt the converged host-dependency factory, then thread the daemon-owned
1210
+ // workflowManager so the additive `workflow_*` MCP tools register.
1211
+ const agentMcpServer = await createAgentMcpServer({
1212
+ ...createAgentToolHostDependencies({ callerAgentId }),
1213
+ workflowManager,
1214
+ // API-389: let the open_url MCP tool push to the user's paired client(s).
1215
+ broadcastToClients: emitExternalSessionMessage,
1216
+ });
1217
+ // Stateless mode: each HTTP request builds a fresh server + transport that is
1218
+ // torn down when the response closes, so no per-session state is retained between
1219
+ // requests. The agent control plane only lists and calls tools, neither of which
1220
+ // needs cross-request state, so sessions would only pin memory for the life of the
1221
+ // daemon (agents that exit without a clean DELETE never get reaped).
1222
+ const transport = new StreamableHTTPServerTransport({
1223
+ sessionIdGenerator: undefined,
1224
+ // NOTE: We enforce a Vite-like host allowlist at the app/websocket layer.
1225
+ // StreamableHTTPServerTransport's built-in check requires exact Host header matches.
1226
+ enableDnsRebindingProtection: false,
1227
+ });
1228
+ Object.assign(transport, {
1229
+ onerror: (err) => {
1230
+ logger.error({ err }, "Agent MCP transport error");
1231
+ },
1232
+ });
1233
+ await agentMcpServer.connect(transport);
1234
+ return { server: agentMcpServer, transport };
1235
+ };
1236
+ const runAgentMcpRequest = async (req, res) => {
1237
+ // This route is exempt from the global daemon-password middleware, so it
1238
+ // authenticates here using the injected capability token (or a valid
1239
+ // daemon password). Without this, a password-protected daemon would be
1240
+ // wide open on its agent control plane.
1241
+ if (!(await isAgentMcpRequestAuthorized({
1242
+ password: config.auth?.password,
1243
+ capabilityToken: agentMcpAuthToken,
1244
+ authorizationHeader: req.header("authorization"),
1245
+ }))) {
1246
+ res.status(401).json({ error: "Unauthorized" });
1247
+ return;
1248
+ }
1249
+ if (config.mcpDebug) {
1250
+ logger.debug({
1251
+ method: req.method,
1252
+ url: req.originalUrl,
1253
+ sessionId: req.header("mcp-session-id"),
1254
+ authorization: req.header("authorization") ? REDACTED_LOG_VALUE : undefined,
1255
+ body: summarizeAgentMcpDebugBody(req.body),
1256
+ }, "Agent MCP request");
1257
+ }
1258
+ try {
1259
+ // Stateless: GET (standalone SSE) and DELETE (session termination) have no
1260
+ // meaning without sessions. The MCP client tolerates 405 on the GET stream
1261
+ // and never issues a DELETE because it is never handed a session id.
1262
+ if (req.method !== "POST") {
1263
+ res.status(405).json({
1264
+ jsonrpc: "2.0",
1265
+ error: {
1266
+ code: -32000,
1267
+ message: "Method not allowed",
1268
+ },
1269
+ id: null,
1270
+ });
1271
+ return;
1272
+ }
1273
+ const callerAgentIdRaw = req.query.callerAgentId;
1274
+ let callerAgentId;
1275
+ if (typeof callerAgentIdRaw === "string") {
1276
+ callerAgentId = callerAgentIdRaw;
1277
+ }
1278
+ else if (Array.isArray(callerAgentIdRaw) && typeof callerAgentIdRaw[0] === "string") {
1279
+ callerAgentId = callerAgentIdRaw[0];
1280
+ }
1281
+ const { server, transport } = await createAgentMcpSession(callerAgentId);
1282
+ res.on("close", () => {
1283
+ void transport.close();
1284
+ void server.close();
1285
+ });
1286
+ await transport.handleRequest(req, res, req.body);
1287
+ }
1288
+ catch (err) {
1289
+ logger.error({ err }, "Failed to handle Agent MCP request");
1290
+ if (!res.headersSent) {
1291
+ res.status(500).json({
1292
+ jsonrpc: "2.0",
1293
+ error: {
1294
+ code: -32603,
1295
+ message: "Internal MCP server error",
1296
+ },
1297
+ id: null,
1298
+ });
1299
+ }
1300
+ }
1301
+ };
1302
+ const handleAgentMcpRequest = (req, res) => {
1303
+ void runAgentMcpRequest(req, res);
1304
+ };
1305
+ app.post(agentMcpRoute, handleAgentMcpRequest);
1306
+ app.get(agentMcpRoute, handleAgentMcpRequest);
1307
+ app.delete(agentMcpRoute, handleAgentMcpRequest);
1308
+ logger.info({ route: agentMcpRoute }, "Agent MCP server mounted on main app");
1309
+ }
1310
+ else {
1311
+ logger.info("Agent MCP HTTP endpoint disabled");
1312
+ }
1313
+ const speechService = createSpeechService({
1314
+ logger,
1315
+ openaiConfig: config.openai,
1316
+ speechConfig: config.speech,
1317
+ });
1318
+ logger.info({ elapsed: elapsed() }, "Speech service created");
1319
+ logger.info({ elapsed: elapsed() }, "Bootstrap complete, ready to start listening");
1320
+ // Agents that were RUNNING when the daemon goes down lose their turn
1321
+ // mid-sentence, and nothing ever tells them so. Record that set on the way
1322
+ // out; `resumeAgentsAfterRestart` nudges exactly those on the way back in.
1323
+ //
1324
+ // Must run before anything tears agents down: `hasInFlightRun` reads
1325
+ // agentManager's live memory, and `closeAllAgents` is about to empty it.
1326
+ const captureInFlightAgentsForResume = async (reason) => {
1327
+ try {
1328
+ const inFlight = collectInFlightAgentIds(agentManager);
1329
+ await writeRestartManifest({
1330
+ paseoHome: config.paseoHome,
1331
+ agentIds: inFlight,
1332
+ reason,
1333
+ logger,
1334
+ });
1335
+ }
1336
+ catch (err) {
1337
+ // Shutdown must never hang or fail on the nudge bookkeeping.
1338
+ logger.warn({ err, reason }, "Failed to capture in-flight agents for resume");
1339
+ }
1340
+ };
1341
+ const start = async () => {
1342
+ let mainStarted = false;
1343
+ try {
1344
+ if (serviceProxyListenTarget) {
1345
+ const boundServiceProxyTarget = await serviceProxy.startStandalone({
1346
+ listenTarget: serviceProxyListenTarget,
1347
+ });
1348
+ serviceProxyListenTarget = boundServiceProxyTarget;
1349
+ logger.info({
1350
+ listen: formatListenTarget(serviceProxyListenTarget),
1351
+ publicBaseUrl: serviceProxyPublicBaseUrl,
1352
+ elapsed: elapsed(),
1353
+ }, "Service proxy listening");
1354
+ }
1355
+ // Start main HTTP server
1356
+ await new Promise((resolve, reject) => {
1357
+ const onError = (err) => {
1358
+ httpServer.off("listening", onListening);
1359
+ reject(err);
1360
+ };
1361
+ const onListening = () => {
1362
+ httpServer.off("error", onError);
1363
+ mainStarted = true;
1364
+ const logAndResolve = async () => {
1365
+ boundListenTarget = resolveBoundListenTarget(listenTarget, httpServer);
1366
+ const mcpBaseUrl = mcpEnabled ? createAgentMcpBaseUrl(boundListenTarget) : null;
1367
+ agentMcpBaseUrl = config.mcpInjectIntoAgents === false ? null : mcpBaseUrl;
1368
+ agentManager.setMcpBaseUrl(agentMcpBaseUrl);
1369
+ agentManager.setPaseoToolsEnabled(config.mcpInjectIntoAgents !== false);
1370
+ daemonConfigStore.onFieldChange("mcp.injectIntoAgents", (value) => {
1371
+ agentManager.setMcpBaseUrl(value ? mcpBaseUrl : null);
1372
+ agentManager.setPaseoToolsEnabled(value !== false);
1373
+ });
1374
+ daemonConfigStore.onFieldChange("appendSystemPrompt", (value) => {
1375
+ agentManager.setAppendSystemPrompt(typeof value === "string" ? value : "");
1376
+ });
1377
+ const relayEnabled = config.relayEnabled ?? true;
1378
+ const relayEndpoint = config.relayEndpoint ?? "relay.paseo.sh:443";
1379
+ const relayPublicEndpoint = config.relayPublicEndpoint ?? relayEndpoint;
1380
+ const relayUseTls = config.relayUseTls ?? relayEndpoint === "relay.paseo.sh:443";
1381
+ const relayPublicUseTls = config.relayPublicUseTls ?? relayUseTls;
1382
+ const appBaseUrl = config.appBaseUrl ?? "https://app.paseo.sh";
1383
+ if (boundListenTarget.type === "tcp") {
1384
+ logger.info({
1385
+ host: boundListenTarget.host,
1386
+ port: boundListenTarget.port,
1387
+ authRequired: !!config.auth?.password,
1388
+ elapsed: elapsed(),
1389
+ }, `Server listening on http://${boundListenTarget.host}:${boundListenTarget.port}`);
1390
+ }
1391
+ else {
1392
+ logger.info({
1393
+ path: boundListenTarget.path,
1394
+ authRequired: !!config.auth?.password,
1395
+ elapsed: elapsed(),
1396
+ }, `Server listening on ${boundListenTarget.path}`);
1397
+ }
1398
+ if (config.auth?.password) {
1399
+ logger.info("Daemon password authentication enabled");
1400
+ }
1401
+ // Push subsystem wires the pushTrigger channel onto the AgentManager
1402
+ // attention bus alongside WebSocketServer. Stories 1.3/1.4 will attach
1403
+ // their delivery workers to `pushSubsystem.triggerEmitter.on(...)`.
1404
+ // The PASEO_PUSH_ENABLED=false kill switch is honored inside the emitter.
1405
+ pushSubsystem = createPushSubsystem({
1406
+ agentManager,
1407
+ serverId,
1408
+ logger,
1409
+ subscriptionStore: pushSubscriptionStore,
1410
+ vapidKeys,
1411
+ });
1412
+ wsServer = new VoiceAssistantWebSocketServer(httpServer, logger, serverId, agentManager, agentStorage, downloadTokenStore, config.paseoHome, daemonConfigStore, mcpBaseUrl, { allowedOrigins, hostnames: configuredHostnames }, workspaceAutoName, config.auth, speechService, terminalManager, {
1413
+ finalTimeoutMs: config.dictationFinalTimeoutMs,
1414
+ }, daemonVersion, (intent) => {
1415
+ try {
1416
+ config.onLifecycleIntent?.(intent);
1417
+ }
1418
+ catch (error) {
1419
+ logger.error({ err: error, intent }, "Failed to handle daemon lifecycle intent");
1420
+ }
1421
+ }, projectRegistry, workspaceRegistry, chatService, loopService, scheduleService, ingestionService, 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, {
1422
+ listen: formatListenTarget(boundListenTarget ?? listenTarget),
1423
+ worktreesRoot: config.worktreesRoot,
1424
+ appBaseUrl: config.appBaseUrl,
1425
+ relay: {
1426
+ enabled: relayEnabled,
1427
+ endpoint: relayEndpoint,
1428
+ publicEndpoint: relayPublicEndpoint,
1429
+ useTls: relayUseTls,
1430
+ publicUseTls: relayPublicUseTls,
1431
+ },
1432
+ },
1433
+ // Story 1.3 — inject the WorkflowManager so Session can serve
1434
+ // `workflow.*` RPCs (Session -> WorkflowManager, one-directional).
1435
+ workflowManager, serviceProxyPublicBaseUrl, browserToolsBroker, {
1436
+ filterStore: ingestionFilterStore,
1437
+ sourceStore: ingestionSourceStore,
1438
+ gatewayResolver: ingestionGatewayResolver,
1439
+ ledger: ingestionLedger,
1440
+ cohorts: ingestionCohorts,
1441
+ cohortStore: ingestionCohortStore,
1442
+ },
1443
+ // JARVIS-V1-SPEC §8. A getter so every server_info broadcast carries
1444
+ // the CURRENT availability, not whatever it was at daemon start.
1445
+ () => jarvisJudge.describe());
1446
+ // Story 1.3 bridge: re-publish Expo tokens registered via the legacy
1447
+ // `register_push_token` WebSocket message into the Story 1.2
1448
+ // PushSubscriptionStore so the Expo Push worker sees them.
1449
+ wsServer.setExpoTokenBridge((token) => {
1450
+ pushSubscriptionStore.upsert({ type: "expo", token });
1451
+ });
1452
+ // Chat-actions ws bridges (2026-05): expose the Story 1.2 push
1453
+ // subscription store + VAPID public key to every Session so
1454
+ // relay-connected clients can persist subscriptions and fetch the
1455
+ // VAPID key without round-tripping the HTTP /push/* routes
1456
+ // (which are unreachable over the relay transport).
1457
+ wsServer.setPushSubscriptionBridge(pushSubscriptionStore, vapidKeys.publicKey);
1458
+ // COMPAT(extensions): route client-invoked plugin commands to the
1459
+ // extension-service. No-op until HYPERPASEO_EXTENSIONS=1 spawns hosts
1460
+ // (executeCommand then throws "no extension provides …" → ok:false).
1461
+ wsServer.setExtensionExecuteCommand((commandId, args) => extensionService.executeCommand(commandId, args));
1462
+ if (relayEnabled) {
1463
+ const offer = await createConnectionOfferV2({
1464
+ serverId,
1465
+ daemonPublicKeyB64: daemonKeyPair.publicKeyB64,
1466
+ relay: {
1467
+ endpoint: relayPublicEndpoint,
1468
+ useTls: relayPublicUseTls,
1469
+ },
1470
+ });
1471
+ encodeOfferToFragmentUrl({ offer, appBaseUrl });
1472
+ relayTransport?.stop().catch(() => undefined);
1473
+ relayTransport = startRelayTransport({
1474
+ logger,
1475
+ attachSocket: (ws, metadata) => {
1476
+ if (!wsServer) {
1477
+ throw new Error("WebSocket server not initialized");
1478
+ }
1479
+ return wsServer.attachExternalSocket(ws, metadata);
1480
+ },
1481
+ relayEndpoint,
1482
+ relayUseTls,
1483
+ serverId,
1484
+ daemonKeyPair: daemonKeyPair.keyPair,
1485
+ });
1486
+ }
1487
+ };
1488
+ logAndResolve().then(resolve, reject);
1489
+ };
1490
+ httpServer.once("error", onError);
1491
+ httpServer.once("listening", onListening);
1492
+ if (listenTarget.type === "tcp") {
1493
+ httpServer.listen(listenTarget.port, listenTarget.host);
1494
+ }
1495
+ else {
1496
+ if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
1497
+ unlinkSync(listenTarget.path);
1498
+ }
1499
+ httpServer.listen(listenTarget.path);
1500
+ }
1501
+ });
1502
+ // Start speech service after listening so synchronous Sherpa native
1503
+ // model loading doesn't block the server from accepting connections.
1504
+ speechService.start();
1505
+ scriptHealthMonitor.start();
1506
+ await extensionService.start();
1507
+ // Nudge the agents the previous shutdown interrupted.
1508
+ //
1509
+ // After the listen, not before: `agentManager.setMcpBaseUrl` is only
1510
+ // called from the `onListening` callback above, so an agent resumed
1511
+ // earlier would come back without paseo's own MCP tools.
1512
+ //
1513
+ // Not awaited: `start()` gates the supervisor's readiness message, and
1514
+ // each nudge is a full provider turn. Blocking on them would report a
1515
+ // healthy daemon as slow to boot.
1516
+ void resumeAgentsAfterRestart({
1517
+ paseoHome: config.paseoHome,
1518
+ agentManager,
1519
+ agentStorage,
1520
+ logger,
1521
+ }).catch((err) => {
1522
+ logger.warn({ err }, "Resume after restart failed");
1523
+ });
1524
+ }
1525
+ catch (error) {
1526
+ await serviceProxy.stopStandalone().catch(() => undefined);
1527
+ if (mainStarted) {
1528
+ httpServer.closeAllConnections();
1529
+ await new Promise((resolve) => httpServer.close(() => resolve()));
1530
+ }
1531
+ throw error;
1532
+ }
1533
+ };
1534
+ const stop = async () => {
1535
+ await captureInFlightAgentsForResume("daemon_stop");
1536
+ scriptHealthMonitor.stop();
1537
+ await extensionService.stop().catch(() => undefined);
1538
+ await closeAllAgents(logger, agentManager);
1539
+ await agentManager.flush().catch(() => undefined);
1540
+ detachAgentStoragePersistence();
1541
+ await agentStorage.flush().catch(() => undefined);
1542
+ await providerSnapshotManager.shutdown();
1543
+ terminalManager.killAll();
1544
+ speechService.stop();
1545
+ await scheduleService.stop().catch(() => undefined);
1546
+ // Closing checkpoints the WAL away. Optional-chained because construction above
1547
+ // is allowed to have failed without stopping the daemon.
1548
+ ingestionLedger?.close();
1549
+ await ingestionService.stop().catch(() => undefined);
1550
+ await relayTransport?.stop().catch(() => undefined);
1551
+ if (wsServer) {
1552
+ await wsServer.close();
1553
+ }
1554
+ pushSubsystem?.dispose();
1555
+ await serviceProxy.stopStandalone();
1556
+ // Force-drop remaining sockets so httpServer.close() resolves promptly.
1557
+ // We've already closed wsServer (which sent ws-layer close frames) and
1558
+ // stopped every other service, so anything still attached is a TCP
1559
+ // socket whose higher-level shutdown hasn't fully released it (e.g.
1560
+ // upgraded WS sockets in the closing handshake, or HTTP keep-alive
1561
+ // sockets in CLOSE_WAIT). closeIdleConnections() does not catch
1562
+ // upgraded sockets, so we use closeAllConnections() here.
1563
+ httpServer.closeAllConnections();
1564
+ await new Promise((resolve) => {
1565
+ httpServer.close(() => resolve());
1566
+ });
1567
+ // Clean up socket files
1568
+ if (listenTarget.type === "socket" && existsSync(listenTarget.path)) {
1569
+ unlinkSync(listenTarget.path);
1570
+ }
1571
+ };
1572
+ return {
1573
+ config,
1574
+ agentManager,
1575
+ agentStorage,
1576
+ workflowManager,
1577
+ terminalManager,
1578
+ serviceProxy,
1579
+ scriptRuntimeStore,
1580
+ browserToolsBroker,
1581
+ start,
1582
+ stop,
1583
+ getListenTarget: () => boundListenTarget,
1584
+ };
1585
+ }
1586
+ async function closeAllAgents(logger, agentManager) {
1587
+ const agents = agentManager.listAgents();
1588
+ await Promise.all(agents.map(async (agent) => {
1589
+ try {
1590
+ await agentManager.closeAgent(agent.id);
1591
+ }
1592
+ catch (err) {
1593
+ logger.error({ err, agentId: agent.id }, "Failed to close agent");
1594
+ }
1595
+ }));
1596
+ }
1597
+ //# sourceMappingURL=bootstrap.js.map