@getpaseo/server 0.1.37 → 0.1.38

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 (295) hide show
  1. package/dist/scripts/dev-runner.js +1 -1
  2. package/dist/scripts/dev-runner.js.map +1 -1
  3. package/dist/scripts/{daemon-runner.js → supervisor-entrypoint.js} +7 -9
  4. package/dist/scripts/supervisor-entrypoint.js.map +1 -0
  5. package/dist/scripts/supervisor.js +17 -1
  6. package/dist/scripts/supervisor.js.map +1 -1
  7. package/dist/server/server/bootstrap.d.ts +0 -4
  8. package/dist/server/server/bootstrap.d.ts.map +1 -1
  9. package/dist/server/server/bootstrap.js +8 -22
  10. package/dist/server/server/bootstrap.js.map +1 -1
  11. package/dist/server/server/index.js +0 -4
  12. package/dist/server/server/index.js.map +1 -1
  13. package/dist/server/server/pid-lock.d.ts +7 -2
  14. package/dist/server/server/pid-lock.d.ts.map +1 -1
  15. package/dist/server/server/pid-lock.js +21 -0
  16. package/dist/server/server/pid-lock.js.map +1 -1
  17. package/dist/server/server/session.d.ts.map +1 -1
  18. package/dist/server/server/session.js +2 -2
  19. package/dist/server/server/session.js.map +1 -1
  20. package/dist/src/server/pid-lock.js +21 -0
  21. package/dist/src/server/pid-lock.js.map +1 -1
  22. package/package.json +3 -3
  23. package/dist/scripts/daemon-runner.js.map +0 -1
  24. package/dist/src/server/agent/activity-curator.js +0 -243
  25. package/dist/src/server/agent/activity-curator.js.map +0 -1
  26. package/dist/src/server/agent/agent-manager.js +0 -1855
  27. package/dist/src/server/agent/agent-manager.js.map +0 -1
  28. package/dist/src/server/agent/agent-metadata-generator.js +0 -161
  29. package/dist/src/server/agent/agent-metadata-generator.js.map +0 -1
  30. package/dist/src/server/agent/agent-projections.js +0 -254
  31. package/dist/src/server/agent/agent-projections.js.map +0 -1
  32. package/dist/src/server/agent/agent-response-loop.js +0 -304
  33. package/dist/src/server/agent/agent-response-loop.js.map +0 -1
  34. package/dist/src/server/agent/agent-sdk-types.js +0 -12
  35. package/dist/src/server/agent/agent-sdk-types.js.map +0 -1
  36. package/dist/src/server/agent/agent-storage.js +0 -302
  37. package/dist/src/server/agent/agent-storage.js.map +0 -1
  38. package/dist/src/server/agent/agent-title-limits.js +0 -3
  39. package/dist/src/server/agent/agent-title-limits.js.map +0 -1
  40. package/dist/src/server/agent/audio-utils.js +0 -19
  41. package/dist/src/server/agent/audio-utils.js.map +0 -1
  42. package/dist/src/server/agent/dictation-debug.js +0 -50
  43. package/dist/src/server/agent/dictation-debug.js.map +0 -1
  44. package/dist/src/server/agent/mcp-server.js +0 -754
  45. package/dist/src/server/agent/mcp-server.js.map +0 -1
  46. package/dist/src/server/agent/orchestrator-instructions.js +0 -51
  47. package/dist/src/server/agent/orchestrator-instructions.js.map +0 -1
  48. package/dist/src/server/agent/pcm16-resampler.js +0 -63
  49. package/dist/src/server/agent/pcm16-resampler.js.map +0 -1
  50. package/dist/src/server/agent/provider-launch-config.js +0 -213
  51. package/dist/src/server/agent/provider-launch-config.js.map +0 -1
  52. package/dist/src/server/agent/provider-manifest.js +0 -127
  53. package/dist/src/server/agent/provider-manifest.js.map +0 -1
  54. package/dist/src/server/agent/provider-registry.js +0 -45
  55. package/dist/src/server/agent/provider-registry.js.map +0 -1
  56. package/dist/src/server/agent/providers/claude/partial-json.js +0 -306
  57. package/dist/src/server/agent/providers/claude/partial-json.js.map +0 -1
  58. package/dist/src/server/agent/providers/claude/sdk-model-resolver.js +0 -104
  59. package/dist/src/server/agent/providers/claude/sdk-model-resolver.js.map +0 -1
  60. package/dist/src/server/agent/providers/claude/sidechain-tracker.js +0 -230
  61. package/dist/src/server/agent/providers/claude/sidechain-tracker.js.map +0 -1
  62. package/dist/src/server/agent/providers/claude/task-notification-tool-call.js +0 -267
  63. package/dist/src/server/agent/providers/claude/task-notification-tool-call.js.map +0 -1
  64. package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js +0 -121
  65. package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js.map +0 -1
  66. package/dist/src/server/agent/providers/claude/tool-call-mapper.js +0 -252
  67. package/dist/src/server/agent/providers/claude/tool-call-mapper.js.map +0 -1
  68. package/dist/src/server/agent/providers/claude-agent.js +0 -3166
  69. package/dist/src/server/agent/providers/claude-agent.js.map +0 -1
  70. package/dist/src/server/agent/providers/codex/tool-call-detail-parser.js +0 -104
  71. package/dist/src/server/agent/providers/codex/tool-call-detail-parser.js.map +0 -1
  72. package/dist/src/server/agent/providers/codex/tool-call-mapper.js +0 -758
  73. package/dist/src/server/agent/providers/codex/tool-call-mapper.js.map +0 -1
  74. package/dist/src/server/agent/providers/codex-app-server-agent.js +0 -2949
  75. package/dist/src/server/agent/providers/codex-app-server-agent.js.map +0 -1
  76. package/dist/src/server/agent/providers/codex-rollout-timeline.js +0 -544
  77. package/dist/src/server/agent/providers/codex-rollout-timeline.js.map +0 -1
  78. package/dist/src/server/agent/providers/opencode/tool-call-detail-parser.js +0 -39
  79. package/dist/src/server/agent/providers/opencode/tool-call-detail-parser.js.map +0 -1
  80. package/dist/src/server/agent/providers/opencode/tool-call-mapper.js +0 -144
  81. package/dist/src/server/agent/providers/opencode/tool-call-mapper.js.map +0 -1
  82. package/dist/src/server/agent/providers/opencode-agent.js +0 -1193
  83. package/dist/src/server/agent/providers/opencode-agent.js.map +0 -1
  84. package/dist/src/server/agent/providers/tool-call-detail-primitives.js +0 -686
  85. package/dist/src/server/agent/providers/tool-call-detail-primitives.js.map +0 -1
  86. package/dist/src/server/agent/providers/tool-call-mapper-utils.js +0 -115
  87. package/dist/src/server/agent/providers/tool-call-mapper-utils.js.map +0 -1
  88. package/dist/src/server/agent/recordings-debug.js +0 -19
  89. package/dist/src/server/agent/recordings-debug.js.map +0 -1
  90. package/dist/src/server/agent/stt-debug.js +0 -33
  91. package/dist/src/server/agent/stt-debug.js.map +0 -1
  92. package/dist/src/server/agent/stt-manager.js +0 -232
  93. package/dist/src/server/agent/stt-manager.js.map +0 -1
  94. package/dist/src/server/agent/timeline-append.js +0 -27
  95. package/dist/src/server/agent/timeline-append.js.map +0 -1
  96. package/dist/src/server/agent/timeline-projection.js +0 -215
  97. package/dist/src/server/agent/timeline-projection.js.map +0 -1
  98. package/dist/src/server/agent/tool-name-normalization.js +0 -45
  99. package/dist/src/server/agent/tool-name-normalization.js.map +0 -1
  100. package/dist/src/server/agent/tts-debug.js +0 -24
  101. package/dist/src/server/agent/tts-debug.js.map +0 -1
  102. package/dist/src/server/agent/tts-manager.js +0 -374
  103. package/dist/src/server/agent/tts-manager.js.map +0 -1
  104. package/dist/src/server/agent/wait-for-agent-tracker.js +0 -53
  105. package/dist/src/server/agent/wait-for-agent-tracker.js.map +0 -1
  106. package/dist/src/server/agent-attention-policy.js +0 -40
  107. package/dist/src/server/agent-attention-policy.js.map +0 -1
  108. package/dist/src/server/allowed-hosts.js +0 -94
  109. package/dist/src/server/allowed-hosts.js.map +0 -1
  110. package/dist/src/server/bootstrap.js +0 -620
  111. package/dist/src/server/bootstrap.js.map +0 -1
  112. package/dist/src/server/chat/chat-mentions.js +0 -71
  113. package/dist/src/server/chat/chat-mentions.js.map +0 -1
  114. package/dist/src/server/chat/chat-rpc-schemas.js +0 -103
  115. package/dist/src/server/chat/chat-rpc-schemas.js.map +0 -1
  116. package/dist/src/server/chat/chat-service.js +0 -330
  117. package/dist/src/server/chat/chat-service.js.map +0 -1
  118. package/dist/src/server/chat/chat-types.js +0 -22
  119. package/dist/src/server/chat/chat-types.js.map +0 -1
  120. package/dist/src/server/checkout-diff-manager.js +0 -272
  121. package/dist/src/server/checkout-diff-manager.js.map +0 -1
  122. package/dist/src/server/checkout-git-utils.js +0 -37
  123. package/dist/src/server/checkout-git-utils.js.map +0 -1
  124. package/dist/src/server/client-message-id.js +0 -12
  125. package/dist/src/server/client-message-id.js.map +0 -1
  126. package/dist/src/server/config.js +0 -73
  127. package/dist/src/server/config.js.map +0 -1
  128. package/dist/src/server/connection-offer.js +0 -59
  129. package/dist/src/server/connection-offer.js.map +0 -1
  130. package/dist/src/server/daemon-keypair.js +0 -40
  131. package/dist/src/server/daemon-keypair.js.map +0 -1
  132. package/dist/src/server/daemon-version.js +0 -22
  133. package/dist/src/server/daemon-version.js.map +0 -1
  134. package/dist/src/server/dictation/dictation-stream-manager.js +0 -571
  135. package/dist/src/server/dictation/dictation-stream-manager.js.map +0 -1
  136. package/dist/src/server/file-download/token-store.js +0 -40
  137. package/dist/src/server/file-download/token-store.js.map +0 -1
  138. package/dist/src/server/file-explorer/service.js +0 -180
  139. package/dist/src/server/file-explorer/service.js.map +0 -1
  140. package/dist/src/server/json-utils.js +0 -45
  141. package/dist/src/server/json-utils.js.map +0 -1
  142. package/dist/src/server/loop/rpc-schemas.js +0 -159
  143. package/dist/src/server/loop/rpc-schemas.js.map +0 -1
  144. package/dist/src/server/loop-service.js +0 -741
  145. package/dist/src/server/loop-service.js.map +0 -1
  146. package/dist/src/server/messages.js +0 -29
  147. package/dist/src/server/messages.js.map +0 -1
  148. package/dist/src/server/package-version.js +0 -46
  149. package/dist/src/server/package-version.js.map +0 -1
  150. package/dist/src/server/pairing-offer.js +0 -45
  151. package/dist/src/server/pairing-offer.js.map +0 -1
  152. package/dist/src/server/pairing-qr.js +0 -45
  153. package/dist/src/server/pairing-qr.js.map +0 -1
  154. package/dist/src/server/path-utils.js +0 -20
  155. package/dist/src/server/path-utils.js.map +0 -1
  156. package/dist/src/server/persisted-config.js +0 -265
  157. package/dist/src/server/persisted-config.js.map +0 -1
  158. package/dist/src/server/persistence-hooks.js +0 -60
  159. package/dist/src/server/persistence-hooks.js.map +0 -1
  160. package/dist/src/server/push/push-service.js +0 -68
  161. package/dist/src/server/push/push-service.js.map +0 -1
  162. package/dist/src/server/push/token-store.js +0 -70
  163. package/dist/src/server/push/token-store.js.map +0 -1
  164. package/dist/src/server/relay-transport.js +0 -461
  165. package/dist/src/server/relay-transport.js.map +0 -1
  166. package/dist/src/server/schedule/cron.js +0 -103
  167. package/dist/src/server/schedule/cron.js.map +0 -1
  168. package/dist/src/server/schedule/rpc-schemas.js +0 -112
  169. package/dist/src/server/schedule/rpc-schemas.js.map +0 -1
  170. package/dist/src/server/schedule/service.js +0 -397
  171. package/dist/src/server/schedule/service.js.map +0 -1
  172. package/dist/src/server/schedule/store.js +0 -56
  173. package/dist/src/server/schedule/store.js.map +0 -1
  174. package/dist/src/server/schedule/types.js +0 -73
  175. package/dist/src/server/schedule/types.js.map +0 -1
  176. package/dist/src/server/server-id.js +0 -63
  177. package/dist/src/server/server-id.js.map +0 -1
  178. package/dist/src/server/session.js +0 -6381
  179. package/dist/src/server/session.js.map +0 -1
  180. package/dist/src/server/speech/audio.js +0 -101
  181. package/dist/src/server/speech/audio.js.map +0 -1
  182. package/dist/src/server/speech/provider-resolver.js +0 -7
  183. package/dist/src/server/speech/provider-resolver.js.map +0 -1
  184. package/dist/src/server/speech/providers/local/config.js +0 -74
  185. package/dist/src/server/speech/providers/local/config.js.map +0 -1
  186. package/dist/src/server/speech/providers/local/models.js +0 -17
  187. package/dist/src/server/speech/providers/local/models.js.map +0 -1
  188. package/dist/src/server/speech/providers/local/pocket/pocket-tts-onnx.js +0 -436
  189. package/dist/src/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +0 -1
  190. package/dist/src/server/speech/providers/local/runtime.js +0 -238
  191. package/dist/src/server/speech/providers/local/runtime.js.map +0 -1
  192. package/dist/src/server/speech/providers/local/sherpa/model-catalog.js +0 -166
  193. package/dist/src/server/speech/providers/local/sherpa/model-catalog.js.map +0 -1
  194. package/dist/src/server/speech/providers/local/sherpa/model-downloader.js +0 -165
  195. package/dist/src/server/speech/providers/local/sherpa/model-downloader.js.map +0 -1
  196. package/dist/src/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +0 -73
  197. package/dist/src/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +0 -1
  198. package/dist/src/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +0 -84
  199. package/dist/src/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +0 -1
  200. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-loader.js +0 -11
  201. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-loader.js.map +0 -1
  202. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +0 -102
  203. package/dist/src/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +0 -1
  204. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +0 -135
  205. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +0 -1
  206. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +0 -130
  207. package/dist/src/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +0 -1
  208. package/dist/src/server/speech/providers/local/sherpa/sherpa-realtime-session.js +0 -110
  209. package/dist/src/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +0 -1
  210. package/dist/src/server/speech/providers/local/sherpa/sherpa-stt.js +0 -138
  211. package/dist/src/server/speech/providers/local/sherpa/sherpa-stt.js.map +0 -1
  212. package/dist/src/server/speech/providers/local/sherpa/sherpa-tts.js +0 -98
  213. package/dist/src/server/speech/providers/local/sherpa/sherpa-tts.js.map +0 -1
  214. package/dist/src/server/speech/providers/local/sherpa/silero-vad-provider.js +0 -23
  215. package/dist/src/server/speech/providers/local/sherpa/silero-vad-provider.js.map +0 -1
  216. package/dist/src/server/speech/providers/local/sherpa/silero-vad-session.js +0 -107
  217. package/dist/src/server/speech/providers/local/sherpa/silero-vad-session.js.map +0 -1
  218. package/dist/src/server/speech/providers/openai/config.js +0 -80
  219. package/dist/src/server/speech/providers/openai/config.js.map +0 -1
  220. package/dist/src/server/speech/providers/openai/realtime-transcription-session.js +0 -168
  221. package/dist/src/server/speech/providers/openai/realtime-transcription-session.js.map +0 -1
  222. package/dist/src/server/speech/providers/openai/runtime.js +0 -112
  223. package/dist/src/server/speech/providers/openai/runtime.js.map +0 -1
  224. package/dist/src/server/speech/providers/openai/stt.js +0 -206
  225. package/dist/src/server/speech/providers/openai/stt.js.map +0 -1
  226. package/dist/src/server/speech/providers/openai/tts.js +0 -46
  227. package/dist/src/server/speech/providers/openai/tts.js.map +0 -1
  228. package/dist/src/server/speech/speech-config-resolver.js +0 -102
  229. package/dist/src/server/speech/speech-config-resolver.js.map +0 -1
  230. package/dist/src/server/speech/speech-provider.js +0 -2
  231. package/dist/src/server/speech/speech-provider.js.map +0 -1
  232. package/dist/src/server/speech/speech-runtime.js +0 -530
  233. package/dist/src/server/speech/speech-runtime.js.map +0 -1
  234. package/dist/src/server/speech/speech-types.js +0 -8
  235. package/dist/src/server/speech/speech-types.js.map +0 -1
  236. package/dist/src/server/speech/turn-detection-provider.js +0 -2
  237. package/dist/src/server/speech/turn-detection-provider.js.map +0 -1
  238. package/dist/src/server/utils/diff-highlighter.js +0 -257
  239. package/dist/src/server/utils/diff-highlighter.js.map +0 -1
  240. package/dist/src/server/voice/fixed-duration-pcm-ring-buffer.js +0 -35
  241. package/dist/src/server/voice/fixed-duration-pcm-ring-buffer.js.map +0 -1
  242. package/dist/src/server/voice/voice-turn-controller.js +0 -159
  243. package/dist/src/server/voice/voice-turn-controller.js.map +0 -1
  244. package/dist/src/server/voice-config.js +0 -51
  245. package/dist/src/server/voice-config.js.map +0 -1
  246. package/dist/src/server/voice-mcp-bridge-command.js +0 -31
  247. package/dist/src/server/voice-mcp-bridge-command.js.map +0 -1
  248. package/dist/src/server/voice-mcp-bridge.js +0 -109
  249. package/dist/src/server/voice-mcp-bridge.js.map +0 -1
  250. package/dist/src/server/voice-permission-policy.js +0 -13
  251. package/dist/src/server/voice-permission-policy.js.map +0 -1
  252. package/dist/src/server/voice-types.js +0 -2
  253. package/dist/src/server/voice-types.js.map +0 -1
  254. package/dist/src/server/websocket-server.js +0 -1048
  255. package/dist/src/server/websocket-server.js.map +0 -1
  256. package/dist/src/server/workspace-registry-bootstrap.js +0 -98
  257. package/dist/src/server/workspace-registry-bootstrap.js.map +0 -1
  258. package/dist/src/server/workspace-registry-model.js +0 -175
  259. package/dist/src/server/workspace-registry-model.js.map +0 -1
  260. package/dist/src/server/workspace-registry.js +0 -151
  261. package/dist/src/server/workspace-registry.js.map +0 -1
  262. package/dist/src/server/worktree-bootstrap.js +0 -508
  263. package/dist/src/server/worktree-bootstrap.js.map +0 -1
  264. package/dist/src/shared/agent-attention-notification.js +0 -130
  265. package/dist/src/shared/agent-attention-notification.js.map +0 -1
  266. package/dist/src/shared/agent-lifecycle.js +0 -8
  267. package/dist/src/shared/agent-lifecycle.js.map +0 -1
  268. package/dist/src/shared/connection-offer.js +0 -17
  269. package/dist/src/shared/connection-offer.js.map +0 -1
  270. package/dist/src/shared/daemon-endpoints.js +0 -122
  271. package/dist/src/shared/daemon-endpoints.js.map +0 -1
  272. package/dist/src/shared/messages.js +0 -2107
  273. package/dist/src/shared/messages.js.map +0 -1
  274. package/dist/src/shared/path-utils.js +0 -16
  275. package/dist/src/shared/path-utils.js.map +0 -1
  276. package/dist/src/shared/terminal-stream-protocol.js +0 -99
  277. package/dist/src/shared/terminal-stream-protocol.js.map +0 -1
  278. package/dist/src/shared/tool-call-display.js +0 -122
  279. package/dist/src/shared/tool-call-display.js.map +0 -1
  280. package/dist/src/terminal/terminal-manager.js +0 -136
  281. package/dist/src/terminal/terminal-manager.js.map +0 -1
  282. package/dist/src/terminal/terminal.js +0 -333
  283. package/dist/src/terminal/terminal.js.map +0 -1
  284. package/dist/src/utils/checkout-git.js +0 -1518
  285. package/dist/src/utils/checkout-git.js.map +0 -1
  286. package/dist/src/utils/directory-suggestions.js +0 -671
  287. package/dist/src/utils/directory-suggestions.js.map +0 -1
  288. package/dist/src/utils/path.js +0 -15
  289. package/dist/src/utils/path.js.map +0 -1
  290. package/dist/src/utils/project-icon.js +0 -389
  291. package/dist/src/utils/project-icon.js.map +0 -1
  292. package/dist/src/utils/worktree-metadata.js +0 -116
  293. package/dist/src/utils/worktree-metadata.js.map +0 -1
  294. package/dist/src/utils/worktree.js +0 -744
  295. package/dist/src/utils/worktree.js.map +0 -1
@@ -1,671 +0,0 @@
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
- // Only treat the query as a literal path when the user explicitly roots it
413
- // with ~, ~/, ./, or an absolute path. Bare queries like "faro/main" are
414
- // search terms, not paths.
415
- let isRooted = false;
416
- if (normalized.startsWith("~")) {
417
- isRooted = true;
418
- normalized = normalized.slice(1);
419
- if (normalized.startsWith("/")) {
420
- normalized = normalized.slice(1);
421
- }
422
- }
423
- if (path.isAbsolute(normalized)) {
424
- isRooted = true;
425
- const absolute = path.resolve(normalized);
426
- if (!isPathInsideRoot(homeRoot, absolute)) {
427
- return null;
428
- }
429
- normalized = normalizeRelativePath(homeRoot, absolute);
430
- }
431
- if (normalized.startsWith("./")) {
432
- isRooted = true;
433
- }
434
- normalized = normalized.replace(/^\.\/+/, "").replace(/\/{2,}/g, "/");
435
- if (!normalized) {
436
- // Treat "~" and "~/" as a request to browse the home root.
437
- if (typedQuery === "~" || typedQuery === "~/") {
438
- return {
439
- isPathQuery: true,
440
- parentPart: "",
441
- searchTerm: "",
442
- };
443
- }
444
- return null;
445
- }
446
- const isPathQuery = isRooted && normalized.includes("/");
447
- if (!isPathQuery) {
448
- return {
449
- isPathQuery: false,
450
- parentPart: "",
451
- searchTerm: normalized,
452
- };
453
- }
454
- const slashIndex = normalized.lastIndexOf("/");
455
- const parentPart = normalized.slice(0, slashIndex);
456
- const searchTerm = normalized.slice(slashIndex + 1);
457
- return {
458
- isPathQuery: true,
459
- parentPart,
460
- searchTerm,
461
- };
462
- }
463
- function normalizeWorkspaceQueryParts(query, workspaceRoot) {
464
- let normalized = query.trim().replace(/\\/g, "/");
465
- if (path.isAbsolute(normalized)) {
466
- const absolute = path.resolve(normalized);
467
- if (!isPathInsideRoot(workspaceRoot, absolute)) {
468
- return null;
469
- }
470
- normalized = normalizeRelativePath(workspaceRoot, absolute);
471
- }
472
- normalized = normalized.replace(/^\.\/+/, "").replace(/\/{2,}/g, "/");
473
- if (!normalized) {
474
- return {
475
- isPathQuery: true,
476
- parentPart: "",
477
- searchTerm: "",
478
- };
479
- }
480
- const isPathQuery = normalized.includes("/");
481
- const slashIndex = normalized.lastIndexOf("/");
482
- const parentPart = slashIndex >= 0 ? normalized.slice(0, slashIndex) : "";
483
- const searchTerm = slashIndex >= 0 ? normalized.slice(slashIndex + 1) : normalized;
484
- return {
485
- isPathQuery,
486
- parentPart,
487
- searchTerm,
488
- };
489
- }
490
- async function resolveDirectory(inputPath) {
491
- try {
492
- const resolved = await realpath(path.resolve(inputPath));
493
- const stats = await stat(resolved);
494
- if (!stats.isDirectory()) {
495
- return null;
496
- }
497
- return resolved;
498
- }
499
- catch {
500
- return null;
501
- }
502
- }
503
- async function listChildDirectories(input) {
504
- const now = Date.now();
505
- const cached = directoryListCache.get(input.directory);
506
- if (cached && cached.expiresAt > now) {
507
- return cached.entries;
508
- }
509
- const dirents = await readdir(input.directory, { withFileTypes: true }).catch(() => []);
510
- const entries = [];
511
- for (const dirent of dirents) {
512
- if (isHiddenDirectoryName(dirent.name)) {
513
- continue;
514
- }
515
- if (!dirent.isDirectory() && !dirent.isSymbolicLink()) {
516
- continue;
517
- }
518
- const candidatePath = path.join(input.directory, dirent.name);
519
- const absolutePath = await resolveDirectoryCandidate({
520
- candidatePath,
521
- dirent,
522
- homeRoot: input.homeRoot,
523
- });
524
- if (!absolutePath) {
525
- continue;
526
- }
527
- entries.push({
528
- name: dirent.name,
529
- absolutePath,
530
- });
531
- }
532
- setDirectoryListCache(input.directory, {
533
- expiresAt: now + DIRECTORY_LIST_CACHE_TTL_MS,
534
- entries,
535
- });
536
- return entries;
537
- }
538
- async function listWorkspaceChildEntries(input) {
539
- const now = Date.now();
540
- const cached = workspaceEntryListCache.get(input.directory);
541
- if (cached && cached.expiresAt > now) {
542
- return cached.entries;
543
- }
544
- const dirents = await readdir(input.directory, { withFileTypes: true }).catch(() => []);
545
- const entries = [];
546
- for (const dirent of dirents) {
547
- if (isHiddenDirectoryName(dirent.name)) {
548
- continue;
549
- }
550
- if (isIgnoredWorkspaceDirectoryName(dirent.name)) {
551
- continue;
552
- }
553
- const candidatePath = path.join(input.directory, dirent.name);
554
- const entry = await resolveWorkspaceCandidate({
555
- candidatePath,
556
- dirent,
557
- workspaceRoot: input.workspaceRoot,
558
- });
559
- if (!entry) {
560
- continue;
561
- }
562
- entries.push({
563
- name: dirent.name,
564
- absolutePath: entry.absolutePath,
565
- kind: entry.kind,
566
- });
567
- }
568
- setWorkspaceEntryListCache(input.directory, {
569
- expiresAt: now + DIRECTORY_LIST_CACHE_TTL_MS,
570
- entries,
571
- });
572
- return entries;
573
- }
574
- async function resolveDirectoryCandidate(input) {
575
- if (input.dirent.isDirectory()) {
576
- const resolved = path.resolve(input.candidatePath);
577
- return isPathInsideRoot(input.homeRoot, resolved) ? resolved : null;
578
- }
579
- const resolved = await resolveDirectory(input.candidatePath);
580
- if (!resolved || !isPathInsideRoot(input.homeRoot, resolved)) {
581
- return null;
582
- }
583
- return resolved;
584
- }
585
- async function resolveWorkspaceCandidate(input) {
586
- if (input.dirent.isDirectory()) {
587
- const resolved = path.resolve(input.candidatePath);
588
- if (!isPathInsideRoot(input.workspaceRoot, resolved)) {
589
- return null;
590
- }
591
- return { absolutePath: resolved, kind: "directory" };
592
- }
593
- if (input.dirent.isFile()) {
594
- const resolved = path.resolve(input.candidatePath);
595
- if (!isPathInsideRoot(input.workspaceRoot, resolved)) {
596
- return null;
597
- }
598
- return { absolutePath: resolved, kind: "file" };
599
- }
600
- if (!input.dirent.isSymbolicLink()) {
601
- return null;
602
- }
603
- try {
604
- const resolved = await realpath(input.candidatePath);
605
- if (!isPathInsideRoot(input.workspaceRoot, resolved)) {
606
- return null;
607
- }
608
- const stats = await stat(resolved);
609
- if (stats.isDirectory()) {
610
- return { absolutePath: resolved, kind: "directory" };
611
- }
612
- if (stats.isFile()) {
613
- return { absolutePath: resolved, kind: "file" };
614
- }
615
- return null;
616
- }
617
- catch {
618
- return null;
619
- }
620
- }
621
- function isHiddenDirectoryName(name) {
622
- return name.startsWith(".");
623
- }
624
- function isIgnoredWorkspaceDirectoryName(name) {
625
- return WORKSPACE_IGNORED_DIRECTORY_NAMES.has(name);
626
- }
627
- function setDirectoryListCache(cacheKey, entry) {
628
- directoryListCache.set(cacheKey, entry);
629
- pruneDirectoryListCache();
630
- }
631
- function setWorkspaceEntryListCache(cacheKey, entry) {
632
- workspaceEntryListCache.set(cacheKey, entry);
633
- pruneWorkspaceEntryListCache();
634
- }
635
- function pruneDirectoryListCache() {
636
- if (directoryListCache.size <= DIRECTORY_LIST_CACHE_MAX_ENTRIES) {
637
- return;
638
- }
639
- const now = Date.now();
640
- for (const [cacheKey, entry] of directoryListCache) {
641
- if (entry.expiresAt <= now) {
642
- directoryListCache.delete(cacheKey);
643
- }
644
- }
645
- while (directoryListCache.size > DIRECTORY_LIST_CACHE_MAX_ENTRIES) {
646
- const oldestKey = directoryListCache.keys().next().value;
647
- if (!oldestKey) {
648
- return;
649
- }
650
- directoryListCache.delete(oldestKey);
651
- }
652
- }
653
- function pruneWorkspaceEntryListCache() {
654
- if (workspaceEntryListCache.size <= DIRECTORY_LIST_CACHE_MAX_ENTRIES) {
655
- return;
656
- }
657
- const now = Date.now();
658
- for (const [cacheKey, entry] of workspaceEntryListCache) {
659
- if (entry.expiresAt <= now) {
660
- workspaceEntryListCache.delete(cacheKey);
661
- }
662
- }
663
- while (workspaceEntryListCache.size > DIRECTORY_LIST_CACHE_MAX_ENTRIES) {
664
- const oldestKey = workspaceEntryListCache.keys().next().value;
665
- if (!oldestKey) {
666
- return;
667
- }
668
- workspaceEntryListCache.delete(oldestKey);
669
- }
670
- }
671
- //# sourceMappingURL=directory-suggestions.js.map