@getpaseo/server 0.1.15 → 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 (364) 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 +63 -6
  8. package/dist/server/client/daemon-client.d.ts.map +1 -1
  9. package/dist/server/client/daemon-client.js +436 -92
  10. package/dist/server/client/daemon-client.js.map +1 -1
  11. package/dist/server/server/agent/agent-manager.d.ts +13 -1
  12. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  13. package/dist/server/server/agent/agent-manager.js +404 -39
  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-projections.d.ts +5 -0
  19. package/dist/server/server/agent/agent-projections.d.ts.map +1 -1
  20. package/dist/server/server/agent/agent-projections.js +24 -0
  21. package/dist/server/server/agent/agent-projections.js.map +1 -1
  22. package/dist/server/server/agent/agent-response-loop.js +1 -1
  23. package/dist/server/server/agent/agent-response-loop.js.map +1 -1
  24. package/dist/server/server/agent/agent-sdk-types.d.ts +20 -0
  25. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  26. package/dist/server/server/agent/agent-sdk-types.js +11 -1
  27. package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
  28. package/dist/server/server/agent/agent-storage.d.ts +20 -6
  29. package/dist/server/server/agent/agent-storage.d.ts.map +1 -1
  30. package/dist/server/server/agent/agent-storage.js +43 -72
  31. package/dist/server/server/agent/agent-storage.js.map +1 -1
  32. package/dist/server/server/agent/agent-title-limits.d.ts +3 -0
  33. package/dist/server/server/agent/agent-title-limits.d.ts.map +1 -0
  34. package/dist/server/server/agent/agent-title-limits.js +3 -0
  35. package/dist/server/server/agent/agent-title-limits.js.map +1 -0
  36. package/dist/server/server/agent/providers/claude/model-catalog.d.ts +29 -0
  37. package/dist/server/server/agent/providers/claude/model-catalog.d.ts.map +1 -0
  38. package/dist/server/server/agent/providers/claude/model-catalog.js +70 -0
  39. package/dist/server/server/agent/providers/claude/model-catalog.js.map +1 -0
  40. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +44 -0
  41. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -0
  42. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +250 -0
  43. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -0
  44. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -1
  45. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +17 -0
  46. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
  47. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -1
  48. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +2 -0
  49. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
  50. package/dist/server/server/agent/providers/claude-agent.d.ts +10 -3
  51. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  52. package/dist/server/server/agent/providers/claude-agent.js +1702 -330
  53. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  54. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
  55. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +81 -28
  56. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
  57. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  58. package/dist/server/server/agent/providers/codex-app-server-agent.js +50 -9
  59. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  60. package/dist/server/server/agent/providers/opencode-agent.d.ts +10 -1
  61. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  62. package/dist/server/server/agent/providers/opencode-agent.js +207 -176
  63. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  64. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +55 -0
  65. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  66. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +1 -0
  67. package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -1
  68. package/dist/server/server/agent/timeline-projection.d.ts +20 -0
  69. package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
  70. package/dist/server/server/agent/timeline-projection.js +73 -0
  71. package/dist/server/server/agent/timeline-projection.js.map +1 -1
  72. package/dist/server/server/bootstrap.d.ts +15 -0
  73. package/dist/server/server/bootstrap.d.ts.map +1 -1
  74. package/dist/server/server/bootstrap.js +27 -4
  75. package/dist/server/server/bootstrap.js.map +1 -1
  76. package/dist/server/server/client-message-id.d.ts +3 -0
  77. package/dist/server/server/client-message-id.d.ts.map +1 -0
  78. package/dist/server/server/client-message-id.js +12 -0
  79. package/dist/server/server/client-message-id.js.map +1 -0
  80. package/dist/server/server/file-download/token-store.d.ts +0 -1
  81. package/dist/server/server/file-download/token-store.d.ts.map +1 -1
  82. package/dist/server/server/file-download/token-store.js.map +1 -1
  83. package/dist/server/server/file-explorer/service.d.ts.map +1 -1
  84. package/dist/server/server/file-explorer/service.js +56 -36
  85. package/dist/server/server/file-explorer/service.js.map +1 -1
  86. package/dist/server/server/index.js +85 -29
  87. package/dist/server/server/index.js.map +1 -1
  88. package/dist/server/server/logger.d.ts +24 -3
  89. package/dist/server/server/logger.d.ts.map +1 -1
  90. package/dist/server/server/logger.js +157 -21
  91. package/dist/server/server/logger.js.map +1 -1
  92. package/dist/server/server/persisted-config.d.ts +94 -8
  93. package/dist/server/server/persisted-config.d.ts.map +1 -1
  94. package/dist/server/server/persisted-config.js +25 -3
  95. package/dist/server/server/persisted-config.js.map +1 -1
  96. package/dist/server/server/persistence-hooks.js +1 -1
  97. package/dist/server/server/persistence-hooks.js.map +1 -1
  98. package/dist/server/server/pid-lock.d.ts +6 -2
  99. package/dist/server/server/pid-lock.d.ts.map +1 -1
  100. package/dist/server/server/pid-lock.js +7 -10
  101. package/dist/server/server/pid-lock.js.map +1 -1
  102. package/dist/server/server/relay-transport.js +28 -28
  103. package/dist/server/server/relay-transport.js.map +1 -1
  104. package/dist/server/server/session.d.ts +60 -4
  105. package/dist/server/server/session.d.ts.map +1 -1
  106. package/dist/server/server/session.js +854 -190
  107. package/dist/server/server/session.js.map +1 -1
  108. package/dist/server/server/websocket-server.d.ts +24 -5
  109. package/dist/server/server/websocket-server.d.ts.map +1 -1
  110. package/dist/server/server/websocket-server.js +400 -77
  111. package/dist/server/server/websocket-server.js.map +1 -1
  112. package/dist/server/server/worktree-bootstrap.d.ts.map +1 -1
  113. package/dist/server/server/worktree-bootstrap.js +45 -2
  114. package/dist/server/server/worktree-bootstrap.js.map +1 -1
  115. package/dist/server/shared/daemon-endpoints.d.ts +9 -1
  116. package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
  117. package/dist/server/shared/daemon-endpoints.js +18 -3
  118. package/dist/server/shared/daemon-endpoints.js.map +1 -1
  119. package/dist/server/shared/messages.d.ts +4432 -380
  120. package/dist/server/shared/messages.d.ts.map +1 -1
  121. package/dist/server/shared/messages.js +139 -6
  122. package/dist/server/shared/messages.js.map +1 -1
  123. package/dist/server/shared/tool-call-display.d.ts.map +1 -1
  124. package/dist/server/shared/tool-call-display.js +7 -0
  125. package/dist/server/shared/tool-call-display.js.map +1 -1
  126. package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
  127. package/dist/server/terminal/terminal-manager.js +1 -13
  128. package/dist/server/terminal/terminal-manager.js.map +1 -1
  129. package/dist/server/terminal/terminal.d.ts.map +1 -1
  130. package/dist/server/terminal/terminal.js +29 -5
  131. package/dist/server/terminal/terminal.js.map +1 -1
  132. package/dist/server/utils/worktree.d.ts +1 -0
  133. package/dist/server/utils/worktree.d.ts.map +1 -1
  134. package/dist/server/utils/worktree.js +17 -2
  135. package/dist/server/utils/worktree.js.map +1 -1
  136. package/dist/src/server/agent/activity-curator.js +228 -0
  137. package/dist/src/server/agent/activity-curator.js.map +1 -0
  138. package/dist/src/server/agent/agent-manager.js +1712 -0
  139. package/dist/src/server/agent/agent-manager.js.map +1 -0
  140. package/dist/src/server/agent/agent-metadata-generator.js +163 -0
  141. package/dist/src/server/agent/agent-metadata-generator.js.map +1 -0
  142. package/dist/src/server/agent/agent-projections.js +262 -0
  143. package/dist/src/server/agent/agent-projections.js.map +1 -0
  144. package/dist/src/server/agent/agent-response-loop.js +304 -0
  145. package/dist/src/server/agent/agent-response-loop.js.map +1 -0
  146. package/dist/src/server/agent/agent-sdk-types.js +12 -0
  147. package/dist/src/server/agent/agent-sdk-types.js.map +1 -0
  148. package/dist/src/server/agent/agent-storage.js +299 -0
  149. package/dist/src/server/agent/agent-storage.js.map +1 -0
  150. package/dist/src/server/agent/agent-title-limits.js +3 -0
  151. package/dist/src/server/agent/agent-title-limits.js.map +1 -0
  152. package/dist/src/server/agent/audio-utils.js +19 -0
  153. package/dist/src/server/agent/audio-utils.js.map +1 -0
  154. package/dist/src/server/agent/dictation-debug.js +50 -0
  155. package/dist/src/server/agent/dictation-debug.js.map +1 -0
  156. package/dist/src/server/agent/mcp-server.js +787 -0
  157. package/dist/src/server/agent/mcp-server.js.map +1 -0
  158. package/dist/src/server/agent/orchestrator-instructions.js +51 -0
  159. package/dist/src/server/agent/orchestrator-instructions.js.map +1 -0
  160. package/dist/src/server/agent/pcm16-resampler.js +63 -0
  161. package/dist/src/server/agent/pcm16-resampler.js.map +1 -0
  162. package/dist/src/server/agent/provider-launch-config.js +83 -0
  163. package/dist/src/server/agent/provider-launch-config.js.map +1 -0
  164. package/dist/src/server/agent/provider-manifest.js +97 -0
  165. package/dist/src/server/agent/provider-manifest.js.map +1 -0
  166. package/dist/src/server/agent/provider-registry.js +45 -0
  167. package/dist/src/server/agent/provider-registry.js.map +1 -0
  168. package/dist/src/server/agent/providers/claude/model-catalog.js +70 -0
  169. package/dist/src/server/agent/providers/claude/model-catalog.js.map +1 -0
  170. package/dist/src/server/agent/providers/claude/task-notification-tool-call.js +250 -0
  171. package/dist/src/server/agent/providers/claude/task-notification-tool-call.js.map +1 -0
  172. package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js +109 -0
  173. package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -0
  174. package/dist/src/server/agent/providers/claude/tool-call-mapper.js +238 -0
  175. package/dist/src/server/agent/providers/claude/tool-call-mapper.js.map +1 -0
  176. package/dist/src/server/agent/providers/claude-agent.js +3747 -0
  177. package/dist/src/server/agent/providers/claude-agent.js.map +1 -0
  178. package/dist/src/server/agent/providers/codex/tool-call-detail-parser.js +104 -0
  179. package/dist/src/server/agent/providers/codex/tool-call-detail-parser.js.map +1 -0
  180. package/dist/src/server/agent/providers/codex/tool-call-mapper.js +720 -0
  181. package/dist/src/server/agent/providers/codex/tool-call-mapper.js.map +1 -0
  182. package/dist/src/server/agent/providers/codex-app-server-agent.js +2601 -0
  183. package/dist/src/server/agent/providers/codex-app-server-agent.js.map +1 -0
  184. package/dist/src/server/agent/providers/codex-rollout-timeline.js +487 -0
  185. package/dist/src/server/agent/providers/codex-rollout-timeline.js.map +1 -0
  186. package/dist/src/server/agent/providers/opencode/tool-call-detail-parser.js +39 -0
  187. package/dist/src/server/agent/providers/opencode/tool-call-detail-parser.js.map +1 -0
  188. package/dist/src/server/agent/providers/opencode/tool-call-mapper.js +151 -0
  189. package/dist/src/server/agent/providers/opencode/tool-call-mapper.js.map +1 -0
  190. package/dist/src/server/agent/providers/opencode-agent.js +905 -0
  191. package/dist/src/server/agent/providers/opencode-agent.js.map +1 -0
  192. package/dist/src/server/agent/providers/tool-call-detail-primitives.js +552 -0
  193. package/dist/src/server/agent/providers/tool-call-detail-primitives.js.map +1 -0
  194. package/dist/src/server/agent/providers/tool-call-mapper-utils.js +109 -0
  195. package/dist/src/server/agent/providers/tool-call-mapper-utils.js.map +1 -0
  196. package/dist/src/server/agent/recordings-debug.js +19 -0
  197. package/dist/src/server/agent/recordings-debug.js.map +1 -0
  198. package/dist/src/server/agent/stt-debug.js +33 -0
  199. package/dist/src/server/agent/stt-debug.js.map +1 -0
  200. package/dist/src/server/agent/stt-manager.js +233 -0
  201. package/dist/src/server/agent/stt-manager.js.map +1 -0
  202. package/dist/src/server/agent/timeline-append.js +27 -0
  203. package/dist/src/server/agent/timeline-append.js.map +1 -0
  204. package/dist/src/server/agent/timeline-projection.js +215 -0
  205. package/dist/src/server/agent/timeline-projection.js.map +1 -0
  206. package/dist/src/server/agent/tool-name-normalization.js +45 -0
  207. package/dist/src/server/agent/tool-name-normalization.js.map +1 -0
  208. package/dist/src/server/agent/tts-debug.js +24 -0
  209. package/dist/src/server/agent/tts-debug.js.map +1 -0
  210. package/dist/src/server/agent/tts-manager.js +249 -0
  211. package/dist/src/server/agent/tts-manager.js.map +1 -0
  212. package/dist/src/server/agent/wait-for-agent-tracker.js +53 -0
  213. package/dist/src/server/agent/wait-for-agent-tracker.js.map +1 -0
  214. package/dist/src/server/agent-attention-policy.js +40 -0
  215. package/dist/src/server/agent-attention-policy.js.map +1 -0
  216. package/dist/src/server/allowed-hosts.js +94 -0
  217. package/dist/src/server/allowed-hosts.js.map +1 -0
  218. package/dist/src/server/bootstrap.js +498 -0
  219. package/dist/src/server/bootstrap.js.map +1 -0
  220. package/dist/src/server/client-message-id.js +12 -0
  221. package/dist/src/server/client-message-id.js.map +1 -0
  222. package/dist/src/server/config.js +84 -0
  223. package/dist/src/server/config.js.map +1 -0
  224. package/dist/src/server/connection-offer.js +60 -0
  225. package/dist/src/server/connection-offer.js.map +1 -0
  226. package/dist/src/server/daemon-keypair.js +40 -0
  227. package/dist/src/server/daemon-keypair.js.map +1 -0
  228. package/dist/src/server/daemon-version.js +22 -0
  229. package/dist/src/server/daemon-version.js.map +1 -0
  230. package/dist/src/server/dictation/dictation-stream-manager.js +568 -0
  231. package/dist/src/server/dictation/dictation-stream-manager.js.map +1 -0
  232. package/dist/src/server/file-download/token-store.js +40 -0
  233. package/dist/src/server/file-download/token-store.js.map +1 -0
  234. package/dist/src/server/file-explorer/service.js +183 -0
  235. package/dist/src/server/file-explorer/service.js.map +1 -0
  236. package/dist/src/server/json-utils.js +45 -0
  237. package/dist/src/server/json-utils.js.map +1 -0
  238. package/dist/src/server/messages.js +29 -0
  239. package/dist/src/server/messages.js.map +1 -0
  240. package/dist/src/server/package-version.js +47 -0
  241. package/dist/src/server/package-version.js.map +1 -0
  242. package/dist/src/server/paseo-home.js +19 -0
  243. package/dist/src/server/paseo-home.js.map +1 -0
  244. package/dist/src/server/path-utils.js +20 -0
  245. package/dist/src/server/path-utils.js.map +1 -0
  246. package/dist/src/server/persisted-config.js +259 -0
  247. package/dist/src/server/persisted-config.js.map +1 -0
  248. package/dist/src/server/persistence-hooks.js +60 -0
  249. package/dist/src/server/persistence-hooks.js.map +1 -0
  250. package/dist/src/server/pid-lock.js +126 -0
  251. package/dist/src/server/pid-lock.js.map +1 -0
  252. package/dist/src/server/push/push-service.js +68 -0
  253. package/dist/src/server/push/push-service.js.map +1 -0
  254. package/dist/src/server/push/token-store.js +70 -0
  255. package/dist/src/server/push/token-store.js.map +1 -0
  256. package/dist/src/server/relay-transport.js +457 -0
  257. package/dist/src/server/relay-transport.js.map +1 -0
  258. package/dist/src/server/server-id.js +63 -0
  259. package/dist/src/server/server-id.js.map +1 -0
  260. package/dist/src/server/session.js +5947 -0
  261. package/dist/src/server/session.js.map +1 -0
  262. package/dist/src/server/speech/audio.js +101 -0
  263. package/dist/src/server/speech/audio.js.map +1 -0
  264. package/dist/src/server/speech/provider-resolver.js +7 -0
  265. package/dist/src/server/speech/provider-resolver.js.map +1 -0
  266. package/dist/src/server/speech/providers/local/config.js +83 -0
  267. package/dist/src/server/speech/providers/local/config.js.map +1 -0
  268. package/dist/src/server/speech/providers/local/models.js +17 -0
  269. package/dist/src/server/speech/providers/local/models.js.map +1 -0
  270. package/dist/src/server/speech/providers/local/pocket/pocket-tts-onnx.js +422 -0
  271. package/dist/src/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -0
  272. package/dist/src/server/speech/providers/local/runtime.js +253 -0
  273. package/dist/src/server/speech/providers/local/runtime.js.map +1 -0
  274. package/dist/src/server/speech/providers/local/sherpa/model-catalog.js +166 -0
  275. package/dist/src/server/speech/providers/local/sherpa/model-catalog.js.map +1 -0
  276. package/dist/src/server/speech/providers/local/sherpa/model-downloader.js +165 -0
  277. package/dist/src/server/speech/providers/local/sherpa/model-downloader.js.map +1 -0
  278. package/dist/src/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +68 -0
  279. package/dist/src/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -0
  280. package/dist/src/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +79 -0
  281. package/dist/src/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -0
  282. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-loader.js +11 -0
  283. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-loader.js.map +1 -0
  284. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +102 -0
  285. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -0
  286. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +131 -0
  287. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -0
  288. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +132 -0
  289. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -0
  290. package/dist/src/server/speech/providers/local/sherpa/sherpa-realtime-session.js +112 -0
  291. package/dist/src/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -0
  292. package/dist/src/server/speech/providers/local/sherpa/sherpa-stt.js +140 -0
  293. package/dist/src/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -0
  294. package/dist/src/server/speech/providers/local/sherpa/sherpa-tts.js +95 -0
  295. package/dist/src/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -0
  296. package/dist/src/server/speech/providers/openai/config.js +99 -0
  297. package/dist/src/server/speech/providers/openai/config.js.map +1 -0
  298. package/dist/src/server/speech/providers/openai/realtime-transcription-session.js +165 -0
  299. package/dist/src/server/speech/providers/openai/realtime-transcription-session.js.map +1 -0
  300. package/dist/src/server/speech/providers/openai/runtime.js +114 -0
  301. package/dist/src/server/speech/providers/openai/runtime.js.map +1 -0
  302. package/dist/src/server/speech/providers/openai/stt.js +208 -0
  303. package/dist/src/server/speech/providers/openai/stt.js.map +1 -0
  304. package/dist/src/server/speech/providers/openai/tts.js +46 -0
  305. package/dist/src/server/speech/providers/openai/tts.js.map +1 -0
  306. package/dist/src/server/speech/speech-config-resolver.js +85 -0
  307. package/dist/src/server/speech/speech-config-resolver.js.map +1 -0
  308. package/dist/src/server/speech/speech-provider.js +2 -0
  309. package/dist/src/server/speech/speech-provider.js.map +1 -0
  310. package/dist/src/server/speech/speech-runtime.js +497 -0
  311. package/dist/src/server/speech/speech-runtime.js.map +1 -0
  312. package/dist/src/server/speech/speech-types.js +8 -0
  313. package/dist/src/server/speech/speech-types.js.map +1 -0
  314. package/dist/src/server/utils/diff-highlighter.js +244 -0
  315. package/dist/src/server/utils/diff-highlighter.js.map +1 -0
  316. package/dist/src/server/utils/syntax-highlighter.js +145 -0
  317. package/dist/src/server/utils/syntax-highlighter.js.map +1 -0
  318. package/dist/src/server/voice-config.js +51 -0
  319. package/dist/src/server/voice-config.js.map +1 -0
  320. package/dist/src/server/voice-mcp-bridge-command.js +31 -0
  321. package/dist/src/server/voice-mcp-bridge-command.js.map +1 -0
  322. package/dist/src/server/voice-mcp-bridge.js +109 -0
  323. package/dist/src/server/voice-mcp-bridge.js.map +1 -0
  324. package/dist/src/server/voice-permission-policy.js +13 -0
  325. package/dist/src/server/voice-permission-policy.js.map +1 -0
  326. package/dist/src/server/voice-types.js +2 -0
  327. package/dist/src/server/voice-types.js.map +1 -0
  328. package/dist/src/server/websocket-server.js +967 -0
  329. package/dist/src/server/websocket-server.js.map +1 -0
  330. package/dist/src/server/worktree-bootstrap.js +497 -0
  331. package/dist/src/server/worktree-bootstrap.js.map +1 -0
  332. package/dist/src/shared/agent-attention-notification.js +130 -0
  333. package/dist/src/shared/agent-attention-notification.js.map +1 -0
  334. package/dist/src/shared/agent-lifecycle.js +8 -0
  335. package/dist/src/shared/agent-lifecycle.js.map +1 -0
  336. package/dist/src/shared/binary-mux.js +114 -0
  337. package/dist/src/shared/binary-mux.js.map +1 -0
  338. package/dist/src/shared/connection-offer.js +17 -0
  339. package/dist/src/shared/connection-offer.js.map +1 -0
  340. package/dist/src/shared/daemon-endpoints.js +113 -0
  341. package/dist/src/shared/daemon-endpoints.js.map +1 -0
  342. package/dist/src/shared/messages.js +2001 -0
  343. package/dist/src/shared/messages.js.map +1 -0
  344. package/dist/src/shared/path-utils.js +16 -0
  345. package/dist/src/shared/path-utils.js.map +1 -0
  346. package/dist/src/shared/tool-call-display.js +93 -0
  347. package/dist/src/shared/tool-call-display.js.map +1 -0
  348. package/dist/src/terminal/terminal-manager.js +136 -0
  349. package/dist/src/terminal/terminal-manager.js.map +1 -0
  350. package/dist/src/terminal/terminal.js +410 -0
  351. package/dist/src/terminal/terminal.js.map +1 -0
  352. package/dist/src/utils/checkout-git.js +1397 -0
  353. package/dist/src/utils/checkout-git.js.map +1 -0
  354. package/dist/src/utils/directory-suggestions.js +655 -0
  355. package/dist/src/utils/directory-suggestions.js.map +1 -0
  356. package/dist/src/utils/path.js +15 -0
  357. package/dist/src/utils/path.js.map +1 -0
  358. package/dist/src/utils/project-icon.js +391 -0
  359. package/dist/src/utils/project-icon.js.map +1 -0
  360. package/dist/src/utils/worktree-metadata.js +116 -0
  361. package/dist/src/utils/worktree-metadata.js.map +1 -0
  362. package/dist/src/utils/worktree.js +741 -0
  363. package/dist/src/utils/worktree.js.map +1 -0
  364. package/package.json +15 -7
@@ -0,0 +1,655 @@
1
+ import { readdir, realpath, stat } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ const DEFAULT_LIMIT = 30;
4
+ const MAX_LIMIT = 100;
5
+ const DEFAULT_MAX_DEPTH = 6;
6
+ const DEFAULT_MAX_DIRECTORIES_SCANNED = 5000;
7
+ const DIRECTORY_LIST_CACHE_TTL_MS = 8000;
8
+ const DIRECTORY_LIST_CACHE_MAX_ENTRIES = 4000;
9
+ const directoryListCache = new Map();
10
+ const workspaceEntryListCache = new Map();
11
+ const NO_SEGMENT_INDEX = Number.MAX_SAFE_INTEGER;
12
+ const NO_MATCH_OFFSET = Number.MAX_SAFE_INTEGER;
13
+ const WORKSPACE_IGNORED_DIRECTORY_NAMES = new Set(['node_modules']);
14
+ export async function searchHomeDirectories(options) {
15
+ const query = options.query.trim();
16
+ if (!query) {
17
+ return [];
18
+ }
19
+ const limit = normalizeLimit(options.limit);
20
+ const homeRoot = await resolveDirectory(options.homeDir);
21
+ if (!homeRoot) {
22
+ return [];
23
+ }
24
+ const queryParts = normalizeQueryParts(query, homeRoot);
25
+ if (!queryParts) {
26
+ return [];
27
+ }
28
+ if (queryParts.isPathQuery) {
29
+ return searchWithinParentDirectory({
30
+ homeRoot,
31
+ parentPart: queryParts.parentPart,
32
+ searchTerm: queryParts.searchTerm,
33
+ limit,
34
+ });
35
+ }
36
+ return searchAcrossHomeTree({
37
+ homeRoot,
38
+ searchTerm: queryParts.searchTerm,
39
+ limit,
40
+ maxDepth: options.maxDepth ?? DEFAULT_MAX_DEPTH,
41
+ maxDirectoriesScanned: options.maxDirectoriesScanned ?? DEFAULT_MAX_DIRECTORIES_SCANNED,
42
+ });
43
+ }
44
+ export async function searchWorkspaceEntries(options) {
45
+ const limit = normalizeLimit(options.limit);
46
+ const includeDirectories = options.includeDirectories ?? true;
47
+ const includeFiles = options.includeFiles ?? false;
48
+ if (!includeDirectories && !includeFiles) {
49
+ return [];
50
+ }
51
+ const workspaceRoot = await resolveDirectory(options.cwd);
52
+ if (!workspaceRoot) {
53
+ return [];
54
+ }
55
+ const queryParts = normalizeWorkspaceQueryParts(options.query, workspaceRoot);
56
+ if (!queryParts) {
57
+ return [];
58
+ }
59
+ if (queryParts.isPathQuery) {
60
+ return searchWorkspaceWithinParentDirectory({
61
+ workspaceRoot,
62
+ parentPart: queryParts.parentPart,
63
+ searchTerm: queryParts.searchTerm,
64
+ limit,
65
+ includeDirectories,
66
+ includeFiles,
67
+ });
68
+ }
69
+ return searchWorkspaceAcrossTree({
70
+ workspaceRoot,
71
+ searchTerm: queryParts.searchTerm,
72
+ limit,
73
+ includeDirectories,
74
+ includeFiles,
75
+ maxDepth: options.maxDepth ?? DEFAULT_MAX_DEPTH,
76
+ maxEntriesScanned: options.maxEntriesScanned ?? DEFAULT_MAX_DIRECTORIES_SCANNED,
77
+ });
78
+ }
79
+ function normalizeLimit(limit) {
80
+ const candidate = limit ?? DEFAULT_LIMIT;
81
+ if (!Number.isFinite(candidate)) {
82
+ return DEFAULT_LIMIT;
83
+ }
84
+ const bounded = Math.trunc(candidate);
85
+ return Math.max(1, Math.min(MAX_LIMIT, bounded));
86
+ }
87
+ async function searchWithinParentDirectory(input) {
88
+ const parentPath = path.resolve(input.homeRoot, input.parentPart || '.');
89
+ const parentRoot = await resolveDirectory(parentPath);
90
+ if (!parentRoot || !isPathInsideRoot(input.homeRoot, parentRoot)) {
91
+ return [];
92
+ }
93
+ const searchLower = input.searchTerm.toLowerCase();
94
+ const ranked = [];
95
+ const entries = await listChildDirectories({
96
+ directory: parentRoot,
97
+ homeRoot: input.homeRoot,
98
+ });
99
+ for (const entry of entries) {
100
+ if (searchLower && !entry.name.toLowerCase().includes(searchLower)) {
101
+ continue;
102
+ }
103
+ ranked.push(rankDirectory({
104
+ absolutePath: entry.absolutePath,
105
+ homeRoot: input.homeRoot,
106
+ searchLower,
107
+ }));
108
+ }
109
+ return dedupeAndSort(ranked).slice(0, input.limit);
110
+ }
111
+ async function searchAcrossHomeTree(input) {
112
+ const queue = [
113
+ { directory: input.homeRoot, depth: 0 },
114
+ ];
115
+ const visited = new Set([input.homeRoot]);
116
+ const ranked = [];
117
+ let scanned = 0;
118
+ const searchLower = input.searchTerm.toLowerCase();
119
+ for (let queueIndex = 0; queueIndex < queue.length && scanned < input.maxDirectoriesScanned; queueIndex += 1) {
120
+ const current = queue[queueIndex];
121
+ if (!current)
122
+ continue;
123
+ const entries = await listChildDirectories({
124
+ directory: current.directory,
125
+ homeRoot: input.homeRoot,
126
+ });
127
+ for (const entry of entries) {
128
+ const resolvedCandidate = entry.absolutePath;
129
+ if (visited.has(resolvedCandidate)) {
130
+ continue;
131
+ }
132
+ visited.add(resolvedCandidate);
133
+ scanned += 1;
134
+ const relativePath = normalizeRelativePath(input.homeRoot, resolvedCandidate);
135
+ if (relativePath.toLowerCase().includes(searchLower) ||
136
+ entry.name.toLowerCase().includes(searchLower)) {
137
+ ranked.push(rankDirectory({
138
+ absolutePath: resolvedCandidate,
139
+ homeRoot: input.homeRoot,
140
+ searchLower,
141
+ }));
142
+ }
143
+ if (current.depth < input.maxDepth && scanned < input.maxDirectoriesScanned) {
144
+ queue.push({ directory: resolvedCandidate, depth: current.depth + 1 });
145
+ }
146
+ }
147
+ }
148
+ return dedupeAndSort(ranked).slice(0, input.limit);
149
+ }
150
+ async function searchWorkspaceWithinParentDirectory(input) {
151
+ const parentPath = path.resolve(input.workspaceRoot, input.parentPart || '.');
152
+ const parentRoot = await resolveDirectory(parentPath);
153
+ if (!parentRoot || !isPathInsideRoot(input.workspaceRoot, parentRoot)) {
154
+ return [];
155
+ }
156
+ const searchLower = input.searchTerm.toLowerCase();
157
+ const ranked = [];
158
+ const entries = await listWorkspaceChildEntries({
159
+ directory: parentRoot,
160
+ workspaceRoot: input.workspaceRoot,
161
+ });
162
+ for (const entry of entries) {
163
+ if (entry.kind === 'directory' && !input.includeDirectories) {
164
+ continue;
165
+ }
166
+ if (entry.kind === 'file' && !input.includeFiles) {
167
+ continue;
168
+ }
169
+ if (searchLower && !entry.name.toLowerCase().includes(searchLower)) {
170
+ continue;
171
+ }
172
+ ranked.push(rankWorkspaceEntry({
173
+ absolutePath: entry.absolutePath,
174
+ kind: entry.kind,
175
+ workspaceRoot: input.workspaceRoot,
176
+ searchLower,
177
+ }));
178
+ }
179
+ return dedupeAndSortWorkspaceEntries(ranked).slice(0, input.limit);
180
+ }
181
+ async function searchWorkspaceAcrossTree(input) {
182
+ const queue = [
183
+ { directory: input.workspaceRoot, depth: 0 },
184
+ ];
185
+ const visited = new Set([input.workspaceRoot]);
186
+ const ranked = [];
187
+ let scanned = 0;
188
+ const searchLower = input.searchTerm.toLowerCase();
189
+ for (let queueIndex = 0; queueIndex < queue.length && scanned < input.maxEntriesScanned; queueIndex += 1) {
190
+ const current = queue[queueIndex];
191
+ if (!current)
192
+ continue;
193
+ const entries = await listWorkspaceChildEntries({
194
+ directory: current.directory,
195
+ workspaceRoot: input.workspaceRoot,
196
+ });
197
+ for (const entry of entries) {
198
+ scanned += 1;
199
+ if (entry.kind === 'directory') {
200
+ if (!visited.has(entry.absolutePath) &&
201
+ current.depth < input.maxDepth &&
202
+ scanned < input.maxEntriesScanned) {
203
+ visited.add(entry.absolutePath);
204
+ queue.push({
205
+ directory: entry.absolutePath,
206
+ depth: current.depth + 1,
207
+ });
208
+ }
209
+ }
210
+ if (entry.kind === 'directory' && !input.includeDirectories) {
211
+ continue;
212
+ }
213
+ if (entry.kind === 'file' && !input.includeFiles) {
214
+ continue;
215
+ }
216
+ const relativePath = normalizeRelativePath(input.workspaceRoot, entry.absolutePath);
217
+ if (searchLower &&
218
+ !relativePath.toLowerCase().includes(searchLower) &&
219
+ !entry.name.toLowerCase().includes(searchLower)) {
220
+ continue;
221
+ }
222
+ ranked.push(rankWorkspaceEntry({
223
+ absolutePath: entry.absolutePath,
224
+ kind: entry.kind,
225
+ workspaceRoot: input.workspaceRoot,
226
+ searchLower,
227
+ }));
228
+ }
229
+ }
230
+ return dedupeAndSortWorkspaceEntries(ranked).slice(0, input.limit);
231
+ }
232
+ function dedupeAndSortWorkspaceEntries(rankedEntries) {
233
+ const byPath = new Map();
234
+ for (const entry of rankedEntries) {
235
+ const key = `${entry.kind}:${entry.relativePath}`;
236
+ const existing = byPath.get(key);
237
+ if (!existing || compareRankedWorkspaceEntries(entry, existing) < 0) {
238
+ byPath.set(key, entry);
239
+ }
240
+ }
241
+ return Array.from(byPath.values())
242
+ .sort(compareRankedWorkspaceEntries)
243
+ .map((entry) => ({
244
+ path: entry.relativePath,
245
+ kind: entry.kind,
246
+ }));
247
+ }
248
+ function compareRankedWorkspaceEntries(left, right) {
249
+ if (left.matchTier !== right.matchTier) {
250
+ return left.matchTier - right.matchTier;
251
+ }
252
+ if (left.segmentIndex !== right.segmentIndex) {
253
+ return left.segmentIndex - right.segmentIndex;
254
+ }
255
+ if (left.matchOffset !== right.matchOffset) {
256
+ return left.matchOffset - right.matchOffset;
257
+ }
258
+ if (left.depth !== right.depth) {
259
+ return left.depth - right.depth;
260
+ }
261
+ if (left.kind !== right.kind) {
262
+ return left.kind === 'directory' ? -1 : 1;
263
+ }
264
+ return left.relativePath.localeCompare(right.relativePath);
265
+ }
266
+ function dedupeAndSort(ranked) {
267
+ const byPath = new Map();
268
+ for (const entry of ranked) {
269
+ const existing = byPath.get(entry.absolutePath);
270
+ if (!existing || compareRankedDirectories(entry, existing) < 0) {
271
+ byPath.set(entry.absolutePath, entry);
272
+ }
273
+ }
274
+ return Array.from(byPath.values())
275
+ .sort(compareRankedDirectories)
276
+ .map((entry) => entry.absolutePath);
277
+ }
278
+ function compareRankedDirectories(left, right) {
279
+ if (left.matchTier !== right.matchTier) {
280
+ return left.matchTier - right.matchTier;
281
+ }
282
+ if (left.segmentIndex !== right.segmentIndex) {
283
+ return left.segmentIndex - right.segmentIndex;
284
+ }
285
+ if (left.matchOffset !== right.matchOffset) {
286
+ return left.matchOffset - right.matchOffset;
287
+ }
288
+ if (left.depth !== right.depth) {
289
+ return left.depth - right.depth;
290
+ }
291
+ return left.absolutePath.localeCompare(right.absolutePath);
292
+ }
293
+ function rankDirectory(input) {
294
+ const relative = normalizeRelativePath(input.homeRoot, input.absolutePath);
295
+ const relativeLower = relative.toLowerCase();
296
+ const depth = relative === '.' ? 0 : relative.split('/').length;
297
+ const searchLower = input.searchLower;
298
+ if (!searchLower) {
299
+ return {
300
+ absolutePath: input.absolutePath,
301
+ matchTier: 3,
302
+ segmentIndex: NO_SEGMENT_INDEX,
303
+ matchOffset: 0,
304
+ depth,
305
+ };
306
+ }
307
+ const segments = relativeLower === '.' ? [] : relativeLower.split('/');
308
+ const exactSegmentIndex = findSegmentMatchIndex(segments, (segment) => segment === searchLower);
309
+ const prefixSegmentIndex = findSegmentMatchIndex(segments, (segment) => segment.startsWith(searchLower));
310
+ const partialSegmentIndex = findSegmentMatchIndex(segments, (segment) => segment.includes(searchLower));
311
+ const matchOffset = relativeLower.indexOf(searchLower);
312
+ let matchTier = 4;
313
+ let segmentIndex = NO_SEGMENT_INDEX;
314
+ if (exactSegmentIndex >= 0) {
315
+ matchTier = 0;
316
+ segmentIndex = exactSegmentIndex;
317
+ }
318
+ else if (prefixSegmentIndex >= 0) {
319
+ matchTier = 1;
320
+ segmentIndex = prefixSegmentIndex;
321
+ }
322
+ else if (partialSegmentIndex >= 0) {
323
+ matchTier = 2;
324
+ segmentIndex = partialSegmentIndex;
325
+ }
326
+ else if (relativeLower.startsWith(searchLower)) {
327
+ matchTier = 3;
328
+ }
329
+ return {
330
+ absolutePath: input.absolutePath,
331
+ matchTier,
332
+ segmentIndex,
333
+ matchOffset: matchOffset >= 0 ? matchOffset : NO_MATCH_OFFSET,
334
+ depth,
335
+ };
336
+ }
337
+ function rankWorkspaceEntry(input) {
338
+ const relativePath = normalizeRelativePath(input.workspaceRoot, input.absolutePath);
339
+ const relativeLower = relativePath.toLowerCase();
340
+ const depth = relativePath === '.' ? 0 : relativePath.split('/').length;
341
+ const searchLower = input.searchLower;
342
+ if (!searchLower) {
343
+ return {
344
+ relativePath,
345
+ kind: input.kind,
346
+ matchTier: 3,
347
+ segmentIndex: NO_SEGMENT_INDEX,
348
+ matchOffset: 0,
349
+ depth,
350
+ };
351
+ }
352
+ const segments = relativeLower === '.' ? [] : relativeLower.split('/');
353
+ const exactSegmentIndex = findSegmentMatchIndex(segments, (segment) => segment === searchLower);
354
+ const prefixSegmentIndex = findSegmentMatchIndex(segments, (segment) => segment.startsWith(searchLower));
355
+ const partialSegmentIndex = findSegmentMatchIndex(segments, (segment) => segment.includes(searchLower));
356
+ const matchOffset = relativeLower.indexOf(searchLower);
357
+ let matchTier = 4;
358
+ let segmentIndex = NO_SEGMENT_INDEX;
359
+ if (exactSegmentIndex >= 0) {
360
+ matchTier = 0;
361
+ segmentIndex = exactSegmentIndex;
362
+ }
363
+ else if (prefixSegmentIndex >= 0) {
364
+ matchTier = 1;
365
+ segmentIndex = prefixSegmentIndex;
366
+ }
367
+ else if (partialSegmentIndex >= 0) {
368
+ matchTier = 2;
369
+ segmentIndex = partialSegmentIndex;
370
+ }
371
+ else if (relativeLower.startsWith(searchLower)) {
372
+ matchTier = 3;
373
+ }
374
+ return {
375
+ relativePath,
376
+ kind: input.kind,
377
+ matchTier,
378
+ segmentIndex,
379
+ matchOffset: matchOffset >= 0 ? matchOffset : NO_MATCH_OFFSET,
380
+ depth,
381
+ };
382
+ }
383
+ function findSegmentMatchIndex(segments, predicate) {
384
+ for (let index = 0; index < segments.length; index += 1) {
385
+ const segment = segments[index];
386
+ if (!segment) {
387
+ continue;
388
+ }
389
+ if (predicate(segment)) {
390
+ return index;
391
+ }
392
+ }
393
+ return -1;
394
+ }
395
+ function normalizeRelativePath(homeRoot, absolutePath) {
396
+ const relative = path.relative(homeRoot, absolutePath);
397
+ if (!relative) {
398
+ return '.';
399
+ }
400
+ return relative.split(path.sep).join('/');
401
+ }
402
+ function isPathInsideRoot(root, target) {
403
+ const relative = path.relative(root, target);
404
+ return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
405
+ }
406
+ function normalizeQueryParts(query, homeRoot) {
407
+ const typedQuery = query.trim().replace(/\\/g, '/');
408
+ let normalized = typedQuery;
409
+ if (!normalized) {
410
+ return null;
411
+ }
412
+ if (normalized.startsWith('~')) {
413
+ normalized = normalized.slice(1);
414
+ if (normalized.startsWith('/')) {
415
+ normalized = normalized.slice(1);
416
+ }
417
+ }
418
+ if (path.isAbsolute(normalized)) {
419
+ const absolute = path.resolve(normalized);
420
+ if (!isPathInsideRoot(homeRoot, absolute)) {
421
+ return null;
422
+ }
423
+ normalized = normalizeRelativePath(homeRoot, absolute);
424
+ }
425
+ normalized = normalized.replace(/^\.\/+/, '').replace(/\/{2,}/g, '/');
426
+ if (!normalized) {
427
+ // Treat "~" and "~/" as a request to browse the home root.
428
+ if (typedQuery === '~' || typedQuery === '~/') {
429
+ return {
430
+ isPathQuery: true,
431
+ parentPart: '',
432
+ searchTerm: '',
433
+ };
434
+ }
435
+ return null;
436
+ }
437
+ const isPathQuery = normalized.includes('/');
438
+ const slashIndex = normalized.lastIndexOf('/');
439
+ const parentPart = slashIndex >= 0 ? normalized.slice(0, slashIndex) : '';
440
+ const searchTerm = slashIndex >= 0 ? normalized.slice(slashIndex + 1) : normalized;
441
+ return {
442
+ isPathQuery,
443
+ parentPart,
444
+ searchTerm,
445
+ };
446
+ }
447
+ function normalizeWorkspaceQueryParts(query, workspaceRoot) {
448
+ let normalized = query.trim().replace(/\\/g, '/');
449
+ if (path.isAbsolute(normalized)) {
450
+ const absolute = path.resolve(normalized);
451
+ if (!isPathInsideRoot(workspaceRoot, absolute)) {
452
+ return null;
453
+ }
454
+ normalized = normalizeRelativePath(workspaceRoot, absolute);
455
+ }
456
+ normalized = normalized.replace(/^\.\/+/, '').replace(/\/{2,}/g, '/');
457
+ if (!normalized) {
458
+ return {
459
+ isPathQuery: true,
460
+ parentPart: '',
461
+ searchTerm: '',
462
+ };
463
+ }
464
+ const isPathQuery = normalized.includes('/');
465
+ const slashIndex = normalized.lastIndexOf('/');
466
+ const parentPart = slashIndex >= 0 ? normalized.slice(0, slashIndex) : '';
467
+ const searchTerm = slashIndex >= 0 ? normalized.slice(slashIndex + 1) : normalized;
468
+ return {
469
+ isPathQuery,
470
+ parentPart,
471
+ searchTerm,
472
+ };
473
+ }
474
+ async function resolveDirectory(inputPath) {
475
+ try {
476
+ const resolved = await realpath(path.resolve(inputPath));
477
+ const stats = await stat(resolved);
478
+ if (!stats.isDirectory()) {
479
+ return null;
480
+ }
481
+ return resolved;
482
+ }
483
+ catch {
484
+ return null;
485
+ }
486
+ }
487
+ async function listChildDirectories(input) {
488
+ const now = Date.now();
489
+ const cached = directoryListCache.get(input.directory);
490
+ if (cached && cached.expiresAt > now) {
491
+ return cached.entries;
492
+ }
493
+ const dirents = await readdir(input.directory, { withFileTypes: true }).catch(() => []);
494
+ const entries = [];
495
+ for (const dirent of dirents) {
496
+ if (isHiddenDirectoryName(dirent.name)) {
497
+ continue;
498
+ }
499
+ if (!dirent.isDirectory() && !dirent.isSymbolicLink()) {
500
+ continue;
501
+ }
502
+ const candidatePath = path.join(input.directory, dirent.name);
503
+ const absolutePath = await resolveDirectoryCandidate({
504
+ candidatePath,
505
+ dirent,
506
+ homeRoot: input.homeRoot,
507
+ });
508
+ if (!absolutePath) {
509
+ continue;
510
+ }
511
+ entries.push({
512
+ name: dirent.name,
513
+ absolutePath,
514
+ });
515
+ }
516
+ setDirectoryListCache(input.directory, {
517
+ expiresAt: now + DIRECTORY_LIST_CACHE_TTL_MS,
518
+ entries,
519
+ });
520
+ return entries;
521
+ }
522
+ async function listWorkspaceChildEntries(input) {
523
+ const now = Date.now();
524
+ const cached = workspaceEntryListCache.get(input.directory);
525
+ if (cached && cached.expiresAt > now) {
526
+ return cached.entries;
527
+ }
528
+ const dirents = await readdir(input.directory, { withFileTypes: true }).catch(() => []);
529
+ const entries = [];
530
+ for (const dirent of dirents) {
531
+ if (isHiddenDirectoryName(dirent.name)) {
532
+ continue;
533
+ }
534
+ if (isIgnoredWorkspaceDirectoryName(dirent.name)) {
535
+ continue;
536
+ }
537
+ const candidatePath = path.join(input.directory, dirent.name);
538
+ const entry = await resolveWorkspaceCandidate({
539
+ candidatePath,
540
+ dirent,
541
+ workspaceRoot: input.workspaceRoot,
542
+ });
543
+ if (!entry) {
544
+ continue;
545
+ }
546
+ entries.push({
547
+ name: dirent.name,
548
+ absolutePath: entry.absolutePath,
549
+ kind: entry.kind,
550
+ });
551
+ }
552
+ setWorkspaceEntryListCache(input.directory, {
553
+ expiresAt: now + DIRECTORY_LIST_CACHE_TTL_MS,
554
+ entries,
555
+ });
556
+ return entries;
557
+ }
558
+ async function resolveDirectoryCandidate(input) {
559
+ if (input.dirent.isDirectory()) {
560
+ const resolved = path.resolve(input.candidatePath);
561
+ return isPathInsideRoot(input.homeRoot, resolved) ? resolved : null;
562
+ }
563
+ const resolved = await resolveDirectory(input.candidatePath);
564
+ if (!resolved || !isPathInsideRoot(input.homeRoot, resolved)) {
565
+ return null;
566
+ }
567
+ return resolved;
568
+ }
569
+ async function resolveWorkspaceCandidate(input) {
570
+ if (input.dirent.isDirectory()) {
571
+ const resolved = path.resolve(input.candidatePath);
572
+ if (!isPathInsideRoot(input.workspaceRoot, resolved)) {
573
+ return null;
574
+ }
575
+ return { absolutePath: resolved, kind: 'directory' };
576
+ }
577
+ if (input.dirent.isFile()) {
578
+ const resolved = path.resolve(input.candidatePath);
579
+ if (!isPathInsideRoot(input.workspaceRoot, resolved)) {
580
+ return null;
581
+ }
582
+ return { absolutePath: resolved, kind: 'file' };
583
+ }
584
+ if (!input.dirent.isSymbolicLink()) {
585
+ return null;
586
+ }
587
+ try {
588
+ const resolved = await realpath(input.candidatePath);
589
+ if (!isPathInsideRoot(input.workspaceRoot, resolved)) {
590
+ return null;
591
+ }
592
+ const stats = await stat(resolved);
593
+ if (stats.isDirectory()) {
594
+ return { absolutePath: resolved, kind: 'directory' };
595
+ }
596
+ if (stats.isFile()) {
597
+ return { absolutePath: resolved, kind: 'file' };
598
+ }
599
+ return null;
600
+ }
601
+ catch {
602
+ return null;
603
+ }
604
+ }
605
+ function isHiddenDirectoryName(name) {
606
+ return name.startsWith('.');
607
+ }
608
+ function isIgnoredWorkspaceDirectoryName(name) {
609
+ return WORKSPACE_IGNORED_DIRECTORY_NAMES.has(name);
610
+ }
611
+ function setDirectoryListCache(cacheKey, entry) {
612
+ directoryListCache.set(cacheKey, entry);
613
+ pruneDirectoryListCache();
614
+ }
615
+ function setWorkspaceEntryListCache(cacheKey, entry) {
616
+ workspaceEntryListCache.set(cacheKey, entry);
617
+ pruneWorkspaceEntryListCache();
618
+ }
619
+ function pruneDirectoryListCache() {
620
+ if (directoryListCache.size <= DIRECTORY_LIST_CACHE_MAX_ENTRIES) {
621
+ return;
622
+ }
623
+ const now = Date.now();
624
+ for (const [cacheKey, entry] of directoryListCache) {
625
+ if (entry.expiresAt <= now) {
626
+ directoryListCache.delete(cacheKey);
627
+ }
628
+ }
629
+ while (directoryListCache.size > DIRECTORY_LIST_CACHE_MAX_ENTRIES) {
630
+ const oldestKey = directoryListCache.keys().next().value;
631
+ if (!oldestKey) {
632
+ return;
633
+ }
634
+ directoryListCache.delete(oldestKey);
635
+ }
636
+ }
637
+ function pruneWorkspaceEntryListCache() {
638
+ if (workspaceEntryListCache.size <= DIRECTORY_LIST_CACHE_MAX_ENTRIES) {
639
+ return;
640
+ }
641
+ const now = Date.now();
642
+ for (const [cacheKey, entry] of workspaceEntryListCache) {
643
+ if (entry.expiresAt <= now) {
644
+ workspaceEntryListCache.delete(cacheKey);
645
+ }
646
+ }
647
+ while (workspaceEntryListCache.size > DIRECTORY_LIST_CACHE_MAX_ENTRIES) {
648
+ const oldestKey = workspaceEntryListCache.keys().next().value;
649
+ if (!oldestKey) {
650
+ return;
651
+ }
652
+ workspaceEntryListCache.delete(oldestKey);
653
+ }
654
+ }
655
+ //# sourceMappingURL=directory-suggestions.js.map