@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,2443 @@
1
+ import { homedir } from "node:os";
2
+ import { findExecutable, isCommandAvailable } from "../../../utils/executable.js";
3
+ import { createPathEquivalenceMatcher } from "../../../utils/path.js";
4
+ import { z } from "zod";
5
+ import { getAgentStreamEventTurnId, } from "../agent-sdk-types.js";
6
+ import { createProviderEnvSpec } from "../provider-launch-config.js";
7
+ import { withTimeout } from "../../../utils/promise-timeout.js";
8
+ import { execCommand } from "../../../utils/spawn.js";
9
+ import { buildToolCallDisplayModel } from "../../../shared/tool-call-display.js";
10
+ import { mapOpencodeToolCall } from "./opencode/tool-call-mapper.js";
11
+ import { OpenCodeServerManager } from "./opencode/server-manager.js";
12
+ import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, resolveBinaryVersion, toDiagnosticErrorMessage, } from "./diagnostic-utils.js";
13
+ import { runProviderTurn } from "./provider-runner.js";
14
+ import { renderPromptAttachmentAsText } from "../prompt-attachments.js";
15
+ import { composeSystemPromptParts } from "../system-prompt.js";
16
+ import { createSdkOpenCodeClient, } from "./opencode/runtime.js";
17
+ import { normalizeProviderReplayTimestamp } from "../provider-history-timestamps.js";
18
+ const OPENCODE_CAPABILITIES = {
19
+ supportsStreaming: true,
20
+ supportsSessionPersistence: true,
21
+ supportsDynamicModes: true,
22
+ supportsMcpServers: true,
23
+ supportsReasoningStream: true,
24
+ supportsToolInvocations: true,
25
+ };
26
+ const OPENCODE_BUILD_MODE_ID = "build";
27
+ const OPENCODE_FULL_ACCESS_MODE_ID = "full-access";
28
+ const OPENCODE_PERSISTED_SESSION_LIMIT = 200;
29
+ const OPENCODE_PENDING_ABORT_START_TIMEOUT_MS = 10000;
30
+ const DEFAULT_MODES = [
31
+ {
32
+ id: OPENCODE_BUILD_MODE_ID,
33
+ label: "Build",
34
+ description: "Allows edits and tool execution for implementation work",
35
+ },
36
+ {
37
+ id: "plan",
38
+ label: "Plan",
39
+ description: "Read-only planning mode that avoids file edits",
40
+ },
41
+ {
42
+ id: OPENCODE_FULL_ACCESS_MODE_ID,
43
+ label: "Full Access",
44
+ description: "Automatically approves all tool permission prompts for the session",
45
+ },
46
+ ];
47
+ const MCP_ALREADY_PRESENT_ERROR_TOKENS = ["already", "exists", "connected"];
48
+ const OPENCODE_PROVIDER_LIST_TIMEOUT_MS = 30000;
49
+ const OPENCODE_HANDLED_BUILTIN_SLASH_COMMANDS = [
50
+ { name: "compact", description: "Compact the current session", argumentHint: "" },
51
+ { name: "summarize", description: "Compact the current session", argumentHint: "" },
52
+ ];
53
+ const OPENCODE_HEADERS_TIMEOUT_TOKENS = [
54
+ "headers timeout",
55
+ "headers timeout error",
56
+ "headers_timeout",
57
+ "und_err_headers_timeout",
58
+ ];
59
+ const OpencodeToolStateSchema = z
60
+ .object({
61
+ status: z.string().optional(),
62
+ input: z.unknown().optional(),
63
+ output: z.unknown().optional(),
64
+ error: z.unknown().optional(),
65
+ })
66
+ .passthrough();
67
+ const OpencodeToolPartBaseSchema = z
68
+ .object({
69
+ tool: z.string().trim().min(1),
70
+ state: OpencodeToolStateSchema.optional(),
71
+ })
72
+ .passthrough();
73
+ const OpencodeToolPartWithCallIdSchema = OpencodeToolPartBaseSchema.extend({
74
+ callID: z.string().trim().min(1),
75
+ id: z.string().optional(),
76
+ }).transform((part) => ({
77
+ toolName: part.tool,
78
+ callId: part.callID,
79
+ status: part.state?.status,
80
+ input: part.state?.input,
81
+ output: part.state?.output,
82
+ error: part.state?.error,
83
+ }));
84
+ const OpencodeToolPartWithIdSchema = OpencodeToolPartBaseSchema.extend({
85
+ id: z.string().trim().min(1),
86
+ callID: z.string().optional(),
87
+ }).transform((part) => ({
88
+ toolName: part.tool,
89
+ callId: part.id,
90
+ status: part.state?.status,
91
+ input: part.state?.input,
92
+ output: part.state?.output,
93
+ error: part.state?.error,
94
+ }));
95
+ const OpencodeToolPartWithoutIdSchema = OpencodeToolPartBaseSchema.extend({
96
+ id: z.string().optional(),
97
+ callID: z.string().optional(),
98
+ }).transform((part) => ({
99
+ toolName: part.tool,
100
+ callId: undefined,
101
+ status: part.state?.status,
102
+ input: part.state?.input,
103
+ output: part.state?.output,
104
+ error: part.state?.error,
105
+ }));
106
+ const OpencodeToolPartSchema = z.union([
107
+ OpencodeToolPartWithCallIdSchema,
108
+ OpencodeToolPartWithIdSchema,
109
+ OpencodeToolPartWithoutIdSchema,
110
+ ]);
111
+ const OpencodeToolPartTimelineEnvelopeSchema = OpencodeToolPartSchema.transform((part) => ({
112
+ toolName: part.toolName,
113
+ callId: part.callId,
114
+ status: part.status,
115
+ input: part.input,
116
+ output: part.output,
117
+ error: part.error,
118
+ }));
119
+ const OpencodeToolPartToTimelineItemSchema = OpencodeToolPartTimelineEnvelopeSchema.transform((part) => mapOpencodeToolCall({
120
+ toolName: part.toolName,
121
+ callId: part.callId,
122
+ status: part.status,
123
+ input: part.input,
124
+ output: part.output,
125
+ error: part.error,
126
+ }));
127
+ function toOpenCodeMcpConfig(config) {
128
+ if (config.type === "stdio") {
129
+ return {
130
+ type: "local",
131
+ command: [config.command, ...(config.args ?? [])],
132
+ ...(config.env ? { environment: config.env } : {}),
133
+ enabled: true,
134
+ };
135
+ }
136
+ return {
137
+ type: "remote",
138
+ url: config.url,
139
+ ...(config.headers ? { headers: config.headers } : {}),
140
+ enabled: true,
141
+ };
142
+ }
143
+ function toTerminalTurnEvent(event) {
144
+ if (event.type === "turn_failed") {
145
+ return {
146
+ type: "turn_failed",
147
+ provider: "opencode",
148
+ error: toDiagnosticErrorMessage(event.error),
149
+ };
150
+ }
151
+ if (event.type === "turn_completed" || event.type === "turn_canceled") {
152
+ return event;
153
+ }
154
+ return null;
155
+ }
156
+ function isOpenCodeNotFoundError(error) {
157
+ return (typeof error === "object" &&
158
+ error !== null &&
159
+ "name" in error &&
160
+ error.name === "NotFoundError");
161
+ }
162
+ async function reconcileOpenCodeSessionClose(params) {
163
+ const { client, sessionId, directory, logger } = params;
164
+ try {
165
+ const response = await client.session.abort({
166
+ sessionID: sessionId,
167
+ directory,
168
+ });
169
+ if (response.error && !isOpenCodeNotFoundError(response.error)) {
170
+ logger.warn({
171
+ sessionId,
172
+ error: toDiagnosticErrorMessage(response.error),
173
+ }, "Failed to abort OpenCode session during close");
174
+ }
175
+ }
176
+ catch (error) {
177
+ logger.warn({
178
+ sessionId,
179
+ error: toDiagnosticErrorMessage(error),
180
+ }, "Failed to abort OpenCode session during close");
181
+ }
182
+ try {
183
+ const response = await client.session.update({
184
+ sessionID: sessionId,
185
+ directory,
186
+ time: { archived: Date.now() },
187
+ });
188
+ if (response.error && !isOpenCodeNotFoundError(response.error)) {
189
+ logger.warn({
190
+ sessionId,
191
+ error: toDiagnosticErrorMessage(response.error),
192
+ }, "Failed to archive OpenCode session during close");
193
+ }
194
+ }
195
+ catch (error) {
196
+ logger.warn({
197
+ sessionId,
198
+ error: toDiagnosticErrorMessage(error),
199
+ }, "Failed to archive OpenCode session during close");
200
+ }
201
+ }
202
+ function isOpenCodeHeadersTimeoutFailure(error) {
203
+ const diagnostics = new Set();
204
+ const queue = [error];
205
+ while (queue.length > 0) {
206
+ const current = queue.shift();
207
+ if (!current) {
208
+ continue;
209
+ }
210
+ const normalized = toDiagnosticErrorMessage(current).trim().toLowerCase();
211
+ if (normalized) {
212
+ diagnostics.add(normalized);
213
+ }
214
+ if (typeof current === "object") {
215
+ const record = current;
216
+ for (const value of [record.message, record.code, record.name]) {
217
+ if (typeof value !== "string") {
218
+ continue;
219
+ }
220
+ const diagnostic = value.trim().toLowerCase();
221
+ if (diagnostic) {
222
+ diagnostics.add(diagnostic);
223
+ }
224
+ }
225
+ if (record.cause) {
226
+ queue.push(record.cause);
227
+ }
228
+ }
229
+ }
230
+ return [...diagnostics].some((diagnostic) => OPENCODE_HEADERS_TIMEOUT_TOKENS.some((token) => diagnostic.includes(token)));
231
+ }
232
+ function isAlreadyPresentMcpError(error) {
233
+ const normalized = toDiagnosticErrorMessage(error).toLowerCase();
234
+ return MCP_ALREADY_PRESENT_ERROR_TOKENS.some((token) => normalized.includes(token));
235
+ }
236
+ function resolvePartDedupeKey(part, partType) {
237
+ if (part.id.trim().length > 0) {
238
+ return `${partType}:${part.id}`;
239
+ }
240
+ if (part.messageID.trim().length > 0) {
241
+ return `${partType}:message:${part.messageID}`;
242
+ }
243
+ return null;
244
+ }
245
+ function normalizeOpenCodeModeId(modeId) {
246
+ const trimmed = typeof modeId === "string" ? modeId.trim() : "";
247
+ if (!trimmed || trimmed === "default") {
248
+ return OPENCODE_BUILD_MODE_ID;
249
+ }
250
+ return trimmed;
251
+ }
252
+ function resolveOpenCodeRuntimeAgentId(modeId) {
253
+ const normalizedModeId = normalizeOpenCodeModeId(modeId);
254
+ return normalizedModeId === OPENCODE_FULL_ACCESS_MODE_ID
255
+ ? OPENCODE_BUILD_MODE_ID
256
+ : normalizedModeId;
257
+ }
258
+ function isSelectableOpenCodeAgent(agent) {
259
+ return (agent.mode === "primary" || agent.mode === "all") && agent.hidden !== true;
260
+ }
261
+ function mergeOpenCodeModes(discoveredModes) {
262
+ const modesById = new Map(DEFAULT_MODES.map((mode) => [mode.id, mode]));
263
+ for (const mode of discoveredModes) {
264
+ modesById.set(mode.id, mode);
265
+ }
266
+ return sortOpenCodeModes(Array.from(modesById.values()));
267
+ }
268
+ function sortOpenCodeModes(modes) {
269
+ const order = new Map(DEFAULT_MODES.map((mode, index) => [mode.id, index]));
270
+ return [...modes].sort((left, right) => {
271
+ const leftOrder = order.get(left.id) ?? Number.MAX_SAFE_INTEGER;
272
+ const rightOrder = order.get(right.id) ?? Number.MAX_SAFE_INTEGER;
273
+ if (leftOrder !== rightOrder) {
274
+ return leftOrder - rightOrder;
275
+ }
276
+ return left.label.localeCompare(right.label);
277
+ });
278
+ }
279
+ function readPositiveFiniteNumber(value) {
280
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : undefined;
281
+ }
282
+ function buildOpenCodeModelLookupKey(providerId, modelId) {
283
+ return `${providerId}/${modelId}`;
284
+ }
285
+ function parseOpenCodeModelLookupKey(modelId) {
286
+ if (typeof modelId !== "string" || modelId.trim().length === 0) {
287
+ return undefined;
288
+ }
289
+ const slashIndex = modelId.indexOf("/");
290
+ if (slashIndex <= 0 || slashIndex === modelId.length - 1) {
291
+ return undefined;
292
+ }
293
+ const providerId = modelId.slice(0, slashIndex).trim();
294
+ const providerModelId = modelId.slice(slashIndex + 1).trim();
295
+ if (!providerId || !providerModelId) {
296
+ return undefined;
297
+ }
298
+ return buildOpenCodeModelLookupKey(providerId, providerModelId);
299
+ }
300
+ function extractOpenCodeModelContextWindow(model) {
301
+ if (!model || typeof model !== "object") {
302
+ return undefined;
303
+ }
304
+ const limit = model.limit;
305
+ return readPositiveFiniteNumber(limit?.context);
306
+ }
307
+ function buildOpenCodeModelDefinition(provider, modelId, model) {
308
+ const rawVariants = model.variants ? Object.keys(model.variants) : [];
309
+ const thinkingOptions = rawVariants.map((id, index) => ({
310
+ id,
311
+ label: id,
312
+ isDefault: index === 0,
313
+ }));
314
+ return {
315
+ provider: "opencode",
316
+ id: `${provider.id}/${modelId}`,
317
+ label: model.name,
318
+ description: `${provider.name} - ${model.family ?? ""}`.trim(),
319
+ thinkingOptions: thinkingOptions.length > 0 ? thinkingOptions : undefined,
320
+ defaultThinkingOptionId: thinkingOptions[0]?.id,
321
+ metadata: {
322
+ providerId: provider.id,
323
+ providerName: provider.name,
324
+ modelId,
325
+ family: model.family,
326
+ releaseDate: model.release_date,
327
+ supportsAttachments: model.attachment,
328
+ supportsReasoning: model.reasoning,
329
+ supportsToolCall: model.tool_call,
330
+ cost: model.cost,
331
+ contextWindowMaxTokens: extractOpenCodeModelContextWindow(model),
332
+ ...(model.limit ? { limit: model.limit } : {}),
333
+ },
334
+ };
335
+ }
336
+ function resolveOpenCodeSelectedModelContextWindow(providers, modelId) {
337
+ if (!providers) {
338
+ return undefined;
339
+ }
340
+ const modelLookupKey = parseOpenCodeModelLookupKey(modelId);
341
+ if (!modelLookupKey) {
342
+ return undefined;
343
+ }
344
+ const lookup = buildOpenCodeModelContextWindowLookup(providers);
345
+ return lookup.get(modelLookupKey);
346
+ }
347
+ function buildOpenCodeModelContextWindowLookup(providers) {
348
+ const lookup = new Map();
349
+ if (!providers) {
350
+ return lookup;
351
+ }
352
+ const connectedProviderIds = new Set(providers.connected ?? []);
353
+ for (const provider of providers.all ?? []) {
354
+ // Providers with source "api" are managed by the OpenCode console/subscription and are
355
+ // usable even though they don't appear in `connected` (which only lists env/config providers).
356
+ if (!connectedProviderIds.has(provider.id) && provider.source !== "api") {
357
+ continue;
358
+ }
359
+ for (const [modelId, modelDefinition] of Object.entries(provider.models ?? {})) {
360
+ const contextWindow = extractOpenCodeModelContextWindow(modelDefinition);
361
+ if (contextWindow === undefined) {
362
+ continue;
363
+ }
364
+ lookup.set(buildOpenCodeModelLookupKey(provider.id, modelId), contextWindow);
365
+ }
366
+ }
367
+ return lookup;
368
+ }
369
+ function resolveOpenCodeModelLookupKeyFromAssistantMessage(info) {
370
+ const providerId = info.providerID;
371
+ const modelId = info.modelID;
372
+ if (!providerId || !modelId) {
373
+ return undefined;
374
+ }
375
+ return buildOpenCodeModelLookupKey(providerId, modelId);
376
+ }
377
+ function mergeOpenCodeStepFinishUsage(usage, part) {
378
+ const inputTokens = readPositiveFiniteNumber(part.tokens?.input);
379
+ const outputTokens = readPositiveFiniteNumber(part.tokens?.output);
380
+ const reasoningTokens = readPositiveFiniteNumber(part.tokens?.reasoning);
381
+ const cacheReadTokens = readPositiveFiniteNumber(part.tokens?.cache?.read);
382
+ const cacheWriteTokens = readPositiveFiniteNumber(part.tokens?.cache?.write);
383
+ const totalTokens = (inputTokens ?? 0) +
384
+ (outputTokens ?? 0) +
385
+ (reasoningTokens ?? 0) +
386
+ (cacheReadTokens ?? 0) +
387
+ (cacheWriteTokens ?? 0);
388
+ const cost = readPositiveFiniteNumber(part.cost);
389
+ if (inputTokens !== undefined) {
390
+ usage.inputTokens = inputTokens;
391
+ }
392
+ if (cacheReadTokens !== undefined) {
393
+ usage.cachedInputTokens = cacheReadTokens;
394
+ }
395
+ if (outputTokens !== undefined) {
396
+ usage.outputTokens = outputTokens;
397
+ }
398
+ if (totalTokens > 0) {
399
+ usage.contextWindowUsedTokens = totalTokens;
400
+ }
401
+ if (cost !== undefined) {
402
+ usage.totalCostUsd = (usage.totalCostUsd ?? 0) + cost;
403
+ }
404
+ }
405
+ function hasNormalizedOpenCodeUsage(usage) {
406
+ return [
407
+ usage.inputTokens,
408
+ usage.cachedInputTokens,
409
+ usage.outputTokens,
410
+ usage.totalCostUsd,
411
+ usage.contextWindowMaxTokens,
412
+ usage.contextWindowUsedTokens,
413
+ ].some((value) => typeof value === "number" && Number.isFinite(value));
414
+ }
415
+ function getOpenCodeAttachmentExtension(mimeType) {
416
+ switch (mimeType) {
417
+ case "image/png":
418
+ return "png";
419
+ case "image/jpeg":
420
+ return "jpg";
421
+ case "image/webp":
422
+ return "webp";
423
+ case "image/gif":
424
+ return "gif";
425
+ case "image/svg+xml":
426
+ return "svg";
427
+ default:
428
+ return "bin";
429
+ }
430
+ }
431
+ function toOpenCodeDataUrl(mimeType, data) {
432
+ const match = data.match(/^data:([^;,]+);base64,(.+)$/);
433
+ if (match) {
434
+ return {
435
+ mimeType: match[1] ?? mimeType,
436
+ url: data,
437
+ };
438
+ }
439
+ return {
440
+ mimeType,
441
+ url: `data:${mimeType};base64,${data}`,
442
+ };
443
+ }
444
+ function buildOpenCodePromptParts(prompt) {
445
+ if (typeof prompt === "string") {
446
+ return [{ type: "text", text: prompt }];
447
+ }
448
+ let attachmentOrdinal = 0;
449
+ const output = [];
450
+ for (const part of prompt) {
451
+ if (part.type === "text") {
452
+ output.push({ type: "text", text: part.text });
453
+ continue;
454
+ }
455
+ if (part.type === "image") {
456
+ attachmentOrdinal += 1;
457
+ const normalized = toOpenCodeDataUrl(part.mimeType, part.data);
458
+ output.push({
459
+ type: "file",
460
+ mime: normalized.mimeType,
461
+ filename: `attachment-${attachmentOrdinal}.${getOpenCodeAttachmentExtension(normalized.mimeType)}`,
462
+ url: normalized.url,
463
+ });
464
+ continue;
465
+ }
466
+ output.push({ type: "text", text: renderPromptAttachmentAsText(part) });
467
+ }
468
+ return output;
469
+ }
470
+ async function collectOpenCodePersistedAgentsFromSdk(client, options) {
471
+ const limit = options?.limit ?? OPENCODE_PERSISTED_SESSION_LIMIT;
472
+ const sessionListLimit = options?.cwd ? Math.max(limit, OPENCODE_PERSISTED_SESSION_LIMIT) : limit;
473
+ const response = await client.experimental.session.list({
474
+ archived: true,
475
+ roots: true,
476
+ limit: sessionListLimit,
477
+ });
478
+ if (response.error) {
479
+ throw new Error(`Failed to list OpenCode sessions: ${JSON.stringify(response.error)}`);
480
+ }
481
+ const sessions = response.data ?? [];
482
+ const matchesCwd = options?.cwd ? createPathEquivalenceMatcher(options.cwd) : null;
483
+ const candidates = sessions
484
+ .filter((session) => !matchesCwd || matchesCwd(session.directory))
485
+ .sort((left, right) => getOpenCodeSessionTimestamp(right) - getOpenCodeSessionTimestamp(left))
486
+ .slice(0, limit);
487
+ return await Promise.all(candidates.map((session) => buildOpenCodePersistedAgentDescriptor(client, session)));
488
+ }
489
+ async function buildOpenCodePersistedAgentDescriptor(client, session) {
490
+ const messages = await readOpenCodeSessionMessagesFromSdk(client, session);
491
+ const timeline = buildOpenCodeSessionTimeline(messages);
492
+ const modeId = resolveOpenCodePersistedSessionModeId(session, messages);
493
+ const model = resolveOpenCodePersistedSessionModel(session, messages);
494
+ return {
495
+ provider: "opencode",
496
+ sessionId: session.id,
497
+ cwd: session.directory,
498
+ title: normalizeOpenCodeSessionTitle(session.title),
499
+ lastActivityAt: new Date(getOpenCodeSessionTimestamp(session)),
500
+ persistence: {
501
+ provider: "opencode",
502
+ sessionId: session.id,
503
+ nativeHandle: session.id,
504
+ metadata: {
505
+ provider: "opencode",
506
+ cwd: session.directory,
507
+ title: normalizeOpenCodeSessionTitle(session.title),
508
+ ...(modeId ? { modeId } : {}),
509
+ ...(model ? { model } : {}),
510
+ },
511
+ },
512
+ timeline,
513
+ };
514
+ }
515
+ function normalizeOpenCodeSessionTitle(title) {
516
+ const normalized = title?.trim();
517
+ return normalized ? normalized : null;
518
+ }
519
+ function getOpenCodeSessionTimestamp(session) {
520
+ return session.time?.updated ?? session.time?.created ?? 0;
521
+ }
522
+ function resolveOpenCodeReplayTimestamp(params) {
523
+ const timedPart = params.part;
524
+ const partTimestamp = timedPart?.time?.start ??
525
+ timedPart?.time?.end ??
526
+ params.message.time?.created ??
527
+ params.message.time?.completed;
528
+ return normalizeProviderReplayTimestamp(partTimestamp);
529
+ }
530
+ function buildOpenCodeReplayTimelineEvent(params) {
531
+ const timestamp = resolveOpenCodeReplayTimestamp({
532
+ message: params.message,
533
+ part: params.part,
534
+ });
535
+ return {
536
+ type: "timeline",
537
+ provider: "opencode",
538
+ item: params.item,
539
+ ...(timestamp ? { timestamp } : {}),
540
+ };
541
+ }
542
+ function buildOpenCodeReplayPartTimelineEvent(params) {
543
+ const { part, message } = params;
544
+ if (part.type === "text" && part.text) {
545
+ return buildOpenCodeReplayTimelineEvent({
546
+ item: { type: "assistant_message", text: part.text },
547
+ message,
548
+ part,
549
+ });
550
+ }
551
+ if (part.type === "reasoning" && part.text) {
552
+ return buildOpenCodeReplayTimelineEvent({
553
+ item: { type: "reasoning", text: part.text },
554
+ message,
555
+ part,
556
+ });
557
+ }
558
+ if (part.type !== "tool") {
559
+ return null;
560
+ }
561
+ const parsedToolPart = OpencodeToolPartToTimelineItemSchema.safeParse(part);
562
+ if (!parsedToolPart.success || !parsedToolPart.data) {
563
+ return null;
564
+ }
565
+ return buildOpenCodeReplayTimelineEvent({
566
+ item: parsedToolPart.data,
567
+ message,
568
+ part,
569
+ });
570
+ }
571
+ async function readOpenCodeSessionMessagesFromSdk(client, session) {
572
+ const response = await client.session.messages({
573
+ sessionID: session.id,
574
+ directory: session.directory,
575
+ });
576
+ if (response.error || !response.data) {
577
+ return [];
578
+ }
579
+ return response.data;
580
+ }
581
+ function buildOpenCodeSessionTimeline(messages) {
582
+ return messages.flatMap((message) => buildOpenCodeReplayTimelineEvents(message).map((event) => event.item));
583
+ }
584
+ function resolveOpenCodePersistedSessionModeId(session, messages) {
585
+ const agent = session.agent ?? messages.map(readOpenCodeMessageAgent).find(Boolean);
586
+ return agent ? normalizeOpenCodeModeId(agent) : undefined;
587
+ }
588
+ function readOpenCodeMessageAgent(message) {
589
+ const agent = message.info.agent;
590
+ return typeof agent === "string" && agent.trim() ? agent : undefined;
591
+ }
592
+ function resolveOpenCodePersistedSessionModel(session, messages) {
593
+ if (session.model) {
594
+ return buildOpenCodeModelLookupKey(session.model.providerID, session.model.id);
595
+ }
596
+ const model = messages.map(readOpenCodeMessageModel).find(Boolean);
597
+ return model ? buildOpenCodeModelLookupKey(model.providerID, model.modelID) : undefined;
598
+ }
599
+ function readOpenCodeMessageModel(message) {
600
+ const { info } = message;
601
+ if (info.role === "user") {
602
+ return info.model;
603
+ }
604
+ return {
605
+ providerID: info.providerID,
606
+ modelID: info.modelID,
607
+ };
608
+ }
609
+ function buildOpenCodeReplayTimelineEvents(message) {
610
+ const { info, parts } = message;
611
+ if (info.role === "user") {
612
+ const text = parts
613
+ .filter((part) => part.type === "text")
614
+ .map((part) => part.text)
615
+ .join("");
616
+ return text
617
+ ? [
618
+ buildOpenCodeReplayTimelineEvent({
619
+ item: { type: "user_message", text, messageId: info.id },
620
+ message: info,
621
+ }),
622
+ ]
623
+ : [];
624
+ }
625
+ const events = [];
626
+ let emittedAssistantText = false;
627
+ for (const part of parts) {
628
+ if (part.type === "text" && part.text) {
629
+ emittedAssistantText = true;
630
+ }
631
+ const event = buildOpenCodeReplayPartTimelineEvent({ part, message: info });
632
+ if (event) {
633
+ events.push(event);
634
+ }
635
+ }
636
+ if (!emittedAssistantText) {
637
+ const text = stringifyStructuredAssistantMessage(info.structured);
638
+ if (text) {
639
+ events.push(buildOpenCodeReplayTimelineEvent({
640
+ item: { type: "assistant_message", text },
641
+ message: info,
642
+ }));
643
+ }
644
+ }
645
+ return events;
646
+ }
647
+ export const __openCodeInternals = {
648
+ buildOpenCodePromptParts,
649
+ buildOpenCodeModelContextWindowLookup,
650
+ buildOpenCodeModelDefinition,
651
+ buildOpenCodeModelLookupKey,
652
+ extractOpenCodeModelContextWindow,
653
+ hasNormalizedOpenCodeUsage,
654
+ mergeOpenCodeStepFinishUsage,
655
+ parseOpenCodeModelLookupKey,
656
+ reconcileOpenCodeSessionClose,
657
+ resolveOpenCodeModelLookupKeyFromAssistantMessage,
658
+ resolveOpenCodeSelectedModelContextWindow,
659
+ isSelectableOpenCodeAgent,
660
+ get OpenCodeAgentSession() {
661
+ return OpenCodeAgentSession;
662
+ },
663
+ };
664
+ class ProductionOpenCodeRuntime {
665
+ constructor(serverManager) {
666
+ this.serverManager = serverManager;
667
+ }
668
+ async acquireServer(options) {
669
+ return this.serverManager.acquire(options);
670
+ }
671
+ async ensureServerRunning() {
672
+ return this.serverManager.ensureRunning();
673
+ }
674
+ createClient(options) {
675
+ return createSdkOpenCodeClient(options);
676
+ }
677
+ async shutdown() {
678
+ await this.serverManager.shutdown();
679
+ }
680
+ }
681
+ export class OpenCodeAgentClient {
682
+ constructor(logger, runtimeSettings, deps = {}) {
683
+ this.provider = "opencode";
684
+ this.capabilities = OPENCODE_CAPABILITIES;
685
+ this.modelContextWindows = new Map();
686
+ this.logger = logger.child({ module: "agent", provider: "opencode" });
687
+ this.runtimeSettings = runtimeSettings;
688
+ this.runtime =
689
+ deps.runtime ??
690
+ new ProductionOpenCodeRuntime(OpenCodeServerManager.getInstance(this.logger, runtimeSettings));
691
+ }
692
+ async createSession(config, launchContext, options) {
693
+ const openCodeConfig = this.assertConfig(config);
694
+ const acquisition = await this.runtime.acquireServer({ force: false });
695
+ const { url } = acquisition.server;
696
+ const client = this.runtime.createClient({
697
+ baseUrl: url,
698
+ directory: openCodeConfig.cwd,
699
+ });
700
+ try {
701
+ const response = await withTimeout(client.session.create({ directory: openCodeConfig.cwd }), 10000, "OpenCode session.create timed out after 10s");
702
+ if (response.error) {
703
+ throw new Error(`Failed to create OpenCode session: ${JSON.stringify(response.error)}`);
704
+ }
705
+ const session = response.data;
706
+ if (!session) {
707
+ throw new Error("OpenCode session creation returned no data");
708
+ }
709
+ await this.populateModelContextWindowCache(client, openCodeConfig.cwd);
710
+ return new OpenCodeAgentSession(openCodeConfig, client, session.id, this.logger, new Map(this.modelContextWindows), acquisition.release, options?.persistSession, launchContext?.agentId);
711
+ }
712
+ catch (error) {
713
+ acquisition.release();
714
+ throw error;
715
+ }
716
+ }
717
+ async resumeSession(handle, overrides, launchContext) {
718
+ const metadata = (handle.metadata ?? {});
719
+ const cwd = overrides?.cwd ?? metadata.cwd;
720
+ if (!cwd) {
721
+ throw new Error("OpenCode resume requires the original working directory");
722
+ }
723
+ const config = {
724
+ ...metadata,
725
+ ...overrides,
726
+ provider: "opencode",
727
+ cwd,
728
+ };
729
+ const openCodeConfig = this.assertConfig(config);
730
+ const acquisition = await this.runtime.acquireServer({ force: false });
731
+ const { url } = acquisition.server;
732
+ const client = this.runtime.createClient({
733
+ baseUrl: url,
734
+ directory: openCodeConfig.cwd,
735
+ });
736
+ try {
737
+ await this.populateModelContextWindowCache(client, openCodeConfig.cwd);
738
+ return new OpenCodeAgentSession(openCodeConfig, client, handle.sessionId, this.logger, new Map(this.modelContextWindows), acquisition.release, undefined, launchContext?.agentId);
739
+ }
740
+ catch (error) {
741
+ acquisition.release();
742
+ throw error;
743
+ }
744
+ }
745
+ async listModels(options) {
746
+ const acquisition = await this.runtime.acquireServer({ force: options.force });
747
+ const { url } = acquisition.server;
748
+ const client = this.runtime.createClient({
749
+ baseUrl: url,
750
+ directory: options.cwd,
751
+ });
752
+ try {
753
+ // Background model discovery can be legitimately slow while OpenCode refreshes
754
+ // provider state, so allow longer than turn execution paths.
755
+ const response = await withTimeout(client.provider.list({ directory: options.cwd }), OPENCODE_PROVIDER_LIST_TIMEOUT_MS, `OpenCode provider.list timed out after ${OPENCODE_PROVIDER_LIST_TIMEOUT_MS / 1000}s - server may not be authenticated or connected to any providers`);
756
+ if (response.error) {
757
+ throw new Error(`Failed to fetch OpenCode providers: ${JSON.stringify(response.error)}`);
758
+ }
759
+ const providers = response.data;
760
+ if (!providers) {
761
+ return [];
762
+ }
763
+ const connectedProviderIds = new Set(providers.connected);
764
+ // Providers with source "api" are managed by the OpenCode console/subscription (e.g. Pi
765
+ // coding agent). They do not appear in `connected` (which only lists env/config providers)
766
+ // but are fully usable — OpenCode authenticates them internally via the console session.
767
+ const isAccessible = (provider) => connectedProviderIds.has(provider.id) || provider.source === "api";
768
+ // Fail fast if no providers are accessible at all
769
+ if (!providers.all.some(isAccessible)) {
770
+ throw new Error("OpenCode has no connected providers. Please authenticate with at least one provider " +
771
+ "(e.g., openai, anthropic), set appropriate environment variables (e.g., OPENAI_API_KEY), " +
772
+ "or log in to OpenCode Go via the console.");
773
+ }
774
+ const models = [];
775
+ this.modelContextWindows.clear();
776
+ for (const provider of providers.all) {
777
+ if (!isAccessible(provider)) {
778
+ continue;
779
+ }
780
+ for (const [modelId, model] of Object.entries(provider.models)) {
781
+ const definition = buildOpenCodeModelDefinition(provider, modelId, model);
782
+ const contextWindowMaxTokens = extractOpenCodeModelContextWindow(model);
783
+ if (contextWindowMaxTokens !== undefined) {
784
+ this.modelContextWindows.set(buildOpenCodeModelLookupKey(provider.id, modelId), contextWindowMaxTokens);
785
+ }
786
+ models.push(definition);
787
+ }
788
+ }
789
+ return models;
790
+ }
791
+ finally {
792
+ acquisition.release();
793
+ }
794
+ }
795
+ async listModes(options) {
796
+ const acquisition = await this.runtime.acquireServer({ force: options.force });
797
+ const { url } = acquisition.server;
798
+ const directory = options.cwd;
799
+ const client = this.runtime.createClient({ baseUrl: url, directory });
800
+ try {
801
+ const response = await withTimeout(client.app.agents({ directory }), 10000, "OpenCode app.agents timed out after 10s");
802
+ if (response.error || !response.data) {
803
+ return DEFAULT_MODES;
804
+ }
805
+ const discovered = response.data.filter(isSelectableOpenCodeAgent).map((agent) => ({
806
+ id: agent.name,
807
+ label: agent.name.charAt(0).toUpperCase() + agent.name.slice(1),
808
+ description: typeof agent.description === "string" && agent.description.trim().length > 0
809
+ ? agent.description.trim()
810
+ : DEFAULT_MODES.find((mode) => mode.id === agent.name)?.description,
811
+ }));
812
+ return mergeOpenCodeModes(discovered);
813
+ }
814
+ finally {
815
+ acquisition.release();
816
+ }
817
+ }
818
+ async listCommands(config) {
819
+ const openCodeConfig = this.assertConfig(config);
820
+ const acquisition = await this.runtime.acquireServer({ force: false });
821
+ const { url } = acquisition.server;
822
+ const client = this.runtime.createClient({
823
+ baseUrl: url,
824
+ directory: openCodeConfig.cwd,
825
+ });
826
+ try {
827
+ return await listOpenCodeCommandsFromSdk(client, openCodeConfig.cwd);
828
+ }
829
+ finally {
830
+ acquisition.release();
831
+ }
832
+ }
833
+ async listFeatures(_config) {
834
+ return [];
835
+ }
836
+ async listPersistedAgents(options) {
837
+ const acquisition = await this.runtime.acquireServer({ force: false });
838
+ const { url } = acquisition.server;
839
+ const client = this.runtime.createClient({
840
+ baseUrl: url,
841
+ directory: options?.cwd ?? "",
842
+ });
843
+ try {
844
+ return await collectOpenCodePersistedAgentsFromSdk(client, options);
845
+ }
846
+ finally {
847
+ acquisition.release();
848
+ }
849
+ }
850
+ async isAvailable() {
851
+ const command = this.runtimeSettings?.command;
852
+ if (command?.mode === "replace") {
853
+ return await isCommandAvailable(command.argv[0]);
854
+ }
855
+ return await isCommandAvailable("opencode");
856
+ }
857
+ async getDiagnostic() {
858
+ try {
859
+ const available = await this.isAvailable();
860
+ const resolvedBinary = await findExecutable("opencode");
861
+ let serverStatus = "Not running";
862
+ let modelsValue = "Not checked";
863
+ let status = formatDiagnosticStatus(available);
864
+ try {
865
+ const { url } = await this.runtime.ensureServerRunning();
866
+ serverStatus = `Running (${url})`;
867
+ }
868
+ catch (error) {
869
+ serverStatus = `Unavailable (${toDiagnosticErrorMessage(error)})`;
870
+ }
871
+ let authValue = "Not checked";
872
+ if (resolvedBinary) {
873
+ try {
874
+ const { stdout, stderr } = await execCommand(resolvedBinary, ["auth", "list"], {
875
+ ...createProviderEnvSpec(),
876
+ timeout: 5000,
877
+ });
878
+ const text = (stdout.trim() || stderr.trim()).trim();
879
+ authValue = text ? `\n ${text.replace(/\n/g, "\n ")}` : "(empty)";
880
+ }
881
+ catch (error) {
882
+ authValue = `Error - ${toDiagnosticErrorMessage(error)}`;
883
+ }
884
+ }
885
+ if (available) {
886
+ try {
887
+ const models = await this.listModels({ cwd: homedir(), force: false });
888
+ modelsValue = String(models.length);
889
+ }
890
+ catch (error) {
891
+ modelsValue = `Error - ${toDiagnosticErrorMessage(error)}`;
892
+ status = formatDiagnosticStatus(available, {
893
+ source: "model fetch",
894
+ cause: error,
895
+ });
896
+ }
897
+ if (!modelsValue.startsWith("Error -")) {
898
+ try {
899
+ await this.listModes({ cwd: homedir(), force: false });
900
+ }
901
+ catch (error) {
902
+ status = formatDiagnosticStatus(available, {
903
+ source: "mode fetch",
904
+ cause: error,
905
+ });
906
+ }
907
+ }
908
+ }
909
+ return {
910
+ diagnostic: formatProviderDiagnostic("OpenCode", [
911
+ {
912
+ label: "Binary",
913
+ value: resolvedBinary ?? "not found",
914
+ },
915
+ {
916
+ label: "Version",
917
+ value: resolvedBinary ? await resolveBinaryVersion(resolvedBinary) : "unknown",
918
+ },
919
+ { label: "Server", value: serverStatus },
920
+ { label: "Auth", value: authValue },
921
+ { label: "Models", value: modelsValue },
922
+ { label: "Status", value: status },
923
+ ]),
924
+ };
925
+ }
926
+ catch (error) {
927
+ return {
928
+ diagnostic: formatProviderDiagnosticError("OpenCode", error),
929
+ };
930
+ }
931
+ }
932
+ assertConfig(config) {
933
+ if (config.provider !== "opencode") {
934
+ throw new Error(`OpenCodeAgentClient received config for provider '${config.provider}'`);
935
+ }
936
+ return { ...config, provider: "opencode" };
937
+ }
938
+ async populateModelContextWindowCache(client, cwd) {
939
+ const response = await client.provider.list({ directory: cwd });
940
+ if (response.error || !response.data) {
941
+ return;
942
+ }
943
+ const lookup = buildOpenCodeModelContextWindowLookup(response.data);
944
+ this.modelContextWindows.clear();
945
+ for (const [modelLookupKey, contextWindowMaxTokens] of lookup.entries()) {
946
+ this.modelContextWindows.set(modelLookupKey, contextWindowMaxTokens);
947
+ }
948
+ }
949
+ }
950
+ const MAX_OPENCODE_SUB_AGENT_ACTIONS = 200;
951
+ const MAX_OPENCODE_PENDING_CHILD_TOOL_PARTS = 200;
952
+ function stringifyStructuredAssistantMessage(value) {
953
+ if (value === undefined) {
954
+ return null;
955
+ }
956
+ if (typeof value === "string") {
957
+ const trimmed = value.trim();
958
+ return trimmed.length > 0 ? trimmed : null;
959
+ }
960
+ try {
961
+ return JSON.stringify(value);
962
+ }
963
+ catch {
964
+ return null;
965
+ }
966
+ }
967
+ async function listOpenCodeCommandsFromSdk(client, directory) {
968
+ const result = await client.command.list({ directory });
969
+ const commandsByName = new Map(OPENCODE_HANDLED_BUILTIN_SLASH_COMMANDS.map((command) => [command.name, command]));
970
+ if (result.error || !result.data) {
971
+ return Array.from(commandsByName.values());
972
+ }
973
+ for (const cmd of result.data) {
974
+ commandsByName.set(cmd.name, {
975
+ name: cmd.name,
976
+ description: cmd.description ?? "",
977
+ argumentHint: cmd.hints?.length ? cmd.hints.join(" ") : "",
978
+ });
979
+ }
980
+ return Array.from(commandsByName.values());
981
+ }
982
+ function readOpenCodeRecord(value) {
983
+ return typeof value === "object" && value !== null && !Array.isArray(value)
984
+ ? value
985
+ : null;
986
+ }
987
+ function readNonEmptyString(value) {
988
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
989
+ }
990
+ function mapOpenCodeTodosToTimelineItems(todos) {
991
+ return {
992
+ type: "todo",
993
+ items: todos.flatMap((todo) => {
994
+ const text = readNonEmptyString(todo.content);
995
+ if (!text) {
996
+ return [];
997
+ }
998
+ return [
999
+ {
1000
+ text,
1001
+ completed: todo.status === "completed",
1002
+ },
1003
+ ];
1004
+ }),
1005
+ };
1006
+ }
1007
+ function createCompactionTimelineItem(status, trigger) {
1008
+ return {
1009
+ type: "compaction",
1010
+ status,
1011
+ ...(trigger ? { trigger } : {}),
1012
+ };
1013
+ }
1014
+ const PERMISSION_COMMAND_KEYS = ["command", "cmd", "shellCommand"];
1015
+ const PERMISSION_CWD_KEYS = ["cwd", "directory", "path", "workdir"];
1016
+ const PERMISSION_REASON_KEYS = ["reason", "purpose", "description", "message"];
1017
+ const PERMISSION_TITLE_BY_NAME = {
1018
+ external_directory: "Access external directory",
1019
+ bash: "Run shell command",
1020
+ read: "Read files",
1021
+ read_file: "Read files",
1022
+ write: "Write files",
1023
+ write_file: "Write files",
1024
+ create_file: "Write files",
1025
+ edit: "Edit files",
1026
+ apply_patch: "Edit files",
1027
+ apply_diff: "Edit files",
1028
+ };
1029
+ function toHumanReadablePermissionTitle(permission) {
1030
+ const mapped = PERMISSION_TITLE_BY_NAME[permission];
1031
+ if (mapped) {
1032
+ return mapped;
1033
+ }
1034
+ const normalized = permission
1035
+ .split(/[\s_-]+/)
1036
+ .map((part) => part.trim())
1037
+ .filter((part) => part.length > 0)
1038
+ .map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`)
1039
+ .join(" ");
1040
+ return normalized.length > 0 ? normalized : "Permission request";
1041
+ }
1042
+ function readFirstStringFromRecord(record, keys) {
1043
+ if (!record) {
1044
+ return null;
1045
+ }
1046
+ for (const key of keys) {
1047
+ const value = readNonEmptyString(record[key]);
1048
+ if (value) {
1049
+ return value;
1050
+ }
1051
+ }
1052
+ return null;
1053
+ }
1054
+ function readPermissionField(metadata, keys) {
1055
+ const direct = readFirstStringFromRecord(metadata, keys);
1056
+ if (direct) {
1057
+ return direct;
1058
+ }
1059
+ const nestedInput = readOpenCodeRecord(metadata?.input);
1060
+ return readFirstStringFromRecord(nestedInput, keys);
1061
+ }
1062
+ function buildOpenCodePermissionInput(params) {
1063
+ return {
1064
+ ...(params.patterns.length > 0 ? { patterns: params.patterns } : {}),
1065
+ ...(params.metadata ? { metadata: params.metadata } : {}),
1066
+ ...(params.tool ? { tool: params.tool } : {}),
1067
+ ...(params.command ? { command: params.command } : {}),
1068
+ };
1069
+ }
1070
+ function buildOpenCodePermissionDetail(params) {
1071
+ if (params.command) {
1072
+ return {
1073
+ type: "shell",
1074
+ command: params.command,
1075
+ ...(params.cwd ? { cwd: params.cwd } : {}),
1076
+ };
1077
+ }
1078
+ return {
1079
+ type: "unknown",
1080
+ input: {
1081
+ permission: params.permission,
1082
+ ...params.input,
1083
+ },
1084
+ output: null,
1085
+ };
1086
+ }
1087
+ function buildOpenCodePermissionDescription(params) {
1088
+ const parts = [];
1089
+ if (params.reason) {
1090
+ parts.push(params.reason);
1091
+ }
1092
+ if (params.patterns.length > 0) {
1093
+ parts.push(`Scope: ${params.patterns.join(", ")}`);
1094
+ }
1095
+ return parts.length > 0 ? parts.join(" - ") : undefined;
1096
+ }
1097
+ export function translateOpenCodeEvent(event, state) {
1098
+ const events = [];
1099
+ switch (event.type) {
1100
+ case "session.created":
1101
+ case "session.updated":
1102
+ appendOpenCodeSessionCreatedOrUpdated(event, state, events);
1103
+ break;
1104
+ case "message.updated":
1105
+ appendOpenCodeMessageUpdated(event, state, events);
1106
+ break;
1107
+ case "message.part.updated":
1108
+ appendOpenCodeMessagePartUpdated(event, state, events);
1109
+ break;
1110
+ case "message.part.delta":
1111
+ appendOpenCodeMessagePartDelta(event, state, events);
1112
+ break;
1113
+ case "permission.asked":
1114
+ appendOpenCodePermissionAsked(event, state, events);
1115
+ break;
1116
+ case "question.asked":
1117
+ appendOpenCodeQuestionAsked(event, state, events);
1118
+ break;
1119
+ case "todo.updated":
1120
+ if (event.properties.sessionID === state.sessionId) {
1121
+ events.push({
1122
+ type: "timeline",
1123
+ provider: "opencode",
1124
+ item: mapOpenCodeTodosToTimelineItems(event.properties.todos),
1125
+ });
1126
+ }
1127
+ break;
1128
+ case "session.compacted":
1129
+ if (event.properties.sessionID === state.sessionId) {
1130
+ events.push({
1131
+ type: "timeline",
1132
+ provider: "opencode",
1133
+ item: createCompactionTimelineItem("completed"),
1134
+ });
1135
+ }
1136
+ break;
1137
+ case "session.idle":
1138
+ if (event.properties.sessionID === state.sessionId) {
1139
+ resetOpenCodeTurnTrackingState(state);
1140
+ events.push({ type: "turn_completed", provider: "opencode", usage: undefined });
1141
+ }
1142
+ break;
1143
+ case "session.error":
1144
+ if (event.properties.sessionID === state.sessionId) {
1145
+ resetOpenCodeTurnTrackingState(state);
1146
+ events.push({
1147
+ type: "turn_failed",
1148
+ provider: "opencode",
1149
+ error: toDiagnosticErrorMessage(event.properties.error),
1150
+ });
1151
+ }
1152
+ break;
1153
+ case "session.status":
1154
+ appendOpenCodeSessionStatus(event, state, events);
1155
+ break;
1156
+ }
1157
+ return events;
1158
+ }
1159
+ function resetOpenCodeTurnTrackingState(state) {
1160
+ state.streamedPartKeys.clear();
1161
+ state.partTypes.clear();
1162
+ }
1163
+ function getOpenCodeSubAgentMaps(state) {
1164
+ state.subAgentsByCallId ?? (state.subAgentsByCallId = new Map());
1165
+ state.subAgentCallIdByChildSessionId ?? (state.subAgentCallIdByChildSessionId = new Map());
1166
+ state.pendingChildToolPartsBySessionId ?? (state.pendingChildToolPartsBySessionId = new Map());
1167
+ return {
1168
+ byCallId: state.subAgentsByCallId,
1169
+ callIdByChildSessionId: state.subAgentCallIdByChildSessionId,
1170
+ pendingChildToolPartsBySessionId: state.pendingChildToolPartsBySessionId,
1171
+ };
1172
+ }
1173
+ function getOpenCodeSubAgentState(callId, state, toolCall) {
1174
+ const maps = getOpenCodeSubAgentMaps(state);
1175
+ const existing = maps.byCallId.get(callId);
1176
+ if (existing) {
1177
+ existing.toolCall = toolCall;
1178
+ return existing;
1179
+ }
1180
+ const created = {
1181
+ toolCall,
1182
+ actions: [],
1183
+ actionIndexByKey: new Map(),
1184
+ nextActionIndex: 1,
1185
+ };
1186
+ maps.byCallId.set(callId, created);
1187
+ return created;
1188
+ }
1189
+ function linkOpenCodeSubAgentChildSession(activity, childSessionId, state) {
1190
+ activity.childSessionId = childSessionId;
1191
+ const maps = getOpenCodeSubAgentMaps(state);
1192
+ maps.callIdByChildSessionId.set(childSessionId, activity.toolCall.callId);
1193
+ }
1194
+ function buildOpenCodeSubAgentLog(detail, activity) {
1195
+ const actionLog = activity.actions
1196
+ .map((action) => action.summary ? `[${action.toolName}] ${action.summary}` : `[${action.toolName}]`)
1197
+ .join("\n");
1198
+ const parts = [actionLog, detail.log].filter((part) => part.trim().length > 0);
1199
+ return parts.join("\n\n");
1200
+ }
1201
+ function buildOpenCodeSubAgentTimelineItem(activity) {
1202
+ const toolCall = activity.toolCall;
1203
+ if (toolCall.detail.type !== "sub_agent") {
1204
+ return toolCall;
1205
+ }
1206
+ const childSessionId = activity.childSessionId ?? toolCall.detail.childSessionId;
1207
+ return {
1208
+ ...toolCall,
1209
+ detail: {
1210
+ ...toolCall.detail,
1211
+ ...(childSessionId ? { childSessionId } : {}),
1212
+ log: buildOpenCodeSubAgentLog(toolCall.detail, activity),
1213
+ },
1214
+ };
1215
+ }
1216
+ function registerOpenCodeSubAgentToolCall(item, state) {
1217
+ if (item.detail.type !== "sub_agent") {
1218
+ return item;
1219
+ }
1220
+ const activity = getOpenCodeSubAgentState(item.callId, state, item);
1221
+ if (item.detail.childSessionId) {
1222
+ linkOpenCodeSubAgentChildSession(activity, item.detail.childSessionId, state);
1223
+ }
1224
+ return buildOpenCodeSubAgentTimelineItem(activity);
1225
+ }
1226
+ function bufferOpenCodeSubAgentChildToolPart(part, state) {
1227
+ const maps = getOpenCodeSubAgentMaps(state);
1228
+ if (maps.byCallId.size === 0) {
1229
+ return;
1230
+ }
1231
+ const totalPending = [...maps.pendingChildToolPartsBySessionId.values()].reduce((total, parts) => total + parts.length, 0);
1232
+ if (totalPending >= MAX_OPENCODE_PENDING_CHILD_TOOL_PARTS) {
1233
+ return;
1234
+ }
1235
+ const pending = maps.pendingChildToolPartsBySessionId.get(part.sessionID) ?? [];
1236
+ pending.push(part);
1237
+ maps.pendingChildToolPartsBySessionId.set(part.sessionID, pending);
1238
+ }
1239
+ function flushOpenCodeSubAgentChildToolParts(childSessionId, state, events) {
1240
+ const maps = getOpenCodeSubAgentMaps(state);
1241
+ const pending = maps.pendingChildToolPartsBySessionId.get(childSessionId);
1242
+ if (!pending || pending.length === 0) {
1243
+ return;
1244
+ }
1245
+ maps.pendingChildToolPartsBySessionId.delete(childSessionId);
1246
+ for (const part of pending) {
1247
+ appendOpenCodeSubAgentChildToolPart(part, state, events);
1248
+ }
1249
+ }
1250
+ function findOnlyOpenCodeSubAgentWaitingForChild(state) {
1251
+ const maps = getOpenCodeSubAgentMaps(state);
1252
+ const candidates = [...maps.byCallId.values()].filter((activity) => activity.toolCall.status === "running" &&
1253
+ activity.toolCall.detail.type === "sub_agent" &&
1254
+ !activity.childSessionId);
1255
+ return candidates.length === 1 ? (candidates[0] ?? null) : null;
1256
+ }
1257
+ function summarizeOpenCodeSubAgentAction(item, cwd) {
1258
+ const display = buildToolCallDisplayModel({
1259
+ name: item.name,
1260
+ status: item.status,
1261
+ error: item.error,
1262
+ metadata: item.metadata,
1263
+ detail: item.detail,
1264
+ cwd,
1265
+ });
1266
+ return display.summary ?? display.errorText;
1267
+ }
1268
+ function appendOpenCodeSubAgentAction(activity, item, cwd) {
1269
+ const key = item.callId || `${item.name}:${activity.actions.length}`;
1270
+ const existingIndex = activity.actionIndexByKey.get(key);
1271
+ const summary = summarizeOpenCodeSubAgentAction(item, cwd);
1272
+ if (existingIndex !== undefined) {
1273
+ const action = activity.actions[existingIndex];
1274
+ if (!action) {
1275
+ return false;
1276
+ }
1277
+ const changed = action.toolName !== item.name || action.summary !== summary;
1278
+ action.toolName = item.name;
1279
+ if (summary) {
1280
+ action.summary = summary;
1281
+ }
1282
+ else {
1283
+ delete action.summary;
1284
+ }
1285
+ return changed;
1286
+ }
1287
+ if (activity.actions.length >= MAX_OPENCODE_SUB_AGENT_ACTIONS) {
1288
+ return false;
1289
+ }
1290
+ activity.actionIndexByKey.set(key, activity.actions.length);
1291
+ activity.actions.push({
1292
+ index: activity.nextActionIndex,
1293
+ key,
1294
+ toolName: item.name,
1295
+ ...(summary ? { summary } : {}),
1296
+ });
1297
+ activity.nextActionIndex += 1;
1298
+ return true;
1299
+ }
1300
+ function appendOpenCodeToolCallTimelineItem(item, state, events) {
1301
+ const timelineItem = registerOpenCodeSubAgentToolCall(item, state);
1302
+ events.push({
1303
+ type: "timeline",
1304
+ provider: "opencode",
1305
+ item: timelineItem,
1306
+ });
1307
+ if (timelineItem.detail.type === "sub_agent" && timelineItem.detail.childSessionId) {
1308
+ flushOpenCodeSubAgentChildToolParts(timelineItem.detail.childSessionId, state, events);
1309
+ }
1310
+ }
1311
+ function appendOpenCodeSubAgentChildSessionLinked(childSessionId, state, events) {
1312
+ const activity = findOnlyOpenCodeSubAgentWaitingForChild(state);
1313
+ if (!activity) {
1314
+ return;
1315
+ }
1316
+ linkOpenCodeSubAgentChildSession(activity, childSessionId, state);
1317
+ events.push({
1318
+ type: "timeline",
1319
+ provider: "opencode",
1320
+ item: buildOpenCodeSubAgentTimelineItem(activity),
1321
+ });
1322
+ flushOpenCodeSubAgentChildToolParts(childSessionId, state, events);
1323
+ }
1324
+ function appendOpenCodeSubAgentChildToolPart(part, state, events) {
1325
+ const maps = getOpenCodeSubAgentMaps(state);
1326
+ const parentCallId = maps.callIdByChildSessionId.get(part.sessionID);
1327
+ if (!parentCallId) {
1328
+ bufferOpenCodeSubAgentChildToolPart(part, state);
1329
+ return;
1330
+ }
1331
+ const activity = maps.byCallId.get(parentCallId);
1332
+ if (!activity) {
1333
+ return;
1334
+ }
1335
+ const parsedToolPart = OpencodeToolPartToTimelineItemSchema.safeParse(part);
1336
+ if (!parsedToolPart.success || !parsedToolPart.data) {
1337
+ return;
1338
+ }
1339
+ if (!appendOpenCodeSubAgentAction(activity, parsedToolPart.data, state.cwd)) {
1340
+ return;
1341
+ }
1342
+ events.push({
1343
+ type: "timeline",
1344
+ provider: "opencode",
1345
+ item: buildOpenCodeSubAgentTimelineItem(activity),
1346
+ });
1347
+ }
1348
+ function appendOpenCodeSessionCreatedOrUpdated(event, state, events) {
1349
+ if (event.properties.info.id === state.sessionId) {
1350
+ events.push({
1351
+ type: "thread_started",
1352
+ sessionId: state.sessionId,
1353
+ provider: "opencode",
1354
+ });
1355
+ return;
1356
+ }
1357
+ const info = readOpenCodeRecord(event.properties.info);
1358
+ const parentSessionId = readNonEmptyString(info?.parentID) ?? readNonEmptyString(info?.parentId);
1359
+ if (parentSessionId === state.sessionId) {
1360
+ appendOpenCodeSubAgentChildSessionLinked(event.properties.info.id, state, events);
1361
+ }
1362
+ }
1363
+ function appendOpenCodeMessageUpdated(event, state, events) {
1364
+ const info = event.properties.info;
1365
+ if (info.sessionID !== state.sessionId) {
1366
+ return;
1367
+ }
1368
+ state.messageRoles.set(info.id, info.role);
1369
+ if (info.role !== "assistant") {
1370
+ return;
1371
+ }
1372
+ const modelLookupKey = resolveOpenCodeModelLookupKeyFromAssistantMessage(info);
1373
+ if (modelLookupKey) {
1374
+ const contextWindowMaxTokens = state.modelContextWindowsByModelKey?.get(modelLookupKey);
1375
+ if (contextWindowMaxTokens !== undefined) {
1376
+ state.onAssistantModelContextWindowResolved?.(contextWindowMaxTokens);
1377
+ }
1378
+ }
1379
+ if (state.emittedStructuredMessageIds.has(info.id) || info.time?.completed === undefined) {
1380
+ return;
1381
+ }
1382
+ const text = stringifyStructuredAssistantMessage(info.structured);
1383
+ if (!text) {
1384
+ return;
1385
+ }
1386
+ state.emittedStructuredMessageIds.add(info.id);
1387
+ events.push({
1388
+ type: "timeline",
1389
+ provider: "opencode",
1390
+ item: { type: "assistant_message", text },
1391
+ });
1392
+ }
1393
+ function appendOpenCodeMessagePartUpdated(event, state, events) {
1394
+ const part = event.properties.part;
1395
+ if (part.sessionID !== state.sessionId) {
1396
+ if (part.type === "tool") {
1397
+ appendOpenCodeSubAgentChildToolPart(part, state, events);
1398
+ }
1399
+ return;
1400
+ }
1401
+ const messageRole = state.messageRoles.get(part.messageID);
1402
+ state.partTypes.set(part.id, part.type);
1403
+ if (part.type === "text") {
1404
+ appendOpenCodeTextPart(part, messageRole, state, events);
1405
+ return;
1406
+ }
1407
+ if (part.type === "reasoning") {
1408
+ appendOpenCodeReasoningPart(part, state, events);
1409
+ return;
1410
+ }
1411
+ if (part.type === "tool") {
1412
+ const parsedToolPart = OpencodeToolPartToTimelineItemSchema.safeParse(part);
1413
+ if (parsedToolPart.success && parsedToolPart.data) {
1414
+ appendOpenCodeToolCallTimelineItem(parsedToolPart.data, state, events);
1415
+ }
1416
+ return;
1417
+ }
1418
+ if (part.type === "compaction") {
1419
+ events.push({
1420
+ type: "timeline",
1421
+ provider: "opencode",
1422
+ item: createCompactionTimelineItem("loading", part.auto ? "auto" : "manual"),
1423
+ });
1424
+ return;
1425
+ }
1426
+ if (part.type === "step-finish") {
1427
+ mergeOpenCodeStepFinishUsage(state.accumulatedUsage, part);
1428
+ if (hasNormalizedOpenCodeUsage(state.accumulatedUsage)) {
1429
+ events.push({
1430
+ type: "usage_updated",
1431
+ provider: "opencode",
1432
+ usage: { ...state.accumulatedUsage },
1433
+ });
1434
+ }
1435
+ }
1436
+ }
1437
+ function appendOpenCodeTextPart(part, messageRole, state, events) {
1438
+ if (messageRole === "user") {
1439
+ return;
1440
+ }
1441
+ if (!part.time?.end) {
1442
+ return;
1443
+ }
1444
+ const partKey = resolvePartDedupeKey(part, "text");
1445
+ if (partKey && state.streamedPartKeys.delete(partKey)) {
1446
+ return;
1447
+ }
1448
+ if (part.text) {
1449
+ events.push({
1450
+ type: "timeline",
1451
+ provider: "opencode",
1452
+ item: { type: "assistant_message", text: part.text },
1453
+ });
1454
+ }
1455
+ }
1456
+ function appendOpenCodeReasoningPart(part, state, events) {
1457
+ if (!part.time.end) {
1458
+ return;
1459
+ }
1460
+ const partKey = resolvePartDedupeKey(part, "reasoning");
1461
+ if (partKey && state.streamedPartKeys.delete(partKey)) {
1462
+ return;
1463
+ }
1464
+ if (part.text) {
1465
+ events.push({
1466
+ type: "timeline",
1467
+ provider: "opencode",
1468
+ item: { type: "reasoning", text: part.text },
1469
+ });
1470
+ }
1471
+ }
1472
+ function appendOpenCodeMessagePartDelta(event, state, events) {
1473
+ const { sessionID, messageID, partID, field, delta } = event.properties;
1474
+ if (sessionID !== state.sessionId) {
1475
+ return;
1476
+ }
1477
+ if (!delta || !field) {
1478
+ return;
1479
+ }
1480
+ const messageRole = messageID ? state.messageRoles.get(messageID) : undefined;
1481
+ const knownPartType = partID ? state.partTypes.get(partID) : undefined;
1482
+ const isReasoning = knownPartType === "reasoning" || field === "reasoning";
1483
+ if (isReasoning) {
1484
+ if (partID) {
1485
+ state.streamedPartKeys.add(`reasoning:${partID}`);
1486
+ }
1487
+ events.push({
1488
+ type: "timeline",
1489
+ provider: "opencode",
1490
+ item: { type: "reasoning", text: delta },
1491
+ });
1492
+ return;
1493
+ }
1494
+ if (field !== "text") {
1495
+ return;
1496
+ }
1497
+ if (messageRole === "user") {
1498
+ return;
1499
+ }
1500
+ if (partID) {
1501
+ state.streamedPartKeys.add(`text:${partID}`);
1502
+ }
1503
+ events.push({
1504
+ type: "timeline",
1505
+ provider: "opencode",
1506
+ item: { type: "assistant_message", text: delta },
1507
+ });
1508
+ }
1509
+ function appendOpenCodePermissionAsked(event, state, events) {
1510
+ if (event.properties.sessionID !== state.sessionId) {
1511
+ return;
1512
+ }
1513
+ const metadata = readOpenCodeRecord(event.properties.metadata);
1514
+ const tool = readOpenCodeRecord(event.properties.tool);
1515
+ const patterns = Array.isArray(event.properties.patterns)
1516
+ ? event.properties.patterns.filter((value) => typeof value === "string")
1517
+ : [];
1518
+ const command = readPermissionField(metadata, PERMISSION_COMMAND_KEYS);
1519
+ const cwd = readPermissionField(metadata, PERMISSION_CWD_KEYS);
1520
+ const reason = readPermissionField(metadata, PERMISSION_REASON_KEYS);
1521
+ const input = buildOpenCodePermissionInput({ patterns, metadata, tool, command });
1522
+ const detail = buildOpenCodePermissionDetail({
1523
+ permission: event.properties.permission,
1524
+ input,
1525
+ command,
1526
+ cwd,
1527
+ });
1528
+ const description = buildOpenCodePermissionDescription({ reason, patterns });
1529
+ events.push({
1530
+ type: "permission_requested",
1531
+ provider: "opencode",
1532
+ request: {
1533
+ id: event.properties.id,
1534
+ provider: "opencode",
1535
+ name: event.properties.permission,
1536
+ kind: "tool",
1537
+ title: toHumanReadablePermissionTitle(event.properties.permission),
1538
+ ...(description ? { description } : {}),
1539
+ input,
1540
+ detail,
1541
+ },
1542
+ });
1543
+ }
1544
+ function appendOpenCodeQuestionAsked(event, state, events) {
1545
+ if (event.properties.sessionID !== state.sessionId) {
1546
+ return;
1547
+ }
1548
+ const questions = event.properties.questions.flatMap((q) => {
1549
+ if (!q.question || !q.header) {
1550
+ return [];
1551
+ }
1552
+ const options = q.options?.map((o) => ({
1553
+ label: o.label,
1554
+ ...(o.description ? { description: o.description } : {}),
1555
+ })) ?? [];
1556
+ return [
1557
+ {
1558
+ question: q.question,
1559
+ header: q.header,
1560
+ options,
1561
+ ...(q.multiple === true ? { multiSelect: true } : {}),
1562
+ },
1563
+ ];
1564
+ });
1565
+ if (questions.length === 0) {
1566
+ return;
1567
+ }
1568
+ events.push({
1569
+ type: "permission_requested",
1570
+ provider: "opencode",
1571
+ request: {
1572
+ id: event.properties.id,
1573
+ provider: "opencode",
1574
+ name: "question",
1575
+ kind: "question",
1576
+ title: "Question",
1577
+ input: { questions },
1578
+ metadata: {
1579
+ source: "opencode_question",
1580
+ ...event.properties.tool,
1581
+ },
1582
+ },
1583
+ });
1584
+ }
1585
+ function appendOpenCodeSessionStatus(event, state, events) {
1586
+ if (event.properties.sessionID !== state.sessionId) {
1587
+ return;
1588
+ }
1589
+ const { status } = event.properties;
1590
+ if (status.type === "idle") {
1591
+ resetOpenCodeTurnTrackingState(state);
1592
+ events.push({ type: "turn_completed", provider: "opencode", usage: undefined });
1593
+ return;
1594
+ }
1595
+ if (status.type === "retry") {
1596
+ // Mirror what opencode's TUI shows: retry attempts are visible activity, not
1597
+ // terminal. opencode itself never gives up — it backs off and tries again
1598
+ // forever. If we silently swallow these the user sees a spinner with no
1599
+ // explanation. Forwarding as a timeline error item is a no-op for old
1600
+ // clients (the schema already supports it).
1601
+ const message = typeof status.message === "string" ? status.message.trim() : "";
1602
+ const text = message
1603
+ ? `Provider retry (attempt ${status.attempt}): ${message}`
1604
+ : `Provider retry (attempt ${status.attempt})`;
1605
+ events.push({
1606
+ type: "timeline",
1607
+ provider: "opencode",
1608
+ item: { type: "error", message: text },
1609
+ });
1610
+ return;
1611
+ }
1612
+ // "busy" is transient — no terminal event, no surfaced activity.
1613
+ }
1614
+ function createDeferred() {
1615
+ let resolve;
1616
+ let reject;
1617
+ const promise = new Promise((res, rej) => {
1618
+ resolve = res;
1619
+ reject = rej;
1620
+ });
1621
+ return { promise, resolve, reject };
1622
+ }
1623
+ function unwrapOpenCodeGlobalEvent(event) {
1624
+ const record = readOpenCodeRecord(event);
1625
+ if (!record) {
1626
+ return null;
1627
+ }
1628
+ const payload = readOpenCodeRecord(record.payload);
1629
+ if (typeof payload?.type === "string") {
1630
+ return payload;
1631
+ }
1632
+ if (typeof record.type === "string") {
1633
+ return record;
1634
+ }
1635
+ return null;
1636
+ }
1637
+ class OpenCodeAgentSession {
1638
+ constructor(config, client, sessionId, logger, modelContextWindowsByModelKey = new Map(), releaseServer, persistSession = true, agentId) {
1639
+ this.agentId = agentId;
1640
+ this.provider = "opencode";
1641
+ this.capabilities = OPENCODE_CAPABILITIES;
1642
+ this.currentMode = "default";
1643
+ this.pendingPermissions = new Map();
1644
+ this.abortController = null;
1645
+ this.pendingAbortPromise = null;
1646
+ this.accumulatedUsage = {};
1647
+ this.mcpConfigured = false;
1648
+ this.mcpSetupPromise = null;
1649
+ /** Tracks the role of each message by ID to distinguish user from assistant messages */
1650
+ this.messageRoles = new Map();
1651
+ /** Tracks streamed textual part IDs to suppress final full-text echoes from OpenCode. */
1652
+ this.streamedPartKeys = new Set();
1653
+ /** Tracks assistant messages already emitted from structured payloads. */
1654
+ this.emittedStructuredMessageIds = new Set();
1655
+ /** Tracks the type of each part by ID, learned from message.part.updated events. */
1656
+ this.partTypes = new Map();
1657
+ this.availableModesCache = null;
1658
+ this.subscribers = new Set();
1659
+ this.nextTurnOrdinal = 0;
1660
+ this.activeForegroundTurnId = null;
1661
+ this.runningToolCalls = new Map();
1662
+ this.subAgentsByCallId = new Map();
1663
+ this.subAgentCallIdByChildSessionId = new Map();
1664
+ this.pendingChildToolPartsBySessionId = new Map();
1665
+ this.eventStreamAbortController = null;
1666
+ this.eventStreamReady = null;
1667
+ this.closed = false;
1668
+ this.deletedFromProvider = false;
1669
+ this.config = config;
1670
+ this.client = client;
1671
+ this.sessionId = sessionId;
1672
+ this.logger = logger.child({ agentId: this.agentId });
1673
+ this.modelContextWindowsByModelKey = modelContextWindowsByModelKey;
1674
+ this.currentMode = normalizeOpenCodeModeId(config.modeId);
1675
+ this.releaseServer = releaseServer ?? null;
1676
+ this.persistSession = persistSession;
1677
+ this.selectedModelContextWindowMaxTokens = this.resolveConfiguredModelContextWindowMaxTokens(config.model);
1678
+ this.startEventStream();
1679
+ }
1680
+ get id() {
1681
+ return this.sessionId;
1682
+ }
1683
+ async getRuntimeInfo() {
1684
+ return {
1685
+ provider: "opencode",
1686
+ sessionId: this.sessionId,
1687
+ model: this.config.model ?? null,
1688
+ modeId: this.currentMode,
1689
+ };
1690
+ }
1691
+ async setModel(modelId) {
1692
+ const normalizedModelId = typeof modelId === "string" && modelId.trim().length > 0 ? modelId : null;
1693
+ this.config.model = normalizedModelId ?? undefined;
1694
+ this.selectedModelContextWindowMaxTokens = this.resolveConfiguredModelContextWindowMaxTokens(this.config.model);
1695
+ }
1696
+ async setThinkingOption(thinkingOptionId) {
1697
+ const normalizedThinkingOptionId = typeof thinkingOptionId === "string" && thinkingOptionId.trim().length > 0
1698
+ ? thinkingOptionId
1699
+ : null;
1700
+ this.config.thinkingOptionId = normalizedThinkingOptionId ?? undefined;
1701
+ }
1702
+ async run(prompt, options) {
1703
+ return runProviderTurn({
1704
+ prompt,
1705
+ runOptions: options,
1706
+ startTurn: (p, o) => this.startTurn(p, o),
1707
+ subscribe: (callback) => this.subscribe(callback),
1708
+ getSessionId: () => this.sessionId,
1709
+ });
1710
+ }
1711
+ async interrupt() {
1712
+ const turnId = this.activeForegroundTurnId;
1713
+ const turnAbortController = this.abortController;
1714
+ turnAbortController?.abort();
1715
+ // COMPAT(opencodeSlowAbort): OpenCode 1.14.42+ blocks session.abort until
1716
+ // the running tool actually stops, which can be tens of seconds for
1717
+ // long-running tools. Cap the wait so the user-visible cancel lands
1718
+ // quickly while still giving OpenCode a chance to confirm the abort
1719
+ // cleanly. Drop the timeout once upstream returns abort acknowledgement
1720
+ // before tool teardown.
1721
+ const abortPromise = this.beginSessionAbort(turnId, "interrupt");
1722
+ await withTimeout(abortPromise, 2000, "OpenCode session.abort").catch((error) => {
1723
+ this.logger.warn({ err: error, sessionId: this.sessionId, turnId }, "OpenCode session.abort exceeded the cancel cap; proceeding with local cancel");
1724
+ });
1725
+ if (turnId) {
1726
+ this.finishForegroundTurn({ type: "turn_canceled", provider: "opencode", reason: "interrupted" }, turnId);
1727
+ }
1728
+ }
1729
+ beginSessionAbort(turnId, reason) {
1730
+ const abortPromise = this.client.session
1731
+ .abort({
1732
+ sessionID: this.sessionId,
1733
+ directory: this.config.cwd,
1734
+ })
1735
+ .then(() => undefined)
1736
+ .catch((error) => {
1737
+ this.logger.warn({ err: error, sessionId: this.sessionId, turnId, reason }, "OpenCode session.abort rejected");
1738
+ });
1739
+ const trackedAbortPromise = abortPromise.finally(() => {
1740
+ if (this.pendingAbortPromise === trackedAbortPromise) {
1741
+ this.pendingAbortPromise = null;
1742
+ }
1743
+ });
1744
+ this.pendingAbortPromise = trackedAbortPromise;
1745
+ return trackedAbortPromise;
1746
+ }
1747
+ async awaitPendingAbortBeforeStartingTurn() {
1748
+ const pendingAbortPromise = this.pendingAbortPromise;
1749
+ if (!pendingAbortPromise) {
1750
+ return;
1751
+ }
1752
+ await withTimeout(pendingAbortPromise, OPENCODE_PENDING_ABORT_START_TIMEOUT_MS, "OpenCode pending session.abort").catch((error) => {
1753
+ this.logger.warn({ err: error, sessionId: this.sessionId }, "OpenCode session.abort was still pending before starting the next turn");
1754
+ });
1755
+ }
1756
+ async startTurn(prompt, options) {
1757
+ if (this.activeForegroundTurnId) {
1758
+ throw new Error("A foreground turn is already active");
1759
+ }
1760
+ await this.awaitPendingAbortBeforeStartingTurn();
1761
+ this.runningToolCalls.clear();
1762
+ this.subAgentsByCallId.clear();
1763
+ this.subAgentCallIdByChildSessionId.clear();
1764
+ this.pendingChildToolPartsBySessionId.clear();
1765
+ const turnAbortController = new AbortController();
1766
+ this.abortController = turnAbortController;
1767
+ await this.ensureMcpServersConfigured();
1768
+ const contextWindowMaxTokens = this.resolveSelectedModelContextWindowMaxTokens();
1769
+ this.accumulatedUsage = contextWindowMaxTokens !== undefined ? { contextWindowMaxTokens } : {};
1770
+ const parts = buildOpenCodePromptParts(prompt);
1771
+ const model = this.parseModel(this.config.model);
1772
+ const thinkingOptionId = this.config.thinkingOptionId;
1773
+ const effectiveVariant = thinkingOptionId ?? undefined;
1774
+ const effectiveMode = resolveOpenCodeRuntimeAgentId(this.currentMode);
1775
+ try {
1776
+ await this.ensureEventStreamReady();
1777
+ }
1778
+ catch (error) {
1779
+ if (this.abortController === turnAbortController) {
1780
+ this.abortController = null;
1781
+ }
1782
+ throw error;
1783
+ }
1784
+ const turnId = this.createTurnId();
1785
+ this.activeForegroundTurnId = turnId;
1786
+ this.notifySubscribers({ type: "turn_started", provider: "opencode" }, turnId);
1787
+ const slashCommand = await this.resolveSlashCommandInvocation(prompt);
1788
+ if (slashCommand) {
1789
+ if (slashCommand.commandName === "compact" || slashCommand.commandName === "summarize") {
1790
+ void this.client.session
1791
+ .summarize({
1792
+ sessionID: this.sessionId,
1793
+ directory: this.config.cwd,
1794
+ ...(model ? { providerID: model.providerID, modelID: model.modelID } : {}),
1795
+ })
1796
+ .then((response) => {
1797
+ if (response.error) {
1798
+ this.finishForegroundTurn({
1799
+ type: "turn_failed",
1800
+ provider: "opencode",
1801
+ error: toDiagnosticErrorMessage(response.error),
1802
+ }, turnId);
1803
+ }
1804
+ else {
1805
+ this.finishForegroundTurn({ type: "turn_completed", provider: "opencode", usage: undefined }, turnId);
1806
+ }
1807
+ return;
1808
+ })
1809
+ .catch((error) => {
1810
+ this.finishForegroundTurn({
1811
+ type: "turn_failed",
1812
+ provider: "opencode",
1813
+ error: toDiagnosticErrorMessage(error),
1814
+ }, turnId);
1815
+ });
1816
+ return { turnId };
1817
+ }
1818
+ // command() is only dispatch acknowledgement. OpenCode session events are
1819
+ // the source of truth for when the command turn becomes idle or fails.
1820
+ void this.client.session
1821
+ .command({
1822
+ sessionID: this.sessionId,
1823
+ directory: this.config.cwd,
1824
+ command: slashCommand.commandName,
1825
+ arguments: slashCommand.args ?? "",
1826
+ ...(this.config.model ? { model: this.config.model } : {}),
1827
+ ...(effectiveMode ? { agent: effectiveMode } : {}),
1828
+ ...(effectiveVariant ? { variant: effectiveVariant } : {}),
1829
+ })
1830
+ .then((response) => {
1831
+ if (response.error) {
1832
+ if (isOpenCodeHeadersTimeoutFailure(response.error)) {
1833
+ this.logger.warn({
1834
+ err: response.error,
1835
+ commandName: slashCommand.commandName,
1836
+ turnId,
1837
+ }, "OpenCode slash command hit a header timeout; waiting for SSE terminal event");
1838
+ return;
1839
+ }
1840
+ const errorMsg = toDiagnosticErrorMessage(response.error);
1841
+ this.finishForegroundTurn({ type: "turn_failed", provider: "opencode", error: errorMsg }, turnId);
1842
+ }
1843
+ return;
1844
+ })
1845
+ .catch((err) => {
1846
+ if (isOpenCodeHeadersTimeoutFailure(err)) {
1847
+ this.logger.warn({
1848
+ err,
1849
+ commandName: slashCommand.commandName,
1850
+ turnId,
1851
+ }, "OpenCode slash command hit a header timeout; waiting for SSE terminal event");
1852
+ return;
1853
+ }
1854
+ this.finishForegroundTurn({ type: "turn_failed", provider: "opencode", error: toDiagnosticErrorMessage(err) }, turnId);
1855
+ });
1856
+ }
1857
+ else {
1858
+ // Wrap in an async IIFE so a synchronous throw from promptAsync (e.g.
1859
+ // SDK input validation) is caught alongside async rejections. A plain
1860
+ // `.then().catch()` chain would let a sync throw escape unhandled.
1861
+ void (async () => {
1862
+ this.traceOpenCode("provider.opencode.prompt_async.start", {
1863
+ turnId,
1864
+ sessionId: this.sessionId,
1865
+ model,
1866
+ effectiveMode,
1867
+ effectiveVariant,
1868
+ partTypes: parts.map((p) => p.type),
1869
+ });
1870
+ try {
1871
+ const systemPrompt = composeSystemPromptParts(this.config.systemPrompt, this.config.daemonAppendSystemPrompt);
1872
+ const promptResponse = await this.client.session.promptAsync({
1873
+ sessionID: this.sessionId,
1874
+ directory: this.config.cwd,
1875
+ parts,
1876
+ ...(options?.outputSchema
1877
+ ? {
1878
+ format: {
1879
+ type: "json_schema",
1880
+ schema: options.outputSchema,
1881
+ },
1882
+ }
1883
+ : {}),
1884
+ ...(systemPrompt ? { system: systemPrompt } : {}),
1885
+ ...(model ? { model } : {}),
1886
+ ...(effectiveMode ? { agent: effectiveMode } : {}),
1887
+ ...(effectiveVariant ? { variant: effectiveVariant } : {}),
1888
+ });
1889
+ this.traceOpenCode("provider.opencode.prompt_async.response", {
1890
+ turnId,
1891
+ hasError: promptResponse.error !== undefined,
1892
+ error: promptResponse.error,
1893
+ data: promptResponse.data,
1894
+ });
1895
+ if (promptResponse.error) {
1896
+ this.finishForegroundTurn({
1897
+ type: "turn_failed",
1898
+ provider: "opencode",
1899
+ error: toDiagnosticErrorMessage(promptResponse.error),
1900
+ }, turnId);
1901
+ }
1902
+ }
1903
+ catch (error) {
1904
+ this.traceOpenCode("provider.opencode.prompt_async.throw", {
1905
+ turnId,
1906
+ error: error instanceof Error
1907
+ ? { name: error.name, message: error.message, stack: error.stack }
1908
+ : String(error),
1909
+ });
1910
+ this.finishForegroundTurn({
1911
+ type: "turn_failed",
1912
+ provider: "opencode",
1913
+ error: toDiagnosticErrorMessage(error),
1914
+ }, turnId);
1915
+ }
1916
+ })();
1917
+ }
1918
+ return { turnId };
1919
+ }
1920
+ subscribe(callback) {
1921
+ this.subscribers.add(callback);
1922
+ return () => {
1923
+ this.subscribers.delete(callback);
1924
+ };
1925
+ }
1926
+ startEventStream() {
1927
+ void this.ensureEventStreamReady().catch((error) => {
1928
+ this.logger.warn({ err: error, sessionId: this.sessionId }, "OpenCode event stream failed");
1929
+ });
1930
+ }
1931
+ ensureEventStreamReady() {
1932
+ if (this.eventStreamReady) {
1933
+ return this.eventStreamReady.promise;
1934
+ }
1935
+ const eventStreamAbortController = new AbortController();
1936
+ const eventStreamReady = createDeferred();
1937
+ this.eventStreamAbortController = eventStreamAbortController;
1938
+ this.eventStreamReady = eventStreamReady;
1939
+ void this.consumeEventStream(eventStreamAbortController, eventStreamReady).finally(() => {
1940
+ if (this.eventStreamAbortController === eventStreamAbortController) {
1941
+ this.eventStreamAbortController = null;
1942
+ this.eventStreamReady = null;
1943
+ }
1944
+ });
1945
+ return eventStreamReady.promise;
1946
+ }
1947
+ async consumeEventStream(eventStreamAbortController, eventStreamReady) {
1948
+ this.traceOpenCode("provider.opencode.subscribe.start", {
1949
+ sessionId: this.sessionId,
1950
+ cwd: this.config.cwd,
1951
+ });
1952
+ let eventStreamReadyResolved = false;
1953
+ try {
1954
+ const result = await this.client.global.event({
1955
+ signal: eventStreamAbortController.signal,
1956
+ sseMaxRetryAttempts: 0,
1957
+ });
1958
+ eventStreamReadyResolved = true;
1959
+ this.traceOpenCode("provider.opencode.subscribe.ready", {
1960
+ sessionId: this.sessionId,
1961
+ });
1962
+ eventStreamReady.resolve();
1963
+ let eventCount = 0;
1964
+ for await (const rawEvent of result.stream) {
1965
+ eventCount += 1;
1966
+ await this.consumeOpenCodeStreamEvent({ rawEvent, eventCount });
1967
+ }
1968
+ this.traceOpenCode("provider.opencode.stream.eof", {
1969
+ eventCount,
1970
+ aborted: eventStreamAbortController.signal.aborted,
1971
+ activeTurnId: this.activeForegroundTurnId,
1972
+ });
1973
+ if (!eventStreamAbortController.signal.aborted) {
1974
+ if (!eventStreamReadyResolved) {
1975
+ eventStreamReady.reject(new Error("OpenCode event stream ended before it became ready"));
1976
+ }
1977
+ const activeTurnId = this.activeForegroundTurnId;
1978
+ if (activeTurnId) {
1979
+ this.traceOpenCode("provider.opencode.turn.fail_eof", {
1980
+ turnId: activeTurnId,
1981
+ eventCount,
1982
+ });
1983
+ this.finishForegroundTurn({
1984
+ type: "turn_failed",
1985
+ provider: "opencode",
1986
+ error: "OpenCode event stream ended before the turn reached a terminal state",
1987
+ }, activeTurnId);
1988
+ }
1989
+ }
1990
+ }
1991
+ catch (error) {
1992
+ this.traceOpenCode("provider.opencode.subscribe.error", {
1993
+ turnId: this.activeForegroundTurnId ?? undefined,
1994
+ error: error instanceof Error ? { name: error.name, message: error.message } : String(error),
1995
+ });
1996
+ if (!eventStreamReadyResolved) {
1997
+ eventStreamReady.reject(error);
1998
+ }
1999
+ const activeTurnId = this.activeForegroundTurnId;
2000
+ if (!eventStreamAbortController.signal.aborted && activeTurnId) {
2001
+ this.finishForegroundTurn({
2002
+ type: "turn_failed",
2003
+ provider: "opencode",
2004
+ error: toDiagnosticErrorMessage(error),
2005
+ }, activeTurnId);
2006
+ }
2007
+ }
2008
+ }
2009
+ async consumeOpenCodeStreamEvent(params) {
2010
+ const { rawEvent, eventCount } = params;
2011
+ const turnId = this.activeForegroundTurnId;
2012
+ const event = unwrapOpenCodeGlobalEvent(rawEvent);
2013
+ this.traceOpenCode("provider.opencode.raw_event", {
2014
+ turnId: turnId ?? undefined,
2015
+ n: eventCount,
2016
+ type: event?.type,
2017
+ rawType: readOpenCodeRecord(rawEvent)?.type,
2018
+ directory: readOpenCodeRecord(rawEvent)?.directory,
2019
+ rawEvent,
2020
+ properties: event?.properties,
2021
+ });
2022
+ if (!event) {
2023
+ return;
2024
+ }
2025
+ if (!turnId) {
2026
+ this.traceOpenCode("provider.opencode.event.skip", {
2027
+ n: eventCount,
2028
+ reason: "no_active_turn",
2029
+ type: event.type,
2030
+ });
2031
+ return;
2032
+ }
2033
+ const translated = await this.translateEvent(event);
2034
+ this.traceOpenCode("provider.opencode.parsed_event", {
2035
+ turnId,
2036
+ n: eventCount,
2037
+ count: translated.length,
2038
+ types: translated.map((t) => t.type),
2039
+ events: translated,
2040
+ });
2041
+ for (const e of translated) {
2042
+ if (this.activeForegroundTurnId !== turnId) {
2043
+ this.traceOpenCode("provider.opencode.parsed_event.skip_active", { turnId, type: e.type });
2044
+ return;
2045
+ }
2046
+ if (e.type === "timeline" && e.item.type === "tool_call") {
2047
+ this.trackToolCall(e.item);
2048
+ }
2049
+ const terminalEvent = toTerminalTurnEvent(e);
2050
+ if (terminalEvent) {
2051
+ this.traceOpenCode("provider.opencode.event.terminal", {
2052
+ turnId,
2053
+ type: terminalEvent.type,
2054
+ });
2055
+ this.finishForegroundTurn(terminalEvent, turnId);
2056
+ return;
2057
+ }
2058
+ this.notifySubscribers(e, turnId);
2059
+ }
2060
+ }
2061
+ finishForegroundTurn(event, turnId) {
2062
+ this.traceOpenCode("provider.opencode.finish_foreground_turn", {
2063
+ turnId,
2064
+ activeTurnId: this.activeForegroundTurnId,
2065
+ type: event.type,
2066
+ error: event.type === "turn_failed" ? event.error : undefined,
2067
+ reason: event.type === "turn_canceled" ? event.reason : undefined,
2068
+ });
2069
+ if (this.activeForegroundTurnId !== turnId) {
2070
+ return;
2071
+ }
2072
+ if (event.type === "turn_canceled" || event.type === "turn_failed") {
2073
+ this.synthesizeInterruptedToolCalls(turnId);
2074
+ }
2075
+ else {
2076
+ this.runningToolCalls.clear();
2077
+ }
2078
+ this.activeForegroundTurnId = null;
2079
+ this.abortController = null;
2080
+ this.notifySubscribers(event, turnId);
2081
+ }
2082
+ trackToolCall(item) {
2083
+ if (item.status === "running") {
2084
+ this.runningToolCalls.set(item.callId, item);
2085
+ return;
2086
+ }
2087
+ this.runningToolCalls.delete(item.callId);
2088
+ }
2089
+ synthesizeInterruptedToolCalls(turnId) {
2090
+ for (const item of this.runningToolCalls.values()) {
2091
+ const error = { message: "Tool execution aborted" };
2092
+ this.notifySubscribers({
2093
+ type: "timeline",
2094
+ provider: "opencode",
2095
+ item: {
2096
+ ...item,
2097
+ status: "failed",
2098
+ error,
2099
+ detail: item.detail.type === "sub_agent"
2100
+ ? {
2101
+ ...item.detail,
2102
+ log: [item.detail.log, error.message]
2103
+ .filter((entry) => entry.trim().length > 0)
2104
+ .join("\n"),
2105
+ }
2106
+ : item.detail,
2107
+ },
2108
+ }, turnId);
2109
+ }
2110
+ this.runningToolCalls.clear();
2111
+ }
2112
+ notifySubscribers(event, turnIdOverride) {
2113
+ if (this.closed) {
2114
+ return;
2115
+ }
2116
+ const turnId = turnIdOverride ?? this.activeForegroundTurnId;
2117
+ const tagged = turnId ? { ...event, turnId } : event;
2118
+ this.traceOpenCode("provider.opencode.event_emit", {
2119
+ turnId: getAgentStreamEventTurnId(tagged),
2120
+ event: tagged,
2121
+ });
2122
+ for (const callback of this.subscribers) {
2123
+ try {
2124
+ callback(tagged);
2125
+ }
2126
+ catch {
2127
+ // Subscriber callback error isolation
2128
+ }
2129
+ }
2130
+ }
2131
+ createTurnId() {
2132
+ return `opencode-turn-${this.nextTurnOrdinal++}`;
2133
+ }
2134
+ traceOpenCode(msg, data = {}) {
2135
+ this.logger.trace({
2136
+ agentId: this.agentId,
2137
+ provider: "opencode",
2138
+ sessionId: this.sessionId,
2139
+ turnId: data.turnId ?? this.activeForegroundTurnId ?? undefined,
2140
+ ...data,
2141
+ }, msg);
2142
+ }
2143
+ async *streamHistory() {
2144
+ const response = await this.client.session.messages({
2145
+ sessionID: this.sessionId,
2146
+ directory: this.config.cwd,
2147
+ });
2148
+ if (response.error || !response.data) {
2149
+ return;
2150
+ }
2151
+ for (const message of response.data) {
2152
+ for (const event of buildOpenCodeReplayTimelineEvents(message)) {
2153
+ yield event;
2154
+ }
2155
+ }
2156
+ }
2157
+ async getAvailableModes() {
2158
+ if (this.availableModesCache) {
2159
+ return this.availableModesCache;
2160
+ }
2161
+ const response = await this.client.app.agents({
2162
+ directory: this.config.cwd,
2163
+ });
2164
+ const agents = response.error || !response.data ? [] : response.data;
2165
+ const discoveredModes = agents.filter(isSelectableOpenCodeAgent).map((agent) => ({
2166
+ id: agent.name,
2167
+ label: agent.name.charAt(0).toUpperCase() + agent.name.slice(1),
2168
+ description: typeof agent.description === "string" && agent.description.trim().length > 0
2169
+ ? agent.description.trim()
2170
+ : DEFAULT_MODES.find((mode) => mode.id === agent.name)?.description,
2171
+ }));
2172
+ this.availableModesCache = mergeOpenCodeModes(discoveredModes);
2173
+ return this.availableModesCache;
2174
+ }
2175
+ async getCurrentMode() {
2176
+ return this.currentMode;
2177
+ }
2178
+ async listCommands() {
2179
+ return await listOpenCodeCommandsFromSdk(this.client, this.config.cwd);
2180
+ }
2181
+ async setMode(modeId) {
2182
+ this.currentMode = normalizeOpenCodeModeId(modeId);
2183
+ }
2184
+ getPendingPermissions() {
2185
+ return Array.from(this.pendingPermissions.values());
2186
+ }
2187
+ async respondToPermission(requestId, response) {
2188
+ const pending = this.pendingPermissions.get(requestId);
2189
+ if (!pending) {
2190
+ throw new Error(`No pending permission request with id '${requestId}'`);
2191
+ }
2192
+ if (pending.kind === "question") {
2193
+ if (response.behavior === "deny") {
2194
+ await this.client.question.reject({
2195
+ requestID: requestId,
2196
+ directory: this.config.cwd,
2197
+ });
2198
+ }
2199
+ else {
2200
+ const answersRecord = readOpenCodeRecord(response.updatedInput?.answers);
2201
+ const questions = Array.isArray(pending.input?.questions) ? pending.input.questions : [];
2202
+ const answers = questions.map((item) => {
2203
+ const header = readNonEmptyString(readOpenCodeRecord(item)?.header);
2204
+ const rawAnswer = header ? readNonEmptyString(answersRecord?.[header]) : null;
2205
+ if (!rawAnswer) {
2206
+ return [];
2207
+ }
2208
+ return rawAnswer
2209
+ .split(",")
2210
+ .map((entry) => entry.trim())
2211
+ .filter((entry) => entry.length > 0);
2212
+ });
2213
+ await this.client.question.reply({
2214
+ requestID: requestId,
2215
+ directory: this.config.cwd,
2216
+ answers,
2217
+ });
2218
+ }
2219
+ this.pendingPermissions.delete(requestId);
2220
+ return;
2221
+ }
2222
+ const reply = response.behavior === "allow" ? "once" : "reject";
2223
+ await this.client.permission.reply({
2224
+ requestID: requestId,
2225
+ directory: this.config.cwd,
2226
+ reply,
2227
+ message: response.behavior === "deny" ? response.message : undefined,
2228
+ });
2229
+ this.pendingPermissions.delete(requestId);
2230
+ }
2231
+ describePersistence() {
2232
+ return {
2233
+ provider: "opencode",
2234
+ sessionId: this.sessionId,
2235
+ nativeHandle: this.sessionId,
2236
+ metadata: {
2237
+ cwd: this.config.cwd,
2238
+ ...(this.config.modeId ? { modeId: this.config.modeId } : {}),
2239
+ ...(this.config.model ? { model: this.config.model } : {}),
2240
+ },
2241
+ };
2242
+ }
2243
+ async close() {
2244
+ try {
2245
+ // Flip closed before clearing subscribers so any event the SDK delivers
2246
+ // after the abort (between here and subscribers.clear) is swallowed by
2247
+ // notifySubscribers instead of bubbling through provider-runner as an
2248
+ // unhandled rejection in whichever test the daemon hops to next.
2249
+ this.closed = true;
2250
+ this.abortController?.abort();
2251
+ this.eventStreamAbortController?.abort();
2252
+ this.eventStreamAbortController = null;
2253
+ this.eventStreamReady = null;
2254
+ this.subscribers.clear();
2255
+ await reconcileOpenCodeSessionClose({
2256
+ client: this.client,
2257
+ sessionId: this.sessionId,
2258
+ directory: this.config.cwd,
2259
+ logger: this.logger,
2260
+ });
2261
+ await this.deleteProviderSessionIfEphemeral();
2262
+ this.activeForegroundTurnId = null;
2263
+ }
2264
+ finally {
2265
+ this.releaseServer?.();
2266
+ this.releaseServer = null;
2267
+ }
2268
+ }
2269
+ async deleteProviderSessionIfEphemeral() {
2270
+ if (this.persistSession || this.deletedFromProvider) {
2271
+ return;
2272
+ }
2273
+ this.deletedFromProvider = true;
2274
+ try {
2275
+ const response = await this.client.session.delete({
2276
+ sessionID: this.sessionId,
2277
+ directory: this.config.cwd,
2278
+ });
2279
+ if (response.error) {
2280
+ throw new Error(`OpenCode session.delete failed: ${JSON.stringify(response.error)}`);
2281
+ }
2282
+ }
2283
+ catch (error) {
2284
+ this.logger.debug({ err: error, sessionId: this.sessionId }, "Failed to delete non-persistent OpenCode session");
2285
+ }
2286
+ }
2287
+ parseSlashCommandInput(text) {
2288
+ const trimmed = text.trim();
2289
+ if (!trimmed.startsWith("/") || trimmed.length <= 1) {
2290
+ return null;
2291
+ }
2292
+ const withoutPrefix = trimmed.slice(1);
2293
+ const firstWhitespaceIdx = withoutPrefix.search(/\s/);
2294
+ const commandName = firstWhitespaceIdx === -1 ? withoutPrefix : withoutPrefix.slice(0, firstWhitespaceIdx);
2295
+ if (!commandName || commandName.includes("/")) {
2296
+ return null;
2297
+ }
2298
+ const rawArgs = firstWhitespaceIdx === -1 ? "" : withoutPrefix.slice(firstWhitespaceIdx + 1).trim();
2299
+ return rawArgs.length > 0 ? { commandName, args: rawArgs } : { commandName };
2300
+ }
2301
+ async resolveSlashCommandInvocation(prompt) {
2302
+ if (typeof prompt !== "string") {
2303
+ return null;
2304
+ }
2305
+ const parsed = this.parseSlashCommandInput(prompt);
2306
+ if (!parsed) {
2307
+ return null;
2308
+ }
2309
+ try {
2310
+ const commands = await this.listCommands();
2311
+ return commands.some((command) => command.name === parsed.commandName) ? parsed : null;
2312
+ }
2313
+ catch (error) {
2314
+ this.logger.warn({ err: error, commandName: parsed.commandName }, "Failed to resolve slash command; falling back to plain prompt input");
2315
+ return null;
2316
+ }
2317
+ }
2318
+ parseModel(model) {
2319
+ if (!model) {
2320
+ return undefined;
2321
+ }
2322
+ const parts = model.split("/");
2323
+ if (parts.length >= 2) {
2324
+ return { providerID: parts[0], modelID: parts.slice(1).join("/") };
2325
+ }
2326
+ return { providerID: "opencode", modelID: model };
2327
+ }
2328
+ async ensureMcpServersConfigured() {
2329
+ if (this.mcpConfigured) {
2330
+ return;
2331
+ }
2332
+ const mcpServers = this.config.mcpServers;
2333
+ if (!mcpServers || Object.keys(mcpServers).length === 0) {
2334
+ this.mcpConfigured = true;
2335
+ return;
2336
+ }
2337
+ if (!this.mcpSetupPromise) {
2338
+ this.mcpSetupPromise = this.configureMcpServers(mcpServers);
2339
+ }
2340
+ try {
2341
+ await this.mcpSetupPromise;
2342
+ this.mcpConfigured = true;
2343
+ }
2344
+ catch (error) {
2345
+ this.mcpSetupPromise = null;
2346
+ throw error;
2347
+ }
2348
+ }
2349
+ async configureMcpServers(mcpServers) {
2350
+ await Promise.all(Object.entries(mcpServers).map(([name, serverConfig]) => this.registerMcpServer(name, toOpenCodeMcpConfig(serverConfig))));
2351
+ }
2352
+ async registerMcpServer(name, config) {
2353
+ await this.runMcpOperation("add", name, () => this.client.mcp.add({
2354
+ directory: this.config.cwd,
2355
+ name,
2356
+ config,
2357
+ }));
2358
+ await this.runMcpOperation("connect", name, () => this.client.mcp.connect({
2359
+ directory: this.config.cwd,
2360
+ name,
2361
+ }));
2362
+ }
2363
+ async runMcpOperation(operation, name, run) {
2364
+ const response = await run();
2365
+ const error = response.error;
2366
+ if (!error) {
2367
+ return;
2368
+ }
2369
+ if (isAlreadyPresentMcpError(error)) {
2370
+ return;
2371
+ }
2372
+ throw new Error(`Failed to ${operation} OpenCode MCP server '${name}': ${toDiagnosticErrorMessage(error)}`);
2373
+ }
2374
+ async translateEvent(event) {
2375
+ const translated = translateOpenCodeEvent(event, {
2376
+ sessionId: this.sessionId,
2377
+ cwd: this.config.cwd,
2378
+ messageRoles: this.messageRoles,
2379
+ accumulatedUsage: this.accumulatedUsage,
2380
+ streamedPartKeys: this.streamedPartKeys,
2381
+ emittedStructuredMessageIds: this.emittedStructuredMessageIds,
2382
+ partTypes: this.partTypes,
2383
+ subAgentsByCallId: this.subAgentsByCallId,
2384
+ subAgentCallIdByChildSessionId: this.subAgentCallIdByChildSessionId,
2385
+ pendingChildToolPartsBySessionId: this.pendingChildToolPartsBySessionId,
2386
+ modelContextWindowsByModelKey: this.modelContextWindowsByModelKey,
2387
+ onAssistantModelContextWindowResolved: (contextWindowMaxTokens) => {
2388
+ this.accumulatedUsage.contextWindowMaxTokens = contextWindowMaxTokens;
2389
+ if (!this.config.model) {
2390
+ this.selectedModelContextWindowMaxTokens = contextWindowMaxTokens;
2391
+ }
2392
+ },
2393
+ });
2394
+ const events = [];
2395
+ for (const translatedEvent of translated) {
2396
+ if (translatedEvent.type === "permission_requested") {
2397
+ const autoApproved = await this.tryAutoApproveToolPermission(translatedEvent.request);
2398
+ if (autoApproved) {
2399
+ continue;
2400
+ }
2401
+ this.pendingPermissions.set(translatedEvent.request.id, translatedEvent.request);
2402
+ }
2403
+ if (translatedEvent.type === "turn_completed") {
2404
+ if (hasNormalizedOpenCodeUsage(this.accumulatedUsage)) {
2405
+ translatedEvent.usage = this.accumulatedUsage;
2406
+ }
2407
+ const contextWindowMaxTokens = this.resolveSelectedModelContextWindowMaxTokens();
2408
+ this.accumulatedUsage =
2409
+ contextWindowMaxTokens !== undefined ? { contextWindowMaxTokens } : {};
2410
+ }
2411
+ events.push(translatedEvent);
2412
+ }
2413
+ return events;
2414
+ }
2415
+ async tryAutoApproveToolPermission(request) {
2416
+ if (this.currentMode !== OPENCODE_FULL_ACCESS_MODE_ID || request.kind !== "tool") {
2417
+ return false;
2418
+ }
2419
+ try {
2420
+ await this.client.permission.reply({
2421
+ requestID: request.id,
2422
+ directory: this.config.cwd,
2423
+ reply: "once",
2424
+ });
2425
+ return true;
2426
+ }
2427
+ catch (error) {
2428
+ this.logger.warn({ err: error, requestId: request.id }, "Failed to auto-approve OpenCode tool permission");
2429
+ return false;
2430
+ }
2431
+ }
2432
+ resolveSelectedModelContextWindowMaxTokens() {
2433
+ return this.selectedModelContextWindowMaxTokens;
2434
+ }
2435
+ resolveConfiguredModelContextWindowMaxTokens(modelId) {
2436
+ const modelLookupKey = parseOpenCodeModelLookupKey(modelId);
2437
+ if (!modelLookupKey) {
2438
+ return undefined;
2439
+ }
2440
+ return this.modelContextWindowsByModelKey.get(modelLookupKey);
2441
+ }
2442
+ }
2443
+ //# sourceMappingURL=opencode-agent.js.map