@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,183 @@
1
+ import { promises as fs } from "fs";
2
+ import path from "path";
3
+ const TEXT_MIME_TYPES = {
4
+ ".json": "application/json",
5
+ };
6
+ const DEFAULT_TEXT_MIME_TYPE = "text/plain";
7
+ const IMAGE_MIME_TYPES = {
8
+ ".png": "image/png",
9
+ ".jpg": "image/jpeg",
10
+ ".jpeg": "image/jpeg",
11
+ ".gif": "image/gif",
12
+ ".webp": "image/webp",
13
+ ".svg": "image/svg+xml",
14
+ };
15
+ export async function listDirectoryEntries({ root, relativePath = ".", }) {
16
+ const directoryPath = await resolveScopedPath({ root, relativePath });
17
+ const stats = await fs.stat(directoryPath);
18
+ if (!stats.isDirectory()) {
19
+ throw new Error("Requested path is not a directory");
20
+ }
21
+ const dirents = await fs.readdir(directoryPath, { withFileTypes: true });
22
+ const entriesWithNulls = await Promise.all(dirents.map(async (dirent) => {
23
+ const targetPath = path.join(directoryPath, dirent.name);
24
+ const kind = dirent.isDirectory()
25
+ ? "directory"
26
+ : "file";
27
+ try {
28
+ return await buildEntryPayload({
29
+ root,
30
+ targetPath,
31
+ name: dirent.name,
32
+ kind,
33
+ });
34
+ }
35
+ catch (error) {
36
+ // Directories can contain dangling links (e.g. AGENTS.md -> CLAUDE.md).
37
+ // Skip entries whose targets disappeared instead of failing the whole listing.
38
+ if (isMissingEntryError(error)) {
39
+ return null;
40
+ }
41
+ throw error;
42
+ }
43
+ }));
44
+ const entries = entriesWithNulls.filter((entry) => entry !== null);
45
+ entries.sort((a, b) => {
46
+ const modifiedComparison = new Date(b.modifiedAt).getTime() - new Date(a.modifiedAt).getTime();
47
+ if (modifiedComparison !== 0) {
48
+ return modifiedComparison;
49
+ }
50
+ return a.name.localeCompare(b.name);
51
+ });
52
+ return {
53
+ path: normalizeRelativePath({ root, targetPath: directoryPath }),
54
+ entries,
55
+ };
56
+ }
57
+ export async function readExplorerFile({ root, relativePath, }) {
58
+ const filePath = await resolveScopedPath({ root, relativePath });
59
+ const stats = await fs.stat(filePath);
60
+ if (!stats.isFile()) {
61
+ throw new Error("Requested path is not a file");
62
+ }
63
+ const ext = path.extname(filePath).toLowerCase();
64
+ const basePayload = {
65
+ path: normalizeRelativePath({ root, targetPath: filePath }),
66
+ size: stats.size,
67
+ modifiedAt: stats.mtime.toISOString(),
68
+ };
69
+ if (ext in IMAGE_MIME_TYPES) {
70
+ const buffer = await fs.readFile(filePath);
71
+ return {
72
+ ...basePayload,
73
+ kind: "image",
74
+ encoding: "base64",
75
+ content: buffer.toString("base64"),
76
+ mimeType: IMAGE_MIME_TYPES[ext],
77
+ };
78
+ }
79
+ const buffer = await fs.readFile(filePath);
80
+ if (isLikelyBinary(buffer)) {
81
+ return {
82
+ ...basePayload,
83
+ kind: "binary",
84
+ encoding: "none",
85
+ mimeType: "application/octet-stream",
86
+ };
87
+ }
88
+ return {
89
+ ...basePayload,
90
+ kind: "text",
91
+ encoding: "utf-8",
92
+ content: buffer.toString("utf-8"),
93
+ mimeType: textMimeTypeForExtension(ext),
94
+ };
95
+ }
96
+ export async function getDownloadableFileInfo({ root, relativePath, }) {
97
+ const filePath = await resolveScopedPath({ root, relativePath });
98
+ const stats = await fs.stat(filePath);
99
+ if (!stats.isFile()) {
100
+ throw new Error("Requested path is not a file");
101
+ }
102
+ const ext = path.extname(filePath).toLowerCase();
103
+ let mimeType = "application/octet-stream";
104
+ if (ext in IMAGE_MIME_TYPES) {
105
+ mimeType = IMAGE_MIME_TYPES[ext];
106
+ }
107
+ else {
108
+ // Read only a small prefix to classify likely text vs binary.
109
+ const handle = await fs.open(filePath, "r");
110
+ const sample = Buffer.alloc(8192);
111
+ try {
112
+ const { bytesRead } = await handle.read(sample, 0, sample.length, 0);
113
+ const chunk = bytesRead < sample.length ? sample.subarray(0, bytesRead) : sample;
114
+ if (!isLikelyBinary(chunk)) {
115
+ mimeType = textMimeTypeForExtension(ext);
116
+ }
117
+ }
118
+ finally {
119
+ await handle.close();
120
+ }
121
+ }
122
+ return {
123
+ path: normalizeRelativePath({ root, targetPath: filePath }),
124
+ absolutePath: filePath,
125
+ fileName: path.basename(filePath),
126
+ mimeType,
127
+ size: stats.size,
128
+ };
129
+ }
130
+ async function resolveScopedPath({ root, relativePath = ".", }) {
131
+ const normalizedRoot = path.resolve(root);
132
+ const requestedPath = path.resolve(normalizedRoot, relativePath);
133
+ const relative = path.relative(normalizedRoot, requestedPath);
134
+ if (relative === "" ||
135
+ (!relative.startsWith("..") && !path.isAbsolute(relative))) {
136
+ return requestedPath;
137
+ }
138
+ throw new Error("Access outside of workspace is not allowed");
139
+ }
140
+ async function buildEntryPayload({ root, targetPath, name, kind, }) {
141
+ const stats = await fs.stat(targetPath);
142
+ return {
143
+ name,
144
+ path: normalizeRelativePath({ root, targetPath }),
145
+ kind,
146
+ size: stats.size,
147
+ modifiedAt: stats.mtime.toISOString(),
148
+ };
149
+ }
150
+ function isMissingEntryError(error) {
151
+ const code = error?.code;
152
+ return code === "ENOENT" || code === "ENOTDIR" || code === "ELOOP";
153
+ }
154
+ function normalizeRelativePath({ root, targetPath, }) {
155
+ const normalizedRoot = path.resolve(root);
156
+ const normalizedTarget = path.resolve(targetPath);
157
+ const relative = path.relative(normalizedRoot, normalizedTarget);
158
+ return relative === "" ? "." : relative.split(path.sep).join("/");
159
+ }
160
+ function textMimeTypeForExtension(ext) {
161
+ return TEXT_MIME_TYPES[ext] ?? DEFAULT_TEXT_MIME_TYPE;
162
+ }
163
+ function isLikelyBinary(buffer) {
164
+ if (buffer.length === 0) {
165
+ return false;
166
+ }
167
+ let suspicious = 0;
168
+ for (let idx = 0; idx < buffer.length; idx += 1) {
169
+ const byte = buffer[idx];
170
+ if (byte === 0) {
171
+ return true;
172
+ }
173
+ const isControl = byte < 32 &&
174
+ byte !== 9 && // tab
175
+ byte !== 10 && // newline
176
+ byte !== 13; // carriage return
177
+ if (isControl || byte === 127) {
178
+ suspicious += 1;
179
+ }
180
+ }
181
+ return suspicious / buffer.length > 0.3;
182
+ }
183
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/server/file-explorer/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Coerce arbitrary values into JSON-safe structures.
3
+ * Unlike the previous implementation, this never throws on undefined—
4
+ * it replaces unsupported values (undefined, functions, symbols) with null
5
+ * so responses always make it back to the client.
6
+ */
7
+ export function ensureValidJson(value) {
8
+ const seen = new WeakSet();
9
+ const sanitize = (current) => {
10
+ if (current === null || current === undefined) {
11
+ return null;
12
+ }
13
+ if (typeof current === "string" || typeof current === "number") {
14
+ return current;
15
+ }
16
+ if (typeof current === "boolean") {
17
+ return current;
18
+ }
19
+ if (typeof current === "bigint") {
20
+ return current.toString();
21
+ }
22
+ if (current instanceof Date) {
23
+ return current.toISOString();
24
+ }
25
+ if (Array.isArray(current)) {
26
+ return current.map((item) => sanitize(item));
27
+ }
28
+ if (typeof current === "object") {
29
+ if (seen.has(current)) {
30
+ throw new Error("Cannot serialize circular structure to JSON");
31
+ }
32
+ seen.add(current);
33
+ const obj = {};
34
+ for (const [key, val] of Object.entries(current)) {
35
+ obj[key] = sanitize(val);
36
+ }
37
+ seen.delete(current);
38
+ return obj;
39
+ }
40
+ // functions, symbols, undefined, etc.
41
+ return null;
42
+ };
43
+ return sanitize(value);
44
+ }
45
+ //# sourceMappingURL=json-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-utils.js","sourceRoot":"","sources":["../../../src/server/json-utils.ts"],"names":[],"mappings":"AAQA;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAI,KAAQ;IACzC,MAAM,IAAI,GAAG,IAAI,OAAO,EAAU,CAAC;IAEnC,MAAM,QAAQ,GAAG,CAAC,OAAgB,EAAa,EAAE;QAC/C,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC/D,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,OAAO,OAAO,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC;QAED,IAAI,OAAO,YAAY,IAAI,EAAE,CAAC;YAC5B,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC;QAC/B,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAiB,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,OAAiB,CAAC,CAAC;YAC5B,MAAM,GAAG,GAA8B,EAAE,CAAC;YAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAkC,CAAC,EAAE,CAAC;gBAC5E,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,OAAiB,CAAC,CAAC;YAC/B,OAAO,GAAG,CAAC;QACb,CAAC;QAED,sCAAsC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,OAAO,QAAQ,CAAC,KAAK,CAAM,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { toAgentPayload } from "./agent/agent-projections.js";
2
+ import { AgentStreamEventPayloadSchema as AgentStreamEventPayloadRuntimeSchema } from "../shared/messages.js";
3
+ export * from "../shared/messages.js";
4
+ function validateStreamEventPayload(payload) {
5
+ const parsed = AgentStreamEventPayloadRuntimeSchema.safeParse(payload);
6
+ if (!parsed.success) {
7
+ return null;
8
+ }
9
+ return parsed.data;
10
+ }
11
+ export function serializeAgentSnapshot(agent, options) {
12
+ return toAgentPayload(agent, options);
13
+ }
14
+ export function serializeAgentStreamEvent(event) {
15
+ if (event.type === "attention_required") {
16
+ // Providers may emit attention_required without per-client notification context.
17
+ // The websocket server emits attention_required with shouldNotify computed per client.
18
+ // Normalize provider events so they satisfy the shared schema.
19
+ return validateStreamEventPayload({
20
+ type: "attention_required",
21
+ provider: event.provider,
22
+ reason: event.reason,
23
+ timestamp: event.timestamp,
24
+ shouldNotify: false,
25
+ });
26
+ }
27
+ return validateStreamEventPayload(event);
28
+ }
29
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/server/messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAM9D,OAAO,EAAE,6BAA6B,IAAI,oCAAoC,EAAE,MAAM,uBAAuB,CAAC;AAE9G,cAAc,uBAAuB,CAAC;AAEtC,SAAS,0BAA0B,CACjC,OAAgB;IAEhB,MAAM,MAAM,GAAG,oCAAoC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACvE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAmB,EACnB,OAAmC;IAEnC,OAAO,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,KAAuB;IAEvB,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;QACxC,iFAAiF;QACjF,uFAAuF;QACvF,+DAA+D;QAC/D,OAAO,0BAA0B,CAAC;YAChC,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,0BAA0B,CAAC,KAAK,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ export class PackageVersionResolutionError extends Error {
5
+ constructor(params) {
6
+ super(`Unable to resolve ${params.packageName} version from module URL ${params.moduleUrl}.`);
7
+ this.name = "PackageVersionResolutionError";
8
+ }
9
+ }
10
+ export function resolvePackageVersion(params) {
11
+ const moduleUrl = params.moduleUrl ?? import.meta.url;
12
+ let currentDir = path.dirname(fileURLToPath(moduleUrl));
13
+ while (true) {
14
+ const packageJsonPath = path.join(currentDir, "package.json");
15
+ if (existsSync(packageJsonPath)) {
16
+ try {
17
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8"));
18
+ if (packageJson.name === params.packageName) {
19
+ if (typeof packageJson.version === "string" &&
20
+ packageJson.version.trim().length > 0) {
21
+ return packageJson.version.trim();
22
+ }
23
+ throw new PackageVersionResolutionError({
24
+ moduleUrl,
25
+ packageName: params.packageName,
26
+ });
27
+ }
28
+ }
29
+ catch (error) {
30
+ if (error instanceof PackageVersionResolutionError) {
31
+ throw error;
32
+ }
33
+ // Continue searching parent directories.
34
+ }
35
+ }
36
+ const parentDir = path.dirname(currentDir);
37
+ if (parentDir === currentDir) {
38
+ break;
39
+ }
40
+ currentDir = parentDir;
41
+ }
42
+ throw new PackageVersionResolutionError({
43
+ moduleUrl,
44
+ packageName: params.packageName,
45
+ });
46
+ }
47
+ //# sourceMappingURL=package-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-version.js","sourceRoot":"","sources":["../../../src/server/package-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAYzC,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IACtD,YAAY,MAAkD;QAC5D,KAAK,CACH,qBAAqB,MAAM,CAAC,WAAW,4BAA4B,MAAM,CAAC,SAAS,GAAG,CACvF,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAmC;IACvE,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACtD,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IAExD,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC9D,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAgB,CAAC;gBACrF,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC;oBAC5C,IACE,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ;wBACvC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EACrC,CAAC;wBACD,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;oBACpC,CAAC;oBACD,MAAM,IAAI,6BAA6B,CAAC;wBACtC,SAAS;wBACT,WAAW,EAAE,MAAM,CAAC,WAAW;qBAChC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,6BAA6B,EAAE,CAAC;oBACnD,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,yCAAyC;YAC3C,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,MAAM;QACR,CAAC;QACD,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,MAAM,IAAI,6BAA6B,CAAC;QACtC,SAAS;QACT,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,19 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ import { mkdirSync } from "node:fs";
4
+ function expandHomeDir(input) {
5
+ if (input.startsWith("~/")) {
6
+ return path.join(os.homedir(), input.slice(2));
7
+ }
8
+ if (input === "~") {
9
+ return os.homedir();
10
+ }
11
+ return input;
12
+ }
13
+ export function resolvePaseoHome(env = process.env) {
14
+ const raw = env.PASEO_HOME ?? "~/.paseo";
15
+ const resolved = path.resolve(expandHomeDir(raw));
16
+ mkdirSync(resolved, { recursive: true });
17
+ return resolved;
18
+ }
19
+ //# sourceMappingURL=paseo-home.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paseo-home.js","sourceRoot":"","sources":["../../../src/server/paseo-home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACnE,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,UAAU,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { homedir } from "node:os";
2
+ import { isAbsolute, resolve } from "node:path";
3
+ function hasHomePrefix(value) {
4
+ return value === "~" || value.startsWith("~/");
5
+ }
6
+ export function expandUserPath(value) {
7
+ const trimmed = value.trim();
8
+ if (hasHomePrefix(trimmed)) {
9
+ return resolve(homedir(), trimmed.slice(2));
10
+ }
11
+ return resolve(trimmed);
12
+ }
13
+ export function resolvePathFromBase(baseCwd, requestedPath) {
14
+ const trimmed = requestedPath.trim();
15
+ if (hasHomePrefix(trimmed) || isAbsolute(trimmed)) {
16
+ return expandUserPath(trimmed);
17
+ }
18
+ return resolve(baseCwd, trimmed);
19
+ }
20
+ //# sourceMappingURL=path-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../../src/server/path-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEhD,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,aAAqB;IACxE,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAClD,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,259 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { z } from "zod";
4
+ import { AGENT_PROVIDER_IDS } from "./agent/provider-manifest.js";
5
+ import { AgentProviderRuntimeSettingsMapSchema } from "./agent/provider-launch-config.js";
6
+ const LogLevelSchema = z.enum(["trace", "debug", "info", "warn", "error", "fatal"]);
7
+ const LogFormatSchema = z.enum(["pretty", "json"]);
8
+ const LogConfigSchema = z
9
+ .object({
10
+ // Legacy global log settings (kept for backwards compatibility).
11
+ level: LogLevelSchema.optional(),
12
+ format: LogFormatSchema.optional(),
13
+ console: z
14
+ .object({
15
+ level: LogLevelSchema.optional(),
16
+ format: LogFormatSchema.optional(),
17
+ })
18
+ .strict()
19
+ .optional(),
20
+ file: z
21
+ .object({
22
+ level: LogLevelSchema.optional(),
23
+ path: z.string().min(1).optional(),
24
+ rotate: z
25
+ .object({
26
+ maxSize: z.string().min(1).optional(),
27
+ maxFiles: z.number().int().positive().optional(),
28
+ })
29
+ .strict()
30
+ .optional(),
31
+ })
32
+ .strict()
33
+ .optional(),
34
+ })
35
+ .strict();
36
+ const ProviderCredentialsSchema = z
37
+ .object({
38
+ apiKey: z.string().min(1).optional(),
39
+ })
40
+ .strict();
41
+ const LocalSpeechProviderSchema = z
42
+ .object({
43
+ modelsDir: z.string().min(1).optional(),
44
+ })
45
+ .strict();
46
+ const ProvidersSchema = z
47
+ .object({
48
+ openai: ProviderCredentialsSchema.optional(),
49
+ local: LocalSpeechProviderSchema.optional(),
50
+ })
51
+ .strict();
52
+ const SpeechProviderIdSchema = z
53
+ .string()
54
+ .trim()
55
+ .toLowerCase()
56
+ .pipe(z.enum(["openai", "local"]));
57
+ const FeatureDictationSchema = z
58
+ .object({
59
+ enabled: z.boolean().optional(),
60
+ stt: z
61
+ .object({
62
+ provider: SpeechProviderIdSchema.optional(),
63
+ model: z.string().min(1).optional(),
64
+ confidenceThreshold: z.number().optional(),
65
+ })
66
+ .strict()
67
+ .optional(),
68
+ })
69
+ .strict();
70
+ const FeatureVoiceModeSchema = z
71
+ .object({
72
+ enabled: z.boolean().optional(),
73
+ llm: z
74
+ .object({
75
+ provider: z.enum(AGENT_PROVIDER_IDS).optional(),
76
+ model: z.string().min(1).optional(),
77
+ })
78
+ .strict()
79
+ .optional(),
80
+ stt: z
81
+ .object({
82
+ provider: SpeechProviderIdSchema.optional(),
83
+ model: z.string().min(1).optional(),
84
+ })
85
+ .strict()
86
+ .optional(),
87
+ tts: z
88
+ .object({
89
+ provider: SpeechProviderIdSchema.optional(),
90
+ model: z.string().min(1).optional(),
91
+ voice: z.enum(["alloy", "echo", "fable", "onyx", "nova", "shimmer"]).optional(),
92
+ speakerId: z.number().int().optional(),
93
+ speed: z.number().optional(),
94
+ })
95
+ .strict()
96
+ .optional(),
97
+ })
98
+ .strict();
99
+ export const PersistedConfigSchema = z
100
+ .object({
101
+ // v1 schema marker
102
+ version: z.literal(1).optional(),
103
+ // v1 config layout
104
+ daemon: z
105
+ .object({
106
+ listen: z.string().optional(),
107
+ allowedHosts: z.union([z.literal(true), z.array(z.string())]).optional(),
108
+ mcp: z
109
+ .object({
110
+ enabled: z.boolean().optional(),
111
+ })
112
+ .strict()
113
+ .optional(),
114
+ cors: z
115
+ .object({
116
+ allowedOrigins: z.array(z.string()).optional(),
117
+ })
118
+ .strict()
119
+ .optional(),
120
+ relay: z
121
+ .object({
122
+ enabled: z.boolean().optional(),
123
+ endpoint: z.string().optional(),
124
+ publicEndpoint: z.string().optional(),
125
+ })
126
+ .strict()
127
+ .optional(),
128
+ })
129
+ .strict()
130
+ .optional(),
131
+ app: z
132
+ .object({
133
+ baseUrl: z.string().optional(),
134
+ })
135
+ .strict()
136
+ .optional(),
137
+ providers: ProvidersSchema.optional(),
138
+ agents: z
139
+ .object({
140
+ providers: AgentProviderRuntimeSettingsMapSchema.optional(),
141
+ })
142
+ .strict()
143
+ .optional(),
144
+ features: z
145
+ .object({
146
+ dictation: FeatureDictationSchema.optional(),
147
+ voiceMode: FeatureVoiceModeSchema.optional(),
148
+ })
149
+ .strict()
150
+ .optional(),
151
+ log: LogConfigSchema.optional(),
152
+ })
153
+ .strict();
154
+ const CONFIG_FILENAME = "config.json";
155
+ const DEFAULT_PERSISTED_CONFIG = PersistedConfigSchema.parse({
156
+ version: 1,
157
+ daemon: {
158
+ listen: "127.0.0.1:6767",
159
+ cors: {
160
+ allowedOrigins: ["https://app.paseo.sh"],
161
+ },
162
+ relay: {
163
+ enabled: true,
164
+ },
165
+ },
166
+ app: {
167
+ baseUrl: "https://app.paseo.sh",
168
+ },
169
+ });
170
+ function getConfigPath(paseoHome) {
171
+ return path.join(paseoHome, CONFIG_FILENAME);
172
+ }
173
+ function getLogger(logger) {
174
+ return logger?.child({ module: "config" });
175
+ }
176
+ function stripDeprecatedLocalSpeechConfigFields(parsed) {
177
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
178
+ return parsed;
179
+ }
180
+ const root = { ...parsed };
181
+ const providers = root.providers;
182
+ if (!providers || typeof providers !== "object" || Array.isArray(providers)) {
183
+ return root;
184
+ }
185
+ const providersRecord = { ...providers };
186
+ const local = providersRecord.local;
187
+ if (!local || typeof local !== "object" || Array.isArray(local)) {
188
+ root.providers = providersRecord;
189
+ return root;
190
+ }
191
+ const localRecord = { ...local };
192
+ if ("autoDownload" in localRecord) {
193
+ delete localRecord.autoDownload;
194
+ }
195
+ providersRecord.local = localRecord;
196
+ root.providers = providersRecord;
197
+ return root;
198
+ }
199
+ export function loadPersistedConfig(paseoHome, logger) {
200
+ const log = getLogger(logger);
201
+ const configPath = getConfigPath(paseoHome);
202
+ if (!existsSync(configPath)) {
203
+ try {
204
+ mkdirSync(path.dirname(configPath), { recursive: true });
205
+ writeFileSync(configPath, JSON.stringify(DEFAULT_PERSISTED_CONFIG, null, 2) + "\n");
206
+ log?.info(`Initialized config file at ${configPath}`);
207
+ }
208
+ catch (err) {
209
+ const message = err instanceof Error ? err.message : String(err);
210
+ throw new Error(`[Config] Failed to initialize ${configPath}: ${message}`);
211
+ }
212
+ }
213
+ let raw;
214
+ try {
215
+ raw = readFileSync(configPath, "utf-8");
216
+ }
217
+ catch (err) {
218
+ const message = err instanceof Error ? err.message : String(err);
219
+ throw new Error(`[Config] Failed to read ${configPath}: ${message}`);
220
+ }
221
+ let parsed;
222
+ try {
223
+ parsed = JSON.parse(raw);
224
+ }
225
+ catch (err) {
226
+ const message = err instanceof Error ? err.message : String(err);
227
+ throw new Error(`[Config] Invalid JSON in ${configPath}: ${message}`);
228
+ }
229
+ const migrated = stripDeprecatedLocalSpeechConfigFields(parsed);
230
+ const result = PersistedConfigSchema.safeParse(migrated);
231
+ if (!result.success) {
232
+ const issues = result.error.issues
233
+ .map((i) => ` - ${i.path.join(".")}: ${i.message}`)
234
+ .join("\n");
235
+ throw new Error(`[Config] Invalid config in ${configPath}:\n${issues}`);
236
+ }
237
+ log?.info(`Loaded from ${configPath}`);
238
+ return result.data;
239
+ }
240
+ export function savePersistedConfig(paseoHome, config, logger) {
241
+ const log = getLogger(logger);
242
+ const configPath = getConfigPath(paseoHome);
243
+ const result = PersistedConfigSchema.safeParse(config);
244
+ if (!result.success) {
245
+ const issues = result.error.issues
246
+ .map((i) => ` - ${i.path.join(".")}: ${i.message}`)
247
+ .join("\n");
248
+ throw new Error(`[Config] Invalid config to save:\n${issues}`);
249
+ }
250
+ try {
251
+ writeFileSync(configPath, JSON.stringify(result.data, null, 2) + "\n");
252
+ log?.info(`Saved to ${configPath}`);
253
+ }
254
+ catch (err) {
255
+ const message = err instanceof Error ? err.message : String(err);
256
+ throw new Error(`[Config] Failed to write ${configPath}: ${message}`);
257
+ }
258
+ }
259
+ //# sourceMappingURL=persisted-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persisted-config.js","sourceRoot":"","sources":["../../../src/server/persisted-config.ts"],"names":[],"mappings":"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"}