@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,2616 @@
1
+ import { z } from "zod";
2
+ import { ensureValidJson } from "../../json-utils.js";
3
+ import { AgentFeatureSchema, AgentPermissionRequestPayloadSchema, AgentListItemPayloadSchema, AgentPermissionResponseSchema, AgentSnapshotPayloadSchema, WorkspaceStateBucketSchema, } from "../../messages.js";
4
+ import { emptyAgentFilterCriteria, filterSelectionFrom, isAgentDay, } from "@hyperdrive.bot/fleet-protocol/agent-filter";
5
+ import { collectAgentListFacets, filterAgentList, withActiveChildCounts, } from "../agent-list-filter.js";
6
+ import { buildStoredAgentPayload, toAgentListItemPayload, toAgentPayload, } from "../agent-projections.js";
7
+ import { curateAgentActivity } from "../activity-curator.js";
8
+ import { selectItemsByProjectedLimit } from "../timeline-projection.js";
9
+ import { ensureAgentLoaded } from "../agent-loading.js";
10
+ import { isStoredAgentProviderAvailable } from "../../persistence-hooks.js";
11
+ import { killTerminalsForWorkspace, } from "../../workspace-archive-service.js";
12
+ import { WaitForAgentTracker } from "../wait-for-agent-tracker.js";
13
+ import { createAgentCommand } from "../create-agent/create.js";
14
+ import { expandUserPath, isSameOrDescendantPath, resolvePathFromBase } from "../../path-utils.js";
15
+ import { isReadOnlyPaseoTool } from "./read-only-surface.js";
16
+ import { AgentRoutineSchema } from "@hyperdrive.bot/fleet-protocol/schedule/routine";
17
+ import { normalizeScheduleCadenceArg, normalizeScheduleTimeZoneArg, resolveScheduleCreateCadence, } from "../../schedule/create-cadence.js";
18
+ import { ScheduleRunSchema, ScheduleSummarySchema, StoredScheduleSchema, } from "@hyperdrive.bot/fleet-protocol/schedule/types";
19
+ import { AgentModelSchema, AgentProviderEnum, AgentStatusEnum, ProviderModeSchema, ProviderSummarySchema, parseDurationString, resolveRequiredProviderModel, sanitizePermissionRequest, serializeSnapshotWithMetadata, toScheduleSummary, waitForAgentWithTimeout, } from "../mcp-shared.js";
20
+ import { sendPromptToAgent, setupFinishNotification } from "../agent-prompt.js";
21
+ import { respondToAgentPermission } from "../permission-response.js";
22
+ import { archiveAgentCommand, cancelAgentRunCommand, closeAgentCommand, setAgentModeCommand, updateAgentCommand, } from "../lifecycle-command.js";
23
+ import { WorktreeRequestError } from "../../worktree-errors.js";
24
+ import { archiveCommand, createPaseoWorktreeCommand, listPaseoWorktreesCommand, } from "../../worktree/commands.js";
25
+ import { registerBrowserTools } from "../../browser-tools/tools.js";
26
+ /**
27
+ * Resolves the archived dimension from the tri-state field, falling back to the
28
+ * legacy boolean. `hide` stays the default: a list that silently includes
29
+ * months of archived sessions is the wrong answer to an unqualified
30
+ * "list agents".
31
+ */
32
+ function resolveArchivedMode(archived, includeArchived) {
33
+ if (archived)
34
+ return archived;
35
+ if (includeArchived === true)
36
+ return "all";
37
+ return "hide";
38
+ }
39
+ /**
40
+ * Turns the two wire shapes into the single tagged selection the predicate
41
+ * takes.
42
+ *
43
+ * A window and an exact range are the SAME dimension, so supplying both is a
44
+ * contradiction rather than an intersection; the explicit range wins because it
45
+ * is the more specific request. A half-specified range (`from` without `to`) or
46
+ * an impossible day (2026-02-31) is ignored rather than silently emptying the
47
+ * list, because an empty result is indistinguishable from "nothing matched".
48
+ */
49
+ function resolveTimeSelection(window, from, to) {
50
+ if (isAgentDay(from) && isAgentDay(to))
51
+ return { kind: "range", range: { from, to } };
52
+ if (window)
53
+ return { kind: "window", window };
54
+ return null;
55
+ }
56
+ function parseTimestamp(value) {
57
+ if (!value) {
58
+ return 0;
59
+ }
60
+ const parsed = Date.parse(value);
61
+ return Number.isNaN(parsed) ? 0 : parsed;
62
+ }
63
+ function resolveAgentListActivityTime(agent) {
64
+ return Math.max(parseTimestamp(agent.updatedAt), parseTimestamp(agent.lastUserMessageAt), parseTimestamp(agent.attentionTimestamp), parseTimestamp(agent.archivedAt), parseTimestamp(agent.createdAt));
65
+ }
66
+ function toProviderSummary(entry) {
67
+ return {
68
+ id: entry.provider,
69
+ label: entry.label ?? entry.provider,
70
+ description: entry.description ?? "",
71
+ enabled: entry.enabled,
72
+ modes: entry.modes ?? [],
73
+ status: entry.status === "ready" ? "available" : entry.status,
74
+ ...(entry.error ? { error: entry.error } : {}),
75
+ };
76
+ }
77
+ function compareAgentListItems(a, b) {
78
+ const attentionDelta = Number(b.requiresAttention ?? false) - Number(a.requiresAttention ?? false);
79
+ if (attentionDelta !== 0) {
80
+ return attentionDelta;
81
+ }
82
+ const statusOrder = {
83
+ running: 0,
84
+ initializing: 1,
85
+ idle: 2,
86
+ error: 3,
87
+ closed: 4,
88
+ };
89
+ const statusDelta = (statusOrder[a.status] ?? 999) - (statusOrder[b.status] ?? 999);
90
+ if (statusDelta !== 0) {
91
+ return statusDelta;
92
+ }
93
+ return resolveAgentListActivityTime(b) - resolveAgentListActivityTime(a);
94
+ }
95
+ // The two create_agent response paths both report a routine the same way.
96
+ // Shared so neither drifts, and so neither pays a branch against the handler's
97
+ // complexity budget.
98
+ function describeAttachedRoutine(routine) {
99
+ return routine ? { scheduleId: routine.scheduleId, nextRunAt: routine.nextRunAt } : {};
100
+ }
101
+ function resolveScheduleProviderAndModel(params) {
102
+ const providerInput = params.provider?.trim() || params.defaultProvider;
103
+ const slashIndex = providerInput.indexOf("/");
104
+ if (slashIndex === -1) {
105
+ return { provider: providerInput };
106
+ }
107
+ const provider = providerInput.slice(0, slashIndex).trim();
108
+ const model = providerInput.slice(slashIndex + 1).trim();
109
+ if (!provider || !model) {
110
+ throw new Error("provider must be <provider> or <provider>/<model>");
111
+ }
112
+ return {
113
+ provider: provider,
114
+ model,
115
+ };
116
+ }
117
+ function resolveScheduleUpdateProviderAndModel(params) {
118
+ const providerInput = params.provider?.trim();
119
+ const modelInput = typeof params.model === "string" ? params.model.trim() : params.model;
120
+ if (params.model !== undefined && modelInput === "") {
121
+ throw new Error("model cannot be empty");
122
+ }
123
+ if (!providerInput) {
124
+ return params.model !== undefined ? { model: modelInput } : {};
125
+ }
126
+ const slashIndex = providerInput.indexOf("/");
127
+ if (slashIndex === -1) {
128
+ return {
129
+ provider: providerInput,
130
+ ...(params.model !== undefined ? { model: modelInput } : {}),
131
+ };
132
+ }
133
+ const provider = providerInput.slice(0, slashIndex).trim();
134
+ const modelFromProvider = providerInput.slice(slashIndex + 1).trim();
135
+ if (!provider || !modelFromProvider) {
136
+ throw new Error("provider must be <provider> or <provider>/<model>");
137
+ }
138
+ if (params.model === null) {
139
+ throw new Error("provider specifies a model but model is null");
140
+ }
141
+ if (typeof modelInput === "string" && modelInput !== modelFromProvider) {
142
+ throw new Error("Conflicting model values provided");
143
+ }
144
+ return {
145
+ provider,
146
+ model: modelInput ?? modelFromProvider,
147
+ };
148
+ }
149
+ function resolveScheduleUpdateCadence(input) {
150
+ const every = normalizeScheduleCadenceArg(input.every);
151
+ const cron = normalizeScheduleCadenceArg(input.cron);
152
+ const timeZone = normalizeScheduleTimeZoneArg(input.timezone);
153
+ if (every !== undefined && cron !== undefined) {
154
+ throw new Error("Specify at most one of every or cron");
155
+ }
156
+ if (timeZone !== undefined && cron === undefined) {
157
+ throw new Error("timezone can only be used with cron");
158
+ }
159
+ if (every !== undefined) {
160
+ return { type: "every", everyMs: parseDurationString(every) };
161
+ }
162
+ if (cron !== undefined) {
163
+ return {
164
+ type: "cron",
165
+ expression: cron,
166
+ ...(timeZone !== undefined ? { timezone: timeZone } : {}),
167
+ };
168
+ }
169
+ return undefined;
170
+ }
171
+ function resolveScheduleUpdateExpiresAt(input) {
172
+ if (input.expiresIn !== undefined && input.clearExpires) {
173
+ throw new Error("Specify at most one of expiresIn or clearExpires");
174
+ }
175
+ if (input.expiresIn !== undefined) {
176
+ return new Date(Date.now() + parseDurationString(input.expiresIn)).toISOString();
177
+ }
178
+ if (input.clearExpires) {
179
+ return null;
180
+ }
181
+ return undefined;
182
+ }
183
+ function buildScheduleUpdateInput(input) {
184
+ const cadence = resolveScheduleUpdateCadence(input);
185
+ const expiresAt = resolveScheduleUpdateExpiresAt(input);
186
+ const providerModelPatch = resolveScheduleUpdateProviderAndModel({
187
+ provider: input.provider,
188
+ model: input.model,
189
+ });
190
+ const newAgentConfig = {
191
+ ...(providerModelPatch.provider !== undefined ? { provider: providerModelPatch.provider } : {}),
192
+ ...(providerModelPatch.model !== undefined ? { model: providerModelPatch.model } : {}),
193
+ ...(input.mode !== undefined ? { modeId: input.mode } : {}),
194
+ ...(input.cwd !== undefined ? { cwd: input.cwd } : {}),
195
+ };
196
+ return {
197
+ id: input.id,
198
+ ...(input.name !== undefined ? { name: input.name } : {}),
199
+ ...(input.prompt !== undefined ? { prompt: input.prompt } : {}),
200
+ ...(cadence !== undefined ? { cadence } : {}),
201
+ ...(input.maxRuns !== undefined ? { maxRuns: input.maxRuns } : {}),
202
+ ...(expiresAt !== undefined ? { expiresAt } : {}),
203
+ ...(Object.keys(newAgentConfig).length > 0 ? { newAgentConfig } : {}),
204
+ };
205
+ }
206
+ function resolveChildAgentCwd(params) {
207
+ const lockedCwd = params.lockedCwd?.trim();
208
+ if (lockedCwd) {
209
+ return expandUserPath(lockedCwd);
210
+ }
211
+ const requestedCwd = params.requestedCwd?.trim();
212
+ if (!requestedCwd || !params.allowCustomCwd) {
213
+ return params.parentCwd;
214
+ }
215
+ return resolvePathFromBase(params.parentCwd, requestedCwd);
216
+ }
217
+ const TerminalSummarySchema = z.object({
218
+ id: z.string(),
219
+ name: z.string(),
220
+ cwd: z.string(),
221
+ });
222
+ const WorktreeSummarySchema = z.object({
223
+ path: z.string(),
224
+ createdAt: z.string(),
225
+ branchName: z.string().optional(),
226
+ head: z.string().optional(),
227
+ });
228
+ function resolveTerminalKeyToken(key, literal) {
229
+ if (literal) {
230
+ return key;
231
+ }
232
+ switch (key) {
233
+ case "Enter":
234
+ return "\r";
235
+ case "Tab":
236
+ return "\t";
237
+ case "Escape":
238
+ return "\u001b";
239
+ case "Space":
240
+ return " ";
241
+ case "BSpace":
242
+ return "\u007f";
243
+ case "C-c":
244
+ return "\u0003";
245
+ case "C-d":
246
+ return "\u0004";
247
+ case "C-z":
248
+ return "\u001a";
249
+ case "C-l":
250
+ return "\u000c";
251
+ case "C-a":
252
+ return "\u0001";
253
+ case "C-e":
254
+ return "\u0005";
255
+ default:
256
+ return key;
257
+ }
258
+ }
259
+ export function createPaseoToolCatalog(options) {
260
+ const { agentManager, agentStorage, terminalManager, scheduleService, providerSnapshotManager, callerAgentId, resolveSpeakHandler, resolveCallerContext, logger, } = options;
261
+ const childLogger = logger.child({ module: "agent", component: "paseo-tool-catalog" });
262
+ const waitTracker = new WaitForAgentTracker(logger);
263
+ const callerContext = callerAgentId ? (resolveCallerContext?.(callerAgentId) ?? null) : null;
264
+ const parseToolInput = async (tool, input) => {
265
+ const inputSchema = tool.inputSchema;
266
+ if (!inputSchema) {
267
+ return input;
268
+ }
269
+ const schema = typeof inputSchema === "object" &&
270
+ inputSchema !== null &&
271
+ typeof inputSchema.safeParseAsync === "function"
272
+ ? inputSchema
273
+ : z.object(inputSchema).passthrough();
274
+ return schema.parseAsync(input);
275
+ };
276
+ const tools = new Map();
277
+ const registerTool = (name, config,
278
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Tool handlers are schema-validated at registration boundaries.
279
+ handler) => {
280
+ // Read-only gate (JARVIS-V1-SPEC §6). Allowlist, so a mutating tool added
281
+ // later fails closed instead of silently joining a read-only surface.
282
+ if (options.readOnly && !isReadOnlyPaseoTool(name)) {
283
+ return;
284
+ }
285
+ tools.set(name, {
286
+ name,
287
+ title: config.title,
288
+ description: config.description ?? name,
289
+ inputSchema: config.inputSchema,
290
+ outputSchema: config.outputSchema,
291
+ handler: handler,
292
+ });
293
+ };
294
+ const toCatalog = () => ({
295
+ tools,
296
+ getTool(name) {
297
+ return tools.get(name);
298
+ },
299
+ async executeTool(name, input, context = {}) {
300
+ const tool = tools.get(name);
301
+ if (!tool) {
302
+ throw new Error(`Paseo tool not found: ${name}`);
303
+ }
304
+ return tool.handler(await parseToolInput(tool, input), context);
305
+ },
306
+ });
307
+ const buildScheduleExpiry = (expiresIn) => {
308
+ return expiresIn === undefined
309
+ ? undefined
310
+ : new Date(Date.now() + parseDurationString(expiresIn)).toISOString();
311
+ };
312
+ const resolveCallerAgent = () => {
313
+ if (!callerAgentId) {
314
+ return null;
315
+ }
316
+ const parentAgent = agentManager.getAgent(callerAgentId);
317
+ if (!parentAgent) {
318
+ throw new Error(`Parent agent ${callerAgentId} not found`);
319
+ }
320
+ return parentAgent;
321
+ };
322
+ const resolveScopedCwd = (requestedCwd, opts) => {
323
+ const callerAgent = resolveCallerAgent();
324
+ if (callerAgent) {
325
+ return resolveChildAgentCwd({
326
+ parentCwd: callerAgent.cwd,
327
+ requestedCwd,
328
+ lockedCwd: callerContext?.lockedCwd,
329
+ allowCustomCwd: callerContext?.allowCustomCwd ?? true,
330
+ });
331
+ }
332
+ const trimmedCwd = requestedCwd?.trim();
333
+ if (!trimmedCwd) {
334
+ if (opts?.required) {
335
+ throw new Error("cwd is required");
336
+ }
337
+ throw new Error("cwd is required outside an agent-scoped session");
338
+ }
339
+ return expandUserPath(trimmedCwd);
340
+ };
341
+ async function resolveTerminalWorkspaceId(resolvedCwd) {
342
+ // An agent-spawned terminal belongs to the caller agent's workspace. Only if
343
+ // the caller has no workspace do we mint one for the cwd.
344
+ const callerAgent = callerAgentId ? agentManager.getAgent(callerAgentId) : null;
345
+ if (callerAgent?.workspaceId) {
346
+ return callerAgent.workspaceId;
347
+ }
348
+ if (!options.ensureWorkspaceForCreate) {
349
+ throw new Error(callerAgentId
350
+ ? `Caller agent ${callerAgentId} has no workspace and workspace minting is not configured`
351
+ : "workspaceId is required outside an agent-scoped session");
352
+ }
353
+ return options.ensureWorkspaceForCreate(resolvedCwd);
354
+ }
355
+ function resolveWorkspaceIdForRename(requestedWorkspaceId) {
356
+ const explicitWorkspaceId = requestedWorkspaceId?.trim();
357
+ if (explicitWorkspaceId) {
358
+ return explicitWorkspaceId;
359
+ }
360
+ if (callerAgentId) {
361
+ const callerAgent = resolveCallerAgent();
362
+ if (!callerAgent?.workspaceId) {
363
+ throw new Error(`Caller agent ${callerAgentId} has no current workspace`);
364
+ }
365
+ return callerAgent.workspaceId;
366
+ }
367
+ throw new Error("workspaceId is required outside an agent-scoped session");
368
+ }
369
+ const buildCallerAgentScheduleConfigExtras = (callerAgent) => {
370
+ return {
371
+ ...(callerAgent.config.thinkingOptionId
372
+ ? { thinkingOptionId: callerAgent.config.thinkingOptionId }
373
+ : {}),
374
+ ...(callerAgent.config.approvalPolicy
375
+ ? { approvalPolicy: callerAgent.config.approvalPolicy }
376
+ : {}),
377
+ ...(callerAgent.config.sandboxMode ? { sandboxMode: callerAgent.config.sandboxMode } : {}),
378
+ ...(typeof callerAgent.config.networkAccess === "boolean"
379
+ ? { networkAccess: callerAgent.config.networkAccess }
380
+ : {}),
381
+ ...(typeof callerAgent.config.webSearch === "boolean"
382
+ ? { webSearch: callerAgent.config.webSearch }
383
+ : {}),
384
+ ...(callerAgent.config.title ? { title: callerAgent.config.title } : {}),
385
+ ...(callerAgent.config.extra ? { extra: callerAgent.config.extra } : {}),
386
+ ...(callerAgent.config.featureValues
387
+ ? { featureValues: callerAgent.config.featureValues }
388
+ : {}),
389
+ ...(callerAgent.config.systemPrompt ? { systemPrompt: callerAgent.config.systemPrompt } : {}),
390
+ ...(callerAgent.config.mcpServers ? { mcpServers: callerAgent.config.mcpServers } : {}),
391
+ };
392
+ };
393
+ const buildCallerAgentScheduleConfig = (callerAgent, params) => {
394
+ const hasProviderOverride = params?.provider !== undefined;
395
+ const resolvedProviderModel = hasProviderOverride
396
+ ? resolveScheduleProviderAndModel({
397
+ provider: params?.provider,
398
+ defaultProvider: callerAgent.provider,
399
+ })
400
+ : null;
401
+ const resolvedProvider = resolvedProviderModel?.provider ?? callerAgent.provider;
402
+ let resolvedModel;
403
+ if (resolvedProviderModel?.model) {
404
+ resolvedModel = resolvedProviderModel.model;
405
+ }
406
+ else if (!hasProviderOverride && callerAgent.config.model) {
407
+ resolvedModel = callerAgent.config.model;
408
+ }
409
+ return {
410
+ provider: resolvedProvider,
411
+ cwd: params?.cwd?.trim() ? expandUserPath(params.cwd) : callerAgent.cwd,
412
+ ...(callerAgent.currentModeId && callerAgent.provider === resolvedProvider
413
+ ? {
414
+ modeId: callerAgent.currentModeId,
415
+ }
416
+ : {}),
417
+ ...(resolvedModel ? { model: resolvedModel } : {}),
418
+ ...buildCallerAgentScheduleConfigExtras(callerAgent),
419
+ };
420
+ };
421
+ const resolveNewAgentScheduleTarget = (params) => {
422
+ if (!params?.provider?.trim()) {
423
+ throw new Error("provider is required when target is new-agent");
424
+ }
425
+ const callerAgent = resolveCallerAgent();
426
+ if (callerAgent) {
427
+ return {
428
+ type: "new-agent",
429
+ config: buildCallerAgentScheduleConfig(callerAgent, params),
430
+ };
431
+ }
432
+ const resolvedProviderModel = resolveScheduleProviderAndModel({
433
+ provider: params?.provider,
434
+ defaultProvider: params.provider,
435
+ });
436
+ return {
437
+ type: "new-agent",
438
+ config: {
439
+ provider: resolvedProviderModel.provider,
440
+ cwd: params?.cwd?.trim() ? expandUserPath(params.cwd) : process.cwd(),
441
+ ...(resolvedProviderModel.model ? { model: resolvedProviderModel.model } : {}),
442
+ },
443
+ };
444
+ };
445
+ // A schedule bound to an agent that is gone can never fire: the startup sweep
446
+ // completes it on sight. Fail loudly at create time instead of handing back a
447
+ // schedule that reads active and is already dead.
448
+ const assertScheduleTargetAgentExists = async (agentId) => {
449
+ if (agentManager.getAgent(agentId)) {
450
+ return;
451
+ }
452
+ const record = await agentStorage.get(agentId);
453
+ if (!record || record.internal) {
454
+ throw new Error(`Agent ${agentId} not found`);
455
+ }
456
+ if (record.archivedAt) {
457
+ throw new Error(`Agent ${agentId} is archived and cannot be a schedule target`);
458
+ }
459
+ };
460
+ const resolveScheduleCreateTarget = async (params) => {
461
+ const target = params.target?.trim();
462
+ // Default stays new-agent so callers written against the narrower schema
463
+ // keep the behaviour they had before target existed.
464
+ if (!target || target === "new-agent") {
465
+ return resolveNewAgentScheduleTarget({
466
+ ...(params.provider !== undefined ? { provider: params.provider } : {}),
467
+ ...(params.cwd !== undefined ? { cwd: params.cwd } : {}),
468
+ });
469
+ }
470
+ if (params.provider !== undefined || params.cwd !== undefined) {
471
+ throw new Error("provider and cwd can only be used with target new-agent");
472
+ }
473
+ if (target === "self") {
474
+ if (!callerAgentId) {
475
+ throw new Error('target "self" requires an agent-scoped session');
476
+ }
477
+ resolveCallerAgent();
478
+ return { type: "agent", agentId: callerAgentId };
479
+ }
480
+ await assertScheduleTargetAgentExists(target);
481
+ return { type: "agent", agentId: target };
482
+ };
483
+ // Recurring creates go through createOrReplace so an agent re-registering the
484
+ // same standing schedule refreshes it instead of minting a twin. A one-off must
485
+ // NOT: createOrReplace carries the existing schedule's `runs` forward, and
486
+ // shouldCompleteSchedule counts them against the incoming maxRuns before tick
487
+ // looks at nextRunAt, so replacing a schedule that has already run with
488
+ // maxRuns 1 completes it on the next tick without ever firing. There is also
489
+ // nothing to make idempotent about a one-off: two calls mean two reminders.
490
+ // Covered by schedule/service.test.ts "replacing a schedule that has run with
491
+ // maxRuns 1 buries it without firing".
492
+ const persistNewSchedule = async (input, oneOff) => {
493
+ if (!scheduleService) {
494
+ throw new Error("Schedule service is not configured");
495
+ }
496
+ return oneOff ? scheduleService.create(input) : scheduleService.createOrReplace(input);
497
+ };
498
+ const ProviderModelInputSchema = AgentProviderEnum.trim()
499
+ .refine((value) => value.includes("/"), {
500
+ message: "provider must be provider/model, for example codex/gpt-5.4",
501
+ })
502
+ .refine((value) => {
503
+ try {
504
+ resolveRequiredProviderModel(value);
505
+ return true;
506
+ }
507
+ catch {
508
+ return false;
509
+ }
510
+ }, { message: "provider must be provider/model, for example codex/gpt-5.4" });
511
+ const ProviderOrProviderModelInputSchema = AgentProviderEnum.trim()
512
+ .min(1, "provider is required")
513
+ .refine((value) => {
514
+ if (!value.includes("/")) {
515
+ return true;
516
+ }
517
+ try {
518
+ resolveRequiredProviderModel(value);
519
+ return true;
520
+ }
521
+ catch {
522
+ return false;
523
+ }
524
+ }, { message: "provider must be provider or provider/model, for example codex/gpt-5.4" });
525
+ const CreateAgentSettingsInputSchema = z
526
+ .object({
527
+ modeId: z.string().optional().describe("Session mode to configure before the first run."),
528
+ thinkingOptionId: z.string().optional().describe("Thinking option ID."),
529
+ features: z
530
+ .record(z.string(), z.unknown())
531
+ .optional()
532
+ .describe("Provider-specific feature values, for example { fast_mode: true } for Codex."),
533
+ // OPTIONAL at the API level on purpose. A system prompt is one half of what
534
+ // makes a session a durable AGENT (the other is an active schedule targeting
535
+ // it), and that requirement is enforced by the classifier, not here: making
536
+ // it required would break every existing ad-hoc create for a rule that is
537
+ // about listing, not about creation.
538
+ systemPrompt: z
539
+ .string()
540
+ .optional()
541
+ .describe("Persistent system prompt for the agent, stored on its config. Required for the agent to appear on the Agents page (together with a schedule targeting it); optional here."),
542
+ // Durable identity, beside systemPrompt: what the agent is for, and the
543
+ // job it is hired for. Deliberately NOT the per-session `digest.goal`,
544
+ // which the agent self-reports and mergeDigest overwrites. Neither is part
545
+ // of the durable-agent classifier: that stays systemPrompt + routine,
546
+ // because a goal does not make something an agent.
547
+ goal: z
548
+ .string()
549
+ .optional()
550
+ .describe("The agent's standing objective, one line: why this agent exists. Durable config, stored on the agent. Not the same as the per-session digest goal, which is self-reported per run and overwritten on every patch."),
551
+ jobToBeDone: z
552
+ .string()
553
+ .optional()
554
+ .describe("The job this agent is hired for, in JTBD framing. Kept separate from goal: goal is the outcome, this is the hiring rationale."),
555
+ })
556
+ .strict();
557
+ const UpdateAgentSettingsInputSchema = z
558
+ .object({
559
+ modeId: z.string().optional().describe("Session mode ID."),
560
+ model: z.string().nullable().optional().describe("Model ID. Pass null to clear."),
561
+ thinkingOptionId: z
562
+ .string()
563
+ .nullable()
564
+ .optional()
565
+ .describe("Thinking option ID. Pass null to clear."),
566
+ features: z
567
+ .record(z.string(), z.unknown())
568
+ .optional()
569
+ .describe("Provider-specific feature values, for example { fast_mode: true } for Codex."),
570
+ // The repair path for a locked-out agent. Without it, an agent created
571
+ // with an allowlist that matches nothing could not run a single tool and
572
+ // could not be edited out of that state, so archive-and-recreate was the
573
+ // only cure. `null` and `[]` both clear it, because paseo spells "every
574
+ // tool" as NO allowlist; a bare "*" normalises to the same thing.
575
+ allowedTools: z
576
+ .array(z.string())
577
+ .nullable()
578
+ .optional()
579
+ .describe('Per-run tool allowlist in Claude Code permission-rule syntax ("Bash", "Bash(git:*)", "Read", "mcp__server__tool"). A tool outside the list cannot run. Pass null or [] to clear it, which allows EVERY tool; a bare "*" entry means the same. claude provider only.'),
580
+ // Settable after creation too: an agent's job is often only articulated
581
+ // once it has run a few times, and having to archive and recreate it to
582
+ // write that down would defeat the point of a durable field.
583
+ goal: z
584
+ .string()
585
+ .optional()
586
+ .describe("The agent's standing objective, one line: why this agent exists. Durable config, stored on the agent. Not the same as the per-session digest goal, which is self-reported per run and overwritten on every patch."),
587
+ jobToBeDone: z
588
+ .string()
589
+ .optional()
590
+ .describe("The job this agent is hired for, in JTBD framing. Kept separate from goal: goal is the outcome, this is the hiring rationale."),
591
+ })
592
+ .strict();
593
+ const InspectProviderSettingsInputSchema = z
594
+ .object({
595
+ modeId: z.string().optional().describe("Draft session mode ID."),
596
+ model: z.string().optional().describe("Draft model ID."),
597
+ thinkingOptionId: z.string().optional().describe("Draft thinking option ID."),
598
+ features: z
599
+ .record(z.string(), z.unknown())
600
+ .optional()
601
+ .describe("Draft provider feature values."),
602
+ })
603
+ .strict();
604
+ const AgentRelationshipInputSchema = z.discriminatedUnion("kind", [
605
+ z
606
+ .object({ kind: z.literal("subagent") })
607
+ .strict()
608
+ .describe("Create a child agent under this agent's subagent track."),
609
+ z
610
+ .object({ kind: z.literal("detached") })
611
+ .strict()
612
+ .describe("Create a root agent that does not appear in this agent's subagent track."),
613
+ ]);
614
+ const AgentCreateWorktreeTargetInputSchema = z.discriminatedUnion("kind", [
615
+ z
616
+ .object({
617
+ kind: z.literal("branch-off"),
618
+ worktreeSlug: z
619
+ .string()
620
+ .min(1)
621
+ .optional()
622
+ .describe("Optional worktree slug/path label. Omit to let Paseo generate one."),
623
+ branchName: z
624
+ .string()
625
+ .min(1)
626
+ .optional()
627
+ .describe("Optional git branch name. Defaults to the worktree slug."),
628
+ baseBranch: z
629
+ .string()
630
+ .min(1)
631
+ .optional()
632
+ .describe("Optional base branch. Defaults to the repository default branch."),
633
+ })
634
+ .strict()
635
+ .describe("Create a new branch in a new Paseo worktree."),
636
+ z
637
+ .object({
638
+ kind: z.literal("checkout-branch"),
639
+ branch: z.string().min(1).describe("Existing branch to check out."),
640
+ })
641
+ .strict()
642
+ .describe("Check out an existing branch in a new Paseo worktree."),
643
+ z
644
+ .object({
645
+ kind: z.literal("checkout-pr"),
646
+ githubPrNumber: z.number().int().positive().describe("GitHub pull request number."),
647
+ })
648
+ .strict()
649
+ .describe("Check out a GitHub pull request in a new Paseo worktree."),
650
+ ]);
651
+ const AgentWorkspaceInputSchema = z.discriminatedUnion("kind", [
652
+ z
653
+ .object({
654
+ kind: z.literal("current"),
655
+ cwd: z.string().optional().describe("Optional runtime cwd. Defaults to the caller's cwd."),
656
+ })
657
+ .strict()
658
+ .describe("Use the caller's current workspace."),
659
+ z
660
+ .object({
661
+ kind: z.literal("existing"),
662
+ workspaceId: z.string().min(1).describe("Existing workspace id to attach the agent to."),
663
+ cwd: z
664
+ .string()
665
+ .optional()
666
+ .describe("Optional runtime cwd. Defaults to the existing workspace cwd."),
667
+ })
668
+ .strict()
669
+ .describe("Attach the agent to an existing workspace."),
670
+ z
671
+ .object({
672
+ kind: z.literal("create"),
673
+ source: z.discriminatedUnion("kind", [
674
+ z
675
+ .object({
676
+ kind: z.literal("directory"),
677
+ path: z
678
+ .string()
679
+ .optional()
680
+ .describe("Optional directory path. Defaults to the caller's cwd."),
681
+ })
682
+ .strict(),
683
+ z
684
+ .object({
685
+ kind: z.literal("worktree"),
686
+ cwd: z
687
+ .string()
688
+ .optional()
689
+ .describe("Optional source repository. Defaults to the caller's cwd."),
690
+ target: AgentCreateWorktreeTargetInputSchema,
691
+ })
692
+ .strict(),
693
+ ]),
694
+ })
695
+ .strict()
696
+ .describe("Create a new workspace for the agent."),
697
+ ]);
698
+ // A routine plus settings.systemPrompt is what makes an agent DURABLE rather
699
+ // than a one-off session. Supplying it here instead of calling create_schedule
700
+ // afterwards is not just fewer calls: between the two calls the agent has a
701
+ // persona and no schedule, which is precisely the shape of a plain session, so
702
+ // it is misclassified for as long as the gap lasts.
703
+ const CreateAgentRoutineInputSchema = AgentRoutineSchema.strict().describe("Standing routine for the agent, created in the same call. Requires settings.systemPrompt. Exactly one of at, every or cron.");
704
+ const commonCreateAgentInputSchema = {
705
+ relationship: AgentRelationshipInputSchema.describe("Whether the created agent is a subagent under you or a detached root agent."),
706
+ workspace: AgentWorkspaceInputSchema.describe("Workspace ownership/location for the created agent."),
707
+ title: z
708
+ .string()
709
+ .trim()
710
+ .min(1, "Title is required")
711
+ .max(60, "Title must be 60 characters or fewer")
712
+ .describe("Short descriptive title (<= 60 chars) summarizing the agent's focus."),
713
+ provider: ProviderModelInputSchema.describe("Required provider/model pair, for example codex/gpt-5.4."),
714
+ labels: z.record(z.string(), z.string()).optional().describe("Labels to set on the agent"),
715
+ settings: CreateAgentSettingsInputSchema.optional().describe("Initial runtime settings for the new agent."),
716
+ initialPrompt: z
717
+ .string()
718
+ .trim()
719
+ .min(1, "initialPrompt is required")
720
+ .describe("Required first task to run immediately after creation."),
721
+ routine: CreateAgentRoutineInputSchema.optional(),
722
+ };
723
+ const agentToAgentInputSchema = {
724
+ ...commonCreateAgentInputSchema,
725
+ notifyOnFinish: z
726
+ .boolean()
727
+ .optional()
728
+ .default(true)
729
+ .describe("Get notified when the created agent finishes, errors, or needs permission. Set false only for truly fire-and-forget agents."),
730
+ };
731
+ const canonicalTopLevelInputSchema = {
732
+ ...commonCreateAgentInputSchema,
733
+ background: z
734
+ .boolean()
735
+ .optional()
736
+ .default(false)
737
+ .describe("Run agent in background. If false (default), waits for completion or permission request. If true, returns immediately."),
738
+ notifyOnFinish: z
739
+ .boolean()
740
+ .optional()
741
+ .default(false)
742
+ .describe("Agent-scoped only: get notified when the created agent finishes, errors, or needs permission."),
743
+ };
744
+ const legacyTopLevelCreateAgentInputSchema = {
745
+ relationship: commonCreateAgentInputSchema.relationship.optional(),
746
+ workspace: commonCreateAgentInputSchema.workspace.optional(),
747
+ cwd: z
748
+ .string()
749
+ .optional()
750
+ .describe("Legacy top-level working directory. Prefer workspace.source.path."),
751
+ mode: z.string().optional().describe("Legacy session mode ID. Prefer settings.modeId."),
752
+ thinking: z
753
+ .string()
754
+ .optional()
755
+ .describe("Legacy thinking option ID. Prefer settings.thinkingOptionId."),
756
+ features: z
757
+ .record(z.string(), z.unknown())
758
+ .optional()
759
+ .describe("Legacy feature values. Prefer settings.features."),
760
+ worktreeName: z
761
+ .string()
762
+ .min(1)
763
+ .optional()
764
+ .describe("Legacy worktree slug. Prefer workspace.source.target.worktreeSlug."),
765
+ branchName: z
766
+ .string()
767
+ .min(1)
768
+ .optional()
769
+ .describe("Legacy branch name. Prefer workspace.source.target.branchName."),
770
+ baseBranch: z
771
+ .string()
772
+ .min(1)
773
+ .optional()
774
+ .describe("Legacy base branch. Prefer workspace.source.target.baseBranch."),
775
+ refName: z
776
+ .string()
777
+ .min(1)
778
+ .optional()
779
+ .describe("Legacy branch/ref to check out. Prefer workspace.source.target.branch."),
780
+ githubPrNumber: z
781
+ .number()
782
+ .int()
783
+ .positive()
784
+ .optional()
785
+ .describe("Legacy GitHub PR number. Prefer workspace.source.target.githubPrNumber."),
786
+ };
787
+ const topLevelInputSchema = {
788
+ ...canonicalTopLevelInputSchema,
789
+ ...legacyTopLevelCreateAgentInputSchema,
790
+ };
791
+ const createAgentInputSchema = callerAgentId ? agentToAgentInputSchema : topLevelInputSchema;
792
+ const agentToAgentCreateAgentArgsSchema = z.object(agentToAgentInputSchema).strict();
793
+ const canonicalTopLevelCreateAgentArgsSchema = z.object(canonicalTopLevelInputSchema).strict();
794
+ const topLevelCreateAgentArgsSchema = z.object(topLevelInputSchema).strict();
795
+ const commonSendAgentPromptInputSchema = {
796
+ agentId: z.string(),
797
+ prompt: z.string(),
798
+ sessionMode: z.string().optional().describe("Optional mode to set before running the prompt."),
799
+ };
800
+ const agentToAgentSendAgentPromptInputSchema = {
801
+ ...commonSendAgentPromptInputSchema,
802
+ background: z
803
+ .boolean()
804
+ .optional()
805
+ .default(true)
806
+ .describe("Run agent in background. Agent-scoped default is true so you can continue until the finish notification arrives. Set false only when you need a blocking response."),
807
+ notifyOnFinish: z
808
+ .boolean()
809
+ .optional()
810
+ .default(true)
811
+ .describe("Get notified when the prompted agent finishes, errors, or needs permission. Set false only for truly fire-and-forget prompts."),
812
+ };
813
+ const topLevelSendAgentPromptInputSchema = {
814
+ ...commonSendAgentPromptInputSchema,
815
+ background: z
816
+ .boolean()
817
+ .optional()
818
+ .default(false)
819
+ .describe("Run agent in background. If false (default), waits for completion or permission request. If true, returns immediately."),
820
+ notifyOnFinish: z
821
+ .boolean()
822
+ .optional()
823
+ .default(false)
824
+ .describe("Agent-scoped only: get notified when the prompted agent finishes, errors, or needs permission."),
825
+ };
826
+ const sendAgentPromptInputSchema = callerAgentId
827
+ ? agentToAgentSendAgentPromptInputSchema
828
+ : topLevelSendAgentPromptInputSchema;
829
+ const inspectProviderInputSchema = {
830
+ provider: ProviderOrProviderModelInputSchema.describe("Provider ID, optionally with a model ID (for example codex or codex/gpt-5.4)."),
831
+ cwd: z
832
+ .string()
833
+ .optional()
834
+ .describe("Working directory used to resolve provider feature availability."),
835
+ settings: InspectProviderSettingsInputSchema.optional().describe("Draft provider settings used to compute available features."),
836
+ };
837
+ if (options.voiceOnly || options.enableVoiceTools || callerContext?.enableVoiceTools) {
838
+ registerTool("speak", {
839
+ title: "Speak",
840
+ description: "Speak text to the user via daemon-managed voice output. Blocks until playback completes.",
841
+ inputSchema: {
842
+ text: z
843
+ .string()
844
+ .trim()
845
+ .min(1, "text is required")
846
+ .max(4000, "text must be 4000 characters or fewer"),
847
+ },
848
+ outputSchema: {
849
+ ok: z.boolean(),
850
+ },
851
+ }, async (args, context) => {
852
+ if (!callerAgentId) {
853
+ throw new Error("speak is only available to agent-scoped tool sessions");
854
+ }
855
+ const handler = resolveSpeakHandler?.(callerAgentId) ?? null;
856
+ if (!handler) {
857
+ throw new Error(`No speak handler registered for your session '${callerAgentId}'`);
858
+ }
859
+ await handler({
860
+ text: args.text,
861
+ callerAgentId,
862
+ signal: context?.signal,
863
+ });
864
+ return {
865
+ content: [],
866
+ structuredContent: ensureValidJson({ ok: true }),
867
+ };
868
+ });
869
+ }
870
+ // The judge's one mutating capability. Registered through `tools.set` rather
871
+ // than `registerTool` on purpose: `registerTool` applies the read-only
872
+ // allowlist, and this tool must be available to a read-only agent precisely
873
+ // BECAUSE its own gate is stricter than the allowlist. Keeping it out of
874
+ // READ_ONLY_PASEO_TOOLS also keeps that list honestly "reads only".
875
+ if (options.judgeRelayGate) {
876
+ const gate = options.judgeRelayGate;
877
+ tools.set("relay_to_agent", {
878
+ name: "relay_to_agent",
879
+ title: "Relay the user's decision to an agent",
880
+ description: "Pass the user's instruction to an agent you were briefed about. Only usable when the user has just told you something in this conversation; it is refused while you are processing an event. You do not act yourself, the target agent acts with its own context and permissions.",
881
+ inputSchema: {
882
+ agentId: z.string().describe("The agent to relay to. Must be one you were briefed about."),
883
+ message: z
884
+ .string()
885
+ .trim()
886
+ .min(1)
887
+ .max(4000)
888
+ .describe("The user's instruction, in your words. Do not invent instructions."),
889
+ },
890
+ outputSchema: { ok: z.boolean(), agentId: z.string() },
891
+ handler: (async (args) => {
892
+ const decision = gate.evaluate(args.agentId);
893
+ if (!decision.allowed) {
894
+ throw new Error(decision.detail ?? "Relay refused");
895
+ }
896
+ const target = await ensureAgentLoaded(args.agentId, {
897
+ agentManager,
898
+ agentStorage,
899
+ logger: options.logger,
900
+ });
901
+ if (agentManager.hasInFlightRun(target.id)) {
902
+ throw new Error(`Agent ${args.agentId} is mid-run; try again once it settles.`);
903
+ }
904
+ await agentManager.runAgent(target.id, args.message);
905
+ return {
906
+ content: [],
907
+ structuredContent: ensureValidJson({ ok: true, agentId: args.agentId }),
908
+ };
909
+ }),
910
+ });
911
+ }
912
+ if (options.voiceOnly) {
913
+ return toCatalog();
914
+ }
915
+ if (options.browserToolsEnabled && options.browserToolsBroker) {
916
+ registerBrowserTools({
917
+ registerTool,
918
+ broker: options.browserToolsBroker,
919
+ callerAgentId,
920
+ resolveCallerAgent,
921
+ });
922
+ }
923
+ registerTool("create_agent", {
924
+ title: "Create agent",
925
+ description: "Create an agent. Requires relationship, workspace, provider/model (for example codex/gpt-5.4), and an initial prompt. Do not guess; call list_providers and list_models first if uncertain.",
926
+ inputSchema: createAgentInputSchema,
927
+ outputSchema: {
928
+ agentId: z.string(),
929
+ type: AgentProviderEnum,
930
+ status: AgentStatusEnum,
931
+ cwd: z.string(),
932
+ workspaceId: z.string().optional(),
933
+ currentModeId: z.string().nullable(),
934
+ availableModes: z.array(ProviderModeSchema),
935
+ lastMessage: z.string().nullable().optional(),
936
+ permission: AgentPermissionRequestPayloadSchema.nullable().optional(),
937
+ guidance: z.string().optional(),
938
+ // Present only when the call carried a routine, i.e. when this agent
939
+ // came out of create_agent already durable rather than as a session.
940
+ scheduleId: z.string().optional(),
941
+ nextRunAt: z.string().nullable().optional(),
942
+ },
943
+ }, async (args) => {
944
+ const resolvedArgs = await resolveCreateAgentToolArgs(args);
945
+ const { parsedArgs, worktree } = resolvedArgs;
946
+ let requestedBackground;
947
+ let notifyOnFinish;
948
+ let detached;
949
+ if (resolvedArgs.kind === "agent-scoped") {
950
+ requestedBackground = true;
951
+ notifyOnFinish = parsedArgs.notifyOnFinish;
952
+ detached = resolvedArgs.relationship.kind === "detached";
953
+ }
954
+ else {
955
+ requestedBackground = resolvedArgs.parsedArgs.background;
956
+ notifyOnFinish = resolvedArgs.parsedArgs.notifyOnFinish ?? false;
957
+ detached = resolvedArgs.parsedArgs.relationship.kind === "detached";
958
+ }
959
+ const { snapshot, background: createdInBackground, initialPromptStarted, routine: attachedRoutine, } = await createAgentCommand({
960
+ agentManager,
961
+ agentStorage,
962
+ logger: childLogger,
963
+ paseoHome: options.paseoHome,
964
+ worktreesRoot: options.worktreesRoot,
965
+ terminalManager,
966
+ providerSnapshotManager,
967
+ createPaseoWorktree: options.createPaseoWorktree,
968
+ // Passed unconditionally: undefined already means "no schedule
969
+ // service", and a conditional spread only costs lint complexity. The
970
+ // ?? normalizes the null this option can carry into that undefined.
971
+ scheduleService: scheduleService ?? undefined,
972
+ ...(options.ensureWorkspaceForCreate
973
+ ? { ensureWorkspaceForCreate: options.ensureWorkspaceForCreate }
974
+ : {}),
975
+ }, {
976
+ kind: "mcp",
977
+ provider: parsedArgs.provider,
978
+ title: parsedArgs.title,
979
+ initialPrompt: parsedArgs.initialPrompt,
980
+ cwd: resolvedArgs.cwd,
981
+ workspaceId: resolvedArgs.workspaceId,
982
+ ...toCreateAgentSettingsInput(parsedArgs.settings),
983
+ labels: parsedArgs.labels,
984
+ // A routine here is what makes the created agent DURABLE instead of a
985
+ // session: createAgentCommand attaches the schedule before the first
986
+ // prompt runs, and rolls the agent back if it cannot.
987
+ routine: parsedArgs.routine,
988
+ background: requestedBackground,
989
+ notifyOnFinish,
990
+ detached,
991
+ callerAgentId,
992
+ callerContext,
993
+ worktree,
994
+ });
995
+ try {
996
+ if (!createdInBackground && initialPromptStarted) {
997
+ const result = await waitForAgentWithTimeout(agentManager, snapshot.id, {
998
+ waitForActive: true,
999
+ });
1000
+ const liveSnapshot = agentManager.getAgent(snapshot.id) ?? snapshot;
1001
+ const responseData = {
1002
+ agentId: snapshot.id,
1003
+ type: snapshot.provider,
1004
+ status: result.status,
1005
+ cwd: liveSnapshot.cwd,
1006
+ ...(liveSnapshot.workspaceId ? { workspaceId: liveSnapshot.workspaceId } : {}),
1007
+ currentModeId: liveSnapshot.currentModeId,
1008
+ availableModes: liveSnapshot.availableModes,
1009
+ lastMessage: result.lastMessage,
1010
+ permission: sanitizePermissionRequest(result.permission),
1011
+ ...describeAttachedRoutine(attachedRoutine),
1012
+ };
1013
+ const validJson = ensureValidJson(responseData);
1014
+ const response = {
1015
+ content: [],
1016
+ structuredContent: validJson,
1017
+ };
1018
+ return response;
1019
+ }
1020
+ }
1021
+ catch (error) {
1022
+ childLogger.error({ err: error, agentId: snapshot.id }, "Failed to run initial prompt");
1023
+ throw error;
1024
+ }
1025
+ // Return immediately for async creation.
1026
+ const currentSnapshot = agentManager.getAgent(snapshot.id) ?? snapshot;
1027
+ const guidance = callerAgentId && notifyOnFinish && initialPromptStarted
1028
+ ? "You will get notified when the created agent finishes, errors, or needs permission. Do not call wait_for_agent or poll for status; continue with other work until the notification arrives."
1029
+ : undefined;
1030
+ const response = {
1031
+ content: [],
1032
+ structuredContent: ensureValidJson({
1033
+ agentId: currentSnapshot.id,
1034
+ type: snapshot.provider,
1035
+ status: currentSnapshot.lifecycle,
1036
+ cwd: currentSnapshot.cwd,
1037
+ ...(currentSnapshot.workspaceId ? { workspaceId: currentSnapshot.workspaceId } : {}),
1038
+ currentModeId: currentSnapshot.currentModeId,
1039
+ availableModes: currentSnapshot.availableModes,
1040
+ lastMessage: null,
1041
+ permission: null,
1042
+ ...describeAttachedRoutine(attachedRoutine),
1043
+ ...(guidance ? { guidance } : {}),
1044
+ }),
1045
+ };
1046
+ return response;
1047
+ });
1048
+ async function resolveCreateAgentToolArgs(args) {
1049
+ if (callerAgentId) {
1050
+ const parsed = agentToAgentCreateAgentArgsSchema.parse(args);
1051
+ const { cwd, workspaceId, worktree } = await resolveCreateAgentWorkspace(parsed.workspace, {
1052
+ prompt: parsed.initialPrompt,
1053
+ });
1054
+ return {
1055
+ kind: "agent-scoped",
1056
+ parsedArgs: parsed,
1057
+ relationship: parsed.relationship,
1058
+ cwd,
1059
+ workspaceId,
1060
+ worktree,
1061
+ };
1062
+ }
1063
+ const parsedArgs = normalizeTopLevelCreateAgentArgs(topLevelCreateAgentArgsSchema.parse(args));
1064
+ if (parsedArgs.relationship.kind === "subagent") {
1065
+ throw new Error("relationship subagent requires an agent-scoped tool session");
1066
+ }
1067
+ const { cwd, workspaceId, worktree } = await resolveCreateAgentWorkspace(parsedArgs.workspace, {
1068
+ prompt: parsedArgs.initialPrompt,
1069
+ });
1070
+ return {
1071
+ kind: "top-level",
1072
+ parsedArgs,
1073
+ cwd,
1074
+ workspaceId,
1075
+ worktree,
1076
+ };
1077
+ }
1078
+ /**
1079
+ * Flatten the `settings` bag onto the named fields `createAgentCommand`
1080
+ * takes.
1081
+ *
1082
+ * Extracted rather than spread inline because every `settings?.x` optional
1083
+ * chain counts toward the create handler's cyclomatic complexity, and adding
1084
+ * `goal` and `jobToBeDone` put it at 22 against a ceiling of 20. Each new
1085
+ * setting belongs here, not in the handler.
1086
+ */
1087
+ function toCreateAgentSettingsInput(settings) {
1088
+ return {
1089
+ thinking: settings?.thinkingOptionId,
1090
+ features: settings?.features,
1091
+ mode: settings?.modeId,
1092
+ systemPrompt: settings?.systemPrompt,
1093
+ goal: settings?.goal,
1094
+ jobToBeDone: settings?.jobToBeDone,
1095
+ };
1096
+ }
1097
+ function normalizeTopLevelCreateAgentArgs(args) {
1098
+ const { cwd, mode, thinking, features, worktreeName, branchName, baseBranch, refName, githubPrNumber, ...canonicalCandidate } = args;
1099
+ const settings = {
1100
+ ...canonicalCandidate.settings,
1101
+ ...(mode ? { modeId: mode } : {}),
1102
+ ...(thinking ? { thinkingOptionId: thinking } : {}),
1103
+ ...(features ? { features } : {}),
1104
+ };
1105
+ if (canonicalCandidate.relationship && canonicalCandidate.workspace) {
1106
+ return canonicalTopLevelCreateAgentArgsSchema.parse({
1107
+ ...canonicalCandidate,
1108
+ ...(Object.keys(settings).length > 0 ? { settings } : {}),
1109
+ });
1110
+ }
1111
+ if (canonicalCandidate.relationship || canonicalCandidate.workspace) {
1112
+ throw new Error("relationship and workspace must be provided together");
1113
+ }
1114
+ if (!cwd?.trim()) {
1115
+ throw new Error("cwd is required for legacy top-level create_agent calls");
1116
+ }
1117
+ const legacyWorktreeTarget = resolveLegacyCreateAgentWorktreeTarget({
1118
+ worktreeName,
1119
+ branchName,
1120
+ baseBranch,
1121
+ refName,
1122
+ githubPrNumber,
1123
+ });
1124
+ const workspace = legacyWorktreeTarget
1125
+ ? {
1126
+ kind: "create",
1127
+ source: {
1128
+ kind: "worktree",
1129
+ cwd,
1130
+ target: legacyWorktreeTarget,
1131
+ },
1132
+ }
1133
+ : {
1134
+ kind: "create",
1135
+ source: {
1136
+ kind: "directory",
1137
+ path: cwd,
1138
+ },
1139
+ };
1140
+ return canonicalTopLevelCreateAgentArgsSchema.parse({
1141
+ ...canonicalCandidate,
1142
+ relationship: { kind: "detached" },
1143
+ workspace,
1144
+ ...(Object.keys(settings).length > 0 ? { settings } : {}),
1145
+ });
1146
+ }
1147
+ function resolveLegacyCreateAgentWorktreeTarget(input) {
1148
+ if (input.githubPrNumber !== undefined) {
1149
+ return {
1150
+ kind: "checkout-pr",
1151
+ githubPrNumber: input.githubPrNumber,
1152
+ };
1153
+ }
1154
+ if (input.refName) {
1155
+ return {
1156
+ kind: "checkout-branch",
1157
+ branch: input.refName,
1158
+ };
1159
+ }
1160
+ if (input.worktreeName || input.branchName || input.baseBranch) {
1161
+ return {
1162
+ kind: "branch-off",
1163
+ worktreeSlug: input.worktreeName,
1164
+ branchName: input.branchName,
1165
+ baseBranch: input.baseBranch,
1166
+ };
1167
+ }
1168
+ return null;
1169
+ }
1170
+ async function resolveCreateAgentWorkspace(workspace, firstAgentContext) {
1171
+ if (workspace.kind === "current") {
1172
+ if (!callerAgentId) {
1173
+ throw new Error("workspace current requires an agent-scoped tool session");
1174
+ }
1175
+ const callerAgent = resolveCallerAgent();
1176
+ if (!callerAgent?.workspaceId) {
1177
+ throw new Error(`Caller agent ${callerAgentId} has no current workspace`);
1178
+ }
1179
+ return {
1180
+ cwd: workspace.cwd,
1181
+ workspaceId: callerAgent.workspaceId,
1182
+ worktree: undefined,
1183
+ };
1184
+ }
1185
+ if (workspace.kind === "existing") {
1186
+ if (!options.listActiveWorkspaces) {
1187
+ throw new Error("Workspace lookup is not configured");
1188
+ }
1189
+ const existingWorkspace = (await options.listActiveWorkspaces()).find((candidate) => candidate.workspaceId === workspace.workspaceId);
1190
+ if (!existingWorkspace) {
1191
+ throw new Error(`Workspace ${workspace.workspaceId} not found`);
1192
+ }
1193
+ const cwd = workspace.cwd
1194
+ ? resolveScopedCwd(workspace.cwd, { required: true })
1195
+ : existingWorkspace.cwd;
1196
+ const lockedCwd = callerContext?.lockedCwd?.trim();
1197
+ if (lockedCwd && !isSameOrDescendantPath(expandUserPath(lockedCwd), cwd)) {
1198
+ throw new Error(`Workspace ${workspace.workspaceId} is outside the allowed cwd`);
1199
+ }
1200
+ return {
1201
+ cwd,
1202
+ workspaceId: workspace.workspaceId,
1203
+ worktree: undefined,
1204
+ };
1205
+ }
1206
+ if (workspace.source.kind === "directory") {
1207
+ const cwd = resolveScopedCwd(workspace.source.path, { required: true });
1208
+ if (!options.ensureWorkspaceForCreate) {
1209
+ throw new Error("Workspace creation is not configured");
1210
+ }
1211
+ return {
1212
+ cwd,
1213
+ workspaceId: await options.ensureWorkspaceForCreate(cwd, firstAgentContext),
1214
+ worktree: undefined,
1215
+ };
1216
+ }
1217
+ const cwd = resolveScopedCwd(workspace.source.cwd, { required: true });
1218
+ return {
1219
+ cwd,
1220
+ workspaceId: undefined,
1221
+ worktree: resolveCreateAgentWorktree(workspace.source.target),
1222
+ };
1223
+ }
1224
+ function resolveCreateAgentWorktree(target) {
1225
+ switch (target.kind) {
1226
+ case "branch-off":
1227
+ return {
1228
+ action: "branch-off",
1229
+ worktreeName: target.worktreeSlug,
1230
+ branchName: target.branchName,
1231
+ baseBranch: target.baseBranch,
1232
+ };
1233
+ case "checkout-branch":
1234
+ return {
1235
+ action: "checkout",
1236
+ refName: target.branch,
1237
+ };
1238
+ case "checkout-pr":
1239
+ return {
1240
+ action: "checkout",
1241
+ githubPrNumber: target.githubPrNumber,
1242
+ };
1243
+ default:
1244
+ throw new Error("unreachable");
1245
+ }
1246
+ }
1247
+ registerTool("wait_for_agent", {
1248
+ title: "Wait for agent",
1249
+ description: "Block until the agent requests permission or the current run completes. Returns the pending permission (if any) and recent activity summary.",
1250
+ inputSchema: {
1251
+ agentId: z.string().describe("Agent identifier returned by the create_agent tool"),
1252
+ },
1253
+ outputSchema: {
1254
+ agentId: z.string(),
1255
+ status: AgentStatusEnum,
1256
+ permission: AgentPermissionRequestPayloadSchema.nullable(),
1257
+ lastMessage: z.string().nullable(),
1258
+ },
1259
+ }, async ({ agentId }, { signal }) => {
1260
+ const abortController = new AbortController();
1261
+ const cleanupFns = [];
1262
+ const cleanup = () => {
1263
+ while (cleanupFns.length) {
1264
+ const fn = cleanupFns.pop();
1265
+ try {
1266
+ fn?.();
1267
+ }
1268
+ catch {
1269
+ // ignore cleanup errors
1270
+ }
1271
+ }
1272
+ };
1273
+ const forwardExternalAbort = () => {
1274
+ if (!abortController.signal.aborted) {
1275
+ const reason = signal?.reason ?? new Error("wait_for_agent aborted");
1276
+ abortController.abort(reason);
1277
+ }
1278
+ };
1279
+ if (signal) {
1280
+ if (signal.aborted) {
1281
+ forwardExternalAbort();
1282
+ }
1283
+ else {
1284
+ signal.addEventListener("abort", forwardExternalAbort, { once: true });
1285
+ cleanupFns.push(() => signal.removeEventListener("abort", forwardExternalAbort));
1286
+ }
1287
+ }
1288
+ const unregister = waitTracker.register(agentId, (reason) => {
1289
+ if (!abortController.signal.aborted) {
1290
+ abortController.abort(new Error(reason ?? "wait_for_agent cancelled"));
1291
+ }
1292
+ });
1293
+ cleanupFns.push(unregister);
1294
+ try {
1295
+ const result = await waitForAgentWithTimeout(agentManager, agentId, {
1296
+ signal: abortController.signal,
1297
+ });
1298
+ const validJson = ensureValidJson({
1299
+ agentId,
1300
+ status: result.status,
1301
+ permission: sanitizePermissionRequest(result.permission),
1302
+ lastMessage: result.lastMessage,
1303
+ });
1304
+ const response = {
1305
+ content: [],
1306
+ structuredContent: validJson,
1307
+ };
1308
+ return response;
1309
+ }
1310
+ finally {
1311
+ cleanup();
1312
+ }
1313
+ });
1314
+ registerTool("send_agent_prompt", {
1315
+ title: "Send agent prompt",
1316
+ description: "Send a task to a running agent. Agent-scoped callers run in background by default; top-level callers wait by default.",
1317
+ inputSchema: sendAgentPromptInputSchema,
1318
+ outputSchema: {
1319
+ success: z.boolean(),
1320
+ status: AgentStatusEnum,
1321
+ lastMessage: z.string().nullable().optional(),
1322
+ permission: AgentPermissionRequestPayloadSchema.nullable().optional(),
1323
+ guidance: z.string().optional(),
1324
+ },
1325
+ }, async ({ agentId, prompt, sessionMode, background = Boolean(callerAgentId), notifyOnFinish = Boolean(callerAgentId), }) => {
1326
+ if (agentManager.hasInFlightRun(agentId)) {
1327
+ waitTracker.cancel(agentId, "Agent run interrupted by new prompt");
1328
+ }
1329
+ const shouldNotifyOnFinish = Boolean(callerAgentId && notifyOnFinish && background);
1330
+ await sendPromptToAgent({
1331
+ agentManager,
1332
+ agentStorage,
1333
+ agentId,
1334
+ prompt,
1335
+ sessionMode,
1336
+ logger: childLogger,
1337
+ });
1338
+ if (shouldNotifyOnFinish && callerAgentId) {
1339
+ setupFinishNotification({
1340
+ agentManager,
1341
+ agentStorage,
1342
+ childAgentId: agentId,
1343
+ callerAgentId,
1344
+ logger: childLogger,
1345
+ });
1346
+ }
1347
+ // If not running in background, wait for completion
1348
+ if (!background) {
1349
+ const result = await waitForAgentWithTimeout(agentManager, agentId, {
1350
+ waitForActive: true,
1351
+ });
1352
+ const responseData = {
1353
+ success: true,
1354
+ status: result.status,
1355
+ lastMessage: result.lastMessage,
1356
+ permission: sanitizePermissionRequest(result.permission),
1357
+ };
1358
+ const validJson = ensureValidJson(responseData);
1359
+ const response = {
1360
+ content: [],
1361
+ structuredContent: validJson,
1362
+ };
1363
+ return response;
1364
+ }
1365
+ // Return immediately if background=true
1366
+ // Re-fetch snapshot since the state may have changed
1367
+ const currentSnapshot = agentManager.getAgent(agentId);
1368
+ const responseData = {
1369
+ success: true,
1370
+ status: currentSnapshot?.lifecycle ?? "idle",
1371
+ lastMessage: null,
1372
+ permission: null,
1373
+ ...(shouldNotifyOnFinish
1374
+ ? {
1375
+ guidance: "You will get notified when the prompted agent finishes, errors, or needs permission. Do not call wait_for_agent or poll for status; continue with other work until the notification arrives.",
1376
+ }
1377
+ : {}),
1378
+ };
1379
+ const validJson = ensureValidJson(responseData);
1380
+ const response = {
1381
+ content: [],
1382
+ structuredContent: validJson,
1383
+ };
1384
+ return response;
1385
+ });
1386
+ registerTool("get_agent_status", {
1387
+ title: "Get agent status",
1388
+ description: "Return the latest snapshot for an agent, including lifecycle state, capabilities, and pending permissions.",
1389
+ inputSchema: {
1390
+ agentId: z.string(),
1391
+ },
1392
+ outputSchema: {
1393
+ status: AgentStatusEnum,
1394
+ snapshot: AgentSnapshotPayloadSchema,
1395
+ },
1396
+ }, async ({ agentId }) => {
1397
+ const snapshot = agentManager.getAgent(agentId);
1398
+ if (snapshot) {
1399
+ const structuredSnapshot = await serializeSnapshotWithMetadata(agentStorage, snapshot, childLogger);
1400
+ return {
1401
+ content: [],
1402
+ structuredContent: ensureValidJson({
1403
+ status: snapshot.lifecycle,
1404
+ snapshot: structuredSnapshot,
1405
+ }),
1406
+ };
1407
+ }
1408
+ const record = await agentStorage.get(agentId);
1409
+ if (!record || record.internal) {
1410
+ throw new Error(`Agent ${agentId} not found`);
1411
+ }
1412
+ const structuredSnapshot = buildStoredAgentPayload(record, new Set(providerSnapshotManager.listRegisteredProviderIds()));
1413
+ return {
1414
+ content: [],
1415
+ structuredContent: ensureValidJson({
1416
+ status: structuredSnapshot.status,
1417
+ snapshot: structuredSnapshot,
1418
+ }),
1419
+ };
1420
+ });
1421
+ registerTool("list_agents", {
1422
+ title: "List agents",
1423
+ description: "List agents with the same filters the paseo UI offers. `state` is the DERIVED bucket " +
1424
+ "the app groups by (running / pending / needs_input / attention / failed / done); " +
1425
+ "`statuses` is the raw lifecycle and they are different questions. Open dimensions " +
1426
+ "(tag, kanban, provider) also take a `not*` half because their complement cannot be " +
1427
+ "enumerated; closed ones (state, origin) do not need one. The response carries `facets` " +
1428
+ "listing every tag / kanban bucket / provider present, so you can name a value without " +
1429
+ "guessing, plus `total` and `hasMore` for paging with `offset`.",
1430
+ inputSchema: {
1431
+ cwd: z
1432
+ .string()
1433
+ .optional()
1434
+ .describe("Restrict to this directory and its descendants. Defaults to the caller's cwd."),
1435
+ archived: z
1436
+ .enum(["all", "only", "hide"])
1437
+ .optional()
1438
+ .describe("How to treat archived agents. Defaults to `hide`. `only` shows archived exclusively, " +
1439
+ "which the legacy `includeArchived` boolean cannot express."),
1440
+ includeArchived: z
1441
+ .boolean()
1442
+ .optional()
1443
+ .describe('LEGACY. `true` means `archived: "all"`. Prefer `archived`.'),
1444
+ statuses: z
1445
+ .array(AgentStatusEnum)
1446
+ .optional()
1447
+ .describe("Raw LIFECYCLE status (initializing / idle / running / error / closed). Not the same " +
1448
+ "as `state`: an `idle` agent may be pending, attention, needs_input or done."),
1449
+ state: z
1450
+ .array(WorkspaceStateBucketSchema)
1451
+ .optional()
1452
+ .describe("Derived state buckets to keep. Closed six-value set, so `except X` is expressible " +
1453
+ "by listing the other five and no exclude half is offered."),
1454
+ origin: z
1455
+ .array(z.enum(["root", "delegated"]))
1456
+ .optional()
1457
+ .describe("`root` = human-started, `delegated` = spawned by another agent."),
1458
+ tags: z.array(z.string()).optional().describe("Keep agents carrying ANY of these tags."),
1459
+ notTags: z.array(z.string()).optional().describe("Drop agents carrying ANY of these tags."),
1460
+ kanban: z
1461
+ .array(z.string())
1462
+ .optional()
1463
+ .describe("Keep agents in any of these kanban buckets."),
1464
+ notKanban: z.array(z.string()).optional().describe("Drop agents in any of these buckets."),
1465
+ providers: z
1466
+ .array(z.string())
1467
+ .optional()
1468
+ .describe("Keep agents on any of these providers."),
1469
+ notProviders: z
1470
+ .array(z.string())
1471
+ .optional()
1472
+ .describe("Drop agents on any of these providers."),
1473
+ timeField: z
1474
+ .enum(["created", "active", "archived"])
1475
+ .optional()
1476
+ .describe("Which timestamp the date filter measures. A MODE, not a second dimension: " +
1477
+ "`created` uses createdAt, `active` (default) uses last activity, `archived` " +
1478
+ "uses archivedAt so `window`/`from`/`to` answer 'what was archived in this " +
1479
+ "period'. Picking `archived` implies archived agents are in scope and lifts " +
1480
+ "the `sinceHours` recency cut for them, since the archive date is doing the " +
1481
+ "bounding; agents that were never archived have no archive date and so match " +
1482
+ "no window."),
1483
+ window: z
1484
+ .enum(["today", "3d", "7d", "30d", "stale"])
1485
+ .optional()
1486
+ .describe("Rolling window over `timeField`. Single-valued because the windows nest; `stale` is " +
1487
+ "the strict complement of `30d`. Mutually exclusive with `from`/`to`."),
1488
+ from: z
1489
+ .string()
1490
+ .optional()
1491
+ .describe("Exact range start, local calendar day `YYYY-MM-DD`. Requires `to`."),
1492
+ to: z
1493
+ .string()
1494
+ .optional()
1495
+ .describe("Exact range end, inclusive, local calendar day `YYYY-MM-DD`. Requires `from`."),
1496
+ text: z.string().optional().describe("Case-insensitive substring over title and cwd."),
1497
+ sinceHours: z
1498
+ .number()
1499
+ .int()
1500
+ .positive()
1501
+ .max(24 * 30)
1502
+ .optional()
1503
+ .describe("LEGACY recency cutoff. It only ever applied to ARCHIVED agents and still does; it " +
1504
+ "never filtered live ones. Use `window` / `from`+`to` for a real date filter."),
1505
+ limit: z.number().int().positive().max(200).optional().default(50),
1506
+ offset: z
1507
+ .number()
1508
+ .int()
1509
+ .nonnegative()
1510
+ .optional()
1511
+ .describe("Rows to skip, for reaching past `limit`. Ordering is by activity, so a concurrently " +
1512
+ "updated agent can shift between pages; `total` tells you when you are done."),
1513
+ },
1514
+ outputSchema: {
1515
+ agents: z.array(AgentListItemPayloadSchema),
1516
+ total: z.number().int().nonnegative(),
1517
+ hasMore: z.boolean(),
1518
+ facets: z.object({
1519
+ tags: z.array(z.string()),
1520
+ kanban: z.array(z.string()),
1521
+ providers: z.array(z.string()),
1522
+ }),
1523
+ },
1524
+ }, async ({ cwd, archived, includeArchived, statuses, state, origin, tags, notTags, kanban, notKanban, providers, notProviders, timeField, window: timeWindow, from, to, text, sinceHours = 48, limit = 50, offset = 0, }) => {
1525
+ const archivedMode = resolveArchivedMode(archived, includeArchived);
1526
+ const timeSelection = resolveTimeSelection(timeWindow, from, to);
1527
+ const resolvedTimeField = timeField ?? "active";
1528
+ const callerCwd = callerAgentId ? resolveCallerAgent()?.cwd : undefined;
1529
+ const requestedCwd = cwd?.trim() ? expandUserPath(cwd) : callerCwd;
1530
+ const statusFilter = statuses && statuses.length > 0 ? new Set(statuses) : null;
1531
+ const sinceMs = Date.now() - sinceHours * 60 * 60 * 1000;
1532
+ // Asking to measure BY the archive date puts archived agents in scope by
1533
+ // definition, so the default `hide` must not silently empty the result.
1534
+ // The reader still controls which rows via `archived`; this only stops the
1535
+ // default from contradicting the field they explicitly chose.
1536
+ const wantsArchived = archivedMode !== "hide" || resolvedTimeField === "archived";
1537
+ const liveSnapshots = agentManager.listAgents();
1538
+ const liveAgents = await Promise.all(liveSnapshots.map((snapshot) => serializeSnapshotWithMetadata(agentStorage, snapshot, childLogger)));
1539
+ const liveIds = new Set(liveSnapshots.map((snapshot) => snapshot.id));
1540
+ const storedRecords = await agentStorage.list();
1541
+ const registeredProviderIds = new Set(providerSnapshotManager.listRegisteredProviderIds());
1542
+ const storedAgents = storedRecords
1543
+ .filter((record) => !record.internal && !liveIds.has(record.id))
1544
+ .filter((record) => wantsArchived || !record.archivedAt)
1545
+ .filter((record) => wantsArchived || isStoredAgentProviderAvailable(record, registeredProviderIds))
1546
+ .map((record) => buildStoredAgentPayload(record, registeredProviderIds));
1547
+ // The child-count rollup has to see the WHOLE corpus before any narrowing,
1548
+ // or a parent whose only live child sits outside the cwd/status filter
1549
+ // loses its `pending` bucket and reads as done.
1550
+ const corpus = withActiveChildCounts([...liveAgents, ...storedAgents].map(toAgentListItemPayload))
1551
+ .filter((agent) => !requestedCwd || isSameOrDescendantPath(requestedCwd, agent.cwd))
1552
+ .filter((agent) => !statusFilter || statusFilter.has(agent.status))
1553
+ // `sinceHours` is a recency cut on ACTIVITY, and it prunes archived
1554
+ // agents. Under `timeField: "archived"` that silently truncates the very
1555
+ // span being asked for: an agent archived 10 days ago has no activity
1556
+ // inside a 48h window, so "what did I archive last month" would return
1557
+ // nothing while looking like an honest empty. The archive date is the
1558
+ // bound in that mode, so this cut steps aside for archived rows.
1559
+ .filter((agent) => !agent.archivedAt ||
1560
+ resolvedTimeField === "archived" ||
1561
+ resolveAgentListActivityTime(agent) >= sinceMs);
1562
+ const criteria = {
1563
+ ...emptyAgentFilterCriteria(),
1564
+ stateSelection: filterSelectionFrom(state, undefined),
1565
+ originSelection: filterSelectionFrom(origin, undefined),
1566
+ tagSelection: filterSelectionFrom(tags, notTags),
1567
+ kanbanSelection: filterSelectionFrom(kanban, notKanban),
1568
+ providerSelection: filterSelectionFrom(providers, notProviders),
1569
+ archivedMode,
1570
+ timeSelection,
1571
+ textQuery: (text ?? "").trim().toLowerCase(),
1572
+ };
1573
+ // One clock read for the whole request, so the facets and the page can
1574
+ // never disagree about which side of a window boundary a row falls on.
1575
+ const now = new Date();
1576
+ const matched = filterAgentList(corpus, criteria, resolvedTimeField, now).sort(compareAgentListItems);
1577
+ const agents = matched.slice(offset, offset + limit);
1578
+ return {
1579
+ content: [],
1580
+ structuredContent: ensureValidJson({
1581
+ agents,
1582
+ total: matched.length,
1583
+ hasMore: offset + agents.length < matched.length,
1584
+ facets: collectAgentListFacets(corpus),
1585
+ }),
1586
+ };
1587
+ });
1588
+ registerTool("cancel_agent", {
1589
+ title: "Cancel agent run",
1590
+ description: "Abort the agent's current run but keep the agent alive for future tasks.",
1591
+ inputSchema: {
1592
+ agentId: z.string(),
1593
+ },
1594
+ outputSchema: {
1595
+ success: z.boolean(),
1596
+ },
1597
+ }, async ({ agentId }) => {
1598
+ const { cancelled } = await cancelAgentRunCommand({ agentManager, logger: childLogger }, agentId);
1599
+ if (cancelled) {
1600
+ waitTracker.cancel(agentId, "Agent run cancelled");
1601
+ }
1602
+ return {
1603
+ content: [],
1604
+ structuredContent: ensureValidJson({ success: cancelled }),
1605
+ };
1606
+ });
1607
+ registerTool("archive_agent", {
1608
+ title: "Archive agent",
1609
+ description: "Archive an agent (soft-delete). The agent is interrupted if running and removed from the active list.",
1610
+ inputSchema: {
1611
+ agentId: z.string(),
1612
+ },
1613
+ outputSchema: {
1614
+ success: z.boolean(),
1615
+ },
1616
+ }, async ({ agentId }) => {
1617
+ await archiveAgentCommand({
1618
+ agentManager,
1619
+ agentStorage,
1620
+ logger: childLogger,
1621
+ }, agentId);
1622
+ waitTracker.cancel(agentId, "Agent archived");
1623
+ return {
1624
+ content: [],
1625
+ structuredContent: ensureValidJson({ success: true }),
1626
+ };
1627
+ });
1628
+ registerTool("kill_agent", {
1629
+ title: "Kill agent",
1630
+ description: "Terminate an agent session permanently.",
1631
+ inputSchema: {
1632
+ agentId: z.string(),
1633
+ },
1634
+ outputSchema: {
1635
+ success: z.boolean(),
1636
+ },
1637
+ }, async ({ agentId }) => {
1638
+ await closeAgentCommand({ agentManager }, agentId);
1639
+ waitTracker.cancel(agentId, "Agent terminated");
1640
+ return {
1641
+ content: [],
1642
+ structuredContent: ensureValidJson({ success: true }),
1643
+ };
1644
+ });
1645
+ registerTool("update_agent", {
1646
+ title: "Update agent",
1647
+ description: "Update an agent name, labels, and/or runtime settings.",
1648
+ inputSchema: {
1649
+ agentId: z.string(),
1650
+ name: z.string().optional(),
1651
+ labels: z.record(z.string(), z.string()).optional().describe("Labels to set on the agent"),
1652
+ settings: UpdateAgentSettingsInputSchema.optional().describe("Runtime settings to apply to the agent."),
1653
+ },
1654
+ outputSchema: {
1655
+ success: z.boolean(),
1656
+ },
1657
+ }, async ({ agentId, name, labels, settings }) => {
1658
+ if (settings?.modeId !== undefined) {
1659
+ await agentManager.setAgentMode(agentId, settings.modeId);
1660
+ }
1661
+ if (settings?.model !== undefined) {
1662
+ await agentManager.setAgentModel(agentId, settings.model);
1663
+ }
1664
+ if (settings?.thinkingOptionId !== undefined) {
1665
+ await agentManager.setAgentThinkingOption(agentId, settings.thinkingOptionId);
1666
+ }
1667
+ if (settings?.features) {
1668
+ for (const [featureId, value] of Object.entries(settings.features)) {
1669
+ await agentManager.setAgentFeature(agentId, featureId, value);
1670
+ }
1671
+ }
1672
+ if (settings?.allowedTools !== undefined) {
1673
+ await agentManager.setAgentAllowedTools(agentId, settings.allowedTools);
1674
+ }
1675
+ // One call for both, and only when at least one was sent: passing
1676
+ // undefined through would be indistinguishable from "clear it", and an
1677
+ // update that only renames the agent must not blank its job.
1678
+ if (settings?.goal !== undefined || settings?.jobToBeDone !== undefined) {
1679
+ await agentManager.setAgentDurableDescriptions(agentId, {
1680
+ ...(settings.goal !== undefined ? { goal: settings.goal } : {}),
1681
+ ...(settings.jobToBeDone !== undefined ? { jobToBeDone: settings.jobToBeDone } : {}),
1682
+ });
1683
+ }
1684
+ await updateAgentCommand({ agentManager }, { agentId, name, labels });
1685
+ return {
1686
+ content: [],
1687
+ structuredContent: ensureValidJson({ success: true }),
1688
+ };
1689
+ });
1690
+ registerTool("rename_workspace", {
1691
+ title: "Rename workspace",
1692
+ description: "Rename a workspace by setting its user-visible title. Omit workspaceId to rename your current workspace.",
1693
+ inputSchema: {
1694
+ workspaceId: z
1695
+ .string()
1696
+ .trim()
1697
+ .min(1)
1698
+ .optional()
1699
+ .describe("Workspace id to rename. Omit to rename your current workspace."),
1700
+ title: z
1701
+ .string()
1702
+ .trim()
1703
+ .min(1, "title is required")
1704
+ .describe("New user-visible workspace title."),
1705
+ },
1706
+ outputSchema: {
1707
+ success: z.boolean(),
1708
+ workspaceId: z.string(),
1709
+ title: z.string(),
1710
+ },
1711
+ }, async ({ workspaceId: requestedWorkspaceId, title }) => {
1712
+ if (!options.workspaceRegistry) {
1713
+ throw new Error("Workspace registry is required to rename workspaces");
1714
+ }
1715
+ if (!options.emitWorkspaceUpdatesForWorkspaceIds) {
1716
+ throw new Error("Workspace update emitter is required to rename workspaces");
1717
+ }
1718
+ const workspaceId = resolveWorkspaceIdForRename(requestedWorkspaceId);
1719
+ const existing = await options.workspaceRegistry.get(workspaceId);
1720
+ if (!existing) {
1721
+ throw new Error(`Workspace ${workspaceId} not found`);
1722
+ }
1723
+ if (existing.archivedAt) {
1724
+ throw new Error(`Workspace ${workspaceId} is archived`);
1725
+ }
1726
+ await options.workspaceRegistry.upsert({
1727
+ ...existing,
1728
+ title,
1729
+ updatedAt: new Date().toISOString(),
1730
+ });
1731
+ await options.emitWorkspaceUpdatesForWorkspaceIds([workspaceId]);
1732
+ return {
1733
+ content: [],
1734
+ structuredContent: ensureValidJson({
1735
+ success: true,
1736
+ workspaceId,
1737
+ title,
1738
+ }),
1739
+ };
1740
+ });
1741
+ registerTool("list_terminals", {
1742
+ title: "List terminals",
1743
+ description: "List terminals for a working directory or across all working directories.",
1744
+ inputSchema: {
1745
+ cwd: z
1746
+ .string()
1747
+ .optional()
1748
+ .describe("Optional working directory. Defaults to your current working directory."),
1749
+ all: z.boolean().optional().describe("List terminals across all working directories."),
1750
+ },
1751
+ outputSchema: {
1752
+ terminals: z.array(TerminalSummarySchema),
1753
+ },
1754
+ }, async ({ cwd, all }) => {
1755
+ if (!terminalManager) {
1756
+ throw new Error("Terminal manager is not configured");
1757
+ }
1758
+ const terminals = all
1759
+ ? (await Promise.all(terminalManager.listDirectories().map(async (directory) => (await terminalManager.getTerminals(directory)).map((terminal) => ({
1760
+ id: terminal.id,
1761
+ name: terminal.name,
1762
+ cwd: terminal.cwd,
1763
+ }))))).flat()
1764
+ : (await terminalManager.getTerminals(resolveScopedCwd(cwd, { required: true }))).map((terminal) => ({
1765
+ id: terminal.id,
1766
+ name: terminal.name,
1767
+ cwd: terminal.cwd,
1768
+ }));
1769
+ return {
1770
+ content: [],
1771
+ structuredContent: ensureValidJson({ terminals }),
1772
+ };
1773
+ });
1774
+ registerTool("create_terminal", {
1775
+ title: "Create terminal",
1776
+ description: "Create a terminal session for a working directory.",
1777
+ inputSchema: {
1778
+ cwd: z
1779
+ .string()
1780
+ .optional()
1781
+ .describe("Optional working directory. Defaults to your current working directory."),
1782
+ name: z.string().optional().describe("Optional terminal name."),
1783
+ },
1784
+ outputSchema: TerminalSummarySchema.shape,
1785
+ }, async ({ cwd, name }) => {
1786
+ if (!terminalManager) {
1787
+ throw new Error("Terminal manager is not configured");
1788
+ }
1789
+ const resolvedCwd = resolveScopedCwd(cwd, { required: true });
1790
+ const workspaceId = await resolveTerminalWorkspaceId(resolvedCwd);
1791
+ const terminal = await terminalManager.createTerminal({
1792
+ cwd: resolvedCwd,
1793
+ workspaceId,
1794
+ ...(name?.trim() ? { name: name.trim() } : {}),
1795
+ });
1796
+ return {
1797
+ content: [],
1798
+ structuredContent: ensureValidJson({
1799
+ id: terminal.id,
1800
+ name: terminal.name,
1801
+ cwd: terminal.cwd,
1802
+ }),
1803
+ };
1804
+ });
1805
+ registerTool("kill_terminal", {
1806
+ title: "Kill terminal",
1807
+ description: "Kill an existing terminal session.",
1808
+ inputSchema: {
1809
+ terminalId: z.string(),
1810
+ },
1811
+ outputSchema: {
1812
+ success: z.boolean(),
1813
+ },
1814
+ }, async ({ terminalId }) => {
1815
+ if (!terminalManager) {
1816
+ throw new Error("Terminal manager is not configured");
1817
+ }
1818
+ const terminal = terminalManager.getTerminal(terminalId);
1819
+ if (!terminal) {
1820
+ throw new Error(`Terminal ${terminalId} not found`);
1821
+ }
1822
+ terminal.kill();
1823
+ return {
1824
+ content: [],
1825
+ structuredContent: ensureValidJson({ success: true }),
1826
+ };
1827
+ });
1828
+ registerTool("capture_terminal", {
1829
+ title: "Capture terminal",
1830
+ description: "Capture plain-text terminal output lines from a terminal session.",
1831
+ inputSchema: {
1832
+ terminalId: z.string(),
1833
+ start: z.number().optional(),
1834
+ end: z.number().optional(),
1835
+ scrollback: z.boolean().optional(),
1836
+ stripAnsi: z.boolean().optional().default(true),
1837
+ },
1838
+ outputSchema: {
1839
+ terminalId: z.string(),
1840
+ lines: z.array(z.string()),
1841
+ totalLines: z.number().int().nonnegative(),
1842
+ },
1843
+ }, async ({ terminalId, start, end, scrollback, stripAnsi = true }) => {
1844
+ if (!terminalManager) {
1845
+ throw new Error("Terminal manager is not configured");
1846
+ }
1847
+ if (!terminalManager.getTerminal(terminalId)) {
1848
+ throw new Error(`Terminal ${terminalId} not found`);
1849
+ }
1850
+ const capture = await terminalManager.captureTerminal(terminalId, {
1851
+ start: scrollback ? 0 : start,
1852
+ end,
1853
+ stripAnsi,
1854
+ });
1855
+ return {
1856
+ content: [],
1857
+ structuredContent: ensureValidJson({
1858
+ terminalId,
1859
+ lines: capture.lines,
1860
+ totalLines: capture.totalLines,
1861
+ }),
1862
+ };
1863
+ });
1864
+ registerTool("send_terminal_keys", {
1865
+ title: "Send terminal keys",
1866
+ description: "Send literal text or special key tokens to a terminal session.",
1867
+ inputSchema: {
1868
+ terminalId: z.string(),
1869
+ keys: z.string(),
1870
+ literal: z.boolean().optional(),
1871
+ },
1872
+ outputSchema: {
1873
+ success: z.boolean(),
1874
+ },
1875
+ }, async ({ terminalId, keys, literal = false }) => {
1876
+ if (!terminalManager) {
1877
+ throw new Error("Terminal manager is not configured");
1878
+ }
1879
+ const terminal = terminalManager.getTerminal(terminalId);
1880
+ if (!terminal) {
1881
+ throw new Error(`Terminal ${terminalId} not found`);
1882
+ }
1883
+ terminal.send({
1884
+ type: "input",
1885
+ data: resolveTerminalKeyToken(keys, literal),
1886
+ });
1887
+ return {
1888
+ content: [],
1889
+ structuredContent: ensureValidJson({ success: true }),
1890
+ };
1891
+ });
1892
+ registerTool("create_schedule", {
1893
+ title: "Create schedule",
1894
+ description: "Schedule a prompt for later: once at a specific time (at), on a repeating interval (every), or on a cron cadence (cron). The prompt can start a fresh agent, come back to you (target self), or go to another agent by id. Prefer this over an in-session loop whenever the work must survive this session ending, since schedules are owned by the daemon.",
1895
+ inputSchema: {
1896
+ prompt: z.string().trim().min(1, "prompt is required"),
1897
+ at: z
1898
+ .string()
1899
+ .trim()
1900
+ .min(1)
1901
+ .optional()
1902
+ .describe('One-off delivery time. An ISO 8601 instant ("2026-08-21T21:30:00-03:00") or a duration from now ("90m", "2h30m"). Runs exactly once. Mutually exclusive with every and cron.'),
1903
+ every: z
1904
+ .string()
1905
+ .trim()
1906
+ .min(1)
1907
+ .optional()
1908
+ .describe('Repeating interval, for example "5m", "1h", "2h30m", "1d". Mutually exclusive with at and cron.'),
1909
+ cron: z
1910
+ .string()
1911
+ .trim()
1912
+ .min(1)
1913
+ .optional()
1914
+ .describe('Repeating cron expression, for example "0 9 * * 1-5". Mutually exclusive with at and every.'),
1915
+ timezone: z
1916
+ .string()
1917
+ .trim()
1918
+ .min(1)
1919
+ .optional()
1920
+ .describe("IANA time zone for the cron cadence. Requires cron. For example: America/New_York."),
1921
+ name: z
1922
+ .string()
1923
+ .optional()
1924
+ .describe("Reusing a name with the same target refreshes that schedule in place instead of creating a second one."),
1925
+ target: z
1926
+ .string()
1927
+ .trim()
1928
+ .min(1)
1929
+ .optional()
1930
+ .describe('Who receives the prompt: "new-agent" (default) starts a fresh agent each run, "self" delivers to you, or an agent id delivers to that agent.'),
1931
+ provider: AgentProviderEnum.optional().describe("Provider, or provider/model (for example: codex or codex/gpt-5.4). Only valid with target new-agent."),
1932
+ cwd: z.string().optional().describe("Working directory. Only valid with target new-agent."),
1933
+ maxRuns: z.number().int().positive().optional(),
1934
+ expiresIn: z.string().optional(),
1935
+ runNow: z
1936
+ .boolean()
1937
+ .optional()
1938
+ .describe("Also fire once immediately on create. Defaults to true for every, false for cron. Not allowed with at."),
1939
+ },
1940
+ outputSchema: ScheduleSummarySchema.shape,
1941
+ }, async ({ prompt, at, every, cron, timezone, name, target, provider, cwd, maxRuns, expiresIn, runNow, }) => {
1942
+ if (!scheduleService) {
1943
+ throw new Error("Schedule service is not configured");
1944
+ }
1945
+ const { cadence, oneOff } = resolveScheduleCreateCadence({ at, every, cron, timezone }, new Date());
1946
+ if (oneOff && maxRuns !== undefined && maxRuns !== 1) {
1947
+ throw new Error("maxRuns cannot be combined with at: an at schedule runs exactly once");
1948
+ }
1949
+ if (oneOff && runNow === true) {
1950
+ throw new Error("runNow cannot be combined with at: an at schedule runs only at its time");
1951
+ }
1952
+ const resolvedTarget = await resolveScheduleCreateTarget({ target, provider, cwd });
1953
+ const expiresAt = buildScheduleExpiry(expiresIn);
1954
+ const scheduleInput = {
1955
+ prompt: prompt.trim(),
1956
+ cadence,
1957
+ target: resolvedTarget,
1958
+ ...(name?.trim() ? { name: name.trim() } : {}),
1959
+ ...(oneOff
1960
+ ? { maxRuns: 1, runOnCreate: false }
1961
+ : {
1962
+ ...(maxRuns === undefined ? {} : { maxRuns }),
1963
+ ...(runNow === undefined ? {} : { runOnCreate: runNow }),
1964
+ }),
1965
+ ...(expiresAt === undefined ? {} : { expiresAt }),
1966
+ };
1967
+ const schedule = await persistNewSchedule(scheduleInput, oneOff);
1968
+ return {
1969
+ content: [],
1970
+ structuredContent: ensureValidJson(toScheduleSummary(schedule)),
1971
+ };
1972
+ });
1973
+ registerTool("create_heartbeat", {
1974
+ title: "Create heartbeat",
1975
+ description: "Schedule a prompt back to yourself: once at a specific time (at), on a repeating interval (every), or on a cron cadence (cron). Equivalent to create_schedule with target self.",
1976
+ inputSchema: {
1977
+ prompt: z.string().trim().min(1, "prompt is required"),
1978
+ at: z
1979
+ .string()
1980
+ .trim()
1981
+ .min(1)
1982
+ .optional()
1983
+ .describe('One-off delivery time. An ISO 8601 instant ("2026-08-21T21:30:00-03:00") or a duration from now ("90m"). Runs exactly once. Mutually exclusive with every and cron.'),
1984
+ every: z
1985
+ .string()
1986
+ .trim()
1987
+ .min(1)
1988
+ .optional()
1989
+ .describe('Repeating interval, for example "5m", "1h", "2h30m". Mutually exclusive with at and cron.'),
1990
+ cron: z
1991
+ .string()
1992
+ .trim()
1993
+ .min(1)
1994
+ .optional()
1995
+ .describe('Repeating cron expression, for example "0 9 * * 1-5". Mutually exclusive with at and every.'),
1996
+ timezone: z
1997
+ .string()
1998
+ .trim()
1999
+ .min(1)
2000
+ .optional()
2001
+ .describe("IANA time zone for the cron cadence. Requires cron. For example: America/New_York."),
2002
+ name: z.string().optional(),
2003
+ maxRuns: z.number().int().positive().optional(),
2004
+ expiresIn: z.string().optional(),
2005
+ runNow: z
2006
+ .boolean()
2007
+ .optional()
2008
+ .describe("Also fire once immediately on create. Defaults to true for every, false for cron. Not allowed with at."),
2009
+ },
2010
+ outputSchema: ScheduleSummarySchema.shape,
2011
+ }, async ({ prompt, at, every, cron, timezone, name, maxRuns, expiresIn, runNow }) => {
2012
+ if (!scheduleService) {
2013
+ throw new Error("Schedule service is not configured");
2014
+ }
2015
+ if (!callerAgentId) {
2016
+ throw new Error("create_heartbeat requires an agent-scoped session");
2017
+ }
2018
+ resolveCallerAgent();
2019
+ const { cadence, oneOff } = resolveScheduleCreateCadence({ at, every, cron, timezone }, new Date());
2020
+ if (oneOff && maxRuns !== undefined && maxRuns !== 1) {
2021
+ throw new Error("maxRuns cannot be combined with at: an at schedule runs exactly once");
2022
+ }
2023
+ if (oneOff && runNow === true) {
2024
+ throw new Error("runNow cannot be combined with at: an at schedule runs only at its time");
2025
+ }
2026
+ const expiresAt = buildScheduleExpiry(expiresIn);
2027
+ const scheduleInput = {
2028
+ prompt: prompt.trim(),
2029
+ cadence,
2030
+ target: { type: "agent", agentId: callerAgentId },
2031
+ ...(name?.trim() ? { name: name.trim() } : {}),
2032
+ ...(oneOff
2033
+ ? { maxRuns: 1, runOnCreate: false }
2034
+ : {
2035
+ ...(maxRuns === undefined ? {} : { maxRuns }),
2036
+ ...(runNow === undefined ? {} : { runOnCreate: runNow }),
2037
+ }),
2038
+ ...(expiresAt === undefined ? {} : { expiresAt }),
2039
+ };
2040
+ const schedule = await persistNewSchedule(scheduleInput, oneOff);
2041
+ return {
2042
+ content: [],
2043
+ structuredContent: ensureValidJson(toScheduleSummary(schedule)),
2044
+ };
2045
+ });
2046
+ registerTool("run_schedule_once", {
2047
+ title: "Run schedule once",
2048
+ description: "Fire a schedule immediately, out of band. The cadence and the next scheduled run are left untouched, but the run is recorded and counts toward maxRuns.",
2049
+ inputSchema: {
2050
+ id: z.string(),
2051
+ },
2052
+ outputSchema: StoredScheduleSchema.shape,
2053
+ }, async ({ id }) => {
2054
+ if (!scheduleService) {
2055
+ throw new Error("Schedule service is not configured");
2056
+ }
2057
+ const schedule = await scheduleService.runOnce(id);
2058
+ return {
2059
+ content: [],
2060
+ structuredContent: ensureValidJson(schedule),
2061
+ };
2062
+ });
2063
+ registerTool("list_schedules", {
2064
+ title: "List schedules",
2065
+ description: "List all schedules managed by the daemon.",
2066
+ inputSchema: {},
2067
+ outputSchema: {
2068
+ schedules: z.array(ScheduleSummarySchema),
2069
+ },
2070
+ }, async () => {
2071
+ if (!scheduleService) {
2072
+ throw new Error("Schedule service is not configured");
2073
+ }
2074
+ const schedules = (await scheduleService.list()).map((schedule) => toScheduleSummary(schedule));
2075
+ return {
2076
+ content: [],
2077
+ structuredContent: ensureValidJson({ schedules }),
2078
+ };
2079
+ });
2080
+ registerTool("inspect_schedule", {
2081
+ title: "Inspect schedule",
2082
+ description: "Inspect a schedule and its run history.",
2083
+ inputSchema: {
2084
+ id: z.string(),
2085
+ },
2086
+ outputSchema: StoredScheduleSchema.shape,
2087
+ }, async ({ id }) => {
2088
+ if (!scheduleService) {
2089
+ throw new Error("Schedule service is not configured");
2090
+ }
2091
+ const schedule = await scheduleService.inspect(id);
2092
+ return {
2093
+ content: [],
2094
+ structuredContent: ensureValidJson(schedule),
2095
+ };
2096
+ });
2097
+ registerTool("pause_schedule", {
2098
+ title: "Pause schedule",
2099
+ description: "Pause an active schedule.",
2100
+ inputSchema: {
2101
+ id: z.string(),
2102
+ },
2103
+ outputSchema: {
2104
+ success: z.boolean(),
2105
+ },
2106
+ }, async ({ id }) => {
2107
+ if (!scheduleService) {
2108
+ throw new Error("Schedule service is not configured");
2109
+ }
2110
+ await scheduleService.pause(id);
2111
+ return {
2112
+ content: [],
2113
+ structuredContent: ensureValidJson({ success: true }),
2114
+ };
2115
+ });
2116
+ registerTool("resume_schedule", {
2117
+ title: "Resume schedule",
2118
+ description: "Resume a paused schedule.",
2119
+ inputSchema: {
2120
+ id: z.string(),
2121
+ },
2122
+ outputSchema: {
2123
+ success: z.boolean(),
2124
+ },
2125
+ }, async ({ id }) => {
2126
+ if (!scheduleService) {
2127
+ throw new Error("Schedule service is not configured");
2128
+ }
2129
+ await scheduleService.resume(id);
2130
+ return {
2131
+ content: [],
2132
+ structuredContent: ensureValidJson({ success: true }),
2133
+ };
2134
+ });
2135
+ registerTool("delete_schedule", {
2136
+ title: "Delete schedule",
2137
+ description: "Delete a schedule permanently.",
2138
+ inputSchema: {
2139
+ id: z.string(),
2140
+ },
2141
+ outputSchema: {
2142
+ success: z.boolean(),
2143
+ },
2144
+ }, async ({ id }) => {
2145
+ if (!scheduleService) {
2146
+ throw new Error("Schedule service is not configured");
2147
+ }
2148
+ await scheduleService.delete(id);
2149
+ return {
2150
+ content: [],
2151
+ structuredContent: ensureValidJson({ success: true }),
2152
+ };
2153
+ });
2154
+ registerTool("update_schedule", {
2155
+ title: "Update schedule",
2156
+ description: "Update an existing schedule. Only provided fields are changed; omitted fields remain unchanged.",
2157
+ inputSchema: {
2158
+ id: z.string(),
2159
+ every: z.string().optional().describe("New interval duration string (e.g. 5m, 1h)."),
2160
+ cron: z.string().optional().describe("New cron expression."),
2161
+ timezone: z
2162
+ .string()
2163
+ .trim()
2164
+ .min(1)
2165
+ .optional()
2166
+ .describe("IANA time zone for cron cadence; requires cron. For example: America/New_York."),
2167
+ name: z.string().nullable().optional().describe("New name (null to clear)."),
2168
+ prompt: z.string().trim().min(1).optional().describe("New prompt text."),
2169
+ maxRuns: z
2170
+ .number()
2171
+ .int()
2172
+ .positive()
2173
+ .nullable()
2174
+ .optional()
2175
+ .describe("New max runs limit (null to clear)."),
2176
+ provider: z
2177
+ .string()
2178
+ .trim()
2179
+ .min(1)
2180
+ .optional()
2181
+ .describe("New provider for new-agent target."),
2182
+ model: z
2183
+ .string()
2184
+ .trim()
2185
+ .min(1)
2186
+ .nullable()
2187
+ .optional()
2188
+ .describe("New model for new-agent target (null to clear)."),
2189
+ mode: z
2190
+ .string()
2191
+ .trim()
2192
+ .min(1)
2193
+ .nullable()
2194
+ .optional()
2195
+ .describe("New mode for new-agent target (null to clear)."),
2196
+ cwd: z.string().trim().min(1).optional().describe("New cwd for new-agent target."),
2197
+ expiresIn: z
2198
+ .string()
2199
+ .optional()
2200
+ .describe("New relative expiry duration (for example: 1h, 2d)."),
2201
+ clearExpires: z.boolean().optional().describe("Clear any schedule expiry."),
2202
+ },
2203
+ outputSchema: StoredScheduleSchema.shape,
2204
+ }, async (input) => {
2205
+ if (!scheduleService) {
2206
+ throw new Error("Schedule service is not configured");
2207
+ }
2208
+ const schedule = await scheduleService.update(buildScheduleUpdateInput(input));
2209
+ return {
2210
+ content: [],
2211
+ structuredContent: ensureValidJson(schedule),
2212
+ };
2213
+ });
2214
+ registerTool("schedule_logs", {
2215
+ title: "Schedule logs",
2216
+ description: "Get the run history (logs) for a schedule.",
2217
+ inputSchema: {
2218
+ id: z.string(),
2219
+ },
2220
+ outputSchema: {
2221
+ runs: z.array(ScheduleRunSchema),
2222
+ },
2223
+ }, async ({ id }) => {
2224
+ if (!scheduleService) {
2225
+ throw new Error("Schedule service is not configured");
2226
+ }
2227
+ const runs = await scheduleService.logs(id);
2228
+ return {
2229
+ content: [],
2230
+ structuredContent: ensureValidJson({ runs }),
2231
+ };
2232
+ });
2233
+ registerTool("list_providers", {
2234
+ title: "List providers",
2235
+ description: "List configured agent providers, availability, and their modes.",
2236
+ inputSchema: {},
2237
+ outputSchema: {
2238
+ providers: z.array(ProviderSummarySchema),
2239
+ },
2240
+ }, async () => {
2241
+ const providers = (await providerSnapshotManager.listProviders({ wait: true })).map(toProviderSummary);
2242
+ return {
2243
+ content: [],
2244
+ structuredContent: ensureValidJson({ providers }),
2245
+ };
2246
+ });
2247
+ registerTool("list_models", {
2248
+ title: "List models",
2249
+ description: "List models for an agent provider.",
2250
+ inputSchema: {
2251
+ provider: AgentProviderEnum,
2252
+ },
2253
+ outputSchema: {
2254
+ provider: z.string(),
2255
+ models: z.array(AgentModelSchema),
2256
+ },
2257
+ }, async ({ provider }) => {
2258
+ const models = await providerSnapshotManager.listModels({
2259
+ provider,
2260
+ wait: true,
2261
+ });
2262
+ return {
2263
+ content: [],
2264
+ structuredContent: ensureValidJson({
2265
+ provider,
2266
+ models,
2267
+ }),
2268
+ };
2269
+ });
2270
+ registerTool("inspect_provider", {
2271
+ title: "Inspect provider",
2272
+ description: "Inspect compact provider capabilities for orchestration, including modes and draft feature settings. Use list_models for the full model list.",
2273
+ inputSchema: inspectProviderInputSchema,
2274
+ outputSchema: {
2275
+ provider: AgentProviderEnum,
2276
+ label: z.string().nullable().optional(),
2277
+ description: z.string().nullable().optional(),
2278
+ enabled: z.boolean(),
2279
+ status: z.string(),
2280
+ modes: z.array(ProviderModeSchema).nullish(),
2281
+ selectedModel: z.string().nullable(),
2282
+ features: z.array(AgentFeatureSchema),
2283
+ },
2284
+ }, async ({ provider, cwd, settings }) => {
2285
+ const resolvedProviderModel = resolveScheduleProviderAndModel({
2286
+ provider,
2287
+ defaultProvider: provider,
2288
+ });
2289
+ const providerId = resolvedProviderModel.provider;
2290
+ const resolvedCwd = resolveScopedCwd(cwd, { required: true });
2291
+ const entry = await providerSnapshotManager.getProvider({
2292
+ cwd: resolvedCwd,
2293
+ provider: providerId,
2294
+ wait: true,
2295
+ });
2296
+ const summary = toProviderSummary(entry);
2297
+ if (!entry.enabled) {
2298
+ throw new Error(`Provider '${providerId}' is disabled`);
2299
+ }
2300
+ if (entry.status !== "ready") {
2301
+ throw new Error(entry.error ?? `Provider '${providerId}' is unavailable`);
2302
+ }
2303
+ const selectedModel = settings?.model ?? resolvedProviderModel.model;
2304
+ const features = await agentManager.listDraftFeatures({
2305
+ provider: providerId,
2306
+ cwd: resolvedCwd,
2307
+ ...(settings?.modeId ? { modeId: settings.modeId } : {}),
2308
+ ...(selectedModel ? { model: selectedModel } : {}),
2309
+ ...(settings?.thinkingOptionId ? { thinkingOptionId: settings.thinkingOptionId } : {}),
2310
+ ...(settings?.features ? { featureValues: settings.features } : {}),
2311
+ });
2312
+ return {
2313
+ content: [],
2314
+ structuredContent: ensureValidJson({
2315
+ provider: providerId,
2316
+ label: summary.label,
2317
+ description: summary.description,
2318
+ enabled: summary.enabled,
2319
+ status: summary.status,
2320
+ modes: summary.modes,
2321
+ selectedModel: selectedModel ?? null,
2322
+ features,
2323
+ }),
2324
+ };
2325
+ });
2326
+ registerTool("list_worktrees", {
2327
+ title: "List worktrees",
2328
+ description: "List Paseo-managed git worktrees for a repository.",
2329
+ inputSchema: {
2330
+ cwd: z
2331
+ .string()
2332
+ .optional()
2333
+ .describe("Optional repository cwd. Defaults to your current working directory."),
2334
+ },
2335
+ outputSchema: {
2336
+ worktrees: z.array(WorktreeSummarySchema),
2337
+ },
2338
+ }, async ({ cwd }) => {
2339
+ const resolvedCwd = resolveScopedCwd(cwd, { required: true });
2340
+ if (!options.workspaceGitService) {
2341
+ throw new Error("WorkspaceGitService is required to list worktrees");
2342
+ }
2343
+ const worktrees = await listPaseoWorktreesCommand({ workspaceGitService: options.workspaceGitService }, {
2344
+ cwd: resolvedCwd,
2345
+ reason: "mcp:list-worktrees",
2346
+ });
2347
+ return {
2348
+ content: [],
2349
+ structuredContent: ensureValidJson({ worktrees }),
2350
+ };
2351
+ });
2352
+ registerTool("create_worktree", {
2353
+ title: "Create worktree",
2354
+ description: "Create a Paseo-managed git worktree. Branch off a new branch, check out an existing branch, or check out a GitHub PR.",
2355
+ inputSchema: {
2356
+ cwd: z.string().optional().describe("Repository directory. Defaults to the agent's cwd."),
2357
+ target: AgentCreateWorktreeTargetInputSchema.describe("What the worktree should contain."),
2358
+ },
2359
+ outputSchema: {
2360
+ branchName: z.string(),
2361
+ worktreePath: z.string(),
2362
+ workspaceId: z.string(),
2363
+ },
2364
+ }, async ({ cwd, target }) => {
2365
+ const repoRoot = resolveScopedCwd(cwd, { required: true });
2366
+ const commandResult = await createPaseoWorktreeCommand({
2367
+ paseoHome: options.paseoHome,
2368
+ worktreesRoot: options.worktreesRoot,
2369
+ createPaseoWorktreeWorkflow: options.createPaseoWorktree,
2370
+ }, createMcpWorktreeCommandInput(repoRoot, target));
2371
+ if (!commandResult.ok) {
2372
+ throw new WorktreeRequestError(commandResult.error);
2373
+ }
2374
+ const { worktree, workspace } = commandResult.createdWorktree;
2375
+ await options.workspaceGitService?.listWorktrees?.(repoRoot, {
2376
+ force: true,
2377
+ reason: "mcp:create-worktree",
2378
+ });
2379
+ return {
2380
+ content: [],
2381
+ structuredContent: ensureValidJson({
2382
+ branchName: worktree.branchName,
2383
+ worktreePath: worktree.worktreePath,
2384
+ workspaceId: workspace.workspaceId,
2385
+ }),
2386
+ };
2387
+ });
2388
+ registerTool("archive_worktree", {
2389
+ title: "Archive worktree",
2390
+ description: "Delete a Paseo-managed git worktree.",
2391
+ inputSchema: {
2392
+ cwd: z
2393
+ .string()
2394
+ .optional()
2395
+ .describe("Optional repository cwd. Defaults to your current working directory."),
2396
+ worktreePath: z.string().optional(),
2397
+ worktreeSlug: z.string().optional(),
2398
+ },
2399
+ outputSchema: {
2400
+ success: z.boolean(),
2401
+ },
2402
+ }, async ({ cwd, worktreePath, worktreeSlug }) => {
2403
+ const resolvedCwd = resolveScopedCwd(cwd, { required: true });
2404
+ if (!worktreePath && !worktreeSlug) {
2405
+ throw new Error("worktreePath or worktreeSlug is required");
2406
+ }
2407
+ if (!options.workspaceGitService) {
2408
+ throw new Error("WorkspaceGitService is required to archive worktrees");
2409
+ }
2410
+ const repoRoot = await options.workspaceGitService.resolveRepoRoot(resolvedCwd);
2411
+ const result = await archiveCommand(archiveWorktreeDependencies(options, {
2412
+ agentManager,
2413
+ agentStorage,
2414
+ terminalManager: terminalManager ?? null,
2415
+ logger: childLogger,
2416
+ }), {
2417
+ requestId: "mcp:archive_worktree",
2418
+ repoRoot,
2419
+ worktreePath,
2420
+ worktreeSlug,
2421
+ // This tool archives every workspace on the directory, then removes the
2422
+ // directory. Disk removal is derived from scope + last-reference.
2423
+ scope: "worktree",
2424
+ });
2425
+ if (!result.ok) {
2426
+ throw new Error(result.message);
2427
+ }
2428
+ await options.workspaceGitService.listWorktrees(repoRoot, {
2429
+ force: true,
2430
+ reason: "mcp:archive-worktree",
2431
+ });
2432
+ return {
2433
+ content: [],
2434
+ structuredContent: ensureValidJson({ success: true }),
2435
+ };
2436
+ });
2437
+ registerTool("get_agent_activity", {
2438
+ title: "Get agent activity",
2439
+ description: "Return recent agent timeline entries as a curated summary.",
2440
+ inputSchema: {
2441
+ agentId: z.string(),
2442
+ limit: z
2443
+ .number()
2444
+ .optional()
2445
+ .describe("Optional limit for number of activities to include (most recent first)."),
2446
+ },
2447
+ outputSchema: {
2448
+ agentId: z.string(),
2449
+ updateCount: z.number(),
2450
+ currentModeId: z.string().nullable(),
2451
+ content: z.string(),
2452
+ },
2453
+ }, async ({ agentId, limit }) => {
2454
+ await ensureAgentLoaded(agentId, {
2455
+ agentManager,
2456
+ agentStorage,
2457
+ logger: childLogger,
2458
+ });
2459
+ const timeline = agentManager.getTimeline(agentId);
2460
+ const snapshot = agentManager.getAgent(agentId);
2461
+ const selection = selectItemsByProjectedLimit({
2462
+ items: timeline,
2463
+ direction: "tail",
2464
+ limit: limit ?? 0,
2465
+ });
2466
+ const curatedContent = curateAgentActivity(selection.items);
2467
+ const { totalProjected, shownProjected } = selection;
2468
+ const noun = totalProjected === 1 ? "activity" : "activities";
2469
+ const countHeader = limit && shownProjected < totalProjected
2470
+ ? `Showing ${shownProjected} of ${totalProjected} ${noun} (limited to ${limit})`
2471
+ : `Showing all ${totalProjected} ${noun}`;
2472
+ const contentWithCount = `${countHeader}\n\n${curatedContent}`;
2473
+ return {
2474
+ content: [],
2475
+ structuredContent: ensureValidJson({
2476
+ agentId,
2477
+ updateCount: timeline.length,
2478
+ currentModeId: snapshot?.currentModeId ?? null,
2479
+ content: contentWithCount,
2480
+ }),
2481
+ };
2482
+ });
2483
+ registerTool("set_agent_mode", {
2484
+ title: "Set agent session mode",
2485
+ description: "Switch the agent's session mode (plan, bypassPermissions, read-only, auto, etc.).",
2486
+ inputSchema: {
2487
+ agentId: z.string(),
2488
+ modeId: z.string(),
2489
+ },
2490
+ outputSchema: {
2491
+ success: z.boolean(),
2492
+ newMode: z.string(),
2493
+ },
2494
+ }, async ({ agentId, modeId }) => {
2495
+ const result = await setAgentModeCommand({ agentManager }, { agentId, modeId });
2496
+ return {
2497
+ content: [],
2498
+ structuredContent: ensureValidJson({ success: true, newMode: result.modeId }),
2499
+ };
2500
+ });
2501
+ registerTool("list_pending_permissions", {
2502
+ title: "List pending permissions",
2503
+ description: "Return all pending permission requests across all agents with the normalized payloads.",
2504
+ inputSchema: {},
2505
+ outputSchema: {
2506
+ permissions: z.array(z.object({
2507
+ agentId: z.string(),
2508
+ status: AgentStatusEnum,
2509
+ request: AgentPermissionRequestPayloadSchema,
2510
+ })),
2511
+ },
2512
+ }, async () => {
2513
+ const permissions = agentManager.listAgents().flatMap((agent) => {
2514
+ const payload = toAgentPayload(agent);
2515
+ return payload.pendingPermissions.map((request) => ({
2516
+ agentId: agent.id,
2517
+ status: payload.status,
2518
+ request: sanitizePermissionRequest(request),
2519
+ }));
2520
+ });
2521
+ return {
2522
+ content: [],
2523
+ structuredContent: ensureValidJson({ permissions }),
2524
+ };
2525
+ });
2526
+ registerTool("respond_to_permission", {
2527
+ title: "Respond to permission",
2528
+ description: "Approve or deny a pending permission request with an AgentManager-compatible response payload.",
2529
+ inputSchema: {
2530
+ agentId: z.string(),
2531
+ requestId: z.string(),
2532
+ response: AgentPermissionResponseSchema,
2533
+ },
2534
+ outputSchema: {
2535
+ success: z.boolean(),
2536
+ },
2537
+ }, async ({ agentId, requestId, response }) => {
2538
+ await respondToAgentPermission({
2539
+ agentManager,
2540
+ agentId,
2541
+ requestId,
2542
+ response,
2543
+ logger: childLogger,
2544
+ });
2545
+ return {
2546
+ content: [],
2547
+ structuredContent: ensureValidJson({ success: true }),
2548
+ };
2549
+ });
2550
+ return toCatalog();
2551
+ }
2552
+ function archiveWorktreeDependencies(options, context) {
2553
+ if (!options.github) {
2554
+ throw new Error("GitHub service is required to archive worktrees");
2555
+ }
2556
+ if (!options.workspaceGitService) {
2557
+ throw new Error("WorkspaceGitService is required to archive worktrees");
2558
+ }
2559
+ if (!options.archiveWorkspaceRecord) {
2560
+ throw new Error("Workspace registry archiver is required to archive worktrees");
2561
+ }
2562
+ if (!options.findWorkspaceIdForCwd) {
2563
+ throw new Error("Workspace resolver is required to archive worktrees");
2564
+ }
2565
+ if (!options.listActiveWorkspaces) {
2566
+ throw new Error("Active workspace lister is required to archive worktrees");
2567
+ }
2568
+ if (!options.emitWorkspaceUpdatesForWorkspaceIds) {
2569
+ throw new Error("Workspace update emitter is required to archive worktrees");
2570
+ }
2571
+ if (!options.markWorkspaceArchiving) {
2572
+ throw new Error("Workspace archiving marker is required to archive worktrees");
2573
+ }
2574
+ if (!options.clearWorkspaceArchiving) {
2575
+ throw new Error("Workspace archiving clearer is required to archive worktrees");
2576
+ }
2577
+ return {
2578
+ paseoHome: options.paseoHome,
2579
+ paseoWorktreesBaseRoot: options.worktreesRoot,
2580
+ github: options.github,
2581
+ workspaceGitService: options.workspaceGitService,
2582
+ agentManager: context.agentManager,
2583
+ agentStorage: context.agentStorage,
2584
+ findWorkspaceIdForCwd: options.findWorkspaceIdForCwd,
2585
+ listActiveWorkspaces: options.listActiveWorkspaces,
2586
+ archiveWorkspaceRecord: options.archiveWorkspaceRecord,
2587
+ emitWorkspaceUpdatesForWorkspaceIds: options.emitWorkspaceUpdatesForWorkspaceIds,
2588
+ markWorkspaceArchiving: options.markWorkspaceArchiving,
2589
+ clearWorkspaceArchiving: options.clearWorkspaceArchiving,
2590
+ killTerminalsForWorkspace: (workspaceId) => killTerminalsForWorkspace({
2591
+ terminalManager: context.terminalManager,
2592
+ sessionLogger: context.logger,
2593
+ }, workspaceId),
2594
+ sessionLogger: context.logger,
2595
+ };
2596
+ }
2597
+ function createMcpWorktreeCommandInput(repoRoot, target) {
2598
+ const base = { cwd: repoRoot };
2599
+ switch (target.kind) {
2600
+ case "branch-off":
2601
+ return {
2602
+ ...base,
2603
+ worktreeSlug: target.worktreeSlug,
2604
+ branchName: target.branchName,
2605
+ action: "branch-off",
2606
+ ...(target.baseBranch ? { refName: target.baseBranch } : {}),
2607
+ };
2608
+ case "checkout-branch":
2609
+ return { ...base, action: "checkout", refName: target.branch };
2610
+ case "checkout-pr":
2611
+ return { ...base, action: "checkout", githubPrNumber: target.githubPrNumber };
2612
+ default:
2613
+ throw new Error("unreachable");
2614
+ }
2615
+ }
2616
+ //# sourceMappingURL=paseo-tools.js.map