sdl-mcp 0.6.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 (496) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -0
  3. package/config/benchmark.ci.config.json +86 -0
  4. package/config/benchmark.ci.windows.config.json +86 -0
  5. package/config/benchmark.config.example.json +86 -0
  6. package/config/benchmark.config.json +86 -0
  7. package/config/sdlmcp.config.example.json +139 -0
  8. package/config/sdlmcp.config.json +48 -0
  9. package/config/sdlmcp.config.schema.json +381 -0
  10. package/dist/agent/evidence.d.ts +18 -0
  11. package/dist/agent/evidence.d.ts.map +1 -0
  12. package/dist/agent/evidence.js +107 -0
  13. package/dist/agent/evidence.js.map +1 -0
  14. package/dist/agent/executor.d.ts +28 -0
  15. package/dist/agent/executor.d.ts.map +1 -0
  16. package/dist/agent/executor.js +261 -0
  17. package/dist/agent/executor.js.map +1 -0
  18. package/dist/agent/index.d.ts +6 -0
  19. package/dist/agent/index.d.ts.map +1 -0
  20. package/dist/agent/index.js +6 -0
  21. package/dist/agent/index.js.map +1 -0
  22. package/dist/agent/orchestrator.d.ts +14 -0
  23. package/dist/agent/orchestrator.d.ts.map +1 -0
  24. package/dist/agent/orchestrator.js +108 -0
  25. package/dist/agent/orchestrator.js.map +1 -0
  26. package/dist/agent/planner.d.ts +21 -0
  27. package/dist/agent/planner.d.ts.map +1 -0
  28. package/dist/agent/planner.js +153 -0
  29. package/dist/agent/planner.js.map +1 -0
  30. package/dist/agent/types.d.ts +86 -0
  31. package/dist/agent/types.d.ts.map +1 -0
  32. package/dist/agent/types.js +2 -0
  33. package/dist/agent/types.js.map +1 -0
  34. package/dist/benchmark/index.d.ts +4 -0
  35. package/dist/benchmark/index.d.ts.map +1 -0
  36. package/dist/benchmark/index.js +4 -0
  37. package/dist/benchmark/index.js.map +1 -0
  38. package/dist/benchmark/regression.d.ts +40 -0
  39. package/dist/benchmark/regression.d.ts.map +1 -0
  40. package/dist/benchmark/regression.js +199 -0
  41. package/dist/benchmark/regression.js.map +1 -0
  42. package/dist/benchmark/smoothing.d.ts +40 -0
  43. package/dist/benchmark/smoothing.d.ts.map +1 -0
  44. package/dist/benchmark/smoothing.js +121 -0
  45. package/dist/benchmark/smoothing.js.map +1 -0
  46. package/dist/benchmark/threshold.d.ts +64 -0
  47. package/dist/benchmark/threshold.d.ts.map +1 -0
  48. package/dist/benchmark/threshold.js +173 -0
  49. package/dist/benchmark/threshold.js.map +1 -0
  50. package/dist/cli/argParsing.d.ts +34 -0
  51. package/dist/cli/argParsing.d.ts.map +1 -0
  52. package/dist/cli/argParsing.js +329 -0
  53. package/dist/cli/argParsing.js.map +1 -0
  54. package/dist/cli/commands/benchmark.d.ts +16 -0
  55. package/dist/cli/commands/benchmark.d.ts.map +1 -0
  56. package/dist/cli/commands/benchmark.js +412 -0
  57. package/dist/cli/commands/benchmark.js.map +1 -0
  58. package/dist/cli/commands/doctor.d.ts +3 -0
  59. package/dist/cli/commands/doctor.d.ts.map +1 -0
  60. package/dist/cli/commands/doctor.js +218 -0
  61. package/dist/cli/commands/doctor.js.map +1 -0
  62. package/dist/cli/commands/export.d.ts +12 -0
  63. package/dist/cli/commands/export.d.ts.map +1 -0
  64. package/dist/cli/commands/export.js +70 -0
  65. package/dist/cli/commands/export.js.map +1 -0
  66. package/dist/cli/commands/import.d.ts +10 -0
  67. package/dist/cli/commands/import.d.ts.map +1 -0
  68. package/dist/cli/commands/import.js +40 -0
  69. package/dist/cli/commands/import.js.map +1 -0
  70. package/dist/cli/commands/index.d.ts +3 -0
  71. package/dist/cli/commands/index.d.ts.map +1 -0
  72. package/dist/cli/commands/index.js +89 -0
  73. package/dist/cli/commands/index.js.map +1 -0
  74. package/dist/cli/commands/init.d.ts +3 -0
  75. package/dist/cli/commands/init.d.ts.map +1 -0
  76. package/dist/cli/commands/init.js +221 -0
  77. package/dist/cli/commands/init.js.map +1 -0
  78. package/dist/cli/commands/pull.d.ts +11 -0
  79. package/dist/cli/commands/pull.d.ts.map +1 -0
  80. package/dist/cli/commands/pull.js +47 -0
  81. package/dist/cli/commands/pull.js.map +1 -0
  82. package/dist/cli/commands/serve.d.ts +3 -0
  83. package/dist/cli/commands/serve.d.ts.map +1 -0
  84. package/dist/cli/commands/serve.js +72 -0
  85. package/dist/cli/commands/serve.js.map +1 -0
  86. package/dist/cli/commands/version.d.ts +3 -0
  87. package/dist/cli/commands/version.d.ts.map +1 -0
  88. package/dist/cli/commands/version.js +24 -0
  89. package/dist/cli/commands/version.js.map +1 -0
  90. package/dist/cli/index.d.ts +3 -0
  91. package/dist/cli/index.d.ts.map +1 -0
  92. package/dist/cli/index.js +213 -0
  93. package/dist/cli/index.js.map +1 -0
  94. package/dist/cli/logging.d.ts +10 -0
  95. package/dist/cli/logging.d.ts.map +1 -0
  96. package/dist/cli/logging.js +48 -0
  97. package/dist/cli/logging.js.map +1 -0
  98. package/dist/cli/transport/http.d.ts +3 -0
  99. package/dist/cli/transport/http.d.ts.map +1 -0
  100. package/dist/cli/transport/http.js +106 -0
  101. package/dist/cli/transport/http.js.map +1 -0
  102. package/dist/cli/transport/stdio.d.ts +3 -0
  103. package/dist/cli/transport/stdio.d.ts.map +1 -0
  104. package/dist/cli/transport/stdio.js +6 -0
  105. package/dist/cli/transport/stdio.js.map +1 -0
  106. package/dist/cli/types.d.ts +41 -0
  107. package/dist/cli/types.d.ts.map +1 -0
  108. package/dist/cli/types.js +2 -0
  109. package/dist/cli/types.js.map +1 -0
  110. package/dist/code/gate.d.ts +11 -0
  111. package/dist/code/gate.d.ts.map +1 -0
  112. package/dist/code/gate.js +134 -0
  113. package/dist/code/gate.js.map +1 -0
  114. package/dist/code/hotpath.d.ts +17 -0
  115. package/dist/code/hotpath.d.ts.map +1 -0
  116. package/dist/code/hotpath.js +200 -0
  117. package/dist/code/hotpath.js.map +1 -0
  118. package/dist/code/redact.d.ts +19 -0
  119. package/dist/code/redact.d.ts.map +1 -0
  120. package/dist/code/redact.js +92 -0
  121. package/dist/code/redact.js.map +1 -0
  122. package/dist/code/skeleton.d.ts +32 -0
  123. package/dist/code/skeleton.d.ts.map +1 -0
  124. package/dist/code/skeleton.js +610 -0
  125. package/dist/code/skeleton.js.map +1 -0
  126. package/dist/code/windows.d.ts +18 -0
  127. package/dist/code/windows.d.ts.map +1 -0
  128. package/dist/code/windows.js +236 -0
  129. package/dist/code/windows.js.map +1 -0
  130. package/dist/config/constants.d.ts +340 -0
  131. package/dist/config/constants.d.ts.map +1 -0
  132. package/dist/config/constants.js +379 -0
  133. package/dist/config/constants.js.map +1 -0
  134. package/dist/config/loadConfig.d.ts +3 -0
  135. package/dist/config/loadConfig.d.ts.map +1 -0
  136. package/dist/config/loadConfig.js +71 -0
  137. package/dist/config/loadConfig.js.map +1 -0
  138. package/dist/config/types.d.ts +509 -0
  139. package/dist/config/types.d.ts.map +1 -0
  140. package/dist/config/types.js +139 -0
  141. package/dist/config/types.js.map +1 -0
  142. package/dist/db/db.d.ts +4 -0
  143. package/dist/db/db.d.ts.map +1 -0
  144. package/dist/db/db.js +47 -0
  145. package/dist/db/db.js.map +1 -0
  146. package/dist/db/migrations.d.ts +15 -0
  147. package/dist/db/migrations.d.ts.map +1 -0
  148. package/dist/db/migrations.js +81 -0
  149. package/dist/db/migrations.js.map +1 -0
  150. package/dist/db/queries.d.ts +440 -0
  151. package/dist/db/queries.d.ts.map +1 -0
  152. package/dist/db/queries.js +1054 -0
  153. package/dist/db/queries.js.map +1 -0
  154. package/dist/db/schema.d.ts +132 -0
  155. package/dist/db/schema.d.ts.map +1 -0
  156. package/dist/db/schema.js +2 -0
  157. package/dist/db/schema.js.map +1 -0
  158. package/dist/delta/blastRadius.d.ts +24 -0
  159. package/dist/delta/blastRadius.d.ts.map +1 -0
  160. package/dist/delta/blastRadius.js +239 -0
  161. package/dist/delta/blastRadius.js.map +1 -0
  162. package/dist/delta/diff.d.ts +16 -0
  163. package/dist/delta/diff.d.ts.map +1 -0
  164. package/dist/delta/diff.js +236 -0
  165. package/dist/delta/diff.js.map +1 -0
  166. package/dist/delta/versioning.d.ts +11 -0
  167. package/dist/delta/versioning.d.ts.map +1 -0
  168. package/dist/delta/versioning.js +68 -0
  169. package/dist/delta/versioning.js.map +1 -0
  170. package/dist/graph/buildGraph.d.ts +12 -0
  171. package/dist/graph/buildGraph.d.ts.map +1 -0
  172. package/dist/graph/buildGraph.js +81 -0
  173. package/dist/graph/buildGraph.js.map +1 -0
  174. package/dist/graph/cache.d.ts +111 -0
  175. package/dist/graph/cache.d.ts.map +1 -0
  176. package/dist/graph/cache.js +237 -0
  177. package/dist/graph/cache.js.map +1 -0
  178. package/dist/graph/metrics.d.ts +12 -0
  179. package/dist/graph/metrics.d.ts.map +1 -0
  180. package/dist/graph/metrics.js +253 -0
  181. package/dist/graph/metrics.js.map +1 -0
  182. package/dist/graph/minHeap.d.ts +91 -0
  183. package/dist/graph/minHeap.d.ts.map +1 -0
  184. package/dist/graph/minHeap.js +159 -0
  185. package/dist/graph/minHeap.js.map +1 -0
  186. package/dist/graph/overview.d.ts +22 -0
  187. package/dist/graph/overview.d.ts.map +1 -0
  188. package/dist/graph/overview.js +379 -0
  189. package/dist/graph/overview.js.map +1 -0
  190. package/dist/graph/score.d.ts +27 -0
  191. package/dist/graph/score.d.ts.map +1 -0
  192. package/dist/graph/score.js +214 -0
  193. package/dist/graph/score.js.map +1 -0
  194. package/dist/graph/slice.d.ts +51 -0
  195. package/dist/graph/slice.d.ts.map +1 -0
  196. package/dist/graph/slice.js +1047 -0
  197. package/dist/graph/slice.js.map +1 -0
  198. package/dist/graph/sliceCache.d.ts +33 -0
  199. package/dist/graph/sliceCache.d.ts.map +1 -0
  200. package/dist/graph/sliceCache.js +140 -0
  201. package/dist/graph/sliceCache.js.map +1 -0
  202. package/dist/indexer/adapter/BaseAdapter.d.ts +29 -0
  203. package/dist/indexer/adapter/BaseAdapter.d.ts.map +1 -0
  204. package/dist/indexer/adapter/BaseAdapter.js +97 -0
  205. package/dist/indexer/adapter/BaseAdapter.js.map +1 -0
  206. package/dist/indexer/adapter/LanguageAdapter.d.ts +20 -0
  207. package/dist/indexer/adapter/LanguageAdapter.d.ts.map +1 -0
  208. package/dist/indexer/adapter/LanguageAdapter.js +2 -0
  209. package/dist/indexer/adapter/LanguageAdapter.js.map +1 -0
  210. package/dist/indexer/adapter/adapters.d.ts +57 -0
  211. package/dist/indexer/adapter/adapters.d.ts.map +1 -0
  212. package/dist/indexer/adapter/adapters.js +129 -0
  213. package/dist/indexer/adapter/adapters.js.map +1 -0
  214. package/dist/indexer/adapter/c.d.ts +18 -0
  215. package/dist/indexer/adapter/c.d.ts.map +1 -0
  216. package/dist/indexer/adapter/c.js +443 -0
  217. package/dist/indexer/adapter/c.js.map +1 -0
  218. package/dist/indexer/adapter/cpp.d.ts +18 -0
  219. package/dist/indexer/adapter/cpp.d.ts.map +1 -0
  220. package/dist/indexer/adapter/cpp.js +493 -0
  221. package/dist/indexer/adapter/cpp.js.map +1 -0
  222. package/dist/indexer/adapter/csharp.d.ts +48 -0
  223. package/dist/indexer/adapter/csharp.d.ts.map +1 -0
  224. package/dist/indexer/adapter/csharp.js +638 -0
  225. package/dist/indexer/adapter/csharp.js.map +1 -0
  226. package/dist/indexer/adapter/go.d.ts +14 -0
  227. package/dist/indexer/adapter/go.d.ts.map +1 -0
  228. package/dist/indexer/adapter/go.js +400 -0
  229. package/dist/indexer/adapter/go.js.map +1 -0
  230. package/dist/indexer/adapter/index.d.ts +14 -0
  231. package/dist/indexer/adapter/index.d.ts.map +1 -0
  232. package/dist/indexer/adapter/index.js +13 -0
  233. package/dist/indexer/adapter/index.js.map +1 -0
  234. package/dist/indexer/adapter/java.d.ts +14 -0
  235. package/dist/indexer/adapter/java.d.ts.map +1 -0
  236. package/dist/indexer/adapter/java.js +391 -0
  237. package/dist/indexer/adapter/java.js.map +1 -0
  238. package/dist/indexer/adapter/kotlin.d.ts +18 -0
  239. package/dist/indexer/adapter/kotlin.d.ts.map +1 -0
  240. package/dist/indexer/adapter/kotlin.js +599 -0
  241. package/dist/indexer/adapter/kotlin.js.map +1 -0
  242. package/dist/indexer/adapter/php.d.ts +18 -0
  243. package/dist/indexer/adapter/php.d.ts.map +1 -0
  244. package/dist/indexer/adapter/php.js +574 -0
  245. package/dist/indexer/adapter/php.js.map +1 -0
  246. package/dist/indexer/adapter/plugin/index.d.ts +3 -0
  247. package/dist/indexer/adapter/plugin/index.d.ts.map +1 -0
  248. package/dist/indexer/adapter/plugin/index.js +3 -0
  249. package/dist/indexer/adapter/plugin/index.js.map +1 -0
  250. package/dist/indexer/adapter/plugin/loader.d.ts +13 -0
  251. package/dist/indexer/adapter/plugin/loader.d.ts.map +1 -0
  252. package/dist/indexer/adapter/plugin/loader.js +154 -0
  253. package/dist/indexer/adapter/plugin/loader.js.map +1 -0
  254. package/dist/indexer/adapter/plugin/types.d.ts +76 -0
  255. package/dist/indexer/adapter/plugin/types.d.ts.map +1 -0
  256. package/dist/indexer/adapter/plugin/types.js +47 -0
  257. package/dist/indexer/adapter/plugin/types.js.map +1 -0
  258. package/dist/indexer/adapter/python.d.ts +14 -0
  259. package/dist/indexer/adapter/python.d.ts.map +1 -0
  260. package/dist/indexer/adapter/python.js +511 -0
  261. package/dist/indexer/adapter/python.js.map +1 -0
  262. package/dist/indexer/adapter/registry.d.ts +17 -0
  263. package/dist/indexer/adapter/registry.d.ts.map +1 -0
  264. package/dist/indexer/adapter/registry.js +134 -0
  265. package/dist/indexer/adapter/registry.js.map +1 -0
  266. package/dist/indexer/adapter/rust.d.ts +18 -0
  267. package/dist/indexer/adapter/rust.d.ts.map +1 -0
  268. package/dist/indexer/adapter/rust.js +709 -0
  269. package/dist/indexer/adapter/rust.js.map +1 -0
  270. package/dist/indexer/adapter/shell.d.ts +18 -0
  271. package/dist/indexer/adapter/shell.d.ts.map +1 -0
  272. package/dist/indexer/adapter/shell.js +345 -0
  273. package/dist/indexer/adapter/shell.js.map +1 -0
  274. package/dist/indexer/adapter/typescript.d.ts +14 -0
  275. package/dist/indexer/adapter/typescript.d.ts.map +1 -0
  276. package/dist/indexer/adapter/typescript.js +31 -0
  277. package/dist/indexer/adapter/typescript.js.map +1 -0
  278. package/dist/indexer/configEdges.d.ts +30 -0
  279. package/dist/indexer/configEdges.d.ts.map +1 -0
  280. package/dist/indexer/configEdges.js +260 -0
  281. package/dist/indexer/configEdges.js.map +1 -0
  282. package/dist/indexer/fileScanner.d.ts +16 -0
  283. package/dist/indexer/fileScanner.d.ts.map +1 -0
  284. package/dist/indexer/fileScanner.js +90 -0
  285. package/dist/indexer/fileScanner.js.map +1 -0
  286. package/dist/indexer/fingerprints.d.ts +23 -0
  287. package/dist/indexer/fingerprints.d.ts.map +1 -0
  288. package/dist/indexer/fingerprints.js +97 -0
  289. package/dist/indexer/fingerprints.js.map +1 -0
  290. package/dist/indexer/indexer.d.ts +58 -0
  291. package/dist/indexer/indexer.d.ts.map +1 -0
  292. package/dist/indexer/indexer.js +1229 -0
  293. package/dist/indexer/indexer.js.map +1 -0
  294. package/dist/indexer/summaries.d.ts +5 -0
  295. package/dist/indexer/summaries.d.ts.map +1 -0
  296. package/dist/indexer/summaries.js +331 -0
  297. package/dist/indexer/summaries.js.map +1 -0
  298. package/dist/indexer/treesitter/extractCalls.d.ts +40 -0
  299. package/dist/indexer/treesitter/extractCalls.d.ts.map +1 -0
  300. package/dist/indexer/treesitter/extractCalls.js +561 -0
  301. package/dist/indexer/treesitter/extractCalls.js.map +1 -0
  302. package/dist/indexer/treesitter/extractImports.d.ts +12 -0
  303. package/dist/indexer/treesitter/extractImports.d.ts.map +1 -0
  304. package/dist/indexer/treesitter/extractImports.js +184 -0
  305. package/dist/indexer/treesitter/extractImports.js.map +1 -0
  306. package/dist/indexer/treesitter/extractSymbols.d.ts +24 -0
  307. package/dist/indexer/treesitter/extractSymbols.d.ts.map +1 -0
  308. package/dist/indexer/treesitter/extractSymbols.js +389 -0
  309. package/dist/indexer/treesitter/extractSymbols.js.map +1 -0
  310. package/dist/indexer/treesitter/grammarLoader.d.ts +6 -0
  311. package/dist/indexer/treesitter/grammarLoader.d.ts.map +1 -0
  312. package/dist/indexer/treesitter/grammarLoader.js +125 -0
  313. package/dist/indexer/treesitter/grammarLoader.js.map +1 -0
  314. package/dist/indexer/treesitter/symbolUtils.d.ts +4 -0
  315. package/dist/indexer/treesitter/symbolUtils.d.ts.map +1 -0
  316. package/dist/indexer/treesitter/symbolUtils.js +26 -0
  317. package/dist/indexer/treesitter/symbolUtils.js.map +1 -0
  318. package/dist/indexer/treesitter/tsTreesitter.d.ts +9 -0
  319. package/dist/indexer/treesitter/tsTreesitter.d.ts.map +1 -0
  320. package/dist/indexer/treesitter/tsTreesitter.js +54 -0
  321. package/dist/indexer/treesitter/tsTreesitter.js.map +1 -0
  322. package/dist/indexer/treesitter/types.d.ts +19 -0
  323. package/dist/indexer/treesitter/types.d.ts.map +1 -0
  324. package/dist/indexer/treesitter/types.js +7 -0
  325. package/dist/indexer/treesitter/types.js.map +1 -0
  326. package/dist/indexer/ts/tsParser.d.ts +20 -0
  327. package/dist/indexer/ts/tsParser.d.ts.map +1 -0
  328. package/dist/indexer/ts/tsParser.js +114 -0
  329. package/dist/indexer/ts/tsParser.js.map +1 -0
  330. package/dist/indexer/worker.d.ts +2 -0
  331. package/dist/indexer/worker.d.ts.map +1 -0
  332. package/dist/indexer/worker.js +59 -0
  333. package/dist/indexer/worker.js.map +1 -0
  334. package/dist/indexer/workerPool.d.ts +20 -0
  335. package/dist/indexer/workerPool.d.ts.map +1 -0
  336. package/dist/indexer/workerPool.js +93 -0
  337. package/dist/indexer/workerPool.js.map +1 -0
  338. package/dist/main.d.ts +2 -0
  339. package/dist/main.d.ts.map +1 -0
  340. package/dist/main.js +111 -0
  341. package/dist/main.js.map +1 -0
  342. package/dist/mcp/errors.d.ts +40 -0
  343. package/dist/mcp/errors.d.ts.map +1 -0
  344. package/dist/mcp/errors.js +66 -0
  345. package/dist/mcp/errors.js.map +1 -0
  346. package/dist/mcp/resources.d.ts +24 -0
  347. package/dist/mcp/resources.d.ts.map +1 -0
  348. package/dist/mcp/resources.js +140 -0
  349. package/dist/mcp/resources.js.map +1 -0
  350. package/dist/mcp/telemetry.d.ts +67 -0
  351. package/dist/mcp/telemetry.d.ts.map +1 -0
  352. package/dist/mcp/telemetry.js +128 -0
  353. package/dist/mcp/telemetry.js.map +1 -0
  354. package/dist/mcp/tools/agent.d.ts +241 -0
  355. package/dist/mcp/tools/agent.d.ts.map +1 -0
  356. package/dist/mcp/tools/agent.js +113 -0
  357. package/dist/mcp/tools/agent.js.map +1 -0
  358. package/dist/mcp/tools/code.d.ts +32 -0
  359. package/dist/mcp/tools/code.d.ts.map +1 -0
  360. package/dist/mcp/tools/code.js +388 -0
  361. package/dist/mcp/tools/code.js.map +1 -0
  362. package/dist/mcp/tools/delta.d.ts +12 -0
  363. package/dist/mcp/tools/delta.d.ts.map +1 -0
  364. package/dist/mcp/tools/delta.js +82 -0
  365. package/dist/mcp/tools/delta.js.map +1 -0
  366. package/dist/mcp/tools/index.d.ts +3 -0
  367. package/dist/mcp/tools/index.d.ts.map +1 -0
  368. package/dist/mcp/tools/index.js +35 -0
  369. package/dist/mcp/tools/index.js.map +1 -0
  370. package/dist/mcp/tools/policy.d.ts +20 -0
  371. package/dist/mcp/tools/policy.d.ts.map +1 -0
  372. package/dist/mcp/tools/policy.js +67 -0
  373. package/dist/mcp/tools/policy.js.map +1 -0
  374. package/dist/mcp/tools/prRisk.d.ts +34 -0
  375. package/dist/mcp/tools/prRisk.d.ts.map +1 -0
  376. package/dist/mcp/tools/prRisk.js +304 -0
  377. package/dist/mcp/tools/prRisk.js.map +1 -0
  378. package/dist/mcp/tools/repo.d.ts +46 -0
  379. package/dist/mcp/tools/repo.d.ts.map +1 -0
  380. package/dist/mcp/tools/repo.js +224 -0
  381. package/dist/mcp/tools/repo.js.map +1 -0
  382. package/dist/mcp/tools/slice.d.ts +44 -0
  383. package/dist/mcp/tools/slice.d.ts.map +1 -0
  384. package/dist/mcp/tools/slice.js +688 -0
  385. package/dist/mcp/tools/slice.js.map +1 -0
  386. package/dist/mcp/tools/symbol.d.ts +21 -0
  387. package/dist/mcp/tools/symbol.d.ts.map +1 -0
  388. package/dist/mcp/tools/symbol.js +416 -0
  389. package/dist/mcp/tools/symbol.js.map +1 -0
  390. package/dist/mcp/tools.d.ts +6003 -0
  391. package/dist/mcp/tools.d.ts.map +1 -0
  392. package/dist/mcp/tools.js +932 -0
  393. package/dist/mcp/tools.js.map +1 -0
  394. package/dist/mcp/types.d.ts +500 -0
  395. package/dist/mcp/types.d.ts.map +1 -0
  396. package/dist/mcp/types.js +2 -0
  397. package/dist/mcp/types.js.map +1 -0
  398. package/dist/policy/engine.d.ts +21 -0
  399. package/dist/policy/engine.d.ts.map +1 -0
  400. package/dist/policy/engine.js +477 -0
  401. package/dist/policy/engine.js.map +1 -0
  402. package/dist/policy/types.d.ts +73 -0
  403. package/dist/policy/types.d.ts.map +1 -0
  404. package/dist/policy/types.js +12 -0
  405. package/dist/policy/types.js.map +1 -0
  406. package/dist/server.d.ts +17 -0
  407. package/dist/server.d.ts.map +1 -0
  408. package/dist/server.js +136 -0
  409. package/dist/server.js.map +1 -0
  410. package/dist/sync/pull.d.ts +4 -0
  411. package/dist/sync/pull.d.ts.map +1 -0
  412. package/dist/sync/pull.js +113 -0
  413. package/dist/sync/pull.js.map +1 -0
  414. package/dist/sync/sync.d.ts +6 -0
  415. package/dist/sync/sync.d.ts.map +1 -0
  416. package/dist/sync/sync.js +244 -0
  417. package/dist/sync/sync.js.map +1 -0
  418. package/dist/sync/types.d.ts +136 -0
  419. package/dist/sync/types.d.ts.map +1 -0
  420. package/dist/sync/types.js +2 -0
  421. package/dist/sync/types.js.map +1 -0
  422. package/dist/ts/diagnostics.d.ts +61 -0
  423. package/dist/ts/diagnostics.d.ts.map +1 -0
  424. package/dist/ts/diagnostics.js +259 -0
  425. package/dist/ts/diagnostics.js.map +1 -0
  426. package/dist/ts/mapping.d.ts +27 -0
  427. package/dist/ts/mapping.d.ts.map +1 -0
  428. package/dist/ts/mapping.js +68 -0
  429. package/dist/ts/mapping.js.map +1 -0
  430. package/dist/util/asyncFs.d.ts +103 -0
  431. package/dist/util/asyncFs.d.ts.map +1 -0
  432. package/dist/util/asyncFs.js +133 -0
  433. package/dist/util/asyncFs.js.map +1 -0
  434. package/dist/util/concurrency.d.ts +77 -0
  435. package/dist/util/concurrency.d.ts.map +1 -0
  436. package/dist/util/concurrency.js +146 -0
  437. package/dist/util/concurrency.js.map +1 -0
  438. package/dist/util/depLabels.d.ts +3 -0
  439. package/dist/util/depLabels.d.ts.map +1 -0
  440. package/dist/util/depLabels.js +19 -0
  441. package/dist/util/depLabels.js.map +1 -0
  442. package/dist/util/findPackageRoot.d.ts +7 -0
  443. package/dist/util/findPackageRoot.d.ts.map +1 -0
  444. package/dist/util/findPackageRoot.js +21 -0
  445. package/dist/util/findPackageRoot.js.map +1 -0
  446. package/dist/util/hashing.d.ts +9 -0
  447. package/dist/util/hashing.d.ts.map +1 -0
  448. package/dist/util/hashing.js +37 -0
  449. package/dist/util/hashing.js.map +1 -0
  450. package/dist/util/logger.d.ts +14 -0
  451. package/dist/util/logger.d.ts.map +1 -0
  452. package/dist/util/logger.js +51 -0
  453. package/dist/util/logger.js.map +1 -0
  454. package/dist/util/paths.d.ts +6 -0
  455. package/dist/util/paths.d.ts.map +1 -0
  456. package/dist/util/paths.js +79 -0
  457. package/dist/util/paths.js.map +1 -0
  458. package/dist/util/time.d.ts +4 -0
  459. package/dist/util/time.d.ts.map +1 -0
  460. package/dist/util/time.js +20 -0
  461. package/dist/util/time.js.map +1 -0
  462. package/dist/util/tokenize.d.ts +5 -0
  463. package/dist/util/tokenize.d.ts.map +1 -0
  464. package/dist/util/tokenize.js +30 -0
  465. package/dist/util/tokenize.js.map +1 -0
  466. package/dist/util/truncation.d.ts +38 -0
  467. package/dist/util/truncation.d.ts.map +1 -0
  468. package/dist/util/truncation.js +259 -0
  469. package/dist/util/truncation.js.map +1 -0
  470. package/migrations/.gitkeep +1 -0
  471. package/migrations/0001_init.sql +61 -0
  472. package/migrations/0002_edges_indexes.sql +2 -0
  473. package/migrations/0003_versions.sql +22 -0
  474. package/migrations/0004_metrics_audit.sql +23 -0
  475. package/migrations/0005_slice_handles.sql +15 -0
  476. package/migrations/0006_content_addressed.sql +29 -0
  477. package/migrations/0007_add_language_to_symbols.sql +28 -0
  478. package/migrations/0008_performance_indexes.sql +21 -0
  479. package/migrations/0009_fix_edge_fks.sql +37 -0
  480. package/migrations/0010_standardize_fks.sql +35 -0
  481. package/migrations/0011_add_directory_column.sql +20 -0
  482. package/migrations/0012_symbol_references.sql +16 -0
  483. package/migrations/0013_sync_artifacts.sql +17 -0
  484. package/package.json +107 -0
  485. package/templates/CLAUDE.md.template +179 -0
  486. package/templates/README.md +228 -0
  487. package/templates/claude-code.json +54 -0
  488. package/templates/codex.json +55 -0
  489. package/templates/gemini.json +66 -0
  490. package/templates/opencode.json +90 -0
  491. package/templates/plugin-template/LICENSE +21 -0
  492. package/templates/plugin-template/README.md +309 -0
  493. package/templates/plugin-template/index.ts +160 -0
  494. package/templates/plugin-template/package.json +31 -0
  495. package/templates/plugin-template/test/plugin.test.ts +186 -0
  496. package/templates/plugin-template/tsconfig.json +21 -0
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Async file system operations with concurrency control.
3
+ *
4
+ * Wraps Node.js fs operations with async/await and applies
5
+ * concurrency limits to prevent resource exhaustion.
6
+ */
7
+ import { ConcurrencyLimiter } from "./concurrency.js";
8
+ /**
9
+ * Configuration for async file operations.
10
+ */
11
+ export interface AsyncFsConfig {
12
+ /**
13
+ * Maximum concurrent file read operations.
14
+ */
15
+ maxConcurrentReads?: number;
16
+ /**
17
+ * Maximum concurrent file stat operations.
18
+ */
19
+ maxConcurrentStats?: number;
20
+ /**
21
+ * Concurrency limiter instance (optional, overrides maxConcurrent settings).
22
+ */
23
+ limiter?: ConcurrencyLimiter;
24
+ }
25
+ declare class AsyncFsOperations {
26
+ private readLimiter;
27
+ private statLimiter;
28
+ constructor(config?: AsyncFsConfig);
29
+ /**
30
+ * Reads a file's content asynchronously with concurrency control.
31
+ *
32
+ * @param filePath - Path to the file to read
33
+ * @param encoding - File encoding (default: "utf-8")
34
+ * @returns Promise that resolves with file content
35
+ */
36
+ readFile(filePath: string, encoding?: BufferEncoding): Promise<string>;
37
+ /**
38
+ * Gets file statistics asynchronously with concurrency control.
39
+ *
40
+ * @param filePath - Path to the file
41
+ * @returns Promise that resolves with file stats
42
+ */
43
+ stat(filePath: string): Promise<import("fs").Stats>;
44
+ /**
45
+ * Checks if a file exists asynchronously.
46
+ *
47
+ * @param filePath - Path to check
48
+ * @returns Promise that resolves with true if file exists
49
+ */
50
+ exists(filePath: string): Promise<boolean>;
51
+ /**
52
+ * Checks if a file is readable asynchronously.
53
+ *
54
+ * @param filePath - Path to check
55
+ * @returns Promise that resolves with true if file is readable
56
+ */
57
+ isReadable(filePath: string): Promise<boolean>;
58
+ /**
59
+ * Gets file size asynchronously with caching hint.
60
+ *
61
+ * @param filePath - Path to the file
62
+ * @returns Promise that resolves with file size in bytes
63
+ */
64
+ getFileSize(filePath: string): Promise<number>;
65
+ /**
66
+ * Gets file modification time asynchronously.
67
+ *
68
+ * @param filePath - Path to the file
69
+ * @returns Promise that resolves with modification timestamp
70
+ */
71
+ getMtime(filePath: string): Promise<Date>;
72
+ }
73
+ /**
74
+ * Creates a new async file system operations instance with optional config.
75
+ *
76
+ * @param config - Optional configuration
77
+ * @returns New AsyncFsOperations instance
78
+ */
79
+ export declare function createAsyncFsOperations(config?: AsyncFsConfig): AsyncFsOperations;
80
+ /**
81
+ * Convenience function to read a file with concurrency control.
82
+ *
83
+ * @param filePath - Path to the file
84
+ * @param encoding - File encoding
85
+ * @returns Promise that resolves with file content
86
+ */
87
+ export declare function readFileAsync(filePath: string, encoding?: BufferEncoding): Promise<string>;
88
+ /**
89
+ * Convenience function to get file stats with concurrency control.
90
+ *
91
+ * @param filePath - Path to the file
92
+ * @returns Promise that resolves with file stats
93
+ */
94
+ export declare function statAsync(filePath: string): Promise<import("fs").Stats>;
95
+ /**
96
+ * Convenience function to check if file exists asynchronously.
97
+ *
98
+ * @param filePath - Path to check
99
+ * @returns Promise that resolves with true if file exists
100
+ */
101
+ export declare function existsAsync(filePath: string): Promise<boolean>;
102
+ export {};
103
+ //# sourceMappingURL=asyncFs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asyncFs.d.ts","sourceRoot":"","sources":["../../src/util/asyncFs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAED,cAAM,iBAAiB;IACrB,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,WAAW,CAAqB;gBAE5B,MAAM,GAAE,aAAkB;IAoBtC;;;;;;OAMG;IACG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,cAAwB,GACjC,OAAO,CAAC,MAAM,CAAC;IAIlB;;;;;OAKG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,KAAK,CAAC;IAIzD;;;;;OAKG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAShD;;;;;OAKG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASpD;;;;;OAKG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKpD;;;;;OAKG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIhD;AAID;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,CAAC,EAAE,aAAa,GACrB,iBAAiB,CAEnB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,KAAK,CAAC,CAE7E;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEpE"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Async file system operations with concurrency control.
3
+ *
4
+ * Wraps Node.js fs operations with async/await and applies
5
+ * concurrency limits to prevent resource exhaustion.
6
+ */
7
+ import { readFile, stat, access, constants } from "fs/promises";
8
+ import { ConcurrencyLimiter } from "./concurrency.js";
9
+ class AsyncFsOperations {
10
+ readLimiter;
11
+ statLimiter;
12
+ constructor(config = {}) {
13
+ const { maxConcurrentReads = 10, maxConcurrentStats = 10, limiter, } = config;
14
+ this.readLimiter =
15
+ limiter ??
16
+ new ConcurrencyLimiter({
17
+ maxConcurrency: maxConcurrentReads,
18
+ });
19
+ this.statLimiter =
20
+ limiter ??
21
+ new ConcurrencyLimiter({
22
+ maxConcurrency: maxConcurrentStats,
23
+ });
24
+ }
25
+ /**
26
+ * Reads a file's content asynchronously with concurrency control.
27
+ *
28
+ * @param filePath - Path to the file to read
29
+ * @param encoding - File encoding (default: "utf-8")
30
+ * @returns Promise that resolves with file content
31
+ */
32
+ async readFile(filePath, encoding = "utf-8") {
33
+ return this.readLimiter.run(() => readFile(filePath, encoding));
34
+ }
35
+ /**
36
+ * Gets file statistics asynchronously with concurrency control.
37
+ *
38
+ * @param filePath - Path to the file
39
+ * @returns Promise that resolves with file stats
40
+ */
41
+ async stat(filePath) {
42
+ return this.statLimiter.run(() => stat(filePath));
43
+ }
44
+ /**
45
+ * Checks if a file exists asynchronously.
46
+ *
47
+ * @param filePath - Path to check
48
+ * @returns Promise that resolves with true if file exists
49
+ */
50
+ async exists(filePath) {
51
+ try {
52
+ await access(filePath, constants.F_OK);
53
+ return true;
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ }
59
+ /**
60
+ * Checks if a file is readable asynchronously.
61
+ *
62
+ * @param filePath - Path to check
63
+ * @returns Promise that resolves with true if file is readable
64
+ */
65
+ async isReadable(filePath) {
66
+ try {
67
+ await access(filePath, constants.R_OK);
68
+ return true;
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ }
74
+ /**
75
+ * Gets file size asynchronously with caching hint.
76
+ *
77
+ * @param filePath - Path to the file
78
+ * @returns Promise that resolves with file size in bytes
79
+ */
80
+ async getFileSize(filePath) {
81
+ const stats = await this.stat(filePath);
82
+ return stats.size;
83
+ }
84
+ /**
85
+ * Gets file modification time asynchronously.
86
+ *
87
+ * @param filePath - Path to the file
88
+ * @returns Promise that resolves with modification timestamp
89
+ */
90
+ async getMtime(filePath) {
91
+ const stats = await this.stat(filePath);
92
+ return stats.mtime;
93
+ }
94
+ }
95
+ const defaultInstance = new AsyncFsOperations();
96
+ /**
97
+ * Creates a new async file system operations instance with optional config.
98
+ *
99
+ * @param config - Optional configuration
100
+ * @returns New AsyncFsOperations instance
101
+ */
102
+ export function createAsyncFsOperations(config) {
103
+ return new AsyncFsOperations(config);
104
+ }
105
+ /**
106
+ * Convenience function to read a file with concurrency control.
107
+ *
108
+ * @param filePath - Path to the file
109
+ * @param encoding - File encoding
110
+ * @returns Promise that resolves with file content
111
+ */
112
+ export async function readFileAsync(filePath, encoding) {
113
+ return defaultInstance.readFile(filePath, encoding);
114
+ }
115
+ /**
116
+ * Convenience function to get file stats with concurrency control.
117
+ *
118
+ * @param filePath - Path to the file
119
+ * @returns Promise that resolves with file stats
120
+ */
121
+ export async function statAsync(filePath) {
122
+ return defaultInstance.stat(filePath);
123
+ }
124
+ /**
125
+ * Convenience function to check if file exists asynchronously.
126
+ *
127
+ * @param filePath - Path to check
128
+ * @returns Promise that resolves with true if file exists
129
+ */
130
+ export async function existsAsync(filePath) {
131
+ return defaultInstance.exists(filePath);
132
+ }
133
+ //# sourceMappingURL=asyncFs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asyncFs.js","sourceRoot":"","sources":["../../src/util/asyncFs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Concurrency limiter utility for controlling parallel operations.
3
+ *
4
+ * Provides a simple semaphore-based mechanism to limit the number of
5
+ * concurrent operations, preventing resource exhaustion and improving
6
+ * performance under load.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * const limiter = new ConcurrencyLimiter(4); // Limit to 4 concurrent operations
11
+ * await limiter.run(() => readFileAsync(path));
12
+ * ```
13
+ */
14
+ export interface ConcurrencyLimiterOptions {
15
+ /**
16
+ * Maximum number of concurrent operations allowed.
17
+ */
18
+ maxConcurrency: number;
19
+ /**
20
+ * Optional timeout for queued operations in milliseconds.
21
+ * If not provided, operations wait indefinitely.
22
+ */
23
+ queueTimeoutMs?: number;
24
+ }
25
+ export declare class ConcurrencyLimiter {
26
+ private maxConcurrency;
27
+ private queueTimeoutMs;
28
+ private activeCount;
29
+ private queue;
30
+ constructor(options: ConcurrencyLimiterOptions);
31
+ /**
32
+ * Executes a task within the concurrency limit.
33
+ *
34
+ * @param task - Async function to execute
35
+ * @param timeoutMs - Optional timeout override for this specific task
36
+ * @returns Promise that resolves with the task's result
37
+ */
38
+ run<T>(task: () => Promise<T>, timeoutMs?: number): Promise<T>;
39
+ private executeTask;
40
+ private processQueue;
41
+ /**
42
+ * Gets current statistics about the limiter.
43
+ *
44
+ * @returns Object with active count and queue length
45
+ */
46
+ getStats(): {
47
+ active: number;
48
+ queued: number;
49
+ };
50
+ /**
51
+ * Clears all pending tasks from the queue.
52
+ *
53
+ * @param error - Optional error to reject all queued tasks with
54
+ */
55
+ clearQueue(error?: Error): void;
56
+ /**
57
+ * Waits for all active tasks to complete.
58
+ *
59
+ * @returns Promise that resolves when no tasks are active
60
+ */
61
+ drain(): Promise<void>;
62
+ }
63
+ /**
64
+ * Creates a limiter for file system operations.
65
+ *
66
+ * @param concurrency - Maximum concurrent file operations
67
+ * @returns Configured ConcurrencyLimiter
68
+ */
69
+ export declare function createFileIOLimiter(concurrency: number): ConcurrencyLimiter;
70
+ /**
71
+ * Creates a limiter for database operations.
72
+ *
73
+ * @param concurrency - Maximum concurrent database queries
74
+ * @returns Configured ConcurrencyLimiter
75
+ */
76
+ export declare function createDbIOLimiter(concurrency: number): ConcurrencyLimiter;
77
+ //# sourceMappingURL=concurrency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/util/concurrency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAIV;gBAES,OAAO,EAAE,yBAAyB;IAW9C;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;YAoCtD,WAAW;IAyBzB,OAAO,CAAC,YAAY;IAWpB;;;;OAIG;IACH,QAAQ,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAO9C;;;;OAIG;IACH,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAU/B;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,CAI3E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,CAIzE"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Concurrency limiter utility for controlling parallel operations.
3
+ *
4
+ * Provides a simple semaphore-based mechanism to limit the number of
5
+ * concurrent operations, preventing resource exhaustion and improving
6
+ * performance under load.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * const limiter = new ConcurrencyLimiter(4); // Limit to 4 concurrent operations
11
+ * await limiter.run(() => readFileAsync(path));
12
+ * ```
13
+ */
14
+ export class ConcurrencyLimiter {
15
+ maxConcurrency;
16
+ queueTimeoutMs;
17
+ activeCount;
18
+ queue;
19
+ constructor(options) {
20
+ if (options.maxConcurrency < 1) {
21
+ throw new Error("maxConcurrency must be at least 1");
22
+ }
23
+ this.maxConcurrency = options.maxConcurrency;
24
+ this.queueTimeoutMs = options.queueTimeoutMs;
25
+ this.activeCount = 0;
26
+ this.queue = [];
27
+ }
28
+ /**
29
+ * Executes a task within the concurrency limit.
30
+ *
31
+ * @param task - Async function to execute
32
+ * @param timeoutMs - Optional timeout override for this specific task
33
+ * @returns Promise that resolves with the task's result
34
+ */
35
+ async run(task, timeoutMs) {
36
+ if (this.activeCount < this.maxConcurrency) {
37
+ return this.executeTask(task, timeoutMs);
38
+ }
39
+ return new Promise((resolve, reject) => {
40
+ const timeout = timeoutMs ?? this.queueTimeoutMs ?? undefined;
41
+ let timeoutHandle;
42
+ const item = {
43
+ resolve: resolve,
44
+ reject,
45
+ task: () => {
46
+ if (timeoutHandle) {
47
+ clearTimeout(timeoutHandle);
48
+ }
49
+ return task();
50
+ },
51
+ };
52
+ if (timeout) {
53
+ timeoutHandle = setTimeout(() => {
54
+ const index = this.queue.indexOf(item);
55
+ if (index !== -1) {
56
+ this.queue.splice(index, 1);
57
+ }
58
+ reject(new Error(`ConcurrencyLimiter queue timeout after ${timeout}ms`));
59
+ }, timeout);
60
+ }
61
+ this.queue.push(item);
62
+ });
63
+ }
64
+ async executeTask(task, timeoutMs) {
65
+ this.activeCount++;
66
+ try {
67
+ if (timeoutMs) {
68
+ return await Promise.race([
69
+ task(),
70
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Task timeout after ${timeoutMs}ms`)), timeoutMs)),
71
+ ]);
72
+ }
73
+ return await task();
74
+ }
75
+ finally {
76
+ this.activeCount--;
77
+ this.processQueue();
78
+ }
79
+ }
80
+ processQueue() {
81
+ while (this.queue.length > 0 && this.activeCount < this.maxConcurrency) {
82
+ const item = this.queue.shift();
83
+ if (item) {
84
+ this.executeTask(item.task)
85
+ .then((result) => item.resolve(result))
86
+ .catch((error) => item.reject(error));
87
+ }
88
+ }
89
+ }
90
+ /**
91
+ * Gets current statistics about the limiter.
92
+ *
93
+ * @returns Object with active count and queue length
94
+ */
95
+ getStats() {
96
+ return {
97
+ active: this.activeCount,
98
+ queued: this.queue.length,
99
+ };
100
+ }
101
+ /**
102
+ * Clears all pending tasks from the queue.
103
+ *
104
+ * @param error - Optional error to reject all queued tasks with
105
+ */
106
+ clearQueue(error) {
107
+ const errorToUse = error ?? new Error("ConcurrencyLimiter queue cleared");
108
+ for (const item of this.queue) {
109
+ item.reject(errorToUse);
110
+ }
111
+ this.queue.length = 0;
112
+ }
113
+ /**
114
+ * Waits for all active tasks to complete.
115
+ *
116
+ * @returns Promise that resolves when no tasks are active
117
+ */
118
+ async drain() {
119
+ while (this.activeCount > 0 || this.queue.length > 0) {
120
+ await new Promise((resolve) => setTimeout(resolve, 10));
121
+ }
122
+ }
123
+ }
124
+ /**
125
+ * Creates a limiter for file system operations.
126
+ *
127
+ * @param concurrency - Maximum concurrent file operations
128
+ * @returns Configured ConcurrencyLimiter
129
+ */
130
+ export function createFileIOLimiter(concurrency) {
131
+ return new ConcurrencyLimiter({
132
+ maxConcurrency: concurrency,
133
+ });
134
+ }
135
+ /**
136
+ * Creates a limiter for database operations.
137
+ *
138
+ * @param concurrency - Maximum concurrent database queries
139
+ * @returns Configured ConcurrencyLimiter
140
+ */
141
+ export function createDbIOLimiter(concurrency) {
142
+ return new ConcurrencyLimiter({
143
+ maxConcurrency: concurrency,
144
+ });
145
+ }
146
+ //# sourceMappingURL=concurrency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/util/concurrency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAeH,MAAM,OAAO,kBAAkB;IACrB,cAAc,CAAS;IACvB,cAAc,CAAqB;IACnC,WAAW,CAAS;IACpB,KAAK,CAIV;IAEH,YAAY,OAAkC;QAC5C,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,CAAI,IAAsB,EAAE,SAAkB;QACrD,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,OAAO,GAAG,SAAS,IAAI,IAAI,CAAC,cAAc,IAAI,SAAS,CAAC;YAC9D,IAAI,aAAyC,CAAC;YAE9C,MAAM,IAAI,GAAG;gBACX,OAAO,EAAE,OAAmC;gBAC5C,MAAM;gBACN,IAAI,EAAE,GAAG,EAAE;oBACT,IAAI,aAAa,EAAE,CAAC;wBAClB,YAAY,CAAC,aAAa,CAAC,CAAC;oBAC9B,CAAC;oBACD,OAAO,IAAI,EAAE,CAAC;gBAChB,CAAC;aACF,CAAC;YAEF,IAAI,OAAO,EAAE,CAAC;gBACZ,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACvC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;wBACjB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;oBAC9B,CAAC;oBACD,MAAM,CACJ,IAAI,KAAK,CAAC,0CAA0C,OAAO,IAAI,CAAC,CACjE,CAAC;gBACJ,CAAC,EAAE,OAAO,CAAC,CAAC;YACd,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,IAAsB,EACtB,SAAkB;QAElB,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,IAAI,CAAC;YACH,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;oBACxB,IAAI,EAAE;oBACN,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/B,UAAU,CACR,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,SAAS,IAAI,CAAC,CAAC,EAC5D,SAAS,CACV,CACF;iBACF,CAAC,CAAC;YACL,CAAC;YACD,OAAO,MAAM,IAAI,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,YAAY;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACvE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;qBACxB,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;qBACtC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACN,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,WAAW;YACxB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;SAC1B,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,KAAa;QACtB,MAAM,UAAU,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAE1E,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,OAAO,IAAI,kBAAkB,CAAC;QAC5B,cAAc,EAAE,WAAW;KAC5B,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,OAAO,IAAI,kBAAkB,CAAC;QAC5B,cAAc,EAAE,WAAW;KAC5B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function isOpaqueSymbolIdRef(value: string): boolean;
2
+ export declare function pickDepLabel(targetId: string, targetName?: string): string | undefined;
3
+ //# sourceMappingURL=depLabels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depLabels.d.ts","sourceRoot":"","sources":["../../src/util/depLabels.ts"],"names":[],"mappings":"AAIA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CActF"}
@@ -0,0 +1,19 @@
1
+ import { DEP_LABEL_MAX_LENGTH } from "../config/constants.js";
2
+ const OPAQUE_SYMBOL_ID_PATTERN = /^[a-f0-9]{64}$/i;
3
+ export function isOpaqueSymbolIdRef(value) {
4
+ return OPAQUE_SYMBOL_ID_PATTERN.test(value);
5
+ }
6
+ export function pickDepLabel(targetId, targetName) {
7
+ if (targetName && targetName.length > 0) {
8
+ return targetName.length > DEP_LABEL_MAX_LENGTH
9
+ ? targetName.slice(0, DEP_LABEL_MAX_LENGTH)
10
+ : targetName;
11
+ }
12
+ if (isOpaqueSymbolIdRef(targetId)) {
13
+ return undefined;
14
+ }
15
+ return targetId.length > DEP_LABEL_MAX_LENGTH
16
+ ? targetId.slice(0, DEP_LABEL_MAX_LENGTH)
17
+ : targetId;
18
+ }
19
+ //# sourceMappingURL=depLabels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depLabels.js","sourceRoot":"","sources":["../../src/util/depLabels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,wBAAwB,GAAG,iBAAiB,CAAC;AAEnD,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,UAAmB;IAChE,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,UAAU,CAAC,MAAM,GAAG,oBAAoB;YAC7C,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC;YAC3C,CAAC,CAAC,UAAU,CAAC;IACjB,CAAC;IAED,IAAI,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,GAAG,oBAAoB;QAC3C,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC;QACzC,CAAC,CAAC,QAAQ,CAAC;AACf,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Find the nearest directory at/above startDir that contains package.json.
3
+ * This lets compiled code (dist/...) locate repo resources (config/, migrations/, etc.)
4
+ * without relying on fragile relative paths.
5
+ */
6
+ export declare function findPackageRoot(startDir: string, maxDepth?: number): string;
7
+ //# sourceMappingURL=findPackageRoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findPackageRoot.d.ts","sourceRoot":"","sources":["../../src/util/findPackageRoot.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,MAAM,CAW/E"}
@@ -0,0 +1,21 @@
1
+ import { existsSync } from "fs";
2
+ import { dirname, resolve } from "path";
3
+ /**
4
+ * Find the nearest directory at/above startDir that contains package.json.
5
+ * This lets compiled code (dist/...) locate repo resources (config/, migrations/, etc.)
6
+ * without relying on fragile relative paths.
7
+ */
8
+ export function findPackageRoot(startDir, maxDepth = 10) {
9
+ let dir = resolve(startDir);
10
+ for (let i = 0; i < maxDepth; i++) {
11
+ if (existsSync(resolve(dir, "package.json"))) {
12
+ return dir;
13
+ }
14
+ const parent = dirname(dir);
15
+ if (parent === dir)
16
+ break;
17
+ dir = parent;
18
+ }
19
+ return resolve(startDir);
20
+ }
21
+ //# sourceMappingURL=findPackageRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findPackageRoot.js","sourceRoot":"","sources":["../../src/util/findPackageRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAExC;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,WAAmB,EAAE;IACrE,IAAI,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { SymbolCard } from "../mcp/types.js";
2
+ export type NormalizedValue = null | string | number | boolean | NormalizedValue[] | {
3
+ [key: string]: NormalizedValue;
4
+ };
5
+ export declare function hashContent(content: string): string;
6
+ export declare function generateSymbolId(repoId: string, relPath: string, kind: string, name: string, astFingerprint: string): string;
7
+ export declare function normalizeCard(card: SymbolCard): NormalizedValue;
8
+ export declare function hashCard(card: SymbolCard): string;
9
+ //# sourceMappingURL=hashing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hashing.d.ts","sourceRoot":"","sources":["../../src/util/hashing.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,MAAM,eAAe,GACvB,IAAI,GACJ,MAAM,GACN,MAAM,GACN,OAAO,GACP,eAAe,EAAE,GACjB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAA;CAAE,CAAC;AAEvC,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,GACrB,MAAM,CAGR;AA4BD,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CAE/D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAIjD"}
@@ -0,0 +1,37 @@
1
+ import * as crypto from "crypto";
2
+ export function hashContent(content) {
3
+ return crypto.createHash("sha256").update(content).digest("hex");
4
+ }
5
+ export function generateSymbolId(repoId, relPath, kind, name, astFingerprint) {
6
+ const combined = `${repoId}:${relPath}:${kind}:${name}:${astFingerprint}`;
7
+ return crypto.createHash("sha256").update(combined).digest("hex");
8
+ }
9
+ function normalizeObject(obj) {
10
+ if (obj === null || obj === undefined) {
11
+ return null;
12
+ }
13
+ if (Array.isArray(obj)) {
14
+ return obj.map(normalizeObject);
15
+ }
16
+ if (typeof obj === "object" && obj !== null) {
17
+ const normalized = {};
18
+ const sortedKeys = Object.keys(obj).sort();
19
+ for (const key of sortedKeys) {
20
+ const value = obj[key];
21
+ if (value !== undefined) {
22
+ normalized[key] = normalizeObject(value);
23
+ }
24
+ }
25
+ return normalized;
26
+ }
27
+ return obj;
28
+ }
29
+ export function normalizeCard(card) {
30
+ return normalizeObject(card);
31
+ }
32
+ export function hashCard(card) {
33
+ const normalized = normalizeCard(card);
34
+ const canonical = JSON.stringify(normalized);
35
+ return hashContent(canonical);
36
+ }
37
+ //# sourceMappingURL=hashing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hashing.js","sourceRoot":"","sources":["../../src/util/hashing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAWjC,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,OAAe,EACf,IAAY,EACZ,IAAY,EACZ,cAAsB;IAEtB,MAAM,QAAQ,GAAG,GAAG,MAAM,IAAI,OAAO,IAAI,IAAI,IAAI,IAAI,IAAI,cAAc,EAAE,CAAC;IAC1E,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,eAAe,CAAC,GAAY;IACnC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAoC,EAAE,CAAC;QACvD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAA8B,CAAC,CAAC,IAAI,EAAE,CAAC;QAEtE,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAI,GAA+B,CAAC,GAAG,CAAC,CAAC;YACpD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,UAAU,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,GAAsB,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC5C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAgB;IACvC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC7C,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type LogLevel = "debug" | "info" | "warn" | "error";
2
+ declare class Logger {
3
+ private level;
4
+ constructor(level?: LogLevel);
5
+ private shouldLog;
6
+ setLevel(level: LogLevel): void;
7
+ debug(message: string, meta?: Record<string, unknown>): void;
8
+ info(message: string, meta?: Record<string, unknown>): void;
9
+ warn(message: string, meta?: Record<string, unknown>): void;
10
+ error(message: string, meta?: Record<string, unknown>): void;
11
+ }
12
+ export declare const logger: Logger;
13
+ export {};
14
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/util/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAe3D,cAAM,MAAM;IACV,OAAO,CAAC,KAAK,CAAW;gBAEZ,KAAK,GAAE,QAAiB;IAIpC,OAAO,CAAC,SAAS;IAKjB,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAO5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAO3D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAO3D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAM7D;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}