sdl-mcp 0.11.13 → 0.12.1
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/README.md +4 -4
- package/config/sdlmcp.config.example.json +3 -3
- package/config/sdlmcp.config.schema.json +11 -7
- package/dist/.tsbuildinfo +1 -1
- package/dist/agent/context-seeding.d.ts +14 -0
- package/dist/agent/context-seeding.d.ts.map +1 -1
- package/dist/agent/context-seeding.js +118 -4
- package/dist/agent/context-seeding.js.map +1 -1
- package/dist/cli/commands/index.d.ts +10 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +20 -3
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts +1 -1
- package/dist/cli/commands/init.js +7 -7
- package/dist/cli/commands/tool-actions.d.ts.map +1 -1
- package/dist/cli/commands/tool-actions.js +58 -3
- package/dist/cli/commands/tool-actions.js.map +1 -1
- package/dist/code-mode/action-catalog.d.ts +9 -0
- package/dist/code-mode/action-catalog.d.ts.map +1 -1
- package/dist/code-mode/action-catalog.js +18 -4
- package/dist/code-mode/action-catalog.js.map +1 -1
- package/dist/code-mode/descriptions.d.ts +1 -0
- package/dist/code-mode/descriptions.d.ts.map +1 -1
- package/dist/code-mode/descriptions.js +5 -1
- package/dist/code-mode/descriptions.js.map +1 -1
- package/dist/code-mode/etag-cache.d.ts +9 -2
- package/dist/code-mode/etag-cache.d.ts.map +1 -1
- package/dist/code-mode/etag-cache.js +45 -2
- package/dist/code-mode/etag-cache.js.map +1 -1
- package/dist/code-mode/index.d.ts +8 -0
- package/dist/code-mode/index.d.ts.map +1 -1
- package/dist/code-mode/index.js +39 -8
- package/dist/code-mode/index.js.map +1 -1
- package/dist/code-mode/manual-generator.d.ts.map +1 -1
- package/dist/code-mode/manual-generator.js +24 -21
- package/dist/code-mode/manual-generator.js.map +1 -1
- package/dist/code-mode/ref-resolver.d.ts.map +1 -1
- package/dist/code-mode/ref-resolver.js +30 -6
- package/dist/code-mode/ref-resolver.js.map +1 -1
- package/dist/code-mode/retrieve.d.ts +44 -0
- package/dist/code-mode/retrieve.d.ts.map +1 -0
- package/dist/code-mode/retrieve.js +68 -0
- package/dist/code-mode/retrieve.js.map +1 -0
- package/dist/code-mode/types.d.ts +7 -3
- package/dist/code-mode/types.d.ts.map +1 -1
- package/dist/code-mode/types.js +4 -2
- package/dist/code-mode/types.js.map +1 -1
- package/dist/code-mode/workflow-executor.d.ts.map +1 -1
- package/dist/code-mode/workflow-executor.js +88 -11
- package/dist/code-mode/workflow-executor.js.map +1 -1
- package/dist/code-mode/workflow-parser.d.ts +1 -1
- package/dist/code-mode/workflow-parser.d.ts.map +1 -1
- package/dist/code-mode/workflow-parser.js +32 -3
- package/dist/code-mode/workflow-parser.js.map +1 -1
- package/dist/code-mode/workflow-truncation.d.ts +0 -5
- package/dist/code-mode/workflow-truncation.d.ts.map +1 -1
- package/dist/code-mode/workflow-truncation.js +53 -1
- package/dist/code-mode/workflow-truncation.js.map +1 -1
- package/dist/config/types.d.ts +7 -7
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +6 -6
- package/dist/config/types.js.map +1 -1
- package/dist/db/ladybug-edges.d.ts +12 -0
- package/dist/db/ladybug-edges.d.ts.map +1 -1
- package/dist/db/ladybug-edges.js +26 -0
- package/dist/db/ladybug-edges.js.map +1 -1
- package/dist/domain/types.d.ts +4 -0
- package/dist/domain/types.d.ts.map +1 -1
- package/dist/gateway/descriptions.d.ts.map +1 -1
- package/dist/gateway/descriptions.js +5 -5
- package/dist/gateway/descriptions.js.map +1 -1
- package/dist/gateway/schemas.d.ts +46 -2
- package/dist/gateway/schemas.d.ts.map +1 -1
- package/dist/gateway/schemas.js +25 -8
- package/dist/gateway/schemas.js.map +1 -1
- package/dist/graph/overview.js +9 -1
- package/dist/graph/overview.js.map +1 -1
- package/dist/graph/prefetch.d.ts +1 -0
- package/dist/graph/prefetch.d.ts.map +1 -1
- package/dist/graph/prefetch.js +5 -1
- package/dist/graph/prefetch.js.map +1 -1
- package/dist/indexer/summary-generator.d.ts +6 -0
- package/dist/indexer/summary-generator.d.ts.map +1 -1
- package/dist/indexer/summary-generator.js +241 -86
- package/dist/indexer/summary-generator.js.map +1 -1
- package/dist/indexer/symbol-embedding-text.d.ts +5 -10
- package/dist/indexer/symbol-embedding-text.d.ts.map +1 -1
- package/dist/indexer/symbol-embedding-text.js +200 -0
- package/dist/indexer/symbol-embedding-text.js.map +1 -1
- package/dist/live-index/coordinator.js +1 -1
- package/dist/live-index/coordinator.js.map +1 -1
- package/dist/mcp/context-response-projection.d.ts +0 -10
- package/dist/mcp/context-response-projection.d.ts.map +1 -1
- package/dist/mcp/context-response-projection.js +536 -35
- package/dist/mcp/context-response-projection.js.map +1 -1
- package/dist/mcp/response-compression.d.ts +3 -0
- package/dist/mcp/response-compression.d.ts.map +1 -1
- package/dist/mcp/response-compression.js +21 -14
- package/dist/mcp/response-compression.js.map +1 -1
- package/dist/mcp/server-instructions.js +7 -7
- package/dist/mcp/server-instructions.js.map +1 -1
- package/dist/mcp/token-usage.d.ts +5 -0
- package/dist/mcp/token-usage.d.ts.map +1 -1
- package/dist/mcp/token-usage.js +17 -0
- package/dist/mcp/token-usage.js.map +1 -1
- package/dist/mcp/tool-call-formatter.d.ts.map +1 -1
- package/dist/mcp/tool-call-formatter.js +42 -12
- package/dist/mcp/tool-call-formatter.js.map +1 -1
- package/dist/mcp/tools/buffer.d.ts +1 -0
- package/dist/mcp/tools/buffer.d.ts.map +1 -1
- package/dist/mcp/tools/buffer.js +33 -1
- package/dist/mcp/tools/buffer.js.map +1 -1
- package/dist/mcp/tools/code.d.ts +6 -0
- package/dist/mcp/tools/code.d.ts.map +1 -1
- package/dist/mcp/tools/code.js +92 -13
- package/dist/mcp/tools/code.js.map +1 -1
- package/dist/mcp/tools/file-gateway.d.ts +50 -4
- package/dist/mcp/tools/file-gateway.d.ts.map +1 -1
- package/dist/mcp/tools/file-gateway.js +11 -10
- package/dist/mcp/tools/file-gateway.js.map +1 -1
- package/dist/mcp/tools/policy.d.ts +17 -0
- package/dist/mcp/tools/policy.d.ts.map +1 -1
- package/dist/mcp/tools/policy.js +18 -6
- package/dist/mcp/tools/policy.js.map +1 -1
- package/dist/mcp/tools/prRisk.d.ts +18 -1
- package/dist/mcp/tools/prRisk.d.ts.map +1 -1
- package/dist/mcp/tools/prRisk.js +95 -7
- package/dist/mcp/tools/prRisk.js.map +1 -1
- package/dist/mcp/tools/repo.d.ts.map +1 -1
- package/dist/mcp/tools/repo.js +73 -25
- package/dist/mcp/tools/repo.js.map +1 -1
- package/dist/mcp/tools/response.d.ts.map +1 -1
- package/dist/mcp/tools/response.js +17 -2
- package/dist/mcp/tools/response.js.map +1 -1
- package/dist/mcp/tools/runtime.d.ts +8 -1
- package/dist/mcp/tools/runtime.d.ts.map +1 -1
- package/dist/mcp/tools/runtime.js +84 -15
- package/dist/mcp/tools/runtime.js.map +1 -1
- package/dist/mcp/tools/search-edit/index.d.ts.map +1 -1
- package/dist/mcp/tools/search-edit/index.js +32 -8
- package/dist/mcp/tools/search-edit/index.js.map +1 -1
- package/dist/mcp/tools/search-edit/planner.d.ts +52 -2
- package/dist/mcp/tools/search-edit/planner.d.ts.map +1 -1
- package/dist/mcp/tools/search-edit/planner.js +48 -17
- package/dist/mcp/tools/search-edit/planner.js.map +1 -1
- package/dist/mcp/tools/search-edit/rename.d.ts +20 -0
- package/dist/mcp/tools/search-edit/rename.d.ts.map +1 -0
- package/dist/mcp/tools/search-edit/rename.js +107 -0
- package/dist/mcp/tools/search-edit/rename.js.map +1 -0
- package/dist/mcp/tools/search-edit/signature.d.ts +26 -0
- package/dist/mcp/tools/search-edit/signature.d.ts.map +1 -0
- package/dist/mcp/tools/search-edit/signature.js +421 -0
- package/dist/mcp/tools/search-edit/signature.js.map +1 -0
- package/dist/mcp/tools/search-edit/structural.d.ts +6 -0
- package/dist/mcp/tools/search-edit/structural.d.ts.map +1 -1
- package/dist/mcp/tools/search-edit/structural.js +10 -0
- package/dist/mcp/tools/search-edit/structural.js.map +1 -1
- package/dist/mcp/tools/semantic-enrichment.d.ts +2 -0
- package/dist/mcp/tools/semantic-enrichment.d.ts.map +1 -1
- package/dist/mcp/tools/semantic-enrichment.js +37 -1
- package/dist/mcp/tools/semantic-enrichment.js.map +1 -1
- package/dist/mcp/tools/symbol-edit/ast.d.ts.map +1 -1
- package/dist/mcp/tools/symbol-edit/ast.js +4 -1
- package/dist/mcp/tools/symbol-edit/ast.js.map +1 -1
- package/dist/mcp/tools/symbol-edit/index.d.ts.map +1 -1
- package/dist/mcp/tools/symbol-edit/index.js +0 -1
- package/dist/mcp/tools/symbol-edit/index.js.map +1 -1
- package/dist/mcp/tools/symbol.d.ts.map +1 -1
- package/dist/mcp/tools/symbol.js +23 -3
- package/dist/mcp/tools/symbol.js.map +1 -1
- package/dist/mcp/tools/tool-descriptors.d.ts +1 -0
- package/dist/mcp/tools/tool-descriptors.d.ts.map +1 -1
- package/dist/mcp/tools/tool-descriptors.js +6 -3
- package/dist/mcp/tools/tool-descriptors.js.map +1 -1
- package/dist/mcp/tools/usage.d.ts.map +1 -1
- package/dist/mcp/tools/usage.js +5 -0
- package/dist/mcp/tools/usage.js.map +1 -1
- package/dist/mcp/tools.d.ts +259 -156
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +210 -75
- package/dist/mcp/tools.js.map +1 -1
- package/dist/observability/aggregator.d.ts +3 -0
- package/dist/observability/aggregator.d.ts.map +1 -1
- package/dist/observability/aggregator.js +27 -0
- package/dist/observability/aggregator.js.map +1 -1
- package/dist/observability/event-tap.d.ts +6 -0
- package/dist/observability/event-tap.d.ts.map +1 -1
- package/dist/observability/event-tap.js.map +1 -1
- package/dist/observability/types.d.ts +9 -0
- package/dist/observability/types.d.ts.map +1 -1
- package/dist/observability/types.js.map +1 -1
- package/dist/runtime/executor.d.ts +6 -0
- package/dist/runtime/executor.d.ts.map +1 -1
- package/dist/runtime/executor.js +16 -8
- package/dist/runtime/executor.js.map +1 -1
- package/dist/runtime/response-artifacts.d.ts +14 -2
- package/dist/runtime/response-artifacts.d.ts.map +1 -1
- package/dist/runtime/response-artifacts.js +66 -17
- package/dist/runtime/response-artifacts.js.map +1 -1
- package/dist/runtime/runtimes.d.ts.map +1 -1
- package/dist/runtime/runtimes.js +15 -0
- package/dist/runtime/runtimes.js.map +1 -1
- package/dist/semantic/enrichment.d.ts +2 -0
- package/dist/semantic/enrichment.d.ts.map +1 -1
- package/dist/semantic/enrichment.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +123 -25
- package/dist/server.js.map +1 -1
- package/package.json +14 -8
- package/templates/SDL.md +25 -16
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rename planner for `sdl.search.edit` `targeting: "rename"`.
|
|
3
|
+
*
|
|
4
|
+
* Resolves the target symbol, gathers graph-scoped candidate files
|
|
5
|
+
* (declaration file + referencing files), flags name collisions, and
|
|
6
|
+
* optionally reports text-only recall matches without editing them.
|
|
7
|
+
*/
|
|
8
|
+
import { resolve } from "path";
|
|
9
|
+
import * as ladybugDb from "../../../db/ladybug-queries.js";
|
|
10
|
+
import { normalizePath } from "../../../util/paths.js";
|
|
11
|
+
import { ValidationError } from "../../../domain/errors.js";
|
|
12
|
+
import { resolveSymbolRef } from "../../../util/resolve-symbol-ref.js";
|
|
13
|
+
import { DEFAULT_MAX_FILES, enumerateRepoFiles, readSearchEditCandidateFile, } from "./planner.js";
|
|
14
|
+
const IDENTIFIER_RE = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
15
|
+
export function wordRegexForIdentifier(name) {
|
|
16
|
+
const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
17
|
+
return new RegExp(`\\b${escaped}\\b`, "g");
|
|
18
|
+
}
|
|
19
|
+
/** Validation for the rename targeting branch (throws ValidationError). */
|
|
20
|
+
export function validateRenameRequest(request) {
|
|
21
|
+
if (request.editMode !== "replacePattern") {
|
|
22
|
+
throw new ValidationError('rename targeting currently supports editMode="replacePattern" only');
|
|
23
|
+
}
|
|
24
|
+
if (request.query.rename === undefined) {
|
|
25
|
+
throw new ValidationError("rename targeting requires query.rename");
|
|
26
|
+
}
|
|
27
|
+
if (!IDENTIFIER_RE.test(request.query.rename.newName)) {
|
|
28
|
+
throw new ValidationError("rename.newName must be a valid identifier");
|
|
29
|
+
}
|
|
30
|
+
const hasOneSymbolId = request.query.symbolIds?.length === 1;
|
|
31
|
+
const hasSymbolRef = request.query.symbolRef !== undefined;
|
|
32
|
+
if (hasOneSymbolId === hasSymbolRef) {
|
|
33
|
+
throw new ValidationError("rename targeting requires exactly one of query.symbolIds[0] or query.symbolRef");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export async function prepareRenameRequest(conn, request) {
|
|
37
|
+
const rename = request.query.rename;
|
|
38
|
+
if (rename === undefined) {
|
|
39
|
+
throw new ValidationError("rename targeting requires query.rename");
|
|
40
|
+
}
|
|
41
|
+
let targetSymbolId = request.query.symbolIds?.[0];
|
|
42
|
+
if (targetSymbolId === undefined && request.query.symbolRef) {
|
|
43
|
+
const resolved = await resolveSymbolRef(conn, request.repoId, request.query.symbolRef);
|
|
44
|
+
if (resolved.status !== "resolved") {
|
|
45
|
+
throw new ValidationError(`rename symbolRef ${resolved.status}`);
|
|
46
|
+
}
|
|
47
|
+
targetSymbolId = resolved.symbolId;
|
|
48
|
+
}
|
|
49
|
+
if (targetSymbolId === undefined) {
|
|
50
|
+
throw new ValidationError("rename targeting requires query.symbolIds[0] or query.symbolRef");
|
|
51
|
+
}
|
|
52
|
+
const target = (await ladybugDb.getSymbolsByIds(conn, [targetSymbolId])).get(targetSymbolId);
|
|
53
|
+
if (!target || target.repoId !== request.repoId) {
|
|
54
|
+
throw new ValidationError(`rename target symbol not found: ${targetSymbolId}`);
|
|
55
|
+
}
|
|
56
|
+
const candidateSet = new Set();
|
|
57
|
+
const targetFile = (await ladybugDb.getFilesByIds(conn, [target.fileId])).get(target.fileId);
|
|
58
|
+
if (targetFile)
|
|
59
|
+
candidateSet.add(normalizePath(targetFile.relPath));
|
|
60
|
+
const references = await ladybugDb.getReferencingSymbolsForTarget(conn, request.repoId, targetSymbolId, rename.minConfidence ?? 0.5);
|
|
61
|
+
for (const ref of references)
|
|
62
|
+
candidateSet.add(normalizePath(ref.relPath));
|
|
63
|
+
const skipped = [];
|
|
64
|
+
if (rename.includeTextOnlyMatches === true) {
|
|
65
|
+
const rootPath = (await ladybugDb.getRepo(conn, request.repoId))?.rootPath ?? "";
|
|
66
|
+
const textCandidates = await enumerateRepoFiles(rootPath, request.filters, request.maxFiles ?? DEFAULT_MAX_FILES);
|
|
67
|
+
// No g flag — .test() must be stateless across the file loop.
|
|
68
|
+
const oldNameRegex = new RegExp(wordRegexForIdentifier(target.name).source);
|
|
69
|
+
for (const rel of textCandidates.candidates) {
|
|
70
|
+
if (candidateSet.has(rel))
|
|
71
|
+
continue;
|
|
72
|
+
try {
|
|
73
|
+
const abs = resolve(rootPath, rel);
|
|
74
|
+
const readResult = await readSearchEditCandidateFile(rootPath, abs);
|
|
75
|
+
if (readResult.ok && oldNameRegex.test(readResult.value.content)) {
|
|
76
|
+
skipped.push({ path: rel, reason: "text-only-match" });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// text-only recall hints are best-effort diagnostics.
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const renameCollisionFiles = new Set();
|
|
85
|
+
for (const rel of candidateSet) {
|
|
86
|
+
const fileSymbols = await ladybugDb.getSymbolsForFile(conn, request.repoId, rel);
|
|
87
|
+
if (fileSymbols.some((sym) => sym.name === rename.newName && sym.symbolId !== targetSymbolId)) {
|
|
88
|
+
renameCollisionFiles.add(rel);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
request: {
|
|
93
|
+
...request,
|
|
94
|
+
query: {
|
|
95
|
+
...request.query,
|
|
96
|
+
literal: target.name,
|
|
97
|
+
replacement: rename.newName,
|
|
98
|
+
global: true,
|
|
99
|
+
},
|
|
100
|
+
renameCollisionFiles,
|
|
101
|
+
},
|
|
102
|
+
candidates: [...candidateSet],
|
|
103
|
+
skipped,
|
|
104
|
+
regex: wordRegexForIdentifier(target.name),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=rename.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename.js","sourceRoot":"","sources":["../../../../src/mcp/tools/search-edit/rename.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signature planner for `sdl.search.edit` `targeting: "signature"`.
|
|
3
|
+
*
|
|
4
|
+
* Applies parameter add/remove/rename operations to a TS/JS function
|
|
5
|
+
* declaration and propagates positional argument changes to graph-scoped
|
|
6
|
+
* callsite files.
|
|
7
|
+
*/
|
|
8
|
+
import { type PreviewResult, type SearchEditSingleOperationRequest } from "./planner.js";
|
|
9
|
+
export interface SignatureOps {
|
|
10
|
+
add?: Array<{
|
|
11
|
+
name: string;
|
|
12
|
+
typeText?: string;
|
|
13
|
+
defaultText?: string;
|
|
14
|
+
index?: number;
|
|
15
|
+
argText?: string;
|
|
16
|
+
}>;
|
|
17
|
+
remove?: Array<{
|
|
18
|
+
name: string;
|
|
19
|
+
}>;
|
|
20
|
+
renameParam?: Array<{
|
|
21
|
+
from: string;
|
|
22
|
+
to: string;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
export declare function planSignatureSearchEditPreview(request: SearchEditSingleOperationRequest): Promise<PreviewResult>;
|
|
26
|
+
//# sourceMappingURL=signature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/search-edit/signature.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,OAAO,EAgBL,KAAK,aAAa,EAClB,KAAK,gCAAgC,EAEtC,MAAM,cAAc,CAAC;AACtB,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,KAAK,CAAC;QACV,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAyTD,wBAAsB,8BAA8B,CAAC,OAAO,EAAE,gCAAgC,GAAG,OAAO,CAAC,aAAa,CAAC,CAuHtH"}
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signature planner for `sdl.search.edit` `targeting: "signature"`.
|
|
3
|
+
*
|
|
4
|
+
* Applies parameter add/remove/rename operations to a TS/JS function
|
|
5
|
+
* declaration and propagates positional argument changes to graph-scoped
|
|
6
|
+
* callsite files.
|
|
7
|
+
*/
|
|
8
|
+
import { resolve } from "path";
|
|
9
|
+
import { getLadybugConn } from "../../../db/ladybug.js";
|
|
10
|
+
import * as ladybugDb from "../../../db/ladybug-queries.js";
|
|
11
|
+
import { normalizePath } from "../../../util/paths.js";
|
|
12
|
+
import { NotFoundError, ValidationError } from "../../../domain/errors.js";
|
|
13
|
+
import { resolveSymbolRef } from "../../../util/resolve-symbol-ref.js";
|
|
14
|
+
import { isIndexedSource } from "../file-write-internals.js";
|
|
15
|
+
import { collectIdentifierSourceEdits, parseTreeForPath } from "./structural.js";
|
|
16
|
+
import { wordRegexForIdentifier } from "./rename.js";
|
|
17
|
+
import { DEFAULT_MAX_FILES, DEFAULT_MAX_TOTAL_MATCHES, DEFAULT_PREVIEW_CONTEXT_LINES, MAX_PLAN_BYTES, aggregateByteCapExceededReason, applySourceEdits, buildSearchEditPreviewSnippets, isPartialSkipReason, matchesExceedTotalCapReason, maxFilesReachedReason, maxTotalMatchesReachedReason, readSearchEditCandidateFile, toSourceEdits, } from "./planner.js";
|
|
18
|
+
const IDENTIFIER_NAME_RE = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
19
|
+
function formatAddedParam(add) {
|
|
20
|
+
return add.name + (add.typeText ? ": " + add.typeText : "") + (add.defaultText ? " = " + add.defaultText : "");
|
|
21
|
+
}
|
|
22
|
+
function escapeRegExp(text) {
|
|
23
|
+
return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
24
|
+
}
|
|
25
|
+
function assertSignatureOpsValid(signature) {
|
|
26
|
+
const hasOps = (signature.add?.length ?? 0) > 0 ||
|
|
27
|
+
(signature.remove?.length ?? 0) > 0 ||
|
|
28
|
+
(signature.renameParam?.length ?? 0) > 0;
|
|
29
|
+
if (!hasOps) {
|
|
30
|
+
throw new ValidationError("signature targeting requires at least one signature operation");
|
|
31
|
+
}
|
|
32
|
+
for (const add of signature.add ?? []) {
|
|
33
|
+
if (!IDENTIFIER_NAME_RE.test(add.name)) {
|
|
34
|
+
throw new ValidationError("signature.add.name must be a valid identifier");
|
|
35
|
+
}
|
|
36
|
+
if (add.index !== undefined && (!Number.isInteger(add.index) || add.index < 0)) {
|
|
37
|
+
throw new ValidationError("signature.add.index must be a non-negative integer");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
for (const remove of signature.remove ?? []) {
|
|
41
|
+
if (!IDENTIFIER_NAME_RE.test(remove.name)) {
|
|
42
|
+
throw new ValidationError("signature.remove.name must be a valid identifier");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (const rename of signature.renameParam ?? []) {
|
|
46
|
+
if (!IDENTIFIER_NAME_RE.test(rename.from) || !IDENTIFIER_NAME_RE.test(rename.to)) {
|
|
47
|
+
throw new ValidationError("signature.renameParam names must be valid identifiers");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function applySignatureOpsToParts(parts, names, signature) {
|
|
52
|
+
const params = [...parts];
|
|
53
|
+
const paramNames = [...names];
|
|
54
|
+
const originalNames = [...names];
|
|
55
|
+
for (const remove of signature.remove ?? []) {
|
|
56
|
+
const index = paramNames.indexOf(remove.name);
|
|
57
|
+
if (index === -1)
|
|
58
|
+
throw new ValidationError("signature remove param not found: " + remove.name);
|
|
59
|
+
params.splice(index, 1);
|
|
60
|
+
paramNames.splice(index, 1);
|
|
61
|
+
}
|
|
62
|
+
for (const rename of signature.renameParam ?? []) {
|
|
63
|
+
const index = paramNames.indexOf(rename.from);
|
|
64
|
+
if (index === -1)
|
|
65
|
+
throw new ValidationError("signature rename param not found: " + rename.from);
|
|
66
|
+
params[index] = params[index].replace(new RegExp("^" + escapeRegExp(rename.from) + "\\b"), rename.to);
|
|
67
|
+
paramNames[index] = rename.to;
|
|
68
|
+
}
|
|
69
|
+
for (const add of signature.add ?? []) {
|
|
70
|
+
const insertAt = Math.min(Math.max(add.index ?? params.length, 0), params.length);
|
|
71
|
+
params.splice(insertAt, 0, formatAddedParam(add));
|
|
72
|
+
paramNames.splice(insertAt, 0, add.name);
|
|
73
|
+
}
|
|
74
|
+
return { paramsText: params.join(", "), originalNames };
|
|
75
|
+
}
|
|
76
|
+
/** Collect nodes that declare `name` as a function-shaped symbol. */
|
|
77
|
+
function findDeclarationNodes(root, name) {
|
|
78
|
+
const matches = [];
|
|
79
|
+
const visit = (node) => {
|
|
80
|
+
switch (node.type) {
|
|
81
|
+
case "function_declaration":
|
|
82
|
+
case "generator_function_declaration":
|
|
83
|
+
case "function_signature": {
|
|
84
|
+
if (node.childForFieldName("name")?.text === name) {
|
|
85
|
+
matches.push({ fnNode: node, overload: node.type === "function_signature" });
|
|
86
|
+
}
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
case "method_definition":
|
|
90
|
+
case "method_signature": {
|
|
91
|
+
if (node.childForFieldName("name")?.text === name) {
|
|
92
|
+
matches.push({ fnNode: node, overload: node.type === "method_signature" });
|
|
93
|
+
}
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
case "variable_declarator": {
|
|
97
|
+
const nameNode = node.childForFieldName("name");
|
|
98
|
+
const value = node.childForFieldName("value");
|
|
99
|
+
if (nameNode?.text === name &&
|
|
100
|
+
value !== null &&
|
|
101
|
+
(value.type === "arrow_function" ||
|
|
102
|
+
value.type === "function_expression" ||
|
|
103
|
+
value.type === "generator_function")) {
|
|
104
|
+
matches.push({ fnNode: value, overload: false });
|
|
105
|
+
}
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
default:
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
for (const child of node.namedChildren)
|
|
112
|
+
visit(child);
|
|
113
|
+
};
|
|
114
|
+
visit(root);
|
|
115
|
+
return matches;
|
|
116
|
+
}
|
|
117
|
+
function paramNameFromNode(paramNode) {
|
|
118
|
+
const target = paramNode.childForFieldName("pattern") ?? paramNode;
|
|
119
|
+
if (target.type === "identifier")
|
|
120
|
+
return target.text;
|
|
121
|
+
if (target.type === "rest_pattern") {
|
|
122
|
+
const inner = target.namedChildren.find((child) => child.type === "identifier");
|
|
123
|
+
return inner?.text ?? "";
|
|
124
|
+
}
|
|
125
|
+
// Destructuring patterns have no positional name (matches legacy behavior).
|
|
126
|
+
return "";
|
|
127
|
+
}
|
|
128
|
+
function extractParams(fnNode) {
|
|
129
|
+
const paramsNode = fnNode.childForFieldName("parameters");
|
|
130
|
+
if (paramsNode) {
|
|
131
|
+
const paramNodes = paramsNode.namedChildren.filter((child) => child.type !== "comment");
|
|
132
|
+
return {
|
|
133
|
+
parts: paramNodes.map((child) => child.text),
|
|
134
|
+
names: paramNodes.map(paramNameFromNode),
|
|
135
|
+
editStart: paramsNode.startIndex + 1,
|
|
136
|
+
editEnd: paramsNode.endIndex - 1,
|
|
137
|
+
wrapInParens: false,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const bare = fnNode.childForFieldName("parameter");
|
|
141
|
+
if (bare) {
|
|
142
|
+
return {
|
|
143
|
+
parts: [bare.text],
|
|
144
|
+
names: [bare.text],
|
|
145
|
+
editStart: bare.startIndex,
|
|
146
|
+
editEnd: bare.endIndex,
|
|
147
|
+
wrapInParens: true,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
throw new ValidationError("signature target declaration not found");
|
|
151
|
+
}
|
|
152
|
+
function isTypeScriptOrJavaScriptPath(relPath) {
|
|
153
|
+
return /[.][cm]?[jt]sx?$/.test(relPath);
|
|
154
|
+
}
|
|
155
|
+
function buildSignatureDeclarationEdits(content, relPath, name, signature) {
|
|
156
|
+
const tree = parseTreeForPath(relPath, content);
|
|
157
|
+
if (!tree)
|
|
158
|
+
throw new ValidationError("signature target declaration not found");
|
|
159
|
+
const matches = findDeclarationNodes(tree.rootNode, name);
|
|
160
|
+
if (matches.length === 0)
|
|
161
|
+
throw new ValidationError("signature target declaration not found");
|
|
162
|
+
if (matches.length > 1 || matches.some((match) => match.overload)) {
|
|
163
|
+
throw new ValidationError("overloads-not-supported");
|
|
164
|
+
}
|
|
165
|
+
const fnNode = matches[0].fnNode;
|
|
166
|
+
const info = extractParams(fnNode);
|
|
167
|
+
const transformed = applySignatureOpsToParts(info.parts, info.names, signature);
|
|
168
|
+
const replacement = info.wrapInParens
|
|
169
|
+
? `(${transformed.paramsText})`
|
|
170
|
+
: transformed.paramsText;
|
|
171
|
+
const edits = [
|
|
172
|
+
{
|
|
173
|
+
operationId: "signature",
|
|
174
|
+
start: info.editStart,
|
|
175
|
+
end: info.editEnd,
|
|
176
|
+
replacement,
|
|
177
|
+
},
|
|
178
|
+
];
|
|
179
|
+
const body = fnNode.childForFieldName("body");
|
|
180
|
+
if (body) {
|
|
181
|
+
for (const rename of signature.renameParam ?? []) {
|
|
182
|
+
const identifierEdits = collectIdentifierSourceEdits({
|
|
183
|
+
content,
|
|
184
|
+
relPath,
|
|
185
|
+
literal: rename.from,
|
|
186
|
+
replacement: rename.to,
|
|
187
|
+
global: true,
|
|
188
|
+
}).filter((edit) => edit.start >= body.startIndex && edit.end <= body.endIndex);
|
|
189
|
+
edits.push(...toSourceEdits(identifierEdits, "signature"));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return { edits, originalNames: transformed.originalNames };
|
|
193
|
+
}
|
|
194
|
+
function callsiteOpsRequested(signature) {
|
|
195
|
+
return (signature.add?.length ?? 0) > 0 || (signature.remove?.length ?? 0) > 0;
|
|
196
|
+
}
|
|
197
|
+
/** True when `node` is a call/new whose callee resolves to `name`. */
|
|
198
|
+
function calleeMatchesName(callee, name) {
|
|
199
|
+
if (callee.type === "identifier")
|
|
200
|
+
return callee.text === name;
|
|
201
|
+
if (callee.type === "member_expression") {
|
|
202
|
+
return callee.childForFieldName("property")?.text === name;
|
|
203
|
+
}
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
function buildSignatureCallsiteEdits(content, relPath, name, signature, originalNames) {
|
|
207
|
+
if (!callsiteOpsRequested(signature))
|
|
208
|
+
return { edits: [] };
|
|
209
|
+
if ((signature.add ?? []).some((add) => add.argText === undefined))
|
|
210
|
+
return { edits: [], skipReason: "needs-arg-value" };
|
|
211
|
+
const tree = parseTreeForPath(relPath, content);
|
|
212
|
+
if (!tree)
|
|
213
|
+
return { edits: [], skipReason: "manual-review" };
|
|
214
|
+
const edits = [];
|
|
215
|
+
let sawManualReview = false;
|
|
216
|
+
let sawArityMismatch = false;
|
|
217
|
+
let sawCall = false;
|
|
218
|
+
const visit = (node) => {
|
|
219
|
+
if (sawManualReview || sawArityMismatch)
|
|
220
|
+
return;
|
|
221
|
+
if (node.type === "call_expression" || node.type === "new_expression") {
|
|
222
|
+
const callee = node.childForFieldName("function") ??
|
|
223
|
+
node.childForFieldName("constructor");
|
|
224
|
+
if (callee?.type === "member_expression") {
|
|
225
|
+
const property = callee.childForFieldName("property")?.text;
|
|
226
|
+
const objectText = callee.childForFieldName("object")?.text;
|
|
227
|
+
if ((property === "apply" || property === "call") &&
|
|
228
|
+
objectText === name) {
|
|
229
|
+
// Indirect invocation shifts positional args — leave for review.
|
|
230
|
+
sawManualReview = true;
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const args = node.childForFieldName("arguments");
|
|
235
|
+
if (callee && args && calleeMatchesName(callee, name)) {
|
|
236
|
+
const argNodes = args.namedChildren.filter((child) => child.type !== "comment");
|
|
237
|
+
if (argNodes.some((child) => child.type === "spread_element")) {
|
|
238
|
+
sawManualReview = true;
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
sawCall = true;
|
|
242
|
+
const argTexts = argNodes.map((child) => child.text);
|
|
243
|
+
for (const remove of signature.remove ?? []) {
|
|
244
|
+
const index = originalNames.indexOf(remove.name);
|
|
245
|
+
if (index >= 0) {
|
|
246
|
+
if (argTexts.length <= index) {
|
|
247
|
+
sawArityMismatch = true;
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
argTexts.splice(index, 1);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
for (const add of signature.add ?? []) {
|
|
254
|
+
const insertAt = Math.min(Math.max(add.index ?? argTexts.length, 0), argTexts.length);
|
|
255
|
+
argTexts.splice(insertAt, 0, add.argText);
|
|
256
|
+
}
|
|
257
|
+
edits.push({
|
|
258
|
+
operationId: "signature",
|
|
259
|
+
start: args.startIndex + 1,
|
|
260
|
+
end: args.endIndex - 1,
|
|
261
|
+
replacement: argTexts.join(", "),
|
|
262
|
+
});
|
|
263
|
+
// Do not descend into an edited call — nested edits would overlap
|
|
264
|
+
// the enclosing argument span (the joined arg texts carry them).
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
for (const child of node.namedChildren) {
|
|
269
|
+
visit(child);
|
|
270
|
+
if (sawManualReview || sawArityMismatch)
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
visit(tree.rootNode);
|
|
275
|
+
if (sawManualReview)
|
|
276
|
+
return { edits: [], skipReason: "manual-review" };
|
|
277
|
+
if (sawArityMismatch)
|
|
278
|
+
return { edits: [], skipReason: "arity-mismatch" };
|
|
279
|
+
if (edits.length === 0 && !sawCall)
|
|
280
|
+
return { edits: [], skipReason: "no-signature-match" };
|
|
281
|
+
return { edits };
|
|
282
|
+
}
|
|
283
|
+
async function resolveTargetSymbolForRefactor(conn, request) {
|
|
284
|
+
let targetSymbolId = request.query.symbolIds?.[0];
|
|
285
|
+
if (targetSymbolId === undefined && request.query.symbolRef) {
|
|
286
|
+
const resolved = await resolveSymbolRef(conn, request.repoId, request.query.symbolRef);
|
|
287
|
+
if (resolved.status !== "resolved")
|
|
288
|
+
throw new ValidationError("symbolRef " + resolved.status);
|
|
289
|
+
targetSymbolId = resolved.symbolId;
|
|
290
|
+
}
|
|
291
|
+
if (targetSymbolId === undefined)
|
|
292
|
+
throw new ValidationError("signature targeting requires query.symbolIds[0] or query.symbolRef");
|
|
293
|
+
const target = (await ladybugDb.getSymbolsByIds(conn, [targetSymbolId])).get(targetSymbolId);
|
|
294
|
+
if (!target || target.repoId !== request.repoId)
|
|
295
|
+
throw new ValidationError("signature target symbol not found: " + targetSymbolId);
|
|
296
|
+
return { symbolId: target.symbolId, name: target.name, fileId: target.fileId };
|
|
297
|
+
}
|
|
298
|
+
export async function planSignatureSearchEditPreview(request) {
|
|
299
|
+
const signature = request.query.signature;
|
|
300
|
+
if (signature === undefined)
|
|
301
|
+
throw new ValidationError("signature targeting requires query.signature");
|
|
302
|
+
assertSignatureOpsValid(signature);
|
|
303
|
+
if (request.editMode !== "replacePattern")
|
|
304
|
+
throw new ValidationError("signature targeting currently supports editMode=replacePattern only");
|
|
305
|
+
const conn = await getLadybugConn();
|
|
306
|
+
const repo = await ladybugDb.getRepo(conn, request.repoId);
|
|
307
|
+
if (!repo)
|
|
308
|
+
throw new NotFoundError("Repository " + request.repoId + " not found");
|
|
309
|
+
const rootPath = repo.rootPath;
|
|
310
|
+
const createBackup = request.createBackup ?? true;
|
|
311
|
+
const contextLines = request.previewContextLines ?? DEFAULT_PREVIEW_CONTEXT_LINES;
|
|
312
|
+
const target = await resolveTargetSymbolForRefactor(conn, request);
|
|
313
|
+
const targetFile = (await ladybugDb.getFilesByIds(conn, [target.fileId])).get(target.fileId);
|
|
314
|
+
if (!targetFile)
|
|
315
|
+
throw new ValidationError("signature target file not found");
|
|
316
|
+
const declarationRel = normalizePath(targetFile.relPath);
|
|
317
|
+
if (!isTypeScriptOrJavaScriptPath(declarationRel)) {
|
|
318
|
+
throw new ValidationError("signature targeting is only supported for TypeScript/JavaScript files");
|
|
319
|
+
}
|
|
320
|
+
const candidates = new Map();
|
|
321
|
+
candidates.set(declarationRel, "declaration");
|
|
322
|
+
if (callsiteOpsRequested(signature)) {
|
|
323
|
+
const refs = await ladybugDb.getReferencingSymbolsForTarget(conn, request.repoId, target.symbolId, 0.5);
|
|
324
|
+
for (const ref of refs) {
|
|
325
|
+
if (ref.edgeType !== "calls")
|
|
326
|
+
continue;
|
|
327
|
+
const rel = normalizePath(ref.relPath);
|
|
328
|
+
if (!candidates.has(rel))
|
|
329
|
+
candidates.set(rel, "callsite");
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
const edits = [];
|
|
333
|
+
const preconditions = [];
|
|
334
|
+
const fileEntries = [];
|
|
335
|
+
const filesSkipped = [];
|
|
336
|
+
const regex = wordRegexForIdentifier(target.name);
|
|
337
|
+
let totalMatches = 0;
|
|
338
|
+
let originalNames = [];
|
|
339
|
+
let aggregateBytes = 0;
|
|
340
|
+
const maxFiles = request.maxFiles ?? DEFAULT_MAX_FILES;
|
|
341
|
+
const maxTotalMatches = request.maxTotalMatches ?? DEFAULT_MAX_TOTAL_MATCHES;
|
|
342
|
+
const maxPlanBytes = request.maxPlanBytes ?? MAX_PLAN_BYTES;
|
|
343
|
+
const orderedCandidates = [
|
|
344
|
+
[declarationRel, "declaration"],
|
|
345
|
+
...[...candidates.entries()]
|
|
346
|
+
.filter(([rel]) => rel !== declarationRel)
|
|
347
|
+
.sort((a, b) => a[0].localeCompare(b[0])),
|
|
348
|
+
];
|
|
349
|
+
for (const [rel, role] of orderedCandidates) {
|
|
350
|
+
if (edits.length >= maxFiles) {
|
|
351
|
+
filesSkipped.push({ path: rel, reason: maxFilesReachedReason(maxFiles) });
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
if (totalMatches >= maxTotalMatches) {
|
|
355
|
+
filesSkipped.push({ path: rel, reason: maxTotalMatchesReachedReason(maxTotalMatches) });
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
if (!isTypeScriptOrJavaScriptPath(rel)) {
|
|
359
|
+
filesSkipped.push({ path: rel, reason: "unsupported-language" });
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
const abs = resolve(rootPath, rel);
|
|
363
|
+
const readResult = await readSearchEditCandidateFile(rootPath, abs);
|
|
364
|
+
if (!readResult.ok) {
|
|
365
|
+
filesSkipped.push({ path: rel, reason: readResult.reason });
|
|
366
|
+
continue;
|
|
367
|
+
}
|
|
368
|
+
const { content, contentSha, stats } = readResult.value;
|
|
369
|
+
let sourceEdits = [];
|
|
370
|
+
let skipReason;
|
|
371
|
+
if (role === "declaration") {
|
|
372
|
+
const result = buildSignatureDeclarationEdits(content, rel, target.name, signature);
|
|
373
|
+
sourceEdits = result.edits;
|
|
374
|
+
originalNames = result.originalNames;
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
const result = buildSignatureCallsiteEdits(content, rel, target.name, signature, originalNames);
|
|
378
|
+
sourceEdits = result.edits;
|
|
379
|
+
skipReason = result.skipReason;
|
|
380
|
+
}
|
|
381
|
+
if (sourceEdits.length === 0) {
|
|
382
|
+
// Always record a reason — silently dropping a candidate hides
|
|
383
|
+
// callsite files the agent expected to see in the summary.
|
|
384
|
+
filesSkipped.push({ path: rel, reason: skipReason ?? "no-signature-match" });
|
|
385
|
+
continue;
|
|
386
|
+
}
|
|
387
|
+
if (totalMatches + sourceEdits.length > maxTotalMatches) {
|
|
388
|
+
filesSkipped.push({ path: rel, reason: matchesExceedTotalCapReason(maxTotalMatches) });
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
const newContent = applySourceEdits(content, sourceEdits);
|
|
392
|
+
if (newContent === content) {
|
|
393
|
+
filesSkipped.push({ path: rel, reason: "no-change" });
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
const editBytes = Buffer.byteLength(newContent, "utf-8");
|
|
397
|
+
aggregateBytes += editBytes;
|
|
398
|
+
if (aggregateBytes > maxPlanBytes) {
|
|
399
|
+
aggregateBytes -= editBytes;
|
|
400
|
+
filesSkipped.push({ path: rel, reason: aggregateByteCapExceededReason(maxPlanBytes) });
|
|
401
|
+
continue;
|
|
402
|
+
}
|
|
403
|
+
preconditions.push({ relPath: rel, absPath: abs, sha256: contentSha, mtimeMs: stats.mtimeMs });
|
|
404
|
+
edits.push({ relPath: rel, absPath: abs, newContent, createBackup, fileExists: true, indexedSource: isIndexedSource(rel), matchCount: sourceEdits.length, editMode: "replacePattern" });
|
|
405
|
+
fileEntries.push({ file: rel, matchCount: sourceEdits.length, editMode: "replacePattern", snippets: buildSearchEditPreviewSnippets(content, newContent, contextLines, regex), indexedSource: isIndexedSource(rel) });
|
|
406
|
+
totalMatches += sourceEdits.length;
|
|
407
|
+
}
|
|
408
|
+
return {
|
|
409
|
+
edits,
|
|
410
|
+
preconditions,
|
|
411
|
+
summary: {
|
|
412
|
+
filesMatched: edits.length,
|
|
413
|
+
matchesFound: totalMatches,
|
|
414
|
+
filesEligible: candidates.size,
|
|
415
|
+
filesSkipped,
|
|
416
|
+
fileEntries,
|
|
417
|
+
...(filesSkipped.some((s) => isPartialSkipReason(s.reason)) ? { partial: true } : {}),
|
|
418
|
+
},
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
//# sourceMappingURL=signature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature.js","sourceRoot":"","sources":["../../../../src/mcp/tools/search-edit/signature.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import Parser from "tree-sitter";
|
|
2
|
+
import type { Tree } from "tree-sitter";
|
|
2
3
|
export interface StructuralQueryInput {
|
|
3
4
|
language?: string;
|
|
4
5
|
treeSitterQuery: string;
|
|
@@ -53,6 +54,11 @@ export interface StructuralEditInput {
|
|
|
53
54
|
}
|
|
54
55
|
export declare const STRUCTURAL_QUERY_TIME_BUDGET_ERROR = "structural-query-time-budget";
|
|
55
56
|
export declare function getStructuralLanguageForPath(relPath: string): string | null;
|
|
57
|
+
/**
|
|
58
|
+
* Parse a source file with the built-in/plugin grammar registered for its
|
|
59
|
+
* extension. Null when the extension is unsupported or the parse errors.
|
|
60
|
+
*/
|
|
61
|
+
export declare function parseTreeForPath(relPath: string, content: string): Tree | null;
|
|
56
62
|
export declare function getStructuralLanguageIds(): string[];
|
|
57
63
|
export declare function isStructuralLanguageSupported(languageId: string): boolean;
|
|
58
64
|
export declare function getStructuralExtensions(languageId?: string): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structural.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/search-edit/structural.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"structural.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/search-edit/structural.ts"],"names":[],"mappings":"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"}
|
|
@@ -296,6 +296,16 @@ function descriptorForPath(relPath) {
|
|
|
296
296
|
export function getStructuralLanguageForPath(relPath) {
|
|
297
297
|
return descriptorForPath(relPath)?.publicLanguageId ?? null;
|
|
298
298
|
}
|
|
299
|
+
/**
|
|
300
|
+
* Parse a source file with the built-in/plugin grammar registered for its
|
|
301
|
+
* extension. Null when the extension is unsupported or the parse errors.
|
|
302
|
+
*/
|
|
303
|
+
export function parseTreeForPath(relPath, content) {
|
|
304
|
+
const descriptor = descriptorForPath(relPath);
|
|
305
|
+
if (!descriptor)
|
|
306
|
+
return null;
|
|
307
|
+
return descriptor.parse(content, relPath);
|
|
308
|
+
}
|
|
299
309
|
export function getStructuralLanguageIds() {
|
|
300
310
|
const languageIds = new Set(BUILT_IN_STRUCTURAL_LANGUAGES.map((language) => language.publicLanguageId));
|
|
301
311
|
for (const entry of getStructuralMatcherEntries()) {
|