@ck123pm/paseo-server 0.1.80

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 (1077) hide show
  1. package/.env.example +23 -0
  2. package/README.md +111 -0
  3. package/dist/scripts/dev-runner.js +49 -0
  4. package/dist/scripts/dev-runner.js.map +1 -0
  5. package/dist/scripts/mcp-stdio-socket-bridge-cli.mjs +62 -0
  6. package/dist/scripts/supervisor-entrypoint.js +126 -0
  7. package/dist/scripts/supervisor-entrypoint.js.map +1 -0
  8. package/dist/scripts/supervisor-log-config.js +31 -0
  9. package/dist/scripts/supervisor-log-config.js.map +1 -0
  10. package/dist/scripts/supervisor.js +213 -0
  11. package/dist/scripts/supervisor.js.map +1 -0
  12. package/dist/server/client/daemon-client-relay-e2ee-transport.d.ts +8 -0
  13. package/dist/server/client/daemon-client-relay-e2ee-transport.d.ts.map +1 -0
  14. package/dist/server/client/daemon-client-relay-e2ee-transport.js +161 -0
  15. package/dist/server/client/daemon-client-relay-e2ee-transport.js.map +1 -0
  16. package/dist/server/client/daemon-client-runtime-metrics.d.ts +39 -0
  17. package/dist/server/client/daemon-client-runtime-metrics.d.ts.map +1 -0
  18. package/dist/server/client/daemon-client-runtime-metrics.js +173 -0
  19. package/dist/server/client/daemon-client-runtime-metrics.js.map +1 -0
  20. package/dist/server/client/daemon-client-transport-types.d.ts +36 -0
  21. package/dist/server/client/daemon-client-transport-types.d.ts.map +1 -0
  22. package/dist/server/client/daemon-client-transport-types.js +2 -0
  23. package/dist/server/client/daemon-client-transport-types.js.map +1 -0
  24. package/dist/server/client/daemon-client-transport-utils.d.ts +9 -0
  25. package/dist/server/client/daemon-client-transport-utils.d.ts.map +1 -0
  26. package/dist/server/client/daemon-client-transport-utils.js +121 -0
  27. package/dist/server/client/daemon-client-transport-utils.js.map +1 -0
  28. package/dist/server/client/daemon-client-transport.d.ts +5 -0
  29. package/dist/server/client/daemon-client-transport.d.ts.map +1 -0
  30. package/dist/server/client/daemon-client-transport.js +4 -0
  31. package/dist/server/client/daemon-client-transport.js.map +1 -0
  32. package/dist/server/client/daemon-client-websocket-transport.d.ts +8 -0
  33. package/dist/server/client/daemon-client-websocket-transport.d.ts.map +1 -0
  34. package/dist/server/client/daemon-client-websocket-transport.js +120 -0
  35. package/dist/server/client/daemon-client-websocket-transport.js.map +1 -0
  36. package/dist/server/client/daemon-client.d.ts +862 -0
  37. package/dist/server/client/daemon-client.d.ts.map +1 -0
  38. package/dist/server/client/daemon-client.js +3376 -0
  39. package/dist/server/client/daemon-client.js.map +1 -0
  40. package/dist/server/client/terminal-stream-router.d.ts +24 -0
  41. package/dist/server/client/terminal-stream-router.d.ts.map +1 -0
  42. package/dist/server/client/terminal-stream-router.js +100 -0
  43. package/dist/server/client/terminal-stream-router.js.map +1 -0
  44. package/dist/server/server/agent/activity-curator.d.ts +11 -0
  45. package/dist/server/server/agent/activity-curator.d.ts.map +1 -0
  46. package/dist/server/server/agent/activity-curator.js +150 -0
  47. package/dist/server/server/agent/activity-curator.js.map +1 -0
  48. package/dist/server/server/agent/agent-archive.d.ts +11 -0
  49. package/dist/server/server/agent/agent-archive.d.ts.map +1 -0
  50. package/dist/server/server/agent/agent-archive.js +16 -0
  51. package/dist/server/server/agent/agent-archive.js.map +1 -0
  52. package/dist/server/server/agent/agent-loading.d.ts +12 -0
  53. package/dist/server/server/agent/agent-loading.d.ts.map +1 -0
  54. package/dist/server/server/agent/agent-loading.js +51 -0
  55. package/dist/server/server/agent/agent-loading.js.map +1 -0
  56. package/dist/server/server/agent/agent-manager.d.ts +342 -0
  57. package/dist/server/server/agent/agent-manager.d.ts.map +1 -0
  58. package/dist/server/server/agent/agent-manager.js +2572 -0
  59. package/dist/server/server/agent/agent-manager.js.map +1 -0
  60. package/dist/server/server/agent/agent-metadata-generator.d.ts +27 -0
  61. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -0
  62. package/dist/server/server/agent/agent-metadata-generator.js +104 -0
  63. package/dist/server/server/agent/agent-metadata-generator.js.map +1 -0
  64. package/dist/server/server/agent/agent-projections.d.ts +24 -0
  65. package/dist/server/server/agent/agent-projections.d.ts.map +1 -0
  66. package/dist/server/server/agent/agent-projections.js +406 -0
  67. package/dist/server/server/agent/agent-projections.js.map +1 -0
  68. package/dist/server/server/agent/agent-prompt.d.ts +72 -0
  69. package/dist/server/server/agent/agent-prompt.d.ts.map +1 -0
  70. package/dist/server/server/agent/agent-prompt.js +196 -0
  71. package/dist/server/server/agent/agent-prompt.js.map +1 -0
  72. package/dist/server/server/agent/agent-response-loop.d.ts +62 -0
  73. package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -0
  74. package/dist/server/server/agent/agent-response-loop.js +321 -0
  75. package/dist/server/server/agent/agent-response-loop.js.map +1 -0
  76. package/dist/server/server/agent/agent-sdk-types.d.ts +540 -0
  77. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -0
  78. package/dist/server/server/agent/agent-sdk-types.js +22 -0
  79. package/dist/server/server/agent/agent-sdk-types.js.map +1 -0
  80. package/dist/server/server/agent/agent-storage.d.ts +346 -0
  81. package/dist/server/server/agent/agent-storage.d.ts.map +1 -0
  82. package/dist/server/server/agent/agent-storage.js +340 -0
  83. package/dist/server/server/agent/agent-storage.js.map +1 -0
  84. package/dist/server/server/agent/agent-stream-coalescer.d.ts +41 -0
  85. package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -0
  86. package/dist/server/server/agent/agent-stream-coalescer.js +166 -0
  87. package/dist/server/server/agent/agent-stream-coalescer.js.map +1 -0
  88. package/dist/server/server/agent/agent-timeline-store-types.d.ts +54 -0
  89. package/dist/server/server/agent/agent-timeline-store-types.d.ts.map +1 -0
  90. package/dist/server/server/agent/agent-timeline-store-types.js +2 -0
  91. package/dist/server/server/agent/agent-timeline-store-types.js.map +1 -0
  92. package/dist/server/server/agent/agent-timeline-store.d.ts +32 -0
  93. package/dist/server/server/agent/agent-timeline-store.d.ts.map +1 -0
  94. package/dist/server/server/agent/agent-timeline-store.js +263 -0
  95. package/dist/server/server/agent/agent-timeline-store.js.map +1 -0
  96. package/dist/server/server/agent/agent-title-limits.d.ts +3 -0
  97. package/dist/server/server/agent/agent-title-limits.d.ts.map +1 -0
  98. package/dist/server/server/agent/agent-title-limits.js +3 -0
  99. package/dist/server/server/agent/agent-title-limits.js.map +1 -0
  100. package/dist/server/server/agent/audio-utils.d.ts +3 -0
  101. package/dist/server/server/agent/audio-utils.d.ts.map +1 -0
  102. package/dist/server/server/agent/audio-utils.js +19 -0
  103. package/dist/server/server/agent/audio-utils.js.map +1 -0
  104. package/dist/server/server/agent/create-agent-mode.d.ts +16 -0
  105. package/dist/server/server/agent/create-agent-mode.d.ts.map +1 -0
  106. package/dist/server/server/agent/create-agent-mode.js +26 -0
  107. package/dist/server/server/agent/create-agent-mode.js.map +1 -0
  108. package/dist/server/server/agent/create-agent-title.d.ts +8 -0
  109. package/dist/server/server/agent/create-agent-title.d.ts.map +1 -0
  110. package/dist/server/server/agent/create-agent-title.js +29 -0
  111. package/dist/server/server/agent/create-agent-title.js.map +1 -0
  112. package/dist/server/server/agent/dictation-debug.d.ts +13 -0
  113. package/dist/server/server/agent/dictation-debug.d.ts.map +1 -0
  114. package/dist/server/server/agent/dictation-debug.js +50 -0
  115. package/dist/server/server/agent/dictation-debug.js.map +1 -0
  116. package/dist/server/server/agent/foreground-run-state.d.ts +50 -0
  117. package/dist/server/server/agent/foreground-run-state.d.ts.map +1 -0
  118. package/dist/server/server/agent/foreground-run-state.js +160 -0
  119. package/dist/server/server/agent/foreground-run-state.js.map +1 -0
  120. package/dist/server/server/agent/import-sessions.d.ts +52 -0
  121. package/dist/server/server/agent/import-sessions.d.ts.map +1 -0
  122. package/dist/server/server/agent/import-sessions.js +212 -0
  123. package/dist/server/server/agent/import-sessions.js.map +1 -0
  124. package/dist/server/server/agent/mcp-server.d.ts +46 -0
  125. package/dist/server/server/agent/mcp-server.d.ts.map +1 -0
  126. package/dist/server/server/agent/mcp-server.js +1962 -0
  127. package/dist/server/server/agent/mcp-server.js.map +1 -0
  128. package/dist/server/server/agent/mcp-shared.d.ts +316 -0
  129. package/dist/server/server/agent/mcp-shared.d.ts.map +1 -0
  130. package/dist/server/server/agent/mcp-shared.js +194 -0
  131. package/dist/server/server/agent/mcp-shared.js.map +1 -0
  132. package/dist/server/server/agent/model-resolver.d.ts +11 -0
  133. package/dist/server/server/agent/model-resolver.d.ts.map +1 -0
  134. package/dist/server/server/agent/model-resolver.js +27 -0
  135. package/dist/server/server/agent/model-resolver.js.map +1 -0
  136. package/dist/server/server/agent/pcm16-resampler.d.ts +14 -0
  137. package/dist/server/server/agent/pcm16-resampler.d.ts.map +1 -0
  138. package/dist/server/server/agent/pcm16-resampler.js +63 -0
  139. package/dist/server/server/agent/pcm16-resampler.js.map +1 -0
  140. package/dist/server/server/agent/prompt-attachments.d.ts +7 -0
  141. package/dist/server/server/agent/prompt-attachments.d.ts.map +1 -0
  142. package/dist/server/server/agent/prompt-attachments.js +72 -0
  143. package/dist/server/server/agent/prompt-attachments.js.map +1 -0
  144. package/dist/server/server/agent/provider-history-timestamps.d.ts +2 -0
  145. package/dist/server/server/agent/provider-history-timestamps.d.ts.map +1 -0
  146. package/dist/server/server/agent/provider-history-timestamps.js +16 -0
  147. package/dist/server/server/agent/provider-history-timestamps.js.map +1 -0
  148. package/dist/server/server/agent/provider-launch-config.d.ts +368 -0
  149. package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -0
  150. package/dist/server/server/agent/provider-launch-config.js +190 -0
  151. package/dist/server/server/agent/provider-launch-config.js.map +1 -0
  152. package/dist/server/server/agent/provider-manifest.d.ts +33 -0
  153. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -0
  154. package/dist/server/server/agent/provider-manifest.js +211 -0
  155. package/dist/server/server/agent/provider-manifest.js.map +1 -0
  156. package/dist/server/server/agent/provider-registry.d.ts +33 -0
  157. package/dist/server/server/agent/provider-registry.d.ts.map +1 -0
  158. package/dist/server/server/agent/provider-registry.js +396 -0
  159. package/dist/server/server/agent/provider-registry.js.map +1 -0
  160. package/dist/server/server/agent/provider-snapshot-manager.d.ts +49 -0
  161. package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -0
  162. package/dist/server/server/agent/provider-snapshot-manager.js +348 -0
  163. package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -0
  164. package/dist/server/server/agent/providers/acp-agent.d.ts +286 -0
  165. package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -0
  166. package/dist/server/server/agent/providers/acp-agent.js +2070 -0
  167. package/dist/server/server/agent/providers/acp-agent.js.map +1 -0
  168. package/dist/server/server/agent/providers/claude/agent.d.ts +60 -0
  169. package/dist/server/server/agent/providers/claude/agent.d.ts.map +1 -0
  170. package/dist/server/server/agent/providers/claude/agent.js +3815 -0
  171. package/dist/server/server/agent/providers/claude/agent.js.map +1 -0
  172. package/dist/server/server/agent/providers/claude/models.d.ts +10 -0
  173. package/dist/server/server/agent/providers/claude/models.d.ts.map +1 -0
  174. package/dist/server/server/agent/providers/claude/models.js +170 -0
  175. package/dist/server/server/agent/providers/claude/models.js.map +1 -0
  176. package/dist/server/server/agent/providers/claude/partial-json.d.ts +5 -0
  177. package/dist/server/server/agent/providers/claude/partial-json.d.ts.map +1 -0
  178. package/dist/server/server/agent/providers/claude/partial-json.js +306 -0
  179. package/dist/server/server/agent/providers/claude/partial-json.js.map +1 -0
  180. package/dist/server/server/agent/providers/claude/project-dir.d.ts +5 -0
  181. package/dist/server/server/agent/providers/claude/project-dir.d.ts.map +1 -0
  182. package/dist/server/server/agent/providers/claude/project-dir.js +40 -0
  183. package/dist/server/server/agent/providers/claude/project-dir.js.map +1 -0
  184. package/dist/server/server/agent/providers/claude/query.d.ts +14 -0
  185. package/dist/server/server/agent/providers/claude/query.d.ts.map +1 -0
  186. package/dist/server/server/agent/providers/claude/query.js +84 -0
  187. package/dist/server/server/agent/providers/claude/query.js.map +1 -0
  188. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +22 -0
  189. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts.map +1 -0
  190. package/dist/server/server/agent/providers/claude/sidechain-tracker.js +232 -0
  191. package/dist/server/server/agent/providers/claude/sidechain-tracker.js.map +1 -0
  192. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +55 -0
  193. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -0
  194. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +272 -0
  195. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -0
  196. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts +3 -0
  197. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -0
  198. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +130 -0
  199. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -0
  200. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +16 -0
  201. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -0
  202. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +129 -0
  203. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -0
  204. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +32 -0
  205. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts.map +1 -0
  206. package/dist/server/server/agent/providers/codex/app-server-transport.js +214 -0
  207. package/dist/server/server/agent/providers/codex/app-server-transport.js.map +1 -0
  208. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts +31 -0
  209. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts.map +1 -0
  210. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js +172 -0
  211. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js.map +1 -0
  212. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +12 -0
  213. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts.map +1 -0
  214. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js +104 -0
  215. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js.map +1 -0
  216. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +15 -0
  217. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -0
  218. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +791 -0
  219. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -0
  220. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +307 -0
  221. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -0
  222. package/dist/server/server/agent/providers/codex-app-server-agent.js +4364 -0
  223. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -0
  224. package/dist/server/server/agent/providers/codex-feature-definitions.d.ts +11 -0
  225. package/dist/server/server/agent/providers/codex-feature-definitions.d.ts.map +1 -0
  226. package/dist/server/server/agent/providers/codex-feature-definitions.js +45 -0
  227. package/dist/server/server/agent/providers/codex-feature-definitions.js.map +1 -0
  228. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts +9 -0
  229. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -0
  230. package/dist/server/server/agent/providers/codex-rollout-timeline.js +555 -0
  231. package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -0
  232. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +25 -0
  233. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +1 -0
  234. package/dist/server/server/agent/providers/copilot-acp-agent.js +203 -0
  235. package/dist/server/server/agent/providers/copilot-acp-agent.js.map +1 -0
  236. package/dist/server/server/agent/providers/cursor-acp-agent.d.ts +21 -0
  237. package/dist/server/server/agent/providers/cursor-acp-agent.d.ts.map +1 -0
  238. package/dist/server/server/agent/providers/cursor-acp-agent.js +95 -0
  239. package/dist/server/server/agent/providers/cursor-acp-agent.js.map +1 -0
  240. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +17 -0
  241. package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -0
  242. package/dist/server/server/agent/providers/diagnostic-utils.js +127 -0
  243. package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -0
  244. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +33 -0
  245. package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -0
  246. package/dist/server/server/agent/providers/generic-acp-agent.js +234 -0
  247. package/dist/server/server/agent/providers/generic-acp-agent.js.map +1 -0
  248. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +68 -0
  249. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -0
  250. package/dist/server/server/agent/providers/mock-load-test-agent.js +770 -0
  251. package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -0
  252. package/dist/server/server/agent/providers/opencode/runtime.d.ts +27 -0
  253. package/dist/server/server/agent/providers/opencode/runtime.d.ts.map +1 -0
  254. package/dist/server/server/agent/providers/opencode/runtime.js +5 -0
  255. package/dist/server/server/agent/providers/opencode/runtime.js.map +1 -0
  256. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +55 -0
  257. package/dist/server/server/agent/providers/opencode/server-manager.d.ts.map +1 -0
  258. package/dist/server/server/agent/providers/opencode/server-manager.js +256 -0
  259. package/dist/server/server/agent/providers/opencode/server-manager.js.map +1 -0
  260. package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +22 -0
  261. package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts.map +1 -0
  262. package/dist/server/server/agent/providers/opencode/test-server-manager.js +28 -0
  263. package/dist/server/server/agent/providers/opencode/test-server-manager.js.map +1 -0
  264. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.d.ts +83 -0
  265. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.d.ts.map +1 -0
  266. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.js +225 -0
  267. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.js.map +1 -0
  268. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +3 -0
  269. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts.map +1 -0
  270. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +131 -0
  271. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js.map +1 -0
  272. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +13 -0
  273. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +1 -0
  274. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +53 -0
  275. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +1 -0
  276. package/dist/server/server/agent/providers/opencode-agent.d.ts +231 -0
  277. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -0
  278. package/dist/server/server/agent/providers/opencode-agent.js +2443 -0
  279. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -0
  280. package/dist/server/server/agent/providers/pi/agent.d.ts +84 -0
  281. package/dist/server/server/agent/providers/pi/agent.d.ts.map +1 -0
  282. package/dist/server/server/agent/providers/pi/agent.js +828 -0
  283. package/dist/server/server/agent/providers/pi/agent.js.map +1 -0
  284. package/dist/server/server/agent/providers/pi/cli-runtime.d.ts +18 -0
  285. package/dist/server/server/agent/providers/pi/cli-runtime.d.ts.map +1 -0
  286. package/dist/server/server/agent/providers/pi/cli-runtime.js +211 -0
  287. package/dist/server/server/agent/providers/pi/cli-runtime.js.map +1 -0
  288. package/dist/server/server/agent/providers/pi/history-mapper.d.ts +5 -0
  289. package/dist/server/server/agent/providers/pi/history-mapper.d.ts.map +1 -0
  290. package/dist/server/server/agent/providers/pi/history-mapper.js +139 -0
  291. package/dist/server/server/agent/providers/pi/history-mapper.js.map +1 -0
  292. package/dist/server/server/agent/providers/pi/rpc-types.d.ts +185 -0
  293. package/dist/server/server/agent/providers/pi/rpc-types.d.ts.map +1 -0
  294. package/dist/server/server/agent/providers/pi/rpc-types.js +2 -0
  295. package/dist/server/server/agent/providers/pi/rpc-types.js.map +1 -0
  296. package/dist/server/server/agent/providers/pi/runtime.d.ts +47 -0
  297. package/dist/server/server/agent/providers/pi/runtime.d.ts.map +1 -0
  298. package/dist/server/server/agent/providers/pi/runtime.js +47 -0
  299. package/dist/server/server/agent/providers/pi/runtime.js.map +1 -0
  300. package/dist/server/server/agent/providers/pi/session-descriptor.d.ts +10 -0
  301. package/dist/server/server/agent/providers/pi/session-descriptor.d.ts.map +1 -0
  302. package/dist/server/server/agent/providers/pi/session-descriptor.js +300 -0
  303. package/dist/server/server/agent/providers/pi/session-descriptor.js.map +1 -0
  304. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts +52 -0
  305. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts.map +1 -0
  306. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js +109 -0
  307. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js.map +1 -0
  308. package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts +112 -0
  309. package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts.map +1 -0
  310. package/dist/server/server/agent/providers/pi/tool-call-mapper.js +284 -0
  311. package/dist/server/server/agent/providers/pi/tool-call-mapper.js.map +1 -0
  312. package/dist/server/server/agent/providers/provider-image-output.d.ts +20 -0
  313. package/dist/server/server/agent/providers/provider-image-output.d.ts.map +1 -0
  314. package/dist/server/server/agent/providers/provider-image-output.js +51 -0
  315. package/dist/server/server/agent/providers/provider-image-output.js.map +1 -0
  316. package/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
  317. package/dist/server/server/agent/providers/provider-runner.d.ts.map +1 -0
  318. package/dist/server/server/agent/providers/provider-runner.js +81 -0
  319. package/dist/server/server/agent/providers/provider-runner.js.map +1 -0
  320. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts +3 -0
  321. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -0
  322. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +60 -0
  323. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -0
  324. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +1751 -0
  325. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -0
  326. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +709 -0
  327. package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -0
  328. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +20 -0
  329. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -0
  330. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +146 -0
  331. package/dist/server/server/agent/providers/tool-call-mapper-utils.js.map +1 -0
  332. package/dist/server/server/agent/recordings-debug.d.ts +3 -0
  333. package/dist/server/server/agent/recordings-debug.d.ts.map +1 -0
  334. package/dist/server/server/agent/recordings-debug.js +19 -0
  335. package/dist/server/server/agent/recordings-debug.js.map +1 -0
  336. package/dist/server/server/agent/stt-debug.d.ts +10 -0
  337. package/dist/server/server/agent/stt-debug.d.ts.map +1 -0
  338. package/dist/server/server/agent/stt-debug.js +33 -0
  339. package/dist/server/server/agent/stt-debug.js.map +1 -0
  340. package/dist/server/server/agent/stt-manager.d.ts +38 -0
  341. package/dist/server/server/agent/stt-manager.d.ts.map +1 -0
  342. package/dist/server/server/agent/stt-manager.js +246 -0
  343. package/dist/server/server/agent/stt-manager.js.map +1 -0
  344. package/dist/server/server/agent/system-prompt.d.ts +2 -0
  345. package/dist/server/server/agent/system-prompt.d.ts.map +1 -0
  346. package/dist/server/server/agent/system-prompt.js +8 -0
  347. package/dist/server/server/agent/system-prompt.js.map +1 -0
  348. package/dist/server/server/agent/timeline-append.d.ts +10 -0
  349. package/dist/server/server/agent/timeline-append.d.ts.map +1 -0
  350. package/dist/server/server/agent/timeline-append.js +27 -0
  351. package/dist/server/server/agent/timeline-append.js.map +1 -0
  352. package/dist/server/server/agent/timeline-projection.d.ts +55 -0
  353. package/dist/server/server/agent/timeline-projection.d.ts.map +1 -0
  354. package/dist/server/server/agent/timeline-projection.js +279 -0
  355. package/dist/server/server/agent/timeline-projection.js.map +1 -0
  356. package/dist/server/server/agent/tool-name-normalization.d.ts +9 -0
  357. package/dist/server/server/agent/tool-name-normalization.d.ts.map +1 -0
  358. package/dist/server/server/agent/tool-name-normalization.js +82 -0
  359. package/dist/server/server/agent/tool-name-normalization.js.map +1 -0
  360. package/dist/server/server/agent/tts-debug.d.ts +8 -0
  361. package/dist/server/server/agent/tts-debug.d.ts.map +1 -0
  362. package/dist/server/server/agent/tts-debug.js +24 -0
  363. package/dist/server/server/agent/tts-debug.js.map +1 -0
  364. package/dist/server/server/agent/tts-manager.d.ts +41 -0
  365. package/dist/server/server/agent/tts-manager.d.ts.map +1 -0
  366. package/dist/server/server/agent/tts-manager.js +375 -0
  367. package/dist/server/server/agent/tts-manager.js.map +1 -0
  368. package/dist/server/server/agent/wait-for-agent-tracker.d.ts +15 -0
  369. package/dist/server/server/agent/wait-for-agent-tracker.d.ts.map +1 -0
  370. package/dist/server/server/agent/wait-for-agent-tracker.js +53 -0
  371. package/dist/server/server/agent/wait-for-agent-tracker.js.map +1 -0
  372. package/dist/server/server/agent-attention-policy.d.ts +20 -0
  373. package/dist/server/server/agent-attention-policy.d.ts.map +1 -0
  374. package/dist/server/server/agent-attention-policy.js +24 -0
  375. package/dist/server/server/agent-attention-policy.js.map +1 -0
  376. package/dist/server/server/auth.d.ts +25 -0
  377. package/dist/server/server/auth.d.ts.map +1 -0
  378. package/dist/server/server/auth.js +93 -0
  379. package/dist/server/server/auth.js.map +1 -0
  380. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +40 -0
  381. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts.map +1 -0
  382. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +80 -0
  383. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js.map +1 -0
  384. package/dist/server/server/auto-archive-on-merge/index.d.ts +8 -0
  385. package/dist/server/server/auto-archive-on-merge/index.d.ts.map +1 -0
  386. package/dist/server/server/auto-archive-on-merge/index.js +15 -0
  387. package/dist/server/server/auto-archive-on-merge/index.js.map +1 -0
  388. package/dist/server/server/bootstrap.d.ts +98 -0
  389. package/dist/server/server/bootstrap.d.ts.map +1 -0
  390. package/dist/server/server/bootstrap.js +800 -0
  391. package/dist/server/server/bootstrap.js.map +1 -0
  392. package/dist/server/server/chat/chat-mentions.d.ts +47 -0
  393. package/dist/server/server/chat/chat-mentions.d.ts.map +1 -0
  394. package/dist/server/server/chat/chat-mentions.js +113 -0
  395. package/dist/server/server/chat/chat-mentions.js.map +1 -0
  396. package/dist/server/server/chat/chat-rpc-schemas.d.ts +728 -0
  397. package/dist/server/server/chat/chat-rpc-schemas.d.ts.map +1 -0
  398. package/dist/server/server/chat/chat-rpc-schemas.js +103 -0
  399. package/dist/server/server/chat/chat-rpc-schemas.js.map +1 -0
  400. package/dist/server/server/chat/chat-service.d.ts +78 -0
  401. package/dist/server/server/chat/chat-service.d.ts.map +1 -0
  402. package/dist/server/server/chat/chat-service.js +339 -0
  403. package/dist/server/server/chat/chat-service.js.map +1 -0
  404. package/dist/server/server/chat/chat-types.d.ts +75 -0
  405. package/dist/server/server/chat/chat-types.d.ts.map +1 -0
  406. package/dist/server/server/chat/chat-types.js +22 -0
  407. package/dist/server/server/chat/chat-types.js.map +1 -0
  408. package/dist/server/server/checkout/status-projection.d.ts +19 -0
  409. package/dist/server/server/checkout/status-projection.d.ts.map +1 -0
  410. package/dist/server/server/checkout/status-projection.js +102 -0
  411. package/dist/server/server/checkout/status-projection.js.map +1 -0
  412. package/dist/server/server/checkout-diff-manager.d.ts +41 -0
  413. package/dist/server/server/checkout-diff-manager.d.ts.map +1 -0
  414. package/dist/server/server/checkout-diff-manager.js +189 -0
  415. package/dist/server/server/checkout-diff-manager.js.map +1 -0
  416. package/dist/server/server/checkout-git-utils.d.ts +11 -0
  417. package/dist/server/server/checkout-git-utils.d.ts.map +1 -0
  418. package/dist/server/server/checkout-git-utils.js +34 -0
  419. package/dist/server/server/checkout-git-utils.js.map +1 -0
  420. package/dist/server/server/client-message-id.d.ts +3 -0
  421. package/dist/server/server/client-message-id.d.ts.map +1 -0
  422. package/dist/server/server/client-message-id.js +12 -0
  423. package/dist/server/server/client-message-id.js.map +1 -0
  424. package/dist/server/server/config.d.ts +23 -0
  425. package/dist/server/server/config.d.ts.map +1 -0
  426. package/dist/server/server/config.js +233 -0
  427. package/dist/server/server/config.js.map +1 -0
  428. package/dist/server/server/connection-offer.d.ts +20 -0
  429. package/dist/server/server/connection-offer.d.ts.map +1 -0
  430. package/dist/server/server/connection-offer.js +59 -0
  431. package/dist/server/server/connection-offer.js.map +1 -0
  432. package/dist/server/server/daemon-config-store.d.ts +25 -0
  433. package/dist/server/server/daemon-config-store.d.ts.map +1 -0
  434. package/dist/server/server/daemon-config-store.js +138 -0
  435. package/dist/server/server/daemon-config-store.js.map +1 -0
  436. package/dist/server/server/daemon-keypair.d.ts +8 -0
  437. package/dist/server/server/daemon-keypair.d.ts.map +1 -0
  438. package/dist/server/server/daemon-keypair.js +42 -0
  439. package/dist/server/server/daemon-keypair.js.map +1 -0
  440. package/dist/server/server/daemon-version.d.ts +5 -0
  441. package/dist/server/server/daemon-version.d.ts.map +1 -0
  442. package/dist/server/server/daemon-version.js +22 -0
  443. package/dist/server/server/daemon-version.js.map +1 -0
  444. package/dist/server/server/daemon-worker.d.ts +2 -0
  445. package/dist/server/server/daemon-worker.d.ts.map +1 -0
  446. package/dist/server/server/daemon-worker.js +155 -0
  447. package/dist/server/server/daemon-worker.js.map +1 -0
  448. package/dist/server/server/dictation/dictation-stream-manager.d.ts +87 -0
  449. package/dist/server/server/dictation/dictation-stream-manager.d.ts.map +1 -0
  450. package/dist/server/server/dictation/dictation-stream-manager.js +572 -0
  451. package/dist/server/server/dictation/dictation-stream-manager.js.map +1 -0
  452. package/dist/server/server/editor-targets.d.ts +18 -0
  453. package/dist/server/server/editor-targets.d.ts.map +1 -0
  454. package/dist/server/server/editor-targets.js +109 -0
  455. package/dist/server/server/editor-targets.js.map +1 -0
  456. package/dist/server/server/exports.d.ts +26 -0
  457. package/dist/server/server/exports.d.ts.map +1 -0
  458. package/dist/server/server/exports.js +25 -0
  459. package/dist/server/server/exports.js.map +1 -0
  460. package/dist/server/server/file-download/token-store.d.ts +24 -0
  461. package/dist/server/server/file-download/token-store.d.ts.map +1 -0
  462. package/dist/server/server/file-download/token-store.js +40 -0
  463. package/dist/server/server/file-download/token-store.js.map +1 -0
  464. package/dist/server/server/file-explorer/service.d.ts +51 -0
  465. package/dist/server/server/file-explorer/service.d.ts.map +1 -0
  466. package/dist/server/server/file-explorer/service.js +246 -0
  467. package/dist/server/server/file-explorer/service.js.map +1 -0
  468. package/dist/server/server/hostnames.d.ts +13 -0
  469. package/dist/server/server/hostnames.d.ts.map +1 -0
  470. package/dist/server/server/hostnames.js +94 -0
  471. package/dist/server/server/hostnames.js.map +1 -0
  472. package/dist/server/server/json-utils.d.ts +11 -0
  473. package/dist/server/server/json-utils.d.ts.map +1 -0
  474. package/dist/server/server/json-utils.js +45 -0
  475. package/dist/server/server/json-utils.js.map +1 -0
  476. package/dist/server/server/logger.d.ts +29 -0
  477. package/dist/server/server/logger.d.ts.map +1 -0
  478. package/dist/server/server/logger.js +125 -0
  479. package/dist/server/server/logger.js.map +1 -0
  480. package/dist/server/server/loop/rpc-schemas.d.ts +3005 -0
  481. package/dist/server/server/loop/rpc-schemas.d.ts.map +1 -0
  482. package/dist/server/server/loop/rpc-schemas.js +163 -0
  483. package/dist/server/server/loop/rpc-schemas.js.map +1 -0
  484. package/dist/server/server/loop-service.d.ts +529 -0
  485. package/dist/server/server/loop-service.d.ts.map +1 -0
  486. package/dist/server/server/loop-service.js +751 -0
  487. package/dist/server/server/loop-service.js.map +1 -0
  488. package/dist/server/server/messages.d.ts +9 -0
  489. package/dist/server/server/messages.d.ts.map +1 -0
  490. package/dist/server/server/messages.js +29 -0
  491. package/dist/server/server/messages.js.map +1 -0
  492. package/dist/server/server/package-version.d.ts +25 -0
  493. package/dist/server/server/package-version.d.ts.map +1 -0
  494. package/dist/server/server/package-version.js +60 -0
  495. package/dist/server/server/package-version.js.map +1 -0
  496. package/dist/server/server/pagination/cursor.d.ts +16 -0
  497. package/dist/server/server/pagination/cursor.d.ts.map +1 -0
  498. package/dist/server/server/pagination/cursor.js +62 -0
  499. package/dist/server/server/pagination/cursor.js.map +1 -0
  500. package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
  501. package/dist/server/server/pagination/sortable-pager.d.ts.map +1 -0
  502. package/dist/server/server/pagination/sortable-pager.js +68 -0
  503. package/dist/server/server/pagination/sortable-pager.js.map +1 -0
  504. package/dist/server/server/pairing-offer.d.ts +18 -0
  505. package/dist/server/server/pairing-offer.d.ts.map +1 -0
  506. package/dist/server/server/pairing-offer.js +47 -0
  507. package/dist/server/server/pairing-offer.js.map +1 -0
  508. package/dist/server/server/pairing-qr.d.ts +7 -0
  509. package/dist/server/server/pairing-qr.d.ts.map +1 -0
  510. package/dist/server/server/pairing-qr.js +45 -0
  511. package/dist/server/server/pairing-qr.js.map +1 -0
  512. package/dist/server/server/paseo-env.d.ts +13 -0
  513. package/dist/server/server/paseo-env.d.ts.map +1 -0
  514. package/dist/server/server/paseo-env.js +53 -0
  515. package/dist/server/server/paseo-env.js.map +1 -0
  516. package/dist/server/server/paseo-home.d.ts +2 -0
  517. package/dist/server/server/paseo-home.d.ts.map +1 -0
  518. package/dist/server/server/paseo-home.js +19 -0
  519. package/dist/server/server/paseo-home.js.map +1 -0
  520. package/dist/server/server/paseo-worktree-archive-service.d.ts +43 -0
  521. package/dist/server/server/paseo-worktree-archive-service.d.ts.map +1 -0
  522. package/dist/server/server/paseo-worktree-archive-service.js +145 -0
  523. package/dist/server/server/paseo-worktree-archive-service.js.map +1 -0
  524. package/dist/server/server/paseo-worktree-service.d.ts +43 -0
  525. package/dist/server/server/paseo-worktree-service.d.ts.map +1 -0
  526. package/dist/server/server/paseo-worktree-service.js +218 -0
  527. package/dist/server/server/paseo-worktree-service.js.map +1 -0
  528. package/dist/server/server/path-utils.d.ts +4 -0
  529. package/dist/server/server/path-utils.d.ts.map +1 -0
  530. package/dist/server/server/path-utils.js +29 -0
  531. package/dist/server/server/path-utils.js.map +1 -0
  532. package/dist/server/server/persisted-config.d.ts +1056 -0
  533. package/dist/server/server/persisted-config.d.ts.map +1 -0
  534. package/dist/server/server/persisted-config.js +398 -0
  535. package/dist/server/server/persisted-config.js.map +1 -0
  536. package/dist/server/server/persistence-hooks.d.ts +33 -0
  537. package/dist/server/server/persistence-hooks.d.ts.map +1 -0
  538. package/dist/server/server/persistence-hooks.js +99 -0
  539. package/dist/server/server/persistence-hooks.js.map +1 -0
  540. package/dist/server/server/pid-lock.d.ts +46 -0
  541. package/dist/server/server/pid-lock.d.ts.map +1 -0
  542. package/dist/server/server/pid-lock.js +170 -0
  543. package/dist/server/server/pid-lock.js.map +1 -0
  544. package/dist/server/server/private-files.d.ts +7 -0
  545. package/dist/server/server/private-files.d.ts.map +1 -0
  546. package/dist/server/server/private-files.js +42 -0
  547. package/dist/server/server/private-files.js.map +1 -0
  548. package/dist/server/server/push/notifications.d.ts +9 -0
  549. package/dist/server/server/push/notifications.d.ts.map +1 -0
  550. package/dist/server/server/push/notifications.js +15 -0
  551. package/dist/server/server/push/notifications.js.map +1 -0
  552. package/dist/server/server/push/push-service.d.ts +20 -0
  553. package/dist/server/server/push/push-service.d.ts.map +1 -0
  554. package/dist/server/server/push/push-service.js +66 -0
  555. package/dist/server/server/push/push-service.js.map +1 -0
  556. package/dist/server/server/push/token-store.d.ts +18 -0
  557. package/dist/server/server/push/token-store.d.ts.map +1 -0
  558. package/dist/server/server/push/token-store.js +68 -0
  559. package/dist/server/server/push/token-store.js.map +1 -0
  560. package/dist/server/server/relay-transport.d.ts +31 -0
  561. package/dist/server/server/relay-transport.d.ts.map +1 -0
  562. package/dist/server/server/relay-transport.js +514 -0
  563. package/dist/server/server/relay-transport.js.map +1 -0
  564. package/dist/server/server/resolve-worktree-creation-intent.d.ts +29 -0
  565. package/dist/server/server/resolve-worktree-creation-intent.d.ts.map +1 -0
  566. package/dist/server/server/resolve-worktree-creation-intent.js +119 -0
  567. package/dist/server/server/resolve-worktree-creation-intent.js.map +1 -0
  568. package/dist/server/server/schedule/cron.d.ts +4 -0
  569. package/dist/server/server/schedule/cron.d.ts.map +1 -0
  570. package/dist/server/server/schedule/cron.js +103 -0
  571. package/dist/server/server/schedule/cron.js.map +1 -0
  572. package/dist/server/server/schedule/rpc-schemas.d.ts +3909 -0
  573. package/dist/server/server/schedule/rpc-schemas.d.ts.map +1 -0
  574. package/dist/server/server/schedule/rpc-schemas.js +151 -0
  575. package/dist/server/server/schedule/rpc-schemas.js.map +1 -0
  576. package/dist/server/server/schedule/service.d.ts +40 -0
  577. package/dist/server/server/schedule/service.d.ts.map +1 -0
  578. package/dist/server/server/schedule/service.js +476 -0
  579. package/dist/server/server/schedule/service.js.map +1 -0
  580. package/dist/server/server/schedule/store.d.ts +13 -0
  581. package/dist/server/server/schedule/store.d.ts.map +1 -0
  582. package/dist/server/server/schedule/store.js +56 -0
  583. package/dist/server/server/schedule/store.js.map +1 -0
  584. package/dist/server/server/schedule/types.d.ts +726 -0
  585. package/dist/server/server/schedule/types.d.ts.map +1 -0
  586. package/dist/server/server/schedule/types.js +73 -0
  587. package/dist/server/server/schedule/types.js.map +1 -0
  588. package/dist/server/server/script-health-monitor.d.ts +39 -0
  589. package/dist/server/server/script-health-monitor.d.ts.map +1 -0
  590. package/dist/server/server/script-health-monitor.js +159 -0
  591. package/dist/server/server/script-health-monitor.js.map +1 -0
  592. package/dist/server/server/script-proxy.d.ts +40 -0
  593. package/dist/server/server/script-proxy.d.ts.map +1 -0
  594. package/dist/server/server/script-proxy.js +245 -0
  595. package/dist/server/server/script-proxy.js.map +1 -0
  596. package/dist/server/server/script-route-branch-handler.d.ts +10 -0
  597. package/dist/server/server/script-route-branch-handler.d.ts.map +1 -0
  598. package/dist/server/server/script-route-branch-handler.js +45 -0
  599. package/dist/server/server/script-route-branch-handler.js.map +1 -0
  600. package/dist/server/server/script-status-projection.d.ts +34 -0
  601. package/dist/server/server/script-status-projection.d.ts.map +1 -0
  602. package/dist/server/server/script-status-projection.js +152 -0
  603. package/dist/server/server/script-status-projection.js.map +1 -0
  604. package/dist/server/server/server-id.d.ts +17 -0
  605. package/dist/server/server/server-id.d.ts.map +1 -0
  606. package/dist/server/server/server-id.js +68 -0
  607. package/dist/server/server/server-id.js.map +1 -0
  608. package/dist/server/server/session.d.ts +586 -0
  609. package/dist/server/server/session.d.ts.map +1 -0
  610. package/dist/server/server/session.js +7072 -0
  611. package/dist/server/server/session.js.map +1 -0
  612. package/dist/server/server/speech/audio.d.ts +10 -0
  613. package/dist/server/server/speech/audio.d.ts.map +1 -0
  614. package/dist/server/server/speech/audio.js +101 -0
  615. package/dist/server/server/speech/audio.js.map +1 -0
  616. package/dist/server/server/speech/provider-resolver.d.ts +3 -0
  617. package/dist/server/server/speech/provider-resolver.d.ts.map +1 -0
  618. package/dist/server/server/speech/provider-resolver.js +7 -0
  619. package/dist/server/server/speech/provider-resolver.js.map +1 -0
  620. package/dist/server/server/speech/providers/local/config.d.ts +30 -0
  621. package/dist/server/server/speech/providers/local/config.d.ts.map +1 -0
  622. package/dist/server/server/speech/providers/local/config.js +134 -0
  623. package/dist/server/server/speech/providers/local/config.js.map +1 -0
  624. package/dist/server/server/speech/providers/local/models.d.ts +11 -0
  625. package/dist/server/server/speech/providers/local/models.d.ts.map +1 -0
  626. package/dist/server/server/speech/providers/local/models.js +17 -0
  627. package/dist/server/server/speech/providers/local/models.js.map +1 -0
  628. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts +24 -0
  629. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -0
  630. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +459 -0
  631. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -0
  632. package/dist/server/server/speech/providers/local/runtime.d.ts +31 -0
  633. package/dist/server/server/speech/providers/local/runtime.d.ts.map +1 -0
  634. package/dist/server/server/speech/providers/local/runtime.js +278 -0
  635. package/dist/server/server/speech/providers/local/runtime.js.map +1 -0
  636. package/dist/server/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
  637. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +117 -0
  638. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -0
  639. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +169 -0
  640. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -0
  641. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +15 -0
  642. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -0
  643. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +167 -0
  644. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -0
  645. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +49 -0
  646. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts.map +1 -0
  647. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +73 -0
  648. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -0
  649. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts +56 -0
  650. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts.map +1 -0
  651. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +91 -0
  652. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -0
  653. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts +7 -0
  654. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts.map +1 -0
  655. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.js +11 -0
  656. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.js.map +1 -0
  657. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +9 -0
  658. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +1 -0
  659. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +107 -0
  660. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -0
  661. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts +28 -0
  662. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts.map +1 -0
  663. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +137 -0
  664. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -0
  665. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +21 -0
  666. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts.map +1 -0
  667. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +133 -0
  668. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -0
  669. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts +23 -0
  670. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts.map +1 -0
  671. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +116 -0
  672. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -0
  673. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +18 -0
  674. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts.map +1 -0
  675. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  676. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js.map +1 -0
  677. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts +23 -0
  678. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts.map +1 -0
  679. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +141 -0
  680. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -0
  681. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +21 -0
  682. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts.map +1 -0
  683. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +115 -0
  684. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -0
  685. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts +19 -0
  686. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts.map +1 -0
  687. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js +49 -0
  688. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js.map +1 -0
  689. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts +38 -0
  690. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts.map +1 -0
  691. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js +176 -0
  692. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js.map +1 -0
  693. package/dist/server/server/speech/providers/openai/config.d.ts +22 -0
  694. package/dist/server/server/speech/providers/openai/config.d.ts.map +1 -0
  695. package/dist/server/server/speech/providers/openai/config.js +107 -0
  696. package/dist/server/server/speech/providers/openai/config.js.map +1 -0
  697. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts +42 -0
  698. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts.map +1 -0
  699. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +168 -0
  700. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js.map +1 -0
  701. package/dist/server/server/speech/providers/openai/runtime.d.ts +29 -0
  702. package/dist/server/server/speech/providers/openai/runtime.d.ts.map +1 -0
  703. package/dist/server/server/speech/providers/openai/runtime.js +117 -0
  704. package/dist/server/server/speech/providers/openai/runtime.js.map +1 -0
  705. package/dist/server/server/speech/providers/openai/stt.d.ts +22 -0
  706. package/dist/server/server/speech/providers/openai/stt.d.ts.map +1 -0
  707. package/dist/server/server/speech/providers/openai/stt.js +207 -0
  708. package/dist/server/server/speech/providers/openai/stt.js.map +1 -0
  709. package/dist/server/server/speech/providers/openai/tts.d.ts +18 -0
  710. package/dist/server/server/speech/providers/openai/tts.d.ts.map +1 -0
  711. package/dist/server/server/speech/providers/openai/tts.js +47 -0
  712. package/dist/server/server/speech/providers/openai/tts.js.map +1 -0
  713. package/dist/server/server/speech/speech-config-resolver.d.ts +11 -0
  714. package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -0
  715. package/dist/server/server/speech/speech-config-resolver.js +132 -0
  716. package/dist/server/server/speech/speech-config-resolver.js.map +1 -0
  717. package/dist/server/server/speech/speech-provider.d.ts +59 -0
  718. package/dist/server/server/speech/speech-provider.d.ts.map +1 -0
  719. package/dist/server/server/speech/speech-provider.js +2 -0
  720. package/dist/server/server/speech/speech-provider.js.map +1 -0
  721. package/dist/server/server/speech/speech-runtime.d.ts +45 -0
  722. package/dist/server/server/speech/speech-runtime.d.ts.map +1 -0
  723. package/dist/server/server/speech/speech-runtime.js +562 -0
  724. package/dist/server/server/speech/speech-runtime.js.map +1 -0
  725. package/dist/server/server/speech/speech-types.d.ts +24 -0
  726. package/dist/server/server/speech/speech-types.d.ts.map +1 -0
  727. package/dist/server/server/speech/speech-types.js +8 -0
  728. package/dist/server/server/speech/speech-types.js.map +1 -0
  729. package/dist/server/server/speech/turn-detection-provider.d.ts +23 -0
  730. package/dist/server/server/speech/turn-detection-provider.d.ts.map +1 -0
  731. package/dist/server/server/speech/turn-detection-provider.js +2 -0
  732. package/dist/server/server/speech/turn-detection-provider.js.map +1 -0
  733. package/dist/server/server/utils/diff-highlighter.d.ts +57 -0
  734. package/dist/server/server/utils/diff-highlighter.d.ts.map +1 -0
  735. package/dist/server/server/utils/diff-highlighter.js +279 -0
  736. package/dist/server/server/utils/diff-highlighter.js.map +1 -0
  737. package/dist/server/server/voice/voice-turn-controller.d.ts +38 -0
  738. package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -0
  739. package/dist/server/server/voice/voice-turn-controller.js +393 -0
  740. package/dist/server/server/voice/voice-turn-controller.js.map +1 -0
  741. package/dist/server/server/voice-config.d.ts +15 -0
  742. package/dist/server/server/voice-config.d.ts.map +1 -0
  743. package/dist/server/server/voice-config.js +54 -0
  744. package/dist/server/server/voice-config.js.map +1 -0
  745. package/dist/server/server/voice-permission-policy.d.ts +4 -0
  746. package/dist/server/server/voice-permission-policy.d.ts.map +1 -0
  747. package/dist/server/server/voice-permission-policy.js +13 -0
  748. package/dist/server/server/voice-permission-policy.js.map +1 -0
  749. package/dist/server/server/voice-types.d.ts +12 -0
  750. package/dist/server/server/voice-types.d.ts.map +1 -0
  751. package/dist/server/server/voice-types.js +2 -0
  752. package/dist/server/server/voice-types.js.map +1 -0
  753. package/dist/server/server/websocket/runtime-metrics.d.ts +71 -0
  754. package/dist/server/server/websocket/runtime-metrics.d.ts.map +1 -0
  755. package/dist/server/server/websocket/runtime-metrics.js +148 -0
  756. package/dist/server/server/websocket/runtime-metrics.js.map +1 -0
  757. package/dist/server/server/websocket-server.d.ts +153 -0
  758. package/dist/server/server/websocket-server.d.ts.map +1 -0
  759. package/dist/server/server/websocket-server.js +1300 -0
  760. package/dist/server/server/websocket-server.js.map +1 -0
  761. package/dist/server/server/workspace-archive-service.d.ts +8 -0
  762. package/dist/server/server/workspace-archive-service.d.ts.map +1 -0
  763. package/dist/server/server/workspace-archive-service.js +17 -0
  764. package/dist/server/server/workspace-archive-service.js.map +1 -0
  765. package/dist/server/server/workspace-directory.d.ts +67 -0
  766. package/dist/server/server/workspace-directory.d.ts.map +1 -0
  767. package/dist/server/server/workspace-directory.js +214 -0
  768. package/dist/server/server/workspace-directory.js.map +1 -0
  769. package/dist/server/server/workspace-git-metadata.d.ts +24 -0
  770. package/dist/server/server/workspace-git-metadata.d.ts.map +1 -0
  771. package/dist/server/server/workspace-git-metadata.js +55 -0
  772. package/dist/server/server/workspace-git-metadata.js.map +1 -0
  773. package/dist/server/server/workspace-git-service.d.ts +257 -0
  774. package/dist/server/server/workspace-git-service.d.ts.map +1 -0
  775. package/dist/server/server/workspace-git-service.js +1277 -0
  776. package/dist/server/server/workspace-git-service.js.map +1 -0
  777. package/dist/server/server/workspace-reconciliation-service.d.ts +58 -0
  778. package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -0
  779. package/dist/server/server/workspace-reconciliation-service.js +274 -0
  780. package/dist/server/server/workspace-reconciliation-service.js.map +1 -0
  781. package/dist/server/server/workspace-registry-bootstrap.d.ts +13 -0
  782. package/dist/server/server/workspace-registry-bootstrap.d.ts.map +1 -0
  783. package/dist/server/server/workspace-registry-bootstrap.js +108 -0
  784. package/dist/server/server/workspace-registry-bootstrap.js.map +1 -0
  785. package/dist/server/server/workspace-registry-model.d.ts +55 -0
  786. package/dist/server/server/workspace-registry-model.d.ts.map +1 -0
  787. package/dist/server/server/workspace-registry-model.js +191 -0
  788. package/dist/server/server/workspace-registry-model.js.map +1 -0
  789. package/dist/server/server/workspace-registry.d.ts +135 -0
  790. package/dist/server/server/workspace-registry.d.ts.map +1 -0
  791. package/dist/server/server/workspace-registry.js +162 -0
  792. package/dist/server/server/workspace-registry.js.map +1 -0
  793. package/dist/server/server/workspace-script-runtime-store.d.ts +28 -0
  794. package/dist/server/server/workspace-script-runtime-store.d.ts.map +1 -0
  795. package/dist/server/server/workspace-script-runtime-store.js +78 -0
  796. package/dist/server/server/workspace-script-runtime-store.js.map +1 -0
  797. package/dist/server/server/workspace-service-env.d.ts +17 -0
  798. package/dist/server/server/workspace-service-env.d.ts.map +1 -0
  799. package/dist/server/server/workspace-service-env.js +80 -0
  800. package/dist/server/server/workspace-service-env.js.map +1 -0
  801. package/dist/server/server/workspace-service-port-registry.d.ts +19 -0
  802. package/dist/server/server/workspace-service-port-registry.d.ts.map +1 -0
  803. package/dist/server/server/workspace-service-port-registry.js +59 -0
  804. package/dist/server/server/workspace-service-port-registry.js.map +1 -0
  805. package/dist/server/server/worktree-bootstrap.d.ts +74 -0
  806. package/dist/server/server/worktree-bootstrap.d.ts.map +1 -0
  807. package/dist/server/server/worktree-bootstrap.js +716 -0
  808. package/dist/server/server/worktree-bootstrap.js.map +1 -0
  809. package/dist/server/server/worktree-branch-name-generator.d.ts +21 -0
  810. package/dist/server/server/worktree-branch-name-generator.d.ts.map +1 -0
  811. package/dist/server/server/worktree-branch-name-generator.js +59 -0
  812. package/dist/server/server/worktree-branch-name-generator.js.map +1 -0
  813. package/dist/server/server/worktree-core.d.ts +29 -0
  814. package/dist/server/server/worktree-core.d.ts.map +1 -0
  815. package/dist/server/server/worktree-core.js +99 -0
  816. package/dist/server/server/worktree-core.js.map +1 -0
  817. package/dist/server/server/worktree-errors.d.ts +12 -0
  818. package/dist/server/server/worktree-errors.d.ts.map +1 -0
  819. package/dist/server/server/worktree-errors.js +28 -0
  820. package/dist/server/server/worktree-errors.js.map +1 -0
  821. package/dist/server/server/worktree-session.d.ts +149 -0
  822. package/dist/server/server/worktree-session.d.ts.map +1 -0
  823. package/dist/server/server/worktree-session.js +464 -0
  824. package/dist/server/server/worktree-session.js.map +1 -0
  825. package/dist/server/services/github-service.d.ts +279 -0
  826. package/dist/server/services/github-service.d.ts.map +1 -0
  827. package/dist/server/services/github-service.js +1666 -0
  828. package/dist/server/services/github-service.js.map +1 -0
  829. package/dist/server/shared/agent-attention-notification.d.ts +41 -0
  830. package/dist/server/shared/agent-attention-notification.d.ts.map +1 -0
  831. package/dist/server/shared/agent-attention-notification.js +140 -0
  832. package/dist/server/shared/agent-attention-notification.js.map +1 -0
  833. package/dist/server/shared/agent-labels.d.ts +2 -0
  834. package/dist/server/shared/agent-labels.d.ts.map +1 -0
  835. package/dist/server/shared/agent-labels.js +2 -0
  836. package/dist/server/shared/agent-labels.js.map +1 -0
  837. package/dist/server/shared/agent-lifecycle.d.ts +3 -0
  838. package/dist/server/shared/agent-lifecycle.d.ts.map +1 -0
  839. package/dist/server/shared/agent-lifecycle.js +8 -0
  840. package/dist/server/shared/agent-lifecycle.js.map +1 -0
  841. package/dist/server/shared/agent-state-bucket.d.ts +13 -0
  842. package/dist/server/shared/agent-state-bucket.d.ts.map +1 -0
  843. package/dist/server/shared/agent-state-bucket.js +41 -0
  844. package/dist/server/shared/agent-state-bucket.js.map +1 -0
  845. package/dist/server/shared/binary-frames/file-transfer.d.ts +56 -0
  846. package/dist/server/shared/binary-frames/file-transfer.d.ts.map +1 -0
  847. package/dist/server/shared/binary-frames/file-transfer.js +108 -0
  848. package/dist/server/shared/binary-frames/file-transfer.js.map +1 -0
  849. package/dist/server/shared/binary-frames/index.d.ts +3 -0
  850. package/dist/server/shared/binary-frames/index.d.ts.map +1 -0
  851. package/dist/server/shared/binary-frames/index.js +3 -0
  852. package/dist/server/shared/binary-frames/index.js.map +1 -0
  853. package/dist/server/shared/binary-frames/terminal.d.ts +36 -0
  854. package/dist/server/shared/binary-frames/terminal.d.ts.map +1 -0
  855. package/dist/server/shared/binary-frames/terminal.js +99 -0
  856. package/dist/server/shared/binary-frames/terminal.js.map +1 -0
  857. package/dist/server/shared/client-capabilities.d.ts +5 -0
  858. package/dist/server/shared/client-capabilities.d.ts.map +1 -0
  859. package/dist/server/shared/client-capabilities.js +4 -0
  860. package/dist/server/shared/client-capabilities.js.map +1 -0
  861. package/dist/server/shared/connection-offer.d.ts +80 -0
  862. package/dist/server/shared/connection-offer.d.ts.map +1 -0
  863. package/dist/server/shared/connection-offer.js +53 -0
  864. package/dist/server/shared/connection-offer.js.map +1 -0
  865. package/dist/server/shared/daemon-endpoints.d.ts +47 -0
  866. package/dist/server/shared/daemon-endpoints.d.ts.map +1 -0
  867. package/dist/server/shared/daemon-endpoints.js +201 -0
  868. package/dist/server/shared/daemon-endpoints.js.map +1 -0
  869. package/dist/server/shared/error-utils.d.ts +11 -0
  870. package/dist/server/shared/error-utils.d.ts.map +1 -0
  871. package/dist/server/shared/error-utils.js +27 -0
  872. package/dist/server/shared/error-utils.js.map +1 -0
  873. package/dist/server/shared/git-remote.d.ts +16 -0
  874. package/dist/server/shared/git-remote.d.ts.map +1 -0
  875. package/dist/server/shared/git-remote.js +72 -0
  876. package/dist/server/shared/git-remote.js.map +1 -0
  877. package/dist/server/shared/host-connection-schema.d.ts +23 -0
  878. package/dist/server/shared/host-connection-schema.d.ts.map +1 -0
  879. package/dist/server/shared/host-connection-schema.js +9 -0
  880. package/dist/server/shared/host-connection-schema.js.map +1 -0
  881. package/dist/server/shared/importable-providers.d.ts +7 -0
  882. package/dist/server/shared/importable-providers.d.ts.map +1 -0
  883. package/dist/server/shared/importable-providers.js +7 -0
  884. package/dist/server/shared/importable-providers.js.map +1 -0
  885. package/dist/server/shared/literal-union.d.ts +2 -0
  886. package/dist/server/shared/literal-union.d.ts.map +1 -0
  887. package/dist/server/shared/literal-union.js +2 -0
  888. package/dist/server/shared/literal-union.js.map +1 -0
  889. package/dist/server/shared/messages.d.ts +140180 -0
  890. package/dist/server/shared/messages.d.ts.map +1 -0
  891. package/dist/server/shared/messages.js +3259 -0
  892. package/dist/server/shared/messages.js.map +1 -0
  893. package/dist/server/shared/path-utils.d.ts +2 -0
  894. package/dist/server/shared/path-utils.d.ts.map +1 -0
  895. package/dist/server/shared/path-utils.js +16 -0
  896. package/dist/server/shared/path-utils.js.map +1 -0
  897. package/dist/server/shared/terminal-input-mode.d.ts +26 -0
  898. package/dist/server/shared/terminal-input-mode.d.ts.map +1 -0
  899. package/dist/server/shared/terminal-input-mode.js +151 -0
  900. package/dist/server/shared/terminal-input-mode.js.map +1 -0
  901. package/dist/server/shared/tool-call-display.d.ts +11 -0
  902. package/dist/server/shared/tool-call-display.d.ts.map +1 -0
  903. package/dist/server/shared/tool-call-display.js +135 -0
  904. package/dist/server/shared/tool-call-display.js.map +1 -0
  905. package/dist/server/terminal/shell-integration/zsh/.zshenv +17 -0
  906. package/dist/server/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
  907. package/dist/server/terminal/terminal-capture.d.ts +12 -0
  908. package/dist/server/terminal/terminal-capture.d.ts.map +1 -0
  909. package/dist/server/terminal/terminal-capture.js +43 -0
  910. package/dist/server/terminal/terminal-capture.js.map +1 -0
  911. package/dist/server/terminal/terminal-manager-factory.d.ts +3 -0
  912. package/dist/server/terminal/terminal-manager-factory.d.ts.map +1 -0
  913. package/dist/server/terminal/terminal-manager-factory.js +5 -0
  914. package/dist/server/terminal/terminal-manager-factory.js.map +1 -0
  915. package/dist/server/terminal/terminal-manager.d.ts +47 -0
  916. package/dist/server/terminal/terminal-manager.d.ts.map +1 -0
  917. package/dist/server/terminal/terminal-manager.js +183 -0
  918. package/dist/server/terminal/terminal-manager.js.map +1 -0
  919. package/dist/server/terminal/terminal-output-coalescer.d.ts +30 -0
  920. package/dist/server/terminal/terminal-output-coalescer.d.ts.map +1 -0
  921. package/dist/server/terminal/terminal-output-coalescer.js +55 -0
  922. package/dist/server/terminal/terminal-output-coalescer.js.map +1 -0
  923. package/dist/server/terminal/terminal-session-controller.d.ts +64 -0
  924. package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -0
  925. package/dist/server/terminal/terminal-session-controller.js +653 -0
  926. package/dist/server/terminal/terminal-session-controller.js.map +1 -0
  927. package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
  928. package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
  929. package/dist/server/terminal/terminal-worker-process.d.ts.map +1 -0
  930. package/dist/server/terminal/terminal-worker-process.js +221 -0
  931. package/dist/server/terminal/terminal-worker-process.js.map +1 -0
  932. package/dist/server/terminal/terminal-worker-protocol.d.ts +113 -0
  933. package/dist/server/terminal/terminal-worker-protocol.d.ts.map +1 -0
  934. package/dist/server/terminal/terminal-worker-protocol.js +2 -0
  935. package/dist/server/terminal/terminal-worker-protocol.js.map +1 -0
  936. package/dist/server/terminal/terminal.d.ts +99 -0
  937. package/dist/server/terminal/terminal.d.ts.map +1 -0
  938. package/dist/server/terminal/terminal.js +877 -0
  939. package/dist/server/terminal/terminal.js.map +1 -0
  940. package/dist/server/terminal/worker-terminal-manager.d.ts +19 -0
  941. package/dist/server/terminal/worker-terminal-manager.d.ts.map +1 -0
  942. package/dist/server/terminal/worker-terminal-manager.js +492 -0
  943. package/dist/server/terminal/worker-terminal-manager.js.map +1 -0
  944. package/dist/server/utils/branch-slug.d.ts +14 -0
  945. package/dist/server/utils/branch-slug.d.ts.map +1 -0
  946. package/dist/server/utils/branch-slug.js +49 -0
  947. package/dist/server/utils/branch-slug.js.map +1 -0
  948. package/dist/server/utils/build-metadata-prompt.d.ts +14 -0
  949. package/dist/server/utils/build-metadata-prompt.d.ts.map +1 -0
  950. package/dist/server/utils/build-metadata-prompt.js +28 -0
  951. package/dist/server/utils/build-metadata-prompt.js.map +1 -0
  952. package/dist/server/utils/checkout-git.d.ts +213 -0
  953. package/dist/server/utils/checkout-git.d.ts.map +1 -0
  954. package/dist/server/utils/checkout-git.js +1885 -0
  955. package/dist/server/utils/checkout-git.js.map +1 -0
  956. package/dist/server/utils/directory-suggestions.d.ts +26 -0
  957. package/dist/server/utils/directory-suggestions.d.ts.map +1 -0
  958. package/dist/server/utils/directory-suggestions.js +732 -0
  959. package/dist/server/utils/directory-suggestions.js.map +1 -0
  960. package/dist/server/utils/executable.d.ts +10 -0
  961. package/dist/server/utils/executable.d.ts.map +1 -0
  962. package/dist/server/utils/executable.js +116 -0
  963. package/dist/server/utils/executable.js.map +1 -0
  964. package/dist/server/utils/git-rev-parse-path.d.ts +3 -0
  965. package/dist/server/utils/git-rev-parse-path.d.ts.map +1 -0
  966. package/dist/server/utils/git-rev-parse-path.js +21 -0
  967. package/dist/server/utils/git-rev-parse-path.js.map +1 -0
  968. package/dist/server/utils/github-remote.d.ts +9 -0
  969. package/dist/server/utils/github-remote.d.ts.map +1 -0
  970. package/dist/server/utils/github-remote.js +62 -0
  971. package/dist/server/utils/github-remote.js.map +1 -0
  972. package/dist/server/utils/paseo-config-file.d.ts +30 -0
  973. package/dist/server/utils/paseo-config-file.d.ts.map +1 -0
  974. package/dist/server/utils/paseo-config-file.js +90 -0
  975. package/dist/server/utils/paseo-config-file.js.map +1 -0
  976. package/dist/server/utils/paseo-config-schema.d.ts +915 -0
  977. package/dist/server/utils/paseo-config-schema.d.ts.map +1 -0
  978. package/dist/server/utils/paseo-config-schema.js +77 -0
  979. package/dist/server/utils/paseo-config-schema.js.map +1 -0
  980. package/dist/server/utils/path.d.ts +16 -0
  981. package/dist/server/utils/path.d.ts.map +1 -0
  982. package/dist/server/utils/path.js +110 -0
  983. package/dist/server/utils/path.js.map +1 -0
  984. package/dist/server/utils/project-icon.d.ts +39 -0
  985. package/dist/server/utils/project-icon.d.ts.map +1 -0
  986. package/dist/server/utils/project-icon.js +364 -0
  987. package/dist/server/utils/project-icon.js.map +1 -0
  988. package/dist/server/utils/promise-timeout.d.ts +9 -0
  989. package/dist/server/utils/promise-timeout.d.ts.map +1 -0
  990. package/dist/server/utils/promise-timeout.js +25 -0
  991. package/dist/server/utils/promise-timeout.js.map +1 -0
  992. package/dist/server/utils/run-git-command.d.ts +20 -0
  993. package/dist/server/utils/run-git-command.d.ts.map +1 -0
  994. package/dist/server/utils/run-git-command.js +146 -0
  995. package/dist/server/utils/run-git-command.js.map +1 -0
  996. package/dist/server/utils/script-hostname.d.ts +8 -0
  997. package/dist/server/utils/script-hostname.d.ts.map +1 -0
  998. package/dist/server/utils/script-hostname.js +14 -0
  999. package/dist/server/utils/script-hostname.js.map +1 -0
  1000. package/dist/server/utils/spawn.d.ts +33 -0
  1001. package/dist/server/utils/spawn.d.ts.map +1 -0
  1002. package/dist/server/utils/spawn.js +71 -0
  1003. package/dist/server/utils/spawn.js.map +1 -0
  1004. package/dist/server/utils/string-command-shell.d.ts +10 -0
  1005. package/dist/server/utils/string-command-shell.d.ts.map +1 -0
  1006. package/dist/server/utils/string-command-shell.js +21 -0
  1007. package/dist/server/utils/string-command-shell.js.map +1 -0
  1008. package/dist/server/utils/tree-kill.d.ts +18 -0
  1009. package/dist/server/utils/tree-kill.d.ts.map +1 -0
  1010. package/dist/server/utils/tree-kill.js +77 -0
  1011. package/dist/server/utils/tree-kill.js.map +1 -0
  1012. package/dist/server/utils/windows-command.d.ts +15 -0
  1013. package/dist/server/utils/windows-command.d.ts.map +1 -0
  1014. package/dist/server/utils/windows-command.js +41 -0
  1015. package/dist/server/utils/windows-command.js.map +1 -0
  1016. package/dist/server/utils/worktree-metadata.d.ts +91 -0
  1017. package/dist/server/utils/worktree-metadata.d.ts.map +1 -0
  1018. package/dist/server/utils/worktree-metadata.js +174 -0
  1019. package/dist/server/utils/worktree-metadata.js.map +1 -0
  1020. package/dist/server/utils/worktree.d.ts +195 -0
  1021. package/dist/server/utils/worktree.d.ts.map +1 -0
  1022. package/dist/server/utils/worktree.js +1004 -0
  1023. package/dist/server/utils/worktree.js.map +1 -0
  1024. package/dist/server/utils/wrap-user-instructions.d.ts +2 -0
  1025. package/dist/server/utils/wrap-user-instructions.d.ts.map +1 -0
  1026. package/dist/server/utils/wrap-user-instructions.js +13 -0
  1027. package/dist/server/utils/wrap-user-instructions.js.map +1 -0
  1028. package/dist/src/server/agent/agent-sdk-types.js +22 -0
  1029. package/dist/src/server/agent/agent-sdk-types.js.map +1 -0
  1030. package/dist/src/server/agent/agent-title-limits.js +3 -0
  1031. package/dist/src/server/agent/agent-title-limits.js.map +1 -0
  1032. package/dist/src/server/agent/provider-launch-config.js +190 -0
  1033. package/dist/src/server/agent/provider-launch-config.js.map +1 -0
  1034. package/dist/src/server/agent/provider-manifest.js +211 -0
  1035. package/dist/src/server/agent/provider-manifest.js.map +1 -0
  1036. package/dist/src/server/chat/chat-rpc-schemas.js +103 -0
  1037. package/dist/src/server/chat/chat-rpc-schemas.js.map +1 -0
  1038. package/dist/src/server/chat/chat-types.js +22 -0
  1039. package/dist/src/server/chat/chat-types.js.map +1 -0
  1040. package/dist/src/server/loop/rpc-schemas.js +163 -0
  1041. package/dist/src/server/loop/rpc-schemas.js.map +1 -0
  1042. package/dist/src/server/paseo-env.js +53 -0
  1043. package/dist/src/server/paseo-env.js.map +1 -0
  1044. package/dist/src/server/paseo-home.js +19 -0
  1045. package/dist/src/server/paseo-home.js.map +1 -0
  1046. package/dist/src/server/persisted-config.js +398 -0
  1047. package/dist/src/server/persisted-config.js.map +1 -0
  1048. package/dist/src/server/pid-lock.js +170 -0
  1049. package/dist/src/server/pid-lock.js.map +1 -0
  1050. package/dist/src/server/private-files.js +42 -0
  1051. package/dist/src/server/private-files.js.map +1 -0
  1052. package/dist/src/server/schedule/rpc-schemas.js +151 -0
  1053. package/dist/src/server/schedule/rpc-schemas.js.map +1 -0
  1054. package/dist/src/server/schedule/types.js +73 -0
  1055. package/dist/src/server/schedule/types.js.map +1 -0
  1056. package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  1057. package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js.map +1 -0
  1058. package/dist/src/shared/agent-lifecycle.js +8 -0
  1059. package/dist/src/shared/agent-lifecycle.js.map +1 -0
  1060. package/dist/src/shared/client-capabilities.js +4 -0
  1061. package/dist/src/shared/client-capabilities.js.map +1 -0
  1062. package/dist/src/shared/literal-union.js +2 -0
  1063. package/dist/src/shared/literal-union.js.map +1 -0
  1064. package/dist/src/shared/messages.js +3259 -0
  1065. package/dist/src/shared/messages.js.map +1 -0
  1066. package/dist/src/terminal/shell-integration/zsh/.zshenv +17 -0
  1067. package/dist/src/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
  1068. package/dist/src/utils/executable.js +116 -0
  1069. package/dist/src/utils/executable.js.map +1 -0
  1070. package/dist/src/utils/paseo-config-schema.js +77 -0
  1071. package/dist/src/utils/paseo-config-schema.js.map +1 -0
  1072. package/dist/src/utils/spawn.js +71 -0
  1073. package/dist/src/utils/spawn.js.map +1 -0
  1074. package/dist/src/utils/windows-command.js +41 -0
  1075. package/dist/src/utils/windows-command.js.map +1 -0
  1076. package/package.json +115 -0
  1077. package/src/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
@@ -0,0 +1,2572 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { resolve } from "node:path";
3
+ import { stat } from "node:fs/promises";
4
+ import { AGENT_LIFECYCLE_STATUSES, } from "../../shared/agent-lifecycle.js";
5
+ import { PARENT_AGENT_ID_LABEL } from "../../shared/agent-labels.js";
6
+ import { z } from "zod";
7
+ import { getAgentStreamEventTurnId, } from "./agent-sdk-types.js";
8
+ import { buildArchivedAgentRecord } from "./agent-archive.js";
9
+ import { InMemoryAgentTimelineStore, } from "./agent-timeline-store.js";
10
+ import { AGENT_STREAM_COALESCE_DEFAULT_WINDOW_MS, AgentStreamCoalescer, } from "./agent-stream-coalescer.js";
11
+ import { ForegroundRunState } from "./foreground-run-state.js";
12
+ import { getAgentProviderDefinition } from "./provider-manifest.js";
13
+ import { IMPORTABLE_PROVIDERS } from "./provider-registry.js";
14
+ const RELOAD_SESSION_CLOSE_TIMEOUT_MS = 3000;
15
+ const INTERRUPT_SESSION_TIMEOUT_MS = 2000;
16
+ const STORED_AGENT_CAPABILITIES = {
17
+ supportsStreaming: false,
18
+ supportsSessionPersistence: true,
19
+ supportsDynamicModes: false,
20
+ supportsMcpServers: false,
21
+ supportsReasoningStream: false,
22
+ supportsToolInvocations: true,
23
+ };
24
+ function formatProviderList(providers) {
25
+ return providers.length > 0 ? providers.join(", ") : "none";
26
+ }
27
+ function buildStoredAgentConfig(record) {
28
+ const config = {
29
+ provider: record.provider,
30
+ cwd: record.cwd,
31
+ };
32
+ if (!record.config) {
33
+ return config;
34
+ }
35
+ if (record.config.title != null)
36
+ config.title = record.config.title;
37
+ if (record.config.modeId != null)
38
+ config.modeId = record.config.modeId;
39
+ if (record.config.model != null)
40
+ config.model = record.config.model;
41
+ if (record.config.thinkingOptionId != null) {
42
+ config.thinkingOptionId = record.config.thinkingOptionId;
43
+ }
44
+ if (record.config.featureValues != null) {
45
+ config.featureValues = record.config.featureValues;
46
+ }
47
+ if (record.config.extra != null)
48
+ config.extra = record.config.extra;
49
+ if (record.config.systemPrompt != null) {
50
+ config.systemPrompt = record.config.systemPrompt;
51
+ }
52
+ if (record.config.mcpServers != null)
53
+ config.mcpServers = record.config.mcpServers;
54
+ return config;
55
+ }
56
+ export { AGENT_LIFECYCLE_STATUSES };
57
+ function resolveInitialAttention(input) {
58
+ if (input == null || !input.requiresAttention) {
59
+ return { requiresAttention: false };
60
+ }
61
+ return {
62
+ requiresAttention: true,
63
+ attentionReason: input.attentionReason,
64
+ attentionTimestamp: new Date(input.attentionTimestamp),
65
+ };
66
+ }
67
+ const SYSTEM_ERROR_PREFIX = "[System Error]";
68
+ function attachPersistenceCwd(handle, cwd) {
69
+ if (!handle) {
70
+ return null;
71
+ }
72
+ return {
73
+ ...handle,
74
+ metadata: {
75
+ ...handle.metadata,
76
+ cwd,
77
+ },
78
+ };
79
+ }
80
+ const BUSY_STATUSES = new Set(["initializing", "running"]);
81
+ const AgentIdSchema = z.string().uuid();
82
+ function isAgentBusy(status) {
83
+ return BUSY_STATUSES.has(status);
84
+ }
85
+ function isTurnTerminalEvent(event) {
86
+ return (event.type === "turn_completed" ||
87
+ event.type === "turn_failed" ||
88
+ event.type === "turn_canceled");
89
+ }
90
+ function abortMessage(reason, fallbackMessage) {
91
+ if (typeof reason === "string")
92
+ return reason;
93
+ if (reason instanceof Error)
94
+ return reason.message;
95
+ return fallbackMessage;
96
+ }
97
+ function createAbortError(signal, fallbackMessage) {
98
+ const message = abortMessage(signal?.reason, fallbackMessage);
99
+ return Object.assign(new Error(message), { name: "AbortError" });
100
+ }
101
+ function validateAgentId(agentId, source) {
102
+ const result = AgentIdSchema.safeParse(agentId);
103
+ if (!result.success) {
104
+ throw new Error(`${source}: agentId must be a UUID`);
105
+ }
106
+ return result.data;
107
+ }
108
+ function normalizeMessageId(messageId) {
109
+ if (typeof messageId !== "string") {
110
+ return undefined;
111
+ }
112
+ const trimmed = messageId.trim();
113
+ return trimmed.length > 0 ? trimmed : undefined;
114
+ }
115
+ function isDuplicateLegacyUserMessage(item, canonicalUserMessagesById) {
116
+ if (item.type !== "user_message") {
117
+ return false;
118
+ }
119
+ const eventMessageId = normalizeMessageId(item.messageId);
120
+ if (!eventMessageId) {
121
+ return false;
122
+ }
123
+ return canonicalUserMessagesById.get(eventMessageId) === item.text;
124
+ }
125
+ function buildExplicitTimelineSeedForRegister(now, options) {
126
+ const hasTimeline = Boolean(options?.timeline?.length);
127
+ const hasTimelineRows = Boolean(options?.timelineRows?.length);
128
+ const hasTimelineNextSeq = options?.timelineNextSeq !== undefined;
129
+ if (!hasTimeline && !hasTimelineRows && !hasTimelineNextSeq) {
130
+ return null;
131
+ }
132
+ return {
133
+ items: options?.timeline,
134
+ rows: options?.timelineRows,
135
+ nextSeq: options?.timelineNextSeq,
136
+ timestamp: (options?.updatedAt ?? options?.createdAt ?? now).toISOString(),
137
+ };
138
+ }
139
+ export class AgentManager {
140
+ constructor(options) {
141
+ this.clients = new Map();
142
+ this.providerEnabled = new Map();
143
+ this.providerDerivedFromId = new Map();
144
+ this.agents = new Map();
145
+ this.timelineStore = new InMemoryAgentTimelineStore();
146
+ this.agentsAwaitingInitialSnapshotPersist = new Set();
147
+ this.sessionEventTails = new Map();
148
+ this.foregroundRuns = new ForegroundRunState();
149
+ this.subscribers = new Set();
150
+ this.previousStatuses = new Map();
151
+ this.backgroundTasks = new Set();
152
+ this.idFactory = options?.idFactory ?? (() => randomUUID());
153
+ this.registry = options?.registry;
154
+ this.durableTimelineStore = options?.durableTimelineStore;
155
+ this.onAgentAttention = options?.onAgentAttention;
156
+ this.mcpBaseUrl = options?.mcpBaseUrl ?? null;
157
+ this.appendSystemPrompt = options.appendSystemPrompt ?? "";
158
+ this.logger = options.logger.child({ module: "agent", component: "agent-manager" });
159
+ this.rescueTimeouts = {
160
+ reloadSessionCloseMs: options.rescueTimeouts?.reloadSessionCloseMs ?? RELOAD_SESSION_CLOSE_TIMEOUT_MS,
161
+ interruptSessionMs: options.rescueTimeouts?.interruptSessionMs ?? INTERRUPT_SESSION_TIMEOUT_MS,
162
+ };
163
+ this.agentStreamCoalescer = new AgentStreamCoalescer({
164
+ windowMs: options.agentStreamCoalesceWindowMs ?? AGENT_STREAM_COALESCE_DEFAULT_WINDOW_MS,
165
+ timers: { setTimeout, clearTimeout },
166
+ onFlush: ({ agentId, item, provider, turnId }) => {
167
+ const event = this.recordAndDispatchTimelineItem(agentId, item, provider, turnId);
168
+ this.notifyForegroundTurnWaiters(agentId, event);
169
+ },
170
+ });
171
+ this.updateProviderRegistry({
172
+ providerDefinitions: options.providerDefinitions ?? {},
173
+ clients: options.clients ?? {},
174
+ });
175
+ }
176
+ registerClient(provider, client) {
177
+ this.clients.set(provider, client);
178
+ }
179
+ updateProviderRegistry(input) {
180
+ for (const [provider, definition] of Object.entries(input.providerDefinitions)) {
181
+ if (definition) {
182
+ this.providerEnabled.set(provider, definition.enabled);
183
+ this.providerDerivedFromId.set(provider, definition.derivedFromProviderId ?? null);
184
+ }
185
+ }
186
+ for (const [provider, client] of Object.entries(input.clients)) {
187
+ if (client) {
188
+ this.clients.set(provider, client);
189
+ }
190
+ }
191
+ }
192
+ getRegisteredProviderIds() {
193
+ return Array.from(this.clients.keys());
194
+ }
195
+ setAgentAttentionCallback(callback) {
196
+ this.onAgentAttention = callback;
197
+ }
198
+ setMcpBaseUrl(url) {
199
+ this.mcpBaseUrl = url;
200
+ }
201
+ setAppendSystemPrompt(prompt) {
202
+ this.appendSystemPrompt = prompt ?? "";
203
+ }
204
+ getMetricsSnapshot() {
205
+ const byLifecycle = {};
206
+ let withActiveForegroundTurn = 0;
207
+ let totalItems = 0;
208
+ let maxItemsPerAgent = 0;
209
+ for (const agent of this.agents.values()) {
210
+ byLifecycle[agent.lifecycle] = (byLifecycle[agent.lifecycle] ?? 0) + 1;
211
+ if (agent.activeForegroundTurnId !== null) {
212
+ withActiveForegroundTurn++;
213
+ }
214
+ if (!this.timelineStore.has(agent.id)) {
215
+ continue;
216
+ }
217
+ const len = this.timelineStore.getItems(agent.id).length;
218
+ totalItems += len;
219
+ if (len > maxItemsPerAgent) {
220
+ maxItemsPerAgent = len;
221
+ }
222
+ }
223
+ return {
224
+ total: this.agents.size,
225
+ byLifecycle,
226
+ withActiveForegroundTurn,
227
+ timelineStats: {
228
+ totalItems,
229
+ maxItemsPerAgent,
230
+ },
231
+ };
232
+ }
233
+ touchUpdatedAt(agent) {
234
+ const nowMs = Date.now();
235
+ const previousMs = agent.updatedAt.getTime();
236
+ const nextMs = nowMs > previousMs ? nowMs : previousMs + 1;
237
+ const next = new Date(nextMs);
238
+ agent.updatedAt = next;
239
+ return next;
240
+ }
241
+ hasInFlightRun(agentId) {
242
+ const agent = this.agents.get(agentId);
243
+ if (!agent) {
244
+ return false;
245
+ }
246
+ return (agent.lifecycle === "running" ||
247
+ Boolean(agent.activeForegroundTurnId) ||
248
+ this.foregroundRuns.hasPendingRun(agentId));
249
+ }
250
+ subscribe(callback, options) {
251
+ const targetAgentId = options?.agentId == null ? null : validateAgentId(options.agentId, "subscribe");
252
+ const record = {
253
+ callback,
254
+ agentId: targetAgentId,
255
+ };
256
+ this.subscribers.add(record);
257
+ if (options?.replayState !== false) {
258
+ if (record.agentId) {
259
+ const agent = this.agents.get(record.agentId);
260
+ if (agent) {
261
+ callback({
262
+ type: "agent_state",
263
+ agent: { ...agent },
264
+ });
265
+ }
266
+ }
267
+ else {
268
+ // For global subscribers, skip internal agents during replay
269
+ for (const agent of this.agents.values()) {
270
+ if (agent.internal) {
271
+ continue;
272
+ }
273
+ callback({
274
+ type: "agent_state",
275
+ agent: { ...agent },
276
+ });
277
+ }
278
+ }
279
+ }
280
+ return () => {
281
+ this.subscribers.delete(record);
282
+ };
283
+ }
284
+ listAgents() {
285
+ return Array.from(this.agents.values())
286
+ .filter((agent) => !agent.internal)
287
+ .map((agent) => Object.assign({}, agent));
288
+ }
289
+ async listImportablePersistedAgents(options) {
290
+ const providerEntries = Array.from(this.clients.entries()).filter(([provider, client]) => !!client.listPersistedAgents &&
291
+ this.isProviderImportable(provider, options?.providerFilter));
292
+ const descriptorLists = await Promise.all(providerEntries.map(async ([provider, client]) => {
293
+ try {
294
+ return await client.listPersistedAgents({
295
+ limit: options?.limit,
296
+ cwd: options?.cwd,
297
+ });
298
+ }
299
+ catch (error) {
300
+ this.logger.warn({ err: error, provider }, "Failed to list persisted agents for provider");
301
+ return [];
302
+ }
303
+ }));
304
+ const descriptors = descriptorLists.flat();
305
+ const limit = options?.limit ?? 20;
306
+ return descriptors
307
+ .sort((a, b) => b.lastActivityAt.getTime() - a.lastActivityAt.getTime())
308
+ .slice(0, limit);
309
+ }
310
+ isProviderImportable(provider, providerFilter) {
311
+ if (!IMPORTABLE_PROVIDERS.includes(provider)) {
312
+ return false;
313
+ }
314
+ if (this.providerEnabled.get(provider) === false) {
315
+ return false;
316
+ }
317
+ if (this.providerDerivedFromId.get(provider) != null) {
318
+ return false;
319
+ }
320
+ if (providerFilter && !providerFilter.has(provider)) {
321
+ return false;
322
+ }
323
+ return true;
324
+ }
325
+ async findPersistedAgent(provider, sessionId, options) {
326
+ const client = this.requireClient(provider);
327
+ if (!client.listPersistedAgents) {
328
+ return null;
329
+ }
330
+ const descriptors = await client.listPersistedAgents({ limit: 200, cwd: options?.cwd });
331
+ return (descriptors.find((descriptor) => {
332
+ return (descriptor.sessionId === sessionId || descriptor.persistence.nativeHandle === sessionId);
333
+ }) ?? null);
334
+ }
335
+ async listProviderAvailability() {
336
+ const checks = Array.from(this.clients.keys()).map(async (provider) => {
337
+ const client = this.clients.get(provider);
338
+ if (!client) {
339
+ return {
340
+ provider,
341
+ available: false,
342
+ error: `No client registered for provider '${provider}'`,
343
+ };
344
+ }
345
+ try {
346
+ const available = await client.isAvailable();
347
+ return {
348
+ provider,
349
+ available,
350
+ error: null,
351
+ };
352
+ }
353
+ catch (error) {
354
+ const message = error instanceof Error ? error.message : String(error);
355
+ this.logger.warn({ err: error, provider }, "Failed to check provider availability");
356
+ return {
357
+ provider,
358
+ available: false,
359
+ error: message,
360
+ };
361
+ }
362
+ });
363
+ return Promise.all(checks);
364
+ }
365
+ async listDraftCommands(config) {
366
+ const normalizedConfig = await this.normalizeConfig(config);
367
+ const client = this.requireClient(normalizedConfig.provider);
368
+ const available = await client.isAvailable();
369
+ if (!available) {
370
+ throw new Error(`Provider '${normalizedConfig.provider}' is not available. Please ensure the CLI is installed.`);
371
+ }
372
+ if (client.listCommands) {
373
+ return await client.listCommands(normalizedConfig);
374
+ }
375
+ const session = await client.createSession(normalizedConfig);
376
+ try {
377
+ if (!session.listCommands) {
378
+ throw new Error(`Provider '${normalizedConfig.provider}' does not support listing commands`);
379
+ }
380
+ return await session.listCommands();
381
+ }
382
+ finally {
383
+ try {
384
+ await session.close();
385
+ }
386
+ catch (error) {
387
+ this.logger.warn({ err: error, provider: normalizedConfig.provider }, "Failed to close draft command listing session");
388
+ }
389
+ }
390
+ }
391
+ async listDraftFeatures(config) {
392
+ const normalizedConfig = await this.normalizeConfig(config);
393
+ const client = this.requireClient(normalizedConfig.provider);
394
+ const available = await client.isAvailable();
395
+ if (!available) {
396
+ throw new Error(`Provider '${normalizedConfig.provider}' is not available. Please ensure the CLI is installed.`);
397
+ }
398
+ if (client.listFeatures) {
399
+ return await client.listFeatures(normalizedConfig);
400
+ }
401
+ const session = await client.createSession(normalizedConfig);
402
+ try {
403
+ return session.features ?? [];
404
+ }
405
+ finally {
406
+ try {
407
+ await session.close();
408
+ }
409
+ catch (error) {
410
+ this.logger.warn({ err: error, provider: normalizedConfig.provider }, "Failed to close draft feature listing session");
411
+ }
412
+ }
413
+ }
414
+ getAgent(id) {
415
+ const agent = this.agents.get(id);
416
+ return agent ? { ...agent } : null;
417
+ }
418
+ getTimeline(id) {
419
+ this.requireAgent(id);
420
+ return this.timelineStore.getItems(id);
421
+ }
422
+ async getTimelineRows(id) {
423
+ this.requireAgent(id);
424
+ if (this.durableTimelineStore) {
425
+ return await this.durableTimelineStore.getCommittedRows(id);
426
+ }
427
+ return this.timelineStore.getRows(id);
428
+ }
429
+ fetchTimeline(id, options) {
430
+ this.requireAgent(id);
431
+ return this.timelineStore.fetch(id, options);
432
+ }
433
+ async createAgent(config, agentId, options) {
434
+ const resolvedAgentId = validateAgentId(agentId ?? this.idFactory(), "createAgent");
435
+ const injectedConfig = this.mcpBaseUrl == null
436
+ ? config
437
+ : {
438
+ ...config,
439
+ mcpServers: {
440
+ paseo: {
441
+ type: "http",
442
+ url: `${this.mcpBaseUrl}?callerAgentId=${resolvedAgentId}`,
443
+ },
444
+ ...config.mcpServers,
445
+ },
446
+ };
447
+ this.requireEnabledProvider(injectedConfig.provider);
448
+ const normalizedConfig = this.applyDaemonAppendSystemPrompt(await this.normalizeConfig(injectedConfig));
449
+ const launchContext = this.buildLaunchContext(resolvedAgentId);
450
+ const client = await this.requireAvailableClient({
451
+ provider: normalizedConfig.provider,
452
+ });
453
+ const createOptions = this.buildCreateSessionOptions(options);
454
+ const session = await client.createSession(normalizedConfig, launchContext, createOptions);
455
+ return this.registerSession(session, normalizedConfig, resolvedAgentId, {
456
+ labels: options?.labels,
457
+ workspaceId: options?.workspaceId,
458
+ });
459
+ }
460
+ buildCreateSessionOptions(options) {
461
+ return options?.persistSession === undefined
462
+ ? undefined
463
+ : { persistSession: options.persistSession };
464
+ }
465
+ // Reconstruct an agent from provider persistence. Callers should explicitly
466
+ // hydrate timeline history after resume.
467
+ async resumeAgentFromPersistence(handle, overrides, agentId, options) {
468
+ const resolvedAgentId = validateAgentId(agentId ?? this.idFactory(), "resumeAgentFromPersistence");
469
+ const metadata = (handle.metadata ?? {});
470
+ const mergedConfig = {
471
+ ...metadata,
472
+ ...overrides,
473
+ provider: handle.provider,
474
+ };
475
+ const normalizedConfig = this.applyDaemonAppendSystemPrompt(await this.normalizeConfig(mergedConfig));
476
+ const resumeOverrides = { ...overrides };
477
+ let hasResumeOverrides = overrides !== undefined;
478
+ if (normalizedConfig.model !== mergedConfig.model) {
479
+ resumeOverrides.model = normalizedConfig.model;
480
+ hasResumeOverrides = true;
481
+ }
482
+ if (normalizedConfig.modeId !== mergedConfig.modeId) {
483
+ resumeOverrides.modeId = normalizedConfig.modeId;
484
+ hasResumeOverrides = true;
485
+ }
486
+ if (metadata.daemonAppendSystemPrompt !== normalizedConfig.daemonAppendSystemPrompt) {
487
+ resumeOverrides.daemonAppendSystemPrompt = normalizedConfig.daemonAppendSystemPrompt;
488
+ hasResumeOverrides = true;
489
+ }
490
+ const launchContext = this.buildLaunchContext(resolvedAgentId);
491
+ const client = this.requireClient(handle.provider);
492
+ const available = await client.isAvailable();
493
+ if (!available) {
494
+ throw new Error(`Provider '${handle.provider}' is not available. Please ensure the CLI is installed.`);
495
+ }
496
+ const session = await client.resumeSession(handle, hasResumeOverrides ? resumeOverrides : undefined, launchContext);
497
+ return this.registerSession(session, normalizedConfig, resolvedAgentId, options);
498
+ }
499
+ // Hot-reload an active agent session with config overrides. By default the
500
+ // in-memory timeline is preserved (used for voice-mode toggles and similar
501
+ // config swaps). When `rehydrateFromDisk` is set, the timeline is wiped so a
502
+ // new epoch is minted and provider history is re-streamed — this is what the
503
+ // user-facing "Reload agent" action wants when the on-disk session was
504
+ // mutated outside Paseo.
505
+ async reloadAgentSession(agentId, overrides, options) {
506
+ let existing = this.requireSessionAgent(agentId);
507
+ if (this.hasInFlightRun(agentId)) {
508
+ await this.cancelAgentRun(agentId);
509
+ existing = this.requireSessionAgent(agentId);
510
+ }
511
+ const rehydrateFromDisk = options?.rehydrateFromDisk ?? false;
512
+ const preservedHistoryPrimed = existing.historyPrimed;
513
+ const preservedLastUsage = existing.lastUsage;
514
+ const preservedLastError = existing.lastError;
515
+ const preservedAttention = existing.attention;
516
+ const handle = existing.persistence;
517
+ const provider = handle?.provider ?? existing.provider;
518
+ const client = this.requireClient(provider);
519
+ const refreshConfig = {
520
+ ...existing.config,
521
+ ...overrides,
522
+ provider,
523
+ };
524
+ const normalizedConfig = this.applyDaemonAppendSystemPrompt(await this.normalizeConfig(refreshConfig));
525
+ const launchContext = this.buildLaunchContext(agentId);
526
+ const session = handle
527
+ ? await client.resumeSession(handle, normalizedConfig, launchContext)
528
+ : await client.createSession(normalizedConfig, launchContext);
529
+ this.agentStreamCoalescer.flushAndDiscard(agentId);
530
+ // Remove the existing agent entry before swapping sessions
531
+ this.agents.delete(agentId);
532
+ if (existing.unsubscribeSession) {
533
+ existing.unsubscribeSession();
534
+ existing.unsubscribeSession = null;
535
+ }
536
+ this.foregroundRuns.clearAgent(agentId, existing);
537
+ await this.closeReloadedSession(existing.session, agentId);
538
+ if (rehydrateFromDisk) {
539
+ // Wipe both durable and in-memory timeline so registerSession mints a
540
+ // new epoch and hydrateTimelineFromProvider re-streams the freshly read
541
+ // provider history into an empty timeline.
542
+ await this.deleteCommittedTimeline(agentId);
543
+ this.timelineStore.delete(agentId);
544
+ }
545
+ // Preserve existing labels and timeline during reload.
546
+ return this.registerSession(session, normalizedConfig, agentId, {
547
+ labels: existing.labels,
548
+ createdAt: existing.createdAt,
549
+ updatedAt: existing.updatedAt,
550
+ lastUserMessageAt: existing.lastUserMessageAt,
551
+ historyPrimed: rehydrateFromDisk ? false : preservedHistoryPrimed,
552
+ lastUsage: preservedLastUsage,
553
+ lastError: preservedLastError,
554
+ attention: preservedAttention,
555
+ });
556
+ }
557
+ async closeReloadedSession(session, agentId) {
558
+ try {
559
+ const result = await this.waitWithTimeout({
560
+ operation: session.close(),
561
+ timeoutMs: this.rescueTimeouts.reloadSessionCloseMs,
562
+ onLateError: (error) => {
563
+ this.logger.warn({ err: error, agentId }, "Previous session close failed after refresh timeout");
564
+ },
565
+ });
566
+ if (result === "timed_out") {
567
+ this.logger.warn({ agentId, timeoutMs: this.rescueTimeouts.reloadSessionCloseMs }, "Timed out closing previous session during refresh");
568
+ }
569
+ }
570
+ catch (error) {
571
+ this.logger.warn({ err: error, agentId }, "Failed to close previous session during refresh");
572
+ }
573
+ }
574
+ async waitWithTimeout(options) {
575
+ let didTimeOut = false;
576
+ let timer = null;
577
+ const operation = options.operation
578
+ .then(() => "completed")
579
+ .catch((error) => {
580
+ if (didTimeOut) {
581
+ options.onLateError?.(error);
582
+ return "timed_out";
583
+ }
584
+ throw error;
585
+ });
586
+ try {
587
+ return await Promise.race([
588
+ operation,
589
+ new Promise((resolvePromise) => {
590
+ timer = setTimeout(() => {
591
+ didTimeOut = true;
592
+ resolvePromise("timed_out");
593
+ }, options.timeoutMs);
594
+ }),
595
+ ]);
596
+ }
597
+ finally {
598
+ if (timer) {
599
+ clearTimeout(timer);
600
+ }
601
+ }
602
+ }
603
+ async closeAgent(agentId) {
604
+ const agent = this.requireAgent(agentId);
605
+ this.logger.trace({
606
+ agentId,
607
+ provider: agent.provider,
608
+ sessionId: agent.persistence?.sessionId ?? undefined,
609
+ turnId: agent.activeForegroundTurnId ?? undefined,
610
+ lifecycle: agent.lifecycle,
611
+ activeForegroundTurnId: agent.activeForegroundTurnId,
612
+ pendingPermissions: agent.pendingPermissions.size,
613
+ }, "agent.manager.close.start");
614
+ const closedAgent = this.prepareAgentForClosure(agent, "agent closed");
615
+ await agent.session.close();
616
+ this.timelineStore.delete(agentId);
617
+ await this.persistSnapshot(closedAgent);
618
+ this.emitClosedAgent(closedAgent, { persist: false });
619
+ this.logger.trace({
620
+ agentId,
621
+ provider: closedAgent.provider,
622
+ sessionId: closedAgent.persistence?.sessionId ?? undefined,
623
+ }, "agent.manager.close.complete");
624
+ }
625
+ async archiveAgent(agentId) {
626
+ const agent = this.requireAgent(agentId);
627
+ if (!this.registry) {
628
+ throw new Error("Agent storage is not configured");
629
+ }
630
+ await this.registry.applySnapshot(agent, {
631
+ internal: agent.internal,
632
+ });
633
+ const stored = await this.registry.get(agentId);
634
+ if (!stored) {
635
+ throw new Error(`Agent ${agentId} not found in storage after snapshot`);
636
+ }
637
+ const { archivedAt } = await this.markRecordArchived(stored);
638
+ agent.updatedAt = new Date(archivedAt);
639
+ await this.closeAgent(agentId);
640
+ await this.cascadeArchiveChildren(agentId);
641
+ return { archivedAt };
642
+ }
643
+ // Children created via the MCP `create_agent` tool carry the parent-agent-id
644
+ // label pointing back at the caller. Archiving the parent cascades to those
645
+ // children so subagent fleets don't outlive their orchestrator. Handoff agents
646
+ // launched the same way are caught by this cascade — see docs/agent-lifecycle.md
647
+ // for the accepted limitation.
648
+ async cascadeArchiveChildren(parentAgentId) {
649
+ const registry = this.registry;
650
+ if (!registry) {
651
+ return;
652
+ }
653
+ const records = await registry.list();
654
+ for (const record of records) {
655
+ if (record.archivedAt) {
656
+ continue;
657
+ }
658
+ if (record.labels?.[PARENT_AGENT_ID_LABEL] !== parentAgentId) {
659
+ continue;
660
+ }
661
+ if (this.agents.has(record.id)) {
662
+ await this.archiveAgent(record.id);
663
+ }
664
+ else {
665
+ await this.markRecordArchived(record);
666
+ await this.cascadeArchiveChildren(record.id);
667
+ }
668
+ }
669
+ }
670
+ async markRecordArchived(record) {
671
+ const registry = this.requireRegistry();
672
+ const archivedAt = new Date().toISOString();
673
+ const archivedRecord = buildArchivedAgentRecord(record, { archivedAt, updatedAt: archivedAt });
674
+ await registry.upsert(archivedRecord);
675
+ await this.archiveNativeSessionBestEffort(record.provider, record.persistence);
676
+ if (this.agents.has(record.id)) {
677
+ this.notifyAgentState(record.id);
678
+ }
679
+ else if (!archivedRecord.internal) {
680
+ this.dispatchArchivedStoredAgent(archivedRecord);
681
+ }
682
+ return archivedRecord;
683
+ }
684
+ dispatchArchivedStoredAgent(record) {
685
+ const updatedAt = new Date(record.updatedAt);
686
+ this.dispatch({
687
+ type: "agent_state",
688
+ agent: {
689
+ id: record.id,
690
+ provider: record.provider,
691
+ cwd: record.cwd,
692
+ session: null,
693
+ capabilities: STORED_AGENT_CAPABILITIES,
694
+ config: buildStoredAgentConfig(record),
695
+ runtimeInfo: undefined,
696
+ lifecycle: "closed",
697
+ createdAt: new Date(record.createdAt),
698
+ updatedAt,
699
+ availableModes: [],
700
+ features: record.features,
701
+ currentModeId: record.lastModeId ?? null,
702
+ pendingPermissions: new Map(),
703
+ bufferedPermissionResolutions: new Map(),
704
+ inFlightPermissionResponses: new Set(),
705
+ pendingReplacement: false,
706
+ activeForegroundTurnId: null,
707
+ foregroundTurnWaiters: new Set(),
708
+ finalizedForegroundTurnIds: new Set(),
709
+ unsubscribeSession: null,
710
+ persistence: record.persistence ?? null,
711
+ historyPrimed: true,
712
+ lastUserMessageAt: record.lastUserMessageAt ? new Date(record.lastUserMessageAt) : null,
713
+ lastUsage: undefined,
714
+ lastError: record.lastError ?? undefined,
715
+ attention: { requiresAttention: false },
716
+ internal: record.internal,
717
+ labels: record.labels,
718
+ },
719
+ });
720
+ }
721
+ async setAgentMode(agentId, modeId) {
722
+ const agent = this.requireSessionAgent(agentId);
723
+ await agent.session.setMode(modeId);
724
+ agent.config.modeId = modeId;
725
+ agent.currentModeId = modeId;
726
+ // Update runtimeInfo to reflect the new mode
727
+ if (agent.runtimeInfo) {
728
+ agent.runtimeInfo = { ...agent.runtimeInfo, modeId };
729
+ }
730
+ this.touchUpdatedAt(agent);
731
+ this.emitState(agent);
732
+ }
733
+ async setAgentModel(agentId, modelId) {
734
+ const agent = this.requireSessionAgent(agentId);
735
+ const normalizedModelId = typeof modelId === "string" && modelId.trim().length > 0 ? modelId : null;
736
+ if (agent.session.setModel) {
737
+ await agent.session.setModel(normalizedModelId);
738
+ }
739
+ agent.config.model = normalizedModelId ?? undefined;
740
+ if (agent.runtimeInfo) {
741
+ agent.runtimeInfo = { ...agent.runtimeInfo, model: normalizedModelId };
742
+ }
743
+ this.touchUpdatedAt(agent);
744
+ this.emitState(agent);
745
+ }
746
+ async setAgentThinkingOption(agentId, thinkingOptionId) {
747
+ const agent = this.requireSessionAgent(agentId);
748
+ const normalizedThinkingOptionId = typeof thinkingOptionId === "string" && thinkingOptionId.trim().length > 0
749
+ ? thinkingOptionId
750
+ : null;
751
+ if (agent.session.setThinkingOption) {
752
+ await agent.session.setThinkingOption(normalizedThinkingOptionId);
753
+ }
754
+ agent.config.thinkingOptionId = normalizedThinkingOptionId ?? undefined;
755
+ if (agent.runtimeInfo) {
756
+ agent.runtimeInfo = {
757
+ ...agent.runtimeInfo,
758
+ thinkingOptionId: normalizedThinkingOptionId,
759
+ };
760
+ }
761
+ this.touchUpdatedAt(agent);
762
+ this.emitState(agent);
763
+ }
764
+ async setAgentFeature(agentId, featureId, value) {
765
+ const agent = this.requireAgent(agentId);
766
+ if (!agent.session.setFeature) {
767
+ throw new Error("Agent session does not support setting features");
768
+ }
769
+ await agent.session.setFeature(featureId, value);
770
+ agent.config.featureValues = { ...agent.config.featureValues, [featureId]: value };
771
+ this.touchUpdatedAt(agent);
772
+ this.emitState(agent);
773
+ }
774
+ async setTitle(agentId, title) {
775
+ const agent = this.requireAgent(agentId);
776
+ const normalizedTitle = title.trim();
777
+ if (!normalizedTitle) {
778
+ return;
779
+ }
780
+ if (this.agentsAwaitingInitialSnapshotPersist.has(agent.id) &&
781
+ this.registry &&
782
+ (await this.registry.get(agent.id)) === null) {
783
+ return;
784
+ }
785
+ this.touchUpdatedAt(agent);
786
+ await this.persistSnapshot(agent, { title: normalizedTitle });
787
+ this.emitState(agent, { persist: false });
788
+ }
789
+ async setGeneratedTitleIfUnset(agentId, title) {
790
+ const agent = this.requireAgent(agentId);
791
+ const normalizedTitle = title.trim();
792
+ if (!normalizedTitle) {
793
+ return;
794
+ }
795
+ const registry = this.requireRegistry();
796
+ const persisted = await registry.setGeneratedTitleIfUnset(agent.id, normalizedTitle);
797
+ if (!persisted) {
798
+ return;
799
+ }
800
+ agent.updatedAt = new Date(persisted.updatedAt);
801
+ this.emitState(agent, { persist: false });
802
+ }
803
+ async setLabels(agentId, labels) {
804
+ const agent = this.requireAgent(agentId);
805
+ agent.labels = { ...agent.labels, ...labels };
806
+ this.touchUpdatedAt(agent);
807
+ await this.persistSnapshot(agent);
808
+ this.emitState(agent, { persist: false });
809
+ }
810
+ notifyAgentState(agentId) {
811
+ const agent = this.agents.get(agentId);
812
+ if (!agent || agent.internal) {
813
+ return;
814
+ }
815
+ this.touchUpdatedAt(agent);
816
+ this.emitState(agent);
817
+ }
818
+ async clearAgentAttention(agentId) {
819
+ const agent = this.requireAgent(agentId);
820
+ if (agent.attention.requiresAttention) {
821
+ agent.attention = { requiresAttention: false };
822
+ await this.persistSnapshot(agent);
823
+ this.emitState(agent, { persist: false });
824
+ }
825
+ }
826
+ async archiveSnapshot(agentId, archivedAt) {
827
+ const registry = this.requireRegistry();
828
+ const liveAgent = this.getAgent(agentId);
829
+ if (liveAgent) {
830
+ await this.persistSnapshot(liveAgent, {
831
+ internal: liveAgent.internal,
832
+ });
833
+ }
834
+ const record = await registry.get(agentId);
835
+ if (!record) {
836
+ throw new Error(`Agent not found: ${agentId}`);
837
+ }
838
+ const nextRecord = buildArchivedAgentRecord(record, { archivedAt });
839
+ await registry.upsert(nextRecord);
840
+ await this.archiveNativeSessionBestEffort(record.provider, record.persistence);
841
+ return nextRecord;
842
+ }
843
+ async unarchiveSnapshot(agentId) {
844
+ const registry = this.requireRegistry();
845
+ const record = await registry.get(agentId);
846
+ if (!record || !record.archivedAt) {
847
+ return false;
848
+ }
849
+ await registry.upsert({
850
+ ...record,
851
+ archivedAt: null,
852
+ });
853
+ if (this.getAgent(agentId)) {
854
+ this.notifyAgentState(agentId);
855
+ }
856
+ return true;
857
+ }
858
+ async unarchiveSnapshotByHandle(handle) {
859
+ const registry = this.requireRegistry();
860
+ const records = await registry.list();
861
+ const matched = records.find((record) => record.persistence?.provider === handle.provider &&
862
+ record.persistence?.sessionId === handle.sessionId);
863
+ if (!matched) {
864
+ return;
865
+ }
866
+ await this.unarchiveSnapshot(matched.id);
867
+ }
868
+ async updateAgentMetadata(agentId, updates) {
869
+ const liveAgent = this.getAgent(agentId);
870
+ if (liveAgent) {
871
+ if (updates.title) {
872
+ await this.setTitle(agentId, updates.title);
873
+ }
874
+ if (updates.labels) {
875
+ await this.setLabels(agentId, updates.labels);
876
+ }
877
+ return;
878
+ }
879
+ const registry = this.requireRegistry();
880
+ const existing = await registry.get(agentId);
881
+ if (!existing) {
882
+ throw new Error(`Agent not found: ${agentId}`);
883
+ }
884
+ await registry.upsert({
885
+ ...existing,
886
+ ...(updates.title ? { title: updates.title } : {}),
887
+ ...(updates.labels ? { labels: { ...existing.labels, ...updates.labels } } : {}),
888
+ });
889
+ }
890
+ async runAgent(agentId, prompt, options) {
891
+ const events = this.streamAgent(agentId, prompt, options);
892
+ const timeline = [];
893
+ let finalText = "";
894
+ let usage;
895
+ let canceled = false;
896
+ for await (const event of events) {
897
+ if (event.type === "timeline") {
898
+ timeline.push(event.item);
899
+ }
900
+ else if (event.type === "turn_completed") {
901
+ usage = event.usage;
902
+ }
903
+ else if (event.type === "turn_failed") {
904
+ throw new Error(this.formatTurnFailedMessage(event));
905
+ }
906
+ else if (event.type === "turn_canceled") {
907
+ canceled = true;
908
+ }
909
+ }
910
+ finalText = this.getLastAssistantMessageFromTimeline(timeline) ?? "";
911
+ const agent = this.requireAgent(agentId);
912
+ const sessionId = agent.persistence?.sessionId;
913
+ if (!sessionId) {
914
+ throw new Error(`Agent ${agentId} has no persistence.sessionId after run completed`);
915
+ }
916
+ return {
917
+ sessionId,
918
+ finalText,
919
+ usage,
920
+ timeline,
921
+ canceled,
922
+ };
923
+ }
924
+ /**
925
+ * Try to run a prompt out-of-band — i.e. without allocating a foreground turn
926
+ * and without canceling any active turn. Returns true when the session
927
+ * accepted the prompt as a side-effect command (e.g. /goal pause). Events
928
+ * emitted by the handler flow through dispatchStream so they persist and
929
+ * broadcast like normal timeline events.
930
+ */
931
+ tryRunOutOfBand(agentId, prompt) {
932
+ const agent = this.requireSessionAgent(agentId);
933
+ const handler = agent.session.tryHandleOutOfBand?.(prompt);
934
+ if (!handler) {
935
+ return false;
936
+ }
937
+ const dispatch = (event) => {
938
+ // Persist timeline items so they show up in fetchAgentTimeline; broadcast
939
+ // for live subscribers. Other event types are broadcast only.
940
+ if (event.type === "timeline") {
941
+ this.touchUpdatedAt(agent);
942
+ const row = this.recordTimeline(agent.id, event.item);
943
+ this.dispatchStream(agent.id, event, {
944
+ seq: row.seq,
945
+ epoch: this.timelineStore.getEpoch(agent.id),
946
+ timestamp: row.timestamp,
947
+ });
948
+ return;
949
+ }
950
+ this.dispatchStream(agent.id, event, { timestamp: new Date().toISOString() });
951
+ };
952
+ void (async () => {
953
+ try {
954
+ await handler.run({ emit: dispatch });
955
+ }
956
+ catch (error) {
957
+ const text = error instanceof Error ? error.message : "Out-of-band command failed";
958
+ dispatch({
959
+ type: "timeline",
960
+ provider: agent.provider,
961
+ item: { type: "assistant_message", text: `[Error] ${text}` },
962
+ });
963
+ }
964
+ })();
965
+ return true;
966
+ }
967
+ recordUserMessage(agentId, text, options) {
968
+ const agent = this.requireAgent(agentId);
969
+ const normalizedMessageId = normalizeMessageId(options?.messageId);
970
+ const item = {
971
+ type: "user_message",
972
+ text,
973
+ messageId: normalizedMessageId,
974
+ };
975
+ const updatedAt = this.touchUpdatedAt(agent);
976
+ agent.lastUserMessageAt = updatedAt;
977
+ const row = this.recordTimeline(agentId, item);
978
+ this.dispatchStream(agentId, {
979
+ type: "timeline",
980
+ item,
981
+ provider: agent.provider,
982
+ }, {
983
+ seq: row.seq,
984
+ epoch: this.timelineStore.getEpoch(agentId),
985
+ timestamp: row.timestamp,
986
+ });
987
+ if (options?.emitState !== false) {
988
+ this.emitState(agent);
989
+ }
990
+ }
991
+ async appendTimelineItem(agentId, item) {
992
+ const agent = this.requireAgent(agentId);
993
+ this.touchUpdatedAt(agent);
994
+ const row = this.recordTimeline(agentId, item);
995
+ this.dispatchStream(agentId, {
996
+ type: "timeline",
997
+ item,
998
+ provider: agent.provider,
999
+ }, {
1000
+ seq: row.seq,
1001
+ epoch: this.timelineStore.getEpoch(agentId),
1002
+ timestamp: row.timestamp,
1003
+ });
1004
+ await this.persistSnapshot(agent);
1005
+ }
1006
+ async emitLiveTimelineItem(agentId, item) {
1007
+ const agent = this.requireAgent(agentId);
1008
+ this.touchUpdatedAt(agent);
1009
+ this.dispatchStream(agentId, {
1010
+ type: "timeline",
1011
+ item,
1012
+ provider: agent.provider,
1013
+ });
1014
+ }
1015
+ streamAgent(agentId, prompt, options) {
1016
+ const existingAgent = this.requireSessionAgent(agentId);
1017
+ this.logger.trace({
1018
+ agentId,
1019
+ provider: existingAgent.provider,
1020
+ sessionId: existingAgent.persistence?.sessionId ?? undefined,
1021
+ turnId: existingAgent.activeForegroundTurnId ?? undefined,
1022
+ lifecycle: existingAgent.lifecycle,
1023
+ activeForegroundTurnId: existingAgent.activeForegroundTurnId,
1024
+ hasPendingForegroundRun: this.foregroundRuns.hasPendingRun(agentId),
1025
+ promptType: typeof prompt === "string" ? "string" : "structured",
1026
+ hasRunOptions: Boolean(options),
1027
+ }, "agent.manager.stream.request");
1028
+ if (existingAgent.activeForegroundTurnId || this.foregroundRuns.hasPendingRun(agentId)) {
1029
+ this.logger.trace({
1030
+ agentId,
1031
+ provider: existingAgent.provider,
1032
+ sessionId: existingAgent.persistence?.sessionId ?? undefined,
1033
+ turnId: existingAgent.activeForegroundTurnId ?? undefined,
1034
+ lifecycle: existingAgent.lifecycle,
1035
+ hasPendingForegroundRun: this.foregroundRuns.hasPendingRun(agentId),
1036
+ }, "agent.manager.stream.reject");
1037
+ throw new Error(`Agent ${agentId} already has an active run`);
1038
+ }
1039
+ const agent = existingAgent;
1040
+ agent.pendingReplacement = false;
1041
+ agent.lastError = undefined;
1042
+ const pendingRun = this.foregroundRuns.createPendingRun(agentId);
1043
+ const streamForwarder = async function* streamForwarder() {
1044
+ let turnId;
1045
+ let turnStream = null;
1046
+ try {
1047
+ const result = await agent.session.startTurn(prompt, options);
1048
+ turnId = result.turnId;
1049
+ }
1050
+ catch (error) {
1051
+ const errorMsg = error instanceof Error ? error.message : "Failed to start turn";
1052
+ await this.handleStreamEvent(agent, {
1053
+ type: "turn_failed",
1054
+ provider: agent.provider,
1055
+ error: errorMsg,
1056
+ });
1057
+ this.finalizeForegroundTurn(agent);
1058
+ this.foregroundRuns.settlePendingRun(agentId, pendingRun.token);
1059
+ throw error;
1060
+ }
1061
+ pendingRun.started = true;
1062
+ agent.activeForegroundTurnId = turnId;
1063
+ agent.lifecycle = "running";
1064
+ this.touchUpdatedAt(agent);
1065
+ this.emitState(agent);
1066
+ this.logger.trace({
1067
+ agentId,
1068
+ provider: agent.provider,
1069
+ sessionId: agent.persistence?.sessionId ?? undefined,
1070
+ turnId,
1071
+ lifecycle: agent.lifecycle,
1072
+ activeForegroundTurnId: agent.activeForegroundTurnId,
1073
+ }, "agent.manager.stream.start");
1074
+ turnStream = this.foregroundRuns.createTurnStream(turnId);
1075
+ this.foregroundRuns.addWaiter(agent, turnStream.waiter);
1076
+ try {
1077
+ for await (const event of turnStream.events(isTurnTerminalEvent)) {
1078
+ yield event;
1079
+ }
1080
+ }
1081
+ finally {
1082
+ if (turnStream) {
1083
+ this.foregroundRuns.deleteWaiter(agent, turnStream.waiter);
1084
+ }
1085
+ this.foregroundRuns.settlePendingRun(agentId, pendingRun.token);
1086
+ if (!agent.activeForegroundTurnId) {
1087
+ await this.refreshRuntimeInfo(agent);
1088
+ }
1089
+ }
1090
+ }.call(this);
1091
+ return streamForwarder;
1092
+ }
1093
+ finalizeForegroundTurn(agent, turnId) {
1094
+ const mutableAgent = agent;
1095
+ if (turnId) {
1096
+ this.foregroundRuns.rememberFinalizedTurn(mutableAgent, turnId);
1097
+ }
1098
+ mutableAgent.activeForegroundTurnId = null;
1099
+ const terminalError = mutableAgent.lastError;
1100
+ const shouldHoldBusyForReplacement = mutableAgent.pendingReplacement && !terminalError;
1101
+ let nextLifecycle;
1102
+ if (shouldHoldBusyForReplacement) {
1103
+ nextLifecycle = "running";
1104
+ }
1105
+ else if (terminalError) {
1106
+ nextLifecycle = "error";
1107
+ }
1108
+ else {
1109
+ nextLifecycle = "idle";
1110
+ }
1111
+ mutableAgent.lifecycle = nextLifecycle;
1112
+ const persistenceHandle = mutableAgent.session.describePersistence() ??
1113
+ (mutableAgent.runtimeInfo?.sessionId
1114
+ ? { provider: mutableAgent.provider, sessionId: mutableAgent.runtimeInfo.sessionId }
1115
+ : null);
1116
+ if (persistenceHandle) {
1117
+ mutableAgent.persistence = attachPersistenceCwd(persistenceHandle, mutableAgent.cwd);
1118
+ }
1119
+ this.logger.trace({
1120
+ agentId: agent.id,
1121
+ provider: agent.provider,
1122
+ sessionId: mutableAgent.persistence?.sessionId ?? undefined,
1123
+ turnId,
1124
+ lifecycle: mutableAgent.lifecycle,
1125
+ terminalError,
1126
+ pendingReplacement: mutableAgent.pendingReplacement,
1127
+ }, "agent.manager.finalize");
1128
+ if (!shouldHoldBusyForReplacement) {
1129
+ this.touchUpdatedAt(mutableAgent);
1130
+ this.emitState(mutableAgent);
1131
+ }
1132
+ }
1133
+ replaceAgentRun(agentId, prompt, options) {
1134
+ const snapshot = this.requireAgent(agentId);
1135
+ if (snapshot.lifecycle !== "running" &&
1136
+ !snapshot.activeForegroundTurnId &&
1137
+ !this.foregroundRuns.hasPendingRun(agentId)) {
1138
+ return this.streamAgent(agentId, prompt, options);
1139
+ }
1140
+ const agent = this.requireSessionAgent(agentId);
1141
+ agent.pendingReplacement = true;
1142
+ agent.lifecycle = "running";
1143
+ this.touchUpdatedAt(agent);
1144
+ this.emitState(agent);
1145
+ return async function* replaceRunForwarder() {
1146
+ try {
1147
+ await this.cancelAgentRun(agentId);
1148
+ const nextRun = this.streamAgent(agentId, prompt, options);
1149
+ for await (const event of nextRun) {
1150
+ yield event;
1151
+ }
1152
+ }
1153
+ catch (error) {
1154
+ const latest = this.agents.get(agentId);
1155
+ if (latest) {
1156
+ const latestActive = latest;
1157
+ latestActive.pendingReplacement = false;
1158
+ if (!latestActive.activeForegroundTurnId && latestActive.lifecycle === "running") {
1159
+ latestActive.lifecycle = "idle";
1160
+ this.touchUpdatedAt(latestActive);
1161
+ this.emitState(latestActive);
1162
+ }
1163
+ }
1164
+ throw error;
1165
+ }
1166
+ }.call(this);
1167
+ }
1168
+ async waitForAgentRunStart(agentId, options) {
1169
+ const snapshot = this.getAgent(agentId);
1170
+ if (!snapshot) {
1171
+ throw new Error(`Agent ${agentId} not found`);
1172
+ }
1173
+ const pendingRun = this.foregroundRuns.getPendingRun(agentId);
1174
+ if ((snapshot.lifecycle === "running" || pendingRun?.started) && !snapshot.pendingReplacement) {
1175
+ return;
1176
+ }
1177
+ if (!snapshot.activeForegroundTurnId && !pendingRun && !snapshot.pendingReplacement) {
1178
+ throw new Error(`Agent ${agentId} has no pending run`);
1179
+ }
1180
+ if (options?.signal?.aborted) {
1181
+ throw createAbortError(options.signal, "wait_for_agent_start aborted");
1182
+ }
1183
+ await new Promise((resolvePromise, reject) => {
1184
+ if (options?.signal?.aborted) {
1185
+ reject(createAbortError(options.signal, "wait_for_agent_start aborted"));
1186
+ return;
1187
+ }
1188
+ let unsubscribe = null;
1189
+ let abortHandler = null;
1190
+ const cleanup = () => {
1191
+ if (unsubscribe) {
1192
+ try {
1193
+ unsubscribe();
1194
+ }
1195
+ catch {
1196
+ // ignore cleanup errors
1197
+ }
1198
+ unsubscribe = null;
1199
+ }
1200
+ if (abortHandler && options?.signal) {
1201
+ try {
1202
+ options.signal.removeEventListener("abort", abortHandler);
1203
+ }
1204
+ catch {
1205
+ // ignore cleanup errors
1206
+ }
1207
+ abortHandler = null;
1208
+ }
1209
+ };
1210
+ const finishOk = () => {
1211
+ cleanup();
1212
+ resolvePromise();
1213
+ };
1214
+ const finishErr = (error) => {
1215
+ cleanup();
1216
+ reject(error);
1217
+ };
1218
+ if (options?.signal) {
1219
+ abortHandler = () => finishErr(createAbortError(options.signal, "wait_for_agent_start aborted"));
1220
+ options.signal.addEventListener("abort", abortHandler, { once: true });
1221
+ }
1222
+ const checkCurrentState = () => {
1223
+ const current = this.getAgent(agentId);
1224
+ if (!current) {
1225
+ finishErr(new Error(`Agent ${agentId} not found`));
1226
+ return true;
1227
+ }
1228
+ const currentPendingRun = this.foregroundRuns.getPendingRun(agentId);
1229
+ if ((current.lifecycle === "running" || currentPendingRun?.started) &&
1230
+ !current.pendingReplacement) {
1231
+ finishOk();
1232
+ return true;
1233
+ }
1234
+ if (current.lifecycle === "error" && !currentPendingRun?.started) {
1235
+ finishErr(new Error(current.lastError ?? `Agent ${agentId} failed to start`));
1236
+ return true;
1237
+ }
1238
+ if (!currentPendingRun && !current.activeForegroundTurnId && !current.pendingReplacement) {
1239
+ finishErr(new Error(`Agent ${agentId} run finished before starting`));
1240
+ return true;
1241
+ }
1242
+ return false;
1243
+ };
1244
+ unsubscribe = this.subscribe((event) => {
1245
+ if (event.type !== "agent_state" || event.agent.id !== agentId) {
1246
+ return;
1247
+ }
1248
+ checkCurrentState();
1249
+ }, { agentId, replayState: false });
1250
+ checkCurrentState();
1251
+ });
1252
+ }
1253
+ async respondToPermission(agentId, requestId, response) {
1254
+ const agent = this.requireAgent(agentId);
1255
+ agent.inFlightPermissionResponses.add(requestId);
1256
+ try {
1257
+ const result = await agent.session.respondToPermission(requestId, response);
1258
+ agent.pendingPermissions.delete(requestId);
1259
+ try {
1260
+ await this.refreshSessionState(agent);
1261
+ }
1262
+ catch {
1263
+ // Ignore refresh errors - state sync after permission approval is best effort.
1264
+ }
1265
+ this.touchUpdatedAt(agent);
1266
+ await this.persistSnapshot(agent);
1267
+ this.emitState(agent);
1268
+ const bufferedResolution = agent.bufferedPermissionResolutions.get(requestId);
1269
+ if (bufferedResolution) {
1270
+ agent.bufferedPermissionResolutions.delete(requestId);
1271
+ this.dispatchStream(agent.id, bufferedResolution, { timestamp: new Date().toISOString() });
1272
+ }
1273
+ return result;
1274
+ }
1275
+ finally {
1276
+ agent.inFlightPermissionResponses.delete(requestId);
1277
+ agent.bufferedPermissionResolutions.delete(requestId);
1278
+ }
1279
+ }
1280
+ async cancelAgentRun(agentId) {
1281
+ const agent = this.requireSessionAgent(agentId);
1282
+ const pendingRun = this.foregroundRuns.getPendingRun(agentId);
1283
+ const foregroundTurnId = agent.activeForegroundTurnId;
1284
+ const hasForegroundTurn = Boolean(foregroundTurnId);
1285
+ const isAutonomousRunning = agent.lifecycle === "running" && !hasForegroundTurn && !pendingRun;
1286
+ if (!hasForegroundTurn && !isAutonomousRunning && !pendingRun) {
1287
+ return false;
1288
+ }
1289
+ await this.interruptSession(agent.session, agentId);
1290
+ // The interrupt will produce a turn_canceled/turn_failed event via subscribe(),
1291
+ // which flows through the session event dispatcher and settles the foreground turn waiter.
1292
+ // Wait briefly for the event to propagate if there's an active foreground turn.
1293
+ if (foregroundTurnId) {
1294
+ const waiter = Array.from(agent.foregroundTurnWaiters).find((candidate) => candidate.turnId === foregroundTurnId);
1295
+ const timeout = new Promise((resolvePromise) => setTimeout(resolvePromise, 2000));
1296
+ if (waiter) {
1297
+ await Promise.race([waiter.settledPromise, timeout]);
1298
+ }
1299
+ else if (agent.activeForegroundTurnId === foregroundTurnId) {
1300
+ await Promise.race([
1301
+ new Promise((resolvePromise) => {
1302
+ const unsubscribe = this.subscribe((event) => {
1303
+ if (event.type === "agent_state" &&
1304
+ event.agent.id === agentId &&
1305
+ !event.agent.activeForegroundTurnId) {
1306
+ unsubscribe();
1307
+ resolvePromise();
1308
+ }
1309
+ }, { agentId, replayState: false });
1310
+ }),
1311
+ timeout,
1312
+ ]);
1313
+ }
1314
+ // The waiter settling wakes up the streamForwarder generator, but its
1315
+ // finally block (which deletes the pendingForegroundRun) runs asynchronously.
1316
+ // Wait for the pending run to be fully cleaned up so the next streamAgent
1317
+ // call doesn't see a stale entry and reject with "already has an active run".
1318
+ if (pendingRun && !pendingRun.settled) {
1319
+ await Promise.race([pendingRun.settledPromise, timeout]);
1320
+ }
1321
+ }
1322
+ else if (pendingRun) {
1323
+ const timeout = new Promise((resolvePromise) => setTimeout(resolvePromise, 2000));
1324
+ await Promise.race([pendingRun.settledPromise, timeout]);
1325
+ }
1326
+ // If the foreground turn is still stuck after the timeout, force-dispatch a
1327
+ // synthetic turn_canceled so the normal event pipeline cleans up
1328
+ // activeForegroundTurnId, settles waiters, and unblocks the streamForwarder.
1329
+ if (foregroundTurnId && agent.activeForegroundTurnId === foregroundTurnId) {
1330
+ this.logger.warn({ agentId, foregroundTurnId }, "cancelAgentRun: foreground turn still active after timeout, force-canceling");
1331
+ void this.dispatchSessionEvent(agent, {
1332
+ type: "turn_canceled",
1333
+ provider: agent.provider,
1334
+ reason: "interrupted",
1335
+ turnId: foregroundTurnId,
1336
+ });
1337
+ // The synthetic event unblocks the streamForwarder generator, whose finally
1338
+ // block settles the pending foreground run asynchronously. Wait for it.
1339
+ const staleRun = this.foregroundRuns.getPendingRun(agentId);
1340
+ if (staleRun && !staleRun.settled) {
1341
+ await staleRun.settledPromise;
1342
+ }
1343
+ }
1344
+ // Clear any pending permissions that weren't cleaned up by handleStreamEvent.
1345
+ if (agent.pendingPermissions.size > 0) {
1346
+ for (const [requestId] of agent.pendingPermissions) {
1347
+ this.dispatchStream(agent.id, {
1348
+ type: "permission_resolved",
1349
+ provider: agent.provider,
1350
+ requestId,
1351
+ resolution: { behavior: "deny", message: "Interrupted" },
1352
+ }, { timestamp: new Date().toISOString() });
1353
+ }
1354
+ agent.pendingPermissions.clear();
1355
+ this.touchUpdatedAt(agent);
1356
+ this.emitState(agent);
1357
+ }
1358
+ return true;
1359
+ }
1360
+ async interruptSession(session, agentId) {
1361
+ try {
1362
+ const result = await this.waitWithTimeout({
1363
+ operation: session.interrupt(),
1364
+ timeoutMs: this.rescueTimeouts.interruptSessionMs,
1365
+ onLateError: (error) => {
1366
+ this.logger.warn({ err: error, agentId }, "Session interrupt failed after timeout during cancel");
1367
+ },
1368
+ });
1369
+ if (result === "timed_out") {
1370
+ this.logger.warn({ agentId, timeoutMs: this.rescueTimeouts.interruptSessionMs }, "Timed out interrupting session during cancel");
1371
+ }
1372
+ }
1373
+ catch (error) {
1374
+ this.logger.error({ err: error, agentId }, "Failed to interrupt session");
1375
+ }
1376
+ }
1377
+ getPendingPermissions(agentId) {
1378
+ const agent = this.requireSessionAgent(agentId);
1379
+ return Array.from(agent.pendingPermissions.values());
1380
+ }
1381
+ peekPendingPermission(agent) {
1382
+ const iterator = agent.pendingPermissions.values().next();
1383
+ return iterator.done ? null : iterator.value;
1384
+ }
1385
+ /**
1386
+ * Hydrates the timeline from provider history if the agent's durable
1387
+ * timeline is empty (e.g., imported agents that have provider history
1388
+ * on disk but no persisted timeline rows). No-ops if already hydrated.
1389
+ */
1390
+ async hydrateTimelineFromProvider(agentId) {
1391
+ const agent = this.requireSessionAgent(agentId);
1392
+ await this.hydrateTimelineFromLegacyProviderHistory(agent);
1393
+ }
1394
+ async deleteCommittedTimeline(agentId) {
1395
+ if (!this.durableTimelineStore) {
1396
+ return;
1397
+ }
1398
+ await this.durableTimelineStore.deleteAgent(agentId);
1399
+ }
1400
+ async getLastAssistantMessage(agentId) {
1401
+ const agent = this.agents.get(agentId);
1402
+ if (!agent) {
1403
+ return null;
1404
+ }
1405
+ return await this.getLastAssistantMessageFromStores(agentId);
1406
+ }
1407
+ getLastAssistantMessageFromTimeline(timeline) {
1408
+ return this.getLastAssistantMessageSegmentFromTimeline(timeline)?.text ?? null;
1409
+ }
1410
+ getLastAssistantMessageSegmentFromTimeline(timeline) {
1411
+ // Collect the last contiguous assistant messages (Claude streams chunks)
1412
+ const chunks = [];
1413
+ let startsAtBeginning = false;
1414
+ for (let i = timeline.length - 1; i >= 0; i--) {
1415
+ const item = timeline[i];
1416
+ if (item.type !== "assistant_message") {
1417
+ if (chunks.length) {
1418
+ break;
1419
+ }
1420
+ continue;
1421
+ }
1422
+ chunks.push(item.text);
1423
+ startsAtBeginning = i === 0;
1424
+ }
1425
+ if (!chunks.length) {
1426
+ return null;
1427
+ }
1428
+ return {
1429
+ text: chunks.toReversed().join(""),
1430
+ startsAtBeginning,
1431
+ };
1432
+ }
1433
+ async getLastAssistantMessageFromStores(agentId) {
1434
+ const liveTimeline = this.timelineStore.getItems(agentId);
1435
+ const liveSegment = this.getLastAssistantMessageSegmentFromTimeline(liveTimeline);
1436
+ if (!this.durableTimelineStore) {
1437
+ return liveSegment?.text ?? null;
1438
+ }
1439
+ if (!liveSegment) {
1440
+ return await this.durableTimelineStore.getLastAssistantMessage(agentId);
1441
+ }
1442
+ if (!liveSegment.startsAtBeginning) {
1443
+ return liveSegment.text;
1444
+ }
1445
+ const lastDurableItem = await this.durableTimelineStore.getLastItem(agentId);
1446
+ if (lastDurableItem?.type !== "assistant_message") {
1447
+ return liveSegment.text;
1448
+ }
1449
+ const durableMessage = await this.durableTimelineStore.getLastAssistantMessage(agentId);
1450
+ return durableMessage ? `${durableMessage}${liveSegment.text}` : liveSegment.text;
1451
+ }
1452
+ async getLastItemFromStores(agentId) {
1453
+ const lastLiveItem = this.timelineStore.getLastItem(agentId);
1454
+ if (lastLiveItem) {
1455
+ return lastLiveItem;
1456
+ }
1457
+ if (!this.durableTimelineStore) {
1458
+ return null;
1459
+ }
1460
+ return await this.durableTimelineStore.getLastItem(agentId);
1461
+ }
1462
+ async hasCommittedUserMessageFromStores(agentId, options) {
1463
+ if (this.timelineStore.hasCommittedUserMessage(agentId, options)) {
1464
+ return true;
1465
+ }
1466
+ if (!this.durableTimelineStore) {
1467
+ return false;
1468
+ }
1469
+ return await this.durableTimelineStore.hasCommittedUserMessage(agentId, options);
1470
+ }
1471
+ async waitForAgentEvent(agentId, options) {
1472
+ const snapshot = this.getAgent(agentId);
1473
+ if (!snapshot) {
1474
+ throw new Error(`Agent ${agentId} not found`);
1475
+ }
1476
+ const pendingForegroundRun = this.foregroundRuns.getPendingRun(agentId);
1477
+ const hasForegroundTurn = Boolean(snapshot.activeForegroundTurnId) || Boolean(pendingForegroundRun);
1478
+ const immediatePermission = this.peekPendingPermission(snapshot);
1479
+ if (immediatePermission) {
1480
+ return {
1481
+ status: snapshot.lifecycle,
1482
+ permission: immediatePermission,
1483
+ lastMessage: await this.getLastAssistantMessage(agentId),
1484
+ };
1485
+ }
1486
+ const initialStatus = snapshot.lifecycle;
1487
+ const initialBusy = isAgentBusy(initialStatus) || hasForegroundTurn;
1488
+ const waitForActive = options?.waitForActive ?? false;
1489
+ if (!waitForActive && !initialBusy) {
1490
+ return {
1491
+ status: initialStatus,
1492
+ permission: null,
1493
+ lastMessage: await this.getLastAssistantMessage(agentId),
1494
+ };
1495
+ }
1496
+ if (waitForActive && !initialBusy && !hasForegroundTurn) {
1497
+ return {
1498
+ status: initialStatus,
1499
+ permission: null,
1500
+ lastMessage: await this.getLastAssistantMessage(agentId),
1501
+ };
1502
+ }
1503
+ if (options?.signal?.aborted) {
1504
+ throw createAbortError(options.signal, "wait_for_agent aborted");
1505
+ }
1506
+ return await new Promise((resolvePromise, reject) => {
1507
+ // Bug #1 Fix: Check abort signal AGAIN inside Promise constructor
1508
+ // to avoid race condition between pre-Promise check and abort listener registration
1509
+ if (options?.signal?.aborted) {
1510
+ reject(createAbortError(options.signal, "wait_for_agent aborted"));
1511
+ return;
1512
+ }
1513
+ let currentStatus = initialStatus;
1514
+ let hasStarted = isAgentBusy(initialStatus) ||
1515
+ Boolean(snapshot.activeForegroundTurnId) ||
1516
+ Boolean(pendingForegroundRun?.started);
1517
+ let terminalStatusOverride = null;
1518
+ let finished = false;
1519
+ // Bug #3 Fix: Declare unsubscribe and abortHandler upfront so cleanup can reference them
1520
+ let unsubscribe = null;
1521
+ let abortHandler = null;
1522
+ const cleanup = () => {
1523
+ // Clean up subscription
1524
+ if (unsubscribe) {
1525
+ try {
1526
+ unsubscribe();
1527
+ }
1528
+ catch {
1529
+ // ignore cleanup errors
1530
+ }
1531
+ unsubscribe = null;
1532
+ }
1533
+ // Clean up abort listener
1534
+ if (abortHandler && options?.signal) {
1535
+ try {
1536
+ options.signal.removeEventListener("abort", abortHandler);
1537
+ }
1538
+ catch {
1539
+ // ignore cleanup errors
1540
+ }
1541
+ abortHandler = null;
1542
+ }
1543
+ };
1544
+ const finish = (permission) => {
1545
+ if (finished) {
1546
+ return;
1547
+ }
1548
+ finished = true;
1549
+ cleanup();
1550
+ void this.getLastAssistantMessage(agentId)
1551
+ .then((lastMessage) => {
1552
+ resolvePromise({
1553
+ status: currentStatus,
1554
+ permission,
1555
+ lastMessage,
1556
+ });
1557
+ return;
1558
+ })
1559
+ .catch(reject);
1560
+ };
1561
+ // Bug #3 Fix: Set up abort handler BEFORE subscription
1562
+ // to ensure cleanup handlers exist before callback can fire
1563
+ if (options?.signal) {
1564
+ abortHandler = () => {
1565
+ cleanup();
1566
+ reject(createAbortError(options.signal, "wait_for_agent aborted"));
1567
+ };
1568
+ options.signal.addEventListener("abort", abortHandler, { once: true });
1569
+ }
1570
+ // Bug #3 Fix: Now subscribe with cleanup handlers already in place
1571
+ // This prevents race condition if callback fires synchronously with replayState: true
1572
+ unsubscribe = this.subscribe((event) => {
1573
+ if (event.type === "agent_state") {
1574
+ currentStatus = event.agent.lifecycle;
1575
+ const pending = this.peekPendingPermission(event.agent);
1576
+ if (pending) {
1577
+ finish(pending);
1578
+ return;
1579
+ }
1580
+ if (isAgentBusy(event.agent.lifecycle)) {
1581
+ hasStarted = true;
1582
+ return;
1583
+ }
1584
+ if (!waitForActive || hasStarted) {
1585
+ if (terminalStatusOverride) {
1586
+ currentStatus = terminalStatusOverride;
1587
+ }
1588
+ finish(null);
1589
+ }
1590
+ return;
1591
+ }
1592
+ if (event.type === "agent_stream") {
1593
+ if (event.event.type === "permission_requested") {
1594
+ finish(event.event.request);
1595
+ return;
1596
+ }
1597
+ if (event.event.type === "turn_failed") {
1598
+ hasStarted = true;
1599
+ terminalStatusOverride = "error";
1600
+ return;
1601
+ }
1602
+ if (event.event.type === "turn_completed") {
1603
+ hasStarted = true;
1604
+ }
1605
+ if (event.event.type === "turn_canceled") {
1606
+ hasStarted = true;
1607
+ }
1608
+ }
1609
+ }, { agentId, replayState: true });
1610
+ });
1611
+ }
1612
+ async registerSession(session, config, agentId, options) {
1613
+ const resolvedAgentId = validateAgentId(agentId, "registerSession");
1614
+ if (this.agents.has(resolvedAgentId)) {
1615
+ throw new Error(`Agent with id ${resolvedAgentId} already exists`);
1616
+ }
1617
+ const initialPersistedTitle = await this.resolveInitialPersistedTitle(resolvedAgentId, config);
1618
+ const now = new Date();
1619
+ const { durableTimelineHasRows } = await this.initializeAgentTimelineForRegister({
1620
+ agentId: resolvedAgentId,
1621
+ now,
1622
+ options,
1623
+ });
1624
+ const managed = this.buildManagedAgentForRegister({
1625
+ resolvedAgentId,
1626
+ session,
1627
+ config,
1628
+ now,
1629
+ durableTimelineHasRows,
1630
+ options,
1631
+ });
1632
+ this.agents.set(resolvedAgentId, managed);
1633
+ // Initialize previousStatus to track transitions
1634
+ this.previousStatuses.set(resolvedAgentId, managed.lifecycle);
1635
+ await this.refreshRuntimeInfo(managed);
1636
+ await this.persistSnapshot(managed, {
1637
+ workspaceId: options?.workspaceId,
1638
+ title: initialPersistedTitle,
1639
+ });
1640
+ this.emitState(managed, { persist: false });
1641
+ await this.refreshSessionState(managed);
1642
+ managed.lifecycle = "idle";
1643
+ await this.persistSnapshot(managed, { workspaceId: options?.workspaceId });
1644
+ this.emitState(managed, { persist: false });
1645
+ this.subscribeToSession(managed);
1646
+ return { ...managed };
1647
+ }
1648
+ async initializeAgentTimelineForRegister(params) {
1649
+ const { agentId, now, options } = params;
1650
+ const explicitTimelineSeed = buildExplicitTimelineSeedForRegister(now, options);
1651
+ const shouldSeedFromDurable = !explicitTimelineSeed &&
1652
+ !this.timelineStore.has(agentId) &&
1653
+ this.durableTimelineStore !== undefined;
1654
+ const durableTimelineSeed = shouldSeedFromDurable
1655
+ ? await this.loadCommittedTimelineSeed(agentId, now)
1656
+ : null;
1657
+ const durableTimelineHasRows = durableTimelineSeed != null && (durableTimelineSeed.nextSeq ?? 1) > 1;
1658
+ const timelineSeed = explicitTimelineSeed ?? durableTimelineSeed;
1659
+ if (timelineSeed || !this.timelineStore.has(agentId)) {
1660
+ this.timelineStore.initialize(agentId, timelineSeed ?? { timestamp: now.toISOString() });
1661
+ }
1662
+ if (options?.timelineRows?.length) {
1663
+ this.enqueueDurableTimelineBulkInsert(agentId, options.timelineRows);
1664
+ }
1665
+ return { durableTimelineHasRows };
1666
+ }
1667
+ buildManagedAgentForRegister(params) {
1668
+ const { resolvedAgentId, session, config, now, durableTimelineHasRows, options } = params;
1669
+ return {
1670
+ id: resolvedAgentId,
1671
+ provider: config.provider,
1672
+ cwd: config.cwd,
1673
+ session,
1674
+ capabilities: session.capabilities,
1675
+ config,
1676
+ runtimeInfo: undefined,
1677
+ lifecycle: "initializing",
1678
+ createdAt: options?.createdAt ?? now,
1679
+ updatedAt: options?.updatedAt ?? now,
1680
+ availableModes: [],
1681
+ currentModeId: null,
1682
+ pendingPermissions: new Map(),
1683
+ bufferedPermissionResolutions: new Map(),
1684
+ inFlightPermissionResponses: new Set(),
1685
+ pendingReplacement: false,
1686
+ activeForegroundTurnId: null,
1687
+ foregroundTurnWaiters: new Set(),
1688
+ finalizedForegroundTurnIds: new Set(),
1689
+ unsubscribeSession: null,
1690
+ persistence: attachPersistenceCwd(session.describePersistence(), config.cwd),
1691
+ historyPrimed: options?.historyPrimed ?? durableTimelineHasRows,
1692
+ lastUserMessageAt: options?.lastUserMessageAt ?? null,
1693
+ lastUsage: options?.lastUsage,
1694
+ lastError: options?.lastError,
1695
+ attention: resolveInitialAttention(options?.attention),
1696
+ internal: config.internal ?? false,
1697
+ labels: options?.labels ?? {},
1698
+ };
1699
+ }
1700
+ async loadCommittedTimelineSeed(agentId, now) {
1701
+ if (!this.durableTimelineStore) {
1702
+ return { timestamp: now.toISOString() };
1703
+ }
1704
+ return {
1705
+ nextSeq: (await this.durableTimelineStore.getLatestCommittedSeq(agentId)) + 1,
1706
+ timestamp: now.toISOString(),
1707
+ };
1708
+ }
1709
+ prepareAgentForClosure(agent, cancelReason) {
1710
+ this.agentStreamCoalescer.flushAndDiscard(agent.id);
1711
+ this.agents.delete(agent.id);
1712
+ this.previousStatuses.delete(agent.id);
1713
+ if (agent.unsubscribeSession) {
1714
+ agent.unsubscribeSession();
1715
+ agent.unsubscribeSession = null;
1716
+ }
1717
+ this.foregroundRuns.cancelWaiters(agent, (turnId) => ({
1718
+ type: "turn_canceled",
1719
+ provider: agent.provider,
1720
+ reason: cancelReason,
1721
+ turnId,
1722
+ }));
1723
+ this.foregroundRuns.settlePendingRun(agent.id);
1724
+ return {
1725
+ ...agent,
1726
+ lifecycle: "closed",
1727
+ session: null,
1728
+ activeForegroundTurnId: null,
1729
+ };
1730
+ }
1731
+ emitClosedAgent(agent, options) {
1732
+ this.emitState(agent, options);
1733
+ }
1734
+ subscribeToSession(agent) {
1735
+ if (agent.unsubscribeSession) {
1736
+ return;
1737
+ }
1738
+ const agentId = agent.id;
1739
+ const unsubscribe = agent.session.subscribe((event) => {
1740
+ this.enqueueSessionEvent(agentId, event);
1741
+ });
1742
+ agent.unsubscribeSession = unsubscribe;
1743
+ }
1744
+ enqueueSessionEvent(agentId, event) {
1745
+ this.logger.trace({
1746
+ agentId,
1747
+ provider: event.provider,
1748
+ sessionId: this.agents.get(agentId)?.persistence?.sessionId ?? undefined,
1749
+ turnId: getAgentStreamEventTurnId(event),
1750
+ event,
1751
+ }, "agent.manager.enqueue");
1752
+ const previous = this.sessionEventTails.get(agentId) ?? Promise.resolve();
1753
+ const next = previous
1754
+ .catch(() => undefined)
1755
+ .then(async () => {
1756
+ const current = this.agents.get(agentId);
1757
+ if (!current) {
1758
+ return;
1759
+ }
1760
+ if (current.session == null) {
1761
+ return;
1762
+ }
1763
+ this.logger.trace({
1764
+ agentId,
1765
+ provider: event.provider,
1766
+ sessionId: current.persistence?.sessionId ?? undefined,
1767
+ turnId: getAgentStreamEventTurnId(event),
1768
+ event,
1769
+ }, "agent.manager.dequeue");
1770
+ await this.dispatchSessionEvent(current, event);
1771
+ return;
1772
+ })
1773
+ .catch((err) => {
1774
+ this.logger.error({ err, agentId, eventType: event.type }, "Failed to process session event");
1775
+ });
1776
+ this.sessionEventTails.set(agentId, next);
1777
+ this.trackBackgroundTask(next);
1778
+ void next.finally(() => {
1779
+ if (this.sessionEventTails.get(agentId) === next) {
1780
+ this.sessionEventTails.delete(agentId);
1781
+ }
1782
+ });
1783
+ }
1784
+ async dispatchSessionEvent(agent, event) {
1785
+ const turnId = getAgentStreamEventTurnId(event);
1786
+ const matchingWaiters = this.foregroundRuns.getMatchingWaiters(agent, turnId);
1787
+ this.logger.trace({
1788
+ agentId: agent.id,
1789
+ provider: event.provider,
1790
+ sessionId: agent.persistence?.sessionId ?? undefined,
1791
+ turnId,
1792
+ matchingWaiterCount: matchingWaiters.length,
1793
+ event,
1794
+ }, "agent.manager.dispatch_session_event");
1795
+ const shouldNotifyWaiters = await this.handleStreamEvent(agent, event);
1796
+ if (!shouldNotifyWaiters) {
1797
+ return;
1798
+ }
1799
+ this.foregroundRuns.notifyWaiters(matchingWaiters, event, {
1800
+ terminal: isTurnTerminalEvent(event),
1801
+ });
1802
+ this.logger.trace({
1803
+ agentId: agent.id,
1804
+ provider: event.provider,
1805
+ sessionId: agent.persistence?.sessionId ?? undefined,
1806
+ turnId,
1807
+ notifiedWaiterCount: matchingWaiters.length,
1808
+ terminal: isTurnTerminalEvent(event),
1809
+ event,
1810
+ }, "agent.manager.notify_waiters");
1811
+ }
1812
+ async resolveInitialPersistedTitle(agentId, config) {
1813
+ const existing = await this.registry?.get(agentId);
1814
+ if (existing) {
1815
+ return existing.title ?? null;
1816
+ }
1817
+ if (Object.prototype.hasOwnProperty.call(config, "title")) {
1818
+ return config.title ?? null;
1819
+ }
1820
+ return null;
1821
+ }
1822
+ async persistSnapshot(agent, options) {
1823
+ if (!this.registry) {
1824
+ return;
1825
+ }
1826
+ // Don't persist internal agents - they're ephemeral system tasks
1827
+ if (agent.internal) {
1828
+ return;
1829
+ }
1830
+ if (options?.workspaceId !== undefined) {
1831
+ await this.registry.applySnapshot(agent, options.workspaceId, options);
1832
+ return;
1833
+ }
1834
+ await this.registry.applySnapshot(agent, options);
1835
+ }
1836
+ requireRegistry() {
1837
+ if (!this.registry) {
1838
+ throw new Error("Agent storage unavailable");
1839
+ }
1840
+ return this.registry;
1841
+ }
1842
+ async refreshSessionState(agent) {
1843
+ try {
1844
+ const modes = await agent.session.getAvailableModes();
1845
+ agent.availableModes = modes;
1846
+ }
1847
+ catch {
1848
+ agent.availableModes = [];
1849
+ }
1850
+ try {
1851
+ agent.currentModeId = await agent.session.getCurrentMode();
1852
+ }
1853
+ catch {
1854
+ agent.currentModeId = null;
1855
+ }
1856
+ try {
1857
+ const pending = agent.session.getPendingPermissions();
1858
+ agent.pendingPermissions = new Map(pending.map((request) => [request.id, request]));
1859
+ }
1860
+ catch {
1861
+ agent.pendingPermissions.clear();
1862
+ }
1863
+ this.syncFeaturesFromSession(agent);
1864
+ await this.refreshRuntimeInfo(agent);
1865
+ }
1866
+ async refreshRuntimeInfo(agent) {
1867
+ try {
1868
+ const newInfo = await agent.session.getRuntimeInfo();
1869
+ const changed = newInfo.model !== agent.runtimeInfo?.model ||
1870
+ newInfo.thinkingOptionId !== agent.runtimeInfo?.thinkingOptionId ||
1871
+ newInfo.sessionId !== agent.runtimeInfo?.sessionId ||
1872
+ newInfo.modeId !== agent.runtimeInfo?.modeId;
1873
+ agent.runtimeInfo = newInfo;
1874
+ if (!agent.persistence && newInfo.sessionId) {
1875
+ agent.persistence = attachPersistenceCwd({ provider: agent.provider, sessionId: newInfo.sessionId }, agent.cwd);
1876
+ }
1877
+ // Emit state if runtimeInfo changed so clients get the updated model
1878
+ if (changed) {
1879
+ this.emitState(agent);
1880
+ }
1881
+ }
1882
+ catch {
1883
+ // Keep existing runtimeInfo if refresh fails.
1884
+ }
1885
+ }
1886
+ async hydrateTimelineFromLegacyProviderHistory(agent) {
1887
+ if (agent.historyPrimed) {
1888
+ return;
1889
+ }
1890
+ agent.historyPrimed = true;
1891
+ const canonicalUserMessagesById = this.timelineStore.getCanonicalUserMessagesById(agent.id);
1892
+ try {
1893
+ for await (const event of agent.session.streamHistory()) {
1894
+ if (event.type !== "timeline") {
1895
+ continue;
1896
+ }
1897
+ if (isDuplicateLegacyUserMessage(event.item, canonicalUserMessagesById)) {
1898
+ continue;
1899
+ }
1900
+ this.recordTimeline(agent.id, event.item, event.timestamp ? { timestamp: event.timestamp } : undefined);
1901
+ }
1902
+ }
1903
+ catch {
1904
+ // ignore history failures
1905
+ }
1906
+ }
1907
+ notifyForegroundTurnWaiters(agentId, event) {
1908
+ const turnId = getAgentStreamEventTurnId(event);
1909
+ if (turnId == null) {
1910
+ return;
1911
+ }
1912
+ const agent = this.agents.get(agentId);
1913
+ if (!agent) {
1914
+ return;
1915
+ }
1916
+ this.foregroundRuns.notifyAgentWaiters(agent, event);
1917
+ this.logger.trace({
1918
+ agentId,
1919
+ provider: event.provider,
1920
+ sessionId: agent.persistence?.sessionId ?? undefined,
1921
+ turnId,
1922
+ event,
1923
+ }, "agent.manager.notify_waiters.coalesced");
1924
+ }
1925
+ async handleStreamEvent(agent, event, options) {
1926
+ const eventTurnId = getAgentStreamEventTurnId(event);
1927
+ const isForegroundEvent = Boolean(eventTurnId && agent.activeForegroundTurnId === eventTurnId);
1928
+ this.traceHandleStreamEventStart(agent, event, eventTurnId, isForegroundEvent);
1929
+ if (eventTurnId &&
1930
+ isTurnTerminalEvent(event) &&
1931
+ this.foregroundRuns.hasFinalizedTurn(agent, eventTurnId)) {
1932
+ return false;
1933
+ }
1934
+ // Only update timestamp for live events, not history replay
1935
+ if (!options?.fromHistory) {
1936
+ this.touchUpdatedAt(agent);
1937
+ if (this.agentStreamCoalescer.handle(agent.id, event)) {
1938
+ this.traceCoalescerBuffered(agent, event, eventTurnId);
1939
+ return false;
1940
+ }
1941
+ this.agentStreamCoalescer.flushFor(agent.id);
1942
+ }
1943
+ const flags = { shouldDispatchEvent: true, shouldNotifyWaiters: true };
1944
+ const dispatchPromise = this.dispatchStreamEventByType({
1945
+ agent,
1946
+ event,
1947
+ options,
1948
+ isForegroundEvent,
1949
+ eventTurnId,
1950
+ flags,
1951
+ });
1952
+ if (dispatchPromise) {
1953
+ await dispatchPromise;
1954
+ }
1955
+ if (!options?.fromHistory && isForegroundEvent && isTurnTerminalEvent(event)) {
1956
+ this.finalizeForegroundTurn(agent, eventTurnId);
1957
+ }
1958
+ if (!options?.fromHistory && flags.shouldDispatchEvent) {
1959
+ this.dispatchStream(agent.id, event, { timestamp: new Date().toISOString() });
1960
+ }
1961
+ this.traceHandleStreamEventEnd(agent, event, eventTurnId, flags);
1962
+ return flags.shouldNotifyWaiters;
1963
+ }
1964
+ traceHandleStreamEventStart(agent, event, turnId, isForegroundEvent) {
1965
+ this.logger.trace({
1966
+ agentId: agent.id,
1967
+ provider: event.provider,
1968
+ sessionId: agent.persistence?.sessionId ?? undefined,
1969
+ turnId,
1970
+ lifecycle: agent.lifecycle,
1971
+ activeForegroundTurnId: agent.activeForegroundTurnId,
1972
+ isForegroundEvent,
1973
+ event,
1974
+ }, "agent.manager.handle_stream_event.start");
1975
+ }
1976
+ traceCoalescerBuffered(agent, event, turnId) {
1977
+ this.logger.trace({
1978
+ agentId: agent.id,
1979
+ provider: event.provider,
1980
+ sessionId: agent.persistence?.sessionId ?? undefined,
1981
+ turnId,
1982
+ event,
1983
+ }, "agent.manager.coalescer.buffer");
1984
+ }
1985
+ traceHandleStreamEventEnd(agent, event, turnId, flags) {
1986
+ this.logger.trace({
1987
+ agentId: agent.id,
1988
+ provider: event.provider,
1989
+ sessionId: agent.persistence?.sessionId ?? undefined,
1990
+ turnId,
1991
+ lifecycle: agent.lifecycle,
1992
+ activeForegroundTurnId: agent.activeForegroundTurnId,
1993
+ shouldDispatchEvent: flags.shouldDispatchEvent,
1994
+ shouldNotifyWaiters: flags.shouldNotifyWaiters,
1995
+ event,
1996
+ }, "agent.manager.handle_stream_event.end");
1997
+ }
1998
+ dispatchStreamEventByType(params) {
1999
+ const { agent, event, options, isForegroundEvent, eventTurnId, flags } = params;
2000
+ switch (event.type) {
2001
+ case "thread_started":
2002
+ this.onStreamThreadStarted(agent);
2003
+ return undefined;
2004
+ case "usage_updated":
2005
+ agent.lastUsage = event.usage;
2006
+ this.emitState(agent);
2007
+ return undefined;
2008
+ case "mode_changed":
2009
+ agent.currentModeId = event.currentModeId;
2010
+ agent.availableModes = event.availableModes;
2011
+ if (agent.runtimeInfo) {
2012
+ agent.runtimeInfo = { ...agent.runtimeInfo, modeId: event.currentModeId };
2013
+ }
2014
+ flags.shouldDispatchEvent = false;
2015
+ this.emitState(agent);
2016
+ return undefined;
2017
+ case "model_changed":
2018
+ agent.runtimeInfo = event.runtimeInfo;
2019
+ if (!agent.persistence && event.runtimeInfo.sessionId) {
2020
+ agent.persistence = attachPersistenceCwd({ provider: agent.provider, sessionId: event.runtimeInfo.sessionId }, agent.cwd);
2021
+ }
2022
+ agent.currentModeId = event.runtimeInfo.modeId ?? agent.currentModeId;
2023
+ flags.shouldDispatchEvent = false;
2024
+ this.emitState(agent);
2025
+ return undefined;
2026
+ case "thinking_option_changed":
2027
+ if (agent.runtimeInfo) {
2028
+ agent.runtimeInfo = {
2029
+ ...agent.runtimeInfo,
2030
+ thinkingOptionId: event.thinkingOptionId,
2031
+ };
2032
+ }
2033
+ flags.shouldDispatchEvent = false;
2034
+ this.emitState(agent);
2035
+ return undefined;
2036
+ case "timeline":
2037
+ return this.onStreamTimelineEvent({ agent, event, options, isForegroundEvent, flags });
2038
+ case "turn_completed":
2039
+ this.onStreamTurnCompleted({ agent, event, eventTurnId, isForegroundEvent });
2040
+ return undefined;
2041
+ case "turn_failed":
2042
+ return this.onStreamTurnFailed({
2043
+ agent,
2044
+ event,
2045
+ eventTurnId,
2046
+ isForegroundEvent,
2047
+ options,
2048
+ });
2049
+ case "turn_canceled":
2050
+ this.onStreamTurnCanceled({ agent, event, eventTurnId, isForegroundEvent, options });
2051
+ return undefined;
2052
+ case "turn_started":
2053
+ this.onStreamTurnStarted({ agent, eventTurnId, isForegroundEvent });
2054
+ return undefined;
2055
+ case "permission_requested":
2056
+ this.onStreamPermissionRequested(agent, event);
2057
+ return undefined;
2058
+ case "permission_resolved":
2059
+ this.onStreamPermissionResolved({ agent, event, options, flags });
2060
+ return undefined;
2061
+ default:
2062
+ return undefined;
2063
+ }
2064
+ }
2065
+ onStreamThreadStarted(agent) {
2066
+ const previousSessionId = agent.persistence?.sessionId ?? null;
2067
+ const handle = agent.session.describePersistence();
2068
+ if (handle) {
2069
+ agent.persistence = attachPersistenceCwd(handle, agent.cwd);
2070
+ if (agent.persistence?.sessionId !== previousSessionId) {
2071
+ this.emitState(agent);
2072
+ }
2073
+ }
2074
+ void this.refreshRuntimeInfo(agent);
2075
+ }
2076
+ async onStreamTimelineEvent(params) {
2077
+ const { agent, event, options, isForegroundEvent, flags } = params;
2078
+ // Skip provider-replayed user_message items during history hydration.
2079
+ if (options?.fromHistory && event.item.type === "user_message") {
2080
+ const eventMessageId = normalizeMessageId(event.item.messageId);
2081
+ if (eventMessageId) {
2082
+ const canonicalText = options?.canonicalUserMessagesById?.get(eventMessageId);
2083
+ if (canonicalText === event.item.text) {
2084
+ flags.shouldDispatchEvent = false;
2085
+ flags.shouldNotifyWaiters = false;
2086
+ return;
2087
+ }
2088
+ }
2089
+ }
2090
+ // Suppress user_message echoes for the active foreground turn.
2091
+ if (!options?.fromHistory && event.item.type === "user_message" && isForegroundEvent) {
2092
+ const eventMessageId = normalizeMessageId(event.item.messageId);
2093
+ if (eventMessageId &&
2094
+ (await this.hasCommittedUserMessageFromStores(agent.id, {
2095
+ messageId: eventMessageId,
2096
+ text: event.item.text,
2097
+ }))) {
2098
+ return;
2099
+ }
2100
+ }
2101
+ if (options?.fromHistory) {
2102
+ this.recordTimeline(agent.id, event.item, event.timestamp ? { timestamp: event.timestamp } : undefined);
2103
+ flags.shouldDispatchEvent = false;
2104
+ flags.shouldNotifyWaiters = false;
2105
+ return;
2106
+ }
2107
+ this.recordAndDispatchTimelineItem(agent.id, event.item, event.provider, event.turnId);
2108
+ if (event.item.type === "user_message") {
2109
+ agent.lastUserMessageAt = new Date();
2110
+ this.emitState(agent);
2111
+ }
2112
+ flags.shouldDispatchEvent = false;
2113
+ flags.shouldNotifyWaiters = true;
2114
+ }
2115
+ onStreamTurnCompleted(params) {
2116
+ const { agent, event, eventTurnId, isForegroundEvent } = params;
2117
+ this.logger.trace({
2118
+ agentId: agent.id,
2119
+ provider: agent.provider,
2120
+ sessionId: agent.persistence?.sessionId ?? undefined,
2121
+ turnId: eventTurnId,
2122
+ lifecycle: agent.lifecycle,
2123
+ activeForegroundTurnId: agent.activeForegroundTurnId,
2124
+ }, "agent.manager.turn.completed");
2125
+ agent.lastUsage = event.usage;
2126
+ agent.lastError = undefined;
2127
+ if (!isForegroundEvent && agent.lifecycle !== "idle" && !agent.pendingReplacement) {
2128
+ agent.lifecycle = "idle";
2129
+ this.emitState(agent);
2130
+ }
2131
+ void this.refreshRuntimeInfo(agent);
2132
+ }
2133
+ async onStreamTurnFailed(params) {
2134
+ const { agent, event, eventTurnId, isForegroundEvent, options } = params;
2135
+ this.logger.warn({
2136
+ agentId: agent.id,
2137
+ provider: agent.provider,
2138
+ sessionId: agent.persistence?.sessionId ?? undefined,
2139
+ turnId: eventTurnId,
2140
+ lifecycle: agent.lifecycle,
2141
+ activeForegroundTurnId: agent.activeForegroundTurnId,
2142
+ eventTurnId,
2143
+ error: event.error,
2144
+ code: event.code,
2145
+ diagnostic: event.diagnostic,
2146
+ }, "handleStreamEvent: turn_failed");
2147
+ if (!isForegroundEvent) {
2148
+ agent.lifecycle = "error";
2149
+ }
2150
+ agent.lastError = event.error;
2151
+ await this.appendSystemErrorTimelineMessage(agent, event.provider, this.formatTurnFailedMessage(event), options);
2152
+ this.resolvePendingPermissionsForAgent(agent, event.provider, options, "Turn failed");
2153
+ if (!isForegroundEvent) {
2154
+ this.emitState(agent);
2155
+ }
2156
+ }
2157
+ onStreamTurnCanceled(params) {
2158
+ const { agent, event, eventTurnId, isForegroundEvent, options } = params;
2159
+ this.logger.trace({
2160
+ agentId: agent.id,
2161
+ provider: agent.provider,
2162
+ sessionId: agent.persistence?.sessionId ?? undefined,
2163
+ turnId: eventTurnId,
2164
+ lifecycle: agent.lifecycle,
2165
+ activeForegroundTurnId: agent.activeForegroundTurnId,
2166
+ eventTurnId,
2167
+ }, "agent.manager.turn.canceled");
2168
+ if (!isForegroundEvent && !agent.pendingReplacement) {
2169
+ agent.lifecycle = "idle";
2170
+ }
2171
+ agent.lastError = undefined;
2172
+ this.resolvePendingPermissionsForAgent(agent, event.provider, options, "Interrupted");
2173
+ if (!isForegroundEvent) {
2174
+ this.emitState(agent);
2175
+ }
2176
+ }
2177
+ onStreamTurnStarted(params) {
2178
+ const { agent, eventTurnId, isForegroundEvent } = params;
2179
+ this.logger.trace({
2180
+ agentId: agent.id,
2181
+ provider: agent.provider,
2182
+ sessionId: agent.persistence?.sessionId ?? undefined,
2183
+ turnId: eventTurnId,
2184
+ lifecycle: agent.lifecycle,
2185
+ activeForegroundTurnId: agent.activeForegroundTurnId,
2186
+ }, "agent.manager.turn.started");
2187
+ if (!isForegroundEvent) {
2188
+ agent.lifecycle = "running";
2189
+ this.emitState(agent);
2190
+ }
2191
+ }
2192
+ onStreamPermissionRequested(agent, event) {
2193
+ const hadPendingPermissions = agent.pendingPermissions.size > 0;
2194
+ agent.pendingPermissions.set(event.request.id, event.request);
2195
+ if (!hadPendingPermissions && !agent.internal) {
2196
+ this.broadcastAgentAttention(agent, "permission");
2197
+ }
2198
+ this.emitState(agent);
2199
+ }
2200
+ onStreamPermissionResolved(params) {
2201
+ const { agent, event, options, flags } = params;
2202
+ agent.pendingPermissions.delete(event.requestId);
2203
+ if (!options?.fromHistory && agent.inFlightPermissionResponses.has(event.requestId)) {
2204
+ agent.bufferedPermissionResolutions.set(event.requestId, event);
2205
+ flags.shouldDispatchEvent = false;
2206
+ return;
2207
+ }
2208
+ this.emitState(agent);
2209
+ }
2210
+ resolvePendingPermissionsForAgent(agent, provider, options, message) {
2211
+ for (const [requestId] of agent.pendingPermissions) {
2212
+ agent.pendingPermissions.delete(requestId);
2213
+ if (!options?.fromHistory) {
2214
+ this.dispatchStream(agent.id, {
2215
+ type: "permission_resolved",
2216
+ provider,
2217
+ requestId,
2218
+ resolution: { behavior: "deny", message },
2219
+ });
2220
+ }
2221
+ }
2222
+ }
2223
+ recordAndDispatchTimelineItem(agentId, item, provider, turnId) {
2224
+ const row = this.recordTimeline(agentId, item);
2225
+ const event = {
2226
+ type: "timeline",
2227
+ item,
2228
+ provider,
2229
+ ...(turnId !== undefined ? { turnId } : {}),
2230
+ };
2231
+ this.dispatchStream(agentId, event, {
2232
+ seq: row.seq,
2233
+ epoch: this.timelineStore.getEpoch(agentId),
2234
+ timestamp: row.timestamp,
2235
+ });
2236
+ return event;
2237
+ }
2238
+ async appendSystemErrorTimelineMessage(agent, provider, message, options) {
2239
+ if (options?.fromHistory) {
2240
+ return;
2241
+ }
2242
+ const normalized = message.trim();
2243
+ if (!normalized) {
2244
+ return;
2245
+ }
2246
+ const text = `${SYSTEM_ERROR_PREFIX} ${normalized}`;
2247
+ const lastItem = await this.getLastItemFromStores(agent.id);
2248
+ if (lastItem?.type === "assistant_message" && lastItem.text === text) {
2249
+ return;
2250
+ }
2251
+ const item = { type: "assistant_message", text };
2252
+ const row = this.recordTimeline(agent.id, item);
2253
+ this.dispatchStream(agent.id, {
2254
+ type: "timeline",
2255
+ item,
2256
+ provider,
2257
+ }, {
2258
+ seq: row.seq,
2259
+ epoch: this.timelineStore.getEpoch(agent.id),
2260
+ timestamp: row.timestamp,
2261
+ });
2262
+ }
2263
+ formatTurnFailedMessage(event) {
2264
+ const base = event.error.trim();
2265
+ const parts = [base.length > 0 ? base : "Provider run failed"];
2266
+ const code = event.code?.trim();
2267
+ if (code) {
2268
+ parts.push(`code: ${code}`);
2269
+ }
2270
+ const diagnostic = event.diagnostic?.trim();
2271
+ if (diagnostic && diagnostic !== base) {
2272
+ parts.push(diagnostic);
2273
+ }
2274
+ return parts.join("\n\n");
2275
+ }
2276
+ recordTimeline(agentId, item, options) {
2277
+ const row = this.timelineStore.append(agentId, item, options);
2278
+ this.enqueueDurableTimelineAppend(agentId, row);
2279
+ return row;
2280
+ }
2281
+ emitState(agent, options) {
2282
+ // Keep attention as an edge-triggered unread signal, not a level signal.
2283
+ this.checkAndSetAttention(agent);
2284
+ if (options?.persist !== false) {
2285
+ this.enqueueBackgroundPersist(agent);
2286
+ }
2287
+ this.syncFeaturesFromSession(agent);
2288
+ this.logger.trace({
2289
+ agentId: agent.id,
2290
+ provider: agent.provider,
2291
+ sessionId: agent.persistence?.sessionId ?? undefined,
2292
+ turnId: agent.activeForegroundTurnId ?? undefined,
2293
+ lifecycle: agent.lifecycle,
2294
+ activeForegroundTurnId: agent.activeForegroundTurnId,
2295
+ pendingPermissions: agent.pendingPermissions.size,
2296
+ persist: options?.persist !== false,
2297
+ }, "agent.manager.emit_state");
2298
+ this.dispatch({
2299
+ type: "agent_state",
2300
+ agent: { ...agent },
2301
+ });
2302
+ }
2303
+ syncFeaturesFromSession(agent) {
2304
+ if ("session" in agent && agent.session?.features) {
2305
+ agent.features = agent.session.features;
2306
+ }
2307
+ }
2308
+ checkAndSetAttention(agent) {
2309
+ const previousStatus = this.previousStatuses.get(agent.id);
2310
+ const currentStatus = agent.lifecycle;
2311
+ // Track the new status
2312
+ this.previousStatuses.set(agent.id, currentStatus);
2313
+ // Skip attention tracking for internal agents
2314
+ if (agent.internal) {
2315
+ return;
2316
+ }
2317
+ // Skip if already requires attention
2318
+ if (agent.attention.requiresAttention) {
2319
+ return;
2320
+ }
2321
+ // Check if agent transitioned from running to idle (finished)
2322
+ if (previousStatus === "running" && currentStatus === "idle") {
2323
+ agent.attention = {
2324
+ requiresAttention: true,
2325
+ attentionReason: "finished",
2326
+ attentionTimestamp: new Date(),
2327
+ };
2328
+ this.broadcastAgentAttention(agent, "finished");
2329
+ return;
2330
+ }
2331
+ // Check if agent entered error state
2332
+ if (previousStatus !== "error" && currentStatus === "error") {
2333
+ agent.attention = {
2334
+ requiresAttention: true,
2335
+ attentionReason: "error",
2336
+ attentionTimestamp: new Date(),
2337
+ };
2338
+ this.broadcastAgentAttention(agent, "error");
2339
+ return;
2340
+ }
2341
+ }
2342
+ enqueueBackgroundPersist(agent) {
2343
+ const task = this.persistSnapshot(agent).catch((err) => {
2344
+ this.logger.error({ err, agentId: agent.id }, "Failed to persist agent snapshot");
2345
+ });
2346
+ this.trackBackgroundTask(task);
2347
+ }
2348
+ enqueueDurableTimelineAppend(agentId, row) {
2349
+ if (!this.durableTimelineStore) {
2350
+ return;
2351
+ }
2352
+ const task = this.durableTimelineStore
2353
+ .bulkInsert(agentId, [row])
2354
+ .then(() => undefined)
2355
+ .catch((err) => {
2356
+ this.logger.error({ err, agentId, seq: row.seq, itemType: row.item.type }, "Failed to append timeline row to durable store");
2357
+ });
2358
+ this.trackBackgroundTask(task);
2359
+ }
2360
+ enqueueDurableTimelineBulkInsert(agentId, rows) {
2361
+ if (!this.durableTimelineStore || rows.length === 0) {
2362
+ return;
2363
+ }
2364
+ const task = this.durableTimelineStore.bulkInsert(agentId, rows).catch((err) => {
2365
+ this.logger.error({ err, agentId, rowCount: rows.length }, "Failed to seed durable timeline store");
2366
+ });
2367
+ this.trackBackgroundTask(task);
2368
+ }
2369
+ trackBackgroundTask(task) {
2370
+ this.backgroundTasks.add(task);
2371
+ void task.finally(() => {
2372
+ this.backgroundTasks.delete(task);
2373
+ });
2374
+ }
2375
+ /**
2376
+ * Flush any background persistence work (best-effort).
2377
+ * Used by daemon shutdown paths to avoid unhandled rejections after cleanup.
2378
+ */
2379
+ async flush() {
2380
+ this.agentStreamCoalescer.flushAll();
2381
+ // Drain tasks, including tasks spawned while awaiting.
2382
+ while (this.backgroundTasks.size > 0) {
2383
+ const pending = Array.from(this.backgroundTasks);
2384
+ await Promise.allSettled(pending);
2385
+ }
2386
+ }
2387
+ broadcastAgentAttention(agent, reason) {
2388
+ this.onAgentAttention?.({
2389
+ agentId: agent.id,
2390
+ provider: agent.provider,
2391
+ reason,
2392
+ });
2393
+ }
2394
+ dispatchStream(agentId, event, metadata) {
2395
+ const agent = this.agents.get(agentId);
2396
+ this.logger.trace({
2397
+ agentId,
2398
+ provider: event.provider,
2399
+ sessionId: agent?.persistence?.sessionId ?? undefined,
2400
+ turnId: getAgentStreamEventTurnId(event),
2401
+ metadata,
2402
+ event,
2403
+ }, "agent.manager.dispatch_stream");
2404
+ this.dispatch({ type: "agent_stream", agentId, event, ...metadata });
2405
+ }
2406
+ dispatch(event) {
2407
+ for (const subscriber of this.subscribers) {
2408
+ if (subscriber.agentId &&
2409
+ event.type === "agent_stream" &&
2410
+ subscriber.agentId !== event.agentId) {
2411
+ continue;
2412
+ }
2413
+ if (subscriber.agentId &&
2414
+ event.type === "agent_state" &&
2415
+ subscriber.agentId !== event.agent.id) {
2416
+ continue;
2417
+ }
2418
+ // Skip internal agents for global subscribers (those without a specific agentId)
2419
+ if (!subscriber.agentId) {
2420
+ if (event.type === "agent_state" && event.agent.internal) {
2421
+ continue;
2422
+ }
2423
+ if (event.type === "agent_stream") {
2424
+ const agent = this.agents.get(event.agentId);
2425
+ if (agent?.internal) {
2426
+ continue;
2427
+ }
2428
+ }
2429
+ }
2430
+ subscriber.callback(event);
2431
+ }
2432
+ }
2433
+ async normalizeConfig(config) {
2434
+ const normalized = { ...config };
2435
+ // Always resolve cwd to absolute path for consistent history file lookup
2436
+ if (normalized.cwd) {
2437
+ normalized.cwd = resolve(normalized.cwd);
2438
+ try {
2439
+ const cwdStats = await stat(normalized.cwd);
2440
+ if (!cwdStats.isDirectory()) {
2441
+ throw new Error(`Working directory is not a directory: ${normalized.cwd}`);
2442
+ }
2443
+ }
2444
+ catch (error) {
2445
+ if (error instanceof Error &&
2446
+ "code" in error &&
2447
+ error.code === "ENOENT") {
2448
+ throw new Error(`Working directory does not exist: ${normalized.cwd}`, { cause: error });
2449
+ }
2450
+ if (error instanceof Error) {
2451
+ throw error;
2452
+ }
2453
+ throw new Error(`Failed to access working directory: ${normalized.cwd}`, { cause: error });
2454
+ }
2455
+ }
2456
+ if (typeof normalized.model === "string") {
2457
+ const trimmed = normalized.model.trim();
2458
+ normalized.model = trimmed.length > 0 && trimmed !== "default" ? trimmed : undefined;
2459
+ }
2460
+ if (!normalized.model) {
2461
+ const client = this.clients.get(normalized.provider);
2462
+ if (client) {
2463
+ try {
2464
+ const models = await client.listModels({ cwd: normalized.cwd, force: false });
2465
+ const defaultModel = models.find((model) => model.isDefault) ?? models[0];
2466
+ if (defaultModel) {
2467
+ normalized.model = defaultModel.id;
2468
+ }
2469
+ }
2470
+ catch {
2471
+ // Provider may not support model listing — leave model undefined
2472
+ }
2473
+ }
2474
+ }
2475
+ if (!normalized.modeId) {
2476
+ try {
2477
+ normalized.modeId =
2478
+ getAgentProviderDefinition(normalized.provider).defaultModeId ?? undefined;
2479
+ }
2480
+ catch {
2481
+ // Unknown provider
2482
+ }
2483
+ }
2484
+ return normalized;
2485
+ }
2486
+ applyDaemonAppendSystemPrompt(config) {
2487
+ const daemonAppendSystemPrompt = this.appendSystemPrompt.trim();
2488
+ const next = { ...config };
2489
+ delete next.daemonAppendSystemPrompt;
2490
+ return daemonAppendSystemPrompt
2491
+ ? {
2492
+ ...next,
2493
+ daemonAppendSystemPrompt,
2494
+ }
2495
+ : next;
2496
+ }
2497
+ buildLaunchContext(agentId) {
2498
+ return {
2499
+ agentId,
2500
+ env: {
2501
+ PASEO_AGENT_ID: agentId,
2502
+ },
2503
+ };
2504
+ }
2505
+ async requireAvailableClient(options) {
2506
+ const client = this.clients.get(options.provider);
2507
+ if (!client) {
2508
+ const configuredProviders = this.getConfiguredProviderIds();
2509
+ throw new Error(`Unknown provider '${options.provider}'. Configured providers: ${formatProviderList(configuredProviders)}.`);
2510
+ }
2511
+ let unavailableReason = null;
2512
+ try {
2513
+ const available = await client.isAvailable();
2514
+ if (available) {
2515
+ return client;
2516
+ }
2517
+ }
2518
+ catch (error) {
2519
+ unavailableReason = error instanceof Error ? error.message : String(error);
2520
+ }
2521
+ const availableProviders = (await this.listProviderAvailability())
2522
+ .filter((entry) => entry.available)
2523
+ .map((entry) => entry.provider);
2524
+ const providerList = formatProviderList(availableProviders);
2525
+ const reason = unavailableReason ? ` Reason: ${unavailableReason}.` : "";
2526
+ throw new Error(`Provider '${options.provider}' is not available.${reason} Available providers: ${providerList}. Use one of those providers, or install/configure '${options.provider}'.`);
2527
+ }
2528
+ requireEnabledProvider(provider) {
2529
+ if (this.providerEnabled.get(provider) === false) {
2530
+ throw new Error(`Provider '${provider}' is disabled`);
2531
+ }
2532
+ }
2533
+ getConfiguredProviderIds() {
2534
+ return Array.from(new Set([...this.providerEnabled.keys(), ...this.clients.keys()]));
2535
+ }
2536
+ requireClient(provider) {
2537
+ const client = this.clients.get(provider);
2538
+ if (!client) {
2539
+ throw new Error(`No client registered for provider '${provider}'`);
2540
+ }
2541
+ return client;
2542
+ }
2543
+ async archiveNativeSessionBestEffort(provider, persistence) {
2544
+ if (!persistence)
2545
+ return;
2546
+ const client = this.clients.get(provider);
2547
+ if (!client?.archiveNativeSession)
2548
+ return;
2549
+ try {
2550
+ await client.archiveNativeSession(persistence);
2551
+ }
2552
+ catch (error) {
2553
+ this.logger.warn({ error, provider, sessionId: persistence.sessionId }, "Failed to archive native session (best-effort)");
2554
+ }
2555
+ }
2556
+ requireAgent(id) {
2557
+ const normalizedId = validateAgentId(id, "requireAgent");
2558
+ const agent = this.agents.get(normalizedId);
2559
+ if (!agent) {
2560
+ throw new Error(`Unknown agent '${normalizedId}'`);
2561
+ }
2562
+ return agent;
2563
+ }
2564
+ requireSessionAgent(id) {
2565
+ const agent = this.requireAgent(id);
2566
+ if (agent.session === null) {
2567
+ throw new Error(`Agent '${agent.id}' has no managed session`);
2568
+ }
2569
+ return agent;
2570
+ }
2571
+ }
2572
+ //# sourceMappingURL=agent-manager.js.map