glancey 2.0.0

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 (336) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +435 -0
  3. package/dist/__tests__/ast-chunker.test.d.ts +2 -0
  4. package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
  5. package/dist/__tests__/ast-chunker.test.js +307 -0
  6. package/dist/__tests__/ast-chunker.test.js.map +1 -0
  7. package/dist/__tests__/config.test.d.ts +2 -0
  8. package/dist/__tests__/config.test.d.ts.map +1 -0
  9. package/dist/__tests__/config.test.js +242 -0
  10. package/dist/__tests__/config.test.js.map +1 -0
  11. package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
  12. package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
  13. package/dist/__tests__/dashboard/beads.test.js +151 -0
  14. package/dist/__tests__/dashboard/beads.test.js.map +1 -0
  15. package/dist/__tests__/dashboard/index.test.d.ts +2 -0
  16. package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
  17. package/dist/__tests__/dashboard/index.test.js +116 -0
  18. package/dist/__tests__/dashboard/index.test.js.map +1 -0
  19. package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
  20. package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
  21. package/dist/__tests__/dashboard/routes.test.js +125 -0
  22. package/dist/__tests__/dashboard/routes.test.js.map +1 -0
  23. package/dist/__tests__/dashboard/server.test.d.ts +2 -0
  24. package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
  25. package/dist/__tests__/dashboard/server.test.js +75 -0
  26. package/dist/__tests__/dashboard/server.test.js.map +1 -0
  27. package/dist/__tests__/dashboard/state.test.d.ts +2 -0
  28. package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
  29. package/dist/__tests__/dashboard/state.test.js +124 -0
  30. package/dist/__tests__/dashboard/state.test.js.map +1 -0
  31. package/dist/__tests__/dashboard/token-tracking.test.d.ts +2 -0
  32. package/dist/__tests__/dashboard/token-tracking.test.d.ts.map +1 -0
  33. package/dist/__tests__/dashboard/token-tracking.test.js +315 -0
  34. package/dist/__tests__/dashboard/token-tracking.test.js.map +1 -0
  35. package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
  36. package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
  37. package/dist/__tests__/embeddings/factory.test.js +157 -0
  38. package/dist/__tests__/embeddings/factory.test.js.map +1 -0
  39. package/dist/__tests__/embeddings/gemini.test.d.ts +2 -0
  40. package/dist/__tests__/embeddings/gemini.test.d.ts.map +1 -0
  41. package/dist/__tests__/embeddings/gemini.test.js +178 -0
  42. package/dist/__tests__/embeddings/gemini.test.js.map +1 -0
  43. package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
  44. package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
  45. package/dist/__tests__/embeddings/ollama.test.js +273 -0
  46. package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
  47. package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
  48. package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
  49. package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
  50. package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
  51. package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
  52. package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
  53. package/dist/__tests__/embeddings/retry.test.js +334 -0
  54. package/dist/__tests__/embeddings/retry.test.js.map +1 -0
  55. package/dist/__tests__/embeddings/types.test.d.ts +2 -0
  56. package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
  57. package/dist/__tests__/embeddings/types.test.js +31 -0
  58. package/dist/__tests__/embeddings/types.test.js.map +1 -0
  59. package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
  60. package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
  61. package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
  62. package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
  63. package/dist/__tests__/mocks/fetch.mock.d.ts +49 -0
  64. package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
  65. package/dist/__tests__/mocks/fetch.mock.js +102 -0
  66. package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
  67. package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
  68. package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
  69. package/dist/__tests__/mocks/lancedb.mock.js +63 -0
  70. package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
  71. package/dist/__tests__/search/clustering.test.d.ts +2 -0
  72. package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
  73. package/dist/__tests__/search/clustering.test.js +230 -0
  74. package/dist/__tests__/search/clustering.test.js.map +1 -0
  75. package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
  76. package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
  77. package/dist/__tests__/search/hybrid-search.test.js +279 -0
  78. package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
  79. package/dist/__tests__/search/indexer.test.d.ts +2 -0
  80. package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
  81. package/dist/__tests__/search/indexer.test.js +1305 -0
  82. package/dist/__tests__/search/indexer.test.js.map +1 -0
  83. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
  84. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
  85. package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
  86. package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
  87. package/dist/__tests__/setup.d.ts +2 -0
  88. package/dist/__tests__/setup.d.ts.map +1 -0
  89. package/dist/__tests__/setup.js +11 -0
  90. package/dist/__tests__/setup.js.map +1 -0
  91. package/dist/__tests__/tools/clustering-handlers.test.d.ts +2 -0
  92. package/dist/__tests__/tools/clustering-handlers.test.d.ts.map +1 -0
  93. package/dist/__tests__/tools/clustering-handlers.test.js +286 -0
  94. package/dist/__tests__/tools/clustering-handlers.test.js.map +1 -0
  95. package/dist/__tests__/tools/commit-handlers.test.d.ts +2 -0
  96. package/dist/__tests__/tools/commit-handlers.test.d.ts.map +1 -0
  97. package/dist/__tests__/tools/commit-handlers.test.js +153 -0
  98. package/dist/__tests__/tools/commit-handlers.test.js.map +1 -0
  99. package/dist/__tests__/tools/index-handlers.test.d.ts +2 -0
  100. package/dist/__tests__/tools/index-handlers.test.d.ts.map +1 -0
  101. package/dist/__tests__/tools/index-handlers.test.js +184 -0
  102. package/dist/__tests__/tools/index-handlers.test.js.map +1 -0
  103. package/dist/__tests__/tools/instructions-handlers.test.d.ts +2 -0
  104. package/dist/__tests__/tools/instructions-handlers.test.d.ts.map +1 -0
  105. package/dist/__tests__/tools/instructions-handlers.test.js +53 -0
  106. package/dist/__tests__/tools/instructions-handlers.test.js.map +1 -0
  107. package/dist/__tests__/tools/memory-handlers.test.d.ts +2 -0
  108. package/dist/__tests__/tools/memory-handlers.test.d.ts.map +1 -0
  109. package/dist/__tests__/tools/memory-handlers.test.js +175 -0
  110. package/dist/__tests__/tools/memory-handlers.test.js.map +1 -0
  111. package/dist/__tests__/tools/search-handlers.test.d.ts +2 -0
  112. package/dist/__tests__/tools/search-handlers.test.d.ts.map +1 -0
  113. package/dist/__tests__/tools/search-handlers.test.js +229 -0
  114. package/dist/__tests__/tools/search-handlers.test.js.map +1 -0
  115. package/dist/__tests__/tools/symbol-handlers.test.d.ts +2 -0
  116. package/dist/__tests__/tools/symbol-handlers.test.d.ts.map +1 -0
  117. package/dist/__tests__/tools/symbol-handlers.test.js +348 -0
  118. package/dist/__tests__/tools/symbol-handlers.test.js.map +1 -0
  119. package/dist/__tests__/tools/worktree-handlers.test.d.ts +2 -0
  120. package/dist/__tests__/tools/worktree-handlers.test.d.ts.map +1 -0
  121. package/dist/__tests__/tools/worktree-handlers.test.js +297 -0
  122. package/dist/__tests__/tools/worktree-handlers.test.js.map +1 -0
  123. package/dist/__tests__/utils/cache.test.d.ts +2 -0
  124. package/dist/__tests__/utils/cache.test.d.ts.map +1 -0
  125. package/dist/__tests__/utils/cache.test.js +147 -0
  126. package/dist/__tests__/utils/cache.test.js.map +1 -0
  127. package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
  128. package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
  129. package/dist/__tests__/utils/concurrency.test.js +83 -0
  130. package/dist/__tests__/utils/concurrency.test.js.map +1 -0
  131. package/dist/__tests__/utils/errors.test.d.ts +2 -0
  132. package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
  133. package/dist/__tests__/utils/errors.test.js +136 -0
  134. package/dist/__tests__/utils/errors.test.js.map +1 -0
  135. package/dist/__tests__/utils/logger.test.d.ts +2 -0
  136. package/dist/__tests__/utils/logger.test.d.ts.map +1 -0
  137. package/dist/__tests__/utils/logger.test.js +131 -0
  138. package/dist/__tests__/utils/logger.test.js.map +1 -0
  139. package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
  140. package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
  141. package/dist/__tests__/utils/type-guards.test.js +80 -0
  142. package/dist/__tests__/utils/type-guards.test.js.map +1 -0
  143. package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
  144. package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
  145. package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
  146. package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
  147. package/dist/config.d.ts +191 -0
  148. package/dist/config.d.ts.map +1 -0
  149. package/dist/config.js +788 -0
  150. package/dist/config.js.map +1 -0
  151. package/dist/dashboard/beads.d.ts +35 -0
  152. package/dist/dashboard/beads.d.ts.map +1 -0
  153. package/dist/dashboard/beads.js +102 -0
  154. package/dist/dashboard/beads.js.map +1 -0
  155. package/dist/dashboard/events.d.ts +64 -0
  156. package/dist/dashboard/events.d.ts.map +1 -0
  157. package/dist/dashboard/events.js +211 -0
  158. package/dist/dashboard/events.js.map +1 -0
  159. package/dist/dashboard/index.d.ts +69 -0
  160. package/dist/dashboard/index.d.ts.map +1 -0
  161. package/dist/dashboard/index.js +93 -0
  162. package/dist/dashboard/index.js.map +1 -0
  163. package/dist/dashboard/routes.d.ts +6 -0
  164. package/dist/dashboard/routes.d.ts.map +1 -0
  165. package/dist/dashboard/routes.js +505 -0
  166. package/dist/dashboard/routes.js.map +1 -0
  167. package/dist/dashboard/server.d.ts +27 -0
  168. package/dist/dashboard/server.d.ts.map +1 -0
  169. package/dist/dashboard/server.js +72 -0
  170. package/dist/dashboard/server.js.map +1 -0
  171. package/dist/dashboard/state.d.ts +172 -0
  172. package/dist/dashboard/state.d.ts.map +1 -0
  173. package/dist/dashboard/state.js +362 -0
  174. package/dist/dashboard/state.js.map +1 -0
  175. package/dist/dashboard/token-tracking.d.ts +143 -0
  176. package/dist/dashboard/token-tracking.d.ts.map +1 -0
  177. package/dist/dashboard/token-tracking.js +363 -0
  178. package/dist/dashboard/token-tracking.js.map +1 -0
  179. package/dist/dashboard/ui.d.ts +6 -0
  180. package/dist/dashboard/ui.d.ts.map +1 -0
  181. package/dist/dashboard/ui.js +2710 -0
  182. package/dist/dashboard/ui.js.map +1 -0
  183. package/dist/embeddings/gemini.d.ts +28 -0
  184. package/dist/embeddings/gemini.d.ts.map +1 -0
  185. package/dist/embeddings/gemini.js +165 -0
  186. package/dist/embeddings/gemini.js.map +1 -0
  187. package/dist/embeddings/index.d.ts +34 -0
  188. package/dist/embeddings/index.d.ts.map +1 -0
  189. package/dist/embeddings/index.js +120 -0
  190. package/dist/embeddings/index.js.map +1 -0
  191. package/dist/embeddings/ollama.d.ts +22 -0
  192. package/dist/embeddings/ollama.d.ts.map +1 -0
  193. package/dist/embeddings/ollama.js +179 -0
  194. package/dist/embeddings/ollama.js.map +1 -0
  195. package/dist/embeddings/rate-limiter.d.ts +75 -0
  196. package/dist/embeddings/rate-limiter.d.ts.map +1 -0
  197. package/dist/embeddings/rate-limiter.js +145 -0
  198. package/dist/embeddings/rate-limiter.js.map +1 -0
  199. package/dist/embeddings/retry.d.ts +20 -0
  200. package/dist/embeddings/retry.d.ts.map +1 -0
  201. package/dist/embeddings/retry.js +227 -0
  202. package/dist/embeddings/retry.js.map +1 -0
  203. package/dist/embeddings/types.d.ts +103 -0
  204. package/dist/embeddings/types.d.ts.map +1 -0
  205. package/dist/embeddings/types.js +23 -0
  206. package/dist/embeddings/types.js.map +1 -0
  207. package/dist/index.d.ts +12 -0
  208. package/dist/index.d.ts.map +1 -0
  209. package/dist/index.js +2028 -0
  210. package/dist/index.js.map +1 -0
  211. package/dist/memory/index.d.ts +63 -0
  212. package/dist/memory/index.d.ts.map +1 -0
  213. package/dist/memory/index.js +168 -0
  214. package/dist/memory/index.js.map +1 -0
  215. package/dist/search/ast-chunker.d.ts +29 -0
  216. package/dist/search/ast-chunker.d.ts.map +1 -0
  217. package/dist/search/ast-chunker.js +236 -0
  218. package/dist/search/ast-chunker.js.map +1 -0
  219. package/dist/search/chunk-utils.d.ts +24 -0
  220. package/dist/search/chunk-utils.d.ts.map +1 -0
  221. package/dist/search/chunk-utils.js +41 -0
  222. package/dist/search/chunk-utils.js.map +1 -0
  223. package/dist/search/clustering.d.ts +77 -0
  224. package/dist/search/clustering.d.ts.map +1 -0
  225. package/dist/search/clustering.js +455 -0
  226. package/dist/search/clustering.js.map +1 -0
  227. package/dist/search/indexer.d.ts +377 -0
  228. package/dist/search/indexer.d.ts.map +1 -0
  229. package/dist/search/indexer.js +1557 -0
  230. package/dist/search/indexer.js.map +1 -0
  231. package/dist/search/tree-sitter-chunker.d.ts +64 -0
  232. package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
  233. package/dist/search/tree-sitter-chunker.js +412 -0
  234. package/dist/search/tree-sitter-chunker.js.map +1 -0
  235. package/dist/symbols/index.d.ts +14 -0
  236. package/dist/symbols/index.d.ts.map +1 -0
  237. package/dist/symbols/index.js +19 -0
  238. package/dist/symbols/index.js.map +1 -0
  239. package/dist/symbols/name-path.d.ts +113 -0
  240. package/dist/symbols/name-path.d.ts.map +1 -0
  241. package/dist/symbols/name-path.js +194 -0
  242. package/dist/symbols/name-path.js.map +1 -0
  243. package/dist/symbols/pattern-search.d.ts +14 -0
  244. package/dist/symbols/pattern-search.d.ts.map +1 -0
  245. package/dist/symbols/pattern-search.js +224 -0
  246. package/dist/symbols/pattern-search.js.map +1 -0
  247. package/dist/symbols/reference-finder.d.ts +38 -0
  248. package/dist/symbols/reference-finder.d.ts.map +1 -0
  249. package/dist/symbols/reference-finder.js +376 -0
  250. package/dist/symbols/reference-finder.js.map +1 -0
  251. package/dist/symbols/symbol-editor.d.ts +81 -0
  252. package/dist/symbols/symbol-editor.d.ts.map +1 -0
  253. package/dist/symbols/symbol-editor.js +257 -0
  254. package/dist/symbols/symbol-editor.js.map +1 -0
  255. package/dist/symbols/symbol-extractor.d.ts +49 -0
  256. package/dist/symbols/symbol-extractor.d.ts.map +1 -0
  257. package/dist/symbols/symbol-extractor.js +593 -0
  258. package/dist/symbols/symbol-extractor.js.map +1 -0
  259. package/dist/symbols/symbol-renamer.d.ts +81 -0
  260. package/dist/symbols/symbol-renamer.d.ts.map +1 -0
  261. package/dist/symbols/symbol-renamer.js +204 -0
  262. package/dist/symbols/symbol-renamer.js.map +1 -0
  263. package/dist/symbols/types.d.ts +234 -0
  264. package/dist/symbols/types.d.ts.map +1 -0
  265. package/dist/symbols/types.js +106 -0
  266. package/dist/symbols/types.js.map +1 -0
  267. package/dist/tools/clustering-handlers.d.ts +70 -0
  268. package/dist/tools/clustering-handlers.d.ts.map +1 -0
  269. package/dist/tools/clustering-handlers.js +150 -0
  270. package/dist/tools/clustering-handlers.js.map +1 -0
  271. package/dist/tools/commit-handlers.d.ts +77 -0
  272. package/dist/tools/commit-handlers.d.ts.map +1 -0
  273. package/dist/tools/commit-handlers.js +251 -0
  274. package/dist/tools/commit-handlers.js.map +1 -0
  275. package/dist/tools/index-handlers.d.ts +31 -0
  276. package/dist/tools/index-handlers.d.ts.map +1 -0
  277. package/dist/tools/index-handlers.js +53 -0
  278. package/dist/tools/index-handlers.js.map +1 -0
  279. package/dist/tools/instructions-handlers.d.ts +25 -0
  280. package/dist/tools/instructions-handlers.d.ts.map +1 -0
  281. package/dist/tools/instructions-handlers.js +36 -0
  282. package/dist/tools/instructions-handlers.js.map +1 -0
  283. package/dist/tools/memory-handlers.d.ts +95 -0
  284. package/dist/tools/memory-handlers.d.ts.map +1 -0
  285. package/dist/tools/memory-handlers.js +126 -0
  286. package/dist/tools/memory-handlers.js.map +1 -0
  287. package/dist/tools/search-handlers.d.ts +51 -0
  288. package/dist/tools/search-handlers.d.ts.map +1 -0
  289. package/dist/tools/search-handlers.js +128 -0
  290. package/dist/tools/search-handlers.js.map +1 -0
  291. package/dist/tools/symbol-handlers.d.ts +171 -0
  292. package/dist/tools/symbol-handlers.d.ts.map +1 -0
  293. package/dist/tools/symbol-handlers.js +456 -0
  294. package/dist/tools/symbol-handlers.js.map +1 -0
  295. package/dist/tools/types.d.ts +32 -0
  296. package/dist/tools/types.d.ts.map +1 -0
  297. package/dist/tools/types.js +17 -0
  298. package/dist/tools/types.js.map +1 -0
  299. package/dist/tools/worktree-handlers.d.ts +96 -0
  300. package/dist/tools/worktree-handlers.d.ts.map +1 -0
  301. package/dist/tools/worktree-handlers.js +186 -0
  302. package/dist/tools/worktree-handlers.js.map +1 -0
  303. package/dist/utils/cache.d.ts +77 -0
  304. package/dist/utils/cache.d.ts.map +1 -0
  305. package/dist/utils/cache.js +134 -0
  306. package/dist/utils/cache.js.map +1 -0
  307. package/dist/utils/concurrency.d.ts +32 -0
  308. package/dist/utils/concurrency.d.ts.map +1 -0
  309. package/dist/utils/concurrency.js +57 -0
  310. package/dist/utils/concurrency.js.map +1 -0
  311. package/dist/utils/errors.d.ts +36 -0
  312. package/dist/utils/errors.d.ts.map +1 -0
  313. package/dist/utils/errors.js +91 -0
  314. package/dist/utils/errors.js.map +1 -0
  315. package/dist/utils/logger.d.ts +37 -0
  316. package/dist/utils/logger.d.ts.map +1 -0
  317. package/dist/utils/logger.js +114 -0
  318. package/dist/utils/logger.js.map +1 -0
  319. package/dist/utils/type-guards.d.ts +17 -0
  320. package/dist/utils/type-guards.d.ts.map +1 -0
  321. package/dist/utils/type-guards.js +25 -0
  322. package/dist/utils/type-guards.js.map +1 -0
  323. package/dist/worktree/index.d.ts +6 -0
  324. package/dist/worktree/index.d.ts.map +1 -0
  325. package/dist/worktree/index.js +6 -0
  326. package/dist/worktree/index.js.map +1 -0
  327. package/dist/worktree/types.d.ts +101 -0
  328. package/dist/worktree/types.d.ts.map +1 -0
  329. package/dist/worktree/types.js +6 -0
  330. package/dist/worktree/types.js.map +1 -0
  331. package/dist/worktree/worktree-manager.d.ts +80 -0
  332. package/dist/worktree/worktree-manager.d.ts.map +1 -0
  333. package/dist/worktree/worktree-manager.js +407 -0
  334. package/dist/worktree/worktree-manager.js.map +1 -0
  335. package/package.json +87 -0
  336. package/scripts/postinstall.js +48 -0
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Common types for MCP tool handlers.
3
+ */
4
+ import type { CodeIndexer } from '../search/indexer.js';
5
+ /**
6
+ * Standard MCP tool response format.
7
+ */
8
+ export interface ToolResponse {
9
+ content: Array<{
10
+ type: 'text';
11
+ text: string;
12
+ }>;
13
+ /** Indicates an error response */
14
+ isError?: boolean;
15
+ }
16
+ /**
17
+ * Context passed to all tool handlers.
18
+ */
19
+ export interface ToolContext {
20
+ indexer: CodeIndexer;
21
+ projectPath: string;
22
+ toolGuidance: string;
23
+ }
24
+ /**
25
+ * Generic tool handler function signature.
26
+ */
27
+ export type ToolHandler<TArgs = Record<string, unknown>> = (args: TArgs, context: ToolContext) => Promise<ToolResponse>;
28
+ /**
29
+ * Helper to create a successful tool response.
30
+ */
31
+ export declare function createToolResponse(text: string, guidance?: string): ToolResponse;
32
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,kCAAkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CACzD,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,WAAW,KACjB,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,YAAY,CASpF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Common types for MCP tool handlers.
3
+ */
4
+ /**
5
+ * Helper to create a successful tool response.
6
+ */
7
+ export function createToolResponse(text, guidance = '') {
8
+ return {
9
+ content: [
10
+ {
11
+ type: 'text',
12
+ text: text + guidance,
13
+ },
14
+ ],
15
+ };
16
+ }
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiCH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,WAAmB,EAAE;IACpE,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,GAAG,QAAQ;aACtB;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Tool handlers for worktree operations.
3
+ */
4
+ import { type WorktreeInfo, type CreateWorktreeResult, type RemoveWorktreeResult, type ListWorktreesResult } from '../worktree/index.js';
5
+ import type { ToolResponse } from './types.js';
6
+ /**
7
+ * Interface for worktree manager operations (for testability).
8
+ */
9
+ export interface IWorktreeManager {
10
+ createWorktree(options: {
11
+ shortName: string;
12
+ issueId?: string;
13
+ prefix?: 'feature' | 'fix' | 'refactor' | 'docs' | 'test';
14
+ baseBranch?: string;
15
+ installDeps?: boolean;
16
+ packageManager?: 'npm' | 'yarn' | 'pnpm' | 'bun';
17
+ }): Promise<CreateWorktreeResult>;
18
+ listWorktrees(): Promise<ListWorktreesResult>;
19
+ removeWorktree(options: {
20
+ name: string;
21
+ deleteBranch?: boolean;
22
+ force?: boolean;
23
+ }): Promise<RemoveWorktreeResult>;
24
+ getWorktreeInfo(name: string): Promise<WorktreeInfo | null>;
25
+ }
26
+ /**
27
+ * Context for worktree tools.
28
+ */
29
+ export interface WorktreeToolContext {
30
+ projectPath: string;
31
+ toolGuidance: string;
32
+ /** Optional worktree manager instance (for testing). */
33
+ worktreeManager?: IWorktreeManager;
34
+ }
35
+ /**
36
+ * Arguments for create_worktree tool.
37
+ */
38
+ export interface CreateWorktreeArgs {
39
+ shortName: string;
40
+ issueId?: string;
41
+ prefix?: 'feature' | 'fix' | 'refactor' | 'docs' | 'test';
42
+ baseBranch?: string;
43
+ installDeps?: boolean;
44
+ packageManager?: 'npm' | 'yarn' | 'pnpm' | 'bun';
45
+ }
46
+ /**
47
+ * Parse and validate create_worktree arguments.
48
+ */
49
+ export declare function parseCreateWorktreeArgs(args: Record<string, unknown> | undefined): CreateWorktreeArgs;
50
+ /**
51
+ * Format worktree creation result.
52
+ */
53
+ export declare function formatWorktreeCreationResult(result: CreateWorktreeResult): string;
54
+ /**
55
+ * Handle create_worktree tool.
56
+ */
57
+ export declare function handleCreateWorktree(args: CreateWorktreeArgs, context: WorktreeToolContext): Promise<ToolResponse>;
58
+ /**
59
+ * Handle list_worktrees tool.
60
+ */
61
+ export declare function handleListWorktrees(context: WorktreeToolContext): Promise<ToolResponse>;
62
+ /**
63
+ * Arguments for remove_worktree tool.
64
+ */
65
+ export interface RemoveWorktreeArgs {
66
+ name: string;
67
+ deleteBranch?: boolean;
68
+ force?: boolean;
69
+ }
70
+ /**
71
+ * Parse and validate remove_worktree arguments.
72
+ */
73
+ export declare function parseRemoveWorktreeArgs(args: Record<string, unknown> | undefined): RemoveWorktreeArgs;
74
+ /**
75
+ * Format worktree removal result.
76
+ */
77
+ export declare function formatWorktreeRemovalResult(name: string, result: RemoveWorktreeResult): string;
78
+ /**
79
+ * Handle remove_worktree tool.
80
+ */
81
+ export declare function handleRemoveWorktree(args: RemoveWorktreeArgs, context: WorktreeToolContext): Promise<ToolResponse>;
82
+ /**
83
+ * Arguments for worktree_status tool.
84
+ */
85
+ export interface WorktreeStatusArgs {
86
+ name: string;
87
+ }
88
+ /**
89
+ * Parse and validate worktree_status arguments.
90
+ */
91
+ export declare function parseWorktreeStatusArgs(args: Record<string, unknown> | undefined): WorktreeStatusArgs;
92
+ /**
93
+ * Handle worktree_status tool.
94
+ */
95
+ export declare function handleWorktreeStatus(args: WorktreeStatusArgs, context: WorktreeToolContext): Promise<ToolResponse>;
96
+ //# sourceMappingURL=worktree-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-handlers.d.ts","sourceRoot":"","sources":["../../src/tools/worktree-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Tool handlers for worktree operations.
3
+ */
4
+ import { WorktreeManager, formatWorktreeInfo, formatWorktreeList, } from '../worktree/index.js';
5
+ import { createToolResponse } from './types.js';
6
+ import { isString, isBoolean } from '../utils/type-guards.js';
7
+ import { GlanceyError } from '../utils/errors.js';
8
+ /**
9
+ * Get or create a worktree manager instance.
10
+ */
11
+ function getWorktreeManager(context) {
12
+ return context.worktreeManager ?? new WorktreeManager(context.projectPath);
13
+ }
14
+ /**
15
+ * Parse and validate create_worktree arguments.
16
+ */
17
+ export function parseCreateWorktreeArgs(args) {
18
+ const shortName = isString(args?.short_name) ? args.short_name : '';
19
+ if (!shortName) {
20
+ throw new GlanceyError('short_name is required', 'validation', {
21
+ tool: 'create_worktree',
22
+ });
23
+ }
24
+ const prefix = isString(args?.prefix) ? args.prefix : undefined;
25
+ const validPrefixes = ['feature', 'fix', 'refactor', 'docs', 'test'];
26
+ if (prefix && !validPrefixes.includes(prefix)) {
27
+ throw new GlanceyError(`prefix must be one of: ${validPrefixes.join(', ')}`, 'validation', {
28
+ tool: 'create_worktree',
29
+ });
30
+ }
31
+ const packageManager = isString(args?.package_manager) ? args.package_manager : undefined;
32
+ const validPackageManagers = ['npm', 'yarn', 'pnpm', 'bun'];
33
+ if (packageManager && !validPackageManagers.includes(packageManager)) {
34
+ throw new GlanceyError(`package_manager must be one of: ${validPackageManagers.join(', ')}`, 'validation', { tool: 'create_worktree' });
35
+ }
36
+ return {
37
+ shortName,
38
+ issueId: isString(args?.issue_id) ? args.issue_id : undefined,
39
+ prefix: prefix,
40
+ baseBranch: isString(args?.base_branch) ? args.base_branch : undefined,
41
+ installDeps: isBoolean(args?.install_deps) ? args.install_deps : true,
42
+ packageManager: packageManager,
43
+ };
44
+ }
45
+ /**
46
+ * Format worktree creation result.
47
+ */
48
+ export function formatWorktreeCreationResult(result) {
49
+ if (!result.success) {
50
+ return `Failed to create worktree: ${result.error}`;
51
+ }
52
+ const worktree = result.worktree;
53
+ const parts = [];
54
+ parts.push('## Worktree Created\n');
55
+ parts.push(`**Name:** ${worktree?.name}`);
56
+ parts.push(`**Path:** ${worktree?.path}`);
57
+ parts.push(`**Branch:** ${worktree?.branch}`);
58
+ if (result.depsInstalled !== undefined) {
59
+ const depsStatus = result.depsInstalled ? 'installed' : 'skipped/failed';
60
+ const timeInfo = result.depsInstallTime ? ` (${result.depsInstallTime}ms)` : '';
61
+ parts.push(`**Dependencies:** ${depsStatus}${timeInfo}`);
62
+ }
63
+ parts.push('\n**Usage:** Spawn agent with `cwd: "' + (worktree?.path ?? '') + '"`');
64
+ return parts.join('\n');
65
+ }
66
+ /**
67
+ * Handle create_worktree tool.
68
+ */
69
+ export async function handleCreateWorktree(args, context) {
70
+ const worktreeManager = getWorktreeManager(context);
71
+ const result = await worktreeManager.createWorktree({
72
+ shortName: args.shortName,
73
+ issueId: args.issueId,
74
+ prefix: args.prefix,
75
+ baseBranch: args.baseBranch,
76
+ installDeps: args.installDeps,
77
+ packageManager: args.packageManager,
78
+ });
79
+ if (!result.success) {
80
+ return {
81
+ content: [
82
+ {
83
+ type: 'text',
84
+ text: `Failed to create worktree: ${result.error}` + context.toolGuidance,
85
+ },
86
+ ],
87
+ isError: true,
88
+ };
89
+ }
90
+ return createToolResponse(formatWorktreeCreationResult(result), context.toolGuidance);
91
+ }
92
+ /**
93
+ * Handle list_worktrees tool.
94
+ */
95
+ export async function handleListWorktrees(context) {
96
+ const worktreeManager = getWorktreeManager(context);
97
+ const result = await worktreeManager.listWorktrees();
98
+ return createToolResponse(formatWorktreeList(result), context.toolGuidance);
99
+ }
100
+ /**
101
+ * Parse and validate remove_worktree arguments.
102
+ */
103
+ export function parseRemoveWorktreeArgs(args) {
104
+ const name = isString(args?.name) ? args.name : '';
105
+ if (!name) {
106
+ throw new GlanceyError('name is required', 'validation', {
107
+ tool: 'remove_worktree',
108
+ });
109
+ }
110
+ return {
111
+ name,
112
+ deleteBranch: isBoolean(args?.delete_branch) ? args.delete_branch : false,
113
+ force: isBoolean(args?.force) ? args.force : false,
114
+ };
115
+ }
116
+ /**
117
+ * Format worktree removal result.
118
+ */
119
+ export function formatWorktreeRemovalResult(name, result) {
120
+ if (!result.success) {
121
+ return `Failed to remove worktree: ${result.error}`;
122
+ }
123
+ const parts = [];
124
+ parts.push('## Worktree Removed\n');
125
+ parts.push(`**Name:** ${name}`);
126
+ if (result.branch) {
127
+ parts.push(`**Branch:** ${result.branch}`);
128
+ parts.push(`**Branch deleted:** ${result.branchDeleted ? 'yes' : 'no'}`);
129
+ }
130
+ return parts.join('\n');
131
+ }
132
+ /**
133
+ * Handle remove_worktree tool.
134
+ */
135
+ export async function handleRemoveWorktree(args, context) {
136
+ const worktreeManager = getWorktreeManager(context);
137
+ const result = await worktreeManager.removeWorktree({
138
+ name: args.name,
139
+ deleteBranch: args.deleteBranch,
140
+ force: args.force,
141
+ });
142
+ if (!result.success) {
143
+ return {
144
+ content: [
145
+ {
146
+ type: 'text',
147
+ text: `Failed to remove worktree: ${result.error}` + context.toolGuidance,
148
+ },
149
+ ],
150
+ isError: true,
151
+ };
152
+ }
153
+ return createToolResponse(formatWorktreeRemovalResult(args.name, result), context.toolGuidance);
154
+ }
155
+ /**
156
+ * Parse and validate worktree_status arguments.
157
+ */
158
+ export function parseWorktreeStatusArgs(args) {
159
+ const name = isString(args?.name) ? args.name : '';
160
+ if (!name) {
161
+ throw new GlanceyError('name is required', 'validation', {
162
+ tool: 'worktree_status',
163
+ });
164
+ }
165
+ return { name };
166
+ }
167
+ /**
168
+ * Handle worktree_status tool.
169
+ */
170
+ export async function handleWorktreeStatus(args, context) {
171
+ const worktreeManager = getWorktreeManager(context);
172
+ const info = await worktreeManager.getWorktreeInfo(args.name);
173
+ if (!info) {
174
+ return {
175
+ content: [
176
+ {
177
+ type: 'text',
178
+ text: `Worktree "${args.name}" not found.` + context.toolGuidance,
179
+ },
180
+ ],
181
+ isError: true,
182
+ };
183
+ }
184
+ return createToolResponse(formatWorktreeInfo(info), context.toolGuidance);
185
+ }
186
+ //# sourceMappingURL=worktree-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-handlers.js","sourceRoot":"","sources":["../../src/tools/worktree-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Generic TTL-based LRU cache with configurable size and expiration.
3
+ * Provides a reusable caching utility for embeddings, metadata, and other data.
4
+ */
5
+ export interface CacheOptions {
6
+ /** Maximum number of entries (default: 100) */
7
+ maxSize?: number;
8
+ /** Time-to-live in milliseconds (default: 1 hour) */
9
+ ttlMs?: number;
10
+ }
11
+ /**
12
+ * A generic LRU cache with TTL-based expiration.
13
+ *
14
+ * Features:
15
+ * - Configurable max size with LRU eviction
16
+ * - TTL-based expiration for entries
17
+ * - Automatic cleanup of expired entries on access
18
+ * - Thread-safe for single-threaded Node.js
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const cache = new TTLCache<number[]>({ maxSize: 50, ttlMs: 30000 });
23
+ * cache.set('key', [1, 2, 3]);
24
+ * const value = cache.get('key'); // [1, 2, 3] or undefined if expired
25
+ * ```
26
+ */
27
+ export declare class TTLCache<T> {
28
+ private cache;
29
+ private readonly maxSize;
30
+ private readonly ttlMs;
31
+ constructor(options?: CacheOptions);
32
+ /**
33
+ * Get a value from the cache.
34
+ * Returns undefined if not found or expired.
35
+ * Updates access time for LRU tracking.
36
+ */
37
+ get(key: string): T | undefined;
38
+ /**
39
+ * Set a value in the cache.
40
+ * Evicts expired entries and oldest entry if at capacity.
41
+ */
42
+ set(key: string, value: T): void;
43
+ /**
44
+ * Check if a key exists and is not expired.
45
+ */
46
+ has(key: string): boolean;
47
+ /**
48
+ * Delete a specific key from the cache.
49
+ */
50
+ delete(key: string): boolean;
51
+ /**
52
+ * Clear all entries from the cache.
53
+ */
54
+ clear(): void;
55
+ /**
56
+ * Get the current number of entries (including potentially expired ones).
57
+ */
58
+ get size(): number;
59
+ /**
60
+ * Get cache statistics.
61
+ */
62
+ getStats(): {
63
+ size: number;
64
+ maxSize: number;
65
+ ttlMs: number;
66
+ };
67
+ /**
68
+ * Evict all expired entries.
69
+ */
70
+ private evictExpired;
71
+ /**
72
+ * Force cleanup of all expired entries.
73
+ * Useful for periodic maintenance.
74
+ */
75
+ cleanup(): number;
76
+ }
77
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,QAAQ,CAAC,CAAC;IACrB,OAAO,CAAC,KAAK,CAAyC;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,OAAO,GAAE,YAAiB;IAKtC;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAmB/B;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAqBhC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAYzB;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAQ5D;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;;OAGG;IACH,OAAO,IAAI,MAAM;CAKlB"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Generic TTL-based LRU cache with configurable size and expiration.
3
+ * Provides a reusable caching utility for embeddings, metadata, and other data.
4
+ */
5
+ const DEFAULT_MAX_SIZE = 100;
6
+ const DEFAULT_TTL_MS = 60 * 60 * 1000; // 1 hour
7
+ /**
8
+ * A generic LRU cache with TTL-based expiration.
9
+ *
10
+ * Features:
11
+ * - Configurable max size with LRU eviction
12
+ * - TTL-based expiration for entries
13
+ * - Automatic cleanup of expired entries on access
14
+ * - Thread-safe for single-threaded Node.js
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const cache = new TTLCache<number[]>({ maxSize: 50, ttlMs: 30000 });
19
+ * cache.set('key', [1, 2, 3]);
20
+ * const value = cache.get('key'); // [1, 2, 3] or undefined if expired
21
+ * ```
22
+ */
23
+ export class TTLCache {
24
+ cache = new Map();
25
+ maxSize;
26
+ ttlMs;
27
+ constructor(options = {}) {
28
+ this.maxSize = options.maxSize ?? DEFAULT_MAX_SIZE;
29
+ this.ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
30
+ }
31
+ /**
32
+ * Get a value from the cache.
33
+ * Returns undefined if not found or expired.
34
+ * Updates access time for LRU tracking.
35
+ */
36
+ get(key) {
37
+ const entry = this.cache.get(key);
38
+ if (!entry) {
39
+ return undefined;
40
+ }
41
+ const now = Date.now();
42
+ if (now - entry.timestamp > this.ttlMs) {
43
+ // Entry expired
44
+ this.cache.delete(key);
45
+ return undefined;
46
+ }
47
+ // Move to end for LRU (delete and re-insert with updated timestamp)
48
+ this.cache.delete(key);
49
+ this.cache.set(key, { value: entry.value, timestamp: now });
50
+ return entry.value;
51
+ }
52
+ /**
53
+ * Set a value in the cache.
54
+ * Evicts expired entries and oldest entry if at capacity.
55
+ */
56
+ set(key, value) {
57
+ const now = Date.now();
58
+ // Remove existing entry if present (will be re-added at end)
59
+ this.cache.delete(key);
60
+ // Evict expired entries first
61
+ this.evictExpired(now);
62
+ // Evict oldest entry if still at capacity
63
+ if (this.cache.size >= this.maxSize) {
64
+ const oldestKey = this.cache.keys().next().value;
65
+ if (oldestKey !== undefined) {
66
+ this.cache.delete(oldestKey);
67
+ }
68
+ }
69
+ // Add new entry
70
+ this.cache.set(key, { value, timestamp: now });
71
+ }
72
+ /**
73
+ * Check if a key exists and is not expired.
74
+ */
75
+ has(key) {
76
+ const entry = this.cache.get(key);
77
+ if (!entry) {
78
+ return false;
79
+ }
80
+ if (Date.now() - entry.timestamp > this.ttlMs) {
81
+ this.cache.delete(key);
82
+ return false;
83
+ }
84
+ return true;
85
+ }
86
+ /**
87
+ * Delete a specific key from the cache.
88
+ */
89
+ delete(key) {
90
+ return this.cache.delete(key);
91
+ }
92
+ /**
93
+ * Clear all entries from the cache.
94
+ */
95
+ clear() {
96
+ this.cache.clear();
97
+ }
98
+ /**
99
+ * Get the current number of entries (including potentially expired ones).
100
+ */
101
+ get size() {
102
+ return this.cache.size;
103
+ }
104
+ /**
105
+ * Get cache statistics.
106
+ */
107
+ getStats() {
108
+ return {
109
+ size: this.cache.size,
110
+ maxSize: this.maxSize,
111
+ ttlMs: this.ttlMs,
112
+ };
113
+ }
114
+ /**
115
+ * Evict all expired entries.
116
+ */
117
+ evictExpired(now = Date.now()) {
118
+ for (const [key, entry] of this.cache) {
119
+ if (now - entry.timestamp > this.ttlMs) {
120
+ this.cache.delete(key);
121
+ }
122
+ }
123
+ }
124
+ /**
125
+ * Force cleanup of all expired entries.
126
+ * Useful for periodic maintenance.
127
+ */
128
+ cleanup() {
129
+ const sizeBefore = this.cache.size;
130
+ this.evictExpired();
131
+ return sizeBefore - this.cache.size;
132
+ }
133
+ }
134
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Process items in parallel with controlled concurrency.
3
+ * Unlike Promise.all which starts all promises at once, this limits
4
+ * how many are running at any time.
5
+ *
6
+ * @param items - Items to process
7
+ * @param fn - Async function to apply to each item
8
+ * @param concurrency - Maximum number of concurrent operations (default: 10)
9
+ * @returns Promise resolving to results in the same order as items
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * const results = await mapWithConcurrency(
14
+ * files,
15
+ * async (file) => processFile(file),
16
+ * 10 // max 10 concurrent file operations
17
+ * );
18
+ * ```
19
+ */
20
+ export declare function mapWithConcurrency<T, R>(items: T[], fn: (item: T, index: number) => Promise<R>, concurrency?: number): Promise<R[]>;
21
+ /**
22
+ * Process items in batches, where each batch is processed in parallel.
23
+ * Useful when you want to process groups at a time with progress reporting.
24
+ *
25
+ * @param items - Items to process
26
+ * @param fn - Async function to apply to each item
27
+ * @param batchSize - Number of items per batch
28
+ * @param onBatchComplete - Optional callback after each batch completes
29
+ * @returns Promise resolving to results in the same order as items
30
+ */
31
+ export declare function mapInBatches<T, R>(items: T[], fn: (item: T, index: number) => Promise<R>, batchSize?: number, onBatchComplete?: (completedCount: number, totalCount: number) => void): Promise<R[]>;
32
+ //# sourceMappingURL=concurrency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/utils/concurrency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC3C,KAAK,EAAE,CAAC,EAAE,EACV,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,WAAW,GAAE,MAAW,GACvB,OAAO,CAAC,CAAC,EAAE,CAAC,CAkBd;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,CAAC,EACrC,KAAK,EAAE,CAAC,EAAE,EACV,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,SAAS,GAAE,MAAW,EACtB,eAAe,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GACrE,OAAO,CAAC,CAAC,EAAE,CAAC,CAcd"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Process items in parallel with controlled concurrency.
3
+ * Unlike Promise.all which starts all promises at once, this limits
4
+ * how many are running at any time.
5
+ *
6
+ * @param items - Items to process
7
+ * @param fn - Async function to apply to each item
8
+ * @param concurrency - Maximum number of concurrent operations (default: 10)
9
+ * @returns Promise resolving to results in the same order as items
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * const results = await mapWithConcurrency(
14
+ * files,
15
+ * async (file) => processFile(file),
16
+ * 10 // max 10 concurrent file operations
17
+ * );
18
+ * ```
19
+ */
20
+ export async function mapWithConcurrency(items, fn, concurrency = 10) {
21
+ const results = new Array(items.length);
22
+ let currentIndex = 0;
23
+ async function processNext() {
24
+ while (currentIndex < items.length) {
25
+ const index = currentIndex++;
26
+ results[index] = await fn(items[index], index);
27
+ }
28
+ }
29
+ // Start 'concurrency' number of workers
30
+ const workers = Array(Math.min(concurrency, items.length))
31
+ .fill(null)
32
+ .map(() => processNext());
33
+ await Promise.all(workers);
34
+ return results;
35
+ }
36
+ /**
37
+ * Process items in batches, where each batch is processed in parallel.
38
+ * Useful when you want to process groups at a time with progress reporting.
39
+ *
40
+ * @param items - Items to process
41
+ * @param fn - Async function to apply to each item
42
+ * @param batchSize - Number of items per batch
43
+ * @param onBatchComplete - Optional callback after each batch completes
44
+ * @returns Promise resolving to results in the same order as items
45
+ */
46
+ export async function mapInBatches(items, fn, batchSize = 10, onBatchComplete) {
47
+ const results = [];
48
+ for (let i = 0; i < items.length; i += batchSize) {
49
+ const batch = items.slice(i, i + batchSize);
50
+ const batchStartIndex = i;
51
+ const batchResults = await Promise.all(batch.map((item, idx) => fn(item, batchStartIndex + idx)));
52
+ results.push(...batchResults);
53
+ onBatchComplete?.(results.length, items.length);
54
+ }
55
+ return results;
56
+ }
57
+ //# sourceMappingURL=concurrency.js.map