@getpaseo/server 0.1.69 → 0.1.70

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 (283) 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 +33 -0
  4. package/dist/server/client/daemon-client.d.ts.map +1 -1
  5. package/dist/server/client/daemon-client.js +37 -1
  6. package/dist/server/client/daemon-client.js.map +1 -1
  7. package/dist/server/server/agent/agent-manager.d.ts +8 -0
  8. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  9. package/dist/server/server/agent/agent-manager.js +54 -5
  10. package/dist/server/server/agent/agent-manager.js.map +1 -1
  11. package/dist/server/server/agent/agent-response-loop.js.map +1 -1
  12. package/dist/server/server/agent/agent-sdk-types.d.ts +15 -2
  13. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  14. package/dist/server/server/agent/agent-stream-coalescer.d.ts +1 -1
  15. package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -1
  16. package/dist/server/server/agent/agent-timeline-store.js +1 -1
  17. package/dist/server/server/agent/agent-timeline-store.js.map +1 -1
  18. package/dist/server/server/agent/create-agent-mode.d.ts +14 -0
  19. package/dist/server/server/agent/create-agent-mode.d.ts.map +1 -0
  20. package/dist/server/server/agent/create-agent-mode.js +23 -0
  21. package/dist/server/server/agent/create-agent-mode.js.map +1 -0
  22. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  23. package/dist/server/server/agent/mcp-server.js +36 -12
  24. package/dist/server/server/agent/mcp-server.js.map +1 -1
  25. package/dist/server/server/agent/mcp-shared.d.ts +6 -2
  26. package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
  27. package/dist/server/server/agent/mcp-shared.js +12 -5
  28. package/dist/server/server/agent/mcp-shared.js.map +1 -1
  29. package/dist/server/server/agent/pcm16-resampler.js.map +1 -1
  30. package/dist/server/server/agent/prompt-attachments.d.ts.map +1 -1
  31. package/dist/server/server/agent/prompt-attachments.js +2 -0
  32. package/dist/server/server/agent/prompt-attachments.js.map +1 -1
  33. package/dist/server/server/agent/provider-launch-config.js.map +1 -1
  34. package/dist/server/server/agent/provider-manifest.d.ts +4 -1
  35. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
  36. package/dist/server/server/agent/provider-manifest.js +11 -0
  37. package/dist/server/server/agent/provider-manifest.js.map +1 -1
  38. package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
  39. package/dist/server/server/agent/provider-registry.js +8 -3
  40. package/dist/server/server/agent/provider-registry.js.map +1 -1
  41. package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
  42. package/dist/server/server/agent/providers/acp-agent.d.ts +2 -1
  43. package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
  44. package/dist/server/server/agent/providers/acp-agent.js +35 -17
  45. package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
  46. package/dist/server/server/agent/providers/{claude-agent.d.ts → claude/agent.d.ts} +9 -6
  47. package/dist/server/server/agent/providers/claude/agent.d.ts.map +1 -0
  48. package/dist/server/server/agent/providers/{claude-agent.js → claude/agent.js} +170 -152
  49. package/dist/server/server/agent/providers/claude/agent.js.map +1 -0
  50. package/dist/server/server/agent/providers/claude/{claude-models.d.ts → models.d.ts} +1 -1
  51. package/dist/server/server/agent/providers/claude/models.d.ts.map +1 -0
  52. package/dist/server/server/agent/providers/claude/{claude-models.js → models.js} +8 -1
  53. package/dist/server/server/agent/providers/claude/models.js.map +1 -0
  54. package/dist/server/server/agent/providers/claude/query.d.ts +14 -0
  55. package/dist/server/server/agent/providers/claude/query.d.ts.map +1 -0
  56. package/dist/server/server/agent/providers/claude/query.js +84 -0
  57. package/dist/server/server/agent/providers/claude/query.js.map +1 -0
  58. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
  59. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +11 -2
  60. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  61. package/dist/server/server/agent/providers/codex-app-server-agent.js +408 -91
  62. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  63. package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -1
  64. package/dist/server/server/agent/providers/diagnostic-utils.js +4 -0
  65. package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -1
  66. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +1 -1
  67. package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -1
  68. package/dist/server/server/agent/providers/generic-acp-agent.js +0 -3
  69. package/dist/server/server/agent/providers/generic-acp-agent.js.map +1 -1
  70. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -1
  71. package/dist/server/server/agent/providers/mock-load-test-agent.js +6 -2
  72. package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -1
  73. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  74. package/dist/server/server/agent/providers/opencode-agent.js +32 -27
  75. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  76. package/dist/server/server/agent/providers/provider-image-output.d.ts +20 -0
  77. package/dist/server/server/agent/providers/provider-image-output.d.ts.map +1 -0
  78. package/dist/server/server/agent/providers/provider-image-output.js +51 -0
  79. package/dist/server/server/agent/providers/provider-image-output.js.map +1 -0
  80. package/dist/server/server/agent/providers/provider-runner.d.ts +3 -3
  81. package/dist/server/server/agent/providers/provider-runner.d.ts.map +1 -1
  82. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -1
  83. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +7 -7
  84. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  85. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +12 -18
  86. package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -1
  87. package/dist/server/server/agent/stt-manager.d.ts +1 -0
  88. package/dist/server/server/agent/stt-manager.d.ts.map +1 -1
  89. package/dist/server/server/agent/stt-manager.js +3 -0
  90. package/dist/server/server/agent/stt-manager.js.map +1 -1
  91. package/dist/server/server/agent/tool-name-normalization.js.map +1 -1
  92. package/dist/server/server/agent/tts-manager.js.map +1 -1
  93. package/dist/server/server/bootstrap.d.ts +1 -0
  94. package/dist/server/server/bootstrap.d.ts.map +1 -1
  95. package/dist/server/server/bootstrap.js +3 -1
  96. package/dist/server/server/bootstrap.js.map +1 -1
  97. package/dist/server/server/config.d.ts +1 -0
  98. package/dist/server/server/config.d.ts.map +1 -1
  99. package/dist/server/server/config.js +7 -1
  100. package/dist/server/server/config.js.map +1 -1
  101. package/dist/server/server/connection-offer.d.ts +1 -0
  102. package/dist/server/server/connection-offer.d.ts.map +1 -1
  103. package/dist/server/server/daemon-config-store.d.ts.map +1 -1
  104. package/dist/server/server/daemon-config-store.js +2 -6
  105. package/dist/server/server/daemon-config-store.js.map +1 -1
  106. package/dist/server/server/daemon-keypair.js.map +1 -1
  107. package/dist/server/server/daemon-worker.js +3 -0
  108. package/dist/server/server/daemon-worker.js.map +1 -1
  109. package/dist/server/server/editor-targets.js.map +1 -1
  110. package/dist/server/server/json-utils.js.map +1 -1
  111. package/dist/server/server/logger.js.map +1 -1
  112. package/dist/server/server/loop/rpc-schemas.d.ts +68 -0
  113. package/dist/server/server/loop/rpc-schemas.d.ts.map +1 -1
  114. package/dist/server/server/loop/rpc-schemas.js +4 -0
  115. package/dist/server/server/loop/rpc-schemas.js.map +1 -1
  116. package/dist/server/server/loop-service.d.ts +8 -0
  117. package/dist/server/server/loop-service.d.ts.map +1 -1
  118. package/dist/server/server/loop-service.js +11 -2
  119. package/dist/server/server/loop-service.js.map +1 -1
  120. package/dist/server/server/package-version.d.ts +12 -0
  121. package/dist/server/server/package-version.d.ts.map +1 -1
  122. package/dist/server/server/package-version.js +13 -1
  123. package/dist/server/server/package-version.js.map +1 -1
  124. package/dist/server/server/pairing-offer.d.ts +1 -0
  125. package/dist/server/server/pairing-offer.d.ts.map +1 -1
  126. package/dist/server/server/pairing-offer.js +2 -1
  127. package/dist/server/server/pairing-offer.js.map +1 -1
  128. package/dist/server/server/pairing-qr.js +1 -1
  129. package/dist/server/server/pairing-qr.js.map +1 -1
  130. package/dist/server/server/paseo-env.d.ts +7 -3
  131. package/dist/server/server/paseo-env.d.ts.map +1 -1
  132. package/dist/server/server/paseo-env.js +16 -33
  133. package/dist/server/server/paseo-env.js.map +1 -1
  134. package/dist/server/server/persisted-config.d.ts +9 -0
  135. package/dist/server/server/persisted-config.d.ts.map +1 -1
  136. package/dist/server/server/persisted-config.js +1 -0
  137. package/dist/server/server/persisted-config.js.map +1 -1
  138. package/dist/server/server/persistence-hooks.js.map +1 -1
  139. package/dist/server/server/pid-lock.d.ts +21 -4
  140. package/dist/server/server/pid-lock.d.ts.map +1 -1
  141. package/dist/server/server/pid-lock.js +30 -8
  142. package/dist/server/server/pid-lock.js.map +1 -1
  143. package/dist/server/server/relay-transport.d.ts +2 -1
  144. package/dist/server/server/relay-transport.d.ts.map +1 -1
  145. package/dist/server/server/relay-transport.js +8 -5
  146. package/dist/server/server/relay-transport.js.map +1 -1
  147. package/dist/server/server/schedule/rpc-schemas.d.ts +1136 -0
  148. package/dist/server/server/schedule/rpc-schemas.d.ts.map +1 -1
  149. package/dist/server/server/schedule/rpc-schemas.js +39 -0
  150. package/dist/server/server/schedule/rpc-schemas.js.map +1 -1
  151. package/dist/server/server/schedule/service.d.ts +3 -1
  152. package/dist/server/server/schedule/service.d.ts.map +1 -1
  153. package/dist/server/server/schedule/service.js +92 -5
  154. package/dist/server/server/schedule/service.js.map +1 -1
  155. package/dist/server/server/schedule/types.d.ts +16 -0
  156. package/dist/server/server/schedule/types.d.ts.map +1 -1
  157. package/dist/server/server/script-health-monitor.js.map +1 -1
  158. package/dist/server/server/session.d.ts +3 -4
  159. package/dist/server/server/session.d.ts.map +1 -1
  160. package/dist/server/server/session.js +160 -120
  161. package/dist/server/server/session.js.map +1 -1
  162. package/dist/server/server/speech/audio.js.map +1 -1
  163. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -1
  164. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +52 -52
  165. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -1
  166. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -1
  167. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +9 -3
  168. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -1
  169. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -1
  170. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +12 -10
  171. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -1
  172. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +2 -2
  173. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -1
  174. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +1 -1
  175. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -1
  176. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -1
  177. package/dist/server/server/voice/voice-turn-controller.d.ts +16 -13
  178. package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -1
  179. package/dist/server/server/voice/voice-turn-controller.js +303 -71
  180. package/dist/server/server/voice/voice-turn-controller.js.map +1 -1
  181. package/dist/server/server/voice-config.js +1 -1
  182. package/dist/server/server/voice-config.js.map +1 -1
  183. package/dist/server/server/websocket-server.js.map +1 -1
  184. package/dist/server/server/workspace-directory.d.ts.map +1 -1
  185. package/dist/server/server/workspace-directory.js +4 -2
  186. package/dist/server/server/workspace-directory.js.map +1 -1
  187. package/dist/server/server/workspace-git-metadata.d.ts.map +1 -1
  188. package/dist/server/server/workspace-git-metadata.js +12 -5
  189. package/dist/server/server/workspace-git-metadata.js.map +1 -1
  190. package/dist/server/server/workspace-git-service.d.ts +2 -0
  191. package/dist/server/server/workspace-git-service.d.ts.map +1 -1
  192. package/dist/server/server/workspace-git-service.js +49 -1
  193. package/dist/server/server/workspace-git-service.js.map +1 -1
  194. package/dist/server/server/workspace-registry-model.d.ts.map +1 -1
  195. package/dist/server/server/workspace-registry-model.js +10 -3
  196. package/dist/server/server/workspace-registry-model.js.map +1 -1
  197. package/dist/server/server/worktree-session.js +1 -1
  198. package/dist/server/server/worktree-session.js.map +1 -1
  199. package/dist/server/services/github-service.d.ts.map +1 -1
  200. package/dist/server/services/github-service.js +9 -2
  201. package/dist/server/services/github-service.js.map +1 -1
  202. package/dist/server/shared/connection-offer.d.ts +10 -0
  203. package/dist/server/shared/connection-offer.d.ts.map +1 -1
  204. package/dist/server/shared/connection-offer.js +1 -0
  205. package/dist/server/shared/connection-offer.js.map +1 -1
  206. package/dist/server/shared/daemon-endpoints.d.ts +4 -0
  207. package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
  208. package/dist/server/shared/daemon-endpoints.js +6 -1
  209. package/dist/server/shared/daemon-endpoints.js.map +1 -1
  210. package/dist/server/shared/error-utils.d.ts +11 -0
  211. package/dist/server/shared/error-utils.d.ts.map +1 -0
  212. package/dist/server/shared/error-utils.js +27 -0
  213. package/dist/server/shared/error-utils.js.map +1 -0
  214. package/dist/server/shared/messages.d.ts +6475 -2265
  215. package/dist/server/shared/messages.d.ts.map +1 -1
  216. package/dist/server/shared/messages.js +5 -1
  217. package/dist/server/shared/messages.js.map +1 -1
  218. package/dist/server/shared/tool-call-display.d.ts.map +1 -1
  219. package/dist/server/shared/tool-call-display.js +2 -0
  220. package/dist/server/shared/tool-call-display.js.map +1 -1
  221. package/dist/server/terminal/terminal-manager.d.ts +2 -1
  222. package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
  223. package/dist/server/terminal/terminal-manager.js +2 -1
  224. package/dist/server/terminal/terminal-manager.js.map +1 -1
  225. package/dist/server/terminal/terminal-output-coalescer.js.map +1 -1
  226. package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -1
  227. package/dist/server/terminal/terminal-session-controller.js +2 -0
  228. package/dist/server/terminal/terminal-session-controller.js.map +1 -1
  229. package/dist/server/terminal/terminal.d.ts +1 -1
  230. package/dist/server/terminal/terminal.d.ts.map +1 -1
  231. package/dist/server/terminal/terminal.js +53 -8
  232. package/dist/server/terminal/terminal.js.map +1 -1
  233. package/dist/server/terminal/worker-terminal-manager.js.map +1 -1
  234. package/dist/server/utils/checkout-git.d.ts.map +1 -1
  235. package/dist/server/utils/checkout-git.js +67 -11
  236. package/dist/server/utils/checkout-git.js.map +1 -1
  237. package/dist/server/utils/directory-suggestions.js.map +1 -1
  238. package/dist/server/utils/executable.d.ts +2 -1
  239. package/dist/server/utils/executable.d.ts.map +1 -1
  240. package/dist/server/utils/executable.js +50 -51
  241. package/dist/server/utils/executable.js.map +1 -1
  242. package/dist/server/utils/paseo-config-file.d.ts +1 -1
  243. package/dist/server/utils/paseo-config-file.d.ts.map +1 -1
  244. package/dist/server/utils/spawn.d.ts +2 -0
  245. package/dist/server/utils/spawn.d.ts.map +1 -1
  246. package/dist/server/utils/spawn.js +2 -1
  247. package/dist/server/utils/spawn.js.map +1 -1
  248. package/dist/server/utils/tree-kill.d.ts +18 -0
  249. package/dist/server/utils/tree-kill.d.ts.map +1 -0
  250. package/dist/server/utils/{process-tree.js → tree-kill.js} +14 -33
  251. package/dist/server/utils/tree-kill.js.map +1 -0
  252. package/dist/server/utils/worktree.js.map +1 -1
  253. package/dist/src/server/agent/provider-launch-config.js.map +1 -1
  254. package/dist/src/server/agent/provider-manifest.js +11 -0
  255. package/dist/src/server/agent/provider-manifest.js.map +1 -1
  256. package/dist/src/server/loop/rpc-schemas.js +4 -0
  257. package/dist/src/server/loop/rpc-schemas.js.map +1 -1
  258. package/dist/src/server/paseo-env.js +16 -33
  259. package/dist/src/server/paseo-env.js.map +1 -1
  260. package/dist/src/server/persisted-config.js +1 -0
  261. package/dist/src/server/persisted-config.js.map +1 -1
  262. package/dist/src/server/pid-lock.js +30 -8
  263. package/dist/src/server/pid-lock.js.map +1 -1
  264. package/dist/src/server/schedule/rpc-schemas.js +39 -0
  265. package/dist/src/server/schedule/rpc-schemas.js.map +1 -1
  266. package/dist/src/shared/messages.js +5 -1
  267. package/dist/src/shared/messages.js.map +1 -1
  268. package/dist/src/utils/executable.js +50 -51
  269. package/dist/src/utils/executable.js.map +1 -1
  270. package/dist/src/utils/spawn.js +2 -1
  271. package/dist/src/utils/spawn.js.map +1 -1
  272. package/package.json +5 -4
  273. package/dist/server/server/agent/providers/claude/claude-models.d.ts.map +0 -1
  274. package/dist/server/server/agent/providers/claude/claude-models.js.map +0 -1
  275. package/dist/server/server/agent/providers/claude-agent.d.ts.map +0 -1
  276. package/dist/server/server/agent/providers/claude-agent.js.map +0 -1
  277. package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.d.ts +0 -16
  278. package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.d.ts.map +0 -1
  279. package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.js +0 -35
  280. package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.js.map +0 -1
  281. package/dist/server/utils/process-tree.d.ts +0 -25
  282. package/dist/server/utils/process-tree.d.ts.map +0 -1
  283. package/dist/server/utils/process-tree.js.map +0 -1
@@ -28,6 +28,7 @@ import { buildWorkspaceScriptPayloads, readPaseoConfigForProjection, } from "./s
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";
@@ -241,7 +242,6 @@ const PCM_BYTES_PER_MS = (PCM_SAMPLE_RATE * PCM_CHANNELS * (PCM_BITS_PER_SAMPLE
241
242
  const MIN_STREAMING_SEGMENT_DURATION_MS = 1000;
242
243
  const MIN_STREAMING_SEGMENT_BYTES = Math.round(PCM_BYTES_PER_MS * MIN_STREAMING_SEGMENT_DURATION_MS);
243
244
  const AgentIdSchema = z.string().uuid();
244
- const VOICE_INTERRUPT_CONFIRMATION_MS = 500;
245
245
  const AVAILABLE_EDITOR_TARGETS_CACHE_TTL_MS = 60000;
246
246
  const AVAILABLE_EDITOR_TARGETS_CACHE_KEY = "available";
247
247
  class VoiceFeatureUnavailableError extends Error {
@@ -304,7 +304,13 @@ function parseClientCapabilities(capabilities) {
304
304
  return new Set();
305
305
  }
306
306
  const known = new Set(Object.values(CLIENT_CAPS));
307
- return new Set(Object.entries(capabilities).flatMap(([key, value]) => value === true && known.has(key) ? [key] : []));
307
+ const result = [];
308
+ for (const [key, value] of Object.entries(capabilities)) {
309
+ if (value === true && known.has(key)) {
310
+ result.push(key);
311
+ }
312
+ }
313
+ return new Set(result);
308
314
  }
309
315
  /**
310
316
  * Session represents a single connected client session.
@@ -317,8 +323,6 @@ export class Session {
317
323
  // Voice mode state
318
324
  this.isVoiceMode = false;
319
325
  this.speechInProgress = false;
320
- this.pendingVoiceSpeechStartAt = null;
321
- this.pendingVoiceSpeechTimer = null;
322
326
  this.voiceTurnController = null;
323
327
  this.voiceInputChunkCount = 0;
324
328
  this.voiceInputBytes = 0;
@@ -991,7 +995,7 @@ export class Session {
991
995
  catch (error) {
992
996
  const err = error instanceof Error ? error : new Error(String(error));
993
997
  this.sessionLogger.error({ err }, "Error handling message");
994
- const requestId = msg.requestId;
998
+ const requestId = "requestId" in msg && typeof msg.requestId === "string" ? msg.requestId : undefined;
995
999
  if (typeof requestId === "string") {
996
1000
  try {
997
1001
  this.emit({
@@ -1375,6 +1379,22 @@ export class Session {
1375
1379
  return this.handleChatReadRequest(msg);
1376
1380
  case "chat/wait":
1377
1381
  return this.handleChatWaitRequest(msg);
1382
+ case "loop/run":
1383
+ return this.handleLoopRunRequest(msg);
1384
+ case "loop/list":
1385
+ return this.handleLoopListRequest(msg);
1386
+ case "loop/inspect":
1387
+ return this.handleLoopInspectRequest(msg);
1388
+ case "loop/logs":
1389
+ return this.handleLoopLogsRequest(msg);
1390
+ case "loop/stop":
1391
+ return this.handleLoopStopRequest(msg);
1392
+ default:
1393
+ return this.dispatchScheduleMessage(msg);
1394
+ }
1395
+ }
1396
+ dispatchScheduleMessage(msg) {
1397
+ switch (msg.type) {
1378
1398
  case "schedule/create":
1379
1399
  return this.handleScheduleCreateRequest(msg);
1380
1400
  case "schedule/list":
@@ -1389,16 +1409,10 @@ export class Session {
1389
1409
  return this.handleScheduleResumeRequest(msg);
1390
1410
  case "schedule/delete":
1391
1411
  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);
1412
+ case "schedule/run-once":
1413
+ return this.handleScheduleRunOnceRequest(msg);
1414
+ case "schedule/update":
1415
+ return this.handleScheduleUpdateRequest(msg);
1402
1416
  default:
1403
1417
  return undefined;
1404
1418
  }
@@ -1663,7 +1677,7 @@ export class Session {
1663
1677
  id: uuidv4(),
1664
1678
  timestamp: new Date(),
1665
1679
  type: "error",
1666
- content: `Failed to update agent: ${error.message}`,
1680
+ content: `Failed to update agent: ${getErrorMessage(error)}`,
1667
1681
  },
1668
1682
  });
1669
1683
  this.emit({
@@ -1672,9 +1686,7 @@ export class Session {
1672
1686
  requestId,
1673
1687
  agentId,
1674
1688
  accepted: false,
1675
- error: error?.message
1676
- ? String(error.message)
1677
- : "Failed to update agent",
1689
+ error: getErrorMessageOr(error, "Failed to update agent"),
1678
1690
  },
1679
1691
  });
1680
1692
  }
@@ -1886,28 +1898,62 @@ export class Session {
1886
1898
  if (!turnDetection) {
1887
1899
  throw new Error("Voice turn detection is not configured");
1888
1900
  }
1901
+ const stt = this.sttManager.getProvider();
1902
+ if (!stt) {
1903
+ throw new Error("Voice speech-to-text is not configured");
1904
+ }
1889
1905
  this.sessionLogger.info({ providerId: turnDetection.id }, "startVoiceTurnController creating controller");
1890
1906
  const controller = createVoiceTurnController({
1891
1907
  logger: this.sessionLogger.child({ component: "voice-turn-controller" }),
1892
1908
  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
- },
1909
+ stt,
1905
1910
  callbacks: {
1906
1911
  onSpeechStarted: async () => {
1907
- this.handleProvisionalVoiceSpeechStarted();
1912
+ this.sessionLogger.debug("Voice VAD speech_started");
1913
+ },
1914
+ onPartialTranscript: async ({ segmentId, transcript }) => {
1915
+ this.sessionLogger.info({ segmentId, transcriptLength: transcript.trim().length }, "voice_input_state emitting isSpeaking=true");
1916
+ this.emit({
1917
+ type: "voice_input_state",
1918
+ payload: {
1919
+ isSpeaking: true,
1920
+ },
1921
+ });
1922
+ await this.handleVoiceSpeechStart();
1908
1923
  },
1909
1924
  onSpeechStopped: async () => {
1910
1925
  this.handleVoiceSpeechStopped();
1926
+ this.setPhase("transcribing");
1927
+ this.emit({
1928
+ type: "activity_log",
1929
+ payload: {
1930
+ id: uuidv4(),
1931
+ timestamp: new Date(),
1932
+ type: "system",
1933
+ content: "Transcribing audio...",
1934
+ },
1935
+ });
1936
+ },
1937
+ onFinalTranscript: async ({ transcript, language, durationMs, avgLogprob, isLowConfidence, }) => {
1938
+ const requestId = uuidv4();
1939
+ const transcriptText = isLowConfidence ? "" : transcript.trim();
1940
+ if (isLowConfidence) {
1941
+ this.sessionLogger.debug({ text: transcript, avgLogprob }, "Filtered low-confidence transcription (likely non-speech)");
1942
+ }
1943
+ this.sessionLogger.info({
1944
+ requestId,
1945
+ isVoiceMode: this.isVoiceMode,
1946
+ transcriptLength: transcriptText.length,
1947
+ transcript: transcriptText,
1948
+ }, "Transcription result");
1949
+ await this.handleTranscriptionResultPayload({
1950
+ text: transcriptText,
1951
+ requestId,
1952
+ ...(language ? { language } : {}),
1953
+ duration: durationMs,
1954
+ ...(avgLogprob !== undefined ? { avgLogprob } : {}),
1955
+ ...(isLowConfidence !== undefined ? { isLowConfidence } : {}),
1956
+ });
1911
1957
  },
1912
1958
  onError: (error) => {
1913
1959
  this.sessionLogger.error({ err: error }, "Voice turn controller failed");
@@ -1923,51 +1969,11 @@ export class Session {
1923
1969
  if (!this.voiceTurnController) {
1924
1970
  return;
1925
1971
  }
1926
- this.clearPendingVoiceSpeechStart("turn-controller-stop");
1927
1972
  const controller = this.voiceTurnController;
1928
1973
  this.voiceTurnController = null;
1929
1974
  await controller.stop();
1930
1975
  }
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
1976
  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
1977
  this.sessionLogger.info("voice_input_state emitting isSpeaking=false");
1972
1978
  this.emit({
1973
1979
  type: "voice_input_state",
@@ -2039,14 +2045,7 @@ export class Session {
2039
2045
  if (!resolvedWorkspace) {
2040
2046
  throw new Error(`Workspace not found: ${msg.workspaceId}`);
2041
2047
  }
2042
- this.scheduleAutoNameWorkspaceBranchForFirstAgent({
2043
- workspace: resolvedWorkspace,
2044
- firstAgentContext,
2045
- });
2046
- const snapshot = await this.agentManager.createAgent({
2047
- ...sessionConfig,
2048
- cwd: resolvedWorkspace.cwd,
2049
- }, undefined, {
2048
+ const snapshot = await this.agentManager.createAgent(sessionConfig, undefined, {
2050
2049
  labels,
2051
2050
  workspaceId: resolvedWorkspace.workspaceId,
2052
2051
  initialPrompt: trimmedPrompt,
@@ -2170,7 +2169,7 @@ export class Session {
2170
2169
  id: uuidv4(),
2171
2170
  timestamp: new Date(),
2172
2171
  type: "error",
2173
- content: `Failed to resume agent: ${error.message}`,
2172
+ content: `Failed to resume agent: ${getErrorMessage(error)}`,
2174
2173
  },
2175
2174
  });
2176
2175
  }
@@ -2301,7 +2300,7 @@ export class Session {
2301
2300
  id: uuidv4(),
2302
2301
  timestamp: new Date(),
2303
2302
  type: "error",
2304
- content: `Failed to refresh agent: ${error.message}`,
2303
+ content: `Failed to refresh agent: ${getErrorMessage(error)}`,
2305
2304
  },
2306
2305
  });
2307
2306
  }
@@ -2434,7 +2433,7 @@ export class Session {
2434
2433
  type: "list_provider_models_response",
2435
2434
  payload: {
2436
2435
  provider: msg.provider,
2437
- error: error?.message ?? String(error),
2436
+ error: getErrorMessage(error),
2438
2437
  fetchedAt,
2439
2438
  requestId: msg.requestId,
2440
2439
  },
@@ -2561,7 +2560,7 @@ export class Session {
2561
2560
  type: "list_provider_modes_response",
2562
2561
  payload: {
2563
2562
  provider: msg.provider,
2564
- error: error?.message ?? String(error),
2563
+ error: getErrorMessage(error),
2565
2564
  fetchedAt,
2566
2565
  requestId: msg.requestId,
2567
2566
  },
@@ -2618,7 +2617,7 @@ export class Session {
2618
2617
  type: "list_provider_features_response",
2619
2618
  payload: {
2620
2619
  provider: msg.draftConfig.provider,
2621
- error: error?.message ?? String(error),
2620
+ error: getErrorMessage(error),
2622
2621
  fetchedAt,
2623
2622
  requestId: msg.requestId,
2624
2623
  },
@@ -2645,7 +2644,7 @@ export class Session {
2645
2644
  type: "list_available_providers_response",
2646
2645
  payload: {
2647
2646
  providers: [],
2648
- error: error?.message ?? String(error),
2647
+ error: getErrorMessage(error),
2649
2648
  fetchedAt,
2650
2649
  requestId: msg.requestId,
2651
2650
  },
@@ -2861,7 +2860,7 @@ export class Session {
2861
2860
  return snapshot.git.isDirty === true;
2862
2861
  }
2863
2862
  catch (error) {
2864
- throw new Error(`Unable to inspect git status for ${cwd}: ${error.message}`, {
2863
+ throw new Error(`Unable to inspect git status for ${cwd}: ${getErrorMessage(error)}`, {
2865
2864
  cause: error,
2866
2865
  });
2867
2866
  }
@@ -2934,7 +2933,7 @@ export class Session {
2934
2933
  id: uuidv4(),
2935
2934
  timestamp: new Date(),
2936
2935
  type: "error",
2937
- content: `Failed to set agent mode: ${error.message}`,
2936
+ content: `Failed to set agent mode: ${getErrorMessage(error)}`,
2938
2937
  },
2939
2938
  });
2940
2939
  this.emit({
@@ -2943,9 +2942,7 @@ export class Session {
2943
2942
  requestId,
2944
2943
  agentId,
2945
2944
  accepted: false,
2946
- error: error?.message
2947
- ? String(error.message)
2948
- : "Failed to set agent mode",
2945
+ error: getErrorMessageOr(error, "Failed to set agent mode"),
2949
2946
  },
2950
2947
  });
2951
2948
  }
@@ -2968,7 +2965,7 @@ export class Session {
2968
2965
  id: uuidv4(),
2969
2966
  timestamp: new Date(),
2970
2967
  type: "error",
2971
- content: `Failed to set agent model: ${error.message}`,
2968
+ content: `Failed to set agent model: ${getErrorMessage(error)}`,
2972
2969
  },
2973
2970
  });
2974
2971
  this.emit({
@@ -2977,9 +2974,7 @@ export class Session {
2977
2974
  requestId,
2978
2975
  agentId,
2979
2976
  accepted: false,
2980
- error: error?.message
2981
- ? String(error.message)
2982
- : "Failed to set agent model",
2977
+ error: getErrorMessageOr(error, "Failed to set agent model"),
2983
2978
  },
2984
2979
  });
2985
2980
  }
@@ -3002,7 +2997,7 @@ export class Session {
3002
2997
  id: uuidv4(),
3003
2998
  timestamp: new Date(),
3004
2999
  type: "error",
3005
- content: `Failed to set agent feature: ${error.message}`,
3000
+ content: `Failed to set agent feature: ${getErrorMessage(error)}`,
3006
3001
  },
3007
3002
  });
3008
3003
  this.emit({
@@ -3011,9 +3006,7 @@ export class Session {
3011
3006
  requestId,
3012
3007
  agentId,
3013
3008
  accepted: false,
3014
- error: error?.message
3015
- ? String(error.message)
3016
- : "Failed to set agent feature",
3009
+ error: getErrorMessageOr(error, "Failed to set agent feature"),
3017
3010
  },
3018
3011
  });
3019
3012
  }
@@ -3036,7 +3029,7 @@ export class Session {
3036
3029
  id: uuidv4(),
3037
3030
  timestamp: new Date(),
3038
3031
  type: "error",
3039
- content: `Failed to set agent thinking option: ${error.message}`,
3032
+ content: `Failed to set agent thinking option: ${getErrorMessage(error)}`,
3040
3033
  },
3041
3034
  });
3042
3035
  this.emit({
@@ -3045,9 +3038,7 @@ export class Session {
3045
3038
  requestId,
3046
3039
  agentId,
3047
3040
  accepted: false,
3048
- error: error?.message
3049
- ? String(error.message)
3050
- : "Failed to set agent thinking option",
3041
+ error: getErrorMessageOr(error, "Failed to set agent thinking option"),
3051
3042
  },
3052
3043
  });
3053
3044
  }
@@ -3162,7 +3153,7 @@ export class Session {
3162
3153
  payload: {
3163
3154
  agentId,
3164
3155
  commands: [],
3165
- error: error.message,
3156
+ error: getErrorMessage(error),
3166
3157
  requestId,
3167
3158
  },
3168
3159
  });
@@ -3189,7 +3180,7 @@ export class Session {
3189
3180
  id: uuidv4(),
3190
3181
  timestamp: new Date(),
3191
3182
  type: "error",
3192
- content: `Failed to respond to permission: ${error.message}`,
3183
+ content: `Failed to respond to permission: ${getErrorMessage(error)}`,
3193
3184
  },
3194
3185
  });
3195
3186
  throw error;
@@ -3276,7 +3267,7 @@ export class Session {
3276
3267
  return;
3277
3268
  default: {
3278
3269
  const exhaustiveCheck = resolution;
3279
- throw new Error(`Unhandled branch resolution: ${exhaustiveCheck}`);
3270
+ throw new Error(`Unhandled branch resolution: ${getErrorMessage(exhaustiveCheck)}`);
3280
3271
  }
3281
3272
  }
3282
3273
  }
@@ -4157,7 +4148,7 @@ export class Session {
4157
4148
  mode,
4158
4149
  directory: null,
4159
4150
  file: null,
4160
- error: error.message,
4151
+ error: getErrorMessage(error),
4161
4152
  requestId,
4162
4153
  },
4163
4154
  });
@@ -4186,7 +4177,7 @@ export class Session {
4186
4177
  payload: {
4187
4178
  cwd,
4188
4179
  icon: null,
4189
- error: error.message,
4180
+ error: getErrorMessage(error),
4190
4181
  requestId,
4191
4182
  },
4192
4183
  });
@@ -4252,7 +4243,7 @@ export class Session {
4252
4243
  fileName: null,
4253
4244
  mimeType: null,
4254
4245
  size: null,
4255
- error: error.message,
4246
+ error: getErrorMessage(error),
4256
4247
  requestId,
4257
4248
  },
4258
4249
  });
@@ -4488,7 +4479,7 @@ export class Session {
4488
4479
  return {
4489
4480
  id: workspace.workspaceId,
4490
4481
  projectId: workspace.projectId,
4491
- projectDisplayName: resolvedProjectRecord?.displayName ?? String(workspace.projectId),
4482
+ projectDisplayName: resolvedProjectRecord?.displayName ?? workspace.projectId,
4492
4483
  projectRootPath: resolvedProjectRecord?.rootPath ?? workspace.cwd,
4493
4484
  workspaceDirectory: workspace.cwd,
4494
4485
  projectKind: (resolvedProjectRecord?.kind ?? "directory") === "git" ? "git" : "non_git",
@@ -4559,7 +4550,7 @@ export class Session {
4559
4550
  return {
4560
4551
  id: result.workspace.workspaceId,
4561
4552
  projectId: result.workspace.projectId,
4562
- projectDisplayName: projectRecord?.displayName ?? String(result.workspace.projectId),
4553
+ projectDisplayName: projectRecord?.displayName ?? result.workspace.projectId,
4563
4554
  projectRootPath: projectRecord?.rootPath ?? result.repoRoot,
4564
4555
  workspaceDirectory: result.workspace.cwd,
4565
4556
  projectKind: "git",
@@ -5551,8 +5542,9 @@ export class Session {
5551
5542
  const agentId = resolved.agentId;
5552
5543
  const prompt = this.buildAgentPrompt(msg.text, msg.images, msg.attachments);
5553
5544
  this.sessionLogger.trace({ agentId, messageId: msg.messageId, textPrefix: msg.text.slice(0, 80) }, "send_agent_message_request: dispatching shared sendPromptToAgent");
5545
+ let dispatchResult;
5554
5546
  try {
5555
- await sendPromptToAgent({
5547
+ dispatchResult = await sendPromptToAgent({
5556
5548
  agentManager: this.agentManager,
5557
5549
  agentStorage: this.agentStorage,
5558
5550
  agentId,
@@ -5576,6 +5568,18 @@ export class Session {
5576
5568
  });
5577
5569
  return;
5578
5570
  }
5571
+ if (dispatchResult.outOfBand) {
5572
+ this.emit({
5573
+ type: "send_agent_message_response",
5574
+ payload: {
5575
+ requestId: msg.requestId,
5576
+ agentId,
5577
+ accepted: true,
5578
+ error: null,
5579
+ },
5580
+ });
5581
+ return;
5582
+ }
5579
5583
  const startAbort = new AbortController();
5580
5584
  const startTimeoutMs = 15000;
5581
5585
  const startTimeout = setTimeout(() => startAbort.abort("timeout"), startTimeoutMs);
@@ -5777,12 +5781,6 @@ export class Session {
5777
5781
  const chunkBytes = Buffer.byteLength(msg.audio, "base64");
5778
5782
  this.voiceInputChunkCount += 1;
5779
5783
  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
5784
  const now = Date.now();
5787
5785
  if (this.voiceInputChunkCount % 50 === 0 || now - this.voiceInputWindowStartedAt >= 1000) {
5788
5786
  this.sessionLogger.info({
@@ -5943,7 +5941,7 @@ export class Session {
5943
5941
  id: uuidv4(),
5944
5942
  timestamp: new Date(),
5945
5943
  type: "error",
5946
- content: `Transcription error: ${error.message}`,
5944
+ content: `Transcription error: ${getErrorMessage(error)}`,
5947
5945
  },
5948
5946
  });
5949
5947
  throw error;
@@ -6110,7 +6108,6 @@ export class Session {
6110
6108
  * Clear speech-in-progress flag once the user turn has completed
6111
6109
  */
6112
6110
  clearSpeechInProgress(reason) {
6113
- this.clearPendingVoiceSpeechStart(`clear-speech-in-progress:${reason}`);
6114
6111
  if (!this.speechInProgress) {
6115
6112
  return;
6116
6113
  }
@@ -6457,6 +6454,7 @@ export class Session {
6457
6454
  target,
6458
6455
  maxRuns: request.maxRuns,
6459
6456
  expiresAt: request.expiresAt,
6457
+ runOnCreate: request.runOnCreate,
6460
6458
  });
6461
6459
  this.emit({
6462
6460
  type: "schedule/create/response",
@@ -6567,6 +6565,46 @@ export class Session {
6567
6565
  this.emitScheduleRpcError(request, error);
6568
6566
  }
6569
6567
  }
6568
+ async handleScheduleRunOnceRequest(request) {
6569
+ try {
6570
+ const schedule = await this.scheduleService.runOnce(request.scheduleId);
6571
+ this.emit({
6572
+ type: "schedule/run-once/response",
6573
+ payload: {
6574
+ requestId: request.requestId,
6575
+ schedule,
6576
+ error: null,
6577
+ },
6578
+ });
6579
+ }
6580
+ catch (error) {
6581
+ this.emitScheduleRpcError(request, error);
6582
+ }
6583
+ }
6584
+ async handleScheduleUpdateRequest(request) {
6585
+ try {
6586
+ const schedule = await this.scheduleService.update({
6587
+ id: request.scheduleId,
6588
+ ...(request.name !== undefined ? { name: request.name } : {}),
6589
+ ...(request.prompt !== undefined ? { prompt: request.prompt } : {}),
6590
+ ...(request.cadence !== undefined ? { cadence: request.cadence } : {}),
6591
+ ...(request.newAgentConfig !== undefined ? { newAgentConfig: request.newAgentConfig } : {}),
6592
+ ...(request.maxRuns !== undefined ? { maxRuns: request.maxRuns } : {}),
6593
+ ...(request.expiresAt !== undefined ? { expiresAt: request.expiresAt } : {}),
6594
+ });
6595
+ this.emit({
6596
+ type: "schedule/update/response",
6597
+ payload: {
6598
+ requestId: request.requestId,
6599
+ schedule,
6600
+ error: null,
6601
+ },
6602
+ });
6603
+ }
6604
+ catch (error) {
6605
+ this.emitScheduleRpcError(request, error);
6606
+ }
6607
+ }
6570
6608
  emitLoopRpcError(request, error) {
6571
6609
  const message = error instanceof Error ? error.message : String(error);
6572
6610
  this.sessionLogger.error({ err: error, requestType: request.type }, "Loop request failed");
@@ -6587,10 +6625,12 @@ export class Session {
6587
6625
  cwd: request.cwd,
6588
6626
  provider: request.provider,
6589
6627
  model: request.model,
6628
+ modeId: request.modeId,
6590
6629
  workerProvider: request.workerProvider,
6591
6630
  workerModel: request.workerModel,
6592
6631
  verifierProvider: request.verifierProvider,
6593
6632
  verifierModel: request.verifierModel,
6633
+ verifierModeId: request.verifierModeId,
6594
6634
  verifyPrompt: request.verifyPrompt,
6595
6635
  verifyChecks: request.verifyChecks,
6596
6636
  archive: request.archive,