@getpaseo/server 0.1.2

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 (475) hide show
  1. package/.env.example +20 -0
  2. package/README.md +107 -0
  3. package/agent-prompt.md +339 -0
  4. package/dist/scripts/daemon-runner.js +32 -0
  5. package/dist/scripts/daemon-runner.js.map +1 -0
  6. package/dist/scripts/dev-runner.js +19 -0
  7. package/dist/scripts/dev-runner.js.map +1 -0
  8. package/dist/scripts/mcp-stdio-socket-bridge-cli.mjs +62 -0
  9. package/dist/scripts/supervisor.js +95 -0
  10. package/dist/scripts/supervisor.js.map +1 -0
  11. package/dist/server/client/daemon-client.d.ts +383 -0
  12. package/dist/server/client/daemon-client.d.ts.map +1 -0
  13. package/dist/server/client/daemon-client.js +2443 -0
  14. package/dist/server/client/daemon-client.js.map +1 -0
  15. package/dist/server/server/agent/activity-curator.d.ts +8 -0
  16. package/dist/server/server/agent/activity-curator.d.ts.map +1 -0
  17. package/dist/server/server/agent/activity-curator.js +228 -0
  18. package/dist/server/server/agent/activity-curator.js.map +1 -0
  19. package/dist/server/server/agent/agent-management-mcp.d.ts +34 -0
  20. package/dist/server/server/agent/agent-management-mcp.d.ts.map +1 -0
  21. package/dist/server/server/agent/agent-management-mcp.js +619 -0
  22. package/dist/server/server/agent/agent-management-mcp.js.map +1 -0
  23. package/dist/server/server/agent/agent-manager.d.ts +182 -0
  24. package/dist/server/server/agent/agent-manager.d.ts.map +1 -0
  25. package/dist/server/server/agent/agent-manager.js +1066 -0
  26. package/dist/server/server/agent/agent-manager.js.map +1 -0
  27. package/dist/server/server/agent/agent-metadata-generator.d.ts +29 -0
  28. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -0
  29. package/dist/server/server/agent/agent-metadata-generator.js +157 -0
  30. package/dist/server/server/agent/agent-metadata-generator.js.map +1 -0
  31. package/dist/server/server/agent/agent-projections.d.ts +12 -0
  32. package/dist/server/server/agent/agent-projections.d.ts.map +1 -0
  33. package/dist/server/server/agent/agent-projections.js +238 -0
  34. package/dist/server/server/agent/agent-projections.js.map +1 -0
  35. package/dist/server/server/agent/agent-response-loop.d.ts +32 -0
  36. package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -0
  37. package/dist/server/server/agent/agent-response-loop.js +224 -0
  38. package/dist/server/server/agent/agent-response-loop.js.map +1 -0
  39. package/dist/server/server/agent/agent-sdk-types.d.ts +360 -0
  40. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -0
  41. package/dist/server/server/agent/agent-sdk-types.js +2 -0
  42. package/dist/server/server/agent/agent-sdk-types.js.map +1 -0
  43. package/dist/server/server/agent/agent-storage.d.ts +187 -0
  44. package/dist/server/server/agent/agent-storage.d.ts.map +1 -0
  45. package/dist/server/server/agent/agent-storage.js +328 -0
  46. package/dist/server/server/agent/agent-storage.js.map +1 -0
  47. package/dist/server/server/agent/audio-utils.d.ts +3 -0
  48. package/dist/server/server/agent/audio-utils.d.ts.map +1 -0
  49. package/dist/server/server/agent/audio-utils.js +19 -0
  50. package/dist/server/server/agent/audio-utils.js.map +1 -0
  51. package/dist/server/server/agent/dictation-debug.d.ts +13 -0
  52. package/dist/server/server/agent/dictation-debug.d.ts.map +1 -0
  53. package/dist/server/server/agent/dictation-debug.js +50 -0
  54. package/dist/server/server/agent/dictation-debug.js.map +1 -0
  55. package/dist/server/server/agent/llm-openai.d.ts +7 -0
  56. package/dist/server/server/agent/llm-openai.d.ts.map +1 -0
  57. package/dist/server/server/agent/llm-openai.js +8 -0
  58. package/dist/server/server/agent/llm-openai.js.map +1 -0
  59. package/dist/server/server/agent/mcp-server.d.ts +26 -0
  60. package/dist/server/server/agent/mcp-server.d.ts.map +1 -0
  61. package/dist/server/server/agent/mcp-server.js +762 -0
  62. package/dist/server/server/agent/mcp-server.js.map +1 -0
  63. package/dist/server/server/agent/model-resolver.d.ts +11 -0
  64. package/dist/server/server/agent/model-resolver.d.ts.map +1 -0
  65. package/dist/server/server/agent/model-resolver.js +21 -0
  66. package/dist/server/server/agent/model-resolver.js.map +1 -0
  67. package/dist/server/server/agent/orchestrator-instructions.d.ts +7 -0
  68. package/dist/server/server/agent/orchestrator-instructions.d.ts.map +1 -0
  69. package/dist/server/server/agent/orchestrator-instructions.js +51 -0
  70. package/dist/server/server/agent/orchestrator-instructions.js.map +1 -0
  71. package/dist/server/server/agent/orchestrator.d.ts +12 -0
  72. package/dist/server/server/agent/orchestrator.d.ts.map +1 -0
  73. package/dist/server/server/agent/orchestrator.js +12 -0
  74. package/dist/server/server/agent/orchestrator.js.map +1 -0
  75. package/dist/server/server/agent/pcm16-resampler.d.ts +14 -0
  76. package/dist/server/server/agent/pcm16-resampler.d.ts.map +1 -0
  77. package/dist/server/server/agent/pcm16-resampler.js +63 -0
  78. package/dist/server/server/agent/pcm16-resampler.js.map +1 -0
  79. package/dist/server/server/agent/provider-launch-config.d.ts +139 -0
  80. package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -0
  81. package/dist/server/server/agent/provider-launch-config.js +83 -0
  82. package/dist/server/server/agent/provider-launch-config.js.map +1 -0
  83. package/dist/server/server/agent/provider-manifest.d.ts +20 -0
  84. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -0
  85. package/dist/server/server/agent/provider-manifest.js +97 -0
  86. package/dist/server/server/agent/provider-manifest.js.map +1 -0
  87. package/dist/server/server/agent/provider-registry.d.ts +18 -0
  88. package/dist/server/server/agent/provider-registry.d.ts.map +1 -0
  89. package/dist/server/server/agent/provider-registry.js +45 -0
  90. package/dist/server/server/agent/provider-registry.js.map +1 -0
  91. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts +3 -0
  92. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -0
  93. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +42 -0
  94. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -0
  95. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +16 -0
  96. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -0
  97. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +73 -0
  98. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -0
  99. package/dist/server/server/agent/providers/claude-agent.d.ts +35 -0
  100. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -0
  101. package/dist/server/server/agent/providers/claude-agent.js +2056 -0
  102. package/dist/server/server/agent/providers/claude-agent.js.map +1 -0
  103. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +13 -0
  104. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts.map +1 -0
  105. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js +67 -0
  106. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js.map +1 -0
  107. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +15 -0
  108. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -0
  109. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +640 -0
  110. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -0
  111. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +34 -0
  112. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -0
  113. package/dist/server/server/agent/providers/codex-app-server-agent.js +2476 -0
  114. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -0
  115. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts +9 -0
  116. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -0
  117. package/dist/server/server/agent/providers/codex-rollout-timeline.js +486 -0
  118. package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -0
  119. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +3 -0
  120. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts.map +1 -0
  121. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +33 -0
  122. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js.map +1 -0
  123. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +13 -0
  124. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +1 -0
  125. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +75 -0
  126. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +1 -0
  127. package/dist/server/server/agent/providers/opencode-agent.d.ts +37 -0
  128. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -0
  129. package/dist/server/server/agent/providers/opencode-agent.js +822 -0
  130. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -0
  131. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +1363 -0
  132. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -0
  133. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +534 -0
  134. package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -0
  135. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +18 -0
  136. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -0
  137. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +119 -0
  138. package/dist/server/server/agent/providers/tool-call-mapper-utils.js.map +1 -0
  139. package/dist/server/server/agent/recordings-debug.d.ts +3 -0
  140. package/dist/server/server/agent/recordings-debug.d.ts.map +1 -0
  141. package/dist/server/server/agent/recordings-debug.js +19 -0
  142. package/dist/server/server/agent/recordings-debug.js.map +1 -0
  143. package/dist/server/server/agent/stt-debug.d.ts +10 -0
  144. package/dist/server/server/agent/stt-debug.d.ts.map +1 -0
  145. package/dist/server/server/agent/stt-debug.js +33 -0
  146. package/dist/server/server/agent/stt-debug.js.map +1 -0
  147. package/dist/server/server/agent/stt-manager.d.ts +32 -0
  148. package/dist/server/server/agent/stt-manager.d.ts.map +1 -0
  149. package/dist/server/server/agent/stt-manager.js +231 -0
  150. package/dist/server/server/agent/stt-manager.js.map +1 -0
  151. package/dist/server/server/agent/system-prompt.d.ts +3 -0
  152. package/dist/server/server/agent/system-prompt.d.ts.map +1 -0
  153. package/dist/server/server/agent/system-prompt.js +19 -0
  154. package/dist/server/server/agent/system-prompt.js.map +1 -0
  155. package/dist/server/server/agent/tool-name-normalization.d.ts +7 -0
  156. package/dist/server/server/agent/tool-name-normalization.d.ts.map +1 -0
  157. package/dist/server/server/agent/tool-name-normalization.js +45 -0
  158. package/dist/server/server/agent/tool-name-normalization.js.map +1 -0
  159. package/dist/server/server/agent/tts-debug.d.ts +8 -0
  160. package/dist/server/server/agent/tts-debug.d.ts.map +1 -0
  161. package/dist/server/server/agent/tts-debug.js +24 -0
  162. package/dist/server/server/agent/tts-debug.js.map +1 -0
  163. package/dist/server/server/agent/tts-manager.d.ts +33 -0
  164. package/dist/server/server/agent/tts-manager.d.ts.map +1 -0
  165. package/dist/server/server/agent/tts-manager.js +261 -0
  166. package/dist/server/server/agent/tts-manager.js.map +1 -0
  167. package/dist/server/server/agent/wait-for-agent-tracker.d.ts +15 -0
  168. package/dist/server/server/agent/wait-for-agent-tracker.d.ts.map +1 -0
  169. package/dist/server/server/agent/wait-for-agent-tracker.js +53 -0
  170. package/dist/server/server/agent/wait-for-agent-tracker.js.map +1 -0
  171. package/dist/server/server/allowed-hosts.d.ts +13 -0
  172. package/dist/server/server/allowed-hosts.d.ts.map +1 -0
  173. package/dist/server/server/allowed-hosts.js +94 -0
  174. package/dist/server/server/allowed-hosts.js.map +1 -0
  175. package/dist/server/server/bootstrap.d.ts +49 -0
  176. package/dist/server/server/bootstrap.d.ts.map +1 -0
  177. package/dist/server/server/bootstrap.js +483 -0
  178. package/dist/server/server/bootstrap.js.map +1 -0
  179. package/dist/server/server/config.d.ts +13 -0
  180. package/dist/server/server/config.d.ts.map +1 -0
  181. package/dist/server/server/config.js +84 -0
  182. package/dist/server/server/config.js.map +1 -0
  183. package/dist/server/server/connection-offer.d.ts +19 -0
  184. package/dist/server/server/connection-offer.d.ts.map +1 -0
  185. package/dist/server/server/connection-offer.js +60 -0
  186. package/dist/server/server/connection-offer.js.map +1 -0
  187. package/dist/server/server/daemon-keypair.d.ts +8 -0
  188. package/dist/server/server/daemon-keypair.d.ts.map +1 -0
  189. package/dist/server/server/daemon-keypair.js +40 -0
  190. package/dist/server/server/daemon-keypair.js.map +1 -0
  191. package/dist/server/server/dictation/dictation-stream-manager.d.ts +76 -0
  192. package/dist/server/server/dictation/dictation-stream-manager.d.ts.map +1 -0
  193. package/dist/server/server/dictation/dictation-stream-manager.js +481 -0
  194. package/dist/server/server/dictation/dictation-stream-manager.js.map +1 -0
  195. package/dist/server/server/exports.d.ts +11 -0
  196. package/dist/server/server/exports.d.ts.map +1 -0
  197. package/dist/server/server/exports.js +11 -0
  198. package/dist/server/server/exports.js.map +1 -0
  199. package/dist/server/server/file-download/token-store.d.ts +25 -0
  200. package/dist/server/server/file-download/token-store.d.ts.map +1 -0
  201. package/dist/server/server/file-download/token-store.js +40 -0
  202. package/dist/server/server/file-download/token-store.js.map +1 -0
  203. package/dist/server/server/file-explorer/service.d.ts +41 -0
  204. package/dist/server/server/file-explorer/service.d.ts.map +1 -0
  205. package/dist/server/server/file-explorer/service.js +163 -0
  206. package/dist/server/server/file-explorer/service.js.map +1 -0
  207. package/dist/server/server/index.d.ts +2 -0
  208. package/dist/server/server/index.d.ts.map +1 -0
  209. package/dist/server/server/index.js +90 -0
  210. package/dist/server/server/index.js.map +1 -0
  211. package/dist/server/server/json-utils.d.ts +11 -0
  212. package/dist/server/server/json-utils.d.ts.map +1 -0
  213. package/dist/server/server/json-utils.js +45 -0
  214. package/dist/server/server/json-utils.js.map +1 -0
  215. package/dist/server/server/logger.d.ts +12 -0
  216. package/dist/server/server/logger.d.ts.map +1 -0
  217. package/dist/server/server/logger.js +29 -0
  218. package/dist/server/server/logger.js.map +1 -0
  219. package/dist/server/server/messages.d.ts +9 -0
  220. package/dist/server/server/messages.d.ts.map +1 -0
  221. package/dist/server/server/messages.js +29 -0
  222. package/dist/server/server/messages.js.map +1 -0
  223. package/dist/server/server/pairing-offer.d.ts +16 -0
  224. package/dist/server/server/pairing-offer.d.ts.map +1 -0
  225. package/dist/server/server/pairing-offer.js +45 -0
  226. package/dist/server/server/pairing-offer.js.map +1 -0
  227. package/dist/server/server/pairing-qr.d.ts +7 -0
  228. package/dist/server/server/pairing-qr.d.ts.map +1 -0
  229. package/dist/server/server/pairing-qr.js +45 -0
  230. package/dist/server/server/pairing-qr.js.map +1 -0
  231. package/dist/server/server/paseo-home.d.ts +2 -0
  232. package/dist/server/server/paseo-home.d.ts.map +1 -0
  233. package/dist/server/server/paseo-home.js +19 -0
  234. package/dist/server/server/paseo-home.js.map +1 -0
  235. package/dist/server/server/path-utils.d.ts +3 -0
  236. package/dist/server/server/path-utils.d.ts.map +1 -0
  237. package/dist/server/server/path-utils.js +20 -0
  238. package/dist/server/server/path-utils.js.map +1 -0
  239. package/dist/server/server/persisted-config.d.ts +500 -0
  240. package/dist/server/server/persisted-config.d.ts.map +1 -0
  241. package/dist/server/server/persisted-config.js +212 -0
  242. package/dist/server/server/persisted-config.js.map +1 -0
  243. package/dist/server/server/persistence-hooks.d.ts +24 -0
  244. package/dist/server/server/persistence-hooks.d.ts.map +1 -0
  245. package/dist/server/server/persistence-hooks.js +60 -0
  246. package/dist/server/server/persistence-hooks.js.map +1 -0
  247. package/dist/server/server/pid-lock.d.ts +19 -0
  248. package/dist/server/server/pid-lock.d.ts.map +1 -0
  249. package/dist/server/server/pid-lock.js +115 -0
  250. package/dist/server/server/pid-lock.js.map +1 -0
  251. package/dist/server/server/push/push-service.d.ts +21 -0
  252. package/dist/server/server/push/push-service.d.ts.map +1 -0
  253. package/dist/server/server/push/push-service.js +68 -0
  254. package/dist/server/server/push/push-service.js.map +1 -0
  255. package/dist/server/server/push/token-store.d.ts +18 -0
  256. package/dist/server/server/push/token-store.d.ts.map +1 -0
  257. package/dist/server/server/push/token-store.js +70 -0
  258. package/dist/server/server/push/token-store.js.map +1 -0
  259. package/dist/server/server/relay-transport.d.ts +22 -0
  260. package/dist/server/server/relay-transport.d.ts.map +1 -0
  261. package/dist/server/server/relay-transport.js +374 -0
  262. package/dist/server/server/relay-transport.js.map +1 -0
  263. package/dist/server/server/server-id.d.ts +17 -0
  264. package/dist/server/server/server-id.d.ts.map +1 -0
  265. package/dist/server/server/server-id.js +63 -0
  266. package/dist/server/server/server-id.js.map +1 -0
  267. package/dist/server/server/session.d.ts +360 -0
  268. package/dist/server/server/session.d.ts.map +1 -0
  269. package/dist/server/server/session.js +4615 -0
  270. package/dist/server/server/session.js.map +1 -0
  271. package/dist/server/server/speech/audio.d.ts +10 -0
  272. package/dist/server/server/speech/audio.d.ts.map +1 -0
  273. package/dist/server/server/speech/audio.js +101 -0
  274. package/dist/server/server/speech/audio.js.map +1 -0
  275. package/dist/server/server/speech/providers/local/config.d.ts +26 -0
  276. package/dist/server/server/speech/providers/local/config.d.ts.map +1 -0
  277. package/dist/server/server/speech/providers/local/config.js +93 -0
  278. package/dist/server/server/speech/providers/local/config.js.map +1 -0
  279. package/dist/server/server/speech/providers/local/models.d.ts +12 -0
  280. package/dist/server/server/speech/providers/local/models.d.ts.map +1 -0
  281. package/dist/server/server/speech/providers/local/models.js +18 -0
  282. package/dist/server/server/speech/providers/local/models.js.map +1 -0
  283. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts +24 -0
  284. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -0
  285. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +422 -0
  286. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -0
  287. package/dist/server/server/speech/providers/local/runtime.d.ts +30 -0
  288. package/dist/server/server/speech/providers/local/runtime.d.ts.map +1 -0
  289. package/dist/server/server/speech/providers/local/runtime.js +254 -0
  290. package/dist/server/server/speech/providers/local/runtime.js.map +1 -0
  291. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +117 -0
  292. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -0
  293. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +166 -0
  294. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -0
  295. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +17 -0
  296. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -0
  297. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +151 -0
  298. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -0
  299. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +28 -0
  300. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts.map +1 -0
  301. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +68 -0
  302. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -0
  303. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts +37 -0
  304. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts.map +1 -0
  305. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +79 -0
  306. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -0
  307. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts +7 -0
  308. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts.map +1 -0
  309. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.js +11 -0
  310. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.js.map +1 -0
  311. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +7 -0
  312. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +1 -0
  313. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +44 -0
  314. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -0
  315. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts +28 -0
  316. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts.map +1 -0
  317. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +131 -0
  318. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -0
  319. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +21 -0
  320. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts.map +1 -0
  321. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +132 -0
  322. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -0
  323. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts +23 -0
  324. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts.map +1 -0
  325. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +112 -0
  326. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -0
  327. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts +23 -0
  328. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts.map +1 -0
  329. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +140 -0
  330. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -0
  331. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +21 -0
  332. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts.map +1 -0
  333. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +95 -0
  334. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -0
  335. package/dist/server/server/speech/providers/openai/config.d.ts +22 -0
  336. package/dist/server/server/speech/providers/openai/config.d.ts.map +1 -0
  337. package/dist/server/server/speech/providers/openai/config.js +94 -0
  338. package/dist/server/server/speech/providers/openai/config.js.map +1 -0
  339. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts +42 -0
  340. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts.map +1 -0
  341. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +165 -0
  342. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js.map +1 -0
  343. package/dist/server/server/speech/providers/openai/runtime.d.ts +27 -0
  344. package/dist/server/server/speech/providers/openai/runtime.d.ts.map +1 -0
  345. package/dist/server/server/speech/providers/openai/runtime.js +103 -0
  346. package/dist/server/server/speech/providers/openai/runtime.js.map +1 -0
  347. package/dist/server/server/speech/providers/openai/stt.d.ts +22 -0
  348. package/dist/server/server/speech/providers/openai/stt.d.ts.map +1 -0
  349. package/dist/server/server/speech/providers/openai/stt.js +208 -0
  350. package/dist/server/server/speech/providers/openai/stt.js.map +1 -0
  351. package/dist/server/server/speech/providers/openai/tts.d.ts +18 -0
  352. package/dist/server/server/speech/providers/openai/tts.d.ts.map +1 -0
  353. package/dist/server/server/speech/providers/openai/tts.js +46 -0
  354. package/dist/server/server/speech/providers/openai/tts.js.map +1 -0
  355. package/dist/server/server/speech/speech-config-resolver.d.ts +11 -0
  356. package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -0
  357. package/dist/server/server/speech/speech-config-resolver.js +64 -0
  358. package/dist/server/server/speech/speech-config-resolver.js.map +1 -0
  359. package/dist/server/server/speech/speech-provider.d.ts +59 -0
  360. package/dist/server/server/speech/speech-provider.d.ts.map +1 -0
  361. package/dist/server/server/speech/speech-provider.js +2 -0
  362. package/dist/server/server/speech/speech-provider.js.map +1 -0
  363. package/dist/server/server/speech/speech-runtime.d.ts +20 -0
  364. package/dist/server/server/speech/speech-runtime.d.ts.map +1 -0
  365. package/dist/server/server/speech/speech-runtime.js +119 -0
  366. package/dist/server/server/speech/speech-runtime.js.map +1 -0
  367. package/dist/server/server/speech/speech-types.d.ts +20 -0
  368. package/dist/server/server/speech/speech-types.d.ts.map +1 -0
  369. package/dist/server/server/speech/speech-types.js +7 -0
  370. package/dist/server/server/speech/speech-types.js.map +1 -0
  371. package/dist/server/server/terminal-mcp/index.d.ts +4 -0
  372. package/dist/server/server/terminal-mcp/index.d.ts.map +1 -0
  373. package/dist/server/server/terminal-mcp/index.js +3 -0
  374. package/dist/server/server/terminal-mcp/index.js.map +1 -0
  375. package/dist/server/server/terminal-mcp/server.d.ts +10 -0
  376. package/dist/server/server/terminal-mcp/server.d.ts.map +1 -0
  377. package/dist/server/server/terminal-mcp/server.js +217 -0
  378. package/dist/server/server/terminal-mcp/server.js.map +1 -0
  379. package/dist/server/server/terminal-mcp/terminal-manager.d.ts +123 -0
  380. package/dist/server/server/terminal-mcp/terminal-manager.d.ts.map +1 -0
  381. package/dist/server/server/terminal-mcp/terminal-manager.js +351 -0
  382. package/dist/server/server/terminal-mcp/terminal-manager.js.map +1 -0
  383. package/dist/server/server/terminal-mcp/tmux.d.ts +207 -0
  384. package/dist/server/server/terminal-mcp/tmux.d.ts.map +1 -0
  385. package/dist/server/server/terminal-mcp/tmux.js +924 -0
  386. package/dist/server/server/terminal-mcp/tmux.js.map +1 -0
  387. package/dist/server/server/types.d.ts +5 -0
  388. package/dist/server/server/types.d.ts.map +1 -0
  389. package/dist/server/server/types.js +3 -0
  390. package/dist/server/server/types.js.map +1 -0
  391. package/dist/server/server/utils/diff-highlighter.d.ts +52 -0
  392. package/dist/server/server/utils/diff-highlighter.d.ts.map +1 -0
  393. package/dist/server/server/utils/diff-highlighter.js +244 -0
  394. package/dist/server/server/utils/diff-highlighter.js.map +1 -0
  395. package/dist/server/server/utils/syntax-highlighter.d.ts +10 -0
  396. package/dist/server/server/utils/syntax-highlighter.d.ts.map +1 -0
  397. package/dist/server/server/utils/syntax-highlighter.js +141 -0
  398. package/dist/server/server/utils/syntax-highlighter.js.map +1 -0
  399. package/dist/server/server/voice-config.d.ts +14 -0
  400. package/dist/server/server/voice-config.d.ts.map +1 -0
  401. package/dist/server/server/voice-config.js +51 -0
  402. package/dist/server/server/voice-config.js.map +1 -0
  403. package/dist/server/server/voice-mcp-bridge-command.d.ts +17 -0
  404. package/dist/server/server/voice-mcp-bridge-command.d.ts.map +1 -0
  405. package/dist/server/server/voice-mcp-bridge-command.js +31 -0
  406. package/dist/server/server/voice-mcp-bridge-command.js.map +1 -0
  407. package/dist/server/server/voice-mcp-bridge.d.ts +18 -0
  408. package/dist/server/server/voice-mcp-bridge.d.ts.map +1 -0
  409. package/dist/server/server/voice-mcp-bridge.js +109 -0
  410. package/dist/server/server/voice-mcp-bridge.js.map +1 -0
  411. package/dist/server/server/voice-permission-policy.d.ts +4 -0
  412. package/dist/server/server/voice-permission-policy.d.ts.map +1 -0
  413. package/dist/server/server/voice-permission-policy.js +13 -0
  414. package/dist/server/server/voice-permission-policy.js.map +1 -0
  415. package/dist/server/server/voice-types.d.ts +17 -0
  416. package/dist/server/server/voice-types.d.ts.map +1 -0
  417. package/dist/server/server/voice-types.js +2 -0
  418. package/dist/server/server/voice-types.js.map +1 -0
  419. package/dist/server/server/websocket-server.d.ts +80 -0
  420. package/dist/server/server/websocket-server.d.ts.map +1 -0
  421. package/dist/server/server/websocket-server.js +447 -0
  422. package/dist/server/server/websocket-server.js.map +1 -0
  423. package/dist/server/shared/agent-lifecycle.d.ts +3 -0
  424. package/dist/server/shared/agent-lifecycle.d.ts.map +1 -0
  425. package/dist/server/shared/agent-lifecycle.js +8 -0
  426. package/dist/server/shared/agent-lifecycle.js.map +1 -0
  427. package/dist/server/shared/connection-offer.d.ts +62 -0
  428. package/dist/server/shared/connection-offer.d.ts.map +1 -0
  429. package/dist/server/shared/connection-offer.js +17 -0
  430. package/dist/server/shared/connection-offer.js.map +1 -0
  431. package/dist/server/shared/daemon-endpoints.d.ts +19 -0
  432. package/dist/server/shared/daemon-endpoints.d.ts.map +1 -0
  433. package/dist/server/shared/daemon-endpoints.js +98 -0
  434. package/dist/server/shared/daemon-endpoints.js.map +1 -0
  435. package/dist/server/shared/messages.d.ts +36729 -0
  436. package/dist/server/shared/messages.d.ts.map +1 -0
  437. package/dist/server/shared/messages.js +1666 -0
  438. package/dist/server/shared/messages.js.map +1 -0
  439. package/dist/server/shared/path-utils.d.ts +2 -0
  440. package/dist/server/shared/path-utils.d.ts.map +1 -0
  441. package/dist/server/shared/path-utils.js +16 -0
  442. package/dist/server/shared/path-utils.js.map +1 -0
  443. package/dist/server/shared/tool-call-display.d.ts +11 -0
  444. package/dist/server/shared/tool-call-display.d.ts.map +1 -0
  445. package/dist/server/shared/tool-call-display.js +82 -0
  446. package/dist/server/shared/tool-call-display.js.map +1 -0
  447. package/dist/server/terminal/terminal-manager.d.ts +14 -0
  448. package/dist/server/terminal/terminal-manager.d.ts.map +1 -0
  449. package/dist/server/terminal/terminal-manager.js +67 -0
  450. package/dist/server/terminal/terminal-manager.js.map +1 -0
  451. package/dist/server/terminal/terminal.d.ts +67 -0
  452. package/dist/server/terminal/terminal.d.ts.map +1 -0
  453. package/dist/server/terminal/terminal.js +190 -0
  454. package/dist/server/terminal/terminal.js.map +1 -0
  455. package/dist/server/utils/checkout-git.d.ts +138 -0
  456. package/dist/server/utils/checkout-git.d.ts.map +1 -0
  457. package/dist/server/utils/checkout-git.js +1079 -0
  458. package/dist/server/utils/checkout-git.js.map +1 -0
  459. package/dist/server/utils/path.d.ts +5 -0
  460. package/dist/server/utils/path.d.ts.map +1 -0
  461. package/dist/server/utils/path.js +15 -0
  462. package/dist/server/utils/path.js.map +1 -0
  463. package/dist/server/utils/project-icon.d.ts +39 -0
  464. package/dist/server/utils/project-icon.d.ts.map +1 -0
  465. package/dist/server/utils/project-icon.js +391 -0
  466. package/dist/server/utils/project-icon.js.map +1 -0
  467. package/dist/server/utils/worktree-metadata.d.ts +21 -0
  468. package/dist/server/utils/worktree-metadata.d.ts.map +1 -0
  469. package/dist/server/utils/worktree-metadata.js +74 -0
  470. package/dist/server/utils/worktree-metadata.js.map +1 -0
  471. package/dist/server/utils/worktree.d.ts +95 -0
  472. package/dist/server/utils/worktree.d.ts.map +1 -0
  473. package/dist/server/utils/worktree.js +568 -0
  474. package/dist/server/utils/worktree.js.map +1 -0
  475. package/package.json +108 -0
@@ -0,0 +1,822 @@
1
+ import { execSync, spawn } from "node:child_process";
2
+ import { createOpencodeClient } from "@opencode-ai/sdk/v2/client";
3
+ import net from "node:net";
4
+ import { applyProviderEnv, isProviderCommandAvailable, resolveProviderCommandPrefix, } from "../provider-launch-config.js";
5
+ import { mapOpencodeToolCall } from "./opencode/tool-call-mapper.js";
6
+ const OPENCODE_CAPABILITIES = {
7
+ supportsStreaming: true,
8
+ supportsSessionPersistence: true,
9
+ supportsDynamicModes: false,
10
+ supportsMcpServers: true,
11
+ supportsReasoningStream: true,
12
+ supportsToolInvocations: true,
13
+ };
14
+ const DEFAULT_MODES = [
15
+ {
16
+ id: "default",
17
+ label: "Default",
18
+ description: "Standard permission rules",
19
+ },
20
+ ];
21
+ const MCP_ALREADY_PRESENT_ERROR_TOKENS = ["already", "exists", "connected"];
22
+ function resolveOpenCodeBinary() {
23
+ try {
24
+ const opencodePath = execSync("which opencode", { encoding: "utf8" }).trim();
25
+ if (opencodePath) {
26
+ return opencodePath;
27
+ }
28
+ }
29
+ catch {
30
+ // fall through
31
+ }
32
+ throw new Error("OpenCode CLI not found. Please install opencode globally so Paseo can launch the provider.");
33
+ }
34
+ function toOpenCodeMcpConfig(config) {
35
+ if (config.type === "stdio") {
36
+ return {
37
+ type: "local",
38
+ command: [config.command, ...(config.args ?? [])],
39
+ ...(config.env ? { environment: config.env } : {}),
40
+ enabled: true,
41
+ };
42
+ }
43
+ return {
44
+ type: "remote",
45
+ url: config.url,
46
+ ...(config.headers ? { headers: config.headers } : {}),
47
+ enabled: true,
48
+ };
49
+ }
50
+ function stringifyUnknownError(error) {
51
+ if (typeof error === "string") {
52
+ return error;
53
+ }
54
+ try {
55
+ return JSON.stringify(error);
56
+ }
57
+ catch {
58
+ return String(error);
59
+ }
60
+ }
61
+ function isAlreadyPresentMcpError(error) {
62
+ const normalized = stringifyUnknownError(error).toLowerCase();
63
+ return MCP_ALREADY_PRESENT_ERROR_TOKENS.some((token) => normalized.includes(token));
64
+ }
65
+ async function findAvailablePort() {
66
+ return new Promise((resolve, reject) => {
67
+ const server = net.createServer();
68
+ server.listen(0, () => {
69
+ const address = server.address();
70
+ if (address && typeof address === "object") {
71
+ const port = address.port;
72
+ server.close(() => resolve(port));
73
+ }
74
+ else {
75
+ server.close(() => reject(new Error("Failed to get port")));
76
+ }
77
+ });
78
+ server.on("error", reject);
79
+ });
80
+ }
81
+ export class OpenCodeServerManager {
82
+ constructor(logger, runtimeSettings) {
83
+ this.server = null;
84
+ this.port = null;
85
+ this.startPromise = null;
86
+ this.logger = logger;
87
+ this.runtimeSettings = runtimeSettings;
88
+ this.runtimeSettingsKey = JSON.stringify(runtimeSettings ?? {});
89
+ }
90
+ static getInstance(logger, runtimeSettings) {
91
+ const nextSettingsKey = JSON.stringify(runtimeSettings ?? {});
92
+ if (!OpenCodeServerManager.instance) {
93
+ OpenCodeServerManager.instance = new OpenCodeServerManager(logger, runtimeSettings);
94
+ OpenCodeServerManager.registerExitHandler();
95
+ }
96
+ else if (OpenCodeServerManager.instance.runtimeSettingsKey !== nextSettingsKey) {
97
+ logger.warn({
98
+ existingRuntimeSettings: OpenCodeServerManager.instance.runtimeSettingsKey,
99
+ requestedRuntimeSettings: nextSettingsKey,
100
+ }, "OpenCode server manager already initialized with different runtime settings");
101
+ }
102
+ return OpenCodeServerManager.instance;
103
+ }
104
+ static registerExitHandler() {
105
+ if (OpenCodeServerManager.exitHandlerRegistered) {
106
+ return;
107
+ }
108
+ OpenCodeServerManager.exitHandlerRegistered = true;
109
+ const cleanup = () => {
110
+ const instance = OpenCodeServerManager.instance;
111
+ if (instance?.server && !instance.server.killed) {
112
+ instance.server.kill("SIGTERM");
113
+ }
114
+ };
115
+ process.on("exit", cleanup);
116
+ process.on("SIGTERM", cleanup);
117
+ process.on("SIGINT", cleanup);
118
+ }
119
+ async ensureRunning() {
120
+ if (this.startPromise) {
121
+ return this.startPromise;
122
+ }
123
+ if (this.server && this.port && !this.server.killed) {
124
+ return { port: this.port, url: `http://127.0.0.1:${this.port}` };
125
+ }
126
+ this.startPromise = this.startServer();
127
+ try {
128
+ const result = await this.startPromise;
129
+ return result;
130
+ }
131
+ finally {
132
+ this.startPromise = null;
133
+ }
134
+ }
135
+ async startServer() {
136
+ this.port = await findAvailablePort();
137
+ const url = `http://127.0.0.1:${this.port}`;
138
+ const launchPrefix = resolveProviderCommandPrefix(this.runtimeSettings?.command, resolveOpenCodeBinary);
139
+ return new Promise((resolve, reject) => {
140
+ this.server = spawn(launchPrefix.command, [...launchPrefix.args, "serve", "--port", String(this.port)], {
141
+ stdio: ["ignore", "pipe", "pipe"],
142
+ env: applyProviderEnv(process.env, this.runtimeSettings),
143
+ });
144
+ let started = false;
145
+ const timeout = setTimeout(() => {
146
+ if (!started) {
147
+ reject(new Error("OpenCode server startup timeout"));
148
+ }
149
+ }, 30000);
150
+ this.server.stdout?.on("data", (data) => {
151
+ const output = data.toString();
152
+ if (output.includes("listening on") && !started) {
153
+ started = true;
154
+ clearTimeout(timeout);
155
+ resolve({ port: this.port, url });
156
+ }
157
+ });
158
+ this.server.stderr?.on("data", (data) => {
159
+ this.logger.error({ stderr: data.toString().trim() }, "OpenCode server stderr");
160
+ });
161
+ this.server.on("error", (error) => {
162
+ clearTimeout(timeout);
163
+ reject(error);
164
+ });
165
+ this.server.on("exit", (code) => {
166
+ if (!started) {
167
+ clearTimeout(timeout);
168
+ reject(new Error(`OpenCode server exited with code ${code}`));
169
+ }
170
+ this.server = null;
171
+ this.port = null;
172
+ });
173
+ });
174
+ }
175
+ async shutdown() {
176
+ if (this.server && !this.server.killed) {
177
+ this.server.kill("SIGTERM");
178
+ await new Promise((resolve) => {
179
+ const timeout = setTimeout(() => {
180
+ this.server?.kill("SIGKILL");
181
+ resolve();
182
+ }, 5000);
183
+ this.server?.on("exit", () => {
184
+ clearTimeout(timeout);
185
+ resolve();
186
+ });
187
+ });
188
+ }
189
+ this.server = null;
190
+ this.port = null;
191
+ }
192
+ }
193
+ OpenCodeServerManager.instance = null;
194
+ OpenCodeServerManager.exitHandlerRegistered = false;
195
+ export class OpenCodeAgentClient {
196
+ constructor(logger, runtimeSettings) {
197
+ this.provider = "opencode";
198
+ this.capabilities = OPENCODE_CAPABILITIES;
199
+ this.logger = logger.child({ module: "agent", provider: "opencode" });
200
+ this.runtimeSettings = runtimeSettings;
201
+ this.serverManager = OpenCodeServerManager.getInstance(this.logger, runtimeSettings);
202
+ }
203
+ async createSession(config) {
204
+ const openCodeConfig = this.assertConfig(config);
205
+ const { url } = await this.serverManager.ensureRunning();
206
+ const client = createOpencodeClient({
207
+ baseUrl: url,
208
+ directory: openCodeConfig.cwd,
209
+ });
210
+ // Set a timeout for session creation to fail fast
211
+ const timeoutPromise = new Promise((_, reject) => {
212
+ setTimeout(() => reject(new Error("OpenCode session.create timed out after 10s")), 10000);
213
+ });
214
+ const response = await Promise.race([
215
+ client.session.create({ directory: openCodeConfig.cwd }),
216
+ timeoutPromise,
217
+ ]);
218
+ if (response.error) {
219
+ throw new Error(`Failed to create OpenCode session: ${JSON.stringify(response.error)}`);
220
+ }
221
+ const session = response.data;
222
+ if (!session) {
223
+ throw new Error("OpenCode session creation returned no data");
224
+ }
225
+ return new OpenCodeAgentSession(openCodeConfig, client, session.id);
226
+ }
227
+ async resumeSession(handle, overrides) {
228
+ const cwd = overrides?.cwd ?? handle.metadata?.cwd;
229
+ if (!cwd) {
230
+ throw new Error("OpenCode resume requires the original working directory");
231
+ }
232
+ const config = {
233
+ provider: "opencode",
234
+ cwd,
235
+ ...overrides,
236
+ };
237
+ const openCodeConfig = this.assertConfig(config);
238
+ const { url } = await this.serverManager.ensureRunning();
239
+ const client = createOpencodeClient({
240
+ baseUrl: url,
241
+ directory: openCodeConfig.cwd,
242
+ });
243
+ return new OpenCodeAgentSession(openCodeConfig, client, handle.sessionId);
244
+ }
245
+ async listModels(options) {
246
+ const { url } = await this.serverManager.ensureRunning();
247
+ const client = createOpencodeClient({
248
+ baseUrl: url,
249
+ directory: options?.cwd ?? process.cwd(),
250
+ });
251
+ // Set a timeout for the API call to fail fast if OpenCode isn't responding
252
+ const timeoutPromise = new Promise((_, reject) => {
253
+ setTimeout(() => reject(new Error("OpenCode provider.list timed out after 10s - server may not be authenticated or connected to any providers")), 10000);
254
+ });
255
+ const response = await Promise.race([
256
+ client.provider.list({ directory: options?.cwd ?? process.cwd() }),
257
+ timeoutPromise,
258
+ ]);
259
+ if (response.error) {
260
+ throw new Error(`Failed to fetch OpenCode providers: ${JSON.stringify(response.error)}`);
261
+ }
262
+ const providers = response.data;
263
+ if (!providers) {
264
+ return [];
265
+ }
266
+ // Only include models from connected providers (ones that are actually available)
267
+ const connectedProviderIds = new Set(providers.connected);
268
+ // Fail fast if no providers are connected
269
+ if (connectedProviderIds.size === 0) {
270
+ throw new Error("OpenCode has no connected providers. Please authenticate with at least one provider (e.g., openai, anthropic) or set appropriate environment variables (e.g., OPENAI_API_KEY).");
271
+ }
272
+ const models = [];
273
+ for (const provider of providers.all) {
274
+ // Skip providers that aren't connected/configured
275
+ if (!connectedProviderIds.has(provider.id)) {
276
+ continue;
277
+ }
278
+ for (const [modelId, model] of Object.entries(provider.models)) {
279
+ const rawVariants = model.variants ? Object.keys(model.variants) : [];
280
+ const thinkingOptions = [
281
+ { id: "default", label: "Model default", isDefault: true },
282
+ ...rawVariants.map((id) => ({ id, label: id })),
283
+ ];
284
+ models.push({
285
+ provider: "opencode",
286
+ id: `${provider.id}/${modelId}`,
287
+ label: model.name,
288
+ description: `${provider.name} - ${model.family ?? ""}`.trim(),
289
+ thinkingOptions: thinkingOptions.length > 1 ? thinkingOptions : undefined,
290
+ defaultThinkingOptionId: "default",
291
+ metadata: {
292
+ providerId: provider.id,
293
+ providerName: provider.name,
294
+ modelId,
295
+ family: model.family,
296
+ releaseDate: model.release_date,
297
+ supportsAttachments: model.attachment,
298
+ supportsReasoning: model.reasoning,
299
+ supportsToolCall: model.tool_call,
300
+ cost: model.cost,
301
+ },
302
+ });
303
+ }
304
+ }
305
+ return models;
306
+ }
307
+ async listPersistedAgents(_options) {
308
+ // TODO: Implement by listing sessions from OpenCode
309
+ return [];
310
+ }
311
+ async isAvailable() {
312
+ return isProviderCommandAvailable(this.runtimeSettings?.command, resolveOpenCodeBinary);
313
+ }
314
+ assertConfig(config) {
315
+ if (config.provider !== "opencode") {
316
+ throw new Error(`OpenCodeAgentClient received config for provider '${config.provider}'`);
317
+ }
318
+ return { ...config, provider: "opencode" };
319
+ }
320
+ }
321
+ class OpenCodeAgentSession {
322
+ constructor(config, client, sessionId) {
323
+ this.provider = "opencode";
324
+ this.capabilities = OPENCODE_CAPABILITIES;
325
+ this.currentMode = "default";
326
+ this.pendingPermissions = new Map();
327
+ this.abortController = null;
328
+ this.accumulatedUsage = {};
329
+ this.mcpConfigured = false;
330
+ this.mcpSetupPromise = null;
331
+ /** Tracks the role of each message by ID to distinguish user from assistant messages */
332
+ this.messageRoles = new Map();
333
+ this.config = config;
334
+ this.client = client;
335
+ this.sessionId = sessionId;
336
+ }
337
+ get id() {
338
+ return this.sessionId;
339
+ }
340
+ async getRuntimeInfo() {
341
+ return {
342
+ provider: "opencode",
343
+ sessionId: this.sessionId,
344
+ model: this.config.model ?? null,
345
+ modeId: this.currentMode,
346
+ };
347
+ }
348
+ async setModel(modelId) {
349
+ const normalizedModelId = typeof modelId === "string" && modelId.trim().length > 0 ? modelId : null;
350
+ this.config.model = normalizedModelId ?? undefined;
351
+ }
352
+ async setThinkingOption(thinkingOptionId) {
353
+ const normalizedThinkingOptionId = typeof thinkingOptionId === "string" && thinkingOptionId.trim().length > 0
354
+ ? thinkingOptionId
355
+ : null;
356
+ this.config.thinkingOptionId = normalizedThinkingOptionId ?? undefined;
357
+ }
358
+ async run(prompt, _options) {
359
+ const events = this.stream(prompt);
360
+ const timeline = [];
361
+ let finalText = "";
362
+ let usage;
363
+ for await (const event of events) {
364
+ if (event.type === "timeline") {
365
+ timeline.push(event.item);
366
+ if (event.item.type === "assistant_message") {
367
+ finalText = event.item.text;
368
+ }
369
+ }
370
+ else if (event.type === "turn_completed") {
371
+ usage = event.usage;
372
+ }
373
+ else if (event.type === "turn_failed") {
374
+ throw new Error(event.error);
375
+ }
376
+ }
377
+ return {
378
+ sessionId: this.sessionId,
379
+ finalText,
380
+ usage,
381
+ timeline,
382
+ };
383
+ }
384
+ async *stream(prompt, _options) {
385
+ this.abortController = new AbortController();
386
+ await this.ensureMcpServersConfigured();
387
+ const parts = this.buildPromptParts(prompt);
388
+ const model = this.parseModel(this.config.model);
389
+ const thinkingOptionId = this.config.thinkingOptionId;
390
+ const effectiveVariant = thinkingOptionId && thinkingOptionId !== "default" ? thinkingOptionId : undefined;
391
+ // Send prompt asynchronously
392
+ const promptResponse = await this.client.session.promptAsync({
393
+ sessionID: this.sessionId,
394
+ directory: this.config.cwd,
395
+ parts,
396
+ ...(this.config.systemPrompt ? { system: this.config.systemPrompt } : {}),
397
+ ...(model ? { model } : {}),
398
+ ...(effectiveVariant ? { variant: effectiveVariant } : {}),
399
+ });
400
+ if (promptResponse.error) {
401
+ yield {
402
+ type: "turn_failed",
403
+ provider: "opencode",
404
+ error: JSON.stringify(promptResponse.error),
405
+ };
406
+ return;
407
+ }
408
+ // Subscribe to events
409
+ const eventsResult = await this.client.event.subscribe({
410
+ directory: this.config.cwd,
411
+ });
412
+ try {
413
+ for await (const event of eventsResult.stream) {
414
+ if (this.abortController.signal.aborted) {
415
+ break;
416
+ }
417
+ const translated = this.translateEvent(event);
418
+ for (const e of translated) {
419
+ yield e;
420
+ if (e.type === "turn_completed" || e.type === "turn_failed") {
421
+ return;
422
+ }
423
+ }
424
+ }
425
+ }
426
+ catch (error) {
427
+ if (!this.abortController.signal.aborted) {
428
+ yield {
429
+ type: "turn_failed",
430
+ provider: "opencode",
431
+ error: error instanceof Error ? error.message : "Stream error",
432
+ };
433
+ }
434
+ }
435
+ }
436
+ async interrupt() {
437
+ this.abortController?.abort();
438
+ await this.client.session.abort({
439
+ sessionID: this.sessionId,
440
+ directory: this.config.cwd,
441
+ });
442
+ }
443
+ async *streamHistory() {
444
+ const response = await this.client.session.messages({
445
+ sessionID: this.sessionId,
446
+ directory: this.config.cwd,
447
+ });
448
+ if (response.error || !response.data) {
449
+ return;
450
+ }
451
+ const messages = response.data;
452
+ for (const message of messages) {
453
+ const { info, parts } = message;
454
+ const role = info.role;
455
+ if (role === "user") {
456
+ // Extract user message text from parts
457
+ const textParts = parts.filter((p) => p.type === "text");
458
+ const text = textParts
459
+ .map((p) => p.text ?? "")
460
+ .join("");
461
+ if (text) {
462
+ yield {
463
+ type: "timeline",
464
+ provider: "opencode",
465
+ item: { type: "user_message", text },
466
+ };
467
+ }
468
+ }
469
+ else if (role === "assistant") {
470
+ // Process each part
471
+ for (const part of parts) {
472
+ const partType = part.type;
473
+ if (partType === "text") {
474
+ const text = part.text;
475
+ if (text) {
476
+ yield {
477
+ type: "timeline",
478
+ provider: "opencode",
479
+ item: { type: "assistant_message", text },
480
+ };
481
+ }
482
+ }
483
+ else if (partType === "reasoning") {
484
+ const text = part.text;
485
+ if (text) {
486
+ yield {
487
+ type: "timeline",
488
+ provider: "opencode",
489
+ item: { type: "reasoning", text },
490
+ };
491
+ }
492
+ }
493
+ else if (partType === "tool") {
494
+ const toolPart = part;
495
+ const toolName = toolPart.tool;
496
+ const state = toolPart.state;
497
+ if (toolName) {
498
+ yield {
499
+ type: "timeline",
500
+ provider: "opencode",
501
+ item: mapOpencodeToolCall({
502
+ toolName,
503
+ callId: toolPart.callID ?? toolPart.id,
504
+ status: state?.status,
505
+ input: state?.input,
506
+ output: state?.output,
507
+ error: state?.error,
508
+ }),
509
+ };
510
+ }
511
+ }
512
+ }
513
+ }
514
+ }
515
+ }
516
+ async getAvailableModes() {
517
+ return DEFAULT_MODES;
518
+ }
519
+ async getCurrentMode() {
520
+ return this.currentMode;
521
+ }
522
+ async setMode(modeId) {
523
+ this.currentMode = modeId;
524
+ }
525
+ getPendingPermissions() {
526
+ return Array.from(this.pendingPermissions.values());
527
+ }
528
+ async respondToPermission(requestId, response) {
529
+ const pending = this.pendingPermissions.get(requestId);
530
+ if (!pending) {
531
+ throw new Error(`No pending permission request with id '${requestId}'`);
532
+ }
533
+ const reply = response.behavior === "allow" ? "once" : "reject";
534
+ await this.client.permission.reply({
535
+ requestID: requestId,
536
+ directory: this.config.cwd,
537
+ reply,
538
+ message: response.behavior === "deny" ? response.message : undefined,
539
+ });
540
+ this.pendingPermissions.delete(requestId);
541
+ }
542
+ describePersistence() {
543
+ return {
544
+ provider: "opencode",
545
+ sessionId: this.sessionId,
546
+ nativeHandle: this.sessionId,
547
+ metadata: {
548
+ cwd: this.config.cwd,
549
+ },
550
+ };
551
+ }
552
+ async close() {
553
+ this.abortController?.abort();
554
+ }
555
+ buildPromptParts(prompt) {
556
+ if (typeof prompt === "string") {
557
+ return [{ type: "text", text: prompt }];
558
+ }
559
+ return prompt
560
+ .filter((p) => p.type === "text")
561
+ .map((p) => ({ type: "text", text: p.text }));
562
+ }
563
+ parseModel(model) {
564
+ if (!model) {
565
+ return undefined;
566
+ }
567
+ const parts = model.split("/");
568
+ if (parts.length >= 2) {
569
+ return { providerID: parts[0], modelID: parts.slice(1).join("/") };
570
+ }
571
+ return { providerID: "opencode", modelID: model };
572
+ }
573
+ async ensureMcpServersConfigured() {
574
+ if (this.mcpConfigured) {
575
+ return;
576
+ }
577
+ const mcpServers = this.config.mcpServers;
578
+ if (!mcpServers || Object.keys(mcpServers).length === 0) {
579
+ this.mcpConfigured = true;
580
+ return;
581
+ }
582
+ if (!this.mcpSetupPromise) {
583
+ this.mcpSetupPromise = this.configureMcpServers(mcpServers);
584
+ }
585
+ try {
586
+ await this.mcpSetupPromise;
587
+ this.mcpConfigured = true;
588
+ }
589
+ catch (error) {
590
+ this.mcpSetupPromise = null;
591
+ throw error;
592
+ }
593
+ }
594
+ async configureMcpServers(mcpServers) {
595
+ for (const [name, serverConfig] of Object.entries(mcpServers)) {
596
+ const mappedConfig = toOpenCodeMcpConfig(serverConfig);
597
+ await this.registerMcpServer(name, mappedConfig);
598
+ }
599
+ }
600
+ async registerMcpServer(name, config) {
601
+ await this.runMcpOperation("add", name, () => this.client.mcp.add({
602
+ directory: this.config.cwd,
603
+ name,
604
+ config,
605
+ }));
606
+ await this.runMcpOperation("connect", name, () => this.client.mcp.connect({
607
+ directory: this.config.cwd,
608
+ name,
609
+ }));
610
+ }
611
+ async runMcpOperation(operation, name, run) {
612
+ const response = await run();
613
+ const error = response.error;
614
+ if (!error) {
615
+ return;
616
+ }
617
+ if (isAlreadyPresentMcpError(error)) {
618
+ return;
619
+ }
620
+ throw new Error(`Failed to ${operation} OpenCode MCP server '${name}': ${stringifyUnknownError(error)}`);
621
+ }
622
+ translateEvent(event) {
623
+ const events = [];
624
+ if (!event || typeof event !== "object") {
625
+ return events;
626
+ }
627
+ const e = event;
628
+ const type = e.type;
629
+ const props = e.properties ?? {};
630
+ switch (type) {
631
+ case "session.created":
632
+ case "session.updated": {
633
+ const sessionId = props.id;
634
+ if (sessionId === this.sessionId) {
635
+ events.push({
636
+ type: "thread_started",
637
+ sessionId: this.sessionId,
638
+ provider: "opencode",
639
+ });
640
+ }
641
+ break;
642
+ }
643
+ case "message.updated": {
644
+ // Track message roles by ID so we can distinguish user from assistant parts
645
+ const info = props.info;
646
+ if (!info) {
647
+ break;
648
+ }
649
+ const messageId = info.id;
650
+ const messageSessionId = info.sessionID;
651
+ const role = info.role;
652
+ if (messageId && messageSessionId === this.sessionId && role) {
653
+ this.messageRoles.set(messageId, role);
654
+ }
655
+ break;
656
+ }
657
+ case "message.part.updated": {
658
+ // Structure: { part: { id, sessionID, messageID, type, text?, ... }, delta?: string }
659
+ const part = props.part;
660
+ const delta = props.delta;
661
+ if (!part) {
662
+ break;
663
+ }
664
+ const partSessionId = part.sessionID;
665
+ if (partSessionId !== this.sessionId) {
666
+ break;
667
+ }
668
+ const messageId = part.messageID;
669
+ const messageRole = messageId ? this.messageRoles.get(messageId) : undefined;
670
+ const partType = part.type;
671
+ const partTime = part.time;
672
+ if (partType === "text") {
673
+ // Skip user messages - agent-manager emits user_message via recordUserMessage
674
+ if (messageRole === "user") {
675
+ break;
676
+ }
677
+ // Skip if role unknown AND no delta (likely user message before role is known)
678
+ if (!messageRole && !delta) {
679
+ break;
680
+ }
681
+ // Emit delta for streaming, or full text only when complete (has time.end)
682
+ if (delta) {
683
+ events.push({
684
+ type: "timeline",
685
+ provider: "opencode",
686
+ item: { type: "assistant_message", text: delta },
687
+ });
688
+ }
689
+ else if (partTime?.end) {
690
+ // Final complete text - only emit if we haven't been streaming deltas
691
+ // (In practice, if delta was present, we've already streamed it all)
692
+ const text = part.text;
693
+ if (text) {
694
+ events.push({
695
+ type: "timeline",
696
+ provider: "opencode",
697
+ item: { type: "assistant_message", text },
698
+ });
699
+ }
700
+ }
701
+ }
702
+ else if (partType === "reasoning") {
703
+ // Emit delta for streaming reasoning
704
+ if (delta) {
705
+ events.push({
706
+ type: "timeline",
707
+ provider: "opencode",
708
+ item: { type: "reasoning", text: delta },
709
+ });
710
+ }
711
+ else if (partTime?.end) {
712
+ const text = part.text;
713
+ if (text) {
714
+ events.push({
715
+ type: "timeline",
716
+ provider: "opencode",
717
+ item: { type: "reasoning", text },
718
+ });
719
+ }
720
+ }
721
+ }
722
+ else if (partType === "tool") {
723
+ // Tool parts: { tool: string, state: { status, input, output?, error? } }
724
+ const toolName = part.tool;
725
+ const state = part.state;
726
+ const status = state?.status;
727
+ const input = state?.input;
728
+ const output = state?.output;
729
+ const error = state?.error;
730
+ if (toolName) {
731
+ events.push({
732
+ type: "timeline",
733
+ provider: "opencode",
734
+ item: mapOpencodeToolCall({
735
+ toolName,
736
+ callId: part.callID ?? part.id,
737
+ status,
738
+ input,
739
+ output,
740
+ error,
741
+ }),
742
+ });
743
+ }
744
+ }
745
+ else if (partType === "step-finish") {
746
+ // Extract usage from step-finish parts
747
+ const tokens = part.tokens;
748
+ const cost = part.cost;
749
+ if (tokens) {
750
+ this.accumulatedUsage.inputTokens = (this.accumulatedUsage.inputTokens ?? 0) + (tokens.input ?? 0);
751
+ this.accumulatedUsage.outputTokens = (this.accumulatedUsage.outputTokens ?? 0) + (tokens.output ?? 0);
752
+ }
753
+ if (cost !== undefined) {
754
+ this.accumulatedUsage.totalCostUsd = (this.accumulatedUsage.totalCostUsd ?? 0) + cost;
755
+ }
756
+ }
757
+ break;
758
+ }
759
+ case "permission.asked": {
760
+ // props IS the PermissionRequest directly
761
+ const sessionId = props.sessionID;
762
+ if (sessionId !== this.sessionId) {
763
+ break;
764
+ }
765
+ const requestId = props.id;
766
+ const permission = props.permission;
767
+ const metadata = props.metadata;
768
+ const patterns = props.patterns;
769
+ const permRequest = {
770
+ id: requestId,
771
+ provider: "opencode",
772
+ name: permission,
773
+ kind: "tool",
774
+ title: permission,
775
+ description: patterns?.join(", "),
776
+ input: metadata,
777
+ };
778
+ this.pendingPermissions.set(requestId, permRequest);
779
+ events.push({
780
+ type: "permission_requested",
781
+ provider: "opencode",
782
+ request: permRequest,
783
+ });
784
+ break;
785
+ }
786
+ case "session.idle": {
787
+ const sessionId = props.sessionID;
788
+ if (sessionId === this.sessionId) {
789
+ const usage = this.extractAndResetUsage();
790
+ events.push({
791
+ type: "turn_completed",
792
+ provider: "opencode",
793
+ usage,
794
+ });
795
+ }
796
+ break;
797
+ }
798
+ case "session.error": {
799
+ const sessionId = props.sessionID;
800
+ if (sessionId === this.sessionId) {
801
+ const error = props.error;
802
+ events.push({
803
+ type: "turn_failed",
804
+ provider: "opencode",
805
+ error: error ?? "Unknown error",
806
+ });
807
+ }
808
+ break;
809
+ }
810
+ }
811
+ return events;
812
+ }
813
+ extractAndResetUsage() {
814
+ const usage = this.accumulatedUsage;
815
+ this.accumulatedUsage = {};
816
+ if (!usage.inputTokens && !usage.outputTokens && !usage.totalCostUsd) {
817
+ return undefined;
818
+ }
819
+ return usage;
820
+ }
821
+ }
822
+ //# sourceMappingURL=opencode-agent.js.map