@getpaseo/server 0.1.62 → 0.1.65

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 (590) hide show
  1. package/README.md +4 -0
  2. package/dist/server/client/daemon-client-runtime-metrics.d.ts +6 -6
  3. package/dist/server/client/daemon-client-runtime-metrics.d.ts.map +1 -1
  4. package/dist/server/client/daemon-client-transport-types.d.ts +15 -13
  5. package/dist/server/client/daemon-client-transport-types.d.ts.map +1 -1
  6. package/dist/server/client/daemon-client-websocket-transport.d.ts +3 -2
  7. package/dist/server/client/daemon-client-websocket-transport.d.ts.map +1 -1
  8. package/dist/server/client/daemon-client-websocket-transport.js +9 -8
  9. package/dist/server/client/daemon-client-websocket-transport.js.map +1 -1
  10. package/dist/server/client/daemon-client.d.ts +88 -56
  11. package/dist/server/client/daemon-client.d.ts.map +1 -1
  12. package/dist/server/client/daemon-client.js +264 -111
  13. package/dist/server/client/daemon-client.js.map +1 -1
  14. package/dist/server/client/terminal-stream-router.d.ts +24 -0
  15. package/dist/server/client/terminal-stream-router.d.ts.map +1 -0
  16. package/dist/server/client/terminal-stream-router.js +100 -0
  17. package/dist/server/client/terminal-stream-router.js.map +1 -0
  18. package/dist/server/server/agent/activity-curator.d.ts +6 -3
  19. package/dist/server/server/agent/activity-curator.d.ts.map +1 -1
  20. package/dist/server/server/agent/activity-curator.js +45 -138
  21. package/dist/server/server/agent/activity-curator.js.map +1 -1
  22. package/dist/server/server/agent/agent-loading.d.ts.map +1 -1
  23. package/dist/server/server/agent/agent-loading.js +5 -3
  24. package/dist/server/server/agent/agent-loading.js.map +1 -1
  25. package/dist/server/server/agent/agent-manager.d.ts +46 -31
  26. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  27. package/dist/server/server/agent/agent-manager.js +457 -419
  28. package/dist/server/server/agent/agent-manager.js.map +1 -1
  29. package/dist/server/server/agent/agent-metadata-generator.d.ts +6 -11
  30. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
  31. package/dist/server/server/agent/agent-metadata-generator.js +3 -85
  32. package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
  33. package/dist/server/server/agent/agent-projections.d.ts +4 -6
  34. package/dist/server/server/agent/agent-projections.d.ts.map +1 -1
  35. package/dist/server/server/agent/agent-projections.js +59 -65
  36. package/dist/server/server/agent/agent-projections.js.map +1 -1
  37. package/dist/server/server/agent/agent-response-loop.d.ts +4 -4
  38. package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
  39. package/dist/server/server/agent/agent-response-loop.js +58 -45
  40. package/dist/server/server/agent/agent-response-loop.js.map +1 -1
  41. package/dist/server/server/agent/agent-sdk-types.d.ts +58 -41
  42. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  43. package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
  44. package/dist/server/server/agent/agent-storage.d.ts +2 -2
  45. package/dist/server/server/agent/agent-storage.d.ts.map +1 -1
  46. package/dist/server/server/agent/agent-storage.js +29 -36
  47. package/dist/server/server/agent/agent-storage.js.map +1 -1
  48. package/dist/server/server/agent/agent-stream-coalescer.d.ts +7 -7
  49. package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -1
  50. package/dist/server/server/agent/agent-stream-coalescer.js +1 -1
  51. package/dist/server/server/agent/agent-stream-coalescer.js.map +1 -1
  52. package/dist/server/server/agent/agent-timeline-store-types.d.ts +10 -10
  53. package/dist/server/server/agent/agent-timeline-store-types.d.ts.map +1 -1
  54. package/dist/server/server/agent/agent-timeline-store.d.ts +2 -2
  55. package/dist/server/server/agent/agent-timeline-store.d.ts.map +1 -1
  56. package/dist/server/server/agent/agent-timeline-store.js +103 -85
  57. package/dist/server/server/agent/agent-timeline-store.js.map +1 -1
  58. package/dist/server/server/agent/foreground-run-state.d.ts +50 -0
  59. package/dist/server/server/agent/foreground-run-state.d.ts.map +1 -0
  60. package/dist/server/server/agent/foreground-run-state.js +162 -0
  61. package/dist/server/server/agent/foreground-run-state.js.map +1 -0
  62. package/dist/server/server/agent/mcp-server.d.ts +5 -3
  63. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  64. package/dist/server/server/agent/mcp-server.js +282 -234
  65. package/dist/server/server/agent/mcp-server.js.map +1 -1
  66. package/dist/server/server/agent/mcp-shared.d.ts +9 -2
  67. package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
  68. package/dist/server/server/agent/mcp-shared.js +9 -1
  69. package/dist/server/server/agent/mcp-shared.js.map +1 -1
  70. package/dist/server/server/agent/model-resolver.d.ts +2 -2
  71. package/dist/server/server/agent/model-resolver.d.ts.map +1 -1
  72. package/dist/server/server/agent/model-resolver.js +9 -5
  73. package/dist/server/server/agent/model-resolver.js.map +1 -1
  74. package/dist/server/server/agent/prompt-attachments.d.ts +4 -3
  75. package/dist/server/server/agent/prompt-attachments.d.ts.map +1 -1
  76. package/dist/server/server/agent/prompt-attachments.js +43 -4
  77. package/dist/server/server/agent/prompt-attachments.js.map +1 -1
  78. package/dist/server/server/agent/provider-launch-config.d.ts +28 -17
  79. package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
  80. package/dist/server/server/agent/provider-launch-config.js +20 -9
  81. package/dist/server/server/agent/provider-launch-config.js.map +1 -1
  82. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
  83. package/dist/server/server/agent/provider-manifest.js +7 -0
  84. package/dist/server/server/agent/provider-manifest.js.map +1 -1
  85. package/dist/server/server/agent/provider-registry.d.ts +4 -2
  86. package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
  87. package/dist/server/server/agent/provider-registry.js +24 -21
  88. package/dist/server/server/agent/provider-registry.js.map +1 -1
  89. package/dist/server/server/agent/provider-snapshot-manager.d.ts +6 -5
  90. package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -1
  91. package/dist/server/server/agent/provider-snapshot-manager.js +40 -31
  92. package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
  93. package/dist/server/server/agent/providers/acp-agent.d.ts +49 -13
  94. package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
  95. package/dist/server/server/agent/providers/acp-agent.js +404 -261
  96. package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
  97. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +2 -0
  98. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts.map +1 -1
  99. package/dist/server/server/agent/providers/claude/sidechain-tracker.js +47 -45
  100. package/dist/server/server/agent/providers/claude/sidechain-tracker.js.map +1 -1
  101. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +2 -2
  102. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -1
  103. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +10 -5
  104. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -1
  105. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -1
  106. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +11 -2
  107. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
  108. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +2 -2
  109. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -1
  110. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +83 -206
  111. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
  112. package/dist/server/server/agent/providers/claude-agent.d.ts +20 -8
  113. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  114. package/dist/server/server/agent/providers/claude-agent.js +654 -554
  115. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  116. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +2 -2
  117. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts.map +1 -1
  118. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +2 -2
  119. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
  120. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +174 -185
  121. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
  122. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +62 -13
  123. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  124. package/dist/server/server/agent/providers/codex-app-server-agent.js +873 -646
  125. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  126. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts +2 -2
  127. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -1
  128. package/dist/server/server/agent/providers/codex-rollout-timeline.js +58 -47
  129. package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -1
  130. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +2 -2
  131. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +1 -1
  132. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +3 -3
  133. package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -1
  134. package/dist/server/server/agent/providers/diagnostic-utils.js +82 -9
  135. package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -1
  136. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +2 -2
  137. package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -1
  138. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +6 -2
  139. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -1
  140. package/dist/server/server/agent/providers/mock-load-test-agent.js +294 -113
  141. package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -1
  142. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +1 -1
  143. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts.map +1 -1
  144. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +94 -2
  145. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js.map +1 -1
  146. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +2 -2
  147. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +1 -1
  148. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +24 -115
  149. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +1 -1
  150. package/dist/server/server/agent/providers/opencode-agent.d.ts +104 -3
  151. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  152. package/dist/server/server/agent/providers/opencode-agent.js +786 -503
  153. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  154. package/dist/server/server/agent/providers/pi-direct-agent.d.ts +1 -0
  155. package/dist/server/server/agent/providers/pi-direct-agent.d.ts.map +1 -1
  156. package/dist/server/server/agent/providers/pi-direct-agent.js +109 -140
  157. package/dist/server/server/agent/providers/pi-direct-agent.js.map +1 -1
  158. package/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
  159. package/dist/server/server/agent/providers/provider-runner.d.ts.map +1 -0
  160. package/dist/server/server/agent/providers/provider-runner.js +80 -0
  161. package/dist/server/server/agent/providers/provider-runner.js.map +1 -0
  162. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -1
  163. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +3 -1
  164. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -1
  165. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +9 -6
  166. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  167. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +102 -73
  168. package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -1
  169. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +4 -2
  170. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -1
  171. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +31 -0
  172. package/dist/server/server/agent/providers/tool-call-mapper-utils.js.map +1 -1
  173. package/dist/server/server/agent/stt-manager.d.ts.map +1 -1
  174. package/dist/server/server/agent/stt-manager.js +63 -53
  175. package/dist/server/server/agent/stt-manager.js.map +1 -1
  176. package/dist/server/server/agent/timeline-projection.d.ts +27 -11
  177. package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
  178. package/dist/server/server/agent/timeline-projection.js +70 -15
  179. package/dist/server/server/agent/timeline-projection.js.map +1 -1
  180. package/dist/server/server/agent/tts-manager.d.ts.map +1 -1
  181. package/dist/server/server/agent/tts-manager.js +1 -0
  182. package/dist/server/server/agent/tts-manager.js.map +1 -1
  183. package/dist/server/server/agent-attention-policy.d.ts +2 -2
  184. package/dist/server/server/agent-attention-policy.d.ts.map +1 -1
  185. package/dist/server/server/auth.d.ts +25 -0
  186. package/dist/server/server/auth.d.ts.map +1 -0
  187. package/dist/server/server/auth.js +93 -0
  188. package/dist/server/server/auth.js.map +1 -0
  189. package/dist/server/server/bootstrap.d.ts +7 -5
  190. package/dist/server/server/bootstrap.d.ts.map +1 -1
  191. package/dist/server/server/bootstrap.js +550 -485
  192. package/dist/server/server/bootstrap.js.map +1 -1
  193. package/dist/server/server/chat/chat-service.d.ts +1 -1
  194. package/dist/server/server/chat/chat-service.d.ts.map +1 -1
  195. package/dist/server/server/chat/chat-service.js +3 -3
  196. package/dist/server/server/chat/chat-service.js.map +1 -1
  197. package/dist/server/server/checkout-diff-manager.d.ts +2 -2
  198. package/dist/server/server/checkout-diff-manager.d.ts.map +1 -1
  199. package/dist/server/server/checkout-git-utils.d.ts +5 -3
  200. package/dist/server/server/checkout-git-utils.d.ts.map +1 -1
  201. package/dist/server/server/checkout-git-utils.js +1 -2
  202. package/dist/server/server/checkout-git-utils.js.map +1 -1
  203. package/dist/server/server/config.d.ts.map +1 -1
  204. package/dist/server/server/config.js +79 -39
  205. package/dist/server/server/config.js.map +1 -1
  206. package/dist/server/server/connection-offer.d.ts +2 -2
  207. package/dist/server/server/connection-offer.d.ts.map +1 -1
  208. package/dist/server/server/daemon-config-store.d.ts +5 -3
  209. package/dist/server/server/daemon-config-store.d.ts.map +1 -1
  210. package/dist/server/server/daemon-config-store.js +26 -0
  211. package/dist/server/server/daemon-config-store.js.map +1 -1
  212. package/dist/server/server/daemon-keypair.d.ts +2 -2
  213. package/dist/server/server/daemon-keypair.d.ts.map +1 -1
  214. package/dist/server/server/editor-targets.d.ts +4 -4
  215. package/dist/server/server/editor-targets.d.ts.map +1 -1
  216. package/dist/server/server/editor-targets.js +11 -15
  217. package/dist/server/server/editor-targets.js.map +1 -1
  218. package/dist/server/server/exports.d.ts +10 -4
  219. package/dist/server/server/exports.d.ts.map +1 -1
  220. package/dist/server/server/exports.js +7 -4
  221. package/dist/server/server/exports.js.map +1 -1
  222. package/dist/server/server/file-download/token-store.d.ts +4 -4
  223. package/dist/server/server/file-download/token-store.d.ts.map +1 -1
  224. package/dist/server/server/file-explorer/service.d.ts +10 -0
  225. package/dist/server/server/file-explorer/service.d.ts.map +1 -1
  226. package/dist/server/server/file-explorer/service.js +38 -4
  227. package/dist/server/server/file-explorer/service.js.map +1 -1
  228. package/dist/server/server/index.js +25 -18
  229. package/dist/server/server/index.js.map +1 -1
  230. package/dist/server/server/logger.d.ts +4 -4
  231. package/dist/server/server/logger.d.ts.map +1 -1
  232. package/dist/server/server/logger.js +41 -21
  233. package/dist/server/server/logger.js.map +1 -1
  234. package/dist/server/server/loop/rpc-schemas.d.ts +52 -52
  235. package/dist/server/server/loop-service.d.ts +13 -12
  236. package/dist/server/server/loop-service.d.ts.map +1 -1
  237. package/dist/server/server/loop-service.js +22 -18
  238. package/dist/server/server/loop-service.js.map +1 -1
  239. package/dist/server/server/package-version.d.ts +2 -2
  240. package/dist/server/server/package-version.d.ts.map +1 -1
  241. package/dist/server/server/package-version.js +19 -17
  242. package/dist/server/server/package-version.js.map +1 -1
  243. package/dist/server/server/pagination/cursor.d.ts +16 -0
  244. package/dist/server/server/pagination/cursor.d.ts.map +1 -0
  245. package/dist/server/server/pagination/cursor.js +62 -0
  246. package/dist/server/server/pagination/cursor.js.map +1 -0
  247. package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
  248. package/dist/server/server/pagination/sortable-pager.d.ts.map +1 -0
  249. package/dist/server/server/pagination/sortable-pager.js +68 -0
  250. package/dist/server/server/pagination/sortable-pager.js.map +1 -0
  251. package/dist/server/server/pairing-offer.d.ts +2 -2
  252. package/dist/server/server/pairing-offer.d.ts.map +1 -1
  253. package/dist/server/server/paseo-env.d.ts +9 -0
  254. package/dist/server/server/paseo-env.d.ts.map +1 -0
  255. package/dist/server/server/paseo-env.js +70 -0
  256. package/dist/server/server/paseo-env.js.map +1 -0
  257. package/dist/server/server/paseo-worktree-archive-service.d.ts +7 -5
  258. package/dist/server/server/paseo-worktree-archive-service.d.ts.map +1 -1
  259. package/dist/server/server/paseo-worktree-archive-service.js +70 -62
  260. package/dist/server/server/paseo-worktree-archive-service.js.map +1 -1
  261. package/dist/server/server/paseo-worktree-service.d.ts +13 -0
  262. package/dist/server/server/paseo-worktree-service.d.ts.map +1 -1
  263. package/dist/server/server/paseo-worktree-service.js +72 -3
  264. package/dist/server/server/paseo-worktree-service.js.map +1 -1
  265. package/dist/server/server/persisted-config.d.ts +87 -62
  266. package/dist/server/server/persisted-config.d.ts.map +1 -1
  267. package/dist/server/server/persisted-config.js +13 -4
  268. package/dist/server/server/persisted-config.js.map +1 -1
  269. package/dist/server/server/persistence-hooks.d.ts +8 -9
  270. package/dist/server/server/persistence-hooks.d.ts.map +1 -1
  271. package/dist/server/server/persistence-hooks.js +4 -12
  272. package/dist/server/server/persistence-hooks.js.map +1 -1
  273. package/dist/server/server/pid-lock.js.map +1 -1
  274. package/dist/server/server/push/push-service.d.ts.map +1 -1
  275. package/dist/server/server/push/push-service.js +1 -3
  276. package/dist/server/server/push/push-service.js.map +1 -1
  277. package/dist/server/server/relay-transport.d.ts +8 -8
  278. package/dist/server/server/relay-transport.d.ts.map +1 -1
  279. package/dist/server/server/relay-transport.js +43 -20
  280. package/dist/server/server/relay-transport.js.map +1 -1
  281. package/dist/server/server/resolve-worktree-creation-intent.d.ts +0 -10
  282. package/dist/server/server/resolve-worktree-creation-intent.d.ts.map +1 -1
  283. package/dist/server/server/resolve-worktree-creation-intent.js +1 -45
  284. package/dist/server/server/resolve-worktree-creation-intent.js.map +1 -1
  285. package/dist/server/server/schedule/service.d.ts.map +1 -1
  286. package/dist/server/server/schedule/service.js +2 -2
  287. package/dist/server/server/schedule/service.js.map +1 -1
  288. package/dist/server/server/script-health-monitor.d.ts.map +1 -1
  289. package/dist/server/server/script-health-monitor.js +7 -6
  290. package/dist/server/server/script-health-monitor.js.map +1 -1
  291. package/dist/server/server/script-proxy.js +1 -1
  292. package/dist/server/server/script-proxy.js.map +1 -1
  293. package/dist/server/server/script-status-projection.d.ts +10 -5
  294. package/dist/server/server/script-status-projection.d.ts.map +1 -1
  295. package/dist/server/server/script-status-projection.js +66 -47
  296. package/dist/server/server/script-status-projection.js.map +1 -1
  297. package/dist/server/server/server-id.d.ts +4 -4
  298. package/dist/server/server/server-id.d.ts.map +1 -1
  299. package/dist/server/server/session.d.ts +64 -65
  300. package/dist/server/server/session.d.ts.map +1 -1
  301. package/dist/server/server/session.js +1356 -1734
  302. package/dist/server/server/session.js.map +1 -1
  303. package/dist/server/server/speech/audio.js +1 -1
  304. package/dist/server/server/speech/audio.js.map +1 -1
  305. package/dist/server/server/speech/providers/local/config.d.ts +6 -6
  306. package/dist/server/server/speech/providers/local/config.d.ts.map +1 -1
  307. package/dist/server/server/speech/providers/local/config.js +41 -16
  308. package/dist/server/server/speech/providers/local/config.js.map +1 -1
  309. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts +2 -2
  310. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -1
  311. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +42 -19
  312. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -1
  313. package/dist/server/server/speech/providers/local/runtime.d.ts +4 -4
  314. package/dist/server/server/speech/providers/local/runtime.d.ts.map +1 -1
  315. package/dist/server/server/speech/providers/local/runtime.js +108 -77
  316. package/dist/server/server/speech/providers/local/runtime.js.map +1 -1
  317. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +2 -2
  318. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -1
  319. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +1 -4
  320. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -1
  321. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +2 -2
  322. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -1
  323. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +19 -19
  324. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -1
  325. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +28 -7
  326. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts.map +1 -1
  327. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -1
  328. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts +23 -4
  329. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts.map +1 -1
  330. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +35 -28
  331. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -1
  332. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts +5 -5
  333. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts.map +1 -1
  334. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +7 -7
  335. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +1 -1
  336. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +5 -0
  337. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -1
  338. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts.map +1 -1
  339. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +3 -1
  340. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -1
  341. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +2 -2
  342. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts.map +1 -1
  343. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +3 -1
  344. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -1
  345. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts.map +1 -1
  346. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +10 -4
  347. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -1
  348. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +2 -2
  349. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts.map +1 -1
  350. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts +2 -2
  351. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts.map +1 -1
  352. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +4 -1
  353. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -1
  354. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +2 -2
  355. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts.map +1 -1
  356. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +18 -11
  357. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -1
  358. package/dist/server/server/speech/providers/openai/config.d.ts +2 -2
  359. package/dist/server/server/speech/providers/openai/config.d.ts.map +1 -1
  360. package/dist/server/server/speech/providers/openai/config.js +58 -31
  361. package/dist/server/server/speech/providers/openai/config.js.map +1 -1
  362. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts.map +1 -1
  363. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +2 -2
  364. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js.map +1 -1
  365. package/dist/server/server/speech/providers/openai/runtime.d.ts +4 -4
  366. package/dist/server/server/speech/providers/openai/runtime.d.ts.map +1 -1
  367. package/dist/server/server/speech/providers/openai/runtime.js +37 -32
  368. package/dist/server/server/speech/providers/openai/runtime.js.map +1 -1
  369. package/dist/server/server/speech/providers/openai/stt.d.ts.map +1 -1
  370. package/dist/server/server/speech/providers/openai/stt.js +4 -3
  371. package/dist/server/server/speech/providers/openai/stt.js.map +1 -1
  372. package/dist/server/server/speech/providers/openai/tts.d.ts.map +1 -1
  373. package/dist/server/server/speech/providers/openai/tts.js +3 -2
  374. package/dist/server/server/speech/providers/openai/tts.js.map +1 -1
  375. package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -1
  376. package/dist/server/server/speech/speech-config-resolver.js +46 -17
  377. package/dist/server/server/speech/speech-config-resolver.js.map +1 -1
  378. package/dist/server/server/speech/speech-provider.d.ts +2 -2
  379. package/dist/server/server/speech/speech-provider.d.ts.map +1 -1
  380. package/dist/server/server/speech/speech-runtime.d.ts +6 -6
  381. package/dist/server/server/speech/speech-runtime.d.ts.map +1 -1
  382. package/dist/server/server/speech/speech-runtime.js +17 -17
  383. package/dist/server/server/speech/speech-runtime.js.map +1 -1
  384. package/dist/server/server/speech/speech-types.d.ts +2 -2
  385. package/dist/server/server/speech/speech-types.d.ts.map +1 -1
  386. package/dist/server/server/speech/turn-detection-provider.d.ts +2 -2
  387. package/dist/server/server/speech/turn-detection-provider.d.ts.map +1 -1
  388. package/dist/server/server/utils/diff-highlighter.d.ts +0 -3
  389. package/dist/server/server/utils/diff-highlighter.d.ts.map +1 -1
  390. package/dist/server/server/utils/diff-highlighter.js +67 -66
  391. package/dist/server/server/utils/diff-highlighter.js.map +1 -1
  392. package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -1
  393. package/dist/server/server/voice/voice-turn-controller.js +1 -0
  394. package/dist/server/server/voice/voice-turn-controller.js.map +1 -1
  395. package/dist/server/server/voice-types.d.ts +2 -2
  396. package/dist/server/server/voice-types.d.ts.map +1 -1
  397. package/dist/server/server/websocket-server.d.ts +34 -22
  398. package/dist/server/server/websocket-server.d.ts.map +1 -1
  399. package/dist/server/server/websocket-server.js +360 -205
  400. package/dist/server/server/websocket-server.js.map +1 -1
  401. package/dist/server/server/workspace-directory.d.ts +69 -0
  402. package/dist/server/server/workspace-directory.d.ts.map +1 -0
  403. package/dist/server/server/workspace-directory.js +229 -0
  404. package/dist/server/server/workspace-directory.js.map +1 -0
  405. package/dist/server/server/workspace-git-metadata.d.ts +2 -2
  406. package/dist/server/server/workspace-git-metadata.d.ts.map +1 -1
  407. package/dist/server/server/workspace-git-metadata.js +2 -32
  408. package/dist/server/server/workspace-git-metadata.js.map +1 -1
  409. package/dist/server/server/workspace-git-service.d.ts +8 -4
  410. package/dist/server/server/workspace-git-service.d.ts.map +1 -1
  411. package/dist/server/server/workspace-git-service.js +163 -115
  412. package/dist/server/server/workspace-git-service.js.map +1 -1
  413. package/dist/server/server/workspace-reconciliation-service.d.ts +5 -4
  414. package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -1
  415. package/dist/server/server/workspace-reconciliation-service.js +82 -82
  416. package/dist/server/server/workspace-reconciliation-service.js.map +1 -1
  417. package/dist/server/server/workspace-registry-bootstrap.d.ts.map +1 -1
  418. package/dist/server/server/workspace-registry-bootstrap.js +40 -33
  419. package/dist/server/server/workspace-registry-bootstrap.js.map +1 -1
  420. package/dist/server/server/workspace-registry-model.d.ts +19 -6
  421. package/dist/server/server/workspace-registry-model.d.ts.map +1 -1
  422. package/dist/server/server/workspace-registry-model.js +35 -21
  423. package/dist/server/server/workspace-registry-model.js.map +1 -1
  424. package/dist/server/server/workspace-registry.d.ts +2 -2
  425. package/dist/server/server/workspace-script-runtime-store.d.ts +2 -2
  426. package/dist/server/server/workspace-script-runtime-store.d.ts.map +1 -1
  427. package/dist/server/server/workspace-service-env.js +3 -3
  428. package/dist/server/server/workspace-service-env.js.map +1 -1
  429. package/dist/server/server/worktree-bootstrap.d.ts +4 -4
  430. package/dist/server/server/worktree-bootstrap.d.ts.map +1 -1
  431. package/dist/server/server/worktree-bootstrap.js +101 -69
  432. package/dist/server/server/worktree-bootstrap.js.map +1 -1
  433. package/dist/server/server/worktree-core.d.ts +2 -0
  434. package/dist/server/server/worktree-core.d.ts.map +1 -1
  435. package/dist/server/server/worktree-core.js.map +1 -1
  436. package/dist/server/server/worktree-errors.d.ts +1 -1
  437. package/dist/server/server/worktree-errors.d.ts.map +1 -1
  438. package/dist/server/server/worktree-errors.js +1 -4
  439. package/dist/server/server/worktree-errors.js.map +1 -1
  440. package/dist/server/server/worktree-session.d.ts +54 -27
  441. package/dist/server/server/worktree-session.d.ts.map +1 -1
  442. package/dist/server/server/worktree-session.js +95 -44
  443. package/dist/server/server/worktree-session.js.map +1 -1
  444. package/dist/server/services/github-service.d.ts +1 -7
  445. package/dist/server/services/github-service.d.ts.map +1 -1
  446. package/dist/server/services/github-service.js +123 -143
  447. package/dist/server/services/github-service.js.map +1 -1
  448. package/dist/server/shared/agent-attention-notification.d.ts +9 -8
  449. package/dist/server/shared/agent-attention-notification.d.ts.map +1 -1
  450. package/dist/server/shared/agent-attention-notification.js +27 -17
  451. package/dist/server/shared/agent-attention-notification.js.map +1 -1
  452. package/dist/server/shared/binary-frames/file-transfer.d.ts +56 -0
  453. package/dist/server/shared/binary-frames/file-transfer.d.ts.map +1 -0
  454. package/dist/server/shared/binary-frames/file-transfer.js +108 -0
  455. package/dist/server/shared/binary-frames/file-transfer.js.map +1 -0
  456. package/dist/server/shared/binary-frames/index.d.ts +3 -0
  457. package/dist/server/shared/binary-frames/index.d.ts.map +1 -0
  458. package/dist/server/shared/binary-frames/index.js +3 -0
  459. package/dist/server/shared/binary-frames/index.js.map +1 -0
  460. package/dist/server/shared/{terminal-stream-protocol.d.ts → binary-frames/terminal.d.ts} +4 -4
  461. package/dist/server/shared/binary-frames/terminal.d.ts.map +1 -0
  462. package/dist/server/shared/{terminal-stream-protocol.js → binary-frames/terminal.js} +2 -2
  463. package/dist/server/shared/binary-frames/terminal.js.map +1 -0
  464. package/dist/server/shared/client-capabilities.d.ts +5 -0
  465. package/dist/server/shared/client-capabilities.d.ts.map +1 -0
  466. package/dist/server/shared/client-capabilities.js +4 -0
  467. package/dist/server/shared/client-capabilities.js.map +1 -0
  468. package/dist/server/shared/connection-offer.d.ts +8 -0
  469. package/dist/server/shared/connection-offer.d.ts.map +1 -1
  470. package/dist/server/shared/connection-offer.js +35 -0
  471. package/dist/server/shared/connection-offer.js.map +1 -1
  472. package/dist/server/shared/daemon-endpoints.d.ts +18 -3
  473. package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
  474. package/dist/server/shared/daemon-endpoints.js +82 -8
  475. package/dist/server/shared/daemon-endpoints.js.map +1 -1
  476. package/dist/server/shared/host-connection-schema.d.ts +23 -0
  477. package/dist/server/shared/host-connection-schema.d.ts.map +1 -0
  478. package/dist/server/shared/host-connection-schema.js +9 -0
  479. package/dist/server/shared/host-connection-schema.js.map +1 -0
  480. package/dist/server/shared/messages.d.ts +25073 -3453
  481. package/dist/server/shared/messages.d.ts.map +1 -1
  482. package/dist/server/shared/messages.js +152 -36
  483. package/dist/server/shared/messages.js.map +1 -1
  484. package/dist/server/shared/tool-call-display.d.ts +2 -2
  485. package/dist/server/shared/tool-call-display.d.ts.map +1 -1
  486. package/dist/server/terminal/terminal-manager-factory.d.ts +7 -0
  487. package/dist/server/terminal/terminal-manager-factory.d.ts.map +1 -0
  488. package/dist/server/terminal/terminal-manager-factory.js +13 -0
  489. package/dist/server/terminal/terminal-manager-factory.js.map +1 -0
  490. package/dist/server/terminal/terminal-manager.d.ts +7 -1
  491. package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
  492. package/dist/server/terminal/terminal-manager.js +15 -4
  493. package/dist/server/terminal/terminal-manager.js.map +1 -1
  494. package/dist/server/terminal/terminal-output-coalescer.d.ts +6 -6
  495. package/dist/server/terminal/terminal-output-coalescer.d.ts.map +1 -1
  496. package/dist/server/terminal/terminal-session-controller.d.ts +63 -0
  497. package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -0
  498. package/dist/server/terminal/terminal-session-controller.js +615 -0
  499. package/dist/server/terminal/terminal-session-controller.js.map +1 -0
  500. package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
  501. package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
  502. package/dist/server/terminal/terminal-worker-process.d.ts.map +1 -0
  503. package/dist/server/terminal/terminal-worker-process.js +221 -0
  504. package/dist/server/terminal/terminal-worker-process.js.map +1 -0
  505. package/dist/server/terminal/terminal-worker-protocol.d.ts +113 -0
  506. package/dist/server/terminal/terminal-worker-protocol.d.ts.map +1 -0
  507. package/dist/server/terminal/terminal-worker-protocol.js +2 -0
  508. package/dist/server/terminal/terminal-worker-protocol.js.map +1 -0
  509. package/dist/server/terminal/terminal.d.ts +10 -2
  510. package/dist/server/terminal/terminal.d.ts.map +1 -1
  511. package/dist/server/terminal/terminal.js +79 -28
  512. package/dist/server/terminal/terminal.js.map +1 -1
  513. package/dist/server/terminal/worker-terminal-manager.d.ts +19 -0
  514. package/dist/server/terminal/worker-terminal-manager.d.ts.map +1 -0
  515. package/dist/server/terminal/worker-terminal-manager.js +466 -0
  516. package/dist/server/terminal/worker-terminal-manager.js.map +1 -0
  517. package/dist/server/utils/checkout-git.d.ts +13 -12
  518. package/dist/server/utils/checkout-git.d.ts.map +1 -1
  519. package/dist/server/utils/checkout-git.js +351 -281
  520. package/dist/server/utils/checkout-git.js.map +1 -1
  521. package/dist/server/utils/directory-suggestions.d.ts.map +1 -1
  522. package/dist/server/utils/directory-suggestions.js +22 -34
  523. package/dist/server/utils/directory-suggestions.js.map +1 -1
  524. package/dist/server/utils/executable.d.ts +1 -14
  525. package/dist/server/utils/executable.d.ts.map +1 -1
  526. package/dist/server/utils/executable.js +13 -49
  527. package/dist/server/utils/executable.js.map +1 -1
  528. package/dist/server/utils/github-remote.d.ts +13 -0
  529. package/dist/server/utils/github-remote.d.ts.map +1 -0
  530. package/dist/server/utils/github-remote.js +128 -0
  531. package/dist/server/utils/github-remote.js.map +1 -0
  532. package/dist/server/utils/paseo-config-file.d.ts +30 -0
  533. package/dist/server/utils/paseo-config-file.d.ts.map +1 -0
  534. package/dist/server/utils/paseo-config-file.js +90 -0
  535. package/dist/server/utils/paseo-config-file.js.map +1 -0
  536. package/dist/server/utils/paseo-config-schema.d.ts +290 -0
  537. package/dist/server/utils/paseo-config-schema.d.ts.map +1 -0
  538. package/dist/server/utils/paseo-config-schema.js +60 -0
  539. package/dist/server/utils/paseo-config-schema.js.map +1 -0
  540. package/dist/server/utils/process-tree.d.ts +25 -0
  541. package/dist/server/utils/process-tree.d.ts.map +1 -0
  542. package/dist/server/utils/process-tree.js +96 -0
  543. package/dist/server/utils/process-tree.js.map +1 -0
  544. package/dist/server/utils/project-icon.d.ts.map +1 -1
  545. package/dist/server/utils/project-icon.js +84 -109
  546. package/dist/server/utils/project-icon.js.map +1 -1
  547. package/dist/server/utils/promise-timeout.d.ts +2 -2
  548. package/dist/server/utils/promise-timeout.d.ts.map +1 -1
  549. package/dist/server/utils/run-git-command.d.ts +3 -1
  550. package/dist/server/utils/run-git-command.d.ts.map +1 -1
  551. package/dist/server/utils/run-git-command.js +10 -1
  552. package/dist/server/utils/run-git-command.js.map +1 -1
  553. package/dist/server/utils/script-hostname.d.ts +2 -2
  554. package/dist/server/utils/script-hostname.d.ts.map +1 -1
  555. package/dist/server/utils/spawn.d.ts +10 -3
  556. package/dist/server/utils/spawn.d.ts.map +1 -1
  557. package/dist/server/utils/spawn.js +30 -5
  558. package/dist/server/utils/spawn.js.map +1 -1
  559. package/dist/server/utils/windows-command.d.ts +15 -0
  560. package/dist/server/utils/windows-command.d.ts.map +1 -0
  561. package/dist/server/utils/windows-command.js +41 -0
  562. package/dist/server/utils/windows-command.js.map +1 -0
  563. package/dist/server/utils/worktree-metadata.d.ts +44 -0
  564. package/dist/server/utils/worktree-metadata.d.ts.map +1 -1
  565. package/dist/server/utils/worktree-metadata.js +58 -0
  566. package/dist/server/utils/worktree-metadata.js.map +1 -1
  567. package/dist/server/utils/worktree.d.ts +23 -8
  568. package/dist/server/utils/worktree.d.ts.map +1 -1
  569. package/dist/server/utils/worktree.js +81 -63
  570. package/dist/server/utils/worktree.js.map +1 -1
  571. package/dist/src/server/pid-lock.js.map +1 -1
  572. package/package.json +17 -21
  573. package/dist/server/server/agent/llm-openai.d.ts +0 -7
  574. package/dist/server/server/agent/llm-openai.d.ts.map +0 -1
  575. package/dist/server/server/agent/llm-openai.js +0 -8
  576. package/dist/server/server/agent/llm-openai.js.map +0 -1
  577. package/dist/server/server/agent/orchestrator.d.ts +0 -12
  578. package/dist/server/server/agent/orchestrator.d.ts.map +0 -1
  579. package/dist/server/server/agent/orchestrator.js +0 -12
  580. package/dist/server/server/agent/orchestrator.js.map +0 -1
  581. package/dist/server/server/types.d.ts +0 -5
  582. package/dist/server/server/types.d.ts.map +0 -1
  583. package/dist/server/server/types.js +0 -3
  584. package/dist/server/server/types.js.map +0 -1
  585. package/dist/server/server/workspace-registry.test-helpers.d.ts +0 -37
  586. package/dist/server/server/workspace-registry.test-helpers.d.ts.map +0 -1
  587. package/dist/server/server/workspace-registry.test-helpers.js +0 -121
  588. package/dist/server/server/workspace-registry.test-helpers.js.map +0 -1
  589. package/dist/server/shared/terminal-stream-protocol.d.ts.map +0 -1
  590. package/dist/server/shared/terminal-stream-protocol.js.map +0 -1
@@ -10,8 +10,9 @@ import { getClaudeModels, normalizeClaudeRuntimeModelId } from "./claude/claude-
10
10
  import { parsePartialJsonObject } from "./claude/partial-json.js";
11
11
  import { ClaudeSidechainTracker } from "./claude/sidechain-tracker.js";
12
12
  import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, toDiagnosticErrorMessage, } from "./diagnostic-utils.js";
13
+ import { appendOrReplaceGrowingAssistantMessage, runProviderTurn } from "./provider-runner.js";
13
14
  import { renderPromptAttachmentAsText } from "../prompt-attachments.js";
14
- import { applyProviderEnv } from "../provider-launch-config.js";
15
+ import { createProviderEnv, createProviderEnvSpec, } from "../provider-launch-config.js";
15
16
  import { findExecutable, isCommandAvailable } from "../../../utils/executable.js";
16
17
  import { withTimeout } from "../../../utils/promise-timeout.js";
17
18
  import { execCommand, spawnProcess } from "../../../utils/spawn.js";
@@ -59,6 +60,38 @@ const INTERRUPT_TOOL_USE_PLACEHOLDER = "[Request interrupted by user for tool us
59
60
  const INTERRUPT_PLACEHOLDER_PATTERN = /^\[Request interrupted by user(?:[^\]]*)\]$/;
60
61
  const NO_RESPONSE_REQUESTED_PLACEHOLDER = "No response requested.";
61
62
  const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
63
+ function resolvePathEnvKey() {
64
+ if (process.env["Path"] !== undefined)
65
+ return "Path";
66
+ if (process.env["PATH"] !== undefined)
67
+ return "PATH";
68
+ return null;
69
+ }
70
+ function errorToMessageString(error) {
71
+ if (typeof error === "string")
72
+ return error;
73
+ if (error instanceof Error)
74
+ return error.message;
75
+ return "";
76
+ }
77
+ function firstStringField(input, primaryKey, secondaryKey) {
78
+ const primary = input[primaryKey];
79
+ if (typeof primary === "string")
80
+ return primary;
81
+ const secondary = input[secondaryKey];
82
+ if (typeof secondary === "string")
83
+ return secondary;
84
+ return undefined;
85
+ }
86
+ function extractSessionIdRaw(msg) {
87
+ if (typeof msg.session_id === "string")
88
+ return msg.session_id;
89
+ if (typeof msg.sessionId === "string")
90
+ return msg.sessionId;
91
+ if (typeof msg.session?.id === "string")
92
+ return msg.session.id;
93
+ return "";
94
+ }
62
95
  function resolveClaudeSpawnCommand(spawnOptions, runtimeSettings) {
63
96
  const commandConfig = runtimeSettings?.command;
64
97
  if (!commandConfig || commandConfig.mode === "default") {
@@ -92,10 +125,11 @@ function applyRuntimeSettingsToClaudeOptions(options, runtimeSettings, launchEnv
92
125
  const command = isDefaultRuntime ? process.execPath : resolved.command;
93
126
  const child = spawnProcess(command, resolved.args, {
94
127
  cwd: spawnOptions.cwd,
95
- env: {
96
- ...applyProviderEnv(spawnOptions.env, runtimeSettings),
97
- ...(launchEnv ?? {}),
98
- },
128
+ ...createProviderEnvSpec({
129
+ baseEnv: spawnOptions.env,
130
+ runtimeSettings,
131
+ overlays: [launchEnv],
132
+ }),
99
133
  signal: spawnOptions.signal,
100
134
  stdio: ["pipe", "pipe", "pipe"],
101
135
  // Bypass cmd.exe on Windows: the SDK passes --mcp-config with inline JSON
@@ -332,6 +366,26 @@ export function extractUserMessageText(content) {
332
366
  function isMetadata(value) {
333
367
  return typeof value === "object" && value !== null;
334
368
  }
369
+ function createDefaultToolUseCacheEntry(id, block) {
370
+ const nameFromBlock = typeof block.name === "string" && block.name.length > 0 ? block.name : "tool";
371
+ let server;
372
+ if (typeof block.server === "string" && block.server.length > 0) {
373
+ server = block.server;
374
+ }
375
+ else if (typeof block.name === "string" && block.name.length > 0) {
376
+ server = block.name;
377
+ }
378
+ else {
379
+ server = "tool";
380
+ }
381
+ return {
382
+ id,
383
+ name: nameFromBlock,
384
+ server,
385
+ classification: "generic",
386
+ started: false,
387
+ };
388
+ }
335
389
  function readTrimmedString(value) {
336
390
  if (typeof value !== "string") {
337
391
  return undefined;
@@ -728,31 +782,44 @@ function isSyntheticUserEntry(entry) {
728
782
  const candidate = entry;
729
783
  return candidate.isSynthetic === true || candidate.isMeta === true;
730
784
  }
785
+ function firstTrimmedString(sources) {
786
+ for (const source of sources) {
787
+ const value = readTrimmedString(source);
788
+ if (value) {
789
+ return value;
790
+ }
791
+ }
792
+ return null;
793
+ }
731
794
  export function readEventIdentifiers(message) {
732
795
  const root = message;
733
796
  const messageType = readTrimmedString(root.type);
734
797
  const streamEvent = root.event;
735
798
  const streamEventMessage = streamEvent?.message;
736
799
  const messageContainer = root.message;
800
+ const messageIdFromUuid = messageType === "user" ? root.uuid : undefined;
737
801
  return {
738
- taskId: readTrimmedString(root.task_id) ??
739
- readTrimmedString(streamEvent?.task_id) ??
740
- readTrimmedString(streamEventMessage?.task_id) ??
741
- readTrimmedString(messageContainer?.task_id) ??
742
- null,
743
- parentMessageId: readTrimmedString(root.parent_message_id) ??
744
- readTrimmedString(streamEvent?.parent_message_id) ??
745
- readTrimmedString(streamEventMessage?.parent_message_id) ??
746
- readTrimmedString(messageContainer?.parent_message_id) ??
747
- null,
748
- messageId: readTrimmedString(root.message_id) ??
749
- readTrimmedString(streamEvent?.message_id) ??
750
- readTrimmedString(streamEventMessage?.id) ??
751
- readTrimmedString(streamEventMessage?.message_id) ??
752
- readTrimmedString(messageContainer?.id) ??
753
- readTrimmedString(messageContainer?.message_id) ??
754
- (messageType === "user" ? readTrimmedString(root.uuid) : null) ??
755
- null,
802
+ taskId: firstTrimmedString([
803
+ root.task_id,
804
+ streamEvent?.task_id,
805
+ streamEventMessage?.task_id,
806
+ messageContainer?.task_id,
807
+ ]),
808
+ parentMessageId: firstTrimmedString([
809
+ root.parent_message_id,
810
+ streamEvent?.parent_message_id,
811
+ streamEventMessage?.parent_message_id,
812
+ messageContainer?.parent_message_id,
813
+ ]),
814
+ messageId: firstTrimmedString([
815
+ root.message_id,
816
+ streamEvent?.message_id,
817
+ streamEventMessage?.id,
818
+ streamEventMessage?.message_id,
819
+ messageContainer?.id,
820
+ messageContainer?.message_id,
821
+ messageIdFromUuid,
822
+ ]),
756
823
  };
757
824
  }
758
825
  const claudeDebug = process.env.PASEO_CLAUDE_DEBUG === "1";
@@ -781,7 +848,11 @@ export class ClaudeAgentClient {
781
848
  if (!merged.cwd) {
782
849
  throw new Error("Claude resume requires the original working directory in metadata");
783
850
  }
784
- const mergedConfig = { ...merged, provider: "claude", cwd: merged.cwd };
851
+ const mergedConfig = {
852
+ ...merged,
853
+ provider: "claude",
854
+ cwd: merged.cwd,
855
+ };
785
856
  const claudeConfig = this.assertConfig(mergedConfig);
786
857
  return new ClaudeAgentSession(claudeConfig, {
787
858
  defaults: this.defaults,
@@ -804,17 +875,10 @@ export class ClaudeAgentClient {
804
875
  }
805
876
  const limit = options?.limit ?? 20;
806
877
  const candidates = await collectRecentClaudeSessions(projectsRoot, limit * 3);
807
- const descriptors = [];
808
- for (const candidate of candidates) {
809
- const descriptor = await parseClaudeSessionDescriptor(candidate.path, candidate.mtime);
810
- if (descriptor) {
811
- descriptors.push(descriptor);
812
- }
813
- if (descriptors.length >= limit) {
814
- break;
815
- }
816
- }
817
- return descriptors;
878
+ const parsed = await Promise.all(candidates.map((candidate) => parseClaudeSessionDescriptor(candidate.path, candidate.mtime)));
879
+ return parsed
880
+ .filter((descriptor) => descriptor !== null)
881
+ .slice(0, limit);
818
882
  }
819
883
  async isAvailable() {
820
884
  const command = this.runtimeSettings?.command;
@@ -835,7 +899,10 @@ export class ClaudeAgentClient {
835
899
  let status = formatDiagnosticStatus(available);
836
900
  if (available) {
837
901
  try {
838
- const models = await this.listModels({ cwd: os.homedir(), force: false });
902
+ const models = await this.listModels({
903
+ cwd: os.homedir(),
904
+ force: false,
905
+ });
839
906
  modelsValue = String(models.length);
840
907
  }
841
908
  catch (error) {
@@ -871,16 +938,20 @@ export class ClaudeAgentClient {
871
938
  }
872
939
  async function resolveClaudeVersion(runtimeSettings) {
873
940
  const command = runtimeSettings?.command;
941
+ const envSpec = createProviderEnvSpec({ runtimeSettings });
874
942
  try {
875
943
  if (command?.mode === "replace") {
876
- const { stdout } = await execCommand(command.argv[0], [...command.argv.slice(1), "--version"], { timeout: 5000 });
944
+ const { stdout } = await execCommand(command.argv[0], [...command.argv.slice(1), "--version"], { ...envSpec, timeout: 5000 });
877
945
  return stdout.trim() || null;
878
946
  }
879
947
  const executable = await findExecutable("claude");
880
948
  if (!executable) {
881
949
  return null;
882
950
  }
883
- const { stdout } = await execCommand(executable, ["--version"], { timeout: 5000 });
951
+ const { stdout } = await execCommand(executable, ["--version"], {
952
+ ...envSpec,
953
+ timeout: 5000,
954
+ });
884
955
  return stdout.trim() || null;
885
956
  }
886
957
  catch {
@@ -891,7 +962,10 @@ async function resolveClaudeAuth(runtimeSettings) {
891
962
  const command = runtimeSettings?.command;
892
963
  const run = async (executable, args) => {
893
964
  try {
894
- return await execCommand(executable, args, { timeout: 5000 });
965
+ return await execCommand(executable, args, {
966
+ ...createProviderEnvSpec({ runtimeSettings }),
967
+ timeout: 5000,
968
+ });
895
969
  }
896
970
  catch (error) {
897
971
  const err = error;
@@ -1048,11 +1122,17 @@ class ClaudeAgentSession {
1048
1122
  kind,
1049
1123
  input,
1050
1124
  detail: toolDetail,
1051
- suggestions: options.suggestions?.map((suggestion) => ({ ...suggestion })),
1125
+ suggestions: options.suggestions?.map((suggestion) => ({
1126
+ ...suggestion,
1127
+ })),
1052
1128
  actions: kind === "plan" ? buildClaudePlanPermissionActions(this.planResumeMode) : undefined,
1053
1129
  metadata: Object.keys(metadata).length ? metadata : undefined,
1054
1130
  };
1055
- this.pushEvent({ type: "permission_requested", provider: "claude", request });
1131
+ this.pushEvent({
1132
+ type: "permission_requested",
1133
+ provider: "claude",
1134
+ request,
1135
+ });
1056
1136
  return await new Promise((resolve, reject) => {
1057
1137
  const cleanupFns = [];
1058
1138
  const cleanup = () => {
@@ -1140,77 +1220,14 @@ class ClaudeAgentSession {
1140
1220
  return { ...info };
1141
1221
  }
1142
1222
  async run(prompt, options) {
1143
- const timeline = [];
1144
- let finalText = "";
1145
- let usage;
1146
- let turnId = null;
1147
- const bufferedEvents = [];
1148
- let settled = false;
1149
- let resolveCompletion;
1150
- let rejectCompletion;
1151
- const processEvent = (event) => {
1152
- if (settled) {
1153
- return;
1154
- }
1155
- const eventTurnId = event.turnId;
1156
- if (turnId && eventTurnId && eventTurnId !== turnId) {
1157
- return;
1158
- }
1159
- if (event.type === "timeline") {
1160
- timeline.push(event.item);
1161
- if (event.item.type === "assistant_message") {
1162
- if (!finalText) {
1163
- finalText = event.item.text;
1164
- }
1165
- else if (event.item.text.startsWith(finalText)) {
1166
- finalText = event.item.text;
1167
- }
1168
- else {
1169
- finalText += event.item.text;
1170
- }
1171
- }
1172
- return;
1173
- }
1174
- if (event.type === "turn_completed") {
1175
- usage = event.usage;
1176
- settled = true;
1177
- resolveCompletion();
1178
- return;
1179
- }
1180
- if (event.type === "turn_failed") {
1181
- settled = true;
1182
- rejectCompletion(new Error(event.error));
1183
- return;
1184
- }
1185
- if (event.type === "turn_canceled") {
1186
- settled = true;
1187
- resolveCompletion();
1188
- }
1189
- };
1190
- const completion = new Promise((resolve, reject) => {
1191
- resolveCompletion = resolve;
1192
- rejectCompletion = reject;
1223
+ const result = await runProviderTurn({
1224
+ prompt,
1225
+ runOptions: options,
1226
+ startTurn: (p, o) => this.startTurn(p, o),
1227
+ subscribe: (callback) => this.subscribe(callback),
1228
+ getSessionId: () => this.claudeSessionId ?? "",
1229
+ reduceFinalText: appendOrReplaceGrowingAssistantMessage,
1193
1230
  });
1194
- const unsubscribe = this.subscribe((event) => {
1195
- if (!turnId) {
1196
- bufferedEvents.push(event);
1197
- return;
1198
- }
1199
- processEvent(event);
1200
- });
1201
- try {
1202
- const result = await this.startTurn(prompt, options);
1203
- turnId = result.turnId;
1204
- for (const event of bufferedEvents) {
1205
- processEvent(event);
1206
- }
1207
- if (!settled) {
1208
- await completion;
1209
- }
1210
- }
1211
- finally {
1212
- unsubscribe();
1213
- }
1214
1231
  this.cachedRuntimeInfo = {
1215
1232
  provider: "claude",
1216
1233
  sessionId: this.claudeSessionId,
@@ -1220,12 +1237,7 @@ class ClaudeAgentSession {
1220
1237
  if (!this.claudeSessionId) {
1221
1238
  throw new Error("Session ID not set after run completed");
1222
1239
  }
1223
- return {
1224
- sessionId: this.claudeSessionId,
1225
- finalText,
1226
- usage,
1227
- timeline,
1228
- };
1240
+ return result;
1229
1241
  }
1230
1242
  async startTurn(prompt, _options) {
1231
1243
  if (this.closed) {
@@ -1328,8 +1340,8 @@ class ClaudeAgentSession {
1328
1340
  }
1329
1341
  const normalized = isPermissionMode(modeId) ? modeId : "default";
1330
1342
  const previousMode = this.currentMode;
1331
- const query = await this.ensureQuery();
1332
- await query.setPermissionMode(normalized);
1343
+ const activeQuery = await this.ensureQuery();
1344
+ await activeQuery.setPermissionMode(normalized);
1333
1345
  if (normalized === "plan") {
1334
1346
  if (previousMode !== "plan") {
1335
1347
  this.planResumeMode = previousMode;
@@ -1342,8 +1354,8 @@ class ClaudeAgentSession {
1342
1354
  }
1343
1355
  async setModel(modelId) {
1344
1356
  const normalizedModelId = typeof modelId === "string" && modelId.trim().length > 0 ? modelId : null;
1345
- const query = await this.ensureQuery();
1346
- await query.setModel(normalizedModelId ?? undefined);
1357
+ const activeQuery = await this.ensureQuery();
1358
+ await activeQuery.setModel(normalizedModelId ?? undefined);
1347
1359
  this.config.model = normalizedModelId ?? undefined;
1348
1360
  this.lastOptionsModel = normalizedModelId ?? this.lastOptionsModel;
1349
1361
  this.lastRuntimeModel = null;
@@ -1577,8 +1589,8 @@ class ClaudeAgentSession {
1577
1589
  }
1578
1590
  async rewindFilesOnce(messageId) {
1579
1591
  try {
1580
- const query = await this.ensureFreshQuery();
1581
- return await query.rewindFiles(messageId, { dryRun: false });
1592
+ const activeQuery = await this.ensureFreshQuery();
1593
+ return await activeQuery.rewindFiles(messageId, { dryRun: false });
1582
1594
  }
1583
1595
  catch (error) {
1584
1596
  // The Claude SDK transport can close after a rewind call.
@@ -1669,9 +1681,6 @@ class ClaudeAgentSession {
1669
1681
  this.input = null;
1670
1682
  this.queryPumpPromise = null;
1671
1683
  this.queryRestartNeeded = false;
1672
- // Reset session identity for explicit restarts so the new query starts
1673
- // a fresh session rather than resuming the previous one.
1674
- this.claudeSessionId = null;
1675
1684
  oldInput?.end();
1676
1685
  oldQuery.close?.();
1677
1686
  try {
@@ -1681,10 +1690,8 @@ class ClaudeAgentSession {
1681
1690
  /* ignore */
1682
1691
  }
1683
1692
  }
1684
- // When the pump died unexpectedly (query became null, e.g. after a session
1685
- // ID overwrite error), preserve claudeSessionId so buildOptions() passes
1686
- // resume: sessionId and the new query auto-resumes the previous session.
1687
- // For explicit restarts above, claudeSessionId was already cleared.
1693
+ // Preserve claudeSessionId across query recreation so buildOptions() passes
1694
+ // resume: sessionId and the new query continues the existing conversation.
1688
1695
  this.persistence = null;
1689
1696
  const input = createAsyncMessageInput();
1690
1697
  const options = await this.buildOptions();
@@ -1712,32 +1719,46 @@ class ClaudeAgentSession {
1712
1719
  this.logger.warn({ err: error, label }, "Claude query operation did not settle cleanly");
1713
1720
  }
1714
1721
  }
1715
- async buildOptions() {
1722
+ resolveThinkingConfig() {
1716
1723
  const thinkingOptionId = this.config.thinkingOptionId && this.config.thinkingOptionId !== "default"
1717
1724
  ? this.config.thinkingOptionId
1718
1725
  : undefined;
1719
- let thinking;
1720
- let effort;
1721
1726
  if (thinkingOptionId && isClaudeThinkingEffort(thinkingOptionId)) {
1722
- thinking = { type: "adaptive" };
1723
1727
  // SDK 0.2.71 types `effort` as 'low' | 'medium' | 'high' | 'max'; Opus 4.7
1724
1728
  // adds 'xhigh' which the binary accepts but the typings don't yet expose.
1725
- effort = thinkingOptionId;
1729
+ return {
1730
+ thinking: { type: "adaptive" },
1731
+ effort: thinkingOptionId,
1732
+ };
1726
1733
  }
1727
- const appendedSystemPrompt = [
1728
- getOrchestratorModeInstructions(),
1729
- this.config.systemPrompt?.trim(),
1730
- ]
1734
+ return { thinking: undefined, effort: undefined };
1735
+ }
1736
+ buildAppendedSystemPrompt() {
1737
+ return [getOrchestratorModeInstructions(), this.config.systemPrompt?.trim()]
1731
1738
  .filter((entry) => typeof entry === "string" && entry.length > 0)
1732
1739
  .join("\n\n");
1740
+ }
1741
+ async buildOptions() {
1742
+ const { thinking, effort } = this.resolveThinkingConfig();
1743
+ const appendedSystemPrompt = this.buildAppendedSystemPrompt();
1744
+ const extraClaudeOptions = this.config.extra?.claude;
1745
+ const sdkEnv = createProviderEnv({
1746
+ baseEnv: process.env,
1747
+ runtimeSettings: this.runtimeSettings,
1748
+ overlays: [
1749
+ extraClaudeOptions?.env,
1750
+ {
1751
+ // Increase MCP timeouts for long-running tool calls (10 minutes)
1752
+ MCP_TIMEOUT: "600000",
1753
+ MCP_TOOL_TIMEOUT: "600000",
1754
+ },
1755
+ this.launchEnv,
1756
+ ],
1757
+ });
1733
1758
  const claudeBinary = await findExecutable("claude");
1734
1759
  this.logger.debug({
1735
1760
  claudeBinary,
1736
- pathEnvKey: process.env["Path"] !== undefined
1737
- ? "Path"
1738
- : process.env["PATH"] !== undefined
1739
- ? "PATH"
1740
- : null,
1761
+ pathEnvKey: resolvePathEnvKey(),
1741
1762
  pathIncludesClaudeLocalBin: (process.env["Path"] ?? process.env["PATH"] ?? "")
1742
1763
  .toLowerCase()
1743
1764
  .includes("\\.local\\bin"),
@@ -1765,13 +1786,6 @@ class ClaudeAgentSession {
1765
1786
  this.captureStderr(data);
1766
1787
  this.logger.error({ stderr: data.trim() }, "Claude Agent SDK stderr");
1767
1788
  },
1768
- env: {
1769
- ...process.env,
1770
- // Increase MCP timeouts for long-running tool calls (10 minutes)
1771
- MCP_TIMEOUT: "600000",
1772
- MCP_TOOL_TIMEOUT: "600000",
1773
- ...(this.launchEnv ?? {}),
1774
- },
1775
1789
  // Required for provider-level /rewind support.
1776
1790
  enableFileCheckpointing: true,
1777
1791
  // If we have a session ID from a previous query (e.g., after interrupt),
@@ -1779,7 +1793,8 @@ class ClaudeAgentSession {
1779
1793
  ...(this.claudeSessionId ? { resume: this.claudeSessionId } : {}),
1780
1794
  ...(thinking ? { thinking } : {}),
1781
1795
  ...(effort ? { effort } : {}),
1782
- ...this.config.extra?.claude,
1796
+ ...extraClaudeOptions,
1797
+ env: sdkEnv,
1783
1798
  };
1784
1799
  if (this.config.mcpServers) {
1785
1800
  base.mcpServers = this.normalizeMcpServers(this.config.mcpServers);
@@ -1826,7 +1841,7 @@ class ClaudeAgentSession {
1826
1841
  },
1827
1842
  });
1828
1843
  }
1829
- else if (chunk.type === "github_pr" || chunk.type === "github_issue") {
1844
+ else {
1830
1845
  content.push({ type: "text", text: renderPromptAttachmentAsText(chunk) });
1831
1846
  }
1832
1847
  }
@@ -1900,7 +1915,7 @@ class ClaudeAgentSession {
1900
1915
  if (this.getRecentStderrDiagnostic()) {
1901
1916
  return;
1902
1917
  }
1903
- const message = typeof error === "string" ? error : error instanceof Error ? error.message : "";
1918
+ const message = errorToMessageString(error);
1904
1919
  if (!/\bprocess exited with code\b/i.test(message) &&
1905
1920
  !/\bterminated by signal\b/i.test(message)) {
1906
1921
  return;
@@ -1965,11 +1980,16 @@ class ClaudeAgentSession {
1965
1980
  if (consecutiveRecoveries >= 3) {
1966
1981
  return false;
1967
1982
  }
1968
- const message = typeof error === "string"
1969
- ? error
1970
- : error instanceof Error
1971
- ? `${error.message}\n${error.stack ?? ""}`
1972
- : JSON.stringify(error);
1983
+ let message;
1984
+ if (typeof error === "string") {
1985
+ message = error;
1986
+ }
1987
+ else if (error instanceof Error) {
1988
+ message = `${error.message}\n${error.stack ?? ""}`;
1989
+ }
1990
+ else {
1991
+ message = JSON.stringify(error);
1992
+ }
1973
1993
  return message.toLowerCase().includes("request was aborted");
1974
1994
  }
1975
1995
  finishForegroundTurn(event) {
@@ -2055,23 +2075,39 @@ class ClaudeAgentSession {
2055
2075
  return;
2056
2076
  }
2057
2077
  let consecutiveInterruptAbortRecoveries = 0;
2078
+ const logRawMessage = (message) => {
2079
+ if (!claudeDebug) {
2080
+ return;
2081
+ }
2082
+ this.logger.trace({
2083
+ claudeSessionId: this.claudeSessionId,
2084
+ messageType: message.type,
2085
+ messageSubtype: "subtype" in message ? message.subtype : undefined,
2086
+ messageUuid: "uuid" in message ? message.uuid : undefined,
2087
+ }, "Claude query pump: raw SDK message");
2088
+ };
2089
+ const handlePumpedMessage = async (message) => {
2090
+ logRawMessage(message);
2091
+ consecutiveInterruptAbortRecoveries = 0;
2092
+ if (await this.handleMissingResumedConversation(message, activeQuery)) {
2093
+ return true;
2094
+ }
2095
+ this.routeSdkMessageFromPump(message);
2096
+ return false;
2097
+ };
2098
+ const drainActiveQuery = async () => {
2099
+ for await (const message of activeQuery) {
2100
+ if (await handlePumpedMessage(message)) {
2101
+ return true;
2102
+ }
2103
+ }
2104
+ return false;
2105
+ };
2058
2106
  try {
2059
2107
  while (!this.closed && this.query === activeQuery) {
2060
2108
  try {
2061
- for await (const message of activeQuery) {
2062
- if (claudeDebug) {
2063
- this.logger.trace({
2064
- claudeSessionId: this.claudeSessionId,
2065
- messageType: message.type,
2066
- messageSubtype: "subtype" in message ? message.subtype : undefined,
2067
- messageUuid: "uuid" in message ? message.uuid : undefined,
2068
- }, "Claude query pump: raw SDK message");
2069
- }
2070
- consecutiveInterruptAbortRecoveries = 0;
2071
- if (await this.handleMissingResumedConversation(message, activeQuery)) {
2072
- return;
2073
- }
2074
- this.routeSdkMessageFromPump(message);
2109
+ if (await drainActiveQuery()) {
2110
+ return;
2075
2111
  }
2076
2112
  if (!this.closed && this.query === activeQuery) {
2077
2113
  this.failActiveTurns("Claude stream ended before terminal result");
@@ -2101,7 +2137,16 @@ class ClaudeAgentSession {
2101
2137
  }
2102
2138
  }
2103
2139
  }
2104
- routeSdkMessageFromPump(message) {
2140
+ isEchoedForegroundUserMessage(event) {
2141
+ if (event.type !== "timeline" ||
2142
+ event.item.type !== "user_message" ||
2143
+ !this.activeForegroundTurnId ||
2144
+ !this.lastForegroundPromptText) {
2145
+ return false;
2146
+ }
2147
+ return event.item.text.trim() === this.lastForegroundPromptText.trim();
2148
+ }
2149
+ shouldSuppressStaleResult(message) {
2105
2150
  // Suppress stale results from interrupted requests. The cancel path already
2106
2151
  // emitted the terminal event; this result is leftover from the killed API
2107
2152
  // request. Consume the flag on ANY result so it doesn't linger.
@@ -2109,19 +2154,27 @@ class ClaudeAgentSession {
2109
2154
  this.pendingInterruptAbort = false;
2110
2155
  if (message.subtype !== "success") {
2111
2156
  this.logger.debug("Suppressing stale non-success result from interrupted request");
2112
- return;
2157
+ return true;
2113
2158
  }
2114
2159
  }
2115
2160
  if (message.type === "result" && message.subtype !== "success" && this.isAbortError(message)) {
2116
2161
  this.logger.debug("Suppressing abort result by content");
2117
- return;
2162
+ return true;
2118
2163
  }
2119
- const isForeground = Boolean(this.activeForegroundTurnId);
2120
- const assistantishMessage = message.type === "assistant" ||
2164
+ return false;
2165
+ }
2166
+ isAssistantishMessage(message) {
2167
+ return (message.type === "assistant" ||
2121
2168
  message.type === "stream_event" ||
2122
2169
  message.type === "tool_progress" ||
2123
- (message.type === "system" && message.subtype === "task_notification");
2124
- if (!isForeground && assistantishMessage) {
2170
+ (message.type === "system" && message.subtype === "task_notification"));
2171
+ }
2172
+ routeSdkMessageFromPump(message) {
2173
+ if (this.shouldSuppressStaleResult(message)) {
2174
+ return;
2175
+ }
2176
+ const isForeground = Boolean(this.activeForegroundTurnId);
2177
+ if (!isForeground && this.isAssistantishMessage(message)) {
2125
2178
  this.startAutonomousTurn();
2126
2179
  }
2127
2180
  if (!isForeground && !this.autonomousTurn && message.type === "result") {
@@ -2152,17 +2205,7 @@ class ClaudeAgentSession {
2152
2205
  provider: "claude",
2153
2206
  }));
2154
2207
  // User message dedup: suppress echoed user messages that match the foreground prompt
2155
- const filteredMessageEvents = messageEvents.filter((event) => {
2156
- if (event.type === "timeline" &&
2157
- event.item.type === "user_message" &&
2158
- this.activeForegroundTurnId &&
2159
- this.lastForegroundPromptText) {
2160
- if (event.item.text.trim() === this.lastForegroundPromptText.trim()) {
2161
- return false;
2162
- }
2163
- }
2164
- return true;
2165
- });
2208
+ const filteredMessageEvents = messageEvents.filter((event) => !this.isEchoedForegroundUserMessage(event));
2166
2209
  const events = [...filteredMessageEvents, ...assistantTimelineEvents];
2167
2210
  if (events.length === 0) {
2168
2211
  return;
@@ -2183,7 +2226,7 @@ class ClaudeAgentSession {
2183
2226
  }
2184
2227
  this.dispatchEvents(events);
2185
2228
  }
2186
- async handleMissingResumedConversation(message, query) {
2229
+ async handleMissingResumedConversation(message, activeQuery) {
2187
2230
  const staleResumeError = this.readMissingResumedConversationError(message);
2188
2231
  if (!staleResumeError) {
2189
2232
  return false;
@@ -2194,12 +2237,11 @@ class ClaudeAgentSession {
2194
2237
  }, "Claude resumed session no longer exists; invalidating persisted session");
2195
2238
  this.failActiveTurns(staleResumeError);
2196
2239
  this.input?.end();
2197
- await this.awaitWithTimeout(query.return?.(), "query pump return on missing resumed conversation");
2198
- if (this.query === query) {
2240
+ await this.awaitWithTimeout(activeQuery.return?.(), "query pump return on missing resumed conversation");
2241
+ if (this.query === activeQuery) {
2199
2242
  this.query = null;
2200
2243
  this.input = null;
2201
2244
  }
2202
- this.claudeSessionId = null;
2203
2245
  this.persistence = null;
2204
2246
  this.persistedHistory = [];
2205
2247
  this.historyPending = false;
@@ -2232,128 +2274,28 @@ class ClaudeAgentSession {
2232
2274
  return this.sidechainTracker.handleMessage(message, parentToolUseId);
2233
2275
  }
2234
2276
  const events = [];
2235
- const fallbackThreadSessionId = this.captureSessionIdFromMessage(message);
2236
- if (fallbackThreadSessionId) {
2277
+ const sessionCapture = this.captureSessionIdFromMessage(message);
2278
+ if (sessionCapture.notice) {
2279
+ events.push({
2280
+ type: "timeline",
2281
+ provider: "claude",
2282
+ item: sessionCapture.notice,
2283
+ });
2284
+ }
2285
+ if (sessionCapture.threadStartedSessionId) {
2237
2286
  events.push({
2238
2287
  type: "thread_started",
2239
2288
  provider: "claude",
2240
- sessionId: fallbackThreadSessionId,
2289
+ sessionId: sessionCapture.threadStartedSessionId,
2241
2290
  });
2242
2291
  }
2243
2292
  switch (message.type) {
2244
2293
  case "system":
2245
- if (message.subtype === "init") {
2246
- const threadSessionId = this.handleSystemMessage(message);
2247
- if (threadSessionId) {
2248
- events.push({
2249
- type: "thread_started",
2250
- provider: "claude",
2251
- sessionId: threadSessionId,
2252
- });
2253
- }
2254
- }
2255
- else if (message.subtype === "status") {
2256
- const status = message.status;
2257
- if (status === "compacting") {
2258
- this.compacting = true;
2259
- events.push({
2260
- type: "timeline",
2261
- item: { type: "compaction", status: "loading" },
2262
- provider: "claude",
2263
- });
2264
- }
2265
- }
2266
- else if (message.subtype === "compact_boundary") {
2267
- const compactMetadata = readCompactionMetadata(message);
2268
- events.push({
2269
- type: "timeline",
2270
- item: {
2271
- type: "compaction",
2272
- status: "completed",
2273
- trigger: compactMetadata?.trigger === "manual" ? "manual" : "auto",
2274
- preTokens: compactMetadata?.preTokens,
2275
- },
2276
- provider: "claude",
2277
- });
2278
- }
2279
- else if (message.subtype === "task_notification") {
2280
- const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(message);
2281
- if (taskNotificationItem) {
2282
- events.push({
2283
- type: "timeline",
2284
- item: taskNotificationItem,
2285
- provider: "claude",
2286
- });
2287
- }
2288
- const usage = readUsageFromTaskNotification(message);
2289
- if (typeof usage === "number") {
2290
- this.lastContextWindowUsedTokens = usage;
2291
- events.push(this.createUsageUpdatedEvent(usage));
2292
- }
2293
- }
2294
- else if (message.subtype === "task_progress") {
2295
- this.lastContextWindowUsedTokens =
2296
- readContextWindowUsedTokensFromTaskProgress(message) ??
2297
- this.lastContextWindowUsedTokens;
2298
- if (typeof this.lastContextWindowUsedTokens === "number") {
2299
- events.push(this.createUsageUpdatedEvent(this.lastContextWindowUsedTokens));
2300
- }
2301
- }
2294
+ this.appendSystemMessageEvents(message, events);
2302
2295
  break;
2303
- case "user": {
2304
- if (isSyntheticUserEntry(message)) {
2305
- break;
2306
- }
2307
- if (this.compacting) {
2308
- this.compacting = false;
2309
- break;
2310
- }
2311
- const messageId = typeof message.uuid === "string" && message.uuid.length > 0 ? message.uuid : undefined;
2312
- this.rememberUserMessageId(messageId);
2313
- const content = message.message?.content;
2314
- const taskNotificationItem = mapTaskNotificationUserContentToToolCall({
2315
- content,
2316
- messageId,
2317
- });
2318
- if (taskNotificationItem) {
2319
- events.push({
2320
- type: "timeline",
2321
- item: taskNotificationItem,
2322
- provider: "claude",
2323
- });
2324
- break;
2325
- }
2326
- if (typeof content === "string" && content.length > 0) {
2327
- if (!isClaudeTranscriptNoiseText(content)) {
2328
- events.push({
2329
- type: "timeline",
2330
- item: {
2331
- type: "user_message",
2332
- text: content,
2333
- ...(messageId ? { messageId } : {}),
2334
- },
2335
- provider: "claude",
2336
- });
2337
- }
2338
- }
2339
- else if (Array.isArray(content)) {
2340
- const timelineItems = this.mapBlocksToTimeline(content, {
2341
- textMessageType: "user_message",
2342
- });
2343
- for (const item of timelineItems) {
2344
- if (item.type === "user_message" && messageId && !item.messageId) {
2345
- events.push({
2346
- type: "timeline",
2347
- item: { ...item, messageId },
2348
- provider: "claude",
2349
- });
2350
- continue;
2351
- }
2352
- events.push({ type: "timeline", item, provider: "claude" });
2353
- }
2354
- }
2296
+ case "user":
2297
+ this.appendUserMessageEvents(message, events);
2355
2298
  break;
2356
- }
2357
2299
  case "assistant": {
2358
2300
  const timelineItems = this.mapBlocksToTimeline(message.message.content, {
2359
2301
  suppressAssistantText: options?.suppressAssistantText ?? false,
@@ -2364,85 +2306,211 @@ class ClaudeAgentSession {
2364
2306
  }
2365
2307
  break;
2366
2308
  }
2367
- case "stream_event": {
2368
- const usageUpdatedEvent = this.trackStreamEventUsage(message.event);
2369
- if (usageUpdatedEvent) {
2370
- events.push(usageUpdatedEvent);
2371
- }
2372
- const timelineItems = this.mapPartialEvent(message.event, {
2373
- suppressAssistantText: options?.suppressAssistantText ?? false,
2374
- suppressReasoning: options?.suppressReasoning ?? false,
2375
- });
2376
- for (const item of timelineItems) {
2377
- events.push({ type: "timeline", item, provider: "claude" });
2378
- }
2309
+ case "stream_event":
2310
+ this.appendStreamEventEvents(message, events, options);
2379
2311
  break;
2380
- }
2381
- case "result": {
2382
- const usage = this.convertUsage(message, message.modelUsage);
2383
- if (message.subtype === "success") {
2384
- events.push({ type: "turn_completed", provider: "claude", usage });
2385
- }
2386
- else {
2387
- const errorMessage = "errors" in message && Array.isArray(message.errors) && message.errors.length > 0
2388
- ? message.errors.join("\n")
2389
- : "Claude run failed";
2390
- events.push(this.buildTurnFailedEvent(errorMessage));
2391
- }
2312
+ case "result":
2313
+ this.appendResultEvents(message, events);
2392
2314
  break;
2393
- }
2394
2315
  default:
2395
2316
  break;
2396
2317
  }
2397
2318
  return events;
2398
2319
  }
2320
+ appendSystemMessageEvents(message, events) {
2321
+ if (message.subtype === "init") {
2322
+ const sessionUpdate = this.handleSystemMessage(message);
2323
+ if (sessionUpdate.notice) {
2324
+ events.push({
2325
+ type: "timeline",
2326
+ provider: "claude",
2327
+ item: sessionUpdate.notice,
2328
+ });
2329
+ }
2330
+ if (sessionUpdate.threadStartedSessionId) {
2331
+ events.push({
2332
+ type: "thread_started",
2333
+ provider: "claude",
2334
+ sessionId: sessionUpdate.threadStartedSessionId,
2335
+ });
2336
+ }
2337
+ return;
2338
+ }
2339
+ if (message.subtype === "status") {
2340
+ const status = message.status;
2341
+ if (status === "compacting") {
2342
+ this.compacting = true;
2343
+ events.push({
2344
+ type: "timeline",
2345
+ item: { type: "compaction", status: "loading" },
2346
+ provider: "claude",
2347
+ });
2348
+ }
2349
+ return;
2350
+ }
2351
+ if (message.subtype === "compact_boundary") {
2352
+ const compactMetadata = readCompactionMetadata(message);
2353
+ events.push({
2354
+ type: "timeline",
2355
+ item: {
2356
+ type: "compaction",
2357
+ status: "completed",
2358
+ trigger: compactMetadata?.trigger === "manual" ? "manual" : "auto",
2359
+ preTokens: compactMetadata?.preTokens,
2360
+ },
2361
+ provider: "claude",
2362
+ });
2363
+ return;
2364
+ }
2365
+ if (message.subtype === "task_notification") {
2366
+ const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(message);
2367
+ if (taskNotificationItem) {
2368
+ events.push({
2369
+ type: "timeline",
2370
+ item: taskNotificationItem,
2371
+ provider: "claude",
2372
+ });
2373
+ }
2374
+ const usage = readUsageFromTaskNotification(message);
2375
+ if (typeof usage === "number") {
2376
+ this.lastContextWindowUsedTokens = usage;
2377
+ events.push(this.createUsageUpdatedEvent(usage));
2378
+ }
2379
+ return;
2380
+ }
2381
+ if (message.subtype === "task_progress") {
2382
+ this.lastContextWindowUsedTokens =
2383
+ readContextWindowUsedTokensFromTaskProgress(message) ?? this.lastContextWindowUsedTokens;
2384
+ if (typeof this.lastContextWindowUsedTokens === "number") {
2385
+ events.push(this.createUsageUpdatedEvent(this.lastContextWindowUsedTokens));
2386
+ }
2387
+ }
2388
+ }
2389
+ appendUserMessageEvents(message, events) {
2390
+ if (isSyntheticUserEntry(message)) {
2391
+ return;
2392
+ }
2393
+ if (this.compacting) {
2394
+ this.compacting = false;
2395
+ return;
2396
+ }
2397
+ const messageId = typeof message.uuid === "string" && message.uuid.length > 0 ? message.uuid : undefined;
2398
+ this.rememberUserMessageId(messageId);
2399
+ const content = message.message?.content;
2400
+ const taskNotificationItem = mapTaskNotificationUserContentToToolCall({
2401
+ content,
2402
+ messageId,
2403
+ });
2404
+ if (taskNotificationItem) {
2405
+ events.push({
2406
+ type: "timeline",
2407
+ item: taskNotificationItem,
2408
+ provider: "claude",
2409
+ });
2410
+ return;
2411
+ }
2412
+ if (typeof content === "string" && content.length > 0) {
2413
+ if (!isClaudeTranscriptNoiseText(content)) {
2414
+ events.push({
2415
+ type: "timeline",
2416
+ item: {
2417
+ type: "user_message",
2418
+ text: content,
2419
+ ...(messageId ? { messageId } : {}),
2420
+ },
2421
+ provider: "claude",
2422
+ });
2423
+ }
2424
+ return;
2425
+ }
2426
+ if (Array.isArray(content)) {
2427
+ this.appendUserContentArrayEvents(content, messageId, events);
2428
+ }
2429
+ }
2430
+ appendUserContentArrayEvents(content, messageId, events) {
2431
+ const timelineItems = this.mapBlocksToTimeline(content, {
2432
+ textMessageType: "user_message",
2433
+ });
2434
+ for (const item of timelineItems) {
2435
+ if (item.type === "user_message" && messageId && !item.messageId) {
2436
+ events.push({
2437
+ type: "timeline",
2438
+ item: { ...item, messageId },
2439
+ provider: "claude",
2440
+ });
2441
+ continue;
2442
+ }
2443
+ events.push({ type: "timeline", item, provider: "claude" });
2444
+ }
2445
+ }
2446
+ appendStreamEventEvents(message, events, options) {
2447
+ const usageUpdatedEvent = this.trackStreamEventUsage(message.event);
2448
+ if (usageUpdatedEvent) {
2449
+ events.push(usageUpdatedEvent);
2450
+ }
2451
+ const timelineItems = this.mapPartialEvent(message.event, {
2452
+ suppressAssistantText: options?.suppressAssistantText ?? false,
2453
+ suppressReasoning: options?.suppressReasoning ?? false,
2454
+ });
2455
+ for (const item of timelineItems) {
2456
+ events.push({ type: "timeline", item, provider: "claude" });
2457
+ }
2458
+ }
2459
+ appendResultEvents(message, events) {
2460
+ const usage = this.convertUsage(message, message.modelUsage);
2461
+ if (message.subtype === "success") {
2462
+ events.push({ type: "turn_completed", provider: "claude", usage });
2463
+ return;
2464
+ }
2465
+ const errorMessage = "errors" in message && Array.isArray(message.errors) && message.errors.length > 0
2466
+ ? message.errors.join("\n")
2467
+ : "Claude run failed";
2468
+ events.push(this.buildTurnFailedEvent(errorMessage));
2469
+ }
2470
+ createClaudeSessionChangedNotice(oldSessionId, newSessionId) {
2471
+ return {
2472
+ type: "assistant_message",
2473
+ text: `Claude switched to a new session: ${oldSessionId} -> ${newSessionId}`,
2474
+ };
2475
+ }
2399
2476
  captureSessionIdFromMessage(message) {
2400
2477
  const msg = message;
2401
- const sessionIdRaw = typeof msg.session_id === "string"
2402
- ? msg.session_id
2403
- : typeof msg.sessionId === "string"
2404
- ? msg.sessionId
2405
- : typeof msg.session?.id === "string"
2406
- ? msg.session.id
2407
- : "";
2408
- const sessionId = sessionIdRaw.trim();
2478
+ const sessionId = extractSessionIdRaw(msg).trim();
2409
2479
  if (!sessionId) {
2410
- return null;
2480
+ return { threadStartedSessionId: null, notice: null };
2411
2481
  }
2412
2482
  if (this.claudeSessionId === null) {
2413
2483
  this.claudeSessionId = sessionId;
2414
2484
  this.persistence = null;
2415
- return sessionId;
2485
+ return { threadStartedSessionId: sessionId, notice: null };
2416
2486
  }
2417
2487
  if (this.claudeSessionId === sessionId) {
2418
- return null;
2488
+ return { threadStartedSessionId: null, notice: null };
2419
2489
  }
2490
+ const oldSessionId = this.claudeSessionId;
2420
2491
  // Session ID changed mid-stream (e.g. a hook caused Claude to restart
2421
2492
  // with a new session). Accept the new ID and continue — the turn should
2422
2493
  // not be failed just because the underlying subprocess cycled.
2423
2494
  this.logger.warn({ existingSessionId: this.claudeSessionId, newSessionId: sessionId }, "Claude session ID changed in message; accepting new session");
2424
2495
  this.claudeSessionId = sessionId;
2425
2496
  this.persistence = null;
2426
- return sessionId;
2497
+ return {
2498
+ threadStartedSessionId: sessionId,
2499
+ notice: this.createClaudeSessionChangedNotice(oldSessionId, sessionId),
2500
+ };
2427
2501
  }
2428
2502
  handleSystemMessage(message) {
2429
2503
  if (message.subtype !== "init") {
2430
- return null;
2504
+ return { threadStartedSessionId: null, notice: null };
2431
2505
  }
2432
2506
  const msg = message;
2433
- const newSessionIdRaw = typeof msg.session_id === "string"
2434
- ? msg.session_id
2435
- : typeof msg.sessionId === "string"
2436
- ? msg.sessionId
2437
- : typeof msg.session?.id === "string"
2438
- ? msg.session.id
2439
- : "";
2440
- const newSessionId = newSessionIdRaw.trim();
2507
+ const newSessionId = extractSessionIdRaw(msg).trim();
2441
2508
  if (!newSessionId) {
2442
- return null;
2509
+ return { threadStartedSessionId: null, notice: null };
2443
2510
  }
2444
2511
  const existingSessionId = this.claudeSessionId;
2445
2512
  let threadStartedSessionId = null;
2513
+ let notice = null;
2446
2514
  if (existingSessionId === null) {
2447
2515
  this.claudeSessionId = newSessionId;
2448
2516
  threadStartedSessionId = newSessionId;
@@ -2457,6 +2525,7 @@ class ClaudeAgentSession {
2457
2525
  this.logger.warn({ existingSessionId, newSessionId }, "Claude session ID changed in init message; accepting new session");
2458
2526
  this.claudeSessionId = newSessionId;
2459
2527
  threadStartedSessionId = newSessionId;
2528
+ notice = this.createClaudeSessionChangedNotice(existingSessionId, newSessionId);
2460
2529
  }
2461
2530
  this.availableModes = DEFAULT_MODES;
2462
2531
  this.currentMode = message.permissionMode;
@@ -2476,7 +2545,7 @@ class ClaudeAgentSession {
2476
2545
  this.lastRuntimeModel = message.model;
2477
2546
  this.cachedRuntimeInfo = null;
2478
2547
  }
2479
- return threadStartedSessionId;
2548
+ return { threadStartedSessionId, notice };
2480
2549
  }
2481
2550
  readMissingResumedConversationError(message) {
2482
2551
  if (message.type !== "result" || message.subtype !== "error_during_execution") {
@@ -2651,7 +2720,7 @@ class ClaudeAgentSession {
2651
2720
  }
2652
2721
  this.ingestPersistedHistory(fs.readFileSync(historyPath, "utf8"));
2653
2722
  }
2654
- catch (error) {
2723
+ catch {
2655
2724
  // ignore history load failures
2656
2725
  }
2657
2726
  }
@@ -2734,50 +2803,16 @@ class ClaudeAgentSession {
2734
2803
  // User SDK entries can arrive as multiple text blocks, but Paseo treats them as one message.
2735
2804
  const userTextParts = [];
2736
2805
  for (const block of content) {
2737
- switch (block.type) {
2738
- case "text":
2739
- case "text_delta":
2740
- if (block.text &&
2741
- block.text !== INTERRUPT_TOOL_USE_PLACEHOLDER &&
2742
- !isClaudeTranscriptNoiseText(block.text)) {
2743
- if (textMessageType === "user_message") {
2744
- const trimmed = block.text.trim();
2745
- if (trimmed) {
2746
- userTextParts.push(trimmed);
2747
- }
2748
- }
2749
- else if (!suppressText) {
2750
- items.push({ type: "assistant_message", text: block.text });
2751
- }
2752
- }
2753
- break;
2754
- case "thinking":
2755
- case "thinking_delta":
2756
- if (block.thinking) {
2757
- if (!suppressReasoning) {
2758
- items.push({ type: "reasoning", text: block.thinking });
2759
- }
2760
- }
2761
- break;
2762
- case "tool_use":
2763
- case "server_tool_use":
2764
- case "mcp_tool_use": {
2765
- this.handleToolUseStart(block, items);
2766
- break;
2767
- }
2768
- case "tool_result":
2769
- case "mcp_tool_result":
2770
- case "web_fetch_tool_result":
2771
- case "web_search_tool_result":
2772
- case "code_execution_tool_result":
2773
- case "bash_code_execution_tool_result":
2774
- case "text_editor_code_execution_tool_result": {
2775
- this.handleToolResult(block, items);
2776
- break;
2777
- }
2778
- default:
2779
- break;
2806
+ if (!isClaudeContentChunk(block)) {
2807
+ continue;
2780
2808
  }
2809
+ this.mapBlockToTimeline(block, {
2810
+ items,
2811
+ userTextParts,
2812
+ textMessageType,
2813
+ suppressText,
2814
+ suppressReasoning,
2815
+ });
2781
2816
  }
2782
2817
  if (textMessageType === "user_message" && userTextParts.length > 0) {
2783
2818
  items.unshift({
@@ -2787,6 +2822,53 @@ class ClaudeAgentSession {
2787
2822
  }
2788
2823
  return items;
2789
2824
  }
2825
+ appendTextBlockToTimeline(block, context) {
2826
+ const { items, userTextParts, textMessageType, suppressText } = context;
2827
+ const text = typeof block.text === "string" ? block.text : "";
2828
+ if (!text || text === INTERRUPT_TOOL_USE_PLACEHOLDER || isClaudeTranscriptNoiseText(text)) {
2829
+ return;
2830
+ }
2831
+ if (textMessageType === "user_message") {
2832
+ const trimmed = text.trim();
2833
+ if (trimmed) {
2834
+ userTextParts.push(trimmed);
2835
+ }
2836
+ return;
2837
+ }
2838
+ if (!suppressText) {
2839
+ items.push({ type: "assistant_message", text });
2840
+ }
2841
+ }
2842
+ mapBlockToTimeline(block, context) {
2843
+ switch (block.type) {
2844
+ case "text":
2845
+ case "text_delta":
2846
+ this.appendTextBlockToTimeline(block, context);
2847
+ break;
2848
+ case "thinking":
2849
+ case "thinking_delta":
2850
+ if (typeof block.thinking === "string" && block.thinking && !context.suppressReasoning) {
2851
+ context.items.push({ type: "reasoning", text: block.thinking });
2852
+ }
2853
+ break;
2854
+ case "tool_use":
2855
+ case "server_tool_use":
2856
+ case "mcp_tool_use":
2857
+ this.handleToolUseStart(block, context.items);
2858
+ break;
2859
+ case "tool_result":
2860
+ case "mcp_tool_result":
2861
+ case "web_fetch_tool_result":
2862
+ case "web_search_tool_result":
2863
+ case "code_execution_tool_result":
2864
+ case "bash_code_execution_tool_result":
2865
+ case "text_editor_code_execution_tool_result":
2866
+ this.handleToolResult(block, context.items);
2867
+ break;
2868
+ default:
2869
+ break;
2870
+ }
2871
+ }
2790
2872
  handleToolUseStart(block, items) {
2791
2873
  const entry = this.upsertToolUseEntry(block);
2792
2874
  if (!entry) {
@@ -2806,7 +2888,8 @@ class ClaudeAgentSession {
2806
2888
  }
2807
2889
  handleToolResult(block, items) {
2808
2890
  const entry = typeof block.tool_use_id === "string" ? this.toolUseCache.get(block.tool_use_id) : undefined;
2809
- const toolName = entry?.name ?? block.tool_name ?? "tool";
2891
+ const blockToolName = typeof block.tool_name === "string" ? block.tool_name : undefined;
2892
+ const toolName = entry?.name ?? blockToolName ?? "tool";
2810
2893
  const callId = typeof block.tool_use_id === "string" && block.tool_use_id.length > 0
2811
2894
  ? block.tool_use_id
2812
2895
  : (entry?.id ?? null);
@@ -2838,8 +2921,10 @@ class ClaudeAgentSession {
2838
2921
  if (block.is_error) {
2839
2922
  return undefined;
2840
2923
  }
2841
- const server = entry?.server ?? block.server ?? "tool";
2842
- const tool = entry?.name ?? block.tool_name ?? "tool";
2924
+ const blockServer = typeof block.server === "string" ? block.server : undefined;
2925
+ const blockToolName = typeof block.tool_name === "string" ? block.tool_name : undefined;
2926
+ const server = entry?.server ?? blockServer ?? "tool";
2927
+ const tool = entry?.name ?? blockToolName ?? "tool";
2843
2928
  const content = coerceToolResultContentToString(block.content);
2844
2929
  const input = entry?.input;
2845
2930
  // Build structured result based on tool type
@@ -2865,17 +2950,39 @@ class ClaudeAgentSession {
2865
2950
  }
2866
2951
  return Object.keys(result).length > 0 ? result : undefined;
2867
2952
  }
2868
- buildStructuredToolResult(server, tool, output, input) {
2869
- const normalizedServer = server.toLowerCase();
2870
- const normalizedTool = tool.toLowerCase();
2871
- // Command execution tools
2953
+ isCommandExecutionTool(normalizedServer, normalizedTool, input) {
2872
2954
  if (normalizedServer.includes("bash") ||
2873
2955
  normalizedServer.includes("shell") ||
2874
- normalizedServer.includes("command") ||
2875
- normalizedTool.includes("bash") ||
2956
+ normalizedServer.includes("command")) {
2957
+ return true;
2958
+ }
2959
+ if (normalizedTool.includes("bash") ||
2876
2960
  normalizedTool.includes("shell") ||
2877
- normalizedTool.includes("command") ||
2878
- (input && (typeof input.command === "string" || Array.isArray(input.command)))) {
2961
+ normalizedTool.includes("command")) {
2962
+ return true;
2963
+ }
2964
+ return Boolean(input && (typeof input.command === "string" || Array.isArray(input.command)));
2965
+ }
2966
+ static isFileWriteTool(normalizedTool) {
2967
+ return (normalizedTool.includes("write") ||
2968
+ normalizedTool === "write_file" ||
2969
+ normalizedTool === "create_file");
2970
+ }
2971
+ static isFileEditTool(normalizedTool) {
2972
+ return (normalizedTool.includes("edit") ||
2973
+ normalizedTool.includes("patch") ||
2974
+ normalizedTool === "apply_patch" ||
2975
+ normalizedTool === "apply_diff");
2976
+ }
2977
+ static isFileReadTool(normalizedTool) {
2978
+ return (normalizedTool.includes("read") ||
2979
+ normalizedTool === "read_file" ||
2980
+ normalizedTool === "view_file");
2981
+ }
2982
+ buildStructuredToolResult(server, tool, output, input) {
2983
+ const normalizedServer = server.toLowerCase();
2984
+ const normalizedTool = tool.toLowerCase();
2985
+ if (this.isCommandExecutionTool(normalizedServer, normalizedTool, input)) {
2879
2986
  const command = this.extractCommandText(input ?? {}) ?? "command";
2880
2987
  return {
2881
2988
  type: "command",
@@ -2884,64 +2991,43 @@ class ClaudeAgentSession {
2884
2991
  cwd: typeof input?.cwd === "string" ? input.cwd : undefined,
2885
2992
  };
2886
2993
  }
2887
- // File write tools (new files or complete replacements)
2888
- if (normalizedTool.includes("write") ||
2889
- normalizedTool === "write_file" ||
2890
- normalizedTool === "create_file") {
2891
- if (input && typeof input.file_path === "string") {
2892
- return {
2893
- type: "file_write",
2894
- filePath: input.file_path,
2895
- oldContent: "",
2896
- newContent: typeof input.content === "string" ? input.content : output,
2897
- };
2898
- }
2994
+ if (ClaudeAgentSession.isFileWriteTool(normalizedTool) &&
2995
+ input &&
2996
+ typeof input.file_path === "string") {
2997
+ return {
2998
+ type: "file_write",
2999
+ filePath: input.file_path,
3000
+ oldContent: "",
3001
+ newContent: typeof input.content === "string" ? input.content : output,
3002
+ };
2899
3003
  }
2900
- // File edit/patch tools
2901
- if (normalizedTool.includes("edit") ||
2902
- normalizedTool.includes("patch") ||
2903
- normalizedTool === "apply_patch" ||
2904
- normalizedTool === "apply_diff") {
2905
- if (input && typeof input.file_path === "string") {
2906
- // Support both old_str/new_str and old_string/new_string parameter names
2907
- const oldContent = typeof input.old_str === "string"
2908
- ? input.old_str
2909
- : typeof input.old_string === "string"
2910
- ? input.old_string
2911
- : undefined;
2912
- const newContent = typeof input.new_str === "string"
2913
- ? input.new_str
2914
- : typeof input.new_string === "string"
2915
- ? input.new_string
2916
- : undefined;
2917
- return {
2918
- type: "file_edit",
2919
- filePath: input.file_path,
2920
- diff: typeof input.patch === "string"
2921
- ? input.patch
2922
- : typeof input.diff === "string"
2923
- ? input.diff
2924
- : undefined,
2925
- oldContent,
2926
- newContent,
2927
- };
2928
- }
3004
+ if (ClaudeAgentSession.isFileEditTool(normalizedTool) &&
3005
+ input &&
3006
+ typeof input.file_path === "string") {
3007
+ // Support both old_str/new_str and old_string/new_string parameter names
3008
+ const oldContent = firstStringField(input, "old_str", "old_string");
3009
+ const newContent = firstStringField(input, "new_str", "new_string");
3010
+ const diff = firstStringField(input, "patch", "diff");
3011
+ return {
3012
+ type: "file_edit",
3013
+ filePath: input.file_path,
3014
+ diff,
3015
+ oldContent,
3016
+ newContent,
3017
+ };
2929
3018
  }
2930
- // File read tools
2931
- if (normalizedTool.includes("read") ||
2932
- normalizedTool === "read_file" ||
2933
- normalizedTool === "view_file") {
2934
- if (input && typeof input.file_path === "string") {
2935
- return {
2936
- type: "file_read",
2937
- filePath: input.file_path,
2938
- content: output,
2939
- };
2940
- }
3019
+ if (ClaudeAgentSession.isFileReadTool(normalizedTool) &&
3020
+ input &&
3021
+ typeof input.file_path === "string") {
3022
+ return {
3023
+ type: "file_read",
3024
+ filePath: input.file_path,
3025
+ content: output,
3026
+ };
2941
3027
  }
2942
3028
  return undefined;
2943
3029
  }
2944
- mapPartialEvent(event, options) {
3030
+ updatePartialEventToolState(event) {
2945
3031
  if (event.type === "content_block_start") {
2946
3032
  const block = isClaudeContentChunk(event.content_block) ? event.content_block : null;
2947
3033
  if (block?.type === "tool_use" &&
@@ -2950,22 +3036,30 @@ class ClaudeAgentSession {
2950
3036
  this.toolUseIndexToId.set(event.index, block.id);
2951
3037
  this.toolUseInputBuffers.delete(block.id);
2952
3038
  }
3039
+ return false;
2953
3040
  }
2954
- else if (event.type === "content_block_delta") {
3041
+ if (event.type === "content_block_delta") {
2955
3042
  const delta = isClaudeContentChunk(event.delta) ? event.delta : null;
2956
3043
  if (delta?.type === "input_json_delta") {
2957
3044
  const partialJson = typeof delta.partial_json === "string" ? delta.partial_json : undefined;
2958
3045
  this.handleToolInputDelta(event.index, partialJson);
2959
- return [];
3046
+ return true;
2960
3047
  }
3048
+ return false;
2961
3049
  }
2962
- else if (event.type === "content_block_stop" && typeof event.index === "number") {
3050
+ if (event.type === "content_block_stop" && typeof event.index === "number") {
2963
3051
  const toolId = this.toolUseIndexToId.get(event.index);
2964
3052
  if (toolId) {
2965
3053
  this.toolUseIndexToId.delete(event.index);
2966
3054
  this.toolUseInputBuffers.delete(toolId);
2967
3055
  }
2968
3056
  }
3057
+ return false;
3058
+ }
3059
+ mapPartialEvent(event, options) {
3060
+ if (this.updatePartialEventToolState(event)) {
3061
+ return [];
3062
+ }
2969
3063
  switch (event.type) {
2970
3064
  case "content_block_start":
2971
3065
  return isClaudeContentChunk(event.content_block)
@@ -2990,18 +3084,7 @@ class ClaudeAgentSession {
2990
3084
  if (!id) {
2991
3085
  return null;
2992
3086
  }
2993
- const existing = this.toolUseCache.get(id) ??
2994
- {
2995
- id,
2996
- name: typeof block.name === "string" && block.name.length > 0 ? block.name : "tool",
2997
- server: typeof block.server === "string" && block.server.length > 0
2998
- ? block.server
2999
- : typeof block.name === "string" && block.name.length > 0
3000
- ? block.name
3001
- : "tool",
3002
- classification: "generic",
3003
- started: false,
3004
- };
3087
+ const existing = this.toolUseCache.get(id) ?? createDefaultToolUseCacheEntry(id, block);
3005
3088
  if (typeof block.name === "string" && block.name.length > 0) {
3006
3089
  existing.name = block.name;
3007
3090
  }
@@ -3225,37 +3308,47 @@ function normalizeHistoryBlocks(content) {
3225
3308
  }
3226
3309
  return null;
3227
3310
  }
3228
- export function convertClaudeHistoryEntry(entry, mapBlocks) {
3311
+ function convertClaudeHistoryEntryPreamble(entry) {
3229
3312
  if (entry.type === "system" && entry.subtype === "compact_boundary") {
3230
3313
  const compactMetadata = readCompactionMetadata(entry);
3231
- return [
3232
- {
3233
- type: "compaction",
3234
- status: "completed",
3235
- trigger: compactMetadata?.trigger === "manual" ? "manual" : "auto",
3236
- preTokens: compactMetadata?.preTokens,
3237
- },
3238
- ];
3314
+ return {
3315
+ shortCircuit: [
3316
+ {
3317
+ type: "compaction",
3318
+ status: "completed",
3319
+ trigger: compactMetadata?.trigger === "manual" ? "manual" : "auto",
3320
+ preTokens: compactMetadata?.preTokens,
3321
+ },
3322
+ ],
3323
+ };
3239
3324
  }
3240
3325
  const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(entry);
3241
3326
  if (taskNotificationItem) {
3242
- return [taskNotificationItem];
3327
+ return { shortCircuit: [taskNotificationItem] };
3243
3328
  }
3244
3329
  if (entry.isCompactSummary) {
3245
- return [];
3330
+ return { shortCircuit: [] };
3246
3331
  }
3247
3332
  if (entry.type === "user" && isSyntheticUserEntry(entry)) {
3248
- return [];
3333
+ return { shortCircuit: [] };
3249
3334
  }
3250
3335
  const message = entry?.message;
3251
3336
  if (!message || !("content" in message)) {
3252
- return [];
3337
+ return { shortCircuit: [] };
3253
3338
  }
3254
3339
  const content = message.content;
3255
3340
  if ((entry.type === "user" || entry.type === "assistant") &&
3256
3341
  isClaudeTranscriptNoiseContent(content)) {
3257
- return [];
3342
+ return { shortCircuit: [] };
3343
+ }
3344
+ return { proceed: { content } };
3345
+ }
3346
+ export function convertClaudeHistoryEntry(entry, mapBlocks) {
3347
+ const preamble = convertClaudeHistoryEntryPreamble(entry);
3348
+ if ("shortCircuit" in preamble) {
3349
+ return preamble.shortCircuit;
3258
3350
  }
3351
+ const { content } = preamble.proceed;
3259
3352
  const normalizedBlocks = normalizeHistoryBlocks(content);
3260
3353
  const contentValue = typeof content === "string" ? content : normalizedBlocks;
3261
3354
  const hasToolBlock = normalizedBlocks?.some((block) => hasToolLikeBlock(block)) ?? false;
@@ -3263,12 +3356,12 @@ export function convertClaudeHistoryEntry(entry, mapBlocks) {
3263
3356
  ? entry.uuid
3264
3357
  : null;
3265
3358
  if (entry.type === "user") {
3266
- const taskNotificationItem = mapTaskNotificationUserContentToToolCall({
3359
+ const userTaskNotificationItem = mapTaskNotificationUserContentToToolCall({
3267
3360
  content,
3268
3361
  messageId: userMessageId,
3269
3362
  });
3270
- if (taskNotificationItem) {
3271
- return [taskNotificationItem];
3363
+ if (userTaskNotificationItem) {
3364
+ return [userTaskNotificationItem];
3272
3365
  }
3273
3366
  }
3274
3367
  const timeline = [];
@@ -3357,41 +3450,68 @@ async function collectRecentClaudeSessions(root, limit) {
3357
3450
  catch {
3358
3451
  return [];
3359
3452
  }
3360
- const candidates = [];
3361
- for (const dirName of projectDirs) {
3453
+ const projectFileLists = await Promise.all(projectDirs.map(async (dirName) => {
3362
3454
  const projectPath = path.join(root, dirName);
3363
- let stats;
3364
3455
  try {
3365
- stats = await fsPromises.stat(projectPath);
3456
+ const stats = await fsPromises.stat(projectPath);
3457
+ if (!stats.isDirectory())
3458
+ return { projectPath, files: [] };
3459
+ const files = await fsPromises.readdir(projectPath);
3460
+ return { projectPath, files };
3366
3461
  }
3367
3462
  catch {
3368
- continue;
3463
+ return { projectPath, files: [] };
3369
3464
  }
3370
- if (!stats.isDirectory()) {
3371
- continue;
3372
- }
3373
- let files;
3465
+ }));
3466
+ const fileEntries = projectFileLists.flatMap(({ projectPath, files }) => files.filter((f) => f.endsWith(".jsonl")).map((f) => path.join(projectPath, f)));
3467
+ const statResults = await Promise.all(fileEntries.map(async (fullPath) => {
3374
3468
  try {
3375
- files = await fsPromises.readdir(projectPath);
3469
+ const fileStats = await fsPromises.stat(fullPath);
3470
+ return { path: fullPath, mtime: fileStats.mtime };
3376
3471
  }
3377
3472
  catch {
3378
- continue;
3473
+ return null;
3379
3474
  }
3380
- for (const file of files) {
3381
- if (!file.endsWith(".jsonl")) {
3382
- continue;
3383
- }
3384
- const fullPath = path.join(projectPath, file);
3385
- try {
3386
- const fileStats = await fsPromises.stat(fullPath);
3387
- candidates.push({ path: fullPath, mtime: fileStats.mtime });
3388
- }
3389
- catch {
3390
- // ignore stat errors for individual files
3475
+ }));
3476
+ const candidates = statResults.filter((entry) => entry !== null);
3477
+ return candidates.sort((a, b) => b.mtime.getTime() - a.mtime.getTime()).slice(0, limit);
3478
+ }
3479
+ function isFinishedAccumulator(acc) {
3480
+ return Boolean(acc.sessionId && acc.cwd && acc.title);
3481
+ }
3482
+ function applyClaudeSessionEntryToAccumulator(entryRaw, acc) {
3483
+ if (!entryRaw || typeof entryRaw !== "object") {
3484
+ return;
3485
+ }
3486
+ const entry = entryRaw;
3487
+ if (entry.isSidechain) {
3488
+ return;
3489
+ }
3490
+ if (entry.type === "user" && isSyntheticUserEntry(entry)) {
3491
+ return;
3492
+ }
3493
+ if (!acc.sessionId && typeof entry.sessionId === "string") {
3494
+ acc.sessionId = entry.sessionId;
3495
+ }
3496
+ if (!acc.cwd && typeof entry.cwd === "string") {
3497
+ acc.cwd = entry.cwd;
3498
+ }
3499
+ if (entry.type === "user" && entry.message) {
3500
+ const text = extractClaudeUserText(entry.message);
3501
+ if (text) {
3502
+ if (!acc.title) {
3503
+ acc.title = text;
3391
3504
  }
3505
+ acc.timeline.push({ type: "user_message", text });
3506
+ }
3507
+ return;
3508
+ }
3509
+ if (entry.type === "assistant" && entry.message) {
3510
+ const text = extractClaudeUserText(entry.message);
3511
+ if (text) {
3512
+ acc.timeline.push({ type: "assistant_message", text });
3392
3513
  }
3393
3514
  }
3394
- return candidates.sort((a, b) => b.mtime.getTime() - a.mtime.getTime()).slice(0, limit);
3395
3515
  }
3396
3516
  async function parseClaudeSessionDescriptor(filePath, mtime) {
3397
3517
  let content;
@@ -3401,10 +3521,12 @@ async function parseClaudeSessionDescriptor(filePath, mtime) {
3401
3521
  catch {
3402
3522
  return null;
3403
3523
  }
3404
- let sessionId = null;
3405
- let cwd = null;
3406
- let title = null;
3407
- const timeline = [];
3524
+ const acc = {
3525
+ sessionId: null,
3526
+ cwd: null,
3527
+ title: null,
3528
+ timeline: [],
3529
+ };
3408
3530
  for (const rawLine of content.split(/\r?\n/)) {
3409
3531
  const line = rawLine.trim();
3410
3532
  if (!line)
@@ -3416,37 +3538,12 @@ async function parseClaudeSessionDescriptor(filePath, mtime) {
3416
3538
  catch {
3417
3539
  continue;
3418
3540
  }
3419
- if (entry?.isSidechain) {
3420
- continue;
3421
- }
3422
- if (entry?.type === "user" && isSyntheticUserEntry(entry)) {
3423
- continue;
3424
- }
3425
- if (!sessionId && typeof entry.sessionId === "string") {
3426
- sessionId = entry.sessionId;
3427
- }
3428
- if (!cwd && typeof entry.cwd === "string") {
3429
- cwd = entry.cwd;
3430
- }
3431
- if (entry.type === "user" && entry.message) {
3432
- const text = extractClaudeUserText(entry.message);
3433
- if (text) {
3434
- if (!title) {
3435
- title = text;
3436
- }
3437
- timeline.push({ type: "user_message", text });
3438
- }
3439
- }
3440
- else if (entry.type === "assistant" && entry.message) {
3441
- const text = extractClaudeUserText(entry.message);
3442
- if (text) {
3443
- timeline.push({ type: "assistant_message", text });
3444
- }
3445
- }
3446
- if (sessionId && cwd && title) {
3541
+ applyClaudeSessionEntryToAccumulator(entry, acc);
3542
+ if (isFinishedAccumulator(acc)) {
3447
3543
  break;
3448
3544
  }
3449
3545
  }
3546
+ const { sessionId, cwd, title, timeline } = acc;
3450
3547
  if (!sessionId || !cwd) {
3451
3548
  return null;
3452
3549
  }
@@ -3469,10 +3566,11 @@ async function parseClaudeSessionDescriptor(filePath, mtime) {
3469
3566
  timeline,
3470
3567
  };
3471
3568
  }
3472
- function extractClaudeUserText(message) {
3473
- if (!message) {
3569
+ function extractClaudeUserText(messageRaw) {
3570
+ if (!messageRaw || typeof messageRaw !== "object") {
3474
3571
  return null;
3475
3572
  }
3573
+ const message = messageRaw;
3476
3574
  if (typeof message.content === "string") {
3477
3575
  const normalized = message.content.trim();
3478
3576
  return normalized && !isClaudeTranscriptNoiseText(normalized) ? normalized : null;
@@ -3483,7 +3581,9 @@ function extractClaudeUserText(message) {
3483
3581
  }
3484
3582
  if (Array.isArray(message.content)) {
3485
3583
  for (const block of message.content) {
3486
- if (block && typeof block.text === "string") {
3584
+ if (block &&
3585
+ typeof block === "object" &&
3586
+ typeof block.text === "string") {
3487
3587
  const normalized = block.text.trim();
3488
3588
  if (normalized && !isClaudeTranscriptNoiseText(normalized)) {
3489
3589
  return normalized;