codesift-mcp 0.13.1 → 0.15.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 (546) hide show
  1. package/README.md +5 -1
  2. package/dist/cli/commands-admin.d.ts +18 -0
  3. package/dist/cli/commands-admin.d.ts.map +1 -0
  4. package/dist/cli/commands-admin.js +187 -0
  5. package/dist/cli/commands-admin.js.map +1 -0
  6. package/dist/cli/commands-daemon.d.ts +42 -0
  7. package/dist/cli/commands-daemon.d.ts.map +1 -0
  8. package/dist/cli/commands-daemon.js +163 -0
  9. package/dist/cli/commands-daemon.js.map +1 -0
  10. package/dist/cli/commands-index.d.ts +12 -0
  11. package/dist/cli/commands-index.d.ts.map +1 -0
  12. package/dist/cli/commands-index.js +133 -0
  13. package/dist/cli/commands-index.js.map +1 -0
  14. package/dist/cli/commands-maintenance.d.ts +12 -0
  15. package/dist/cli/commands-maintenance.d.ts.map +1 -0
  16. package/dist/cli/commands-maintenance.js +409 -0
  17. package/dist/cli/commands-maintenance.js.map +1 -0
  18. package/dist/cli/commands-query.d.ts +21 -0
  19. package/dist/cli/commands-query.d.ts.map +1 -0
  20. package/dist/cli/commands-query.js +270 -0
  21. package/dist/cli/commands-query.js.map +1 -0
  22. package/dist/cli/commands.d.ts +2 -36
  23. package/dist/cli/commands.d.ts.map +1 -1
  24. package/dist/cli/commands.js +8 -854
  25. package/dist/cli/commands.js.map +1 -1
  26. package/dist/cli/embed-child.js +13 -2
  27. package/dist/cli/embed-child.js.map +1 -1
  28. package/dist/cli/hooks/pre-tool-use.d.ts +1 -0
  29. package/dist/cli/hooks/pre-tool-use.d.ts.map +1 -1
  30. package/dist/cli/hooks/pre-tool-use.js +11 -2
  31. package/dist/cli/hooks/pre-tool-use.js.map +1 -1
  32. package/dist/config.d.ts +13 -0
  33. package/dist/config.d.ts.map +1 -1
  34. package/dist/config.js +21 -0
  35. package/dist/config.js.map +1 -1
  36. package/dist/formatters-core.d.ts +7 -0
  37. package/dist/formatters-core.d.ts.map +1 -1
  38. package/dist/formatters-core.js +14 -3
  39. package/dist/formatters-core.js.map +1 -1
  40. package/dist/instructions.d.ts +1 -1
  41. package/dist/instructions.d.ts.map +1 -1
  42. package/dist/instructions.js +5 -2
  43. package/dist/instructions.js.map +1 -1
  44. package/dist/parser/extractors/hono-inline-analyzer.js +2 -2
  45. package/dist/parser/extractors/hono-inline-analyzer.js.map +1 -1
  46. package/dist/parser/extractors/php-class-metadata.d.ts +10 -0
  47. package/dist/parser/extractors/php-class-metadata.d.ts.map +1 -0
  48. package/dist/parser/extractors/php-class-metadata.js +65 -0
  49. package/dist/parser/extractors/php-class-metadata.js.map +1 -0
  50. package/dist/parser/extractors/php-doc.d.ts +13 -0
  51. package/dist/parser/extractors/php-doc.d.ts.map +1 -0
  52. package/dist/parser/extractors/php-doc.js +39 -0
  53. package/dist/parser/extractors/php-doc.js.map +1 -0
  54. package/dist/parser/extractors/php-node-metadata.d.ts +26 -0
  55. package/dist/parser/extractors/php-node-metadata.d.ts.map +1 -0
  56. package/dist/parser/extractors/php-node-metadata.js +132 -0
  57. package/dist/parser/extractors/php-node-metadata.js.map +1 -0
  58. package/dist/parser/extractors/php-symbol-builders.d.ts +13 -0
  59. package/dist/parser/extractors/php-symbol-builders.d.ts.map +1 -0
  60. package/dist/parser/extractors/php-symbol-builders.js +58 -0
  61. package/dist/parser/extractors/php-symbol-builders.js.map +1 -0
  62. package/dist/parser/extractors/php-walker.d.ts +4 -0
  63. package/dist/parser/extractors/php-walker.d.ts.map +1 -0
  64. package/dist/parser/extractors/php-walker.js +238 -0
  65. package/dist/parser/extractors/php-walker.js.map +1 -0
  66. package/dist/parser/extractors/php.d.ts +2 -33
  67. package/dist/parser/extractors/php.d.ts.map +1 -1
  68. package/dist/parser/extractors/php.js +2 -747
  69. package/dist/parser/extractors/php.js.map +1 -1
  70. package/dist/register-tool-groups/core/search.d.ts.map +1 -1
  71. package/dist/register-tool-groups/core/search.js +14 -0
  72. package/dist/register-tool-groups/core/search.js.map +1 -1
  73. package/dist/register-tool-groups/core/symbols.d.ts.map +1 -1
  74. package/dist/register-tool-groups/core/symbols.js +50 -5
  75. package/dist/register-tool-groups/core/symbols.js.map +1 -1
  76. package/dist/register-tool-loaders.d.ts +11 -11
  77. package/dist/register-tool-loaders.d.ts.map +1 -1
  78. package/dist/register-tools/runtime.d.ts +11 -0
  79. package/dist/register-tools/runtime.d.ts.map +1 -1
  80. package/dist/register-tools/runtime.js +40 -0
  81. package/dist/register-tools/runtime.js.map +1 -1
  82. package/dist/register-tools.d.ts.map +1 -1
  83. package/dist/register-tools.js +5 -1
  84. package/dist/register-tools.js.map +1 -1
  85. package/dist/retrieval/semantic-handlers.d.ts.map +1 -1
  86. package/dist/retrieval/semantic-handlers.js +10 -3
  87. package/dist/retrieval/semantic-handlers.js.map +1 -1
  88. package/dist/search/semantic.d.ts +2 -0
  89. package/dist/search/semantic.d.ts.map +1 -1
  90. package/dist/search/semantic.js +41 -9
  91. package/dist/search/semantic.js.map +1 -1
  92. package/dist/server.d.ts.map +1 -1
  93. package/dist/server.js +54 -2
  94. package/dist/server.js.map +1 -1
  95. package/dist/storage/_shared.d.ts +21 -0
  96. package/dist/storage/_shared.d.ts.map +1 -1
  97. package/dist/storage/_shared.js +36 -0
  98. package/dist/storage/_shared.js.map +1 -1
  99. package/dist/storage/chunk-store.d.ts +14 -2
  100. package/dist/storage/chunk-store.d.ts.map +1 -1
  101. package/dist/storage/chunk-store.js +214 -34
  102. package/dist/storage/chunk-store.js.map +1 -1
  103. package/dist/storage/embedding-store.d.ts +0 -12
  104. package/dist/storage/embedding-store.d.ts.map +1 -1
  105. package/dist/storage/embedding-store.js +69 -9
  106. package/dist/storage/embedding-store.js.map +1 -1
  107. package/dist/storage/index-cache.d.ts +12 -0
  108. package/dist/storage/index-cache.d.ts.map +1 -0
  109. package/dist/storage/index-cache.js +89 -0
  110. package/dist/storage/index-cache.js.map +1 -0
  111. package/dist/storage/index-footprint.d.ts +12 -0
  112. package/dist/storage/index-footprint.d.ts.map +1 -0
  113. package/dist/storage/index-footprint.js +41 -0
  114. package/dist/storage/index-footprint.js.map +1 -0
  115. package/dist/storage/index-json-mutations.d.ts +11 -0
  116. package/dist/storage/index-json-mutations.d.ts.map +1 -0
  117. package/dist/storage/index-json-mutations.js +93 -0
  118. package/dist/storage/index-json-mutations.js.map +1 -0
  119. package/dist/storage/index-migration.d.ts +22 -0
  120. package/dist/storage/index-migration.d.ts.map +1 -0
  121. package/dist/storage/index-migration.js +80 -0
  122. package/dist/storage/index-migration.js.map +1 -0
  123. package/dist/storage/index-store.d.ts +26 -55
  124. package/dist/storage/index-store.d.ts.map +1 -1
  125. package/dist/storage/index-store.js +82 -350
  126. package/dist/storage/index-store.js.map +1 -1
  127. package/dist/storage/index-version.d.ts +39 -0
  128. package/dist/storage/index-version.d.ts.map +1 -0
  129. package/dist/storage/index-version.js +87 -0
  130. package/dist/storage/index-version.js.map +1 -0
  131. package/dist/storage/registry.d.ts +9 -1
  132. package/dist/storage/registry.d.ts.map +1 -1
  133. package/dist/storage/registry.js +233 -9
  134. package/dist/storage/registry.js.map +1 -1
  135. package/dist/storage/shared-embedding-cache.d.ts +23 -3
  136. package/dist/storage/shared-embedding-cache.d.ts.map +1 -1
  137. package/dist/storage/shared-embedding-cache.js +300 -45
  138. package/dist/storage/shared-embedding-cache.js.map +1 -1
  139. package/dist/storage/sqlite/accessors.d.ts +34 -0
  140. package/dist/storage/sqlite/accessors.d.ts.map +1 -0
  141. package/dist/storage/sqlite/accessors.js +178 -0
  142. package/dist/storage/sqlite/accessors.js.map +1 -0
  143. package/dist/storage/sqlite/connection.d.ts +43 -0
  144. package/dist/storage/sqlite/connection.d.ts.map +1 -0
  145. package/dist/storage/sqlite/connection.js +241 -0
  146. package/dist/storage/sqlite/connection.js.map +1 -0
  147. package/dist/storage/sqlite/errors.d.ts +38 -0
  148. package/dist/storage/sqlite/errors.d.ts.map +1 -0
  149. package/dist/storage/sqlite/errors.js +150 -0
  150. package/dist/storage/sqlite/errors.js.map +1 -0
  151. package/dist/storage/sqlite/index-io.d.ts +49 -0
  152. package/dist/storage/sqlite/index-io.d.ts.map +1 -0
  153. package/dist/storage/sqlite/index-io.js +268 -0
  154. package/dist/storage/sqlite/index-io.js.map +1 -0
  155. package/dist/storage/sqlite/meta.d.ts +41 -0
  156. package/dist/storage/sqlite/meta.d.ts.map +1 -0
  157. package/dist/storage/sqlite/meta.js +28 -0
  158. package/dist/storage/sqlite/meta.js.map +1 -0
  159. package/dist/storage/sqlite/rows.d.ts +64 -0
  160. package/dist/storage/sqlite/rows.d.ts.map +1 -0
  161. package/dist/storage/sqlite/rows.js +186 -0
  162. package/dist/storage/sqlite/rows.js.map +1 -0
  163. package/dist/storage/sqlite/runtime.d.ts +6 -0
  164. package/dist/storage/sqlite/runtime.d.ts.map +1 -0
  165. package/dist/storage/sqlite/runtime.js +31 -0
  166. package/dist/storage/sqlite/runtime.js.map +1 -0
  167. package/dist/storage/sqlite/schema.d.ts +34 -0
  168. package/dist/storage/sqlite/schema.d.ts.map +1 -0
  169. package/dist/storage/sqlite/schema.js +98 -0
  170. package/dist/storage/sqlite/schema.js.map +1 -0
  171. package/dist/storage/sqlite-index-store.d.ts +40 -80
  172. package/dist/storage/sqlite-index-store.d.ts.map +1 -1
  173. package/dist/storage/sqlite-index-store.js +32 -577
  174. package/dist/storage/sqlite-index-store.js.map +1 -1
  175. package/dist/storage/telemetry/config.d.ts.map +1 -1
  176. package/dist/storage/telemetry/config.js +15 -3
  177. package/dist/storage/telemetry/config.js.map +1 -1
  178. package/dist/storage/telemetry/payload.d.ts.map +1 -1
  179. package/dist/storage/telemetry/payload.js +4 -1
  180. package/dist/storage/telemetry/payload.js.map +1 -1
  181. package/dist/storage/telemetry/retro-aggregator.d.ts +48 -0
  182. package/dist/storage/telemetry/retro-aggregator.d.ts.map +1 -0
  183. package/dist/storage/telemetry/retro-aggregator.js +221 -0
  184. package/dist/storage/telemetry/retro-aggregator.js.map +1 -0
  185. package/dist/storage/telemetry/sanitizer.d.ts +46 -0
  186. package/dist/storage/telemetry/sanitizer.d.ts.map +1 -1
  187. package/dist/storage/telemetry/sanitizer.js +25 -0
  188. package/dist/storage/telemetry/sanitizer.js.map +1 -1
  189. package/dist/storage/telemetry/uploader.d.ts +3 -1
  190. package/dist/storage/telemetry/uploader.d.ts.map +1 -1
  191. package/dist/storage/telemetry/uploader.js +161 -18
  192. package/dist/storage/telemetry/uploader.js.map +1 -1
  193. package/dist/storage/workspace-resolver.js +1 -1
  194. package/dist/storage/workspace-resolver.js.map +1 -1
  195. package/dist/tools/cross-repo-contract-adapters.d.ts +39 -0
  196. package/dist/tools/cross-repo-contract-adapters.d.ts.map +1 -0
  197. package/dist/tools/cross-repo-contract-adapters.js +70 -0
  198. package/dist/tools/cross-repo-contract-adapters.js.map +1 -0
  199. package/dist/tools/cross-repo-contract-group.d.ts +17 -0
  200. package/dist/tools/cross-repo-contract-group.d.ts.map +1 -0
  201. package/dist/tools/cross-repo-contract-group.js +89 -0
  202. package/dist/tools/cross-repo-contract-group.js.map +1 -0
  203. package/dist/tools/cross-repo-contract-matcher.d.ts +24 -0
  204. package/dist/tools/cross-repo-contract-matcher.d.ts.map +1 -0
  205. package/dist/tools/cross-repo-contract-matcher.js +134 -0
  206. package/dist/tools/cross-repo-contract-matcher.js.map +1 -0
  207. package/dist/tools/cross-repo-contract-resolver.d.ts +9 -0
  208. package/dist/tools/cross-repo-contract-resolver.d.ts.map +1 -0
  209. package/dist/tools/cross-repo-contract-resolver.js +86 -0
  210. package/dist/tools/cross-repo-contract-resolver.js.map +1 -0
  211. package/dist/tools/cross-repo-contract-tools.d.ts +12 -135
  212. package/dist/tools/cross-repo-contract-tools.d.ts.map +1 -1
  213. package/dist/tools/cross-repo-contract-tools.js +8 -589
  214. package/dist/tools/cross-repo-contract-tools.js.map +1 -1
  215. package/dist/tools/cross-repo-contract-types.d.ts +30 -0
  216. package/dist/tools/cross-repo-contract-types.d.ts.map +1 -0
  217. package/dist/tools/cross-repo-contract-types.js +3 -0
  218. package/dist/tools/cross-repo-contract-types.js.map +1 -0
  219. package/dist/tools/cross-repo-outbound-calls.d.ts +28 -0
  220. package/dist/tools/cross-repo-outbound-calls.d.ts.map +1 -0
  221. package/dist/tools/cross-repo-outbound-calls.js +347 -0
  222. package/dist/tools/cross-repo-outbound-calls.js.map +1 -0
  223. package/dist/tools/cross-repo-outbound-lexer/call-detectors.d.ts.map +1 -1
  224. package/dist/tools/cross-repo-outbound-lexer/call-detectors.js +2 -0
  225. package/dist/tools/cross-repo-outbound-lexer/call-detectors.js.map +1 -1
  226. package/dist/tools/cross-repo-outbound-lexer/types.d.ts +2 -0
  227. package/dist/tools/cross-repo-outbound-lexer/types.d.ts.map +1 -1
  228. package/dist/tools/index-tools/file-indexer.js +3 -3
  229. package/dist/tools/index-tools/file-indexer.js.map +1 -1
  230. package/dist/tools/index-tools/folder-indexer.d.ts.map +1 -1
  231. package/dist/tools/index-tools/folder-indexer.js +51 -3
  232. package/dist/tools/index-tools/folder-indexer.js.map +1 -1
  233. package/dist/tools/index-tools/parse.d.ts +12 -3
  234. package/dist/tools/index-tools/parse.d.ts.map +1 -1
  235. package/dist/tools/index-tools/parse.js +33 -8
  236. package/dist/tools/index-tools/parse.js.map +1 -1
  237. package/dist/tools/index-tools/registry.d.ts +35 -0
  238. package/dist/tools/index-tools/registry.d.ts.map +1 -1
  239. package/dist/tools/index-tools/registry.js +167 -3
  240. package/dist/tools/index-tools/registry.js.map +1 -1
  241. package/dist/tools/index-tools/state.d.ts +31 -0
  242. package/dist/tools/index-tools/state.d.ts.map +1 -1
  243. package/dist/tools/index-tools/state.js +53 -0
  244. package/dist/tools/index-tools/state.js.map +1 -1
  245. package/dist/tools/index-tools/types.d.ts +9 -0
  246. package/dist/tools/index-tools/types.d.ts.map +1 -1
  247. package/dist/tools/index-tools/watcher.js +3 -3
  248. package/dist/tools/index-tools/watcher.js.map +1 -1
  249. package/dist/tools/index-tools/worktree-seed.d.ts +44 -0
  250. package/dist/tools/index-tools/worktree-seed.d.ts.map +1 -0
  251. package/dist/tools/index-tools/worktree-seed.js +302 -0
  252. package/dist/tools/index-tools/worktree-seed.js.map +1 -0
  253. package/dist/tools/index-tools.d.ts +2 -2
  254. package/dist/tools/index-tools.d.ts.map +1 -1
  255. package/dist/tools/index-tools.js +5 -3
  256. package/dist/tools/index-tools.js.map +1 -1
  257. package/dist/tools/nest-ext-tools/graphql.d.ts +17 -0
  258. package/dist/tools/nest-ext-tools/graphql.d.ts.map +1 -0
  259. package/dist/tools/nest-ext-tools/graphql.js +54 -0
  260. package/dist/tools/nest-ext-tools/graphql.js.map +1 -0
  261. package/dist/tools/nest-ext-tools/microservice.d.ts +17 -0
  262. package/dist/tools/nest-ext-tools/microservice.d.ts.map +1 -0
  263. package/dist/tools/nest-ext-tools/microservice.js +51 -0
  264. package/dist/tools/nest-ext-tools/microservice.js.map +1 -0
  265. package/dist/tools/nest-ext-tools/openapi.d.ts +81 -0
  266. package/dist/tools/nest-ext-tools/openapi.d.ts.map +1 -0
  267. package/dist/tools/nest-ext-tools/openapi.js +254 -0
  268. package/dist/tools/nest-ext-tools/openapi.js.map +1 -0
  269. package/dist/tools/nest-ext-tools/queue.d.ts +27 -0
  270. package/dist/tools/nest-ext-tools/queue.d.ts.map +1 -0
  271. package/dist/tools/nest-ext-tools/queue.js +95 -0
  272. package/dist/tools/nest-ext-tools/queue.js.map +1 -0
  273. package/dist/tools/nest-ext-tools/schedule.d.ts +19 -0
  274. package/dist/tools/nest-ext-tools/schedule.d.ts.map +1 -0
  275. package/dist/tools/nest-ext-tools/schedule.js +89 -0
  276. package/dist/tools/nest-ext-tools/schedule.js.map +1 -0
  277. package/dist/tools/nest-ext-tools/scope.d.ts +19 -0
  278. package/dist/tools/nest-ext-tools/scope.d.ts.map +1 -0
  279. package/dist/tools/nest-ext-tools/scope.js +151 -0
  280. package/dist/tools/nest-ext-tools/scope.js.map +1 -0
  281. package/dist/tools/nest-ext-tools/shared.d.ts +33 -0
  282. package/dist/tools/nest-ext-tools/shared.d.ts.map +1 -0
  283. package/dist/tools/nest-ext-tools/shared.js +279 -0
  284. package/dist/tools/nest-ext-tools/shared.js.map +1 -0
  285. package/dist/tools/nest-ext-tools/typeorm.d.ts +22 -0
  286. package/dist/tools/nest-ext-tools/typeorm.d.ts.map +1 -0
  287. package/dist/tools/nest-ext-tools/typeorm.js +59 -0
  288. package/dist/tools/nest-ext-tools/typeorm.js.map +1 -0
  289. package/dist/tools/nest-ext-tools/websocket.d.ts +21 -0
  290. package/dist/tools/nest-ext-tools/websocket.d.ts.map +1 -0
  291. package/dist/tools/nest-ext-tools/websocket.js +70 -0
  292. package/dist/tools/nest-ext-tools/websocket.js.map +1 -0
  293. package/dist/tools/nest-ext-tools.d.ts +10 -204
  294. package/dist/tools/nest-ext-tools.d.ts.map +1 -1
  295. package/dist/tools/nest-ext-tools.js +10 -749
  296. package/dist/tools/nest-ext-tools.js.map +1 -1
  297. package/dist/tools/perf-tools.js +2 -2
  298. package/dist/tools/plan-turn/stale-index.d.ts +32 -0
  299. package/dist/tools/plan-turn/stale-index.d.ts.map +1 -1
  300. package/dist/tools/plan-turn/stale-index.js +42 -5
  301. package/dist/tools/plan-turn/stale-index.js.map +1 -1
  302. package/dist/tools/python-audit/checks/dead-code.d.ts +1 -1
  303. package/dist/tools/python-audit/checks/dead-code.d.ts.map +1 -1
  304. package/dist/tools/python-constants/constant-match.d.ts +5 -0
  305. package/dist/tools/python-constants/constant-match.d.ts.map +1 -0
  306. package/dist/tools/python-constants/constant-match.js +24 -0
  307. package/dist/tools/python-constants/constant-match.js.map +1 -0
  308. package/dist/tools/python-constants/file-context.d.ts +5 -0
  309. package/dist/tools/python-constants/file-context.d.ts.map +1 -0
  310. package/dist/tools/python-constants/file-context.js +91 -0
  311. package/dist/tools/python-constants/file-context.js.map +1 -0
  312. package/dist/tools/python-constants/function-defaults.d.ts +5 -0
  313. package/dist/tools/python-constants/function-defaults.d.ts.map +1 -0
  314. package/dist/tools/python-constants/function-defaults.js +98 -0
  315. package/dist/tools/python-constants/function-defaults.js.map +1 -0
  316. package/dist/tools/python-constants/model.d.ts +78 -0
  317. package/dist/tools/python-constants/model.d.ts.map +1 -0
  318. package/dist/tools/python-constants/model.js +2 -0
  319. package/dist/tools/python-constants/model.js.map +1 -0
  320. package/dist/tools/python-constants/syntax.d.ts +22 -0
  321. package/dist/tools/python-constants/syntax.d.ts.map +1 -0
  322. package/dist/tools/python-constants/syntax.js +93 -0
  323. package/dist/tools/python-constants/syntax.js.map +1 -0
  324. package/dist/tools/python-constants/value-resolver.d.ts +6 -0
  325. package/dist/tools/python-constants/value-resolver.d.ts.map +1 -0
  326. package/dist/tools/python-constants/value-resolver.js +320 -0
  327. package/dist/tools/python-constants/value-resolver.js.map +1 -0
  328. package/dist/tools/python-constants-tools.d.ts +3 -45
  329. package/dist/tools/python-constants-tools.d.ts.map +1 -1
  330. package/dist/tools/python-constants-tools.js +2 -505
  331. package/dist/tools/python-constants-tools.js.map +1 -1
  332. package/dist/tools/route-tools/django.d.ts +8 -0
  333. package/dist/tools/route-tools/django.d.ts.map +1 -0
  334. package/dist/tools/route-tools/django.js +52 -0
  335. package/dist/tools/route-tools/django.js.map +1 -0
  336. package/dist/tools/route-tools/express.d.ts +5 -0
  337. package/dist/tools/route-tools/express.d.ts.map +1 -0
  338. package/dist/tools/route-tools/express.js +33 -0
  339. package/dist/tools/route-tools/express.js.map +1 -0
  340. package/dist/tools/route-tools/file-sources.d.ts +7 -0
  341. package/dist/tools/route-tools/file-sources.d.ts.map +1 -0
  342. package/dist/tools/route-tools/file-sources.js +15 -0
  343. package/dist/tools/route-tools/file-sources.js.map +1 -0
  344. package/dist/tools/route-tools/handler-discovery.d.ts +4 -0
  345. package/dist/tools/route-tools/handler-discovery.d.ts.map +1 -0
  346. package/dist/tools/route-tools/handler-discovery.js +38 -0
  347. package/dist/tools/route-tools/handler-discovery.js.map +1 -0
  348. package/dist/tools/route-tools/hono.d.ts +5 -0
  349. package/dist/tools/route-tools/hono.d.ts.map +1 -0
  350. package/dist/tools/route-tools/hono.js +61 -0
  351. package/dist/tools/route-tools/hono.js.map +1 -0
  352. package/dist/tools/route-tools/ktor.d.ts +5 -0
  353. package/dist/tools/route-tools/ktor.d.ts.map +1 -0
  354. package/dist/tools/route-tools/ktor.js +76 -0
  355. package/dist/tools/route-tools/ktor.js.map +1 -0
  356. package/dist/tools/route-tools/laravel.d.ts +5 -0
  357. package/dist/tools/route-tools/laravel.d.ts.map +1 -0
  358. package/dist/tools/route-tools/laravel.js +45 -0
  359. package/dist/tools/route-tools/laravel.js.map +1 -0
  360. package/dist/tools/route-tools/mermaid-call-chain.d.ts +3 -0
  361. package/dist/tools/route-tools/mermaid-call-chain.d.ts.map +1 -0
  362. package/dist/tools/route-tools/mermaid-call-chain.js +50 -0
  363. package/dist/tools/route-tools/mermaid-call-chain.js.map +1 -0
  364. package/dist/tools/route-tools/nest.d.ts +5 -0
  365. package/dist/tools/route-tools/nest.d.ts.map +1 -0
  366. package/dist/tools/route-tools/nest.js +75 -0
  367. package/dist/tools/route-tools/nest.js.map +1 -0
  368. package/dist/tools/route-tools/next-trace.d.ts +4 -0
  369. package/dist/tools/route-tools/next-trace.d.ts.map +1 -0
  370. package/dist/tools/route-tools/next-trace.js +48 -0
  371. package/dist/tools/route-tools/next-trace.js.map +1 -0
  372. package/dist/tools/route-tools/next.d.ts +7 -0
  373. package/dist/tools/route-tools/next.d.ts.map +1 -0
  374. package/dist/tools/route-tools/next.js +77 -0
  375. package/dist/tools/route-tools/next.js.map +1 -0
  376. package/dist/tools/route-tools/python-decorators.d.ts +7 -0
  377. package/dist/tools/route-tools/python-decorators.d.ts.map +1 -0
  378. package/dist/tools/route-tools/python-decorators.js +53 -0
  379. package/dist/tools/route-tools/python-decorators.js.map +1 -0
  380. package/dist/tools/route-tools/route-mermaid.d.ts +4 -0
  381. package/dist/tools/route-tools/route-mermaid.d.ts.map +1 -0
  382. package/dist/tools/route-tools/route-mermaid.js +53 -0
  383. package/dist/tools/route-tools/route-mermaid.js.map +1 -0
  384. package/dist/tools/route-tools/spring-kotlin.d.ts +5 -0
  385. package/dist/tools/route-tools/spring-kotlin.d.ts.map +1 -0
  386. package/dist/tools/route-tools/spring-kotlin.js +52 -0
  387. package/dist/tools/route-tools/spring-kotlin.js.map +1 -0
  388. package/dist/tools/route-tools/trace-analysis.d.ts +4 -0
  389. package/dist/tools/route-tools/trace-analysis.d.ts.map +1 -0
  390. package/dist/tools/route-tools/trace-analysis.js +37 -0
  391. package/dist/tools/route-tools/trace-analysis.js.map +1 -0
  392. package/dist/tools/route-tools/trace-route.d.ts +6 -0
  393. package/dist/tools/route-tools/trace-route.d.ts.map +1 -0
  394. package/dist/tools/route-tools/trace-route.js +53 -0
  395. package/dist/tools/route-tools/trace-route.js.map +1 -0
  396. package/dist/tools/route-tools/types.d.ts +35 -0
  397. package/dist/tools/route-tools/types.d.ts.map +1 -0
  398. package/dist/tools/route-tools/types.js +2 -0
  399. package/dist/tools/route-tools/types.js.map +1 -0
  400. package/dist/tools/route-tools/yii2.d.ts +5 -0
  401. package/dist/tools/route-tools/yii2.d.ts.map +1 -0
  402. package/dist/tools/route-tools/yii2.js +73 -0
  403. package/dist/tools/route-tools/yii2.js.map +1 -0
  404. package/dist/tools/route-tools.d.ts +7 -49
  405. package/dist/tools/route-tools.d.ts.map +1 -1
  406. package/dist/tools/route-tools.js +5 -978
  407. package/dist/tools/route-tools.js.map +1 -1
  408. package/dist/tools/search-tools/types.d.ts +20 -0
  409. package/dist/tools/search-tools/types.d.ts.map +1 -1
  410. package/dist/tools/search-tools/zero-hit.d.ts.map +1 -1
  411. package/dist/tools/search-tools/zero-hit.js +0 -0
  412. package/dist/tools/search-tools/zero-hit.js.map +1 -1
  413. package/dist/tools/status-tools.d.ts +10 -0
  414. package/dist/tools/status-tools.d.ts.map +1 -1
  415. package/dist/tools/status-tools.js +14 -4
  416. package/dist/tools/status-tools.js.map +1 -1
  417. package/dist/tools/symbol-analysis-tools.d.ts +81 -0
  418. package/dist/tools/symbol-analysis-tools.d.ts.map +1 -0
  419. package/dist/tools/symbol-analysis-tools.js +327 -0
  420. package/dist/tools/symbol-analysis-tools.js.map +1 -0
  421. package/dist/tools/symbol-context-tools.d.ts +68 -0
  422. package/dist/tools/symbol-context-tools.d.ts.map +1 -0
  423. package/dist/tools/symbol-context-tools.js +232 -0
  424. package/dist/tools/symbol-context-tools.js.map +1 -0
  425. package/dist/tools/symbol-lookup-tools.d.ts +77 -0
  426. package/dist/tools/symbol-lookup-tools.d.ts.map +1 -0
  427. package/dist/tools/symbol-lookup-tools.js +305 -0
  428. package/dist/tools/symbol-lookup-tools.js.map +1 -0
  429. package/dist/tools/symbol-reference-tools.d.ts +38 -0
  430. package/dist/tools/symbol-reference-tools.d.ts.map +1 -0
  431. package/dist/tools/symbol-reference-tools.js +253 -0
  432. package/dist/tools/symbol-reference-tools.js.map +1 -0
  433. package/dist/tools/symbol-tool-internals.d.ts +9 -0
  434. package/dist/tools/symbol-tool-internals.d.ts.map +1 -0
  435. package/dist/tools/symbol-tool-internals.js +47 -0
  436. package/dist/tools/symbol-tool-internals.js.map +1 -0
  437. package/dist/tools/symbol-tools.d.ts +11 -176
  438. package/dist/tools/symbol-tools.d.ts.map +1 -1
  439. package/dist/tools/symbol-tools.js +7 -975
  440. package/dist/tools/symbol-tools.js.map +1 -1
  441. package/dist/tools/taint/python-context.d.ts +10 -0
  442. package/dist/tools/taint/python-context.d.ts.map +1 -0
  443. package/dist/tools/taint/python-context.js +150 -0
  444. package/dist/tools/taint/python-context.js.map +1 -0
  445. package/dist/tools/taint/taint-analyzer.d.ts +2 -0
  446. package/dist/tools/taint/taint-analyzer.d.ts.map +1 -0
  447. package/dist/tools/taint/taint-analyzer.js +2 -0
  448. package/dist/tools/taint/taint-analyzer.js.map +1 -0
  449. package/dist/tools/taint/taint-expression.d.ts +18 -0
  450. package/dist/tools/taint/taint-expression.d.ts.map +1 -0
  451. package/dist/tools/taint/taint-expression.js +265 -0
  452. package/dist/tools/taint/taint-expression.js.map +1 -0
  453. package/dist/tools/taint/taint-flow.d.ts +10 -0
  454. package/dist/tools/taint/taint-flow.d.ts.map +1 -0
  455. package/dist/tools/taint/taint-flow.js +178 -0
  456. package/dist/tools/taint/taint-flow.js.map +1 -0
  457. package/dist/tools/taint/taint-model.d.ts +113 -0
  458. package/dist/tools/taint/taint-model.d.ts.map +1 -0
  459. package/dist/tools/taint/taint-model.js +277 -0
  460. package/dist/tools/taint/taint-model.js.map +1 -0
  461. package/dist/tools/taint-tools.d.ts +2 -34
  462. package/dist/tools/taint-tools.d.ts.map +1 -1
  463. package/dist/tools/taint-tools.js +2 -852
  464. package/dist/tools/taint-tools.js.map +1 -1
  465. package/dist/tools/typescript-constants/file-context.d.ts +7 -0
  466. package/dist/tools/typescript-constants/file-context.d.ts.map +1 -0
  467. package/dist/tools/typescript-constants/file-context.js +219 -0
  468. package/dist/tools/typescript-constants/file-context.js.map +1 -0
  469. package/dist/tools/typescript-constants/symbol-resolver.d.ts +7 -0
  470. package/dist/tools/typescript-constants/symbol-resolver.d.ts.map +1 -0
  471. package/dist/tools/typescript-constants/symbol-resolver.js +165 -0
  472. package/dist/tools/typescript-constants/symbol-resolver.js.map +1 -0
  473. package/dist/tools/typescript-constants/types.d.ts +44 -0
  474. package/dist/tools/typescript-constants/types.d.ts.map +1 -0
  475. package/dist/tools/typescript-constants/types.js +2 -0
  476. package/dist/tools/typescript-constants/types.js.map +1 -0
  477. package/dist/tools/typescript-constants/value-evaluator.d.ts +8 -0
  478. package/dist/tools/typescript-constants/value-evaluator.d.ts.map +1 -0
  479. package/dist/tools/typescript-constants/value-evaluator.js +404 -0
  480. package/dist/tools/typescript-constants/value-evaluator.js.map +1 -0
  481. package/dist/tools/typescript-constants-tools.d.ts.map +1 -1
  482. package/dist/tools/typescript-constants-tools.js +19 -709
  483. package/dist/tools/typescript-constants-tools.js.map +1 -1
  484. package/dist/types.d.ts +6 -0
  485. package/dist/types.d.ts.map +1 -1
  486. package/dist/utils/git-head.d.ts +12 -0
  487. package/dist/utils/git-head.d.ts.map +1 -1
  488. package/dist/utils/git-head.js +25 -0
  489. package/dist/utils/git-head.js.map +1 -1
  490. package/dist/utils/import-graph/collect.d.ts +5 -0
  491. package/dist/utils/import-graph/collect.d.ts.map +1 -0
  492. package/dist/utils/import-graph/collect.js +47 -0
  493. package/dist/utils/import-graph/collect.js.map +1 -0
  494. package/dist/utils/import-graph/edge-accumulator.d.ts +7 -0
  495. package/dist/utils/import-graph/edge-accumulator.d.ts.map +1 -0
  496. package/dist/utils/import-graph/edge-accumulator.js +47 -0
  497. package/dist/utils/import-graph/edge-accumulator.js.map +1 -0
  498. package/dist/utils/import-graph/language-imports.d.ts +6 -0
  499. package/dist/utils/import-graph/language-imports.d.ts.map +1 -0
  500. package/dist/utils/import-graph/language-imports.js +84 -0
  501. package/dist/utils/import-graph/language-imports.js.map +1 -0
  502. package/dist/utils/import-graph/metrics.d.ts +6 -0
  503. package/dist/utils/import-graph/metrics.d.ts.map +1 -0
  504. package/dist/utils/import-graph/metrics.js +51 -0
  505. package/dist/utils/import-graph/metrics.js.map +1 -0
  506. package/dist/utils/import-graph/path-map.d.ts +7 -0
  507. package/dist/utils/import-graph/path-map.d.ts.map +1 -0
  508. package/dist/utils/import-graph/path-map.js +56 -0
  509. package/dist/utils/import-graph/path-map.js.map +1 -0
  510. package/dist/utils/import-graph/python-php-edge-collectors.d.ts +5 -0
  511. package/dist/utils/import-graph/python-php-edge-collectors.d.ts.map +1 -0
  512. package/dist/utils/import-graph/python-php-edge-collectors.js +56 -0
  513. package/dist/utils/import-graph/python-php-edge-collectors.js.map +1 -0
  514. package/dist/utils/import-graph/source-edge-collector.d.ts +13 -0
  515. package/dist/utils/import-graph/source-edge-collector.d.ts.map +1 -0
  516. package/dist/utils/import-graph/source-edge-collector.js +42 -0
  517. package/dist/utils/import-graph/source-edge-collector.js.map +1 -0
  518. package/dist/utils/import-graph/source-imports.d.ts +5 -0
  519. package/dist/utils/import-graph/source-imports.d.ts.map +1 -0
  520. package/dist/utils/import-graph/source-imports.js +33 -0
  521. package/dist/utils/import-graph/source-imports.js.map +1 -0
  522. package/dist/utils/import-graph/types.d.ts +15 -0
  523. package/dist/utils/import-graph/types.d.ts.map +1 -0
  524. package/dist/utils/import-graph/types.js +2 -0
  525. package/dist/utils/import-graph/types.js.map +1 -0
  526. package/dist/utils/import-graph/typescript-edge-collector.d.ts +7 -0
  527. package/dist/utils/import-graph/typescript-edge-collector.d.ts.map +1 -0
  528. package/dist/utils/import-graph/typescript-edge-collector.js +58 -0
  529. package/dist/utils/import-graph/typescript-edge-collector.js.map +1 -0
  530. package/dist/utils/import-graph/workspace-alias.d.ts +7 -0
  531. package/dist/utils/import-graph/workspace-alias.d.ts.map +1 -0
  532. package/dist/utils/import-graph/workspace-alias.js +95 -0
  533. package/dist/utils/import-graph/workspace-alias.js.map +1 -0
  534. package/dist/utils/import-graph/workspace-entry.d.ts +3 -0
  535. package/dist/utils/import-graph/workspace-entry.d.ts.map +1 -0
  536. package/dist/utils/import-graph/workspace-entry.js +81 -0
  537. package/dist/utils/import-graph/workspace-entry.js.map +1 -0
  538. package/dist/utils/import-graph.d.ts +10 -94
  539. package/dist/utils/import-graph.d.ts.map +1 -1
  540. package/dist/utils/import-graph.js +6 -702
  541. package/dist/utils/import-graph.js.map +1 -1
  542. package/package.json +6 -4
  543. package/rules/codesift.md +11 -2
  544. package/rules/codesift.mdc +11 -2
  545. package/rules/codex.md +11 -2
  546. package/rules/gemini.md +11 -2
@@ -0,0 +1,89 @@
1
+ import { indexCacheMemBudgetBytes } from "../config.js";
2
+ import { indexFootprintBytes } from "./index-footprint.js";
3
+ /** Bounded by entry count, not bytes: a summary holds no symbols, so it cannot dominate the heap
4
+ * the way a materialised index can. */
5
+ const MAX_CACHED_SUMMARIES = 16;
6
+ const summaryCache = new Map();
7
+ function copySummary(summary) {
8
+ const out = { ...summary, files: [...summary.files] };
9
+ if (summary.workspaces !== undefined)
10
+ out.workspaces = [...summary.workspaces];
11
+ return out;
12
+ }
13
+ export function resetSummaryCacheForTesting() {
14
+ summaryCache.clear();
15
+ }
16
+ export function getCachedSummary(dbPath, dataVersion) {
17
+ const cached = summaryCache.get(dbPath);
18
+ if (!cached || cached.dataVersion !== dataVersion)
19
+ return null;
20
+ summaryCache.delete(dbPath);
21
+ summaryCache.set(dbPath, cached);
22
+ return copySummary(cached.summary);
23
+ }
24
+ export function cacheLoadedSummary(dbPath, summary, dataVersion) {
25
+ summaryCache.set(dbPath, { summary, dataVersion });
26
+ while (summaryCache.size > MAX_CACHED_SUMMARIES) {
27
+ const oldest = summaryCache.keys().next();
28
+ if (oldest.done)
29
+ break;
30
+ summaryCache.delete(oldest.value);
31
+ }
32
+ return copySummary(summary);
33
+ }
34
+ // `|| 3` would be wrong here: an operator setting 0 to minimise memory would get 3, because
35
+ // 0 is falsy. Only a non-numeric value should fall back.
36
+ const MAX_CACHED_INDEXES = (() => {
37
+ const raw = process.env["CODESIFT_MAX_CACHED_INDEXES"];
38
+ const parsed = raw === undefined ? 3 : Number(raw);
39
+ return Math.max(1, Number.isNaN(parsed) ? 3 : parsed);
40
+ })();
41
+ const indexCache = new Map();
42
+ function cachedBytes() {
43
+ let total = 0;
44
+ for (const entry of indexCache.values())
45
+ total += indexFootprintBytes(entry.index);
46
+ return total;
47
+ }
48
+ function cacheIndex(dbPath, entry) {
49
+ indexCache.delete(dbPath);
50
+ indexCache.set(dbPath, entry);
51
+ const budget = indexCacheMemBudgetBytes();
52
+ let total = cachedBytes();
53
+ while (indexCache.size > 1 && (indexCache.size > MAX_CACHED_INDEXES || total > budget)) {
54
+ const oldest = indexCache.entries().next();
55
+ if (oldest.done)
56
+ break;
57
+ const [key, cachedEntry] = oldest.value;
58
+ total -= indexFootprintBytes(cachedEntry.index);
59
+ indexCache.delete(key);
60
+ }
61
+ }
62
+ function copyIndex(index) {
63
+ return { ...index, files: [...index.files], symbols: [...index.symbols] };
64
+ }
65
+ export function getCachedIndex(dbPath, dataVersion) {
66
+ const cached = indexCache.get(dbPath);
67
+ if (!cached || cached.dataVersion !== dataVersion)
68
+ return null;
69
+ cacheIndex(dbPath, cached);
70
+ return copyIndex(cached.index);
71
+ }
72
+ export function cacheLoadedIndex(dbPath, index, dataVersion) {
73
+ cacheIndex(dbPath, { index, dataVersion });
74
+ return copyIndex(index);
75
+ }
76
+ export function invalidateIndexCache(dbPath) {
77
+ indexCache.delete(dbPath);
78
+ summaryCache.delete(dbPath);
79
+ }
80
+ export function resetIndexCacheForTesting() {
81
+ indexCache.clear();
82
+ }
83
+ export function getIndexCacheSizeForTesting() {
84
+ return indexCache.size;
85
+ }
86
+ export function getIndexCacheBytesForTesting() {
87
+ return cachedBytes();
88
+ }
89
+ //# sourceMappingURL=index-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cache.js","sourceRoot":"","sources":["../../src/storage/index-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { CodeIndex } from "../types.js";
2
+ export declare function recordIndexFootprint(index: CodeIndex, bytes: number): void;
3
+ /**
4
+ * Measured footprint when the loader recorded one, otherwise the calibrated estimate.
5
+ *
6
+ * Deliberately returns a number in both cases instead of `undefined`: the caller is choosing what
7
+ * to evict, and "size unknown" there can only degrade into either treating a 400 MB index as free
8
+ * or refusing to cache it at all. An estimate within a small factor is enough for that decision,
9
+ * whereas the entry-counting it replaces was wrong by two orders of magnitude.
10
+ */
11
+ export declare function indexFootprintBytes(index: CodeIndex): number;
12
+ //# sourceMappingURL=index-footprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-footprint.d.ts","sourceRoot":"","sources":["../../src/storage/index-footprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAyB7C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE1E;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAM5D"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * How much heap a materialised index occupies, so the cache can budget bytes instead of entries.
3
+ *
4
+ * Kept beside the index rather than on it: `CodeIndex` is a wire/storage shape that gets
5
+ * serialised and copied, and a measurement of this process's heap is neither. A WeakMap also
6
+ * cannot keep an evicted index alive, which a field on the object could not promise.
7
+ */
8
+ const footprints = new WeakMap();
9
+ /**
10
+ * Per-symbol heap cost, measured rather than guessed: loading the real tgm-survey-platform index
11
+ * (240,137 symbols) moves `heapUsed` by 349 MB under `--expose-gc`, i.e. ~1,454 B/symbol
12
+ * including source text. Rounded up for the same reason as the loader's own constant — this is
13
+ * fitted to one index, and the residual error belongs on the evict-sooner side.
14
+ *
15
+ * Only ever a FALLBACK. The SQLite loader tallies the actual bytes as it walks the rows, which
16
+ * costs one addition each and needs no constant; this covers indexes that arrived some other way
17
+ * (the JSON backend, a hand-built index in a test) where re-walking to measure would cost more
18
+ * than the eviction decision is worth.
19
+ */
20
+ const ESTIMATED_BYTES_PER_SYMBOL = 1_600;
21
+ const ESTIMATED_BYTES_PER_FILE = 300;
22
+ export function recordIndexFootprint(index, bytes) {
23
+ footprints.set(index, bytes);
24
+ }
25
+ /**
26
+ * Measured footprint when the loader recorded one, otherwise the calibrated estimate.
27
+ *
28
+ * Deliberately returns a number in both cases instead of `undefined`: the caller is choosing what
29
+ * to evict, and "size unknown" there can only degrade into either treating a 400 MB index as free
30
+ * or refusing to cache it at all. An estimate within a small factor is enough for that decision,
31
+ * whereas the entry-counting it replaces was wrong by two orders of magnitude.
32
+ */
33
+ export function indexFootprintBytes(index) {
34
+ const measured = footprints.get(index);
35
+ if (measured !== undefined)
36
+ return measured;
37
+ const symbols = index.symbol_count || index.symbols.length;
38
+ const files = index.file_count || index.files.length;
39
+ return symbols * ESTIMATED_BYTES_PER_SYMBOL + files * ESTIMATED_BYTES_PER_FILE;
40
+ }
41
+ //# sourceMappingURL=index-footprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-footprint.js","sourceRoot":"","sources":["../../src/storage/index-footprint.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,GAAG,IAAI,OAAO,EAAqB,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,MAAM,0BAA0B,GAAG,KAAK,CAAC;AACzC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAErC,MAAM,UAAU,oBAAoB,CAAC,KAAgB,EAAE,KAAa;IAClE,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAgB;IAClD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;IACrD,OAAO,OAAO,GAAG,0BAA0B,GAAG,KAAK,GAAG,wBAAwB,CAAC;AACjF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { CodeIndex, CodeSymbol, FileEntry } from "../types.js";
2
+ type MutationIo = {
3
+ loadIndex: (indexPath: string) => Promise<CodeIndex | null>;
4
+ saveIndex: (indexPath: string, index: CodeIndex) => Promise<void>;
5
+ };
6
+ export declare function getIndexWriteCountForTesting(): number;
7
+ export declare function resetIndexWriteCountForTesting(): void;
8
+ export declare function saveIncrementalJson(indexPath: string, updatedFile: string, newSymbols: CodeSymbol[], fileEntry: FileEntry | undefined, io: MutationIo): Promise<void>;
9
+ export declare function removeFileFromJsonIndex(indexPath: string, deletedFile: string, io: MutationIo): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=index-json-mutations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-json-mutations.d.ts","sourceRoot":"","sources":["../../src/storage/index-json-mutations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEpE,KAAK,UAAU,GAAG;IAChB,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC5D,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE,CAAC;AAeF,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAED,wBAAgB,8BAA8B,IAAI,IAAI,CAErD;AA2DD,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,UAAU,EAAE,EACxB,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,EAAE,EAAE,UAAU,GACb,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,UAAU,GACb,OAAO,CAAC,IAAI,CAAC,CAiBf"}
@@ -0,0 +1,93 @@
1
+ const writeLocks = new Map();
2
+ const pendingMutations = new Map();
3
+ const scheduledFlushes = new Map();
4
+ let indexWriteCount = 0;
5
+ export function getIndexWriteCountForTesting() {
6
+ return indexWriteCount;
7
+ }
8
+ export function resetIndexWriteCountForTesting() {
9
+ indexWriteCount = 0;
10
+ }
11
+ /** Fold every queued mutation for one JSON index into a single load and save. */
12
+ async function flushIndexMutations(indexPath, io) {
13
+ const batch = pendingMutations.get(indexPath);
14
+ if (!batch || batch.length === 0)
15
+ return;
16
+ pendingMutations.delete(indexPath);
17
+ try {
18
+ const existing = await io.loadIndex(indexPath);
19
+ if (!existing) {
20
+ for (const mutation of batch) {
21
+ if (mutation.missing === "throw") {
22
+ mutation.reject(new Error(`Cannot incrementally update: index not found at ${indexPath}`));
23
+ }
24
+ else {
25
+ mutation.resolve();
26
+ }
27
+ }
28
+ return;
29
+ }
30
+ let changed = false;
31
+ for (const mutation of batch) {
32
+ if (mutation.apply(existing))
33
+ changed = true;
34
+ }
35
+ if (changed) {
36
+ existing.updated_at = Date.now();
37
+ indexWriteCount++;
38
+ await io.saveIndex(indexPath, existing);
39
+ }
40
+ for (const mutation of batch)
41
+ mutation.resolve();
42
+ }
43
+ catch (err) {
44
+ for (const mutation of batch)
45
+ mutation.reject(err);
46
+ }
47
+ }
48
+ function enqueueIndexMutation(indexPath, missing, apply, io) {
49
+ return new Promise((resolve, reject) => {
50
+ const queue = pendingMutations.get(indexPath);
51
+ if (queue)
52
+ queue.push({ apply, missing, resolve, reject });
53
+ else
54
+ pendingMutations.set(indexPath, [{ apply, missing, resolve, reject }]);
55
+ if (scheduledFlushes.has(indexPath))
56
+ return;
57
+ const previous = writeLocks.get(indexPath) ?? Promise.resolve();
58
+ const next = previous.then(() => {
59
+ scheduledFlushes.delete(indexPath);
60
+ return flushIndexMutations(indexPath, io);
61
+ });
62
+ scheduledFlushes.set(indexPath, next);
63
+ writeLocks.set(indexPath, next.catch(() => { }));
64
+ });
65
+ }
66
+ export function saveIncrementalJson(indexPath, updatedFile, newSymbols, fileEntry, io) {
67
+ return enqueueIndexMutation(indexPath, "throw", (existing) => {
68
+ const filtered = existing.symbols.filter((symbol) => symbol.file !== updatedFile);
69
+ const merged = [...filtered, ...newSymbols];
70
+ existing.symbols = merged;
71
+ existing.symbol_count = merged.length;
72
+ if (fileEntry) {
73
+ existing.files = existing.files.filter((file) => file.path !== updatedFile);
74
+ existing.files.push(fileEntry);
75
+ existing.file_count = existing.files.length;
76
+ }
77
+ return true;
78
+ }, io);
79
+ }
80
+ export function removeFileFromJsonIndex(indexPath, deletedFile, io) {
81
+ return enqueueIndexMutation(indexPath, "skip", (existing) => {
82
+ const hadSymbols = existing.symbols.some((symbol) => symbol.file === deletedFile);
83
+ const hadFile = existing.files.some((file) => file.path === deletedFile);
84
+ if (!hadSymbols && !hadFile)
85
+ return false;
86
+ existing.symbols = existing.symbols.filter((symbol) => symbol.file !== deletedFile);
87
+ existing.symbol_count = existing.symbols.length;
88
+ existing.files = existing.files.filter((file) => file.path !== deletedFile);
89
+ existing.file_count = existing.files.length;
90
+ return true;
91
+ }, io);
92
+ }
93
+ //# sourceMappingURL=index-json-mutations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-json-mutations.js","sourceRoot":"","sources":["../../src/storage/index-json-mutations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { CodeIndex } from "../types.js";
2
+ export type IndexBackend = "json" | "sqlite";
3
+ export declare function resolveIndexBackend(): Promise<IndexBackend>;
4
+ export declare function resetIndexBackendForTesting(): void;
5
+ /** Reject SQLite artifacts where callers must provide the canonical index path. */
6
+ export declare function assertCanonicalIndexPath(indexPath: string): void;
7
+ /**
8
+ * Keep both formats side by side so the JSON file remains a usable rollback artifact.
9
+ * Throws when given an already-derived SQLite file or sidecar: accepting one would silently
10
+ * derive a second, unrelated database path.
11
+ */
12
+ export declare function sqlitePathFor(indexPath: string): string;
13
+ type LegacyIndexLoader = (indexPath: string) => Promise<CodeIndex | null>;
14
+ /**
15
+ * Bring an existing JSON index across on first touch without deleting the rollback source.
16
+ * The legacy loader is injected by the facade so this module never imports `index-store.ts`
17
+ * and therefore cannot introduce a storage-module cycle.
18
+ */
19
+ export declare function ensureSqliteMigrated(indexPath: string, dbPath: string, loadLegacyIndex: LegacyIndexLoader): Promise<void>;
20
+ export declare function resetMigrationCacheForTesting(): void;
21
+ export {};
22
+ //# sourceMappingURL=index-migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-migration.d.ts","sourceRoot":"","sources":["../../src/storage/index-migration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAO7C,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;AAU7C,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,YAAY,CAAC,CAGjE;AAgBD,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAED,mFAAmF;AACnF,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAMhE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,KAAK,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;AAK1E;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,iBAAiB,GACjC,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD"}
@@ -0,0 +1,80 @@
1
+ import { importLegacyIndexIfEmpty, isSqliteAvailable, loadIndexSqlite, } from "./sqlite-index-store.js";
2
+ /**
3
+ * Which on-disk format to use.
4
+ *
5
+ * The result is cached because backend selection is process-wide. Explicit SQLite mode fails
6
+ * loudly when `node:sqlite` is unavailable; auto mode keeps Node 20 installations on JSON.
7
+ */
8
+ let backendPromise;
9
+ export async function resolveIndexBackend() {
10
+ backendPromise ??= computeIndexBackend();
11
+ return backendPromise;
12
+ }
13
+ async function computeIndexBackend() {
14
+ const explicit = process.env["CODESIFT_INDEX_BACKEND"];
15
+ if (explicit === "json")
16
+ return "json";
17
+ if (explicit === "sqlite") {
18
+ if (!(await isSqliteAvailable())) {
19
+ throw new Error("CODESIFT_INDEX_BACKEND=sqlite but node:sqlite is unavailable (requires Node >= 22.5)");
20
+ }
21
+ return "sqlite";
22
+ }
23
+ return (await isSqliteAvailable()) ? "sqlite" : "json";
24
+ }
25
+ export function resetIndexBackendForTesting() {
26
+ backendPromise = undefined;
27
+ }
28
+ /** Reject SQLite artifacts where callers must provide the canonical index path. */
29
+ export function assertCanonicalIndexPath(indexPath) {
30
+ if (/\.db(?:-(?:wal|shm|journal))?(?:\.json)?$/i.test(indexPath)) {
31
+ throw new TypeError(`Expected a canonical index path, received SQLite database path: ${indexPath}`);
32
+ }
33
+ }
34
+ /**
35
+ * Keep both formats side by side so the JSON file remains a usable rollback artifact.
36
+ * Throws when given an already-derived SQLite file or sidecar: accepting one would silently
37
+ * derive a second, unrelated database path.
38
+ */
39
+ export function sqlitePathFor(indexPath) {
40
+ assertCanonicalIndexPath(indexPath);
41
+ return indexPath.endsWith(".json")
42
+ ? `${indexPath.slice(0, -".json".length)}.db`
43
+ : `${indexPath}.db`;
44
+ }
45
+ /** Guards one-time JSON-to-SQLite migration per database path. */
46
+ const migrations = new Map();
47
+ /**
48
+ * Bring an existing JSON index across on first touch without deleting the rollback source.
49
+ * The legacy loader is injected by the facade so this module never imports `index-store.ts`
50
+ * and therefore cannot introduce a storage-module cycle.
51
+ */
52
+ export async function ensureSqliteMigrated(indexPath, dbPath, loadLegacyIndex) {
53
+ const inFlight = migrations.get(dbPath);
54
+ if (inFlight)
55
+ return inFlight;
56
+ const run = (async () => {
57
+ if ((await loadIndexSqlite(dbPath)) !== null)
58
+ return;
59
+ const legacy = await loadLegacyIndex(indexPath);
60
+ // The importer re-checks emptiness under its write lock, so racing processes cannot
61
+ // overwrite rows imported by the winner.
62
+ if (legacy)
63
+ await importLegacyIndexIfEmpty(dbPath, legacy);
64
+ })();
65
+ migrations.set(dbPath, run);
66
+ try {
67
+ await run;
68
+ }
69
+ catch (err) {
70
+ // Failed migrations are retried. Do not probe the failing database again here: a second
71
+ // error would replace the original one through JavaScript's try/finally semantics.
72
+ migrations.delete(dbPath);
73
+ throw err;
74
+ }
75
+ migrations.set(dbPath, Promise.resolve());
76
+ }
77
+ export function resetMigrationCacheForTesting() {
78
+ migrations.clear();
79
+ }
80
+ //# sourceMappingURL=index-migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-migration.js","sourceRoot":"","sources":["../../src/storage/index-migration.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,eAAe,GAChB,MAAM,yBAAyB,CAAC;AAIjC;;;;;GAKG;AACH,IAAI,cAAiD,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,cAAc,KAAK,mBAAmB,EAAE,CAAC;IACzC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACvD,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACvC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,MAAM,iBAAiB,EAAE,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,sFAAsF,CACvF,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,MAAM,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,cAAc,GAAG,SAAS,CAAC;AAC7B,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,wBAAwB,CAAC,SAAiB;IACxD,IAAI,4CAA4C,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,SAAS,CACjB,mEAAmE,SAAS,EAAE,CAC/E,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,wBAAwB,CAAC,SAAS,CAAC,CAAC;IACpC,OAAO,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;QAChC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QAC7C,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC;AACxB,CAAC;AAID,kEAAkE;AAClE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;AAEpD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAiB,EACjB,MAAc,EACd,eAAkC;IAElC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE;QACtB,IAAI,CAAC,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI;YAAE,OAAO;QACrD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;QAChD,oFAAoF;QACpF,yCAAyC;QACzC,IAAI,MAAM;YAAE,MAAM,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC,CAAC,EAAE,CAAC;IAEL,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,CAAC;IACZ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,wFAAwF;QACxF,mFAAmF;QACnF,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,6BAA6B;IAC3C,UAAU,CAAC,KAAK,EAAE,CAAC;AACrB,CAAC"}
@@ -1,16 +1,17 @@
1
1
  import type { CodeIndex, CodeSymbol, FileEntry } from "../types.js";
2
- export type IndexBackend = "json" | "sqlite";
3
- export declare function resolveIndexBackend(): Promise<IndexBackend>;
4
- export declare function resetIndexBackendForTesting(): void;
5
- /** `<hash>.index.json` -> `<hash>.index.db`, so both formats sit side by side and the JSON
6
- * stays available as the rollback artifact. */
7
- export declare function sqlitePathFor(indexPath: string): string;
8
- export declare function resetMigrationCacheForTesting(): void;
2
+ import { type IndexSummary } from "./sqlite-index-store.js";
3
+ import { type IndexOrStaleResult } from "./index-version.js";
4
+ export { getIndexCacheBytesForTesting, getIndexCacheSizeForTesting, resetIndexCacheForTesting, resetSummaryCacheForTesting, } from "./index-cache.js";
5
+ export { type IndexBackend, resetIndexBackendForTesting, resetMigrationCacheForTesting, resolveIndexBackend, sqlitePathFor, } from "./index-migration.js";
6
+ export { collectExtractorVersionMismatches, isExtractorVersionCurrent, type ExtractorVersionCheckable, type ExtractorVersionMismatchRow, type IndexOrStaleResult, } from "./index-version.js";
7
+ export { getIndexWriteCountForTesting, resetIndexWriteCountForTesting, } from "./index-json-mutations.js";
9
8
  /**
10
9
  * Save a code index atomically.
11
10
  * Writes to a temp file first, then renames to prevent partial reads.
12
11
  */
13
- export declare function saveIndex(indexPath: string, index: CodeIndex): Promise<void>;
12
+ export declare function saveIndex(indexPath: string, index: CodeIndex, opts?: {
13
+ sourceComplete?: boolean;
14
+ }): Promise<void>;
14
15
  /**
15
16
  * Load a code index from disk.
16
17
  * Returns null if file doesn't exist, is unreadable, or has invalid shape.
@@ -34,46 +35,29 @@ export declare function loadIndex(indexPath: string, currentVersions?: Record<st
34
35
  * The JSON backend keeps the old cost; there is no way to read one record out of a blob.
35
36
  */
36
37
  export declare function getFileEntry(indexPath: string, filePath: string): Promise<FileEntry | undefined>;
37
- export declare function resetIndexCacheForTesting(): void;
38
- export declare function getIndexCacheSizeForTesting(): number;
38
+ /**
39
+ * Read an index's files and metadata WITHOUT constructing its symbols (ADR-004 stage 2).
40
+ *
41
+ * On the SQLite backend this skips the object graph entirely. On JSON there is nothing to skip —
42
+ * the format forces a whole-document parse — so this is parity, not a speedup, and it exists so
43
+ * callers can be written once against the narrow shape rather than branching on the backend.
44
+ */
45
+ export declare function loadIndexSummary(indexPath: string): Promise<IndexSummary | null>;
46
+ /**
47
+ * Project a fully-loaded index onto the narrow shape, dropping the symbols array.
48
+ *
49
+ * `files` is COPIED, not aliased. This function's main caller projects an index held in the
50
+ * `codeIndexes` cache, so handing back the live array would let one caller's `sort`/`splice`
51
+ * rewrite what every later reader is given — the exact boundary `copyIndex` above exists to
52
+ * defend, reached by a different route. `workspaces` is copied for the same reason.
53
+ */
54
+ export declare function summariseIndex(index: CodeIndex): IndexSummary;
39
55
  export declare function resetStaleRollbackWarningForTesting(): void;
40
56
  /** Discriminated union returned by loadIndexOrStale: distinguishes a healthy
41
57
  * load from a version-mismatch stale-index case. Tools route through this
42
58
  * helper instead of calling loadIndex directly so stale indexes surface as
43
59
  * structured errors via staleToMcpError (src/tools/_helpers.ts) rather than
44
60
  * silent empty results. */
45
- export type IndexOrStaleResult = {
46
- status: "ok";
47
- index: CodeIndex;
48
- } | {
49
- /** The store exists but could not be read — locked, corrupt, unreadable. Distinct from a
50
- * null return, which means "nothing is indexed here". A caller that treats this as an
51
- * empty index reports a confident, wrong "no results". */
52
- status: "unreadable";
53
- reason: "storage_error";
54
- /** SQLITE_* / errno code, for operators and for deciding whether a retry is sane. */
55
- code: string;
56
- message: string;
57
- } | {
58
- status: "stale";
59
- reason: "extractor_version_mismatch";
60
- /** Language whose extractor version drifted (e.g., "typescript", "python"). */
61
- language: string;
62
- expected_version: string;
63
- actual_version: string;
64
- /** Present when multiple `currentVersions` keys drift at once — operators
65
- * should not assume fixing the primary `language` alone refreshes everything. */
66
- mismatch_detail?: string;
67
- };
68
- export type ExtractorVersionMismatchRow = {
69
- language: string;
70
- expected: string;
71
- actual: string;
72
- };
73
- /** All languages whose stored `extractor_version` entry does not match
74
- * `currentVersions`, applying the same tolerances as `loadIndexOrStale`
75
- * (newly added keys with no files in that language are skipped). */
76
- export declare function collectExtractorVersionMismatches(index: CodeIndex, currentVersions: Record<string, string>): ExtractorVersionMismatchRow[];
77
61
  /** Load an index with version-aware stale detection.
78
62
  *
79
63
  * Returns:
@@ -92,19 +76,6 @@ export declare function collectExtractorVersionMismatches(index: CodeIndex, curr
92
76
  * to `loadIndex(...)` returning null. Callers must still handle null (no
93
77
  * structured error) for those cases. */
94
78
  export declare function loadIndexOrStale(indexPath: string, currentVersions: Record<string, string>): Promise<IndexOrStaleResult | null>;
95
- /**
96
- * Check whether the stored `extractor_version` snapshot matches the current
97
- * set of extractor versions. Returns false when any language present in BOTH
98
- * `currentVersions` and `index.files` is missing from the stored snapshot or
99
- * has a different value. Languages added to `currentVersions` after this index
100
- * was written are tolerated when the index has no files in that language —
101
- * matches the tolerance applied by `collectExtractorVersionMismatches`. A missing
102
- * `extractor_version` field on a fully legacy index is still treated as a
103
- * version miss.
104
- */
105
- export declare function isExtractorVersionCurrent(index: CodeIndex, currentVersions: Record<string, string>): boolean;
106
- export declare function getIndexWriteCountForTesting(): number;
107
- export declare function resetIndexWriteCountForTesting(): void;
108
79
  /**
109
80
  * Incrementally update an index for a single changed file.
110
81
  * Removes old symbols for the file, adds new ones, and saves atomically.
@@ -1 +1 @@
1
- {"version":3,"file":"index-store.d.ts","sourceRoot":"","sources":["../../src/storage/index-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index-store.d.ts","sourceRoot":"","sources":["../../src/storage/index-store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,EAUL,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAcjC,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EACL,4BAA4B,EAC5B,2BAA2B,EAC3B,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,YAAY,EACjB,2BAA2B,EAC3B,6BAA6B,EAC7B,mBAAmB,EACnB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iCAAiC,EACjC,yBAAyB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,GAC/B,MAAM,2BAA2B,CAAC;AAMnC;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAClC,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACvC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAK3B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAShC;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAsBtF;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,YAAY,CAkB7D;AAuDD,wBAAgB,mCAAmC,IAAI,IAAI,CAE1D;AAwDD;;;;4BAI4B;AAC5B;;;;;;;;;;;;;;;;wCAgBwC;AACxC,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAEpC;AAID;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,UAAU,EAAE,EACxB,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOtE"}