lsp-intelligence 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 (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +250 -0
  3. package/dist/engine/DocumentManager.d.ts +20 -0
  4. package/dist/engine/DocumentManager.js +73 -0
  5. package/dist/engine/DocumentManager.js.map +1 -0
  6. package/dist/engine/LspEngine.d.ts +50 -0
  7. package/dist/engine/LspEngine.js +339 -0
  8. package/dist/engine/LspEngine.js.map +1 -0
  9. package/dist/engine/positions.d.ts +31 -0
  10. package/dist/engine/positions.js +55 -0
  11. package/dist/engine/positions.js.map +1 -0
  12. package/dist/engine/types.d.ts +61 -0
  13. package/dist/engine/types.js +33 -0
  14. package/dist/engine/types.js.map +1 -0
  15. package/dist/format/markdown.d.ts +5 -0
  16. package/dist/format/markdown.js +90 -0
  17. package/dist/format/markdown.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.js +87 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/tools/composites/batchQuery.d.ts +1 -0
  22. package/dist/tools/composites/batchQuery.js +40 -0
  23. package/dist/tools/composites/batchQuery.js.map +1 -0
  24. package/dist/tools/composites/explainError.d.ts +1 -0
  25. package/dist/tools/composites/explainError.js +56 -0
  26. package/dist/tools/composites/explainError.js.map +1 -0
  27. package/dist/tools/composites/findTestFiles.d.ts +1 -0
  28. package/dist/tools/composites/findTestFiles.js +57 -0
  29. package/dist/tools/composites/findTestFiles.js.map +1 -0
  30. package/dist/tools/composites/impactTrace.d.ts +1 -0
  31. package/dist/tools/composites/impactTrace.js +149 -0
  32. package/dist/tools/composites/impactTrace.js.map +1 -0
  33. package/dist/tools/composites/inspectSymbol.d.ts +1 -0
  34. package/dist/tools/composites/inspectSymbol.js +60 -0
  35. package/dist/tools/composites/inspectSymbol.js.map +1 -0
  36. package/dist/tools/composites/semanticDiff.d.ts +1 -0
  37. package/dist/tools/composites/semanticDiff.js +135 -0
  38. package/dist/tools/composites/semanticDiff.js.map +1 -0
  39. package/dist/tools/context/gatherContext.d.ts +1 -0
  40. package/dist/tools/context/gatherContext.js +153 -0
  41. package/dist/tools/context/gatherContext.js.map +1 -0
  42. package/dist/tools/context/outline.d.ts +1 -0
  43. package/dist/tools/context/outline.js +56 -0
  44. package/dist/tools/context/outline.js.map +1 -0
  45. package/dist/tools/live/autoImport.d.ts +1 -0
  46. package/dist/tools/live/autoImport.js +123 -0
  47. package/dist/tools/live/autoImport.js.map +1 -0
  48. package/dist/tools/live/findUnusedExports.d.ts +1 -0
  49. package/dist/tools/live/findUnusedExports.js +69 -0
  50. package/dist/tools/live/findUnusedExports.js.map +1 -0
  51. package/dist/tools/live/liveDiagnostics.d.ts +1 -0
  52. package/dist/tools/live/liveDiagnostics.js +38 -0
  53. package/dist/tools/live/liveDiagnostics.js.map +1 -0
  54. package/dist/tools/primitives/callHierarchy.d.ts +1 -0
  55. package/dist/tools/primitives/callHierarchy.js +61 -0
  56. package/dist/tools/primitives/callHierarchy.js.map +1 -0
  57. package/dist/tools/primitives/completions.d.ts +1 -0
  58. package/dist/tools/primitives/completions.js +31 -0
  59. package/dist/tools/primitives/completions.js.map +1 -0
  60. package/dist/tools/primitives/diagnostics.d.ts +1 -0
  61. package/dist/tools/primitives/diagnostics.js +32 -0
  62. package/dist/tools/primitives/diagnostics.js.map +1 -0
  63. package/dist/tools/primitives/documentSymbols.d.ts +1 -0
  64. package/dist/tools/primitives/documentSymbols.js +42 -0
  65. package/dist/tools/primitives/documentSymbols.js.map +1 -0
  66. package/dist/tools/primitives/fileExports.d.ts +1 -0
  67. package/dist/tools/primitives/fileExports.js +69 -0
  68. package/dist/tools/primitives/fileExports.js.map +1 -0
  69. package/dist/tools/primitives/fileImports.d.ts +1 -0
  70. package/dist/tools/primitives/fileImports.js +58 -0
  71. package/dist/tools/primitives/fileImports.js.map +1 -0
  72. package/dist/tools/primitives/findImplementations.d.ts +1 -0
  73. package/dist/tools/primitives/findImplementations.js +36 -0
  74. package/dist/tools/primitives/findImplementations.js.map +1 -0
  75. package/dist/tools/primitives/findReferences.d.ts +1 -0
  76. package/dist/tools/primitives/findReferences.js +42 -0
  77. package/dist/tools/primitives/findReferences.js.map +1 -0
  78. package/dist/tools/primitives/gotoDefinition.d.ts +1 -0
  79. package/dist/tools/primitives/gotoDefinition.js +37 -0
  80. package/dist/tools/primitives/gotoDefinition.js.map +1 -0
  81. package/dist/tools/primitives/gotoTypeDefinition.d.ts +1 -0
  82. package/dist/tools/primitives/gotoTypeDefinition.js +35 -0
  83. package/dist/tools/primitives/gotoTypeDefinition.js.map +1 -0
  84. package/dist/tools/primitives/hover.d.ts +1 -0
  85. package/dist/tools/primitives/hover.js +37 -0
  86. package/dist/tools/primitives/hover.js.map +1 -0
  87. package/dist/tools/primitives/rename.d.ts +1 -0
  88. package/dist/tools/primitives/rename.js +56 -0
  89. package/dist/tools/primitives/rename.js.map +1 -0
  90. package/dist/tools/primitives/typeHierarchy.d.ts +1 -0
  91. package/dist/tools/primitives/typeHierarchy.js +49 -0
  92. package/dist/tools/primitives/typeHierarchy.js.map +1 -0
  93. package/dist/tools/primitives/workspaceSymbols.d.ts +1 -0
  94. package/dist/tools/primitives/workspaceSymbols.js +32 -0
  95. package/dist/tools/primitives/workspaceSymbols.js.map +1 -0
  96. package/dist/tools/registry.d.ts +19 -0
  97. package/dist/tools/registry.js +19 -0
  98. package/dist/tools/registry.js.map +1 -0
  99. package/package.json +39 -0
@@ -0,0 +1,38 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from '../registry.js';
3
+ import { relativePath, fromPosition } from '../../engine/positions.js';
4
+ const SEVERITY = { 1: 'Error', 2: 'Warning', 3: 'Info', 4: 'Hint' };
5
+ export const liveDiagnostics = defineTool({
6
+ name: 'live_diagnostics',
7
+ description: 'Re-read a file from disk and check for new type errors. Use after editing a file to immediately see if the change broke types.',
8
+ schema: z.object({
9
+ file_path: z.string().describe('Absolute file path to check'),
10
+ }),
11
+ annotations: { readOnlyHint: false },
12
+ async handler(params, engine) {
13
+ // Re-read from disk (file was just edited)
14
+ await engine.prepareFile(params.file_path);
15
+ if (!engine.connection)
16
+ return 'Error: LSP connection not available.';
17
+ await engine.docManager.refreshFromDisk(params.file_path, engine.connection);
18
+ // Wait for TSServer to process changes
19
+ await new Promise((r) => setTimeout(r, 1000));
20
+ const uri = `file://${params.file_path}`;
21
+ const diags = engine.docManager.getCachedDiagnostics(uri);
22
+ const rel = relativePath(params.file_path, engine.workspaceRoot);
23
+ if (diags.length === 0)
24
+ return `✅ ${rel} — no errors after edit.`;
25
+ const errors = diags.filter((d) => d.severity === 1);
26
+ const warnings = diags.filter((d) => d.severity === 2);
27
+ const lines = [`# Live Diagnostics: ${rel}\n`];
28
+ lines.push(`${errors.length} errors, ${warnings.length} warnings\n`);
29
+ for (const d of diags.sort((a, b) => a.range.start.line - b.range.start.line)) {
30
+ const severity = SEVERITY[d.severity ?? 1];
31
+ const pos = fromPosition(d.range.start);
32
+ const code = d.code ? ` (TS${d.code})` : '';
33
+ lines.push(`- **${severity}** L${pos.line}${code}: ${d.message}`);
34
+ }
35
+ return lines.join('\n');
36
+ },
37
+ });
38
+ //# sourceMappingURL=liveDiagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liveDiagnostics.js","sourceRoot":"","sources":["../../../src/tools/live/liveDiagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const callHierarchy: import("../registry.js").ToolDef;
@@ -0,0 +1,61 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from '../registry.js';
3
+ import { toPosition, fromPosition, relativePath, uriToPath } from '../../engine/positions.js';
4
+ export const callHierarchy = defineTool({
5
+ name: 'call_hierarchy',
6
+ description: 'Trace incoming callers or outgoing callees for a function/method. Use to understand call flow before modifying a function.',
7
+ schema: z.object({
8
+ symbol: z.string().optional().describe('Symbol name. Use this OR file_path+line+column.'),
9
+ file_path: z.string().optional().describe('Absolute file path'),
10
+ line: z.number().optional().describe('1-indexed line number'),
11
+ column: z.number().optional().describe('1-indexed column number'),
12
+ direction: z.enum(['incoming', 'outgoing']).default('incoming').describe('incoming = who calls this; outgoing = what this calls'),
13
+ }),
14
+ async handler(params, engine) {
15
+ let uri, position;
16
+ if (params.symbol) {
17
+ const resolved = await engine.resolveSymbol(params.symbol, params.file_path);
18
+ uri = resolved.uri;
19
+ position = resolved.position;
20
+ }
21
+ else if (params.file_path && params.line && params.column) {
22
+ const prepared = await engine.prepareFile(params.file_path);
23
+ uri = prepared.uri;
24
+ position = toPosition(params.line, params.column);
25
+ }
26
+ else {
27
+ return 'Error: Provide either symbol name or file_path + line + column.';
28
+ }
29
+ // Step 1: Prepare call hierarchy
30
+ const items = await engine.request('textDocument/prepareCallHierarchy', { textDocument: { uri }, position });
31
+ if (!items || items.length === 0)
32
+ return 'No call hierarchy available for this symbol.';
33
+ const item = items[0];
34
+ // Step 2: Get incoming or outgoing calls
35
+ if (params.direction === 'incoming') {
36
+ const calls = await engine.request('callHierarchy/incomingCalls', { item });
37
+ if (!calls || calls.length === 0)
38
+ return `No incoming calls to ${item.name}.`;
39
+ const lines = [`# Incoming Calls to ${item.name}\n\n${calls.length} callers\n`];
40
+ for (const call of calls) {
41
+ const rel = relativePath(uriToPath(call.from.uri), engine.workspaceRoot);
42
+ const pos = fromPosition(call.from.selectionRange.start);
43
+ lines.push(`- **${call.from.name}** — ${rel}:${pos.line}`);
44
+ }
45
+ return lines.join('\n');
46
+ }
47
+ else {
48
+ const calls = await engine.request('callHierarchy/outgoingCalls', { item });
49
+ if (!calls || calls.length === 0)
50
+ return `No outgoing calls from ${item.name}.`;
51
+ const lines = [`# Outgoing Calls from ${item.name}\n\n${calls.length} callees\n`];
52
+ for (const call of calls) {
53
+ const rel = relativePath(uriToPath(call.to.uri), engine.workspaceRoot);
54
+ const pos = fromPosition(call.to.selectionRange.start);
55
+ lines.push(`- **${call.to.name}** — ${rel}:${pos.line}`);
56
+ }
57
+ return lines.join('\n');
58
+ }
59
+ },
60
+ });
61
+ //# sourceMappingURL=callHierarchy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callHierarchy.js","sourceRoot":"","sources":["../../../src/tools/primitives/callHierarchy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const completions: import("../registry.js").ToolDef;
@@ -0,0 +1,31 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from '../registry.js';
3
+ import { toPosition } from '../../engine/positions.js';
4
+ export const completions = defineTool({
5
+ name: 'completions',
6
+ description: 'Get code completion suggestions at a position. Rarely needed by agents — prefer hover or auto_import instead.',
7
+ schema: z.object({
8
+ file_path: z.string().describe('Absolute file path'),
9
+ line: z.number().describe('1-indexed line number'),
10
+ column: z.number().describe('1-indexed column number'),
11
+ limit: z.number().default(20).describe('Max results'),
12
+ }),
13
+ async handler(params, engine) {
14
+ const { uri } = await engine.prepareFile(params.file_path);
15
+ const position = toPosition(params.line, params.column);
16
+ const result = await engine.request('textDocument/completion', {
17
+ textDocument: { uri }, position,
18
+ });
19
+ const items = Array.isArray(result) ? result : result?.items ?? [];
20
+ if (items.length === 0)
21
+ return 'No completions available.';
22
+ const limited = items.slice(0, params.limit);
23
+ const lines = [`# Completions (${limited.length}/${items.length})\n`];
24
+ for (const item of limited) {
25
+ const detail = item.detail ? ` — ${item.detail}` : '';
26
+ lines.push(`- \`${item.label}\`${detail}`);
27
+ }
28
+ return lines.join('\n');
29
+ },
30
+ });
31
+ //# sourceMappingURL=completions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completions.js","sourceRoot":"","sources":["../../../src/tools/primitives/completions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAGvD,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;IACpC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,+GAA+G;IAC5H,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACpD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAClD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;KACtD,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM;QAC1B,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAA2C,yBAAyB,EAAE;YACvG,YAAY,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ;SAChC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAqB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC;QACrF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,2BAA2B,CAAC;QAE3D,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,CAAC,kBAAkB,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;QACtE,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const diagnostics: import("../registry.js").ToolDef;
@@ -0,0 +1,32 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from '../registry.js';
3
+ import { relativePath, fromPosition } from '../../engine/positions.js';
4
+ const SEVERITY = { 1: 'Error', 2: 'Warning', 3: 'Info', 4: 'Hint' };
5
+ export const diagnostics = defineTool({
6
+ name: 'diagnostics',
7
+ description: 'Get type errors and warnings for a file. Diagnostics are pushed by TypeScript Server in real-time.',
8
+ schema: z.object({
9
+ file_path: z.string().describe('Absolute file path'),
10
+ }),
11
+ async handler(params, engine) {
12
+ const { uri } = await engine.prepareFile(params.file_path);
13
+ // Wait briefly for diagnostics to be pushed
14
+ await new Promise((r) => setTimeout(r, 500));
15
+ const diags = engine.docManager.getCachedDiagnostics(uri);
16
+ if (diags.length === 0) {
17
+ const rel = relativePath(params.file_path, engine.workspaceRoot);
18
+ return `No diagnostics for ${rel}. File is clean.`;
19
+ }
20
+ const rel = relativePath(params.file_path, engine.workspaceRoot);
21
+ const lines = [`# Diagnostics: ${rel}\n\n${diags.length} issues\n`];
22
+ for (const d of diags.sort((a, b) => a.range.start.line - b.range.start.line)) {
23
+ const severity = SEVERITY[d.severity ?? 1];
24
+ const pos = fromPosition(d.range.start);
25
+ lines.push(`- **${severity}** L${pos.line}: ${d.message}`);
26
+ if (d.code)
27
+ lines[lines.length - 1] += ` (TS${d.code})`;
28
+ }
29
+ return lines.join('\n');
30
+ },
31
+ });
32
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/tools/primitives/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAa,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAElF,MAAM,QAAQ,GAA2B,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;AAE5F,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;IACpC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,oGAAoG;IACjH,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;KACrD,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM;QAC1B,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3D,4CAA4C;QAC5C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAE1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;YACjE,OAAO,sBAAsB,GAAG,kBAAkB,CAAC;QACrD,CAAC;QAED,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,CAAC,kBAAkB,GAAG,OAAO,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC;QACpE,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9E,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,OAAO,QAAQ,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,CAAC,IAAI;gBAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC;QAC1D,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const documentSymbols: import("../registry.js").ToolDef;
@@ -0,0 +1,42 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from '../registry.js';
3
+ import { relativePath } from '../../engine/positions.js';
4
+ const SYMBOL_KINDS = {
5
+ 1: 'File', 2: 'Module', 3: 'Namespace', 4: 'Package', 5: 'Class',
6
+ 6: 'Method', 7: 'Property', 8: 'Field', 9: 'Constructor', 10: 'Enum',
7
+ 11: 'Interface', 12: 'Function', 13: 'Variable', 14: 'Constant',
8
+ 15: 'String', 16: 'Number', 17: 'Boolean', 18: 'Array', 19: 'Object',
9
+ 20: 'Key', 21: 'Null', 22: 'EnumMember', 23: 'Struct', 24: 'Event',
10
+ 25: 'Operator', 26: 'TypeParameter',
11
+ };
12
+ function formatSymbolTree(symbols, indent = 0) {
13
+ const lines = [];
14
+ for (const sym of symbols) {
15
+ const kind = SYMBOL_KINDS[sym.kind] ?? 'Unknown';
16
+ const line = sym.range.start.line + 1;
17
+ const prefix = ' '.repeat(indent) + (indent > 0 ? '├── ' : '');
18
+ lines.push(`${prefix}${sym.name} (${kind}, L${line})`);
19
+ if (sym.children) {
20
+ lines.push(formatSymbolTree(sym.children, indent + 1));
21
+ }
22
+ }
23
+ return lines.join('\n');
24
+ }
25
+ export const documentSymbols = defineTool({
26
+ name: 'document_symbols',
27
+ description: 'List all symbols in a file — functions, classes, interfaces, variables. Use to understand file structure without reading the full file.',
28
+ schema: z.object({
29
+ file_path: z.string().describe('Absolute file path'),
30
+ }),
31
+ async handler(params, engine) {
32
+ const { uri } = await engine.prepareFile(params.file_path);
33
+ const result = await engine.request('textDocument/documentSymbol', {
34
+ textDocument: { uri },
35
+ });
36
+ if (!result || result.length === 0)
37
+ return 'No symbols found.';
38
+ const rel = relativePath(params.file_path, engine.workspaceRoot);
39
+ return `# Symbols in ${rel}\n\n${formatSymbolTree(result)}`;
40
+ },
41
+ });
42
+ //# sourceMappingURL=documentSymbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentSymbols.js","sourceRoot":"","sources":["../../../src/tools/primitives/documentSymbols.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const fileExports: import("../registry.js").ToolDef;
@@ -0,0 +1,69 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from '../registry.js';
3
+ import { relativePath } from '../../engine/positions.js';
4
+ import * as fs from 'fs';
5
+ const SYMBOL_KINDS = {
6
+ 5: 'Class', 6: 'Method', 10: 'Enum', 11: 'Interface',
7
+ 12: 'Function', 13: 'Variable', 14: 'Constant',
8
+ };
9
+ export const fileExports = defineTool({
10
+ name: 'file_exports',
11
+ description: "List a file's public API — all exported symbols with their kinds.",
12
+ schema: z.object({
13
+ file_path: z.string().describe('Absolute file path'),
14
+ }),
15
+ async handler(params, engine) {
16
+ const content = fs.readFileSync(params.file_path, 'utf-8');
17
+ const { uri } = await engine.prepareFile(params.file_path);
18
+ const symbols = await engine.request('textDocument/documentSymbol', {
19
+ textDocument: { uri },
20
+ });
21
+ const lines1 = content.split('\n');
22
+ const exported = [];
23
+ // Use document symbols + check if the line contains 'export'
24
+ if (symbols) {
25
+ const collect = (syms) => {
26
+ for (const sym of syms) {
27
+ const lineNum = sym.range.start.line;
28
+ const lineText = lines1[lineNum] ?? '';
29
+ if (lineText.includes('export')) {
30
+ exported.push({
31
+ name: sym.name,
32
+ kind: SYMBOL_KINDS[sym.kind] ?? 'Unknown',
33
+ line: lineNum + 1,
34
+ });
35
+ }
36
+ if (sym.children)
37
+ collect(sym.children);
38
+ }
39
+ };
40
+ collect(symbols);
41
+ }
42
+ // Also catch re-exports: export { X } from "./module"
43
+ for (let i = 0; i < lines1.length; i++) {
44
+ const match = lines1[i].match(/export\s+\{([^}]+)\}\s+from/);
45
+ if (match) {
46
+ const names = match[1].split(',').map((s) => s.trim().split(' as ')[0].trim());
47
+ for (const name of names) {
48
+ if (!exported.some((e) => e.name === name)) {
49
+ exported.push({ name, kind: 're-export', line: i + 1 });
50
+ }
51
+ }
52
+ }
53
+ // export * from
54
+ const starMatch = lines1[i].match(/export\s+\*\s+from\s+['"]([^'"]+)['"]/);
55
+ if (starMatch) {
56
+ exported.push({ name: `* from "${starMatch[1]}"`, kind: 'barrel', line: i + 1 });
57
+ }
58
+ }
59
+ if (exported.length === 0)
60
+ return 'No exports found.';
61
+ const rel = relativePath(params.file_path, engine.workspaceRoot);
62
+ const result = [`# Exports: ${rel}\n\n${exported.length} exports\n`];
63
+ for (const exp of exported.sort((a, b) => a.line - b.line)) {
64
+ result.push(`- L${exp.line}: **${exp.name}** (${exp.kind})`);
65
+ }
66
+ return result.join('\n');
67
+ },
68
+ });
69
+ //# sourceMappingURL=fileExports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileExports.js","sourceRoot":"","sources":["../../../src/tools/primitives/fileExports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const fileImports: import("../registry.js").ToolDef;
@@ -0,0 +1,58 @@
1
+ import { z } from 'zod';
2
+ import * as fs from 'fs';
3
+ import { defineTool } from '../registry.js';
4
+ import { relativePath } from '../../engine/positions.js';
5
+ function parseImports(content) {
6
+ const imports = [];
7
+ const lines = content.split('\n');
8
+ for (let i = 0; i < lines.length; i++) {
9
+ const line = lines[i];
10
+ // Named imports: import { A, B } from "module"
11
+ const named = line.match(/import\s+\{([^}]+)\}\s+from\s+['"]([^'"]+)['"]/);
12
+ if (named) {
13
+ const symbols = named[1].split(',').map((s) => s.trim().split(' as ')[0].trim()).filter(Boolean);
14
+ imports.push({ module: named[2], symbols, line: i + 1, isDefault: false, isNamespace: false });
15
+ continue;
16
+ }
17
+ // Default import: import Name from "module"
18
+ const def = line.match(/import\s+(\w+)\s+from\s+['"]([^'"]+)['"]/);
19
+ if (def) {
20
+ imports.push({ module: def[2], symbols: [def[1]], line: i + 1, isDefault: true, isNamespace: false });
21
+ continue;
22
+ }
23
+ // Namespace import: import * as Name from "module"
24
+ const ns = line.match(/import\s+\*\s+as\s+(\w+)\s+from\s+['"]([^'"]+)['"]/);
25
+ if (ns) {
26
+ imports.push({ module: ns[2], symbols: [ns[1]], line: i + 1, isDefault: false, isNamespace: true });
27
+ continue;
28
+ }
29
+ // Side-effect import: import "module"
30
+ const side = line.match(/import\s+['"]([^'"]+)['"]/);
31
+ if (side) {
32
+ imports.push({ module: side[1], symbols: [], line: i + 1, isDefault: false, isNamespace: false });
33
+ }
34
+ }
35
+ return imports;
36
+ }
37
+ export const fileImports = defineTool({
38
+ name: 'file_imports',
39
+ description: 'List all imports of a file — modules, symbols, and line numbers.',
40
+ schema: z.object({
41
+ file_path: z.string().describe('Absolute file path'),
42
+ }),
43
+ async handler(params, engine) {
44
+ const content = fs.readFileSync(params.file_path, 'utf-8');
45
+ const imports = parseImports(content);
46
+ if (imports.length === 0)
47
+ return 'No imports found.';
48
+ const rel = relativePath(params.file_path, engine.workspaceRoot);
49
+ const lines = [`# Imports: ${rel}\n\n${imports.length} imports\n`];
50
+ for (const imp of imports) {
51
+ const symbolList = imp.symbols.length > 0 ? `{ ${imp.symbols.join(', ')} }` : '(side-effect)';
52
+ const tag = imp.isDefault ? '[default]' : imp.isNamespace ? '[namespace]' : '';
53
+ lines.push(`- L${imp.line}: \`${imp.module}\` → ${symbolList} ${tag}`.trim());
54
+ }
55
+ return lines.join('\n');
56
+ },
57
+ });
58
+ //# sourceMappingURL=fileImports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileImports.js","sourceRoot":"","sources":["../../../src/tools/primitives/fileImports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const findImplementations: import("../registry.js").ToolDef;
@@ -0,0 +1,36 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from '../registry.js';
3
+ import { toPosition } from '../../engine/positions.js';
4
+ import { formatReferences } from '../../format/markdown.js';
5
+ export const findImplementations = defineTool({
6
+ name: 'find_implementations',
7
+ description: 'Find concrete implementations of an interface or abstract class. Use before modifying a contract to see what code implements it.',
8
+ schema: z.object({
9
+ symbol: z.string().optional().describe('Symbol name. Use this OR file_path+line+column.'),
10
+ file_path: z.string().optional().describe('Absolute file path'),
11
+ line: z.number().optional().describe('1-indexed line number'),
12
+ column: z.number().optional().describe('1-indexed column number'),
13
+ verbosity: z.enum(['summary', 'normal', 'detailed']).default('normal'),
14
+ }),
15
+ async handler(params, engine) {
16
+ let uri, position;
17
+ if (params.symbol) {
18
+ const resolved = await engine.resolveSymbol(params.symbol, params.file_path);
19
+ uri = resolved.uri;
20
+ position = resolved.position;
21
+ }
22
+ else if (params.file_path && params.line && params.column) {
23
+ const prepared = await engine.prepareFile(params.file_path);
24
+ uri = prepared.uri;
25
+ position = toPosition(params.line, params.column);
26
+ }
27
+ else {
28
+ return 'Error: Provide either symbol name or file_path + line + column.';
29
+ }
30
+ const result = await engine.request('textDocument/implementation', {
31
+ textDocument: { uri }, position,
32
+ });
33
+ return formatReferences(result, engine.workspaceRoot, params.verbosity);
34
+ },
35
+ });
36
+ //# sourceMappingURL=findImplementations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findImplementations.js","sourceRoot":"","sources":["../../../src/tools/primitives/findImplementations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;IAC5C,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,kIAAkI;IAC/I,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;QACzF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC/D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACjE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;KACvE,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM;QAC1B,IAAI,GAAW,EAAE,QAA6C,CAAC;QAC/D,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7E,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACnD,CAAC;aAAM,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5D,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,OAAO,iEAAiE,CAAC;QAC3E,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAoB,6BAA6B,EAAE;YACpF,YAAY,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ;SAChC,CAAC,CAAC;QACH,OAAO,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,SAAgB,CAAC,CAAC;IACjF,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const findReferences: import("../registry.js").ToolDef;
@@ -0,0 +1,42 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from '../registry.js';
3
+ import { toPosition } from '../../engine/positions.js';
4
+ import { formatReferences } from '../../format/markdown.js';
5
+ export const findReferences = defineTool({
6
+ name: 'find_references',
7
+ description: 'Find every usage of a symbol across the codebase. Accepts symbol name OR file position. Semantic — no false positives from comments or strings. More accurate than grep.',
8
+ schema: z.object({
9
+ symbol: z.string().optional().describe('Symbol name, e.g. "createSDK". Use this OR file_path+line+column.'),
10
+ file_path: z.string().optional().describe('Absolute file path. Required with line+column.'),
11
+ line: z.number().optional().describe('1-indexed line number'),
12
+ column: z.number().optional().describe('1-indexed column number'),
13
+ include_declaration: z.boolean().default(true).describe('Include the declaration itself in results'),
14
+ limit: z.number().default(100).describe('Maximum number of results'),
15
+ verbosity: z.enum(['summary', 'normal', 'detailed']).default('normal').describe('Output detail level'),
16
+ }),
17
+ async handler(params, engine) {
18
+ let uri;
19
+ let position;
20
+ if (params.symbol) {
21
+ const resolved = await engine.resolveSymbol(params.symbol, params.file_path);
22
+ uri = resolved.uri;
23
+ position = resolved.position;
24
+ }
25
+ else if (params.file_path && params.line && params.column) {
26
+ const prepared = await engine.prepareFile(params.file_path);
27
+ uri = prepared.uri;
28
+ position = toPosition(params.line, params.column);
29
+ }
30
+ else {
31
+ return 'Error: Provide either symbol name or file_path + line + column.';
32
+ }
33
+ const result = await engine.request('textDocument/references', {
34
+ textDocument: { uri },
35
+ position,
36
+ context: { includeDeclaration: params.include_declaration },
37
+ });
38
+ const limited = result?.slice(0, params.limit) ?? [];
39
+ return formatReferences(limited, engine.workspaceRoot, params.verbosity);
40
+ },
41
+ });
42
+ //# sourceMappingURL=findReferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findReferences.js","sourceRoot":"","sources":["../../../src/tools/primitives/findReferences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAI5D,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACvC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,0KAA0K;IAC5K,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;QAC3G,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;QAC3F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACjE,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACpG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACpE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;KACvG,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM;QAC1B,IAAI,GAAW,CAAC;QAChB,IAAI,QAA6C,CAAC;QAElD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7E,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YACnB,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC/B,CAAC;aAAM,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5D,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YACnB,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,OAAO,iEAAiE,CAAC;QAC3E,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAoB,yBAAyB,EAAE;YAChF,YAAY,EAAE,EAAE,GAAG,EAAE;YACrB,QAAQ;YACR,OAAO,EAAE,EAAE,kBAAkB,EAAE,MAAM,CAAC,mBAAmB,EAAE;SAC5D,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACrD,OAAO,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,SAAsB,CAAC,CAAC;IACxF,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const gotoDefinition: import("../registry.js").ToolDef;
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from '../registry.js';
3
+ import { toPosition } from '../../engine/positions.js';
4
+ import { formatDefinitions } from '../../format/markdown.js';
5
+ export const gotoDefinition = defineTool({
6
+ name: 'goto_definition',
7
+ description: 'Jump to where a symbol is defined. Accepts symbol name OR file position. Follows imports, re-exports, and aliases to the actual source.',
8
+ schema: z.object({
9
+ symbol: z.string().optional().describe('Symbol name, e.g. "createSDK". Use this OR file_path+line+column.'),
10
+ file_path: z.string().optional().describe('Absolute file path. Required with line+column.'),
11
+ line: z.number().optional().describe('1-indexed line number'),
12
+ column: z.number().optional().describe('1-indexed column number'),
13
+ }),
14
+ async handler(params, engine) {
15
+ let uri;
16
+ let position;
17
+ if (params.symbol) {
18
+ const resolved = await engine.resolveSymbol(params.symbol, params.file_path);
19
+ uri = resolved.uri;
20
+ position = resolved.position;
21
+ }
22
+ else if (params.file_path && params.line && params.column) {
23
+ const prepared = await engine.prepareFile(params.file_path);
24
+ uri = prepared.uri;
25
+ position = toPosition(params.line, params.column);
26
+ }
27
+ else {
28
+ return 'Error: Provide either symbol name or file_path + line + column.';
29
+ }
30
+ const result = await engine.request('textDocument/definition', {
31
+ textDocument: { uri },
32
+ position,
33
+ });
34
+ return formatDefinitions(result, engine.workspaceRoot);
35
+ },
36
+ });
37
+ //# sourceMappingURL=gotoDefinition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gotoDefinition.js","sourceRoot":"","sources":["../../../src/tools/primitives/gotoDefinition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACvC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,yIAAyI;IAC3I,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;QAC3G,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;QAC3F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KAClE,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM;QAC1B,IAAI,GAAW,CAAC;QAChB,IAAI,QAA6C,CAAC;QAElD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7E,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YACnB,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC/B,CAAC;aAAM,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5D,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YACnB,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,OAAO,iEAAiE,CAAC;QAC3E,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAA+B,yBAAyB,EAAE;YAC3F,YAAY,EAAE,EAAE,GAAG,EAAE;YACrB,QAAQ;SACT,CAAC,CAAC;QAEH,OAAO,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACzD,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const gotoTypeDefinition: import("../registry.js").ToolDef;
@@ -0,0 +1,35 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from '../registry.js';
3
+ import { toPosition } from '../../engine/positions.js';
4
+ import { formatDefinitions } from '../../format/markdown.js';
5
+ export const gotoTypeDefinition = defineTool({
6
+ name: 'goto_type_definition',
7
+ description: 'Find the type that defines a variable or parameter. Use when you have a variable and want its interface/class definition, not where the variable is declared.',
8
+ schema: z.object({
9
+ symbol: z.string().optional().describe('Symbol name. Use this OR file_path+line+column.'),
10
+ file_path: z.string().optional().describe('Absolute file path'),
11
+ line: z.number().optional().describe('1-indexed line number'),
12
+ column: z.number().optional().describe('1-indexed column number'),
13
+ }),
14
+ async handler(params, engine) {
15
+ let uri, position;
16
+ if (params.symbol) {
17
+ const resolved = await engine.resolveSymbol(params.symbol, params.file_path);
18
+ uri = resolved.uri;
19
+ position = resolved.position;
20
+ }
21
+ else if (params.file_path && params.line && params.column) {
22
+ const prepared = await engine.prepareFile(params.file_path);
23
+ uri = prepared.uri;
24
+ position = toPosition(params.line, params.column);
25
+ }
26
+ else {
27
+ return 'Error: Provide either symbol name or file_path + line + column.';
28
+ }
29
+ const result = await engine.request('textDocument/typeDefinition', {
30
+ textDocument: { uri }, position,
31
+ });
32
+ return formatDefinitions(result, engine.workspaceRoot);
33
+ },
34
+ });
35
+ //# sourceMappingURL=gotoTypeDefinition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gotoTypeDefinition.js","sourceRoot":"","sources":["../../../src/tools/primitives/gotoTypeDefinition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;IAC3C,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,+JAA+J;IAC5K,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;QACzF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC/D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KAClE,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM;QAC1B,IAAI,GAAW,EAAE,QAA6C,CAAC;QAC/D,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7E,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACnD,CAAC;aAAM,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5D,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,OAAO,iEAAiE,CAAC;QAC3E,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAA+B,6BAA6B,EAAE;YAC/F,YAAY,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ;SAChC,CAAC,CAAC;QACH,OAAO,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACzD,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const hover: import("../registry.js").ToolDef;