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,27 @@
1
+ /**
2
+ * Language Detector
3
+ *
4
+ * Detects programming language from file path extension.
5
+ */
6
+ import type { SupportedLanguage } from "../ast/types.js";
7
+ /**
8
+ * Detect language from file path
9
+ */
10
+ export declare function detectLanguageFromPath(filePath: string): SupportedLanguage;
11
+ /**
12
+ * Get file extension for a language
13
+ */
14
+ export declare function getExtensionsForLanguage(language: SupportedLanguage): string[];
15
+ /**
16
+ * Check if language is supported for AST parsing
17
+ */
18
+ export declare function isASTSupported(language: SupportedLanguage): boolean;
19
+ /**
20
+ * Check if language is supported for regex parsing
21
+ */
22
+ export declare function isRegexSupported(language: SupportedLanguage): boolean;
23
+ /**
24
+ * Get language display name
25
+ */
26
+ export declare function getLanguageDisplayName(language: SupportedLanguage): string;
27
+ //# sourceMappingURL=language-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language-detector.d.ts","sourceRoot":"","sources":["../../src/utils/language-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AA4CzD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAG1E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAI9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAEnE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAErE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAuB1E"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Language Detector
3
+ *
4
+ * Detects programming language from file path extension.
5
+ */
6
+ import * as path from "path";
7
+ const EXTENSION_MAP = {
8
+ // TypeScript
9
+ ".ts": "typescript",
10
+ ".tsx": "typescript",
11
+ ".mts": "typescript",
12
+ ".cts": "typescript",
13
+ // JavaScript
14
+ ".js": "javascript",
15
+ ".jsx": "javascript",
16
+ ".mjs": "javascript",
17
+ ".cjs": "javascript",
18
+ // Python
19
+ ".py": "python",
20
+ ".pyw": "python",
21
+ ".pyi": "python",
22
+ // Go
23
+ ".go": "go",
24
+ // Rust
25
+ ".rs": "rust",
26
+ // PHP
27
+ ".php": "php",
28
+ ".phtml": "php",
29
+ ".php3": "php",
30
+ ".php4": "php",
31
+ ".php5": "php",
32
+ ".php7": "php",
33
+ ".phps": "php",
34
+ // Swift
35
+ ".swift": "swift",
36
+ // Config files
37
+ ".json": "json",
38
+ ".yaml": "yaml",
39
+ ".yml": "yaml",
40
+ };
41
+ /**
42
+ * Detect language from file path
43
+ */
44
+ export function detectLanguageFromPath(filePath) {
45
+ const ext = path.extname(filePath).toLowerCase();
46
+ return EXTENSION_MAP[ext] ?? "unknown";
47
+ }
48
+ /**
49
+ * Get file extension for a language
50
+ */
51
+ export function getExtensionsForLanguage(language) {
52
+ return Object.entries(EXTENSION_MAP)
53
+ .filter(([, lang]) => lang === language)
54
+ .map(([ext]) => ext);
55
+ }
56
+ /**
57
+ * Check if language is supported for AST parsing
58
+ */
59
+ export function isASTSupported(language) {
60
+ return language === "typescript" || language === "javascript";
61
+ }
62
+ /**
63
+ * Check if language is supported for regex parsing
64
+ */
65
+ export function isRegexSupported(language) {
66
+ return language === "python" || language === "go" || language === "rust";
67
+ }
68
+ /**
69
+ * Get language display name
70
+ */
71
+ export function getLanguageDisplayName(language) {
72
+ switch (language) {
73
+ case "typescript":
74
+ return "TypeScript";
75
+ case "javascript":
76
+ return "JavaScript";
77
+ case "python":
78
+ return "Python";
79
+ case "go":
80
+ return "Go";
81
+ case "rust":
82
+ return "Rust";
83
+ case "php":
84
+ return "PHP";
85
+ case "swift":
86
+ return "Swift";
87
+ case "json":
88
+ return "JSON";
89
+ case "yaml":
90
+ return "YAML";
91
+ case "unknown":
92
+ return "Unknown";
93
+ }
94
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Log Parser Utilities
3
+ *
4
+ * Common functions for parsing log files across different formats.
5
+ */
6
+ import type { LogType, LogLevel, LogEntry, Timespan } from "../summarizers/types.js";
7
+ /**
8
+ * Extract timestamp from a log line
9
+ */
10
+ export declare function parseTimestamp(line: string): string | undefined;
11
+ /**
12
+ * Extract log level from a log line
13
+ */
14
+ export declare function parseLogLevel(line: string): LogLevel;
15
+ /**
16
+ * Parse a single log line into a LogEntry
17
+ */
18
+ export declare function parseLogLine(line: string): LogEntry;
19
+ /**
20
+ * Detect the type of log based on content patterns
21
+ */
22
+ export declare function detectLogType(logs: string): LogType;
23
+ /**
24
+ * Calculate timespan from log entries
25
+ */
26
+ export declare function calculateTimespan(entries: LogEntry[]): Timespan | undefined;
27
+ /**
28
+ * Format duration in milliseconds to human readable
29
+ */
30
+ export declare function formatDuration(ms: number): string;
31
+ /**
32
+ * Deduplicate log entries by normalized message
33
+ */
34
+ export declare function deduplicateEntries(entries: LogEntry[]): LogEntry[];
35
+ /**
36
+ * Filter entries by time range
37
+ */
38
+ export declare function filterByTimeframe(entries: LogEntry[], timeframe?: {
39
+ start?: string;
40
+ end?: string;
41
+ }): LogEntry[];
42
+ /**
43
+ * Check if a line indicates a key event
44
+ */
45
+ export declare function isKeyEvent(line: string): boolean;
46
+ //# sourceMappingURL=log-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-parser.d.ts","sourceRoot":"","sources":["../../src/utils/log-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AA0ErF;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQ/D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAOpD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CA4BnD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAqBnD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,QAAQ,GAAG,SAAS,CA6B3E;AAyCD;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAgBlE;AAgBD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,QAAQ,EAAE,EACnB,SAAS,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,QAAQ,EAAE,CAmBZ;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAahD"}
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Log Parser Utilities
3
+ *
4
+ * Common functions for parsing log files across different formats.
5
+ */
6
+ /**
7
+ * Timestamp patterns for common log formats
8
+ */
9
+ const TIMESTAMP_PATTERNS = [
10
+ // ISO 8601: 2024-01-15T10:30:45.123Z or 2024-01-15 10:30:45
11
+ /(\d{4}-\d{2}-\d{2}[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?)/,
12
+ // Bracket format: [10:30:45] or [2024-01-15 10:30:45]
13
+ /\[(\d{4}-\d{2}-\d{2}\s+)?\d{2}:\d{2}:\d{2}(?:\.\d+)?\]/,
14
+ // Syslog: Jan 15 10:30:45
15
+ /([A-Z][a-z]{2}\s+\d{1,2}\s+\d{2}:\d{2}:\d{2})/,
16
+ // Unix timestamp: 1705315845
17
+ /\b(\d{10,13})\b/,
18
+ // Time only: 10:30:45.123
19
+ /\b(\d{2}:\d{2}:\d{2}(?:\.\d+)?)\b/,
20
+ ];
21
+ /**
22
+ * Log level patterns
23
+ */
24
+ const LOG_LEVEL_PATTERNS = [
25
+ { pattern: /\b(ERROR|ERR|FATAL|CRITICAL)\b/i, level: "error" },
26
+ { pattern: /\b(WARN(?:ING)?)\b/i, level: "warning" },
27
+ { pattern: /\b(INFO)\b/i, level: "info" },
28
+ { pattern: /\b(DEBUG|TRACE|VERBOSE)\b/i, level: "debug" },
29
+ ];
30
+ /**
31
+ * Log type detection patterns
32
+ */
33
+ const LOG_TYPE_PATTERNS = [
34
+ {
35
+ type: "server",
36
+ patterns: [
37
+ /\b(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\s+\/\S+\s+\d{3}/,
38
+ /\bHTTP\/\d\.\d\b/,
39
+ /\b(request|response|endpoint)\b/i,
40
+ /\bstatus\s*[:=]\s*\d{3}\b/i,
41
+ ],
42
+ threshold: 0.1, // 10% of lines
43
+ },
44
+ {
45
+ type: "test",
46
+ patterns: [
47
+ /\b(PASS|FAIL|SKIP|PENDING)\b/,
48
+ /\b(describe|it|test|expect|assert)\s*\(/,
49
+ /\b(jest|mocha|vitest|pytest|unittest)\b/i,
50
+ /\bTest\s+(Suites?|Cases?)\b/i,
51
+ /✓|✕|●/,
52
+ ],
53
+ threshold: 0.05, // 5% of lines
54
+ },
55
+ {
56
+ type: "build",
57
+ patterns: [
58
+ /\b(webpack|vite|esbuild|rollup|parcel)\b/i,
59
+ /\b(tsc|typescript|Compiling|Bundling)\b/i,
60
+ /\b(npm|yarn|pnpm|bun)\s+(run|build|install)\b/i,
61
+ /\bBuilt?\s+in\s+\d+/i,
62
+ /\.(js|ts|tsx|jsx|css|scss)\s+\d+(\.\d+)?\s*(KB|MB|bytes)/i,
63
+ ],
64
+ threshold: 0.05,
65
+ },
66
+ {
67
+ type: "application",
68
+ patterns: [
69
+ /\[\s*(INFO|DEBUG|WARN|ERROR|TRACE|FATAL)\s*\]/i,
70
+ /\b(INFO|DEBUG|WARN|ERROR)\s*[-:]/i,
71
+ ],
72
+ threshold: 0.3, // 30% of lines
73
+ },
74
+ ];
75
+ /**
76
+ * Extract timestamp from a log line
77
+ */
78
+ export function parseTimestamp(line) {
79
+ for (const pattern of TIMESTAMP_PATTERNS) {
80
+ const match = line.match(pattern);
81
+ if (match) {
82
+ return match[1] ?? match[0];
83
+ }
84
+ }
85
+ return undefined;
86
+ }
87
+ /**
88
+ * Extract log level from a log line
89
+ */
90
+ export function parseLogLevel(line) {
91
+ for (const { pattern, level } of LOG_LEVEL_PATTERNS) {
92
+ if (pattern.test(line)) {
93
+ return level;
94
+ }
95
+ }
96
+ return "info"; // Default
97
+ }
98
+ /**
99
+ * Parse a single log line into a LogEntry
100
+ */
101
+ export function parseLogLine(line) {
102
+ const trimmed = line.trim();
103
+ const timestamp = parseTimestamp(trimmed);
104
+ const level = parseLogLevel(trimmed);
105
+ // Extract message by removing timestamp and level prefix
106
+ let message = trimmed;
107
+ // Remove timestamp
108
+ if (timestamp) {
109
+ message = message.replace(timestamp, "").trim();
110
+ }
111
+ // Remove level indicator
112
+ message = message
113
+ .replace(/^\[?\s*(ERROR|WARN(?:ING)?|INFO|DEBUG|TRACE|FATAL)\s*\]?\s*[-:.]?\s*/i, "")
114
+ .trim();
115
+ // Remove leading brackets/dashes
116
+ message = message.replace(/^[\[\]\-:]+\s*/, "").trim();
117
+ return {
118
+ timestamp,
119
+ level,
120
+ message: message || trimmed,
121
+ count: 1,
122
+ raw: trimmed,
123
+ };
124
+ }
125
+ /**
126
+ * Detect the type of log based on content patterns
127
+ */
128
+ export function detectLogType(logs) {
129
+ const lines = logs.split("\n").filter((l) => l.trim());
130
+ const totalLines = lines.length;
131
+ if (totalLines === 0)
132
+ return "generic";
133
+ // Check each log type
134
+ for (const { type, patterns, threshold } of LOG_TYPE_PATTERNS) {
135
+ let matchingLines = 0;
136
+ for (const line of lines) {
137
+ if (patterns.some((p) => p.test(line))) {
138
+ matchingLines++;
139
+ }
140
+ }
141
+ if (matchingLines / totalLines >= threshold) {
142
+ return type;
143
+ }
144
+ }
145
+ return "generic";
146
+ }
147
+ /**
148
+ * Calculate timespan from log entries
149
+ */
150
+ export function calculateTimespan(entries) {
151
+ const timestamps = [];
152
+ for (const entry of entries) {
153
+ if (entry.timestamp) {
154
+ const date = parseDate(entry.timestamp);
155
+ if (date) {
156
+ timestamps.push(date);
157
+ }
158
+ }
159
+ }
160
+ if (timestamps.length < 2)
161
+ return undefined;
162
+ timestamps.sort((a, b) => a.getTime() - b.getTime());
163
+ const start = timestamps[0];
164
+ const end = timestamps[timestamps.length - 1];
165
+ if (!start || !end)
166
+ return undefined;
167
+ const durationMs = end.getTime() - start.getTime();
168
+ return {
169
+ start: formatTimestamp(start),
170
+ end: formatTimestamp(end),
171
+ durationMs,
172
+ durationFormatted: formatDuration(durationMs),
173
+ };
174
+ }
175
+ /**
176
+ * Parse a timestamp string into a Date
177
+ */
178
+ function parseDate(timestamp) {
179
+ // Try ISO format first
180
+ const isoDate = new Date(timestamp);
181
+ if (!isNaN(isoDate.getTime())) {
182
+ return isoDate;
183
+ }
184
+ // Try Unix timestamp (seconds or milliseconds)
185
+ const unixMatch = timestamp.match(/^(\d{10,13})$/);
186
+ if (unixMatch) {
187
+ const ts = parseInt(unixMatch[1] ?? "0", 10);
188
+ return new Date(ts.toString().length === 10 ? ts * 1000 : ts);
189
+ }
190
+ // Try time only (assume today)
191
+ const timeMatch = timestamp.match(/^(\d{2}):(\d{2}):(\d{2})/);
192
+ if (timeMatch) {
193
+ const now = new Date();
194
+ now.setHours(parseInt(timeMatch[1] ?? "0", 10), parseInt(timeMatch[2] ?? "0", 10), parseInt(timeMatch[3] ?? "0", 10));
195
+ return now;
196
+ }
197
+ return undefined;
198
+ }
199
+ /**
200
+ * Format a Date as a readable timestamp
201
+ */
202
+ function formatTimestamp(date) {
203
+ return date.toISOString().replace("T", " ").replace(/\.\d+Z$/, "");
204
+ }
205
+ /**
206
+ * Format duration in milliseconds to human readable
207
+ */
208
+ export function formatDuration(ms) {
209
+ if (ms < 1000)
210
+ return `${ms}ms`;
211
+ if (ms < 60000)
212
+ return `${(ms / 1000).toFixed(1)}s`;
213
+ if (ms < 3600000)
214
+ return `${Math.floor(ms / 60000)}m ${Math.floor((ms % 60000) / 1000)}s`;
215
+ const hours = Math.floor(ms / 3600000);
216
+ const minutes = Math.floor((ms % 3600000) / 60000);
217
+ return `${hours}h ${minutes}m`;
218
+ }
219
+ /**
220
+ * Deduplicate log entries by normalized message
221
+ */
222
+ export function deduplicateEntries(entries) {
223
+ const groups = new Map();
224
+ for (const entry of entries) {
225
+ // Normalize message for grouping
226
+ const key = normalizeForGrouping(entry.message);
227
+ if (groups.has(key)) {
228
+ const existing = groups.get(key);
229
+ existing.count++;
230
+ }
231
+ else {
232
+ groups.set(key, { ...entry });
233
+ }
234
+ }
235
+ return Array.from(groups.values()).sort((a, b) => b.count - a.count);
236
+ }
237
+ /**
238
+ * Normalize a message for grouping similar entries
239
+ */
240
+ function normalizeForGrouping(message) {
241
+ return message
242
+ .replace(/\d+(\.\d+)?/g, "<N>") // Numbers
243
+ .replace(/[a-f0-9]{8,}/gi, "<HASH>") // Hashes
244
+ .replace(/\/[\w\-\.\/]+/g, "<PATH>") // Paths
245
+ .replace(/'[^']*'/g, "'<STR>'") // Single quoted strings
246
+ .replace(/"[^"]*"/g, '"<STR>"') // Double quoted strings
247
+ .toLowerCase()
248
+ .trim();
249
+ }
250
+ /**
251
+ * Filter entries by time range
252
+ */
253
+ export function filterByTimeframe(entries, timeframe) {
254
+ if (!timeframe || (!timeframe.start && !timeframe.end)) {
255
+ return entries;
256
+ }
257
+ const startDate = timeframe.start ? parseDate(timeframe.start) : undefined;
258
+ const endDate = timeframe.end ? parseDate(timeframe.end) : undefined;
259
+ return entries.filter((entry) => {
260
+ if (!entry.timestamp)
261
+ return true;
262
+ const entryDate = parseDate(entry.timestamp);
263
+ if (!entryDate)
264
+ return true;
265
+ if (startDate && entryDate < startDate)
266
+ return false;
267
+ if (endDate && entryDate > endDate)
268
+ return false;
269
+ return true;
270
+ });
271
+ }
272
+ /**
273
+ * Check if a line indicates a key event
274
+ */
275
+ export function isKeyEvent(line) {
276
+ const keyEventPatterns = [
277
+ /\b(start(?:ed|ing)?|stop(?:ped|ping)?|shutdown|restart)\b/i,
278
+ /\b(connect(?:ed|ing)?|disconnect(?:ed|ing)?|reconnect)\b/i,
279
+ /\b(initialized?|ready|listening)\b/i,
280
+ /\b(crash(?:ed)?|panic|abort(?:ed)?)\b/i,
281
+ /\b(deploy(?:ed|ing)?|release|version)\b/i,
282
+ /\b(ERROR|FATAL|CRITICAL)\b/i,
283
+ /\bport\s+\d+\b/i,
284
+ /\bserver\b/i,
285
+ ];
286
+ return keyEventPatterns.some((p) => p.test(line));
287
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Output Token Estimator
3
+ *
4
+ * Heuristic-based estimation of LLM output tokens based on:
5
+ * - Content type (code, logs, questions, instructions)
6
+ * - Input length
7
+ * - Content patterns
8
+ */
9
+ import type { ContentType } from "../compressors/types.js";
10
+ /**
11
+ * Output estimation result
12
+ */
13
+ export interface OutputEstimate {
14
+ /** Estimated output tokens */
15
+ estimated: number;
16
+ /** Confidence level of the estimate */
17
+ confidence: "low" | "medium" | "high";
18
+ /** Human-readable reasoning for the estimate */
19
+ reasoning: string;
20
+ }
21
+ /**
22
+ * Output ratio configuration per content type
23
+ */
24
+ interface OutputRatio {
25
+ /** Minimum output/input ratio */
26
+ minRatio: number;
27
+ /** Maximum output/input ratio */
28
+ maxRatio: number;
29
+ /** Default output/input ratio */
30
+ defaultRatio: number;
31
+ }
32
+ /**
33
+ * Detect if content is a question
34
+ */
35
+ export declare function isQuestion(content: string): boolean;
36
+ /**
37
+ * Detect if content is an instruction/command
38
+ */
39
+ export declare function isInstruction(content: string): boolean;
40
+ /**
41
+ * Estimate output tokens based on content analysis
42
+ *
43
+ * @param content - The input content
44
+ * @param inputTokens - Pre-calculated input token count
45
+ * @param contentType - Detected content type
46
+ * @returns Estimation with confidence and reasoning
47
+ */
48
+ export declare function estimateOutputTokens(content: string, inputTokens: number, contentType: ContentType): OutputEstimate;
49
+ /**
50
+ * Get the output ratio for a content type (for display purposes)
51
+ */
52
+ export declare function getOutputRatio(contentType: ContentType): OutputRatio;
53
+ export {};
54
+ //# sourceMappingURL=output-estimator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-estimator.d.ts","sourceRoot":"","sources":["../../src/utils/output-estimator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,UAAU,WAAW;IACnB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC;CACtB;AAkDD;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,WAAW,GACvB,cAAc,CAmDhB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAEpE"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Output Token Estimator
3
+ *
4
+ * Heuristic-based estimation of LLM output tokens based on:
5
+ * - Content type (code, logs, questions, instructions)
6
+ * - Input length
7
+ * - Content patterns
8
+ */
9
+ /**
10
+ * Output estimation ratios by content type
11
+ * Based on typical LLM response patterns
12
+ */
13
+ const OUTPUT_RATIOS = {
14
+ // Code input often results in code output (similar length)
15
+ code: { minRatio: 0.3, maxRatio: 1.5, defaultRatio: 0.8 },
16
+ // Logs/errors need concise summaries
17
+ logs: { minRatio: 0.1, maxRatio: 0.3, defaultRatio: 0.2 },
18
+ stacktrace: { minRatio: 0.1, maxRatio: 0.4, defaultRatio: 0.25 },
19
+ // Config analysis is usually brief
20
+ config: { minRatio: 0.2, maxRatio: 0.5, defaultRatio: 0.3 },
21
+ // Generic text might get similar-length responses
22
+ generic: { minRatio: 0.3, maxRatio: 1.0, defaultRatio: 0.5 },
23
+ // Questions typically get expansive answers
24
+ question: { minRatio: 0.5, maxRatio: 2.0, defaultRatio: 1.0 },
25
+ // Instructions (do X) get acknowledgment + result
26
+ instruction: { minRatio: 0.3, maxRatio: 1.5, defaultRatio: 0.6 },
27
+ };
28
+ /**
29
+ * Patterns that indicate a question
30
+ */
31
+ const QUESTION_PATTERNS = [
32
+ /^(what|how|why|when|where|who|which|can|could|would|should|is|are|do|does)\b/i,
33
+ /\?[\s]*$/,
34
+ /\b(explain|describe|tell me|help me understand|what is|what are)\b/i,
35
+ ];
36
+ /**
37
+ * Patterns that indicate an instruction/command
38
+ */
39
+ const INSTRUCTION_PATTERNS = [
40
+ /^(create|write|build|implement|add|remove|fix|update|change|modify|generate|make|refactor)\b/i,
41
+ /^(please|can you|could you|would you|I need you to|I want you to)\b/i,
42
+ /\b(write a|create a|build a|implement a|add a|generate a)\b/i,
43
+ ];
44
+ /**
45
+ * Detect if content is a question
46
+ */
47
+ export function isQuestion(content) {
48
+ const trimmed = content.trim();
49
+ return QUESTION_PATTERNS.some((p) => p.test(trimmed));
50
+ }
51
+ /**
52
+ * Detect if content is an instruction/command
53
+ */
54
+ export function isInstruction(content) {
55
+ const trimmed = content.trim();
56
+ return INSTRUCTION_PATTERNS.some((p) => p.test(trimmed));
57
+ }
58
+ /**
59
+ * Estimate output tokens based on content analysis
60
+ *
61
+ * @param content - The input content
62
+ * @param inputTokens - Pre-calculated input token count
63
+ * @param contentType - Detected content type
64
+ * @returns Estimation with confidence and reasoning
65
+ */
66
+ export function estimateOutputTokens(content, inputTokens, contentType) {
67
+ // Determine effective content type by checking conversational patterns
68
+ let effectiveType = contentType;
69
+ if (contentType === "generic") {
70
+ if (isQuestion(content)) {
71
+ effectiveType = "question";
72
+ }
73
+ else if (isInstruction(content)) {
74
+ effectiveType = "instruction";
75
+ }
76
+ }
77
+ const ratios = OUTPUT_RATIOS[effectiveType];
78
+ // Base estimation using default ratio
79
+ let estimated = Math.round(inputTokens * ratios.defaultRatio);
80
+ let confidence = "medium";
81
+ let reasoning = "";
82
+ // Adjust based on input length
83
+ if (inputTokens < 100) {
84
+ // Short inputs often get longer outputs (elaboration needed)
85
+ estimated = Math.max(estimated, Math.round(inputTokens * ratios.maxRatio));
86
+ confidence = "low";
87
+ reasoning = "Short input - output length may vary significantly";
88
+ }
89
+ else if (inputTokens > 10000) {
90
+ // Very long inputs typically get more concise responses
91
+ estimated = Math.round(inputTokens * ratios.minRatio);
92
+ confidence = "medium";
93
+ reasoning = "Long input - expecting summarized/focused response";
94
+ }
95
+ else {
96
+ confidence = "medium";
97
+ reasoning = `Based on ${effectiveType} content pattern (${ratios.defaultRatio}x ratio)`;
98
+ }
99
+ // Apply minimum floor (responses are rarely < 50 tokens)
100
+ const MIN_OUTPUT = 50;
101
+ if (estimated < MIN_OUTPUT) {
102
+ estimated = MIN_OUTPUT;
103
+ reasoning += "; minimum output floor applied";
104
+ }
105
+ // Apply maximum ceiling (practical limit for single response)
106
+ const MAX_OUTPUT = 16000;
107
+ if (estimated > MAX_OUTPUT) {
108
+ estimated = MAX_OUTPUT;
109
+ confidence = "low";
110
+ reasoning = "Very long input - capped at practical response limit";
111
+ }
112
+ return { estimated, confidence, reasoning };
113
+ }
114
+ /**
115
+ * Get the output ratio for a content type (for display purposes)
116
+ */
117
+ export function getOutputRatio(contentType) {
118
+ return OUTPUT_RATIOS[contentType] || OUTPUT_RATIOS.generic;
119
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Output Estimator Tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=output-estimator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-estimator.test.d.ts","sourceRoot":"","sources":["../../src/utils/output-estimator.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}