@massa-ai/core 1.17.0 → 1.19.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.
- package/dist/data/memory/observation-contract.d.ts +14 -2
- package/dist/data/memory/observation-contract.d.ts.map +1 -1
- package/dist/data/memory/observation-contract.js.map +1 -1
- package/dist/data/memory/observation-repository-pg.d.ts +2 -2
- package/dist/data/memory/observation-repository-pg.d.ts.map +1 -1
- package/dist/data/memory/observation-repository-pg.js.map +1 -1
- package/dist/kernel/sanitize/credential-scrub.d.ts +63 -0
- package/dist/kernel/sanitize/credential-scrub.d.ts.map +1 -0
- package/dist/kernel/sanitize/credential-scrub.js +119 -0
- package/dist/kernel/sanitize/credential-scrub.js.map +1 -0
- package/dist/services/cache/lru-evict.d.ts +63 -0
- package/dist/services/cache/lru-evict.d.ts.map +1 -0
- package/dist/services/cache/lru-evict.js +76 -0
- package/dist/services/cache/lru-evict.js.map +1 -0
- package/dist/services/file-read/file-content-cache.d.ts +41 -0
- package/dist/services/file-read/file-content-cache.d.ts.map +1 -0
- package/dist/services/file-read/file-content-cache.js +109 -0
- package/dist/services/file-read/file-content-cache.js.map +1 -0
- package/dist/services/file-read/file-metadata.d.ts +23 -0
- package/dist/services/file-read/file-metadata.d.ts.map +1 -0
- package/dist/services/file-read/file-metadata.js +127 -0
- package/dist/services/file-read/file-metadata.js.map +1 -0
- package/dist/services/file-read/line-range.d.ts +91 -0
- package/dist/services/file-read/line-range.d.ts.map +1 -0
- package/dist/services/file-read/line-range.js +146 -0
- package/dist/services/file-read/line-range.js.map +1 -0
- package/dist/services/file-read/path-containment.d.ts +49 -0
- package/dist/services/file-read/path-containment.d.ts.map +1 -0
- package/dist/services/file-read/path-containment.js +128 -0
- package/dist/services/file-read/path-containment.js.map +1 -0
- package/dist/services/file-read/project-root-cache.d.ts +21 -0
- package/dist/services/file-read/project-root-cache.d.ts.map +1 -0
- package/dist/services/file-read/project-root-cache.js +78 -0
- package/dist/services/file-read/project-root-cache.js.map +1 -0
- package/dist/services/file-read/read-file.service.d.ts +68 -0
- package/dist/services/file-read/read-file.service.d.ts.map +1 -0
- package/dist/services/file-read/read-file.service.js +222 -0
- package/dist/services/file-read/read-file.service.js.map +1 -0
- package/dist/services/hooks/co-retrieval-hook.js +1 -1
- package/dist/services/hooks/co-retrieval-hook.js.map +1 -1
- package/dist/services/hooks/hook-service.d.ts.map +1 -1
- package/dist/services/hooks/hook-service.js +14 -1
- package/dist/services/hooks/hook-service.js.map +1 -1
- package/dist/services/index.d.ts +5 -5
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +4 -4
- package/dist/services/index.js.map +1 -1
- package/dist/services/indexing/acquire-indexing-lease.d.ts +34 -0
- package/dist/services/indexing/acquire-indexing-lease.d.ts.map +1 -0
- package/dist/services/indexing/acquire-indexing-lease.js +101 -0
- package/dist/services/indexing/acquire-indexing-lease.js.map +1 -0
- package/dist/services/indexing/execute-indexing.d.ts +33 -0
- package/dist/services/indexing/execute-indexing.d.ts.map +1 -0
- package/dist/services/indexing/execute-indexing.js +136 -0
- package/dist/services/indexing/execute-indexing.js.map +1 -0
- package/dist/services/jobs/memory-consolidation-job.js +1 -1
- package/dist/services/jobs/memory-consolidation-job.js.map +1 -1
- package/dist/services/memory/memory-controller.js +1 -1
- package/dist/services/memory/memory-controller.js.map +1 -1
- package/dist/services/memory-graph/graph-queries.d.ts.map +1 -0
- package/dist/services/memory-graph/graph-queries.js.map +1 -0
- package/dist/services/memory-graph/graph-store-factory.d.ts.map +1 -0
- package/dist/services/memory-graph/graph-store-factory.js.map +1 -0
- package/dist/services/memory-graph/graph-store-pg.d.ts.map +1 -0
- package/dist/services/memory-graph/graph-store-pg.js.map +1 -0
- package/dist/services/memory-graph/index.d.ts.map +1 -0
- package/dist/services/memory-graph/index.js.map +1 -0
- package/dist/services/memory-graph/memory-graph.service.d.ts.map +1 -0
- package/dist/services/memory-graph/memory-graph.service.js.map +1 -0
- package/dist/services/memory-graph/relation-extractor.d.ts.map +1 -0
- package/dist/services/memory-graph/relation-extractor.js.map +1 -0
- package/dist/services/memory-graph/types.d.ts.map +1 -0
- package/dist/services/memory-graph/types.js.map +1 -0
- package/dist/services/project-identity/invalidator-registry.d.ts +9 -3
- package/dist/services/project-identity/invalidator-registry.d.ts.map +1 -1
- package/dist/services/project-identity/invalidator-registry.js +9 -3
- package/dist/services/project-identity/invalidator-registry.js.map +1 -1
- package/dist/services/project-identity/production-wiring.d.ts +11 -2
- package/dist/services/project-identity/production-wiring.d.ts.map +1 -1
- package/dist/services/project-identity/production-wiring.js +11 -2
- package/dist/services/project-identity/production-wiring.js.map +1 -1
- package/dist/services/project-identity/project-root-identity.d.ts +11 -0
- package/dist/services/project-identity/project-root-identity.d.ts.map +1 -0
- package/dist/services/project-identity/project-root-identity.js +51 -0
- package/dist/services/project-identity/project-root-identity.js.map +1 -0
- package/dist/services/search/file-filter-cache.d.ts +30 -1
- package/dist/services/search/file-filter-cache.d.ts.map +1 -1
- package/dist/services/search/file-filter-cache.js +32 -13
- package/dist/services/search/file-filter-cache.js.map +1 -1
- package/dist/services/search/graph-stream.js +1 -1
- package/dist/services/search/graph-stream.js.map +1 -1
- package/dist/services/symbol/symbol-graph.service.d.ts +12 -1
- package/dist/services/symbol/symbol-graph.service.d.ts.map +1 -1
- package/dist/services/symbol/symbol-graph.service.js +14 -7
- package/dist/services/symbol/symbol-graph.service.js.map +1 -1
- package/dist/services/web/web-controller.d.ts.map +1 -1
- package/dist/services/web/web-controller.js +6 -7
- package/dist/services/web/web-controller.js.map +1 -1
- package/dist/tools/batch_execute.d.ts +0 -3
- package/dist/tools/batch_execute.d.ts.map +1 -1
- package/dist/tools/batch_execute.js.map +1 -1
- package/dist/tools/compact_snapshot.d.ts.map +1 -1
- package/dist/tools/compact_snapshot.js +18 -7
- package/dist/tools/compact_snapshot.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index_project.d.ts +0 -19
- package/dist/tools/index_project.d.ts.map +1 -1
- package/dist/tools/index_project.js +38 -142
- package/dist/tools/index_project.js.map +1 -1
- package/dist/tools/read_file.d.ts +9 -72
- package/dist/tools/read_file.d.ts.map +1 -1
- package/dist/tools/read_file.js +22 -487
- package/dist/tools/read_file.js.map +1 -1
- package/package.json +2 -2
- package/dist/data/vector/hybrid-search.d.ts +0 -71
- package/dist/data/vector/hybrid-search.d.ts.map +0 -1
- package/dist/data/vector/hybrid-search.js +0 -243
- package/dist/data/vector/hybrid-search.js.map +0 -1
- package/dist/data/vector/index.d.ts +0 -7
- package/dist/data/vector/index.d.ts.map +0 -1
- package/dist/data/vector/index.js +0 -6
- package/dist/data/vector/index.js.map +0 -1
- package/dist/services/graph/graph-queries.d.ts.map +0 -1
- package/dist/services/graph/graph-queries.js.map +0 -1
- package/dist/services/graph/graph-store-factory.d.ts.map +0 -1
- package/dist/services/graph/graph-store-factory.js.map +0 -1
- package/dist/services/graph/graph-store-pg.d.ts.map +0 -1
- package/dist/services/graph/graph-store-pg.js.map +0 -1
- package/dist/services/graph/index.d.ts.map +0 -1
- package/dist/services/graph/index.js.map +0 -1
- package/dist/services/graph/memory-graph.service.d.ts.map +0 -1
- package/dist/services/graph/memory-graph.service.js.map +0 -1
- package/dist/services/graph/relation-extractor.d.ts.map +0 -1
- package/dist/services/graph/relation-extractor.js.map +0 -1
- package/dist/services/graph/types.d.ts.map +0 -1
- package/dist/services/graph/types.js.map +0 -1
- /package/dist/services/{graph → memory-graph}/graph-queries.d.ts +0 -0
- /package/dist/services/{graph → memory-graph}/graph-queries.js +0 -0
- /package/dist/services/{graph → memory-graph}/graph-store-factory.d.ts +0 -0
- /package/dist/services/{graph → memory-graph}/graph-store-factory.js +0 -0
- /package/dist/services/{graph → memory-graph}/graph-store-pg.d.ts +0 -0
- /package/dist/services/{graph → memory-graph}/graph-store-pg.js +0 -0
- /package/dist/services/{graph → memory-graph}/index.d.ts +0 -0
- /package/dist/services/{graph → memory-graph}/index.js +0 -0
- /package/dist/services/{graph → memory-graph}/memory-graph.service.d.ts +0 -0
- /package/dist/services/{graph → memory-graph}/memory-graph.service.js +0 -0
- /package/dist/services/{graph → memory-graph}/relation-extractor.d.ts +0 -0
- /package/dist/services/{graph → memory-graph}/relation-extractor.js +0 -0
- /package/dist/services/{graph → memory-graph}/types.d.ts +0 -0
- /package/dist/services/{graph → memory-graph}/types.js +0 -0
package/dist/tools/read_file.js
CHANGED
|
@@ -1,36 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @massa-ai/core - Read File Tool
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* - Language detection
|
|
4
|
+
* Schema and delegation only. Everything this tool used to do lives in
|
|
5
|
+
* `services/file-read/` — containment, both caches, metadata, the line range
|
|
6
|
+
* and N9 cap, and `read-file.service.ts` (module 7), which composes them.
|
|
7
|
+
* Deliberately terse: the split's decision record sits in those modules'
|
|
8
|
+
* docblocks, and repeating it here costs this file its 125-line ceiling.
|
|
10
9
|
*/
|
|
11
|
-
import { estimateTokens, sanitizeFilePath } from "@massa-ai/shared";
|
|
12
10
|
import { logger } from "@massa-ai/shared";
|
|
13
|
-
import { CodeCompressor } from "../services/compression/code-compressor.js";
|
|
14
11
|
import { serializeToolResponse } from "./serialize.js";
|
|
15
|
-
import {
|
|
16
|
-
import { workspaceManager } from "../services/workspace/workspace-manager.js";
|
|
17
|
-
import fs from "fs/promises";
|
|
18
|
-
import path from "path";
|
|
19
|
-
/**
|
|
20
|
-
* N9: per-read line ceiling on user-facing read_file output. Default 500;
|
|
21
|
-
* override via `MASSA_AI_READ_FILE_MAX_LINES`. Invalid/negative/zero
|
|
22
|
-
* values fall back to 500 (treat invalid as unset). When the requested
|
|
23
|
-
* range exceeds the cap, `selectedContent` is sliced and `source_clipped:
|
|
24
|
-
* true` is emitted in the same response. The true total line count is
|
|
25
|
-
* always surfaced as `lineRange.actual.total` so `omitted = total - shown`
|
|
26
|
-
* is derivable. Internal enrichment paths (SymbolGraphService.readSnippet
|
|
27
|
-
* /readContext used by go_to_definition) are NOT capped — see
|
|
28
|
-
* symbol-graph.service.ts for the exclusion comment.
|
|
29
|
-
*/
|
|
30
|
-
const MASSA_AI_READ_FILE_MAX_LINES = (() => {
|
|
31
|
-
const v = Number(process.env.MASSA_AI_READ_FILE_MAX_LINES);
|
|
32
|
-
return Number.isFinite(v) && v > 0 ? Math.floor(v) : 500;
|
|
33
|
-
})();
|
|
12
|
+
import { ReadFileService, readFileOptions } from "../services/file-read/read-file.service.js";
|
|
34
13
|
export class ReadFileTool {
|
|
35
14
|
name = "read_file";
|
|
36
15
|
description = "Read file with automatic compression, caching, and symbol metadata. " +
|
|
@@ -96,168 +75,31 @@ export class ReadFileTool {
|
|
|
96
75
|
},
|
|
97
76
|
required: ["filePath"],
|
|
98
77
|
};
|
|
99
|
-
|
|
100
|
-
symbolGraph;
|
|
101
|
-
fileCache = new Map();
|
|
102
|
-
projectRootCache = new Map();
|
|
103
|
-
CACHE_TTL = 60000; // 1 minute
|
|
104
|
-
ROOT_CACHE_TTL = 300000; // 5 minutes
|
|
78
|
+
service;
|
|
105
79
|
/**
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
* to most-recently-used on GET via delete+set, and evict the oldest key on
|
|
110
|
-
* SET while over the cap. Mirrors WebController's WEB_CACHE_MAX_ENTRIES.
|
|
80
|
+
* The parameter's arity and type are public surface — 41 measured construction
|
|
81
|
+
* sites, both transports among them (`design.md` §3.2 as corrected at T9) — so
|
|
82
|
+
* it is forwarded unchanged rather than replaced by an injected service.
|
|
111
83
|
*/
|
|
112
|
-
FILE_CACHE_MAX_ENTRIES = 512;
|
|
113
84
|
constructor(symbolGraph) {
|
|
114
|
-
this.
|
|
115
|
-
this.symbolGraph = symbolGraph;
|
|
116
|
-
// The API keeps one ReadFileTool instance for the process lifetime. A
|
|
117
|
-
// guarded reset/reindex may legitimately move the same projectId to a new
|
|
118
|
-
// canonical root, so refresh the cached root as soon as ETL announces the
|
|
119
|
-
// new run. Without this, relative reads keep resolving against the prior
|
|
120
|
-
// workspace path until the API restarts.
|
|
121
|
-
eventBus.subscribe("indexing:started", ({ projectId, projectPath }) => {
|
|
122
|
-
this.projectRootCache.delete(projectId);
|
|
123
|
-
this.evictOldest(this.projectRootCache);
|
|
124
|
-
this.projectRootCache.set(projectId, projectPath);
|
|
125
|
-
});
|
|
85
|
+
this.service = new ReadFileService(symbolGraph);
|
|
126
86
|
}
|
|
127
87
|
async handle(params) {
|
|
128
88
|
const p = params;
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const
|
|
134
|
-
const includeImports = p.includeImports !== false;
|
|
89
|
+
// Read OUTSIDE the try, at the position the inline prelude occupied: these
|
|
90
|
+
// are the first property accesses on `params`, so a null/undefined argument
|
|
91
|
+
// must keep throwing out of handle() rather than being caught and turned
|
|
92
|
+
// into `{success:false}`. See read-file.service.ts's header.
|
|
93
|
+
const options = readFileOptions(p);
|
|
135
94
|
try {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
// than letting the generic "Failed to read file" catch swallow it.
|
|
140
|
-
const resolved = await this.resolveFilePath(p.filePath, p.projectId);
|
|
141
|
-
if (resolved === null) {
|
|
142
|
-
return {
|
|
143
|
-
success: false,
|
|
144
|
-
error: "Relative filePath requires a projectId (to resolve against the workspace) or an absolute path.",
|
|
145
|
-
};
|
|
95
|
+
const outcome = await this.service.read(p, options);
|
|
96
|
+
if (!outcome.ok) {
|
|
97
|
+
return { success: false, error: outcome.error };
|
|
146
98
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
// workspace lookup), cwd, or an explicit allowlist env
|
|
151
|
-
// MASSA_AI_READ_FILE_ROOTS (colon-separated). Outside → teaching
|
|
152
|
-
// error listing valid roots only (no host path enumeration). Project
|
|
153
|
-
// root + cwd are ALWAYS allowed. sanitizeFilePath strips ../ traversal
|
|
154
|
-
// tokens before the containment check so a crafted relative path can't
|
|
155
|
-
// escape. Does not regress the 500-line cap (N9) — applied later.
|
|
156
|
-
const containment = await this.checkPathContainment(filePath, p.projectId);
|
|
157
|
-
if (!containment.allowed) {
|
|
158
|
-
return {
|
|
159
|
-
success: false,
|
|
160
|
-
error: containment.error,
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
// Keep original relative path for symbol DB queries (DB stores relative paths)
|
|
164
|
-
const relativePath = p.filePath;
|
|
165
|
-
// Calculate line range
|
|
166
|
-
const range = this.calculateRange(p);
|
|
167
|
-
// Read file with cache
|
|
168
|
-
const { content, metadata } = await this.readFileWithCache(filePath, {
|
|
169
|
-
includeSymbols,
|
|
170
|
-
includeImports,
|
|
171
|
-
projectId: p.projectId,
|
|
172
|
-
relativePath,
|
|
99
|
+
return serializeToolResponse(outcome.data, {
|
|
100
|
+
format: options.format,
|
|
101
|
+
fields: options.fields,
|
|
173
102
|
});
|
|
174
|
-
// Extract requested lines
|
|
175
|
-
const lines = content.split("\n");
|
|
176
|
-
const totalLines = lines.length;
|
|
177
|
-
const adjustedRange = this.adjustRange(range, totalLines);
|
|
178
|
-
let selectedContent = this.extractLines(lines, adjustedRange);
|
|
179
|
-
let selectedLineCount = selectedContent.split("\n").length;
|
|
180
|
-
// N9: cap user-facing read_file output at MASSA_AI_READ_FILE_MAX_LINES
|
|
181
|
-
// (default 500). When the adjusted range exceeds the cap, slice the
|
|
182
|
-
// content and emit `source_clipped: true` in the same response so the
|
|
183
|
-
// caller knows lines were omitted. `lineRange.actual.total` keeps the
|
|
184
|
-
// true total line count so `omitted = total - shown` is derivable.
|
|
185
|
-
let source_clipped = false;
|
|
186
|
-
if (selectedLineCount > MASSA_AI_READ_FILE_MAX_LINES) {
|
|
187
|
-
const cappedLines = lines.slice(adjustedRange.start - 1, adjustedRange.start - 1 + MASSA_AI_READ_FILE_MAX_LINES);
|
|
188
|
-
selectedContent = cappedLines.join("\n");
|
|
189
|
-
selectedLineCount = selectedContent.split("\n").length;
|
|
190
|
-
source_clipped = true;
|
|
191
|
-
}
|
|
192
|
-
// Determine if compression is needed
|
|
193
|
-
const shouldAutoCompress = shouldCompress &&
|
|
194
|
-
selectedLineCount > 100 &&
|
|
195
|
-
targetRatio < 1;
|
|
196
|
-
const result = {
|
|
197
|
-
filePath: p.filePath,
|
|
198
|
-
absolutePath: filePath,
|
|
199
|
-
lineRange: {
|
|
200
|
-
requested: {
|
|
201
|
-
start: range.start,
|
|
202
|
-
end: range.end === Infinity ? null : range.end,
|
|
203
|
-
},
|
|
204
|
-
actual: {
|
|
205
|
-
start: adjustedRange.start,
|
|
206
|
-
end: source_clipped
|
|
207
|
-
? adjustedRange.start + selectedLineCount - 1
|
|
208
|
-
: adjustedRange.end,
|
|
209
|
-
total: totalLines,
|
|
210
|
-
},
|
|
211
|
-
selected: selectedLineCount,
|
|
212
|
-
},
|
|
213
|
-
source_clipped,
|
|
214
|
-
metadata: {
|
|
215
|
-
totalLines,
|
|
216
|
-
language: metadata.language,
|
|
217
|
-
...(metadata.symbols && { symbols: metadata.symbols }),
|
|
218
|
-
...(metadata.imports && { imports: metadata.imports }),
|
|
219
|
-
},
|
|
220
|
-
compressed: shouldAutoCompress,
|
|
221
|
-
recommendations: [],
|
|
222
|
-
};
|
|
223
|
-
if (shouldAutoCompress) {
|
|
224
|
-
// Auto-compress
|
|
225
|
-
const compressed = await this.compressor.compress(selectedContent, "code_structure");
|
|
226
|
-
const originalTokens = estimateTokens(selectedContent, "code");
|
|
227
|
-
const compressedTokens = estimateTokens(compressed.compressed, "code");
|
|
228
|
-
const actualRatio = compressedTokens / originalTokens;
|
|
229
|
-
result.content = compressed.compressed;
|
|
230
|
-
result.tokens = {
|
|
231
|
-
original: originalTokens,
|
|
232
|
-
compressed: compressedTokens,
|
|
233
|
-
saved: originalTokens - compressedTokens,
|
|
234
|
-
savingsPercent: Math.round((1 - actualRatio) * 100),
|
|
235
|
-
};
|
|
236
|
-
result.compressionRatio = actualRatio;
|
|
237
|
-
result.recommendations.push(`✓ Auto-compressed ${selectedLineCount} lines (${result.tokens.savingsPercent}% reduction)`);
|
|
238
|
-
}
|
|
239
|
-
else {
|
|
240
|
-
result.content = selectedContent;
|
|
241
|
-
result.tokens = {
|
|
242
|
-
original: estimateTokens(selectedContent, "code"),
|
|
243
|
-
compressed: estimateTokens(selectedContent, "code"),
|
|
244
|
-
saved: 0,
|
|
245
|
-
savingsPercent: 0,
|
|
246
|
-
};
|
|
247
|
-
// Add recommendations for large files
|
|
248
|
-
if (selectedLineCount > 100) {
|
|
249
|
-
result.recommendations.push("💡 Content > 100 lines. Consider compress=true for token savings");
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
// Add usage tips
|
|
253
|
-
if (range.start === 1 && range.end === Infinity) {
|
|
254
|
-
result.recommendations.push("💡 Use lineStart/lineEnd or offset/limit to read specific sections (60% token savings)");
|
|
255
|
-
}
|
|
256
|
-
// Add related files tip if symbols found
|
|
257
|
-
if (metadata.symbols && metadata.symbols.definitions > 0) {
|
|
258
|
-
result.recommendations.push(`💡 Use get_references() to find usages of ${metadata.symbols.definitions} symbols in this file`);
|
|
259
|
-
}
|
|
260
|
-
return serializeToolResponse(result, { format, fields });
|
|
261
103
|
}
|
|
262
104
|
catch (error) {
|
|
263
105
|
logger.error("Failed to read file", error, {
|
|
@@ -269,312 +111,5 @@ export class ReadFileTool {
|
|
|
269
111
|
};
|
|
270
112
|
}
|
|
271
113
|
}
|
|
272
|
-
/**
|
|
273
|
-
* Resolve a filePath to an absolute path.
|
|
274
|
-
*
|
|
275
|
-
* Resolution rules:
|
|
276
|
-
* - Absolute path → returned verbatim (still normalized via path.resolve, but base-independent).
|
|
277
|
-
* - `projectId` present → resolved against the workspace `project_path`. If the
|
|
278
|
-
* workspace lookup fails (no root), this returns null (ambiguous).
|
|
279
|
-
* - No `projectId` AND relative `filePath` → returns null. We deliberately do NOT
|
|
280
|
-
* fall back to `path.resolve(filePath)` against process.cwd(), because a
|
|
281
|
-
relative
|
|
282
|
-
* path arriving without a projectId is ambiguous and historically read from
|
|
283
|
-
* the
|
|
284
|
-
* server's cwd (COVERAGE finding #3). Callers must provide an absolute path or
|
|
285
|
-
* a projectId.
|
|
286
|
-
*
|
|
287
|
-
* Returns null to signal an ambiguous/unsatisfiable path so `handle()` can map it
|
|
288
|
-
* to a distinct, clear error instead of the generic "Failed to read file" catch.
|
|
289
|
-
*/
|
|
290
|
-
async resolveFilePath(filePath, projectId) {
|
|
291
|
-
if (path.isAbsolute(filePath)) {
|
|
292
|
-
return path.resolve(filePath);
|
|
293
|
-
}
|
|
294
|
-
if (projectId) {
|
|
295
|
-
const root = await this.getProjectRoot(projectId);
|
|
296
|
-
if (root) {
|
|
297
|
-
// Wave 5 FR-12: strip ../ traversal tokens from relative paths before
|
|
298
|
-
// resolving under the project root. sanitizeFilePath removes ../ and
|
|
299
|
-
// ..\ segments so a crafted relative path can't escape the root.
|
|
300
|
-
const cleaned = sanitizeFilePath(filePath);
|
|
301
|
-
return path.resolve(root, cleaned);
|
|
302
|
-
}
|
|
303
|
-
return null;
|
|
304
|
-
}
|
|
305
|
-
// Relative path with no projectId — do not guess against cwd.
|
|
306
|
-
return null;
|
|
307
|
-
}
|
|
308
|
-
/**
|
|
309
|
-
* Wave 5 FR-12 / AD-W5-006: filesystem-side path containment.
|
|
310
|
-
*
|
|
311
|
-
* An absolute path is allowed iff it resolves under one of:
|
|
312
|
-
* 1. the project root (workspace lookup for projectId, when provided)
|
|
313
|
-
* 2. process.cwd()
|
|
314
|
-
* 3. an entry in MASSA_AI_READ_FILE_ROOTS (colon-separated env)
|
|
315
|
-
*
|
|
316
|
-
* Project root + cwd are ALWAYS allowed. Outside → teaching error listing
|
|
317
|
-
* valid roots only (no host path enumeration). The check uses path.relative
|
|
318
|
-
* to detect traversal out of a root (a result starting with ".." or an
|
|
319
|
-
* absolute path on another drive means outside).
|
|
320
|
-
*
|
|
321
|
-
* The env allowlist is read at CALL TIME (not config-load time) so test
|
|
322
|
-
* suites and runtime operators can set it without restarting the process.
|
|
323
|
-
* config.readFile.extraRoots mirrors the same env for introspection.
|
|
324
|
-
*
|
|
325
|
-
* Returns { allowed: true } on success, or { allowed: false, error } with a
|
|
326
|
-
* Wave-4-N6-style teaching error listing the valid roots.
|
|
327
|
-
*/
|
|
328
|
-
async checkPathContainment(absoluteFilePath, projectId) {
|
|
329
|
-
// Collect valid roots. Project root is included only when actually
|
|
330
|
-
// resolvable (workspace lookup succeeds); cwd is always available.
|
|
331
|
-
const roots = [];
|
|
332
|
-
if (projectId) {
|
|
333
|
-
const root = await this.getProjectRoot(projectId);
|
|
334
|
-
if (root)
|
|
335
|
-
roots.push(path.resolve(root));
|
|
336
|
-
}
|
|
337
|
-
roots.push(path.resolve(process.cwd()));
|
|
338
|
-
// Read the env allowlist at call time so tests/operators can set it
|
|
339
|
-
// without restarting the process. Colon-separated (POSIX-style).
|
|
340
|
-
const envRoots = (process.env.MASSA_AI_READ_FILE_ROOTS ?? "")
|
|
341
|
-
.split(":")
|
|
342
|
-
.map((s) => s.trim())
|
|
343
|
-
.filter((s) => s.length > 0);
|
|
344
|
-
for (const extra of envRoots) {
|
|
345
|
-
roots.push(path.resolve(extra));
|
|
346
|
-
}
|
|
347
|
-
const target = path.resolve(absoluteFilePath);
|
|
348
|
-
for (const root of roots) {
|
|
349
|
-
const rel = path.relative(root, target);
|
|
350
|
-
// Inside iff rel does not start with ".." and is not absolute (cross-drive).
|
|
351
|
-
if (rel !== "" && !rel.startsWith("..") && !path.isAbsolute(rel)) {
|
|
352
|
-
return { allowed: true };
|
|
353
|
-
}
|
|
354
|
-
// Exact root match (rel === "") is also inside.
|
|
355
|
-
if (rel === "")
|
|
356
|
-
return { allowed: true };
|
|
357
|
-
}
|
|
358
|
-
// Outside all roots → teaching error listing valid roots only.
|
|
359
|
-
const validRootsList = roots.map((r) => ` - ${r}`).join("\n");
|
|
360
|
-
return {
|
|
361
|
-
allowed: false,
|
|
362
|
-
error: `read_file path containment: "${target}" is outside the allowed roots.\n` +
|
|
363
|
-
`Valid roots (project root + cwd + MASSA_AI_READ_FILE_ROOTS):\n${validRootsList}\n` +
|
|
364
|
-
`Provide a filePath that resolves under one of these roots.`,
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
async getProjectRoot(projectId) {
|
|
368
|
-
const cached = this.projectRootCache.get(projectId);
|
|
369
|
-
if (cached !== undefined) {
|
|
370
|
-
// LRU touch: promote this key to most-recently-used.
|
|
371
|
-
this.projectRootCache.delete(projectId);
|
|
372
|
-
this.projectRootCache.set(projectId, cached);
|
|
373
|
-
return cached;
|
|
374
|
-
}
|
|
375
|
-
try {
|
|
376
|
-
const workspace = await workspaceManager.getWorkspace(projectId);
|
|
377
|
-
if (workspace?.project_path) {
|
|
378
|
-
this.evictOldest(this.projectRootCache);
|
|
379
|
-
this.projectRootCache.set(projectId, workspace.project_path);
|
|
380
|
-
return workspace.project_path;
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
catch (error) {
|
|
384
|
-
logger.warn("Failed to look up project root", { projectId, error: error.message });
|
|
385
|
-
}
|
|
386
|
-
return null;
|
|
387
|
-
}
|
|
388
|
-
/**
|
|
389
|
-
* Evict the oldest (first-inserted) entries from a cache Map until it is
|
|
390
|
-
* under FILE_CACHE_MAX_ENTRIES. Called BEFORE the new insert so the cap is
|
|
391
|
-
* honored post-insert with a single iteration.
|
|
392
|
-
*/
|
|
393
|
-
evictOldest(cache) {
|
|
394
|
-
while (cache.size >= this.FILE_CACHE_MAX_ENTRIES) {
|
|
395
|
-
const oldest = cache.keys().next().value;
|
|
396
|
-
if (oldest === undefined)
|
|
397
|
-
break;
|
|
398
|
-
cache.delete(oldest);
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
calculateRange(params) {
|
|
402
|
-
// Priority: lineStart/lineEnd > offset/limit > entire file
|
|
403
|
-
if (params.lineStart !== undefined && params.lineEnd !== undefined) {
|
|
404
|
-
return {
|
|
405
|
-
start: Math.max(1, params.lineStart),
|
|
406
|
-
end: params.lineEnd,
|
|
407
|
-
};
|
|
408
|
-
}
|
|
409
|
-
if (params.offset !== undefined) {
|
|
410
|
-
const offset = Math.max(1, params.offset);
|
|
411
|
-
const limit = params.limit || 1000;
|
|
412
|
-
return {
|
|
413
|
-
start: offset,
|
|
414
|
-
end: offset + limit - 1,
|
|
415
|
-
};
|
|
416
|
-
}
|
|
417
|
-
return {
|
|
418
|
-
start: 1,
|
|
419
|
-
end: Infinity,
|
|
420
|
-
};
|
|
421
|
-
}
|
|
422
|
-
adjustRange(range, totalLines) {
|
|
423
|
-
const start = Math.max(1, Math.min(range.start, totalLines));
|
|
424
|
-
const end = range.end === Infinity
|
|
425
|
-
? totalLines
|
|
426
|
-
: Math.min(range.end, totalLines);
|
|
427
|
-
return { start, end };
|
|
428
|
-
}
|
|
429
|
-
async readFileWithCache(filePath, options) {
|
|
430
|
-
// Cache key MUST include every option that changes metadata extraction.
|
|
431
|
-
// Keying on filePath alone returned stale, options-baked metadata for a
|
|
432
|
-
// later read of the same file with different includeSymbols/includeImports/
|
|
433
|
-
// projectId/relativePath (the only e2e red — 08.search F33). Deliberately
|
|
434
|
-
// exclude offset/limit/lineStart/lineEnd/compress/targetRatio/format: those
|
|
435
|
-
// are applied AFTER the cache in handle(), and coalescing them across reads
|
|
436
|
-
// is the cache's purpose.
|
|
437
|
-
const cacheKey = JSON.stringify({
|
|
438
|
-
filePath,
|
|
439
|
-
includeSymbols: options.includeSymbols ?? false,
|
|
440
|
-
includeImports: options.includeImports ?? false,
|
|
441
|
-
projectId: options.projectId ?? null,
|
|
442
|
-
relativePath: options.relativePath ?? null,
|
|
443
|
-
});
|
|
444
|
-
const cached = this.fileCache.get(cacheKey);
|
|
445
|
-
// Check cache validity
|
|
446
|
-
if (cached && Date.now() - cached.timestamp < this.CACHE_TTL) {
|
|
447
|
-
logger.debug("File cache hit", { filePath });
|
|
448
|
-
// LRU touch: promote this key to most-recently-used so hot files survive
|
|
449
|
-
// eviction. delete+set reorders the key to the end (newest).
|
|
450
|
-
this.fileCache.delete(cacheKey);
|
|
451
|
-
this.fileCache.set(cacheKey, cached);
|
|
452
|
-
// Legacy/edge entries may have undefined metadata. Re-extract once and
|
|
453
|
-
// WRITE IT BACK into the cache entry so subsequent hits are served from
|
|
454
|
-
// cache instead of re-extracting on every request.
|
|
455
|
-
if (!cached.metadata) {
|
|
456
|
-
const metadata = await this.extractMetadata(cached.content, filePath, options);
|
|
457
|
-
this.fileCache.set(cacheKey, { ...cached, metadata });
|
|
458
|
-
return { content: cached.content, metadata };
|
|
459
|
-
}
|
|
460
|
-
return {
|
|
461
|
-
content: cached.content,
|
|
462
|
-
metadata: cached.metadata,
|
|
463
|
-
};
|
|
464
|
-
}
|
|
465
|
-
// Read file
|
|
466
|
-
const content = await fs.readFile(filePath, "utf-8");
|
|
467
|
-
const metadata = await this.extractMetadata(content, filePath, options);
|
|
468
|
-
// Update cache (evict oldest if at cap).
|
|
469
|
-
this.evictOldest(this.fileCache);
|
|
470
|
-
this.fileCache.set(cacheKey, {
|
|
471
|
-
content,
|
|
472
|
-
timestamp: Date.now(),
|
|
473
|
-
metadata,
|
|
474
|
-
});
|
|
475
|
-
logger.debug("File read and cached", { filePath });
|
|
476
|
-
return { content, metadata };
|
|
477
|
-
}
|
|
478
|
-
async extractMetadata(content, filePath, options) {
|
|
479
|
-
const lines = content.split("\n");
|
|
480
|
-
const language = this.detectLanguage(filePath);
|
|
481
|
-
const metadata = {
|
|
482
|
-
totalLines: lines.length,
|
|
483
|
-
language,
|
|
484
|
-
};
|
|
485
|
-
// Extract imports if requested
|
|
486
|
-
if (options.includeImports && language) {
|
|
487
|
-
metadata.imports = this.extractImports(lines, language);
|
|
488
|
-
}
|
|
489
|
-
// Get symbol metadata if symbol graph available
|
|
490
|
-
if (options.includeSymbols && this.symbolGraph && options.projectId) {
|
|
491
|
-
try {
|
|
492
|
-
// Symbol DB stores relative paths — use original relative path for queries
|
|
493
|
-
const queryPath = options.relativePath || filePath;
|
|
494
|
-
const { definitions } = await this.symbolGraph.listDefinitions(options.projectId, {
|
|
495
|
-
file: queryPath,
|
|
496
|
-
limit: 100,
|
|
497
|
-
});
|
|
498
|
-
metadata.symbols = {
|
|
499
|
-
definitions: definitions.length,
|
|
500
|
-
references: 0, // Would need separate query
|
|
501
|
-
};
|
|
502
|
-
}
|
|
503
|
-
catch (error) {
|
|
504
|
-
logger.debug("Failed to get symbol metadata", { filePath, error });
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
return metadata;
|
|
508
|
-
}
|
|
509
|
-
extractLines(lines, range) {
|
|
510
|
-
const start = range.start - 1; // Convert to 0-indexed
|
|
511
|
-
const end = range.end;
|
|
512
|
-
const selectedLines = lines.slice(start, end);
|
|
513
|
-
// Add line numbers for context
|
|
514
|
-
return selectedLines
|
|
515
|
-
.map((line, index) => {
|
|
516
|
-
const lineNum = start + index + 1;
|
|
517
|
-
return `${lineNum.toString().padStart(6, " ")}: ${line}`;
|
|
518
|
-
})
|
|
519
|
-
.join("\n");
|
|
520
|
-
}
|
|
521
|
-
detectLanguage(filePath) {
|
|
522
|
-
const ext = path.extname(filePath).toLowerCase();
|
|
523
|
-
const languageMap = {
|
|
524
|
-
".ts": "TypeScript",
|
|
525
|
-
".tsx": "TypeScript",
|
|
526
|
-
".js": "JavaScript",
|
|
527
|
-
".jsx": "JavaScript",
|
|
528
|
-
".vue": "Vue",
|
|
529
|
-
".py": "Python",
|
|
530
|
-
".go": "Go",
|
|
531
|
-
".rs": "Rust",
|
|
532
|
-
".java": "Java",
|
|
533
|
-
".cpp": "C++",
|
|
534
|
-
".c": "C",
|
|
535
|
-
".h": "C",
|
|
536
|
-
".hpp": "C++",
|
|
537
|
-
".cs": "C#",
|
|
538
|
-
".rb": "Ruby",
|
|
539
|
-
".php": "PHP",
|
|
540
|
-
".swift": "Swift",
|
|
541
|
-
".kt": "Kotlin",
|
|
542
|
-
".kts": "Kotlin",
|
|
543
|
-
".scala": "Scala",
|
|
544
|
-
".md": "Markdown",
|
|
545
|
-
".json": "JSON",
|
|
546
|
-
".yaml": "YAML",
|
|
547
|
-
".yml": "YAML",
|
|
548
|
-
".xml": "XML",
|
|
549
|
-
".html": "HTML",
|
|
550
|
-
".css": "CSS",
|
|
551
|
-
".scss": "SCSS",
|
|
552
|
-
".sql": "SQL",
|
|
553
|
-
".sh": "Shell",
|
|
554
|
-
".bash": "Shell",
|
|
555
|
-
};
|
|
556
|
-
return languageMap[ext];
|
|
557
|
-
}
|
|
558
|
-
extractImports(lines, language) {
|
|
559
|
-
const imports = [];
|
|
560
|
-
const importPatterns = {
|
|
561
|
-
TypeScript: /^(import\s+.*?from\s+['"]|import\s+['"])/,
|
|
562
|
-
JavaScript: /^(import\s+.*?from\s+['"]|import\s+['"]|require\s*\(\s*['"])/,
|
|
563
|
-
Python: /^(import\s+|from\s+\S+\s+import)/,
|
|
564
|
-
Go: /^import\s+/,
|
|
565
|
-
Java: /^import\s+/,
|
|
566
|
-
Rust: /^use\s+/,
|
|
567
|
-
};
|
|
568
|
-
const pattern = importPatterns[language];
|
|
569
|
-
if (!pattern)
|
|
570
|
-
return imports;
|
|
571
|
-
for (const line of lines) {
|
|
572
|
-
const trimmed = line.trim();
|
|
573
|
-
if (pattern.test(trimmed)) {
|
|
574
|
-
imports.push(trimmed);
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
return imports;
|
|
578
|
-
}
|
|
579
114
|
}
|
|
580
115
|
//# sourceMappingURL=read_file.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read_file.js","sourceRoot":"","sources":["../../src/tools/read_file.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"read_file.js","sourceRoot":"","sources":["../../src/tools/read_file.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@massa-ai/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.19.0",
|
|
4
4
|
"author": "luizgmassa",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"@ai-sdk/google": "^3.0.19",
|
|
45
45
|
"@ai-sdk/mistral": "^3.0.17",
|
|
46
46
|
"@ai-sdk/openai": "^3.0.24",
|
|
47
|
-
"@massa-ai/shared": "1.
|
|
47
|
+
"@massa-ai/shared": "1.19.0",
|
|
48
48
|
"@prisma/adapter-pg": "^7.5.0",
|
|
49
49
|
"@prisma/client": "^7.5.0",
|
|
50
50
|
"@prisma/client-runtime-utils": "^7.3.0",
|