@getpaseo/server 0.1.37 → 0.1.38

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 (295) hide show
  1. package/dist/scripts/dev-runner.js +1 -1
  2. package/dist/scripts/dev-runner.js.map +1 -1
  3. package/dist/scripts/{daemon-runner.js → supervisor-entrypoint.js} +7 -9
  4. package/dist/scripts/supervisor-entrypoint.js.map +1 -0
  5. package/dist/scripts/supervisor.js +17 -1
  6. package/dist/scripts/supervisor.js.map +1 -1
  7. package/dist/server/server/bootstrap.d.ts +0 -4
  8. package/dist/server/server/bootstrap.d.ts.map +1 -1
  9. package/dist/server/server/bootstrap.js +8 -22
  10. package/dist/server/server/bootstrap.js.map +1 -1
  11. package/dist/server/server/index.js +0 -4
  12. package/dist/server/server/index.js.map +1 -1
  13. package/dist/server/server/pid-lock.d.ts +7 -2
  14. package/dist/server/server/pid-lock.d.ts.map +1 -1
  15. package/dist/server/server/pid-lock.js +21 -0
  16. package/dist/server/server/pid-lock.js.map +1 -1
  17. package/dist/server/server/session.d.ts.map +1 -1
  18. package/dist/server/server/session.js +2 -2
  19. package/dist/server/server/session.js.map +1 -1
  20. package/dist/src/server/pid-lock.js +21 -0
  21. package/dist/src/server/pid-lock.js.map +1 -1
  22. package/package.json +3 -3
  23. package/dist/scripts/daemon-runner.js.map +0 -1
  24. package/dist/src/server/agent/activity-curator.js +0 -243
  25. package/dist/src/server/agent/activity-curator.js.map +0 -1
  26. package/dist/src/server/agent/agent-manager.js +0 -1855
  27. package/dist/src/server/agent/agent-manager.js.map +0 -1
  28. package/dist/src/server/agent/agent-metadata-generator.js +0 -161
  29. package/dist/src/server/agent/agent-metadata-generator.js.map +0 -1
  30. package/dist/src/server/agent/agent-projections.js +0 -254
  31. package/dist/src/server/agent/agent-projections.js.map +0 -1
  32. package/dist/src/server/agent/agent-response-loop.js +0 -304
  33. package/dist/src/server/agent/agent-response-loop.js.map +0 -1
  34. package/dist/src/server/agent/agent-sdk-types.js +0 -12
  35. package/dist/src/server/agent/agent-sdk-types.js.map +0 -1
  36. package/dist/src/server/agent/agent-storage.js +0 -302
  37. package/dist/src/server/agent/agent-storage.js.map +0 -1
  38. package/dist/src/server/agent/agent-title-limits.js +0 -3
  39. package/dist/src/server/agent/agent-title-limits.js.map +0 -1
  40. package/dist/src/server/agent/audio-utils.js +0 -19
  41. package/dist/src/server/agent/audio-utils.js.map +0 -1
  42. package/dist/src/server/agent/dictation-debug.js +0 -50
  43. package/dist/src/server/agent/dictation-debug.js.map +0 -1
  44. package/dist/src/server/agent/mcp-server.js +0 -754
  45. package/dist/src/server/agent/mcp-server.js.map +0 -1
  46. package/dist/src/server/agent/orchestrator-instructions.js +0 -51
  47. package/dist/src/server/agent/orchestrator-instructions.js.map +0 -1
  48. package/dist/src/server/agent/pcm16-resampler.js +0 -63
  49. package/dist/src/server/agent/pcm16-resampler.js.map +0 -1
  50. package/dist/src/server/agent/provider-launch-config.js +0 -213
  51. package/dist/src/server/agent/provider-launch-config.js.map +0 -1
  52. package/dist/src/server/agent/provider-manifest.js +0 -127
  53. package/dist/src/server/agent/provider-manifest.js.map +0 -1
  54. package/dist/src/server/agent/provider-registry.js +0 -45
  55. package/dist/src/server/agent/provider-registry.js.map +0 -1
  56. package/dist/src/server/agent/providers/claude/partial-json.js +0 -306
  57. package/dist/src/server/agent/providers/claude/partial-json.js.map +0 -1
  58. package/dist/src/server/agent/providers/claude/sdk-model-resolver.js +0 -104
  59. package/dist/src/server/agent/providers/claude/sdk-model-resolver.js.map +0 -1
  60. package/dist/src/server/agent/providers/claude/sidechain-tracker.js +0 -230
  61. package/dist/src/server/agent/providers/claude/sidechain-tracker.js.map +0 -1
  62. package/dist/src/server/agent/providers/claude/task-notification-tool-call.js +0 -267
  63. package/dist/src/server/agent/providers/claude/task-notification-tool-call.js.map +0 -1
  64. package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js +0 -121
  65. package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js.map +0 -1
  66. package/dist/src/server/agent/providers/claude/tool-call-mapper.js +0 -252
  67. package/dist/src/server/agent/providers/claude/tool-call-mapper.js.map +0 -1
  68. package/dist/src/server/agent/providers/claude-agent.js +0 -3166
  69. package/dist/src/server/agent/providers/claude-agent.js.map +0 -1
  70. package/dist/src/server/agent/providers/codex/tool-call-detail-parser.js +0 -104
  71. package/dist/src/server/agent/providers/codex/tool-call-detail-parser.js.map +0 -1
  72. package/dist/src/server/agent/providers/codex/tool-call-mapper.js +0 -758
  73. package/dist/src/server/agent/providers/codex/tool-call-mapper.js.map +0 -1
  74. package/dist/src/server/agent/providers/codex-app-server-agent.js +0 -2949
  75. package/dist/src/server/agent/providers/codex-app-server-agent.js.map +0 -1
  76. package/dist/src/server/agent/providers/codex-rollout-timeline.js +0 -544
  77. package/dist/src/server/agent/providers/codex-rollout-timeline.js.map +0 -1
  78. package/dist/src/server/agent/providers/opencode/tool-call-detail-parser.js +0 -39
  79. package/dist/src/server/agent/providers/opencode/tool-call-detail-parser.js.map +0 -1
  80. package/dist/src/server/agent/providers/opencode/tool-call-mapper.js +0 -144
  81. package/dist/src/server/agent/providers/opencode/tool-call-mapper.js.map +0 -1
  82. package/dist/src/server/agent/providers/opencode-agent.js +0 -1193
  83. package/dist/src/server/agent/providers/opencode-agent.js.map +0 -1
  84. package/dist/src/server/agent/providers/tool-call-detail-primitives.js +0 -686
  85. package/dist/src/server/agent/providers/tool-call-detail-primitives.js.map +0 -1
  86. package/dist/src/server/agent/providers/tool-call-mapper-utils.js +0 -115
  87. package/dist/src/server/agent/providers/tool-call-mapper-utils.js.map +0 -1
  88. package/dist/src/server/agent/recordings-debug.js +0 -19
  89. package/dist/src/server/agent/recordings-debug.js.map +0 -1
  90. package/dist/src/server/agent/stt-debug.js +0 -33
  91. package/dist/src/server/agent/stt-debug.js.map +0 -1
  92. package/dist/src/server/agent/stt-manager.js +0 -232
  93. package/dist/src/server/agent/stt-manager.js.map +0 -1
  94. package/dist/src/server/agent/timeline-append.js +0 -27
  95. package/dist/src/server/agent/timeline-append.js.map +0 -1
  96. package/dist/src/server/agent/timeline-projection.js +0 -215
  97. package/dist/src/server/agent/timeline-projection.js.map +0 -1
  98. package/dist/src/server/agent/tool-name-normalization.js +0 -45
  99. package/dist/src/server/agent/tool-name-normalization.js.map +0 -1
  100. package/dist/src/server/agent/tts-debug.js +0 -24
  101. package/dist/src/server/agent/tts-debug.js.map +0 -1
  102. package/dist/src/server/agent/tts-manager.js +0 -374
  103. package/dist/src/server/agent/tts-manager.js.map +0 -1
  104. package/dist/src/server/agent/wait-for-agent-tracker.js +0 -53
  105. package/dist/src/server/agent/wait-for-agent-tracker.js.map +0 -1
  106. package/dist/src/server/agent-attention-policy.js +0 -40
  107. package/dist/src/server/agent-attention-policy.js.map +0 -1
  108. package/dist/src/server/allowed-hosts.js +0 -94
  109. package/dist/src/server/allowed-hosts.js.map +0 -1
  110. package/dist/src/server/bootstrap.js +0 -620
  111. package/dist/src/server/bootstrap.js.map +0 -1
  112. package/dist/src/server/chat/chat-mentions.js +0 -71
  113. package/dist/src/server/chat/chat-mentions.js.map +0 -1
  114. package/dist/src/server/chat/chat-rpc-schemas.js +0 -103
  115. package/dist/src/server/chat/chat-rpc-schemas.js.map +0 -1
  116. package/dist/src/server/chat/chat-service.js +0 -330
  117. package/dist/src/server/chat/chat-service.js.map +0 -1
  118. package/dist/src/server/chat/chat-types.js +0 -22
  119. package/dist/src/server/chat/chat-types.js.map +0 -1
  120. package/dist/src/server/checkout-diff-manager.js +0 -272
  121. package/dist/src/server/checkout-diff-manager.js.map +0 -1
  122. package/dist/src/server/checkout-git-utils.js +0 -37
  123. package/dist/src/server/checkout-git-utils.js.map +0 -1
  124. package/dist/src/server/client-message-id.js +0 -12
  125. package/dist/src/server/client-message-id.js.map +0 -1
  126. package/dist/src/server/config.js +0 -73
  127. package/dist/src/server/config.js.map +0 -1
  128. package/dist/src/server/connection-offer.js +0 -59
  129. package/dist/src/server/connection-offer.js.map +0 -1
  130. package/dist/src/server/daemon-keypair.js +0 -40
  131. package/dist/src/server/daemon-keypair.js.map +0 -1
  132. package/dist/src/server/daemon-version.js +0 -22
  133. package/dist/src/server/daemon-version.js.map +0 -1
  134. package/dist/src/server/dictation/dictation-stream-manager.js +0 -571
  135. package/dist/src/server/dictation/dictation-stream-manager.js.map +0 -1
  136. package/dist/src/server/file-download/token-store.js +0 -40
  137. package/dist/src/server/file-download/token-store.js.map +0 -1
  138. package/dist/src/server/file-explorer/service.js +0 -180
  139. package/dist/src/server/file-explorer/service.js.map +0 -1
  140. package/dist/src/server/json-utils.js +0 -45
  141. package/dist/src/server/json-utils.js.map +0 -1
  142. package/dist/src/server/loop/rpc-schemas.js +0 -159
  143. package/dist/src/server/loop/rpc-schemas.js.map +0 -1
  144. package/dist/src/server/loop-service.js +0 -741
  145. package/dist/src/server/loop-service.js.map +0 -1
  146. package/dist/src/server/messages.js +0 -29
  147. package/dist/src/server/messages.js.map +0 -1
  148. package/dist/src/server/package-version.js +0 -46
  149. package/dist/src/server/package-version.js.map +0 -1
  150. package/dist/src/server/pairing-offer.js +0 -45
  151. package/dist/src/server/pairing-offer.js.map +0 -1
  152. package/dist/src/server/pairing-qr.js +0 -45
  153. package/dist/src/server/pairing-qr.js.map +0 -1
  154. package/dist/src/server/path-utils.js +0 -20
  155. package/dist/src/server/path-utils.js.map +0 -1
  156. package/dist/src/server/persisted-config.js +0 -265
  157. package/dist/src/server/persisted-config.js.map +0 -1
  158. package/dist/src/server/persistence-hooks.js +0 -60
  159. package/dist/src/server/persistence-hooks.js.map +0 -1
  160. package/dist/src/server/push/push-service.js +0 -68
  161. package/dist/src/server/push/push-service.js.map +0 -1
  162. package/dist/src/server/push/token-store.js +0 -70
  163. package/dist/src/server/push/token-store.js.map +0 -1
  164. package/dist/src/server/relay-transport.js +0 -461
  165. package/dist/src/server/relay-transport.js.map +0 -1
  166. package/dist/src/server/schedule/cron.js +0 -103
  167. package/dist/src/server/schedule/cron.js.map +0 -1
  168. package/dist/src/server/schedule/rpc-schemas.js +0 -112
  169. package/dist/src/server/schedule/rpc-schemas.js.map +0 -1
  170. package/dist/src/server/schedule/service.js +0 -397
  171. package/dist/src/server/schedule/service.js.map +0 -1
  172. package/dist/src/server/schedule/store.js +0 -56
  173. package/dist/src/server/schedule/store.js.map +0 -1
  174. package/dist/src/server/schedule/types.js +0 -73
  175. package/dist/src/server/schedule/types.js.map +0 -1
  176. package/dist/src/server/server-id.js +0 -63
  177. package/dist/src/server/server-id.js.map +0 -1
  178. package/dist/src/server/session.js +0 -6381
  179. package/dist/src/server/session.js.map +0 -1
  180. package/dist/src/server/speech/audio.js +0 -101
  181. package/dist/src/server/speech/audio.js.map +0 -1
  182. package/dist/src/server/speech/provider-resolver.js +0 -7
  183. package/dist/src/server/speech/provider-resolver.js.map +0 -1
  184. package/dist/src/server/speech/providers/local/config.js +0 -74
  185. package/dist/src/server/speech/providers/local/config.js.map +0 -1
  186. package/dist/src/server/speech/providers/local/models.js +0 -17
  187. package/dist/src/server/speech/providers/local/models.js.map +0 -1
  188. package/dist/src/server/speech/providers/local/pocket/pocket-tts-onnx.js +0 -436
  189. package/dist/src/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +0 -1
  190. package/dist/src/server/speech/providers/local/runtime.js +0 -238
  191. package/dist/src/server/speech/providers/local/runtime.js.map +0 -1
  192. package/dist/src/server/speech/providers/local/sherpa/model-catalog.js +0 -166
  193. package/dist/src/server/speech/providers/local/sherpa/model-catalog.js.map +0 -1
  194. package/dist/src/server/speech/providers/local/sherpa/model-downloader.js +0 -165
  195. package/dist/src/server/speech/providers/local/sherpa/model-downloader.js.map +0 -1
  196. package/dist/src/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +0 -73
  197. package/dist/src/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +0 -1
  198. package/dist/src/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +0 -84
  199. package/dist/src/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +0 -1
  200. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-loader.js +0 -11
  201. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-loader.js.map +0 -1
  202. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +0 -102
  203. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +0 -1
  204. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +0 -135
  205. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +0 -1
  206. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +0 -130
  207. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +0 -1
  208. package/dist/src/server/speech/providers/local/sherpa/sherpa-realtime-session.js +0 -110
  209. package/dist/src/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +0 -1
  210. package/dist/src/server/speech/providers/local/sherpa/sherpa-stt.js +0 -138
  211. package/dist/src/server/speech/providers/local/sherpa/sherpa-stt.js.map +0 -1
  212. package/dist/src/server/speech/providers/local/sherpa/sherpa-tts.js +0 -98
  213. package/dist/src/server/speech/providers/local/sherpa/sherpa-tts.js.map +0 -1
  214. package/dist/src/server/speech/providers/local/sherpa/silero-vad-provider.js +0 -23
  215. package/dist/src/server/speech/providers/local/sherpa/silero-vad-provider.js.map +0 -1
  216. package/dist/src/server/speech/providers/local/sherpa/silero-vad-session.js +0 -107
  217. package/dist/src/server/speech/providers/local/sherpa/silero-vad-session.js.map +0 -1
  218. package/dist/src/server/speech/providers/openai/config.js +0 -80
  219. package/dist/src/server/speech/providers/openai/config.js.map +0 -1
  220. package/dist/src/server/speech/providers/openai/realtime-transcription-session.js +0 -168
  221. package/dist/src/server/speech/providers/openai/realtime-transcription-session.js.map +0 -1
  222. package/dist/src/server/speech/providers/openai/runtime.js +0 -112
  223. package/dist/src/server/speech/providers/openai/runtime.js.map +0 -1
  224. package/dist/src/server/speech/providers/openai/stt.js +0 -206
  225. package/dist/src/server/speech/providers/openai/stt.js.map +0 -1
  226. package/dist/src/server/speech/providers/openai/tts.js +0 -46
  227. package/dist/src/server/speech/providers/openai/tts.js.map +0 -1
  228. package/dist/src/server/speech/speech-config-resolver.js +0 -102
  229. package/dist/src/server/speech/speech-config-resolver.js.map +0 -1
  230. package/dist/src/server/speech/speech-provider.js +0 -2
  231. package/dist/src/server/speech/speech-provider.js.map +0 -1
  232. package/dist/src/server/speech/speech-runtime.js +0 -530
  233. package/dist/src/server/speech/speech-runtime.js.map +0 -1
  234. package/dist/src/server/speech/speech-types.js +0 -8
  235. package/dist/src/server/speech/speech-types.js.map +0 -1
  236. package/dist/src/server/speech/turn-detection-provider.js +0 -2
  237. package/dist/src/server/speech/turn-detection-provider.js.map +0 -1
  238. package/dist/src/server/utils/diff-highlighter.js +0 -257
  239. package/dist/src/server/utils/diff-highlighter.js.map +0 -1
  240. package/dist/src/server/voice/fixed-duration-pcm-ring-buffer.js +0 -35
  241. package/dist/src/server/voice/fixed-duration-pcm-ring-buffer.js.map +0 -1
  242. package/dist/src/server/voice/voice-turn-controller.js +0 -159
  243. package/dist/src/server/voice/voice-turn-controller.js.map +0 -1
  244. package/dist/src/server/voice-config.js +0 -51
  245. package/dist/src/server/voice-config.js.map +0 -1
  246. package/dist/src/server/voice-mcp-bridge-command.js +0 -31
  247. package/dist/src/server/voice-mcp-bridge-command.js.map +0 -1
  248. package/dist/src/server/voice-mcp-bridge.js +0 -109
  249. package/dist/src/server/voice-mcp-bridge.js.map +0 -1
  250. package/dist/src/server/voice-permission-policy.js +0 -13
  251. package/dist/src/server/voice-permission-policy.js.map +0 -1
  252. package/dist/src/server/voice-types.js +0 -2
  253. package/dist/src/server/voice-types.js.map +0 -1
  254. package/dist/src/server/websocket-server.js +0 -1048
  255. package/dist/src/server/websocket-server.js.map +0 -1
  256. package/dist/src/server/workspace-registry-bootstrap.js +0 -98
  257. package/dist/src/server/workspace-registry-bootstrap.js.map +0 -1
  258. package/dist/src/server/workspace-registry-model.js +0 -175
  259. package/dist/src/server/workspace-registry-model.js.map +0 -1
  260. package/dist/src/server/workspace-registry.js +0 -151
  261. package/dist/src/server/workspace-registry.js.map +0 -1
  262. package/dist/src/server/worktree-bootstrap.js +0 -508
  263. package/dist/src/server/worktree-bootstrap.js.map +0 -1
  264. package/dist/src/shared/agent-attention-notification.js +0 -130
  265. package/dist/src/shared/agent-attention-notification.js.map +0 -1
  266. package/dist/src/shared/agent-lifecycle.js +0 -8
  267. package/dist/src/shared/agent-lifecycle.js.map +0 -1
  268. package/dist/src/shared/connection-offer.js +0 -17
  269. package/dist/src/shared/connection-offer.js.map +0 -1
  270. package/dist/src/shared/daemon-endpoints.js +0 -122
  271. package/dist/src/shared/daemon-endpoints.js.map +0 -1
  272. package/dist/src/shared/messages.js +0 -2107
  273. package/dist/src/shared/messages.js.map +0 -1
  274. package/dist/src/shared/path-utils.js +0 -16
  275. package/dist/src/shared/path-utils.js.map +0 -1
  276. package/dist/src/shared/terminal-stream-protocol.js +0 -99
  277. package/dist/src/shared/terminal-stream-protocol.js.map +0 -1
  278. package/dist/src/shared/tool-call-display.js +0 -122
  279. package/dist/src/shared/tool-call-display.js.map +0 -1
  280. package/dist/src/terminal/terminal-manager.js +0 -136
  281. package/dist/src/terminal/terminal-manager.js.map +0 -1
  282. package/dist/src/terminal/terminal.js +0 -333
  283. package/dist/src/terminal/terminal.js.map +0 -1
  284. package/dist/src/utils/checkout-git.js +0 -1518
  285. package/dist/src/utils/checkout-git.js.map +0 -1
  286. package/dist/src/utils/directory-suggestions.js +0 -671
  287. package/dist/src/utils/directory-suggestions.js.map +0 -1
  288. package/dist/src/utils/path.js +0 -15
  289. package/dist/src/utils/path.js.map +0 -1
  290. package/dist/src/utils/project-icon.js +0 -389
  291. package/dist/src/utils/project-icon.js.map +0 -1
  292. package/dist/src/utils/worktree-metadata.js +0 -116
  293. package/dist/src/utils/worktree-metadata.js.map +0 -1
  294. package/dist/src/utils/worktree.js +0 -744
  295. package/dist/src/utils/worktree.js.map +0 -1
@@ -1,754 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { z } from "zod";
3
- import { ensureValidJson } from "../json-utils.js";
4
- import { AgentPermissionRequestPayloadSchema, AgentPermissionResponseSchema, AgentSnapshotPayloadSchema, serializeAgentSnapshot, } from "../messages.js";
5
- import { toAgentPayload } from "./agent-projections.js";
6
- import { curateAgentActivity } from "./activity-curator.js";
7
- import { AGENT_PROVIDER_DEFINITIONS } from "./provider-registry.js";
8
- import { appendTimelineItemIfAgentKnown, emitLiveTimelineItemIfAgentKnown, } from "./timeline-append.js";
9
- import { WaitForAgentTracker } from "./wait-for-agent-tracker.js";
10
- import { scheduleAgentMetadataGeneration } from "./agent-metadata-generator.js";
11
- import { expandUserPath, resolvePathFromBase } from "../path-utils.js";
12
- import { createAgentWorktree, runAsyncWorktreeBootstrap } from "../worktree-bootstrap.js";
13
- const CLAUDE_TO_CODEX_MODE = {
14
- plan: "read-only",
15
- default: "auto",
16
- acceptEdits: "auto",
17
- bypassPermissions: "full-access",
18
- };
19
- const CODEX_TO_CLAUDE_MODE = {
20
- "read-only": "plan",
21
- auto: "default",
22
- "full-access": "bypassPermissions",
23
- };
24
- function mapModeAcrossProviders(sourceMode, sourceProvider, targetProvider) {
25
- if (sourceProvider === targetProvider) {
26
- return sourceMode;
27
- }
28
- if (sourceProvider === "claude" && targetProvider === "codex") {
29
- const mapped = CLAUDE_TO_CODEX_MODE[sourceMode];
30
- if (mapped) {
31
- return mapped;
32
- }
33
- return "auto";
34
- }
35
- if (sourceProvider === "codex" && targetProvider === "claude") {
36
- const mapped = CODEX_TO_CLAUDE_MODE[sourceMode];
37
- if (mapped) {
38
- return mapped;
39
- }
40
- return "default";
41
- }
42
- return sourceMode;
43
- }
44
- const AgentProviderEnum = z.enum(AGENT_PROVIDER_DEFINITIONS.map((definition) => definition.id));
45
- const AgentStatusEnum = z.enum(["initializing", "idle", "running", "error", "closed"]);
46
- // 50 seconds - surface friendly message before SDK tool timeout (~60s)
47
- const AGENT_WAIT_TIMEOUT_MS = 50000;
48
- function resolveChildAgentCwd(params) {
49
- const lockedCwd = params.lockedCwd?.trim();
50
- if (lockedCwd) {
51
- return expandUserPath(lockedCwd);
52
- }
53
- const requestedCwd = params.requestedCwd?.trim();
54
- if (!requestedCwd || !params.allowCustomCwd) {
55
- return params.parentCwd;
56
- }
57
- return resolvePathFromBase(params.parentCwd, requestedCwd);
58
- }
59
- /**
60
- * Wraps agentManager.waitForAgentEvent with a self-imposed timeout.
61
- * Returns a friendly message when timeout occurs, rather than letting
62
- * the SDK tool timeout trigger a generic "tool failed" error.
63
- */
64
- async function waitForAgentWithTimeout(agentManager, agentId, options) {
65
- const timeoutController = new AbortController();
66
- const combinedController = new AbortController();
67
- const timeoutId = setTimeout(() => {
68
- timeoutController.abort(new Error("wait timeout"));
69
- }, AGENT_WAIT_TIMEOUT_MS);
70
- const forwardAbort = (reason) => {
71
- if (!combinedController.signal.aborted) {
72
- combinedController.abort(reason);
73
- }
74
- };
75
- // Forward external signal abort
76
- if (options?.signal) {
77
- if (options.signal.aborted) {
78
- forwardAbort(options.signal.reason);
79
- }
80
- else {
81
- options.signal.addEventListener("abort", () => forwardAbort(options.signal.reason), {
82
- once: true,
83
- });
84
- }
85
- }
86
- // Forward timeout abort
87
- timeoutController.signal.addEventListener("abort", () => forwardAbort(timeoutController.signal.reason), { once: true });
88
- try {
89
- const result = await agentManager.waitForAgentEvent(agentId, {
90
- signal: combinedController.signal,
91
- waitForActive: options?.waitForActive,
92
- });
93
- return result;
94
- }
95
- catch (error) {
96
- if (error instanceof Error && error.message === "wait timeout") {
97
- const snapshot = agentManager.getAgent(agentId);
98
- const timeline = agentManager.getTimeline(agentId);
99
- const recentActivity = curateAgentActivity(timeline.slice(-5));
100
- const message = `Awaiting the agent timed out. This does not mean the agent failed - call wait_for_agent again to continue waiting.\n\nRecent activity:\n${recentActivity}`;
101
- return {
102
- status: snapshot?.lifecycle ?? "idle",
103
- permission: null,
104
- lastMessage: message,
105
- };
106
- }
107
- throw error;
108
- }
109
- finally {
110
- clearTimeout(timeoutId);
111
- }
112
- }
113
- function startAgentRun(agentManager, agentId, prompt, logger, options) {
114
- const shouldReplace = Boolean(options?.replaceRunning && agentManager.hasInFlightRun(agentId));
115
- const iterator = shouldReplace
116
- ? agentManager.replaceAgentRun(agentId, prompt)
117
- : agentManager.streamAgent(agentId, prompt);
118
- void (async () => {
119
- try {
120
- for await (const _ of iterator) {
121
- // Events are broadcast via AgentManager subscribers.
122
- }
123
- }
124
- catch (error) {
125
- logger.error({ err: error, agentId }, "Agent stream failed");
126
- }
127
- })();
128
- }
129
- function sanitizePermissionRequest(permission) {
130
- if (!permission) {
131
- return null;
132
- }
133
- const sanitized = { ...permission };
134
- if (sanitized.title === undefined) {
135
- delete sanitized.title;
136
- }
137
- if (sanitized.description === undefined) {
138
- delete sanitized.description;
139
- }
140
- if (sanitized.input === undefined) {
141
- delete sanitized.input;
142
- }
143
- if (sanitized.suggestions === undefined) {
144
- delete sanitized.suggestions;
145
- }
146
- if (sanitized.metadata === undefined) {
147
- delete sanitized.metadata;
148
- }
149
- return sanitized;
150
- }
151
- async function resolveAgentTitle(agentStorage, agentId, logger) {
152
- try {
153
- const record = await agentStorage.get(agentId);
154
- return record?.title ?? null;
155
- }
156
- catch (error) {
157
- logger.error({ err: error, agentId }, "Failed to load agent title");
158
- return null;
159
- }
160
- }
161
- async function serializeSnapshotWithMetadata(agentStorage, snapshot, logger) {
162
- const title = await resolveAgentTitle(agentStorage, snapshot.id, logger);
163
- return serializeAgentSnapshot(snapshot, { title });
164
- }
165
- export async function createAgentMcpServer(options) {
166
- const { agentManager, agentStorage, terminalManager, callerAgentId, resolveSpeakHandler, resolveCallerContext, logger, } = options;
167
- const childLogger = logger.child({ module: "agent", component: "mcp-server" });
168
- const waitTracker = new WaitForAgentTracker(logger);
169
- const callerContext = callerAgentId ? (resolveCallerContext?.(callerAgentId) ?? null) : null;
170
- const server = new McpServer({
171
- name: "agent-mcp",
172
- version: "2.0.0",
173
- });
174
- const agentToAgentInputSchema = {
175
- cwd: z
176
- .string()
177
- .optional()
178
- .describe("Optional working directory. Defaults to the caller agent working directory."),
179
- title: z
180
- .string()
181
- .trim()
182
- .min(1, "Title is required")
183
- .max(60, "Title must be 60 characters or fewer")
184
- .describe("Short descriptive title (<= 60 chars) summarizing the agent's focus."),
185
- agentType: AgentProviderEnum.optional().describe("Optional agent implementation to spawn. Defaults to 'claude'."),
186
- initialPrompt: z
187
- .string()
188
- .trim()
189
- .min(1, "initialPrompt is required")
190
- .describe("Required first task to run immediately after creation."),
191
- background: z
192
- .boolean()
193
- .optional()
194
- .default(false)
195
- .describe("Run agent in background. If false (default), waits for completion or permission request. If true, returns immediately."),
196
- };
197
- const topLevelInputSchema = {
198
- cwd: z
199
- .string()
200
- .describe("Required working directory for the agent (absolute, relative, or ~)."),
201
- title: z
202
- .string()
203
- .trim()
204
- .min(1, "Title is required")
205
- .max(60, "Title must be 60 characters or fewer")
206
- .describe("Short descriptive title (<= 60 chars) summarizing the agent's focus."),
207
- agentType: AgentProviderEnum.optional().describe("Optional agent implementation to spawn. Defaults to 'claude'."),
208
- initialPrompt: z
209
- .string()
210
- .trim()
211
- .min(1, "initialPrompt is required")
212
- .describe("Required first task to run immediately after creation."),
213
- initialMode: z.string().describe("Required session mode to configure before the first run."),
214
- worktreeName: z
215
- .string()
216
- .optional()
217
- .describe("Optional git worktree branch name (lowercase alphanumerics + hyphen)."),
218
- baseBranch: z
219
- .string()
220
- .optional()
221
- .describe("Required when worktreeName is set: the base branch to diff/merge against."),
222
- background: z
223
- .boolean()
224
- .optional()
225
- .default(false)
226
- .describe("Run agent in background. If false (default), waits for completion or permission request. If true, returns immediately."),
227
- };
228
- const createAgentInputSchema = callerAgentId ? agentToAgentInputSchema : topLevelInputSchema;
229
- const agentToAgentCreateAgentArgsSchema = z.object(agentToAgentInputSchema);
230
- const topLevelCreateAgentArgsSchema = z.object({
231
- ...topLevelInputSchema,
232
- initialMode: topLevelInputSchema.initialMode.optional(),
233
- });
234
- if (options.voiceOnly || options.enableVoiceTools || callerContext?.enableVoiceTools) {
235
- server.registerTool("speak", {
236
- title: "Speak",
237
- description: "Speak text to the user via daemon-managed voice output. Blocks until playback completes.",
238
- inputSchema: {
239
- text: z
240
- .string()
241
- .trim()
242
- .min(1, "text is required")
243
- .max(4000, "text must be 4000 characters or fewer"),
244
- },
245
- outputSchema: {
246
- ok: z.boolean(),
247
- },
248
- }, async (args, context) => {
249
- if (!callerAgentId) {
250
- throw new Error("speak is only available to agent-scoped MCP sessions");
251
- }
252
- const handler = resolveSpeakHandler?.(callerAgentId) ?? null;
253
- if (!handler) {
254
- throw new Error(`No speak handler registered for caller agent '${callerAgentId}'`);
255
- }
256
- await handler({
257
- text: args.text,
258
- callerAgentId,
259
- signal: context?.signal,
260
- });
261
- return {
262
- content: [],
263
- structuredContent: ensureValidJson({ ok: true }),
264
- };
265
- });
266
- }
267
- if (options.voiceOnly) {
268
- return server;
269
- }
270
- server.registerTool("create_agent", {
271
- title: "Create Agent",
272
- 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.",
273
- inputSchema: createAgentInputSchema,
274
- outputSchema: {
275
- agentId: z.string(),
276
- type: AgentProviderEnum,
277
- status: AgentStatusEnum,
278
- cwd: z.string(),
279
- currentModeId: z.string().nullable(),
280
- availableModes: z.array(z.object({
281
- id: z.string(),
282
- label: z.string(),
283
- description: z.string().nullable().optional(),
284
- })),
285
- lastMessage: z.string().nullable().optional(),
286
- permission: AgentPermissionRequestPayloadSchema.nullable().optional(),
287
- },
288
- }, async (args) => {
289
- let provider;
290
- let initialPrompt;
291
- let background = false;
292
- let normalizedTitle;
293
- let resolvedCwd;
294
- let resolvedMode;
295
- let worktreeConfig;
296
- if (callerAgentId) {
297
- const callerArgs = agentToAgentCreateAgentArgsSchema.parse(args);
298
- provider = callerArgs.agentType ?? "claude";
299
- initialPrompt = callerArgs.initialPrompt;
300
- background = callerArgs.background ?? false;
301
- normalizedTitle = callerArgs.title.trim();
302
- const parentAgent = agentManager.getAgent(callerAgentId);
303
- if (!parentAgent) {
304
- throw new Error(`Parent agent ${callerAgentId} not found`);
305
- }
306
- resolvedCwd = resolveChildAgentCwd({
307
- parentCwd: parentAgent.cwd,
308
- requestedCwd: callerArgs.cwd,
309
- lockedCwd: callerContext?.lockedCwd,
310
- allowCustomCwd: callerContext?.allowCustomCwd ?? true,
311
- });
312
- const parentMode = parentAgent.currentModeId;
313
- if (parentMode) {
314
- resolvedMode = mapModeAcrossProviders(parentMode, parentAgent.provider, provider);
315
- }
316
- }
317
- else {
318
- const topLevelArgs = topLevelCreateAgentArgsSchema.parse(args);
319
- provider = topLevelArgs.agentType ?? "claude";
320
- initialPrompt = topLevelArgs.initialPrompt;
321
- background = topLevelArgs.background ?? false;
322
- normalizedTitle = topLevelArgs.title.trim();
323
- const { cwd, initialMode, worktreeName, baseBranch } = topLevelArgs;
324
- resolvedCwd = expandUserPath(cwd);
325
- if (worktreeName) {
326
- if (!baseBranch) {
327
- throw new Error("baseBranch is required when creating a worktree");
328
- }
329
- const worktree = await createAgentWorktree({
330
- branchName: worktreeName,
331
- cwd: resolvedCwd,
332
- baseBranch,
333
- worktreeSlug: worktreeName,
334
- paseoHome: options.paseoHome,
335
- });
336
- resolvedCwd = worktree.worktreePath;
337
- worktreeConfig = worktree;
338
- }
339
- resolvedMode = initialMode;
340
- }
341
- const childAgentDefaultLabels = callerAgentId && callerContext?.childAgentDefaultLabels
342
- ? callerContext.childAgentDefaultLabels
343
- : undefined;
344
- const snapshot = await agentManager.createAgent({
345
- provider,
346
- cwd: resolvedCwd,
347
- modeId: resolvedMode,
348
- title: normalizedTitle ?? undefined,
349
- }, undefined, childAgentDefaultLabels ? { labels: childAgentDefaultLabels } : undefined);
350
- if (worktreeConfig) {
351
- void runAsyncWorktreeBootstrap({
352
- agentId: snapshot.id,
353
- worktree: worktreeConfig,
354
- terminalManager: terminalManager ?? null,
355
- appendTimelineItem: (item) => appendTimelineItemIfAgentKnown({
356
- agentManager,
357
- agentId: snapshot.id,
358
- item,
359
- }),
360
- emitLiveTimelineItem: (item) => emitLiveTimelineItemIfAgentKnown({
361
- agentManager,
362
- agentId: snapshot.id,
363
- item,
364
- }),
365
- logger: childLogger,
366
- });
367
- }
368
- const trimmedPrompt = initialPrompt.trim();
369
- scheduleAgentMetadataGeneration({
370
- agentManager,
371
- agentId: snapshot.id,
372
- cwd: snapshot.cwd,
373
- initialPrompt: trimmedPrompt,
374
- explicitTitle: snapshot.config.title,
375
- paseoHome: options.paseoHome,
376
- logger: childLogger,
377
- });
378
- try {
379
- agentManager.recordUserMessage(snapshot.id, trimmedPrompt, {
380
- emitState: false,
381
- });
382
- }
383
- catch (error) {
384
- childLogger.error({ err: error, agentId: snapshot.id }, "Failed to record initial prompt");
385
- }
386
- try {
387
- startAgentRun(agentManager, snapshot.id, trimmedPrompt, childLogger);
388
- // If not running in background, wait for completion
389
- if (!background) {
390
- const result = await waitForAgentWithTimeout(agentManager, snapshot.id, {
391
- waitForActive: true,
392
- });
393
- const responseData = {
394
- agentId: snapshot.id,
395
- type: provider,
396
- status: result.status,
397
- cwd: snapshot.cwd,
398
- currentModeId: snapshot.currentModeId,
399
- availableModes: snapshot.availableModes,
400
- lastMessage: result.lastMessage,
401
- permission: sanitizePermissionRequest(result.permission),
402
- };
403
- const validJson = ensureValidJson(responseData);
404
- const response = {
405
- content: [],
406
- structuredContent: validJson,
407
- };
408
- return response;
409
- }
410
- }
411
- catch (error) {
412
- childLogger.error({ err: error, agentId: snapshot.id }, "Failed to run initial prompt");
413
- }
414
- // Return immediately if background=true
415
- const response = {
416
- content: [],
417
- structuredContent: ensureValidJson({
418
- agentId: snapshot.id,
419
- type: provider,
420
- status: snapshot.lifecycle,
421
- cwd: snapshot.cwd,
422
- currentModeId: snapshot.currentModeId,
423
- availableModes: snapshot.availableModes,
424
- lastMessage: null,
425
- permission: null,
426
- }),
427
- };
428
- return response;
429
- });
430
- server.registerTool("wait_for_agent", {
431
- title: "Wait For Agent",
432
- description: "Block until the agent requests permission or the current run completes. Returns the pending permission (if any) and recent activity summary.",
433
- inputSchema: {
434
- agentId: z.string().describe("Agent identifier returned by the create_agent tool"),
435
- },
436
- outputSchema: {
437
- agentId: z.string(),
438
- status: AgentStatusEnum,
439
- permission: AgentPermissionRequestPayloadSchema.nullable(),
440
- lastMessage: z.string().nullable(),
441
- },
442
- }, async ({ agentId }, { signal }) => {
443
- const abortController = new AbortController();
444
- const cleanupFns = [];
445
- const cleanup = () => {
446
- while (cleanupFns.length) {
447
- const fn = cleanupFns.pop();
448
- try {
449
- fn?.();
450
- }
451
- catch {
452
- // ignore cleanup errors
453
- }
454
- }
455
- };
456
- const forwardExternalAbort = () => {
457
- if (!abortController.signal.aborted) {
458
- const reason = signal?.reason ?? new Error("wait_for_agent aborted");
459
- abortController.abort(reason);
460
- }
461
- };
462
- if (signal) {
463
- if (signal.aborted) {
464
- forwardExternalAbort();
465
- }
466
- else {
467
- signal.addEventListener("abort", forwardExternalAbort, { once: true });
468
- cleanupFns.push(() => signal.removeEventListener("abort", forwardExternalAbort));
469
- }
470
- }
471
- const unregister = waitTracker.register(agentId, (reason) => {
472
- if (!abortController.signal.aborted) {
473
- abortController.abort(new Error(reason ?? "wait_for_agent cancelled"));
474
- }
475
- });
476
- cleanupFns.push(unregister);
477
- try {
478
- const result = await waitForAgentWithTimeout(agentManager, agentId, {
479
- signal: abortController.signal,
480
- });
481
- const validJson = ensureValidJson({
482
- agentId,
483
- status: result.status,
484
- permission: sanitizePermissionRequest(result.permission),
485
- lastMessage: result.lastMessage,
486
- });
487
- const response = {
488
- content: [],
489
- structuredContent: validJson,
490
- };
491
- return response;
492
- }
493
- finally {
494
- cleanup();
495
- }
496
- });
497
- server.registerTool("send_agent_prompt", {
498
- title: "Send Agent Prompt",
499
- description: "Send a task to a running agent. Returns immediately after the agent begins processing.",
500
- inputSchema: {
501
- agentId: z.string(),
502
- prompt: z.string(),
503
- sessionMode: z
504
- .string()
505
- .optional()
506
- .describe("Optional mode to set before running the prompt."),
507
- background: z
508
- .boolean()
509
- .optional()
510
- .default(false)
511
- .describe("Run agent in background. If false (default), waits for completion or permission request. If true, returns immediately."),
512
- },
513
- outputSchema: {
514
- success: z.boolean(),
515
- status: AgentStatusEnum,
516
- lastMessage: z.string().nullable().optional(),
517
- permission: AgentPermissionRequestPayloadSchema.nullable().optional(),
518
- },
519
- }, async ({ agentId, prompt, sessionMode, background = false }) => {
520
- const snapshot = agentManager.getAgent(agentId);
521
- if (!snapshot) {
522
- throw new Error(`Agent ${agentId} not found`);
523
- }
524
- if (agentManager.hasInFlightRun(agentId)) {
525
- waitTracker.cancel(agentId, "Agent run interrupted by new prompt");
526
- }
527
- if (sessionMode) {
528
- await agentManager.setAgentMode(agentId, sessionMode);
529
- }
530
- try {
531
- agentManager.recordUserMessage(agentId, prompt, {
532
- emitState: false,
533
- });
534
- }
535
- catch (error) {
536
- childLogger.error({ err: error, agentId }, "Failed to record user message");
537
- }
538
- startAgentRun(agentManager, agentId, prompt, childLogger, {
539
- replaceRunning: true,
540
- });
541
- // If not running in background, wait for completion
542
- if (!background) {
543
- const result = await waitForAgentWithTimeout(agentManager, agentId, {
544
- waitForActive: true,
545
- });
546
- const responseData = {
547
- success: true,
548
- status: result.status,
549
- lastMessage: result.lastMessage,
550
- permission: sanitizePermissionRequest(result.permission),
551
- };
552
- const validJson = ensureValidJson(responseData);
553
- const response = {
554
- content: [],
555
- structuredContent: validJson,
556
- };
557
- return response;
558
- }
559
- // Return immediately if background=true
560
- // Re-fetch snapshot since the state may have changed
561
- const currentSnapshot = agentManager.getAgent(agentId);
562
- const responseData = {
563
- success: true,
564
- status: currentSnapshot?.lifecycle ?? "idle",
565
- lastMessage: null,
566
- permission: null,
567
- };
568
- const validJson = ensureValidJson(responseData);
569
- const response = {
570
- content: [],
571
- structuredContent: validJson,
572
- };
573
- return response;
574
- });
575
- server.registerTool("get_agent_status", {
576
- title: "Get Agent Status",
577
- description: "Return the latest snapshot for an agent, including lifecycle state, capabilities, and pending permissions.",
578
- inputSchema: {
579
- agentId: z.string(),
580
- },
581
- outputSchema: {
582
- status: AgentStatusEnum,
583
- snapshot: AgentSnapshotPayloadSchema,
584
- },
585
- }, async ({ agentId }) => {
586
- const snapshot = agentManager.getAgent(agentId);
587
- if (!snapshot) {
588
- throw new Error(`Agent ${agentId} not found`);
589
- }
590
- const structuredSnapshot = await serializeSnapshotWithMetadata(agentStorage, snapshot, childLogger);
591
- return {
592
- content: [],
593
- structuredContent: ensureValidJson({
594
- status: snapshot.lifecycle,
595
- snapshot: structuredSnapshot,
596
- }),
597
- };
598
- });
599
- server.registerTool("list_agents", {
600
- title: "List Agents",
601
- description: "List all live agents managed by the server.",
602
- inputSchema: {},
603
- outputSchema: {
604
- agents: z.array(AgentSnapshotPayloadSchema),
605
- },
606
- }, async () => {
607
- const snapshots = agentManager.listAgents();
608
- const agents = await Promise.all(snapshots.map((snapshot) => serializeSnapshotWithMetadata(agentStorage, snapshot, childLogger)));
609
- return {
610
- content: [],
611
- structuredContent: ensureValidJson({ agents }),
612
- };
613
- });
614
- server.registerTool("cancel_agent", {
615
- title: "Cancel Agent Run",
616
- description: "Abort the agent's current run but keep the agent alive for future tasks.",
617
- inputSchema: {
618
- agentId: z.string(),
619
- },
620
- outputSchema: {
621
- success: z.boolean(),
622
- },
623
- }, async ({ agentId }) => {
624
- const success = await agentManager.cancelAgentRun(agentId);
625
- if (success) {
626
- waitTracker.cancel(agentId, "Agent run cancelled");
627
- }
628
- return {
629
- content: [],
630
- structuredContent: ensureValidJson({ success }),
631
- };
632
- });
633
- server.registerTool("kill_agent", {
634
- title: "Kill Agent",
635
- description: "Terminate an agent session permanently.",
636
- inputSchema: {
637
- agentId: z.string(),
638
- },
639
- outputSchema: {
640
- success: z.boolean(),
641
- },
642
- }, async ({ agentId }) => {
643
- await agentManager.closeAgent(agentId);
644
- waitTracker.cancel(agentId, "Agent terminated");
645
- return {
646
- content: [],
647
- structuredContent: ensureValidJson({ success: true }),
648
- };
649
- });
650
- server.registerTool("get_agent_activity", {
651
- title: "Get Agent Activity",
652
- description: "Return recent agent timeline entries as a curated summary.",
653
- inputSchema: {
654
- agentId: z.string(),
655
- limit: z
656
- .number()
657
- .optional()
658
- .describe("Optional limit for number of activities to include (most recent first)."),
659
- },
660
- outputSchema: {
661
- agentId: z.string(),
662
- updateCount: z.number(),
663
- currentModeId: z.string().nullable(),
664
- content: z.string(),
665
- },
666
- }, async ({ agentId, limit }) => {
667
- const timeline = agentManager.getTimeline(agentId);
668
- const snapshot = agentManager.getAgent(agentId);
669
- const activitiesToCurate = limit ? timeline.slice(-limit) : timeline;
670
- const curatedContent = curateAgentActivity(activitiesToCurate);
671
- const totalCount = timeline.length;
672
- const shownCount = activitiesToCurate.length;
673
- let countHeader;
674
- if (limit && shownCount < totalCount) {
675
- countHeader = `Showing ${shownCount} of ${totalCount} ${totalCount === 1 ? "activity" : "activities"} (limited to ${limit})`;
676
- }
677
- else {
678
- countHeader = `Showing all ${totalCount} ${totalCount === 1 ? "activity" : "activities"}`;
679
- }
680
- const contentWithCount = `${countHeader}\n\n${curatedContent}`;
681
- return {
682
- content: [],
683
- structuredContent: ensureValidJson({
684
- agentId,
685
- updateCount: timeline.length,
686
- currentModeId: snapshot?.currentModeId ?? null,
687
- content: contentWithCount,
688
- }),
689
- };
690
- });
691
- server.registerTool("set_agent_mode", {
692
- title: "Set Agent Session Mode",
693
- description: "Switch the agent's session mode (plan, bypassPermissions, read-only, auto, etc.).",
694
- inputSchema: {
695
- agentId: z.string(),
696
- modeId: z.string(),
697
- },
698
- outputSchema: {
699
- success: z.boolean(),
700
- newMode: z.string(),
701
- },
702
- }, async ({ agentId, modeId }) => {
703
- await agentManager.setAgentMode(agentId, modeId);
704
- return {
705
- content: [],
706
- structuredContent: ensureValidJson({ success: true, newMode: modeId }),
707
- };
708
- });
709
- server.registerTool("list_pending_permissions", {
710
- title: "List Pending Permissions",
711
- description: "Return all pending permission requests across all agents with the normalized payloads.",
712
- inputSchema: {},
713
- outputSchema: {
714
- permissions: z.array(z.object({
715
- agentId: z.string(),
716
- status: AgentStatusEnum,
717
- request: AgentPermissionRequestPayloadSchema,
718
- })),
719
- },
720
- }, async () => {
721
- const permissions = agentManager.listAgents().flatMap((agent) => {
722
- const payload = toAgentPayload(agent);
723
- return payload.pendingPermissions.map((request) => ({
724
- agentId: agent.id,
725
- status: payload.status,
726
- request,
727
- }));
728
- });
729
- return {
730
- content: [],
731
- structuredContent: ensureValidJson({ permissions }),
732
- };
733
- });
734
- server.registerTool("respond_to_permission", {
735
- title: "Respond To Permission",
736
- description: "Approve or deny a pending permission request with an AgentManager-compatible response payload.",
737
- inputSchema: {
738
- agentId: z.string(),
739
- requestId: z.string(),
740
- response: AgentPermissionResponseSchema,
741
- },
742
- outputSchema: {
743
- success: z.boolean(),
744
- },
745
- }, async ({ agentId, requestId, response }) => {
746
- await agentManager.respondToPermission(agentId, requestId, response);
747
- return {
748
- content: [],
749
- structuredContent: ensureValidJson({ success: true }),
750
- };
751
- });
752
- return server;
753
- }
754
- //# sourceMappingURL=mcp-server.js.map