@caplab/read 0.1.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.
Files changed (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +189 -0
  3. package/dist/cjs/errors/structured.d.ts +12 -0
  4. package/dist/cjs/errors/structured.d.ts.map +1 -0
  5. package/dist/cjs/errors/structured.js +124 -0
  6. package/dist/cjs/errors/structured.js.map +1 -0
  7. package/dist/cjs/factory.d.ts +3 -0
  8. package/dist/cjs/factory.d.ts.map +1 -0
  9. package/dist/cjs/factory.js +92 -0
  10. package/dist/cjs/factory.js.map +1 -0
  11. package/dist/cjs/fs/binary.d.ts +4 -0
  12. package/dist/cjs/fs/binary.d.ts.map +1 -0
  13. package/dist/cjs/fs/binary.js +116 -0
  14. package/dist/cjs/fs/binary.js.map +1 -0
  15. package/dist/cjs/fs/directory.d.ts +3 -0
  16. package/dist/cjs/fs/directory.d.ts.map +1 -0
  17. package/dist/cjs/fs/directory.js +163 -0
  18. package/dist/cjs/fs/directory.js.map +1 -0
  19. package/dist/cjs/fs/reader.d.ts +3 -0
  20. package/dist/cjs/fs/reader.d.ts.map +1 -0
  21. package/dist/cjs/fs/reader.js +145 -0
  22. package/dist/cjs/fs/reader.js.map +1 -0
  23. package/dist/cjs/index.d.ts +3 -0
  24. package/dist/cjs/index.d.ts.map +1 -0
  25. package/dist/cjs/index.js +7 -0
  26. package/dist/cjs/index.js.map +1 -0
  27. package/dist/cjs/output/formatter.d.ts +4 -0
  28. package/dist/cjs/output/formatter.d.ts.map +1 -0
  29. package/dist/cjs/output/formatter.js +26 -0
  30. package/dist/cjs/output/formatter.js.map +1 -0
  31. package/dist/cjs/output/truncation.d.ts +5 -0
  32. package/dist/cjs/output/truncation.d.ts.map +1 -0
  33. package/dist/cjs/output/truncation.js +10 -0
  34. package/dist/cjs/output/truncation.js.map +1 -0
  35. package/dist/cjs/package.json +1 -0
  36. package/dist/cjs/path/guard.d.ts +5 -0
  37. package/dist/cjs/path/guard.d.ts.map +1 -0
  38. package/dist/cjs/path/guard.js +91 -0
  39. package/dist/cjs/path/guard.js.map +1 -0
  40. package/dist/cjs/path/normalizer.d.ts +3 -0
  41. package/dist/cjs/path/normalizer.d.ts.map +1 -0
  42. package/dist/cjs/path/normalizer.js +47 -0
  43. package/dist/cjs/path/normalizer.js.map +1 -0
  44. package/dist/cjs/path/resolver.d.ts +5 -0
  45. package/dist/cjs/path/resolver.d.ts.map +1 -0
  46. package/dist/cjs/path/resolver.js +73 -0
  47. package/dist/cjs/path/resolver.js.map +1 -0
  48. package/dist/cjs/read/encoding.d.ts +5 -0
  49. package/dist/cjs/read/encoding.d.ts.map +1 -0
  50. package/dist/cjs/read/encoding.js +29 -0
  51. package/dist/cjs/read/encoding.js.map +1 -0
  52. package/dist/cjs/read/multi-file.d.ts +4 -0
  53. package/dist/cjs/read/multi-file.d.ts.map +1 -0
  54. package/dist/cjs/read/multi-file.js +293 -0
  55. package/dist/cjs/read/multi-file.js.map +1 -0
  56. package/dist/cjs/search/adapter.d.ts +3 -0
  57. package/dist/cjs/search/adapter.d.ts.map +1 -0
  58. package/dist/cjs/search/adapter.js +34 -0
  59. package/dist/cjs/search/adapter.js.map +1 -0
  60. package/dist/cjs/types/internal.d.ts +24 -0
  61. package/dist/cjs/types/internal.d.ts.map +1 -0
  62. package/dist/cjs/types/internal.js +4 -0
  63. package/dist/cjs/types/internal.js.map +1 -0
  64. package/dist/cjs/types/public.d.ts +87 -0
  65. package/dist/cjs/types/public.d.ts.map +1 -0
  66. package/dist/cjs/types/public.js +4 -0
  67. package/dist/cjs/types/public.js.map +1 -0
  68. package/dist/errors/structured.d.ts +12 -0
  69. package/dist/errors/structured.d.ts.map +1 -0
  70. package/dist/errors/structured.js +79 -0
  71. package/dist/errors/structured.js.map +1 -0
  72. package/dist/factory.d.ts +3 -0
  73. package/dist/factory.d.ts.map +1 -0
  74. package/dist/factory.js +89 -0
  75. package/dist/factory.js.map +1 -0
  76. package/dist/fs/binary.d.ts +4 -0
  77. package/dist/fs/binary.d.ts.map +1 -0
  78. package/dist/fs/binary.js +79 -0
  79. package/dist/fs/binary.js.map +1 -0
  80. package/dist/fs/directory.d.ts +3 -0
  81. package/dist/fs/directory.d.ts.map +1 -0
  82. package/dist/fs/directory.js +127 -0
  83. package/dist/fs/directory.js.map +1 -0
  84. package/dist/fs/reader.d.ts +3 -0
  85. package/dist/fs/reader.d.ts.map +1 -0
  86. package/dist/fs/reader.js +109 -0
  87. package/dist/fs/reader.js.map +1 -0
  88. package/dist/index.d.ts +3 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +3 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/output/formatter.d.ts +4 -0
  93. package/dist/output/formatter.d.ts.map +1 -0
  94. package/dist/output/formatter.js +22 -0
  95. package/dist/output/formatter.js.map +1 -0
  96. package/dist/output/truncation.d.ts +5 -0
  97. package/dist/output/truncation.d.ts.map +1 -0
  98. package/dist/output/truncation.js +7 -0
  99. package/dist/output/truncation.js.map +1 -0
  100. package/dist/path/guard.d.ts +5 -0
  101. package/dist/path/guard.d.ts.map +1 -0
  102. package/dist/path/guard.js +55 -0
  103. package/dist/path/guard.js.map +1 -0
  104. package/dist/path/normalizer.d.ts +3 -0
  105. package/dist/path/normalizer.d.ts.map +1 -0
  106. package/dist/path/normalizer.js +10 -0
  107. package/dist/path/normalizer.js.map +1 -0
  108. package/dist/path/resolver.d.ts +5 -0
  109. package/dist/path/resolver.d.ts.map +1 -0
  110. package/dist/path/resolver.js +35 -0
  111. package/dist/path/resolver.js.map +1 -0
  112. package/dist/read/encoding.d.ts +5 -0
  113. package/dist/read/encoding.d.ts.map +1 -0
  114. package/dist/read/encoding.js +26 -0
  115. package/dist/read/encoding.js.map +1 -0
  116. package/dist/read/multi-file.d.ts +4 -0
  117. package/dist/read/multi-file.d.ts.map +1 -0
  118. package/dist/read/multi-file.js +257 -0
  119. package/dist/read/multi-file.js.map +1 -0
  120. package/dist/search/adapter.d.ts +3 -0
  121. package/dist/search/adapter.d.ts.map +1 -0
  122. package/dist/search/adapter.js +31 -0
  123. package/dist/search/adapter.js.map +1 -0
  124. package/dist/types/internal.d.ts +24 -0
  125. package/dist/types/internal.d.ts.map +1 -0
  126. package/dist/types/internal.js +3 -0
  127. package/dist/types/internal.js.map +1 -0
  128. package/dist/types/public.d.ts +87 -0
  129. package/dist/types/public.d.ts.map +1 -0
  130. package/dist/types/public.js +3 -0
  131. package/dist/types/public.js.map +1 -0
  132. package/package.json +62 -0
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.validateWorkspaceRoot = validateWorkspaceRoot;
37
+ exports.resolvePath = resolvePath;
38
+ exports.getRelativePath = getRelativePath;
39
+ const path = __importStar(require("node:path"));
40
+ const fs = __importStar(require("node:fs/promises"));
41
+ async function validateWorkspaceRoot(workspaceRoot) {
42
+ try {
43
+ const stat = await fs.stat(workspaceRoot);
44
+ if (!stat.isDirectory()) {
45
+ return null;
46
+ }
47
+ const resolvedRoot = path.resolve(workspaceRoot);
48
+ return {
49
+ workspaceRoot: resolvedRoot,
50
+ maxBytes: 262144,
51
+ maxLines: 2000,
52
+ maxFiles: 20,
53
+ maxTotalBytes: 1048576,
54
+ maxEntries: 1000,
55
+ maxSearchResults: 200,
56
+ };
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ function resolvePath(inputPath, workspaceRoot) {
63
+ if (path.isAbsolute(inputPath)) {
64
+ return path.resolve(inputPath);
65
+ }
66
+ return path.resolve(workspaceRoot, inputPath);
67
+ }
68
+ function getRelativePath(absolutePath, workspaceRoot) {
69
+ const relative = path.relative(workspaceRoot, absolutePath);
70
+ // Normalize to forward slashes for consistency
71
+ return relative.split(path.sep).join('/');
72
+ }
73
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/path/resolver.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,sDAqBC;AAED,kCAKC;AAED,0CAIC;AAtCD,gDAAkC;AAClC,qDAAuC;AAGhC,KAAK,UAAU,qBAAqB,CAAC,aAAqB;IAC/D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAEjD,OAAO;YACL,aAAa,EAAE,YAAY;YAC3B,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,EAAE;YACZ,aAAa,EAAE,OAAO;YACtB,UAAU,EAAE,IAAI;YAChB,gBAAgB,EAAE,GAAG;SACtB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,WAAW,CAAC,SAAiB,EAAE,aAAqB;IAClE,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC;AAED,SAAgB,eAAe,CAAC,YAAoB,EAAE,aAAqB;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC5D,+CAA+C;IAC/C,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function detectFileEncoding(filePath: string, requestedEncoding?: 'utf-8' | 'utf-16le' | 'utf-16be' | 'auto'): Promise<{
2
+ encoding: 'utf-8' | 'utf-16le' | 'utf-16be' | 'unknown';
3
+ error?: string;
4
+ }>;
5
+ //# sourceMappingURL=encoding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../../src/read/encoding.ts"],"names":[],"mappings":"AAEA,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GAC7D,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyBtF"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectFileEncoding = detectFileEncoding;
4
+ const binary_js_1 = require("../fs/binary.js");
5
+ async function detectFileEncoding(filePath, requestedEncoding) {
6
+ if (requestedEncoding && requestedEncoding !== 'auto') {
7
+ // Validate that the requested encoding is supported
8
+ if (requestedEncoding !== 'utf-8' && requestedEncoding !== 'utf-16le' && requestedEncoding !== 'utf-16be') {
9
+ return {
10
+ encoding: 'unknown',
11
+ error: 'unsupported_encoding',
12
+ };
13
+ }
14
+ return {
15
+ encoding: requestedEncoding,
16
+ };
17
+ }
18
+ const detection = await (0, binary_js_1.detectEncoding)(filePath);
19
+ if (detection.encoding === 'unknown') {
20
+ return {
21
+ encoding: 'unknown',
22
+ error: 'unsupported_encoding',
23
+ };
24
+ }
25
+ return {
26
+ encoding: detection.encoding,
27
+ };
28
+ }
29
+ //# sourceMappingURL=encoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../../src/read/encoding.ts"],"names":[],"mappings":";;AAEA,gDA4BC;AA9BD,+CAAiD;AAE1C,KAAK,UAAU,kBAAkB,CACtC,QAAgB,EAChB,iBAA8D;IAE9D,IAAI,iBAAiB,IAAI,iBAAiB,KAAK,MAAM,EAAE,CAAC;QACtD,oDAAoD;QACpD,IAAI,iBAAiB,KAAK,OAAO,IAAI,iBAAiB,KAAK,UAAU,IAAI,iBAAiB,KAAK,UAAU,EAAE,CAAC;YAC1G,OAAO;gBACL,QAAQ,EAAE,SAAS;gBACnB,KAAK,EAAE,sBAAsB;aAC9B,CAAC;QACJ,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,iBAAiB;SAC5B,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,IAAA,0BAAc,EAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,SAAS,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,sBAAsB;SAC9B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,SAAS,CAAC,QAAQ;KAC7B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { MultiFileResult, ReadMultipleFilesOptions } from '../types/public.js';
2
+ import type { WorkspaceConfig } from '../types/internal.js';
3
+ export declare function readMultipleFiles(paths: string[], workspaceConfig: WorkspaceConfig, options?: ReadMultipleFilesOptions): Promise<MultiFileResult>;
4
+ //# sourceMappingURL=multi-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-file.d.ts","sourceRoot":"","sources":["../../../src/read/multi-file.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAkB,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAc5D,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EAAE,EACf,eAAe,EAAE,eAAe,EAChC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,eAAe,CAAC,CA0Q1B"}
@@ -0,0 +1,293 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.readMultipleFiles = readMultipleFiles;
37
+ const fs = __importStar(require("node:fs/promises"));
38
+ const path = __importStar(require("node:path"));
39
+ const reader_js_1 = require("../fs/reader.js");
40
+ const guard_js_1 = require("../path/guard.js");
41
+ const resolver_js_1 = require("../path/resolver.js");
42
+ async function readMultipleFiles(paths, workspaceConfig, options = {}) {
43
+ const maxFiles = options.maxFiles ?? workspaceConfig.maxFiles;
44
+ const maxBytes = options.maxBytes ?? workspaceConfig.maxBytes;
45
+ const maxTotalBytes = options.maxTotalBytes ?? workspaceConfig.maxTotalBytes;
46
+ const maxConcurrency = options.maxConcurrency ?? 5;
47
+ // Validate maxConcurrency to prevent deadlock
48
+ if (!Number.isFinite(maxConcurrency) || maxConcurrency <= 0) {
49
+ throw new Error('maxConcurrency must be a positive finite number');
50
+ }
51
+ const results = [];
52
+ let totalBytesRead = 0;
53
+ let totalBytesSkipped = 0;
54
+ // Phase 1: Stat all files in input order (sequential, deterministic)
55
+ const fileStats = [];
56
+ for (const inputPath of paths) {
57
+ const absolutePath = path.resolve(workspaceConfig.workspaceRoot, inputPath);
58
+ const relativePath = (0, resolver_js_1.getRelativePath)(absolutePath, workspaceConfig.workspaceRoot);
59
+ // Check path boundary
60
+ const boundaryCheck = await (0, guard_js_1.validatePathBoundary)(absolutePath, workspaceConfig.workspaceRoot);
61
+ if (!boundaryCheck.valid) {
62
+ if (boundaryCheck.error === 'not_found') {
63
+ fileStats.push({
64
+ path: absolutePath,
65
+ relativePath,
66
+ size: 0,
67
+ exists: false,
68
+ accessible: false,
69
+ outsideWorkspace: false,
70
+ });
71
+ }
72
+ else if (boundaryCheck.error === 'permission_denied') {
73
+ fileStats.push({
74
+ path: absolutePath,
75
+ relativePath,
76
+ size: 0,
77
+ exists: true,
78
+ accessible: false,
79
+ outsideWorkspace: false,
80
+ });
81
+ }
82
+ else {
83
+ // Outside workspace
84
+ fileStats.push({
85
+ path: absolutePath,
86
+ relativePath,
87
+ size: 0,
88
+ exists: false,
89
+ accessible: false,
90
+ outsideWorkspace: true,
91
+ });
92
+ }
93
+ continue;
94
+ }
95
+ try {
96
+ const stats = await fs.stat(absolutePath);
97
+ fileStats.push({
98
+ path: absolutePath,
99
+ relativePath,
100
+ size: stats.size,
101
+ exists: true,
102
+ accessible: true,
103
+ outsideWorkspace: false,
104
+ });
105
+ }
106
+ catch (error) {
107
+ const isNotFound = error.code === 'ENOENT';
108
+ const isPermissionDenied = error.code === 'EACCES' || error.code === 'EPERM';
109
+ fileStats.push({
110
+ path: absolutePath,
111
+ relativePath,
112
+ size: 0,
113
+ exists: !isNotFound,
114
+ accessible: !isPermissionDenied,
115
+ outsideWorkspace: false,
116
+ });
117
+ }
118
+ }
119
+ // Phase 2: Apply maxFiles limit after stat-phase failures
120
+ let admittedFiles = fileStats.filter(f => f.exists && f.accessible);
121
+ const maxFilesSkipped = fileStats.filter(f => f.exists && f.accessible).slice(maxFiles);
122
+ admittedFiles = admittedFiles.slice(0, maxFiles);
123
+ // Phase 3: Reserve budget based on min(stat.size, effectiveMaxBytes)
124
+ let budgetReserved = 0;
125
+ const admittedWithBudget = [];
126
+ const budgetSkipped = [];
127
+ for (const fileInfo of admittedFiles) {
128
+ const effectiveMaxBytes = Math.min(fileInfo.size, maxBytes);
129
+ if (budgetReserved + effectiveMaxBytes <= maxTotalBytes) {
130
+ budgetReserved += effectiveMaxBytes;
131
+ admittedWithBudget.push(fileInfo);
132
+ }
133
+ else {
134
+ budgetSkipped.push(fileInfo);
135
+ }
136
+ }
137
+ // Phase 4: Read admitted files with bounded parallelism
138
+ const readPromises = [];
139
+ const activePromises = [];
140
+ let index = 0;
141
+ const processNext = async () => {
142
+ while (index < admittedWithBudget.length || activePromises.length > 0) {
143
+ // Fill up to maxConcurrency
144
+ while (index < admittedWithBudget.length && activePromises.length < maxConcurrency) {
145
+ const fileInfo = admittedWithBudget[index++];
146
+ const promise = (async () => {
147
+ try {
148
+ const result = await (0, reader_js_1.readFileWithBudget)(fileInfo.path, maxBytes, workspaceConfig.maxLines, 'auto', workspaceConfig.workspaceRoot);
149
+ results.push({
150
+ path: fileInfo.path,
151
+ relativePath: fileInfo.relativePath,
152
+ result,
153
+ });
154
+ if (result.success) {
155
+ totalBytesRead += result.bytesRead;
156
+ }
157
+ }
158
+ catch (error) {
159
+ // Re-throw unexpected errors (e.g., RangeError from invalid API usage)
160
+ if (error instanceof RangeError || error instanceof TypeError) {
161
+ throw error;
162
+ }
163
+ // Only map known I/O errors to permission_denied
164
+ results.push({
165
+ path: fileInfo.path,
166
+ relativePath: fileInfo.relativePath,
167
+ result: {
168
+ success: false,
169
+ error: 'permission_denied',
170
+ path: fileInfo.path,
171
+ relativePath: fileInfo.relativePath,
172
+ },
173
+ });
174
+ }
175
+ })();
176
+ activePromises.push(promise);
177
+ readPromises.push(promise);
178
+ // Remove from active when done
179
+ promise.then(() => {
180
+ const idx = activePromises.indexOf(promise);
181
+ if (idx !== -1) {
182
+ activePromises.splice(idx, 1);
183
+ }
184
+ }).catch(() => {
185
+ // Ignore errors here - they're already handled in the worker
186
+ const idx = activePromises.indexOf(promise);
187
+ if (idx !== -1) {
188
+ activePromises.splice(idx, 1);
189
+ }
190
+ });
191
+ }
192
+ // Wait for at least one to complete if we're at capacity
193
+ if (activePromises.length >= maxConcurrency) {
194
+ await Promise.race(activePromises);
195
+ }
196
+ else if (index >= admittedWithBudget.length && activePromises.length > 0) {
197
+ // No more to enqueue, wait for remaining
198
+ await Promise.all(activePromises);
199
+ }
200
+ else {
201
+ // Break if nothing to do
202
+ if (index >= admittedWithBudget.length && activePromises.length === 0) {
203
+ break;
204
+ }
205
+ // Small delay to avoid busy-wait
206
+ await new Promise(resolve => setImmediate(resolve));
207
+ }
208
+ }
209
+ };
210
+ await processNext();
211
+ await Promise.all(readPromises);
212
+ // Add stat-phase failures
213
+ for (const fileInfo of fileStats) {
214
+ if (fileInfo.outsideWorkspace) {
215
+ results.push({
216
+ path: fileInfo.path,
217
+ relativePath: fileInfo.relativePath,
218
+ result: {
219
+ success: false,
220
+ error: 'path_outside_workspace',
221
+ path: fileInfo.path,
222
+ relativePath: fileInfo.relativePath,
223
+ },
224
+ });
225
+ }
226
+ else if (!fileInfo.exists) {
227
+ results.push({
228
+ path: fileInfo.path,
229
+ relativePath: fileInfo.relativePath,
230
+ result: {
231
+ success: false,
232
+ error: 'file_not_found',
233
+ path: fileInfo.path,
234
+ relativePath: fileInfo.relativePath,
235
+ },
236
+ });
237
+ }
238
+ else if (!fileInfo.accessible) {
239
+ results.push({
240
+ path: fileInfo.path,
241
+ relativePath: fileInfo.relativePath,
242
+ result: {
243
+ success: false,
244
+ error: 'permission_denied',
245
+ path: fileInfo.path,
246
+ relativePath: fileInfo.relativePath,
247
+ },
248
+ });
249
+ }
250
+ }
251
+ // Add maxFiles skipped files
252
+ for (const fileInfo of maxFilesSkipped) {
253
+ results.push({
254
+ path: fileInfo.path,
255
+ relativePath: fileInfo.relativePath,
256
+ result: {
257
+ success: false,
258
+ error: 'skipped_due_to_max_files',
259
+ path: fileInfo.path,
260
+ relativePath: fileInfo.relativePath,
261
+ },
262
+ });
263
+ }
264
+ // Add budget-skipped files
265
+ for (const fileInfo of budgetSkipped) {
266
+ const effectiveMaxBytes = Math.min(fileInfo.size, maxBytes);
267
+ totalBytesSkipped += effectiveMaxBytes;
268
+ results.push({
269
+ path: fileInfo.path,
270
+ relativePath: fileInfo.relativePath,
271
+ result: {
272
+ success: false,
273
+ error: 'skipped_due_to_budget',
274
+ path: fileInfo.path,
275
+ relativePath: fileInfo.relativePath,
276
+ },
277
+ });
278
+ }
279
+ // Sort results to preserve input order
280
+ const pathToIndex = new Map(paths.map((p, i) => [path.resolve(workspaceConfig.workspaceRoot, p), i]));
281
+ results.sort((a, b) => {
282
+ const indexA = pathToIndex.get(a.path) ?? Infinity;
283
+ const indexB = pathToIndex.get(b.path) ?? Infinity;
284
+ return indexA - indexB;
285
+ });
286
+ return {
287
+ success: true,
288
+ results,
289
+ totalBytesRead,
290
+ totalBytesSkipped,
291
+ };
292
+ }
293
+ //# sourceMappingURL=multi-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-file.js","sourceRoot":"","sources":["../../../src/read/multi-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { WorkspaceConfig } from '../types/internal.js';
2
+ export declare function fileSearch(query: string, workspaceConfig: WorkspaceConfig, options?: any): AsyncGenerator<any, void, unknown>;
3
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/search/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,eAAe,EAChC,OAAO,CAAC,EAAE,GAAG,GACZ,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAqBpC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fileSearch = fileSearch;
4
+ const grep_search_1 = require("@caplab/grep-search");
5
+ function fileSearch(query, workspaceConfig, options) {
6
+ // Use allowlist of safe options to prevent workspace boundary escape
7
+ const safeOptions = {
8
+ query,
9
+ cwd: workspaceConfig.workspaceRoot,
10
+ };
11
+ // Only forward specific safe options, not cwd or other boundary-related options
12
+ if (options?.regex !== undefined)
13
+ safeOptions.regex = options.regex;
14
+ if (options?.caseSensitive !== undefined)
15
+ safeOptions.caseSensitive = options.caseSensitive;
16
+ if (options?.wholeWord !== undefined)
17
+ safeOptions.wholeWord = options.wholeWord;
18
+ if (options?.multiline !== undefined)
19
+ safeOptions.multiline = options.multiline;
20
+ if (options?.extensions !== undefined)
21
+ safeOptions.extensions = options.extensions;
22
+ if (options?.ignore !== undefined)
23
+ safeOptions.ignore = options.ignore;
24
+ if (options?.beforeContext !== undefined)
25
+ safeOptions.beforeContext = options.beforeContext;
26
+ if (options?.afterContext !== undefined)
27
+ safeOptions.afterContext = options.afterContext;
28
+ if (options?.maxDepth !== undefined)
29
+ safeOptions.maxDepth = options.maxDepth;
30
+ // Always apply default maxResults from workspaceConfig
31
+ safeOptions.maxResults = options?.maxResults ?? workspaceConfig.maxSearchResults;
32
+ return (0, grep_search_1.grepSearch)(safeOptions);
33
+ }
34
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/search/adapter.ts"],"names":[],"mappings":";;AAGA,gCAyBC;AA5BD,qDAAiD;AAGjD,SAAgB,UAAU,CACxB,KAAa,EACb,eAAgC,EAChC,OAAa;IAEb,qEAAqE;IACrE,MAAM,WAAW,GAAQ;QACvB,KAAK;QACL,GAAG,EAAE,eAAe,CAAC,aAAa;KACnC,CAAC;IAEF,gFAAgF;IAChF,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS;QAAE,WAAW,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IACpE,IAAI,OAAO,EAAE,aAAa,KAAK,SAAS;QAAE,WAAW,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAC5F,IAAI,OAAO,EAAE,SAAS,KAAK,SAAS;QAAE,WAAW,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAChF,IAAI,OAAO,EAAE,SAAS,KAAK,SAAS;QAAE,WAAW,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAChF,IAAI,OAAO,EAAE,UAAU,KAAK,SAAS;QAAE,WAAW,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACnF,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS;QAAE,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACvE,IAAI,OAAO,EAAE,aAAa,KAAK,SAAS;QAAE,WAAW,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAC5F,IAAI,OAAO,EAAE,YAAY,KAAK,SAAS;QAAE,WAAW,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IACzF,IAAI,OAAO,EAAE,QAAQ,KAAK,SAAS;QAAE,WAAW,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC7E,uDAAuD;IACvD,WAAW,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,eAAe,CAAC,gBAAgB,CAAC;IAEjF,OAAO,IAAA,wBAAU,EAAC,WAAW,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,24 @@
1
+ export interface WorkspaceConfig {
2
+ workspaceRoot: string;
3
+ maxBytes: number;
4
+ maxLines: number;
5
+ maxFiles: number;
6
+ maxTotalBytes: number;
7
+ maxEntries: number;
8
+ maxSearchResults: number;
9
+ }
10
+ export interface FileStat {
11
+ size: number;
12
+ isFile: boolean;
13
+ isDirectory: boolean;
14
+ }
15
+ export interface EncodingDetectionResult {
16
+ encoding: 'utf-8' | 'utf-16le' | 'utf-16be' | 'unknown';
17
+ bom: boolean;
18
+ }
19
+ export interface AdmissionResult {
20
+ admitted: boolean;
21
+ reason?: 'budget_exhausted' | 'max_files_exceeded' | 'stat_failed';
22
+ reservedBytes: number;
23
+ }
24
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../../src/types/internal.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IACxD,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,kBAAkB,GAAG,oBAAoB,GAAG,aAAa,CAAC;IACnE,aAAa,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // Internal implementation types
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../src/types/internal.ts"],"names":[],"mappings":";AAAA,gCAAgC"}
@@ -0,0 +1,87 @@
1
+ export interface WorkspaceReaderOptions {
2
+ workspaceRoot: string;
3
+ maxBytes?: number;
4
+ maxLines?: number;
5
+ maxFiles?: number;
6
+ maxTotalBytes?: number;
7
+ maxEntries?: number;
8
+ maxSearchResults?: number;
9
+ }
10
+ export interface ListDirectoryOptions {
11
+ maxDepth?: number;
12
+ includeHidden?: boolean;
13
+ include?: string[];
14
+ exclude?: string[];
15
+ maxEntries?: number;
16
+ }
17
+ export type DirectoryResult = {
18
+ success: true;
19
+ entries: DirectoryEntry[];
20
+ truncated: boolean;
21
+ } | {
22
+ success: false;
23
+ error: "path_not_found" | "permission_denied" | "path_outside_workspace";
24
+ path: string;
25
+ };
26
+ export interface DirectoryEntry {
27
+ path: string;
28
+ relativePath: string;
29
+ type: "file" | "directory";
30
+ size?: number;
31
+ }
32
+ export interface ReadFileOptions {
33
+ maxBytes?: number;
34
+ maxLines?: number;
35
+ encoding?: "utf-8" | "utf-16le" | "utf-16be" | "auto";
36
+ }
37
+ export type FileReadResult = {
38
+ success: true;
39
+ path: string;
40
+ relativePath: string;
41
+ content: string;
42
+ encoding: string;
43
+ truncatedBytes: boolean;
44
+ truncatedLines: boolean;
45
+ bytesRead: number;
46
+ linesRead: number;
47
+ } | {
48
+ success: false;
49
+ error: "file_not_found" | "permission_denied" | "binary_file" | "unsupported_encoding" | "path_outside_workspace" | "skipped_due_to_budget" | "skipped_due_to_max_files";
50
+ path: string;
51
+ relativePath: string;
52
+ };
53
+ export interface ReadMultipleFilesOptions {
54
+ maxFiles?: number;
55
+ maxBytes?: number;
56
+ maxTotalBytes?: number;
57
+ maxConcurrency?: number;
58
+ }
59
+ export interface MultiFileResult {
60
+ success: true;
61
+ results: Array<{
62
+ path: string;
63
+ relativePath: string;
64
+ result: FileReadResult;
65
+ }>;
66
+ totalBytesRead: number;
67
+ totalBytesSkipped: number;
68
+ }
69
+ export interface FileSearchOptions {
70
+ regex?: boolean;
71
+ wholeWord?: boolean;
72
+ caseSensitive?: boolean;
73
+ multiline?: boolean;
74
+ extensions?: string[];
75
+ ignore?: string[];
76
+ maxDepth?: number;
77
+ beforeContext?: number;
78
+ afterContext?: number;
79
+ maxResults?: number;
80
+ }
81
+ export interface WorkspaceReader {
82
+ listDirectory(path: string, options?: ListDirectoryOptions): Promise<DirectoryResult>;
83
+ readFile(path: string, options?: ReadFileOptions): Promise<FileReadResult>;
84
+ readMultipleFiles(paths: string[], options?: ReadMultipleFilesOptions): Promise<MultiFileResult>;
85
+ fileSearch(query: string, options?: FileSearchOptions): AsyncGenerator<import("@caplab/grep-search").SearchMatch, void, unknown>;
86
+ }
87
+ //# sourceMappingURL=public.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/types/public.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GACxB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAChE;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,wBAAwB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9G,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;CACtD;AAED,MAAM,MAAM,cAAc,GACvB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAChL;IACA,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,aAAa,GAAG,sBAAsB,GAAG,wBAAwB,GAAG,uBAAuB,GAAG,0BAA0B,CAAC;IACzK,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACpB,CAAC;AAEL,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,cAAc,CAAC;KACvB,CAAC,CAAC;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC/B,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACtF,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3E,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACjG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAAC,OAAO,qBAAqB,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;CACjI"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // Public API types for @caplab/read
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=public.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/types/public.ts"],"names":[],"mappings":";AAAA,oCAAoC"}
@@ -0,0 +1,12 @@
1
+ import type { FileReadResult, DirectoryResult } from '../types/public.js';
2
+ export declare function createFileNotFoundResult(filePath: string, workspaceRoot: string): FileReadResult;
3
+ export declare function createPermissionDeniedResult(filePath: string, workspaceRoot: string): FileReadResult;
4
+ export declare function createBinaryFileResult(filePath: string, workspaceRoot: string): FileReadResult;
5
+ export declare function createUnsupportedEncodingResult(filePath: string, workspaceRoot: string): FileReadResult;
6
+ export declare function createPathOutsideWorkspaceResult(filePath: string, workspaceRoot: string): FileReadResult;
7
+ export declare function createSkippedDueToBudgetResult(filePath: string, workspaceRoot: string): FileReadResult;
8
+ export declare function createSkippedDueToMaxFilesResult(filePath: string, workspaceRoot: string): FileReadResult;
9
+ export declare function createDirectoryNotFoundResult(dirPath: string): DirectoryResult;
10
+ export declare function createDirectoryPermissionDeniedResult(dirPath: string): DirectoryResult;
11
+ export declare function createDirectoryOutsideWorkspaceResult(dirPath: string): DirectoryResult;
12
+ //# sourceMappingURL=structured.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured.d.ts","sourceRoot":"","sources":["../../src/errors/structured.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1E,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,cAAc,CAOhG;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,cAAc,CAOpG;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,cAAc,CAO9F;AAED,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,cAAc,CAOvG;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,cAAc,CAOxG;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,cAAc,CAOtG;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,cAAc,CAOxG;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAM9E;AAED,wBAAgB,qCAAqC,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAMtF;AAED,wBAAgB,qCAAqC,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAMtF"}