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.
- package/bin/cli.js +133 -0
- package/dist/analytics/session-tracker.d.ts +74 -0
- package/dist/analytics/session-tracker.d.ts.map +1 -0
- package/dist/analytics/session-tracker.js +123 -0
- package/dist/ast/benchmark.test.d.ts +7 -0
- package/dist/ast/benchmark.test.d.ts.map +1 -0
- package/dist/ast/benchmark.test.js +175 -0
- package/dist/ast/go/index.d.ts +9 -0
- package/dist/ast/go/index.d.ts.map +1 -0
- package/dist/ast/go/index.js +8 -0
- package/dist/ast/go/parser.d.ts +31 -0
- package/dist/ast/go/parser.d.ts.map +1 -0
- package/dist/ast/go/parser.js +428 -0
- package/dist/ast/go/parser.test.d.ts +5 -0
- package/dist/ast/go/parser.test.d.ts.map +1 -0
- package/dist/ast/go/parser.test.js +241 -0
- package/dist/ast/go/queries.d.ts +51 -0
- package/dist/ast/go/queries.d.ts.map +1 -0
- package/dist/ast/go/queries.js +114 -0
- package/dist/ast/go/utils.d.ts +66 -0
- package/dist/ast/go/utils.d.ts.map +1 -0
- package/dist/ast/go/utils.js +140 -0
- package/dist/ast/index.d.ts +39 -0
- package/dist/ast/index.d.ts.map +1 -0
- package/dist/ast/index.js +245 -0
- package/dist/ast/php/index.d.ts +9 -0
- package/dist/ast/php/index.d.ts.map +1 -0
- package/dist/ast/php/index.js +8 -0
- package/dist/ast/php/parser.d.ts +31 -0
- package/dist/ast/php/parser.d.ts.map +1 -0
- package/dist/ast/php/parser.js +388 -0
- package/dist/ast/php/parser.test.d.ts +5 -0
- package/dist/ast/php/parser.test.d.ts.map +1 -0
- package/dist/ast/php/parser.test.js +328 -0
- package/dist/ast/php/queries.d.ts +61 -0
- package/dist/ast/php/queries.d.ts.map +1 -0
- package/dist/ast/php/queries.js +117 -0
- package/dist/ast/php/utils.d.ts +83 -0
- package/dist/ast/php/utils.d.ts.map +1 -0
- package/dist/ast/php/utils.js +246 -0
- package/dist/ast/python/index.d.ts +9 -0
- package/dist/ast/python/index.d.ts.map +1 -0
- package/dist/ast/python/index.js +8 -0
- package/dist/ast/python/parser.d.ts +32 -0
- package/dist/ast/python/parser.d.ts.map +1 -0
- package/dist/ast/python/parser.js +422 -0
- package/dist/ast/python/parser.test.d.ts +5 -0
- package/dist/ast/python/parser.test.d.ts.map +1 -0
- package/dist/ast/python/parser.test.js +186 -0
- package/dist/ast/python/queries.d.ts +73 -0
- package/dist/ast/python/queries.d.ts.map +1 -0
- package/dist/ast/python/queries.js +137 -0
- package/dist/ast/python/utils.d.ts +63 -0
- package/dist/ast/python/utils.d.ts.map +1 -0
- package/dist/ast/python/utils.js +159 -0
- package/dist/ast/quick-scan.d.ts +40 -0
- package/dist/ast/quick-scan.d.ts.map +1 -0
- package/dist/ast/quick-scan.js +287 -0
- package/dist/ast/rust/index.d.ts +9 -0
- package/dist/ast/rust/index.d.ts.map +1 -0
- package/dist/ast/rust/index.js +8 -0
- package/dist/ast/rust/parser.d.ts +31 -0
- package/dist/ast/rust/parser.d.ts.map +1 -0
- package/dist/ast/rust/parser.js +416 -0
- package/dist/ast/rust/parser.test.d.ts +5 -0
- package/dist/ast/rust/parser.test.d.ts.map +1 -0
- package/dist/ast/rust/parser.test.js +329 -0
- package/dist/ast/rust/queries.d.ts +66 -0
- package/dist/ast/rust/queries.d.ts.map +1 -0
- package/dist/ast/rust/queries.js +132 -0
- package/dist/ast/rust/utils.d.ts +91 -0
- package/dist/ast/rust/utils.d.ts.map +1 -0
- package/dist/ast/rust/utils.js +254 -0
- package/dist/ast/swift/index.d.ts +10 -0
- package/dist/ast/swift/index.d.ts.map +1 -0
- package/dist/ast/swift/index.js +8 -0
- package/dist/ast/swift/parser.d.ts +31 -0
- package/dist/ast/swift/parser.d.ts.map +1 -0
- package/dist/ast/swift/parser.js +554 -0
- package/dist/ast/swift/parser.test.d.ts +5 -0
- package/dist/ast/swift/parser.test.d.ts.map +1 -0
- package/dist/ast/swift/parser.test.js +398 -0
- package/dist/ast/swift/queries.d.ts +71 -0
- package/dist/ast/swift/queries.d.ts.map +1 -0
- package/dist/ast/swift/queries.js +137 -0
- package/dist/ast/swift/utils.d.ts +94 -0
- package/dist/ast/swift/utils.d.ts.map +1 -0
- package/dist/ast/swift/utils.js +411 -0
- package/dist/ast/types.d.ts +96 -0
- package/dist/ast/types.d.ts.map +1 -0
- package/dist/ast/types.js +21 -0
- package/dist/ast/typescript.d.ts +24 -0
- package/dist/ast/typescript.d.ts.map +1 -0
- package/dist/ast/typescript.js +357 -0
- package/dist/cache/file-hash.d.ts +33 -0
- package/dist/cache/file-hash.d.ts.map +1 -0
- package/dist/cache/file-hash.js +59 -0
- package/dist/cache/index.d.ts +9 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +8 -0
- package/dist/cache/smart-cache.d.ts +68 -0
- package/dist/cache/smart-cache.d.ts.map +1 -0
- package/dist/cache/smart-cache.js +266 -0
- package/dist/cache/types.d.ts +102 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +6 -0
- package/dist/cli/analyze.d.ts +43 -0
- package/dist/cli/analyze.d.ts.map +1 -0
- package/dist/cli/analyze.js +250 -0
- package/dist/cli/doctor.d.ts +2 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +127 -0
- package/dist/cli/hooks.d.ts +14 -0
- package/dist/cli/hooks.d.ts.map +1 -0
- package/dist/cli/hooks.js +229 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +4 -0
- package/dist/cli/setup.d.ts +10 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +117 -0
- package/dist/cli/utils.d.ts +30 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +116 -0
- package/dist/compressors/config.d.ts +9 -0
- package/dist/compressors/config.d.ts.map +1 -0
- package/dist/compressors/config.js +183 -0
- package/dist/compressors/conversation.d.ts +109 -0
- package/dist/compressors/conversation.d.ts.map +1 -0
- package/dist/compressors/conversation.js +404 -0
- package/dist/compressors/diff.d.ts +35 -0
- package/dist/compressors/diff.d.ts.map +1 -0
- package/dist/compressors/diff.js +389 -0
- package/dist/compressors/generic.d.ts +9 -0
- package/dist/compressors/generic.d.ts.map +1 -0
- package/dist/compressors/generic.js +188 -0
- package/dist/compressors/index.d.ts +31 -0
- package/dist/compressors/index.d.ts.map +1 -0
- package/dist/compressors/index.js +82 -0
- package/dist/compressors/logs.d.ts +9 -0
- package/dist/compressors/logs.d.ts.map +1 -0
- package/dist/compressors/logs.js +245 -0
- package/dist/compressors/multifile.d.ts +106 -0
- package/dist/compressors/multifile.d.ts.map +1 -0
- package/dist/compressors/multifile.js +498 -0
- package/dist/compressors/semantic.d.ts +33 -0
- package/dist/compressors/semantic.d.ts.map +1 -0
- package/dist/compressors/semantic.js +233 -0
- package/dist/compressors/stacktrace.d.ts +9 -0
- package/dist/compressors/stacktrace.d.ts.map +1 -0
- package/dist/compressors/stacktrace.js +259 -0
- package/dist/compressors/types.d.ts +146 -0
- package/dist/compressors/types.d.ts.map +1 -0
- package/dist/compressors/types.js +6 -0
- package/dist/config/output-config.d.ts +56 -0
- package/dist/config/output-config.d.ts.map +1 -0
- package/dist/config/output-config.js +78 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/middleware/chain.d.ts +49 -0
- package/dist/middleware/chain.d.ts.map +1 -0
- package/dist/middleware/chain.js +126 -0
- package/dist/middleware/index.d.ts +4 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +3 -0
- package/dist/middleware/logging.d.ts +8 -0
- package/dist/middleware/logging.d.ts.map +1 -0
- package/dist/middleware/logging.js +71 -0
- package/dist/middleware/types.d.ts +58 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +7 -0
- package/dist/parsers/eslint.d.ts +8 -0
- package/dist/parsers/eslint.d.ts.map +1 -0
- package/dist/parsers/eslint.js +132 -0
- package/dist/parsers/generic.d.ts +8 -0
- package/dist/parsers/generic.d.ts.map +1 -0
- package/dist/parsers/generic.js +234 -0
- package/dist/parsers/index.d.ts +34 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +216 -0
- package/dist/parsers/types.d.ts +84 -0
- package/dist/parsers/types.d.ts.map +1 -0
- package/dist/parsers/types.js +6 -0
- package/dist/parsers/typescript.d.ts +8 -0
- package/dist/parsers/typescript.d.ts.map +1 -0
- package/dist/parsers/typescript.js +107 -0
- package/dist/pipelines/definitions.d.ts +50 -0
- package/dist/pipelines/definitions.d.ts.map +1 -0
- package/dist/pipelines/definitions.js +206 -0
- package/dist/sandbox/executor.d.ts +12 -0
- package/dist/sandbox/executor.d.ts.map +1 -0
- package/dist/sandbox/executor.js +191 -0
- package/dist/sandbox/index.d.ts +11 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +9 -0
- package/dist/sandbox/sandbox.test.d.ts +7 -0
- package/dist/sandbox/sandbox.test.d.ts.map +1 -0
- package/dist/sandbox/sandbox.test.js +202 -0
- package/dist/sandbox/sdk/analyze.d.ts +36 -0
- package/dist/sandbox/sdk/analyze.d.ts.map +1 -0
- package/dist/sandbox/sdk/analyze.js +413 -0
- package/dist/sandbox/sdk/analyze.test.d.ts +7 -0
- package/dist/sandbox/sdk/analyze.test.d.ts.map +1 -0
- package/dist/sandbox/sdk/analyze.test.js +191 -0
- package/dist/sandbox/sdk/code.d.ts +20 -0
- package/dist/sandbox/sdk/code.d.ts.map +1 -0
- package/dist/sandbox/sdk/code.js +104 -0
- package/dist/sandbox/sdk/compress.d.ts +23 -0
- package/dist/sandbox/sdk/compress.d.ts.map +1 -0
- package/dist/sandbox/sdk/compress.js +107 -0
- package/dist/sandbox/sdk/conversation.d.ts +148 -0
- package/dist/sandbox/sdk/conversation.d.ts.map +1 -0
- package/dist/sandbox/sdk/conversation.js +177 -0
- package/dist/sandbox/sdk/files.d.ts +29 -0
- package/dist/sandbox/sdk/files.d.ts.map +1 -0
- package/dist/sandbox/sdk/files.js +41 -0
- package/dist/sandbox/sdk/git.d.ts +37 -0
- package/dist/sandbox/sdk/git.d.ts.map +1 -0
- package/dist/sandbox/sdk/git.js +313 -0
- package/dist/sandbox/sdk/git.test.d.ts +8 -0
- package/dist/sandbox/sdk/git.test.d.ts.map +1 -0
- package/dist/sandbox/sdk/git.test.js +160 -0
- package/dist/sandbox/sdk/index.d.ts +16 -0
- package/dist/sandbox/sdk/index.d.ts.map +1 -0
- package/dist/sandbox/sdk/index.js +15 -0
- package/dist/sandbox/sdk/multifile.d.ts +63 -0
- package/dist/sandbox/sdk/multifile.d.ts.map +1 -0
- package/dist/sandbox/sdk/multifile.js +130 -0
- package/dist/sandbox/sdk/pipeline.d.ts +16 -0
- package/dist/sandbox/sdk/pipeline.d.ts.map +1 -0
- package/dist/sandbox/sdk/pipeline.js +454 -0
- package/dist/sandbox/sdk/pipeline.test.d.ts +7 -0
- package/dist/sandbox/sdk/pipeline.test.d.ts.map +1 -0
- package/dist/sandbox/sdk/pipeline.test.js +197 -0
- package/dist/sandbox/sdk/search.d.ts +36 -0
- package/dist/sandbox/sdk/search.d.ts.map +1 -0
- package/dist/sandbox/sdk/search.js +338 -0
- package/dist/sandbox/sdk/search.test.d.ts +7 -0
- package/dist/sandbox/sdk/search.test.d.ts.map +1 -0
- package/dist/sandbox/sdk/search.test.js +183 -0
- package/dist/sandbox/sdk/utils.d.ts +18 -0
- package/dist/sandbox/sdk/utils.d.ts.map +1 -0
- package/dist/sandbox/sdk/utils.js +24 -0
- package/dist/sandbox/security/code-analyzer.d.ts +15 -0
- package/dist/sandbox/security/code-analyzer.d.ts.map +1 -0
- package/dist/sandbox/security/code-analyzer.js +87 -0
- package/dist/sandbox/security/index.d.ts +6 -0
- package/dist/sandbox/security/index.d.ts.map +1 -0
- package/dist/sandbox/security/index.js +5 -0
- package/dist/sandbox/security/path-validator.d.ts +23 -0
- package/dist/sandbox/security/path-validator.d.ts.map +1 -0
- package/dist/sandbox/security/path-validator.js +113 -0
- package/dist/sandbox/types.d.ts +577 -0
- package/dist/sandbox/types.d.ts.map +1 -0
- package/dist/sandbox/types.js +14 -0
- package/dist/server.d.ts +36 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +133 -0
- package/dist/summarizers/build-logs.d.ts +11 -0
- package/dist/summarizers/build-logs.d.ts.map +1 -0
- package/dist/summarizers/build-logs.js +234 -0
- package/dist/summarizers/generic.d.ts +11 -0
- package/dist/summarizers/generic.d.ts.map +1 -0
- package/dist/summarizers/generic.js +93 -0
- package/dist/summarizers/index.d.ts +20 -0
- package/dist/summarizers/index.d.ts.map +1 -0
- package/dist/summarizers/index.js +43 -0
- package/dist/summarizers/server-logs.d.ts +11 -0
- package/dist/summarizers/server-logs.d.ts.map +1 -0
- package/dist/summarizers/server-logs.js +215 -0
- package/dist/summarizers/test-logs.d.ts +11 -0
- package/dist/summarizers/test-logs.d.ts.map +1 -0
- package/dist/summarizers/test-logs.js +258 -0
- package/dist/summarizers/types.d.ts +146 -0
- package/dist/summarizers/types.d.ts.map +1 -0
- package/dist/summarizers/types.js +21 -0
- package/dist/tools/analyze-build-output.d.ts +30 -0
- package/dist/tools/analyze-build-output.d.ts.map +1 -0
- package/dist/tools/analyze-build-output.js +45 -0
- package/dist/tools/analyze-context.d.ts +23 -0
- package/dist/tools/analyze-context.d.ts.map +1 -0
- package/dist/tools/analyze-context.js +78 -0
- package/dist/tools/auto-optimize.d.ts +9 -0
- package/dist/tools/auto-optimize.d.ts.map +1 -0
- package/dist/tools/auto-optimize.js +191 -0
- package/dist/tools/code-execute.d.ts +9 -0
- package/dist/tools/code-execute.d.ts.map +1 -0
- package/dist/tools/code-execute.js +84 -0
- package/dist/tools/code-skeleton.d.ts +33 -0
- package/dist/tools/code-skeleton.d.ts.map +1 -0
- package/dist/tools/code-skeleton.js +206 -0
- package/dist/tools/compress-context.d.ts +33 -0
- package/dist/tools/compress-context.d.ts.map +1 -0
- package/dist/tools/compress-context.js +64 -0
- package/dist/tools/context-budget.d.ts +43 -0
- package/dist/tools/context-budget.d.ts.map +1 -0
- package/dist/tools/context-budget.js +260 -0
- package/dist/tools/context-budget.test.d.ts +5 -0
- package/dist/tools/context-budget.test.d.ts.map +1 -0
- package/dist/tools/context-budget.test.js +219 -0
- package/dist/tools/conversation-compress.d.ts +46 -0
- package/dist/tools/conversation-compress.d.ts.map +1 -0
- package/dist/tools/conversation-compress.js +78 -0
- package/dist/tools/conversation-memory.d.ts +75 -0
- package/dist/tools/conversation-memory.d.ts.map +1 -0
- package/dist/tools/conversation-memory.js +289 -0
- package/dist/tools/deduplicate-errors.d.ts +30 -0
- package/dist/tools/deduplicate-errors.d.ts.map +1 -0
- package/dist/tools/deduplicate-errors.js +72 -0
- package/dist/tools/detect-retry-loop.d.ts +40 -0
- package/dist/tools/detect-retry-loop.d.ts.map +1 -0
- package/dist/tools/detect-retry-loop.js +212 -0
- package/dist/tools/diff-compress.d.ts +40 -0
- package/dist/tools/diff-compress.d.ts.map +1 -0
- package/dist/tools/diff-compress.js +94 -0
- package/dist/tools/discover-tools.d.ts +11 -0
- package/dist/tools/discover-tools.d.ts.map +1 -0
- package/dist/tools/discover-tools.js +163 -0
- package/dist/tools/dynamic-loader.d.ts +131 -0
- package/dist/tools/dynamic-loader.d.ts.map +1 -0
- package/dist/tools/dynamic-loader.js +378 -0
- package/dist/tools/dynamic-loader.test.d.ts +10 -0
- package/dist/tools/dynamic-loader.test.d.ts.map +1 -0
- package/dist/tools/dynamic-loader.test.js +164 -0
- package/dist/tools/lazy-mcp.d.ts +31 -0
- package/dist/tools/lazy-mcp.d.ts.map +1 -0
- package/dist/tools/lazy-mcp.js +151 -0
- package/dist/tools/lazy-mcp.test.d.ts +10 -0
- package/dist/tools/lazy-mcp.test.d.ts.map +1 -0
- package/dist/tools/lazy-mcp.test.js +172 -0
- package/dist/tools/multifile-compress.d.ts +36 -0
- package/dist/tools/multifile-compress.d.ts.map +1 -0
- package/dist/tools/multifile-compress.js +223 -0
- package/dist/tools/optimization-tips.d.ts +18 -0
- package/dist/tools/optimization-tips.d.ts.map +1 -0
- package/dist/tools/optimization-tips.js +133 -0
- package/dist/tools/registry.d.ts +70 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +169 -0
- package/dist/tools/semantic-compress.d.ts +39 -0
- package/dist/tools/semantic-compress.d.ts.map +1 -0
- package/dist/tools/semantic-compress.js +113 -0
- package/dist/tools/semantic-compress.test.d.ts +5 -0
- package/dist/tools/semantic-compress.test.d.ts.map +1 -0
- package/dist/tools/semantic-compress.test.js +182 -0
- package/dist/tools/session-stats.d.ts +34 -0
- package/dist/tools/session-stats.d.ts.map +1 -0
- package/dist/tools/session-stats.js +194 -0
- package/dist/tools/set-output-config.d.ts +38 -0
- package/dist/tools/set-output-config.d.ts.map +1 -0
- package/dist/tools/set-output-config.js +122 -0
- package/dist/tools/smart-cache-tool.d.ts +38 -0
- package/dist/tools/smart-cache-tool.d.ts.map +1 -0
- package/dist/tools/smart-cache-tool.js +224 -0
- package/dist/tools/smart-file-read.d.ts +52 -0
- package/dist/tools/smart-file-read.d.ts.map +1 -0
- package/dist/tools/smart-file-read.js +481 -0
- package/dist/tools/smart-pipeline.d.ts +40 -0
- package/dist/tools/smart-pipeline.d.ts.map +1 -0
- package/dist/tools/smart-pipeline.js +295 -0
- package/dist/tools/summarize-logs.d.ts +36 -0
- package/dist/tools/summarize-logs.d.ts.map +1 -0
- package/dist/tools/summarize-logs.js +184 -0
- package/dist/tools/token-budget.test.d.ts +11 -0
- package/dist/tools/token-budget.test.d.ts.map +1 -0
- package/dist/tools/token-budget.test.js +275 -0
- package/dist/utils/bm25.d.ts +86 -0
- package/dist/utils/bm25.d.ts.map +1 -0
- package/dist/utils/bm25.js +153 -0
- package/dist/utils/bm25.test.d.ts +5 -0
- package/dist/utils/bm25.test.d.ts.map +1 -0
- package/dist/utils/bm25.test.js +156 -0
- package/dist/utils/command-normalizer.d.ts +39 -0
- package/dist/utils/command-normalizer.d.ts.map +1 -0
- package/dist/utils/command-normalizer.js +90 -0
- package/dist/utils/content-detector.d.ts +27 -0
- package/dist/utils/content-detector.d.ts.map +1 -0
- package/dist/utils/content-detector.js +127 -0
- package/dist/utils/embeddings.d.ts +54 -0
- package/dist/utils/embeddings.d.ts.map +1 -0
- package/dist/utils/embeddings.js +97 -0
- package/dist/utils/embeddings.test.d.ts +8 -0
- package/dist/utils/embeddings.test.d.ts.map +1 -0
- package/dist/utils/embeddings.test.js +96 -0
- package/dist/utils/error-normalizer.d.ts +39 -0
- package/dist/utils/error-normalizer.d.ts.map +1 -0
- package/dist/utils/error-normalizer.js +233 -0
- package/dist/utils/hybrid-search.d.ts +79 -0
- package/dist/utils/hybrid-search.d.ts.map +1 -0
- package/dist/utils/hybrid-search.js +146 -0
- package/dist/utils/hybrid-search.test.d.ts +5 -0
- package/dist/utils/hybrid-search.test.d.ts.map +1 -0
- package/dist/utils/hybrid-search.test.js +172 -0
- package/dist/utils/index.d.ts +13 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +12 -0
- package/dist/utils/language-detector.d.ts +27 -0
- package/dist/utils/language-detector.d.ts.map +1 -0
- package/dist/utils/language-detector.js +94 -0
- package/dist/utils/log-parser.d.ts +46 -0
- package/dist/utils/log-parser.d.ts.map +1 -0
- package/dist/utils/log-parser.js +287 -0
- package/dist/utils/output-estimator.d.ts +54 -0
- package/dist/utils/output-estimator.d.ts.map +1 -0
- package/dist/utils/output-estimator.js +119 -0
- package/dist/utils/output-estimator.test.d.ts +5 -0
- package/dist/utils/output-estimator.test.d.ts.map +1 -0
- package/dist/utils/output-estimator.test.js +115 -0
- package/dist/utils/output-similarity.d.ts +48 -0
- package/dist/utils/output-similarity.d.ts.map +1 -0
- package/dist/utils/output-similarity.js +140 -0
- package/dist/utils/project-detector.d.ts +16 -0
- package/dist/utils/project-detector.d.ts.map +1 -0
- package/dist/utils/project-detector.js +119 -0
- package/dist/utils/segment-scorer.d.ts +99 -0
- package/dist/utils/segment-scorer.d.ts.map +1 -0
- package/dist/utils/segment-scorer.js +148 -0
- package/dist/utils/signature-grouper.d.ts +58 -0
- package/dist/utils/signature-grouper.d.ts.map +1 -0
- package/dist/utils/signature-grouper.js +185 -0
- package/dist/utils/tfidf.d.ts +45 -0
- package/dist/utils/tfidf.d.ts.map +1 -0
- package/dist/utils/tfidf.js +204 -0
- package/dist/utils/tfidf.test.d.ts +5 -0
- package/dist/utils/tfidf.test.d.ts.map +1 -0
- package/dist/utils/tfidf.test.js +115 -0
- package/dist/utils/token-counter.d.ts +35 -0
- package/dist/utils/token-counter.d.ts.map +1 -0
- package/dist/utils/token-counter.js +83 -0
- package/dist/utils/toon-serializer.d.ts +120 -0
- package/dist/utils/toon-serializer.d.ts.map +1 -0
- package/dist/utils/toon-serializer.js +472 -0
- package/dist/utils/toon-serializer.test.d.ts +7 -0
- package/dist/utils/toon-serializer.test.d.ts.map +1 -0
- package/dist/utils/toon-serializer.test.js +290 -0
- package/package.json +63 -0
- package/scripts/install.ps1 +133 -0
- package/scripts/install.sh +183 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"output-estimator.test.d.ts","sourceRoot":"","sources":["../../src/utils/output-estimator.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|