@getpaseo/server 0.1.16 → 0.1.17

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 (346) hide show
  1. package/dist/scripts/daemon-runner.js +53 -14
  2. package/dist/scripts/daemon-runner.js.map +1 -1
  3. package/dist/scripts/dev-runner.js +9 -16
  4. package/dist/scripts/dev-runner.js.map +1 -1
  5. package/dist/scripts/supervisor.js +40 -13
  6. package/dist/scripts/supervisor.js.map +1 -1
  7. package/dist/server/client/daemon-client.d.ts +23 -3
  8. package/dist/server/client/daemon-client.d.ts.map +1 -1
  9. package/dist/server/client/daemon-client.js +81 -8
  10. package/dist/server/client/daemon-client.js.map +1 -1
  11. package/dist/server/server/agent/agent-manager.d.ts +3 -1
  12. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  13. package/dist/server/server/agent/agent-manager.js +146 -24
  14. package/dist/server/server/agent/agent-manager.js.map +1 -1
  15. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
  16. package/dist/server/server/agent/agent-metadata-generator.js +13 -4
  17. package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
  18. package/dist/server/server/agent/agent-response-loop.js +1 -1
  19. package/dist/server/server/agent/agent-response-loop.js.map +1 -1
  20. package/dist/server/server/agent/agent-sdk-types.d.ts +9 -0
  21. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  22. package/dist/server/server/agent/agent-sdk-types.js +11 -1
  23. package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
  24. package/dist/server/server/agent/agent-storage.d.ts +5 -1
  25. package/dist/server/server/agent/agent-storage.d.ts.map +1 -1
  26. package/dist/server/server/agent/agent-storage.js +41 -72
  27. package/dist/server/server/agent/agent-storage.js.map +1 -1
  28. package/dist/server/server/agent/agent-title-limits.d.ts +3 -0
  29. package/dist/server/server/agent/agent-title-limits.d.ts.map +1 -0
  30. package/dist/server/server/agent/agent-title-limits.js +3 -0
  31. package/dist/server/server/agent/agent-title-limits.js.map +1 -0
  32. package/dist/server/server/agent/providers/claude/model-catalog.d.ts +29 -0
  33. package/dist/server/server/agent/providers/claude/model-catalog.d.ts.map +1 -0
  34. package/dist/server/server/agent/providers/claude/model-catalog.js +70 -0
  35. package/dist/server/server/agent/providers/claude/model-catalog.js.map +1 -0
  36. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +44 -0
  37. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -0
  38. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +250 -0
  39. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -0
  40. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -1
  41. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +15 -0
  42. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
  43. package/dist/server/server/agent/providers/claude-agent.d.ts +3 -2
  44. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  45. package/dist/server/server/agent/providers/claude-agent.js +240 -106
  46. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  47. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
  48. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +81 -28
  49. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
  50. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  51. package/dist/server/server/agent/providers/codex-app-server-agent.js +31 -5
  52. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  53. package/dist/server/server/agent/providers/opencode-agent.d.ts +10 -1
  54. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  55. package/dist/server/server/agent/providers/opencode-agent.js +207 -176
  56. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  57. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +15 -0
  58. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  59. package/dist/server/server/agent/timeline-projection.d.ts +20 -0
  60. package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
  61. package/dist/server/server/agent/timeline-projection.js +73 -0
  62. package/dist/server/server/agent/timeline-projection.js.map +1 -1
  63. package/dist/server/server/bootstrap.d.ts +15 -0
  64. package/dist/server/server/bootstrap.d.ts.map +1 -1
  65. package/dist/server/server/bootstrap.js +27 -4
  66. package/dist/server/server/bootstrap.js.map +1 -1
  67. package/dist/server/server/file-download/token-store.d.ts +0 -1
  68. package/dist/server/server/file-download/token-store.d.ts.map +1 -1
  69. package/dist/server/server/file-download/token-store.js.map +1 -1
  70. package/dist/server/server/file-explorer/service.d.ts.map +1 -1
  71. package/dist/server/server/file-explorer/service.js +56 -36
  72. package/dist/server/server/file-explorer/service.js.map +1 -1
  73. package/dist/server/server/index.js +85 -29
  74. package/dist/server/server/index.js.map +1 -1
  75. package/dist/server/server/logger.d.ts +24 -3
  76. package/dist/server/server/logger.d.ts.map +1 -1
  77. package/dist/server/server/logger.js +157 -21
  78. package/dist/server/server/logger.js.map +1 -1
  79. package/dist/server/server/persisted-config.d.ts +86 -0
  80. package/dist/server/server/persisted-config.d.ts.map +1 -1
  81. package/dist/server/server/persisted-config.js +25 -3
  82. package/dist/server/server/persisted-config.js.map +1 -1
  83. package/dist/server/server/pid-lock.d.ts +6 -2
  84. package/dist/server/server/pid-lock.d.ts.map +1 -1
  85. package/dist/server/server/pid-lock.js +7 -10
  86. package/dist/server/server/pid-lock.js.map +1 -1
  87. package/dist/server/server/relay-transport.d.ts.map +1 -1
  88. package/dist/server/server/relay-transport.js +1 -0
  89. package/dist/server/server/relay-transport.js.map +1 -1
  90. package/dist/server/server/session.d.ts +57 -3
  91. package/dist/server/server/session.d.ts.map +1 -1
  92. package/dist/server/server/session.js +755 -182
  93. package/dist/server/server/session.js.map +1 -1
  94. package/dist/server/server/websocket-server.d.ts +16 -1
  95. package/dist/server/server/websocket-server.d.ts.map +1 -1
  96. package/dist/server/server/websocket-server.js +135 -9
  97. package/dist/server/server/websocket-server.js.map +1 -1
  98. package/dist/server/server/worktree-bootstrap.d.ts.map +1 -1
  99. package/dist/server/server/worktree-bootstrap.js +45 -2
  100. package/dist/server/server/worktree-bootstrap.js.map +1 -1
  101. package/dist/server/shared/messages.d.ts +2841 -541
  102. package/dist/server/shared/messages.d.ts.map +1 -1
  103. package/dist/server/shared/messages.js +99 -5
  104. package/dist/server/shared/messages.js.map +1 -1
  105. package/dist/server/shared/tool-call-display.d.ts.map +1 -1
  106. package/dist/server/shared/tool-call-display.js +3 -0
  107. package/dist/server/shared/tool-call-display.js.map +1 -1
  108. package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
  109. package/dist/server/terminal/terminal-manager.js +1 -13
  110. package/dist/server/terminal/terminal-manager.js.map +1 -1
  111. package/dist/server/terminal/terminal.d.ts.map +1 -1
  112. package/dist/server/terminal/terminal.js +29 -5
  113. package/dist/server/terminal/terminal.js.map +1 -1
  114. package/dist/server/utils/worktree.d.ts +1 -0
  115. package/dist/server/utils/worktree.d.ts.map +1 -1
  116. package/dist/server/utils/worktree.js +17 -2
  117. package/dist/server/utils/worktree.js.map +1 -1
  118. package/dist/src/server/agent/activity-curator.js +228 -0
  119. package/dist/src/server/agent/activity-curator.js.map +1 -0
  120. package/dist/src/server/agent/agent-manager.js +1712 -0
  121. package/dist/src/server/agent/agent-manager.js.map +1 -0
  122. package/dist/src/server/agent/agent-metadata-generator.js +163 -0
  123. package/dist/src/server/agent/agent-metadata-generator.js.map +1 -0
  124. package/dist/src/server/agent/agent-projections.js +262 -0
  125. package/dist/src/server/agent/agent-projections.js.map +1 -0
  126. package/dist/src/server/agent/agent-response-loop.js +304 -0
  127. package/dist/src/server/agent/agent-response-loop.js.map +1 -0
  128. package/dist/src/server/agent/agent-sdk-types.js +12 -0
  129. package/dist/src/server/agent/agent-sdk-types.js.map +1 -0
  130. package/dist/src/server/agent/agent-storage.js +299 -0
  131. package/dist/src/server/agent/agent-storage.js.map +1 -0
  132. package/dist/src/server/agent/agent-title-limits.js +3 -0
  133. package/dist/src/server/agent/agent-title-limits.js.map +1 -0
  134. package/dist/src/server/agent/audio-utils.js +19 -0
  135. package/dist/src/server/agent/audio-utils.js.map +1 -0
  136. package/dist/src/server/agent/dictation-debug.js +50 -0
  137. package/dist/src/server/agent/dictation-debug.js.map +1 -0
  138. package/dist/src/server/agent/mcp-server.js +787 -0
  139. package/dist/src/server/agent/mcp-server.js.map +1 -0
  140. package/dist/src/server/agent/orchestrator-instructions.js +51 -0
  141. package/dist/src/server/agent/orchestrator-instructions.js.map +1 -0
  142. package/dist/src/server/agent/pcm16-resampler.js +63 -0
  143. package/dist/src/server/agent/pcm16-resampler.js.map +1 -0
  144. package/dist/src/server/agent/provider-launch-config.js +83 -0
  145. package/dist/src/server/agent/provider-launch-config.js.map +1 -0
  146. package/dist/src/server/agent/provider-manifest.js +97 -0
  147. package/dist/src/server/agent/provider-manifest.js.map +1 -0
  148. package/dist/src/server/agent/provider-registry.js +45 -0
  149. package/dist/src/server/agent/provider-registry.js.map +1 -0
  150. package/dist/src/server/agent/providers/claude/model-catalog.js +70 -0
  151. package/dist/src/server/agent/providers/claude/model-catalog.js.map +1 -0
  152. package/dist/src/server/agent/providers/claude/task-notification-tool-call.js +250 -0
  153. package/dist/src/server/agent/providers/claude/task-notification-tool-call.js.map +1 -0
  154. package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js +109 -0
  155. package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -0
  156. package/dist/src/server/agent/providers/claude/tool-call-mapper.js +238 -0
  157. package/dist/src/server/agent/providers/claude/tool-call-mapper.js.map +1 -0
  158. package/dist/src/server/agent/providers/claude-agent.js +3747 -0
  159. package/dist/src/server/agent/providers/claude-agent.js.map +1 -0
  160. package/dist/src/server/agent/providers/codex/tool-call-detail-parser.js +104 -0
  161. package/dist/src/server/agent/providers/codex/tool-call-detail-parser.js.map +1 -0
  162. package/dist/src/server/agent/providers/codex/tool-call-mapper.js +720 -0
  163. package/dist/src/server/agent/providers/codex/tool-call-mapper.js.map +1 -0
  164. package/dist/src/server/agent/providers/codex-app-server-agent.js +2601 -0
  165. package/dist/src/server/agent/providers/codex-app-server-agent.js.map +1 -0
  166. package/dist/src/server/agent/providers/codex-rollout-timeline.js +487 -0
  167. package/dist/src/server/agent/providers/codex-rollout-timeline.js.map +1 -0
  168. package/dist/src/server/agent/providers/opencode/tool-call-detail-parser.js +39 -0
  169. package/dist/src/server/agent/providers/opencode/tool-call-detail-parser.js.map +1 -0
  170. package/dist/src/server/agent/providers/opencode/tool-call-mapper.js +151 -0
  171. package/dist/src/server/agent/providers/opencode/tool-call-mapper.js.map +1 -0
  172. package/dist/src/server/agent/providers/opencode-agent.js +905 -0
  173. package/dist/src/server/agent/providers/opencode-agent.js.map +1 -0
  174. package/dist/src/server/agent/providers/tool-call-detail-primitives.js +552 -0
  175. package/dist/src/server/agent/providers/tool-call-detail-primitives.js.map +1 -0
  176. package/dist/src/server/agent/providers/tool-call-mapper-utils.js +109 -0
  177. package/dist/src/server/agent/providers/tool-call-mapper-utils.js.map +1 -0
  178. package/dist/src/server/agent/recordings-debug.js +19 -0
  179. package/dist/src/server/agent/recordings-debug.js.map +1 -0
  180. package/dist/src/server/agent/stt-debug.js +33 -0
  181. package/dist/src/server/agent/stt-debug.js.map +1 -0
  182. package/dist/src/server/agent/stt-manager.js +233 -0
  183. package/dist/src/server/agent/stt-manager.js.map +1 -0
  184. package/dist/src/server/agent/timeline-append.js +27 -0
  185. package/dist/src/server/agent/timeline-append.js.map +1 -0
  186. package/dist/src/server/agent/timeline-projection.js +215 -0
  187. package/dist/src/server/agent/timeline-projection.js.map +1 -0
  188. package/dist/src/server/agent/tool-name-normalization.js +45 -0
  189. package/dist/src/server/agent/tool-name-normalization.js.map +1 -0
  190. package/dist/src/server/agent/tts-debug.js +24 -0
  191. package/dist/src/server/agent/tts-debug.js.map +1 -0
  192. package/dist/src/server/agent/tts-manager.js +249 -0
  193. package/dist/src/server/agent/tts-manager.js.map +1 -0
  194. package/dist/src/server/agent/wait-for-agent-tracker.js +53 -0
  195. package/dist/src/server/agent/wait-for-agent-tracker.js.map +1 -0
  196. package/dist/src/server/agent-attention-policy.js +40 -0
  197. package/dist/src/server/agent-attention-policy.js.map +1 -0
  198. package/dist/src/server/allowed-hosts.js +94 -0
  199. package/dist/src/server/allowed-hosts.js.map +1 -0
  200. package/dist/src/server/bootstrap.js +498 -0
  201. package/dist/src/server/bootstrap.js.map +1 -0
  202. package/dist/src/server/client-message-id.js +12 -0
  203. package/dist/src/server/client-message-id.js.map +1 -0
  204. package/dist/src/server/config.js +84 -0
  205. package/dist/src/server/config.js.map +1 -0
  206. package/dist/src/server/connection-offer.js +60 -0
  207. package/dist/src/server/connection-offer.js.map +1 -0
  208. package/dist/src/server/daemon-keypair.js +40 -0
  209. package/dist/src/server/daemon-keypair.js.map +1 -0
  210. package/dist/src/server/daemon-version.js +22 -0
  211. package/dist/src/server/daemon-version.js.map +1 -0
  212. package/dist/src/server/dictation/dictation-stream-manager.js +568 -0
  213. package/dist/src/server/dictation/dictation-stream-manager.js.map +1 -0
  214. package/dist/src/server/file-download/token-store.js +40 -0
  215. package/dist/src/server/file-download/token-store.js.map +1 -0
  216. package/dist/src/server/file-explorer/service.js +183 -0
  217. package/dist/src/server/file-explorer/service.js.map +1 -0
  218. package/dist/src/server/json-utils.js +45 -0
  219. package/dist/src/server/json-utils.js.map +1 -0
  220. package/dist/src/server/messages.js +29 -0
  221. package/dist/src/server/messages.js.map +1 -0
  222. package/dist/src/server/package-version.js +47 -0
  223. package/dist/src/server/package-version.js.map +1 -0
  224. package/dist/src/server/paseo-home.js +19 -0
  225. package/dist/src/server/paseo-home.js.map +1 -0
  226. package/dist/src/server/path-utils.js +20 -0
  227. package/dist/src/server/path-utils.js.map +1 -0
  228. package/dist/src/server/persisted-config.js +259 -0
  229. package/dist/src/server/persisted-config.js.map +1 -0
  230. package/dist/src/server/persistence-hooks.js +60 -0
  231. package/dist/src/server/persistence-hooks.js.map +1 -0
  232. package/dist/src/server/pid-lock.js +126 -0
  233. package/dist/src/server/pid-lock.js.map +1 -0
  234. package/dist/src/server/push/push-service.js +68 -0
  235. package/dist/src/server/push/push-service.js.map +1 -0
  236. package/dist/src/server/push/token-store.js +70 -0
  237. package/dist/src/server/push/token-store.js.map +1 -0
  238. package/dist/src/server/relay-transport.js +457 -0
  239. package/dist/src/server/relay-transport.js.map +1 -0
  240. package/dist/src/server/server-id.js +63 -0
  241. package/dist/src/server/server-id.js.map +1 -0
  242. package/dist/src/server/session.js +5947 -0
  243. package/dist/src/server/session.js.map +1 -0
  244. package/dist/src/server/speech/audio.js +101 -0
  245. package/dist/src/server/speech/audio.js.map +1 -0
  246. package/dist/src/server/speech/provider-resolver.js +7 -0
  247. package/dist/src/server/speech/provider-resolver.js.map +1 -0
  248. package/dist/src/server/speech/providers/local/config.js +83 -0
  249. package/dist/src/server/speech/providers/local/config.js.map +1 -0
  250. package/dist/src/server/speech/providers/local/models.js +17 -0
  251. package/dist/src/server/speech/providers/local/models.js.map +1 -0
  252. package/dist/src/server/speech/providers/local/pocket/pocket-tts-onnx.js +422 -0
  253. package/dist/src/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -0
  254. package/dist/src/server/speech/providers/local/runtime.js +253 -0
  255. package/dist/src/server/speech/providers/local/runtime.js.map +1 -0
  256. package/dist/src/server/speech/providers/local/sherpa/model-catalog.js +166 -0
  257. package/dist/src/server/speech/providers/local/sherpa/model-catalog.js.map +1 -0
  258. package/dist/src/server/speech/providers/local/sherpa/model-downloader.js +165 -0
  259. package/dist/src/server/speech/providers/local/sherpa/model-downloader.js.map +1 -0
  260. package/dist/src/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +68 -0
  261. package/dist/src/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -0
  262. package/dist/src/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +79 -0
  263. package/dist/src/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -0
  264. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-loader.js +11 -0
  265. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-loader.js.map +1 -0
  266. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +102 -0
  267. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -0
  268. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +131 -0
  269. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -0
  270. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +132 -0
  271. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -0
  272. package/dist/src/server/speech/providers/local/sherpa/sherpa-realtime-session.js +112 -0
  273. package/dist/src/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -0
  274. package/dist/src/server/speech/providers/local/sherpa/sherpa-stt.js +140 -0
  275. package/dist/src/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -0
  276. package/dist/src/server/speech/providers/local/sherpa/sherpa-tts.js +95 -0
  277. package/dist/src/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -0
  278. package/dist/src/server/speech/providers/openai/config.js +99 -0
  279. package/dist/src/server/speech/providers/openai/config.js.map +1 -0
  280. package/dist/src/server/speech/providers/openai/realtime-transcription-session.js +165 -0
  281. package/dist/src/server/speech/providers/openai/realtime-transcription-session.js.map +1 -0
  282. package/dist/src/server/speech/providers/openai/runtime.js +114 -0
  283. package/dist/src/server/speech/providers/openai/runtime.js.map +1 -0
  284. package/dist/src/server/speech/providers/openai/stt.js +208 -0
  285. package/dist/src/server/speech/providers/openai/stt.js.map +1 -0
  286. package/dist/src/server/speech/providers/openai/tts.js +46 -0
  287. package/dist/src/server/speech/providers/openai/tts.js.map +1 -0
  288. package/dist/src/server/speech/speech-config-resolver.js +85 -0
  289. package/dist/src/server/speech/speech-config-resolver.js.map +1 -0
  290. package/dist/src/server/speech/speech-provider.js +2 -0
  291. package/dist/src/server/speech/speech-provider.js.map +1 -0
  292. package/dist/src/server/speech/speech-runtime.js +497 -0
  293. package/dist/src/server/speech/speech-runtime.js.map +1 -0
  294. package/dist/src/server/speech/speech-types.js +8 -0
  295. package/dist/src/server/speech/speech-types.js.map +1 -0
  296. package/dist/src/server/utils/diff-highlighter.js +244 -0
  297. package/dist/src/server/utils/diff-highlighter.js.map +1 -0
  298. package/dist/src/server/utils/syntax-highlighter.js +145 -0
  299. package/dist/src/server/utils/syntax-highlighter.js.map +1 -0
  300. package/dist/src/server/voice-config.js +51 -0
  301. package/dist/src/server/voice-config.js.map +1 -0
  302. package/dist/src/server/voice-mcp-bridge-command.js +31 -0
  303. package/dist/src/server/voice-mcp-bridge-command.js.map +1 -0
  304. package/dist/src/server/voice-mcp-bridge.js +109 -0
  305. package/dist/src/server/voice-mcp-bridge.js.map +1 -0
  306. package/dist/src/server/voice-permission-policy.js +13 -0
  307. package/dist/src/server/voice-permission-policy.js.map +1 -0
  308. package/dist/src/server/voice-types.js +2 -0
  309. package/dist/src/server/voice-types.js.map +1 -0
  310. package/dist/src/server/websocket-server.js +967 -0
  311. package/dist/src/server/websocket-server.js.map +1 -0
  312. package/dist/src/server/worktree-bootstrap.js +497 -0
  313. package/dist/src/server/worktree-bootstrap.js.map +1 -0
  314. package/dist/src/shared/agent-attention-notification.js +130 -0
  315. package/dist/src/shared/agent-attention-notification.js.map +1 -0
  316. package/dist/src/shared/agent-lifecycle.js +8 -0
  317. package/dist/src/shared/agent-lifecycle.js.map +1 -0
  318. package/dist/src/shared/binary-mux.js +114 -0
  319. package/dist/src/shared/binary-mux.js.map +1 -0
  320. package/dist/src/shared/connection-offer.js +17 -0
  321. package/dist/src/shared/connection-offer.js.map +1 -0
  322. package/dist/src/shared/daemon-endpoints.js +113 -0
  323. package/dist/src/shared/daemon-endpoints.js.map +1 -0
  324. package/dist/src/shared/messages.js +2001 -0
  325. package/dist/src/shared/messages.js.map +1 -0
  326. package/dist/src/shared/path-utils.js +16 -0
  327. package/dist/src/shared/path-utils.js.map +1 -0
  328. package/dist/src/shared/tool-call-display.js +93 -0
  329. package/dist/src/shared/tool-call-display.js.map +1 -0
  330. package/dist/src/terminal/terminal-manager.js +136 -0
  331. package/dist/src/terminal/terminal-manager.js.map +1 -0
  332. package/dist/src/terminal/terminal.js +410 -0
  333. package/dist/src/terminal/terminal.js.map +1 -0
  334. package/dist/src/utils/checkout-git.js +1397 -0
  335. package/dist/src/utils/checkout-git.js.map +1 -0
  336. package/dist/src/utils/directory-suggestions.js +655 -0
  337. package/dist/src/utils/directory-suggestions.js.map +1 -0
  338. package/dist/src/utils/path.js +15 -0
  339. package/dist/src/utils/path.js.map +1 -0
  340. package/dist/src/utils/project-icon.js +391 -0
  341. package/dist/src/utils/project-icon.js.map +1 -0
  342. package/dist/src/utils/worktree-metadata.js +116 -0
  343. package/dist/src/utils/worktree-metadata.js.map +1 -0
  344. package/dist/src/utils/worktree.js +741 -0
  345. package/dist/src/utils/worktree.js.map +1 -0
  346. package/package.json +14 -6
@@ -6,23 +6,16 @@ import os from "node:os";
6
6
  import path from "node:path";
7
7
  import { query, } from "@anthropic-ai/claude-agent-sdk";
8
8
  import { mapClaudeCanceledToolCall, mapClaudeCompletedToolCall, mapClaudeFailedToolCall, mapClaudeRunningToolCall, } from "./claude/tool-call-mapper.js";
9
+ import { isTaskNotificationUserContent, mapTaskNotificationSystemRecordToToolCall, mapTaskNotificationUserContentToToolCall, } from "./claude/task-notification-tool-call.js";
10
+ import { buildClaudeModelFamilyAliases, buildClaudeSelectableModelIds, listClaudeCatalogModels, } from "./claude/model-catalog.js";
9
11
  import { buildToolCallDisplayModel } from "../../../shared/tool-call-display.js";
10
12
  import { applyProviderEnv, isProviderCommandAvailable, } from "../provider-launch-config.js";
11
13
  import { getOrchestratorModeInstructions } from "../orchestrator-instructions.js";
12
14
  const fsPromises = promises;
13
- function normalizeClaudeModelLabel(model) {
14
- const fallback = model.displayName?.trim() || model.value;
15
- const prefix = model.description?.split(/[·•]/)[0]?.trim() || "";
16
- if (!prefix)
17
- return fallback;
18
- // Prefer concrete versioned labels from description (e.g. "Opus 4.6",
19
- // "Sonnet 4.5"), especially when displayName is generic like
20
- // "Default (recommended)".
21
- if (/\d/.test(prefix)) {
22
- return prefix;
23
- }
24
- return fallback;
25
- }
15
+ const CLAUDE_SETTING_SOURCES = [
16
+ "user",
17
+ "project",
18
+ ];
26
19
  function normalizeModelIdCandidate(modelId) {
27
20
  if (typeof modelId !== "string") {
28
21
  return null;
@@ -37,6 +30,28 @@ function pickSupportedModelId(supportedModelIds, candidate) {
37
30
  }
38
31
  return supportedModelIds.has(normalizedCandidate) ? normalizedCandidate : null;
39
32
  }
33
+ function inferClaudeModelFamilyFromText(text) {
34
+ if (typeof text !== "string") {
35
+ return null;
36
+ }
37
+ const lowerText = text.toLowerCase();
38
+ if (lowerText.includes("sonnet")) {
39
+ return "sonnet";
40
+ }
41
+ if (lowerText.includes("opus")) {
42
+ return "opus";
43
+ }
44
+ if (lowerText.includes("haiku")) {
45
+ return "haiku";
46
+ }
47
+ return null;
48
+ }
49
+ function pickFamilyAliasModelId(familyAliases, family) {
50
+ if (!familyAliases) {
51
+ return null;
52
+ }
53
+ return normalizeModelIdCandidate(familyAliases.get(family) ?? null);
54
+ }
40
55
  export function normalizeClaudeRuntimeModelId(options) {
41
56
  const runtimeModel = options.runtimeModelId.trim();
42
57
  if (!runtimeModel) {
@@ -46,31 +61,43 @@ export function normalizeClaudeRuntimeModelId(options) {
46
61
  if (!supportedModelIds || supportedModelIds.size === 0) {
47
62
  return runtimeModel;
48
63
  }
49
- const lowerRuntimeModel = runtimeModel.toLowerCase();
50
- if (lowerRuntimeModel.includes("sonnet")) {
64
+ if (supportedModelIds.has(runtimeModel)) {
65
+ return runtimeModel;
66
+ }
67
+ const runtimeFamily = inferClaudeModelFamilyFromText(runtimeModel);
68
+ const familyAlias = runtimeFamily
69
+ ? pickFamilyAliasModelId(options.supportedModelFamilyAliases, runtimeFamily)
70
+ : null;
71
+ if (runtimeFamily === "sonnet") {
51
72
  const explicitSonnet = pickSupportedModelId(supportedModelIds, "sonnet");
52
73
  if (explicitSonnet) {
53
74
  return explicitSonnet;
54
75
  }
76
+ if (familyAlias && supportedModelIds.has(familyAlias)) {
77
+ return familyAlias;
78
+ }
55
79
  const defaultAlias = pickSupportedModelId(supportedModelIds, "default");
56
80
  if (defaultAlias) {
57
81
  return defaultAlias;
58
82
  }
59
83
  }
60
- if (lowerRuntimeModel.includes("opus")) {
84
+ if (runtimeFamily === "opus") {
61
85
  const alias = pickSupportedModelId(supportedModelIds, "opus");
62
86
  if (alias) {
63
87
  return alias;
64
88
  }
89
+ if (familyAlias && supportedModelIds.has(familyAlias)) {
90
+ return familyAlias;
91
+ }
65
92
  }
66
- if (lowerRuntimeModel.includes("haiku")) {
93
+ if (runtimeFamily === "haiku") {
67
94
  const alias = pickSupportedModelId(supportedModelIds, "haiku");
68
95
  if (alias) {
69
96
  return alias;
70
97
  }
71
- }
72
- if (supportedModelIds.has(runtimeModel)) {
73
- return runtimeModel;
98
+ if (familyAlias && supportedModelIds.has(familyAlias)) {
99
+ return familyAlias;
100
+ }
74
101
  }
75
102
  const configuredModelId = pickSupportedModelId(supportedModelIds, options.configuredModelId);
76
103
  if (configuredModelId) {
@@ -80,6 +107,15 @@ export function normalizeClaudeRuntimeModelId(options) {
80
107
  if (currentModelId) {
81
108
  return currentModelId;
82
109
  }
110
+ // If Claude reports a concrete family ID we can't map directly, prefer the
111
+ // provider default alias for unconfigured sessions so UI model/thinking state
112
+ // can still reconcile against the current model catalog.
113
+ const defaultAlias = pickSupportedModelId(supportedModelIds, "default");
114
+ const hasConfiguredModel = normalizeModelIdCandidate(options.configuredModelId) !== null;
115
+ const hasCurrentModel = normalizeModelIdCandidate(options.currentModelId) !== null;
116
+ if (runtimeFamily && defaultAlias && !hasConfiguredModel && !hasCurrentModel) {
117
+ return defaultAlias;
118
+ }
83
119
  return runtimeModel;
84
120
  }
85
121
  const CLAUDE_CAPABILITIES = {
@@ -172,6 +208,7 @@ function applyRuntimeSettingsToClaudeOptions(options, runtimeSettings) {
172
208
  },
173
209
  };
174
210
  }
211
+ const MAX_RECENT_STDERR_CHARS = 4000;
175
212
  function summarizeClaudeOptionsForLog(options) {
176
213
  const systemPromptRaw = options.systemPrompt;
177
214
  const systemPromptSummary = (() => {
@@ -860,8 +897,17 @@ function isMetadataOnlySdkMessage(message) {
860
897
  if (message.type !== "user") {
861
898
  return false;
862
899
  }
900
+ if (isSyntheticUserEntry(message)) {
901
+ return true;
902
+ }
863
903
  return isTaskNotificationUserContent(message.message?.content);
864
904
  }
905
+ function isSyntheticUserEntry(entry) {
906
+ if (!entry || typeof entry !== "object") {
907
+ return false;
908
+ }
909
+ return entry.isSynthetic === true;
910
+ }
865
911
  export function readEventIdentifiers(message) {
866
912
  const root = message;
867
913
  const messageType = readTrimmedString(root.type);
@@ -889,23 +935,6 @@ export function readEventIdentifiers(message) {
889
935
  null,
890
936
  };
891
937
  }
892
- function isTaskNotificationUserContent(content) {
893
- if (typeof content === "string") {
894
- return content.includes("<task-notification>");
895
- }
896
- if (!Array.isArray(content)) {
897
- return false;
898
- }
899
- for (const block of content) {
900
- if (block &&
901
- typeof block === "object" &&
902
- typeof block.text === "string" &&
903
- block.text.includes("<task-notification>")) {
904
- return true;
905
- }
906
- }
907
- return false;
908
- }
909
938
  export class ClaudeAgentClient {
910
939
  constructor(options) {
911
940
  this.provider = "claude";
@@ -920,9 +949,6 @@ export class ClaudeAgentClient {
920
949
  this.claudePath = null;
921
950
  }
922
951
  }
923
- applyRuntimeSettings(options) {
924
- return applyRuntimeSettingsToClaudeOptions(options, this.runtimeSettings);
925
- }
926
952
  async createSession(config) {
927
953
  const claudeConfig = this.assertConfig(config);
928
954
  return new ClaudeAgentSession(claudeConfig, {
@@ -948,45 +974,8 @@ export class ClaudeAgentClient {
948
974
  logger: this.logger,
949
975
  });
950
976
  }
951
- async listModels(options) {
952
- const prompt = (async function* empty() { })();
953
- const claudeOptions = {
954
- cwd: options?.cwd ?? process.cwd(),
955
- permissionMode: "plan",
956
- includePartialMessages: false,
957
- ...(this.claudePath ? { pathToClaudeCodeExecutable: this.claudePath } : {}),
958
- };
959
- const claudeQuery = query({
960
- prompt,
961
- options: this.applyRuntimeSettings(claudeOptions),
962
- });
963
- try {
964
- const models = await claudeQuery.supportedModels();
965
- return models.map((model) => ({
966
- provider: "claude",
967
- id: model.value,
968
- label: normalizeClaudeModelLabel(model),
969
- description: model.description,
970
- thinkingOptions: [
971
- { id: "off", label: "Off", isDefault: true },
972
- { id: "on", label: "On" },
973
- ],
974
- defaultThinkingOptionId: "off",
975
- metadata: {
976
- description: model.description,
977
- },
978
- }));
979
- }
980
- finally {
981
- if (typeof claudeQuery.return === "function") {
982
- try {
983
- await claudeQuery.return();
984
- }
985
- catch {
986
- // ignore shutdown errors
987
- }
988
- }
989
- }
977
+ async listModels(_options) {
978
+ return listClaudeCatalogModels();
990
979
  }
991
980
  async listPersistedAgents(options) {
992
981
  const configDir = process.env.CLAUDE_CONFIG_DIR ?? path.join(os.homedir(), ".claude");
@@ -1048,7 +1037,8 @@ class ClaudeAgentSession {
1048
1037
  this.activeTurnPromise = null;
1049
1038
  this.cachedRuntimeInfo = null;
1050
1039
  this.lastOptionsModel = null;
1051
- this.selectableModelIds = null;
1040
+ this.selectableModelIds = buildClaudeSelectableModelIds();
1041
+ this.selectableModelFamilyAliases = buildClaudeModelFamilyAliases();
1052
1042
  this.activeSidechains = new Map();
1053
1043
  this.compacting = false;
1054
1044
  this.queryPumpPromise = null;
@@ -1056,6 +1046,7 @@ class ClaudeAgentSession {
1056
1046
  this.userMessageIds = [];
1057
1047
  this.localUserMessageIds = new Set();
1058
1048
  this.suppressLocalReplayActivity = false;
1049
+ this.recentStderr = "";
1059
1050
  this.closed = false;
1060
1051
  this.handlePermissionRequest = async (toolName, input, options) => {
1061
1052
  const requestId = `permission-${randomUUID()}`;
@@ -1236,6 +1227,7 @@ class ClaudeAgentSession {
1236
1227
  this.activeForegroundTurn = foregroundTurn;
1237
1228
  this.preReplayMetadataSeen = false;
1238
1229
  this.transitionTurnState("foreground", "foreground stream started");
1230
+ this.clearRecentStderr();
1239
1231
  let finishedNaturally = false;
1240
1232
  let cancelIssued = false;
1241
1233
  let queueDrainedWithoutTerminal = false;
@@ -1458,6 +1450,13 @@ class ClaudeAgentSession {
1458
1450
  return this.persistence;
1459
1451
  }
1460
1452
  async close() {
1453
+ this.logger.trace({
1454
+ claudeSessionId: this.claudeSessionId,
1455
+ turnState: this.turnState,
1456
+ hasQuery: Boolean(this.query),
1457
+ hasInput: Boolean(this.input),
1458
+ hasActiveForegroundTurn: Boolean(this.activeForegroundTurn),
1459
+ }, "Claude session close: start");
1461
1460
  this.closed = true;
1462
1461
  this.rejectAllPendingPermissions(new Error("Claude session closed"));
1463
1462
  this.cancelCurrentTurn?.();
@@ -1474,6 +1473,7 @@ class ClaudeAgentSession {
1474
1473
  await this.awaitWithTimeout(this.query?.return?.(), "close query return");
1475
1474
  this.query = null;
1476
1475
  this.input = null;
1476
+ this.logger.trace({ claudeSessionId: this.claudeSessionId, turnState: this.turnState }, "Claude session close: completed");
1477
1477
  }
1478
1478
  async listCommands() {
1479
1479
  const q = await this.ensureQuery();
@@ -1708,20 +1708,6 @@ class ClaudeAgentSession {
1708
1708
  }
1709
1709
  this.userMessageIds.push(messageId);
1710
1710
  }
1711
- async primeSelectableModelIds(query) {
1712
- try {
1713
- const models = await query.supportedModels();
1714
- const ids = models
1715
- .map((model) => model.value?.trim())
1716
- .filter((id) => typeof id === "string" && id.length > 0);
1717
- this.selectableModelIds = new Set(ids);
1718
- this.logger.debug({ modelIds: ids }, "Primed Claude selectable model IDs");
1719
- }
1720
- catch (error) {
1721
- this.selectableModelIds = null;
1722
- this.logger.warn({ err: error }, "Failed to prime Claude selectable model IDs");
1723
- }
1724
- }
1725
1711
  async ensureQuery() {
1726
1712
  if (this.query && !this.queryRestartNeeded) {
1727
1713
  return this.query;
@@ -1741,15 +1727,19 @@ class ClaudeAgentSession {
1741
1727
  this.logger.debug({ options: summarizeClaudeOptionsForLog(options) }, "claude query");
1742
1728
  this.input = input;
1743
1729
  this.query = query({ prompt: input, options });
1744
- // Do not block query readiness on control-plane calls. We need `next()` to
1745
- // start immediately so autonomous wake events are not missed between turns.
1746
- void this.awaitWithTimeout(this.primeSelectableModelIds(this.query), "prime selectable model ids");
1730
+ // Do not kick off background control-plane queries here. Methods like
1731
+ // supportedCommands()/setPermissionMode() may execute immediately after
1732
+ // ensureQuery() (for listCommands()/setMode()), and sharing the same query
1733
+ // control plane can cause those calls to wait behind supportedModels().
1747
1734
  return this.query;
1748
1735
  }
1749
1736
  async awaitWithTimeout(promise, label) {
1750
1737
  if (!promise) {
1738
+ this.logger.trace({ label }, "Claude query operation skipped (no promise)");
1751
1739
  return;
1752
1740
  }
1741
+ const startedAt = Date.now();
1742
+ this.logger.trace({ label }, "Claude query operation wait start");
1753
1743
  try {
1754
1744
  await Promise.race([
1755
1745
  promise,
@@ -1757,6 +1747,7 @@ class ClaudeAgentSession {
1757
1747
  setTimeout(() => reject(new Error("timeout")), 3000);
1758
1748
  }),
1759
1749
  ]);
1750
+ this.logger.trace({ label, durationMs: Date.now() - startedAt }, "Claude query operation settled");
1760
1751
  }
1761
1752
  catch (error) {
1762
1753
  this.logger.warn({ err: error, label }, "Claude query operation did not settle cleanly");
@@ -1794,8 +1785,9 @@ class ClaudeAgentSession {
1794
1785
  preset: "claude_code",
1795
1786
  append: appendedSystemPrompt,
1796
1787
  },
1797
- settingSources: ["user", "project"],
1788
+ settingSources: CLAUDE_SETTING_SOURCES,
1798
1789
  stderr: (data) => {
1790
+ this.captureStderr(data);
1799
1791
  this.logger.error({ stderr: data.trim() }, "Claude Agent SDK stderr");
1800
1792
  },
1801
1793
  env: {
@@ -1907,17 +1899,53 @@ class ClaudeAgentSession {
1907
1899
  this.transitionTurnState("idle", reason);
1908
1900
  }
1909
1901
  failRun(run, errorMessage) {
1910
- this.emitRunEvent(run, {
1902
+ this.emitRunEvent(run, this.buildTurnFailedEvent(errorMessage));
1903
+ }
1904
+ buildTurnFailedEvent(errorMessage) {
1905
+ const normalized = errorMessage.trim() || "Claude run failed";
1906
+ const exitCodeMatch = normalized.match(/\bcode\s+(\d+)\b/i);
1907
+ const code = exitCodeMatch ? exitCodeMatch[1] : undefined;
1908
+ const diagnostic = this.getRecentStderrDiagnostic();
1909
+ return {
1911
1910
  type: "turn_failed",
1912
1911
  provider: "claude",
1913
- error: errorMessage,
1914
- });
1912
+ error: normalized,
1913
+ ...(code ? { code } : {}),
1914
+ ...(diagnostic ? { diagnostic } : {}),
1915
+ };
1916
+ }
1917
+ captureStderr(data) {
1918
+ const text = data.trim();
1919
+ if (!text) {
1920
+ return;
1921
+ }
1922
+ const combined = this.recentStderr ? `${this.recentStderr}\n${text}` : text;
1923
+ this.recentStderr = combined.slice(-MAX_RECENT_STDERR_CHARS);
1924
+ }
1925
+ clearRecentStderr() {
1926
+ this.recentStderr = "";
1927
+ }
1928
+ getRecentStderrDiagnostic() {
1929
+ const text = this.recentStderr.trim();
1930
+ return text.length > 0 ? text : undefined;
1915
1931
  }
1916
1932
  cancelRun(run, event) {
1917
1933
  this.flushPendingToolCalls();
1918
1934
  this.emitRunEvent(run, event);
1919
1935
  }
1920
1936
  emitRunEvent(run, event) {
1937
+ if (event.type === "turn_started" ||
1938
+ event.type === "turn_completed" ||
1939
+ event.type === "turn_failed" ||
1940
+ event.type === "turn_canceled") {
1941
+ this.logger.trace({
1942
+ runId: run.id,
1943
+ owner: run.owner,
1944
+ runState: run.state,
1945
+ eventType: event.type,
1946
+ routedTo: run.owner === "foreground" && run.queue ? "foreground_queue" : "live_queue",
1947
+ }, "Claude run event emitted");
1948
+ }
1921
1949
  if (run.owner === "foreground" && run.queue) {
1922
1950
  run.queue.push(event);
1923
1951
  if (event.type === "turn_completed" ||
@@ -1948,6 +1976,13 @@ class ClaudeAgentSession {
1948
1976
  this.activeForegroundTurn = null;
1949
1977
  this.preReplayMetadataSeen = false;
1950
1978
  }
1979
+ this.logger.trace({
1980
+ runId: run.id,
1981
+ owner: run.owner,
1982
+ eventType: event.type,
1983
+ runState: run.state,
1984
+ hasActiveForegroundTurn: Boolean(this.activeForegroundTurn),
1985
+ }, "Claude run terminal event handled");
1951
1986
  this.transitionTurnStateFromActiveRuns(`run ${run.id} terminal`);
1952
1987
  }
1953
1988
  async transitionAutonomousToForeground() {
@@ -2056,6 +2091,9 @@ class ClaudeAgentSession {
2056
2091
  // first turn cannot be stranded in autonomous fallback. If metadata churn
2057
2092
  // was observed pre-replay, stay conservative and wait for replay.
2058
2093
  if (!run.promptReplaySeen) {
2094
+ if (this.isToolUseBoundaryStreamEvent(input.message)) {
2095
+ return true;
2096
+ }
2059
2097
  // Keep pre-replay result events with the foreground run so stale result
2060
2098
  // bursts cannot consume autonomous wake reservations.
2061
2099
  if (message.type === "result") {
@@ -2074,6 +2112,19 @@ class ClaudeAgentSession {
2074
2112
  }
2075
2113
  return true;
2076
2114
  }
2115
+ isToolUseBoundaryStreamEvent(message) {
2116
+ if (message.type !== "stream_event") {
2117
+ return false;
2118
+ }
2119
+ const event = message.event;
2120
+ if (!event || event.type !== "message_delta") {
2121
+ return false;
2122
+ }
2123
+ const delta = "delta" in event && event.delta && typeof event.delta === "object"
2124
+ ? event.delta
2125
+ : null;
2126
+ return delta?.stop_reason === "tool_use";
2127
+ }
2077
2128
  notePreReplayMetadata(message) {
2078
2129
  if (this.turnState !== "foreground") {
2079
2130
  return;
@@ -2153,6 +2204,7 @@ class ClaudeAgentSession {
2153
2204
  let next;
2154
2205
  try {
2155
2206
  next = await q.next();
2207
+ this.logger.info({ claudeSessionId: this.claudeSessionId, next }, "Claude query pump raw next()");
2156
2208
  }
2157
2209
  catch (error) {
2158
2210
  this.logger.warn({ err: error }, "Claude query pump next() failed");
@@ -2169,6 +2221,10 @@ class ClaudeAgentSession {
2169
2221
  continue;
2170
2222
  }
2171
2223
  if (next.done) {
2224
+ this.logger.trace({
2225
+ claudeSessionId: this.claudeSessionId,
2226
+ activeRunCount: this.runTracker.listActiveRuns().length,
2227
+ }, "Claude query pump next() returned done");
2172
2228
  this.input?.end();
2173
2229
  await this.awaitWithTimeout(q.return?.(), "query pump return on done");
2174
2230
  if (this.query === q) {
@@ -2211,6 +2267,15 @@ class ClaudeAgentSession {
2211
2267
  run: route.run,
2212
2268
  message,
2213
2269
  });
2270
+ this.logger.trace({
2271
+ claudeSessionId: this.claudeSessionId,
2272
+ messageType: message.type,
2273
+ routeReason: route.reason,
2274
+ runId: route.run?.id ?? null,
2275
+ runOwner: route.run?.owner ?? null,
2276
+ suppressTerminalEvents,
2277
+ metadataOnly,
2278
+ }, "Claude query pump routed SDK message");
2214
2279
  if (route.run) {
2215
2280
  this.transitionTurnStateFromActiveRuns(`routed via ${route.reason}`);
2216
2281
  this.runTracker.bindIdentifiers(route.run, identifiers);
@@ -2262,6 +2327,13 @@ class ClaudeAgentSession {
2262
2327
  // Pre-replay success results are stale in practice (leftover from an
2263
2328
  // earlier query segment) and must not end the current foreground run.
2264
2329
  if (resultSubtype === "success") {
2330
+ this.logger.trace({
2331
+ runId: run.id,
2332
+ runOwner: run.owner,
2333
+ runState: run.state,
2334
+ promptReplaySeen: run.promptReplaySeen,
2335
+ resultSubtype,
2336
+ }, "Suppressing pre-replay foreground success result terminal event");
2265
2337
  return true;
2266
2338
  }
2267
2339
  // For non-success results, keep the metadata-churn guard to avoid
@@ -2274,6 +2346,7 @@ class ClaudeAgentSession {
2274
2346
  }
2275
2347
  }
2276
2348
  updateRunLifecycleForMessage(run, message, identifiers) {
2349
+ const previousState = run.state;
2277
2350
  if (message.type === "user" &&
2278
2351
  identifiers.messageId &&
2279
2352
  run.messageIds.has(identifiers.messageId)) {
@@ -2291,8 +2364,22 @@ class ClaudeAgentSession {
2291
2364
  }
2292
2365
  if (message.type === "result") {
2293
2366
  this.runTracker.transition(run, "finalizing");
2367
+ }
2368
+ else {
2294
2369
  return;
2295
2370
  }
2371
+ if (run.state !== previousState) {
2372
+ this.logger.trace({
2373
+ runId: run.id,
2374
+ owner: run.owner,
2375
+ messageType: message.type,
2376
+ previousState,
2377
+ nextState: run.state,
2378
+ taskId: identifiers.taskId,
2379
+ parentMessageId: identifiers.parentMessageId,
2380
+ messageId: identifiers.messageId,
2381
+ }, "Updated Claude run lifecycle from SDK message");
2382
+ }
2296
2383
  }
2297
2384
  shouldSuppressLocalReplayActivity(message) {
2298
2385
  const localReplay = this.isLocalReplayUserMessage(message);
@@ -2631,8 +2718,21 @@ class ClaudeAgentSession {
2631
2718
  provider: "claude",
2632
2719
  });
2633
2720
  }
2721
+ else if (message.subtype === "task_notification") {
2722
+ const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(message);
2723
+ if (taskNotificationItem) {
2724
+ events.push({
2725
+ type: "timeline",
2726
+ item: taskNotificationItem,
2727
+ provider: "claude",
2728
+ });
2729
+ }
2730
+ }
2634
2731
  break;
2635
2732
  case "user": {
2733
+ if (isSyntheticUserEntry(message)) {
2734
+ break;
2735
+ }
2636
2736
  if (this.compacting) {
2637
2737
  this.compacting = false;
2638
2738
  break;
@@ -2642,6 +2742,18 @@ class ClaudeAgentSession {
2642
2742
  : undefined;
2643
2743
  this.rememberUserMessageId(messageId);
2644
2744
  const content = message.message?.content;
2745
+ const taskNotificationItem = mapTaskNotificationUserContentToToolCall({
2746
+ content,
2747
+ messageId,
2748
+ });
2749
+ if (taskNotificationItem) {
2750
+ events.push({
2751
+ type: "timeline",
2752
+ item: taskNotificationItem,
2753
+ provider: "claude",
2754
+ });
2755
+ break;
2756
+ }
2645
2757
  if (typeof content === "string" && content.length > 0) {
2646
2758
  // String content from user messages (e.g., local command output)
2647
2759
  events.push({
@@ -2702,7 +2814,7 @@ class ClaudeAgentSession {
2702
2814
  const errorMessage = "errors" in message && Array.isArray(message.errors) && message.errors.length > 0
2703
2815
  ? message.errors.join("\n")
2704
2816
  : "Claude run failed";
2705
- events.push({ type: "turn_failed", provider: "claude", error: errorMessage });
2817
+ events.push(this.buildTurnFailedEvent(errorMessage));
2706
2818
  }
2707
2819
  break;
2708
2820
  }
@@ -2779,6 +2891,7 @@ class ClaudeAgentSession {
2779
2891
  const normalizedModel = normalizeClaudeRuntimeModelId({
2780
2892
  runtimeModelId: message.model,
2781
2893
  supportedModelIds: this.selectableModelIds,
2894
+ supportedModelFamilyAliases: this.selectableModelFamilyAliases,
2782
2895
  configuredModelId: this.config.model ?? null,
2783
2896
  currentModelId: this.lastOptionsModel,
2784
2897
  });
@@ -3379,9 +3492,18 @@ export function convertClaudeHistoryEntry(entry, mapBlocks) {
3379
3492
  preTokens: compactMetadata?.preTokens,
3380
3493
  }];
3381
3494
  }
3495
+ if (entry.type === "system") {
3496
+ const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(entry);
3497
+ if (taskNotificationItem) {
3498
+ return [taskNotificationItem];
3499
+ }
3500
+ }
3382
3501
  if (entry.isCompactSummary) {
3383
3502
  return [];
3384
3503
  }
3504
+ if (entry.type === "user" && isSyntheticUserEntry(entry)) {
3505
+ return [];
3506
+ }
3385
3507
  const message = entry?.message;
3386
3508
  if (!message || !("content" in message)) {
3387
3509
  return [];
@@ -3392,17 +3514,26 @@ export function convertClaudeHistoryEntry(entry, mapBlocks) {
3392
3514
  ? content
3393
3515
  : normalizedBlocks;
3394
3516
  const hasToolBlock = normalizedBlocks?.some((block) => hasToolLikeBlock(block)) ?? false;
3517
+ const userMessageId = entry.type === "user" && typeof entry.uuid === "string" && entry.uuid.length > 0
3518
+ ? entry.uuid
3519
+ : null;
3520
+ if (entry.type === "user") {
3521
+ const taskNotificationItem = mapTaskNotificationUserContentToToolCall({
3522
+ content,
3523
+ messageId: userMessageId,
3524
+ });
3525
+ if (taskNotificationItem) {
3526
+ return [taskNotificationItem];
3527
+ }
3528
+ }
3395
3529
  const timeline = [];
3396
3530
  if (entry.type === "user") {
3397
3531
  const text = extractUserMessageText(content);
3398
3532
  if (text) {
3399
- const messageId = typeof entry.uuid === "string" && entry.uuid.length > 0
3400
- ? entry.uuid
3401
- : undefined;
3402
3533
  timeline.push({
3403
3534
  type: "user_message",
3404
3535
  text,
3405
- ...(messageId ? { messageId } : {}),
3536
+ ...(userMessageId ? { messageId: userMessageId } : {}),
3406
3537
  });
3407
3538
  }
3408
3539
  }
@@ -3544,6 +3675,9 @@ async function parseClaudeSessionDescriptor(filePath, mtime) {
3544
3675
  if (entry?.isSidechain) {
3545
3676
  continue;
3546
3677
  }
3678
+ if (entry?.type === "user" && isSyntheticUserEntry(entry)) {
3679
+ continue;
3680
+ }
3547
3681
  if (!sessionId && typeof entry.sessionId === "string") {
3548
3682
  sessionId = entry.sessionId;
3549
3683
  }