@getpaseo/server 0.1.69 → 0.1.71

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 (360) hide show
  1. package/dist/server/client/daemon-client-runtime-metrics.js.map +1 -1
  2. package/dist/server/client/daemon-client-websocket-transport.js.map +1 -1
  3. package/dist/server/client/daemon-client.d.ts +57 -4
  4. package/dist/server/client/daemon-client.d.ts.map +1 -1
  5. package/dist/server/client/daemon-client.js +78 -3
  6. package/dist/server/client/daemon-client.js.map +1 -1
  7. package/dist/server/server/agent/agent-manager.d.ts +25 -4
  8. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  9. package/dist/server/server/agent/agent-manager.js +231 -26
  10. package/dist/server/server/agent/agent-manager.js.map +1 -1
  11. package/dist/server/server/agent/agent-metadata-generator.d.ts +2 -0
  12. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
  13. package/dist/server/server/agent/agent-metadata-generator.js +16 -7
  14. package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
  15. package/dist/server/server/agent/agent-projections.d.ts +6 -2
  16. package/dist/server/server/agent/agent-projections.d.ts.map +1 -1
  17. package/dist/server/server/agent/agent-projections.js +32 -0
  18. package/dist/server/server/agent/agent-projections.js.map +1 -1
  19. package/dist/server/server/agent/agent-prompt.d.ts +72 -0
  20. package/dist/server/server/agent/agent-prompt.d.ts.map +1 -0
  21. package/dist/server/server/agent/agent-prompt.js +169 -0
  22. package/dist/server/server/agent/agent-prompt.js.map +1 -0
  23. package/dist/server/server/agent/agent-response-loop.js.map +1 -1
  24. package/dist/server/server/agent/agent-sdk-types.d.ts +27 -2
  25. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  26. package/dist/server/server/agent/agent-stream-coalescer.d.ts +1 -1
  27. package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -1
  28. package/dist/server/server/agent/agent-timeline-store.js +1 -1
  29. package/dist/server/server/agent/agent-timeline-store.js.map +1 -1
  30. package/dist/server/server/agent/create-agent-mode.d.ts +16 -0
  31. package/dist/server/server/agent/create-agent-mode.d.ts.map +1 -0
  32. package/dist/server/server/agent/create-agent-mode.js +26 -0
  33. package/dist/server/server/agent/create-agent-mode.js.map +1 -0
  34. package/dist/server/server/agent/import-sessions.d.ts +33 -0
  35. package/dist/server/server/agent/import-sessions.d.ts.map +1 -0
  36. package/dist/server/server/agent/import-sessions.js +107 -0
  37. package/dist/server/server/agent/import-sessions.js.map +1 -0
  38. package/dist/server/server/agent/mcp-server.d.ts +1 -1
  39. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  40. package/dist/server/server/agent/mcp-server.js +61 -14
  41. package/dist/server/server/agent/mcp-server.js.map +1 -1
  42. package/dist/server/server/agent/mcp-shared.d.ts +1 -43
  43. package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
  44. package/dist/server/server/agent/mcp-shared.js +0 -138
  45. package/dist/server/server/agent/mcp-shared.js.map +1 -1
  46. package/dist/server/server/agent/pcm16-resampler.js.map +1 -1
  47. package/dist/server/server/agent/prompt-attachments.d.ts.map +1 -1
  48. package/dist/server/server/agent/prompt-attachments.js +2 -0
  49. package/dist/server/server/agent/prompt-attachments.js.map +1 -1
  50. package/dist/server/server/agent/provider-launch-config.js.map +1 -1
  51. package/dist/server/server/agent/provider-manifest.d.ts +4 -1
  52. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
  53. package/dist/server/server/agent/provider-manifest.js +11 -0
  54. package/dist/server/server/agent/provider-manifest.js.map +1 -1
  55. package/dist/server/server/agent/provider-registry.d.ts +7 -0
  56. package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
  57. package/dist/server/server/agent/provider-registry.js +13 -3
  58. package/dist/server/server/agent/provider-registry.js.map +1 -1
  59. package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
  60. package/dist/server/server/agent/providers/acp-agent.d.ts +2 -1
  61. package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
  62. package/dist/server/server/agent/providers/acp-agent.js +35 -17
  63. package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
  64. package/dist/server/server/agent/providers/{claude-agent.d.ts → claude/agent.d.ts} +9 -6
  65. package/dist/server/server/agent/providers/claude/agent.d.ts.map +1 -0
  66. package/dist/server/server/agent/providers/{claude-agent.js → claude/agent.js} +185 -152
  67. package/dist/server/server/agent/providers/claude/agent.js.map +1 -0
  68. package/dist/server/server/agent/providers/claude/{claude-models.d.ts → models.d.ts} +1 -1
  69. package/dist/server/server/agent/providers/claude/models.d.ts.map +1 -0
  70. package/dist/server/server/agent/providers/claude/{claude-models.js → models.js} +8 -1
  71. package/dist/server/server/agent/providers/claude/models.js.map +1 -0
  72. package/dist/server/server/agent/providers/claude/query.d.ts +14 -0
  73. package/dist/server/server/agent/providers/claude/query.d.ts.map +1 -0
  74. package/dist/server/server/agent/providers/claude/query.js +84 -0
  75. package/dist/server/server/agent/providers/claude/query.js.map +1 -0
  76. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
  77. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +19 -3
  78. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  79. package/dist/server/server/agent/providers/codex-app-server-agent.js +447 -93
  80. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  81. package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -1
  82. package/dist/server/server/agent/providers/diagnostic-utils.js +4 -0
  83. package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -1
  84. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +1 -1
  85. package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -1
  86. package/dist/server/server/agent/providers/generic-acp-agent.js +0 -3
  87. package/dist/server/server/agent/providers/generic-acp-agent.js.map +1 -1
  88. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -1
  89. package/dist/server/server/agent/providers/mock-load-test-agent.js +6 -2
  90. package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -1
  91. package/dist/server/server/agent/providers/opencode-agent.d.ts +3 -2
  92. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  93. package/dist/server/server/agent/providers/opencode-agent.js +204 -31
  94. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  95. package/dist/server/server/agent/providers/provider-image-output.d.ts +20 -0
  96. package/dist/server/server/agent/providers/provider-image-output.d.ts.map +1 -0
  97. package/dist/server/server/agent/providers/provider-image-output.js +51 -0
  98. package/dist/server/server/agent/providers/provider-image-output.js.map +1 -0
  99. package/dist/server/server/agent/providers/provider-runner.d.ts +3 -3
  100. package/dist/server/server/agent/providers/provider-runner.d.ts.map +1 -1
  101. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -1
  102. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +7 -7
  103. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  104. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +12 -18
  105. package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -1
  106. package/dist/server/server/agent/stt-manager.d.ts +1 -0
  107. package/dist/server/server/agent/stt-manager.d.ts.map +1 -1
  108. package/dist/server/server/agent/stt-manager.js +3 -0
  109. package/dist/server/server/agent/stt-manager.js.map +1 -1
  110. package/dist/server/server/agent/tool-name-normalization.js.map +1 -1
  111. package/dist/server/server/agent/tts-manager.js.map +1 -1
  112. package/dist/server/server/bootstrap.d.ts +1 -0
  113. package/dist/server/server/bootstrap.d.ts.map +1 -1
  114. package/dist/server/server/bootstrap.js +3 -1
  115. package/dist/server/server/bootstrap.js.map +1 -1
  116. package/dist/server/server/chat/chat-mentions.d.ts +24 -8
  117. package/dist/server/server/chat/chat-mentions.d.ts.map +1 -1
  118. package/dist/server/server/chat/chat-mentions.js +77 -35
  119. package/dist/server/server/chat/chat-mentions.js.map +1 -1
  120. package/dist/server/server/chat/chat-service.d.ts +4 -0
  121. package/dist/server/server/chat/chat-service.d.ts.map +1 -1
  122. package/dist/server/server/chat/chat-service.js +9 -0
  123. package/dist/server/server/chat/chat-service.js.map +1 -1
  124. package/dist/server/server/config.d.ts +1 -0
  125. package/dist/server/server/config.d.ts.map +1 -1
  126. package/dist/server/server/config.js +7 -1
  127. package/dist/server/server/config.js.map +1 -1
  128. package/dist/server/server/connection-offer.d.ts +1 -0
  129. package/dist/server/server/connection-offer.d.ts.map +1 -1
  130. package/dist/server/server/daemon-config-store.d.ts.map +1 -1
  131. package/dist/server/server/daemon-config-store.js +2 -6
  132. package/dist/server/server/daemon-config-store.js.map +1 -1
  133. package/dist/server/server/daemon-keypair.d.ts.map +1 -1
  134. package/dist/server/server/daemon-keypair.js +4 -2
  135. package/dist/server/server/daemon-keypair.js.map +1 -1
  136. package/dist/server/server/daemon-worker.js +3 -0
  137. package/dist/server/server/daemon-worker.js.map +1 -1
  138. package/dist/server/server/editor-targets.js.map +1 -1
  139. package/dist/server/server/exports.d.ts +1 -0
  140. package/dist/server/server/exports.d.ts.map +1 -1
  141. package/dist/server/server/exports.js +1 -0
  142. package/dist/server/server/exports.js.map +1 -1
  143. package/dist/server/server/json-utils.js.map +1 -1
  144. package/dist/server/server/logger.js.map +1 -1
  145. package/dist/server/server/loop/rpc-schemas.d.ts +68 -0
  146. package/dist/server/server/loop/rpc-schemas.d.ts.map +1 -1
  147. package/dist/server/server/loop/rpc-schemas.js +4 -0
  148. package/dist/server/server/loop/rpc-schemas.js.map +1 -1
  149. package/dist/server/server/loop-service.d.ts +8 -0
  150. package/dist/server/server/loop-service.d.ts.map +1 -1
  151. package/dist/server/server/loop-service.js +11 -2
  152. package/dist/server/server/loop-service.js.map +1 -1
  153. package/dist/server/server/package-version.d.ts +12 -0
  154. package/dist/server/server/package-version.d.ts.map +1 -1
  155. package/dist/server/server/package-version.js +13 -1
  156. package/dist/server/server/package-version.js.map +1 -1
  157. package/dist/server/server/pairing-offer.d.ts +1 -0
  158. package/dist/server/server/pairing-offer.d.ts.map +1 -1
  159. package/dist/server/server/pairing-offer.js +2 -1
  160. package/dist/server/server/pairing-offer.js.map +1 -1
  161. package/dist/server/server/pairing-qr.js +1 -1
  162. package/dist/server/server/pairing-qr.js.map +1 -1
  163. package/dist/server/server/paseo-env.d.ts +7 -3
  164. package/dist/server/server/paseo-env.d.ts.map +1 -1
  165. package/dist/server/server/paseo-env.js +16 -33
  166. package/dist/server/server/paseo-env.js.map +1 -1
  167. package/dist/server/server/paseo-home.js +2 -2
  168. package/dist/server/server/paseo-home.js.map +1 -1
  169. package/dist/server/server/persisted-config.d.ts +9 -0
  170. package/dist/server/server/persisted-config.d.ts.map +1 -1
  171. package/dist/server/server/persisted-config.js +6 -4
  172. package/dist/server/server/persisted-config.js.map +1 -1
  173. package/dist/server/server/persistence-hooks.js.map +1 -1
  174. package/dist/server/server/pid-lock.d.ts +21 -4
  175. package/dist/server/server/pid-lock.d.ts.map +1 -1
  176. package/dist/server/server/pid-lock.js +30 -8
  177. package/dist/server/server/pid-lock.js.map +1 -1
  178. package/dist/server/server/private-files.d.ts +7 -0
  179. package/dist/server/server/private-files.d.ts.map +1 -0
  180. package/dist/server/server/private-files.js +42 -0
  181. package/dist/server/server/private-files.js.map +1 -0
  182. package/dist/server/server/push/token-store.d.ts.map +1 -1
  183. package/dist/server/server/push/token-store.js +4 -6
  184. package/dist/server/server/push/token-store.js.map +1 -1
  185. package/dist/server/server/relay-transport.d.ts +2 -1
  186. package/dist/server/server/relay-transport.d.ts.map +1 -1
  187. package/dist/server/server/relay-transport.js +8 -5
  188. package/dist/server/server/relay-transport.js.map +1 -1
  189. package/dist/server/server/schedule/rpc-schemas.d.ts +1136 -0
  190. package/dist/server/server/schedule/rpc-schemas.d.ts.map +1 -1
  191. package/dist/server/server/schedule/rpc-schemas.js +39 -0
  192. package/dist/server/server/schedule/rpc-schemas.js.map +1 -1
  193. package/dist/server/server/schedule/service.d.ts +4 -2
  194. package/dist/server/server/schedule/service.d.ts.map +1 -1
  195. package/dist/server/server/schedule/service.js +106 -16
  196. package/dist/server/server/schedule/service.js.map +1 -1
  197. package/dist/server/server/schedule/types.d.ts +16 -0
  198. package/dist/server/server/schedule/types.d.ts.map +1 -1
  199. package/dist/server/server/script-health-monitor.js.map +1 -1
  200. package/dist/server/server/server-id.d.ts.map +1 -1
  201. package/dist/server/server/server-id.js +8 -3
  202. package/dist/server/server/server-id.js.map +1 -1
  203. package/dist/server/server/session.d.ts +5 -4
  204. package/dist/server/server/session.d.ts.map +1 -1
  205. package/dist/server/server/session.js +318 -149
  206. package/dist/server/server/session.js.map +1 -1
  207. package/dist/server/server/speech/audio.js.map +1 -1
  208. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -1
  209. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +52 -52
  210. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -1
  211. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -1
  212. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +9 -3
  213. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -1
  214. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -1
  215. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +12 -10
  216. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -1
  217. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +2 -2
  218. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -1
  219. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +1 -1
  220. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -1
  221. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -1
  222. package/dist/server/server/voice/voice-turn-controller.d.ts +16 -13
  223. package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -1
  224. package/dist/server/server/voice/voice-turn-controller.js +303 -71
  225. package/dist/server/server/voice/voice-turn-controller.js.map +1 -1
  226. package/dist/server/server/voice-config.js +1 -1
  227. package/dist/server/server/voice-config.js.map +1 -1
  228. package/dist/server/server/websocket-server.js.map +1 -1
  229. package/dist/server/server/workspace-directory.d.ts.map +1 -1
  230. package/dist/server/server/workspace-directory.js +4 -2
  231. package/dist/server/server/workspace-directory.js.map +1 -1
  232. package/dist/server/server/workspace-git-metadata.d.ts.map +1 -1
  233. package/dist/server/server/workspace-git-metadata.js +12 -5
  234. package/dist/server/server/workspace-git-metadata.js.map +1 -1
  235. package/dist/server/server/workspace-git-service.d.ts +4 -1
  236. package/dist/server/server/workspace-git-service.d.ts.map +1 -1
  237. package/dist/server/server/workspace-git-service.js +50 -2
  238. package/dist/server/server/workspace-git-service.js.map +1 -1
  239. package/dist/server/server/workspace-registry-model.d.ts.map +1 -1
  240. package/dist/server/server/workspace-registry-model.js +10 -3
  241. package/dist/server/server/workspace-registry-model.js.map +1 -1
  242. package/dist/server/server/worktree-branch-name-generator.d.ts +2 -0
  243. package/dist/server/server/worktree-branch-name-generator.d.ts.map +1 -1
  244. package/dist/server/server/worktree-branch-name-generator.js +18 -11
  245. package/dist/server/server/worktree-branch-name-generator.js.map +1 -1
  246. package/dist/server/server/worktree-session.js +1 -1
  247. package/dist/server/server/worktree-session.js.map +1 -1
  248. package/dist/server/services/github-service.d.ts +13 -0
  249. package/dist/server/services/github-service.d.ts.map +1 -1
  250. package/dist/server/services/github-service.js +21 -4
  251. package/dist/server/services/github-service.js.map +1 -1
  252. package/dist/server/shared/agent-labels.d.ts +2 -0
  253. package/dist/server/shared/agent-labels.d.ts.map +1 -0
  254. package/dist/server/shared/agent-labels.js +2 -0
  255. package/dist/server/shared/agent-labels.js.map +1 -0
  256. package/dist/server/shared/connection-offer.d.ts +10 -0
  257. package/dist/server/shared/connection-offer.d.ts.map +1 -1
  258. package/dist/server/shared/connection-offer.js +1 -0
  259. package/dist/server/shared/connection-offer.js.map +1 -1
  260. package/dist/server/shared/daemon-endpoints.d.ts +4 -0
  261. package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
  262. package/dist/server/shared/daemon-endpoints.js +6 -1
  263. package/dist/server/shared/daemon-endpoints.js.map +1 -1
  264. package/dist/server/shared/error-utils.d.ts +11 -0
  265. package/dist/server/shared/error-utils.d.ts.map +1 -0
  266. package/dist/server/shared/error-utils.js +27 -0
  267. package/dist/server/shared/error-utils.js.map +1 -0
  268. package/dist/server/shared/importable-providers.d.ts +7 -0
  269. package/dist/server/shared/importable-providers.d.ts.map +1 -0
  270. package/dist/server/shared/importable-providers.js +7 -0
  271. package/dist/server/shared/importable-providers.js.map +1 -0
  272. package/dist/server/shared/messages.d.ts +12753 -2085
  273. package/dist/server/shared/messages.d.ts.map +1 -1
  274. package/dist/server/shared/messages.js +61 -5
  275. package/dist/server/shared/messages.js.map +1 -1
  276. package/dist/server/shared/tool-call-display.d.ts.map +1 -1
  277. package/dist/server/shared/tool-call-display.js +2 -0
  278. package/dist/server/shared/tool-call-display.js.map +1 -1
  279. package/dist/server/terminal/terminal-manager.d.ts +2 -1
  280. package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
  281. package/dist/server/terminal/terminal-manager.js +2 -1
  282. package/dist/server/terminal/terminal-manager.js.map +1 -1
  283. package/dist/server/terminal/terminal-output-coalescer.js.map +1 -1
  284. package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -1
  285. package/dist/server/terminal/terminal-session-controller.js +2 -0
  286. package/dist/server/terminal/terminal-session-controller.js.map +1 -1
  287. package/dist/server/terminal/terminal.d.ts +1 -1
  288. package/dist/server/terminal/terminal.d.ts.map +1 -1
  289. package/dist/server/terminal/terminal.js +53 -8
  290. package/dist/server/terminal/terminal.js.map +1 -1
  291. package/dist/server/terminal/worker-terminal-manager.js.map +1 -1
  292. package/dist/server/utils/build-metadata-prompt.d.ts +14 -0
  293. package/dist/server/utils/build-metadata-prompt.d.ts.map +1 -0
  294. package/dist/server/utils/build-metadata-prompt.js +28 -0
  295. package/dist/server/utils/build-metadata-prompt.js.map +1 -0
  296. package/dist/server/utils/checkout-git.d.ts +2 -1
  297. package/dist/server/utils/checkout-git.d.ts.map +1 -1
  298. package/dist/server/utils/checkout-git.js +67 -11
  299. package/dist/server/utils/checkout-git.js.map +1 -1
  300. package/dist/server/utils/directory-suggestions.js.map +1 -1
  301. package/dist/server/utils/executable.d.ts +2 -1
  302. package/dist/server/utils/executable.d.ts.map +1 -1
  303. package/dist/server/utils/executable.js +50 -51
  304. package/dist/server/utils/executable.js.map +1 -1
  305. package/dist/server/utils/paseo-config-file.d.ts +1 -1
  306. package/dist/server/utils/paseo-config-file.d.ts.map +1 -1
  307. package/dist/server/utils/paseo-config-schema.d.ts +625 -0
  308. package/dist/server/utils/paseo-config-schema.d.ts.map +1 -1
  309. package/dist/server/utils/paseo-config-schema.js +17 -0
  310. package/dist/server/utils/paseo-config-schema.js.map +1 -1
  311. package/dist/server/utils/spawn.d.ts +2 -0
  312. package/dist/server/utils/spawn.d.ts.map +1 -1
  313. package/dist/server/utils/spawn.js +2 -1
  314. package/dist/server/utils/spawn.js.map +1 -1
  315. package/dist/server/utils/tree-kill.d.ts +18 -0
  316. package/dist/server/utils/tree-kill.d.ts.map +1 -0
  317. package/dist/server/utils/{process-tree.js → tree-kill.js} +14 -33
  318. package/dist/server/utils/tree-kill.js.map +1 -0
  319. package/dist/server/utils/worktree.js.map +1 -1
  320. package/dist/server/utils/wrap-user-instructions.d.ts +2 -0
  321. package/dist/server/utils/wrap-user-instructions.d.ts.map +1 -0
  322. package/dist/server/utils/wrap-user-instructions.js +13 -0
  323. package/dist/server/utils/wrap-user-instructions.js.map +1 -0
  324. package/dist/src/server/agent/provider-launch-config.js.map +1 -1
  325. package/dist/src/server/agent/provider-manifest.js +11 -0
  326. package/dist/src/server/agent/provider-manifest.js.map +1 -1
  327. package/dist/src/server/loop/rpc-schemas.js +4 -0
  328. package/dist/src/server/loop/rpc-schemas.js.map +1 -1
  329. package/dist/src/server/paseo-env.js +16 -33
  330. package/dist/src/server/paseo-env.js.map +1 -1
  331. package/dist/src/server/paseo-home.js +2 -2
  332. package/dist/src/server/paseo-home.js.map +1 -1
  333. package/dist/src/server/persisted-config.js +6 -4
  334. package/dist/src/server/persisted-config.js.map +1 -1
  335. package/dist/src/server/pid-lock.js +30 -8
  336. package/dist/src/server/pid-lock.js.map +1 -1
  337. package/dist/src/server/private-files.js +42 -0
  338. package/dist/src/server/private-files.js.map +1 -0
  339. package/dist/src/server/schedule/rpc-schemas.js +39 -0
  340. package/dist/src/server/schedule/rpc-schemas.js.map +1 -1
  341. package/dist/src/shared/messages.js +61 -5
  342. package/dist/src/shared/messages.js.map +1 -1
  343. package/dist/src/utils/executable.js +50 -51
  344. package/dist/src/utils/executable.js.map +1 -1
  345. package/dist/src/utils/paseo-config-schema.js +17 -0
  346. package/dist/src/utils/paseo-config-schema.js.map +1 -1
  347. package/dist/src/utils/spawn.js +2 -1
  348. package/dist/src/utils/spawn.js.map +1 -1
  349. package/package.json +5 -4
  350. package/dist/server/server/agent/providers/claude/claude-models.d.ts.map +0 -1
  351. package/dist/server/server/agent/providers/claude/claude-models.js.map +0 -1
  352. package/dist/server/server/agent/providers/claude-agent.d.ts.map +0 -1
  353. package/dist/server/server/agent/providers/claude-agent.js.map +0 -1
  354. package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.d.ts +0 -16
  355. package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.d.ts.map +0 -1
  356. package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.js +0 -35
  357. package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.js.map +0 -1
  358. package/dist/server/utils/process-tree.d.ts +0 -25
  359. package/dist/server/utils/process-tree.d.ts.map +0 -1
  360. package/dist/server/utils/process-tree.js.map +0 -1
@@ -21,13 +21,14 @@ import { DictationStreamManager, } from "./dictation/dictation-stream-manager.js
21
21
  import { createVoiceTurnController, } from "./voice/voice-turn-controller.js";
22
22
  import { buildConfigOverrides, extractTimestamps, isStoredAgentProviderAvailable, toAgentPersistenceHandle, } from "./persistence-hooks.js";
23
23
  import { ensureAgentLoaded } from "./agent/agent-loading.js";
24
- import { sendPromptToAgent, unarchiveAgentState } from "./agent/mcp-shared.js";
24
+ import { formatSystemNotificationPrompt, sendPromptToAgent, unarchiveAgentState, } from "./agent/agent-prompt.js";
25
25
  import { experimental_createMCPClient } from "ai";
26
26
  import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
27
27
  import { buildWorkspaceScriptPayloads, readPaseoConfigForProjection, } from "./script-status-projection.js";
28
28
  import { deriveProjectSlug } from "./workspace-git-metadata.js";
29
29
  import { spawnWorkspaceScript } from "./worktree-bootstrap.js";
30
30
  import { applyMutableProviderConfigToOverrides } from "./daemon-config-store.js";
31
+ import { getErrorMessage, getErrorMessageOr } from "../shared/error-utils.js";
31
32
  import { buildProviderRegistry } from "./agent/provider-registry.js";
32
33
  import { resolveSnapshotCwd } from "./agent/provider-snapshot-manager.js";
33
34
  import { scheduleAgentMetadataGeneration } from "./agent/agent-metadata-generator.js";
@@ -36,12 +37,14 @@ import { MAX_EXPLICIT_AGENT_TITLE_CHARS } from "./agent/agent-title-limits.js";
36
37
  import { appendTimelineItemIfAgentKnown, emitLiveTimelineItemIfAgentKnown, } from "./agent/timeline-append.js";
37
38
  import { projectTimelineRows, selectTimelineWindowByProjectedLimit, } from "./agent/timeline-projection.js";
38
39
  import { DEFAULT_STRUCTURED_GENERATION_PROVIDERS, StructuredAgentFallbackError, StructuredAgentResponseError, generateStructuredAgentResponseWithFallback, } from "./agent/agent-response-loop.js";
40
+ import { ImportSessionsRequestError, listImportableProviderSessions, normalizeImportAgentRequest, } from "./agent/import-sessions.js";
39
41
  import { checkoutLiteFromGitSnapshot, normalizeWorkspaceId as normalizePersistedWorkspaceId, deriveProjectGroupingName, classifyDirectoryForProjectMembership, deriveWorkspaceDisplayName, } from "./workspace-registry-model.js";
40
42
  import { createPersistedProjectRecord, createPersistedWorkspaceRecord, } from "./workspace-registry.js";
41
43
  import { buildVoiceModeSystemPrompt, stripVoiceModeSystemPrompt, wrapSpokenInput, } from "./voice-config.js";
42
44
  import { isVoicePermissionAllowed } from "./voice-permission-policy.js";
43
45
  import { listDirectoryEntries, readExplorerFile, readExplorerFileBytes, getDownloadableFileInfo, } from "./file-explorer/service.js";
44
46
  import { readPaseoConfigForEdit, writePaseoConfigForEdit, } from "../utils/paseo-config-file.js";
47
+ import { buildMetadataPrompt } from "../utils/build-metadata-prompt.js";
45
48
  import { archivePersistedWorkspaceRecord } from "./workspace-archive-service.js";
46
49
  import { WorkspaceReconciliationService } from "./workspace-reconciliation-service.js";
47
50
  import { checkoutResolvedBranch, commitChanges, mergeToBase, mergeFromBase, pullCurrentBranch, pushCurrentBranch, createPullRequest, } from "../utils/checkout-git.js";
@@ -51,8 +54,8 @@ import { searchHomeDirectories, searchWorkspaceEntries } from "../utils/director
51
54
  import { toCheckoutError } from "./checkout-git-utils.js";
52
55
  import { toResolver } from "./speech/provider-resolver.js";
53
56
  import { resolveClientMessageId } from "./client-message-id.js";
54
- import { ChatServiceError } from "./chat/chat-service.js";
55
- import { notifyChatMentions } from "./chat/chat-mentions.js";
57
+ import { ChatServiceError, parseMentionAgentIds, } from "./chat/chat-service.js";
58
+ import { notifyChatMentions, prepareChatMentionFanout } from "./chat/chat-mentions.js";
56
59
  import { execCommand } from "../utils/spawn.js";
57
60
  import { createGitHubService, } from "../services/github-service.js";
58
61
  import { summarizeFetchWorkspacesEntries, WorkspaceDirectory, } from "./workspace-directory.js";
@@ -241,7 +244,6 @@ const PCM_BYTES_PER_MS = (PCM_SAMPLE_RATE * PCM_CHANNELS * (PCM_BITS_PER_SAMPLE
241
244
  const MIN_STREAMING_SEGMENT_DURATION_MS = 1000;
242
245
  const MIN_STREAMING_SEGMENT_BYTES = Math.round(PCM_BYTES_PER_MS * MIN_STREAMING_SEGMENT_DURATION_MS);
243
246
  const AgentIdSchema = z.string().uuid();
244
- const VOICE_INTERRUPT_CONFIRMATION_MS = 500;
245
247
  const AVAILABLE_EDITOR_TARGETS_CACHE_TTL_MS = 60000;
246
248
  const AVAILABLE_EDITOR_TARGETS_CACHE_KEY = "available";
247
249
  class VoiceFeatureUnavailableError extends Error {
@@ -257,8 +259,8 @@ function buildImportPersistenceHandle(input) {
257
259
  const cwd = input.cwd ?? process.cwd();
258
260
  return {
259
261
  provider: input.provider,
260
- sessionId: input.sessionId,
261
- nativeHandle: input.sessionId,
262
+ sessionId: input.providerHandleId,
263
+ nativeHandle: input.providerHandleId,
262
264
  metadata: {
263
265
  provider: input.provider,
264
266
  cwd,
@@ -304,7 +306,13 @@ function parseClientCapabilities(capabilities) {
304
306
  return new Set();
305
307
  }
306
308
  const known = new Set(Object.values(CLIENT_CAPS));
307
- return new Set(Object.entries(capabilities).flatMap(([key, value]) => value === true && known.has(key) ? [key] : []));
309
+ const result = [];
310
+ for (const [key, value] of Object.entries(capabilities)) {
311
+ if (value === true && known.has(key)) {
312
+ result.push(key);
313
+ }
314
+ }
315
+ return new Set(result);
308
316
  }
309
317
  /**
310
318
  * Session represents a single connected client session.
@@ -317,8 +325,6 @@ export class Session {
317
325
  // Voice mode state
318
326
  this.isVoiceMode = false;
319
327
  this.speechInProgress = false;
320
- this.pendingVoiceSpeechStartAt = null;
321
- this.pendingVoiceSpeechTimer = null;
322
328
  this.voiceTurnController = null;
323
329
  this.voiceInputChunkCount = 0;
324
330
  this.voiceInputBytes = 0;
@@ -991,7 +997,7 @@ export class Session {
991
997
  catch (error) {
992
998
  const err = error instanceof Error ? error : new Error(String(error));
993
999
  this.sessionLogger.error({ err }, "Error handling message");
994
- const requestId = msg.requestId;
1000
+ const requestId = "requestId" in msg && typeof msg.requestId === "string" ? msg.requestId : undefined;
995
1001
  if (typeof requestId === "string") {
996
1002
  try {
997
1003
  this.emit({
@@ -1108,6 +1114,8 @@ export class Session {
1108
1114
  return this.handleFetchAgents(msg);
1109
1115
  case "fetch_agent_history_request":
1110
1116
  return this.handleFetchAgentHistory(msg);
1117
+ case "fetch_recent_provider_sessions_request":
1118
+ return this.handleFetchRecentProviderSessions(msg);
1111
1119
  case "fetch_agent_request":
1112
1120
  return this.handleFetchAgent(msg.agentId, msg.requestId);
1113
1121
  case "delete_agent_request":
@@ -1258,6 +1266,7 @@ export class Session {
1258
1266
  },
1259
1267
  });
1260
1268
  }
1269
+ // eslint-disable-next-line complexity
1261
1270
  dispatchCheckoutMessage(msg) {
1262
1271
  switch (msg.type) {
1263
1272
  case "checkout_status_request":
@@ -1293,6 +1302,8 @@ export class Session {
1293
1302
  return this.handleCheckoutPushRequest(msg);
1294
1303
  case "checkout_pr_create_request":
1295
1304
  return this.handleCheckoutPrCreateRequest(msg);
1305
+ case "checkout_pr_merge_request":
1306
+ return this.handleCheckoutPrMergeRequest(msg);
1296
1307
  case "checkout_pr_status_request":
1297
1308
  return this.handleCheckoutPrStatusRequest(msg);
1298
1309
  case "pull_request_timeline_request":
@@ -1375,6 +1386,22 @@ export class Session {
1375
1386
  return this.handleChatReadRequest(msg);
1376
1387
  case "chat/wait":
1377
1388
  return this.handleChatWaitRequest(msg);
1389
+ case "loop/run":
1390
+ return this.handleLoopRunRequest(msg);
1391
+ case "loop/list":
1392
+ return this.handleLoopListRequest(msg);
1393
+ case "loop/inspect":
1394
+ return this.handleLoopInspectRequest(msg);
1395
+ case "loop/logs":
1396
+ return this.handleLoopLogsRequest(msg);
1397
+ case "loop/stop":
1398
+ return this.handleLoopStopRequest(msg);
1399
+ default:
1400
+ return this.dispatchScheduleMessage(msg);
1401
+ }
1402
+ }
1403
+ dispatchScheduleMessage(msg) {
1404
+ switch (msg.type) {
1378
1405
  case "schedule/create":
1379
1406
  return this.handleScheduleCreateRequest(msg);
1380
1407
  case "schedule/list":
@@ -1389,16 +1416,10 @@ export class Session {
1389
1416
  return this.handleScheduleResumeRequest(msg);
1390
1417
  case "schedule/delete":
1391
1418
  return this.handleScheduleDeleteRequest(msg);
1392
- case "loop/run":
1393
- return this.handleLoopRunRequest(msg);
1394
- case "loop/list":
1395
- return this.handleLoopListRequest(msg);
1396
- case "loop/inspect":
1397
- return this.handleLoopInspectRequest(msg);
1398
- case "loop/logs":
1399
- return this.handleLoopLogsRequest(msg);
1400
- case "loop/stop":
1401
- return this.handleLoopStopRequest(msg);
1419
+ case "schedule/run-once":
1420
+ return this.handleScheduleRunOnceRequest(msg);
1421
+ case "schedule/update":
1422
+ return this.handleScheduleUpdateRequest(msg);
1402
1423
  default:
1403
1424
  return undefined;
1404
1425
  }
@@ -1663,7 +1684,7 @@ export class Session {
1663
1684
  id: uuidv4(),
1664
1685
  timestamp: new Date(),
1665
1686
  type: "error",
1666
- content: `Failed to update agent: ${error.message}`,
1687
+ content: `Failed to update agent: ${getErrorMessage(error)}`,
1667
1688
  },
1668
1689
  });
1669
1690
  this.emit({
@@ -1672,9 +1693,7 @@ export class Session {
1672
1693
  requestId,
1673
1694
  agentId,
1674
1695
  accepted: false,
1675
- error: error?.message
1676
- ? String(error.message)
1677
- : "Failed to update agent",
1696
+ error: getErrorMessageOr(error, "Failed to update agent"),
1678
1697
  },
1679
1698
  });
1680
1699
  }
@@ -1886,28 +1905,62 @@ export class Session {
1886
1905
  if (!turnDetection) {
1887
1906
  throw new Error("Voice turn detection is not configured");
1888
1907
  }
1908
+ const stt = this.sttManager.getProvider();
1909
+ if (!stt) {
1910
+ throw new Error("Voice speech-to-text is not configured");
1911
+ }
1889
1912
  this.sessionLogger.info({ providerId: turnDetection.id }, "startVoiceTurnController creating controller");
1890
1913
  const controller = createVoiceTurnController({
1891
1914
  logger: this.sessionLogger.child({ component: "voice-turn-controller" }),
1892
1915
  turnDetection,
1893
- utteranceSink: {
1894
- submitUtterance: async ({ pcm16, format, sampleRate, startedAt, endedAt }) => {
1895
- this.sessionLogger.debug({
1896
- audioBytes: pcm16.length,
1897
- sampleRate,
1898
- startedAt,
1899
- endedAt,
1900
- durationMs: Math.max(0, endedAt - startedAt),
1901
- }, "Submitting detected voice utterance");
1902
- await this.processCompletedAudio(pcm16, format);
1903
- },
1904
- },
1916
+ stt,
1905
1917
  callbacks: {
1906
1918
  onSpeechStarted: async () => {
1907
- this.handleProvisionalVoiceSpeechStarted();
1919
+ this.sessionLogger.debug("Voice VAD speech_started");
1920
+ },
1921
+ onPartialTranscript: async ({ segmentId, transcript }) => {
1922
+ this.sessionLogger.info({ segmentId, transcriptLength: transcript.trim().length }, "voice_input_state emitting isSpeaking=true");
1923
+ this.emit({
1924
+ type: "voice_input_state",
1925
+ payload: {
1926
+ isSpeaking: true,
1927
+ },
1928
+ });
1929
+ await this.handleVoiceSpeechStart();
1908
1930
  },
1909
1931
  onSpeechStopped: async () => {
1910
1932
  this.handleVoiceSpeechStopped();
1933
+ this.setPhase("transcribing");
1934
+ this.emit({
1935
+ type: "activity_log",
1936
+ payload: {
1937
+ id: uuidv4(),
1938
+ timestamp: new Date(),
1939
+ type: "system",
1940
+ content: "Transcribing audio...",
1941
+ },
1942
+ });
1943
+ },
1944
+ onFinalTranscript: async ({ transcript, language, durationMs, avgLogprob, isLowConfidence, }) => {
1945
+ const requestId = uuidv4();
1946
+ const transcriptText = isLowConfidence ? "" : transcript.trim();
1947
+ if (isLowConfidence) {
1948
+ this.sessionLogger.debug({ text: transcript, avgLogprob }, "Filtered low-confidence transcription (likely non-speech)");
1949
+ }
1950
+ this.sessionLogger.info({
1951
+ requestId,
1952
+ isVoiceMode: this.isVoiceMode,
1953
+ transcriptLength: transcriptText.length,
1954
+ transcript: transcriptText,
1955
+ }, "Transcription result");
1956
+ await this.handleTranscriptionResultPayload({
1957
+ text: transcriptText,
1958
+ requestId,
1959
+ ...(language ? { language } : {}),
1960
+ duration: durationMs,
1961
+ ...(avgLogprob !== undefined ? { avgLogprob } : {}),
1962
+ ...(isLowConfidence !== undefined ? { isLowConfidence } : {}),
1963
+ });
1911
1964
  },
1912
1965
  onError: (error) => {
1913
1966
  this.sessionLogger.error({ err: error }, "Voice turn controller failed");
@@ -1923,51 +1976,11 @@ export class Session {
1923
1976
  if (!this.voiceTurnController) {
1924
1977
  return;
1925
1978
  }
1926
- this.clearPendingVoiceSpeechStart("turn-controller-stop");
1927
1979
  const controller = this.voiceTurnController;
1928
1980
  this.voiceTurnController = null;
1929
1981
  await controller.stop();
1930
1982
  }
1931
- clearPendingVoiceSpeechStart(reason) {
1932
- if (this.pendingVoiceSpeechTimer) {
1933
- clearTimeout(this.pendingVoiceSpeechTimer);
1934
- this.pendingVoiceSpeechTimer = null;
1935
- }
1936
- if (this.pendingVoiceSpeechStartAt !== null) {
1937
- this.sessionLogger.debug({ reason }, "Clearing provisional voice speech start");
1938
- this.pendingVoiceSpeechStartAt = null;
1939
- }
1940
- }
1941
- handleProvisionalVoiceSpeechStarted() {
1942
- if (this.speechInProgress || this.pendingVoiceSpeechTimer) {
1943
- return;
1944
- }
1945
- const startedAt = Date.now();
1946
- this.pendingVoiceSpeechStartAt = startedAt;
1947
- this.sessionLogger.info({ confirmationMs: VOICE_INTERRUPT_CONFIRMATION_MS }, "Silero VAD provisional speech_started");
1948
- this.pendingVoiceSpeechTimer = setTimeout(() => {
1949
- this.pendingVoiceSpeechTimer = null;
1950
- if (this.pendingVoiceSpeechStartAt !== startedAt || this.speechInProgress) {
1951
- return;
1952
- }
1953
- this.pendingVoiceSpeechStartAt = null;
1954
- this.sessionLogger.info("voice_input_state emitting isSpeaking=true");
1955
- this.emit({
1956
- type: "voice_input_state",
1957
- payload: {
1958
- isSpeaking: true,
1959
- },
1960
- });
1961
- void this.handleVoiceSpeechStart();
1962
- }, VOICE_INTERRUPT_CONFIRMATION_MS);
1963
- }
1964
1983
  handleVoiceSpeechStopped() {
1965
- if (this.pendingVoiceSpeechStartAt !== null) {
1966
- const durationMs = Date.now() - this.pendingVoiceSpeechStartAt;
1967
- this.clearPendingVoiceSpeechStart("speech-stopped-before-confirmation");
1968
- this.sessionLogger.info({ durationMs, confirmationMs: VOICE_INTERRUPT_CONFIRMATION_MS }, "Ignoring provisional voice speech start that ended before confirmation");
1969
- return;
1970
- }
1971
1984
  this.sessionLogger.info("voice_input_state emitting isSpeaking=false");
1972
1985
  this.emit({
1973
1986
  type: "voice_input_state",
@@ -2039,14 +2052,7 @@ export class Session {
2039
2052
  if (!resolvedWorkspace) {
2040
2053
  throw new Error(`Workspace not found: ${msg.workspaceId}`);
2041
2054
  }
2042
- this.scheduleAutoNameWorkspaceBranchForFirstAgent({
2043
- workspace: resolvedWorkspace,
2044
- firstAgentContext,
2045
- });
2046
- const snapshot = await this.agentManager.createAgent({
2047
- ...sessionConfig,
2048
- cwd: resolvedWorkspace.cwd,
2049
- }, undefined, {
2055
+ const snapshot = await this.agentManager.createAgent(sessionConfig, undefined, {
2050
2056
  labels,
2051
2057
  workspaceId: resolvedWorkspace.workspaceId,
2052
2058
  initialPrompt: trimmedPrompt,
@@ -2115,6 +2121,7 @@ export class Session {
2115
2121
  agentManager: this.agentManager,
2116
2122
  agentId: snapshot.id,
2117
2123
  cwd: snapshot.cwd,
2124
+ workspaceGitService: this.workspaceGitService,
2118
2125
  initialPrompt: trimmedPrompt,
2119
2126
  explicitTitle: params.explicitTitle,
2120
2127
  paseoHome: this.paseoHome,
@@ -2170,22 +2177,34 @@ export class Session {
2170
2177
  id: uuidv4(),
2171
2178
  timestamp: new Date(),
2172
2179
  type: "error",
2173
- content: `Failed to resume agent: ${error.message}`,
2180
+ content: `Failed to resume agent: ${getErrorMessage(error)}`,
2174
2181
  },
2175
2182
  });
2176
2183
  }
2177
2184
  }
2178
2185
  async handleImportAgentRequest(msg) {
2179
- const { provider, sessionId, cwd, labels, requestId } = msg;
2180
- this.sessionLogger.info({ sessionId, provider }, `Importing agent ${sessionId} (${provider})`);
2186
+ const normalized = normalizeImportAgentRequest(msg);
2187
+ if ("error" in normalized) {
2188
+ this.emit({
2189
+ type: "status",
2190
+ payload: {
2191
+ status: "agent_create_failed",
2192
+ requestId: msg.requestId,
2193
+ error: normalized.error,
2194
+ },
2195
+ });
2196
+ return;
2197
+ }
2198
+ const { provider, providerHandleId, cwd, labels, requestId } = normalized;
2199
+ this.sessionLogger.info({ providerHandleId, provider }, `Importing agent ${providerHandleId} (${provider})`);
2181
2200
  try {
2182
- const descriptor = await this.agentManager.findPersistedAgent(provider, sessionId);
2201
+ const descriptor = await this.agentManager.findPersistedAgent(provider, providerHandleId);
2183
2202
  if (!descriptor && provider === "opencode" && !cwd) {
2184
2203
  throw new Error("OpenCode sessions require --cwd when the session cannot be found in persisted agents");
2185
2204
  }
2186
2205
  const handle = descriptor
2187
2206
  ? applyImportCwdOverride(descriptor.persistence, cwd)
2188
- : buildImportPersistenceHandle({ provider, sessionId, cwd });
2207
+ : buildImportPersistenceHandle({ provider, providerHandleId, cwd });
2189
2208
  const overrides = cwd ? { cwd } : undefined;
2190
2209
  await this.unarchiveAgentByHandle(handle);
2191
2210
  const snapshot = await this.agentManager.resumeAgentFromPersistence(handle, overrides, undefined, {
@@ -2246,6 +2265,7 @@ export class Session {
2246
2265
  agentManager: this.agentManager,
2247
2266
  agentId: snapshot.id,
2248
2267
  cwd: snapshot.cwd,
2268
+ workspaceGitService: this.workspaceGitService,
2249
2269
  initialPrompt,
2250
2270
  explicitTitle,
2251
2271
  paseoHome: this.paseoHome,
@@ -2261,7 +2281,9 @@ export class Session {
2261
2281
  const existing = this.agentManager.getAgent(agentId);
2262
2282
  if (existing) {
2263
2283
  await this.interruptAgentIfRunning(agentId);
2264
- snapshot = await this.agentManager.reloadAgentSession(agentId);
2284
+ snapshot = await this.agentManager.reloadAgentSession(agentId, undefined, {
2285
+ rehydrateFromDisk: true,
2286
+ });
2265
2287
  }
2266
2288
  else {
2267
2289
  const record = await this.agentStorage.get(agentId);
@@ -2301,7 +2323,7 @@ export class Session {
2301
2323
  id: uuidv4(),
2302
2324
  timestamp: new Date(),
2303
2325
  type: "error",
2304
- content: `Failed to refresh agent: ${error.message}`,
2326
+ content: `Failed to refresh agent: ${getErrorMessage(error)}`,
2305
2327
  },
2306
2328
  });
2307
2329
  }
@@ -2370,6 +2392,7 @@ export class Session {
2370
2392
  return generateBranchNameFromFirstAgentContext({
2371
2393
  agentManager: this.agentManager,
2372
2394
  cwd,
2395
+ workspaceGitService: this.workspaceGitService,
2373
2396
  firstAgentContext,
2374
2397
  logger: this.sessionLogger,
2375
2398
  });
@@ -2434,7 +2457,7 @@ export class Session {
2434
2457
  type: "list_provider_models_response",
2435
2458
  payload: {
2436
2459
  provider: msg.provider,
2437
- error: error?.message ?? String(error),
2460
+ error: getErrorMessage(error),
2438
2461
  fetchedAt,
2439
2462
  requestId: msg.requestId,
2440
2463
  },
@@ -2561,7 +2584,7 @@ export class Session {
2561
2584
  type: "list_provider_modes_response",
2562
2585
  payload: {
2563
2586
  provider: msg.provider,
2564
- error: error?.message ?? String(error),
2587
+ error: getErrorMessage(error),
2565
2588
  fetchedAt,
2566
2589
  requestId: msg.requestId,
2567
2590
  },
@@ -2618,7 +2641,7 @@ export class Session {
2618
2641
  type: "list_provider_features_response",
2619
2642
  payload: {
2620
2643
  provider: msg.draftConfig.provider,
2621
- error: error?.message ?? String(error),
2644
+ error: getErrorMessage(error),
2622
2645
  fetchedAt,
2623
2646
  requestId: msg.requestId,
2624
2647
  },
@@ -2645,7 +2668,7 @@ export class Session {
2645
2668
  type: "list_available_providers_response",
2646
2669
  payload: {
2647
2670
  providers: [],
2648
- error: error?.message ?? String(error),
2671
+ error: getErrorMessage(error),
2649
2672
  fetchedAt,
2650
2673
  requestId: msg.requestId,
2651
2674
  },
@@ -2757,14 +2780,19 @@ export class Session {
2757
2780
  const patch = diff.diff.length > maxPatchChars
2758
2781
  ? `${diff.diff.slice(0, maxPatchChars)}\n\n... (diff truncated to ${maxPatchChars} chars)\n`
2759
2782
  : diff.diff;
2760
- const prompt = [
2761
- "Write a concise git commit message for the changes below.",
2762
- "Return JSON only with a single field 'message'.",
2763
- "",
2764
- fileList,
2765
- "",
2766
- patch.length > 0 ? patch : "(No diff available)",
2767
- ].join("\n");
2783
+ const prompt = await buildMetadataPrompt({
2784
+ cwd,
2785
+ workspaceGitService: this.workspaceGitService,
2786
+ configKey: "commitMessage",
2787
+ before: "Write a concise git commit message for the changes below.",
2788
+ after: [
2789
+ "Return JSON only with a single field 'message'.",
2790
+ "",
2791
+ fileList,
2792
+ "",
2793
+ patch.length > 0 ? patch : "(No diff available)",
2794
+ ].join("\n"),
2795
+ });
2768
2796
  try {
2769
2797
  const result = await generateStructuredAgentResponseWithFallback({
2770
2798
  manager: this.agentManager,
@@ -2814,14 +2842,19 @@ export class Session {
2814
2842
  const patch = diff.diff.length > maxPatchChars
2815
2843
  ? `${diff.diff.slice(0, maxPatchChars)}\n\n... (diff truncated to ${maxPatchChars} chars)\n`
2816
2844
  : diff.diff;
2817
- const prompt = [
2818
- "Write a pull request title and body for the changes below.",
2819
- "Return JSON only with fields 'title' and 'body'.",
2820
- "",
2821
- fileList,
2822
- "",
2823
- patch.length > 0 ? patch : "(No diff available)",
2824
- ].join("\n");
2845
+ const prompt = await buildMetadataPrompt({
2846
+ cwd,
2847
+ workspaceGitService: this.workspaceGitService,
2848
+ configKey: "pullRequest",
2849
+ before: "Write a pull request title and body for the changes below.",
2850
+ after: [
2851
+ "Return JSON only with fields 'title' and 'body'.",
2852
+ "",
2853
+ fileList,
2854
+ "",
2855
+ patch.length > 0 ? patch : "(No diff available)",
2856
+ ].join("\n"),
2857
+ });
2825
2858
  try {
2826
2859
  return await generateStructuredAgentResponseWithFallback({
2827
2860
  manager: this.agentManager,
@@ -2861,7 +2894,7 @@ export class Session {
2861
2894
  return snapshot.git.isDirty === true;
2862
2895
  }
2863
2896
  catch (error) {
2864
- throw new Error(`Unable to inspect git status for ${cwd}: ${error.message}`, {
2897
+ throw new Error(`Unable to inspect git status for ${cwd}: ${getErrorMessage(error)}`, {
2865
2898
  cause: error,
2866
2899
  });
2867
2900
  }
@@ -2934,7 +2967,7 @@ export class Session {
2934
2967
  id: uuidv4(),
2935
2968
  timestamp: new Date(),
2936
2969
  type: "error",
2937
- content: `Failed to set agent mode: ${error.message}`,
2970
+ content: `Failed to set agent mode: ${getErrorMessage(error)}`,
2938
2971
  },
2939
2972
  });
2940
2973
  this.emit({
@@ -2943,9 +2976,7 @@ export class Session {
2943
2976
  requestId,
2944
2977
  agentId,
2945
2978
  accepted: false,
2946
- error: error?.message
2947
- ? String(error.message)
2948
- : "Failed to set agent mode",
2979
+ error: getErrorMessageOr(error, "Failed to set agent mode"),
2949
2980
  },
2950
2981
  });
2951
2982
  }
@@ -2968,7 +2999,7 @@ export class Session {
2968
2999
  id: uuidv4(),
2969
3000
  timestamp: new Date(),
2970
3001
  type: "error",
2971
- content: `Failed to set agent model: ${error.message}`,
3002
+ content: `Failed to set agent model: ${getErrorMessage(error)}`,
2972
3003
  },
2973
3004
  });
2974
3005
  this.emit({
@@ -2977,9 +3008,7 @@ export class Session {
2977
3008
  requestId,
2978
3009
  agentId,
2979
3010
  accepted: false,
2980
- error: error?.message
2981
- ? String(error.message)
2982
- : "Failed to set agent model",
3011
+ error: getErrorMessageOr(error, "Failed to set agent model"),
2983
3012
  },
2984
3013
  });
2985
3014
  }
@@ -3002,7 +3031,7 @@ export class Session {
3002
3031
  id: uuidv4(),
3003
3032
  timestamp: new Date(),
3004
3033
  type: "error",
3005
- content: `Failed to set agent feature: ${error.message}`,
3034
+ content: `Failed to set agent feature: ${getErrorMessage(error)}`,
3006
3035
  },
3007
3036
  });
3008
3037
  this.emit({
@@ -3011,9 +3040,7 @@ export class Session {
3011
3040
  requestId,
3012
3041
  agentId,
3013
3042
  accepted: false,
3014
- error: error?.message
3015
- ? String(error.message)
3016
- : "Failed to set agent feature",
3043
+ error: getErrorMessageOr(error, "Failed to set agent feature"),
3017
3044
  },
3018
3045
  });
3019
3046
  }
@@ -3036,7 +3063,7 @@ export class Session {
3036
3063
  id: uuidv4(),
3037
3064
  timestamp: new Date(),
3038
3065
  type: "error",
3039
- content: `Failed to set agent thinking option: ${error.message}`,
3066
+ content: `Failed to set agent thinking option: ${getErrorMessage(error)}`,
3040
3067
  },
3041
3068
  });
3042
3069
  this.emit({
@@ -3045,9 +3072,7 @@ export class Session {
3045
3072
  requestId,
3046
3073
  agentId,
3047
3074
  accepted: false,
3048
- error: error?.message
3049
- ? String(error.message)
3050
- : "Failed to set agent thinking option",
3075
+ error: getErrorMessageOr(error, "Failed to set agent thinking option"),
3051
3076
  },
3052
3077
  });
3053
3078
  }
@@ -3162,7 +3187,7 @@ export class Session {
3162
3187
  payload: {
3163
3188
  agentId,
3164
3189
  commands: [],
3165
- error: error.message,
3190
+ error: getErrorMessage(error),
3166
3191
  requestId,
3167
3192
  },
3168
3193
  });
@@ -3189,7 +3214,7 @@ export class Session {
3189
3214
  id: uuidv4(),
3190
3215
  timestamp: new Date(),
3191
3216
  type: "error",
3192
- content: `Failed to respond to permission: ${error.message}`,
3217
+ content: `Failed to respond to permission: ${getErrorMessage(error)}`,
3193
3218
  },
3194
3219
  });
3195
3220
  throw error;
@@ -3276,7 +3301,7 @@ export class Session {
3276
3301
  return;
3277
3302
  default: {
3278
3303
  const exhaustiveCheck = resolution;
3279
- throw new Error(`Unhandled branch resolution: ${exhaustiveCheck}`);
3304
+ throw new Error(`Unhandled branch resolution: ${getErrorMessage(exhaustiveCheck)}`);
3280
3305
  }
3281
3306
  }
3282
3307
  }
@@ -3927,6 +3952,42 @@ export class Session {
3927
3952
  });
3928
3953
  }
3929
3954
  }
3955
+ async handleCheckoutPrMergeRequest(msg) {
3956
+ const { cwd, requestId } = msg;
3957
+ try {
3958
+ const snapshot = await this.workspaceGitService.getSnapshot(cwd);
3959
+ const prNumber = snapshot.github.pullRequest?.number;
3960
+ if (typeof prNumber !== "number") {
3961
+ throw new Error("Unable to determine GitHub pull request number for merge");
3962
+ }
3963
+ await this.github.mergePullRequest({
3964
+ cwd,
3965
+ prNumber,
3966
+ mergeMethod: msg.mergeMethod,
3967
+ });
3968
+ await this.notifyGitMutation(cwd, "merge-pr", { invalidateGithub: true });
3969
+ this.emit({
3970
+ type: "checkout_pr_merge_response",
3971
+ payload: {
3972
+ cwd,
3973
+ success: true,
3974
+ error: null,
3975
+ requestId,
3976
+ },
3977
+ });
3978
+ }
3979
+ catch (error) {
3980
+ this.emit({
3981
+ type: "checkout_pr_merge_response",
3982
+ payload: {
3983
+ cwd,
3984
+ success: false,
3985
+ error: toCheckoutError(error),
3986
+ requestId,
3987
+ },
3988
+ });
3989
+ }
3990
+ }
3930
3991
  async handleCheckoutPrStatusRequest(msg) {
3931
3992
  const { cwd, requestId } = msg;
3932
3993
  try {
@@ -4157,7 +4218,7 @@ export class Session {
4157
4218
  mode,
4158
4219
  directory: null,
4159
4220
  file: null,
4160
- error: error.message,
4221
+ error: getErrorMessage(error),
4161
4222
  requestId,
4162
4223
  },
4163
4224
  });
@@ -4186,7 +4247,7 @@ export class Session {
4186
4247
  payload: {
4187
4248
  cwd,
4188
4249
  icon: null,
4189
- error: error.message,
4250
+ error: getErrorMessage(error),
4190
4251
  requestId,
4191
4252
  },
4192
4253
  });
@@ -4252,7 +4313,7 @@ export class Session {
4252
4313
  fileName: null,
4253
4314
  mimeType: null,
4254
4315
  size: null,
4255
- error: error.message,
4316
+ error: getErrorMessage(error),
4256
4317
  requestId,
4257
4318
  },
4258
4319
  });
@@ -4488,7 +4549,7 @@ export class Session {
4488
4549
  return {
4489
4550
  id: workspace.workspaceId,
4490
4551
  projectId: workspace.projectId,
4491
- projectDisplayName: resolvedProjectRecord?.displayName ?? String(workspace.projectId),
4552
+ projectDisplayName: resolvedProjectRecord?.displayName ?? workspace.projectId,
4492
4553
  projectRootPath: resolvedProjectRecord?.rootPath ?? workspace.cwd,
4493
4554
  workspaceDirectory: workspace.cwd,
4494
4555
  projectKind: (resolvedProjectRecord?.kind ?? "directory") === "git" ? "git" : "non_git",
@@ -4559,7 +4620,7 @@ export class Session {
4559
4620
  return {
4560
4621
  id: result.workspace.workspaceId,
4561
4622
  projectId: result.workspace.projectId,
4562
- projectDisplayName: projectRecord?.displayName ?? String(result.workspace.projectId),
4623
+ projectDisplayName: projectRecord?.displayName ?? result.workspace.projectId,
4563
4624
  projectRootPath: projectRecord?.rootPath ?? result.repoRoot,
4564
4625
  workspaceDirectory: result.workspace.cwd,
4565
4626
  projectKind: "git",
@@ -5011,6 +5072,42 @@ export class Session {
5011
5072
  });
5012
5073
  }
5013
5074
  }
5075
+ async handleFetchRecentProviderSessions(request) {
5076
+ try {
5077
+ const result = await listImportableProviderSessions({
5078
+ request,
5079
+ agentManager: this.agentManager,
5080
+ agentStorage: this.agentStorage,
5081
+ providerRegistry: this.getProviderRegistry(),
5082
+ });
5083
+ this.emit({
5084
+ type: "fetch_recent_provider_sessions_response",
5085
+ payload: {
5086
+ requestId: request.requestId,
5087
+ entries: result.entries,
5088
+ ...(result.filteredAlreadyImportedCount > 0
5089
+ ? { filteredAlreadyImportedCount: result.filteredAlreadyImportedCount }
5090
+ : {}),
5091
+ },
5092
+ });
5093
+ }
5094
+ catch (error) {
5095
+ const code = error instanceof ImportSessionsRequestError
5096
+ ? error.code
5097
+ : "fetch_recent_provider_sessions_failed";
5098
+ const message = error instanceof Error ? error.message : "Failed to fetch recent provider sessions";
5099
+ this.sessionLogger.error({ err: error }, "Failed to handle fetch_recent_provider_sessions_request");
5100
+ this.emit({
5101
+ type: "rpc_error",
5102
+ payload: {
5103
+ requestId: request.requestId,
5104
+ requestType: request.type,
5105
+ error: message,
5106
+ code,
5107
+ },
5108
+ });
5109
+ }
5110
+ }
5014
5111
  async handleFetchWorkspacesRequest(request) {
5015
5112
  const requestedSubscriptionId = request.subscribe?.subscriptionId?.trim();
5016
5113
  const subscriptionId = resolveSubscriptionId(request.subscribe, requestedSubscriptionId);
@@ -5551,8 +5648,9 @@ export class Session {
5551
5648
  const agentId = resolved.agentId;
5552
5649
  const prompt = this.buildAgentPrompt(msg.text, msg.images, msg.attachments);
5553
5650
  this.sessionLogger.trace({ agentId, messageId: msg.messageId, textPrefix: msg.text.slice(0, 80) }, "send_agent_message_request: dispatching shared sendPromptToAgent");
5651
+ let dispatchResult;
5554
5652
  try {
5555
- await sendPromptToAgent({
5653
+ dispatchResult = await sendPromptToAgent({
5556
5654
  agentManager: this.agentManager,
5557
5655
  agentStorage: this.agentStorage,
5558
5656
  agentId,
@@ -5576,6 +5674,18 @@ export class Session {
5576
5674
  });
5577
5675
  return;
5578
5676
  }
5677
+ if (dispatchResult.outOfBand) {
5678
+ this.emit({
5679
+ type: "send_agent_message_response",
5680
+ payload: {
5681
+ requestId: msg.requestId,
5682
+ agentId,
5683
+ accepted: true,
5684
+ error: null,
5685
+ },
5686
+ });
5687
+ return;
5688
+ }
5579
5689
  const startAbort = new AbortController();
5580
5690
  const startTimeoutMs = 15000;
5581
5691
  const startTimeout = setTimeout(() => startAbort.abort("timeout"), startTimeoutMs);
@@ -5777,12 +5887,6 @@ export class Session {
5777
5887
  const chunkBytes = Buffer.byteLength(msg.audio, "base64");
5778
5888
  this.voiceInputChunkCount += 1;
5779
5889
  this.voiceInputBytes += chunkBytes;
5780
- if (this.voiceInputChunkCount === 1) {
5781
- this.sessionLogger.info({
5782
- format: chunkFormat,
5783
- audioBytes: chunkBytes,
5784
- }, "Received first voice_audio_chunk for active voice mode");
5785
- }
5786
5890
  const now = Date.now();
5787
5891
  if (this.voiceInputChunkCount % 50 === 0 || now - this.voiceInputWindowStartedAt >= 1000) {
5788
5892
  this.sessionLogger.info({
@@ -5943,7 +6047,7 @@ export class Session {
5943
6047
  id: uuidv4(),
5944
6048
  timestamp: new Date(),
5945
6049
  type: "error",
5946
- content: `Transcription error: ${error.message}`,
6050
+ content: `Transcription error: ${getErrorMessage(error)}`,
5947
6051
  },
5948
6052
  });
5949
6053
  throw error;
@@ -6110,7 +6214,6 @@ export class Session {
6110
6214
  * Clear speech-in-progress flag once the user turn has completed
6111
6215
  */
6112
6216
  clearSpeechInProgress(reason) {
6113
- this.clearPendingVoiceSpeechStart(`clear-speech-in-progress:${reason}`);
6114
6217
  if (!this.speechInProgress) {
6115
6218
  return;
6116
6219
  }
@@ -6354,6 +6457,19 @@ export class Session {
6354
6457
  async handleChatPostRequest(request) {
6355
6458
  try {
6356
6459
  const authorAgentId = request.authorAgentId?.trim() || this.clientId;
6460
+ const mentionAgentIds = parseMentionAgentIds(request.body);
6461
+ const storedAgents = await this.agentStorage.list();
6462
+ const liveAgents = this.agentManager.listAgents();
6463
+ const fanout = await prepareChatMentionFanout({
6464
+ authorAgentId,
6465
+ mentionAgentIds,
6466
+ storedAgents,
6467
+ liveAgents,
6468
+ listRoomPosterAgentIds: () => this.chatService.listRoomPosterAgentIds({ room: request.room }),
6469
+ });
6470
+ if (!fanout.ok) {
6471
+ throw new ChatServiceError("chat_mention_fanout_limit_exceeded", fanout.error);
6472
+ }
6357
6473
  const message = await this.chatService.dispatchMessage({
6358
6474
  room: request.room,
6359
6475
  authorAgentId,
@@ -6374,11 +6490,20 @@ export class Session {
6374
6490
  body: request.body,
6375
6491
  mentionAgentIds: message.mentionAgentIds,
6376
6492
  logger: this.sessionLogger,
6377
- listStoredAgents: () => this.agentStorage.list(),
6378
- listLiveAgents: () => this.agentManager.listAgents(),
6493
+ storedAgents,
6494
+ liveAgents,
6495
+ prepared: fanout.prepared,
6379
6496
  resolveAgentIdentifier: (identifier) => this.resolveAgentIdentifier(identifier),
6380
6497
  sendAgentMessage: async (agentId, text) => {
6381
- await this.handleSendAgentMessage(agentId, text);
6498
+ await sendPromptToAgent({
6499
+ agentManager: this.agentManager,
6500
+ agentStorage: this.agentStorage,
6501
+ agentId,
6502
+ prompt: formatSystemNotificationPrompt(text),
6503
+ unarchive: false,
6504
+ recordUserMessage: false,
6505
+ logger: this.sessionLogger,
6506
+ });
6382
6507
  },
6383
6508
  });
6384
6509
  }
@@ -6457,6 +6582,7 @@ export class Session {
6457
6582
  target,
6458
6583
  maxRuns: request.maxRuns,
6459
6584
  expiresAt: request.expiresAt,
6585
+ runOnCreate: request.runOnCreate,
6460
6586
  });
6461
6587
  this.emit({
6462
6588
  type: "schedule/create/response",
@@ -6567,6 +6693,46 @@ export class Session {
6567
6693
  this.emitScheduleRpcError(request, error);
6568
6694
  }
6569
6695
  }
6696
+ async handleScheduleRunOnceRequest(request) {
6697
+ try {
6698
+ const schedule = await this.scheduleService.runOnce(request.scheduleId);
6699
+ this.emit({
6700
+ type: "schedule/run-once/response",
6701
+ payload: {
6702
+ requestId: request.requestId,
6703
+ schedule,
6704
+ error: null,
6705
+ },
6706
+ });
6707
+ }
6708
+ catch (error) {
6709
+ this.emitScheduleRpcError(request, error);
6710
+ }
6711
+ }
6712
+ async handleScheduleUpdateRequest(request) {
6713
+ try {
6714
+ const schedule = await this.scheduleService.update({
6715
+ id: request.scheduleId,
6716
+ ...(request.name !== undefined ? { name: request.name } : {}),
6717
+ ...(request.prompt !== undefined ? { prompt: request.prompt } : {}),
6718
+ ...(request.cadence !== undefined ? { cadence: request.cadence } : {}),
6719
+ ...(request.newAgentConfig !== undefined ? { newAgentConfig: request.newAgentConfig } : {}),
6720
+ ...(request.maxRuns !== undefined ? { maxRuns: request.maxRuns } : {}),
6721
+ ...(request.expiresAt !== undefined ? { expiresAt: request.expiresAt } : {}),
6722
+ });
6723
+ this.emit({
6724
+ type: "schedule/update/response",
6725
+ payload: {
6726
+ requestId: request.requestId,
6727
+ schedule,
6728
+ error: null,
6729
+ },
6730
+ });
6731
+ }
6732
+ catch (error) {
6733
+ this.emitScheduleRpcError(request, error);
6734
+ }
6735
+ }
6570
6736
  emitLoopRpcError(request, error) {
6571
6737
  const message = error instanceof Error ? error.message : String(error);
6572
6738
  this.sessionLogger.error({ err: error, requestType: request.type }, "Loop request failed");
@@ -6587,10 +6753,12 @@ export class Session {
6587
6753
  cwd: request.cwd,
6588
6754
  provider: request.provider,
6589
6755
  model: request.model,
6756
+ modeId: request.modeId,
6590
6757
  workerProvider: request.workerProvider,
6591
6758
  workerModel: request.workerModel,
6592
6759
  verifierProvider: request.verifierProvider,
6593
6760
  verifierModel: request.verifierModel,
6761
+ verifierModeId: request.verifierModeId,
6594
6762
  verifyPrompt: request.verifyPrompt,
6595
6763
  verifyChecks: request.verifyChecks,
6596
6764
  archive: request.archive,
@@ -6698,6 +6866,7 @@ export function normalizeCheckoutPrStatusPayload(status) {
6698
6866
  headRefName: status.headRefName,
6699
6867
  isMerged: status.isMerged,
6700
6868
  isDraft: status.isDraft ?? false,
6869
+ mergeable: status.mergeable ?? "UNKNOWN",
6701
6870
  checks: status.checks ?? [],
6702
6871
  checksStatus: status.checksStatus,
6703
6872
  reviewDecision: status.reviewDecision,