@getpaseo/server 0.1.62 → 0.1.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. package/README.md +4 -0
  2. package/dist/server/client/daemon-client-runtime-metrics.d.ts +6 -6
  3. package/dist/server/client/daemon-client-runtime-metrics.d.ts.map +1 -1
  4. package/dist/server/client/daemon-client-transport-types.d.ts +15 -13
  5. package/dist/server/client/daemon-client-transport-types.d.ts.map +1 -1
  6. package/dist/server/client/daemon-client-websocket-transport.d.ts +3 -2
  7. package/dist/server/client/daemon-client-websocket-transport.d.ts.map +1 -1
  8. package/dist/server/client/daemon-client-websocket-transport.js +9 -8
  9. package/dist/server/client/daemon-client-websocket-transport.js.map +1 -1
  10. package/dist/server/client/daemon-client.d.ts +88 -56
  11. package/dist/server/client/daemon-client.d.ts.map +1 -1
  12. package/dist/server/client/daemon-client.js +264 -111
  13. package/dist/server/client/daemon-client.js.map +1 -1
  14. package/dist/server/client/terminal-stream-router.d.ts +24 -0
  15. package/dist/server/client/terminal-stream-router.d.ts.map +1 -0
  16. package/dist/server/client/terminal-stream-router.js +100 -0
  17. package/dist/server/client/terminal-stream-router.js.map +1 -0
  18. package/dist/server/server/agent/activity-curator.d.ts +6 -3
  19. package/dist/server/server/agent/activity-curator.d.ts.map +1 -1
  20. package/dist/server/server/agent/activity-curator.js +45 -138
  21. package/dist/server/server/agent/activity-curator.js.map +1 -1
  22. package/dist/server/server/agent/agent-loading.d.ts.map +1 -1
  23. package/dist/server/server/agent/agent-loading.js +5 -3
  24. package/dist/server/server/agent/agent-loading.js.map +1 -1
  25. package/dist/server/server/agent/agent-manager.d.ts +46 -31
  26. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  27. package/dist/server/server/agent/agent-manager.js +457 -419
  28. package/dist/server/server/agent/agent-manager.js.map +1 -1
  29. package/dist/server/server/agent/agent-metadata-generator.d.ts +6 -11
  30. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
  31. package/dist/server/server/agent/agent-metadata-generator.js +3 -85
  32. package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
  33. package/dist/server/server/agent/agent-projections.d.ts +4 -6
  34. package/dist/server/server/agent/agent-projections.d.ts.map +1 -1
  35. package/dist/server/server/agent/agent-projections.js +59 -65
  36. package/dist/server/server/agent/agent-projections.js.map +1 -1
  37. package/dist/server/server/agent/agent-response-loop.d.ts +4 -4
  38. package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
  39. package/dist/server/server/agent/agent-response-loop.js +58 -45
  40. package/dist/server/server/agent/agent-response-loop.js.map +1 -1
  41. package/dist/server/server/agent/agent-sdk-types.d.ts +58 -41
  42. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  43. package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
  44. package/dist/server/server/agent/agent-storage.d.ts +2 -2
  45. package/dist/server/server/agent/agent-storage.d.ts.map +1 -1
  46. package/dist/server/server/agent/agent-storage.js +29 -36
  47. package/dist/server/server/agent/agent-storage.js.map +1 -1
  48. package/dist/server/server/agent/agent-stream-coalescer.d.ts +7 -7
  49. package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -1
  50. package/dist/server/server/agent/agent-stream-coalescer.js +1 -1
  51. package/dist/server/server/agent/agent-stream-coalescer.js.map +1 -1
  52. package/dist/server/server/agent/agent-timeline-store-types.d.ts +10 -10
  53. package/dist/server/server/agent/agent-timeline-store-types.d.ts.map +1 -1
  54. package/dist/server/server/agent/agent-timeline-store.d.ts +2 -2
  55. package/dist/server/server/agent/agent-timeline-store.d.ts.map +1 -1
  56. package/dist/server/server/agent/agent-timeline-store.js +103 -85
  57. package/dist/server/server/agent/agent-timeline-store.js.map +1 -1
  58. package/dist/server/server/agent/foreground-run-state.d.ts +50 -0
  59. package/dist/server/server/agent/foreground-run-state.d.ts.map +1 -0
  60. package/dist/server/server/agent/foreground-run-state.js +162 -0
  61. package/dist/server/server/agent/foreground-run-state.js.map +1 -0
  62. package/dist/server/server/agent/mcp-server.d.ts +5 -3
  63. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  64. package/dist/server/server/agent/mcp-server.js +282 -234
  65. package/dist/server/server/agent/mcp-server.js.map +1 -1
  66. package/dist/server/server/agent/mcp-shared.d.ts +9 -2
  67. package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
  68. package/dist/server/server/agent/mcp-shared.js +9 -1
  69. package/dist/server/server/agent/mcp-shared.js.map +1 -1
  70. package/dist/server/server/agent/model-resolver.d.ts +2 -2
  71. package/dist/server/server/agent/model-resolver.d.ts.map +1 -1
  72. package/dist/server/server/agent/model-resolver.js +9 -5
  73. package/dist/server/server/agent/model-resolver.js.map +1 -1
  74. package/dist/server/server/agent/prompt-attachments.d.ts +4 -3
  75. package/dist/server/server/agent/prompt-attachments.d.ts.map +1 -1
  76. package/dist/server/server/agent/prompt-attachments.js +43 -4
  77. package/dist/server/server/agent/prompt-attachments.js.map +1 -1
  78. package/dist/server/server/agent/provider-launch-config.d.ts +28 -17
  79. package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
  80. package/dist/server/server/agent/provider-launch-config.js +20 -9
  81. package/dist/server/server/agent/provider-launch-config.js.map +1 -1
  82. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
  83. package/dist/server/server/agent/provider-manifest.js +7 -0
  84. package/dist/server/server/agent/provider-manifest.js.map +1 -1
  85. package/dist/server/server/agent/provider-registry.d.ts +4 -2
  86. package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
  87. package/dist/server/server/agent/provider-registry.js +24 -21
  88. package/dist/server/server/agent/provider-registry.js.map +1 -1
  89. package/dist/server/server/agent/provider-snapshot-manager.d.ts +6 -5
  90. package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -1
  91. package/dist/server/server/agent/provider-snapshot-manager.js +40 -31
  92. package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
  93. package/dist/server/server/agent/providers/acp-agent.d.ts +49 -13
  94. package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
  95. package/dist/server/server/agent/providers/acp-agent.js +404 -261
  96. package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
  97. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +2 -0
  98. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts.map +1 -1
  99. package/dist/server/server/agent/providers/claude/sidechain-tracker.js +47 -45
  100. package/dist/server/server/agent/providers/claude/sidechain-tracker.js.map +1 -1
  101. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +2 -2
  102. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -1
  103. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +10 -5
  104. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -1
  105. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -1
  106. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +11 -2
  107. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
  108. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +2 -2
  109. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -1
  110. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +83 -206
  111. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
  112. package/dist/server/server/agent/providers/claude-agent.d.ts +20 -8
  113. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  114. package/dist/server/server/agent/providers/claude-agent.js +654 -554
  115. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  116. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +2 -2
  117. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts.map +1 -1
  118. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +2 -2
  119. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
  120. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +174 -185
  121. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
  122. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +62 -13
  123. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  124. package/dist/server/server/agent/providers/codex-app-server-agent.js +873 -646
  125. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  126. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts +2 -2
  127. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -1
  128. package/dist/server/server/agent/providers/codex-rollout-timeline.js +58 -47
  129. package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -1
  130. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +2 -2
  131. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +1 -1
  132. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +3 -3
  133. package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -1
  134. package/dist/server/server/agent/providers/diagnostic-utils.js +82 -9
  135. package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -1
  136. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +2 -2
  137. package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -1
  138. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +6 -2
  139. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -1
  140. package/dist/server/server/agent/providers/mock-load-test-agent.js +294 -113
  141. package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -1
  142. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +1 -1
  143. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts.map +1 -1
  144. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +94 -2
  145. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js.map +1 -1
  146. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +2 -2
  147. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +1 -1
  148. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +24 -115
  149. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +1 -1
  150. package/dist/server/server/agent/providers/opencode-agent.d.ts +104 -3
  151. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  152. package/dist/server/server/agent/providers/opencode-agent.js +786 -503
  153. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  154. package/dist/server/server/agent/providers/pi-direct-agent.d.ts +1 -0
  155. package/dist/server/server/agent/providers/pi-direct-agent.d.ts.map +1 -1
  156. package/dist/server/server/agent/providers/pi-direct-agent.js +109 -140
  157. package/dist/server/server/agent/providers/pi-direct-agent.js.map +1 -1
  158. package/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
  159. package/dist/server/server/agent/providers/provider-runner.d.ts.map +1 -0
  160. package/dist/server/server/agent/providers/provider-runner.js +80 -0
  161. package/dist/server/server/agent/providers/provider-runner.js.map +1 -0
  162. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -1
  163. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +3 -1
  164. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -1
  165. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +9 -6
  166. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  167. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +102 -73
  168. package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -1
  169. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +4 -2
  170. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -1
  171. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +31 -0
  172. package/dist/server/server/agent/providers/tool-call-mapper-utils.js.map +1 -1
  173. package/dist/server/server/agent/stt-manager.d.ts.map +1 -1
  174. package/dist/server/server/agent/stt-manager.js +63 -53
  175. package/dist/server/server/agent/stt-manager.js.map +1 -1
  176. package/dist/server/server/agent/timeline-projection.d.ts +27 -11
  177. package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
  178. package/dist/server/server/agent/timeline-projection.js +70 -15
  179. package/dist/server/server/agent/timeline-projection.js.map +1 -1
  180. package/dist/server/server/agent/tts-manager.d.ts.map +1 -1
  181. package/dist/server/server/agent/tts-manager.js +1 -0
  182. package/dist/server/server/agent/tts-manager.js.map +1 -1
  183. package/dist/server/server/agent-attention-policy.d.ts +2 -2
  184. package/dist/server/server/agent-attention-policy.d.ts.map +1 -1
  185. package/dist/server/server/auth.d.ts +25 -0
  186. package/dist/server/server/auth.d.ts.map +1 -0
  187. package/dist/server/server/auth.js +93 -0
  188. package/dist/server/server/auth.js.map +1 -0
  189. package/dist/server/server/bootstrap.d.ts +7 -5
  190. package/dist/server/server/bootstrap.d.ts.map +1 -1
  191. package/dist/server/server/bootstrap.js +550 -485
  192. package/dist/server/server/bootstrap.js.map +1 -1
  193. package/dist/server/server/chat/chat-service.d.ts +1 -1
  194. package/dist/server/server/chat/chat-service.d.ts.map +1 -1
  195. package/dist/server/server/chat/chat-service.js +3 -3
  196. package/dist/server/server/chat/chat-service.js.map +1 -1
  197. package/dist/server/server/checkout-diff-manager.d.ts +2 -2
  198. package/dist/server/server/checkout-diff-manager.d.ts.map +1 -1
  199. package/dist/server/server/checkout-git-utils.d.ts +5 -3
  200. package/dist/server/server/checkout-git-utils.d.ts.map +1 -1
  201. package/dist/server/server/checkout-git-utils.js +1 -2
  202. package/dist/server/server/checkout-git-utils.js.map +1 -1
  203. package/dist/server/server/config.d.ts.map +1 -1
  204. package/dist/server/server/config.js +79 -39
  205. package/dist/server/server/config.js.map +1 -1
  206. package/dist/server/server/connection-offer.d.ts +2 -2
  207. package/dist/server/server/connection-offer.d.ts.map +1 -1
  208. package/dist/server/server/daemon-config-store.d.ts +5 -3
  209. package/dist/server/server/daemon-config-store.d.ts.map +1 -1
  210. package/dist/server/server/daemon-config-store.js +26 -0
  211. package/dist/server/server/daemon-config-store.js.map +1 -1
  212. package/dist/server/server/daemon-keypair.d.ts +2 -2
  213. package/dist/server/server/daemon-keypair.d.ts.map +1 -1
  214. package/dist/server/server/editor-targets.d.ts +4 -4
  215. package/dist/server/server/editor-targets.d.ts.map +1 -1
  216. package/dist/server/server/editor-targets.js +11 -15
  217. package/dist/server/server/editor-targets.js.map +1 -1
  218. package/dist/server/server/exports.d.ts +10 -4
  219. package/dist/server/server/exports.d.ts.map +1 -1
  220. package/dist/server/server/exports.js +7 -4
  221. package/dist/server/server/exports.js.map +1 -1
  222. package/dist/server/server/file-download/token-store.d.ts +4 -4
  223. package/dist/server/server/file-download/token-store.d.ts.map +1 -1
  224. package/dist/server/server/file-explorer/service.d.ts +10 -0
  225. package/dist/server/server/file-explorer/service.d.ts.map +1 -1
  226. package/dist/server/server/file-explorer/service.js +38 -4
  227. package/dist/server/server/file-explorer/service.js.map +1 -1
  228. package/dist/server/server/index.js +25 -18
  229. package/dist/server/server/index.js.map +1 -1
  230. package/dist/server/server/logger.d.ts +4 -4
  231. package/dist/server/server/logger.d.ts.map +1 -1
  232. package/dist/server/server/logger.js +41 -21
  233. package/dist/server/server/logger.js.map +1 -1
  234. package/dist/server/server/loop/rpc-schemas.d.ts +52 -52
  235. package/dist/server/server/loop-service.d.ts +13 -12
  236. package/dist/server/server/loop-service.d.ts.map +1 -1
  237. package/dist/server/server/loop-service.js +22 -18
  238. package/dist/server/server/loop-service.js.map +1 -1
  239. package/dist/server/server/package-version.d.ts +2 -2
  240. package/dist/server/server/package-version.d.ts.map +1 -1
  241. package/dist/server/server/package-version.js +19 -17
  242. package/dist/server/server/package-version.js.map +1 -1
  243. package/dist/server/server/pagination/cursor.d.ts +16 -0
  244. package/dist/server/server/pagination/cursor.d.ts.map +1 -0
  245. package/dist/server/server/pagination/cursor.js +62 -0
  246. package/dist/server/server/pagination/cursor.js.map +1 -0
  247. package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
  248. package/dist/server/server/pagination/sortable-pager.d.ts.map +1 -0
  249. package/dist/server/server/pagination/sortable-pager.js +68 -0
  250. package/dist/server/server/pagination/sortable-pager.js.map +1 -0
  251. package/dist/server/server/pairing-offer.d.ts +2 -2
  252. package/dist/server/server/pairing-offer.d.ts.map +1 -1
  253. package/dist/server/server/paseo-env.d.ts +9 -0
  254. package/dist/server/server/paseo-env.d.ts.map +1 -0
  255. package/dist/server/server/paseo-env.js +70 -0
  256. package/dist/server/server/paseo-env.js.map +1 -0
  257. package/dist/server/server/paseo-worktree-archive-service.d.ts +7 -5
  258. package/dist/server/server/paseo-worktree-archive-service.d.ts.map +1 -1
  259. package/dist/server/server/paseo-worktree-archive-service.js +70 -62
  260. package/dist/server/server/paseo-worktree-archive-service.js.map +1 -1
  261. package/dist/server/server/paseo-worktree-service.d.ts +13 -0
  262. package/dist/server/server/paseo-worktree-service.d.ts.map +1 -1
  263. package/dist/server/server/paseo-worktree-service.js +72 -3
  264. package/dist/server/server/paseo-worktree-service.js.map +1 -1
  265. package/dist/server/server/persisted-config.d.ts +87 -62
  266. package/dist/server/server/persisted-config.d.ts.map +1 -1
  267. package/dist/server/server/persisted-config.js +13 -4
  268. package/dist/server/server/persisted-config.js.map +1 -1
  269. package/dist/server/server/persistence-hooks.d.ts +8 -9
  270. package/dist/server/server/persistence-hooks.d.ts.map +1 -1
  271. package/dist/server/server/persistence-hooks.js +4 -12
  272. package/dist/server/server/persistence-hooks.js.map +1 -1
  273. package/dist/server/server/pid-lock.js.map +1 -1
  274. package/dist/server/server/push/push-service.d.ts.map +1 -1
  275. package/dist/server/server/push/push-service.js +1 -3
  276. package/dist/server/server/push/push-service.js.map +1 -1
  277. package/dist/server/server/relay-transport.d.ts +8 -8
  278. package/dist/server/server/relay-transport.d.ts.map +1 -1
  279. package/dist/server/server/relay-transport.js +43 -20
  280. package/dist/server/server/relay-transport.js.map +1 -1
  281. package/dist/server/server/resolve-worktree-creation-intent.d.ts +0 -10
  282. package/dist/server/server/resolve-worktree-creation-intent.d.ts.map +1 -1
  283. package/dist/server/server/resolve-worktree-creation-intent.js +1 -45
  284. package/dist/server/server/resolve-worktree-creation-intent.js.map +1 -1
  285. package/dist/server/server/schedule/service.d.ts.map +1 -1
  286. package/dist/server/server/schedule/service.js +2 -2
  287. package/dist/server/server/schedule/service.js.map +1 -1
  288. package/dist/server/server/script-health-monitor.d.ts.map +1 -1
  289. package/dist/server/server/script-health-monitor.js +7 -6
  290. package/dist/server/server/script-health-monitor.js.map +1 -1
  291. package/dist/server/server/script-proxy.js +1 -1
  292. package/dist/server/server/script-proxy.js.map +1 -1
  293. package/dist/server/server/script-status-projection.d.ts +10 -5
  294. package/dist/server/server/script-status-projection.d.ts.map +1 -1
  295. package/dist/server/server/script-status-projection.js +66 -47
  296. package/dist/server/server/script-status-projection.js.map +1 -1
  297. package/dist/server/server/server-id.d.ts +4 -4
  298. package/dist/server/server/server-id.d.ts.map +1 -1
  299. package/dist/server/server/session.d.ts +64 -65
  300. package/dist/server/server/session.d.ts.map +1 -1
  301. package/dist/server/server/session.js +1356 -1734
  302. package/dist/server/server/session.js.map +1 -1
  303. package/dist/server/server/speech/audio.js +1 -1
  304. package/dist/server/server/speech/audio.js.map +1 -1
  305. package/dist/server/server/speech/providers/local/config.d.ts +6 -6
  306. package/dist/server/server/speech/providers/local/config.d.ts.map +1 -1
  307. package/dist/server/server/speech/providers/local/config.js +41 -16
  308. package/dist/server/server/speech/providers/local/config.js.map +1 -1
  309. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts +2 -2
  310. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -1
  311. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +42 -19
  312. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -1
  313. package/dist/server/server/speech/providers/local/runtime.d.ts +4 -4
  314. package/dist/server/server/speech/providers/local/runtime.d.ts.map +1 -1
  315. package/dist/server/server/speech/providers/local/runtime.js +108 -77
  316. package/dist/server/server/speech/providers/local/runtime.js.map +1 -1
  317. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +2 -2
  318. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -1
  319. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +1 -4
  320. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -1
  321. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +2 -2
  322. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -1
  323. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +19 -19
  324. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -1
  325. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +28 -7
  326. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts.map +1 -1
  327. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -1
  328. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts +23 -4
  329. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts.map +1 -1
  330. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +35 -28
  331. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -1
  332. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts +5 -5
  333. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts.map +1 -1
  334. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +7 -7
  335. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +1 -1
  336. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +5 -0
  337. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -1
  338. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts.map +1 -1
  339. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +3 -1
  340. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -1
  341. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +2 -2
  342. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts.map +1 -1
  343. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +3 -1
  344. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -1
  345. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts.map +1 -1
  346. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +10 -4
  347. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -1
  348. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +2 -2
  349. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts.map +1 -1
  350. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts +2 -2
  351. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts.map +1 -1
  352. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +4 -1
  353. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -1
  354. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +2 -2
  355. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts.map +1 -1
  356. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +18 -11
  357. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -1
  358. package/dist/server/server/speech/providers/openai/config.d.ts +2 -2
  359. package/dist/server/server/speech/providers/openai/config.d.ts.map +1 -1
  360. package/dist/server/server/speech/providers/openai/config.js +58 -31
  361. package/dist/server/server/speech/providers/openai/config.js.map +1 -1
  362. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts.map +1 -1
  363. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +2 -2
  364. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js.map +1 -1
  365. package/dist/server/server/speech/providers/openai/runtime.d.ts +4 -4
  366. package/dist/server/server/speech/providers/openai/runtime.d.ts.map +1 -1
  367. package/dist/server/server/speech/providers/openai/runtime.js +37 -32
  368. package/dist/server/server/speech/providers/openai/runtime.js.map +1 -1
  369. package/dist/server/server/speech/providers/openai/stt.d.ts.map +1 -1
  370. package/dist/server/server/speech/providers/openai/stt.js +4 -3
  371. package/dist/server/server/speech/providers/openai/stt.js.map +1 -1
  372. package/dist/server/server/speech/providers/openai/tts.d.ts.map +1 -1
  373. package/dist/server/server/speech/providers/openai/tts.js +3 -2
  374. package/dist/server/server/speech/providers/openai/tts.js.map +1 -1
  375. package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -1
  376. package/dist/server/server/speech/speech-config-resolver.js +46 -17
  377. package/dist/server/server/speech/speech-config-resolver.js.map +1 -1
  378. package/dist/server/server/speech/speech-provider.d.ts +2 -2
  379. package/dist/server/server/speech/speech-provider.d.ts.map +1 -1
  380. package/dist/server/server/speech/speech-runtime.d.ts +6 -6
  381. package/dist/server/server/speech/speech-runtime.d.ts.map +1 -1
  382. package/dist/server/server/speech/speech-runtime.js +17 -17
  383. package/dist/server/server/speech/speech-runtime.js.map +1 -1
  384. package/dist/server/server/speech/speech-types.d.ts +2 -2
  385. package/dist/server/server/speech/speech-types.d.ts.map +1 -1
  386. package/dist/server/server/speech/turn-detection-provider.d.ts +2 -2
  387. package/dist/server/server/speech/turn-detection-provider.d.ts.map +1 -1
  388. package/dist/server/server/utils/diff-highlighter.d.ts +0 -3
  389. package/dist/server/server/utils/diff-highlighter.d.ts.map +1 -1
  390. package/dist/server/server/utils/diff-highlighter.js +67 -66
  391. package/dist/server/server/utils/diff-highlighter.js.map +1 -1
  392. package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -1
  393. package/dist/server/server/voice/voice-turn-controller.js +1 -0
  394. package/dist/server/server/voice/voice-turn-controller.js.map +1 -1
  395. package/dist/server/server/voice-types.d.ts +2 -2
  396. package/dist/server/server/voice-types.d.ts.map +1 -1
  397. package/dist/server/server/websocket-server.d.ts +34 -22
  398. package/dist/server/server/websocket-server.d.ts.map +1 -1
  399. package/dist/server/server/websocket-server.js +360 -205
  400. package/dist/server/server/websocket-server.js.map +1 -1
  401. package/dist/server/server/workspace-directory.d.ts +69 -0
  402. package/dist/server/server/workspace-directory.d.ts.map +1 -0
  403. package/dist/server/server/workspace-directory.js +229 -0
  404. package/dist/server/server/workspace-directory.js.map +1 -0
  405. package/dist/server/server/workspace-git-metadata.d.ts +2 -2
  406. package/dist/server/server/workspace-git-metadata.d.ts.map +1 -1
  407. package/dist/server/server/workspace-git-metadata.js +2 -32
  408. package/dist/server/server/workspace-git-metadata.js.map +1 -1
  409. package/dist/server/server/workspace-git-service.d.ts +8 -4
  410. package/dist/server/server/workspace-git-service.d.ts.map +1 -1
  411. package/dist/server/server/workspace-git-service.js +163 -115
  412. package/dist/server/server/workspace-git-service.js.map +1 -1
  413. package/dist/server/server/workspace-reconciliation-service.d.ts +5 -4
  414. package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -1
  415. package/dist/server/server/workspace-reconciliation-service.js +82 -82
  416. package/dist/server/server/workspace-reconciliation-service.js.map +1 -1
  417. package/dist/server/server/workspace-registry-bootstrap.d.ts.map +1 -1
  418. package/dist/server/server/workspace-registry-bootstrap.js +40 -33
  419. package/dist/server/server/workspace-registry-bootstrap.js.map +1 -1
  420. package/dist/server/server/workspace-registry-model.d.ts +19 -6
  421. package/dist/server/server/workspace-registry-model.d.ts.map +1 -1
  422. package/dist/server/server/workspace-registry-model.js +35 -21
  423. package/dist/server/server/workspace-registry-model.js.map +1 -1
  424. package/dist/server/server/workspace-registry.d.ts +2 -2
  425. package/dist/server/server/workspace-script-runtime-store.d.ts +2 -2
  426. package/dist/server/server/workspace-script-runtime-store.d.ts.map +1 -1
  427. package/dist/server/server/workspace-service-env.js +3 -3
  428. package/dist/server/server/workspace-service-env.js.map +1 -1
  429. package/dist/server/server/worktree-bootstrap.d.ts +4 -4
  430. package/dist/server/server/worktree-bootstrap.d.ts.map +1 -1
  431. package/dist/server/server/worktree-bootstrap.js +101 -69
  432. package/dist/server/server/worktree-bootstrap.js.map +1 -1
  433. package/dist/server/server/worktree-core.d.ts +2 -0
  434. package/dist/server/server/worktree-core.d.ts.map +1 -1
  435. package/dist/server/server/worktree-core.js.map +1 -1
  436. package/dist/server/server/worktree-errors.d.ts +1 -1
  437. package/dist/server/server/worktree-errors.d.ts.map +1 -1
  438. package/dist/server/server/worktree-errors.js +1 -4
  439. package/dist/server/server/worktree-errors.js.map +1 -1
  440. package/dist/server/server/worktree-session.d.ts +54 -27
  441. package/dist/server/server/worktree-session.d.ts.map +1 -1
  442. package/dist/server/server/worktree-session.js +95 -44
  443. package/dist/server/server/worktree-session.js.map +1 -1
  444. package/dist/server/services/github-service.d.ts +1 -7
  445. package/dist/server/services/github-service.d.ts.map +1 -1
  446. package/dist/server/services/github-service.js +123 -143
  447. package/dist/server/services/github-service.js.map +1 -1
  448. package/dist/server/shared/agent-attention-notification.d.ts +9 -8
  449. package/dist/server/shared/agent-attention-notification.d.ts.map +1 -1
  450. package/dist/server/shared/agent-attention-notification.js +27 -17
  451. package/dist/server/shared/agent-attention-notification.js.map +1 -1
  452. package/dist/server/shared/binary-frames/file-transfer.d.ts +56 -0
  453. package/dist/server/shared/binary-frames/file-transfer.d.ts.map +1 -0
  454. package/dist/server/shared/binary-frames/file-transfer.js +108 -0
  455. package/dist/server/shared/binary-frames/file-transfer.js.map +1 -0
  456. package/dist/server/shared/binary-frames/index.d.ts +3 -0
  457. package/dist/server/shared/binary-frames/index.d.ts.map +1 -0
  458. package/dist/server/shared/binary-frames/index.js +3 -0
  459. package/dist/server/shared/binary-frames/index.js.map +1 -0
  460. package/dist/server/shared/{terminal-stream-protocol.d.ts → binary-frames/terminal.d.ts} +4 -4
  461. package/dist/server/shared/binary-frames/terminal.d.ts.map +1 -0
  462. package/dist/server/shared/{terminal-stream-protocol.js → binary-frames/terminal.js} +2 -2
  463. package/dist/server/shared/binary-frames/terminal.js.map +1 -0
  464. package/dist/server/shared/client-capabilities.d.ts +5 -0
  465. package/dist/server/shared/client-capabilities.d.ts.map +1 -0
  466. package/dist/server/shared/client-capabilities.js +4 -0
  467. package/dist/server/shared/client-capabilities.js.map +1 -0
  468. package/dist/server/shared/connection-offer.d.ts +8 -0
  469. package/dist/server/shared/connection-offer.d.ts.map +1 -1
  470. package/dist/server/shared/connection-offer.js +35 -0
  471. package/dist/server/shared/connection-offer.js.map +1 -1
  472. package/dist/server/shared/daemon-endpoints.d.ts +18 -3
  473. package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
  474. package/dist/server/shared/daemon-endpoints.js +82 -8
  475. package/dist/server/shared/daemon-endpoints.js.map +1 -1
  476. package/dist/server/shared/host-connection-schema.d.ts +23 -0
  477. package/dist/server/shared/host-connection-schema.d.ts.map +1 -0
  478. package/dist/server/shared/host-connection-schema.js +9 -0
  479. package/dist/server/shared/host-connection-schema.js.map +1 -0
  480. package/dist/server/shared/messages.d.ts +25073 -3453
  481. package/dist/server/shared/messages.d.ts.map +1 -1
  482. package/dist/server/shared/messages.js +152 -36
  483. package/dist/server/shared/messages.js.map +1 -1
  484. package/dist/server/shared/tool-call-display.d.ts +2 -2
  485. package/dist/server/shared/tool-call-display.d.ts.map +1 -1
  486. package/dist/server/terminal/terminal-manager-factory.d.ts +7 -0
  487. package/dist/server/terminal/terminal-manager-factory.d.ts.map +1 -0
  488. package/dist/server/terminal/terminal-manager-factory.js +13 -0
  489. package/dist/server/terminal/terminal-manager-factory.js.map +1 -0
  490. package/dist/server/terminal/terminal-manager.d.ts +7 -1
  491. package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
  492. package/dist/server/terminal/terminal-manager.js +15 -4
  493. package/dist/server/terminal/terminal-manager.js.map +1 -1
  494. package/dist/server/terminal/terminal-output-coalescer.d.ts +6 -6
  495. package/dist/server/terminal/terminal-output-coalescer.d.ts.map +1 -1
  496. package/dist/server/terminal/terminal-session-controller.d.ts +63 -0
  497. package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -0
  498. package/dist/server/terminal/terminal-session-controller.js +615 -0
  499. package/dist/server/terminal/terminal-session-controller.js.map +1 -0
  500. package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
  501. package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
  502. package/dist/server/terminal/terminal-worker-process.d.ts.map +1 -0
  503. package/dist/server/terminal/terminal-worker-process.js +221 -0
  504. package/dist/server/terminal/terminal-worker-process.js.map +1 -0
  505. package/dist/server/terminal/terminal-worker-protocol.d.ts +113 -0
  506. package/dist/server/terminal/terminal-worker-protocol.d.ts.map +1 -0
  507. package/dist/server/terminal/terminal-worker-protocol.js +2 -0
  508. package/dist/server/terminal/terminal-worker-protocol.js.map +1 -0
  509. package/dist/server/terminal/terminal.d.ts +10 -2
  510. package/dist/server/terminal/terminal.d.ts.map +1 -1
  511. package/dist/server/terminal/terminal.js +79 -28
  512. package/dist/server/terminal/terminal.js.map +1 -1
  513. package/dist/server/terminal/worker-terminal-manager.d.ts +19 -0
  514. package/dist/server/terminal/worker-terminal-manager.d.ts.map +1 -0
  515. package/dist/server/terminal/worker-terminal-manager.js +466 -0
  516. package/dist/server/terminal/worker-terminal-manager.js.map +1 -0
  517. package/dist/server/utils/checkout-git.d.ts +13 -12
  518. package/dist/server/utils/checkout-git.d.ts.map +1 -1
  519. package/dist/server/utils/checkout-git.js +351 -281
  520. package/dist/server/utils/checkout-git.js.map +1 -1
  521. package/dist/server/utils/directory-suggestions.d.ts.map +1 -1
  522. package/dist/server/utils/directory-suggestions.js +22 -34
  523. package/dist/server/utils/directory-suggestions.js.map +1 -1
  524. package/dist/server/utils/executable.d.ts +1 -14
  525. package/dist/server/utils/executable.d.ts.map +1 -1
  526. package/dist/server/utils/executable.js +13 -49
  527. package/dist/server/utils/executable.js.map +1 -1
  528. package/dist/server/utils/github-remote.d.ts +13 -0
  529. package/dist/server/utils/github-remote.d.ts.map +1 -0
  530. package/dist/server/utils/github-remote.js +128 -0
  531. package/dist/server/utils/github-remote.js.map +1 -0
  532. package/dist/server/utils/paseo-config-file.d.ts +30 -0
  533. package/dist/server/utils/paseo-config-file.d.ts.map +1 -0
  534. package/dist/server/utils/paseo-config-file.js +90 -0
  535. package/dist/server/utils/paseo-config-file.js.map +1 -0
  536. package/dist/server/utils/paseo-config-schema.d.ts +290 -0
  537. package/dist/server/utils/paseo-config-schema.d.ts.map +1 -0
  538. package/dist/server/utils/paseo-config-schema.js +60 -0
  539. package/dist/server/utils/paseo-config-schema.js.map +1 -0
  540. package/dist/server/utils/process-tree.d.ts +25 -0
  541. package/dist/server/utils/process-tree.d.ts.map +1 -0
  542. package/dist/server/utils/process-tree.js +96 -0
  543. package/dist/server/utils/process-tree.js.map +1 -0
  544. package/dist/server/utils/project-icon.d.ts.map +1 -1
  545. package/dist/server/utils/project-icon.js +84 -109
  546. package/dist/server/utils/project-icon.js.map +1 -1
  547. package/dist/server/utils/promise-timeout.d.ts +2 -2
  548. package/dist/server/utils/promise-timeout.d.ts.map +1 -1
  549. package/dist/server/utils/run-git-command.d.ts +3 -1
  550. package/dist/server/utils/run-git-command.d.ts.map +1 -1
  551. package/dist/server/utils/run-git-command.js +10 -1
  552. package/dist/server/utils/run-git-command.js.map +1 -1
  553. package/dist/server/utils/script-hostname.d.ts +2 -2
  554. package/dist/server/utils/script-hostname.d.ts.map +1 -1
  555. package/dist/server/utils/spawn.d.ts +10 -3
  556. package/dist/server/utils/spawn.d.ts.map +1 -1
  557. package/dist/server/utils/spawn.js +30 -5
  558. package/dist/server/utils/spawn.js.map +1 -1
  559. package/dist/server/utils/windows-command.d.ts +15 -0
  560. package/dist/server/utils/windows-command.d.ts.map +1 -0
  561. package/dist/server/utils/windows-command.js +41 -0
  562. package/dist/server/utils/windows-command.js.map +1 -0
  563. package/dist/server/utils/worktree-metadata.d.ts +44 -0
  564. package/dist/server/utils/worktree-metadata.d.ts.map +1 -1
  565. package/dist/server/utils/worktree-metadata.js +58 -0
  566. package/dist/server/utils/worktree-metadata.js.map +1 -1
  567. package/dist/server/utils/worktree.d.ts +23 -8
  568. package/dist/server/utils/worktree.d.ts.map +1 -1
  569. package/dist/server/utils/worktree.js +81 -63
  570. package/dist/server/utils/worktree.js.map +1 -1
  571. package/dist/src/server/pid-lock.js.map +1 -1
  572. package/package.json +17 -21
  573. package/dist/server/server/agent/llm-openai.d.ts +0 -7
  574. package/dist/server/server/agent/llm-openai.d.ts.map +0 -1
  575. package/dist/server/server/agent/llm-openai.js +0 -8
  576. package/dist/server/server/agent/llm-openai.js.map +0 -1
  577. package/dist/server/server/agent/orchestrator.d.ts +0 -12
  578. package/dist/server/server/agent/orchestrator.d.ts.map +0 -1
  579. package/dist/server/server/agent/orchestrator.js +0 -12
  580. package/dist/server/server/agent/orchestrator.js.map +0 -1
  581. package/dist/server/server/types.d.ts +0 -5
  582. package/dist/server/server/types.d.ts.map +0 -1
  583. package/dist/server/server/types.js +0 -3
  584. package/dist/server/server/types.js.map +0 -1
  585. package/dist/server/server/workspace-registry.test-helpers.d.ts +0 -37
  586. package/dist/server/server/workspace-registry.test-helpers.d.ts.map +0 -1
  587. package/dist/server/server/workspace-registry.test-helpers.js +0 -121
  588. package/dist/server/server/workspace-registry.test-helpers.js.map +0 -1
  589. package/dist/server/shared/terminal-stream-protocol.d.ts.map +0 -1
  590. package/dist/server/shared/terminal-stream-protocol.js.map +0 -1
@@ -3,8 +3,9 @@ import fs from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  import { Readable, Writable } from "node:stream";
5
5
  import { ClientSideConnection, PROTOCOL_VERSION, } from "@agentclientprotocol/sdk";
6
- import { applyProviderEnv, resolveProviderCommandPrefix, } from "../provider-launch-config.js";
6
+ import { createProviderEnvSpec, resolveProviderCommandPrefix, } from "../provider-launch-config.js";
7
7
  import { renderPromptAttachmentAsText } from "../prompt-attachments.js";
8
+ import { appendOrReplaceGrowingAssistantMessage, runProviderTurn } from "./provider-runner.js";
8
9
  import { findExecutable } from "../../../utils/executable.js";
9
10
  import { spawnProcess } from "../../../utils/spawn.js";
10
11
  const DEFAULT_ACP_CAPABILITIES = {
@@ -22,11 +23,16 @@ const ACP_CLIENT_CAPABILITIES = {
22
23
  },
23
24
  terminal: true,
24
25
  };
25
- const COPILOT_AUTOPILOT_MODE = "https://agentclientprotocol.com/protocol/session-modes#autopilot";
26
26
  // Suppress interactive auth side-effects (e.g. Gemini CLI opening a Google
27
27
  // sign-in URL in the browser) when probing an ACP agent for models/modes.
28
28
  // NO_BROWSER is honored by Gemini CLI; other ACP agents ignore it.
29
29
  const PROBE_ENV = { NO_BROWSER: "true" };
30
+ function summarizeMalformedACPStdoutError(error) {
31
+ return {
32
+ type: error instanceof Error ? error.name : typeof error,
33
+ message: "ACP stdout line was not valid JSON",
34
+ };
35
+ }
30
36
  export function createLoggedNdJsonStream(output, input, options) {
31
37
  const textEncoder = new TextEncoder();
32
38
  const textDecoder = new TextDecoder();
@@ -57,9 +63,8 @@ export function createLoggedNdJsonStream(output, input, options) {
57
63
  }
58
64
  catch (error) {
59
65
  options.logger.warn({
60
- err: error,
66
+ err: summarizeMalformedACPStdoutError(error),
61
67
  provider: options.provider,
62
- linePreview: trimmedLine.length > 500 ? `${trimmedLine.slice(0, 500)}...` : trimmedLine,
63
68
  }, "ACP agent emitted non-JSON stdout; ignoring line");
64
69
  }
65
70
  }
@@ -94,6 +99,24 @@ export function mapACPUsage(usage) {
94
99
  cachedInputTokens: usage.cachedReadTokens ?? undefined,
95
100
  };
96
101
  }
102
+ export function resolveACPModeSelection({ modeId, availableModes, configOptions, }) {
103
+ const configOption = findSelectConfigOption({ configOptions, category: "mode" });
104
+ return {
105
+ availableMode: availableModes.find((mode) => mode.id === modeId) ?? null,
106
+ configOption,
107
+ configChoice: findSelectConfigChoice({ option: configOption, value: modeId }),
108
+ hasAvailableModes: availableModes.length > 0,
109
+ };
110
+ }
111
+ export function resolveACPModelSelection({ modelId, availableModels, configOptions, }) {
112
+ const configOption = findSelectConfigOption({ configOptions, category: "model" });
113
+ return {
114
+ availableModel: availableModels?.find((model) => model.modelId === modelId) ?? null,
115
+ configOption,
116
+ configChoice: findSelectConfigChoice({ option: configOption, value: modelId }),
117
+ hasAvailableModels: Boolean(availableModels?.length),
118
+ };
119
+ }
97
120
  export function deriveModesFromACP(fallbackModes, modeState, configOptions) {
98
121
  if (modeState?.availableModes?.length) {
99
122
  return {
@@ -105,8 +128,8 @@ export function deriveModesFromACP(fallbackModes, modeState, configOptions) {
105
128
  currentModeId: modeState.currentModeId ?? null,
106
129
  };
107
130
  }
108
- const modeOption = configOptions?.find((option) => option.type === "select" && option.category === "mode");
109
- if (modeOption?.type === "select") {
131
+ const modeOption = findSelectConfigOption({ configOptions, category: "mode" });
132
+ if (modeOption) {
110
133
  const flatOptions = flattenSelectOptions(modeOption.options);
111
134
  return {
112
135
  modes: flatOptions.map((option) => ({
@@ -257,10 +280,8 @@ export class ACPAgentClient {
257
280
  }
258
281
  const sessions = [];
259
282
  let cursor;
260
- do {
261
- const page = await probe.connection.listSessions({
262
- ...(cursor ? { cursor } : {}),
263
- });
283
+ for (;;) {
284
+ const page = await probe.connection.listSessions(cursor ? { cursor } : {});
264
285
  for (const session of page.sessions) {
265
286
  sessions.push({
266
287
  provider: this.provider,
@@ -282,7 +303,11 @@ export class ACPAgentClient {
282
303
  });
283
304
  }
284
305
  cursor = page.nextCursor ?? null;
285
- } while (cursor && (!options?.limit || sessions.length < options.limit));
306
+ if (!cursor)
307
+ break;
308
+ if (options?.limit && sessions.length >= options.limit)
309
+ break;
310
+ }
286
311
  return typeof options?.limit === "number" ? sessions.slice(0, options.limit) : sessions;
287
312
  }
288
313
  finally {
@@ -302,10 +327,10 @@ export class ACPAgentClient {
302
327
  const { command, args } = await this.resolveLaunchCommand();
303
328
  const child = spawnProcess(command, args, {
304
329
  cwd: process.cwd(),
305
- env: {
306
- ...applyProviderEnv(process.env, this.runtimeSettings),
307
- ...(launchEnv ?? {}),
308
- },
330
+ ...createProviderEnvSpec({
331
+ runtimeSettings: this.runtimeSettings,
332
+ overlays: [launchEnv],
333
+ }),
309
334
  stdio: ["pipe", "pipe", "pipe"],
310
335
  });
311
336
  const stderrChunks = [];
@@ -399,8 +424,8 @@ export class ACPAgentSession {
399
424
  this.agentCapabilities = null;
400
425
  this.sessionId = null;
401
426
  this.currentMode = null;
402
- this.availableModels = [];
403
427
  this.currentModel = null;
428
+ this.availableModels = null;
404
429
  this.thinkingOptionId = null;
405
430
  this.currentTitle = null;
406
431
  this.lastActivityAt = null;
@@ -490,79 +515,18 @@ export class ACPAgentSession {
490
515
  await this.applyConfiguredOverrides();
491
516
  }
492
517
  async run(prompt, options) {
493
- const timeline = [];
494
- let finalText = "";
495
- let usage;
496
- let turnId = null;
497
- let settled = false;
498
- let resolveCompletion;
499
- let rejectCompletion;
500
- const buffered = [];
501
- const completion = new Promise((resolve, reject) => {
502
- resolveCompletion = resolve;
503
- rejectCompletion = reject;
504
- });
505
- const processEvent = (event) => {
506
- if (settled) {
507
- return;
508
- }
509
- if (turnId && "turnId" in event && event.turnId && event.turnId !== turnId) {
510
- return;
511
- }
512
- if (event.type === "timeline") {
513
- timeline.push(event.item);
514
- if (event.item.type === "assistant_message") {
515
- finalText = event.item.text.startsWith(finalText)
516
- ? event.item.text
517
- : `${finalText}${event.item.text}`;
518
- }
519
- return;
520
- }
521
- if (event.type === "turn_completed") {
522
- usage = event.usage;
523
- settled = true;
524
- resolveCompletion();
525
- return;
526
- }
527
- if (event.type === "turn_failed") {
528
- settled = true;
529
- rejectCompletion(new Error(event.error));
530
- return;
531
- }
532
- if (event.type === "turn_canceled") {
533
- settled = true;
534
- resolveCompletion();
535
- }
536
- };
537
- const unsubscribe = this.subscribe((event) => {
538
- if (!turnId) {
539
- buffered.push(event);
540
- return;
541
- }
542
- processEvent(event);
518
+ const result = await runProviderTurn({
519
+ prompt,
520
+ runOptions: options,
521
+ startTurn: (p, o) => this.startTurn(p, o),
522
+ subscribe: (callback) => this.subscribe(callback),
523
+ getSessionId: () => this.sessionId ?? "",
524
+ reduceFinalText: appendOrReplaceGrowingAssistantMessage,
543
525
  });
544
- try {
545
- const started = await this.startTurn(prompt, options);
546
- turnId = started.turnId;
547
- for (const event of buffered) {
548
- processEvent(event);
549
- }
550
- if (!settled) {
551
- await completion;
552
- }
553
- }
554
- finally {
555
- unsubscribe();
556
- }
557
526
  if (!this.sessionId) {
558
527
  throw new Error("ACP session did not expose a session id");
559
528
  }
560
- return {
561
- sessionId: this.sessionId,
562
- finalText,
563
- usage,
564
- timeline,
565
- };
529
+ return result;
566
530
  }
567
531
  async startTurn(prompt, _options) {
568
532
  if (this.closed) {
@@ -589,6 +553,7 @@ export class ACPAgentSession {
589
553
  })
590
554
  .then((response) => {
591
555
  this.handlePromptResponse(response, turnId);
556
+ return;
592
557
  })
593
558
  .catch((error) => {
594
559
  const message = error instanceof Error ? error.message : String(error);
@@ -627,17 +592,7 @@ export class ACPAgentSession {
627
592
  }
628
593
  }
629
594
  async getRuntimeInfo() {
630
- return {
631
- provider: this.provider,
632
- sessionId: this.sessionId,
633
- model: this.currentModel,
634
- thinkingOptionId: this.thinkingOptionId,
635
- modeId: this.currentMode,
636
- extra: {
637
- title: this.currentTitle,
638
- updatedAt: this.lastActivityAt,
639
- },
640
- };
595
+ return this.runtimeInfo();
641
596
  }
642
597
  async getAvailableModes() {
643
598
  return [...this.availableModes];
@@ -699,25 +654,64 @@ export class ACPAgentSession {
699
654
  if (!this.connection || !this.sessionId) {
700
655
  throw new Error("ACP session not initialized");
701
656
  }
702
- const modeExists = this.availableModes.some((mode) => mode.id === modeId);
703
- if (!modeExists && this.availableModes.length > 0) {
704
- throw new Error(`Unknown ${this.provider} mode '${modeId}'`);
657
+ const selection = resolveACPModeSelection({
658
+ modeId,
659
+ availableModes: this.availableModes,
660
+ configOptions: this.configOptions,
661
+ });
662
+ await this.setModeWithSelection({ modeId, selection });
663
+ }
664
+ // Mode/model selection updates stay after ACP RPC success; this intentionally diverges from Zed's optimistic rollback path (acp.rs:3080-3104).
665
+ async setModeWithSelection({ modeId, selection, }) {
666
+ if (!this.connection || !this.sessionId) {
667
+ throw new Error("ACP session not initialized");
705
668
  }
706
- if (this.availableModes.length > 0) {
669
+ if (selection.hasAvailableModes) {
670
+ if (!selection.availableMode) {
671
+ this.warnInvalidSelection(modeId, `is not valid ${this.provider} mode. Available options: ${this.availableModes
672
+ .map((mode) => mode.id)
673
+ .join(", ")}`);
674
+ return;
675
+ }
707
676
  await this.connection.setSessionMode({ sessionId: this.sessionId, modeId });
708
677
  this.currentMode = modeId;
678
+ this.pushEvent({
679
+ type: "mode_changed",
680
+ provider: this.provider,
681
+ currentModeId: this.currentMode,
682
+ availableModes: [...this.availableModes],
683
+ });
709
684
  return;
710
685
  }
711
- const modeOption = this.getSelectConfigOption("mode");
686
+ const modeOption = selection.configOption;
712
687
  if (!modeOption) {
713
688
  throw new Error(`${this.provider} does not expose ACP mode switching`);
714
689
  }
715
- await this.connection.setSessionConfigOption({
690
+ if (!selection.configChoice) {
691
+ this.warnInvalidSelection(modeId, `is not valid ${this.provider} mode config option. Available options: ${flattenSelectOptions(modeOption.options)
692
+ .map((option) => option.value)
693
+ .join(", ")}`);
694
+ return;
695
+ }
696
+ const response = await this.connection.setSessionConfigOption({
716
697
  sessionId: this.sessionId,
717
698
  configId: modeOption.id,
718
699
  value: modeId,
719
700
  });
720
- this.currentMode = modeId;
701
+ this.currentMode = this.applyConfigOptionResponse({
702
+ response,
703
+ configId: modeOption.id,
704
+ category: "mode",
705
+ requestedValue: modeId,
706
+ label: "mode",
707
+ });
708
+ this.availableModes = deriveModesFromACP(this.defaultModes, null, this.configOptions).modes;
709
+ this.pushEvent({
710
+ type: "mode_changed",
711
+ provider: this.provider,
712
+ currentModeId: this.currentMode,
713
+ availableModes: [...this.availableModes],
714
+ });
721
715
  }
722
716
  async setModel(modelId) {
723
717
  if (!this.connection || !this.sessionId) {
@@ -727,33 +721,71 @@ export class ACPAgentSession {
727
721
  this.currentModel = null;
728
722
  return;
729
723
  }
730
- const modelExists = this.availableModels.some((model) => model.id === modelId);
731
- if (!modelExists && this.availableModels.length > 0) {
732
- throw new Error(`Unknown ${this.provider} model '${modelId}'`);
724
+ const selection = resolveACPModelSelection({
725
+ modelId,
726
+ availableModels: this.availableModels,
727
+ configOptions: this.configOptions,
728
+ });
729
+ await this.setModelWithSelection({ modelId, selection });
730
+ }
731
+ async setModelWithSelection({ modelId, selection, }) {
732
+ if (!this.connection || !this.sessionId) {
733
+ throw new Error("ACP session not initialized");
733
734
  }
734
- if ("unstable_setSessionModel" in this.connection) {
735
+ if (selection.hasAvailableModels) {
736
+ if (!selection.availableModel) {
737
+ this.warnInvalidSelection(modelId, `is not a valid ${this.provider} model. Available options: ${this.availableModels
738
+ ?.map((model) => model.modelId)
739
+ .join(", ")}`);
740
+ return;
741
+ }
742
+ if (typeof this.connection.unstable_setSessionModel !== "function") {
743
+ throw new Error(`${this.provider} does not expose ACP model selection`);
744
+ }
735
745
  try {
736
746
  await this.connection.unstable_setSessionModel({
737
747
  sessionId: this.sessionId,
738
748
  modelId,
739
749
  });
740
750
  this.currentModel = modelId;
751
+ this.pushEvent({
752
+ type: "model_changed",
753
+ provider: this.provider,
754
+ runtimeInfo: this.runtimeInfo(),
755
+ });
741
756
  return;
742
757
  }
743
758
  catch {
744
759
  // Fall through to config option path.
745
760
  }
746
761
  }
747
- const modelOption = this.getSelectConfigOption("model");
762
+ const modelOption = selection.configOption;
748
763
  if (!modelOption) {
749
764
  throw new Error(`${this.provider} does not expose ACP model selection`);
750
765
  }
751
- await this.connection.setSessionConfigOption({
766
+ if (!selection.configChoice) {
767
+ this.warnInvalidSelection(modelId, `is not a valid ${this.provider} model config option. Available options: ${flattenSelectOptions(modelOption.options)
768
+ .map((option) => option.value)
769
+ .join(", ")}`);
770
+ return;
771
+ }
772
+ const response = await this.connection.setSessionConfigOption({
752
773
  sessionId: this.sessionId,
753
774
  configId: modelOption.id,
754
775
  value: modelId,
755
776
  });
756
- this.currentModel = modelId;
777
+ this.currentModel = this.applyConfigOptionResponse({
778
+ response,
779
+ configId: modelOption.id,
780
+ category: "model",
781
+ requestedValue: modelId,
782
+ label: "model",
783
+ });
784
+ this.pushEvent({
785
+ type: "model_changed",
786
+ provider: this.provider,
787
+ runtimeInfo: this.runtimeInfo(),
788
+ });
757
789
  }
758
790
  async setThinkingOption(thinkingOptionId) {
759
791
  if (!this.connection || !this.sessionId) {
@@ -766,18 +798,50 @@ export class ACPAgentSession {
766
798
  if (this.thinkingOptionWriter) {
767
799
  await this.thinkingOptionWriter(this.connection, this.sessionId, thinkingOptionId);
768
800
  this.thinkingOptionId = thinkingOptionId;
801
+ this.pushEvent({
802
+ type: "thinking_option_changed",
803
+ provider: this.provider,
804
+ thinkingOptionId: this.thinkingOptionId,
805
+ });
769
806
  return;
770
807
  }
771
- const option = this.getSelectConfigOption("thought_level");
808
+ const option = findSelectConfigOption({
809
+ configOptions: this.configOptions,
810
+ category: "thought_level",
811
+ });
772
812
  if (!option) {
773
813
  throw new Error(`${this.provider} does not expose ACP thought-level selection`);
774
814
  }
775
- await this.connection.setSessionConfigOption({
815
+ const response = await this.connection.setSessionConfigOption({
776
816
  sessionId: this.sessionId,
777
817
  configId: option.id,
778
818
  value: thinkingOptionId,
779
819
  });
780
- this.thinkingOptionId = thinkingOptionId;
820
+ this.thinkingOptionId = this.applyConfigOptionResponse({
821
+ response,
822
+ configId: option.id,
823
+ category: "thought_level",
824
+ requestedValue: thinkingOptionId,
825
+ label: "thought-level",
826
+ });
827
+ this.pushEvent({
828
+ type: "thinking_option_changed",
829
+ provider: this.provider,
830
+ thinkingOptionId: this.thinkingOptionId,
831
+ });
832
+ }
833
+ applyConfigOptionResponse({ response, configId, category, requestedValue, label, }) {
834
+ this.configOptions = response.configOptions;
835
+ const responseOption = findSelectConfigOption({
836
+ configOptions: response.configOptions,
837
+ category,
838
+ id: configId,
839
+ });
840
+ if (responseOption?.currentValue != null) {
841
+ return responseOption.currentValue;
842
+ }
843
+ this.logger.warn({ configId, value: requestedValue }, `ACP setSessionConfigOption response did not include the requested ${label} option currentValue; using requested value`);
844
+ return requestedValue;
781
845
  }
782
846
  getPendingPermissions() {
783
847
  return Array.from(this.pendingPermissions.values(), (entry) => entry.request);
@@ -874,17 +938,7 @@ export class ACPAgentSession {
874
938
  this.activeForegroundTurnId = null;
875
939
  }
876
940
  async requestPermission(params) {
877
- if (shouldAutoApprovePermissionRequest(this.provider, this.currentMode)) {
878
- const selectedOption = selectPermissionOption(params.options, { behavior: "allow" });
879
- return selectedOption
880
- ? {
881
- outcome: {
882
- outcome: "selected",
883
- optionId: selectedOption.optionId,
884
- },
885
- }
886
- : { outcome: { outcome: "cancelled" } };
887
- }
941
+ // Match Zed acp.rs:3189-3220 — pure pass-through. Accepted UX regression: Copilot Autopilot will now prompt the user for every tool request.
888
942
  const requestId = randomUUID();
889
943
  let toolSnapshot = this.toolCalls.get(params.toolCall.toolCallId) ??
890
944
  mergeToolSnapshot(params.toolCall.toolCallId, params.toolCall);
@@ -946,10 +1000,10 @@ export class ACPAgentSession {
946
1000
  const env = Object.fromEntries((params.env ?? []).map((entry) => [entry.name, entry.value]));
947
1001
  const child = spawnProcess(params.command, params.args ?? [], {
948
1002
  cwd: params.cwd ?? this.config.cwd,
949
- env: {
950
- ...applyProviderEnv(process.env, this.runtimeSettings),
951
- ...env,
952
- },
1003
+ ...createProviderEnvSpec({
1004
+ runtimeSettings: this.runtimeSettings,
1005
+ overlays: [env],
1006
+ }),
953
1007
  stdio: ["ignore", "pipe", "pipe"],
954
1008
  });
955
1009
  let resolveExit;
@@ -1018,10 +1072,10 @@ export class ACPAgentSession {
1018
1072
  const args = [...prefix.args, ...this.defaultCommand.slice(1)];
1019
1073
  const child = spawnProcess(command, args, {
1020
1074
  cwd: this.config.cwd,
1021
- env: {
1022
- ...applyProviderEnv(process.env, this.runtimeSettings),
1023
- ...(this.launchEnv ?? {}),
1024
- },
1075
+ ...createProviderEnvSpec({
1076
+ runtimeSettings: this.runtimeSettings,
1077
+ overlays: [this.launchEnv],
1078
+ }),
1025
1079
  stdio: ["pipe", "pipe", "pipe"],
1026
1080
  });
1027
1081
  const stderrChunks = [];
@@ -1062,24 +1116,39 @@ export class ACPAgentSession {
1062
1116
  this.configOptions = transformed.configOptions ?? [];
1063
1117
  const modeInfo = deriveModesFromACP(this.defaultModes, transformed.modes, this.configOptions);
1064
1118
  this.availableModes = modeInfo.modes;
1065
- this.availableModels = this.deriveAvailableModels(transformed.models);
1066
1119
  this.currentMode = modeInfo.currentModeId ?? this.currentMode;
1120
+ this.availableModels = transformed.models?.availableModels ?? null;
1067
1121
  this.currentModel =
1068
1122
  transformed.models?.currentModelId ?? deriveCurrentConfigValue(this.configOptions, "model");
1069
1123
  this.thinkingOptionId =
1070
1124
  deriveCurrentConfigValue(this.configOptions, "thought_level") ?? this.thinkingOptionId;
1071
1125
  }
1072
1126
  async applyConfiguredOverrides() {
1073
- if (this.config.modeId && this.config.modeId !== this.currentMode) {
1074
- await this.setMode(this.config.modeId);
1075
- }
1076
- if (this.config.model && this.config.model !== this.currentModel) {
1077
- await this.setModel(this.config.model);
1127
+ const configuredModeId = this.config.modeId;
1128
+ if (configuredModeId && configuredModeId !== this.currentMode) {
1129
+ const selection = resolveACPModeSelection({
1130
+ modeId: configuredModeId,
1131
+ availableModes: this.availableModes,
1132
+ configOptions: this.configOptions,
1133
+ });
1134
+ await this.setModeWithSelection({ modeId: configuredModeId, selection });
1135
+ }
1136
+ const configuredModelId = this.config.model;
1137
+ if (configuredModelId && configuredModelId !== this.currentModel) {
1138
+ const selection = resolveACPModelSelection({
1139
+ modelId: configuredModelId,
1140
+ availableModels: this.availableModels,
1141
+ configOptions: this.configOptions,
1142
+ });
1143
+ await this.setModelWithSelection({ modelId: configuredModelId, selection });
1078
1144
  }
1079
1145
  if (this.config.thinkingOptionId && this.config.thinkingOptionId !== this.thinkingOptionId) {
1080
1146
  await this.setThinkingOption(this.config.thinkingOptionId);
1081
1147
  }
1082
1148
  }
1149
+ warnInvalidSelection(value, message) {
1150
+ this.logger.warn(value, message);
1151
+ }
1083
1152
  translateSessionUpdate(update) {
1084
1153
  switch (update.sessionUpdate) {
1085
1154
  case "user_message_chunk": {
@@ -1104,31 +1173,24 @@ export class ACPAgentSession {
1104
1173
  const item = this.createMessageTimelineItem("reasoning", update);
1105
1174
  return item ? [this.wrapTimeline(item)] : [];
1106
1175
  }
1107
- case "tool_call": {
1108
- let snapshot = mergeToolSnapshot(update.toolCallId, update);
1109
- if (this.toolSnapshotTransformer) {
1110
- snapshot = this.toolSnapshotTransformer(snapshot);
1111
- }
1112
- this.toolCalls.set(update.toolCallId, snapshot);
1113
- return [this.wrapTimeline(mapToolSnapshotToTimeline(snapshot, this.terminalEntries))];
1114
- }
1115
- case "tool_call_update": {
1116
- const previous = this.toolCalls.get(update.toolCallId);
1117
- let snapshot = mergeToolSnapshot(update.toolCallId, update, previous);
1118
- if (this.toolSnapshotTransformer) {
1119
- snapshot = this.toolSnapshotTransformer(snapshot);
1120
- }
1121
- this.toolCalls.set(update.toolCallId, snapshot);
1122
- return [this.wrapTimeline(mapToolSnapshotToTimeline(snapshot, this.terminalEntries))];
1123
- }
1176
+ case "tool_call":
1177
+ return this.handleToolCallUpdate(update.toolCallId, update, undefined);
1178
+ case "tool_call_update":
1179
+ return this.handleToolCallUpdate(update.toolCallId, update, this.toolCalls.get(update.toolCallId));
1124
1180
  case "plan":
1125
1181
  return [this.wrapTimeline(mapPlanToTimeline(update))];
1126
1182
  case "current_mode_update":
1127
1183
  this.handleCurrentModeUpdate(update);
1128
- return [];
1184
+ return [
1185
+ {
1186
+ type: "mode_changed",
1187
+ provider: this.provider,
1188
+ currentModeId: this.currentMode,
1189
+ availableModes: [...this.availableModes],
1190
+ },
1191
+ ];
1129
1192
  case "config_option_update":
1130
- this.handleConfigOptionUpdate(update);
1131
- return [];
1193
+ return this.handleConfigOptionUpdate(update);
1132
1194
  case "session_info_update":
1133
1195
  this.handleSessionInfoUpdate(update);
1134
1196
  return [];
@@ -1147,6 +1209,14 @@ export class ACPAgentSession {
1147
1209
  return [];
1148
1210
  }
1149
1211
  }
1212
+ handleToolCallUpdate(toolCallId, update, previous) {
1213
+ let snapshot = mergeToolSnapshot(toolCallId, update, previous);
1214
+ if (this.toolSnapshotTransformer) {
1215
+ snapshot = this.toolSnapshotTransformer(snapshot);
1216
+ }
1217
+ this.toolCalls.set(toolCallId, snapshot);
1218
+ return [this.wrapTimeline(mapToolSnapshotToTimeline(snapshot, this.terminalEntries))];
1219
+ }
1150
1220
  createMessageTimelineItem(type, update) {
1151
1221
  const chunkText = contentBlockToText(update.content);
1152
1222
  if (!chunkText) {
@@ -1170,16 +1240,37 @@ export class ACPAgentSession {
1170
1240
  handleConfigOptionUpdate(update) {
1171
1241
  this.configOptions = update.configOptions;
1172
1242
  const modeInfo = deriveModesFromACP(this.defaultModes, null, this.configOptions);
1243
+ const nextMode = modeInfo.currentModeId;
1244
+ const nextModel = deriveCurrentConfigValue(this.configOptions, "model");
1245
+ const nextThinkingOptionId = deriveCurrentConfigValue(this.configOptions, "thought_level");
1173
1246
  this.availableModes = modeInfo.modes;
1174
- this.availableModels = this.deriveAvailableModels(null);
1175
- this.currentMode = modeInfo.currentModeId ?? this.currentMode;
1176
- this.currentModel = deriveCurrentConfigValue(this.configOptions, "model") ?? this.currentModel;
1177
- this.thinkingOptionId =
1178
- deriveCurrentConfigValue(this.configOptions, "thought_level") ?? this.thinkingOptionId;
1179
- }
1180
- deriveAvailableModels(models) {
1181
- const availableModels = deriveModelDefinitionsFromACP(this.provider, models, this.configOptions);
1182
- return this.modelTransformer ? this.modelTransformer(availableModels) : availableModels;
1247
+ this.currentMode = nextMode ?? this.currentMode;
1248
+ this.currentModel = nextModel ?? this.currentModel;
1249
+ this.thinkingOptionId = nextThinkingOptionId ?? this.thinkingOptionId;
1250
+ const events = [];
1251
+ if (nextMode !== null) {
1252
+ events.push({
1253
+ type: "mode_changed",
1254
+ provider: this.provider,
1255
+ currentModeId: this.currentMode,
1256
+ availableModes: [...this.availableModes],
1257
+ });
1258
+ }
1259
+ if (nextModel !== null) {
1260
+ events.push({
1261
+ type: "model_changed",
1262
+ provider: this.provider,
1263
+ runtimeInfo: this.runtimeInfo(),
1264
+ });
1265
+ }
1266
+ if (nextThinkingOptionId !== null) {
1267
+ events.push({
1268
+ type: "thinking_option_changed",
1269
+ provider: this.provider,
1270
+ thinkingOptionId: this.thinkingOptionId,
1271
+ });
1272
+ }
1273
+ return events;
1183
1274
  }
1184
1275
  handleSessionInfoUpdate(update) {
1185
1276
  if ("title" in update) {
@@ -1231,6 +1322,19 @@ export class ACPAgentSession {
1231
1322
  subscriber(event);
1232
1323
  }
1233
1324
  }
1325
+ runtimeInfo() {
1326
+ return {
1327
+ provider: this.provider,
1328
+ sessionId: this.sessionId,
1329
+ model: this.currentModel,
1330
+ thinkingOptionId: this.thinkingOptionId,
1331
+ modeId: this.currentMode,
1332
+ extra: {
1333
+ title: this.currentTitle,
1334
+ updatedAt: this.lastActivityAt,
1335
+ },
1336
+ };
1337
+ }
1234
1338
  finishTurn(event) {
1235
1339
  this.activeForegroundTurnId = null;
1236
1340
  this.suppressUserEchoMessageId = null;
@@ -1270,10 +1374,6 @@ export class ACPAgentSession {
1270
1374
  }
1271
1375
  return parts.length > 0 ? parts.join(" | ") : undefined;
1272
1376
  }
1273
- getSelectConfigOption(category) {
1274
- const option = this.configOptions.find((entry) => entry.type === "select" && entry.category === category);
1275
- return option ?? null;
1276
- }
1277
1377
  getTerminalEntry(terminalId) {
1278
1378
  const entry = this.terminalEntries.get(terminalId);
1279
1379
  if (!entry) {
@@ -1282,6 +1382,16 @@ export class ACPAgentSession {
1282
1382
  return entry;
1283
1383
  }
1284
1384
  }
1385
+ function findSelectConfigOption({ configOptions, category, id, }) {
1386
+ const option = configOptions?.find((entry) => entry.type === "select" && entry.category === category && (!id || entry.id === id));
1387
+ return option ?? null;
1388
+ }
1389
+ function findSelectConfigChoice({ option, value, }) {
1390
+ if (!option) {
1391
+ return null;
1392
+ }
1393
+ return flattenSelectOptions(option.options).find((choice) => choice.value === value) ?? null;
1394
+ }
1285
1395
  function flattenSelectOptions(options) {
1286
1396
  const flattened = [];
1287
1397
  for (const option of options) {
@@ -1296,7 +1406,7 @@ function flattenSelectOptions(options) {
1296
1406
  return flattened;
1297
1407
  }
1298
1408
  function deriveSelectorOptions(configOptions, category) {
1299
- const option = configOptions?.find((entry) => entry.type === "select" && entry.category === category);
1409
+ const option = findSelectConfigOption({ configOptions, category });
1300
1410
  if (!option) {
1301
1411
  return [];
1302
1412
  }
@@ -1354,19 +1464,21 @@ function toACPContentBlocks(prompt) {
1354
1464
  if (typeof prompt === "string") {
1355
1465
  return [{ type: "text", text: prompt }];
1356
1466
  }
1357
- return prompt.map((block) => {
1358
- if (block.type === "text") {
1359
- return { type: "text", text: block.text };
1360
- }
1361
- if (block.type === "github_pr" || block.type === "github_issue") {
1362
- return { type: "text", text: renderPromptAttachmentAsText(block) };
1467
+ const contentBlocks = [];
1468
+ for (const block of prompt) {
1469
+ switch (block.type) {
1470
+ case "text":
1471
+ contentBlocks.push({ type: "text", text: block.text });
1472
+ break;
1473
+ case "image":
1474
+ contentBlocks.push({ type: "image", data: block.data, mimeType: block.mimeType });
1475
+ break;
1476
+ default:
1477
+ contentBlocks.push({ type: "text", text: renderPromptAttachmentAsText(block) });
1478
+ break;
1363
1479
  }
1364
- return {
1365
- type: "image",
1366
- data: block.data,
1367
- mimeType: block.mimeType,
1368
- };
1369
- });
1480
+ }
1481
+ return contentBlocks;
1370
1482
  }
1371
1483
  function extractPromptText(prompt) {
1372
1484
  if (typeof prompt === "string") {
@@ -1395,18 +1507,25 @@ function contentBlockToText(content) {
1395
1507
  return "";
1396
1508
  }
1397
1509
  }
1510
+ function coalesceDefined(next, previous, fallback) {
1511
+ if (next !== undefined) {
1512
+ return next;
1513
+ }
1514
+ if (previous !== undefined) {
1515
+ return previous;
1516
+ }
1517
+ return fallback;
1518
+ }
1398
1519
  function mergeToolSnapshot(toolCallId, update, previous) {
1399
- const isFull = "title" in update && typeof update.title === "string";
1400
1520
  return {
1401
1521
  toolCallId,
1402
1522
  title: (update.title ?? previous?.title ?? toolCallId),
1403
1523
  kind: update.kind ?? previous?.kind ?? null,
1404
1524
  status: update.status ?? previous?.status ?? null,
1405
- content: update.content !== undefined ? update.content : (previous?.content ?? null),
1406
- locations: update.locations !== undefined ? update.locations : (previous?.locations ?? null),
1525
+ content: coalesceDefined(update.content, previous?.content, null),
1526
+ locations: coalesceDefined(update.locations, previous?.locations, null),
1407
1527
  rawInput: update.rawInput !== undefined ? update.rawInput : previous?.rawInput,
1408
1528
  rawOutput: update.rawOutput !== undefined ? update.rawOutput : previous?.rawOutput,
1409
- ...(isFull ? {} : {}),
1410
1529
  };
1411
1530
  }
1412
1531
  function mapPlanToTimeline(plan) {
@@ -1464,98 +1583,125 @@ function mapToolStatus(status) {
1464
1583
  }
1465
1584
  }
1466
1585
  function mapToolDetail(snapshot, terminals) {
1467
- const firstLocation = snapshot.locations?.[0]?.path;
1468
- const textContent = extractToolText(snapshot.content);
1469
- const diffContent = extractDiffContent(snapshot.content);
1470
- const terminalContent = extractTerminalContent(snapshot.content, terminals);
1471
- const rawInput = readRecord(snapshot.rawInput);
1472
- const rawOutput = readRecord(snapshot.rawOutput);
1586
+ const context = {
1587
+ snapshot,
1588
+ firstLocation: snapshot.locations?.[0]?.path,
1589
+ textContent: extractToolText(snapshot.content),
1590
+ diffContent: extractDiffContent(snapshot.content),
1591
+ terminalContent: extractTerminalContent(snapshot.content, terminals),
1592
+ rawInput: readRecord(snapshot.rawInput),
1593
+ rawOutput: readRecord(snapshot.rawOutput),
1594
+ };
1473
1595
  switch (snapshot.kind) {
1474
1596
  case "read":
1475
- return {
1476
- type: "read",
1477
- filePath: firstLocation ?? readString(rawInput, ["path", "filePath", "file"]) ?? snapshot.title,
1478
- content: textContent ?? readString(rawOutput, ["content", "text"]),
1479
- offset: readNumber(rawInput, ["offset", "line"]),
1480
- limit: readNumber(rawInput, ["limit"]),
1481
- };
1597
+ return buildReadToolDetail(context);
1482
1598
  case "edit":
1483
1599
  case "delete":
1484
- return {
1485
- type: "edit",
1486
- filePath: firstLocation ?? readString(rawInput, ["path", "filePath", "file"]) ?? snapshot.title,
1487
- oldString: diffContent?.oldText ?? readString(rawInput, ["oldText", "oldString"]),
1488
- newString: snapshot.kind === "delete"
1489
- ? ""
1490
- : (diffContent?.newText ?? readString(rawInput, ["newText", "newString"])),
1491
- unifiedDiff: textContent ?? undefined,
1492
- };
1600
+ return buildEditToolDetail(context);
1493
1601
  case "search":
1494
- return {
1495
- type: "search",
1496
- query: readString(rawInput, ["query", "pattern"]) ?? snapshot.title,
1497
- toolName: "search",
1498
- content: textContent ?? readString(rawOutput, ["content", "text"]),
1499
- filePaths: snapshot.locations?.map((location) => location.path),
1500
- };
1602
+ return buildSearchAcpToolDetail(context);
1501
1603
  case "execute":
1502
- return {
1503
- type: "shell",
1504
- command: terminalContent?.command ??
1505
- buildShellCommand(rawInput) ??
1506
- readString(rawInput, ["command"]) ??
1507
- snapshot.title,
1508
- cwd: terminalContent?.cwd ?? readString(rawInput, ["cwd"]),
1509
- output: terminalContent?.output ?? textContent ?? readString(rawOutput, ["output", "text"]),
1510
- exitCode: terminalContent?.exitCode ?? readNumber(rawOutput, ["exitCode"]),
1511
- };
1604
+ return buildShellToolDetail(context);
1512
1605
  case "fetch":
1513
- return {
1514
- type: "fetch",
1515
- url: readString(rawInput, ["url"]) ?? snapshot.title,
1516
- prompt: readString(rawInput, ["prompt"]),
1517
- result: textContent ?? readString(rawOutput, ["result", "text", "content"]),
1518
- code: readNumber(rawOutput, ["status", "code"]),
1519
- };
1606
+ return buildFetchToolDetail(context);
1520
1607
  case "think":
1521
1608
  return {
1522
1609
  type: "plain_text",
1523
1610
  label: snapshot.title,
1524
1611
  icon: "brain",
1525
- text: textContent ?? stringifyUnknown(snapshot.rawOutput),
1612
+ text: context.textContent ?? stringifyUnknown(snapshot.rawOutput),
1526
1613
  };
1527
1614
  case "switch_mode":
1528
1615
  return {
1529
1616
  type: "plain_text",
1530
1617
  label: snapshot.title,
1531
1618
  icon: "sparkles",
1532
- text: textContent ?? stringifyUnknown(snapshot.rawInput),
1619
+ text: context.textContent ?? stringifyUnknown(snapshot.rawInput),
1533
1620
  };
1534
1621
  default:
1535
- if (terminalContent) {
1536
- return {
1537
- type: "shell",
1538
- command: terminalContent.command ?? snapshot.title,
1539
- cwd: terminalContent.cwd,
1540
- output: terminalContent.output,
1541
- exitCode: terminalContent.exitCode,
1542
- };
1543
- }
1544
- if (textContent) {
1545
- return {
1546
- type: "plain_text",
1547
- label: snapshot.title,
1548
- text: textContent,
1549
- icon: "wrench",
1550
- };
1551
- }
1552
- return {
1553
- type: "unknown",
1554
- input: snapshot.rawInput ?? null,
1555
- output: snapshot.rawOutput ?? null,
1556
- };
1622
+ return buildDefaultToolDetail(context);
1557
1623
  }
1558
1624
  }
1625
+ function buildReadToolDetail(context) {
1626
+ const { snapshot, firstLocation, textContent, rawInput, rawOutput } = context;
1627
+ return {
1628
+ type: "read",
1629
+ filePath: firstLocation ?? readString(rawInput, ["path", "filePath", "file"]) ?? snapshot.title,
1630
+ content: textContent ?? readString(rawOutput, ["content", "text"]),
1631
+ offset: readNumber(rawInput, ["offset", "line"]),
1632
+ limit: readNumber(rawInput, ["limit"]),
1633
+ };
1634
+ }
1635
+ function buildEditToolDetail(context) {
1636
+ const { snapshot, firstLocation, textContent, diffContent, rawInput } = context;
1637
+ return {
1638
+ type: "edit",
1639
+ filePath: firstLocation ?? readString(rawInput, ["path", "filePath", "file"]) ?? snapshot.title,
1640
+ oldString: diffContent?.oldText ?? readString(rawInput, ["oldText", "oldString"]),
1641
+ newString: snapshot.kind === "delete"
1642
+ ? ""
1643
+ : (diffContent?.newText ?? readString(rawInput, ["newText", "newString"])),
1644
+ unifiedDiff: textContent ?? undefined,
1645
+ };
1646
+ }
1647
+ function buildSearchAcpToolDetail(context) {
1648
+ const { snapshot, textContent, rawInput, rawOutput } = context;
1649
+ return {
1650
+ type: "search",
1651
+ query: readString(rawInput, ["query", "pattern"]) ?? snapshot.title,
1652
+ toolName: "search",
1653
+ content: textContent ?? readString(rawOutput, ["content", "text"]),
1654
+ filePaths: snapshot.locations?.map((location) => location.path),
1655
+ };
1656
+ }
1657
+ function buildShellToolDetail(context) {
1658
+ const { snapshot, textContent, terminalContent, rawInput, rawOutput } = context;
1659
+ return {
1660
+ type: "shell",
1661
+ command: terminalContent?.command ??
1662
+ buildShellCommand(rawInput) ??
1663
+ readString(rawInput, ["command"]) ??
1664
+ snapshot.title,
1665
+ cwd: terminalContent?.cwd ?? readString(rawInput, ["cwd"]),
1666
+ output: terminalContent?.output ?? textContent ?? readString(rawOutput, ["output", "text"]),
1667
+ exitCode: terminalContent?.exitCode ?? readNumber(rawOutput, ["exitCode"]),
1668
+ };
1669
+ }
1670
+ function buildFetchToolDetail(context) {
1671
+ const { snapshot, textContent, rawInput, rawOutput } = context;
1672
+ return {
1673
+ type: "fetch",
1674
+ url: readString(rawInput, ["url"]) ?? snapshot.title,
1675
+ prompt: readString(rawInput, ["prompt"]),
1676
+ result: textContent ?? readString(rawOutput, ["result", "text", "content"]),
1677
+ code: readNumber(rawOutput, ["status", "code"]),
1678
+ };
1679
+ }
1680
+ function buildDefaultToolDetail(context) {
1681
+ const { snapshot, textContent, terminalContent } = context;
1682
+ if (terminalContent) {
1683
+ return {
1684
+ type: "shell",
1685
+ command: terminalContent.command ?? snapshot.title,
1686
+ cwd: terminalContent.cwd,
1687
+ output: terminalContent.output,
1688
+ exitCode: terminalContent.exitCode,
1689
+ };
1690
+ }
1691
+ if (textContent) {
1692
+ return {
1693
+ type: "plain_text",
1694
+ label: snapshot.title,
1695
+ text: textContent,
1696
+ icon: "wrench",
1697
+ };
1698
+ }
1699
+ return {
1700
+ type: "unknown",
1701
+ input: snapshot.rawInput ?? null,
1702
+ output: snapshot.rawOutput ?? null,
1703
+ };
1704
+ }
1559
1705
  function extractToolText(content) {
1560
1706
  if (!content) {
1561
1707
  return undefined;
@@ -1605,9 +1751,6 @@ function mapPermissionRequest(provider, requestId, params, snapshot) {
1605
1751
  },
1606
1752
  };
1607
1753
  }
1608
- function shouldAutoApprovePermissionRequest(provider, currentMode) {
1609
- return provider === "copilot" && currentMode === COPILOT_AUTOPILOT_MODE;
1610
- }
1611
1754
  function selectPermissionOption(options, response) {
1612
1755
  const order = response.behavior === "allow"
1613
1756
  ? ["allow_once", "allow_always"]