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,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Budget Tool Tests
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from "vitest";
|
|
5
|
+
import { executeContextBudget } from "./context-budget.js";
|
|
6
|
+
describe("context_budget tool", () => {
|
|
7
|
+
describe("basic estimation", () => {
|
|
8
|
+
it("should count input tokens", async () => {
|
|
9
|
+
const content = "Hello, world! This is a test message.";
|
|
10
|
+
const result = await executeContextBudget({ content });
|
|
11
|
+
expect(result.isError).toBeFalsy();
|
|
12
|
+
const text = result.content[0].text;
|
|
13
|
+
expect(text).toContain("Input Tokens");
|
|
14
|
+
expect(text).toContain("Context Budget Analysis");
|
|
15
|
+
});
|
|
16
|
+
it("should estimate output tokens", async () => {
|
|
17
|
+
const content = "What is the difference between let and const in JavaScript?";
|
|
18
|
+
const result = await executeContextBudget({ content });
|
|
19
|
+
expect(result.isError).toBeFalsy();
|
|
20
|
+
const text = result.content[0].text;
|
|
21
|
+
expect(text).toContain("Estimated Output");
|
|
22
|
+
});
|
|
23
|
+
it("should calculate total tokens", async () => {
|
|
24
|
+
const content = "Explain how async/await works.";
|
|
25
|
+
const result = await executeContextBudget({ content });
|
|
26
|
+
const text = result.content[0].text;
|
|
27
|
+
expect(text).toContain("Total Estimated");
|
|
28
|
+
});
|
|
29
|
+
it("should show estimated cost", async () => {
|
|
30
|
+
const content = "Create a function that sorts an array.";
|
|
31
|
+
const result = await executeContextBudget({ content });
|
|
32
|
+
const text = result.content[0].text;
|
|
33
|
+
expect(text).toContain("Estimated Cost");
|
|
34
|
+
expect(text).toContain("$");
|
|
35
|
+
});
|
|
36
|
+
it("should show context usage percentage", async () => {
|
|
37
|
+
const content = "Short prompt.";
|
|
38
|
+
const result = await executeContextBudget({ content });
|
|
39
|
+
const text = result.content[0].text;
|
|
40
|
+
expect(text).toContain("Context Usage");
|
|
41
|
+
expect(text).toContain("%");
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe("model selection", () => {
|
|
45
|
+
it("should use default model when not specified", async () => {
|
|
46
|
+
const content = "Test content";
|
|
47
|
+
const result = await executeContextBudget({ content });
|
|
48
|
+
const text = result.content[0].text;
|
|
49
|
+
expect(text).toContain("Claude Sonnet 4");
|
|
50
|
+
});
|
|
51
|
+
it("should use specified model", async () => {
|
|
52
|
+
const content = "Test content";
|
|
53
|
+
const result = await executeContextBudget({ content, model: "claude-opus-4-20250514" });
|
|
54
|
+
const text = result.content[0].text;
|
|
55
|
+
expect(text).toContain("Claude Opus 4");
|
|
56
|
+
});
|
|
57
|
+
it("should accept haiku model", async () => {
|
|
58
|
+
const content = "Test content";
|
|
59
|
+
const result = await executeContextBudget({ content, model: "claude-3-5-haiku-20241022" });
|
|
60
|
+
const text = result.content[0].text;
|
|
61
|
+
expect(text).toContain("Claude 3.5 Haiku");
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
describe("budget checking", () => {
|
|
65
|
+
it("should report within budget when tokens are under limit", async () => {
|
|
66
|
+
const content = "Short content";
|
|
67
|
+
const result = await executeContextBudget({ content, budgetTokens: 10000 });
|
|
68
|
+
const text = result.content[0].text;
|
|
69
|
+
expect(text).toContain("Within Budget");
|
|
70
|
+
expect(text).toContain("remaining");
|
|
71
|
+
});
|
|
72
|
+
it("should report over budget when tokens exceed limit", async () => {
|
|
73
|
+
// Create content that will exceed a small budget
|
|
74
|
+
const content = Array(100).fill("This is a test sentence.").join(" ");
|
|
75
|
+
const result = await executeContextBudget({ content, budgetTokens: 100 });
|
|
76
|
+
const text = result.content[0].text;
|
|
77
|
+
expect(text).toContain("OVER BUDGET");
|
|
78
|
+
expect(text).toContain("over");
|
|
79
|
+
});
|
|
80
|
+
it("should not show budget status when no budget specified", async () => {
|
|
81
|
+
const content = "Test content";
|
|
82
|
+
const result = await executeContextBudget({ content });
|
|
83
|
+
const text = result.content[0].text;
|
|
84
|
+
expect(text).not.toContain("Budget Status");
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe("recommendations", () => {
|
|
88
|
+
it("should recommend smart_file_read for code content", async () => {
|
|
89
|
+
// Create varied code content (not repetitive) with enough tokens
|
|
90
|
+
const content = `
|
|
91
|
+
function processData(data) {
|
|
92
|
+
const result = data.map(item => item * 2);
|
|
93
|
+
return result.filter(x => x > 10);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
class DataProcessor {
|
|
97
|
+
constructor() {
|
|
98
|
+
this.cache = new Map();
|
|
99
|
+
this.timeout = 5000;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async process(input) {
|
|
103
|
+
if (this.cache.has(input)) {
|
|
104
|
+
return this.cache.get(input);
|
|
105
|
+
}
|
|
106
|
+
const result = await this.transform(input);
|
|
107
|
+
this.cache.set(input, result);
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
transform(value) {
|
|
112
|
+
return value.toString().toUpperCase();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const handler = async (req, res) => {
|
|
117
|
+
try {
|
|
118
|
+
const data = await req.json();
|
|
119
|
+
const processor = new DataProcessor();
|
|
120
|
+
const result = await processor.process(data);
|
|
121
|
+
return res.json({ success: true, data: result });
|
|
122
|
+
} catch (error) {
|
|
123
|
+
console.error('Error processing request:', error);
|
|
124
|
+
return res.json({ success: false, error: error.message });
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
export { processData, DataProcessor, handler };
|
|
129
|
+
`;
|
|
130
|
+
const result = await executeContextBudget({ content });
|
|
131
|
+
const text = result.content[0].text;
|
|
132
|
+
// Should have code-related recommendations
|
|
133
|
+
expect(text).toContain("Optimization Recommendations");
|
|
134
|
+
});
|
|
135
|
+
it("should recommend summarize_logs for log content", async () => {
|
|
136
|
+
const content = `
|
|
137
|
+
[2025-12-23 10:00:00] INFO: Server started on port 3000
|
|
138
|
+
[2025-12-23 10:00:01] DEBUG: Loading configuration
|
|
139
|
+
[2025-12-23 10:00:02] INFO: Database connected
|
|
140
|
+
[2025-12-23 10:00:03] WARN: Cache miss for key xyz
|
|
141
|
+
`.repeat(20);
|
|
142
|
+
const result = await executeContextBudget({ content });
|
|
143
|
+
const text = result.content[0].text;
|
|
144
|
+
expect(text).toContain("summarize_logs");
|
|
145
|
+
});
|
|
146
|
+
it("should recommend deduplicate_errors for repeated errors", async () => {
|
|
147
|
+
const content = Array(30)
|
|
148
|
+
.fill("Error: Connection refused at Database.connect()")
|
|
149
|
+
.join("\n");
|
|
150
|
+
const result = await executeContextBudget({ content });
|
|
151
|
+
const text = result.content[0].text;
|
|
152
|
+
expect(text).toContain("deduplicate_errors");
|
|
153
|
+
});
|
|
154
|
+
it("should recommend semantic_compress for long prose", async () => {
|
|
155
|
+
const content = Array(200)
|
|
156
|
+
.fill("This is a paragraph of text explaining something in detail.")
|
|
157
|
+
.join(" ");
|
|
158
|
+
const result = await executeContextBudget({ content });
|
|
159
|
+
const text = result.content[0].text;
|
|
160
|
+
expect(text).toContain("semantic_compress");
|
|
161
|
+
});
|
|
162
|
+
it("should show potential savings percentage", async () => {
|
|
163
|
+
const content = Array(50)
|
|
164
|
+
.fill("[INFO] Processing request from client")
|
|
165
|
+
.join("\n");
|
|
166
|
+
const result = await executeContextBudget({ content });
|
|
167
|
+
const text = result.content[0].text;
|
|
168
|
+
expect(text).toContain("Potential Savings");
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
describe("output estimation toggle", () => {
|
|
172
|
+
it("should include output estimation by default", async () => {
|
|
173
|
+
const content = "What is TypeScript?";
|
|
174
|
+
const result = await executeContextBudget({ content });
|
|
175
|
+
const text = result.content[0].text;
|
|
176
|
+
// Estimated Output should be > 0
|
|
177
|
+
expect(text).toMatch(/Estimated Output \| [1-9]/);
|
|
178
|
+
});
|
|
179
|
+
it("should exclude output estimation when disabled", async () => {
|
|
180
|
+
const content = "What is TypeScript?";
|
|
181
|
+
const result = await executeContextBudget({ content, includeEstimatedOutput: false });
|
|
182
|
+
const text = result.content[0].text;
|
|
183
|
+
// Estimated Output should be 0
|
|
184
|
+
expect(text).toContain("Estimated Output | 0");
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
describe("input validation", () => {
|
|
188
|
+
it("should reject empty content", async () => {
|
|
189
|
+
const result = await executeContextBudget({ content: "" });
|
|
190
|
+
expect(result.isError).toBe(true);
|
|
191
|
+
expect(result.content[0].text).toContain("Invalid input");
|
|
192
|
+
});
|
|
193
|
+
it("should reject invalid model", async () => {
|
|
194
|
+
const result = await executeContextBudget({ content: "test", model: "invalid-model" });
|
|
195
|
+
expect(result.isError).toBe(true);
|
|
196
|
+
});
|
|
197
|
+
it("should reject budget below minimum", async () => {
|
|
198
|
+
const result = await executeContextBudget({ content: "test", budgetTokens: 49 });
|
|
199
|
+
expect(result.isError).toBe(true);
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
describe("auto-optimize availability", () => {
|
|
203
|
+
it("should indicate auto-optimize available for large optimizable content", async () => {
|
|
204
|
+
const content = Array(100)
|
|
205
|
+
.fill("[ERROR] Failed to connect")
|
|
206
|
+
.join("\n");
|
|
207
|
+
const result = await executeContextBudget({ content });
|
|
208
|
+
const text = result.content[0].text;
|
|
209
|
+
expect(text).toContain("auto_optimize");
|
|
210
|
+
});
|
|
211
|
+
it("should not show auto-optimize tip for small content", async () => {
|
|
212
|
+
const content = "Short content here";
|
|
213
|
+
const result = await executeContextBudget({ content });
|
|
214
|
+
const text = result.content[0].text;
|
|
215
|
+
// Small content shouldn't trigger the tip
|
|
216
|
+
expect(text).not.toContain("Tip: Use `auto_optimize`");
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation Compress Tool
|
|
3
|
+
*
|
|
4
|
+
* MCP tool for compressing conversation history to reduce tokens
|
|
5
|
+
* while preserving key information.
|
|
6
|
+
*/
|
|
7
|
+
import type { ToolDefinition } from "./registry.js";
|
|
8
|
+
export declare const conversationCompressSchema: {
|
|
9
|
+
type: "object";
|
|
10
|
+
properties: {
|
|
11
|
+
messages: {
|
|
12
|
+
type: string;
|
|
13
|
+
items: {
|
|
14
|
+
properties: {
|
|
15
|
+
role: {
|
|
16
|
+
enum: string[];
|
|
17
|
+
};
|
|
18
|
+
content: {
|
|
19
|
+
type: string;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
strategy: {
|
|
25
|
+
enum: string[];
|
|
26
|
+
};
|
|
27
|
+
maxTokens: {
|
|
28
|
+
type: string;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
required: string[];
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Execute conversation compression
|
|
35
|
+
*/
|
|
36
|
+
export declare function executeConversationCompress(args: unknown): Promise<{
|
|
37
|
+
content: Array<{
|
|
38
|
+
type: "text";
|
|
39
|
+
text: string;
|
|
40
|
+
}>;
|
|
41
|
+
}>;
|
|
42
|
+
/**
|
|
43
|
+
* Conversation Compress Tool Definition
|
|
44
|
+
*/
|
|
45
|
+
export declare const conversationCompressTool: ToolDefinition;
|
|
46
|
+
//# sourceMappingURL=conversation-compress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-compress.d.ts","sourceRoot":"","sources":["../../src/tools/conversation-compress.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAOpD,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;CAatC,CAAC;AAgBF;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAiC7D;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,cAMtC,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation Compress Tool
|
|
3
|
+
*
|
|
4
|
+
* MCP tool for compressing conversation history to reduce tokens
|
|
5
|
+
* while preserving key information.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
import { compressConversation, } from "../compressors/conversation.js";
|
|
9
|
+
// Minimal schema - preserveSystem/preserveLastN rarely changed
|
|
10
|
+
export const conversationCompressSchema = {
|
|
11
|
+
type: "object",
|
|
12
|
+
properties: {
|
|
13
|
+
messages: {
|
|
14
|
+
type: "array",
|
|
15
|
+
items: {
|
|
16
|
+
properties: { role: { enum: ["user", "assistant", "system"] }, content: { type: "string" } },
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
strategy: { enum: ["rolling-summary", "key-extraction", "hybrid"] },
|
|
20
|
+
maxTokens: { type: "number" },
|
|
21
|
+
},
|
|
22
|
+
required: ["messages", "strategy", "maxTokens"],
|
|
23
|
+
};
|
|
24
|
+
// Zod schema for validation
|
|
25
|
+
const messageSchema = z.object({
|
|
26
|
+
role: z.enum(["user", "assistant", "system"]),
|
|
27
|
+
content: z.string(),
|
|
28
|
+
});
|
|
29
|
+
const inputSchema = z.object({
|
|
30
|
+
messages: z.array(messageSchema),
|
|
31
|
+
strategy: z.enum(["rolling-summary", "key-extraction", "hybrid"]),
|
|
32
|
+
maxTokens: z.number().positive(),
|
|
33
|
+
preserveSystem: z.boolean().optional().default(true),
|
|
34
|
+
preserveLastN: z.number().min(0).optional().default(2),
|
|
35
|
+
});
|
|
36
|
+
/**
|
|
37
|
+
* Execute conversation compression
|
|
38
|
+
*/
|
|
39
|
+
export async function executeConversationCompress(args) {
|
|
40
|
+
const input = inputSchema.parse(args);
|
|
41
|
+
// Validate input
|
|
42
|
+
if (input.messages.length === 0) {
|
|
43
|
+
return {
|
|
44
|
+
content: [
|
|
45
|
+
{
|
|
46
|
+
type: "text",
|
|
47
|
+
text: "No messages to compress.",
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// Perform compression
|
|
53
|
+
const result = compressConversation(input.messages, {
|
|
54
|
+
strategy: input.strategy,
|
|
55
|
+
maxTokens: input.maxTokens,
|
|
56
|
+
preserveSystem: input.preserveSystem,
|
|
57
|
+
preserveLastN: input.preserveLastN,
|
|
58
|
+
});
|
|
59
|
+
// Minimal header
|
|
60
|
+
const header = `[conversation] ${result.originalTokens}→${result.compressedTokens} tokens (-${result.savings}%), ${input.messages.length}→${result.compressedMessages.length} msgs`;
|
|
61
|
+
// Compact output
|
|
62
|
+
const parts = [header];
|
|
63
|
+
if (result.summary)
|
|
64
|
+
parts.push(result.summary);
|
|
65
|
+
if (result.keyPoints?.length)
|
|
66
|
+
parts.push(result.keyPoints.map(p => `• ${p}`).join("\n"));
|
|
67
|
+
parts.push(JSON.stringify(result.compressedMessages));
|
|
68
|
+
return { content: [{ type: "text", text: parts.join("\n") }] };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Conversation Compress Tool Definition
|
|
72
|
+
*/
|
|
73
|
+
export const conversationCompressTool = {
|
|
74
|
+
name: "conversation_compress",
|
|
75
|
+
description: "Compress chat history. Strategies: rolling-summary, key-extraction, hybrid.",
|
|
76
|
+
inputSchema: conversationCompressSchema,
|
|
77
|
+
execute: executeConversationCompress,
|
|
78
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation Memory Tool
|
|
3
|
+
*
|
|
4
|
+
* Manages long conversation context with decision extraction
|
|
5
|
+
* and context restoration capabilities.
|
|
6
|
+
*/
|
|
7
|
+
import type { ToolDefinition } from "./registry.js";
|
|
8
|
+
import { type ConversationMemory } from "../compressors/conversation.js";
|
|
9
|
+
export declare const conversationMemorySchema: {
|
|
10
|
+
type: "object";
|
|
11
|
+
properties: {
|
|
12
|
+
action: {
|
|
13
|
+
type: string;
|
|
14
|
+
enum: string[];
|
|
15
|
+
description: string;
|
|
16
|
+
};
|
|
17
|
+
messages: {
|
|
18
|
+
type: string;
|
|
19
|
+
items: {
|
|
20
|
+
type: string;
|
|
21
|
+
properties: {
|
|
22
|
+
role: {
|
|
23
|
+
type: string;
|
|
24
|
+
enum: string[];
|
|
25
|
+
};
|
|
26
|
+
content: {
|
|
27
|
+
type: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
required: string[];
|
|
31
|
+
};
|
|
32
|
+
description: string;
|
|
33
|
+
};
|
|
34
|
+
strategy: {
|
|
35
|
+
type: string;
|
|
36
|
+
enum: string[];
|
|
37
|
+
description: string;
|
|
38
|
+
};
|
|
39
|
+
maxTokens: {
|
|
40
|
+
type: string;
|
|
41
|
+
description: string;
|
|
42
|
+
};
|
|
43
|
+
preserveLastN: {
|
|
44
|
+
type: string;
|
|
45
|
+
description: string;
|
|
46
|
+
};
|
|
47
|
+
includeSummary: {
|
|
48
|
+
type: string;
|
|
49
|
+
description: string;
|
|
50
|
+
};
|
|
51
|
+
includeDecisions: {
|
|
52
|
+
type: string;
|
|
53
|
+
description: string;
|
|
54
|
+
};
|
|
55
|
+
includeCodeRefs: {
|
|
56
|
+
type: string;
|
|
57
|
+
description: string;
|
|
58
|
+
};
|
|
59
|
+
recentMessages: {
|
|
60
|
+
type: string;
|
|
61
|
+
description: string;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
required: string[];
|
|
65
|
+
};
|
|
66
|
+
export declare const conversationMemoryTool: ToolDefinition;
|
|
67
|
+
/**
|
|
68
|
+
* Get current session memory (for SDK use)
|
|
69
|
+
*/
|
|
70
|
+
export declare function getSessionMemory(): ConversationMemory | null;
|
|
71
|
+
/**
|
|
72
|
+
* Set session memory (for SDK use)
|
|
73
|
+
*/
|
|
74
|
+
export declare function setSessionMemory(memory: ConversationMemory | null): void;
|
|
75
|
+
//# sourceMappingURL=conversation-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-memory.d.ts","sourceRoot":"","sources":["../../src/tools/conversation-memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAOL,KAAK,kBAAkB,EACxB,MAAM,gCAAgC,CAAC;AAWxC,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDpC,CAAC;AAyPF,eAAO,MAAM,sBAAsB,EAAE,cAMpC,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,kBAAkB,GAAG,IAAI,CAE5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAExE"}
|