@ck123pm/paseo-server 0.1.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1077) hide show
  1. package/.env.example +23 -0
  2. package/README.md +111 -0
  3. package/dist/scripts/dev-runner.js +49 -0
  4. package/dist/scripts/dev-runner.js.map +1 -0
  5. package/dist/scripts/mcp-stdio-socket-bridge-cli.mjs +62 -0
  6. package/dist/scripts/supervisor-entrypoint.js +126 -0
  7. package/dist/scripts/supervisor-entrypoint.js.map +1 -0
  8. package/dist/scripts/supervisor-log-config.js +31 -0
  9. package/dist/scripts/supervisor-log-config.js.map +1 -0
  10. package/dist/scripts/supervisor.js +213 -0
  11. package/dist/scripts/supervisor.js.map +1 -0
  12. package/dist/server/client/daemon-client-relay-e2ee-transport.d.ts +8 -0
  13. package/dist/server/client/daemon-client-relay-e2ee-transport.d.ts.map +1 -0
  14. package/dist/server/client/daemon-client-relay-e2ee-transport.js +161 -0
  15. package/dist/server/client/daemon-client-relay-e2ee-transport.js.map +1 -0
  16. package/dist/server/client/daemon-client-runtime-metrics.d.ts +39 -0
  17. package/dist/server/client/daemon-client-runtime-metrics.d.ts.map +1 -0
  18. package/dist/server/client/daemon-client-runtime-metrics.js +173 -0
  19. package/dist/server/client/daemon-client-runtime-metrics.js.map +1 -0
  20. package/dist/server/client/daemon-client-transport-types.d.ts +36 -0
  21. package/dist/server/client/daemon-client-transport-types.d.ts.map +1 -0
  22. package/dist/server/client/daemon-client-transport-types.js +2 -0
  23. package/dist/server/client/daemon-client-transport-types.js.map +1 -0
  24. package/dist/server/client/daemon-client-transport-utils.d.ts +9 -0
  25. package/dist/server/client/daemon-client-transport-utils.d.ts.map +1 -0
  26. package/dist/server/client/daemon-client-transport-utils.js +121 -0
  27. package/dist/server/client/daemon-client-transport-utils.js.map +1 -0
  28. package/dist/server/client/daemon-client-transport.d.ts +5 -0
  29. package/dist/server/client/daemon-client-transport.d.ts.map +1 -0
  30. package/dist/server/client/daemon-client-transport.js +4 -0
  31. package/dist/server/client/daemon-client-transport.js.map +1 -0
  32. package/dist/server/client/daemon-client-websocket-transport.d.ts +8 -0
  33. package/dist/server/client/daemon-client-websocket-transport.d.ts.map +1 -0
  34. package/dist/server/client/daemon-client-websocket-transport.js +120 -0
  35. package/dist/server/client/daemon-client-websocket-transport.js.map +1 -0
  36. package/dist/server/client/daemon-client.d.ts +862 -0
  37. package/dist/server/client/daemon-client.d.ts.map +1 -0
  38. package/dist/server/client/daemon-client.js +3376 -0
  39. package/dist/server/client/daemon-client.js.map +1 -0
  40. package/dist/server/client/terminal-stream-router.d.ts +24 -0
  41. package/dist/server/client/terminal-stream-router.d.ts.map +1 -0
  42. package/dist/server/client/terminal-stream-router.js +100 -0
  43. package/dist/server/client/terminal-stream-router.js.map +1 -0
  44. package/dist/server/server/agent/activity-curator.d.ts +11 -0
  45. package/dist/server/server/agent/activity-curator.d.ts.map +1 -0
  46. package/dist/server/server/agent/activity-curator.js +150 -0
  47. package/dist/server/server/agent/activity-curator.js.map +1 -0
  48. package/dist/server/server/agent/agent-archive.d.ts +11 -0
  49. package/dist/server/server/agent/agent-archive.d.ts.map +1 -0
  50. package/dist/server/server/agent/agent-archive.js +16 -0
  51. package/dist/server/server/agent/agent-archive.js.map +1 -0
  52. package/dist/server/server/agent/agent-loading.d.ts +12 -0
  53. package/dist/server/server/agent/agent-loading.d.ts.map +1 -0
  54. package/dist/server/server/agent/agent-loading.js +51 -0
  55. package/dist/server/server/agent/agent-loading.js.map +1 -0
  56. package/dist/server/server/agent/agent-manager.d.ts +342 -0
  57. package/dist/server/server/agent/agent-manager.d.ts.map +1 -0
  58. package/dist/server/server/agent/agent-manager.js +2572 -0
  59. package/dist/server/server/agent/agent-manager.js.map +1 -0
  60. package/dist/server/server/agent/agent-metadata-generator.d.ts +27 -0
  61. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -0
  62. package/dist/server/server/agent/agent-metadata-generator.js +104 -0
  63. package/dist/server/server/agent/agent-metadata-generator.js.map +1 -0
  64. package/dist/server/server/agent/agent-projections.d.ts +24 -0
  65. package/dist/server/server/agent/agent-projections.d.ts.map +1 -0
  66. package/dist/server/server/agent/agent-projections.js +406 -0
  67. package/dist/server/server/agent/agent-projections.js.map +1 -0
  68. package/dist/server/server/agent/agent-prompt.d.ts +72 -0
  69. package/dist/server/server/agent/agent-prompt.d.ts.map +1 -0
  70. package/dist/server/server/agent/agent-prompt.js +196 -0
  71. package/dist/server/server/agent/agent-prompt.js.map +1 -0
  72. package/dist/server/server/agent/agent-response-loop.d.ts +62 -0
  73. package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -0
  74. package/dist/server/server/agent/agent-response-loop.js +321 -0
  75. package/dist/server/server/agent/agent-response-loop.js.map +1 -0
  76. package/dist/server/server/agent/agent-sdk-types.d.ts +540 -0
  77. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -0
  78. package/dist/server/server/agent/agent-sdk-types.js +22 -0
  79. package/dist/server/server/agent/agent-sdk-types.js.map +1 -0
  80. package/dist/server/server/agent/agent-storage.d.ts +346 -0
  81. package/dist/server/server/agent/agent-storage.d.ts.map +1 -0
  82. package/dist/server/server/agent/agent-storage.js +340 -0
  83. package/dist/server/server/agent/agent-storage.js.map +1 -0
  84. package/dist/server/server/agent/agent-stream-coalescer.d.ts +41 -0
  85. package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -0
  86. package/dist/server/server/agent/agent-stream-coalescer.js +166 -0
  87. package/dist/server/server/agent/agent-stream-coalescer.js.map +1 -0
  88. package/dist/server/server/agent/agent-timeline-store-types.d.ts +54 -0
  89. package/dist/server/server/agent/agent-timeline-store-types.d.ts.map +1 -0
  90. package/dist/server/server/agent/agent-timeline-store-types.js +2 -0
  91. package/dist/server/server/agent/agent-timeline-store-types.js.map +1 -0
  92. package/dist/server/server/agent/agent-timeline-store.d.ts +32 -0
  93. package/dist/server/server/agent/agent-timeline-store.d.ts.map +1 -0
  94. package/dist/server/server/agent/agent-timeline-store.js +263 -0
  95. package/dist/server/server/agent/agent-timeline-store.js.map +1 -0
  96. package/dist/server/server/agent/agent-title-limits.d.ts +3 -0
  97. package/dist/server/server/agent/agent-title-limits.d.ts.map +1 -0
  98. package/dist/server/server/agent/agent-title-limits.js +3 -0
  99. package/dist/server/server/agent/agent-title-limits.js.map +1 -0
  100. package/dist/server/server/agent/audio-utils.d.ts +3 -0
  101. package/dist/server/server/agent/audio-utils.d.ts.map +1 -0
  102. package/dist/server/server/agent/audio-utils.js +19 -0
  103. package/dist/server/server/agent/audio-utils.js.map +1 -0
  104. package/dist/server/server/agent/create-agent-mode.d.ts +16 -0
  105. package/dist/server/server/agent/create-agent-mode.d.ts.map +1 -0
  106. package/dist/server/server/agent/create-agent-mode.js +26 -0
  107. package/dist/server/server/agent/create-agent-mode.js.map +1 -0
  108. package/dist/server/server/agent/create-agent-title.d.ts +8 -0
  109. package/dist/server/server/agent/create-agent-title.d.ts.map +1 -0
  110. package/dist/server/server/agent/create-agent-title.js +29 -0
  111. package/dist/server/server/agent/create-agent-title.js.map +1 -0
  112. package/dist/server/server/agent/dictation-debug.d.ts +13 -0
  113. package/dist/server/server/agent/dictation-debug.d.ts.map +1 -0
  114. package/dist/server/server/agent/dictation-debug.js +50 -0
  115. package/dist/server/server/agent/dictation-debug.js.map +1 -0
  116. package/dist/server/server/agent/foreground-run-state.d.ts +50 -0
  117. package/dist/server/server/agent/foreground-run-state.d.ts.map +1 -0
  118. package/dist/server/server/agent/foreground-run-state.js +160 -0
  119. package/dist/server/server/agent/foreground-run-state.js.map +1 -0
  120. package/dist/server/server/agent/import-sessions.d.ts +52 -0
  121. package/dist/server/server/agent/import-sessions.d.ts.map +1 -0
  122. package/dist/server/server/agent/import-sessions.js +212 -0
  123. package/dist/server/server/agent/import-sessions.js.map +1 -0
  124. package/dist/server/server/agent/mcp-server.d.ts +46 -0
  125. package/dist/server/server/agent/mcp-server.d.ts.map +1 -0
  126. package/dist/server/server/agent/mcp-server.js +1962 -0
  127. package/dist/server/server/agent/mcp-server.js.map +1 -0
  128. package/dist/server/server/agent/mcp-shared.d.ts +316 -0
  129. package/dist/server/server/agent/mcp-shared.d.ts.map +1 -0
  130. package/dist/server/server/agent/mcp-shared.js +194 -0
  131. package/dist/server/server/agent/mcp-shared.js.map +1 -0
  132. package/dist/server/server/agent/model-resolver.d.ts +11 -0
  133. package/dist/server/server/agent/model-resolver.d.ts.map +1 -0
  134. package/dist/server/server/agent/model-resolver.js +27 -0
  135. package/dist/server/server/agent/model-resolver.js.map +1 -0
  136. package/dist/server/server/agent/pcm16-resampler.d.ts +14 -0
  137. package/dist/server/server/agent/pcm16-resampler.d.ts.map +1 -0
  138. package/dist/server/server/agent/pcm16-resampler.js +63 -0
  139. package/dist/server/server/agent/pcm16-resampler.js.map +1 -0
  140. package/dist/server/server/agent/prompt-attachments.d.ts +7 -0
  141. package/dist/server/server/agent/prompt-attachments.d.ts.map +1 -0
  142. package/dist/server/server/agent/prompt-attachments.js +72 -0
  143. package/dist/server/server/agent/prompt-attachments.js.map +1 -0
  144. package/dist/server/server/agent/provider-history-timestamps.d.ts +2 -0
  145. package/dist/server/server/agent/provider-history-timestamps.d.ts.map +1 -0
  146. package/dist/server/server/agent/provider-history-timestamps.js +16 -0
  147. package/dist/server/server/agent/provider-history-timestamps.js.map +1 -0
  148. package/dist/server/server/agent/provider-launch-config.d.ts +368 -0
  149. package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -0
  150. package/dist/server/server/agent/provider-launch-config.js +190 -0
  151. package/dist/server/server/agent/provider-launch-config.js.map +1 -0
  152. package/dist/server/server/agent/provider-manifest.d.ts +33 -0
  153. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -0
  154. package/dist/server/server/agent/provider-manifest.js +211 -0
  155. package/dist/server/server/agent/provider-manifest.js.map +1 -0
  156. package/dist/server/server/agent/provider-registry.d.ts +33 -0
  157. package/dist/server/server/agent/provider-registry.d.ts.map +1 -0
  158. package/dist/server/server/agent/provider-registry.js +396 -0
  159. package/dist/server/server/agent/provider-registry.js.map +1 -0
  160. package/dist/server/server/agent/provider-snapshot-manager.d.ts +49 -0
  161. package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -0
  162. package/dist/server/server/agent/provider-snapshot-manager.js +348 -0
  163. package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -0
  164. package/dist/server/server/agent/providers/acp-agent.d.ts +286 -0
  165. package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -0
  166. package/dist/server/server/agent/providers/acp-agent.js +2070 -0
  167. package/dist/server/server/agent/providers/acp-agent.js.map +1 -0
  168. package/dist/server/server/agent/providers/claude/agent.d.ts +60 -0
  169. package/dist/server/server/agent/providers/claude/agent.d.ts.map +1 -0
  170. package/dist/server/server/agent/providers/claude/agent.js +3815 -0
  171. package/dist/server/server/agent/providers/claude/agent.js.map +1 -0
  172. package/dist/server/server/agent/providers/claude/models.d.ts +10 -0
  173. package/dist/server/server/agent/providers/claude/models.d.ts.map +1 -0
  174. package/dist/server/server/agent/providers/claude/models.js +170 -0
  175. package/dist/server/server/agent/providers/claude/models.js.map +1 -0
  176. package/dist/server/server/agent/providers/claude/partial-json.d.ts +5 -0
  177. package/dist/server/server/agent/providers/claude/partial-json.d.ts.map +1 -0
  178. package/dist/server/server/agent/providers/claude/partial-json.js +306 -0
  179. package/dist/server/server/agent/providers/claude/partial-json.js.map +1 -0
  180. package/dist/server/server/agent/providers/claude/project-dir.d.ts +5 -0
  181. package/dist/server/server/agent/providers/claude/project-dir.d.ts.map +1 -0
  182. package/dist/server/server/agent/providers/claude/project-dir.js +40 -0
  183. package/dist/server/server/agent/providers/claude/project-dir.js.map +1 -0
  184. package/dist/server/server/agent/providers/claude/query.d.ts +14 -0
  185. package/dist/server/server/agent/providers/claude/query.d.ts.map +1 -0
  186. package/dist/server/server/agent/providers/claude/query.js +84 -0
  187. package/dist/server/server/agent/providers/claude/query.js.map +1 -0
  188. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +22 -0
  189. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts.map +1 -0
  190. package/dist/server/server/agent/providers/claude/sidechain-tracker.js +232 -0
  191. package/dist/server/server/agent/providers/claude/sidechain-tracker.js.map +1 -0
  192. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +55 -0
  193. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -0
  194. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +272 -0
  195. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -0
  196. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts +3 -0
  197. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -0
  198. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +130 -0
  199. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -0
  200. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +16 -0
  201. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -0
  202. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +129 -0
  203. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -0
  204. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +32 -0
  205. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts.map +1 -0
  206. package/dist/server/server/agent/providers/codex/app-server-transport.js +214 -0
  207. package/dist/server/server/agent/providers/codex/app-server-transport.js.map +1 -0
  208. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts +31 -0
  209. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts.map +1 -0
  210. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js +172 -0
  211. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js.map +1 -0
  212. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +12 -0
  213. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts.map +1 -0
  214. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js +104 -0
  215. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js.map +1 -0
  216. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +15 -0
  217. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -0
  218. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +791 -0
  219. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -0
  220. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +307 -0
  221. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -0
  222. package/dist/server/server/agent/providers/codex-app-server-agent.js +4364 -0
  223. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -0
  224. package/dist/server/server/agent/providers/codex-feature-definitions.d.ts +11 -0
  225. package/dist/server/server/agent/providers/codex-feature-definitions.d.ts.map +1 -0
  226. package/dist/server/server/agent/providers/codex-feature-definitions.js +45 -0
  227. package/dist/server/server/agent/providers/codex-feature-definitions.js.map +1 -0
  228. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts +9 -0
  229. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -0
  230. package/dist/server/server/agent/providers/codex-rollout-timeline.js +555 -0
  231. package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -0
  232. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +25 -0
  233. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +1 -0
  234. package/dist/server/server/agent/providers/copilot-acp-agent.js +203 -0
  235. package/dist/server/server/agent/providers/copilot-acp-agent.js.map +1 -0
  236. package/dist/server/server/agent/providers/cursor-acp-agent.d.ts +21 -0
  237. package/dist/server/server/agent/providers/cursor-acp-agent.d.ts.map +1 -0
  238. package/dist/server/server/agent/providers/cursor-acp-agent.js +95 -0
  239. package/dist/server/server/agent/providers/cursor-acp-agent.js.map +1 -0
  240. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +17 -0
  241. package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -0
  242. package/dist/server/server/agent/providers/diagnostic-utils.js +127 -0
  243. package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -0
  244. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +33 -0
  245. package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -0
  246. package/dist/server/server/agent/providers/generic-acp-agent.js +234 -0
  247. package/dist/server/server/agent/providers/generic-acp-agent.js.map +1 -0
  248. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +68 -0
  249. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -0
  250. package/dist/server/server/agent/providers/mock-load-test-agent.js +770 -0
  251. package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -0
  252. package/dist/server/server/agent/providers/opencode/runtime.d.ts +27 -0
  253. package/dist/server/server/agent/providers/opencode/runtime.d.ts.map +1 -0
  254. package/dist/server/server/agent/providers/opencode/runtime.js +5 -0
  255. package/dist/server/server/agent/providers/opencode/runtime.js.map +1 -0
  256. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +55 -0
  257. package/dist/server/server/agent/providers/opencode/server-manager.d.ts.map +1 -0
  258. package/dist/server/server/agent/providers/opencode/server-manager.js +256 -0
  259. package/dist/server/server/agent/providers/opencode/server-manager.js.map +1 -0
  260. package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +22 -0
  261. package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts.map +1 -0
  262. package/dist/server/server/agent/providers/opencode/test-server-manager.js +28 -0
  263. package/dist/server/server/agent/providers/opencode/test-server-manager.js.map +1 -0
  264. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.d.ts +83 -0
  265. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.d.ts.map +1 -0
  266. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.js +225 -0
  267. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.js.map +1 -0
  268. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +3 -0
  269. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts.map +1 -0
  270. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +131 -0
  271. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js.map +1 -0
  272. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +13 -0
  273. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +1 -0
  274. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +53 -0
  275. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +1 -0
  276. package/dist/server/server/agent/providers/opencode-agent.d.ts +231 -0
  277. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -0
  278. package/dist/server/server/agent/providers/opencode-agent.js +2443 -0
  279. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -0
  280. package/dist/server/server/agent/providers/pi/agent.d.ts +84 -0
  281. package/dist/server/server/agent/providers/pi/agent.d.ts.map +1 -0
  282. package/dist/server/server/agent/providers/pi/agent.js +828 -0
  283. package/dist/server/server/agent/providers/pi/agent.js.map +1 -0
  284. package/dist/server/server/agent/providers/pi/cli-runtime.d.ts +18 -0
  285. package/dist/server/server/agent/providers/pi/cli-runtime.d.ts.map +1 -0
  286. package/dist/server/server/agent/providers/pi/cli-runtime.js +211 -0
  287. package/dist/server/server/agent/providers/pi/cli-runtime.js.map +1 -0
  288. package/dist/server/server/agent/providers/pi/history-mapper.d.ts +5 -0
  289. package/dist/server/server/agent/providers/pi/history-mapper.d.ts.map +1 -0
  290. package/dist/server/server/agent/providers/pi/history-mapper.js +139 -0
  291. package/dist/server/server/agent/providers/pi/history-mapper.js.map +1 -0
  292. package/dist/server/server/agent/providers/pi/rpc-types.d.ts +185 -0
  293. package/dist/server/server/agent/providers/pi/rpc-types.d.ts.map +1 -0
  294. package/dist/server/server/agent/providers/pi/rpc-types.js +2 -0
  295. package/dist/server/server/agent/providers/pi/rpc-types.js.map +1 -0
  296. package/dist/server/server/agent/providers/pi/runtime.d.ts +47 -0
  297. package/dist/server/server/agent/providers/pi/runtime.d.ts.map +1 -0
  298. package/dist/server/server/agent/providers/pi/runtime.js +47 -0
  299. package/dist/server/server/agent/providers/pi/runtime.js.map +1 -0
  300. package/dist/server/server/agent/providers/pi/session-descriptor.d.ts +10 -0
  301. package/dist/server/server/agent/providers/pi/session-descriptor.d.ts.map +1 -0
  302. package/dist/server/server/agent/providers/pi/session-descriptor.js +300 -0
  303. package/dist/server/server/agent/providers/pi/session-descriptor.js.map +1 -0
  304. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts +52 -0
  305. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts.map +1 -0
  306. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js +109 -0
  307. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js.map +1 -0
  308. package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts +112 -0
  309. package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts.map +1 -0
  310. package/dist/server/server/agent/providers/pi/tool-call-mapper.js +284 -0
  311. package/dist/server/server/agent/providers/pi/tool-call-mapper.js.map +1 -0
  312. package/dist/server/server/agent/providers/provider-image-output.d.ts +20 -0
  313. package/dist/server/server/agent/providers/provider-image-output.d.ts.map +1 -0
  314. package/dist/server/server/agent/providers/provider-image-output.js +51 -0
  315. package/dist/server/server/agent/providers/provider-image-output.js.map +1 -0
  316. package/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
  317. package/dist/server/server/agent/providers/provider-runner.d.ts.map +1 -0
  318. package/dist/server/server/agent/providers/provider-runner.js +81 -0
  319. package/dist/server/server/agent/providers/provider-runner.js.map +1 -0
  320. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts +3 -0
  321. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -0
  322. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +60 -0
  323. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -0
  324. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +1751 -0
  325. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -0
  326. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +709 -0
  327. package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -0
  328. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +20 -0
  329. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -0
  330. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +146 -0
  331. package/dist/server/server/agent/providers/tool-call-mapper-utils.js.map +1 -0
  332. package/dist/server/server/agent/recordings-debug.d.ts +3 -0
  333. package/dist/server/server/agent/recordings-debug.d.ts.map +1 -0
  334. package/dist/server/server/agent/recordings-debug.js +19 -0
  335. package/dist/server/server/agent/recordings-debug.js.map +1 -0
  336. package/dist/server/server/agent/stt-debug.d.ts +10 -0
  337. package/dist/server/server/agent/stt-debug.d.ts.map +1 -0
  338. package/dist/server/server/agent/stt-debug.js +33 -0
  339. package/dist/server/server/agent/stt-debug.js.map +1 -0
  340. package/dist/server/server/agent/stt-manager.d.ts +38 -0
  341. package/dist/server/server/agent/stt-manager.d.ts.map +1 -0
  342. package/dist/server/server/agent/stt-manager.js +246 -0
  343. package/dist/server/server/agent/stt-manager.js.map +1 -0
  344. package/dist/server/server/agent/system-prompt.d.ts +2 -0
  345. package/dist/server/server/agent/system-prompt.d.ts.map +1 -0
  346. package/dist/server/server/agent/system-prompt.js +8 -0
  347. package/dist/server/server/agent/system-prompt.js.map +1 -0
  348. package/dist/server/server/agent/timeline-append.d.ts +10 -0
  349. package/dist/server/server/agent/timeline-append.d.ts.map +1 -0
  350. package/dist/server/server/agent/timeline-append.js +27 -0
  351. package/dist/server/server/agent/timeline-append.js.map +1 -0
  352. package/dist/server/server/agent/timeline-projection.d.ts +55 -0
  353. package/dist/server/server/agent/timeline-projection.d.ts.map +1 -0
  354. package/dist/server/server/agent/timeline-projection.js +279 -0
  355. package/dist/server/server/agent/timeline-projection.js.map +1 -0
  356. package/dist/server/server/agent/tool-name-normalization.d.ts +9 -0
  357. package/dist/server/server/agent/tool-name-normalization.d.ts.map +1 -0
  358. package/dist/server/server/agent/tool-name-normalization.js +82 -0
  359. package/dist/server/server/agent/tool-name-normalization.js.map +1 -0
  360. package/dist/server/server/agent/tts-debug.d.ts +8 -0
  361. package/dist/server/server/agent/tts-debug.d.ts.map +1 -0
  362. package/dist/server/server/agent/tts-debug.js +24 -0
  363. package/dist/server/server/agent/tts-debug.js.map +1 -0
  364. package/dist/server/server/agent/tts-manager.d.ts +41 -0
  365. package/dist/server/server/agent/tts-manager.d.ts.map +1 -0
  366. package/dist/server/server/agent/tts-manager.js +375 -0
  367. package/dist/server/server/agent/tts-manager.js.map +1 -0
  368. package/dist/server/server/agent/wait-for-agent-tracker.d.ts +15 -0
  369. package/dist/server/server/agent/wait-for-agent-tracker.d.ts.map +1 -0
  370. package/dist/server/server/agent/wait-for-agent-tracker.js +53 -0
  371. package/dist/server/server/agent/wait-for-agent-tracker.js.map +1 -0
  372. package/dist/server/server/agent-attention-policy.d.ts +20 -0
  373. package/dist/server/server/agent-attention-policy.d.ts.map +1 -0
  374. package/dist/server/server/agent-attention-policy.js +24 -0
  375. package/dist/server/server/agent-attention-policy.js.map +1 -0
  376. package/dist/server/server/auth.d.ts +25 -0
  377. package/dist/server/server/auth.d.ts.map +1 -0
  378. package/dist/server/server/auth.js +93 -0
  379. package/dist/server/server/auth.js.map +1 -0
  380. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +40 -0
  381. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts.map +1 -0
  382. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +80 -0
  383. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js.map +1 -0
  384. package/dist/server/server/auto-archive-on-merge/index.d.ts +8 -0
  385. package/dist/server/server/auto-archive-on-merge/index.d.ts.map +1 -0
  386. package/dist/server/server/auto-archive-on-merge/index.js +15 -0
  387. package/dist/server/server/auto-archive-on-merge/index.js.map +1 -0
  388. package/dist/server/server/bootstrap.d.ts +98 -0
  389. package/dist/server/server/bootstrap.d.ts.map +1 -0
  390. package/dist/server/server/bootstrap.js +800 -0
  391. package/dist/server/server/bootstrap.js.map +1 -0
  392. package/dist/server/server/chat/chat-mentions.d.ts +47 -0
  393. package/dist/server/server/chat/chat-mentions.d.ts.map +1 -0
  394. package/dist/server/server/chat/chat-mentions.js +113 -0
  395. package/dist/server/server/chat/chat-mentions.js.map +1 -0
  396. package/dist/server/server/chat/chat-rpc-schemas.d.ts +728 -0
  397. package/dist/server/server/chat/chat-rpc-schemas.d.ts.map +1 -0
  398. package/dist/server/server/chat/chat-rpc-schemas.js +103 -0
  399. package/dist/server/server/chat/chat-rpc-schemas.js.map +1 -0
  400. package/dist/server/server/chat/chat-service.d.ts +78 -0
  401. package/dist/server/server/chat/chat-service.d.ts.map +1 -0
  402. package/dist/server/server/chat/chat-service.js +339 -0
  403. package/dist/server/server/chat/chat-service.js.map +1 -0
  404. package/dist/server/server/chat/chat-types.d.ts +75 -0
  405. package/dist/server/server/chat/chat-types.d.ts.map +1 -0
  406. package/dist/server/server/chat/chat-types.js +22 -0
  407. package/dist/server/server/chat/chat-types.js.map +1 -0
  408. package/dist/server/server/checkout/status-projection.d.ts +19 -0
  409. package/dist/server/server/checkout/status-projection.d.ts.map +1 -0
  410. package/dist/server/server/checkout/status-projection.js +102 -0
  411. package/dist/server/server/checkout/status-projection.js.map +1 -0
  412. package/dist/server/server/checkout-diff-manager.d.ts +41 -0
  413. package/dist/server/server/checkout-diff-manager.d.ts.map +1 -0
  414. package/dist/server/server/checkout-diff-manager.js +189 -0
  415. package/dist/server/server/checkout-diff-manager.js.map +1 -0
  416. package/dist/server/server/checkout-git-utils.d.ts +11 -0
  417. package/dist/server/server/checkout-git-utils.d.ts.map +1 -0
  418. package/dist/server/server/checkout-git-utils.js +34 -0
  419. package/dist/server/server/checkout-git-utils.js.map +1 -0
  420. package/dist/server/server/client-message-id.d.ts +3 -0
  421. package/dist/server/server/client-message-id.d.ts.map +1 -0
  422. package/dist/server/server/client-message-id.js +12 -0
  423. package/dist/server/server/client-message-id.js.map +1 -0
  424. package/dist/server/server/config.d.ts +23 -0
  425. package/dist/server/server/config.d.ts.map +1 -0
  426. package/dist/server/server/config.js +233 -0
  427. package/dist/server/server/config.js.map +1 -0
  428. package/dist/server/server/connection-offer.d.ts +20 -0
  429. package/dist/server/server/connection-offer.d.ts.map +1 -0
  430. package/dist/server/server/connection-offer.js +59 -0
  431. package/dist/server/server/connection-offer.js.map +1 -0
  432. package/dist/server/server/daemon-config-store.d.ts +25 -0
  433. package/dist/server/server/daemon-config-store.d.ts.map +1 -0
  434. package/dist/server/server/daemon-config-store.js +138 -0
  435. package/dist/server/server/daemon-config-store.js.map +1 -0
  436. package/dist/server/server/daemon-keypair.d.ts +8 -0
  437. package/dist/server/server/daemon-keypair.d.ts.map +1 -0
  438. package/dist/server/server/daemon-keypair.js +42 -0
  439. package/dist/server/server/daemon-keypair.js.map +1 -0
  440. package/dist/server/server/daemon-version.d.ts +5 -0
  441. package/dist/server/server/daemon-version.d.ts.map +1 -0
  442. package/dist/server/server/daemon-version.js +22 -0
  443. package/dist/server/server/daemon-version.js.map +1 -0
  444. package/dist/server/server/daemon-worker.d.ts +2 -0
  445. package/dist/server/server/daemon-worker.d.ts.map +1 -0
  446. package/dist/server/server/daemon-worker.js +155 -0
  447. package/dist/server/server/daemon-worker.js.map +1 -0
  448. package/dist/server/server/dictation/dictation-stream-manager.d.ts +87 -0
  449. package/dist/server/server/dictation/dictation-stream-manager.d.ts.map +1 -0
  450. package/dist/server/server/dictation/dictation-stream-manager.js +572 -0
  451. package/dist/server/server/dictation/dictation-stream-manager.js.map +1 -0
  452. package/dist/server/server/editor-targets.d.ts +18 -0
  453. package/dist/server/server/editor-targets.d.ts.map +1 -0
  454. package/dist/server/server/editor-targets.js +109 -0
  455. package/dist/server/server/editor-targets.js.map +1 -0
  456. package/dist/server/server/exports.d.ts +26 -0
  457. package/dist/server/server/exports.d.ts.map +1 -0
  458. package/dist/server/server/exports.js +25 -0
  459. package/dist/server/server/exports.js.map +1 -0
  460. package/dist/server/server/file-download/token-store.d.ts +24 -0
  461. package/dist/server/server/file-download/token-store.d.ts.map +1 -0
  462. package/dist/server/server/file-download/token-store.js +40 -0
  463. package/dist/server/server/file-download/token-store.js.map +1 -0
  464. package/dist/server/server/file-explorer/service.d.ts +51 -0
  465. package/dist/server/server/file-explorer/service.d.ts.map +1 -0
  466. package/dist/server/server/file-explorer/service.js +246 -0
  467. package/dist/server/server/file-explorer/service.js.map +1 -0
  468. package/dist/server/server/hostnames.d.ts +13 -0
  469. package/dist/server/server/hostnames.d.ts.map +1 -0
  470. package/dist/server/server/hostnames.js +94 -0
  471. package/dist/server/server/hostnames.js.map +1 -0
  472. package/dist/server/server/json-utils.d.ts +11 -0
  473. package/dist/server/server/json-utils.d.ts.map +1 -0
  474. package/dist/server/server/json-utils.js +45 -0
  475. package/dist/server/server/json-utils.js.map +1 -0
  476. package/dist/server/server/logger.d.ts +29 -0
  477. package/dist/server/server/logger.d.ts.map +1 -0
  478. package/dist/server/server/logger.js +125 -0
  479. package/dist/server/server/logger.js.map +1 -0
  480. package/dist/server/server/loop/rpc-schemas.d.ts +3005 -0
  481. package/dist/server/server/loop/rpc-schemas.d.ts.map +1 -0
  482. package/dist/server/server/loop/rpc-schemas.js +163 -0
  483. package/dist/server/server/loop/rpc-schemas.js.map +1 -0
  484. package/dist/server/server/loop-service.d.ts +529 -0
  485. package/dist/server/server/loop-service.d.ts.map +1 -0
  486. package/dist/server/server/loop-service.js +751 -0
  487. package/dist/server/server/loop-service.js.map +1 -0
  488. package/dist/server/server/messages.d.ts +9 -0
  489. package/dist/server/server/messages.d.ts.map +1 -0
  490. package/dist/server/server/messages.js +29 -0
  491. package/dist/server/server/messages.js.map +1 -0
  492. package/dist/server/server/package-version.d.ts +25 -0
  493. package/dist/server/server/package-version.d.ts.map +1 -0
  494. package/dist/server/server/package-version.js +60 -0
  495. package/dist/server/server/package-version.js.map +1 -0
  496. package/dist/server/server/pagination/cursor.d.ts +16 -0
  497. package/dist/server/server/pagination/cursor.d.ts.map +1 -0
  498. package/dist/server/server/pagination/cursor.js +62 -0
  499. package/dist/server/server/pagination/cursor.js.map +1 -0
  500. package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
  501. package/dist/server/server/pagination/sortable-pager.d.ts.map +1 -0
  502. package/dist/server/server/pagination/sortable-pager.js +68 -0
  503. package/dist/server/server/pagination/sortable-pager.js.map +1 -0
  504. package/dist/server/server/pairing-offer.d.ts +18 -0
  505. package/dist/server/server/pairing-offer.d.ts.map +1 -0
  506. package/dist/server/server/pairing-offer.js +47 -0
  507. package/dist/server/server/pairing-offer.js.map +1 -0
  508. package/dist/server/server/pairing-qr.d.ts +7 -0
  509. package/dist/server/server/pairing-qr.d.ts.map +1 -0
  510. package/dist/server/server/pairing-qr.js +45 -0
  511. package/dist/server/server/pairing-qr.js.map +1 -0
  512. package/dist/server/server/paseo-env.d.ts +13 -0
  513. package/dist/server/server/paseo-env.d.ts.map +1 -0
  514. package/dist/server/server/paseo-env.js +53 -0
  515. package/dist/server/server/paseo-env.js.map +1 -0
  516. package/dist/server/server/paseo-home.d.ts +2 -0
  517. package/dist/server/server/paseo-home.d.ts.map +1 -0
  518. package/dist/server/server/paseo-home.js +19 -0
  519. package/dist/server/server/paseo-home.js.map +1 -0
  520. package/dist/server/server/paseo-worktree-archive-service.d.ts +43 -0
  521. package/dist/server/server/paseo-worktree-archive-service.d.ts.map +1 -0
  522. package/dist/server/server/paseo-worktree-archive-service.js +145 -0
  523. package/dist/server/server/paseo-worktree-archive-service.js.map +1 -0
  524. package/dist/server/server/paseo-worktree-service.d.ts +43 -0
  525. package/dist/server/server/paseo-worktree-service.d.ts.map +1 -0
  526. package/dist/server/server/paseo-worktree-service.js +218 -0
  527. package/dist/server/server/paseo-worktree-service.js.map +1 -0
  528. package/dist/server/server/path-utils.d.ts +4 -0
  529. package/dist/server/server/path-utils.d.ts.map +1 -0
  530. package/dist/server/server/path-utils.js +29 -0
  531. package/dist/server/server/path-utils.js.map +1 -0
  532. package/dist/server/server/persisted-config.d.ts +1056 -0
  533. package/dist/server/server/persisted-config.d.ts.map +1 -0
  534. package/dist/server/server/persisted-config.js +398 -0
  535. package/dist/server/server/persisted-config.js.map +1 -0
  536. package/dist/server/server/persistence-hooks.d.ts +33 -0
  537. package/dist/server/server/persistence-hooks.d.ts.map +1 -0
  538. package/dist/server/server/persistence-hooks.js +99 -0
  539. package/dist/server/server/persistence-hooks.js.map +1 -0
  540. package/dist/server/server/pid-lock.d.ts +46 -0
  541. package/dist/server/server/pid-lock.d.ts.map +1 -0
  542. package/dist/server/server/pid-lock.js +170 -0
  543. package/dist/server/server/pid-lock.js.map +1 -0
  544. package/dist/server/server/private-files.d.ts +7 -0
  545. package/dist/server/server/private-files.d.ts.map +1 -0
  546. package/dist/server/server/private-files.js +42 -0
  547. package/dist/server/server/private-files.js.map +1 -0
  548. package/dist/server/server/push/notifications.d.ts +9 -0
  549. package/dist/server/server/push/notifications.d.ts.map +1 -0
  550. package/dist/server/server/push/notifications.js +15 -0
  551. package/dist/server/server/push/notifications.js.map +1 -0
  552. package/dist/server/server/push/push-service.d.ts +20 -0
  553. package/dist/server/server/push/push-service.d.ts.map +1 -0
  554. package/dist/server/server/push/push-service.js +66 -0
  555. package/dist/server/server/push/push-service.js.map +1 -0
  556. package/dist/server/server/push/token-store.d.ts +18 -0
  557. package/dist/server/server/push/token-store.d.ts.map +1 -0
  558. package/dist/server/server/push/token-store.js +68 -0
  559. package/dist/server/server/push/token-store.js.map +1 -0
  560. package/dist/server/server/relay-transport.d.ts +31 -0
  561. package/dist/server/server/relay-transport.d.ts.map +1 -0
  562. package/dist/server/server/relay-transport.js +514 -0
  563. package/dist/server/server/relay-transport.js.map +1 -0
  564. package/dist/server/server/resolve-worktree-creation-intent.d.ts +29 -0
  565. package/dist/server/server/resolve-worktree-creation-intent.d.ts.map +1 -0
  566. package/dist/server/server/resolve-worktree-creation-intent.js +119 -0
  567. package/dist/server/server/resolve-worktree-creation-intent.js.map +1 -0
  568. package/dist/server/server/schedule/cron.d.ts +4 -0
  569. package/dist/server/server/schedule/cron.d.ts.map +1 -0
  570. package/dist/server/server/schedule/cron.js +103 -0
  571. package/dist/server/server/schedule/cron.js.map +1 -0
  572. package/dist/server/server/schedule/rpc-schemas.d.ts +3909 -0
  573. package/dist/server/server/schedule/rpc-schemas.d.ts.map +1 -0
  574. package/dist/server/server/schedule/rpc-schemas.js +151 -0
  575. package/dist/server/server/schedule/rpc-schemas.js.map +1 -0
  576. package/dist/server/server/schedule/service.d.ts +40 -0
  577. package/dist/server/server/schedule/service.d.ts.map +1 -0
  578. package/dist/server/server/schedule/service.js +476 -0
  579. package/dist/server/server/schedule/service.js.map +1 -0
  580. package/dist/server/server/schedule/store.d.ts +13 -0
  581. package/dist/server/server/schedule/store.d.ts.map +1 -0
  582. package/dist/server/server/schedule/store.js +56 -0
  583. package/dist/server/server/schedule/store.js.map +1 -0
  584. package/dist/server/server/schedule/types.d.ts +726 -0
  585. package/dist/server/server/schedule/types.d.ts.map +1 -0
  586. package/dist/server/server/schedule/types.js +73 -0
  587. package/dist/server/server/schedule/types.js.map +1 -0
  588. package/dist/server/server/script-health-monitor.d.ts +39 -0
  589. package/dist/server/server/script-health-monitor.d.ts.map +1 -0
  590. package/dist/server/server/script-health-monitor.js +159 -0
  591. package/dist/server/server/script-health-monitor.js.map +1 -0
  592. package/dist/server/server/script-proxy.d.ts +40 -0
  593. package/dist/server/server/script-proxy.d.ts.map +1 -0
  594. package/dist/server/server/script-proxy.js +245 -0
  595. package/dist/server/server/script-proxy.js.map +1 -0
  596. package/dist/server/server/script-route-branch-handler.d.ts +10 -0
  597. package/dist/server/server/script-route-branch-handler.d.ts.map +1 -0
  598. package/dist/server/server/script-route-branch-handler.js +45 -0
  599. package/dist/server/server/script-route-branch-handler.js.map +1 -0
  600. package/dist/server/server/script-status-projection.d.ts +34 -0
  601. package/dist/server/server/script-status-projection.d.ts.map +1 -0
  602. package/dist/server/server/script-status-projection.js +152 -0
  603. package/dist/server/server/script-status-projection.js.map +1 -0
  604. package/dist/server/server/server-id.d.ts +17 -0
  605. package/dist/server/server/server-id.d.ts.map +1 -0
  606. package/dist/server/server/server-id.js +68 -0
  607. package/dist/server/server/server-id.js.map +1 -0
  608. package/dist/server/server/session.d.ts +586 -0
  609. package/dist/server/server/session.d.ts.map +1 -0
  610. package/dist/server/server/session.js +7072 -0
  611. package/dist/server/server/session.js.map +1 -0
  612. package/dist/server/server/speech/audio.d.ts +10 -0
  613. package/dist/server/server/speech/audio.d.ts.map +1 -0
  614. package/dist/server/server/speech/audio.js +101 -0
  615. package/dist/server/server/speech/audio.js.map +1 -0
  616. package/dist/server/server/speech/provider-resolver.d.ts +3 -0
  617. package/dist/server/server/speech/provider-resolver.d.ts.map +1 -0
  618. package/dist/server/server/speech/provider-resolver.js +7 -0
  619. package/dist/server/server/speech/provider-resolver.js.map +1 -0
  620. package/dist/server/server/speech/providers/local/config.d.ts +30 -0
  621. package/dist/server/server/speech/providers/local/config.d.ts.map +1 -0
  622. package/dist/server/server/speech/providers/local/config.js +134 -0
  623. package/dist/server/server/speech/providers/local/config.js.map +1 -0
  624. package/dist/server/server/speech/providers/local/models.d.ts +11 -0
  625. package/dist/server/server/speech/providers/local/models.d.ts.map +1 -0
  626. package/dist/server/server/speech/providers/local/models.js +17 -0
  627. package/dist/server/server/speech/providers/local/models.js.map +1 -0
  628. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts +24 -0
  629. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -0
  630. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +459 -0
  631. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -0
  632. package/dist/server/server/speech/providers/local/runtime.d.ts +31 -0
  633. package/dist/server/server/speech/providers/local/runtime.d.ts.map +1 -0
  634. package/dist/server/server/speech/providers/local/runtime.js +278 -0
  635. package/dist/server/server/speech/providers/local/runtime.js.map +1 -0
  636. package/dist/server/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
  637. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +117 -0
  638. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -0
  639. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +169 -0
  640. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -0
  641. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +15 -0
  642. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -0
  643. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +167 -0
  644. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -0
  645. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +49 -0
  646. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts.map +1 -0
  647. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +73 -0
  648. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -0
  649. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts +56 -0
  650. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts.map +1 -0
  651. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +91 -0
  652. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -0
  653. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts +7 -0
  654. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts.map +1 -0
  655. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.js +11 -0
  656. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.js.map +1 -0
  657. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +9 -0
  658. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +1 -0
  659. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +107 -0
  660. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -0
  661. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts +28 -0
  662. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts.map +1 -0
  663. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +137 -0
  664. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -0
  665. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +21 -0
  666. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts.map +1 -0
  667. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +133 -0
  668. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -0
  669. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts +23 -0
  670. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts.map +1 -0
  671. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +116 -0
  672. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -0
  673. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +18 -0
  674. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts.map +1 -0
  675. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  676. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js.map +1 -0
  677. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts +23 -0
  678. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts.map +1 -0
  679. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +141 -0
  680. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -0
  681. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +21 -0
  682. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts.map +1 -0
  683. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +115 -0
  684. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -0
  685. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts +19 -0
  686. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts.map +1 -0
  687. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js +49 -0
  688. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js.map +1 -0
  689. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts +38 -0
  690. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts.map +1 -0
  691. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js +176 -0
  692. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js.map +1 -0
  693. package/dist/server/server/speech/providers/openai/config.d.ts +22 -0
  694. package/dist/server/server/speech/providers/openai/config.d.ts.map +1 -0
  695. package/dist/server/server/speech/providers/openai/config.js +107 -0
  696. package/dist/server/server/speech/providers/openai/config.js.map +1 -0
  697. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts +42 -0
  698. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts.map +1 -0
  699. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +168 -0
  700. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js.map +1 -0
  701. package/dist/server/server/speech/providers/openai/runtime.d.ts +29 -0
  702. package/dist/server/server/speech/providers/openai/runtime.d.ts.map +1 -0
  703. package/dist/server/server/speech/providers/openai/runtime.js +117 -0
  704. package/dist/server/server/speech/providers/openai/runtime.js.map +1 -0
  705. package/dist/server/server/speech/providers/openai/stt.d.ts +22 -0
  706. package/dist/server/server/speech/providers/openai/stt.d.ts.map +1 -0
  707. package/dist/server/server/speech/providers/openai/stt.js +207 -0
  708. package/dist/server/server/speech/providers/openai/stt.js.map +1 -0
  709. package/dist/server/server/speech/providers/openai/tts.d.ts +18 -0
  710. package/dist/server/server/speech/providers/openai/tts.d.ts.map +1 -0
  711. package/dist/server/server/speech/providers/openai/tts.js +47 -0
  712. package/dist/server/server/speech/providers/openai/tts.js.map +1 -0
  713. package/dist/server/server/speech/speech-config-resolver.d.ts +11 -0
  714. package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -0
  715. package/dist/server/server/speech/speech-config-resolver.js +132 -0
  716. package/dist/server/server/speech/speech-config-resolver.js.map +1 -0
  717. package/dist/server/server/speech/speech-provider.d.ts +59 -0
  718. package/dist/server/server/speech/speech-provider.d.ts.map +1 -0
  719. package/dist/server/server/speech/speech-provider.js +2 -0
  720. package/dist/server/server/speech/speech-provider.js.map +1 -0
  721. package/dist/server/server/speech/speech-runtime.d.ts +45 -0
  722. package/dist/server/server/speech/speech-runtime.d.ts.map +1 -0
  723. package/dist/server/server/speech/speech-runtime.js +562 -0
  724. package/dist/server/server/speech/speech-runtime.js.map +1 -0
  725. package/dist/server/server/speech/speech-types.d.ts +24 -0
  726. package/dist/server/server/speech/speech-types.d.ts.map +1 -0
  727. package/dist/server/server/speech/speech-types.js +8 -0
  728. package/dist/server/server/speech/speech-types.js.map +1 -0
  729. package/dist/server/server/speech/turn-detection-provider.d.ts +23 -0
  730. package/dist/server/server/speech/turn-detection-provider.d.ts.map +1 -0
  731. package/dist/server/server/speech/turn-detection-provider.js +2 -0
  732. package/dist/server/server/speech/turn-detection-provider.js.map +1 -0
  733. package/dist/server/server/utils/diff-highlighter.d.ts +57 -0
  734. package/dist/server/server/utils/diff-highlighter.d.ts.map +1 -0
  735. package/dist/server/server/utils/diff-highlighter.js +279 -0
  736. package/dist/server/server/utils/diff-highlighter.js.map +1 -0
  737. package/dist/server/server/voice/voice-turn-controller.d.ts +38 -0
  738. package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -0
  739. package/dist/server/server/voice/voice-turn-controller.js +393 -0
  740. package/dist/server/server/voice/voice-turn-controller.js.map +1 -0
  741. package/dist/server/server/voice-config.d.ts +15 -0
  742. package/dist/server/server/voice-config.d.ts.map +1 -0
  743. package/dist/server/server/voice-config.js +54 -0
  744. package/dist/server/server/voice-config.js.map +1 -0
  745. package/dist/server/server/voice-permission-policy.d.ts +4 -0
  746. package/dist/server/server/voice-permission-policy.d.ts.map +1 -0
  747. package/dist/server/server/voice-permission-policy.js +13 -0
  748. package/dist/server/server/voice-permission-policy.js.map +1 -0
  749. package/dist/server/server/voice-types.d.ts +12 -0
  750. package/dist/server/server/voice-types.d.ts.map +1 -0
  751. package/dist/server/server/voice-types.js +2 -0
  752. package/dist/server/server/voice-types.js.map +1 -0
  753. package/dist/server/server/websocket/runtime-metrics.d.ts +71 -0
  754. package/dist/server/server/websocket/runtime-metrics.d.ts.map +1 -0
  755. package/dist/server/server/websocket/runtime-metrics.js +148 -0
  756. package/dist/server/server/websocket/runtime-metrics.js.map +1 -0
  757. package/dist/server/server/websocket-server.d.ts +153 -0
  758. package/dist/server/server/websocket-server.d.ts.map +1 -0
  759. package/dist/server/server/websocket-server.js +1300 -0
  760. package/dist/server/server/websocket-server.js.map +1 -0
  761. package/dist/server/server/workspace-archive-service.d.ts +8 -0
  762. package/dist/server/server/workspace-archive-service.d.ts.map +1 -0
  763. package/dist/server/server/workspace-archive-service.js +17 -0
  764. package/dist/server/server/workspace-archive-service.js.map +1 -0
  765. package/dist/server/server/workspace-directory.d.ts +67 -0
  766. package/dist/server/server/workspace-directory.d.ts.map +1 -0
  767. package/dist/server/server/workspace-directory.js +214 -0
  768. package/dist/server/server/workspace-directory.js.map +1 -0
  769. package/dist/server/server/workspace-git-metadata.d.ts +24 -0
  770. package/dist/server/server/workspace-git-metadata.d.ts.map +1 -0
  771. package/dist/server/server/workspace-git-metadata.js +55 -0
  772. package/dist/server/server/workspace-git-metadata.js.map +1 -0
  773. package/dist/server/server/workspace-git-service.d.ts +257 -0
  774. package/dist/server/server/workspace-git-service.d.ts.map +1 -0
  775. package/dist/server/server/workspace-git-service.js +1277 -0
  776. package/dist/server/server/workspace-git-service.js.map +1 -0
  777. package/dist/server/server/workspace-reconciliation-service.d.ts +58 -0
  778. package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -0
  779. package/dist/server/server/workspace-reconciliation-service.js +274 -0
  780. package/dist/server/server/workspace-reconciliation-service.js.map +1 -0
  781. package/dist/server/server/workspace-registry-bootstrap.d.ts +13 -0
  782. package/dist/server/server/workspace-registry-bootstrap.d.ts.map +1 -0
  783. package/dist/server/server/workspace-registry-bootstrap.js +108 -0
  784. package/dist/server/server/workspace-registry-bootstrap.js.map +1 -0
  785. package/dist/server/server/workspace-registry-model.d.ts +55 -0
  786. package/dist/server/server/workspace-registry-model.d.ts.map +1 -0
  787. package/dist/server/server/workspace-registry-model.js +191 -0
  788. package/dist/server/server/workspace-registry-model.js.map +1 -0
  789. package/dist/server/server/workspace-registry.d.ts +135 -0
  790. package/dist/server/server/workspace-registry.d.ts.map +1 -0
  791. package/dist/server/server/workspace-registry.js +162 -0
  792. package/dist/server/server/workspace-registry.js.map +1 -0
  793. package/dist/server/server/workspace-script-runtime-store.d.ts +28 -0
  794. package/dist/server/server/workspace-script-runtime-store.d.ts.map +1 -0
  795. package/dist/server/server/workspace-script-runtime-store.js +78 -0
  796. package/dist/server/server/workspace-script-runtime-store.js.map +1 -0
  797. package/dist/server/server/workspace-service-env.d.ts +17 -0
  798. package/dist/server/server/workspace-service-env.d.ts.map +1 -0
  799. package/dist/server/server/workspace-service-env.js +80 -0
  800. package/dist/server/server/workspace-service-env.js.map +1 -0
  801. package/dist/server/server/workspace-service-port-registry.d.ts +19 -0
  802. package/dist/server/server/workspace-service-port-registry.d.ts.map +1 -0
  803. package/dist/server/server/workspace-service-port-registry.js +59 -0
  804. package/dist/server/server/workspace-service-port-registry.js.map +1 -0
  805. package/dist/server/server/worktree-bootstrap.d.ts +74 -0
  806. package/dist/server/server/worktree-bootstrap.d.ts.map +1 -0
  807. package/dist/server/server/worktree-bootstrap.js +716 -0
  808. package/dist/server/server/worktree-bootstrap.js.map +1 -0
  809. package/dist/server/server/worktree-branch-name-generator.d.ts +21 -0
  810. package/dist/server/server/worktree-branch-name-generator.d.ts.map +1 -0
  811. package/dist/server/server/worktree-branch-name-generator.js +59 -0
  812. package/dist/server/server/worktree-branch-name-generator.js.map +1 -0
  813. package/dist/server/server/worktree-core.d.ts +29 -0
  814. package/dist/server/server/worktree-core.d.ts.map +1 -0
  815. package/dist/server/server/worktree-core.js +99 -0
  816. package/dist/server/server/worktree-core.js.map +1 -0
  817. package/dist/server/server/worktree-errors.d.ts +12 -0
  818. package/dist/server/server/worktree-errors.d.ts.map +1 -0
  819. package/dist/server/server/worktree-errors.js +28 -0
  820. package/dist/server/server/worktree-errors.js.map +1 -0
  821. package/dist/server/server/worktree-session.d.ts +149 -0
  822. package/dist/server/server/worktree-session.d.ts.map +1 -0
  823. package/dist/server/server/worktree-session.js +464 -0
  824. package/dist/server/server/worktree-session.js.map +1 -0
  825. package/dist/server/services/github-service.d.ts +279 -0
  826. package/dist/server/services/github-service.d.ts.map +1 -0
  827. package/dist/server/services/github-service.js +1666 -0
  828. package/dist/server/services/github-service.js.map +1 -0
  829. package/dist/server/shared/agent-attention-notification.d.ts +41 -0
  830. package/dist/server/shared/agent-attention-notification.d.ts.map +1 -0
  831. package/dist/server/shared/agent-attention-notification.js +140 -0
  832. package/dist/server/shared/agent-attention-notification.js.map +1 -0
  833. package/dist/server/shared/agent-labels.d.ts +2 -0
  834. package/dist/server/shared/agent-labels.d.ts.map +1 -0
  835. package/dist/server/shared/agent-labels.js +2 -0
  836. package/dist/server/shared/agent-labels.js.map +1 -0
  837. package/dist/server/shared/agent-lifecycle.d.ts +3 -0
  838. package/dist/server/shared/agent-lifecycle.d.ts.map +1 -0
  839. package/dist/server/shared/agent-lifecycle.js +8 -0
  840. package/dist/server/shared/agent-lifecycle.js.map +1 -0
  841. package/dist/server/shared/agent-state-bucket.d.ts +13 -0
  842. package/dist/server/shared/agent-state-bucket.d.ts.map +1 -0
  843. package/dist/server/shared/agent-state-bucket.js +41 -0
  844. package/dist/server/shared/agent-state-bucket.js.map +1 -0
  845. package/dist/server/shared/binary-frames/file-transfer.d.ts +56 -0
  846. package/dist/server/shared/binary-frames/file-transfer.d.ts.map +1 -0
  847. package/dist/server/shared/binary-frames/file-transfer.js +108 -0
  848. package/dist/server/shared/binary-frames/file-transfer.js.map +1 -0
  849. package/dist/server/shared/binary-frames/index.d.ts +3 -0
  850. package/dist/server/shared/binary-frames/index.d.ts.map +1 -0
  851. package/dist/server/shared/binary-frames/index.js +3 -0
  852. package/dist/server/shared/binary-frames/index.js.map +1 -0
  853. package/dist/server/shared/binary-frames/terminal.d.ts +36 -0
  854. package/dist/server/shared/binary-frames/terminal.d.ts.map +1 -0
  855. package/dist/server/shared/binary-frames/terminal.js +99 -0
  856. package/dist/server/shared/binary-frames/terminal.js.map +1 -0
  857. package/dist/server/shared/client-capabilities.d.ts +5 -0
  858. package/dist/server/shared/client-capabilities.d.ts.map +1 -0
  859. package/dist/server/shared/client-capabilities.js +4 -0
  860. package/dist/server/shared/client-capabilities.js.map +1 -0
  861. package/dist/server/shared/connection-offer.d.ts +80 -0
  862. package/dist/server/shared/connection-offer.d.ts.map +1 -0
  863. package/dist/server/shared/connection-offer.js +53 -0
  864. package/dist/server/shared/connection-offer.js.map +1 -0
  865. package/dist/server/shared/daemon-endpoints.d.ts +47 -0
  866. package/dist/server/shared/daemon-endpoints.d.ts.map +1 -0
  867. package/dist/server/shared/daemon-endpoints.js +201 -0
  868. package/dist/server/shared/daemon-endpoints.js.map +1 -0
  869. package/dist/server/shared/error-utils.d.ts +11 -0
  870. package/dist/server/shared/error-utils.d.ts.map +1 -0
  871. package/dist/server/shared/error-utils.js +27 -0
  872. package/dist/server/shared/error-utils.js.map +1 -0
  873. package/dist/server/shared/git-remote.d.ts +16 -0
  874. package/dist/server/shared/git-remote.d.ts.map +1 -0
  875. package/dist/server/shared/git-remote.js +72 -0
  876. package/dist/server/shared/git-remote.js.map +1 -0
  877. package/dist/server/shared/host-connection-schema.d.ts +23 -0
  878. package/dist/server/shared/host-connection-schema.d.ts.map +1 -0
  879. package/dist/server/shared/host-connection-schema.js +9 -0
  880. package/dist/server/shared/host-connection-schema.js.map +1 -0
  881. package/dist/server/shared/importable-providers.d.ts +7 -0
  882. package/dist/server/shared/importable-providers.d.ts.map +1 -0
  883. package/dist/server/shared/importable-providers.js +7 -0
  884. package/dist/server/shared/importable-providers.js.map +1 -0
  885. package/dist/server/shared/literal-union.d.ts +2 -0
  886. package/dist/server/shared/literal-union.d.ts.map +1 -0
  887. package/dist/server/shared/literal-union.js +2 -0
  888. package/dist/server/shared/literal-union.js.map +1 -0
  889. package/dist/server/shared/messages.d.ts +140180 -0
  890. package/dist/server/shared/messages.d.ts.map +1 -0
  891. package/dist/server/shared/messages.js +3259 -0
  892. package/dist/server/shared/messages.js.map +1 -0
  893. package/dist/server/shared/path-utils.d.ts +2 -0
  894. package/dist/server/shared/path-utils.d.ts.map +1 -0
  895. package/dist/server/shared/path-utils.js +16 -0
  896. package/dist/server/shared/path-utils.js.map +1 -0
  897. package/dist/server/shared/terminal-input-mode.d.ts +26 -0
  898. package/dist/server/shared/terminal-input-mode.d.ts.map +1 -0
  899. package/dist/server/shared/terminal-input-mode.js +151 -0
  900. package/dist/server/shared/terminal-input-mode.js.map +1 -0
  901. package/dist/server/shared/tool-call-display.d.ts +11 -0
  902. package/dist/server/shared/tool-call-display.d.ts.map +1 -0
  903. package/dist/server/shared/tool-call-display.js +135 -0
  904. package/dist/server/shared/tool-call-display.js.map +1 -0
  905. package/dist/server/terminal/shell-integration/zsh/.zshenv +17 -0
  906. package/dist/server/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
  907. package/dist/server/terminal/terminal-capture.d.ts +12 -0
  908. package/dist/server/terminal/terminal-capture.d.ts.map +1 -0
  909. package/dist/server/terminal/terminal-capture.js +43 -0
  910. package/dist/server/terminal/terminal-capture.js.map +1 -0
  911. package/dist/server/terminal/terminal-manager-factory.d.ts +3 -0
  912. package/dist/server/terminal/terminal-manager-factory.d.ts.map +1 -0
  913. package/dist/server/terminal/terminal-manager-factory.js +5 -0
  914. package/dist/server/terminal/terminal-manager-factory.js.map +1 -0
  915. package/dist/server/terminal/terminal-manager.d.ts +47 -0
  916. package/dist/server/terminal/terminal-manager.d.ts.map +1 -0
  917. package/dist/server/terminal/terminal-manager.js +183 -0
  918. package/dist/server/terminal/terminal-manager.js.map +1 -0
  919. package/dist/server/terminal/terminal-output-coalescer.d.ts +30 -0
  920. package/dist/server/terminal/terminal-output-coalescer.d.ts.map +1 -0
  921. package/dist/server/terminal/terminal-output-coalescer.js +55 -0
  922. package/dist/server/terminal/terminal-output-coalescer.js.map +1 -0
  923. package/dist/server/terminal/terminal-session-controller.d.ts +64 -0
  924. package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -0
  925. package/dist/server/terminal/terminal-session-controller.js +653 -0
  926. package/dist/server/terminal/terminal-session-controller.js.map +1 -0
  927. package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
  928. package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
  929. package/dist/server/terminal/terminal-worker-process.d.ts.map +1 -0
  930. package/dist/server/terminal/terminal-worker-process.js +221 -0
  931. package/dist/server/terminal/terminal-worker-process.js.map +1 -0
  932. package/dist/server/terminal/terminal-worker-protocol.d.ts +113 -0
  933. package/dist/server/terminal/terminal-worker-protocol.d.ts.map +1 -0
  934. package/dist/server/terminal/terminal-worker-protocol.js +2 -0
  935. package/dist/server/terminal/terminal-worker-protocol.js.map +1 -0
  936. package/dist/server/terminal/terminal.d.ts +99 -0
  937. package/dist/server/terminal/terminal.d.ts.map +1 -0
  938. package/dist/server/terminal/terminal.js +877 -0
  939. package/dist/server/terminal/terminal.js.map +1 -0
  940. package/dist/server/terminal/worker-terminal-manager.d.ts +19 -0
  941. package/dist/server/terminal/worker-terminal-manager.d.ts.map +1 -0
  942. package/dist/server/terminal/worker-terminal-manager.js +492 -0
  943. package/dist/server/terminal/worker-terminal-manager.js.map +1 -0
  944. package/dist/server/utils/branch-slug.d.ts +14 -0
  945. package/dist/server/utils/branch-slug.d.ts.map +1 -0
  946. package/dist/server/utils/branch-slug.js +49 -0
  947. package/dist/server/utils/branch-slug.js.map +1 -0
  948. package/dist/server/utils/build-metadata-prompt.d.ts +14 -0
  949. package/dist/server/utils/build-metadata-prompt.d.ts.map +1 -0
  950. package/dist/server/utils/build-metadata-prompt.js +28 -0
  951. package/dist/server/utils/build-metadata-prompt.js.map +1 -0
  952. package/dist/server/utils/checkout-git.d.ts +213 -0
  953. package/dist/server/utils/checkout-git.d.ts.map +1 -0
  954. package/dist/server/utils/checkout-git.js +1885 -0
  955. package/dist/server/utils/checkout-git.js.map +1 -0
  956. package/dist/server/utils/directory-suggestions.d.ts +26 -0
  957. package/dist/server/utils/directory-suggestions.d.ts.map +1 -0
  958. package/dist/server/utils/directory-suggestions.js +732 -0
  959. package/dist/server/utils/directory-suggestions.js.map +1 -0
  960. package/dist/server/utils/executable.d.ts +10 -0
  961. package/dist/server/utils/executable.d.ts.map +1 -0
  962. package/dist/server/utils/executable.js +116 -0
  963. package/dist/server/utils/executable.js.map +1 -0
  964. package/dist/server/utils/git-rev-parse-path.d.ts +3 -0
  965. package/dist/server/utils/git-rev-parse-path.d.ts.map +1 -0
  966. package/dist/server/utils/git-rev-parse-path.js +21 -0
  967. package/dist/server/utils/git-rev-parse-path.js.map +1 -0
  968. package/dist/server/utils/github-remote.d.ts +9 -0
  969. package/dist/server/utils/github-remote.d.ts.map +1 -0
  970. package/dist/server/utils/github-remote.js +62 -0
  971. package/dist/server/utils/github-remote.js.map +1 -0
  972. package/dist/server/utils/paseo-config-file.d.ts +30 -0
  973. package/dist/server/utils/paseo-config-file.d.ts.map +1 -0
  974. package/dist/server/utils/paseo-config-file.js +90 -0
  975. package/dist/server/utils/paseo-config-file.js.map +1 -0
  976. package/dist/server/utils/paseo-config-schema.d.ts +915 -0
  977. package/dist/server/utils/paseo-config-schema.d.ts.map +1 -0
  978. package/dist/server/utils/paseo-config-schema.js +77 -0
  979. package/dist/server/utils/paseo-config-schema.js.map +1 -0
  980. package/dist/server/utils/path.d.ts +16 -0
  981. package/dist/server/utils/path.d.ts.map +1 -0
  982. package/dist/server/utils/path.js +110 -0
  983. package/dist/server/utils/path.js.map +1 -0
  984. package/dist/server/utils/project-icon.d.ts +39 -0
  985. package/dist/server/utils/project-icon.d.ts.map +1 -0
  986. package/dist/server/utils/project-icon.js +364 -0
  987. package/dist/server/utils/project-icon.js.map +1 -0
  988. package/dist/server/utils/promise-timeout.d.ts +9 -0
  989. package/dist/server/utils/promise-timeout.d.ts.map +1 -0
  990. package/dist/server/utils/promise-timeout.js +25 -0
  991. package/dist/server/utils/promise-timeout.js.map +1 -0
  992. package/dist/server/utils/run-git-command.d.ts +20 -0
  993. package/dist/server/utils/run-git-command.d.ts.map +1 -0
  994. package/dist/server/utils/run-git-command.js +146 -0
  995. package/dist/server/utils/run-git-command.js.map +1 -0
  996. package/dist/server/utils/script-hostname.d.ts +8 -0
  997. package/dist/server/utils/script-hostname.d.ts.map +1 -0
  998. package/dist/server/utils/script-hostname.js +14 -0
  999. package/dist/server/utils/script-hostname.js.map +1 -0
  1000. package/dist/server/utils/spawn.d.ts +33 -0
  1001. package/dist/server/utils/spawn.d.ts.map +1 -0
  1002. package/dist/server/utils/spawn.js +71 -0
  1003. package/dist/server/utils/spawn.js.map +1 -0
  1004. package/dist/server/utils/string-command-shell.d.ts +10 -0
  1005. package/dist/server/utils/string-command-shell.d.ts.map +1 -0
  1006. package/dist/server/utils/string-command-shell.js +21 -0
  1007. package/dist/server/utils/string-command-shell.js.map +1 -0
  1008. package/dist/server/utils/tree-kill.d.ts +18 -0
  1009. package/dist/server/utils/tree-kill.d.ts.map +1 -0
  1010. package/dist/server/utils/tree-kill.js +77 -0
  1011. package/dist/server/utils/tree-kill.js.map +1 -0
  1012. package/dist/server/utils/windows-command.d.ts +15 -0
  1013. package/dist/server/utils/windows-command.d.ts.map +1 -0
  1014. package/dist/server/utils/windows-command.js +41 -0
  1015. package/dist/server/utils/windows-command.js.map +1 -0
  1016. package/dist/server/utils/worktree-metadata.d.ts +91 -0
  1017. package/dist/server/utils/worktree-metadata.d.ts.map +1 -0
  1018. package/dist/server/utils/worktree-metadata.js +174 -0
  1019. package/dist/server/utils/worktree-metadata.js.map +1 -0
  1020. package/dist/server/utils/worktree.d.ts +195 -0
  1021. package/dist/server/utils/worktree.d.ts.map +1 -0
  1022. package/dist/server/utils/worktree.js +1004 -0
  1023. package/dist/server/utils/worktree.js.map +1 -0
  1024. package/dist/server/utils/wrap-user-instructions.d.ts +2 -0
  1025. package/dist/server/utils/wrap-user-instructions.d.ts.map +1 -0
  1026. package/dist/server/utils/wrap-user-instructions.js +13 -0
  1027. package/dist/server/utils/wrap-user-instructions.js.map +1 -0
  1028. package/dist/src/server/agent/agent-sdk-types.js +22 -0
  1029. package/dist/src/server/agent/agent-sdk-types.js.map +1 -0
  1030. package/dist/src/server/agent/agent-title-limits.js +3 -0
  1031. package/dist/src/server/agent/agent-title-limits.js.map +1 -0
  1032. package/dist/src/server/agent/provider-launch-config.js +190 -0
  1033. package/dist/src/server/agent/provider-launch-config.js.map +1 -0
  1034. package/dist/src/server/agent/provider-manifest.js +211 -0
  1035. package/dist/src/server/agent/provider-manifest.js.map +1 -0
  1036. package/dist/src/server/chat/chat-rpc-schemas.js +103 -0
  1037. package/dist/src/server/chat/chat-rpc-schemas.js.map +1 -0
  1038. package/dist/src/server/chat/chat-types.js +22 -0
  1039. package/dist/src/server/chat/chat-types.js.map +1 -0
  1040. package/dist/src/server/loop/rpc-schemas.js +163 -0
  1041. package/dist/src/server/loop/rpc-schemas.js.map +1 -0
  1042. package/dist/src/server/paseo-env.js +53 -0
  1043. package/dist/src/server/paseo-env.js.map +1 -0
  1044. package/dist/src/server/paseo-home.js +19 -0
  1045. package/dist/src/server/paseo-home.js.map +1 -0
  1046. package/dist/src/server/persisted-config.js +398 -0
  1047. package/dist/src/server/persisted-config.js.map +1 -0
  1048. package/dist/src/server/pid-lock.js +170 -0
  1049. package/dist/src/server/pid-lock.js.map +1 -0
  1050. package/dist/src/server/private-files.js +42 -0
  1051. package/dist/src/server/private-files.js.map +1 -0
  1052. package/dist/src/server/schedule/rpc-schemas.js +151 -0
  1053. package/dist/src/server/schedule/rpc-schemas.js.map +1 -0
  1054. package/dist/src/server/schedule/types.js +73 -0
  1055. package/dist/src/server/schedule/types.js.map +1 -0
  1056. package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  1057. package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js.map +1 -0
  1058. package/dist/src/shared/agent-lifecycle.js +8 -0
  1059. package/dist/src/shared/agent-lifecycle.js.map +1 -0
  1060. package/dist/src/shared/client-capabilities.js +4 -0
  1061. package/dist/src/shared/client-capabilities.js.map +1 -0
  1062. package/dist/src/shared/literal-union.js +2 -0
  1063. package/dist/src/shared/literal-union.js.map +1 -0
  1064. package/dist/src/shared/messages.js +3259 -0
  1065. package/dist/src/shared/messages.js.map +1 -0
  1066. package/dist/src/terminal/shell-integration/zsh/.zshenv +17 -0
  1067. package/dist/src/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
  1068. package/dist/src/utils/executable.js +116 -0
  1069. package/dist/src/utils/executable.js.map +1 -0
  1070. package/dist/src/utils/paseo-config-schema.js +77 -0
  1071. package/dist/src/utils/paseo-config-schema.js.map +1 -0
  1072. package/dist/src/utils/spawn.js +71 -0
  1073. package/dist/src/utils/spawn.js.map +1 -0
  1074. package/dist/src/utils/windows-command.js +41 -0
  1075. package/dist/src/utils/windows-command.js.map +1 -0
  1076. package/package.json +115 -0
  1077. package/src/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
@@ -0,0 +1,3815 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import { promises } from "node:fs";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { mapClaudeCanceledToolCall, mapClaudeCompletedToolCall, mapClaudeFailedToolCall, mapClaudeRunningToolCall, } from "./tool-call-mapper.js";
7
+ import { mapTaskNotificationSystemRecordToToolCall, mapTaskNotificationUserContentToToolCall, } from "./task-notification-tool-call.js";
8
+ import { getClaudeModelsWithSettings, normalizeClaudeRuntimeModelId } from "./models.js";
9
+ import { parsePartialJsonObject } from "./partial-json.js";
10
+ import { ClaudeSidechainTracker } from "./sidechain-tracker.js";
11
+ import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, toDiagnosticErrorMessage, } from "../diagnostic-utils.js";
12
+ import { appendOrReplaceGrowingAssistantMessage, runProviderTurn } from "../provider-runner.js";
13
+ import { renderPromptAttachmentAsText } from "../../prompt-attachments.js";
14
+ import { claudeQuery } from "./query.js";
15
+ import { normalizeProviderReplayTimestamp } from "../../provider-history-timestamps.js";
16
+ import { getAgentStreamEventTurnId, } from "../../agent-sdk-types.js";
17
+ import { createProviderEnv, createProviderEnvSpec, } from "../../provider-launch-config.js";
18
+ import { findExecutable, isCommandAvailable } from "../../../../utils/executable.js";
19
+ import { withTimeout } from "../../../../utils/promise-timeout.js";
20
+ import { execCommand } from "../../../../utils/spawn.js";
21
+ import { composeSystemPromptParts } from "../../system-prompt.js";
22
+ const fsPromises = promises;
23
+ const CLAUDE_SETTING_SOURCES = [
24
+ "user",
25
+ "project",
26
+ "local",
27
+ ];
28
+ function readNonEmptyString(value) {
29
+ return typeof value === "string" && value.trim().length > 0 ? value : null;
30
+ }
31
+ export function normalizeClaudeAskUserQuestionUpdatedInput(updatedInput, fallbackInput) {
32
+ const fallback = isMetadata(fallbackInput) ? fallbackInput : {};
33
+ const base = isMetadata(updatedInput) ? updatedInput : {};
34
+ // Paseo's shared question UI serializes answers by question header, but Claude's
35
+ // AskUserQuestion tool expects answer keys to match the full question text. Merge
36
+ // the original request payload back in so provider callbacks that only return
37
+ // `{ answers }` still satisfy Claude's full tool input schema.
38
+ const merged = { ...fallback, ...base };
39
+ const questions = (Array.isArray(base.questions) ? base.questions : null) ??
40
+ (Array.isArray(fallback.questions) ? fallback.questions : null);
41
+ const answers = isMetadata(base.answers) ? base.answers : null;
42
+ if (!questions || !answers) {
43
+ return merged;
44
+ }
45
+ const normalizedAnswers = {};
46
+ for (const item of questions) {
47
+ const question = isMetadata(item) ? item : null;
48
+ if (!question) {
49
+ continue;
50
+ }
51
+ const questionText = readNonEmptyString(question.question);
52
+ if (!questionText) {
53
+ continue;
54
+ }
55
+ const header = readNonEmptyString(question.header);
56
+ const answer = readNonEmptyString(answers[questionText]) ??
57
+ (header ? readNonEmptyString(answers[header]) : null);
58
+ if (answer) {
59
+ normalizedAnswers[questionText] = answer;
60
+ }
61
+ }
62
+ if (Object.keys(normalizedAnswers).length === 0) {
63
+ return merged;
64
+ }
65
+ return {
66
+ ...merged,
67
+ answers: normalizedAnswers,
68
+ };
69
+ }
70
+ function isObjectRecord(value) {
71
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
72
+ }
73
+ function toObjectRecord(value) {
74
+ return isObjectRecord(value) ? value : undefined;
75
+ }
76
+ function isUnknownArray(value) {
77
+ return Array.isArray(value);
78
+ }
79
+ function isImageMimeType(value) {
80
+ return (value === "image/jpeg" ||
81
+ value === "image/png" ||
82
+ value === "image/gif" ||
83
+ value === "image/webp");
84
+ }
85
+ const CLAUDE_CAPABILITIES = {
86
+ supportsStreaming: true,
87
+ supportsSessionPersistence: true,
88
+ supportsDynamicModes: true,
89
+ supportsMcpServers: true,
90
+ supportsReasoningStream: true,
91
+ supportsToolInvocations: true,
92
+ };
93
+ const DEFAULT_MODES = [
94
+ {
95
+ id: "default",
96
+ label: "Always Ask",
97
+ description: "Prompts for permission the first time a tool is used",
98
+ },
99
+ {
100
+ id: "auto",
101
+ label: "Auto mode",
102
+ description: "Uses a model classifier to review permission prompts automatically",
103
+ },
104
+ {
105
+ id: "acceptEdits",
106
+ label: "Accept File Edits",
107
+ description: "Automatically approves edit-focused tools without prompting",
108
+ },
109
+ {
110
+ id: "plan",
111
+ label: "Plan Mode",
112
+ description: "Analyze the codebase without executing tools or edits",
113
+ },
114
+ {
115
+ id: "bypassPermissions",
116
+ label: "Bypass",
117
+ description: "Skip all permission prompts (use with caution)",
118
+ },
119
+ ];
120
+ const VALID_CLAUDE_MODES = new Set(DEFAULT_MODES.map((mode) => mode.id));
121
+ const REWIND_COMMAND_NAME = "rewind";
122
+ const REWIND_COMMAND = {
123
+ name: REWIND_COMMAND_NAME,
124
+ description: "Rewind tracked files to a previous user message",
125
+ argumentHint: "[user_message_uuid]",
126
+ };
127
+ const INTERRUPT_TOOL_USE_PLACEHOLDER = "[Request interrupted by user for tool use]";
128
+ const INTERRUPT_PLACEHOLDER_PATTERN = /^\[Request interrupted by user(?:[^\]]*)\]$/;
129
+ const NO_RESPONSE_REQUESTED_PLACEHOLDER = "No response requested.";
130
+ 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;
131
+ function resolvePathEnvKey() {
132
+ if (process.env["Path"] !== undefined)
133
+ return "Path";
134
+ if (process.env["PATH"] !== undefined)
135
+ return "PATH";
136
+ return null;
137
+ }
138
+ function errorToMessageString(error) {
139
+ if (typeof error === "string")
140
+ return error;
141
+ if (error instanceof Error)
142
+ return error.message;
143
+ return "";
144
+ }
145
+ function firstStringField(input, primaryKey, secondaryKey) {
146
+ const primary = input[primaryKey];
147
+ if (typeof primary === "string")
148
+ return primary;
149
+ const secondary = input[secondaryKey];
150
+ if (typeof secondary === "string")
151
+ return secondary;
152
+ return undefined;
153
+ }
154
+ function extractSessionIdRaw(msg) {
155
+ if (typeof msg.session_id === "string")
156
+ return msg.session_id;
157
+ if (typeof msg.sessionId === "string")
158
+ return msg.sessionId;
159
+ if (typeof msg.session?.id === "string")
160
+ return msg.session.id;
161
+ return "";
162
+ }
163
+ function isClaudeThinkingEffort(value) {
164
+ return (value === "low" ||
165
+ value === "medium" ||
166
+ value === "high" ||
167
+ value === "xhigh" ||
168
+ value === "max");
169
+ }
170
+ function sanitizeClaudeProjectPath(cwd) {
171
+ return cwd.replace(/[\\/._:]/g, "-");
172
+ }
173
+ const MAX_RECENT_STDERR_CHARS = 4000;
174
+ const STDERR_FLUSH_WAIT_MS = 150;
175
+ const STDERR_FLUSH_POLL_INTERVAL_MS = 10;
176
+ function summarizeClaudeOptionsForLog(options) {
177
+ const systemPromptRaw = options.systemPrompt;
178
+ const systemPromptSummary = (() => {
179
+ if (!systemPromptRaw) {
180
+ return { mode: "none", preset: null };
181
+ }
182
+ if (typeof systemPromptRaw === "string") {
183
+ return { mode: "string", preset: null };
184
+ }
185
+ const prompt = toObjectRecord(systemPromptRaw);
186
+ const promptType = typeof prompt?.type === "string" ? prompt.type : "custom";
187
+ return {
188
+ mode: promptType === "preset" ? "preset" : "custom",
189
+ preset: typeof prompt?.preset === "string" && prompt.preset.length > 0 ? prompt.preset : null,
190
+ };
191
+ })();
192
+ const mcpServerNames = options.mcpServers ? Object.keys(options.mcpServers).sort() : [];
193
+ return {
194
+ cwd: typeof options.cwd === "string" ? options.cwd : null,
195
+ permissionMode: typeof options.permissionMode === "string" ? options.permissionMode : null,
196
+ model: typeof options.model === "string" ? options.model : null,
197
+ includePartialMessages: options.includePartialMessages === true,
198
+ settingSources: Array.isArray(options.settingSources) ? options.settingSources : [],
199
+ enableFileCheckpointing: options.enableFileCheckpointing === true,
200
+ hasResume: typeof options.resume === "string" && options.resume.length > 0,
201
+ maxThinkingTokens: typeof options.maxThinkingTokens === "number" ? options.maxThinkingTokens : null,
202
+ hasEnv: !!options.env,
203
+ envKeyCount: Object.keys(options.env ?? {}).length,
204
+ hasMcpServers: mcpServerNames.length > 0,
205
+ mcpServerNames,
206
+ systemPromptMode: systemPromptSummary.mode,
207
+ systemPromptPreset: systemPromptSummary.preset,
208
+ hasCanUseTool: typeof options.canUseTool === "function",
209
+ hasSpawnOverride: typeof options.spawnClaudeCodeProcess === "function",
210
+ hasStderrHandler: typeof options.stderr === "function",
211
+ pathToClaudeCodeExecutable: typeof options.pathToClaudeCodeExecutable === "string"
212
+ ? options.pathToClaudeCodeExecutable
213
+ : null,
214
+ persistSession: typeof options.persistSession === "boolean" ? options.persistSession : null,
215
+ };
216
+ }
217
+ function isToolResultTextBlock(value) {
218
+ return (!!value &&
219
+ typeof value === "object" &&
220
+ value.type === "text" &&
221
+ typeof value.text === "string");
222
+ }
223
+ function normalizeForDeterministicString(value, seen) {
224
+ if (value === null ||
225
+ typeof value === "string" ||
226
+ typeof value === "number" ||
227
+ typeof value === "boolean") {
228
+ return value;
229
+ }
230
+ if (typeof value === "bigint") {
231
+ return value.toString();
232
+ }
233
+ if (typeof value === "function") {
234
+ return "[function]";
235
+ }
236
+ if (typeof value === "symbol") {
237
+ return value.toString();
238
+ }
239
+ if (typeof value === "undefined") {
240
+ return "[undefined]";
241
+ }
242
+ if (Array.isArray(value)) {
243
+ return value.map((entry) => normalizeForDeterministicString(entry, seen));
244
+ }
245
+ if (typeof value === "object") {
246
+ const objectValue = value;
247
+ if (seen.has(objectValue)) {
248
+ return "[circular]";
249
+ }
250
+ seen.add(objectValue);
251
+ const record = toObjectRecord(value);
252
+ if (!record) {
253
+ seen.delete(objectValue);
254
+ return "[invalid]";
255
+ }
256
+ const normalized = {};
257
+ for (const key of Object.keys(record).sort()) {
258
+ normalized[key] = normalizeForDeterministicString(record[key], seen);
259
+ }
260
+ seen.delete(objectValue);
261
+ return normalized;
262
+ }
263
+ if (typeof value === "number" || typeof value === "boolean") {
264
+ return String(value);
265
+ }
266
+ return "[unsupported]";
267
+ }
268
+ function deterministicStringify(value) {
269
+ if (typeof value === "undefined") {
270
+ return "";
271
+ }
272
+ try {
273
+ const normalized = normalizeForDeterministicString(value, new WeakSet());
274
+ if (typeof normalized === "string") {
275
+ return normalized;
276
+ }
277
+ return JSON.stringify(normalized);
278
+ }
279
+ catch {
280
+ if (typeof value === "string") {
281
+ return value;
282
+ }
283
+ if (typeof value === "number" || typeof value === "boolean") {
284
+ return String(value);
285
+ }
286
+ return "[unserializable]";
287
+ }
288
+ }
289
+ function coerceToolResultContentToString(content) {
290
+ if (typeof content === "string") {
291
+ return content;
292
+ }
293
+ if (Array.isArray(content) && content.every((block) => isToolResultTextBlock(block))) {
294
+ return content.map((block) => block.text).join("");
295
+ }
296
+ return deterministicStringify(content);
297
+ }
298
+ function normalizeClaudeTranscriptText(value) {
299
+ if (typeof value !== "string") {
300
+ return null;
301
+ }
302
+ const normalized = value.trim();
303
+ return normalized.length > 0 ? normalized : null;
304
+ }
305
+ function isClaudeInterruptPlaceholderText(value) {
306
+ const normalized = normalizeClaudeTranscriptText(value);
307
+ return normalized !== null && INTERRUPT_PLACEHOLDER_PATTERN.test(normalized);
308
+ }
309
+ function isClaudeNoResponsePlaceholderText(value) {
310
+ return normalizeClaudeTranscriptText(value) === NO_RESPONSE_REQUESTED_PLACEHOLDER;
311
+ }
312
+ const LOCAL_COMMAND_STDOUT_PATTERN = /^\s*<local-command-stdout>[\s\S]*<\/local-command-stdout>\s*$/;
313
+ function isClaudeLocalCommandStdout(value) {
314
+ const normalized = normalizeClaudeTranscriptText(value);
315
+ return normalized !== null && LOCAL_COMMAND_STDOUT_PATTERN.test(normalized);
316
+ }
317
+ function isClaudeTranscriptNoiseText(value) {
318
+ return (isClaudeInterruptPlaceholderText(value) ||
319
+ isClaudeNoResponsePlaceholderText(value) ||
320
+ isClaudeLocalCommandStdout(value));
321
+ }
322
+ function collectClaudeTextContentParts(content) {
323
+ if (typeof content === "string") {
324
+ const normalized = normalizeClaudeTranscriptText(content);
325
+ return normalized ? [normalized] : [];
326
+ }
327
+ if (!isUnknownArray(content)) {
328
+ return [];
329
+ }
330
+ const parts = [];
331
+ for (const block of content) {
332
+ const blockRecord = toObjectRecord(block);
333
+ if (!blockRecord) {
334
+ continue;
335
+ }
336
+ const text = normalizeClaudeTranscriptText(blockRecord.text);
337
+ if (text) {
338
+ parts.push(text);
339
+ continue;
340
+ }
341
+ const input = normalizeClaudeTranscriptText(blockRecord.input);
342
+ if (input) {
343
+ parts.push(input);
344
+ }
345
+ }
346
+ return parts;
347
+ }
348
+ function isClaudeTranscriptNoiseContent(content) {
349
+ const parts = collectClaudeTextContentParts(content);
350
+ return parts.length > 0 && parts.every((part) => isClaudeTranscriptNoiseText(part));
351
+ }
352
+ export function extractUserMessageText(content) {
353
+ if (typeof content === "string") {
354
+ const normalized = content.trim();
355
+ if (!normalized || isClaudeTranscriptNoiseText(normalized)) {
356
+ return null;
357
+ }
358
+ return normalized;
359
+ }
360
+ if (!Array.isArray(content)) {
361
+ return null;
362
+ }
363
+ const parts = [];
364
+ for (const block of content) {
365
+ if (!block || typeof block !== "object") {
366
+ continue;
367
+ }
368
+ const text = typeof block.text === "string" ? block.text : undefined;
369
+ if (text && text.trim()) {
370
+ const trimmed = text.trim();
371
+ if (!isClaudeTranscriptNoiseText(trimmed)) {
372
+ parts.push(trimmed);
373
+ }
374
+ continue;
375
+ }
376
+ const input = typeof block.input === "string" ? block.input : undefined;
377
+ if (input && input.trim()) {
378
+ const trimmed = input.trim();
379
+ if (!isClaudeTranscriptNoiseText(trimmed)) {
380
+ parts.push(trimmed);
381
+ }
382
+ }
383
+ }
384
+ if (parts.length === 0) {
385
+ return null;
386
+ }
387
+ const combined = parts.join("\n\n").trim();
388
+ return combined.length > 0 ? combined : null;
389
+ }
390
+ function isMetadata(value) {
391
+ return typeof value === "object" && value !== null;
392
+ }
393
+ function createDefaultToolUseCacheEntry(id, block) {
394
+ const nameFromBlock = typeof block.name === "string" && block.name.length > 0 ? block.name : "tool";
395
+ let server;
396
+ if (typeof block.server === "string" && block.server.length > 0) {
397
+ server = block.server;
398
+ }
399
+ else if (typeof block.name === "string" && block.name.length > 0) {
400
+ server = block.name;
401
+ }
402
+ else {
403
+ server = "tool";
404
+ }
405
+ return {
406
+ id,
407
+ name: nameFromBlock,
408
+ server,
409
+ classification: "generic",
410
+ started: false,
411
+ };
412
+ }
413
+ function readTrimmedString(value) {
414
+ if (typeof value !== "string") {
415
+ return undefined;
416
+ }
417
+ const trimmed = value.trim();
418
+ return trimmed.length > 0 ? trimmed : undefined;
419
+ }
420
+ function isMcpServerConfig(value) {
421
+ if (!isMetadata(value)) {
422
+ return false;
423
+ }
424
+ const type = value.type;
425
+ if (type === "stdio") {
426
+ return typeof value.command === "string";
427
+ }
428
+ if (type === "http" || type === "sse") {
429
+ return typeof value.url === "string";
430
+ }
431
+ return false;
432
+ }
433
+ function isMcpServersRecord(value) {
434
+ if (!isMetadata(value)) {
435
+ return false;
436
+ }
437
+ for (const config of Object.values(value)) {
438
+ if (!isMcpServerConfig(config)) {
439
+ return false;
440
+ }
441
+ }
442
+ return true;
443
+ }
444
+ function isPermissionMode(value) {
445
+ return typeof value === "string" && VALID_CLAUDE_MODES.has(value);
446
+ }
447
+ function isTruthyEnvValue(value) {
448
+ const normalized = value?.trim().toLowerCase();
449
+ return (normalized !== undefined &&
450
+ normalized.length > 0 &&
451
+ normalized !== "0" &&
452
+ normalized !== "false" &&
453
+ normalized !== "no" &&
454
+ normalized !== "off");
455
+ }
456
+ function detectIneligibleAutoModeTransport(env) {
457
+ if (isTruthyEnvValue(env.CLAUDE_CODE_USE_BEDROCK)) {
458
+ return "Bedrock";
459
+ }
460
+ if (isTruthyEnvValue(env.CLAUDE_CODE_USE_VERTEX)) {
461
+ return "Vertex";
462
+ }
463
+ return null;
464
+ }
465
+ function assertClaudeAutoModeEligible(mode, env) {
466
+ if (mode !== "auto") {
467
+ return;
468
+ }
469
+ const transport = detectIneligibleAutoModeTransport(env);
470
+ if (transport === null) {
471
+ return;
472
+ }
473
+ throw new Error(`Claude Auto mode requires the Anthropic API and is not supported when Claude Code uses ${transport}. Select another permission mode or unset the ${transport === "Bedrock" ? "CLAUDE_CODE_USE_BEDROCK" : "CLAUDE_CODE_USE_VERTEX"} environment variable.`);
474
+ }
475
+ function coerceSessionMetadata(metadata) {
476
+ if (!isMetadata(metadata)) {
477
+ return {};
478
+ }
479
+ const result = {};
480
+ if (metadata.provider === "claude" || metadata.provider === "codex") {
481
+ result.provider = metadata.provider;
482
+ }
483
+ if (typeof metadata.cwd === "string") {
484
+ result.cwd = metadata.cwd;
485
+ }
486
+ if (typeof metadata.modeId === "string") {
487
+ result.modeId = metadata.modeId;
488
+ }
489
+ if (typeof metadata.model === "string") {
490
+ result.model = metadata.model;
491
+ }
492
+ if (typeof metadata.title === "string" || metadata.title === null) {
493
+ result.title = metadata.title;
494
+ }
495
+ if (typeof metadata.approvalPolicy === "string") {
496
+ result.approvalPolicy = metadata.approvalPolicy;
497
+ }
498
+ if (typeof metadata.sandboxMode === "string") {
499
+ result.sandboxMode = metadata.sandboxMode;
500
+ }
501
+ if (typeof metadata.networkAccess === "boolean") {
502
+ result.networkAccess = metadata.networkAccess;
503
+ }
504
+ if (typeof metadata.webSearch === "boolean") {
505
+ result.webSearch = metadata.webSearch;
506
+ }
507
+ if (isMetadata(metadata.extra)) {
508
+ const extra = {};
509
+ if (isMetadata(metadata.extra.codex)) {
510
+ extra.codex = metadata.extra.codex;
511
+ }
512
+ if (isClaudeExtra(metadata.extra.claude)) {
513
+ extra.claude = metadata.extra.claude;
514
+ }
515
+ if (extra.codex || extra.claude) {
516
+ result.extra = extra;
517
+ }
518
+ }
519
+ if (typeof metadata.systemPrompt === "string") {
520
+ result.systemPrompt = metadata.systemPrompt;
521
+ }
522
+ if (isMcpServersRecord(metadata.mcpServers)) {
523
+ result.mcpServers = metadata.mcpServers;
524
+ }
525
+ return result;
526
+ }
527
+ function toClaudeSdkMcpConfig(config) {
528
+ switch (config.type) {
529
+ case "stdio":
530
+ return {
531
+ type: "stdio",
532
+ command: config.command,
533
+ args: config.args,
534
+ env: config.env,
535
+ };
536
+ case "http":
537
+ return {
538
+ type: "http",
539
+ url: config.url,
540
+ headers: config.headers,
541
+ };
542
+ case "sse":
543
+ return {
544
+ type: "sse",
545
+ url: config.url,
546
+ headers: config.headers,
547
+ };
548
+ }
549
+ throw new Error("Unhandled MCP server config type");
550
+ }
551
+ function isClaudeContentChunk(value) {
552
+ return isMetadata(value) && typeof value.type === "string";
553
+ }
554
+ function isClaudeExtra(value) {
555
+ return isMetadata(value);
556
+ }
557
+ function isPermissionUpdate(value) {
558
+ if (!isMetadata(value)) {
559
+ return false;
560
+ }
561
+ const type = value.type;
562
+ if (type !== "addRules" && type !== "replaceRules" && type !== "removeRules") {
563
+ return false;
564
+ }
565
+ const rules = value.rules;
566
+ const behavior = value.behavior;
567
+ const destination = value.destination;
568
+ return Array.isArray(rules) && typeof behavior === "string" && typeof destination === "string";
569
+ }
570
+ function resolvePermissionKind(toolName, input) {
571
+ if (toolName === "ExitPlanMode")
572
+ return "plan";
573
+ if (toolName === "AskUserQuestion" && Array.isArray(input.questions)) {
574
+ return "question";
575
+ }
576
+ return "tool";
577
+ }
578
+ function getClaudeModeLabel(modeId) {
579
+ return DEFAULT_MODES.find((mode) => mode.id === modeId)?.label ?? modeId;
580
+ }
581
+ function buildClaudePlanPermissionActions(resumeMode) {
582
+ const actions = [
583
+ {
584
+ id: "reject",
585
+ label: "Reject",
586
+ behavior: "deny",
587
+ variant: "danger",
588
+ intent: "dismiss",
589
+ },
590
+ {
591
+ id: "implement",
592
+ label: "Implement",
593
+ behavior: "allow",
594
+ variant: "primary",
595
+ intent: "implement",
596
+ },
597
+ ];
598
+ if (resumeMode === "bypassPermissions") {
599
+ actions.push({
600
+ id: "implement_resume",
601
+ label: `Implement with ${getClaudeModeLabel(resumeMode)}`,
602
+ behavior: "allow",
603
+ variant: "secondary",
604
+ intent: "implement_resume",
605
+ });
606
+ }
607
+ return actions;
608
+ }
609
+ class TimelineAssembler {
610
+ constructor() {
611
+ this.messages = new Map();
612
+ this.finalizedMessageIds = new Set();
613
+ this.activeMessageByRun = new Map();
614
+ this.syntheticMessageCounter = 0;
615
+ }
616
+ consume(input) {
617
+ if (input.message.type === "assistant") {
618
+ return this.consumeAssistantMessage(input.message, input.runId, input.messageIdHint ?? null);
619
+ }
620
+ if (input.message.type === "stream_event") {
621
+ return this.consumeStreamEvent(input.message, input.runId, input.messageIdHint ?? null);
622
+ }
623
+ return [];
624
+ }
625
+ consumeAssistantMessage(message, runId, messageIdHint) {
626
+ const messageId = this.readMessageIdFromAssistantMessage(message) ??
627
+ messageIdHint ??
628
+ this.resolveMessageId({ runId, createIfMissing: true, messageId: null });
629
+ if (!messageId) {
630
+ return [];
631
+ }
632
+ if (this.finalizedMessageIds.has(messageId)) {
633
+ return [];
634
+ }
635
+ const state = this.ensureMessageState(messageId, runId);
636
+ const fragments = this.extractFragments(message.message?.content);
637
+ return this.applyAbsoluteFragments(state, fragments);
638
+ }
639
+ consumeStreamEvent(message, runId, messageIdHint) {
640
+ const event = toObjectRecord(message.event) ?? {};
641
+ const eventType = readTrimmedString(event.type);
642
+ const streamEventMessageId = this.readMessageIdFromStreamEvent(event) ?? messageIdHint;
643
+ if (eventType === "message_start") {
644
+ const messageId = this.resolveMessageId({
645
+ runId,
646
+ createIfMissing: true,
647
+ messageId: streamEventMessageId,
648
+ });
649
+ if (!messageId) {
650
+ return [];
651
+ }
652
+ this.ensureMessageState(messageId, runId);
653
+ return [];
654
+ }
655
+ if (eventType === "message_stop") {
656
+ const messageId = this.resolveMessageId({
657
+ runId,
658
+ createIfMissing: false,
659
+ messageId: streamEventMessageId,
660
+ });
661
+ if (!messageId) {
662
+ return [];
663
+ }
664
+ return this.finalizeMessage(messageId, runId);
665
+ }
666
+ if (eventType === "content_block_start") {
667
+ return this.consumeDeltaContent(event.content_block, runId, streamEventMessageId);
668
+ }
669
+ if (eventType === "content_block_delta") {
670
+ return this.consumeDeltaContent(event.delta, runId, streamEventMessageId);
671
+ }
672
+ return [];
673
+ }
674
+ consumeDeltaContent(content, runId, messageIdHint) {
675
+ const fragments = this.extractFragments(content);
676
+ if (fragments.length === 0) {
677
+ return [];
678
+ }
679
+ const messageId = this.resolveMessageId({
680
+ runId,
681
+ createIfMissing: true,
682
+ messageId: messageIdHint,
683
+ });
684
+ if (!messageId) {
685
+ return [];
686
+ }
687
+ const state = this.ensureMessageState(messageId, runId);
688
+ return this.appendFragments(state, fragments);
689
+ }
690
+ appendFragments(state, fragments) {
691
+ for (const fragment of fragments) {
692
+ if (fragment.kind === "assistant") {
693
+ state.assistantText += fragment.text;
694
+ }
695
+ else {
696
+ state.reasoningText += fragment.text;
697
+ }
698
+ }
699
+ return this.emitNewContent(state);
700
+ }
701
+ applyAbsoluteFragments(state, fragments) {
702
+ const assistantText = fragments
703
+ .filter((fragment) => fragment.kind === "assistant")
704
+ .map((fragment) => fragment.text)
705
+ .join("");
706
+ const reasoningText = fragments
707
+ .filter((fragment) => fragment.kind === "reasoning")
708
+ .map((fragment) => fragment.text)
709
+ .join("");
710
+ if (assistantText.length > 0) {
711
+ if (!assistantText.startsWith(state.assistantText)) {
712
+ state.emittedAssistantLength = 0;
713
+ }
714
+ state.assistantText = assistantText;
715
+ }
716
+ if (reasoningText.length > 0) {
717
+ if (!reasoningText.startsWith(state.reasoningText)) {
718
+ state.emittedReasoningLength = 0;
719
+ }
720
+ state.reasoningText = reasoningText;
721
+ }
722
+ return this.emitNewContent(state);
723
+ }
724
+ finalizeMessage(messageId, runId) {
725
+ const state = this.messages.get(messageId);
726
+ if (!state) {
727
+ return [];
728
+ }
729
+ state.stopped = true;
730
+ const items = this.emitNewContent(state);
731
+ if (runId && this.activeMessageByRun.get(runId) === messageId) {
732
+ this.activeMessageByRun.delete(runId);
733
+ }
734
+ this.finalizedMessageIds.add(messageId);
735
+ this.messages.delete(messageId);
736
+ return items;
737
+ }
738
+ emitNewContent(state) {
739
+ const items = [];
740
+ const nextAssistantText = state.assistantText.slice(state.emittedAssistantLength);
741
+ if (nextAssistantText.length > 0 &&
742
+ nextAssistantText !== INTERRUPT_TOOL_USE_PLACEHOLDER &&
743
+ !isClaudeTranscriptNoiseText(nextAssistantText)) {
744
+ state.emittedAssistantLength = state.assistantText.length;
745
+ items.push({ type: "assistant_message", text: nextAssistantText });
746
+ }
747
+ const nextReasoningText = state.reasoningText.slice(state.emittedReasoningLength);
748
+ if (nextReasoningText.length > 0) {
749
+ state.emittedReasoningLength = state.reasoningText.length;
750
+ items.push({ type: "reasoning", text: nextReasoningText });
751
+ }
752
+ return items;
753
+ }
754
+ ensureMessageState(messageId, runId) {
755
+ const existing = this.messages.get(messageId);
756
+ if (existing) {
757
+ existing.stopped = false;
758
+ if (runId) {
759
+ this.activeMessageByRun.set(runId, messageId);
760
+ }
761
+ return existing;
762
+ }
763
+ const created = {
764
+ id: messageId,
765
+ assistantText: "",
766
+ reasoningText: "",
767
+ emittedAssistantLength: 0,
768
+ emittedReasoningLength: 0,
769
+ stopped: false,
770
+ };
771
+ this.messages.set(messageId, created);
772
+ if (runId) {
773
+ this.activeMessageByRun.set(runId, messageId);
774
+ }
775
+ return created;
776
+ }
777
+ resolveMessageId(input) {
778
+ if (input.messageId) {
779
+ return input.messageId;
780
+ }
781
+ if (input.runId) {
782
+ const active = this.activeMessageByRun.get(input.runId);
783
+ if (active) {
784
+ return active;
785
+ }
786
+ }
787
+ if (!input.createIfMissing) {
788
+ return null;
789
+ }
790
+ const synthetic = `synthetic-message-${++this.syntheticMessageCounter}`;
791
+ if (input.runId) {
792
+ this.activeMessageByRun.set(input.runId, synthetic);
793
+ }
794
+ return synthetic;
795
+ }
796
+ extractFragments(content) {
797
+ if (typeof content === "string") {
798
+ if (content.length === 0) {
799
+ return [];
800
+ }
801
+ return [{ kind: "assistant", text: content }];
802
+ }
803
+ const blocks = Array.isArray(content) ? content : [content];
804
+ const fragments = [];
805
+ for (const rawBlock of blocks) {
806
+ if (!isClaudeContentChunk(rawBlock)) {
807
+ continue;
808
+ }
809
+ if ((rawBlock.type === "text" || rawBlock.type === "text_delta") &&
810
+ typeof rawBlock.text === "string" &&
811
+ rawBlock.text.length > 0) {
812
+ fragments.push({ kind: "assistant", text: rawBlock.text });
813
+ }
814
+ if ((rawBlock.type === "thinking" || rawBlock.type === "thinking_delta") &&
815
+ typeof rawBlock.thinking === "string" &&
816
+ rawBlock.thinking.length > 0) {
817
+ fragments.push({ kind: "reasoning", text: rawBlock.thinking });
818
+ }
819
+ }
820
+ return fragments;
821
+ }
822
+ readMessageIdFromAssistantMessage(message) {
823
+ const candidate = toObjectRecord(message);
824
+ const messageContainer = toObjectRecord(candidate?.message);
825
+ return (readTrimmedString(candidate?.message_id) ?? readTrimmedString(messageContainer?.id) ?? null);
826
+ }
827
+ readMessageIdFromStreamEvent(event) {
828
+ const messageContainer = toObjectRecord(event.message);
829
+ return readTrimmedString(event.message_id) ?? readTrimmedString(messageContainer?.id) ?? null;
830
+ }
831
+ }
832
+ function isSyntheticUserEntry(entry) {
833
+ const candidate = toObjectRecord(entry);
834
+ if (!candidate) {
835
+ return false;
836
+ }
837
+ return candidate.isSynthetic === true || candidate.isMeta === true;
838
+ }
839
+ function firstTrimmedString(sources) {
840
+ for (const source of sources) {
841
+ const value = readTrimmedString(source);
842
+ if (value) {
843
+ return value;
844
+ }
845
+ }
846
+ return null;
847
+ }
848
+ export function readEventIdentifiers(message) {
849
+ const root = toObjectRecord(message) ?? {};
850
+ const messageType = readTrimmedString(root.type);
851
+ const streamEvent = toObjectRecord(root.event);
852
+ const streamEventMessage = toObjectRecord(streamEvent?.message);
853
+ const messageContainer = toObjectRecord(root.message);
854
+ const messageIdFromUuid = messageType === "user" ? root.uuid : undefined;
855
+ return {
856
+ taskId: firstTrimmedString([
857
+ root.task_id,
858
+ streamEvent?.task_id,
859
+ streamEventMessage?.task_id,
860
+ messageContainer?.task_id,
861
+ ]),
862
+ parentMessageId: firstTrimmedString([
863
+ root.parent_message_id,
864
+ streamEvent?.parent_message_id,
865
+ streamEventMessage?.parent_message_id,
866
+ messageContainer?.parent_message_id,
867
+ ]),
868
+ messageId: firstTrimmedString([
869
+ root.message_id,
870
+ streamEvent?.message_id,
871
+ streamEventMessage?.id,
872
+ streamEventMessage?.message_id,
873
+ messageContainer?.id,
874
+ messageContainer?.message_id,
875
+ messageIdFromUuid,
876
+ ]),
877
+ };
878
+ }
879
+ export class ClaudeAgentClient {
880
+ constructor(options) {
881
+ this.provider = "claude";
882
+ this.capabilities = CLAUDE_CAPABILITIES;
883
+ this.defaults = options.defaults;
884
+ this.logger = options.logger.child({ module: "agent", provider: "claude" });
885
+ this.runtimeSettings = options.runtimeSettings;
886
+ this.queryFactory = options.queryFactory;
887
+ this.resolveBinary = options.resolveBinary ?? (() => resolveClaudeBinary(this.runtimeSettings));
888
+ }
889
+ async createSession(config, launchContext, options) {
890
+ const claudeConfig = this.assertConfig(config);
891
+ return new ClaudeAgentSession(claudeConfig, {
892
+ defaults: this.defaults,
893
+ runtimeSettings: this.runtimeSettings,
894
+ agentId: launchContext?.agentId,
895
+ launchEnv: launchContext?.env,
896
+ persistSession: options?.persistSession,
897
+ logger: this.logger,
898
+ queryFactory: this.queryFactory,
899
+ resolveBinary: this.resolveBinary,
900
+ });
901
+ }
902
+ async resumeSession(handle, overrides, launchContext) {
903
+ const metadata = coerceSessionMetadata(handle.metadata);
904
+ const merged = { ...metadata, ...overrides };
905
+ if (!merged.cwd) {
906
+ throw new Error("Claude resume requires the original working directory in metadata");
907
+ }
908
+ const mergedConfig = {
909
+ ...merged,
910
+ provider: "claude",
911
+ cwd: merged.cwd,
912
+ };
913
+ const claudeConfig = this.assertConfig(mergedConfig);
914
+ return new ClaudeAgentSession(claudeConfig, {
915
+ defaults: this.defaults,
916
+ runtimeSettings: this.runtimeSettings,
917
+ handle,
918
+ agentId: launchContext?.agentId,
919
+ launchEnv: launchContext?.env,
920
+ logger: this.logger,
921
+ queryFactory: this.queryFactory,
922
+ resolveBinary: this.resolveBinary,
923
+ });
924
+ }
925
+ async listModels(_options) {
926
+ // Claude exposes a global catalog here; cwd/force are intentionally irrelevant.
927
+ return await getClaudeModelsWithSettings(this.logger);
928
+ }
929
+ async listPersistedAgents(options) {
930
+ const configDir = process.env.CLAUDE_CONFIG_DIR ?? path.join(os.homedir(), ".claude");
931
+ const projectsRoot = path.join(configDir, "projects");
932
+ if (!(await pathExists(projectsRoot))) {
933
+ return [];
934
+ }
935
+ const limit = options?.limit ?? 20;
936
+ const candidates = await collectRecentClaudeSessions(projectsRoot, limit * 3);
937
+ const parsed = await Promise.all(candidates.map((candidate) => parseClaudeSessionDescriptor(candidate.path, candidate.mtime)));
938
+ return parsed
939
+ .filter((descriptor) => descriptor !== null)
940
+ .slice(0, limit);
941
+ }
942
+ async isAvailable() {
943
+ const command = this.runtimeSettings?.command;
944
+ if (command?.mode === "replace") {
945
+ return await isCommandAvailable(command.argv[0]);
946
+ }
947
+ return await isCommandAvailable("claude");
948
+ }
949
+ async getDiagnostic() {
950
+ try {
951
+ const resolvedBinary = (await findExecutable("claude")) ?? "not found";
952
+ const available = await this.isAvailable();
953
+ const version = await resolveClaudeVersion(this.runtimeSettings);
954
+ const auth = available ? await resolveClaudeAuth(this.runtimeSettings) : null;
955
+ let modelsValue = "Not checked";
956
+ let status = formatDiagnosticStatus(available);
957
+ if (available) {
958
+ try {
959
+ const models = await this.listModels({
960
+ cwd: os.homedir(),
961
+ force: false,
962
+ });
963
+ modelsValue = String(models.length);
964
+ }
965
+ catch (error) {
966
+ modelsValue = `Error - ${toDiagnosticErrorMessage(error)}`;
967
+ status = formatDiagnosticStatus(available, {
968
+ source: "model fetch",
969
+ cause: error,
970
+ });
971
+ }
972
+ }
973
+ return {
974
+ diagnostic: formatProviderDiagnostic("Claude Code", [
975
+ { label: "Binary", value: resolvedBinary },
976
+ ...(version ? [{ label: "Version", value: version }] : []),
977
+ ...(auth ? [{ label: "Auth", value: auth }] : []),
978
+ { label: "Models", value: modelsValue },
979
+ { label: "Status", value: status },
980
+ ]),
981
+ };
982
+ }
983
+ catch (error) {
984
+ return {
985
+ diagnostic: formatProviderDiagnosticError("Claude Code", error),
986
+ };
987
+ }
988
+ }
989
+ assertConfig(config) {
990
+ if (config.provider !== "claude") {
991
+ throw new Error(`ClaudeAgentClient received config for provider '${config.provider}'`);
992
+ }
993
+ return { ...config, provider: "claude" };
994
+ }
995
+ }
996
+ async function resolveClaudeBinary(runtimeSettings) {
997
+ const command = runtimeSettings?.command;
998
+ if (command?.mode === "replace") {
999
+ const foundOverride = await findExecutable(command.argv[0]);
1000
+ if (foundOverride) {
1001
+ return foundOverride;
1002
+ }
1003
+ }
1004
+ const found = await findExecutable("claude");
1005
+ if (found) {
1006
+ return found;
1007
+ }
1008
+ throw new Error("Claude binary not found. Install Claude Code (https://github.com/anthropics/claude-code) and ensure it is available in your shell PATH.");
1009
+ }
1010
+ async function resolveClaudeVersion(runtimeSettings) {
1011
+ const command = runtimeSettings?.command;
1012
+ const envSpec = createProviderEnvSpec({ runtimeSettings });
1013
+ try {
1014
+ if (command?.mode === "replace") {
1015
+ const { stdout } = await execCommand(command.argv[0], [...command.argv.slice(1), "--version"], { ...envSpec, timeout: 5000 });
1016
+ return stdout.trim() || null;
1017
+ }
1018
+ const executable = await findExecutable("claude");
1019
+ if (!executable) {
1020
+ return null;
1021
+ }
1022
+ const { stdout } = await execCommand(executable, ["--version"], {
1023
+ ...envSpec,
1024
+ timeout: 5000,
1025
+ });
1026
+ return stdout.trim() || null;
1027
+ }
1028
+ catch {
1029
+ return null;
1030
+ }
1031
+ }
1032
+ async function resolveClaudeAuth(runtimeSettings) {
1033
+ const command = runtimeSettings?.command;
1034
+ const run = async (executable, args) => {
1035
+ try {
1036
+ return await execCommand(executable, args, {
1037
+ ...createProviderEnvSpec({ runtimeSettings }),
1038
+ timeout: 5000,
1039
+ });
1040
+ }
1041
+ catch (error) {
1042
+ const err = toObjectRecord(error);
1043
+ const stdout = typeof err?.stdout === "string" ? err.stdout : "";
1044
+ const stderr = typeof err?.stderr === "string" ? err.stderr : "";
1045
+ const fallbackMessage = typeof err?.message === "string" ? err.message : "";
1046
+ return { stdout, stderr: stderr || fallbackMessage };
1047
+ }
1048
+ };
1049
+ try {
1050
+ let result;
1051
+ if (command?.mode === "replace") {
1052
+ result = await run(command.argv[0], [...command.argv.slice(1), "auth", "status"]);
1053
+ }
1054
+ else {
1055
+ const executable = await findExecutable("claude");
1056
+ if (!executable) {
1057
+ return null;
1058
+ }
1059
+ result = await run(executable, ["auth", "status"]);
1060
+ }
1061
+ const combined = [result.stdout, result.stderr]
1062
+ .map((s) => s.trim())
1063
+ .filter((s) => s.length > 0)
1064
+ .join("\n");
1065
+ return combined || null;
1066
+ }
1067
+ catch {
1068
+ return null;
1069
+ }
1070
+ }
1071
+ function extractContextWindowSize(modelUsage) {
1072
+ const usageRecord = toObjectRecord(modelUsage);
1073
+ if (!usageRecord) {
1074
+ return undefined;
1075
+ }
1076
+ let maxContextWindow;
1077
+ for (const value of Object.values(usageRecord)) {
1078
+ const valueRecord = toObjectRecord(value);
1079
+ if (!valueRecord) {
1080
+ continue;
1081
+ }
1082
+ const contextWindow = valueRecord.contextWindow;
1083
+ if (typeof contextWindow !== "number" ||
1084
+ !Number.isFinite(contextWindow) ||
1085
+ contextWindow <= 0) {
1086
+ continue;
1087
+ }
1088
+ maxContextWindow = Math.max(maxContextWindow ?? 0, contextWindow);
1089
+ }
1090
+ return maxContextWindow;
1091
+ }
1092
+ function readUsageTotalTokens(usage) {
1093
+ if (!usage || typeof usage !== "object") {
1094
+ return undefined;
1095
+ }
1096
+ const totalTokens = usage.total_tokens;
1097
+ if (typeof totalTokens !== "number" || !Number.isFinite(totalTokens) || totalTokens < 0) {
1098
+ return undefined;
1099
+ }
1100
+ return totalTokens;
1101
+ }
1102
+ function readContextWindowUsedTokensFromTaskProgress(message) {
1103
+ return readUsageTotalTokens(message.usage);
1104
+ }
1105
+ function readUsageFromTaskNotification(message) {
1106
+ return readUsageTotalTokens(message.usage);
1107
+ }
1108
+ function readStreamRequestInputTokens(event) {
1109
+ const messageUsage = toObjectRecord(toObjectRecord(event.message)?.usage);
1110
+ if (!messageUsage) {
1111
+ return undefined;
1112
+ }
1113
+ const usage = messageUsage;
1114
+ const inputTokens = typeof usage.input_tokens === "number" && Number.isFinite(usage.input_tokens)
1115
+ ? usage.input_tokens
1116
+ : undefined;
1117
+ const cacheCreationInputTokens = typeof usage.cache_creation_input_tokens === "number" &&
1118
+ Number.isFinite(usage.cache_creation_input_tokens)
1119
+ ? usage.cache_creation_input_tokens
1120
+ : 0;
1121
+ const cacheReadInputTokens = typeof usage.cache_read_input_tokens === "number" &&
1122
+ Number.isFinite(usage.cache_read_input_tokens)
1123
+ ? usage.cache_read_input_tokens
1124
+ : 0;
1125
+ if (typeof inputTokens !== "number" || inputTokens < 0) {
1126
+ return undefined;
1127
+ }
1128
+ return inputTokens + cacheCreationInputTokens + cacheReadInputTokens;
1129
+ }
1130
+ function readStreamRequestOutputTokens(event) {
1131
+ const outputTokens = toObjectRecord(event.usage)?.output_tokens;
1132
+ if (typeof outputTokens !== "number" || !Number.isFinite(outputTokens) || outputTokens < 0) {
1133
+ return undefined;
1134
+ }
1135
+ return outputTokens;
1136
+ }
1137
+ class ClaudeAgentSession {
1138
+ constructor(config, options) {
1139
+ this.provider = "claude";
1140
+ this.capabilities = CLAUDE_CAPABILITIES;
1141
+ this.query = null;
1142
+ this.input = null;
1143
+ this.planResumeMode = null;
1144
+ this.availableModes = DEFAULT_MODES;
1145
+ this.toolUseCache = new Map();
1146
+ this.toolUseIndexToId = new Map();
1147
+ this.toolUseInputBuffers = new Map();
1148
+ this.pendingPermissions = new Map();
1149
+ this.activeForegroundTurnId = null;
1150
+ this.autonomousTurn = null;
1151
+ this.subscribers = new Set();
1152
+ this.timelineAssembler = new TimelineAssembler();
1153
+ this.sidechainTracker = new ClaudeSidechainTracker({
1154
+ getToolInput: (toolUseId) => this.toolUseCache.get(toolUseId)?.input ?? null,
1155
+ });
1156
+ this.persistedHistory = [];
1157
+ this.historyPending = false;
1158
+ this.turnState = "idle";
1159
+ this.nextTurnOrdinal = 1;
1160
+ this.cancelCurrentTurn = null;
1161
+ this.cachedRuntimeInfo = null;
1162
+ this.lastOptionsModel = null;
1163
+ this.lastRuntimeModel = null;
1164
+ this.compacting = false;
1165
+ this.queryPumpPromise = null;
1166
+ this.queryRestartNeeded = false;
1167
+ this.pendingInterruptAbort = false;
1168
+ this.lastForegroundPromptText = null;
1169
+ this.foregroundHasVisibleActivity = false;
1170
+ this.activeTurnHasAssistantText = false;
1171
+ this.userMessageIds = [];
1172
+ this.recentStderr = "";
1173
+ this.closed = false;
1174
+ this.handlePermissionRequest = async (toolName, input, options) => {
1175
+ const requestId = `permission-${randomUUID()}`;
1176
+ const kind = resolvePermissionKind(toolName, input);
1177
+ const metadata = {};
1178
+ if (options.toolUseID) {
1179
+ metadata.toolUseId = options.toolUseID;
1180
+ }
1181
+ if (toolName === "ExitPlanMode" && typeof input.plan === "string") {
1182
+ metadata.planText = input.plan;
1183
+ }
1184
+ const toolDetail = kind === "tool"
1185
+ ? mapClaudeRunningToolCall({
1186
+ name: toolName,
1187
+ callId: options.toolUseID ?? requestId,
1188
+ input,
1189
+ output: null,
1190
+ })?.detail
1191
+ : undefined;
1192
+ const request = {
1193
+ id: requestId,
1194
+ provider: "claude",
1195
+ name: toolName,
1196
+ kind,
1197
+ input,
1198
+ detail: toolDetail,
1199
+ suggestions: options.suggestions?.map((suggestion) => ({
1200
+ ...suggestion,
1201
+ })),
1202
+ actions: kind === "plan" ? buildClaudePlanPermissionActions(this.planResumeMode) : undefined,
1203
+ metadata: Object.keys(metadata).length ? metadata : undefined,
1204
+ };
1205
+ this.pushEvent({
1206
+ type: "permission_requested",
1207
+ provider: "claude",
1208
+ request,
1209
+ });
1210
+ return await new Promise((resolve, reject) => {
1211
+ const cleanupFns = [];
1212
+ const cleanup = () => {
1213
+ while (cleanupFns.length) {
1214
+ const fn = cleanupFns.pop();
1215
+ try {
1216
+ fn?.();
1217
+ }
1218
+ catch {
1219
+ // ignore cleanup errors
1220
+ }
1221
+ }
1222
+ };
1223
+ const abortHandler = () => {
1224
+ this.pendingPermissions.delete(requestId);
1225
+ cleanup();
1226
+ reject(new Error("Permission request aborted"));
1227
+ };
1228
+ if (options?.signal) {
1229
+ if (options.signal.aborted) {
1230
+ abortHandler();
1231
+ return;
1232
+ }
1233
+ options.signal.addEventListener("abort", abortHandler, { once: true });
1234
+ cleanupFns.push(() => options.signal?.removeEventListener("abort", abortHandler));
1235
+ }
1236
+ this.pendingPermissions.set(requestId, {
1237
+ request,
1238
+ resolve,
1239
+ reject,
1240
+ cleanup,
1241
+ });
1242
+ });
1243
+ };
1244
+ this.config = config;
1245
+ this.launchEnv = options.launchEnv;
1246
+ this.agentId = options.agentId;
1247
+ this.defaults = options.defaults;
1248
+ this.runtimeSettings = options.runtimeSettings;
1249
+ this.persistSession = options.persistSession;
1250
+ this.logger = options.logger.child({ agentId: this.agentId });
1251
+ this.queryFactory = options.queryFactory;
1252
+ this.resolveBinary = options.resolveBinary;
1253
+ const handle = options.handle;
1254
+ if (handle) {
1255
+ if (!handle.sessionId) {
1256
+ throw new Error("Cannot resume: persistence handle has no sessionId");
1257
+ }
1258
+ this.claudeSessionId = handle.sessionId;
1259
+ this.persistence = handle;
1260
+ this.loadPersistedHistory(handle.sessionId);
1261
+ }
1262
+ else {
1263
+ this.claudeSessionId = null;
1264
+ this.persistence = null;
1265
+ }
1266
+ // Validate mode if provided
1267
+ if (config.modeId && !VALID_CLAUDE_MODES.has(config.modeId)) {
1268
+ const validModesList = Array.from(VALID_CLAUDE_MODES).join(", ");
1269
+ throw new Error(`Invalid mode '${config.modeId}' for Claude provider. Valid modes: ${validModesList}`);
1270
+ }
1271
+ this.currentMode = isPermissionMode(config.modeId) ? config.modeId : "default";
1272
+ if (this.currentMode !== "plan") {
1273
+ this.planResumeMode = this.currentMode;
1274
+ }
1275
+ }
1276
+ get id() {
1277
+ return this.claudeSessionId;
1278
+ }
1279
+ async getRuntimeInfo() {
1280
+ if (this.cachedRuntimeInfo) {
1281
+ return { ...this.cachedRuntimeInfo };
1282
+ }
1283
+ const info = {
1284
+ provider: "claude",
1285
+ sessionId: this.claudeSessionId,
1286
+ model: this.lastOptionsModel,
1287
+ modeId: this.currentMode ?? null,
1288
+ ...(this.lastRuntimeModel
1289
+ ? {
1290
+ extra: {
1291
+ runtimeModel: this.lastRuntimeModel,
1292
+ },
1293
+ }
1294
+ : {}),
1295
+ };
1296
+ this.cachedRuntimeInfo = info;
1297
+ return { ...info };
1298
+ }
1299
+ async run(prompt, options) {
1300
+ const result = await runProviderTurn({
1301
+ prompt,
1302
+ runOptions: options,
1303
+ startTurn: (p, o) => this.startTurn(p, o),
1304
+ subscribe: (callback) => this.subscribe(callback),
1305
+ getSessionId: () => this.claudeSessionId ?? "",
1306
+ reduceFinalText: appendOrReplaceGrowingAssistantMessage,
1307
+ });
1308
+ this.cachedRuntimeInfo = {
1309
+ provider: "claude",
1310
+ sessionId: this.claudeSessionId,
1311
+ model: this.lastOptionsModel,
1312
+ modeId: this.currentMode ?? null,
1313
+ };
1314
+ if (!this.claudeSessionId) {
1315
+ throw new Error("Session ID not set after run completed");
1316
+ }
1317
+ return result;
1318
+ }
1319
+ async startTurn(prompt, _options) {
1320
+ if (this.closed) {
1321
+ throw new Error("Claude session is closed");
1322
+ }
1323
+ if (this.activeForegroundTurnId) {
1324
+ throw new Error("A foreground turn is already active");
1325
+ }
1326
+ const slashCommand = this.resolveSlashCommandInvocation(prompt);
1327
+ if (slashCommand?.commandName === REWIND_COMMAND_NAME) {
1328
+ const turnId = this.createTurnId("foreground");
1329
+ this.activeForegroundTurnId = turnId;
1330
+ this.transitionTurnState("foreground", "rewind command");
1331
+ void this.executeRewindTurn(turnId, slashCommand);
1332
+ return { turnId };
1333
+ }
1334
+ if (this.autonomousTurn) {
1335
+ this.completeAutonomousTurn();
1336
+ }
1337
+ const sdkMessage = this.toSdkUserMessage(prompt);
1338
+ this.lastForegroundPromptText = this.extractPromptText(prompt);
1339
+ const turnId = this.createTurnId("foreground");
1340
+ this.activeForegroundTurnId = turnId;
1341
+ this.foregroundHasVisibleActivity = false;
1342
+ this.activeTurnHasAssistantText = false;
1343
+ this.transitionTurnState("foreground", "foreground turn started");
1344
+ this.clearRecentStderr();
1345
+ let cancelIssued = false;
1346
+ const requestCancel = () => {
1347
+ if (cancelIssued) {
1348
+ return;
1349
+ }
1350
+ cancelIssued = true;
1351
+ if (this.cancelCurrentTurn === requestCancel) {
1352
+ this.cancelCurrentTurn = null;
1353
+ }
1354
+ this.rejectAllPendingPermissions(new Error("Permission request aborted"));
1355
+ this.finishForegroundTurn({
1356
+ type: "turn_canceled",
1357
+ provider: "claude",
1358
+ reason: "Interrupted",
1359
+ });
1360
+ void this.interruptActiveTurn().catch((error) => {
1361
+ this.logger.warn({ err: error }, "Failed to interrupt during cancel");
1362
+ });
1363
+ };
1364
+ this.cancelCurrentTurn = requestCancel;
1365
+ this.notifySubscribers({ type: "turn_started", provider: "claude" });
1366
+ try {
1367
+ await this.ensureQuery();
1368
+ if (!this.input) {
1369
+ throw new Error("Claude session input stream not initialized");
1370
+ }
1371
+ this.startQueryPump();
1372
+ this.input.push(sdkMessage);
1373
+ }
1374
+ catch (error) {
1375
+ this.finishForegroundTurn(this.buildTurnFailedEvent(error instanceof Error ? error.message : "Claude stream failed"));
1376
+ }
1377
+ return { turnId };
1378
+ }
1379
+ subscribe(callback) {
1380
+ this.subscribers.add(callback);
1381
+ return () => {
1382
+ this.subscribers.delete(callback);
1383
+ };
1384
+ }
1385
+ async interrupt() {
1386
+ if (this.cancelCurrentTurn) {
1387
+ this.cancelCurrentTurn();
1388
+ return;
1389
+ }
1390
+ if (this.autonomousTurn) {
1391
+ this.flushPendingToolCalls();
1392
+ this.completeAutonomousTurn();
1393
+ }
1394
+ await this.interruptActiveTurn();
1395
+ }
1396
+ async *streamHistory() {
1397
+ if (!this.historyPending || this.persistedHistory.length === 0) {
1398
+ return;
1399
+ }
1400
+ const history = this.persistedHistory;
1401
+ this.persistedHistory = [];
1402
+ this.historyPending = false;
1403
+ for (const entry of history) {
1404
+ yield {
1405
+ type: "timeline",
1406
+ item: entry.item,
1407
+ provider: "claude",
1408
+ timestamp: entry.timestamp,
1409
+ };
1410
+ }
1411
+ }
1412
+ async getAvailableModes() {
1413
+ return this.availableModes;
1414
+ }
1415
+ async getCurrentMode() {
1416
+ return this.currentMode ?? null;
1417
+ }
1418
+ async setMode(modeId) {
1419
+ // Validate mode
1420
+ if (!VALID_CLAUDE_MODES.has(modeId)) {
1421
+ const validModesList = Array.from(VALID_CLAUDE_MODES).join(", ");
1422
+ throw new Error(`Invalid mode '${modeId}' for Claude provider. Valid modes: ${validModesList}`);
1423
+ }
1424
+ const normalized = isPermissionMode(modeId) ? modeId : "default";
1425
+ assertClaudeAutoModeEligible(normalized, this.buildSdkEnv(this.config.extra?.claude));
1426
+ const previousMode = this.currentMode;
1427
+ const activeQuery = await this.ensureQuery();
1428
+ await activeQuery.setPermissionMode(normalized);
1429
+ if (normalized === "plan") {
1430
+ if (previousMode !== "plan") {
1431
+ this.planResumeMode = previousMode;
1432
+ }
1433
+ }
1434
+ else {
1435
+ this.planResumeMode = normalized;
1436
+ }
1437
+ this.currentMode = normalized;
1438
+ }
1439
+ async setModel(modelId) {
1440
+ const normalizedModelId = typeof modelId === "string" && modelId.trim().length > 0 ? modelId : null;
1441
+ const activeQuery = await this.ensureQuery();
1442
+ await activeQuery.setModel(normalizedModelId ?? undefined);
1443
+ this.config.model = normalizedModelId ?? undefined;
1444
+ this.lastOptionsModel = normalizedModelId ?? this.lastOptionsModel;
1445
+ this.lastRuntimeModel = null;
1446
+ this.cachedRuntimeInfo = null;
1447
+ // Model change affects persistence metadata, so invalidate cached handle.
1448
+ this.persistence = null;
1449
+ }
1450
+ async setThinkingOption(thinkingOptionId) {
1451
+ const normalizedThinkingOptionId = typeof thinkingOptionId === "string" && thinkingOptionId.trim().length > 0
1452
+ ? thinkingOptionId
1453
+ : null;
1454
+ if (!normalizedThinkingOptionId || normalizedThinkingOptionId === "default") {
1455
+ this.config.thinkingOptionId = undefined;
1456
+ }
1457
+ else if (isClaudeThinkingEffort(normalizedThinkingOptionId)) {
1458
+ this.config.thinkingOptionId = normalizedThinkingOptionId;
1459
+ }
1460
+ else {
1461
+ throw new Error(`Unknown thinking option: ${normalizedThinkingOptionId}`);
1462
+ }
1463
+ this.queryRestartNeeded = true;
1464
+ }
1465
+ getPendingPermissions() {
1466
+ return Array.from(this.pendingPermissions.values()).map((entry) => entry.request);
1467
+ }
1468
+ async respondToPermission(requestId, response) {
1469
+ const pending = this.pendingPermissions.get(requestId);
1470
+ if (!pending) {
1471
+ throw new Error(`No pending permission request with id '${requestId}'`);
1472
+ }
1473
+ this.pendingPermissions.delete(requestId);
1474
+ pending.cleanup?.();
1475
+ if (response.behavior === "allow") {
1476
+ if (pending.request.kind === "plan") {
1477
+ const selectedActionId = response.selectedActionId;
1478
+ const shouldResumePriorMode = selectedActionId === "implement_resume" && this.planResumeMode === "bypassPermissions";
1479
+ const targetMode = shouldResumePriorMode
1480
+ ? "bypassPermissions"
1481
+ : "acceptEdits";
1482
+ await this.setMode(targetMode);
1483
+ this.pushToolCall(mapClaudeCompletedToolCall({
1484
+ name: "plan_approval",
1485
+ callId: pending.request.id,
1486
+ input: pending.request.input ?? null,
1487
+ output: {
1488
+ approved: true,
1489
+ actionId: selectedActionId ?? "implement",
1490
+ },
1491
+ }));
1492
+ }
1493
+ const updatedInput = pending.request.kind === "question"
1494
+ ? normalizeClaudeAskUserQuestionUpdatedInput(response.updatedInput, pending.request.input ?? undefined)
1495
+ : (response.updatedInput ?? pending.request.input ?? {});
1496
+ const result = {
1497
+ behavior: "allow",
1498
+ updatedInput,
1499
+ updatedPermissions: this.normalizePermissionUpdates(response.updatedPermissions),
1500
+ };
1501
+ pending.resolve(result);
1502
+ }
1503
+ else {
1504
+ if (pending.request.kind === "tool") {
1505
+ this.pushToolCall(mapClaudeFailedToolCall({
1506
+ name: pending.request.name,
1507
+ callId: (typeof pending.request.metadata?.toolUseId === "string"
1508
+ ? pending.request.metadata.toolUseId
1509
+ : null) ?? pending.request.id,
1510
+ input: pending.request.input ?? null,
1511
+ output: null,
1512
+ error: { message: response.message ?? "Permission denied" },
1513
+ }));
1514
+ }
1515
+ const result = {
1516
+ behavior: "deny",
1517
+ message: response.message ?? "Permission request denied",
1518
+ interrupt: response.interrupt,
1519
+ };
1520
+ pending.resolve(result);
1521
+ }
1522
+ this.pushEvent({
1523
+ type: "permission_resolved",
1524
+ provider: "claude",
1525
+ requestId,
1526
+ resolution: response,
1527
+ });
1528
+ }
1529
+ describePersistence() {
1530
+ if (this.persistence) {
1531
+ return this.persistence;
1532
+ }
1533
+ if (!this.claudeSessionId) {
1534
+ return null;
1535
+ }
1536
+ this.persistence = {
1537
+ provider: "claude",
1538
+ sessionId: this.claudeSessionId,
1539
+ nativeHandle: this.claudeSessionId,
1540
+ metadata: { ...this.config },
1541
+ };
1542
+ return this.persistence;
1543
+ }
1544
+ async close() {
1545
+ this.logger.trace({
1546
+ agentId: this.agentId,
1547
+ provider: "claude",
1548
+ sessionId: this.claudeSessionId,
1549
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
1550
+ turnState: this.turnState,
1551
+ hasQuery: Boolean(this.query),
1552
+ hasInput: Boolean(this.input),
1553
+ hasActiveForegroundTurnId: Boolean(this.activeForegroundTurnId),
1554
+ }, "provider.claude.session_close.start");
1555
+ this.closed = true;
1556
+ this.rejectAllPendingPermissions(new Error("Claude session closed"));
1557
+ this.cancelCurrentTurn?.();
1558
+ this.subscribers.clear();
1559
+ this.activeForegroundTurnId = null;
1560
+ this.autonomousTurn = null;
1561
+ this.cancelCurrentTurn = null;
1562
+ this.turnState = "idle";
1563
+ this.sidechainTracker.clear();
1564
+ this.input?.end();
1565
+ this.query?.close?.();
1566
+ await this.awaitWithTimeout(this.query?.interrupt?.(), "close query interrupt");
1567
+ await this.awaitWithTimeout(this.query?.return?.(), "close query return");
1568
+ this.query = null;
1569
+ this.input = null;
1570
+ if (this.persistSession === false && this.claudeSessionId) {
1571
+ // Claude Code currently ignores --no-session-persistence outside --print mode
1572
+ // (see `claude --help`), so the SDK's persistSession=false is silently dropped
1573
+ // in stream-json mode. Sweep the transcript ourselves so ephemeral runs
1574
+ // (metadata generator, branch-name generator) don't show up as resumable.
1575
+ const historyPath = this.resolveHistoryPath(this.claudeSessionId);
1576
+ if (historyPath) {
1577
+ try {
1578
+ await promises.rm(historyPath, { force: true });
1579
+ }
1580
+ catch (error) {
1581
+ this.logger.warn({ err: error, historyPath, claudeSessionId: this.claudeSessionId }, "Failed to delete ephemeral Claude session transcript");
1582
+ }
1583
+ }
1584
+ }
1585
+ this.logger.trace({
1586
+ agentId: this.agentId,
1587
+ provider: "claude",
1588
+ sessionId: this.claudeSessionId,
1589
+ turnState: this.turnState,
1590
+ }, "provider.claude.session_close.complete");
1591
+ }
1592
+ async listCommands() {
1593
+ const q = await this.ensureQuery();
1594
+ const commands = await q.supportedCommands();
1595
+ const commandMap = new Map();
1596
+ for (const cmd of commands) {
1597
+ if (!commandMap.has(cmd.name)) {
1598
+ commandMap.set(cmd.name, {
1599
+ name: cmd.name,
1600
+ description: cmd.description,
1601
+ argumentHint: cmd.argumentHint,
1602
+ });
1603
+ }
1604
+ }
1605
+ if (!commandMap.has(REWIND_COMMAND_NAME)) {
1606
+ commandMap.set(REWIND_COMMAND_NAME, REWIND_COMMAND);
1607
+ }
1608
+ return Array.from(commandMap.values()).sort((a, b) => a.name.localeCompare(b.name));
1609
+ }
1610
+ resolveSlashCommandInvocation(prompt) {
1611
+ if (typeof prompt !== "string") {
1612
+ return null;
1613
+ }
1614
+ const parsed = this.parseSlashCommandInput(prompt);
1615
+ if (!parsed) {
1616
+ return null;
1617
+ }
1618
+ return parsed.commandName === REWIND_COMMAND_NAME ? parsed : null;
1619
+ }
1620
+ parseSlashCommandInput(text) {
1621
+ const trimmed = text.trim();
1622
+ if (!trimmed.startsWith("/") || trimmed.length <= 1) {
1623
+ return null;
1624
+ }
1625
+ const withoutPrefix = trimmed.slice(1);
1626
+ const firstWhitespaceIdx = withoutPrefix.search(/\s/);
1627
+ const commandName = firstWhitespaceIdx === -1 ? withoutPrefix : withoutPrefix.slice(0, firstWhitespaceIdx);
1628
+ if (!commandName || commandName.includes("/")) {
1629
+ return null;
1630
+ }
1631
+ const rawArgs = firstWhitespaceIdx === -1 ? "" : withoutPrefix.slice(firstWhitespaceIdx + 1).trim();
1632
+ return rawArgs.length > 0
1633
+ ? { commandName, args: rawArgs, rawInput: trimmed }
1634
+ : { commandName, rawInput: trimmed };
1635
+ }
1636
+ buildRewindSuccessMessage(targetUserMessageId, rewindResult) {
1637
+ const fileCount = Array.isArray(rewindResult.filesChanged)
1638
+ ? rewindResult.filesChanged.length
1639
+ : undefined;
1640
+ const stats = [];
1641
+ if (typeof fileCount === "number") {
1642
+ stats.push(`${fileCount} file${fileCount === 1 ? "" : "s"}`);
1643
+ }
1644
+ if (typeof rewindResult.insertions === "number") {
1645
+ stats.push(`${rewindResult.insertions} insertions`);
1646
+ }
1647
+ if (typeof rewindResult.deletions === "number") {
1648
+ stats.push(`${rewindResult.deletions} deletions`);
1649
+ }
1650
+ if (stats.length > 0) {
1651
+ return `Rewound tracked files to message ${targetUserMessageId} (${stats.join(", ")}).`;
1652
+ }
1653
+ return `Rewound tracked files to message ${targetUserMessageId}.`;
1654
+ }
1655
+ async attemptRewind(args) {
1656
+ if (typeof args === "string" && args.trim().length > 0) {
1657
+ const candidate = args.trim().split(/\s+/)[0] ?? "";
1658
+ if (!UUID_PATTERN.test(candidate)) {
1659
+ return {
1660
+ messageId: null,
1661
+ error: "Invalid message UUID. Usage: /rewind <user_message_uuid> or /rewind",
1662
+ };
1663
+ }
1664
+ const rewindResult = await this.rewindFilesOnce(candidate);
1665
+ if (rewindResult.canRewind) {
1666
+ return { messageId: candidate, result: rewindResult };
1667
+ }
1668
+ return {
1669
+ messageId: null,
1670
+ error: rewindResult.error ?? `No file checkpoint found for message ${candidate}.`,
1671
+ };
1672
+ }
1673
+ const candidates = this.getRewindCandidateUserMessageIds();
1674
+ if (candidates.length === 0) {
1675
+ return {
1676
+ messageId: null,
1677
+ error: "No prior user message available to rewind. Use /rewind <user_message_uuid>.",
1678
+ };
1679
+ }
1680
+ let lastError;
1681
+ for (const candidate of candidates) {
1682
+ try {
1683
+ const rewindResult = await this.rewindFilesOnce(candidate);
1684
+ if (rewindResult.canRewind) {
1685
+ return { messageId: candidate, result: rewindResult };
1686
+ }
1687
+ if (rewindResult.error) {
1688
+ lastError = rewindResult.error;
1689
+ }
1690
+ }
1691
+ catch (error) {
1692
+ lastError = error instanceof Error ? error.message : "Failed to rewind tracked files.";
1693
+ }
1694
+ }
1695
+ return {
1696
+ messageId: null,
1697
+ error: lastError ?? "No rewind checkpoints are currently available for this session.",
1698
+ };
1699
+ }
1700
+ async rewindFilesOnce(messageId) {
1701
+ try {
1702
+ const activeQuery = await this.ensureFreshQuery();
1703
+ return await activeQuery.rewindFiles(messageId, { dryRun: false });
1704
+ }
1705
+ catch (error) {
1706
+ // The Claude SDK transport can close after a rewind call.
1707
+ // If that happens, mark the query stale so a follow-up attempt uses a fresh query.
1708
+ this.queryRestartNeeded = true;
1709
+ throw error;
1710
+ }
1711
+ }
1712
+ async ensureFreshQuery() {
1713
+ if (this.query) {
1714
+ this.queryRestartNeeded = true;
1715
+ }
1716
+ return this.ensureQuery();
1717
+ }
1718
+ getRewindCandidateUserMessageIds() {
1719
+ const candidates = [];
1720
+ const pushUnique = (value) => {
1721
+ if (typeof value === "string" && value.length > 0 && !candidates.includes(value)) {
1722
+ candidates.push(value);
1723
+ }
1724
+ };
1725
+ const historyIds = this.readUserMessageIdsFromHistoryFile();
1726
+ for (let idx = historyIds.length - 1; idx >= 0; idx -= 1) {
1727
+ pushUnique(historyIds[idx]);
1728
+ }
1729
+ for (let idx = this.persistedHistory.length - 1; idx >= 0; idx -= 1) {
1730
+ const entry = this.persistedHistory[idx];
1731
+ if (entry?.item.type === "user_message") {
1732
+ pushUnique(entry.item.messageId);
1733
+ }
1734
+ }
1735
+ for (let idx = this.userMessageIds.length - 1; idx >= 0; idx -= 1) {
1736
+ pushUnique(this.userMessageIds[idx]);
1737
+ }
1738
+ return candidates;
1739
+ }
1740
+ readUserMessageIdsFromHistoryFile() {
1741
+ if (!this.claudeSessionId) {
1742
+ return [];
1743
+ }
1744
+ const historyPath = this.resolveHistoryPath(this.claudeSessionId);
1745
+ if (!historyPath || !fs.existsSync(historyPath)) {
1746
+ return [];
1747
+ }
1748
+ try {
1749
+ const ids = [];
1750
+ const content = fs.readFileSync(historyPath, "utf8");
1751
+ for (const line of content.split(/\n+/)) {
1752
+ const trimmed = line.trim();
1753
+ if (!trimmed)
1754
+ continue;
1755
+ try {
1756
+ const entry = JSON.parse(trimmed);
1757
+ if (entry?.type === "user" && typeof entry.uuid === "string") {
1758
+ ids.push(entry.uuid);
1759
+ }
1760
+ }
1761
+ catch {
1762
+ // ignore malformed lines
1763
+ }
1764
+ }
1765
+ return ids;
1766
+ }
1767
+ catch {
1768
+ return [];
1769
+ }
1770
+ }
1771
+ rememberUserMessageId(messageId) {
1772
+ if (typeof messageId !== "string" || messageId.length === 0) {
1773
+ return;
1774
+ }
1775
+ const last = this.userMessageIds[this.userMessageIds.length - 1];
1776
+ if (last === messageId) {
1777
+ return;
1778
+ }
1779
+ this.userMessageIds.push(messageId);
1780
+ }
1781
+ async ensureQuery() {
1782
+ if (this.query && !this.queryRestartNeeded) {
1783
+ return this.query;
1784
+ }
1785
+ if (this.queryRestartNeeded && this.query) {
1786
+ const oldQuery = this.query;
1787
+ const oldInput = this.input;
1788
+ // Null out query/input BEFORE awaiting the old iterator's return so the
1789
+ // old pump sees this.query !== activeQuery and skips failActiveTurns.
1790
+ this.query = null;
1791
+ this.input = null;
1792
+ this.queryPumpPromise = null;
1793
+ this.queryRestartNeeded = false;
1794
+ oldInput?.end();
1795
+ oldQuery.close?.();
1796
+ try {
1797
+ await oldQuery.return?.();
1798
+ }
1799
+ catch {
1800
+ /* ignore */
1801
+ }
1802
+ }
1803
+ // Preserve claudeSessionId across query recreation so buildOptions() passes
1804
+ // resume: sessionId and the new query continues the existing conversation.
1805
+ this.persistence = null;
1806
+ const input = createAsyncMessageInput();
1807
+ const options = await this.buildOptions();
1808
+ this.logger.debug({ options: summarizeClaudeOptionsForLog(options) }, "claude query");
1809
+ this.input = input;
1810
+ this.query = claudeQuery({ prompt: input.iterable, options }, {
1811
+ runtimeSettings: this.runtimeSettings,
1812
+ launchEnv: this.launchEnv,
1813
+ queryFactory: this.queryFactory,
1814
+ });
1815
+ // Do not kick off background control-plane queries here. Methods like
1816
+ // supportedCommands()/setPermissionMode() may execute immediately after
1817
+ // ensureQuery() (for listCommands()/setMode()), and sharing the same query
1818
+ // control plane can cause those calls to wait behind supportedModels().
1819
+ return this.query;
1820
+ }
1821
+ async awaitWithTimeout(promise, label) {
1822
+ if (!promise) {
1823
+ this.logger.trace({
1824
+ agentId: this.agentId,
1825
+ provider: "claude",
1826
+ sessionId: this.claudeSessionId,
1827
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
1828
+ label,
1829
+ }, "provider.claude.query_operation.skip");
1830
+ return;
1831
+ }
1832
+ const startedAt = Date.now();
1833
+ this.logger.trace({
1834
+ agentId: this.agentId,
1835
+ provider: "claude",
1836
+ sessionId: this.claudeSessionId,
1837
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
1838
+ label,
1839
+ }, "provider.claude.query_operation.start");
1840
+ try {
1841
+ await withTimeout(promise, 3000, "timeout");
1842
+ this.logger.trace({
1843
+ agentId: this.agentId,
1844
+ provider: "claude",
1845
+ sessionId: this.claudeSessionId,
1846
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
1847
+ label,
1848
+ durationMs: Date.now() - startedAt,
1849
+ }, "provider.claude.query_operation.settled");
1850
+ }
1851
+ catch (error) {
1852
+ this.logger.warn({ err: error, label }, "Claude query operation did not settle cleanly");
1853
+ }
1854
+ }
1855
+ resolveThinkingConfig() {
1856
+ const thinkingOptionId = this.config.thinkingOptionId && this.config.thinkingOptionId !== "default"
1857
+ ? this.config.thinkingOptionId
1858
+ : undefined;
1859
+ if (thinkingOptionId && isClaudeThinkingEffort(thinkingOptionId)) {
1860
+ return { thinking: { type: "adaptive" }, effort: thinkingOptionId };
1861
+ }
1862
+ return { thinking: undefined, effort: undefined };
1863
+ }
1864
+ buildAppendedSystemPrompt() {
1865
+ return (composeSystemPromptParts(this.config.systemPrompt, this.config.daemonAppendSystemPrompt) ?? "");
1866
+ }
1867
+ buildSdkEnv(extraClaudeOptions) {
1868
+ return createProviderEnv({
1869
+ baseEnv: process.env,
1870
+ runtimeSettings: this.runtimeSettings,
1871
+ overlays: [
1872
+ extraClaudeOptions?.env,
1873
+ {
1874
+ // Increase MCP timeouts for long-running tool calls (10 minutes)
1875
+ MCP_TIMEOUT: "600000",
1876
+ MCP_TOOL_TIMEOUT: "600000",
1877
+ },
1878
+ this.launchEnv,
1879
+ ],
1880
+ });
1881
+ }
1882
+ async buildOptions() {
1883
+ const { thinking, effort } = this.resolveThinkingConfig();
1884
+ const appendedSystemPrompt = this.buildAppendedSystemPrompt();
1885
+ const extraClaudeOptions = this.config.extra?.claude;
1886
+ const sdkEnv = this.buildSdkEnv(extraClaudeOptions);
1887
+ assertClaudeAutoModeEligible(this.currentMode, sdkEnv);
1888
+ const claudeBinary = await this.resolveBinary();
1889
+ this.logger.debug({
1890
+ claudeBinary,
1891
+ pathEnvKey: resolvePathEnvKey(),
1892
+ pathIncludesClaudeLocalBin: (process.env["Path"] ?? process.env["PATH"] ?? "")
1893
+ .toLowerCase()
1894
+ .includes("\\.local\\bin"),
1895
+ }, "Resolved Claude executable");
1896
+ const base = {
1897
+ cwd: this.config.cwd,
1898
+ includePartialMessages: true,
1899
+ permissionMode: this.currentMode,
1900
+ // Dynamic mode switching can recreate the underlying Claude query. Keep the
1901
+ // bypass launch capability available so later setPermissionMode("bypassPermissions")
1902
+ // calls do not fail after a model/thinking/rewind-driven restart.
1903
+ allowDangerouslySkipPermissions: true,
1904
+ agents: this.defaults?.agents,
1905
+ canUseTool: this.handlePermissionRequest,
1906
+ pathToClaudeCodeExecutable: claudeBinary,
1907
+ // Use Claude Code preset system prompt and load CLAUDE.md files
1908
+ // Append provider-agnostic system prompts for agents.
1909
+ systemPrompt: {
1910
+ type: "preset",
1911
+ preset: "claude_code",
1912
+ append: appendedSystemPrompt,
1913
+ },
1914
+ settingSources: CLAUDE_SETTING_SOURCES,
1915
+ stderr: (data) => {
1916
+ this.captureStderr(data);
1917
+ this.logger.error({ stderr: data.trim() }, "Claude Agent SDK stderr");
1918
+ },
1919
+ // Required for provider-level /rewind support.
1920
+ enableFileCheckpointing: true,
1921
+ // If we have a session ID from a previous query (e.g., after interrupt),
1922
+ // resume that session to continue the conversation history.
1923
+ ...(this.claudeSessionId ? { resume: this.claudeSessionId } : {}),
1924
+ ...(thinking ? { thinking } : {}),
1925
+ ...(effort ? { effort } : {}),
1926
+ ...extraClaudeOptions,
1927
+ ...(this.persistSession === undefined ? {} : { persistSession: this.persistSession }),
1928
+ env: sdkEnv,
1929
+ };
1930
+ if (this.config.mcpServers) {
1931
+ base.mcpServers = this.normalizeMcpServers(this.config.mcpServers);
1932
+ }
1933
+ if (this.config.model) {
1934
+ base.model = this.config.model;
1935
+ }
1936
+ this.lastOptionsModel = base.model ?? null;
1937
+ if (this.claudeSessionId) {
1938
+ base.resume = this.claudeSessionId;
1939
+ }
1940
+ if (this.runtimeSettings?.disallowedTools?.length) {
1941
+ base.disallowedTools = [
1942
+ ...(base.disallowedTools ?? []),
1943
+ ...this.runtimeSettings.disallowedTools,
1944
+ ];
1945
+ }
1946
+ return base;
1947
+ }
1948
+ normalizeMcpServers(servers) {
1949
+ const result = {};
1950
+ for (const [name, config] of Object.entries(servers)) {
1951
+ result[name] = toClaudeSdkMcpConfig(config);
1952
+ }
1953
+ return result;
1954
+ }
1955
+ toSdkUserMessage(prompt) {
1956
+ const content = [];
1957
+ if (Array.isArray(prompt)) {
1958
+ for (const chunk of prompt) {
1959
+ if (chunk.type === "text") {
1960
+ content.push({ type: "text", text: chunk.text });
1961
+ }
1962
+ else if (chunk.type === "image") {
1963
+ if (isImageMimeType(chunk.mimeType)) {
1964
+ content.push({
1965
+ type: "image",
1966
+ source: {
1967
+ type: "base64",
1968
+ media_type: chunk.mimeType,
1969
+ data: chunk.data,
1970
+ },
1971
+ });
1972
+ }
1973
+ }
1974
+ else {
1975
+ content.push({ type: "text", text: renderPromptAttachmentAsText(chunk) });
1976
+ }
1977
+ }
1978
+ }
1979
+ else {
1980
+ content.push({ type: "text", text: prompt });
1981
+ }
1982
+ const messageId = randomUUID();
1983
+ this.rememberUserMessageId(messageId);
1984
+ return {
1985
+ type: "user",
1986
+ message: {
1987
+ role: "user",
1988
+ content,
1989
+ },
1990
+ parent_tool_use_id: null,
1991
+ uuid: messageId,
1992
+ session_id: this.claudeSessionId ?? "",
1993
+ };
1994
+ }
1995
+ transitionTurnState(next, reason) {
1996
+ if (this.turnState === next) {
1997
+ return;
1998
+ }
1999
+ this.logger.debug({ from: this.turnState, to: next, reason }, "Claude turn state transition");
2000
+ this.turnState = next;
2001
+ }
2002
+ syncTurnState(reason) {
2003
+ if (this.activeForegroundTurnId) {
2004
+ this.transitionTurnState("foreground", reason);
2005
+ return;
2006
+ }
2007
+ if (this.autonomousTurn) {
2008
+ this.transitionTurnState("autonomous", reason);
2009
+ return;
2010
+ }
2011
+ this.transitionTurnState("idle", reason);
2012
+ }
2013
+ isAbortError(message) {
2014
+ const errors = "errors" in message && Array.isArray(message.errors) ? message.errors : [];
2015
+ return errors.some((e) => /\baborted\b/i.test(e));
2016
+ }
2017
+ buildTurnFailedEvent(errorMessage) {
2018
+ const normalized = errorMessage.trim() || "Claude run failed";
2019
+ const exitCodeMatch = normalized.match(/\bcode\s+(\d+)\b/i);
2020
+ const code = exitCodeMatch ? exitCodeMatch[1] : undefined;
2021
+ const diagnostic = this.getRecentStderrDiagnostic();
2022
+ return {
2023
+ type: "turn_failed",
2024
+ provider: "claude",
2025
+ error: normalized,
2026
+ ...(code ? { code } : {}),
2027
+ ...(diagnostic ? { diagnostic } : {}),
2028
+ };
2029
+ }
2030
+ captureStderr(data) {
2031
+ const text = data.trim();
2032
+ if (!text) {
2033
+ return;
2034
+ }
2035
+ const combined = this.recentStderr ? `${this.recentStderr}\n${text}` : text;
2036
+ this.recentStderr = combined.slice(-MAX_RECENT_STDERR_CHARS);
2037
+ }
2038
+ clearRecentStderr() {
2039
+ this.recentStderr = "";
2040
+ }
2041
+ getRecentStderrDiagnostic() {
2042
+ return this.recentStderr.trim() || undefined;
2043
+ }
2044
+ async awaitRecentStderrAfterProcessExit(error) {
2045
+ if (this.getRecentStderrDiagnostic()) {
2046
+ return;
2047
+ }
2048
+ const message = errorToMessageString(error);
2049
+ if (!/\bprocess exited with code\b/i.test(message) &&
2050
+ !/\bterminated by signal\b/i.test(message)) {
2051
+ return;
2052
+ }
2053
+ const startedAt = Date.now();
2054
+ while (!this.closed && !this.getRecentStderrDiagnostic()) {
2055
+ if (Date.now() - startedAt >= STDERR_FLUSH_WAIT_MS) {
2056
+ return;
2057
+ }
2058
+ await new Promise((resolve) => setTimeout(resolve, STDERR_FLUSH_POLL_INTERVAL_MS));
2059
+ }
2060
+ }
2061
+ createTurnId(owner) {
2062
+ return `${owner}-turn-${this.nextTurnOrdinal++}`;
2063
+ }
2064
+ isTerminalTurnEvent(event) {
2065
+ return (event.type === "turn_completed" ||
2066
+ event.type === "turn_failed" ||
2067
+ event.type === "turn_canceled");
2068
+ }
2069
+ extractPromptText(prompt) {
2070
+ if (typeof prompt === "string") {
2071
+ return prompt;
2072
+ }
2073
+ const textParts = prompt
2074
+ .filter((block) => block.type === "text")
2075
+ .map((block) => block.text);
2076
+ return textParts.length > 0 ? textParts.join("\n") : null;
2077
+ }
2078
+ async executeRewindTurn(_turnId, invocation) {
2079
+ this.notifySubscribers({ type: "turn_started", provider: "claude" });
2080
+ try {
2081
+ const rewindAttempt = await this.attemptRewind(invocation.args);
2082
+ if (!rewindAttempt.messageId || !rewindAttempt.result) {
2083
+ this.finishForegroundTurn({
2084
+ type: "turn_failed",
2085
+ provider: "claude",
2086
+ error: rewindAttempt.error ??
2087
+ "No prior user message available to rewind. Use /rewind <user_message_uuid>.",
2088
+ });
2089
+ return;
2090
+ }
2091
+ this.notifySubscribers({
2092
+ type: "timeline",
2093
+ provider: "claude",
2094
+ item: {
2095
+ type: "assistant_message",
2096
+ text: this.buildRewindSuccessMessage(rewindAttempt.messageId, rewindAttempt.result),
2097
+ },
2098
+ });
2099
+ this.finishForegroundTurn({ type: "turn_completed", provider: "claude" });
2100
+ }
2101
+ catch (error) {
2102
+ this.finishForegroundTurn({
2103
+ type: "turn_failed",
2104
+ provider: "claude",
2105
+ error: error instanceof Error ? error.message : "Failed to rewind tracked files",
2106
+ });
2107
+ }
2108
+ }
2109
+ shouldRecoverInterruptedQueryAbort(error, consecutiveRecoveries) {
2110
+ if (consecutiveRecoveries >= 3) {
2111
+ return false;
2112
+ }
2113
+ let message;
2114
+ if (typeof error === "string") {
2115
+ message = error;
2116
+ }
2117
+ else if (error instanceof Error) {
2118
+ message = `${error.message}\n${error.stack ?? ""}`;
2119
+ }
2120
+ else {
2121
+ message = JSON.stringify(error);
2122
+ }
2123
+ return message.toLowerCase().includes("request was aborted");
2124
+ }
2125
+ finishForegroundTurn(event) {
2126
+ if (event.type === "turn_failed" || event.type === "turn_canceled") {
2127
+ this.flushPendingToolCalls();
2128
+ }
2129
+ this.notifySubscribers(event);
2130
+ this.activeForegroundTurnId = null;
2131
+ this.lastForegroundPromptText = null;
2132
+ this.cancelCurrentTurn = null;
2133
+ this.activeTurnHasAssistantText = false;
2134
+ this.syncTurnState("foreground turn terminal");
2135
+ }
2136
+ dispatchEvents(events) {
2137
+ let terminalSeen = false;
2138
+ for (const event of events) {
2139
+ this.notifySubscribers(event);
2140
+ terminalSeen || (terminalSeen = this.isTerminalTurnEvent(event));
2141
+ }
2142
+ if (terminalSeen) {
2143
+ if (this.activeForegroundTurnId) {
2144
+ this.activeForegroundTurnId = null;
2145
+ this.lastForegroundPromptText = null;
2146
+ this.cancelCurrentTurn = null;
2147
+ this.activeTurnHasAssistantText = false;
2148
+ this.syncTurnState("foreground turn terminal");
2149
+ }
2150
+ else if (this.autonomousTurn) {
2151
+ this.autonomousTurn = null;
2152
+ this.activeTurnHasAssistantText = false;
2153
+ this.syncTurnState("autonomous turn terminal");
2154
+ }
2155
+ }
2156
+ }
2157
+ startAutonomousTurn() {
2158
+ if (this.autonomousTurn) {
2159
+ return;
2160
+ }
2161
+ this.autonomousTurn = {
2162
+ id: this.createTurnId("autonomous"),
2163
+ };
2164
+ this.activeTurnHasAssistantText = false;
2165
+ this.notifySubscribers({ type: "turn_started", provider: "claude" });
2166
+ this.syncTurnState("autonomous turn started");
2167
+ }
2168
+ completeAutonomousTurn() {
2169
+ if (!this.autonomousTurn) {
2170
+ return;
2171
+ }
2172
+ this.notifySubscribers({ type: "turn_completed", provider: "claude" });
2173
+ this.autonomousTurn = null;
2174
+ this.activeTurnHasAssistantText = false;
2175
+ this.syncTurnState("autonomous turn completed");
2176
+ }
2177
+ failActiveTurns(errorMessage) {
2178
+ const failure = this.buildTurnFailedEvent(errorMessage);
2179
+ this.flushPendingToolCalls();
2180
+ if (this.activeForegroundTurnId) {
2181
+ this.finishForegroundTurn(failure);
2182
+ return;
2183
+ }
2184
+ if (this.autonomousTurn) {
2185
+ this.dispatchEvents([failure]);
2186
+ }
2187
+ }
2188
+ startQueryPump() {
2189
+ if (this.closed || this.queryPumpPromise) {
2190
+ return;
2191
+ }
2192
+ const pump = this.runQueryPump().catch((error) => {
2193
+ this.logger.trace({
2194
+ agentId: this.agentId,
2195
+ provider: "claude",
2196
+ sessionId: this.claudeSessionId,
2197
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
2198
+ err: error,
2199
+ }, "provider.claude.query_pump.exit_unexpected");
2200
+ });
2201
+ this.queryPumpPromise = pump;
2202
+ void pump.finally(() => {
2203
+ if (this.queryPumpPromise === pump) {
2204
+ this.queryPumpPromise = null;
2205
+ }
2206
+ });
2207
+ }
2208
+ async runQueryPump() {
2209
+ let activeQuery;
2210
+ try {
2211
+ activeQuery = await this.ensureQuery();
2212
+ }
2213
+ catch (error) {
2214
+ this.logger.trace({
2215
+ agentId: this.agentId,
2216
+ provider: "claude",
2217
+ sessionId: this.claudeSessionId,
2218
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
2219
+ err: error,
2220
+ }, "provider.claude.query_pump.init_failed");
2221
+ this.failActiveTurns(error instanceof Error ? error.message : "Claude stream failed");
2222
+ return;
2223
+ }
2224
+ let consecutiveInterruptAbortRecoveries = 0;
2225
+ const logRawMessage = (message) => {
2226
+ this.logger.trace({
2227
+ agentId: this.agentId,
2228
+ provider: "claude",
2229
+ sessionId: this.claudeSessionId,
2230
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
2231
+ messageType: message.type,
2232
+ messageSubtype: "subtype" in message ? message.subtype : undefined,
2233
+ messageUuid: "uuid" in message ? message.uuid : undefined,
2234
+ rawEvent: message,
2235
+ }, "provider.claude.raw_event");
2236
+ };
2237
+ const handlePumpedMessage = async (message) => {
2238
+ logRawMessage(message);
2239
+ consecutiveInterruptAbortRecoveries = 0;
2240
+ if (await this.handleMissingResumedConversation(message, activeQuery)) {
2241
+ return true;
2242
+ }
2243
+ this.routeSdkMessageFromPump(message);
2244
+ return false;
2245
+ };
2246
+ const drainActiveQuery = async () => {
2247
+ for await (const message of activeQuery) {
2248
+ if (await handlePumpedMessage(message)) {
2249
+ return true;
2250
+ }
2251
+ }
2252
+ return false;
2253
+ };
2254
+ try {
2255
+ while (!this.closed && this.query === activeQuery) {
2256
+ try {
2257
+ if (await drainActiveQuery()) {
2258
+ return;
2259
+ }
2260
+ if (!this.closed && this.query === activeQuery) {
2261
+ this.failActiveTurns("Claude stream ended before terminal result");
2262
+ }
2263
+ return;
2264
+ }
2265
+ catch (error) {
2266
+ if (!this.closed &&
2267
+ this.query === activeQuery &&
2268
+ this.shouldRecoverInterruptedQueryAbort(error, consecutiveInterruptAbortRecoveries)) {
2269
+ consecutiveInterruptAbortRecoveries += 1;
2270
+ this.logger.debug({ recoveries: consecutiveInterruptAbortRecoveries }, "Recovering Claude query pump after interrupt abort");
2271
+ continue;
2272
+ }
2273
+ if (!this.closed && this.query === activeQuery) {
2274
+ await this.awaitRecentStderrAfterProcessExit(error);
2275
+ this.failActiveTurns(error instanceof Error ? error.message : "Claude stream failed");
2276
+ }
2277
+ return;
2278
+ }
2279
+ }
2280
+ }
2281
+ finally {
2282
+ if (this.query === activeQuery) {
2283
+ this.query = null;
2284
+ this.input = null;
2285
+ }
2286
+ }
2287
+ }
2288
+ isEchoedForegroundUserMessage(event) {
2289
+ if (event.type !== "timeline" ||
2290
+ event.item.type !== "user_message" ||
2291
+ !this.activeForegroundTurnId ||
2292
+ !this.lastForegroundPromptText) {
2293
+ return false;
2294
+ }
2295
+ return event.item.text.trim() === this.lastForegroundPromptText.trim();
2296
+ }
2297
+ shouldSuppressStaleResult(message) {
2298
+ // Suppress stale results from interrupted requests. The cancel path already
2299
+ // emitted the terminal event; this result is leftover from the killed API
2300
+ // request. Consume the flag on ANY result so it doesn't linger.
2301
+ if (message.type === "result" && this.pendingInterruptAbort) {
2302
+ this.pendingInterruptAbort = false;
2303
+ if (message.subtype !== "success") {
2304
+ this.logger.debug("Suppressing stale non-success result from interrupted request");
2305
+ return true;
2306
+ }
2307
+ }
2308
+ if (message.type === "result" && message.subtype !== "success" && this.isAbortError(message)) {
2309
+ this.logger.debug("Suppressing abort result by content");
2310
+ return true;
2311
+ }
2312
+ return false;
2313
+ }
2314
+ isAssistantishMessage(message) {
2315
+ return (message.type === "assistant" ||
2316
+ message.type === "stream_event" ||
2317
+ message.type === "tool_progress" ||
2318
+ (message.type === "system" && message.subtype === "task_notification"));
2319
+ }
2320
+ routeSdkMessageFromPump(message) {
2321
+ if (this.shouldSuppressStaleResult(message)) {
2322
+ return;
2323
+ }
2324
+ const isForeground = Boolean(this.activeForegroundTurnId);
2325
+ if (!isForeground && this.isAssistantishMessage(message)) {
2326
+ this.startAutonomousTurn();
2327
+ }
2328
+ if (!isForeground && !this.autonomousTurn && message.type === "result") {
2329
+ return;
2330
+ }
2331
+ const turnId = this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? null;
2332
+ const identifiers = readEventIdentifiers(message);
2333
+ this.logger.trace({
2334
+ agentId: this.agentId,
2335
+ provider: "claude",
2336
+ sessionId: this.claudeSessionId,
2337
+ turnId: turnId ?? undefined,
2338
+ messageType: message.type,
2339
+ identifiers,
2340
+ rawEvent: message,
2341
+ }, "provider.claude.parsed_event");
2342
+ const messageEvents = this.translateMessageToEvents(message, {
2343
+ suppressAssistantText: true,
2344
+ suppressReasoning: true,
2345
+ });
2346
+ const assistantTimelineEvents = this.timelineAssembler
2347
+ .consume({
2348
+ message,
2349
+ runId: turnId,
2350
+ messageIdHint: identifiers.messageId,
2351
+ })
2352
+ .map((item) => ({
2353
+ type: "timeline",
2354
+ item,
2355
+ provider: "claude",
2356
+ }));
2357
+ // User message dedup: suppress echoed user messages that match the foreground prompt
2358
+ const filteredMessageEvents = messageEvents.filter((event) => !this.isEchoedForegroundUserMessage(event));
2359
+ const events = [...filteredMessageEvents, ...assistantTimelineEvents];
2360
+ if (events.length === 0) {
2361
+ return;
2362
+ }
2363
+ if (this.pendingInterruptAbort &&
2364
+ message.type === "result" &&
2365
+ events.some((event) => event.type === "turn_completed" || event.type === "turn_failed") &&
2366
+ (!this.activeForegroundTurnId || !this.foregroundHasVisibleActivity)) {
2367
+ this.pendingInterruptAbort = false;
2368
+ this.logger.debug("Suppressing stale Claude interrupt terminal result");
2369
+ return;
2370
+ }
2371
+ if (events.some((event) => event.type === "timeline" && event.item.type === "assistant_message")) {
2372
+ this.activeTurnHasAssistantText = true;
2373
+ }
2374
+ if (this.activeForegroundTurnId &&
2375
+ events.some((event) => event.type === "timeline" ||
2376
+ event.type === "permission_requested" ||
2377
+ event.type === "permission_resolved")) {
2378
+ this.foregroundHasVisibleActivity = true;
2379
+ }
2380
+ this.dispatchEvents(events);
2381
+ }
2382
+ async handleMissingResumedConversation(message, activeQuery) {
2383
+ const staleResumeError = this.readMissingResumedConversationError(message);
2384
+ if (!staleResumeError) {
2385
+ return false;
2386
+ }
2387
+ this.logger.warn({
2388
+ error: staleResumeError,
2389
+ }, "Claude resumed session no longer exists; invalidating persisted session");
2390
+ this.failActiveTurns(staleResumeError);
2391
+ this.input?.end();
2392
+ await this.awaitWithTimeout(activeQuery.return?.(), "query pump return on missing resumed conversation");
2393
+ if (this.query === activeQuery) {
2394
+ this.query = null;
2395
+ this.input = null;
2396
+ }
2397
+ this.persistence = null;
2398
+ this.persistedHistory = [];
2399
+ this.historyPending = false;
2400
+ this.cachedRuntimeInfo = null;
2401
+ this.queryRestartNeeded = false;
2402
+ this.autonomousTurn = null;
2403
+ this.activeForegroundTurnId = null;
2404
+ this.syncTurnState("missing resumed conversation");
2405
+ return true;
2406
+ }
2407
+ async interruptActiveTurn() {
2408
+ const queryToInterrupt = this.query;
2409
+ if (!queryToInterrupt || typeof queryToInterrupt.interrupt !== "function") {
2410
+ this.logger.trace({
2411
+ agentId: this.agentId,
2412
+ provider: "claude",
2413
+ sessionId: this.claudeSessionId,
2414
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
2415
+ }, "provider.claude.interrupt.no_query");
2416
+ return;
2417
+ }
2418
+ this.pendingInterruptAbort = true;
2419
+ try {
2420
+ await this.awaitWithTimeout(queryToInterrupt.interrupt(), "interruptActiveTurn query.interrupt()");
2421
+ }
2422
+ catch (error) {
2423
+ this.logger.warn({ err: error }, "Failed to interrupt active turn");
2424
+ }
2425
+ }
2426
+ translateMessageToEvents(message, options) {
2427
+ const parentToolUseId = "parent_tool_use_id" in message
2428
+ ? message.parent_tool_use_id
2429
+ : null;
2430
+ if (parentToolUseId) {
2431
+ return this.sidechainTracker.handleMessage(message, parentToolUseId);
2432
+ }
2433
+ const events = [];
2434
+ const sessionCapture = this.captureSessionIdFromMessage(message);
2435
+ if (sessionCapture.notice) {
2436
+ events.push({
2437
+ type: "timeline",
2438
+ provider: "claude",
2439
+ item: sessionCapture.notice,
2440
+ });
2441
+ }
2442
+ if (sessionCapture.threadStartedSessionId) {
2443
+ events.push({
2444
+ type: "thread_started",
2445
+ provider: "claude",
2446
+ sessionId: sessionCapture.threadStartedSessionId,
2447
+ });
2448
+ }
2449
+ switch (message.type) {
2450
+ case "system":
2451
+ this.appendSystemMessageEvents(message, events);
2452
+ break;
2453
+ case "user":
2454
+ this.appendUserMessageEvents(message, events);
2455
+ break;
2456
+ case "assistant": {
2457
+ const timelineItems = this.mapBlocksToTimeline(message.message.content, {
2458
+ suppressAssistantText: options?.suppressAssistantText ?? false,
2459
+ suppressReasoning: options?.suppressReasoning ?? false,
2460
+ });
2461
+ for (const item of timelineItems) {
2462
+ events.push({ type: "timeline", item, provider: "claude" });
2463
+ }
2464
+ break;
2465
+ }
2466
+ case "stream_event":
2467
+ this.appendStreamEventEvents(message, events, options);
2468
+ break;
2469
+ case "result":
2470
+ this.appendResultEvents(message, events);
2471
+ break;
2472
+ default:
2473
+ break;
2474
+ }
2475
+ return events;
2476
+ }
2477
+ appendSystemMessageEvents(message, events) {
2478
+ if (message.subtype === "init") {
2479
+ const sessionUpdate = this.handleSystemMessage(message);
2480
+ if (sessionUpdate.notice) {
2481
+ events.push({
2482
+ type: "timeline",
2483
+ provider: "claude",
2484
+ item: sessionUpdate.notice,
2485
+ });
2486
+ }
2487
+ if (sessionUpdate.threadStartedSessionId) {
2488
+ events.push({
2489
+ type: "thread_started",
2490
+ provider: "claude",
2491
+ sessionId: sessionUpdate.threadStartedSessionId,
2492
+ });
2493
+ }
2494
+ return;
2495
+ }
2496
+ if (message.subtype === "status") {
2497
+ const status = toObjectRecord(message)?.status;
2498
+ if (status === "compacting") {
2499
+ this.compacting = true;
2500
+ events.push({
2501
+ type: "timeline",
2502
+ item: { type: "compaction", status: "loading" },
2503
+ provider: "claude",
2504
+ });
2505
+ }
2506
+ return;
2507
+ }
2508
+ if (message.subtype === "compact_boundary") {
2509
+ const compactMetadata = readCompactionMetadata(message);
2510
+ events.push({
2511
+ type: "timeline",
2512
+ item: {
2513
+ type: "compaction",
2514
+ status: "completed",
2515
+ trigger: compactMetadata?.trigger === "manual" ? "manual" : "auto",
2516
+ preTokens: compactMetadata?.preTokens,
2517
+ },
2518
+ provider: "claude",
2519
+ });
2520
+ return;
2521
+ }
2522
+ if (message.subtype === "task_notification") {
2523
+ this.appendTaskNotificationEvents(message, events);
2524
+ return;
2525
+ }
2526
+ if (message.subtype === "task_progress") {
2527
+ this.lastContextWindowUsedTokens =
2528
+ readContextWindowUsedTokensFromTaskProgress(message) ?? this.lastContextWindowUsedTokens;
2529
+ if (typeof this.lastContextWindowUsedTokens === "number") {
2530
+ events.push(this.createUsageUpdatedEvent(this.lastContextWindowUsedTokens));
2531
+ }
2532
+ }
2533
+ }
2534
+ appendTaskNotificationEvents(message, events) {
2535
+ // TODO: subagent timelines are best-effort. Subagent task_notifications
2536
+ // arrive without parent_tool_use_id but with tool_use_id pointing at the
2537
+ // parent's Task call, so they slip past the sidechain router and pollute
2538
+ // the parent timeline. Drop them here; eventually thread them into the
2539
+ // parent Task tool call's sub_agent log instead.
2540
+ const taskUseId = message.tool_use_id;
2541
+ const cachedTool = taskUseId ? this.toolUseCache.get(taskUseId) : undefined;
2542
+ if (cachedTool?.name === "Task") {
2543
+ return;
2544
+ }
2545
+ const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(message);
2546
+ if (taskNotificationItem) {
2547
+ events.push({
2548
+ type: "timeline",
2549
+ item: taskNotificationItem,
2550
+ provider: "claude",
2551
+ });
2552
+ }
2553
+ const usage = readUsageFromTaskNotification(message);
2554
+ if (typeof usage === "number") {
2555
+ this.lastContextWindowUsedTokens = usage;
2556
+ events.push(this.createUsageUpdatedEvent(usage));
2557
+ }
2558
+ }
2559
+ appendUserMessageEvents(message, events) {
2560
+ if (isSyntheticUserEntry(message)) {
2561
+ return;
2562
+ }
2563
+ if (this.compacting) {
2564
+ this.compacting = false;
2565
+ return;
2566
+ }
2567
+ const messageId = typeof message.uuid === "string" && message.uuid.length > 0 ? message.uuid : undefined;
2568
+ this.rememberUserMessageId(messageId);
2569
+ const content = message.message?.content;
2570
+ const taskNotificationItem = mapTaskNotificationUserContentToToolCall({
2571
+ content,
2572
+ messageId,
2573
+ });
2574
+ if (taskNotificationItem) {
2575
+ events.push({
2576
+ type: "timeline",
2577
+ item: taskNotificationItem,
2578
+ provider: "claude",
2579
+ });
2580
+ return;
2581
+ }
2582
+ if (typeof content === "string" && content.length > 0) {
2583
+ if (!isClaudeTranscriptNoiseText(content)) {
2584
+ events.push({
2585
+ type: "timeline",
2586
+ item: {
2587
+ type: "user_message",
2588
+ text: content,
2589
+ ...(messageId ? { messageId } : {}),
2590
+ },
2591
+ provider: "claude",
2592
+ });
2593
+ }
2594
+ return;
2595
+ }
2596
+ if (Array.isArray(content)) {
2597
+ this.appendUserContentArrayEvents(content, messageId, events);
2598
+ }
2599
+ }
2600
+ appendUserContentArrayEvents(content, messageId, events) {
2601
+ const timelineItems = this.mapBlocksToTimeline(content, {
2602
+ textMessageType: "user_message",
2603
+ });
2604
+ for (const item of timelineItems) {
2605
+ if (item.type === "user_message" && messageId && !item.messageId) {
2606
+ events.push({
2607
+ type: "timeline",
2608
+ item: { ...item, messageId },
2609
+ provider: "claude",
2610
+ });
2611
+ continue;
2612
+ }
2613
+ events.push({ type: "timeline", item, provider: "claude" });
2614
+ }
2615
+ }
2616
+ appendStreamEventEvents(message, events, options) {
2617
+ const usageUpdatedEvent = this.trackStreamEventUsage(message.event);
2618
+ if (usageUpdatedEvent) {
2619
+ events.push(usageUpdatedEvent);
2620
+ }
2621
+ const timelineItems = this.mapPartialEvent(message.event, {
2622
+ suppressAssistantText: options?.suppressAssistantText ?? false,
2623
+ suppressReasoning: options?.suppressReasoning ?? false,
2624
+ });
2625
+ for (const item of timelineItems) {
2626
+ events.push({ type: "timeline", item, provider: "claude" });
2627
+ }
2628
+ }
2629
+ appendResultEvents(message, events) {
2630
+ const usage = this.convertUsage(message, message.modelUsage);
2631
+ if (message.subtype === "success") {
2632
+ // Built-in slash commands (e.g. /voice, /usage, "Unknown command: …")
2633
+ // run client-side in the Claude CLI with no model turn — output_tokens
2634
+ // is 0 and the user-visible text is carried in `result`. Surface it only
2635
+ // when the turn has not already emitted assistant text so zero-token
2636
+ // accounting from provider gateways does not duplicate streamed output.
2637
+ const resultText = typeof message.result === "string" ? message.result.trim() : "";
2638
+ const outputTokens = message.usage?.output_tokens;
2639
+ if (resultText.length > 0 && outputTokens === 0 && !this.activeTurnHasAssistantText) {
2640
+ events.push({
2641
+ type: "timeline",
2642
+ provider: "claude",
2643
+ item: {
2644
+ type: "assistant_message",
2645
+ text: resultText,
2646
+ messageId: message.uuid,
2647
+ },
2648
+ });
2649
+ }
2650
+ events.push({ type: "turn_completed", provider: "claude", usage });
2651
+ return;
2652
+ }
2653
+ const errorMessage = "errors" in message && Array.isArray(message.errors) && message.errors.length > 0
2654
+ ? message.errors.join("\n")
2655
+ : "Claude run failed";
2656
+ events.push(this.buildTurnFailedEvent(errorMessage));
2657
+ }
2658
+ createClaudeSessionChangedNotice(oldSessionId, newSessionId) {
2659
+ return {
2660
+ type: "assistant_message",
2661
+ text: `Claude switched to a new session: ${oldSessionId} -> ${newSessionId}`,
2662
+ };
2663
+ }
2664
+ captureSessionIdFromMessage(message) {
2665
+ const msgRecord = toObjectRecord(message) ?? {};
2666
+ const sessionId = extractSessionIdRaw({
2667
+ session_id: msgRecord.session_id,
2668
+ sessionId: msgRecord.sessionId,
2669
+ session: isObjectRecord(msgRecord.session) ? { id: msgRecord.session.id } : null,
2670
+ }).trim();
2671
+ if (!sessionId) {
2672
+ return { threadStartedSessionId: null, notice: null };
2673
+ }
2674
+ if (this.claudeSessionId === null) {
2675
+ this.claudeSessionId = sessionId;
2676
+ this.persistence = null;
2677
+ return { threadStartedSessionId: sessionId, notice: null };
2678
+ }
2679
+ if (this.claudeSessionId === sessionId) {
2680
+ return { threadStartedSessionId: null, notice: null };
2681
+ }
2682
+ const oldSessionId = this.claudeSessionId;
2683
+ // Session ID changed mid-stream (e.g. a hook caused Claude to restart
2684
+ // with a new session). Accept the new ID and continue — the turn should
2685
+ // not be failed just because the underlying subprocess cycled.
2686
+ this.logger.warn({ existingSessionId: this.claudeSessionId, newSessionId: sessionId }, "Claude session ID changed in message; accepting new session");
2687
+ this.claudeSessionId = sessionId;
2688
+ this.persistence = null;
2689
+ return {
2690
+ threadStartedSessionId: sessionId,
2691
+ notice: this.createClaudeSessionChangedNotice(oldSessionId, sessionId),
2692
+ };
2693
+ }
2694
+ handleSystemMessage(message) {
2695
+ if (message.subtype !== "init") {
2696
+ return { threadStartedSessionId: null, notice: null };
2697
+ }
2698
+ const msgRecord = toObjectRecord(message) ?? {};
2699
+ const newSessionId = extractSessionIdRaw({
2700
+ session_id: msgRecord.session_id,
2701
+ sessionId: msgRecord.sessionId,
2702
+ session: isObjectRecord(msgRecord.session) ? { id: msgRecord.session.id } : null,
2703
+ }).trim();
2704
+ if (!newSessionId) {
2705
+ return { threadStartedSessionId: null, notice: null };
2706
+ }
2707
+ const existingSessionId = this.claudeSessionId;
2708
+ let threadStartedSessionId = null;
2709
+ let notice = null;
2710
+ if (existingSessionId === null) {
2711
+ this.claudeSessionId = newSessionId;
2712
+ threadStartedSessionId = newSessionId;
2713
+ this.logger.debug({ sessionId: newSessionId }, "Claude session ID set for the first time");
2714
+ }
2715
+ else if (existingSessionId === newSessionId) {
2716
+ this.logger.debug({ sessionId: newSessionId }, "Claude session ID unchanged (same value)");
2717
+ }
2718
+ else {
2719
+ // Session ID changed in an init message (e.g. a hook restarted Claude
2720
+ // with a new session mid-turn). Accept the new ID and continue.
2721
+ this.logger.warn({ existingSessionId, newSessionId }, "Claude session ID changed in init message; accepting new session");
2722
+ this.claudeSessionId = newSessionId;
2723
+ threadStartedSessionId = newSessionId;
2724
+ notice = this.createClaudeSessionChangedNotice(existingSessionId, newSessionId);
2725
+ }
2726
+ this.availableModes = DEFAULT_MODES;
2727
+ this.currentMode = message.permissionMode;
2728
+ if (this.currentMode !== "plan") {
2729
+ this.planResumeMode = this.currentMode;
2730
+ }
2731
+ this.persistence = null;
2732
+ if (message.model) {
2733
+ const normalizedRuntimeModel = normalizeClaudeRuntimeModelId(message.model);
2734
+ this.logger.debug({ runtimeModel: message.model, normalizedRuntimeModel }, "Captured runtime model from SDK init");
2735
+ if (normalizedRuntimeModel) {
2736
+ this.lastOptionsModel = normalizedRuntimeModel;
2737
+ }
2738
+ else if (!this.lastOptionsModel) {
2739
+ this.lastOptionsModel = this.config.model ?? null;
2740
+ }
2741
+ this.lastRuntimeModel = message.model;
2742
+ this.cachedRuntimeInfo = null;
2743
+ }
2744
+ return { threadStartedSessionId, notice };
2745
+ }
2746
+ readMissingResumedConversationError(message) {
2747
+ if (message.type !== "result" || message.subtype !== "error_during_execution") {
2748
+ return null;
2749
+ }
2750
+ if (!this.claudeSessionId) {
2751
+ return null;
2752
+ }
2753
+ const errors = "errors" in message && Array.isArray(message.errors) ? message.errors : [];
2754
+ for (const entry of errors) {
2755
+ if (typeof entry !== "string") {
2756
+ continue;
2757
+ }
2758
+ const match = entry.match(/^No conversation found with session ID:\s*(.+)$/);
2759
+ if (!match) {
2760
+ continue;
2761
+ }
2762
+ if (match[1]?.trim() === this.claudeSessionId) {
2763
+ return entry.trim();
2764
+ }
2765
+ }
2766
+ return null;
2767
+ }
2768
+ convertUsage(message, modelUsage) {
2769
+ if (!message.usage) {
2770
+ return undefined;
2771
+ }
2772
+ const usage = {
2773
+ inputTokens: message.usage.input_tokens,
2774
+ cachedInputTokens: message.usage.cache_read_input_tokens,
2775
+ outputTokens: message.usage.output_tokens,
2776
+ totalCostUsd: message.total_cost_usd,
2777
+ };
2778
+ const contextWindowMaxTokens = extractContextWindowSize(modelUsage ?? message.modelUsage);
2779
+ if (contextWindowMaxTokens !== undefined) {
2780
+ this.lastContextWindowMaxTokens = contextWindowMaxTokens;
2781
+ usage.contextWindowMaxTokens = contextWindowMaxTokens;
2782
+ }
2783
+ else if (this.lastContextWindowMaxTokens !== undefined) {
2784
+ usage.contextWindowMaxTokens = this.lastContextWindowMaxTokens;
2785
+ }
2786
+ if (typeof this.lastContextWindowUsedTokens === "number") {
2787
+ // task_progress.total_tokens is the accurate context window fill level.
2788
+ // Prefer it over result.usage which contains accumulated session totals.
2789
+ usage.contextWindowUsedTokens = this.lastContextWindowUsedTokens;
2790
+ }
2791
+ else if (typeof this.lastStreamRequestInputTokens === "number" &&
2792
+ typeof this.lastStreamRequestOutputTokens === "number") {
2793
+ usage.contextWindowUsedTokens =
2794
+ this.lastStreamRequestInputTokens + this.lastStreamRequestOutputTokens;
2795
+ }
2796
+ else if (message.usage) {
2797
+ // Fallback: derive from result.usage when no task_progress has been
2798
+ // received yet. These values are accumulated across all API calls, but
2799
+ // for the first turn they equal the per-call values so the estimate is
2800
+ // reasonable. Once a task_progress arrives it takes over permanently.
2801
+ const usageWithCacheCreation = message.usage;
2802
+ const derived = (message.usage.input_tokens ?? 0) +
2803
+ (usageWithCacheCreation.cache_creation_input_tokens ?? 0) +
2804
+ (message.usage.cache_read_input_tokens ?? 0) +
2805
+ (message.usage.output_tokens ?? 0);
2806
+ if (Number.isFinite(derived) && derived > 0) {
2807
+ usage.contextWindowUsedTokens = derived;
2808
+ }
2809
+ }
2810
+ return usage;
2811
+ }
2812
+ createUsageUpdatedEvent(contextWindowUsedTokens) {
2813
+ const usage = {
2814
+ contextWindowUsedTokens,
2815
+ };
2816
+ if (this.lastContextWindowMaxTokens !== undefined) {
2817
+ usage.contextWindowMaxTokens = this.lastContextWindowMaxTokens;
2818
+ }
2819
+ return {
2820
+ type: "usage_updated",
2821
+ provider: "claude",
2822
+ usage,
2823
+ };
2824
+ }
2825
+ trackStreamEventUsage(event) {
2826
+ const streamEvent = toObjectRecord(event);
2827
+ if (!streamEvent) {
2828
+ return null;
2829
+ }
2830
+ const eventType = readTrimmedString(streamEvent.type);
2831
+ if (eventType === "message_start") {
2832
+ const inputTokens = readStreamRequestInputTokens(streamEvent);
2833
+ if (typeof inputTokens !== "number") {
2834
+ return null;
2835
+ }
2836
+ this.lastStreamRequestInputTokens = inputTokens;
2837
+ this.lastStreamRequestOutputTokens = 0;
2838
+ }
2839
+ else if (eventType === "message_delta") {
2840
+ const outputTokens = readStreamRequestOutputTokens(streamEvent);
2841
+ if (typeof outputTokens !== "number") {
2842
+ return null;
2843
+ }
2844
+ this.lastStreamRequestOutputTokens = outputTokens;
2845
+ }
2846
+ else {
2847
+ return null;
2848
+ }
2849
+ if (typeof this.lastStreamRequestInputTokens !== "number" ||
2850
+ typeof this.lastStreamRequestOutputTokens !== "number") {
2851
+ return null;
2852
+ }
2853
+ return this.createUsageUpdatedEvent(this.lastStreamRequestInputTokens + this.lastStreamRequestOutputTokens);
2854
+ }
2855
+ enqueueTimeline(item) {
2856
+ this.pushEvent({ type: "timeline", item, provider: "claude" });
2857
+ }
2858
+ flushPendingToolCalls() {
2859
+ for (const [id, entry] of this.toolUseCache) {
2860
+ if (entry.started) {
2861
+ this.pushToolCall(mapClaudeCanceledToolCall({
2862
+ name: entry.name,
2863
+ callId: id,
2864
+ input: entry.input ?? null,
2865
+ output: null,
2866
+ }));
2867
+ }
2868
+ }
2869
+ this.toolUseCache.clear();
2870
+ this.sidechainTracker.clear();
2871
+ }
2872
+ pushToolCall(item, target) {
2873
+ if (!item) {
2874
+ return;
2875
+ }
2876
+ if (target) {
2877
+ target.push(item);
2878
+ return;
2879
+ }
2880
+ this.enqueueTimeline(item);
2881
+ }
2882
+ pushEvent(event) {
2883
+ this.notifySubscribers(event);
2884
+ }
2885
+ notifySubscribers(event) {
2886
+ const turnId = this.activeForegroundTurnId ?? this.autonomousTurn?.id;
2887
+ const tagged = turnId ? { ...event, turnId } : event;
2888
+ this.logger.trace({
2889
+ agentId: this.agentId,
2890
+ provider: "claude",
2891
+ sessionId: this.claudeSessionId,
2892
+ turnId: getAgentStreamEventTurnId(tagged),
2893
+ event: tagged,
2894
+ }, "provider.claude.event_emit");
2895
+ for (const callback of this.subscribers) {
2896
+ try {
2897
+ callback(tagged);
2898
+ }
2899
+ catch (error) {
2900
+ this.logger.warn({ err: error }, "Subscriber callback threw");
2901
+ }
2902
+ }
2903
+ }
2904
+ normalizePermissionUpdates(updates) {
2905
+ if (!updates || updates.length === 0) {
2906
+ return undefined;
2907
+ }
2908
+ const normalized = updates.filter(isPermissionUpdate);
2909
+ return normalized.length > 0 ? normalized : undefined;
2910
+ }
2911
+ rejectAllPendingPermissions(error) {
2912
+ for (const [id, pending] of this.pendingPermissions) {
2913
+ pending.cleanup?.();
2914
+ pending.reject(error);
2915
+ this.pendingPermissions.delete(id);
2916
+ }
2917
+ }
2918
+ loadPersistedHistory(sessionId) {
2919
+ try {
2920
+ const historyPath = this.resolveHistoryPath(sessionId);
2921
+ if (!historyPath || !fs.existsSync(historyPath)) {
2922
+ return;
2923
+ }
2924
+ this.ingestPersistedHistory(fs.readFileSync(historyPath, "utf8"));
2925
+ }
2926
+ catch {
2927
+ // ignore history load failures
2928
+ }
2929
+ }
2930
+ ingestPersistedHistory(content) {
2931
+ if (!content) {
2932
+ return;
2933
+ }
2934
+ const timeline = [];
2935
+ for (const line of content.split(/\r?\n/)) {
2936
+ this.ingestPersistedHistoryLine(line, timeline);
2937
+ }
2938
+ if (timeline.length > 0) {
2939
+ this.persistedHistory = [...this.persistedHistory, ...timeline];
2940
+ this.historyPending = true;
2941
+ }
2942
+ }
2943
+ ingestPersistedHistoryLine(line, timeline) {
2944
+ const trimmed = line.trim();
2945
+ if (!trimmed) {
2946
+ return;
2947
+ }
2948
+ let entry;
2949
+ try {
2950
+ const parsed = JSON.parse(trimmed);
2951
+ const record = toObjectRecord(parsed);
2952
+ if (!record) {
2953
+ return;
2954
+ }
2955
+ entry = record;
2956
+ }
2957
+ catch {
2958
+ return;
2959
+ }
2960
+ if (entry.isSidechain) {
2961
+ return;
2962
+ }
2963
+ if (entry.type === "user" && typeof entry.uuid === "string") {
2964
+ this.rememberUserMessageId(entry.uuid);
2965
+ }
2966
+ const historyTimestamp = normalizeProviderReplayTimestamp(entry.timestamp);
2967
+ const items = this.convertHistoryEntry(entry);
2968
+ if (items.length > 0) {
2969
+ timeline.push(...items.map((item) => ({
2970
+ item,
2971
+ timestamp: historyTimestamp ?? undefined,
2972
+ })));
2973
+ }
2974
+ }
2975
+ resolveHistoryPath(sessionId) {
2976
+ const cwd = this.config.cwd;
2977
+ if (!cwd)
2978
+ return null;
2979
+ const sanitized = sanitizeClaudeProjectPath(cwd);
2980
+ const configDir = process.env.CLAUDE_CONFIG_DIR ?? path.join(os.homedir(), ".claude");
2981
+ const dir = path.join(configDir, "projects", sanitized);
2982
+ return path.join(dir, `${sessionId}.jsonl`);
2983
+ }
2984
+ convertHistoryEntry(entry) {
2985
+ return convertClaudeHistoryEntry(entry, (content) => this.mapBlocksToTimeline(content));
2986
+ }
2987
+ // Maps Claude content blocks into AgentTimelineItems.
2988
+ //
2989
+ // textMessageType controls what type text blocks emit:
2990
+ // - "assistant_message" (default): one item per text block (streaming granularity)
2991
+ // - "user_message": coalesces all text blocks into a single user_message
2992
+ // (matches extractUserMessageText semantics: trim each block, join with "\n\n")
2993
+ //
2994
+ // suppressAssistantText only applies when textMessageType is "assistant_message" — user text
2995
+ // must never be suppressed since the TimelineAssembler only handles assistant text.
2996
+ //
2997
+ // NOTE: convertClaudeHistoryEntry uses extractUserMessageText directly instead of this function
2998
+ // for user entries. Both paths must produce equivalent user_message items.
2999
+ mapBlocksToTimeline(content, options) {
3000
+ const textMessageType = options?.textMessageType ?? "assistant_message";
3001
+ const suppressText = textMessageType === "assistant_message" && (options?.suppressAssistantText ?? false);
3002
+ const suppressReasoning = options?.suppressReasoning ?? false;
3003
+ if (typeof content === "string") {
3004
+ if (!content ||
3005
+ content === INTERRUPT_TOOL_USE_PLACEHOLDER ||
3006
+ isClaudeTranscriptNoiseText(content)) {
3007
+ return [];
3008
+ }
3009
+ if (suppressText) {
3010
+ return [];
3011
+ }
3012
+ return [{ type: textMessageType, text: content }];
3013
+ }
3014
+ const items = [];
3015
+ // User SDK entries can arrive as multiple text blocks, but Paseo treats them as one message.
3016
+ const userTextParts = [];
3017
+ for (const block of content) {
3018
+ if (!isClaudeContentChunk(block)) {
3019
+ continue;
3020
+ }
3021
+ this.mapBlockToTimeline(block, {
3022
+ items,
3023
+ userTextParts,
3024
+ textMessageType,
3025
+ suppressText,
3026
+ suppressReasoning,
3027
+ });
3028
+ }
3029
+ if (textMessageType === "user_message" && userTextParts.length > 0) {
3030
+ items.unshift({
3031
+ type: "user_message",
3032
+ text: userTextParts.join("\n\n"),
3033
+ });
3034
+ }
3035
+ return items;
3036
+ }
3037
+ appendTextBlockToTimeline(block, context) {
3038
+ const { items, userTextParts, textMessageType, suppressText } = context;
3039
+ const text = typeof block.text === "string" ? block.text : "";
3040
+ if (!text || text === INTERRUPT_TOOL_USE_PLACEHOLDER || isClaudeTranscriptNoiseText(text)) {
3041
+ return;
3042
+ }
3043
+ if (textMessageType === "user_message") {
3044
+ const trimmed = text.trim();
3045
+ if (trimmed) {
3046
+ userTextParts.push(trimmed);
3047
+ }
3048
+ return;
3049
+ }
3050
+ if (!suppressText) {
3051
+ items.push({ type: "assistant_message", text });
3052
+ }
3053
+ }
3054
+ mapBlockToTimeline(block, context) {
3055
+ switch (block.type) {
3056
+ case "text":
3057
+ case "text_delta":
3058
+ this.appendTextBlockToTimeline(block, context);
3059
+ break;
3060
+ case "thinking":
3061
+ case "thinking_delta":
3062
+ if (typeof block.thinking === "string" && block.thinking && !context.suppressReasoning) {
3063
+ context.items.push({ type: "reasoning", text: block.thinking });
3064
+ }
3065
+ break;
3066
+ case "tool_use":
3067
+ case "server_tool_use":
3068
+ case "mcp_tool_use":
3069
+ this.handleToolUseStart(block, context.items);
3070
+ break;
3071
+ case "tool_result":
3072
+ case "mcp_tool_result":
3073
+ case "web_fetch_tool_result":
3074
+ case "web_search_tool_result":
3075
+ case "code_execution_tool_result":
3076
+ case "bash_code_execution_tool_result":
3077
+ case "text_editor_code_execution_tool_result":
3078
+ this.handleToolResult(block, context.items);
3079
+ break;
3080
+ default:
3081
+ break;
3082
+ }
3083
+ }
3084
+ handleToolUseStart(block, items) {
3085
+ const entry = this.upsertToolUseEntry(block);
3086
+ if (!entry) {
3087
+ return;
3088
+ }
3089
+ if (entry.started) {
3090
+ return;
3091
+ }
3092
+ entry.started = true;
3093
+ this.toolUseCache.set(entry.id, entry);
3094
+ this.pushToolCall(mapClaudeRunningToolCall({
3095
+ name: entry.name,
3096
+ callId: entry.id,
3097
+ input: entry.input ?? this.normalizeToolInput(block.input) ?? null,
3098
+ output: null,
3099
+ }), items);
3100
+ }
3101
+ handleToolResult(block, items) {
3102
+ const entry = typeof block.tool_use_id === "string" ? this.toolUseCache.get(block.tool_use_id) : undefined;
3103
+ const blockToolName = typeof block.tool_name === "string" ? block.tool_name : undefined;
3104
+ const toolName = entry?.name ?? blockToolName ?? "tool";
3105
+ const callId = typeof block.tool_use_id === "string" && block.tool_use_id.length > 0
3106
+ ? block.tool_use_id
3107
+ : (entry?.id ?? null);
3108
+ // Extract output from block.content (SDK always returns content in string form)
3109
+ const output = this.buildToolOutput(block, entry);
3110
+ if (block.is_error) {
3111
+ this.pushToolCall(mapClaudeFailedToolCall({
3112
+ name: toolName,
3113
+ callId,
3114
+ input: entry?.input ?? null,
3115
+ output: output ?? null,
3116
+ error: block,
3117
+ }), items);
3118
+ }
3119
+ else {
3120
+ this.pushToolCall(mapClaudeCompletedToolCall({
3121
+ name: toolName,
3122
+ callId,
3123
+ input: entry?.input ?? null,
3124
+ output: output ?? null,
3125
+ }), items);
3126
+ }
3127
+ if (typeof block.tool_use_id === "string") {
3128
+ this.toolUseCache.delete(block.tool_use_id);
3129
+ this.sidechainTracker.delete(block.tool_use_id);
3130
+ }
3131
+ }
3132
+ buildToolOutput(block, entry) {
3133
+ if (block.is_error) {
3134
+ return undefined;
3135
+ }
3136
+ const blockServer = typeof block.server === "string" ? block.server : undefined;
3137
+ const blockToolName = typeof block.tool_name === "string" ? block.tool_name : undefined;
3138
+ const server = entry?.server ?? blockServer ?? "tool";
3139
+ const tool = entry?.name ?? blockToolName ?? "tool";
3140
+ const content = coerceToolResultContentToString(block.content);
3141
+ const input = entry?.input;
3142
+ // Build structured result based on tool type
3143
+ const structured = this.buildStructuredToolResult(server, tool, content, input);
3144
+ if (structured) {
3145
+ return structured;
3146
+ }
3147
+ // Fallback format - try to parse JSON first
3148
+ const result = {};
3149
+ if (content.length > 0) {
3150
+ try {
3151
+ // If content is a JSON string, parse it
3152
+ result.output = JSON.parse(content);
3153
+ }
3154
+ catch {
3155
+ // If not JSON, return unchanged (no extra wrapping)
3156
+ result.output = content;
3157
+ }
3158
+ }
3159
+ // Preserve file changes tracked during tool execution
3160
+ if (entry?.files?.length) {
3161
+ result.files = entry.files;
3162
+ }
3163
+ return Object.keys(result).length > 0 ? result : undefined;
3164
+ }
3165
+ isCommandExecutionTool(normalizedServer, normalizedTool, input) {
3166
+ if (normalizedServer.includes("bash") ||
3167
+ normalizedServer.includes("shell") ||
3168
+ normalizedServer.includes("command")) {
3169
+ return true;
3170
+ }
3171
+ if (normalizedTool.includes("bash") ||
3172
+ normalizedTool.includes("shell") ||
3173
+ normalizedTool.includes("command")) {
3174
+ return true;
3175
+ }
3176
+ return Boolean(input && (typeof input.command === "string" || Array.isArray(input.command)));
3177
+ }
3178
+ static isFileWriteTool(normalizedTool) {
3179
+ return (normalizedTool.includes("write") ||
3180
+ normalizedTool === "write_file" ||
3181
+ normalizedTool === "create_file");
3182
+ }
3183
+ static isFileEditTool(normalizedTool) {
3184
+ return (normalizedTool.includes("edit") ||
3185
+ normalizedTool.includes("patch") ||
3186
+ normalizedTool === "apply_patch" ||
3187
+ normalizedTool === "apply_diff");
3188
+ }
3189
+ static isFileReadTool(normalizedTool) {
3190
+ return (normalizedTool.includes("read") ||
3191
+ normalizedTool === "read_file" ||
3192
+ normalizedTool === "view_file");
3193
+ }
3194
+ buildStructuredToolResult(server, tool, output, input) {
3195
+ const normalizedServer = server.toLowerCase();
3196
+ const normalizedTool = tool.toLowerCase();
3197
+ if (this.isCommandExecutionTool(normalizedServer, normalizedTool, input)) {
3198
+ const command = this.extractCommandText(input ?? {}) ?? "command";
3199
+ return {
3200
+ type: "command",
3201
+ command,
3202
+ output,
3203
+ cwd: typeof input?.cwd === "string" ? input.cwd : undefined,
3204
+ };
3205
+ }
3206
+ if (ClaudeAgentSession.isFileWriteTool(normalizedTool) &&
3207
+ input &&
3208
+ typeof input.file_path === "string") {
3209
+ return {
3210
+ type: "file_write",
3211
+ filePath: input.file_path,
3212
+ oldContent: "",
3213
+ newContent: typeof input.content === "string" ? input.content : output,
3214
+ };
3215
+ }
3216
+ if (ClaudeAgentSession.isFileEditTool(normalizedTool) &&
3217
+ input &&
3218
+ typeof input.file_path === "string") {
3219
+ // Support both old_str/new_str and old_string/new_string parameter names
3220
+ const oldContent = firstStringField(input, "old_str", "old_string");
3221
+ const newContent = firstStringField(input, "new_str", "new_string");
3222
+ const diff = firstStringField(input, "patch", "diff");
3223
+ return {
3224
+ type: "file_edit",
3225
+ filePath: input.file_path,
3226
+ diff,
3227
+ oldContent,
3228
+ newContent,
3229
+ };
3230
+ }
3231
+ if (ClaudeAgentSession.isFileReadTool(normalizedTool) &&
3232
+ input &&
3233
+ typeof input.file_path === "string") {
3234
+ return {
3235
+ type: "file_read",
3236
+ filePath: input.file_path,
3237
+ content: output,
3238
+ };
3239
+ }
3240
+ return undefined;
3241
+ }
3242
+ updatePartialEventToolState(event) {
3243
+ if (event.type === "content_block_start") {
3244
+ const block = isClaudeContentChunk(event.content_block) ? event.content_block : null;
3245
+ if (block?.type === "tool_use" &&
3246
+ typeof event.index === "number" &&
3247
+ typeof block.id === "string") {
3248
+ this.toolUseIndexToId.set(event.index, block.id);
3249
+ this.toolUseInputBuffers.delete(block.id);
3250
+ }
3251
+ return false;
3252
+ }
3253
+ if (event.type === "content_block_delta") {
3254
+ const delta = isClaudeContentChunk(event.delta) ? event.delta : null;
3255
+ if (delta?.type === "input_json_delta") {
3256
+ const partialJson = typeof delta.partial_json === "string" ? delta.partial_json : undefined;
3257
+ this.handleToolInputDelta(event.index, partialJson);
3258
+ return true;
3259
+ }
3260
+ return false;
3261
+ }
3262
+ if (event.type === "content_block_stop" && typeof event.index === "number") {
3263
+ const toolId = this.toolUseIndexToId.get(event.index);
3264
+ if (toolId) {
3265
+ this.toolUseIndexToId.delete(event.index);
3266
+ this.toolUseInputBuffers.delete(toolId);
3267
+ }
3268
+ }
3269
+ return false;
3270
+ }
3271
+ mapPartialEvent(event, options) {
3272
+ if (this.updatePartialEventToolState(event)) {
3273
+ return [];
3274
+ }
3275
+ switch (event.type) {
3276
+ case "content_block_start":
3277
+ return isClaudeContentChunk(event.content_block)
3278
+ ? this.mapBlocksToTimeline([event.content_block], {
3279
+ suppressAssistantText: options?.suppressAssistantText,
3280
+ suppressReasoning: options?.suppressReasoning,
3281
+ })
3282
+ : [];
3283
+ case "content_block_delta":
3284
+ return isClaudeContentChunk(event.delta)
3285
+ ? this.mapBlocksToTimeline([event.delta], {
3286
+ suppressAssistantText: options?.suppressAssistantText,
3287
+ suppressReasoning: options?.suppressReasoning,
3288
+ })
3289
+ : [];
3290
+ default:
3291
+ return [];
3292
+ }
3293
+ }
3294
+ upsertToolUseEntry(block) {
3295
+ const id = typeof block.id === "string" ? block.id : undefined;
3296
+ if (!id) {
3297
+ return null;
3298
+ }
3299
+ const existing = this.toolUseCache.get(id) ?? createDefaultToolUseCacheEntry(id, block);
3300
+ if (typeof block.name === "string" && block.name.length > 0) {
3301
+ existing.name = block.name;
3302
+ }
3303
+ if (typeof block.server === "string" && block.server.length > 0) {
3304
+ existing.server = block.server;
3305
+ }
3306
+ else if (!existing.server) {
3307
+ existing.server = existing.name;
3308
+ }
3309
+ if (block.type === "tool_use" ||
3310
+ block.type === "mcp_tool_use" ||
3311
+ block.type === "server_tool_use") {
3312
+ const input = this.normalizeToolInput(block.input);
3313
+ if (input) {
3314
+ this.applyToolInput(existing, input);
3315
+ }
3316
+ }
3317
+ this.toolUseCache.set(id, existing);
3318
+ return existing;
3319
+ }
3320
+ handleToolInputDelta(index, partialJson) {
3321
+ if (typeof index !== "number" || typeof partialJson !== "string") {
3322
+ return;
3323
+ }
3324
+ const toolId = this.toolUseIndexToId.get(index);
3325
+ if (!toolId) {
3326
+ return;
3327
+ }
3328
+ const buffer = (this.toolUseInputBuffers.get(toolId) ?? "") + partialJson;
3329
+ this.toolUseInputBuffers.set(toolId, buffer);
3330
+ const entry = this.toolUseCache.get(toolId);
3331
+ const parsed = parsePartialJsonObject(buffer);
3332
+ if (!entry || !parsed) {
3333
+ return;
3334
+ }
3335
+ const normalized = this.normalizeToolInput(parsed.value);
3336
+ if (!normalized) {
3337
+ return;
3338
+ }
3339
+ if (!parsed.complete && Object.keys(normalized).length === 0) {
3340
+ return;
3341
+ }
3342
+ if (this.areToolInputsEqual(entry.input ?? undefined, normalized)) {
3343
+ return;
3344
+ }
3345
+ this.applyToolInput(entry, normalized);
3346
+ this.toolUseCache.set(toolId, entry);
3347
+ this.pushToolCall(mapClaudeRunningToolCall({
3348
+ name: entry.name,
3349
+ callId: toolId,
3350
+ input: normalized,
3351
+ output: null,
3352
+ }));
3353
+ }
3354
+ normalizeToolInput(input) {
3355
+ if (!isMetadata(input)) {
3356
+ return null;
3357
+ }
3358
+ return input;
3359
+ }
3360
+ areToolInputsEqual(left, right) {
3361
+ if (!left) {
3362
+ return false;
3363
+ }
3364
+ const leftKeys = Object.keys(left);
3365
+ const rightKeys = Object.keys(right);
3366
+ if (leftKeys.length !== rightKeys.length) {
3367
+ return false;
3368
+ }
3369
+ return rightKeys.every((key) => left[key] === right[key]);
3370
+ }
3371
+ applyToolInput(entry, input) {
3372
+ entry.input = input;
3373
+ if (this.isCommandTool(entry.name, input)) {
3374
+ entry.classification = "command";
3375
+ entry.commandText = this.extractCommandText(input) ?? entry.commandText;
3376
+ }
3377
+ else {
3378
+ const files = this.extractFileChanges(input);
3379
+ if (files?.length) {
3380
+ entry.classification = "file_change";
3381
+ entry.files = files;
3382
+ }
3383
+ }
3384
+ }
3385
+ isCommandTool(name, input) {
3386
+ const normalized = name.toLowerCase();
3387
+ if (normalized.includes("bash") ||
3388
+ normalized.includes("shell") ||
3389
+ normalized.includes("terminal") ||
3390
+ normalized.includes("command")) {
3391
+ return true;
3392
+ }
3393
+ if (typeof input.command === "string" || Array.isArray(input.command)) {
3394
+ return true;
3395
+ }
3396
+ return false;
3397
+ }
3398
+ extractCommandText(input) {
3399
+ const command = input.command;
3400
+ if (typeof command === "string" && command.length > 0) {
3401
+ return command;
3402
+ }
3403
+ if (Array.isArray(command)) {
3404
+ const tokens = command.filter((value) => typeof value === "string");
3405
+ if (tokens.length > 0) {
3406
+ return tokens.join(" ");
3407
+ }
3408
+ }
3409
+ if (typeof input.description === "string" && input.description.length > 0) {
3410
+ return input.description;
3411
+ }
3412
+ return undefined;
3413
+ }
3414
+ extractFileChanges(input) {
3415
+ if (typeof input.file_path === "string" && input.file_path.length > 0) {
3416
+ const relative = this.relativizePath(input.file_path);
3417
+ if (relative) {
3418
+ return [{ path: relative, kind: this.detectFileKind(input.file_path) }];
3419
+ }
3420
+ }
3421
+ if (typeof input.patch === "string" && input.patch.length > 0) {
3422
+ const files = this.parsePatchFileList(input.patch);
3423
+ if (files.length > 0) {
3424
+ return files.map((entry) => ({
3425
+ path: this.relativizePath(entry.path) ?? entry.path,
3426
+ kind: entry.kind,
3427
+ }));
3428
+ }
3429
+ }
3430
+ if (Array.isArray(input.files)) {
3431
+ const files = [];
3432
+ for (const value of input.files) {
3433
+ if (typeof value === "string" && value.length > 0) {
3434
+ files.push({
3435
+ path: this.relativizePath(value) ?? value,
3436
+ kind: this.detectFileKind(value),
3437
+ });
3438
+ }
3439
+ }
3440
+ if (files.length > 0) {
3441
+ return files;
3442
+ }
3443
+ }
3444
+ return undefined;
3445
+ }
3446
+ detectFileKind(filePath) {
3447
+ try {
3448
+ return fs.existsSync(filePath) ? "update" : "add";
3449
+ }
3450
+ catch {
3451
+ return "update";
3452
+ }
3453
+ }
3454
+ relativizePath(target) {
3455
+ if (!target) {
3456
+ return undefined;
3457
+ }
3458
+ const cwd = this.config.cwd;
3459
+ if (cwd && target.startsWith(cwd)) {
3460
+ const relative = path.relative(cwd, target);
3461
+ return relative.length > 0 ? relative : path.basename(target);
3462
+ }
3463
+ return target;
3464
+ }
3465
+ parsePatchFileList(patch) {
3466
+ const files = [];
3467
+ const seen = new Set();
3468
+ for (const line of patch.split(/\r?\n/)) {
3469
+ const trimmed = line.trim();
3470
+ let kind = null;
3471
+ let parsedPath = null;
3472
+ if (trimmed.startsWith("*** Add File:")) {
3473
+ kind = "add";
3474
+ parsedPath = trimmed.replace("*** Add File:", "").trim();
3475
+ }
3476
+ else if (trimmed.startsWith("*** Delete File:")) {
3477
+ kind = "delete";
3478
+ parsedPath = trimmed.replace("*** Delete File:", "").trim();
3479
+ }
3480
+ else if (trimmed.startsWith("*** Update File:")) {
3481
+ kind = "update";
3482
+ parsedPath = trimmed.replace("*** Update File:", "").trim();
3483
+ }
3484
+ if (kind && parsedPath && !seen.has(`${kind}:${parsedPath}`)) {
3485
+ seen.add(`${kind}:${parsedPath}`);
3486
+ files.push({ path: parsedPath, kind });
3487
+ }
3488
+ }
3489
+ return files;
3490
+ }
3491
+ }
3492
+ function hasToolLikeBlock(block) {
3493
+ if (!block || typeof block !== "object") {
3494
+ return false;
3495
+ }
3496
+ const type = typeof block.type === "string" ? block.type.toLowerCase() : "";
3497
+ return type.includes("tool");
3498
+ }
3499
+ function readCompactionMetadata(source) {
3500
+ const sourceRecord = toObjectRecord(source);
3501
+ if (!sourceRecord) {
3502
+ return null;
3503
+ }
3504
+ const candidates = [
3505
+ sourceRecord.compact_metadata,
3506
+ sourceRecord.compactMetadata,
3507
+ sourceRecord.compactionMetadata,
3508
+ ];
3509
+ for (const candidate of candidates) {
3510
+ const metadata = toObjectRecord(candidate);
3511
+ if (!metadata) {
3512
+ continue;
3513
+ }
3514
+ const trigger = typeof metadata.trigger === "string" ? metadata.trigger : undefined;
3515
+ const preTokensRaw = metadata.preTokens ?? metadata.pre_tokens;
3516
+ const preTokens = typeof preTokensRaw === "number" ? preTokensRaw : undefined;
3517
+ return { trigger, preTokens };
3518
+ }
3519
+ return null;
3520
+ }
3521
+ function normalizeHistoryBlocks(content) {
3522
+ if (Array.isArray(content)) {
3523
+ const blocks = content.filter((entry) => isClaudeContentChunk(entry));
3524
+ return blocks.length > 0 ? blocks : null;
3525
+ }
3526
+ if (isClaudeContentChunk(content)) {
3527
+ return [content];
3528
+ }
3529
+ return null;
3530
+ }
3531
+ function convertClaudeHistoryEntryPreamble(entry) {
3532
+ if (entry.type === "system" && entry.subtype === "compact_boundary") {
3533
+ const compactMetadata = readCompactionMetadata(entry);
3534
+ return {
3535
+ shortCircuit: [
3536
+ {
3537
+ type: "compaction",
3538
+ status: "completed",
3539
+ trigger: compactMetadata?.trigger === "manual" ? "manual" : "auto",
3540
+ preTokens: compactMetadata?.preTokens,
3541
+ },
3542
+ ],
3543
+ };
3544
+ }
3545
+ const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(entry);
3546
+ if (taskNotificationItem) {
3547
+ return { shortCircuit: [taskNotificationItem] };
3548
+ }
3549
+ if (entry.isCompactSummary) {
3550
+ return { shortCircuit: [] };
3551
+ }
3552
+ if (entry.type === "user" && isSyntheticUserEntry(entry)) {
3553
+ return { shortCircuit: [] };
3554
+ }
3555
+ const message = entry?.message;
3556
+ if (!message || !("content" in message)) {
3557
+ return { shortCircuit: [] };
3558
+ }
3559
+ const content = message.content;
3560
+ if ((entry.type === "user" || entry.type === "assistant") &&
3561
+ isClaudeTranscriptNoiseContent(content)) {
3562
+ return { shortCircuit: [] };
3563
+ }
3564
+ return { proceed: { content } };
3565
+ }
3566
+ export function convertClaudeHistoryEntry(entry, mapBlocks) {
3567
+ const preamble = convertClaudeHistoryEntryPreamble(entry);
3568
+ if ("shortCircuit" in preamble) {
3569
+ return preamble.shortCircuit;
3570
+ }
3571
+ const { content } = preamble.proceed;
3572
+ const normalizedBlocks = normalizeHistoryBlocks(content);
3573
+ const contentValue = typeof content === "string" ? content : normalizedBlocks;
3574
+ const hasToolBlock = normalizedBlocks?.some((block) => hasToolLikeBlock(block)) ?? false;
3575
+ const userMessageId = entry.type === "user" && typeof entry.uuid === "string" && entry.uuid.length > 0
3576
+ ? entry.uuid
3577
+ : null;
3578
+ if (entry.type === "user") {
3579
+ const userTaskNotificationItem = mapTaskNotificationUserContentToToolCall({
3580
+ content,
3581
+ messageId: userMessageId,
3582
+ });
3583
+ if (userTaskNotificationItem) {
3584
+ return [userTaskNotificationItem];
3585
+ }
3586
+ }
3587
+ const timeline = [];
3588
+ if (entry.type === "user") {
3589
+ const text = extractUserMessageText(content);
3590
+ if (text) {
3591
+ timeline.push({
3592
+ type: "user_message",
3593
+ text,
3594
+ ...(userMessageId ? { messageId: userMessageId } : {}),
3595
+ });
3596
+ }
3597
+ }
3598
+ if (hasToolBlock && normalizedBlocks) {
3599
+ const mapped = mapBlocks(normalizedBlocks);
3600
+ if (entry.type === "user") {
3601
+ const toolItems = mapped.filter((item) => item.type === "tool_call");
3602
+ return timeline.length ? [...timeline, ...toolItems] : toolItems;
3603
+ }
3604
+ return mapped;
3605
+ }
3606
+ if (entry.type === "assistant" && contentValue) {
3607
+ return mapBlocks(contentValue);
3608
+ }
3609
+ return timeline;
3610
+ }
3611
+ function createAsyncMessageInput() {
3612
+ const queue = [];
3613
+ const resolvers = [];
3614
+ let closed = false;
3615
+ return {
3616
+ push(item) {
3617
+ if (closed) {
3618
+ return;
3619
+ }
3620
+ const resolve = resolvers.shift();
3621
+ if (resolve) {
3622
+ resolve({ value: item, done: false });
3623
+ return;
3624
+ }
3625
+ queue.push(item);
3626
+ },
3627
+ end() {
3628
+ closed = true;
3629
+ while (resolvers.length > 0) {
3630
+ const resolve = resolvers.shift();
3631
+ resolve?.({ value: undefined, done: true });
3632
+ }
3633
+ },
3634
+ iterable: {
3635
+ [Symbol.asyncIterator]() {
3636
+ return {
3637
+ next: () => {
3638
+ if (queue.length > 0) {
3639
+ const value = queue.shift();
3640
+ if (value !== undefined) {
3641
+ return Promise.resolve({ value, done: false });
3642
+ }
3643
+ }
3644
+ if (closed) {
3645
+ return Promise.resolve({ value: undefined, done: true });
3646
+ }
3647
+ return new Promise((resolve) => {
3648
+ resolvers.push(resolve);
3649
+ });
3650
+ },
3651
+ };
3652
+ },
3653
+ },
3654
+ };
3655
+ }
3656
+ async function pathExists(target) {
3657
+ try {
3658
+ await fsPromises.access(target);
3659
+ return true;
3660
+ }
3661
+ catch {
3662
+ return false;
3663
+ }
3664
+ }
3665
+ async function collectRecentClaudeSessions(root, limit) {
3666
+ let projectDirs;
3667
+ try {
3668
+ projectDirs = await fsPromises.readdir(root);
3669
+ }
3670
+ catch {
3671
+ return [];
3672
+ }
3673
+ const projectFileLists = await Promise.all(projectDirs.map(async (dirName) => {
3674
+ const projectPath = path.join(root, dirName);
3675
+ try {
3676
+ const stats = await fsPromises.stat(projectPath);
3677
+ if (!stats.isDirectory())
3678
+ return { projectPath, files: [] };
3679
+ const files = await fsPromises.readdir(projectPath);
3680
+ return { projectPath, files };
3681
+ }
3682
+ catch {
3683
+ return { projectPath, files: [] };
3684
+ }
3685
+ }));
3686
+ const fileEntries = projectFileLists.flatMap(({ projectPath, files }) => files.filter((f) => f.endsWith(".jsonl")).map((f) => path.join(projectPath, f)));
3687
+ const statResults = await Promise.all(fileEntries.map(async (fullPath) => {
3688
+ try {
3689
+ const fileStats = await fsPromises.stat(fullPath);
3690
+ return { path: fullPath, mtime: fileStats.mtime };
3691
+ }
3692
+ catch {
3693
+ return null;
3694
+ }
3695
+ }));
3696
+ const candidates = statResults.filter((entry) => entry !== null);
3697
+ return candidates.sort((a, b) => b.mtime.getTime() - a.mtime.getTime()).slice(0, limit);
3698
+ }
3699
+ function isFinishedAccumulator(acc) {
3700
+ return Boolean(acc.sessionId && acc.cwd && acc.title);
3701
+ }
3702
+ function applyClaudeSessionEntryToAccumulator(entryRaw, acc) {
3703
+ const entry = toObjectRecord(entryRaw);
3704
+ if (!entry) {
3705
+ return;
3706
+ }
3707
+ if (entry.isSidechain) {
3708
+ return;
3709
+ }
3710
+ if (entry.type === "user" && isSyntheticUserEntry(entry)) {
3711
+ return;
3712
+ }
3713
+ if (!acc.sessionId && typeof entry.sessionId === "string") {
3714
+ acc.sessionId = entry.sessionId;
3715
+ }
3716
+ if (!acc.cwd && typeof entry.cwd === "string") {
3717
+ acc.cwd = entry.cwd;
3718
+ }
3719
+ if (entry.type === "user" && entry.message) {
3720
+ const text = extractClaudeUserText(entry.message);
3721
+ if (text) {
3722
+ if (!acc.title) {
3723
+ acc.title = text;
3724
+ }
3725
+ acc.timeline.push({ type: "user_message", text });
3726
+ }
3727
+ return;
3728
+ }
3729
+ if (entry.type === "assistant" && entry.message) {
3730
+ const text = extractClaudeUserText(entry.message);
3731
+ if (text) {
3732
+ acc.timeline.push({ type: "assistant_message", text });
3733
+ }
3734
+ }
3735
+ }
3736
+ async function parseClaudeSessionDescriptor(filePath, mtime) {
3737
+ let content;
3738
+ try {
3739
+ content = await fsPromises.readFile(filePath, "utf8");
3740
+ }
3741
+ catch {
3742
+ return null;
3743
+ }
3744
+ const acc = {
3745
+ sessionId: null,
3746
+ cwd: null,
3747
+ title: null,
3748
+ timeline: [],
3749
+ };
3750
+ for (const rawLine of content.split(/\r?\n/)) {
3751
+ const line = rawLine.trim();
3752
+ if (!line)
3753
+ continue;
3754
+ let entry;
3755
+ try {
3756
+ entry = JSON.parse(line);
3757
+ }
3758
+ catch {
3759
+ continue;
3760
+ }
3761
+ applyClaudeSessionEntryToAccumulator(entry, acc);
3762
+ if (isFinishedAccumulator(acc)) {
3763
+ break;
3764
+ }
3765
+ }
3766
+ const { sessionId, cwd, title, timeline } = acc;
3767
+ if (!sessionId || !cwd) {
3768
+ return null;
3769
+ }
3770
+ const persistence = {
3771
+ provider: "claude",
3772
+ sessionId,
3773
+ nativeHandle: sessionId,
3774
+ metadata: {
3775
+ provider: "claude",
3776
+ cwd,
3777
+ },
3778
+ };
3779
+ return {
3780
+ provider: "claude",
3781
+ sessionId,
3782
+ cwd,
3783
+ title: (title ?? "").trim() || `Claude session ${sessionId.slice(0, 8)}`,
3784
+ lastActivityAt: mtime,
3785
+ persistence,
3786
+ timeline,
3787
+ };
3788
+ }
3789
+ function extractClaudeUserText(messageRaw) {
3790
+ const message = toObjectRecord(messageRaw);
3791
+ if (!message) {
3792
+ return null;
3793
+ }
3794
+ if (typeof message.content === "string") {
3795
+ const normalized = message.content.trim();
3796
+ return normalized && !isClaudeTranscriptNoiseText(normalized) ? normalized : null;
3797
+ }
3798
+ if (typeof message.text === "string") {
3799
+ const normalized = message.text.trim();
3800
+ return normalized && !isClaudeTranscriptNoiseText(normalized) ? normalized : null;
3801
+ }
3802
+ if (isUnknownArray(message.content)) {
3803
+ for (const block of message.content) {
3804
+ const blockRecord = toObjectRecord(block);
3805
+ if (blockRecord && typeof blockRecord.text === "string") {
3806
+ const normalized = blockRecord.text.trim();
3807
+ if (normalized && !isClaudeTranscriptNoiseText(normalized)) {
3808
+ return normalized;
3809
+ }
3810
+ }
3811
+ }
3812
+ }
3813
+ return null;
3814
+ }
3815
+ //# sourceMappingURL=agent.js.map