@getpaseo/server 0.1.16 → 0.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/dist/scripts/daemon-runner.js +53 -14
  2. package/dist/scripts/daemon-runner.js.map +1 -1
  3. package/dist/scripts/dev-runner.js +9 -16
  4. package/dist/scripts/dev-runner.js.map +1 -1
  5. package/dist/scripts/supervisor.js +40 -13
  6. package/dist/scripts/supervisor.js.map +1 -1
  7. package/dist/server/client/daemon-client.d.ts +23 -3
  8. package/dist/server/client/daemon-client.d.ts.map +1 -1
  9. package/dist/server/client/daemon-client.js +81 -8
  10. package/dist/server/client/daemon-client.js.map +1 -1
  11. package/dist/server/server/agent/agent-manager.d.ts +3 -1
  12. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  13. package/dist/server/server/agent/agent-manager.js +146 -24
  14. package/dist/server/server/agent/agent-manager.js.map +1 -1
  15. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
  16. package/dist/server/server/agent/agent-metadata-generator.js +13 -4
  17. package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
  18. package/dist/server/server/agent/agent-response-loop.js +1 -1
  19. package/dist/server/server/agent/agent-response-loop.js.map +1 -1
  20. package/dist/server/server/agent/agent-sdk-types.d.ts +9 -0
  21. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  22. package/dist/server/server/agent/agent-sdk-types.js +11 -1
  23. package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
  24. package/dist/server/server/agent/agent-storage.d.ts +5 -1
  25. package/dist/server/server/agent/agent-storage.d.ts.map +1 -1
  26. package/dist/server/server/agent/agent-storage.js +41 -72
  27. package/dist/server/server/agent/agent-storage.js.map +1 -1
  28. package/dist/server/server/agent/agent-title-limits.d.ts +3 -0
  29. package/dist/server/server/agent/agent-title-limits.d.ts.map +1 -0
  30. package/dist/server/server/agent/agent-title-limits.js +3 -0
  31. package/dist/server/server/agent/agent-title-limits.js.map +1 -0
  32. package/dist/server/server/agent/providers/claude/model-catalog.d.ts +29 -0
  33. package/dist/server/server/agent/providers/claude/model-catalog.d.ts.map +1 -0
  34. package/dist/server/server/agent/providers/claude/model-catalog.js +70 -0
  35. package/dist/server/server/agent/providers/claude/model-catalog.js.map +1 -0
  36. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +44 -0
  37. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -0
  38. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +250 -0
  39. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -0
  40. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -1
  41. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +15 -0
  42. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
  43. package/dist/server/server/agent/providers/claude-agent.d.ts +3 -2
  44. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  45. package/dist/server/server/agent/providers/claude-agent.js +240 -106
  46. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  47. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
  48. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +81 -28
  49. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
  50. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  51. package/dist/server/server/agent/providers/codex-app-server-agent.js +31 -5
  52. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  53. package/dist/server/server/agent/providers/opencode-agent.d.ts +10 -1
  54. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  55. package/dist/server/server/agent/providers/opencode-agent.js +207 -176
  56. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  57. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +15 -0
  58. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  59. package/dist/server/server/agent/timeline-projection.d.ts +20 -0
  60. package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
  61. package/dist/server/server/agent/timeline-projection.js +73 -0
  62. package/dist/server/server/agent/timeline-projection.js.map +1 -1
  63. package/dist/server/server/bootstrap.d.ts +15 -0
  64. package/dist/server/server/bootstrap.d.ts.map +1 -1
  65. package/dist/server/server/bootstrap.js +27 -4
  66. package/dist/server/server/bootstrap.js.map +1 -1
  67. package/dist/server/server/file-download/token-store.d.ts +0 -1
  68. package/dist/server/server/file-download/token-store.d.ts.map +1 -1
  69. package/dist/server/server/file-download/token-store.js.map +1 -1
  70. package/dist/server/server/file-explorer/service.d.ts.map +1 -1
  71. package/dist/server/server/file-explorer/service.js +56 -36
  72. package/dist/server/server/file-explorer/service.js.map +1 -1
  73. package/dist/server/server/index.js +85 -29
  74. package/dist/server/server/index.js.map +1 -1
  75. package/dist/server/server/logger.d.ts +24 -3
  76. package/dist/server/server/logger.d.ts.map +1 -1
  77. package/dist/server/server/logger.js +157 -21
  78. package/dist/server/server/logger.js.map +1 -1
  79. package/dist/server/server/persisted-config.d.ts +86 -0
  80. package/dist/server/server/persisted-config.d.ts.map +1 -1
  81. package/dist/server/server/persisted-config.js +25 -3
  82. package/dist/server/server/persisted-config.js.map +1 -1
  83. package/dist/server/server/pid-lock.d.ts +6 -2
  84. package/dist/server/server/pid-lock.d.ts.map +1 -1
  85. package/dist/server/server/pid-lock.js +7 -10
  86. package/dist/server/server/pid-lock.js.map +1 -1
  87. package/dist/server/server/relay-transport.d.ts.map +1 -1
  88. package/dist/server/server/relay-transport.js +1 -0
  89. package/dist/server/server/relay-transport.js.map +1 -1
  90. package/dist/server/server/session.d.ts +57 -3
  91. package/dist/server/server/session.d.ts.map +1 -1
  92. package/dist/server/server/session.js +755 -182
  93. package/dist/server/server/session.js.map +1 -1
  94. package/dist/server/server/websocket-server.d.ts +16 -1
  95. package/dist/server/server/websocket-server.d.ts.map +1 -1
  96. package/dist/server/server/websocket-server.js +135 -9
  97. package/dist/server/server/websocket-server.js.map +1 -1
  98. package/dist/server/server/worktree-bootstrap.d.ts.map +1 -1
  99. package/dist/server/server/worktree-bootstrap.js +45 -2
  100. package/dist/server/server/worktree-bootstrap.js.map +1 -1
  101. package/dist/server/shared/messages.d.ts +2841 -541
  102. package/dist/server/shared/messages.d.ts.map +1 -1
  103. package/dist/server/shared/messages.js +99 -5
  104. package/dist/server/shared/messages.js.map +1 -1
  105. package/dist/server/shared/tool-call-display.d.ts.map +1 -1
  106. package/dist/server/shared/tool-call-display.js +3 -0
  107. package/dist/server/shared/tool-call-display.js.map +1 -1
  108. package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
  109. package/dist/server/terminal/terminal-manager.js +1 -13
  110. package/dist/server/terminal/terminal-manager.js.map +1 -1
  111. package/dist/server/terminal/terminal.d.ts.map +1 -1
  112. package/dist/server/terminal/terminal.js +29 -5
  113. package/dist/server/terminal/terminal.js.map +1 -1
  114. package/dist/server/utils/worktree.d.ts +1 -0
  115. package/dist/server/utils/worktree.d.ts.map +1 -1
  116. package/dist/server/utils/worktree.js +17 -2
  117. package/dist/server/utils/worktree.js.map +1 -1
  118. package/dist/src/server/agent/activity-curator.js +228 -0
  119. package/dist/src/server/agent/activity-curator.js.map +1 -0
  120. package/dist/src/server/agent/agent-manager.js +1712 -0
  121. package/dist/src/server/agent/agent-manager.js.map +1 -0
  122. package/dist/src/server/agent/agent-metadata-generator.js +163 -0
  123. package/dist/src/server/agent/agent-metadata-generator.js.map +1 -0
  124. package/dist/src/server/agent/agent-projections.js +262 -0
  125. package/dist/src/server/agent/agent-projections.js.map +1 -0
  126. package/dist/src/server/agent/agent-response-loop.js +304 -0
  127. package/dist/src/server/agent/agent-response-loop.js.map +1 -0
  128. package/dist/src/server/agent/agent-sdk-types.js +12 -0
  129. package/dist/src/server/agent/agent-sdk-types.js.map +1 -0
  130. package/dist/src/server/agent/agent-storage.js +299 -0
  131. package/dist/src/server/agent/agent-storage.js.map +1 -0
  132. package/dist/src/server/agent/agent-title-limits.js +3 -0
  133. package/dist/src/server/agent/agent-title-limits.js.map +1 -0
  134. package/dist/src/server/agent/audio-utils.js +19 -0
  135. package/dist/src/server/agent/audio-utils.js.map +1 -0
  136. package/dist/src/server/agent/dictation-debug.js +50 -0
  137. package/dist/src/server/agent/dictation-debug.js.map +1 -0
  138. package/dist/src/server/agent/mcp-server.js +787 -0
  139. package/dist/src/server/agent/mcp-server.js.map +1 -0
  140. package/dist/src/server/agent/orchestrator-instructions.js +51 -0
  141. package/dist/src/server/agent/orchestrator-instructions.js.map +1 -0
  142. package/dist/src/server/agent/pcm16-resampler.js +63 -0
  143. package/dist/src/server/agent/pcm16-resampler.js.map +1 -0
  144. package/dist/src/server/agent/provider-launch-config.js +83 -0
  145. package/dist/src/server/agent/provider-launch-config.js.map +1 -0
  146. package/dist/src/server/agent/provider-manifest.js +97 -0
  147. package/dist/src/server/agent/provider-manifest.js.map +1 -0
  148. package/dist/src/server/agent/provider-registry.js +45 -0
  149. package/dist/src/server/agent/provider-registry.js.map +1 -0
  150. package/dist/src/server/agent/providers/claude/model-catalog.js +70 -0
  151. package/dist/src/server/agent/providers/claude/model-catalog.js.map +1 -0
  152. package/dist/src/server/agent/providers/claude/task-notification-tool-call.js +250 -0
  153. package/dist/src/server/agent/providers/claude/task-notification-tool-call.js.map +1 -0
  154. package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js +109 -0
  155. package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -0
  156. package/dist/src/server/agent/providers/claude/tool-call-mapper.js +238 -0
  157. package/dist/src/server/agent/providers/claude/tool-call-mapper.js.map +1 -0
  158. package/dist/src/server/agent/providers/claude-agent.js +3747 -0
  159. package/dist/src/server/agent/providers/claude-agent.js.map +1 -0
  160. package/dist/src/server/agent/providers/codex/tool-call-detail-parser.js +104 -0
  161. package/dist/src/server/agent/providers/codex/tool-call-detail-parser.js.map +1 -0
  162. package/dist/src/server/agent/providers/codex/tool-call-mapper.js +720 -0
  163. package/dist/src/server/agent/providers/codex/tool-call-mapper.js.map +1 -0
  164. package/dist/src/server/agent/providers/codex-app-server-agent.js +2601 -0
  165. package/dist/src/server/agent/providers/codex-app-server-agent.js.map +1 -0
  166. package/dist/src/server/agent/providers/codex-rollout-timeline.js +487 -0
  167. package/dist/src/server/agent/providers/codex-rollout-timeline.js.map +1 -0
  168. package/dist/src/server/agent/providers/opencode/tool-call-detail-parser.js +39 -0
  169. package/dist/src/server/agent/providers/opencode/tool-call-detail-parser.js.map +1 -0
  170. package/dist/src/server/agent/providers/opencode/tool-call-mapper.js +151 -0
  171. package/dist/src/server/agent/providers/opencode/tool-call-mapper.js.map +1 -0
  172. package/dist/src/server/agent/providers/opencode-agent.js +905 -0
  173. package/dist/src/server/agent/providers/opencode-agent.js.map +1 -0
  174. package/dist/src/server/agent/providers/tool-call-detail-primitives.js +552 -0
  175. package/dist/src/server/agent/providers/tool-call-detail-primitives.js.map +1 -0
  176. package/dist/src/server/agent/providers/tool-call-mapper-utils.js +109 -0
  177. package/dist/src/server/agent/providers/tool-call-mapper-utils.js.map +1 -0
  178. package/dist/src/server/agent/recordings-debug.js +19 -0
  179. package/dist/src/server/agent/recordings-debug.js.map +1 -0
  180. package/dist/src/server/agent/stt-debug.js +33 -0
  181. package/dist/src/server/agent/stt-debug.js.map +1 -0
  182. package/dist/src/server/agent/stt-manager.js +233 -0
  183. package/dist/src/server/agent/stt-manager.js.map +1 -0
  184. package/dist/src/server/agent/timeline-append.js +27 -0
  185. package/dist/src/server/agent/timeline-append.js.map +1 -0
  186. package/dist/src/server/agent/timeline-projection.js +215 -0
  187. package/dist/src/server/agent/timeline-projection.js.map +1 -0
  188. package/dist/src/server/agent/tool-name-normalization.js +45 -0
  189. package/dist/src/server/agent/tool-name-normalization.js.map +1 -0
  190. package/dist/src/server/agent/tts-debug.js +24 -0
  191. package/dist/src/server/agent/tts-debug.js.map +1 -0
  192. package/dist/src/server/agent/tts-manager.js +249 -0
  193. package/dist/src/server/agent/tts-manager.js.map +1 -0
  194. package/dist/src/server/agent/wait-for-agent-tracker.js +53 -0
  195. package/dist/src/server/agent/wait-for-agent-tracker.js.map +1 -0
  196. package/dist/src/server/agent-attention-policy.js +40 -0
  197. package/dist/src/server/agent-attention-policy.js.map +1 -0
  198. package/dist/src/server/allowed-hosts.js +94 -0
  199. package/dist/src/server/allowed-hosts.js.map +1 -0
  200. package/dist/src/server/bootstrap.js +498 -0
  201. package/dist/src/server/bootstrap.js.map +1 -0
  202. package/dist/src/server/client-message-id.js +12 -0
  203. package/dist/src/server/client-message-id.js.map +1 -0
  204. package/dist/src/server/config.js +84 -0
  205. package/dist/src/server/config.js.map +1 -0
  206. package/dist/src/server/connection-offer.js +60 -0
  207. package/dist/src/server/connection-offer.js.map +1 -0
  208. package/dist/src/server/daemon-keypair.js +40 -0
  209. package/dist/src/server/daemon-keypair.js.map +1 -0
  210. package/dist/src/server/daemon-version.js +22 -0
  211. package/dist/src/server/daemon-version.js.map +1 -0
  212. package/dist/src/server/dictation/dictation-stream-manager.js +568 -0
  213. package/dist/src/server/dictation/dictation-stream-manager.js.map +1 -0
  214. package/dist/src/server/file-download/token-store.js +40 -0
  215. package/dist/src/server/file-download/token-store.js.map +1 -0
  216. package/dist/src/server/file-explorer/service.js +183 -0
  217. package/dist/src/server/file-explorer/service.js.map +1 -0
  218. package/dist/src/server/json-utils.js +45 -0
  219. package/dist/src/server/json-utils.js.map +1 -0
  220. package/dist/src/server/messages.js +29 -0
  221. package/dist/src/server/messages.js.map +1 -0
  222. package/dist/src/server/package-version.js +47 -0
  223. package/dist/src/server/package-version.js.map +1 -0
  224. package/dist/src/server/paseo-home.js +19 -0
  225. package/dist/src/server/paseo-home.js.map +1 -0
  226. package/dist/src/server/path-utils.js +20 -0
  227. package/dist/src/server/path-utils.js.map +1 -0
  228. package/dist/src/server/persisted-config.js +259 -0
  229. package/dist/src/server/persisted-config.js.map +1 -0
  230. package/dist/src/server/persistence-hooks.js +60 -0
  231. package/dist/src/server/persistence-hooks.js.map +1 -0
  232. package/dist/src/server/pid-lock.js +126 -0
  233. package/dist/src/server/pid-lock.js.map +1 -0
  234. package/dist/src/server/push/push-service.js +68 -0
  235. package/dist/src/server/push/push-service.js.map +1 -0
  236. package/dist/src/server/push/token-store.js +70 -0
  237. package/dist/src/server/push/token-store.js.map +1 -0
  238. package/dist/src/server/relay-transport.js +457 -0
  239. package/dist/src/server/relay-transport.js.map +1 -0
  240. package/dist/src/server/server-id.js +63 -0
  241. package/dist/src/server/server-id.js.map +1 -0
  242. package/dist/src/server/session.js +5947 -0
  243. package/dist/src/server/session.js.map +1 -0
  244. package/dist/src/server/speech/audio.js +101 -0
  245. package/dist/src/server/speech/audio.js.map +1 -0
  246. package/dist/src/server/speech/provider-resolver.js +7 -0
  247. package/dist/src/server/speech/provider-resolver.js.map +1 -0
  248. package/dist/src/server/speech/providers/local/config.js +83 -0
  249. package/dist/src/server/speech/providers/local/config.js.map +1 -0
  250. package/dist/src/server/speech/providers/local/models.js +17 -0
  251. package/dist/src/server/speech/providers/local/models.js.map +1 -0
  252. package/dist/src/server/speech/providers/local/pocket/pocket-tts-onnx.js +422 -0
  253. package/dist/src/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -0
  254. package/dist/src/server/speech/providers/local/runtime.js +253 -0
  255. package/dist/src/server/speech/providers/local/runtime.js.map +1 -0
  256. package/dist/src/server/speech/providers/local/sherpa/model-catalog.js +166 -0
  257. package/dist/src/server/speech/providers/local/sherpa/model-catalog.js.map +1 -0
  258. package/dist/src/server/speech/providers/local/sherpa/model-downloader.js +165 -0
  259. package/dist/src/server/speech/providers/local/sherpa/model-downloader.js.map +1 -0
  260. package/dist/src/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +68 -0
  261. package/dist/src/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -0
  262. package/dist/src/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +79 -0
  263. package/dist/src/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -0
  264. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-loader.js +11 -0
  265. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-loader.js.map +1 -0
  266. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +102 -0
  267. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -0
  268. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +131 -0
  269. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -0
  270. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +132 -0
  271. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -0
  272. package/dist/src/server/speech/providers/local/sherpa/sherpa-realtime-session.js +112 -0
  273. package/dist/src/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -0
  274. package/dist/src/server/speech/providers/local/sherpa/sherpa-stt.js +140 -0
  275. package/dist/src/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -0
  276. package/dist/src/server/speech/providers/local/sherpa/sherpa-tts.js +95 -0
  277. package/dist/src/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -0
  278. package/dist/src/server/speech/providers/openai/config.js +99 -0
  279. package/dist/src/server/speech/providers/openai/config.js.map +1 -0
  280. package/dist/src/server/speech/providers/openai/realtime-transcription-session.js +165 -0
  281. package/dist/src/server/speech/providers/openai/realtime-transcription-session.js.map +1 -0
  282. package/dist/src/server/speech/providers/openai/runtime.js +114 -0
  283. package/dist/src/server/speech/providers/openai/runtime.js.map +1 -0
  284. package/dist/src/server/speech/providers/openai/stt.js +208 -0
  285. package/dist/src/server/speech/providers/openai/stt.js.map +1 -0
  286. package/dist/src/server/speech/providers/openai/tts.js +46 -0
  287. package/dist/src/server/speech/providers/openai/tts.js.map +1 -0
  288. package/dist/src/server/speech/speech-config-resolver.js +85 -0
  289. package/dist/src/server/speech/speech-config-resolver.js.map +1 -0
  290. package/dist/src/server/speech/speech-provider.js +2 -0
  291. package/dist/src/server/speech/speech-provider.js.map +1 -0
  292. package/dist/src/server/speech/speech-runtime.js +497 -0
  293. package/dist/src/server/speech/speech-runtime.js.map +1 -0
  294. package/dist/src/server/speech/speech-types.js +8 -0
  295. package/dist/src/server/speech/speech-types.js.map +1 -0
  296. package/dist/src/server/utils/diff-highlighter.js +244 -0
  297. package/dist/src/server/utils/diff-highlighter.js.map +1 -0
  298. package/dist/src/server/utils/syntax-highlighter.js +145 -0
  299. package/dist/src/server/utils/syntax-highlighter.js.map +1 -0
  300. package/dist/src/server/voice-config.js +51 -0
  301. package/dist/src/server/voice-config.js.map +1 -0
  302. package/dist/src/server/voice-mcp-bridge-command.js +31 -0
  303. package/dist/src/server/voice-mcp-bridge-command.js.map +1 -0
  304. package/dist/src/server/voice-mcp-bridge.js +109 -0
  305. package/dist/src/server/voice-mcp-bridge.js.map +1 -0
  306. package/dist/src/server/voice-permission-policy.js +13 -0
  307. package/dist/src/server/voice-permission-policy.js.map +1 -0
  308. package/dist/src/server/voice-types.js +2 -0
  309. package/dist/src/server/voice-types.js.map +1 -0
  310. package/dist/src/server/websocket-server.js +967 -0
  311. package/dist/src/server/websocket-server.js.map +1 -0
  312. package/dist/src/server/worktree-bootstrap.js +497 -0
  313. package/dist/src/server/worktree-bootstrap.js.map +1 -0
  314. package/dist/src/shared/agent-attention-notification.js +130 -0
  315. package/dist/src/shared/agent-attention-notification.js.map +1 -0
  316. package/dist/src/shared/agent-lifecycle.js +8 -0
  317. package/dist/src/shared/agent-lifecycle.js.map +1 -0
  318. package/dist/src/shared/binary-mux.js +114 -0
  319. package/dist/src/shared/binary-mux.js.map +1 -0
  320. package/dist/src/shared/connection-offer.js +17 -0
  321. package/dist/src/shared/connection-offer.js.map +1 -0
  322. package/dist/src/shared/daemon-endpoints.js +113 -0
  323. package/dist/src/shared/daemon-endpoints.js.map +1 -0
  324. package/dist/src/shared/messages.js +2001 -0
  325. package/dist/src/shared/messages.js.map +1 -0
  326. package/dist/src/shared/path-utils.js +16 -0
  327. package/dist/src/shared/path-utils.js.map +1 -0
  328. package/dist/src/shared/tool-call-display.js +93 -0
  329. package/dist/src/shared/tool-call-display.js.map +1 -0
  330. package/dist/src/terminal/terminal-manager.js +136 -0
  331. package/dist/src/terminal/terminal-manager.js.map +1 -0
  332. package/dist/src/terminal/terminal.js +410 -0
  333. package/dist/src/terminal/terminal.js.map +1 -0
  334. package/dist/src/utils/checkout-git.js +1397 -0
  335. package/dist/src/utils/checkout-git.js.map +1 -0
  336. package/dist/src/utils/directory-suggestions.js +655 -0
  337. package/dist/src/utils/directory-suggestions.js.map +1 -0
  338. package/dist/src/utils/path.js +15 -0
  339. package/dist/src/utils/path.js.map +1 -0
  340. package/dist/src/utils/project-icon.js +391 -0
  341. package/dist/src/utils/project-icon.js.map +1 -0
  342. package/dist/src/utils/worktree-metadata.js +116 -0
  343. package/dist/src/utils/worktree-metadata.js.map +1 -0
  344. package/dist/src/utils/worktree.js +741 -0
  345. package/dist/src/utils/worktree.js.map +1 -0
  346. package/package.json +14 -6
@@ -0,0 +1,244 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ import { highlightCode, isLanguageSupported, } from "./syntax-highlighter.js";
4
+ /**
5
+ * Parse a unified diff into structured data
6
+ */
7
+ export function parseDiff(diffText) {
8
+ if (!diffText || diffText.trim().length === 0) {
9
+ return [];
10
+ }
11
+ const files = [];
12
+ const fileSections = diffText.split(/^diff --git /m).filter(Boolean);
13
+ for (const section of fileSections) {
14
+ const lines = section.split("\n");
15
+ const firstLine = lines[0];
16
+ // Detect new/deleted file
17
+ const isNew = section.includes("new file mode") ||
18
+ section.includes("--- /dev/null");
19
+ const isDeleted = section.includes("deleted file mode") ||
20
+ section.includes("+++ /dev/null");
21
+ // Extract path
22
+ let path = "unknown";
23
+ const pathMatch = firstLine.match(/a\/(.*?) b\//);
24
+ if (pathMatch) {
25
+ path = pathMatch[1];
26
+ }
27
+ else {
28
+ const newFileMatch = firstLine.match(/b\/(.+)$/);
29
+ if (newFileMatch) {
30
+ path = newFileMatch[1];
31
+ }
32
+ }
33
+ const hunks = [];
34
+ let currentHunk = null;
35
+ let additions = 0;
36
+ let deletions = 0;
37
+ for (let i = 1; i < lines.length; i++) {
38
+ const line = lines[i];
39
+ // Skip metadata lines
40
+ if (line.startsWith("index "))
41
+ continue;
42
+ if (line.startsWith("--- "))
43
+ continue;
44
+ if (line.startsWith("+++ "))
45
+ continue;
46
+ if (line.startsWith("new file mode"))
47
+ continue;
48
+ if (line.startsWith("deleted file mode"))
49
+ continue;
50
+ // Parse hunk header: @@ -oldStart,oldCount +newStart,newCount @@
51
+ const hunkMatch = line.match(/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/);
52
+ if (hunkMatch) {
53
+ if (currentHunk) {
54
+ hunks.push(currentHunk);
55
+ }
56
+ currentHunk = {
57
+ oldStart: parseInt(hunkMatch[1], 10),
58
+ oldCount: parseInt(hunkMatch[2] ?? "1", 10),
59
+ newStart: parseInt(hunkMatch[3], 10),
60
+ newCount: parseInt(hunkMatch[4] ?? "1", 10),
61
+ lines: [{ type: "header", content: line.match(/^(@@ .+? @@)/)?.[1] ?? line }],
62
+ };
63
+ continue;
64
+ }
65
+ if (!currentHunk)
66
+ continue;
67
+ if (line.startsWith("+")) {
68
+ currentHunk.lines.push({ type: "add", content: line.slice(1) });
69
+ additions++;
70
+ }
71
+ else if (line.startsWith("-")) {
72
+ currentHunk.lines.push({ type: "remove", content: line.slice(1) });
73
+ deletions++;
74
+ }
75
+ else if (line.startsWith(" ")) {
76
+ currentHunk.lines.push({ type: "context", content: line.slice(1) });
77
+ }
78
+ else if (line.length > 0 && !line.startsWith("\\")) {
79
+ // Non-empty line that's not a "\ No newline" marker
80
+ currentHunk.lines.push({ type: "context", content: line });
81
+ }
82
+ }
83
+ if (currentHunk) {
84
+ hunks.push(currentHunk);
85
+ }
86
+ files.push({ path, isNew, isDeleted, additions, deletions, hunks });
87
+ }
88
+ return files;
89
+ }
90
+ /**
91
+ * Reconstruct the "new" version of a file from diff hunks.
92
+ * Returns a map of new line numbers to their content.
93
+ */
94
+ export function reconstructNewFile(hunks) {
95
+ const lines = new Map();
96
+ for (const hunk of hunks) {
97
+ let newLineNum = hunk.newStart;
98
+ for (const line of hunk.lines) {
99
+ if (line.type === "header")
100
+ continue;
101
+ if (line.type === "add" || line.type === "context") {
102
+ lines.set(newLineNum, line.content);
103
+ newLineNum++;
104
+ }
105
+ }
106
+ }
107
+ return lines;
108
+ }
109
+ /**
110
+ * Reconstruct the "old" version of a file from diff hunks.
111
+ * Returns a map of old line numbers to their content.
112
+ */
113
+ export function reconstructOldFile(hunks) {
114
+ const lines = new Map();
115
+ for (const hunk of hunks) {
116
+ let oldLineNum = hunk.oldStart;
117
+ for (const line of hunk.lines) {
118
+ if (line.type === "header")
119
+ continue;
120
+ if (line.type === "remove" || line.type === "context") {
121
+ lines.set(oldLineNum, line.content);
122
+ oldLineNum++;
123
+ }
124
+ }
125
+ }
126
+ return lines;
127
+ }
128
+ function buildFileContent(lineMap) {
129
+ if (lineMap.size === 0)
130
+ return "";
131
+ const lineNumbers = Array.from(lineMap.keys()).sort((a, b) => a - b);
132
+ const minLine = lineNumbers[0];
133
+ const maxLine = lineNumbers[lineNumbers.length - 1];
134
+ const lines = [];
135
+ for (let i = minLine; i <= maxLine; i++) {
136
+ lines.push(lineMap.get(i) ?? "");
137
+ }
138
+ return lines.join("\n");
139
+ }
140
+ function buildTokenLookup(lineMap, highlighted) {
141
+ const lookup = new Map();
142
+ if (lineMap.size === 0)
143
+ return lookup;
144
+ const lineNumbers = Array.from(lineMap.keys()).sort((a, b) => a - b);
145
+ const minLine = lineNumbers[0];
146
+ for (let i = 0; i < highlighted.length; i++) {
147
+ const lineNum = minLine + i;
148
+ if (lineMap.has(lineNum)) {
149
+ lookup.set(lineNum, highlighted[i]);
150
+ }
151
+ }
152
+ return lookup;
153
+ }
154
+ /**
155
+ * Apply syntax highlighting to diff hunks using reconstructed file content.
156
+ * This is the fallback when actual file content is not available.
157
+ */
158
+ export function highlightDiffFromHunks(file) {
159
+ if (!isLanguageSupported(file.path)) {
160
+ return file;
161
+ }
162
+ // Reconstruct both versions from hunks
163
+ const newFileLines = reconstructNewFile(file.hunks);
164
+ const oldFileLines = reconstructOldFile(file.hunks);
165
+ // Build complete file content strings for highlighting
166
+ const newFileContent = buildFileContent(newFileLines);
167
+ const oldFileContent = buildFileContent(oldFileLines);
168
+ // Highlight both versions
169
+ const newHighlighted = highlightCode(newFileContent, file.path);
170
+ const oldHighlighted = highlightCode(oldFileContent, file.path);
171
+ // Build lookup maps: line number -> tokens
172
+ const newTokensByLine = buildTokenLookup(newFileLines, newHighlighted);
173
+ const oldTokensByLine = buildTokenLookup(oldFileLines, oldHighlighted);
174
+ return applyTokensToHunks(file, newTokensByLine, oldTokensByLine);
175
+ }
176
+ /**
177
+ * Apply syntax highlighting to diff hunks using actual file content.
178
+ * This provides better context for the parser.
179
+ */
180
+ export async function highlightDiffWithFileContent(file, cwd) {
181
+ if (!isLanguageSupported(file.path)) {
182
+ return file;
183
+ }
184
+ const filePath = resolve(cwd, file.path);
185
+ try {
186
+ // Read the current file content (the "new" version)
187
+ const fileContent = await readFile(filePath, "utf-8");
188
+ // Highlight the entire file
189
+ const highlighted = highlightCode(fileContent, file.path);
190
+ // Build lookup: line number (1-indexed) -> tokens
191
+ const tokensByLine = new Map();
192
+ for (let i = 0; i < highlighted.length; i++) {
193
+ tokensByLine.set(i + 1, highlighted[i]);
194
+ }
195
+ // For removed lines, we need to reconstruct from hunks since they're not in the file
196
+ const oldFileLines = reconstructOldFile(file.hunks);
197
+ const oldFileContent = buildFileContent(oldFileLines);
198
+ const oldHighlighted = highlightCode(oldFileContent, file.path);
199
+ const oldTokensByLine = buildTokenLookup(oldFileLines, oldHighlighted);
200
+ return applyTokensToHunks(file, tokensByLine, oldTokensByLine);
201
+ }
202
+ catch {
203
+ // If file read fails (deleted file, etc.), fall back to hunk-based highlighting
204
+ return highlightDiffFromHunks(file);
205
+ }
206
+ }
207
+ function applyTokensToHunks(file, newTokensByLine, oldTokensByLine) {
208
+ const highlightedHunks = file.hunks.map((hunk) => {
209
+ let oldLineNum = hunk.oldStart;
210
+ let newLineNum = hunk.newStart;
211
+ const highlightedLines = hunk.lines.map((line) => {
212
+ if (line.type === "header") {
213
+ return line;
214
+ }
215
+ let tokens;
216
+ if (line.type === "add") {
217
+ tokens = newTokensByLine.get(newLineNum);
218
+ newLineNum++;
219
+ }
220
+ else if (line.type === "remove") {
221
+ tokens = oldTokensByLine.get(oldLineNum);
222
+ oldLineNum++;
223
+ }
224
+ else if (line.type === "context") {
225
+ // Context lines exist in both - use new file version
226
+ tokens = newTokensByLine.get(newLineNum);
227
+ oldLineNum++;
228
+ newLineNum++;
229
+ }
230
+ return tokens ? { ...line, tokens } : line;
231
+ });
232
+ return { ...hunk, lines: highlightedLines };
233
+ });
234
+ return { ...file, hunks: highlightedHunks };
235
+ }
236
+ /**
237
+ * Parse and highlight a complete diff, using actual file content when available.
238
+ */
239
+ export async function parseAndHighlightDiff(diffText, cwd) {
240
+ const files = parseDiff(diffText);
241
+ const highlightedFiles = await Promise.all(files.map((file) => highlightDiffWithFileContent(file, cwd)));
242
+ return highlightedFiles;
243
+ }
244
+ //# sourceMappingURL=diff-highlighter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-highlighter.js","sourceRoot":"","sources":["../../../../src/server/utils/diff-highlighter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import { highlightTree, tagHighlighter, tags } from "@lezer/highlight";
2
+ import { parser as jsParser } from "@lezer/javascript";
3
+ import { parser as jsonParser } from "@lezer/json";
4
+ import { parser as cssParser } from "@lezer/css";
5
+ import { parser as htmlParser } from "@lezer/html";
6
+ import { parser as pythonParser } from "@lezer/python";
7
+ import { parser as markdownParser } from "@lezer/markdown";
8
+ import { parser as elixirParser } from "lezer-elixir";
9
+ // Map file extensions to parsers
10
+ const parsersByExtension = {
11
+ // JavaScript/TypeScript
12
+ js: jsParser,
13
+ jsx: jsParser.configure({ dialect: "jsx" }),
14
+ ts: jsParser.configure({ dialect: "ts" }),
15
+ tsx: jsParser.configure({ dialect: "ts jsx" }),
16
+ mjs: jsParser,
17
+ cjs: jsParser,
18
+ // JSON
19
+ json: jsonParser,
20
+ // CSS
21
+ css: cssParser,
22
+ scss: cssParser,
23
+ // HTML
24
+ html: htmlParser,
25
+ htm: htmlParser,
26
+ // Python
27
+ py: pythonParser,
28
+ // Elixir
29
+ ex: elixirParser,
30
+ exs: elixirParser,
31
+ // Markdown
32
+ md: markdownParser,
33
+ mdx: markdownParser,
34
+ };
35
+ // Create highlighter using tagHighlighter
36
+ const highlighter = tagHighlighter([
37
+ { tag: tags.keyword, class: "keyword" },
38
+ { tag: tags.controlKeyword, class: "keyword" },
39
+ { tag: tags.operatorKeyword, class: "keyword" },
40
+ { tag: tags.definitionKeyword, class: "keyword" },
41
+ { tag: tags.moduleKeyword, class: "keyword" },
42
+ { tag: tags.comment, class: "comment" },
43
+ { tag: tags.lineComment, class: "comment" },
44
+ { tag: tags.blockComment, class: "comment" },
45
+ { tag: tags.docComment, class: "comment" },
46
+ { tag: tags.string, class: "string" },
47
+ { tag: tags.special(tags.string), class: "string" },
48
+ { tag: tags.number, class: "number" },
49
+ { tag: tags.integer, class: "number" },
50
+ { tag: tags.float, class: "number" },
51
+ { tag: tags.bool, class: "literal" },
52
+ { tag: tags.null, class: "literal" },
53
+ { tag: tags.function(tags.variableName), class: "function" },
54
+ { tag: tags.function(tags.propertyName), class: "function" },
55
+ { tag: tags.definition(tags.variableName), class: "definition" },
56
+ { tag: tags.definition(tags.propertyName), class: "definition" },
57
+ { tag: tags.definition(tags.function(tags.variableName)), class: "definition" },
58
+ { tag: tags.className, class: "class" },
59
+ { tag: tags.definition(tags.className), class: "class" },
60
+ { tag: tags.typeName, class: "type" },
61
+ { tag: tags.tagName, class: "tag" },
62
+ { tag: tags.attributeName, class: "attribute" },
63
+ { tag: tags.attributeValue, class: "string" },
64
+ { tag: tags.propertyName, class: "property" },
65
+ { tag: tags.variableName, class: "variable" },
66
+ { tag: tags.local(tags.variableName), class: "variable" },
67
+ { tag: tags.special(tags.variableName), class: "variable" },
68
+ { tag: tags.operator, class: "operator" },
69
+ { tag: tags.punctuation, class: "punctuation" },
70
+ { tag: tags.bracket, class: "punctuation" },
71
+ { tag: tags.separator, class: "punctuation" },
72
+ { tag: tags.regexp, class: "regexp" },
73
+ { tag: tags.escape, class: "escape" },
74
+ { tag: tags.meta, class: "meta" },
75
+ { tag: tags.heading, class: "heading" },
76
+ { tag: tags.link, class: "link" },
77
+ { tag: tags.url, class: "link" },
78
+ ]);
79
+ function getParserForFile(filename) {
80
+ const ext = filename.split(".").pop()?.toLowerCase();
81
+ if (!ext)
82
+ return null;
83
+ return parsersByExtension[ext] ?? null;
84
+ }
85
+ export function highlightCode(code, filename) {
86
+ const parser = getParserForFile(filename);
87
+ if (!parser) {
88
+ // No parser available, return unhighlighted lines
89
+ return code.split("\n").map((line) => [{ text: line, style: null }]);
90
+ }
91
+ const tree = parser.parse(code);
92
+ const lines = code.split("\n");
93
+ const result = [];
94
+ // Initialize with unhighlighted content
95
+ for (let i = 0; i < lines.length; i++) {
96
+ result.push([]);
97
+ }
98
+ // Build a map of character positions to styles
99
+ const styleMap = new Array(code.length).fill(null);
100
+ // Use highlightTree to populate the style map
101
+ highlightTree(tree, highlighter, (from, to, classes) => {
102
+ for (let i = from; i < to && i < styleMap.length; i++) {
103
+ styleMap[i] = classes;
104
+ }
105
+ });
106
+ // Convert style map to tokens per line
107
+ let pos = 0;
108
+ for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
109
+ const line = lines[lineIndex];
110
+ if (line.length === 0) {
111
+ result[lineIndex].push({ text: "", style: null });
112
+ pos++; // skip newline
113
+ continue;
114
+ }
115
+ let currentToken = { text: "", style: styleMap[pos] };
116
+ for (let i = 0; i < line.length; i++) {
117
+ const charStyle = styleMap[pos + i];
118
+ if (charStyle === currentToken.style) {
119
+ currentToken.text += line[i];
120
+ }
121
+ else {
122
+ if (currentToken.text) {
123
+ result[lineIndex].push(currentToken);
124
+ }
125
+ currentToken = { text: line[i], style: charStyle };
126
+ }
127
+ }
128
+ if (currentToken.text) {
129
+ result[lineIndex].push(currentToken);
130
+ }
131
+ pos += line.length + 1; // +1 for newline
132
+ }
133
+ return result;
134
+ }
135
+ export function highlightLine(line, filename) {
136
+ const result = highlightCode(line, filename);
137
+ return result[0] ?? [{ text: line, style: null }];
138
+ }
139
+ export function getSupportedExtensions() {
140
+ return Object.keys(parsersByExtension);
141
+ }
142
+ export function isLanguageSupported(filename) {
143
+ return getParserForFile(filename) !== null;
144
+ }
145
+ //# sourceMappingURL=syntax-highlighter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax-highlighter.js","sourceRoot":"","sources":["../../../../src/server/utils/syntax-highlighter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AAGtD,iCAAiC;AACjC,MAAM,kBAAkB,GAA2B;IACjD,wBAAwB;IACxB,EAAE,EAAE,QAAQ;IACZ,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC3C,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACzC,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC9C,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,QAAQ;IACb,OAAO;IACP,IAAI,EAAE,UAAU;IAChB,MAAM;IACN,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,SAAS;IACf,OAAO;IACP,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,UAAU;IACf,SAAS;IACT,EAAE,EAAE,YAAY;IAChB,SAAS;IACT,EAAE,EAAE,YAAY;IAChB,GAAG,EAAE,YAAY;IACjB,WAAW;IACX,EAAE,EAAE,cAAc;IAClB,GAAG,EAAE,cAAc;CACpB,CAAC;AA6BF,0CAA0C;AAC1C,MAAM,WAAW,GAAG,cAAc,CAAC;IACjC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;IACvC,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE;IAC9C,EAAE,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE;IAC/C,EAAE,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE;IACjD,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE;IAC7C,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;IACvC,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE;IAC3C,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE;IAC5C,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE;IAC1C,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;IACrC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;IACnD,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;IACrC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE;IACtC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;IACpC,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;IACpC,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;IACpC,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE;IAC5D,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE;IAC5D,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE;IAChE,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE;IAChE,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE;IAC/E,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;IACvC,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE;IACxD,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;IACrC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;IACnC,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE;IAC/C,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC7C,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE;IAC7C,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE;IAC7C,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE;IACzD,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE;IAC3D,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE;IACzC,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE;IAC/C,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE;IAC3C,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE;IAC7C,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;IACrC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;IACrC,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;IACjC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;IACvC,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;IACjC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;CACjC,CAAC,CAAC;AAEH,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;IACrD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,kBAAkB,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAAgB;IAC1D,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,kDAAkD;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAuB,EAAE,CAAC;IAEtC,wCAAwC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,+CAA+C;IAC/C,MAAM,QAAQ,GAAiC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEjF,8CAA8C;IAC9C,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE;QACrD,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtD,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAyB,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,uCAAuC;IACvC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAE9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,GAAG,EAAE,CAAC,CAAC,eAAe;YACtB,SAAS;QACX,CAAC;QAED,IAAI,YAAY,GAAmB,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAEtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACpC,IAAI,SAAS,KAAK,YAAY,CAAC,KAAK,EAAE,CAAC;gBACrC,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC;oBACtB,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACvC,CAAC;gBACD,YAAY,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YACrD,CAAC;QACH,CAAC;QAED,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC;YACtB,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QAED,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,iBAAiB;IAC3C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAAgB;IAC1D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,OAAO,gBAAgB,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,51 @@
1
+ const VOICE_PROMPT_BLOCK_START = "<paseo_voice_mode>";
2
+ const VOICE_PROMPT_BLOCK_END = "</paseo_voice_mode>";
3
+ const VOICE_AGENT_SYSTEM_INSTRUCTION = [
4
+ "Paseo voice mode is now on.",
5
+ "You are the Paseo voice assistant.",
6
+ "The user cannot see your chat messages or tool calls.",
7
+ "Always use the speak tool for all user-facing communication.",
8
+ "Before calling any non-speak tool, first call speak with a short acknowledgement of what you heard and what you will do next.",
9
+ "For long-running work, use speak to provide progress updates before and during execution.",
10
+ "Treat the user input as transcribed speech.",
11
+ "If the user intent is clear, proceed without extra confirmation.",
12
+ "If the transcription seems incomplete, cut off, ambiguous, or may contain a non-obvious mistake or misspelling, ask a clarifying question via speak before taking action.",
13
+ "Use concise plain language suitable for speech output.",
14
+ ].join(" ");
15
+ const VOICE_AGENT_DISABLED_INSTRUCTION = [
16
+ "Paseo voice mode is now off.",
17
+ "Ignore any earlier Paseo voice mode instructions in this thread.",
18
+ ].join(" ");
19
+ function escapeRegExp(value) {
20
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
21
+ }
22
+ function makeVoicePromptBlockRegex() {
23
+ return new RegExp(`${escapeRegExp(VOICE_PROMPT_BLOCK_START)}[\\s\\S]*?${escapeRegExp(VOICE_PROMPT_BLOCK_END)}`, "g");
24
+ }
25
+ export function stripVoiceModeSystemPrompt(existing) {
26
+ const trimmed = existing?.trim();
27
+ if (!trimmed) {
28
+ return undefined;
29
+ }
30
+ const stripped = trimmed.replace(makeVoicePromptBlockRegex(), "").trim();
31
+ return stripped.length > 0 ? stripped : undefined;
32
+ }
33
+ export function buildVoiceModeSystemPrompt(existing, enabled) {
34
+ const basePrompt = stripVoiceModeSystemPrompt(existing);
35
+ const voiceInstruction = enabled
36
+ ? VOICE_AGENT_SYSTEM_INSTRUCTION
37
+ : VOICE_AGENT_DISABLED_INSTRUCTION;
38
+ const voiceBlock = [VOICE_PROMPT_BLOCK_START, voiceInstruction, VOICE_PROMPT_BLOCK_END].join("\n");
39
+ return [basePrompt, voiceBlock]
40
+ .filter((entry) => typeof entry === "string" && entry.length > 0)
41
+ .join("\n\n");
42
+ }
43
+ export function buildVoiceAgentMcpServerConfig(params) {
44
+ return {
45
+ type: "stdio",
46
+ command: params.command,
47
+ args: [...params.baseArgs, "--socket", params.socketPath],
48
+ ...(params.env ? { env: params.env } : {}),
49
+ };
50
+ }
51
+ //# sourceMappingURL=voice-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-config.js","sourceRoot":"","sources":["../../../src/server/voice-config.ts"],"names":[],"mappings":"AAAA,MAAM,wBAAwB,GAAG,oBAAoB,CAAC;AACtD,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;AAErD,MAAM,8BAA8B,GAAG;IACrC,6BAA6B;IAC7B,oCAAoC;IACpC,uDAAuD;IACvD,8DAA8D;IAC9D,+HAA+H;IAC/H,2FAA2F;IAC3F,6CAA6C;IAC7C,kEAAkE;IAClE,2KAA2K;IAC3K,wDAAwD;CACzD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,MAAM,gCAAgC,GAAG;IACvC,8BAA8B;IAC9B,kEAAkE;CACnE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,yBAAyB;IAChC,OAAO,IAAI,MAAM,CACf,GAAG,YAAY,CAAC,wBAAwB,CAAC,aAAa,YAAY,CAChE,sBAAsB,CACvB,EAAE,EACH,GAAG,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAiB;IAC1D,MAAM,OAAO,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzE,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAA4B,EAAE,OAAgB;IACvF,MAAM,UAAU,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,gBAAgB,GAAG,OAAO;QAC9B,CAAC,CAAC,8BAA8B;QAChC,CAAC,CAAC,gCAAgC,CAAC;IACrC,MAAM,UAAU,GAAG,CAAC,wBAAwB,EAAE,gBAAgB,EAAE,sBAAsB,CAAC,CAAC,IAAI,CAC1F,IAAI,CACL,CAAC;IAEF,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SACjF,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,MAK9C;IAMC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;QACzD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { existsSync } from "node:fs";
2
+ import { fileURLToPath } from "node:url";
3
+ const DEFAULT_BRIDGE_SCRIPT_RELATIVE_URL = "../../scripts/mcp-stdio-socket-bridge-cli.mjs";
4
+ export function resolveVoiceMcpBridgeScriptPath(params) {
5
+ const explicitScriptPath = params.explicitScriptPath?.trim();
6
+ if (explicitScriptPath) {
7
+ if (!existsSync(explicitScriptPath)) {
8
+ throw new Error(`MCP stdio-socket bridge script not found at configured path: ${explicitScriptPath}`);
9
+ }
10
+ return explicitScriptPath;
11
+ }
12
+ const scriptPath = fileURLToPath(new URL(DEFAULT_BRIDGE_SCRIPT_RELATIVE_URL, params.bootstrapModuleUrl));
13
+ if (!existsSync(scriptPath)) {
14
+ throw new Error(`MCP stdio-socket bridge script not found: ${scriptPath}`);
15
+ }
16
+ return scriptPath;
17
+ }
18
+ export function resolveVoiceMcpBridgeFromRuntime(params) {
19
+ const scriptPath = resolveVoiceMcpBridgeScriptPath({
20
+ bootstrapModuleUrl: params.bootstrapModuleUrl,
21
+ explicitScriptPath: params.explicitScriptPath,
22
+ });
23
+ return {
24
+ source: params.explicitScriptPath?.trim() ? "explicit-js-script" : "default-js-script",
25
+ resolved: {
26
+ command: params.execPath,
27
+ baseArgs: [scriptPath],
28
+ },
29
+ };
30
+ }
31
+ //# sourceMappingURL=voice-mcp-bridge-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-mcp-bridge-command.js","sourceRoot":"","sources":["../../../src/server/voice-mcp-bridge-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,MAAM,kCAAkC,GAAG,+CAA+C,CAAC;AAE3F,MAAM,UAAU,+BAA+B,CAAC,MAG/C;IACC,MAAM,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC7D,IAAI,kBAAkB,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,gEAAgE,kBAAkB,EAAE,CACrF,CAAC;QACJ,CAAC;QACD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAC9B,IAAI,GAAG,CAAC,kCAAkC,EAAE,MAAM,CAAC,kBAAkB,CAAC,CACvE,CAAC;IACF,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,6CAA6C,UAAU,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,MAIhD;IAIC,MAAM,UAAU,GAAG,+BAA+B,CAAC;QACjD,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;QAC7C,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;KAC9C,CAAC,CAAC;IACH,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB;QACtF,QAAQ,EAAE;YACR,OAAO,EAAE,MAAM,CAAC,QAAQ;YACxB,QAAQ,EAAE,CAAC,UAAU,CAAC;SACvB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,109 @@
1
+ import net from "node:net";
2
+ import path from "node:path";
3
+ import { mkdir, rm } from "node:fs/promises";
4
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
+ function toSocketName(callerAgentId) {
6
+ return `voice-mcp-${callerAgentId}.sock`;
7
+ }
8
+ export function createVoiceMcpSocketBridgeManager(params) {
9
+ const logger = params.logger.child({ module: "voice-mcp-bridge" });
10
+ const entries = new Map();
11
+ const pendingCreates = new Map();
12
+ const ensureBridgeForCaller = async (callerAgentId) => {
13
+ const existing = entries.get(callerAgentId);
14
+ if (existing) {
15
+ return existing.socketPath;
16
+ }
17
+ const pending = pendingCreates.get(callerAgentId);
18
+ if (pending) {
19
+ return pending;
20
+ }
21
+ const createPromise = (async () => {
22
+ const socketPath = path.join(params.runtimeDir, toSocketName(callerAgentId));
23
+ const sockets = new Set();
24
+ const server = net.createServer((socket) => {
25
+ sockets.add(socket);
26
+ const connectionLogger = logger.child({ callerAgentId, component: "connection" });
27
+ let mcpServer = null;
28
+ let transport = null;
29
+ const cleanup = async () => {
30
+ sockets.delete(socket);
31
+ await Promise.all([
32
+ transport?.close().catch(() => undefined),
33
+ mcpServer?.close?.().catch(() => undefined),
34
+ ]);
35
+ };
36
+ socket.on("error", (error) => {
37
+ connectionLogger.error({ err: error }, "Voice MCP bridge socket error");
38
+ });
39
+ socket.on("close", () => {
40
+ void cleanup();
41
+ });
42
+ void (async () => {
43
+ try {
44
+ mcpServer = await params.createAgentMcpServerForCaller(callerAgentId);
45
+ transport = new StdioServerTransport(socket, socket);
46
+ await mcpServer.connect(transport);
47
+ }
48
+ catch (error) {
49
+ connectionLogger.error({ err: error, callerAgentId }, "Failed to initialize stream-level MCP bridge connection");
50
+ socket.destroy();
51
+ }
52
+ })();
53
+ });
54
+ await mkdir(params.runtimeDir, { recursive: true });
55
+ await rm(socketPath, { force: true }).catch(() => undefined);
56
+ await new Promise((resolve, reject) => {
57
+ server.once("error", reject);
58
+ server.listen(socketPath, () => {
59
+ server.off("error", reject);
60
+ resolve();
61
+ });
62
+ });
63
+ entries.set(callerAgentId, { socketPath, server, sockets });
64
+ logger.info({ callerAgentId, socketPath }, "Voice MCP per-agent socket bridge listening");
65
+ return socketPath;
66
+ })();
67
+ pendingCreates.set(callerAgentId, createPromise);
68
+ try {
69
+ return await createPromise;
70
+ }
71
+ finally {
72
+ pendingCreates.delete(callerAgentId);
73
+ }
74
+ };
75
+ const removeBridgeForCaller = async (callerAgentId) => {
76
+ const entry = entries.get(callerAgentId);
77
+ if (!entry) {
78
+ return;
79
+ }
80
+ entries.delete(callerAgentId);
81
+ for (const socket of entry.sockets) {
82
+ socket.destroy();
83
+ }
84
+ await new Promise((resolve, reject) => {
85
+ entry.server.close((error) => {
86
+ if (error)
87
+ reject(error);
88
+ else
89
+ resolve();
90
+ });
91
+ });
92
+ await rm(entry.socketPath, { force: true }).catch(() => undefined);
93
+ logger.info({ callerAgentId, socketPath: entry.socketPath }, "Voice MCP socket bridge removed");
94
+ };
95
+ const stop = async () => {
96
+ const activeCallerIds = Array.from(entries.keys());
97
+ for (const callerAgentId of activeCallerIds) {
98
+ await removeBridgeForCaller(callerAgentId).catch((error) => {
99
+ logger.warn({ err: error, callerAgentId }, "Failed to stop voice MCP socket bridge");
100
+ });
101
+ }
102
+ };
103
+ return {
104
+ ensureBridgeForCaller,
105
+ removeBridgeForCaller,
106
+ stop,
107
+ };
108
+ }
109
+ //# sourceMappingURL=voice-mcp-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-mcp-bridge.js","sourceRoot":"","sources":["../../../src/server/voice-mcp-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { isSpeakToolName } from "./agent/tool-name-normalization.js";
2
+ /** Voice assistant policy: only allow the speak tool. */
3
+ export function isVoicePermissionAllowed(request) {
4
+ if (request.kind !== "tool") {
5
+ return false;
6
+ }
7
+ const normalizedName = request.name.trim().toLowerCase();
8
+ if (!normalizedName) {
9
+ return false;
10
+ }
11
+ return isSpeakToolName(normalizedName);
12
+ }
13
+ //# sourceMappingURL=voice-permission-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-permission-policy.js","sourceRoot":"","sources":["../../../src/server/voice-permission-policy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAErE,yDAAyD;AACzD,MAAM,UAAU,wBAAwB,CAAC,OAA+B;IACtE,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACzD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,eAAe,CAAC,cAAc,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=voice-types.js.map