@getpaseo/server 0.1.59 → 0.1.60

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 (273) hide show
  1. package/dist/scripts/dev-runner.js +26 -7
  2. package/dist/scripts/dev-runner.js.map +1 -1
  3. package/dist/server/client/daemon-client-runtime-metrics.d.ts +39 -0
  4. package/dist/server/client/daemon-client-runtime-metrics.d.ts.map +1 -0
  5. package/dist/server/client/daemon-client-runtime-metrics.js +173 -0
  6. package/dist/server/client/daemon-client-runtime-metrics.js.map +1 -0
  7. package/dist/server/client/daemon-client.d.ts +58 -9
  8. package/dist/server/client/daemon-client.d.ts.map +1 -1
  9. package/dist/server/client/daemon-client.js +151 -10
  10. package/dist/server/client/daemon-client.js.map +1 -1
  11. package/dist/server/server/agent/agent-manager.d.ts +55 -48
  12. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  13. package/dist/server/server/agent/agent-manager.js +541 -331
  14. package/dist/server/server/agent/agent-manager.js.map +1 -1
  15. package/dist/server/server/agent/agent-metadata-generator.d.ts +3 -2
  16. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
  17. package/dist/server/server/agent/agent-metadata-generator.js +31 -16
  18. package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
  19. package/dist/server/server/agent/agent-projections.d.ts +2 -1
  20. package/dist/server/server/agent/agent-projections.d.ts.map +1 -1
  21. package/dist/server/server/agent/agent-projections.js +29 -1
  22. package/dist/server/server/agent/agent-projections.js.map +1 -1
  23. package/dist/server/server/agent/agent-sdk-types.d.ts +9 -5
  24. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  25. package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
  26. package/dist/server/server/agent/agent-storage.d.ts +76 -69
  27. package/dist/server/server/agent/agent-storage.d.ts.map +1 -1
  28. package/dist/server/server/agent/agent-storage.js +13 -6
  29. package/dist/server/server/agent/agent-storage.js.map +1 -1
  30. package/dist/server/server/agent/agent-stream-coalescer.d.ts +41 -0
  31. package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -0
  32. package/dist/server/server/agent/agent-stream-coalescer.js +166 -0
  33. package/dist/server/server/agent/agent-stream-coalescer.js.map +1 -0
  34. package/dist/server/server/agent/agent-timeline-store-types.d.ts +54 -0
  35. package/dist/server/server/agent/agent-timeline-store-types.d.ts.map +1 -0
  36. package/dist/server/server/agent/agent-timeline-store-types.js +2 -0
  37. package/dist/server/server/agent/agent-timeline-store-types.js.map +1 -0
  38. package/dist/server/server/agent/agent-timeline-store.d.ts +32 -0
  39. package/dist/server/server/agent/agent-timeline-store.d.ts.map +1 -0
  40. package/dist/server/server/agent/agent-timeline-store.js +245 -0
  41. package/dist/server/server/agent/agent-timeline-store.js.map +1 -0
  42. package/dist/server/server/agent/mcp-server.d.ts +12 -1
  43. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  44. package/dist/server/server/agent/mcp-server.js +276 -65
  45. package/dist/server/server/agent/mcp-server.js.map +1 -1
  46. package/dist/server/server/agent/mcp-shared.d.ts +196 -152
  47. package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
  48. package/dist/server/server/agent/mcp-shared.js +40 -42
  49. package/dist/server/server/agent/mcp-shared.js.map +1 -1
  50. package/dist/server/server/agent/model-resolver.d.ts.map +1 -1
  51. package/dist/server/server/agent/model-resolver.js +3 -1
  52. package/dist/server/server/agent/model-resolver.js.map +1 -1
  53. package/dist/server/server/agent/prompt-attachments.d.ts +6 -0
  54. package/dist/server/server/agent/prompt-attachments.d.ts.map +1 -0
  55. package/dist/server/server/agent/prompt-attachments.js +31 -0
  56. package/dist/server/server/agent/prompt-attachments.js.map +1 -0
  57. package/dist/server/server/agent/provider-launch-config.d.ts +12 -10
  58. package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
  59. package/dist/server/server/agent/provider-launch-config.js +34 -0
  60. package/dist/server/server/agent/provider-launch-config.js.map +1 -1
  61. package/dist/server/server/agent/provider-manifest.d.ts +1 -0
  62. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
  63. package/dist/server/server/agent/provider-manifest.js +22 -1
  64. package/dist/server/server/agent/provider-manifest.js.map +1 -1
  65. package/dist/server/server/agent/provider-registry.d.ts +5 -2
  66. package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
  67. package/dist/server/server/agent/provider-registry.js +20 -9
  68. package/dist/server/server/agent/provider-registry.js.map +1 -1
  69. package/dist/server/server/agent/provider-snapshot-manager.d.ts +17 -5
  70. package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -1
  71. package/dist/server/server/agent/provider-snapshot-manager.js +150 -61
  72. package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
  73. package/dist/server/server/agent/providers/acp-agent.d.ts +8 -4
  74. package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
  75. package/dist/server/server/agent/providers/acp-agent.js +73 -8
  76. package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
  77. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +2 -2
  78. package/dist/server/server/agent/providers/claude-agent.d.ts +1 -1
  79. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  80. package/dist/server/server/agent/providers/claude-agent.js +8 -7
  81. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  82. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +37 -4
  83. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  84. package/dist/server/server/agent/providers/codex-app-server-agent.js +61 -31
  85. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  86. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +1 -1
  87. package/dist/server/server/agent/providers/copilot-acp-agent.js +3 -2
  88. package/dist/server/server/agent/providers/copilot-acp-agent.js.map +1 -1
  89. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +64 -0
  90. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -0
  91. package/dist/server/server/agent/providers/mock-load-test-agent.js +585 -0
  92. package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -0
  93. package/dist/server/server/agent/providers/opencode-agent.d.ts +19 -4
  94. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  95. package/dist/server/server/agent/providers/opencode-agent.js +227 -118
  96. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  97. package/dist/server/server/agent/providers/pi-direct-agent.d.ts +69 -0
  98. package/dist/server/server/agent/providers/pi-direct-agent.d.ts.map +1 -0
  99. package/dist/server/server/agent/providers/pi-direct-agent.js +1177 -0
  100. package/dist/server/server/agent/providers/pi-direct-agent.js.map +1 -0
  101. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +7 -4
  102. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  103. package/dist/server/server/agent-attention-policy.d.ts +13 -13
  104. package/dist/server/server/agent-attention-policy.d.ts.map +1 -1
  105. package/dist/server/server/agent-attention-policy.js +20 -36
  106. package/dist/server/server/agent-attention-policy.js.map +1 -1
  107. package/dist/server/server/bootstrap.d.ts +6 -0
  108. package/dist/server/server/bootstrap.d.ts.map +1 -1
  109. package/dist/server/server/bootstrap.js +113 -11
  110. package/dist/server/server/bootstrap.js.map +1 -1
  111. package/dist/server/server/chat/chat-rpc-schemas.d.ts +44 -44
  112. package/dist/server/server/chat/chat-types.d.ts +6 -6
  113. package/dist/server/server/checkout-diff-manager.d.ts +0 -1
  114. package/dist/server/server/checkout-diff-manager.d.ts.map +1 -1
  115. package/dist/server/server/checkout-diff-manager.js +6 -4
  116. package/dist/server/server/checkout-diff-manager.js.map +1 -1
  117. package/dist/server/server/config.d.ts.map +1 -1
  118. package/dist/server/server/config.js +1 -0
  119. package/dist/server/server/config.js.map +1 -1
  120. package/dist/server/server/file-explorer/service.d.ts.map +1 -1
  121. package/dist/server/server/file-explorer/service.js +2 -1
  122. package/dist/server/server/file-explorer/service.js.map +1 -1
  123. package/dist/server/server/loop/rpc-schemas.d.ts +392 -392
  124. package/dist/server/server/loop-service.d.ts +52 -52
  125. package/dist/server/server/paseo-worktree-archive-service.d.ts +41 -0
  126. package/dist/server/server/paseo-worktree-archive-service.d.ts.map +1 -0
  127. package/dist/server/server/paseo-worktree-archive-service.js +137 -0
  128. package/dist/server/server/paseo-worktree-archive-service.js.map +1 -0
  129. package/dist/server/server/paseo-worktree-service.d.ts +24 -0
  130. package/dist/server/server/paseo-worktree-service.d.ts.map +1 -0
  131. package/dist/server/server/paseo-worktree-service.js +94 -0
  132. package/dist/server/server/paseo-worktree-service.js.map +1 -0
  133. package/dist/server/server/path-utils.d.ts +1 -0
  134. package/dist/server/server/path-utils.d.ts.map +1 -1
  135. package/dist/server/server/path-utils.js +9 -0
  136. package/dist/server/server/path-utils.js.map +1 -1
  137. package/dist/server/server/persisted-config.d.ts +73 -73
  138. package/dist/server/server/persistence-hooks.d.ts.map +1 -1
  139. package/dist/server/server/persistence-hooks.js +3 -0
  140. package/dist/server/server/persistence-hooks.js.map +1 -1
  141. package/dist/server/server/resolve-worktree-creation-intent.d.ts +30 -0
  142. package/dist/server/server/resolve-worktree-creation-intent.d.ts.map +1 -0
  143. package/dist/server/server/resolve-worktree-creation-intent.js +163 -0
  144. package/dist/server/server/resolve-worktree-creation-intent.js.map +1 -0
  145. package/dist/server/server/schedule/rpc-schemas.d.ts +192 -192
  146. package/dist/server/server/schedule/service.d.ts +1 -1
  147. package/dist/server/server/schedule/service.d.ts.map +1 -1
  148. package/dist/server/server/schedule/types.d.ts +44 -44
  149. package/dist/server/server/script-health-monitor.d.ts +39 -0
  150. package/dist/server/server/script-health-monitor.d.ts.map +1 -0
  151. package/dist/server/server/script-health-monitor.js +158 -0
  152. package/dist/server/server/script-health-monitor.js.map +1 -0
  153. package/dist/server/server/script-proxy.d.ts +40 -0
  154. package/dist/server/server/script-proxy.d.ts.map +1 -0
  155. package/dist/server/server/script-proxy.js +245 -0
  156. package/dist/server/server/script-proxy.js.map +1 -0
  157. package/dist/server/server/script-route-branch-handler.d.ts +10 -0
  158. package/dist/server/server/script-route-branch-handler.d.ts.map +1 -0
  159. package/dist/server/server/script-route-branch-handler.js +45 -0
  160. package/dist/server/server/script-route-branch-handler.js.map +1 -0
  161. package/dist/server/server/script-status-projection.d.ts +29 -0
  162. package/dist/server/server/script-status-projection.d.ts.map +1 -0
  163. package/dist/server/server/script-status-projection.js +133 -0
  164. package/dist/server/server/script-status-projection.js.map +1 -0
  165. package/dist/server/server/session.d.ts +77 -13
  166. package/dist/server/server/session.d.ts.map +1 -1
  167. package/dist/server/server/session.js +1290 -548
  168. package/dist/server/server/session.js.map +1 -1
  169. package/dist/server/server/websocket-server.d.ts +27 -3
  170. package/dist/server/server/websocket-server.d.ts.map +1 -1
  171. package/dist/server/server/websocket-server.js +112 -29
  172. package/dist/server/server/websocket-server.js.map +1 -1
  173. package/dist/server/server/workspace-archive-service.d.ts +8 -0
  174. package/dist/server/server/workspace-archive-service.d.ts.map +1 -0
  175. package/dist/server/server/workspace-archive-service.js +17 -0
  176. package/dist/server/server/workspace-archive-service.js.map +1 -0
  177. package/dist/server/server/workspace-git-metadata.d.ts +24 -0
  178. package/dist/server/server/workspace-git-metadata.d.ts.map +1 -0
  179. package/dist/server/server/workspace-git-metadata.js +78 -0
  180. package/dist/server/server/workspace-git-metadata.js.map +1 -0
  181. package/dist/server/server/workspace-git-service.d.ts +104 -5
  182. package/dist/server/server/workspace-git-service.d.ts.map +1 -1
  183. package/dist/server/server/workspace-git-service.js +442 -56
  184. package/dist/server/server/workspace-git-service.js.map +1 -1
  185. package/dist/server/server/workspace-reconciliation-service.d.ts +54 -0
  186. package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -0
  187. package/dist/server/server/workspace-reconciliation-service.js +176 -0
  188. package/dist/server/server/workspace-reconciliation-service.js.map +1 -0
  189. package/dist/server/server/workspace-registry-bootstrap.d.ts.map +1 -1
  190. package/dist/server/server/workspace-registry-bootstrap.js +4 -3
  191. package/dist/server/server/workspace-registry-bootstrap.js.map +1 -1
  192. package/dist/server/server/workspace-registry.d.ts +8 -8
  193. package/dist/server/server/workspace-registry.test-helpers.d.ts +37 -0
  194. package/dist/server/server/workspace-registry.test-helpers.d.ts.map +1 -0
  195. package/dist/server/server/workspace-registry.test-helpers.js +121 -0
  196. package/dist/server/server/workspace-registry.test-helpers.js.map +1 -0
  197. package/dist/server/server/workspace-script-runtime-store.d.ts +28 -0
  198. package/dist/server/server/workspace-script-runtime-store.d.ts.map +1 -0
  199. package/dist/server/server/workspace-script-runtime-store.js +78 -0
  200. package/dist/server/server/workspace-script-runtime-store.js.map +1 -0
  201. package/dist/server/server/workspace-service-env.d.ts +17 -0
  202. package/dist/server/server/workspace-service-env.d.ts.map +1 -0
  203. package/dist/server/server/workspace-service-env.js +80 -0
  204. package/dist/server/server/workspace-service-env.js.map +1 -0
  205. package/dist/server/server/workspace-service-port-registry.d.ts +19 -0
  206. package/dist/server/server/workspace-service-port-registry.d.ts.map +1 -0
  207. package/dist/server/server/workspace-service-port-registry.js +59 -0
  208. package/dist/server/server/workspace-service-port-registry.js.map +1 -0
  209. package/dist/server/server/worktree-bootstrap.d.ts +55 -10
  210. package/dist/server/server/worktree-bootstrap.d.ts.map +1 -1
  211. package/dist/server/server/worktree-bootstrap.js +290 -112
  212. package/dist/server/server/worktree-bootstrap.js.map +1 -1
  213. package/dist/server/server/worktree-core.d.ts +25 -0
  214. package/dist/server/server/worktree-core.d.ts.map +1 -0
  215. package/dist/server/server/worktree-core.js +75 -0
  216. package/dist/server/server/worktree-core.js.map +1 -0
  217. package/dist/server/server/worktree-errors.d.ts +12 -0
  218. package/dist/server/server/worktree-errors.d.ts.map +1 -0
  219. package/dist/server/server/worktree-errors.js +31 -0
  220. package/dist/server/server/worktree-errors.js.map +1 -0
  221. package/dist/server/server/worktree-session.d.ts +56 -70
  222. package/dist/server/server/worktree-session.d.ts.map +1 -1
  223. package/dist/server/server/worktree-session.js +176 -251
  224. package/dist/server/server/worktree-session.js.map +1 -1
  225. package/dist/server/services/github-service.d.ts +225 -0
  226. package/dist/server/services/github-service.d.ts.map +1 -0
  227. package/dist/server/services/github-service.js +1381 -0
  228. package/dist/server/services/github-service.js.map +1 -0
  229. package/dist/server/shared/messages.d.ts +29408 -12268
  230. package/dist/server/shared/messages.d.ts.map +1 -1
  231. package/dist/server/shared/messages.js +391 -65
  232. package/dist/server/shared/messages.js.map +1 -1
  233. package/dist/server/terminal/shell-integration/zsh/.zshenv +17 -0
  234. package/dist/server/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
  235. package/dist/server/terminal/terminal-manager.d.ts +9 -0
  236. package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
  237. package/dist/server/terminal/terminal-manager.js +27 -0
  238. package/dist/server/terminal/terminal-manager.js.map +1 -1
  239. package/dist/server/terminal/terminal-output-coalescer.d.ts +30 -0
  240. package/dist/server/terminal/terminal-output-coalescer.d.ts.map +1 -0
  241. package/dist/server/terminal/terminal-output-coalescer.js +55 -0
  242. package/dist/server/terminal/terminal-output-coalescer.js.map +1 -0
  243. package/dist/server/terminal/terminal.d.ts +32 -1
  244. package/dist/server/terminal/terminal.d.ts.map +1 -1
  245. package/dist/server/terminal/terminal.js +397 -17
  246. package/dist/server/terminal/terminal.js.map +1 -1
  247. package/dist/server/utils/checkout-git.d.ts +63 -10
  248. package/dist/server/utils/checkout-git.d.ts.map +1 -1
  249. package/dist/server/utils/checkout-git.js +321 -229
  250. package/dist/server/utils/checkout-git.js.map +1 -1
  251. package/dist/server/utils/promise-timeout.d.ts +9 -0
  252. package/dist/server/utils/promise-timeout.d.ts.map +1 -0
  253. package/dist/server/utils/promise-timeout.js +25 -0
  254. package/dist/server/utils/promise-timeout.js.map +1 -0
  255. package/dist/server/utils/script-hostname.d.ts +8 -0
  256. package/dist/server/utils/script-hostname.d.ts.map +1 -0
  257. package/dist/server/utils/script-hostname.js +14 -0
  258. package/dist/server/utils/script-hostname.js.map +1 -0
  259. package/dist/server/utils/string-command-shell.d.ts +10 -0
  260. package/dist/server/utils/string-command-shell.d.ts.map +1 -0
  261. package/dist/server/utils/string-command-shell.js +21 -0
  262. package/dist/server/utils/string-command-shell.js.map +1 -0
  263. package/dist/server/utils/worktree.d.ts +54 -7
  264. package/dist/server/utils/worktree.d.ts.map +1 -1
  265. package/dist/server/utils/worktree.js +434 -129
  266. package/dist/server/utils/worktree.js.map +1 -1
  267. package/dist/src/terminal/shell-integration/zsh/.zshenv +17 -0
  268. package/dist/src/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
  269. package/package.json +11 -14
  270. package/dist/server/server/agent/providers/pi-acp-agent.d.ts +0 -28
  271. package/dist/server/server/agent/providers/pi-acp-agent.d.ts.map +0 -1
  272. package/dist/server/server/agent/providers/pi-acp-agent.js +0 -302
  273. package/dist/server/server/agent/providers/pi-acp-agent.js.map +0 -1
@@ -1,19 +1,23 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { z } from "zod";
3
3
  import { ensureValidJson } from "../json-utils.js";
4
- import { AgentPermissionRequestPayloadSchema, AgentPermissionResponseSchema, AgentSnapshotPayloadSchema, } from "../messages.js";
5
- import { buildStoredAgentPayload, toAgentPayload } from "./agent-projections.js";
4
+ import { AgentPermissionRequestPayloadSchema, AgentListItemPayloadSchema, AgentPermissionResponseSchema, AgentSnapshotPayloadSchema, } from "../messages.js";
5
+ import { buildStoredAgentPayload, toAgentListItemPayload, toAgentPayload, } from "./agent-projections.js";
6
6
  import { curateAgentActivity } from "./activity-curator.js";
7
7
  import { ensureAgentLoaded } from "./agent-loading.js";
8
8
  import { appendTimelineItemIfAgentKnown, emitLiveTimelineItemIfAgentKnown, } from "./timeline-append.js";
9
+ import { getPaseoWorktreesRoot } from "../../utils/worktree.js";
10
+ import { archivePaseoWorktree, killTerminalsUnderPath, } from "../paseo-worktree-archive-service.js";
9
11
  import { WaitForAgentTracker } from "./wait-for-agent-tracker.js";
10
12
  import { scheduleAgentMetadataGeneration } from "./agent-metadata-generator.js";
11
- import { expandUserPath, resolvePathFromBase } from "../path-utils.js";
13
+ import { expandUserPath, isSameOrDescendantPath, resolvePathFromBase } from "../path-utils.js";
12
14
  import { captureTerminalLines } from "../../terminal/terminal.js";
13
- import { createAgentWorktree, runAsyncWorktreeBootstrap } from "../worktree-bootstrap.js";
15
+ import { runAsyncWorktreeBootstrap } from "../worktree-bootstrap.js";
14
16
  import { ScheduleSummarySchema, StoredScheduleSchema } from "../schedule/types.js";
15
- import { deletePaseoWorktree, listPaseoWorktrees } from "../../utils/worktree.js";
16
- import { AgentModelSchema, AgentProviderEnum, AgentStatusEnum, ProviderSummarySchema, parseDurationString, resolveProviderAndModel, sanitizePermissionRequest, sendPromptToAgent, setupFinishNotification, serializeSnapshotWithMetadata, startAgentRun, toScheduleSummary, waitForAgentWithTimeout, } from "./mcp-shared.js";
17
+ import { resolveSnapshotCwd } from "./provider-snapshot-manager.js";
18
+ import { AgentModelSchema, AgentProviderEnum, AgentStatusEnum, ProviderSummarySchema, parseDurationString, resolveRequiredProviderModel, sanitizePermissionRequest, sendPromptToAgent, setupFinishNotification, serializeSnapshotWithMetadata, startAgentRun, toScheduleSummary, waitForAgentWithTimeout, } from "./mcp-shared.js";
19
+ import { toWorktreeRequestError } from "../worktree-errors.js";
20
+ import { join } from "node:path";
17
21
  const CLAUDE_TO_CODEX_MODE = {
18
22
  plan: "read-only",
19
23
  default: "auto",
@@ -45,6 +49,50 @@ function mapModeAcrossProviders(sourceMode, sourceProvider, targetProvider) {
45
49
  }
46
50
  return sourceMode;
47
51
  }
52
+ function parseTimestamp(value) {
53
+ if (!value) {
54
+ return 0;
55
+ }
56
+ const parsed = Date.parse(value);
57
+ return Number.isNaN(parsed) ? 0 : parsed;
58
+ }
59
+ function resolveAgentListActivityTime(agent) {
60
+ return Math.max(parseTimestamp(agent.updatedAt), parseTimestamp(agent.lastUserMessageAt), parseTimestamp(agent.attentionTimestamp), parseTimestamp(agent.archivedAt), parseTimestamp(agent.createdAt));
61
+ }
62
+ function compareAgentListItems(a, b) {
63
+ const attentionDelta = Number(b.requiresAttention ?? false) - Number(a.requiresAttention ?? false);
64
+ if (attentionDelta !== 0) {
65
+ return attentionDelta;
66
+ }
67
+ const statusOrder = {
68
+ running: 0,
69
+ initializing: 1,
70
+ idle: 2,
71
+ error: 3,
72
+ closed: 4,
73
+ };
74
+ const statusDelta = (statusOrder[a.status] ?? 999) - (statusOrder[b.status] ?? 999);
75
+ if (statusDelta !== 0) {
76
+ return statusDelta;
77
+ }
78
+ return resolveAgentListActivityTime(b) - resolveAgentListActivityTime(a);
79
+ }
80
+ function resolveScheduleProviderAndModel(params) {
81
+ const providerInput = params.provider?.trim() || params.defaultProvider;
82
+ const slashIndex = providerInput.indexOf("/");
83
+ if (slashIndex === -1) {
84
+ return { provider: providerInput };
85
+ }
86
+ const provider = providerInput.slice(0, slashIndex).trim();
87
+ const model = providerInput.slice(slashIndex + 1).trim();
88
+ if (!provider || !model) {
89
+ throw new Error("provider must be <provider> or <provider>/<model>");
90
+ }
91
+ return {
92
+ provider: provider,
93
+ model,
94
+ };
95
+ }
48
96
  function resolveChildAgentCwd(params) {
49
97
  const lockedCwd = params.lockedCwd?.trim();
50
98
  if (lockedCwd) {
@@ -147,7 +195,7 @@ export async function createAgentMcpServer(options) {
147
195
  if (callerAgent) {
148
196
  const hasProviderOverride = params?.provider !== undefined;
149
197
  const resolvedProviderModel = hasProviderOverride
150
- ? resolveProviderAndModel({
198
+ ? resolveScheduleProviderAndModel({
151
199
  provider: params?.provider,
152
200
  defaultProvider: callerAgent.provider,
153
201
  })
@@ -192,21 +240,32 @@ export async function createAgentMcpServer(options) {
192
240
  },
193
241
  };
194
242
  }
243
+ const resolvedProviderModel = resolveScheduleProviderAndModel({
244
+ provider: params?.provider,
245
+ defaultProvider: "claude",
246
+ });
195
247
  return {
196
248
  type: "new-agent",
197
- config: (() => {
198
- const resolvedProviderModel = resolveProviderAndModel({
199
- provider: params?.provider,
200
- defaultProvider: "claude",
201
- });
202
- return {
203
- provider: resolvedProviderModel.provider,
204
- cwd: params?.cwd?.trim() ? expandUserPath(params.cwd) : process.cwd(),
205
- ...(resolvedProviderModel.model ? { model: resolvedProviderModel.model } : {}),
206
- };
207
- })(),
249
+ config: {
250
+ provider: resolvedProviderModel.provider,
251
+ cwd: params?.cwd?.trim() ? expandUserPath(params.cwd) : process.cwd(),
252
+ ...(resolvedProviderModel.model ? { model: resolvedProviderModel.model } : {}),
253
+ },
208
254
  };
209
255
  };
256
+ const ProviderModelInputSchema = AgentProviderEnum.trim()
257
+ .refine((value) => value.includes("/"), {
258
+ message: "provider must be provider/model, for example codex/gpt-5.4",
259
+ })
260
+ .refine((value) => {
261
+ try {
262
+ resolveRequiredProviderModel(value);
263
+ return true;
264
+ }
265
+ catch {
266
+ return false;
267
+ }
268
+ }, { message: "provider must be provider/model, for example codex/gpt-5.4" });
210
269
  const agentToAgentInputSchema = {
211
270
  cwd: z
212
271
  .string()
@@ -218,8 +277,7 @@ export async function createAgentMcpServer(options) {
218
277
  .min(1, "Title is required")
219
278
  .max(60, "Title must be 60 characters or fewer")
220
279
  .describe("Short descriptive title (<= 60 chars) summarizing the agent's focus."),
221
- provider: AgentProviderEnum.optional().describe("Optional agent implementation to spawn. Defaults to 'claude'."),
222
- model: z.string().optional().describe("Model to use (e.g. claude-sonnet-4-20250514)"),
280
+ provider: ProviderModelInputSchema.describe("Required provider/model pair, for example codex/gpt-5.4."),
223
281
  thinking: z.string().optional().describe("Thinking option ID"),
224
282
  labels: z.record(z.string(), z.string()).optional().describe("Labels to set on the agent"),
225
283
  initialPrompt: z
@@ -248,8 +306,7 @@ export async function createAgentMcpServer(options) {
248
306
  .min(1, "Title is required")
249
307
  .max(60, "Title must be 60 characters or fewer")
250
308
  .describe("Short descriptive title (<= 60 chars) summarizing the agent's focus."),
251
- provider: AgentProviderEnum.optional().describe("Optional agent implementation to spawn. Defaults to 'claude'."),
252
- model: z.string().optional().describe("Model to use (e.g. claude-sonnet-4-20250514)"),
309
+ provider: ProviderModelInputSchema.describe("Required provider/model pair, for example codex/gpt-5.4."),
253
310
  thinking: z.string().optional().describe("Thinking option ID"),
254
311
  labels: z.record(z.string(), z.string()).optional().describe("Labels to set on the agent"),
255
312
  initialPrompt: z
@@ -269,6 +326,17 @@ export async function createAgentMcpServer(options) {
269
326
  .string()
270
327
  .optional()
271
328
  .describe("Required when worktreeName is set: the base branch to diff/merge against."),
329
+ refName: z.string().min(1).optional().describe("Optional source ref for worktree creation."),
330
+ action: z
331
+ .enum(["branch-off", "checkout"])
332
+ .optional()
333
+ .describe("Optional worktree creation action."),
334
+ githubPrNumber: z
335
+ .number()
336
+ .int()
337
+ .positive()
338
+ .optional()
339
+ .describe("Optional GitHub pull request number to checkout."),
272
340
  background: z
273
341
  .boolean()
274
342
  .optional()
@@ -281,8 +349,8 @@ export async function createAgentMcpServer(options) {
281
349
  .describe("Send a notification prompt to the caller agent when this agent finishes, errors, or needs permission. Requires a caller agent context."),
282
350
  };
283
351
  const createAgentInputSchema = callerAgentId ? agentToAgentInputSchema : topLevelInputSchema;
284
- const agentToAgentCreateAgentArgsSchema = z.object(agentToAgentInputSchema);
285
- const topLevelCreateAgentArgsSchema = z.object(topLevelInputSchema);
352
+ const agentToAgentCreateAgentArgsSchema = z.object(agentToAgentInputSchema).strict();
353
+ const topLevelCreateAgentArgsSchema = z.object(topLevelInputSchema).strict();
286
354
  if (options.voiceOnly || options.enableVoiceTools || callerContext?.enableVoiceTools) {
287
355
  server.registerTool("speak", {
288
356
  title: "Speak",
@@ -321,7 +389,7 @@ export async function createAgentMcpServer(options) {
321
389
  }
322
390
  server.registerTool("create_agent", {
323
391
  title: "Create agent",
324
- description: "Create a new Claude or Codex agent tied to a working directory. Optionally run an initial prompt immediately or create a git worktree for the agent.",
392
+ description: "Create an agent tied to a working directory. Requires provider/model, for example codex/gpt-5.4. Optionally run an initial prompt immediately or create a git worktree for the agent.",
325
393
  inputSchema: createAgentInputSchema,
326
394
  outputSchema: {
327
395
  agentId: z.string(),
@@ -349,13 +417,15 @@ export async function createAgentMcpServer(options) {
349
417
  let resolvedCwd;
350
418
  let resolvedMode;
351
419
  let worktreeConfig;
420
+ let shouldBootstrapWorktree;
352
421
  if (callerAgentId) {
353
422
  const callerArgs = agentToAgentCreateAgentArgsSchema.parse(args);
354
- provider = callerArgs.provider ?? "claude";
423
+ const resolvedProviderModel = resolveRequiredProviderModel(callerArgs.provider);
424
+ provider = resolvedProviderModel.provider;
425
+ model = resolvedProviderModel.model;
355
426
  initialPrompt = callerArgs.initialPrompt;
356
427
  background = callerArgs.background ?? false;
357
428
  normalizedTitle = callerArgs.title.trim();
358
- model = callerArgs.model;
359
429
  thinking = callerArgs.thinking;
360
430
  labels = callerArgs.labels;
361
431
  notifyOnFinish = callerArgs.notifyOnFinish ?? false;
@@ -376,29 +446,39 @@ export async function createAgentMcpServer(options) {
376
446
  }
377
447
  else {
378
448
  const topLevelArgs = topLevelCreateAgentArgsSchema.parse(args);
379
- provider = topLevelArgs.provider ?? "claude";
449
+ const resolvedProviderModel = resolveRequiredProviderModel(topLevelArgs.provider);
450
+ provider = resolvedProviderModel.provider;
451
+ model = resolvedProviderModel.model;
380
452
  initialPrompt = topLevelArgs.initialPrompt;
381
453
  background = topLevelArgs.background ?? false;
382
454
  normalizedTitle = topLevelArgs.title.trim();
383
- model = topLevelArgs.model;
384
455
  thinking = topLevelArgs.thinking;
385
456
  labels = topLevelArgs.labels;
386
457
  notifyOnFinish = topLevelArgs.notifyOnFinish ?? false;
387
- const { cwd, mode, worktreeName, baseBranch } = topLevelArgs;
458
+ const { cwd, mode, worktreeName, baseBranch, refName, action, githubPrNumber } = topLevelArgs;
388
459
  resolvedCwd = expandUserPath(cwd);
389
460
  if (worktreeName) {
390
- if (!baseBranch) {
461
+ if (!baseBranch && !refName && !action && githubPrNumber === undefined) {
391
462
  throw new Error("baseBranch is required when creating a worktree");
392
463
  }
393
- const worktree = await createAgentWorktree({
394
- branchName: worktreeName,
395
- cwd: resolvedCwd,
396
- baseBranch,
397
- worktreeSlug: worktreeName,
398
- paseoHome: options.paseoHome,
464
+ const createdWorktree = await createMcpWorktree({
465
+ input: {
466
+ cwd: resolvedCwd,
467
+ worktreeSlug: worktreeName,
468
+ refName,
469
+ action,
470
+ githubPrNumber,
471
+ runSetup: false,
472
+ paseoHome: options.paseoHome,
473
+ },
474
+ createPaseoWorktree: options.createPaseoWorktree,
475
+ resolveDefaultBranch: baseBranch ? async () => baseBranch : undefined,
476
+ workspaceGitService: options.workspaceGitService,
477
+ logger: options.logger,
399
478
  });
400
- resolvedCwd = worktree.worktreePath;
401
- worktreeConfig = worktree;
479
+ resolvedCwd = createdWorktree.worktree.worktreePath;
480
+ worktreeConfig = createdWorktree.worktree;
481
+ shouldBootstrapWorktree = createdWorktree.created;
402
482
  }
403
483
  resolvedMode = mode;
404
484
  }
@@ -420,6 +500,7 @@ export async function createAgentMcpServer(options) {
420
500
  void runAsyncWorktreeBootstrap({
421
501
  agentId: snapshot.id,
422
502
  worktree: worktreeConfig,
503
+ shouldBootstrap: shouldBootstrapWorktree,
423
504
  terminalManager: terminalManager ?? null,
424
505
  appendTimelineItem: (item) => appendTimelineItemIfAgentKnown({
425
506
  agentManager,
@@ -443,6 +524,11 @@ export async function createAgentMcpServer(options) {
443
524
  explicitTitle: snapshot.config.title,
444
525
  paseoHome: options.paseoHome,
445
526
  logger: childLogger,
527
+ deps: options.workspaceGitService
528
+ ? {
529
+ workspaceGitService: options.workspaceGitService,
530
+ }
531
+ : undefined,
446
532
  });
447
533
  try {
448
534
  agentManager.recordUserMessage(snapshot.id, trimmedPrompt, {
@@ -692,14 +778,28 @@ export async function createAgentMcpServer(options) {
692
778
  });
693
779
  server.registerTool("list_agents", {
694
780
  title: "List agents",
695
- description: "List all live agents managed by the server.",
781
+ description: "List recent agents as compact metadata.",
696
782
  inputSchema: {
697
783
  includeArchived: z.boolean().optional().default(false),
784
+ cwd: z.string().optional(),
785
+ sinceHours: z
786
+ .number()
787
+ .int()
788
+ .positive()
789
+ .max(24 * 30)
790
+ .optional()
791
+ .default(48),
792
+ statuses: z.array(AgentStatusEnum).optional(),
793
+ limit: z.number().int().positive().max(200).optional().default(50),
698
794
  },
699
795
  outputSchema: {
700
- agents: z.array(AgentSnapshotPayloadSchema),
796
+ agents: z.array(AgentListItemPayloadSchema),
701
797
  },
702
- }, async ({ includeArchived }) => {
798
+ }, async ({ includeArchived = false, cwd, sinceHours = 48, statuses, limit = 50 }) => {
799
+ const callerCwd = callerAgentId ? resolveCallerAgent()?.cwd : undefined;
800
+ const requestedCwd = cwd?.trim() ? expandUserPath(cwd) : callerCwd;
801
+ const statusFilter = statuses && statuses.length > 0 ? new Set(statuses) : null;
802
+ const sinceMs = Date.now() - sinceHours * 60 * 60 * 1000;
703
803
  const liveSnapshots = agentManager.listAgents();
704
804
  const liveAgents = await Promise.all(liveSnapshots.map((snapshot) => serializeSnapshotWithMetadata(agentStorage, snapshot, childLogger)));
705
805
  const liveIds = new Set(liveSnapshots.map((snapshot) => snapshot.id));
@@ -708,9 +808,16 @@ export async function createAgentMcpServer(options) {
708
808
  .filter((record) => !record.internal && !liveIds.has(record.id))
709
809
  .filter((record) => includeArchived || !record.archivedAt)
710
810
  .map((record) => buildStoredAgentPayload(record, requireProviderRegistry(), childLogger));
811
+ const agents = [...liveAgents, ...storedAgents]
812
+ .map(toAgentListItemPayload)
813
+ .filter((agent) => !requestedCwd || isSameOrDescendantPath(requestedCwd, agent.cwd))
814
+ .filter((agent) => !statusFilter || statusFilter.has(agent.status))
815
+ .filter((agent) => !agent.archivedAt || resolveAgentListActivityTime(agent) >= sinceMs)
816
+ .sort(compareAgentListItems)
817
+ .slice(0, limit);
711
818
  return {
712
819
  content: [],
713
- structuredContent: ensureValidJson({ agents: [...liveAgents, ...storedAgents] }),
820
+ structuredContent: ensureValidJson({ agents }),
714
821
  };
715
822
  });
716
823
  server.registerTool("cancel_agent", {
@@ -973,15 +1080,29 @@ export async function createAgentMcpServer(options) {
973
1080
  }
974
1081
  const scheduleTarget = target === "self"
975
1082
  ? (() => {
976
- if (!callerAgentId) {
1083
+ const callerAgent = resolveCallerAgent();
1084
+ if (!callerAgentId || !callerAgent) {
977
1085
  throw new Error("target=self requires a caller agent");
978
1086
  }
979
- if (provider !== undefined || cwd !== undefined) {
980
- throw new Error("provider and cwd can only be used with target=new-agent");
1087
+ const trimmedCwd = cwd?.trim();
1088
+ if (trimmedCwd && expandUserPath(trimmedCwd) !== callerAgent.cwd) {
1089
+ throw new Error("cwd can only differ from the caller agent when target=new-agent");
1090
+ }
1091
+ if (provider !== undefined) {
1092
+ const resolved = resolveScheduleProviderAndModel({
1093
+ provider,
1094
+ defaultProvider: callerAgent.provider,
1095
+ });
1096
+ if (resolved.provider !== callerAgent.provider ||
1097
+ (resolved.model !== undefined && resolved.model !== callerAgent.config.model)) {
1098
+ throw new Error("provider can only differ from the caller agent when target=new-agent");
1099
+ }
981
1100
  }
982
1101
  return { type: "agent", agentId: callerAgentId };
983
1102
  })()
984
- : resolveNewAgentScheduleTarget({ provider, cwd });
1103
+ : (() => {
1104
+ return resolveNewAgentScheduleTarget({ provider, cwd });
1105
+ })();
985
1106
  const schedule = await scheduleService.create({
986
1107
  prompt: prompt.trim(),
987
1108
  cadence: every
@@ -1129,7 +1250,7 @@ export async function createAgentMcpServer(options) {
1129
1250
  if (!definition) {
1130
1251
  throw new Error(`Provider ${provider} is not configured`);
1131
1252
  }
1132
- const models = await definition.fetchModels();
1253
+ const models = await definition.fetchModels({ cwd: resolveSnapshotCwd(), force: false });
1133
1254
  return {
1134
1255
  content: [],
1135
1256
  structuredContent: ensureValidJson({
@@ -1152,9 +1273,11 @@ export async function createAgentMcpServer(options) {
1152
1273
  },
1153
1274
  }, async ({ cwd }) => {
1154
1275
  const resolvedCwd = resolveScopedCwd(cwd, { required: true });
1155
- const worktrees = await listPaseoWorktrees({
1156
- cwd: resolvedCwd,
1157
- paseoHome: options.paseoHome,
1276
+ if (!options.workspaceGitService) {
1277
+ throw new Error("WorkspaceGitService is required to list worktrees");
1278
+ }
1279
+ const worktrees = await options.workspaceGitService.listWorktrees(resolvedCwd, {
1280
+ reason: "mcp:list-worktrees",
1158
1281
  });
1159
1282
  return {
1160
1283
  content: [],
@@ -1169,25 +1292,41 @@ export async function createAgentMcpServer(options) {
1169
1292
  .string()
1170
1293
  .optional()
1171
1294
  .describe("Optional repository cwd. Defaults to the caller agent cwd."),
1172
- branchName: z.string(),
1173
- baseBranch: z.string(),
1295
+ branchName: z.string().optional(),
1296
+ baseBranch: z.string().optional(),
1297
+ refName: z.string().min(1).optional(),
1298
+ action: z.enum(["branch-off", "checkout"]).optional(),
1299
+ githubPrNumber: z.number().int().positive().optional(),
1174
1300
  },
1175
1301
  outputSchema: {
1176
1302
  branchName: z.string(),
1177
1303
  worktreePath: z.string(),
1178
1304
  },
1179
- }, async ({ cwd, branchName, baseBranch }) => {
1180
- const worktree = await createAgentWorktree({
1181
- branchName,
1182
- cwd: resolveScopedCwd(cwd, { required: true }),
1183
- baseBranch,
1184
- worktreeSlug: branchName,
1185
- paseoHome: options.paseoHome,
1305
+ }, async ({ cwd, branchName, baseBranch, refName, action, githubPrNumber }) => {
1306
+ if (!branchName && !refName && githubPrNumber === undefined) {
1307
+ throw new Error("create_worktree requires branchName, refName, or githubPrNumber");
1308
+ }
1309
+ const repoRoot = resolveScopedCwd(cwd, { required: true });
1310
+ const createdWorktree = await createMcpWorktree({
1311
+ input: {
1312
+ cwd: repoRoot,
1313
+ worktreeSlug: branchName,
1314
+ refName,
1315
+ action,
1316
+ githubPrNumber,
1317
+ runSetup: false,
1318
+ paseoHome: options.paseoHome,
1319
+ },
1320
+ createPaseoWorktree: options.createPaseoWorktree,
1321
+ resolveDefaultBranch: baseBranch ? async () => baseBranch : undefined,
1322
+ workspaceGitService: options.workspaceGitService,
1323
+ logger: options.logger,
1186
1324
  });
1325
+ const { worktree } = createdWorktree;
1187
1326
  return {
1188
1327
  content: [],
1189
1328
  structuredContent: ensureValidJson({
1190
- branchName,
1329
+ branchName: worktree.branchName,
1191
1330
  worktreePath: worktree.worktreePath,
1192
1331
  }),
1193
1332
  };
@@ -1207,11 +1346,48 @@ export async function createAgentMcpServer(options) {
1207
1346
  success: z.boolean(),
1208
1347
  },
1209
1348
  }, async ({ cwd, worktreePath, worktreeSlug }) => {
1210
- await deletePaseoWorktree({
1211
- cwd: resolveScopedCwd(cwd, { required: true }),
1212
- worktreePath,
1213
- worktreeSlug,
1349
+ const repoRoot = resolveScopedCwd(cwd, { required: true });
1350
+ if (!worktreePath && !worktreeSlug) {
1351
+ throw new Error("worktreePath or worktreeSlug is required");
1352
+ }
1353
+ if (!options.github) {
1354
+ throw new Error("GitHub service is required to archive worktrees");
1355
+ }
1356
+ if (!options.workspaceGitService) {
1357
+ throw new Error("WorkspaceGitService is required to archive worktrees");
1358
+ }
1359
+ if (!options.archiveWorkspaceRecord) {
1360
+ throw new Error("Workspace registry archiver is required to archive worktrees");
1361
+ }
1362
+ if (!options.emitWorkspaceUpdatesForCwds) {
1363
+ throw new Error("Workspace update emitter is required to archive worktrees");
1364
+ }
1365
+ if (!options.emitSessionMessage) {
1366
+ throw new Error("Session message emitter is required to archive worktrees");
1367
+ }
1368
+ const targetPath = worktreePath ??
1369
+ join(await getPaseoWorktreesRoot(repoRoot, options.paseoHome), worktreeSlug);
1370
+ await archivePaseoWorktree({
1214
1371
  paseoHome: options.paseoHome,
1372
+ github: options.github,
1373
+ workspaceGitService: options.workspaceGitService,
1374
+ agentManager,
1375
+ agentStorage,
1376
+ archiveWorkspaceRecord: options.archiveWorkspaceRecord,
1377
+ emit: options.emitSessionMessage,
1378
+ emitWorkspaceUpdatesForCwds: options.emitWorkspaceUpdatesForCwds,
1379
+ isPathWithinRoot: isSameOrDescendantPath,
1380
+ killTerminalsUnderPath: (rootPath) => killTerminalsUnderPath({
1381
+ terminalManager: terminalManager ?? null,
1382
+ isPathWithinRoot: isSameOrDescendantPath,
1383
+ killTrackedTerminal: () => { },
1384
+ sessionLogger: childLogger,
1385
+ }, rootPath),
1386
+ sessionLogger: childLogger,
1387
+ }, {
1388
+ targetPath,
1389
+ repoRoot,
1390
+ requestId: "mcp:archive_worktree",
1215
1391
  });
1216
1392
  return {
1217
1393
  content: [],
@@ -1327,4 +1503,39 @@ export async function createAgentMcpServer(options) {
1327
1503
  });
1328
1504
  return server;
1329
1505
  }
1506
+ async function createMcpWorktree(options) {
1507
+ try {
1508
+ if (!options.createPaseoWorktree) {
1509
+ throw new Error("Paseo worktree service is not configured");
1510
+ }
1511
+ const result = await options.createPaseoWorktree(options.input, {
1512
+ resolveDefaultBranch: options.resolveDefaultBranch,
1513
+ });
1514
+ if (options.workspaceGitService) {
1515
+ const refreshResults = await Promise.allSettled([
1516
+ options.workspaceGitService.getSnapshot(options.input.cwd, {
1517
+ force: true,
1518
+ reason: "create-worktree",
1519
+ }),
1520
+ options.workspaceGitService.getSnapshot(result.worktree.worktreePath, {
1521
+ force: true,
1522
+ reason: "create-worktree",
1523
+ }),
1524
+ ]);
1525
+ for (const [index, refreshResult] of refreshResults.entries()) {
1526
+ if (refreshResult.status === "fulfilled") {
1527
+ continue;
1528
+ }
1529
+ options.logger.warn({
1530
+ err: refreshResult.reason,
1531
+ cwd: index === 0 ? options.input.cwd : result.worktree.worktreePath,
1532
+ }, "Failed to force-refresh workspace git snapshot after creating worktree");
1533
+ }
1534
+ }
1535
+ return result;
1536
+ }
1537
+ catch (error) {
1538
+ throw toWorktreeRequestError(error);
1539
+ }
1540
+ }
1330
1541
  //# sourceMappingURL=mcp-server.js.map