codepage-bridge-mcp 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,11 @@
1
+ export interface GrepLimits {
2
+ maxScanBytes: number;
3
+ maxFiles: number;
4
+ maxDurationMs: number;
5
+ maxLineChars: number;
6
+ maxContextLines: number;
7
+ maxOnlyMatches: number;
8
+ }
9
+ export declare function grepLimits(): GrepLimits;
1
10
  export declare function maxTextFileBytes(): number;
2
11
  export declare function formatMebibytes(bytes: number): string;
@@ -1,11 +1,37 @@
1
1
  const BYTES_PER_MEBIBYTE = 1024 * 1024;
2
2
  const DEFAULT_MAX_TEXT_FILE_MEBIBYTES = 32;
3
+ const DEFAULT_GREP_MAX_SCAN_BYTES = 256 * BYTES_PER_MEBIBYTE;
4
+ const DEFAULT_GREP_MAX_FILES = 10_000;
5
+ const DEFAULT_GREP_MAX_DURATION_MS = 30_000;
6
+ const DEFAULT_GREP_MAX_LINE_CHARS = 16 * BYTES_PER_MEBIBYTE;
7
+ const DEFAULT_GREP_MAX_CONTEXT_LINES = 10_000;
8
+ const DEFAULT_GREP_MAX_ONLY_MATCHES = 100_000;
3
9
  function parsePositiveInteger(value) {
4
10
  if (value === undefined || !/^\d+$/.test(value))
5
11
  return undefined;
6
12
  const parsed = Number(value);
7
13
  return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;
8
14
  }
15
+ function configuredPositiveInteger(name, fallback) {
16
+ const value = process.env[name];
17
+ if (value === undefined)
18
+ return fallback;
19
+ const parsed = parsePositiveInteger(value);
20
+ if (parsed === undefined) {
21
+ throw new Error(`${name} must be a positive safe integer when set`);
22
+ }
23
+ return parsed;
24
+ }
25
+ export function grepLimits() {
26
+ return {
27
+ maxScanBytes: configuredPositiveInteger('CODEPAGE_BRIDGE_MAX_GREP_SCAN_BYTES', DEFAULT_GREP_MAX_SCAN_BYTES),
28
+ maxFiles: configuredPositiveInteger('CODEPAGE_BRIDGE_MAX_GREP_FILES', DEFAULT_GREP_MAX_FILES),
29
+ maxDurationMs: configuredPositiveInteger('CODEPAGE_BRIDGE_MAX_GREP_DURATION_MS', DEFAULT_GREP_MAX_DURATION_MS),
30
+ maxLineChars: configuredPositiveInteger('CODEPAGE_BRIDGE_MAX_GREP_LINE_CHARS', DEFAULT_GREP_MAX_LINE_CHARS),
31
+ maxContextLines: configuredPositiveInteger('CODEPAGE_BRIDGE_MAX_GREP_CONTEXT_LINES', DEFAULT_GREP_MAX_CONTEXT_LINES),
32
+ maxOnlyMatches: configuredPositiveInteger('CODEPAGE_BRIDGE_MAX_GREP_ONLY_MATCHES', DEFAULT_GREP_MAX_ONLY_MATCHES),
33
+ };
34
+ }
9
35
  export function maxTextFileBytes() {
10
36
  const mebibytes = parsePositiveInteger(process.env.CODEPAGE_BRIDGE_MAX_TEXT_FILE_MIB)
11
37
  ?? DEFAULT_MAX_TEXT_FILE_MEBIBYTES;
@@ -1 +1 @@
1
- {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/limits.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAAA;AACtC,MAAM,+BAA+B,GAAG,EAAE,CAAA;AAE1C,SAAS,oBAAoB,CAAC,KAAyB;IACrD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5B,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC;WAChF,+BAA+B,CAAA;IACpC,OAAO,SAAS,GAAG,kBAAkB,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,GAAG,KAAK,GAAG,kBAAkB,MAAM,CAAA;AAC5C,CAAC"}
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/limits.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAAA;AACtC,MAAM,+BAA+B,GAAG,EAAE,CAAA;AAE1C,MAAM,2BAA2B,GAAG,GAAG,GAAG,kBAAkB,CAAA;AAC5D,MAAM,sBAAsB,GAAG,MAAM,CAAA;AACrC,MAAM,4BAA4B,GAAG,MAAM,CAAA;AAC3C,MAAM,2BAA2B,GAAG,EAAE,GAAG,kBAAkB,CAAA;AAC3D,MAAM,8BAA8B,GAAG,MAAM,CAAA;AAC7C,MAAM,6BAA6B,GAAG,OAAO,CAAA;AAE7C,SAAS,oBAAoB,CAAC,KAAyB;IACrD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5B,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;AACxE,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAY,EAAE,QAAgB;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC/B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAA;IACxC,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAA;IAC1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,2CAA2C,CAAC,CAAA;IACrE,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAWD,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,YAAY,EAAE,yBAAyB,CAAC,qCAAqC,EAAE,2BAA2B,CAAC;QAC3G,QAAQ,EAAE,yBAAyB,CAAC,gCAAgC,EAAE,sBAAsB,CAAC;QAC7F,aAAa,EAAE,yBAAyB,CAAC,sCAAsC,EAAE,4BAA4B,CAAC;QAC9G,YAAY,EAAE,yBAAyB,CAAC,qCAAqC,EAAE,2BAA2B,CAAC;QAC3G,eAAe,EAAE,yBAAyB,CAAC,wCAAwC,EAAE,8BAA8B,CAAC;QACpH,cAAc,EAAE,yBAAyB,CAAC,uCAAuC,EAAE,6BAA6B,CAAC;KAClH,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC;WAChF,+BAA+B,CAAA;IACpC,OAAO,SAAS,GAAG,kBAAkB,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,GAAG,KAAK,GAAG,kBAAkB,MAAM,CAAA;AAC5C,CAAC"}
@@ -5,4 +5,4 @@ export declare const READ_PROMPT = "Reads a file from the local filesystem. You
5
5
  export declare const EDIT_PROMPT = "Performs exact string replacements in files.\n\nUsage:\n- You must use your `Read` tool at least once in the conversation before editing. This tool will error if you attempt an edit without reading the file.\n- When editing text from Read tool output, ensure you preserve the exact indentation (tabs/spaces) as it appears AFTER the line number prefix. The line number prefix format is: line number + tab. Everything after that is the actual file content to match. Never include any part of the line number prefix in the old_string or new_string.\n- ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.\n- Only use emojis if the user explicitly requests it. Avoid adding emojis to files unless asked.\n- The edit will FAIL if `old_string` is not unique in the file. Either provide a larger string with more surrounding context to make it unique or use `replace_all` to change every instance of `old_string`.\n- Use `replace_all` for replacing and renaming strings across the file. This parameter is useful if you want to rename a variable for instance.";
6
6
  export declare const WRITE_PROMPT = "Writes a file to the local filesystem.\n\nUsage:\n- This tool will overwrite the existing file if there is one at the provided path.\n- If this is an existing file, you MUST use the Read tool first to read the file's contents. This tool will fail if you did not read the file first.\n- Prefer the Edit tool for modifying existing files \u2014 it only sends the diff. Only use this tool to create new files or for complete rewrites.\n- NEVER create documentation files (*.md) or README files unless explicitly requested by the User.\n- Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked.";
7
7
  export declare const GREP_DESCRIPTION = "A powerful search tool built on regular expressions.";
8
- export declare const GREP_PROMPT = "A powerful search tool for file contents.\n\nUsage:\n- ALWAYS use Grep for search tasks. NEVER invoke grep or rg as a Bash command.\n- Supports full regular expressions, file glob filters, file type filters, context lines, match-only output, multiline matching, pagination, file lists, and per-file counts.\n- Use output_mode=files_with_matches when you only need file paths; this is the default.\n- Use output_mode=content to see matching lines. Line numbers are included by default.\n- Use output_mode=count to see match counts per file.\n- Results are limited to 250 entries by default; use head_limit and offset for pagination.\n- Every file is decoded according to its nearest project .encoding-rules, so legacy encoded content is searched as Unicode transparently.";
8
+ export declare const GREP_PROMPT = "A powerful search tool for file contents.\n\nUsage:\n- ALWAYS use Grep for search tasks. NEVER invoke grep or rg as a Bash command.\n- Supports full regular expressions, file glob filters, file type filters, context lines, match-only output, multiline matching, pagination, file lists, and per-file counts.\n- Use output_mode=files_with_matches when you only need file paths; this is the default.\n- Use output_mode=content to see matching lines. Line numbers are included by default.\n- Use output_mode=count to see match counts per file.\n- scan_mode=exact is the default: pagination never stops scanning, so counts are exact when scanComplete is true. scan_mode=fast is opt-in and only valid for files_with_matches; it stops each matching file at its first match and reports countsExact=false.\n- Results are limited to 250 entries by default; use head_limit and offset for pagination. Check structuredContent scanComplete, truncationReason, and outputTruncated whenever a search is resource-limited.\n- Every file is decoded according to its nearest project .encoding-rules, so legacy encoded content is searched as Unicode transparently.";
@@ -41,6 +41,7 @@ Usage:
41
41
  - Use output_mode=files_with_matches when you only need file paths; this is the default.
42
42
  - Use output_mode=content to see matching lines. Line numbers are included by default.
43
43
  - Use output_mode=count to see match counts per file.
44
- - Results are limited to 250 entries by default; use head_limit and offset for pagination.
44
+ - scan_mode=exact is the default: pagination never stops scanning, so counts are exact when scanComplete is true. scan_mode=fast is opt-in and only valid for files_with_matches; it stops each matching file at its first match and reports countsExact=false.
45
+ - Results are limited to 250 entries by default; use head_limit and offset for pagination. Check structuredContent scanComplete, truncationReason, and outputTruncated whenever a search is resource-limited.
45
46
  - Every file is decoded according to its nearest project .encoding-rules, so legacy encoded content is searched as Unicode transparently.`;
46
47
  //# sourceMappingURL=prompts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/prompts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,wCAAwC,CAAA;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,8CAA8C,CAAA;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,uCAAuC,CAAA;AAExE,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;8HAamG,CAAA;AAE9H,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;kJAQuH,CAAA;AAElJ,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;kGAOsE,CAAA;AAElG,MAAM,CAAC,MAAM,gBAAgB,GAAG,sDAAsD,CAAA;AACtF,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;0IAS+G,CAAA"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/prompts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,wCAAwC,CAAA;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,8CAA8C,CAAA;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,uCAAuC,CAAA;AAExE,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;8HAamG,CAAA;AAE9H,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;kJAQuH,CAAA;AAElJ,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;kGAOsE,CAAA;AAElG,MAAM,CAAC,MAAM,gBAAgB,GAAG,sDAAsD,CAAA;AACtF,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;0IAU+G,CAAA"}
@@ -88,6 +88,12 @@ export declare const grepInputSchema: {
88
88
  readonly enum: readonly ["content", "files_with_matches", "count"];
89
89
  readonly description: "Output mode. Defaults to files_with_matches.";
90
90
  };
91
+ readonly scan_mode: {
92
+ readonly type: "string";
93
+ readonly enum: readonly ["exact", "fast"];
94
+ readonly default: "exact";
95
+ readonly description: "exact scans all eligible files and returns exact counts when complete. fast is opt-in for files_with_matches only and stops each matching file after its first match, so counts are not exact.";
96
+ };
91
97
  readonly '-i': {
92
98
  readonly type: "boolean";
93
99
  readonly description: "Case-insensitive search";
@@ -66,6 +66,7 @@ export const grepInputSchema = {
66
66
  glob: { type: 'string', description: 'Glob pattern used to filter files, for example *.js or **/*.ts' },
67
67
  type: { type: 'string', description: 'File type filter such as js, ts, py, rust, go, or java' },
68
68
  output_mode: { type: 'string', enum: ['content', 'files_with_matches', 'count'], description: 'Output mode. Defaults to files_with_matches.' },
69
+ scan_mode: { type: 'string', enum: ['exact', 'fast'], default: 'exact', description: 'exact scans all eligible files and returns exact counts when complete. fast is opt-in for files_with_matches only and stops each matching file after its first match, so counts are not exact.' },
69
70
  '-i': { type: 'boolean', description: 'Case-insensitive search' },
70
71
  '-n': { type: 'boolean', description: 'Show line numbers in content mode. Defaults to true.' },
71
72
  '-o': { type: 'boolean', description: 'Print only matching non-empty parts of each line' },
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/schemas.ts"],"names":[],"mappings":"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"}
@@ -79,7 +79,7 @@ export declare const toolDefinitions: readonly [{
79
79
  }, {
80
80
  readonly name: "Grep";
81
81
  readonly title: "A powerful search tool built on regular expressions.";
82
- readonly description: "A powerful search tool for file contents.\n\nUsage:\n- ALWAYS use Grep for search tasks. NEVER invoke grep or rg as a Bash command.\n- Supports full regular expressions, file glob filters, file type filters, context lines, match-only output, multiline matching, pagination, file lists, and per-file counts.\n- Use output_mode=files_with_matches when you only need file paths; this is the default.\n- Use output_mode=content to see matching lines. Line numbers are included by default.\n- Use output_mode=count to see match counts per file.\n- Results are limited to 250 entries by default; use head_limit and offset for pagination.\n- Every file is decoded according to its nearest project .encoding-rules, so legacy encoded content is searched as Unicode transparently.";
82
+ readonly description: "A powerful search tool for file contents.\n\nUsage:\n- ALWAYS use Grep for search tasks. NEVER invoke grep or rg as a Bash command.\n- Supports full regular expressions, file glob filters, file type filters, context lines, match-only output, multiline matching, pagination, file lists, and per-file counts.\n- Use output_mode=files_with_matches when you only need file paths; this is the default.\n- Use output_mode=content to see matching lines. Line numbers are included by default.\n- Use output_mode=count to see match counts per file.\n- scan_mode=exact is the default: pagination never stops scanning, so counts are exact when scanComplete is true. scan_mode=fast is opt-in and only valid for files_with_matches; it stops each matching file at its first match and reports countsExact=false.\n- Results are limited to 250 entries by default; use head_limit and offset for pagination. Check structuredContent scanComplete, truncationReason, and outputTruncated whenever a search is resource-limited.\n- Every file is decoded according to its nearest project .encoding-rules, so legacy encoded content is searched as Unicode transparently.";
83
83
  readonly inputSchema: {
84
84
  readonly type: "object";
85
85
  readonly additionalProperties: false;
@@ -106,6 +106,12 @@ export declare const toolDefinitions: readonly [{
106
106
  readonly enum: readonly ["content", "files_with_matches", "count"];
107
107
  readonly description: "Output mode. Defaults to files_with_matches.";
108
108
  };
109
+ readonly scan_mode: {
110
+ readonly type: "string";
111
+ readonly enum: readonly ["exact", "fast"];
112
+ readonly default: "exact";
113
+ readonly description: "exact scans all eligible files and returns exact counts when complete. fast is opt-in for files_with_matches only and stops each matching file after its first match, so counts are not exact.";
114
+ };
109
115
  readonly '-i': {
110
116
  readonly type: "boolean";
111
117
  readonly description: "Case-insensitive search";
@@ -1,11 +1,13 @@
1
1
  import type { ToolResponse } from '../toolTypes.js';
2
2
  export type GrepOutputMode = 'content' | 'files_with_matches' | 'count';
3
+ export type GrepScanMode = 'exact' | 'fast';
3
4
  export interface GrepInput {
4
5
  pattern: string;
5
6
  path?: string;
6
7
  glob?: string;
7
8
  type?: string;
8
9
  output_mode?: GrepOutputMode;
10
+ scan_mode?: GrepScanMode;
9
11
  '-i'?: boolean;
10
12
  '-n'?: boolean;
11
13
  '-o'?: boolean;
@@ -1,13 +1,20 @@
1
+ import { createReadStream } from 'node:fs';
1
2
  import { readdir, stat } from 'node:fs/promises';
2
3
  import path from 'node:path';
4
+ import { TextDecoder } from 'node:util';
3
5
  import picomatch from 'picomatch';
4
- import { maxTextFileBytes, formatMebibytes } from '../limits.js';
5
- import { getProjectFileContext, readDecodedFile } from '../core.js';
6
+ import { decodeText, normalizeEncoding, resolveEncoding } from '../encoding/index.js';
7
+ import { inspectProjectPath } from '../filesystem/index.js';
8
+ import { formatMebibytes, grepLimits, maxTextFileBytes } from '../limits.js';
9
+ import { getProjectFileContext } from '../core.js';
6
10
  import { assertObject, optionalBoolean, optionalInteger, optionalString, rejectUnknown, requiredString, } from '../validation.js';
7
- const MAX_GREP_FILES = 10_000;
8
11
  const MAX_GREP_MATCHES_PER_FILE = 10_000;
9
12
  const MAX_GREP_ENTRIES = 10_000;
10
13
  const MAX_GREP_RESPONSE_CHARS = 1024 * 1024;
14
+ // Retaining context must not use more text than the bounded response it can produce.
15
+ const MAX_GREP_CONTEXT_CHARS = MAX_GREP_RESPONSE_CHARS;
16
+ // Multiline matching is deliberately exact, so its bounded whole-file buffer is stricter than normal streaming search.
17
+ const MAX_MULTILINE_FILE_BYTES = 1024 * 1024;
11
18
  const TYPE_GLOBS = {
12
19
  js: ['**/*.js', '**/*.jsx', '**/*.mjs', '**/*.cjs'],
13
20
  ts: ['**/*.ts', '**/*.tsx', '**/*.mts', '**/*.cts'],
@@ -29,12 +36,19 @@ const TYPE_GLOBS = {
29
36
  };
30
37
  export function parseGrepInput(value) {
31
38
  assertObject(value);
32
- const allowed = ['pattern', 'path', 'glob', 'type', 'output_mode', '-i', '-n', '-o', '-A', '-B', '-C', 'context', 'multiline', 'head_limit', 'offset'];
39
+ const allowed = ['pattern', 'path', 'glob', 'type', 'output_mode', 'scan_mode', '-i', '-n', '-o', '-A', '-B', '-C', 'context', 'multiline', 'head_limit', 'offset'];
33
40
  rejectUnknown(value, allowed);
34
41
  const outputMode = optionalString(value, 'output_mode');
35
42
  if (outputMode !== undefined && !['content', 'files_with_matches', 'count'].includes(outputMode)) {
36
43
  throw new Error('output_mode must be content, files_with_matches, or count');
37
44
  }
45
+ const scanMode = optionalString(value, 'scan_mode');
46
+ if (scanMode !== undefined && !['exact', 'fast'].includes(scanMode)) {
47
+ throw new Error('scan_mode must be exact or fast');
48
+ }
49
+ if (scanMode === 'fast' && outputMode !== undefined && outputMode !== 'files_with_matches') {
50
+ throw new Error('scan_mode=fast is only supported with output_mode=files_with_matches');
51
+ }
38
52
  const result = { pattern: requiredString(value, 'pattern') };
39
53
  for (const key of ['path', 'glob', 'type']) {
40
54
  const item = optionalString(value, key);
@@ -43,6 +57,8 @@ export function parseGrepInput(value) {
43
57
  }
44
58
  if (outputMode !== undefined)
45
59
  result.output_mode = outputMode;
60
+ if (scanMode !== undefined)
61
+ result.scan_mode = scanMode;
46
62
  for (const key of ['-i', '-n', '-o', 'multiline']) {
47
63
  const item = optionalBoolean(value, key);
48
64
  if (item !== undefined)
@@ -55,128 +71,390 @@ export function parseGrepInput(value) {
55
71
  }
56
72
  return result;
57
73
  }
58
- function matchesType(relative, type) {
59
- if (!type)
74
+ class GrepBudget {
75
+ limits;
76
+ startedAt = Date.now();
77
+ scannedFiles = 0;
78
+ scannedBytes = 0;
79
+ skippedFiles = 0;
80
+ reason;
81
+ remainingOnlyMatches;
82
+ constructor(limits) {
83
+ this.limits = limits;
84
+ this.remainingOnlyMatches = limits.maxOnlyMatches;
85
+ }
86
+ get truncationReason() {
87
+ return this.reason;
88
+ }
89
+ get scanComplete() {
90
+ return this.reason === undefined;
91
+ }
92
+ get elapsedMs() {
93
+ return Date.now() - this.startedAt;
94
+ }
95
+ stop(reason) {
96
+ if (this.reason === undefined)
97
+ this.reason = reason;
98
+ }
99
+ checkTime() {
100
+ if (this.reason !== undefined)
101
+ return false;
102
+ if (this.elapsedMs > this.limits.maxDurationMs) {
103
+ this.stop('max_duration_ms');
104
+ return false;
105
+ }
60
106
  return true;
61
- const patterns = TYPE_GLOBS[type];
62
- if (!patterns)
63
- throw new Error(`Unsupported file type: ${type}`);
64
- return patterns.some(pattern => picomatch.isMatch(relative, pattern, { dot: true }));
107
+ }
108
+ startFile(size) {
109
+ if (!this.checkTime())
110
+ return false;
111
+ if (this.scannedFiles >= this.limits.maxFiles) {
112
+ this.stop('max_files');
113
+ return false;
114
+ }
115
+ // Admit complete files only, so stream chunking cannot make byte accounting exceed the request budget.
116
+ if (size > this.limits.maxScanBytes - this.scannedBytes) {
117
+ this.stop('max_scan_bytes');
118
+ return false;
119
+ }
120
+ this.scannedFiles += 1;
121
+ return true;
122
+ }
123
+ addBytes(bytes) {
124
+ if (!this.checkTime())
125
+ return false;
126
+ if (bytes > this.limits.maxScanBytes - this.scannedBytes) {
127
+ this.stop('max_scan_bytes');
128
+ return false;
129
+ }
130
+ this.scannedBytes += bytes;
131
+ return true;
132
+ }
133
+ consumeOnlyMatch() {
134
+ if (!this.checkTime())
135
+ return false;
136
+ if (this.remainingOnlyMatches <= 0) {
137
+ this.stop('max_only_matches');
138
+ return false;
139
+ }
140
+ this.remainingOnlyMatches -= 1;
141
+ return true;
142
+ }
143
+ skip(reason) {
144
+ this.skippedFiles += 1;
145
+ this.stop(reason);
146
+ }
65
147
  }
66
- function matchesGlob(relative, glob) {
67
- return glob === undefined || picomatch.isMatch(relative, glob, { dot: true });
148
+ function contextForFile(context, file) {
149
+ return {
150
+ ...context,
151
+ absolutePath: file,
152
+ encoding: resolveEncoding(file, context.rules),
153
+ };
154
+ }
155
+ function createPathFilter(glob, type) {
156
+ const globMatcher = glob === undefined ? undefined : picomatch(glob, { dot: true });
157
+ const typePatterns = type === undefined ? undefined : TYPE_GLOBS[type];
158
+ if (type !== undefined && typePatterns === undefined)
159
+ throw new Error(`Unsupported file type: ${type}`);
160
+ const typeMatchers = typePatterns?.map(pattern => picomatch(pattern, { dot: true }));
161
+ return relative => (globMatcher === undefined || globMatcher(relative))
162
+ && (typeMatchers === undefined || typeMatchers.some(matcher => matcher(relative)));
68
163
  }
69
- async function collectFiles(root, target, glob, type) {
70
- const info = await stat(target);
71
- if (info.isFile())
72
- return [target];
73
- if (!info.isDirectory())
164
+ async function* iterateFiles(root, target, targetInfo, context, matchesPath) {
165
+ if (targetInfo.isFile()) {
166
+ yield { file: target, context: contextForFile(context, target), size: targetInfo.size };
167
+ return;
168
+ }
169
+ if (!targetInfo.isDirectory())
74
170
  throw new Error(`Path is not a file or directory: ${target}`);
75
- const files = [];
76
- const visit = async (directory) => {
171
+ const visit = async function* (directory, relativeDirectory, activeContext) {
77
172
  const entries = await readdir(directory, { withFileTypes: true });
173
+ entries.sort((left, right) => left.name.localeCompare(right.name));
174
+ const directoryContext = entries.some(entry => entry.name === '.encoding-rules' && entry.isFile())
175
+ && path.resolve(directory) !== activeContext.root
176
+ ? await getProjectFileContext(path.join(directory, '.codepage-bridge-search-probe'))
177
+ : activeContext;
78
178
  for (const entry of entries) {
79
179
  if (entry.name === 'node_modules' || entry.name === '.git' || entry.name === 'dist')
80
180
  continue;
81
181
  const absolute = path.join(directory, entry.name);
82
- const relative = path.relative(root, absolute).split(path.sep).join('/');
83
- if (entry.isDirectory())
84
- await visit(absolute);
85
- else if (entry.isFile() && matchesGlob(relative, glob) && matchesType(relative, type)) {
86
- files.push(absolute);
87
- if (files.length > MAX_GREP_FILES) {
88
- throw new Error(`Search matches more than ${MAX_GREP_FILES} files. Narrow path, glob, or type.`);
89
- }
182
+ const relative = relativeDirectory ? `${relativeDirectory}/${entry.name}` : entry.name;
183
+ if (entry.isDirectory()) {
184
+ const safe = await inspectProjectPath(directoryContext.root, absolute);
185
+ const info = await stat(safe.target);
186
+ if (info.isDirectory())
187
+ yield* visit(safe.target, relative, directoryContext);
188
+ }
189
+ else if (entry.isFile() && matchesPath(relative)) {
190
+ const safe = await inspectProjectPath(directoryContext.root, absolute);
191
+ const info = await stat(safe.target);
192
+ if (info.isFile())
193
+ yield { file: safe.target, context: contextForFile(directoryContext, safe.target), size: info.size };
90
194
  }
91
195
  }
92
196
  };
93
- await visit(target);
94
- return files.sort();
95
- }
96
- function searchLines(text, expression, onlyMatching) {
97
- const lines = text.split('\n');
98
- const matches = [];
99
- for (let index = 0; index < lines.length; index += 1) {
100
- const line = lines[index] ?? '';
101
- expression.lastIndex = 0;
102
- if (!expression.test(line))
197
+ yield* visit(target, path.relative(root, target).split(path.sep).join('/'), context);
198
+ }
199
+ function responseState() {
200
+ return { entries: [], count: 0, characters: 0, truncated: false };
201
+ }
202
+ function appendEntry(state, entry, offset, limit) {
203
+ return appendEntryParts(state, [entry], offset, limit);
204
+ }
205
+ function appendEntryParts(state, parts, offset, limit) {
206
+ if (state.truncated)
207
+ return false;
208
+ if (state.count >= offset && state.entries.length < limit) {
209
+ const length = parts.reduce((total, part) => total + part.length, 0);
210
+ if (state.characters + length > MAX_GREP_RESPONSE_CHARS) {
211
+ state.truncated = true;
212
+ return false;
213
+ }
214
+ state.entries.push(parts.join(''));
215
+ state.characters += length + 1;
216
+ }
217
+ state.count += 1;
218
+ return true;
219
+ }
220
+ function* onlyMatches(line, expression) {
221
+ const global = new RegExp(expression.source, expression.flags.includes('g') ? expression.flags : `${expression.flags}g`);
222
+ for (const match of line.matchAll(global)) {
223
+ if (match[0])
224
+ yield match[0];
225
+ }
226
+ }
227
+ function testLine(line, expression) {
228
+ expression.lastIndex = 0;
229
+ return expression.test(line);
230
+ }
231
+ function ensureLineLimit(line, budget) {
232
+ if (line.length > budget.limits.maxLineChars) {
233
+ budget.stop('max_line_chars');
234
+ throw new Error('Grep line length limit exceeded');
235
+ }
236
+ }
237
+ async function* readSearchableLines(file, budget) {
238
+ const encoding = normalizeEncoding(file.context.encoding);
239
+ const decoder = new TextDecoder(encoding, { fatal: true });
240
+ let pending = '';
241
+ let trailingCarriageReturn = false;
242
+ const joinPending = (line) => {
243
+ const complete = pending + line;
244
+ pending = '';
245
+ ensureLineLimit(complete, budget);
246
+ return complete;
247
+ };
248
+ const consume = function* (decoded) {
249
+ const lines = decoded.split('\n');
250
+ const remainder = lines.pop() ?? '';
251
+ for (const line of lines)
252
+ yield joinPending(line);
253
+ return remainder;
254
+ };
255
+ try {
256
+ for await (const chunk of createReadStream(file.file, { highWaterMark: 64 * 1024 })) {
257
+ if (!budget.addBytes(chunk.length))
258
+ return;
259
+ let decoded = decoder.decode(chunk, { stream: true });
260
+ if (trailingCarriageReturn && !decoded.startsWith('\n'))
261
+ decoded = `\n${decoded}`;
262
+ trailingCarriageReturn = false;
263
+ if (decoded.endsWith('\r')) {
264
+ decoded = decoded.slice(0, -1);
265
+ trailingCarriageReturn = true;
266
+ }
267
+ decoded = decoded.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
268
+ const consumed = consume(decoded);
269
+ let next = consumed.next();
270
+ while (!next.done) {
271
+ if (!budget.checkTime())
272
+ return;
273
+ yield next.value;
274
+ next = consumed.next();
275
+ }
276
+ pending += next.value;
277
+ ensureLineLimit(pending, budget);
278
+ }
279
+ let decoded = decoder.decode();
280
+ if (trailingCarriageReturn && !decoded.startsWith('\n'))
281
+ decoded = `\n${decoded}`;
282
+ decoded = decoded.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
283
+ const consumed = consume(decoded);
284
+ let next = consumed.next();
285
+ while (!next.done) {
286
+ if (!budget.checkTime())
287
+ return;
288
+ yield next.value;
289
+ next = consumed.next();
290
+ }
291
+ yield joinPending(next.value);
292
+ }
293
+ catch (error) {
294
+ if (error instanceof TypeError)
295
+ throw new Error(`Invalid byte sequence for ${encoding}`, { cause: error });
296
+ throw error;
297
+ }
298
+ }
299
+ function formatLine(file, line, text, direct, input, includeFile) {
300
+ const separator = direct ? ':' : '-';
301
+ const number = input['-n'] ?? true;
302
+ return `${includeFile ? `${file}${separator}` : ''}${number ? `${line}${separator}` : ''}${text}`;
303
+ }
304
+ function appendFormattedLine(state, file, line, text, direct, input, includeFile, offset, limit) {
305
+ const separator = direct ? ':' : '-';
306
+ return appendEntryParts(state, [
307
+ includeFile ? `${file}${separator}` : '',
308
+ input['-n'] ?? true ? `${line}${separator}` : '',
309
+ text,
310
+ ], offset, limit);
311
+ }
312
+ async function countLineMatches(file, expression, budget, firstOnly) {
313
+ let matches = 0;
314
+ for await (const line of readSearchableLines(file, budget)) {
315
+ if (!testLine(line, expression))
103
316
  continue;
104
- if (matches.length >= MAX_GREP_MATCHES_PER_FILE) {
317
+ matches += 1;
318
+ if (firstOnly)
319
+ return matches;
320
+ if (matches > MAX_GREP_MATCHES_PER_FILE) {
105
321
  throw new Error(`File has more than ${MAX_GREP_MATCHES_PER_FILE} matches. Narrow the search pattern.`);
106
322
  }
107
- if (onlyMatching) {
108
- const global = new RegExp(expression.source, expression.flags.includes('g') ? expression.flags : `${expression.flags}g`);
109
- const only = [...line.matchAll(global)].map(match => match[0]).filter(Boolean);
110
- matches.push({ line: index + 1, text: line, only });
111
- }
112
- else
113
- matches.push({ line: index + 1, text: line });
114
323
  }
115
324
  return matches;
116
325
  }
117
- function findMatches(text, expression, input) {
118
- if (!input.multiline)
119
- return searchLines(text, expression, input['-o'] ?? false);
120
- expression.lastIndex = 0;
121
- return expression.test(text) ? [{ line: 1, text }] : [];
122
- }
123
- function formatContent(file, text, matches, input, includeFile) {
124
- const lines = text.split('\n');
326
+ async function collectContent(file, expression, input, includeFile, state, offset, limit, budget) {
125
327
  const context = input.context ?? input['-C'];
126
328
  const before = context ?? input['-B'] ?? 0;
127
329
  const after = context ?? input['-A'] ?? 0;
128
- const withNumbers = input['-n'] ?? true;
129
- const output = [];
130
- if (input['-o']) {
131
- for (const match of matches) {
132
- for (const part of match.only ?? [])
133
- output.push(`${includeFile ? `${file}:` : ''}${withNumbers ? `${match.line}:` : ''}${part}`);
330
+ const previousLines = [];
331
+ let previousLineChars = 0;
332
+ let previousOutputLine = 0;
333
+ let afterUntil = 0;
334
+ let matches = 0;
335
+ let lineNumber = 0;
336
+ const retainPreviousLine = (previous) => {
337
+ if (previousLines.length >= before) {
338
+ const removed = previousLines.shift();
339
+ previousLineChars -= removed?.text.length ?? 0;
340
+ }
341
+ if (previous.text.length > MAX_GREP_CONTEXT_CHARS - previousLineChars) {
342
+ budget.stop('max_context_chars');
343
+ throw new Error(`Grep context storage limit exceeded (${MAX_GREP_CONTEXT_CHARS} characters)`);
344
+ }
345
+ previousLines.push(previous);
346
+ previousLineChars += previous.text.length;
347
+ };
348
+ for await (const line of readSearchableLines(file, budget)) {
349
+ lineNumber += 1;
350
+ if (!budget.checkTime())
351
+ return matches;
352
+ const direct = testLine(line, expression);
353
+ if (direct) {
354
+ matches += 1;
355
+ if (matches > MAX_GREP_MATCHES_PER_FILE) {
356
+ throw new Error(`File has more than ${MAX_GREP_MATCHES_PER_FILE} matches. Narrow the search pattern.`);
357
+ }
358
+ if (input['-o']) {
359
+ for (const part of onlyMatches(line, expression)) {
360
+ if (!budget.consumeOnlyMatch())
361
+ return matches;
362
+ appendEntryParts(state, [
363
+ includeFile ? `${file.file}:` : '',
364
+ input['-n'] ?? true ? `${lineNumber}:` : '',
365
+ part,
366
+ ], offset, limit);
367
+ }
368
+ }
369
+ else {
370
+ for (const previous of previousLines) {
371
+ if (previousOutputLine > 0 && previous.line > previousOutputLine + 1)
372
+ appendEntry(state, '--', offset, limit);
373
+ appendFormattedLine(state, file.file, previous.line, previous.text, false, input, includeFile, offset, limit);
374
+ previousOutputLine = previous.line;
375
+ }
376
+ previousLines.length = 0;
377
+ previousLineChars = 0;
378
+ if (previousOutputLine > 0 && lineNumber > previousOutputLine + 1)
379
+ appendEntry(state, '--', offset, limit);
380
+ appendFormattedLine(state, file.file, lineNumber, line, true, input, includeFile, offset, limit);
381
+ previousOutputLine = lineNumber;
382
+ afterUntil = Math.max(afterUntil, lineNumber + after);
383
+ }
384
+ continue;
385
+ }
386
+ if (!input['-o'] && lineNumber <= afterUntil) {
387
+ appendFormattedLine(state, file.file, lineNumber, line, false, input, includeFile, offset, limit);
388
+ previousOutputLine = lineNumber;
389
+ continue;
134
390
  }
135
- return output;
391
+ if (!input['-o'] && before > 0) {
392
+ retainPreviousLine({ line: lineNumber, text: line });
393
+ }
394
+ }
395
+ return matches;
396
+ }
397
+ async function readMultilineFile(file, budget) {
398
+ if (file.size > MAX_MULTILINE_FILE_BYTES) {
399
+ budget.stop('max_multiline_file_bytes');
400
+ throw new Error(`Multiline search is limited to ${formatMebibytes(MAX_MULTILINE_FILE_BYTES)} per file to preserve exact matching`);
136
401
  }
137
- const selected = new Map();
138
- for (const match of matches) {
139
- for (let line = Math.max(1, match.line - before); line <= Math.min(lines.length, match.line + after); line += 1) {
140
- selected.set(line, selected.get(line) === true || line === match.line);
402
+ if (!budget.checkTime())
403
+ throw new Error('Grep duration limit exceeded');
404
+ const chunks = [];
405
+ let bytesRead = 0;
406
+ for await (const chunk of createReadStream(file.file, { highWaterMark: 64 * 1024 })) {
407
+ if (chunk.length > MAX_MULTILINE_FILE_BYTES - bytesRead) {
408
+ budget.stop('max_multiline_file_bytes');
409
+ throw new Error(`Multiline search is limited to ${formatMebibytes(MAX_MULTILINE_FILE_BYTES)} per file to preserve exact matching`);
141
410
  }
411
+ if (!budget.addBytes(chunk.length))
412
+ throw budgetError(budget.truncationReason);
413
+ chunks.push(chunk);
414
+ bytesRead += chunk.length;
142
415
  }
143
- let previous = 0;
144
- for (const [line, direct] of [...selected.entries()].sort((left, right) => left[0] - right[0])) {
145
- if (previous > 0 && line > previous + 1)
146
- output.push('--');
147
- const separator = direct ? ':' : '-';
148
- output.push(`${includeFile ? `${file}${separator}` : ''}${withNumbers ? `${line}${separator}` : ''}${lines[line - 1] ?? ''}`);
149
- previous = line;
416
+ try {
417
+ return decodeText(Buffer.concat(chunks, bytesRead), file.context.encoding).text.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
150
418
  }
151
- return output;
152
- }
153
- async function readSearchableFile(file) {
154
- const info = await stat(file);
155
- const maximumBytes = maxTextFileBytes();
156
- if (info.size > maximumBytes) {
157
- throw new Error(`File exceeds the ${formatMebibytes(maximumBytes)} search limit. Set CODEPAGE_BRIDGE_MAX_TEXT_FILE_MIB to raise it.`);
419
+ catch (error) {
420
+ budget.stop('decode_error');
421
+ throw error;
158
422
  }
159
- const context = await getProjectFileContext(file);
160
- const snapshot = await readDecodedFile(context);
161
- return snapshot.text;
162
423
  }
163
- function appendEntries(source, selected, offset, limit, count, characters) {
164
- for (const entry of source) {
165
- if (count.value >= offset && selected.length < limit) {
166
- if (characters.value + entry.length > MAX_GREP_RESPONSE_CHARS)
167
- return false;
168
- selected.push(entry);
169
- characters.value += entry.length + 1;
424
+ function collectMultilineContent(file, text, expression, input, includeFile, state, offset, limit, budget) {
425
+ if (input['-o']) {
426
+ for (const part of onlyMatches(text, expression)) {
427
+ if (!budget.consumeOnlyMatch())
428
+ return;
429
+ appendEntry(state, `${includeFile ? `${file.file}:` : ''}${input['-n'] ?? true ? '1:' : ''}${part}`, offset, limit);
170
430
  }
171
- count.value += 1;
431
+ return;
432
+ }
433
+ appendEntry(state, formatLine(file.file, 1, text, true, input, includeFile), offset, limit);
434
+ }
435
+ function validateContext(input, limits) {
436
+ const context = input.context ?? input['-C'];
437
+ const before = context ?? input['-B'] ?? 0;
438
+ const after = context ?? input['-A'] ?? 0;
439
+ if (before + after > limits.maxContextLines) {
440
+ throw new Error(`Requested context exceeds CODEPAGE_BRIDGE_MAX_GREP_CONTEXT_LINES (${limits.maxContextLines})`);
172
441
  }
173
- return true;
442
+ }
443
+ function budgetError(reason) {
444
+ return new Error(`Grep search budget exceeded: ${reason ?? 'unknown'}`);
174
445
  }
175
446
  export async function executeGrep(input) {
447
+ const limits = grepLimits();
448
+ validateContext(input, limits);
176
449
  const targetInput = path.resolve(input.path ?? process.cwd());
177
- const targetInfo = await stat(targetInput);
178
- const targetContext = await getProjectFileContext(targetInfo.isDirectory() ? path.join(targetInput, '.codepage-bridge-search-probe') : targetInput);
179
- const files = await collectFiles(targetContext.root, targetInput, input.glob, input.type);
450
+ const initialContext = await getProjectFileContext(targetInput);
451
+ const safeTarget = await inspectProjectPath(initialContext.root, targetInput);
452
+ const targetInfo = await stat(safeTarget.target);
453
+ const targetContext = targetInfo.isDirectory()
454
+ ? await getProjectFileContext(path.join(safeTarget.target, '.codepage-bridge-search-probe'))
455
+ : initialContext;
456
+ const matchesPath = createPathFilter(input.glob, input.type);
457
+ const files = iterateFiles(targetContext.root, safeTarget.target, targetInfo, targetContext, matchesPath);
180
458
  const explicitFile = targetInfo.isFile();
181
459
  const flags = `${input['-i'] ? 'i' : ''}${input.multiline ? 'ms' : ''}`;
182
460
  let expression;
@@ -186,59 +464,121 @@ export async function executeGrep(input) {
186
464
  catch (error) {
187
465
  throw new Error(`Invalid regular expression: ${error instanceof Error ? error.message : String(error)}`);
188
466
  }
189
- const matched = [];
190
- for (const file of files) {
191
- try {
192
- const searchable = await readSearchableFile(file);
193
- const matches = findMatches(searchable, expression, input);
194
- if (matches.length > 0)
195
- matched.push({ file, count: matches.length });
196
- }
197
- catch (error) {
198
- if (explicitFile) {
199
- const message = error instanceof Error ? error.message : String(error);
200
- throw new Error(`Failed to search ${file}: ${message}`, { cause: error });
201
- }
202
- }
203
- }
204
467
  const mode = input.output_mode ?? 'files_with_matches';
468
+ const scanMode = input.scan_mode ?? 'exact';
469
+ if (scanMode === 'fast' && mode !== 'files_with_matches') {
470
+ throw new Error('scan_mode=fast is only supported with output_mode=files_with_matches');
471
+ }
205
472
  const offset = input.offset ?? 0;
206
473
  const requestedLimit = input.head_limit ?? 250;
207
474
  const limit = requestedLimit === 0 ? MAX_GREP_ENTRIES : Math.min(requestedLimit, MAX_GREP_ENTRIES);
208
- const entries = [];
209
- const count = { value: 0 };
210
- const characters = { value: 0 };
211
- let truncated = false;
212
- if (mode === 'files_with_matches') {
213
- truncated = !appendEntries(matched.map(result => result.file), entries, offset, limit, count, characters);
214
- }
215
- else if (mode === 'count') {
216
- truncated = !appendEntries(matched.map(result => `${result.file}:${result.count}`), entries, offset, limit, count, characters);
217
- }
218
- else {
219
- for (const result of matched) {
220
- const searchable = await readSearchableFile(result.file);
221
- const matches = findMatches(searchable, expression, input);
222
- if (!appendEntries(formatContent(result.file, searchable, matches, input, !explicitFile), entries, offset, limit, count, characters)) {
223
- truncated = true;
224
- break;
475
+ const state = responseState();
476
+ const budget = new GrepBudget(limits);
477
+ let numFiles = 0;
478
+ let numMatches = 0;
479
+ for await (const file of files) {
480
+ if (!budget.checkTime())
481
+ break;
482
+ if (file.size > maxTextFileBytes()) {
483
+ budget.skip('max_text_file_bytes');
484
+ if (explicitFile) {
485
+ throw new Error(`Failed to search ${file.file}: File exceeds the ${formatMebibytes(maxTextFileBytes())} search limit. Set CODEPAGE_BRIDGE_MAX_TEXT_FILE_MIB to raise it.`);
486
+ }
487
+ continue;
488
+ }
489
+ if (input.multiline && file.size > MAX_MULTILINE_FILE_BYTES) {
490
+ budget.skip('max_multiline_file_bytes');
491
+ if (explicitFile)
492
+ throw new Error(`Failed to search ${file.file}: Multiline search is limited to ${formatMebibytes(MAX_MULTILINE_FILE_BYTES)} per file to preserve exact matching`);
493
+ continue;
494
+ }
495
+ if (!budget.startFile(file.size)) {
496
+ budget.skippedFiles += 1;
497
+ if (explicitFile)
498
+ throw new Error(`Failed to search ${file.file}: ${budgetError(budget.truncationReason).message}`);
499
+ break;
500
+ }
501
+ try {
502
+ if (input.multiline) {
503
+ const searchable = await readMultilineFile(file, budget);
504
+ if (!testLine(searchable, expression))
505
+ continue;
506
+ numFiles += 1;
507
+ numMatches += 1;
508
+ if (mode === 'files_with_matches')
509
+ appendEntry(state, file.file, offset, limit);
510
+ else if (mode === 'count')
511
+ appendEntry(state, `${file.file}:1`, offset, limit);
512
+ else
513
+ collectMultilineContent(file, searchable, expression, input, !explicitFile, state, offset, limit, budget);
514
+ if (!budget.scanComplete)
515
+ break;
516
+ continue;
517
+ }
518
+ if (mode === 'content') {
519
+ const fileMatches = await collectContent(file, expression, input, !explicitFile, state, offset, limit, budget);
520
+ if (fileMatches > 0) {
521
+ numFiles += 1;
522
+ numMatches += fileMatches;
523
+ }
524
+ }
525
+ else {
526
+ const fileMatches = await countLineMatches(file, expression, budget, scanMode === 'fast');
527
+ if (fileMatches > 0) {
528
+ numFiles += 1;
529
+ numMatches += fileMatches;
530
+ appendEntry(state, mode === 'count' ? `${file.file}:${fileMatches}` : file.file, offset, limit);
531
+ }
532
+ }
533
+ }
534
+ catch (error) {
535
+ const message = error instanceof Error ? error.message : String(error);
536
+ if (budget.truncationReason === undefined) {
537
+ if (/Invalid byte sequence|Encoding/.test(message))
538
+ budget.stop('decode_error');
539
+ else if (/more than .* matches/.test(message))
540
+ budget.stop('max_matches_per_file');
541
+ else
542
+ budget.stop('file_error');
543
+ }
544
+ if (explicitFile) {
545
+ throw new Error(`Failed to search ${file.file}: ${budgetError(budget.truncationReason).message}: ${message}`, { cause: error });
225
546
  }
547
+ budget.skippedFiles += 1;
226
548
  }
549
+ if (!budget.scanComplete)
550
+ break;
227
551
  }
228
- if (count.value > offset + entries.length)
229
- truncated = true;
230
- if (requestedLimit === 0 && count.value >= MAX_GREP_ENTRIES)
231
- truncated = true;
232
- const suffix = truncated
233
- ? `\n\n[Showing results with pagination = limit: ${limit}, offset: ${offset}; output is capped for server stability]`
234
- : '';
552
+ if (state.count > offset + state.entries.length)
553
+ state.truncated = true;
554
+ if (requestedLimit === 0 && state.count >= MAX_GREP_ENTRIES)
555
+ state.truncated = true;
556
+ const outputTruncated = state.truncated;
557
+ const notices = [];
558
+ if (outputTruncated)
559
+ notices.push(`Showing results with pagination = limit: ${limit}, offset: ${offset}; output is capped for server stability`);
560
+ if (!budget.scanComplete)
561
+ notices.push(`Search incomplete: scanComplete=false; truncationReason=${budget.truncationReason ?? 'unknown'}`);
562
+ const suffix = notices.length === 0
563
+ ? ''
564
+ : `${state.entries.length > 0 ? '\n\n' : ''}[${notices.join('] [')}]`;
565
+ const countsExact = scanMode === 'exact' && budget.scanComplete;
235
566
  return {
236
- content: [{ type: 'text', text: `${entries.join('\n')}${suffix}` }],
567
+ content: [{ type: 'text', text: `${state.entries.join('\n')}${suffix}` }],
237
568
  structuredContent: {
238
569
  mode,
239
- numFiles: matched.length,
240
- numMatches: matched.reduce((sum, result) => sum + result.count, 0),
241
- entries,
570
+ scanMode,
571
+ numFiles,
572
+ numMatches,
573
+ entries: state.entries,
574
+ scanComplete: budget.scanComplete,
575
+ countsExact,
576
+ outputTruncated,
577
+ ...(budget.truncationReason === undefined ? {} : { truncationReason: budget.truncationReason }),
578
+ scannedFiles: budget.scannedFiles,
579
+ scannedBytes: budget.scannedBytes,
580
+ skippedFiles: budget.skippedFiles,
581
+ elapsedMs: budget.elapsedMs,
242
582
  },
243
583
  };
244
584
  }
@@ -1 +1 @@
1
- {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../../src/tools/grep.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../../src/tools/grep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAc,MAAM,SAAS,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEvC,OAAO,SAAS,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAmB,MAAM,cAAc,CAAA;AAC7F,OAAO,EAAE,qBAAqB,EAA2B,MAAM,YAAY,CAAA;AAE3E,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,EACf,cAAc,EACd,aAAa,EACb,cAAc,GACf,MAAM,kBAAkB,CAAA;AAwBzB,MAAM,yBAAyB,GAAG,MAAM,CAAA;AACxC,MAAM,gBAAgB,GAAG,MAAM,CAAA;AAC/B,MAAM,uBAAuB,GAAG,IAAI,GAAG,IAAI,CAAA;AAC3C,qFAAqF;AACrF,MAAM,sBAAsB,GAAG,uBAAuB,CAAA;AACtD,uHAAuH;AACvH,MAAM,wBAAwB,GAAG,IAAI,GAAG,IAAI,CAAA;AAgB5C,MAAM,UAAU,GAAuC;IACrD,EAAE,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC;IACnD,EAAE,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC;IACnD,EAAE,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;IAC3B,IAAI,EAAE,CAAC,SAAS,CAAC;IACjB,EAAE,EAAE,CAAC,SAAS,CAAC;IACf,IAAI,EAAE,CAAC,WAAW,CAAC;IACnB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACvB,GAAG,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC;IAC/D,EAAE,EAAE,CAAC,SAAS,CAAC;IACf,IAAI,EAAE,CAAC,WAAW,CAAC;IACnB,IAAI,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;IAC/B,IAAI,EAAE,CAAC,WAAW,CAAC;IACnB,QAAQ,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC;IACtC,IAAI,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;IAC/B,GAAG,EAAE,CAAC,UAAU,CAAC;IACjB,GAAG,EAAE,CAAC,UAAU,CAAC;IACjB,EAAE,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC;CAC7B,CAAA;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,YAAY,CAAC,KAAK,CAAC,CAAA;IACnB,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAA;IACnK,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC7B,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;IACvD,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACjG,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;IAC9E,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;IACnD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACpD,CAAC;IACD,IAAI,QAAQ,KAAK,MAAM,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,oBAAoB,EAAE,CAAC;QAC3F,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAA;IACzF,CAAC;IACD,MAAM,MAAM,GAAc,EAAE,OAAO,EAAE,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAA;IACvE,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACvC,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IAC5C,CAAC;IACD,IAAI,UAAU,KAAK,SAAS;QAAE,MAAM,CAAC,WAAW,GAAG,UAA4B,CAAA;IAC/E,IAAI,QAAQ,KAAK,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,QAAwB,CAAA;IACvE,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAU,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACxC,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IAC5C,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAU,EAAE,CAAC;QAC1H,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;QACjD,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IAC5C,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAQD,MAAM,UAAU;IAQO;IAPZ,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC/B,YAAY,GAAG,CAAC,CAAA;IAChB,YAAY,GAAG,CAAC,CAAA;IAChB,YAAY,GAAG,CAAC,CAAA;IACR,MAAM,CAA8B;IACpC,oBAAoB,CAAQ;IAEpC,YAAqB,MAAkB;QAAlB,WAAM,GAAN,MAAM,CAAY;QACrC,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,cAAc,CAAA;IACnD,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAA;IAClC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAA;IACpC,CAAC;IAED,IAAI,CAAC,MAAwB;QAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACrD,CAAC;IAED,SAAS;QACP,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,KAAK,CAAA;QAC3C,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YAC5B,OAAO,KAAK,CAAA;QACd,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,KAAK,CAAA;QACnC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACtB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,uGAAuG;QACvG,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YAC3B,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,CAAC,YAAY,IAAI,CAAC,CAAA;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,KAAK,CAAA;QACnC,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACzD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YAC3B,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,CAAC,YAAY,IAAI,KAAK,CAAA;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,KAAK,CAAA;QACnC,IAAI,IAAI,CAAC,oBAAoB,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;YAC7B,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,CAAC,oBAAoB,IAAI,CAAC,CAAA;QAC9B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC,MAAwB;QAC3B,IAAI,CAAC,YAAY,IAAI,CAAC,CAAA;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACnB,CAAC;CACF;AAED,SAAS,cAAc,CAAC,OAA2B,EAAE,IAAY;IAC/D,OAAO;QACL,GAAG,OAAO;QACV,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC;KAC/C,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAwB,EAAE,IAAwB;IAC1E,MAAM,WAAW,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;IACnF,MAAM,YAAY,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IACtE,IAAI,IAAI,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAA;IACvG,MAAM,YAAY,GAAG,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACpF,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;WAClE,CAAC,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AACtF,CAAC;AAED,KAAK,SAAS,CAAC,CAAC,YAAY,CAC1B,IAAY,EACZ,MAAc,EACd,UAAiB,EACjB,OAA2B,EAC3B,WAA0C;IAE1C,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;QACxB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAA;QACvF,OAAM;IACR,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,EAAE,CAAC,CAAA;IAE5F,MAAM,KAAK,GAAG,KAAK,SAAS,CAAC,EAC3B,SAAiB,EACjB,iBAAyB,EACzB,aAAiC;QAEjC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;QAClE,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,iBAAiB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;eAC7F,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,aAAa,CAAC,IAAI;YACjD,CAAC,CAAC,MAAM,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,+BAA+B,CAAC,CAAC;YACpF,CAAC,CAAC,aAAa,CAAA;QACjB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAQ;YAC7F,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YACjD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,iBAAiB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;YACtF,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;gBACtE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBACpC,IAAI,IAAI,CAAC,WAAW,EAAE;oBAAE,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAA;YAC/E,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;gBACtE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBACpC,IAAI,IAAI,CAAC,MAAM,EAAE;oBAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAA;YACzH,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IAED,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;AACtF,CAAC;AASD,SAAS,aAAa;IACpB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;AACnE,CAAC;AAED,SAAS,WAAW,CAAC,KAAkB,EAAE,KAAa,EAAE,MAAc,EAAE,KAAa;IACnF,OAAO,gBAAgB,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;AACxD,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAkB,EAAE,KAAwB,EAAE,MAAc,EAAE,KAAa;IACnG,IAAI,KAAK,CAAC,SAAS;QAAE,OAAO,KAAK,CAAA;IACjC,IAAI,KAAK,CAAC,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QACpE,IAAI,KAAK,CAAC,UAAU,GAAG,MAAM,GAAG,uBAAuB,EAAE,CAAC;YACxD,KAAK,CAAC,SAAS,GAAG,IAAI,CAAA;YACtB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QAClC,KAAK,CAAC,UAAU,IAAI,MAAM,GAAG,CAAC,CAAA;IAChC,CAAC;IACD,KAAK,CAAC,KAAK,IAAI,CAAC,CAAA;IAChB,OAAO,IAAI,CAAA;AACb,CAAC;AAED,QAAQ,CAAC,CAAC,WAAW,CAAC,IAAY,EAAE,UAAkB;IACpD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAAA;IACxH,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,CAAC,CAAC;YAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAA;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,UAAkB;IAChD,UAAU,CAAC,SAAS,GAAG,CAAC,CAAA;IACxB,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC9B,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,MAAkB;IACvD,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAC7B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACpD,CAAC;AACH,CAAC;AAED,KAAK,SAAS,CAAC,CAAC,mBAAmB,CAAC,IAAgB,EAAE,MAAkB;IACtE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACzD,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1D,IAAI,OAAO,GAAG,EAAE,CAAA;IAChB,IAAI,sBAAsB,GAAG,KAAK,CAAA;IAClC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAU,EAAE;QAC3C,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAA;QAC/B,OAAO,GAAG,EAAE,CAAA;QACZ,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QACjC,OAAO,QAAQ,CAAA;IACjB,CAAC,CAAA;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,OAAe;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAA;QACnC,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,MAAM,WAAW,CAAC,IAAI,CAAC,CAAA;QACjD,OAAO,SAAS,CAAA;IAClB,CAAC,CAAA;IACD,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;YACpF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;gBAAE,OAAM;YAC1C,IAAI,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;YACrD,IAAI,sBAAsB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,GAAG,KAAK,OAAO,EAAE,CAAA;YACjF,sBAAsB,GAAG,KAAK,CAAA;YAC9B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;gBAC9B,sBAAsB,GAAG,IAAI,CAAA;YAC/B,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;YACjC,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;YAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;oBAAE,OAAM;gBAC/B,MAAM,IAAI,CAAC,KAAK,CAAA;gBAChB,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;YACxB,CAAC;YACD,OAAO,IAAI,IAAI,CAAC,KAAK,CAAA;YACrB,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAClC,CAAC;QACD,IAAI,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;QAC9B,IAAI,sBAAsB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,GAAG,KAAK,OAAO,EAAE,CAAA;QACjF,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QACjC,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;gBAAE,OAAM;YAC/B,MAAM,IAAI,CAAC,KAAK,CAAA;YAChB,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QACxB,CAAC;QACD,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QAC1G,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,IAAY,EAAE,IAAY,EAAE,MAAe,EAAE,KAAgB,EAAE,WAAoB;IACnH,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;IACpC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAA;IAClC,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAA;AACnG,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAkB,EAClB,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,MAAe,EACf,KAAgB,EAChB,WAAoB,EACpB,MAAc,EACd,KAAa;IAEb,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;IACpC,OAAO,gBAAgB,CAAC,KAAK,EAAE;QAC7B,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;QACxC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;QAChD,IAAI;KACL,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;AACnB,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,IAAgB,EAAE,UAAkB,EAAE,MAAkB,EAAE,SAAkB;IAC1G,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;YAAE,SAAQ;QACzC,OAAO,IAAI,CAAC,CAAA;QACZ,IAAI,SAAS;YAAE,OAAO,OAAO,CAAA;QAC7B,IAAI,OAAO,GAAG,yBAAyB,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,sBAAsB,yBAAyB,sCAAsC,CAAC,CAAA;QACxG,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,IAAgB,EAChB,UAAkB,EAClB,KAAgB,EAChB,WAAoB,EACpB,KAAkB,EAClB,MAAc,EACd,KAAa,EACb,MAAkB;IAElB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzC,MAAM,aAAa,GAA0C,EAAE,CAAA;IAC/D,IAAI,iBAAiB,GAAG,CAAC,CAAA;IACzB,IAAI,kBAAkB,GAAG,CAAC,CAAA;IAC1B,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,MAAM,kBAAkB,GAAG,CAAC,QAAwC,EAAQ,EAAE;QAC5E,IAAI,aAAa,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,CAAA;YACrC,iBAAiB,IAAI,OAAO,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;QAChD,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,sBAAsB,GAAG,iBAAiB,EAAE,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;YAChC,MAAM,IAAI,KAAK,CAAC,wCAAwC,sBAAsB,cAAc,CAAC,CAAA;QAC/F,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC5B,iBAAiB,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAA;IAC3C,CAAC,CAAA;IAED,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QAC3D,UAAU,IAAI,CAAC,CAAA;QACf,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;YAAE,OAAO,OAAO,CAAA;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QACzC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAA;YACZ,IAAI,OAAO,GAAG,yBAAyB,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,sBAAsB,yBAAyB,sCAAsC,CAAC,CAAA;YACxG,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChB,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;oBACjD,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;wBAAE,OAAO,OAAO,CAAA;oBAC9C,gBAAgB,CAAC,KAAK,EAAE;wBACtB,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE;wBAClC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE;wBAC3C,IAAI;qBACL,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;gBACnB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;oBACrC,IAAI,kBAAkB,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,GAAG,kBAAkB,GAAG,CAAC;wBAAE,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;oBAC7G,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;oBAC7G,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CAAA;gBACpC,CAAC;gBACD,aAAa,CAAC,MAAM,GAAG,CAAC,CAAA;gBACxB,iBAAiB,GAAG,CAAC,CAAA;gBACrB,IAAI,kBAAkB,GAAG,CAAC,IAAI,UAAU,GAAG,kBAAkB,GAAG,CAAC;oBAAE,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;gBAC1G,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;gBAChG,kBAAkB,GAAG,UAAU,CAAA;gBAC/B,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,KAAK,CAAC,CAAA;YACvD,CAAC;YACD,SAAQ;QACV,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;YAC7C,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;YACjG,kBAAkB,GAAG,UAAU,CAAA;YAC/B,SAAQ;QACV,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,kBAAkB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACtD,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAgB,EAAE,MAAkB;IACnE,IAAI,IAAI,CAAC,IAAI,GAAG,wBAAwB,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QACvC,MAAM,IAAI,KAAK,CAAC,kCAAkC,eAAe,CAAC,wBAAwB,CAAC,sCAAsC,CAAC,CAAA;IACpI,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IAExE,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;QACpF,IAAI,KAAK,CAAC,MAAM,GAAG,wBAAwB,GAAG,SAAS,EAAE,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;YACvC,MAAM,IAAI,KAAK,CAAC,kCAAkC,eAAe,CAAC,wBAAwB,CAAC,sCAAsC,CAAC,CAAA;QACpI,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,MAAM,WAAW,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;QAC9E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClB,SAAS,IAAI,KAAK,CAAC,MAAM,CAAA;IAC3B,CAAC;IACD,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACjI,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC3B,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,IAAgB,EAChB,IAAY,EACZ,UAAkB,EAClB,KAAgB,EAChB,WAAoB,EACpB,KAAkB,EAClB,MAAc,EACd,KAAa,EACb,MAAkB;IAElB,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAChB,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;gBAAE,OAAM;YACtC,WAAW,CAAC,KAAK,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;QACrH,CAAC;QACD,OAAM;IACR,CAAC;IACD,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;AAC7F,CAAC;AAED,SAAS,eAAe,CAAC,KAAgB,EAAE,MAAkB;IAC3D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzC,IAAI,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,qEAAqE,MAAM,CAAC,eAAe,GAAG,CAAC,CAAA;IACjH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAoC;IACvD,OAAO,IAAI,KAAK,CAAC,gCAAgC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAA;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAgB;IAChD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC7D,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAA;IAC/D,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;IAC7E,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAChD,MAAM,aAAa,GAAG,UAAU,CAAC,WAAW,EAAE;QAC5C,CAAC,CAAC,MAAM,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;QAC5F,CAAC,CAAC,cAAc,CAAA;IAClB,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5D,MAAM,KAAK,GAAG,YAAY,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,CAAC,CAAA;IACzG,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;IACvE,IAAI,UAAkB,CAAA;IACtB,IAAI,CAAC;QACH,UAAU,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC1G,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,IAAI,oBAAoB,CAAA;IACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,IAAI,OAAO,CAAA;IAC3C,IAAI,QAAQ,KAAK,MAAM,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAA;IACzF,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAA;IAChC,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,IAAI,GAAG,CAAA;IAC9C,MAAM,KAAK,GAAG,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAA;IAClG,MAAM,KAAK,GAAG,aAAa,EAAE,CAAA;IAC7B,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAA;IACrC,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,IAAI,UAAU,GAAG,CAAC,CAAA;IAElB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;YAAE,MAAK;QAC9B,IAAI,IAAI,CAAC,IAAI,GAAG,gBAAgB,EAAE,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;YAClC,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,IAAI,sBAAsB,eAAe,CAAC,gBAAgB,EAAE,CAAC,mEAAmE,CAAC,CAAA;YAC5K,CAAC;YACD,SAAQ;QACV,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,GAAG,wBAAwB,EAAE,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;YACvC,IAAI,YAAY;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,IAAI,oCAAoC,eAAe,CAAC,wBAAwB,CAAC,sCAAsC,CAAC,CAAA;YACnL,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAA;YACxB,IAAI,YAAY;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;YACnH,MAAK;QACP,CAAC;QACD,IAAI,CAAC;YACH,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;gBACxD,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;oBAAE,SAAQ;gBAC/C,QAAQ,IAAI,CAAC,CAAA;gBACb,UAAU,IAAI,CAAC,CAAA;gBACf,IAAI,IAAI,KAAK,oBAAoB;oBAAE,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;qBAC1E,IAAI,IAAI,KAAK,OAAO;oBAAE,WAAW,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;;oBACzE,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;gBAC9G,IAAI,CAAC,MAAM,CAAC,YAAY;oBAAE,MAAK;gBAC/B,SAAQ;YACV,CAAC;YAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;gBAC9G,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;oBACpB,QAAQ,IAAI,CAAC,CAAA;oBACb,UAAU,IAAI,WAAW,CAAA;gBAC3B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAA;gBACzF,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;oBACpB,QAAQ,IAAI,CAAC,CAAA;oBACb,UAAU,IAAI,WAAW,CAAA;oBACzB,WAAW,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;gBACjG,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBAC1C,IAAI,gCAAgC,CAAC,IAAI,CAAC,OAAO,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;qBAC1E,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;;oBAC7E,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAChC,CAAC;YACD,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,KAAK,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;YACjI,CAAC;YACD,MAAM,CAAC,YAAY,IAAI,CAAC,CAAA;QAC1B,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,YAAY;YAAE,MAAK;IACjC,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM;QAAE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAA;IACvE,IAAI,cAAc,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,gBAAgB;QAAE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAA;IACnF,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS,CAAA;IACvC,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,IAAI,eAAe;QAAE,OAAO,CAAC,IAAI,CAAC,4CAA4C,KAAK,aAAa,MAAM,yCAAyC,CAAC,CAAA;IAChJ,IAAI,CAAC,MAAM,CAAC,YAAY;QAAE,OAAO,CAAC,IAAI,CAAC,2DAA2D,MAAM,CAAC,gBAAgB,IAAI,SAAS,EAAE,CAAC,CAAA;IACzI,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC;QACjC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAA;IACvE,MAAM,WAAW,GAAG,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,YAAY,CAAA;IAC/D,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC;QACzE,iBAAiB,EAAE;YACjB,IAAI;YACJ,QAAQ;YACR,QAAQ;YACR,UAAU;YACV,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,WAAW;YACX,eAAe;YACf,GAAG,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC/F,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B;KACF,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codepage-bridge-mcp",
3
- "version": "0.1.8",
3
+ "version": "0.2.0",
4
4
  "description": "Encoding-transparent MCP file tools for legacy codepages in Claude Code",
5
5
  "license": "MIT",
6
6
  "type": "module",