distill-mcp 0.6.0-beta

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 (440) hide show
  1. package/bin/cli.js +133 -0
  2. package/dist/analytics/session-tracker.d.ts +74 -0
  3. package/dist/analytics/session-tracker.d.ts.map +1 -0
  4. package/dist/analytics/session-tracker.js +123 -0
  5. package/dist/ast/benchmark.test.d.ts +7 -0
  6. package/dist/ast/benchmark.test.d.ts.map +1 -0
  7. package/dist/ast/benchmark.test.js +175 -0
  8. package/dist/ast/go/index.d.ts +9 -0
  9. package/dist/ast/go/index.d.ts.map +1 -0
  10. package/dist/ast/go/index.js +8 -0
  11. package/dist/ast/go/parser.d.ts +31 -0
  12. package/dist/ast/go/parser.d.ts.map +1 -0
  13. package/dist/ast/go/parser.js +428 -0
  14. package/dist/ast/go/parser.test.d.ts +5 -0
  15. package/dist/ast/go/parser.test.d.ts.map +1 -0
  16. package/dist/ast/go/parser.test.js +241 -0
  17. package/dist/ast/go/queries.d.ts +51 -0
  18. package/dist/ast/go/queries.d.ts.map +1 -0
  19. package/dist/ast/go/queries.js +114 -0
  20. package/dist/ast/go/utils.d.ts +66 -0
  21. package/dist/ast/go/utils.d.ts.map +1 -0
  22. package/dist/ast/go/utils.js +140 -0
  23. package/dist/ast/index.d.ts +39 -0
  24. package/dist/ast/index.d.ts.map +1 -0
  25. package/dist/ast/index.js +245 -0
  26. package/dist/ast/php/index.d.ts +9 -0
  27. package/dist/ast/php/index.d.ts.map +1 -0
  28. package/dist/ast/php/index.js +8 -0
  29. package/dist/ast/php/parser.d.ts +31 -0
  30. package/dist/ast/php/parser.d.ts.map +1 -0
  31. package/dist/ast/php/parser.js +388 -0
  32. package/dist/ast/php/parser.test.d.ts +5 -0
  33. package/dist/ast/php/parser.test.d.ts.map +1 -0
  34. package/dist/ast/php/parser.test.js +328 -0
  35. package/dist/ast/php/queries.d.ts +61 -0
  36. package/dist/ast/php/queries.d.ts.map +1 -0
  37. package/dist/ast/php/queries.js +117 -0
  38. package/dist/ast/php/utils.d.ts +83 -0
  39. package/dist/ast/php/utils.d.ts.map +1 -0
  40. package/dist/ast/php/utils.js +246 -0
  41. package/dist/ast/python/index.d.ts +9 -0
  42. package/dist/ast/python/index.d.ts.map +1 -0
  43. package/dist/ast/python/index.js +8 -0
  44. package/dist/ast/python/parser.d.ts +32 -0
  45. package/dist/ast/python/parser.d.ts.map +1 -0
  46. package/dist/ast/python/parser.js +422 -0
  47. package/dist/ast/python/parser.test.d.ts +5 -0
  48. package/dist/ast/python/parser.test.d.ts.map +1 -0
  49. package/dist/ast/python/parser.test.js +186 -0
  50. package/dist/ast/python/queries.d.ts +73 -0
  51. package/dist/ast/python/queries.d.ts.map +1 -0
  52. package/dist/ast/python/queries.js +137 -0
  53. package/dist/ast/python/utils.d.ts +63 -0
  54. package/dist/ast/python/utils.d.ts.map +1 -0
  55. package/dist/ast/python/utils.js +159 -0
  56. package/dist/ast/quick-scan.d.ts +40 -0
  57. package/dist/ast/quick-scan.d.ts.map +1 -0
  58. package/dist/ast/quick-scan.js +287 -0
  59. package/dist/ast/rust/index.d.ts +9 -0
  60. package/dist/ast/rust/index.d.ts.map +1 -0
  61. package/dist/ast/rust/index.js +8 -0
  62. package/dist/ast/rust/parser.d.ts +31 -0
  63. package/dist/ast/rust/parser.d.ts.map +1 -0
  64. package/dist/ast/rust/parser.js +416 -0
  65. package/dist/ast/rust/parser.test.d.ts +5 -0
  66. package/dist/ast/rust/parser.test.d.ts.map +1 -0
  67. package/dist/ast/rust/parser.test.js +329 -0
  68. package/dist/ast/rust/queries.d.ts +66 -0
  69. package/dist/ast/rust/queries.d.ts.map +1 -0
  70. package/dist/ast/rust/queries.js +132 -0
  71. package/dist/ast/rust/utils.d.ts +91 -0
  72. package/dist/ast/rust/utils.d.ts.map +1 -0
  73. package/dist/ast/rust/utils.js +254 -0
  74. package/dist/ast/swift/index.d.ts +10 -0
  75. package/dist/ast/swift/index.d.ts.map +1 -0
  76. package/dist/ast/swift/index.js +8 -0
  77. package/dist/ast/swift/parser.d.ts +31 -0
  78. package/dist/ast/swift/parser.d.ts.map +1 -0
  79. package/dist/ast/swift/parser.js +554 -0
  80. package/dist/ast/swift/parser.test.d.ts +5 -0
  81. package/dist/ast/swift/parser.test.d.ts.map +1 -0
  82. package/dist/ast/swift/parser.test.js +398 -0
  83. package/dist/ast/swift/queries.d.ts +71 -0
  84. package/dist/ast/swift/queries.d.ts.map +1 -0
  85. package/dist/ast/swift/queries.js +137 -0
  86. package/dist/ast/swift/utils.d.ts +94 -0
  87. package/dist/ast/swift/utils.d.ts.map +1 -0
  88. package/dist/ast/swift/utils.js +411 -0
  89. package/dist/ast/types.d.ts +96 -0
  90. package/dist/ast/types.d.ts.map +1 -0
  91. package/dist/ast/types.js +21 -0
  92. package/dist/ast/typescript.d.ts +24 -0
  93. package/dist/ast/typescript.d.ts.map +1 -0
  94. package/dist/ast/typescript.js +357 -0
  95. package/dist/cache/file-hash.d.ts +33 -0
  96. package/dist/cache/file-hash.d.ts.map +1 -0
  97. package/dist/cache/file-hash.js +59 -0
  98. package/dist/cache/index.d.ts +9 -0
  99. package/dist/cache/index.d.ts.map +1 -0
  100. package/dist/cache/index.js +8 -0
  101. package/dist/cache/smart-cache.d.ts +68 -0
  102. package/dist/cache/smart-cache.d.ts.map +1 -0
  103. package/dist/cache/smart-cache.js +266 -0
  104. package/dist/cache/types.d.ts +102 -0
  105. package/dist/cache/types.d.ts.map +1 -0
  106. package/dist/cache/types.js +6 -0
  107. package/dist/cli/analyze.d.ts +43 -0
  108. package/dist/cli/analyze.d.ts.map +1 -0
  109. package/dist/cli/analyze.js +250 -0
  110. package/dist/cli/doctor.d.ts +2 -0
  111. package/dist/cli/doctor.d.ts.map +1 -0
  112. package/dist/cli/doctor.js +127 -0
  113. package/dist/cli/hooks.d.ts +14 -0
  114. package/dist/cli/hooks.d.ts.map +1 -0
  115. package/dist/cli/hooks.js +229 -0
  116. package/dist/cli/index.d.ts +5 -0
  117. package/dist/cli/index.d.ts.map +1 -0
  118. package/dist/cli/index.js +4 -0
  119. package/dist/cli/setup.d.ts +10 -0
  120. package/dist/cli/setup.d.ts.map +1 -0
  121. package/dist/cli/setup.js +117 -0
  122. package/dist/cli/utils.d.ts +30 -0
  123. package/dist/cli/utils.d.ts.map +1 -0
  124. package/dist/cli/utils.js +116 -0
  125. package/dist/compressors/config.d.ts +9 -0
  126. package/dist/compressors/config.d.ts.map +1 -0
  127. package/dist/compressors/config.js +183 -0
  128. package/dist/compressors/conversation.d.ts +109 -0
  129. package/dist/compressors/conversation.d.ts.map +1 -0
  130. package/dist/compressors/conversation.js +404 -0
  131. package/dist/compressors/diff.d.ts +35 -0
  132. package/dist/compressors/diff.d.ts.map +1 -0
  133. package/dist/compressors/diff.js +389 -0
  134. package/dist/compressors/generic.d.ts +9 -0
  135. package/dist/compressors/generic.d.ts.map +1 -0
  136. package/dist/compressors/generic.js +188 -0
  137. package/dist/compressors/index.d.ts +31 -0
  138. package/dist/compressors/index.d.ts.map +1 -0
  139. package/dist/compressors/index.js +82 -0
  140. package/dist/compressors/logs.d.ts +9 -0
  141. package/dist/compressors/logs.d.ts.map +1 -0
  142. package/dist/compressors/logs.js +245 -0
  143. package/dist/compressors/multifile.d.ts +106 -0
  144. package/dist/compressors/multifile.d.ts.map +1 -0
  145. package/dist/compressors/multifile.js +498 -0
  146. package/dist/compressors/semantic.d.ts +33 -0
  147. package/dist/compressors/semantic.d.ts.map +1 -0
  148. package/dist/compressors/semantic.js +233 -0
  149. package/dist/compressors/stacktrace.d.ts +9 -0
  150. package/dist/compressors/stacktrace.d.ts.map +1 -0
  151. package/dist/compressors/stacktrace.js +259 -0
  152. package/dist/compressors/types.d.ts +146 -0
  153. package/dist/compressors/types.d.ts.map +1 -0
  154. package/dist/compressors/types.js +6 -0
  155. package/dist/config/output-config.d.ts +56 -0
  156. package/dist/config/output-config.d.ts.map +1 -0
  157. package/dist/config/output-config.js +78 -0
  158. package/dist/index.d.ts +21 -0
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +27 -0
  161. package/dist/middleware/chain.d.ts +49 -0
  162. package/dist/middleware/chain.d.ts.map +1 -0
  163. package/dist/middleware/chain.js +126 -0
  164. package/dist/middleware/index.d.ts +4 -0
  165. package/dist/middleware/index.d.ts.map +1 -0
  166. package/dist/middleware/index.js +3 -0
  167. package/dist/middleware/logging.d.ts +8 -0
  168. package/dist/middleware/logging.d.ts.map +1 -0
  169. package/dist/middleware/logging.js +71 -0
  170. package/dist/middleware/types.d.ts +58 -0
  171. package/dist/middleware/types.d.ts.map +1 -0
  172. package/dist/middleware/types.js +7 -0
  173. package/dist/parsers/eslint.d.ts +8 -0
  174. package/dist/parsers/eslint.d.ts.map +1 -0
  175. package/dist/parsers/eslint.js +132 -0
  176. package/dist/parsers/generic.d.ts +8 -0
  177. package/dist/parsers/generic.d.ts.map +1 -0
  178. package/dist/parsers/generic.js +234 -0
  179. package/dist/parsers/index.d.ts +34 -0
  180. package/dist/parsers/index.d.ts.map +1 -0
  181. package/dist/parsers/index.js +216 -0
  182. package/dist/parsers/types.d.ts +84 -0
  183. package/dist/parsers/types.d.ts.map +1 -0
  184. package/dist/parsers/types.js +6 -0
  185. package/dist/parsers/typescript.d.ts +8 -0
  186. package/dist/parsers/typescript.d.ts.map +1 -0
  187. package/dist/parsers/typescript.js +107 -0
  188. package/dist/pipelines/definitions.d.ts +50 -0
  189. package/dist/pipelines/definitions.d.ts.map +1 -0
  190. package/dist/pipelines/definitions.js +206 -0
  191. package/dist/sandbox/executor.d.ts +12 -0
  192. package/dist/sandbox/executor.d.ts.map +1 -0
  193. package/dist/sandbox/executor.js +191 -0
  194. package/dist/sandbox/index.d.ts +11 -0
  195. package/dist/sandbox/index.d.ts.map +1 -0
  196. package/dist/sandbox/index.js +9 -0
  197. package/dist/sandbox/sandbox.test.d.ts +7 -0
  198. package/dist/sandbox/sandbox.test.d.ts.map +1 -0
  199. package/dist/sandbox/sandbox.test.js +202 -0
  200. package/dist/sandbox/sdk/analyze.d.ts +36 -0
  201. package/dist/sandbox/sdk/analyze.d.ts.map +1 -0
  202. package/dist/sandbox/sdk/analyze.js +413 -0
  203. package/dist/sandbox/sdk/analyze.test.d.ts +7 -0
  204. package/dist/sandbox/sdk/analyze.test.d.ts.map +1 -0
  205. package/dist/sandbox/sdk/analyze.test.js +191 -0
  206. package/dist/sandbox/sdk/code.d.ts +20 -0
  207. package/dist/sandbox/sdk/code.d.ts.map +1 -0
  208. package/dist/sandbox/sdk/code.js +104 -0
  209. package/dist/sandbox/sdk/compress.d.ts +23 -0
  210. package/dist/sandbox/sdk/compress.d.ts.map +1 -0
  211. package/dist/sandbox/sdk/compress.js +107 -0
  212. package/dist/sandbox/sdk/conversation.d.ts +148 -0
  213. package/dist/sandbox/sdk/conversation.d.ts.map +1 -0
  214. package/dist/sandbox/sdk/conversation.js +177 -0
  215. package/dist/sandbox/sdk/files.d.ts +29 -0
  216. package/dist/sandbox/sdk/files.d.ts.map +1 -0
  217. package/dist/sandbox/sdk/files.js +41 -0
  218. package/dist/sandbox/sdk/git.d.ts +37 -0
  219. package/dist/sandbox/sdk/git.d.ts.map +1 -0
  220. package/dist/sandbox/sdk/git.js +313 -0
  221. package/dist/sandbox/sdk/git.test.d.ts +8 -0
  222. package/dist/sandbox/sdk/git.test.d.ts.map +1 -0
  223. package/dist/sandbox/sdk/git.test.js +160 -0
  224. package/dist/sandbox/sdk/index.d.ts +16 -0
  225. package/dist/sandbox/sdk/index.d.ts.map +1 -0
  226. package/dist/sandbox/sdk/index.js +15 -0
  227. package/dist/sandbox/sdk/multifile.d.ts +63 -0
  228. package/dist/sandbox/sdk/multifile.d.ts.map +1 -0
  229. package/dist/sandbox/sdk/multifile.js +130 -0
  230. package/dist/sandbox/sdk/pipeline.d.ts +16 -0
  231. package/dist/sandbox/sdk/pipeline.d.ts.map +1 -0
  232. package/dist/sandbox/sdk/pipeline.js +454 -0
  233. package/dist/sandbox/sdk/pipeline.test.d.ts +7 -0
  234. package/dist/sandbox/sdk/pipeline.test.d.ts.map +1 -0
  235. package/dist/sandbox/sdk/pipeline.test.js +197 -0
  236. package/dist/sandbox/sdk/search.d.ts +36 -0
  237. package/dist/sandbox/sdk/search.d.ts.map +1 -0
  238. package/dist/sandbox/sdk/search.js +338 -0
  239. package/dist/sandbox/sdk/search.test.d.ts +7 -0
  240. package/dist/sandbox/sdk/search.test.d.ts.map +1 -0
  241. package/dist/sandbox/sdk/search.test.js +183 -0
  242. package/dist/sandbox/sdk/utils.d.ts +18 -0
  243. package/dist/sandbox/sdk/utils.d.ts.map +1 -0
  244. package/dist/sandbox/sdk/utils.js +24 -0
  245. package/dist/sandbox/security/code-analyzer.d.ts +15 -0
  246. package/dist/sandbox/security/code-analyzer.d.ts.map +1 -0
  247. package/dist/sandbox/security/code-analyzer.js +87 -0
  248. package/dist/sandbox/security/index.d.ts +6 -0
  249. package/dist/sandbox/security/index.d.ts.map +1 -0
  250. package/dist/sandbox/security/index.js +5 -0
  251. package/dist/sandbox/security/path-validator.d.ts +23 -0
  252. package/dist/sandbox/security/path-validator.d.ts.map +1 -0
  253. package/dist/sandbox/security/path-validator.js +113 -0
  254. package/dist/sandbox/types.d.ts +577 -0
  255. package/dist/sandbox/types.d.ts.map +1 -0
  256. package/dist/sandbox/types.js +14 -0
  257. package/dist/server.d.ts +36 -0
  258. package/dist/server.d.ts.map +1 -0
  259. package/dist/server.js +133 -0
  260. package/dist/summarizers/build-logs.d.ts +11 -0
  261. package/dist/summarizers/build-logs.d.ts.map +1 -0
  262. package/dist/summarizers/build-logs.js +234 -0
  263. package/dist/summarizers/generic.d.ts +11 -0
  264. package/dist/summarizers/generic.d.ts.map +1 -0
  265. package/dist/summarizers/generic.js +93 -0
  266. package/dist/summarizers/index.d.ts +20 -0
  267. package/dist/summarizers/index.d.ts.map +1 -0
  268. package/dist/summarizers/index.js +43 -0
  269. package/dist/summarizers/server-logs.d.ts +11 -0
  270. package/dist/summarizers/server-logs.d.ts.map +1 -0
  271. package/dist/summarizers/server-logs.js +215 -0
  272. package/dist/summarizers/test-logs.d.ts +11 -0
  273. package/dist/summarizers/test-logs.d.ts.map +1 -0
  274. package/dist/summarizers/test-logs.js +258 -0
  275. package/dist/summarizers/types.d.ts +146 -0
  276. package/dist/summarizers/types.d.ts.map +1 -0
  277. package/dist/summarizers/types.js +21 -0
  278. package/dist/tools/analyze-build-output.d.ts +30 -0
  279. package/dist/tools/analyze-build-output.d.ts.map +1 -0
  280. package/dist/tools/analyze-build-output.js +45 -0
  281. package/dist/tools/analyze-context.d.ts +23 -0
  282. package/dist/tools/analyze-context.d.ts.map +1 -0
  283. package/dist/tools/analyze-context.js +78 -0
  284. package/dist/tools/auto-optimize.d.ts +9 -0
  285. package/dist/tools/auto-optimize.d.ts.map +1 -0
  286. package/dist/tools/auto-optimize.js +191 -0
  287. package/dist/tools/code-execute.d.ts +9 -0
  288. package/dist/tools/code-execute.d.ts.map +1 -0
  289. package/dist/tools/code-execute.js +84 -0
  290. package/dist/tools/code-skeleton.d.ts +33 -0
  291. package/dist/tools/code-skeleton.d.ts.map +1 -0
  292. package/dist/tools/code-skeleton.js +206 -0
  293. package/dist/tools/compress-context.d.ts +33 -0
  294. package/dist/tools/compress-context.d.ts.map +1 -0
  295. package/dist/tools/compress-context.js +64 -0
  296. package/dist/tools/context-budget.d.ts +43 -0
  297. package/dist/tools/context-budget.d.ts.map +1 -0
  298. package/dist/tools/context-budget.js +260 -0
  299. package/dist/tools/context-budget.test.d.ts +5 -0
  300. package/dist/tools/context-budget.test.d.ts.map +1 -0
  301. package/dist/tools/context-budget.test.js +219 -0
  302. package/dist/tools/conversation-compress.d.ts +46 -0
  303. package/dist/tools/conversation-compress.d.ts.map +1 -0
  304. package/dist/tools/conversation-compress.js +78 -0
  305. package/dist/tools/conversation-memory.d.ts +75 -0
  306. package/dist/tools/conversation-memory.d.ts.map +1 -0
  307. package/dist/tools/conversation-memory.js +289 -0
  308. package/dist/tools/deduplicate-errors.d.ts +30 -0
  309. package/dist/tools/deduplicate-errors.d.ts.map +1 -0
  310. package/dist/tools/deduplicate-errors.js +72 -0
  311. package/dist/tools/detect-retry-loop.d.ts +40 -0
  312. package/dist/tools/detect-retry-loop.d.ts.map +1 -0
  313. package/dist/tools/detect-retry-loop.js +212 -0
  314. package/dist/tools/diff-compress.d.ts +40 -0
  315. package/dist/tools/diff-compress.d.ts.map +1 -0
  316. package/dist/tools/diff-compress.js +94 -0
  317. package/dist/tools/discover-tools.d.ts +11 -0
  318. package/dist/tools/discover-tools.d.ts.map +1 -0
  319. package/dist/tools/discover-tools.js +163 -0
  320. package/dist/tools/dynamic-loader.d.ts +131 -0
  321. package/dist/tools/dynamic-loader.d.ts.map +1 -0
  322. package/dist/tools/dynamic-loader.js +378 -0
  323. package/dist/tools/dynamic-loader.test.d.ts +10 -0
  324. package/dist/tools/dynamic-loader.test.d.ts.map +1 -0
  325. package/dist/tools/dynamic-loader.test.js +164 -0
  326. package/dist/tools/lazy-mcp.d.ts +31 -0
  327. package/dist/tools/lazy-mcp.d.ts.map +1 -0
  328. package/dist/tools/lazy-mcp.js +151 -0
  329. package/dist/tools/lazy-mcp.test.d.ts +10 -0
  330. package/dist/tools/lazy-mcp.test.d.ts.map +1 -0
  331. package/dist/tools/lazy-mcp.test.js +172 -0
  332. package/dist/tools/multifile-compress.d.ts +36 -0
  333. package/dist/tools/multifile-compress.d.ts.map +1 -0
  334. package/dist/tools/multifile-compress.js +223 -0
  335. package/dist/tools/optimization-tips.d.ts +18 -0
  336. package/dist/tools/optimization-tips.d.ts.map +1 -0
  337. package/dist/tools/optimization-tips.js +133 -0
  338. package/dist/tools/registry.d.ts +70 -0
  339. package/dist/tools/registry.d.ts.map +1 -0
  340. package/dist/tools/registry.js +169 -0
  341. package/dist/tools/semantic-compress.d.ts +39 -0
  342. package/dist/tools/semantic-compress.d.ts.map +1 -0
  343. package/dist/tools/semantic-compress.js +113 -0
  344. package/dist/tools/semantic-compress.test.d.ts +5 -0
  345. package/dist/tools/semantic-compress.test.d.ts.map +1 -0
  346. package/dist/tools/semantic-compress.test.js +182 -0
  347. package/dist/tools/session-stats.d.ts +34 -0
  348. package/dist/tools/session-stats.d.ts.map +1 -0
  349. package/dist/tools/session-stats.js +194 -0
  350. package/dist/tools/set-output-config.d.ts +38 -0
  351. package/dist/tools/set-output-config.d.ts.map +1 -0
  352. package/dist/tools/set-output-config.js +122 -0
  353. package/dist/tools/smart-cache-tool.d.ts +38 -0
  354. package/dist/tools/smart-cache-tool.d.ts.map +1 -0
  355. package/dist/tools/smart-cache-tool.js +224 -0
  356. package/dist/tools/smart-file-read.d.ts +52 -0
  357. package/dist/tools/smart-file-read.d.ts.map +1 -0
  358. package/dist/tools/smart-file-read.js +481 -0
  359. package/dist/tools/smart-pipeline.d.ts +40 -0
  360. package/dist/tools/smart-pipeline.d.ts.map +1 -0
  361. package/dist/tools/smart-pipeline.js +295 -0
  362. package/dist/tools/summarize-logs.d.ts +36 -0
  363. package/dist/tools/summarize-logs.d.ts.map +1 -0
  364. package/dist/tools/summarize-logs.js +184 -0
  365. package/dist/tools/token-budget.test.d.ts +11 -0
  366. package/dist/tools/token-budget.test.d.ts.map +1 -0
  367. package/dist/tools/token-budget.test.js +275 -0
  368. package/dist/utils/bm25.d.ts +86 -0
  369. package/dist/utils/bm25.d.ts.map +1 -0
  370. package/dist/utils/bm25.js +153 -0
  371. package/dist/utils/bm25.test.d.ts +5 -0
  372. package/dist/utils/bm25.test.d.ts.map +1 -0
  373. package/dist/utils/bm25.test.js +156 -0
  374. package/dist/utils/command-normalizer.d.ts +39 -0
  375. package/dist/utils/command-normalizer.d.ts.map +1 -0
  376. package/dist/utils/command-normalizer.js +90 -0
  377. package/dist/utils/content-detector.d.ts +27 -0
  378. package/dist/utils/content-detector.d.ts.map +1 -0
  379. package/dist/utils/content-detector.js +127 -0
  380. package/dist/utils/embeddings.d.ts +54 -0
  381. package/dist/utils/embeddings.d.ts.map +1 -0
  382. package/dist/utils/embeddings.js +97 -0
  383. package/dist/utils/embeddings.test.d.ts +8 -0
  384. package/dist/utils/embeddings.test.d.ts.map +1 -0
  385. package/dist/utils/embeddings.test.js +96 -0
  386. package/dist/utils/error-normalizer.d.ts +39 -0
  387. package/dist/utils/error-normalizer.d.ts.map +1 -0
  388. package/dist/utils/error-normalizer.js +233 -0
  389. package/dist/utils/hybrid-search.d.ts +79 -0
  390. package/dist/utils/hybrid-search.d.ts.map +1 -0
  391. package/dist/utils/hybrid-search.js +146 -0
  392. package/dist/utils/hybrid-search.test.d.ts +5 -0
  393. package/dist/utils/hybrid-search.test.d.ts.map +1 -0
  394. package/dist/utils/hybrid-search.test.js +172 -0
  395. package/dist/utils/index.d.ts +13 -0
  396. package/dist/utils/index.d.ts.map +1 -0
  397. package/dist/utils/index.js +12 -0
  398. package/dist/utils/language-detector.d.ts +27 -0
  399. package/dist/utils/language-detector.d.ts.map +1 -0
  400. package/dist/utils/language-detector.js +94 -0
  401. package/dist/utils/log-parser.d.ts +46 -0
  402. package/dist/utils/log-parser.d.ts.map +1 -0
  403. package/dist/utils/log-parser.js +287 -0
  404. package/dist/utils/output-estimator.d.ts +54 -0
  405. package/dist/utils/output-estimator.d.ts.map +1 -0
  406. package/dist/utils/output-estimator.js +119 -0
  407. package/dist/utils/output-estimator.test.d.ts +5 -0
  408. package/dist/utils/output-estimator.test.d.ts.map +1 -0
  409. package/dist/utils/output-estimator.test.js +115 -0
  410. package/dist/utils/output-similarity.d.ts +48 -0
  411. package/dist/utils/output-similarity.d.ts.map +1 -0
  412. package/dist/utils/output-similarity.js +140 -0
  413. package/dist/utils/project-detector.d.ts +16 -0
  414. package/dist/utils/project-detector.d.ts.map +1 -0
  415. package/dist/utils/project-detector.js +119 -0
  416. package/dist/utils/segment-scorer.d.ts +99 -0
  417. package/dist/utils/segment-scorer.d.ts.map +1 -0
  418. package/dist/utils/segment-scorer.js +148 -0
  419. package/dist/utils/signature-grouper.d.ts +58 -0
  420. package/dist/utils/signature-grouper.d.ts.map +1 -0
  421. package/dist/utils/signature-grouper.js +185 -0
  422. package/dist/utils/tfidf.d.ts +45 -0
  423. package/dist/utils/tfidf.d.ts.map +1 -0
  424. package/dist/utils/tfidf.js +204 -0
  425. package/dist/utils/tfidf.test.d.ts +5 -0
  426. package/dist/utils/tfidf.test.d.ts.map +1 -0
  427. package/dist/utils/tfidf.test.js +115 -0
  428. package/dist/utils/token-counter.d.ts +35 -0
  429. package/dist/utils/token-counter.d.ts.map +1 -0
  430. package/dist/utils/token-counter.js +83 -0
  431. package/dist/utils/toon-serializer.d.ts +120 -0
  432. package/dist/utils/toon-serializer.d.ts.map +1 -0
  433. package/dist/utils/toon-serializer.js +472 -0
  434. package/dist/utils/toon-serializer.test.d.ts +7 -0
  435. package/dist/utils/toon-serializer.test.d.ts.map +1 -0
  436. package/dist/utils/toon-serializer.test.js +290 -0
  437. package/package.json +63 -0
  438. package/scripts/install.ps1 +133 -0
  439. package/scripts/install.sh +183 -0
  440. package/scripts/pre-commit-hook.sh +86 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-compress.d.ts","sourceRoot":"","sources":["../../src/tools/diff-compress.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD;;GAEG;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;CAQ9B,CAAC;AAoCF;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC;IACT,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC,CA+CD;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAM9B,CAAC"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Diff Compress Tool
3
+ *
4
+ * Compress git diff output to reduce tokens while preserving essential changes.
5
+ * Supports three strategies: hunks-only, summary, and semantic.
6
+ */
7
+ import { z } from "zod";
8
+ import { compressDiff } from "../compressors/diff.js";
9
+ /**
10
+ * JSON Schema for MCP tool registration
11
+ */
12
+ // Minimal schema
13
+ export const diffCompressSchema = {
14
+ type: "object",
15
+ properties: {
16
+ diff: { type: "string" },
17
+ strategy: { enum: ["hunks-only", "summary", "semantic"] },
18
+ maxTokens: { type: "number" },
19
+ },
20
+ required: ["diff", "strategy"],
21
+ };
22
+ /**
23
+ * Zod schema for runtime input validation
24
+ */
25
+ const inputSchema = z.object({
26
+ diff: z.string().min(1, "Diff content is required"),
27
+ strategy: z.enum(["hunks-only", "summary", "semantic"]),
28
+ maxTokens: z.number().positive().optional(),
29
+ });
30
+ /**
31
+ * Format the compression result - minimal header to save tokens
32
+ */
33
+ function formatOutput(output, _strategy) {
34
+ const savingsPercent = output.originalTokens > 0
35
+ ? Math.round(((output.originalTokens - output.compressedTokens) / output.originalTokens) * 100)
36
+ : 0;
37
+ const header = `[diff] ${output.filesChanged.length} files, +${output.additions}/-${output.deletions}, ${output.originalTokens}→${output.compressedTokens} tokens (-${savingsPercent}%)`;
38
+ return `${header}\n${output.compressed}`;
39
+ }
40
+ /**
41
+ * Execute diff compression
42
+ */
43
+ export async function executeDiffCompress(args) {
44
+ // Validate input
45
+ const parseResult = inputSchema.safeParse(args);
46
+ if (!parseResult.success) {
47
+ return {
48
+ content: [
49
+ {
50
+ type: "text",
51
+ text: `Invalid input: ${parseResult.error.errors.map((e) => e.message).join(", ")}`,
52
+ },
53
+ ],
54
+ isError: true,
55
+ };
56
+ }
57
+ const input = parseResult.data;
58
+ // Compress diff
59
+ const result = compressDiff(input.diff, {
60
+ strategy: input.strategy,
61
+ maxTokens: input.maxTokens,
62
+ });
63
+ // Build output
64
+ const output = {
65
+ compressed: result.compressed,
66
+ filesChanged: result.filesChanged,
67
+ summary: result.summary,
68
+ additions: result.additions,
69
+ deletions: result.deletions,
70
+ originalTokens: result.stats.originalTokens,
71
+ compressedTokens: result.stats.compressedTokens,
72
+ };
73
+ // Update session state with tokens saved
74
+ const tokensSaved = output.originalTokens - output.compressedTokens;
75
+ if (tokensSaved > 0) {
76
+ }
77
+ return {
78
+ content: [
79
+ {
80
+ type: "text",
81
+ text: formatOutput(output, input.strategy),
82
+ },
83
+ ],
84
+ };
85
+ }
86
+ /**
87
+ * Tool definition for MCP registration
88
+ */
89
+ export const diffCompressTool = {
90
+ name: "diff_compress",
91
+ description: "Compress git diff. Strategies: hunks-only, summary, semantic.",
92
+ inputSchema: diffCompressSchema,
93
+ execute: executeDiffCompress,
94
+ };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Discover Tools - Meta-tool for dynamic tool discovery
3
+ *
4
+ * Allows LLMs to discover and load available tools on-demand,
5
+ * reducing initial token consumption by ~80%.
6
+ *
7
+ * Supports TOON output format for additional ~40% token savings.
8
+ */
9
+ import type { ToolDefinition } from "./registry.js";
10
+ export declare const discoverToolsTool: ToolDefinition;
11
+ //# sourceMappingURL=discover-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover-tools.d.ts","sourceRoot":"","sources":["../../src/tools/discover-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAoMpD,eAAO,MAAM,iBAAiB,EAAE,cAK/B,CAAC"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Discover Tools - Meta-tool for dynamic tool discovery
3
+ *
4
+ * Allows LLMs to discover and load available tools on-demand,
5
+ * reducing initial token consumption by ~80%.
6
+ *
7
+ * Supports TOON output format for additional ~40% token savings.
8
+ */
9
+ import { getDynamicLoader } from "./dynamic-loader.js";
10
+ import { serializeToolsToToon, serializeToolsToToonTabular, serializeMetadataToToon, serializeMetadataToToonTabular, compareTokens, } from "../utils/toon-serializer.js";
11
+ // Minimal schema - descriptions in tool description, not properties
12
+ const discoverToolsSchema = {
13
+ type: "object",
14
+ properties: {
15
+ query: { type: "string" },
16
+ category: { enum: ["compress", "analyze", "logs", "code", "pipeline"] },
17
+ load: { type: "boolean" },
18
+ format: { enum: ["list", "toon", "toon-tabular"] },
19
+ },
20
+ };
21
+ async function executeDiscoverTools(args) {
22
+ const { query, category, load = false, format = "list" } = args;
23
+ const loader = getDynamicLoader();
24
+ // Get matching tools metadata
25
+ let matches;
26
+ if (query) {
27
+ matches = loader.searchTools(query).map((t) => ({
28
+ name: t.name,
29
+ category: t.category,
30
+ description: t.description,
31
+ }));
32
+ }
33
+ else if (category) {
34
+ matches = loader.getToolsByCategory(category).map((t) => ({
35
+ name: t.name,
36
+ category: t.category,
37
+ description: t.description,
38
+ }));
39
+ }
40
+ else {
41
+ // List all available tools
42
+ matches = loader.getAvailableTools();
43
+ }
44
+ // Load tools if requested
45
+ let loadedCount = 0;
46
+ if (load && matches.length > 0) {
47
+ const names = matches.map((m) => m.name);
48
+ const loaded = await loader.loadByNames(names);
49
+ loadedCount = loaded.length;
50
+ }
51
+ // Handle TOON format output
52
+ if (format === "toon" || format === "toon-tabular") {
53
+ return formatToonOutput(matches, format, load, loadedCount);
54
+ }
55
+ // Default list format
56
+ return formatListOutput(matches, loader, load, loadedCount);
57
+ }
58
+ /**
59
+ * Format output as TOON (Token-Oriented Object Notation)
60
+ *
61
+ * When load=false, uses lightweight metadata-only TOON (no schema loading).
62
+ * When load=true, loads full definitions and includes parameter info.
63
+ */
64
+ async function formatToonOutput(matches, format, load, loadedCount) {
65
+ if (matches.length === 0) {
66
+ return {
67
+ content: [{ type: "text", text: "No tools found.\nCategories: compress|analyze|logs|code|pipeline" }],
68
+ };
69
+ }
70
+ const loader = getDynamicLoader();
71
+ let toonOutput;
72
+ let savingsNote;
73
+ if (load) {
74
+ // Load full tool definitions to get schemas for detailed TOON output
75
+ const toolDefs = await loader.loadByNames(matches.map((m) => m.name));
76
+ // Build category map
77
+ const categories = new Map();
78
+ for (const m of matches) {
79
+ categories.set(m.name, m.category);
80
+ }
81
+ // Serialize to full TOON with parameters
82
+ if (format === "toon-tabular") {
83
+ toonOutput = serializeToolsToToonTabular(toolDefs);
84
+ }
85
+ else {
86
+ toonOutput = serializeToolsToToon(toolDefs, {
87
+ groupByCategory: true,
88
+ categories,
89
+ });
90
+ }
91
+ const stats = compareTokens(toolDefs);
92
+ savingsNote = `[tokens] json:${stats.json} → toon:${format === "toon-tabular" ? stats.toonTabular : stats.toon} (-${stats.savings}%)`;
93
+ }
94
+ else {
95
+ // Use lightweight metadata-only TOON (no loading required)
96
+ const metadata = matches.map((m) => ({
97
+ name: m.name,
98
+ category: m.category,
99
+ description: m.description,
100
+ }));
101
+ if (format === "toon-tabular") {
102
+ toonOutput = serializeMetadataToToonTabular(metadata);
103
+ }
104
+ else {
105
+ toonOutput = serializeMetadataToToon(metadata, { groupByCategory: true });
106
+ }
107
+ savingsNote = "[lazy] metadata only (use load:true for full schemas)";
108
+ }
109
+ const lines = [toonOutput, "", savingsNote];
110
+ if (load) {
111
+ lines.push(`[loaded] ${loadedCount} tools activated`);
112
+ }
113
+ return {
114
+ content: [{ type: "text", text: lines.join("\n") }],
115
+ };
116
+ }
117
+ /**
118
+ * Format output as standard list
119
+ */
120
+ function formatListOutput(matches, loader, load, loadedCount) {
121
+ const lines = [];
122
+ if (matches.length === 0) {
123
+ lines.push("No tools found matching your criteria.");
124
+ lines.push("");
125
+ lines.push("Available categories: compress, analyze, logs, code, pipeline");
126
+ }
127
+ else {
128
+ // Group by category for better readability
129
+ const byCategory = new Map();
130
+ for (const tool of matches) {
131
+ const cat = tool.category;
132
+ if (!byCategory.has(cat)) {
133
+ byCategory.set(cat, []);
134
+ }
135
+ byCategory.get(cat).push(tool);
136
+ }
137
+ lines.push(`Found ${matches.length} tools:`);
138
+ lines.push("");
139
+ for (const [cat, tools] of byCategory) {
140
+ lines.push(`[${cat}]`);
141
+ for (const t of tools) {
142
+ const status = loader.isLoaded(t.name) ? "*" : " ";
143
+ lines.push(`${status} ${t.name}: ${t.description}`);
144
+ }
145
+ lines.push("");
146
+ }
147
+ if (load) {
148
+ lines.push(`Loaded ${loadedCount} new tools. They are now available for use.`);
149
+ }
150
+ else {
151
+ lines.push("Use load:true to activate these tools.");
152
+ }
153
+ }
154
+ return {
155
+ content: [{ type: "text", text: lines.join("\n") }],
156
+ };
157
+ }
158
+ export const discoverToolsTool = {
159
+ name: "discover_tools",
160
+ description: "Find and load optimization tools. Categories: compress, analyze, logs, code, pipeline.",
161
+ inputSchema: discoverToolsSchema,
162
+ execute: executeDiscoverTools,
163
+ };
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Dynamic Tool Loader
3
+ *
4
+ * Manages lazy loading of MCP tools to reduce token consumption.
5
+ * Only core tools are loaded at startup; others are loaded on-demand.
6
+ */
7
+ import type { ToolDefinition } from "./registry.js";
8
+ import { type BM25Result } from "../utils/bm25.js";
9
+ import { type HybridSearchResult } from "../utils/hybrid-search.js";
10
+ export type ToolCategory = "compress" | "analyze" | "logs" | "code" | "pipeline" | "core";
11
+ export interface ToolMetadata {
12
+ name: string;
13
+ category: ToolCategory;
14
+ keywords: string[];
15
+ description: string;
16
+ loader: () => Promise<ToolDefinition>;
17
+ }
18
+ /**
19
+ * Tool catalog with metadata for discovery
20
+ * Full tool definitions are loaded lazily via the loader function
21
+ */
22
+ export declare const TOOL_CATALOG: ToolMetadata[];
23
+ /**
24
+ * Dynamic Tool Loader
25
+ *
26
+ * Manages tool loading and provides discovery capabilities.
27
+ */
28
+ export declare class DynamicToolLoader {
29
+ private loadedTools;
30
+ private onChangeCallbacks;
31
+ private bm25Index;
32
+ private hybridIndex;
33
+ /**
34
+ * Get searchable text from tool metadata
35
+ */
36
+ private static getSearchableText;
37
+ /**
38
+ * Get or create BM25 search index (lazy initialization)
39
+ */
40
+ private getBM25Index;
41
+ /**
42
+ * Get or create hybrid search index (lazy initialization)
43
+ */
44
+ private getHybridIndex;
45
+ /**
46
+ * Get metadata for all available tools (without loading them)
47
+ */
48
+ getAvailableTools(): Array<{
49
+ name: string;
50
+ category: ToolCategory;
51
+ description: string;
52
+ }>;
53
+ /**
54
+ * Search tools by query string using BM25 ranking
55
+ * Returns results sorted by relevance score (most relevant first)
56
+ */
57
+ searchTools(query: string): ToolMetadata[];
58
+ /**
59
+ * Search tools with BM25 scores and matched terms
60
+ * Useful for debugging or displaying search relevance
61
+ */
62
+ searchToolsWithScores(query: string): BM25Result<ToolMetadata>[];
63
+ /**
64
+ * Hybrid search combining BM25 (lexical) and semantic similarity
65
+ *
66
+ * This method finds tools even when the query uses different words
67
+ * than the tool description (e.g., "shrink output" → compress).
68
+ *
69
+ * @param query - Search query
70
+ * @returns Ranked results with both BM25 and semantic scores
71
+ */
72
+ searchToolsHybrid(query: string): Promise<HybridSearchResult<ToolMetadata>[]>;
73
+ /**
74
+ * Preload semantic embeddings for faster hybrid search
75
+ *
76
+ * Call this during idle time to avoid latency on first hybrid search.
77
+ * The embedding model (~23MB) is downloaded and cached on first use.
78
+ */
79
+ preloadSemanticSearch(): Promise<void>;
80
+ /**
81
+ * Check if semantic search is ready (embeddings loaded)
82
+ */
83
+ isSemanticSearchReady(): boolean;
84
+ /**
85
+ * Get tools by category
86
+ */
87
+ getToolsByCategory(category: ToolCategory): ToolMetadata[];
88
+ /**
89
+ * Load core tools (called at startup)
90
+ */
91
+ loadCoreTools(): Promise<ToolDefinition[]>;
92
+ /**
93
+ * Load tools by category
94
+ */
95
+ loadByCategory(category: ToolCategory): Promise<ToolDefinition[]>;
96
+ /**
97
+ * Load tools matching a query
98
+ */
99
+ loadByQuery(query: string): Promise<ToolDefinition[]>;
100
+ /**
101
+ * Load specific tools by name
102
+ */
103
+ loadByNames(names: string[]): Promise<ToolDefinition[]>;
104
+ /**
105
+ * Load all tools (fallback for clients that don't support dynamic loading)
106
+ */
107
+ loadAllTools(): Promise<ToolDefinition[]>;
108
+ /**
109
+ * Get already loaded tools
110
+ */
111
+ getLoadedTools(): ToolDefinition[];
112
+ /**
113
+ * Check if a tool is loaded
114
+ */
115
+ isLoaded(name: string): boolean;
116
+ /**
117
+ * Register callback for tool list changes
118
+ */
119
+ onToolsChanged(callback: () => void): void;
120
+ /**
121
+ * Internal: Load tools from metadata array
122
+ */
123
+ private loadToolsFromMetadata;
124
+ /**
125
+ * Emit change notification
126
+ */
127
+ private emitChange;
128
+ }
129
+ export declare function getDynamicLoader(): DynamicToolLoader;
130
+ export declare function resetDynamicLoader(): void;
131
+ //# sourceMappingURL=dynamic-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-loader.d.ts","sourceRoot":"","sources":["../../src/tools/dynamic-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAmC,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;AAE1F,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;CACvC;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,YAAY,EAoLtC,CAAC;AAEF;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,WAAW,CAAgD;IAEnE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAIhC;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACH,iBAAiB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAQzF;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE;IAM1C;;;OAGG;IACH,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC,EAAE;IAKhE;;;;;;;;OAQG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;IAKnF;;;;;OAKG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5C;;OAEG;IACH,qBAAqB,IAAI,OAAO;IAIhC;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,YAAY,EAAE;IAI1D;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAKhD;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAKvE;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAK3D;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAK7D;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAI/C;;OAEG;IACH,cAAc,IAAI,cAAc,EAAE;IAIlC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI/B;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAI1C;;OAEG;YACW,qBAAqB;IAmBnC;;OAEG;IACH,OAAO,CAAC,UAAU;CASnB;AAOD,wBAAgB,gBAAgB,IAAI,iBAAiB,CAKpD;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}