codepage-bridge-mcp 0.1.9 → 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;
@@ -3,14 +3,18 @@ import { readdir, stat } from 'node:fs/promises';
3
3
  import path from 'node:path';
4
4
  import { TextDecoder } from 'node:util';
5
5
  import picomatch from 'picomatch';
6
- import { normalizeEncoding } from '../encoding/index.js';
6
+ import { decodeText, normalizeEncoding, resolveEncoding } from '../encoding/index.js';
7
7
  import { inspectProjectPath } from '../filesystem/index.js';
8
- import { maxTextFileBytes, formatMebibytes } from '../limits.js';
9
- import { getProjectFileContext, readDecodedFile } from '../core.js';
8
+ import { formatMebibytes, grepLimits, maxTextFileBytes } from '../limits.js';
9
+ import { getProjectFileContext } from '../core.js';
10
10
  import { assertObject, optionalBoolean, optionalInteger, optionalString, rejectUnknown, requiredString, } from '../validation.js';
11
11
  const MAX_GREP_MATCHES_PER_FILE = 10_000;
12
12
  const MAX_GREP_ENTRIES = 10_000;
13
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;
14
18
  const TYPE_GLOBS = {
15
19
  js: ['**/*.js', '**/*.jsx', '**/*.mjs', '**/*.cjs'],
16
20
  ts: ['**/*.ts', '**/*.tsx', '**/*.mts', '**/*.cts'],
@@ -32,12 +36,19 @@ const TYPE_GLOBS = {
32
36
  };
33
37
  export function parseGrepInput(value) {
34
38
  assertObject(value);
35
- 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'];
36
40
  rejectUnknown(value, allowed);
37
41
  const outputMode = optionalString(value, 'output_mode');
38
42
  if (outputMode !== undefined && !['content', 'files_with_matches', 'count'].includes(outputMode)) {
39
43
  throw new Error('output_mode must be content, files_with_matches, or count');
40
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
+ }
41
52
  const result = { pattern: requiredString(value, 'pattern') };
42
53
  for (const key of ['path', 'glob', 'type']) {
43
54
  const item = optionalString(value, key);
@@ -46,6 +57,8 @@ export function parseGrepInput(value) {
46
57
  }
47
58
  if (outputMode !== undefined)
48
59
  result.output_mode = outputMode;
60
+ if (scanMode !== undefined)
61
+ result.scan_mode = scanMode;
49
62
  for (const key of ['-i', '-n', '-o', 'multiline']) {
50
63
  const item = optionalBoolean(value, key);
51
64
  if (item !== undefined)
@@ -58,100 +71,224 @@ export function parseGrepInput(value) {
58
71
  }
59
72
  return result;
60
73
  }
61
- function matchesType(relative, type) {
62
- 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
+ }
63
106
  return true;
64
- const patterns = TYPE_GLOBS[type];
65
- if (!patterns)
66
- throw new Error(`Unsupported file type: ${type}`);
67
- 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
+ }
68
147
  }
69
- function matchesGlob(relative, glob) {
70
- 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
+ };
71
154
  }
72
- async function* iterateFiles(root, target, glob, type) {
73
- const info = await stat(target);
74
- if (info.isFile()) {
75
- yield target;
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)));
163
+ }
164
+ async function* iterateFiles(root, target, targetInfo, context, matchesPath) {
165
+ if (targetInfo.isFile()) {
166
+ yield { file: target, context: contextForFile(context, target), size: targetInfo.size };
76
167
  return;
77
168
  }
78
- if (!info.isDirectory())
169
+ if (!targetInfo.isDirectory())
79
170
  throw new Error(`Path is not a file or directory: ${target}`);
80
- const visit = async function* (directory) {
171
+ const visit = async function* (directory, relativeDirectory, activeContext) {
81
172
  const entries = await readdir(directory, { withFileTypes: true });
82
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;
83
178
  for (const entry of entries) {
84
179
  if (entry.name === 'node_modules' || entry.name === '.git' || entry.name === 'dist')
85
180
  continue;
86
181
  const absolute = path.join(directory, entry.name);
87
- const relative = path.relative(root, absolute).split(path.sep).join('/');
88
- if (entry.isDirectory())
89
- yield* visit(absolute);
90
- else if (entry.isFile() && matchesGlob(relative, glob) && matchesType(relative, type))
91
- yield absolute;
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 };
194
+ }
92
195
  }
93
196
  };
94
- yield* visit(target);
197
+ yield* visit(target, path.relative(root, target).split(path.sep).join('/'), context);
95
198
  }
96
199
  function responseState() {
97
200
  return { entries: [], count: 0, characters: 0, truncated: false };
98
201
  }
99
202
  function appendEntry(state, entry, offset, limit) {
203
+ return appendEntryParts(state, [entry], offset, limit);
204
+ }
205
+ function appendEntryParts(state, parts, offset, limit) {
100
206
  if (state.truncated)
101
207
  return false;
102
208
  if (state.count >= offset && state.entries.length < limit) {
103
- if (state.characters + entry.length > MAX_GREP_RESPONSE_CHARS) {
209
+ const length = parts.reduce((total, part) => total + part.length, 0);
210
+ if (state.characters + length > MAX_GREP_RESPONSE_CHARS) {
104
211
  state.truncated = true;
105
212
  return false;
106
213
  }
107
- state.entries.push(entry);
108
- state.characters += entry.length + 1;
214
+ state.entries.push(parts.join(''));
215
+ state.characters += length + 1;
109
216
  }
110
217
  state.count += 1;
111
218
  return true;
112
219
  }
113
- function onlyMatches(line, expression) {
220
+ function* onlyMatches(line, expression) {
114
221
  const global = new RegExp(expression.source, expression.flags.includes('g') ? expression.flags : `${expression.flags}g`);
115
- return [...line.matchAll(global)].map(match => match[0]).filter(Boolean);
222
+ for (const match of line.matchAll(global)) {
223
+ if (match[0])
224
+ yield match[0];
225
+ }
116
226
  }
117
227
  function testLine(line, expression) {
118
228
  expression.lastIndex = 0;
119
229
  return expression.test(line);
120
230
  }
121
- async function* readSearchableLines(file) {
122
- const context = await getProjectFileContext(file);
123
- const safe = await inspectProjectPath(context.root, file);
124
- const info = await stat(safe.target);
125
- const maximumBytes = maxTextFileBytes();
126
- if (info.size > maximumBytes) {
127
- throw new Error(`File exceeds the ${formatMebibytes(maximumBytes)} search limit. Set CODEPAGE_BRIDGE_MAX_TEXT_FILE_MIB to raise it.`);
128
- }
129
- const encoding = normalizeEncoding(context.encoding);
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);
130
239
  const decoder = new TextDecoder(encoding, { fatal: true });
131
240
  let pending = '';
132
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
+ };
133
255
  try {
134
- for await (const chunk of createReadStream(safe.target)) {
256
+ for await (const chunk of createReadStream(file.file, { highWaterMark: 64 * 1024 })) {
257
+ if (!budget.addBytes(chunk.length))
258
+ return;
135
259
  let decoded = decoder.decode(chunk, { stream: true });
136
- if (trailingCarriageReturn) {
137
- decoded = `${decoded.startsWith('\n') ? '' : '\n'}${decoded}`;
138
- trailingCarriageReturn = false;
139
- }
260
+ if (trailingCarriageReturn && !decoded.startsWith('\n'))
261
+ decoded = `\n${decoded}`;
262
+ trailingCarriageReturn = false;
140
263
  if (decoded.endsWith('\r')) {
141
264
  decoded = decoded.slice(0, -1);
142
265
  trailingCarriageReturn = true;
143
266
  }
144
267
  decoded = decoded.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
145
- const lines = `${pending}${decoded}`.split('\n');
146
- pending = lines.pop() ?? '';
147
- yield* lines;
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);
148
278
  }
149
279
  let decoded = decoder.decode();
150
- if (trailingCarriageReturn)
151
- decoded = `${decoded.startsWith('\n') ? '' : '\n'}${decoded}`;
280
+ if (trailingCarriageReturn && !decoded.startsWith('\n'))
281
+ decoded = `\n${decoded}`;
152
282
  decoded = decoded.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
153
- for (const line of `${pending}${decoded}`.split('\n'))
154
- yield line;
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);
155
292
  }
156
293
  catch (error) {
157
294
  if (error instanceof TypeError)
@@ -159,34 +296,59 @@ async function* readSearchableLines(file) {
159
296
  throw error;
160
297
  }
161
298
  }
162
- async function countLineMatches(file, expression) {
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) {
163
313
  let matches = 0;
164
- for await (const line of readSearchableLines(file)) {
314
+ for await (const line of readSearchableLines(file, budget)) {
165
315
  if (!testLine(line, expression))
166
316
  continue;
167
317
  matches += 1;
318
+ if (firstOnly)
319
+ return matches;
168
320
  if (matches > MAX_GREP_MATCHES_PER_FILE) {
169
321
  throw new Error(`File has more than ${MAX_GREP_MATCHES_PER_FILE} matches. Narrow the search pattern.`);
170
322
  }
171
323
  }
172
324
  return matches;
173
325
  }
174
- function formatLine(file, line, text, direct, input, includeFile) {
175
- const separator = direct ? ':' : '-';
176
- const number = input['-n'] ?? true;
177
- return `${includeFile ? `${file}${separator}` : ''}${number ? `${line}${separator}` : ''}${text}`;
178
- }
179
- async function collectContent(file, expression, input, includeFile, state, offset, limit) {
326
+ async function collectContent(file, expression, input, includeFile, state, offset, limit, budget) {
180
327
  const context = input.context ?? input['-C'];
181
328
  const before = context ?? input['-B'] ?? 0;
182
329
  const after = context ?? input['-A'] ?? 0;
183
330
  const previousLines = [];
331
+ let previousLineChars = 0;
184
332
  let previousOutputLine = 0;
185
333
  let afterUntil = 0;
186
334
  let matches = 0;
187
335
  let lineNumber = 0;
188
- for await (const line of readSearchableLines(file)) {
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)) {
189
349
  lineNumber += 1;
350
+ if (!budget.checkTime())
351
+ return matches;
190
352
  const direct = testLine(line, expression);
191
353
  if (direct) {
192
354
  matches += 1;
@@ -195,104 +357,104 @@ async function collectContent(file, expression, input, includeFile, state, offse
195
357
  }
196
358
  if (input['-o']) {
197
359
  for (const part of onlyMatches(line, expression)) {
198
- appendEntry(state, `${includeFile ? `${file}:` : ''}${input['-n'] ?? true ? `${lineNumber}:` : ''}${part}`, offset, limit);
360
+ if (!budget.consumeOnlyMatch())
361
+ return matches;
362
+ appendEntryParts(state, [
363
+ includeFile ? `${file.file}:` : '',
364
+ input['-n'] ?? true ? `${lineNumber}:` : '',
365
+ part,
366
+ ], offset, limit);
199
367
  }
200
368
  }
201
369
  else {
202
370
  for (const previous of previousLines) {
203
371
  if (previousOutputLine > 0 && previous.line > previousOutputLine + 1)
204
372
  appendEntry(state, '--', offset, limit);
205
- appendEntry(state, formatLine(file, previous.line, previous.text, false, input, includeFile), offset, limit);
373
+ appendFormattedLine(state, file.file, previous.line, previous.text, false, input, includeFile, offset, limit);
206
374
  previousOutputLine = previous.line;
207
375
  }
208
376
  previousLines.length = 0;
377
+ previousLineChars = 0;
209
378
  if (previousOutputLine > 0 && lineNumber > previousOutputLine + 1)
210
379
  appendEntry(state, '--', offset, limit);
211
- appendEntry(state, formatLine(file, lineNumber, line, true, input, includeFile), offset, limit);
380
+ appendFormattedLine(state, file.file, lineNumber, line, true, input, includeFile, offset, limit);
212
381
  previousOutputLine = lineNumber;
213
382
  afterUntil = Math.max(afterUntil, lineNumber + after);
214
383
  }
215
384
  continue;
216
385
  }
217
386
  if (!input['-o'] && lineNumber <= afterUntil) {
218
- appendEntry(state, formatLine(file, lineNumber, line, false, input, includeFile), offset, limit);
387
+ appendFormattedLine(state, file.file, lineNumber, line, false, input, includeFile, offset, limit);
219
388
  previousOutputLine = lineNumber;
220
389
  continue;
221
390
  }
222
391
  if (!input['-o'] && before > 0) {
223
- previousLines.push({ line: lineNumber, text: line });
224
- if (previousLines.length > before)
225
- previousLines.shift();
392
+ retainPreviousLine({ line: lineNumber, text: line });
226
393
  }
227
394
  }
228
395
  return matches;
229
396
  }
230
- function searchLines(text, expression, onlyMatching) {
231
- const lines = text.split('\n');
232
- const matches = [];
233
- for (let index = 0; index < lines.length; index += 1) {
234
- const line = lines[index] ?? '';
235
- if (!testLine(line, expression))
236
- continue;
237
- if (matches.length >= MAX_GREP_MATCHES_PER_FILE) {
238
- throw new Error(`File has more than ${MAX_GREP_MATCHES_PER_FILE} matches. Narrow the search pattern.`);
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`);
401
+ }
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`);
239
410
  }
240
- matches.push({
241
- line: index + 1,
242
- text: line,
243
- ...(onlyMatching ? { only: onlyMatches(line, expression) } : {}),
244
- });
411
+ if (!budget.addBytes(chunk.length))
412
+ throw budgetError(budget.truncationReason);
413
+ chunks.push(chunk);
414
+ bytesRead += chunk.length;
415
+ }
416
+ try {
417
+ return decodeText(Buffer.concat(chunks, bytesRead), file.context.encoding).text.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
418
+ }
419
+ catch (error) {
420
+ budget.stop('decode_error');
421
+ throw error;
245
422
  }
246
- return matches;
247
423
  }
248
- function formatContent(file, text, matches, input, includeFile) {
249
- const lines = text.split('\n');
250
- const context = input.context ?? input['-C'];
251
- const before = context ?? input['-B'] ?? 0;
252
- const after = context ?? input['-A'] ?? 0;
253
- const withNumbers = input['-n'] ?? true;
254
- const output = [];
424
+ function collectMultilineContent(file, text, expression, input, includeFile, state, offset, limit, budget) {
255
425
  if (input['-o']) {
256
- for (const match of matches) {
257
- for (const part of match.only ?? [])
258
- output.push(`${includeFile ? `${file}:` : ''}${withNumbers ? `${match.line}:` : ''}${part}`);
259
- }
260
- return output;
261
- }
262
- const selected = new Map();
263
- for (const match of matches) {
264
- for (let line = Math.max(1, match.line - before); line <= Math.min(lines.length, match.line + after); line += 1) {
265
- selected.set(line, selected.get(line) === true || line === match.line);
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);
266
430
  }
431
+ return;
267
432
  }
268
- let previous = 0;
269
- for (const [line, direct] of [...selected.entries()].sort((left, right) => left[0] - right[0])) {
270
- if (previous > 0 && line > previous + 1)
271
- output.push('--');
272
- const separator = direct ? ':' : '-';
273
- output.push(`${includeFile ? `${file}${separator}` : ''}${withNumbers ? `${line}${separator}` : ''}${lines[line - 1] ?? ''}`);
274
- previous = line;
275
- }
276
- return output;
433
+ appendEntry(state, formatLine(file.file, 1, text, true, input, includeFile), offset, limit);
277
434
  }
278
- async function readSearchableFile(file) {
279
- const info = await stat(file);
280
- const maximumBytes = maxTextFileBytes();
281
- if (info.size > maximumBytes) {
282
- throw new Error(`File exceeds the ${formatMebibytes(maximumBytes)} search limit. Set CODEPAGE_BRIDGE_MAX_TEXT_FILE_MIB to raise it.`);
283
- }
284
- const context = await getProjectFileContext(file);
285
- return (await readDecodedFile(context)).text;
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})`);
441
+ }
286
442
  }
287
- function appendEntries(state, source, offset, limit) {
288
- for (const entry of source)
289
- appendEntry(state, entry, offset, limit);
443
+ function budgetError(reason) {
444
+ return new Error(`Grep search budget exceeded: ${reason ?? 'unknown'}`);
290
445
  }
291
446
  export async function executeGrep(input) {
447
+ const limits = grepLimits();
448
+ validateContext(input, limits);
292
449
  const targetInput = path.resolve(input.path ?? process.cwd());
293
- const targetInfo = await stat(targetInput);
294
- const targetContext = await getProjectFileContext(targetInfo.isDirectory() ? path.join(targetInput, '.codepage-bridge-search-probe') : targetInput);
295
- const files = iterateFiles(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);
296
458
  const explicitFile = targetInfo.isFile();
297
459
  const flags = `${input['-i'] ? 'i' : ''}${input.multiline ? 'ms' : ''}`;
298
460
  let expression;
@@ -303,65 +465,120 @@ export async function executeGrep(input) {
303
465
  throw new Error(`Invalid regular expression: ${error instanceof Error ? error.message : String(error)}`);
304
466
  }
305
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
+ }
306
472
  const offset = input.offset ?? 0;
307
473
  const requestedLimit = input.head_limit ?? 250;
308
474
  const limit = requestedLimit === 0 ? MAX_GREP_ENTRIES : Math.min(requestedLimit, MAX_GREP_ENTRIES);
309
475
  const state = responseState();
476
+ const budget = new GrepBudget(limits);
310
477
  let numFiles = 0;
311
478
  let numMatches = 0;
312
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
+ }
313
501
  try {
314
502
  if (input.multiline) {
315
- const searchable = await readSearchableFile(file);
316
- expression.lastIndex = 0;
317
- if (!expression.test(searchable))
503
+ const searchable = await readMultilineFile(file, budget);
504
+ if (!testLine(searchable, expression))
318
505
  continue;
319
506
  numFiles += 1;
320
507
  numMatches += 1;
321
508
  if (mode === 'files_with_matches')
322
- appendEntry(state, file, offset, limit);
509
+ appendEntry(state, file.file, offset, limit);
323
510
  else if (mode === 'count')
324
- appendEntry(state, `${file}:1`, offset, limit);
511
+ appendEntry(state, `${file.file}:1`, offset, limit);
325
512
  else
326
- appendEntries(state, formatContent(file, searchable, [{ line: 1, text: searchable }], input, !explicitFile), offset, limit);
513
+ collectMultilineContent(file, searchable, expression, input, !explicitFile, state, offset, limit, budget);
514
+ if (!budget.scanComplete)
515
+ break;
327
516
  continue;
328
517
  }
329
518
  if (mode === 'content') {
330
- const fileMatches = await collectContent(file, expression, input, !explicitFile, state, offset, limit);
519
+ const fileMatches = await collectContent(file, expression, input, !explicitFile, state, offset, limit, budget);
331
520
  if (fileMatches > 0) {
332
521
  numFiles += 1;
333
522
  numMatches += fileMatches;
334
523
  }
335
- continue;
336
524
  }
337
- const fileMatches = await countLineMatches(file, expression);
338
- if (fileMatches === 0)
339
- continue;
340
- numFiles += 1;
341
- numMatches += fileMatches;
342
- appendEntry(state, mode === 'count' ? `${file}:${fileMatches}` : file, offset, limit);
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
+ }
343
533
  }
344
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
+ }
345
544
  if (explicitFile) {
346
- const message = error instanceof Error ? error.message : String(error);
347
- throw new Error(`Failed to search ${file}: ${message}`, { cause: error });
545
+ throw new Error(`Failed to search ${file.file}: ${budgetError(budget.truncationReason).message}: ${message}`, { cause: error });
348
546
  }
547
+ budget.skippedFiles += 1;
349
548
  }
549
+ if (!budget.scanComplete)
550
+ break;
350
551
  }
351
552
  if (state.count > offset + state.entries.length)
352
553
  state.truncated = true;
353
554
  if (requestedLimit === 0 && state.count >= MAX_GREP_ENTRIES)
354
555
  state.truncated = true;
355
- const suffix = state.truncated
356
- ? `\n\n[Showing results with pagination = limit: ${limit}, offset: ${offset}; output is capped for server stability]`
357
- : '';
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;
358
566
  return {
359
567
  content: [{ type: 'text', text: `${state.entries.join('\n')}${suffix}` }],
360
568
  structuredContent: {
361
569
  mode,
570
+ scanMode,
362
571
  numFiles,
363
572
  numMatches,
364
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,
365
582
  },
366
583
  };
367
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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codepage-bridge-mcp",
3
- "version": "0.1.9",
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",