claude-ide-bridge 1.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.
- package/LICENSE +21 -0
- package/README.md +263 -0
- package/dist/activityLog.d.ts +26 -0
- package/dist/activityLog.js +76 -0
- package/dist/activityLog.js.map +1 -0
- package/dist/bridge.d.ts +19 -0
- package/dist/bridge.js +277 -0
- package/dist/bridge.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.js +221 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.js +20 -0
- package/dist/errors.js.map +1 -0
- package/dist/extensionClient.d.ts +193 -0
- package/dist/extensionClient.js +698 -0
- package/dist/extensionClient.js.map +1 -0
- package/dist/fileLock.d.ts +12 -0
- package/dist/fileLock.js +30 -0
- package/dist/fileLock.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/lockfile.d.ts +12 -0
- package/dist/lockfile.js +127 -0
- package/dist/lockfile.js.map +1 -0
- package/dist/logger.d.ts +16 -0
- package/dist/logger.js +68 -0
- package/dist/logger.js.map +1 -0
- package/dist/probe.d.ts +22 -0
- package/dist/probe.js +45 -0
- package/dist/probe.js.map +1 -0
- package/dist/server.d.ts +25 -0
- package/dist/server.js +265 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/activityLog.d.ts +39 -0
- package/dist/tools/activityLog.js +49 -0
- package/dist/tools/activityLog.js.map +1 -0
- package/dist/tools/aiComments.d.ts +26 -0
- package/dist/tools/aiComments.js +196 -0
- package/dist/tools/aiComments.js.map +1 -0
- package/dist/tools/bridgeStatus.d.ts +21 -0
- package/dist/tools/bridgeStatus.js +41 -0
- package/dist/tools/bridgeStatus.js.map +1 -0
- package/dist/tools/checkDocumentDirty.d.ts +28 -0
- package/dist/tools/checkDocumentDirty.js +61 -0
- package/dist/tools/checkDocumentDirty.js.map +1 -0
- package/dist/tools/clipboard.d.ts +50 -0
- package/dist/tools/clipboard.js +82 -0
- package/dist/tools/clipboard.js.map +1 -0
- package/dist/tools/closeTabs.d.ts +49 -0
- package/dist/tools/closeTabs.js +77 -0
- package/dist/tools/closeTabs.js.map +1 -0
- package/dist/tools/debug.d.ts +154 -0
- package/dist/tools/debug.js +248 -0
- package/dist/tools/debug.js.map +1 -0
- package/dist/tools/decorations.d.ts +92 -0
- package/dist/tools/decorations.js +150 -0
- package/dist/tools/decorations.js.map +1 -0
- package/dist/tools/diffDebugger.d.ts +62 -0
- package/dist/tools/diffDebugger.js +245 -0
- package/dist/tools/diffDebugger.js.map +1 -0
- package/dist/tools/editText.d.ts +80 -0
- package/dist/tools/editText.js +274 -0
- package/dist/tools/editText.js.map +1 -0
- package/dist/tools/fileOperations.d.ts +111 -0
- package/dist/tools/fileOperations.js +280 -0
- package/dist/tools/fileOperations.js.map +1 -0
- package/dist/tools/fileWatcher.d.ts +54 -0
- package/dist/tools/fileWatcher.js +100 -0
- package/dist/tools/fileWatcher.js.map +1 -0
- package/dist/tools/findFiles.d.ts +31 -0
- package/dist/tools/findFiles.js +119 -0
- package/dist/tools/findFiles.js.map +1 -0
- package/dist/tools/fixAllLintErrors.d.ts +29 -0
- package/dist/tools/fixAllLintErrors.js +114 -0
- package/dist/tools/fixAllLintErrors.js.map +1 -0
- package/dist/tools/flowGuardian.d.ts +61 -0
- package/dist/tools/flowGuardian.js +311 -0
- package/dist/tools/flowGuardian.js.map +1 -0
- package/dist/tools/formatDocument.d.ts +30 -0
- package/dist/tools/formatDocument.js +132 -0
- package/dist/tools/formatDocument.js.map +1 -0
- package/dist/tools/formatFile.d.ts +28 -0
- package/dist/tools/formatFile.js +110 -0
- package/dist/tools/formatFile.js.map +1 -0
- package/dist/tools/getBufferContent.d.ts +38 -0
- package/dist/tools/getBufferContent.js +100 -0
- package/dist/tools/getBufferContent.js.map +1 -0
- package/dist/tools/getCurrentSelection.d.ts +43 -0
- package/dist/tools/getCurrentSelection.js +75 -0
- package/dist/tools/getCurrentSelection.js.map +1 -0
- package/dist/tools/getDiagnostics.d.ts +38 -0
- package/dist/tools/getDiagnostics.js +204 -0
- package/dist/tools/getDiagnostics.js.map +1 -0
- package/dist/tools/getDocumentSymbols.d.ts +27 -0
- package/dist/tools/getDocumentSymbols.js +133 -0
- package/dist/tools/getDocumentSymbols.js.map +1 -0
- package/dist/tools/getFileTree.d.ts +36 -0
- package/dist/tools/getFileTree.js +111 -0
- package/dist/tools/getFileTree.js.map +1 -0
- package/dist/tools/getGitDiff.d.ts +34 -0
- package/dist/tools/getGitDiff.js +57 -0
- package/dist/tools/getGitDiff.js.map +1 -0
- package/dist/tools/getGitLog.d.ts +30 -0
- package/dist/tools/getGitLog.js +65 -0
- package/dist/tools/getGitLog.js.map +1 -0
- package/dist/tools/getGitStatus.d.ts +26 -0
- package/dist/tools/getGitStatus.js +95 -0
- package/dist/tools/getGitStatus.js.map +1 -0
- package/dist/tools/getOpenEditors.d.ts +21 -0
- package/dist/tools/getOpenEditors.js +84 -0
- package/dist/tools/getOpenEditors.js.map +1 -0
- package/dist/tools/getProjectInfo.d.ts +20 -0
- package/dist/tools/getProjectInfo.js +315 -0
- package/dist/tools/getProjectInfo.js.map +1 -0
- package/dist/tools/getToolCapabilities.d.ts +23 -0
- package/dist/tools/getToolCapabilities.js +249 -0
- package/dist/tools/getToolCapabilities.js.map +1 -0
- package/dist/tools/getWorkspaceFolders.d.ts +21 -0
- package/dist/tools/getWorkspaceFolders.js +47 -0
- package/dist/tools/getWorkspaceFolders.js.map +1 -0
- package/dist/tools/gitHistory.d.ts +78 -0
- package/dist/tools/gitHistory.js +151 -0
- package/dist/tools/gitHistory.js.map +1 -0
- package/dist/tools/gitWrite.d.ts +335 -0
- package/dist/tools/gitWrite.js +859 -0
- package/dist/tools/gitWrite.js.map +1 -0
- package/dist/tools/github/actions.d.ts +67 -0
- package/dist/tools/github/actions.js +155 -0
- package/dist/tools/github/actions.js.map +1 -0
- package/dist/tools/github/index.d.ts +4 -0
- package/dist/tools/github/index.js +5 -0
- package/dist/tools/github/index.js.map +1 -0
- package/dist/tools/github/issues.d.ts +140 -0
- package/dist/tools/github/issues.js +279 -0
- package/dist/tools/github/issues.js.map +1 -0
- package/dist/tools/github/pr.d.ts +101 -0
- package/dist/tools/github/pr.js +215 -0
- package/dist/tools/github/pr.js.map +1 -0
- package/dist/tools/github/review.d.ts +101 -0
- package/dist/tools/github/review.js +292 -0
- package/dist/tools/github/review.js.map +1 -0
- package/dist/tools/github/shared.d.ts +4 -0
- package/dist/tools/github/shared.js +12 -0
- package/dist/tools/github/shared.js.map +1 -0
- package/dist/tools/github.d.ts +308 -0
- package/dist/tools/github.js +656 -0
- package/dist/tools/github.js.map +1 -0
- package/dist/tools/hoverAtCursor.d.ts +22 -0
- package/dist/tools/hoverAtCursor.js +51 -0
- package/dist/tools/hoverAtCursor.js.map +1 -0
- package/dist/tools/httpClient.d.ts +83 -0
- package/dist/tools/httpClient.js +335 -0
- package/dist/tools/httpClient.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.js +246 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/inlayHints.d.ts +38 -0
- package/dist/tools/inlayHints.js +56 -0
- package/dist/tools/inlayHints.js.map +1 -0
- package/dist/tools/linters/biome.d.ts +2 -0
- package/dist/tools/linters/biome.js +44 -0
- package/dist/tools/linters/biome.js.map +1 -0
- package/dist/tools/linters/cargo.d.ts +2 -0
- package/dist/tools/linters/cargo.js +45 -0
- package/dist/tools/linters/cargo.js.map +1 -0
- package/dist/tools/linters/eslint.d.ts +2 -0
- package/dist/tools/linters/eslint.js +59 -0
- package/dist/tools/linters/eslint.js.map +1 -0
- package/dist/tools/linters/govet.d.ts +2 -0
- package/dist/tools/linters/govet.js +37 -0
- package/dist/tools/linters/govet.js.map +1 -0
- package/dist/tools/linters/pyright.d.ts +2 -0
- package/dist/tools/linters/pyright.js +34 -0
- package/dist/tools/linters/pyright.js.map +1 -0
- package/dist/tools/linters/ruff.d.ts +2 -0
- package/dist/tools/linters/ruff.js +30 -0
- package/dist/tools/linters/ruff.js.map +1 -0
- package/dist/tools/linters/types.d.ts +16 -0
- package/dist/tools/linters/types.js +2 -0
- package/dist/tools/linters/types.js.map +1 -0
- package/dist/tools/linters/typescript.d.ts +2 -0
- package/dist/tools/linters/typescript.js +38 -0
- package/dist/tools/linters/typescript.js.map +1 -0
- package/dist/tools/lsp.d.ts +310 -0
- package/dist/tools/lsp.js +684 -0
- package/dist/tools/lsp.js.map +1 -0
- package/dist/tools/notebook.d.ts +95 -0
- package/dist/tools/notebook.js +144 -0
- package/dist/tools/notebook.js.map +1 -0
- package/dist/tools/openDiff.d.ts +41 -0
- package/dist/tools/openDiff.js +116 -0
- package/dist/tools/openDiff.js.map +1 -0
- package/dist/tools/openFile.d.ts +34 -0
- package/dist/tools/openFile.js +102 -0
- package/dist/tools/openFile.js.map +1 -0
- package/dist/tools/organizeImports.d.ts +29 -0
- package/dist/tools/organizeImports.js +64 -0
- package/dist/tools/organizeImports.js.map +1 -0
- package/dist/tools/planPersistence.d.ts +196 -0
- package/dist/tools/planPersistence.js +437 -0
- package/dist/tools/planPersistence.js.map +1 -0
- package/dist/tools/replaceBlock.d.ts +40 -0
- package/dist/tools/replaceBlock.js +105 -0
- package/dist/tools/replaceBlock.js.map +1 -0
- package/dist/tools/runCommand.d.ts +43 -0
- package/dist/tools/runCommand.js +141 -0
- package/dist/tools/runCommand.js.map +1 -0
- package/dist/tools/runTests.d.ts +32 -0
- package/dist/tools/runTests.js +160 -0
- package/dist/tools/runTests.js.map +1 -0
- package/dist/tools/saveDocument.d.ts +28 -0
- package/dist/tools/saveDocument.js +58 -0
- package/dist/tools/saveDocument.js.map +1 -0
- package/dist/tools/searchAndReplace.d.ts +50 -0
- package/dist/tools/searchAndReplace.js +203 -0
- package/dist/tools/searchAndReplace.js.map +1 -0
- package/dist/tools/searchWorkspace.d.ts +52 -0
- package/dist/tools/searchWorkspace.js +159 -0
- package/dist/tools/searchWorkspace.js.map +1 -0
- package/dist/tools/setActiveWorkspaceFolder.d.ts +28 -0
- package/dist/tools/setActiveWorkspaceFolder.js +32 -0
- package/dist/tools/setActiveWorkspaceFolder.js.map +1 -0
- package/dist/tools/tasks.d.ts +56 -0
- package/dist/tools/tasks.js +89 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/terminal.d.ts +241 -0
- package/dist/tools/terminal.js +539 -0
- package/dist/tools/terminal.js.map +1 -0
- package/dist/tools/testRunners/cargoTest.d.ts +2 -0
- package/dist/tools/testRunners/cargoTest.js +123 -0
- package/dist/tools/testRunners/cargoTest.js.map +1 -0
- package/dist/tools/testRunners/goTest.d.ts +2 -0
- package/dist/tools/testRunners/goTest.js +106 -0
- package/dist/tools/testRunners/goTest.js.map +1 -0
- package/dist/tools/testRunners/pytest.d.ts +2 -0
- package/dist/tools/testRunners/pytest.js +133 -0
- package/dist/tools/testRunners/pytest.js.map +1 -0
- package/dist/tools/testRunners/types.d.ts +18 -0
- package/dist/tools/testRunners/types.js +2 -0
- package/dist/tools/testRunners/types.js.map +1 -0
- package/dist/tools/testRunners/vitestJest.d.ts +3 -0
- package/dist/tools/testRunners/vitestJest.js +178 -0
- package/dist/tools/testRunners/vitestJest.js.map +1 -0
- package/dist/tools/typeHierarchy.d.ts +45 -0
- package/dist/tools/typeHierarchy.js +65 -0
- package/dist/tools/typeHierarchy.js.map +1 -0
- package/dist/tools/utils.d.ts +54 -0
- package/dist/tools/utils.js +267 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools/vscodeCommands.d.ts +59 -0
- package/dist/tools/vscodeCommands.js +108 -0
- package/dist/tools/vscodeCommands.js.map +1 -0
- package/dist/tools/watchDiagnostics.d.ts +32 -0
- package/dist/tools/watchDiagnostics.js +87 -0
- package/dist/tools/watchDiagnostics.js.map +1 -0
- package/dist/tools/workspaceSettings.d.ts +67 -0
- package/dist/tools/workspaceSettings.js +102 -0
- package/dist/tools/workspaceSettings.js.map +1 -0
- package/dist/tools/workspaceSnapshots.d.ts +174 -0
- package/dist/tools/workspaceSnapshots.js +474 -0
- package/dist/tools/workspaceSnapshots.js.map +1 -0
- package/dist/transport.d.ts +57 -0
- package/dist/transport.js +417 -0
- package/dist/transport.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/wsUtils.d.ts +9 -0
- package/dist/wsUtils.js +54 -0
- package/dist/wsUtils.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { ExtensionTimeoutError, } from "../extensionClient.js";
|
|
2
|
+
import { error, extensionRequired, optionalInt, optionalString, requireInt, requireString, resolveFilePath, success, } from "./utils.js";
|
|
3
|
+
export function createGetTypeHierarchyTool(workspace, extensionClient) {
|
|
4
|
+
return {
|
|
5
|
+
schema: {
|
|
6
|
+
name: "getTypeHierarchy",
|
|
7
|
+
description: "Get the type hierarchy for a symbol — its supertypes (parent classes/interfaces) " +
|
|
8
|
+
"and subtypes (implementations/subclasses). Requires the VS Code extension and " +
|
|
9
|
+
"a language server that supports type hierarchy (TypeScript, Java, C++, etc.).",
|
|
10
|
+
annotations: { readOnlyHint: true },
|
|
11
|
+
inputSchema: {
|
|
12
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
13
|
+
type: "object",
|
|
14
|
+
required: ["file", "line", "column"],
|
|
15
|
+
properties: {
|
|
16
|
+
file: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "Absolute path to the file",
|
|
19
|
+
},
|
|
20
|
+
line: {
|
|
21
|
+
type: "integer",
|
|
22
|
+
description: "Line number (1-based)",
|
|
23
|
+
},
|
|
24
|
+
column: {
|
|
25
|
+
type: "integer",
|
|
26
|
+
description: "Column number (1-based)",
|
|
27
|
+
},
|
|
28
|
+
direction: {
|
|
29
|
+
type: "string",
|
|
30
|
+
enum: ["supertypes", "subtypes", "both"],
|
|
31
|
+
description: "Which direction to traverse (default: both)",
|
|
32
|
+
},
|
|
33
|
+
maxResults: {
|
|
34
|
+
type: "integer",
|
|
35
|
+
description: "Max results per direction (default: 20)",
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
additionalProperties: false,
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
async handler(args) {
|
|
42
|
+
if (!extensionClient.isConnected()) {
|
|
43
|
+
return extensionRequired("getTypeHierarchy");
|
|
44
|
+
}
|
|
45
|
+
const file = resolveFilePath(requireString(args, "file"), workspace);
|
|
46
|
+
const line = requireInt(args, "line", 1, 1_000_000);
|
|
47
|
+
const column = requireInt(args, "column", 1, 100_000);
|
|
48
|
+
const direction = optionalString(args, "direction") ?? "both";
|
|
49
|
+
const maxResults = optionalInt(args, "maxResults", 1, 200) ?? 20;
|
|
50
|
+
try {
|
|
51
|
+
const result = await extensionClient.getTypeHierarchy(file, line, column, direction, maxResults);
|
|
52
|
+
if (result === null)
|
|
53
|
+
return error("Failed to get type hierarchy");
|
|
54
|
+
return success(result);
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
if (err instanceof ExtensionTimeoutError) {
|
|
58
|
+
return error("Extension timed out getting type hierarchy");
|
|
59
|
+
}
|
|
60
|
+
throw err;
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=typeHierarchy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeHierarchy.js","sourceRoot":"","sources":["../../src/tools/typeHierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,KAAK,EACL,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,UAAU,EACV,aAAa,EACb,eAAe,EACf,OAAO,GACR,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,0BAA0B,CACxC,SAAiB,EACjB,eAAgC;IAEhC,OAAO;QACL,MAAM,EAAE;YACN,IAAI,EAAE,kBAAkB;YACxB,WAAW,EACT,mFAAmF;gBACnF,gFAAgF;gBAChF,+EAA+E;YACjF,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;YACnC,WAAW,EAAE;gBACX,OAAO,EAAE,yCAAyC;gBAClD,IAAI,EAAE,QAAiB;gBACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;gBACpC,UAAU,EAAE;oBACV,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAiB;wBACvB,WAAW,EAAE,2BAA2B;qBACzC;oBACD,IAAI,EAAE;wBACJ,IAAI,EAAE,SAAkB;wBACxB,WAAW,EAAE,uBAAuB;qBACrC;oBACD,MAAM,EAAE;wBACN,IAAI,EAAE,SAAkB;wBACxB,WAAW,EAAE,yBAAyB;qBACvC;oBACD,SAAS,EAAE;wBACT,IAAI,EAAE,QAAiB;wBACvB,IAAI,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC;wBACxC,WAAW,EAAE,6CAA6C;qBAC3D;oBACD,UAAU,EAAE;wBACV,IAAI,EAAE,SAAkB;wBACxB,WAAW,EAAE,yCAAyC;qBACvD;iBACF;gBACD,oBAAoB,EAAE,KAAc;aACrC;SACF;QACD,KAAK,CAAC,OAAO,CAAC,IAA6B;YACzC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,EAAE,CAAC;gBACnC,OAAO,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM,IAAI,GAAG,eAAe,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;YACrE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC;YAC9D,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;YACjE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,gBAAgB,CACnD,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,SAAS,EACT,UAAU,CACX,CAAC;gBACF,IAAI,MAAM,KAAK,IAAI;oBAAE,OAAO,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBAClE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,qBAAqB,EAAE,CAAC;oBACzC,OAAO,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBAC7D,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export declare function requireString(args: Record<string, unknown>, key: string, maxLength?: number): string;
|
|
2
|
+
export declare function optionalString(args: Record<string, unknown>, key: string, maxLength?: number): string | undefined;
|
|
3
|
+
export declare function optionalInt(args: Record<string, unknown>, key: string, min?: number, max?: number): number | undefined;
|
|
4
|
+
export declare function optionalBool(args: Record<string, unknown>, key: string): boolean | undefined;
|
|
5
|
+
/** Require args[key] to be a non-null object. Throws on failure. */
|
|
6
|
+
export declare function requireObject(args: Record<string, unknown>, key: string): Record<string, unknown>;
|
|
7
|
+
/** Require args[key] to be an array. Throws on failure. */
|
|
8
|
+
export declare function requireArray(args: Record<string, unknown>, key: string): unknown[];
|
|
9
|
+
/** Return args[key] if it is an array, undefined if absent, throw if wrong type. */
|
|
10
|
+
export declare function optionalArray(args: Record<string, unknown>, key: string): unknown[] | undefined;
|
|
11
|
+
export declare function resolveFilePath(filePath: string, workspace: string): string;
|
|
12
|
+
export declare function findLineNumber(filePath: string, text: string): Promise<number | null>;
|
|
13
|
+
export declare function success(data: unknown): {
|
|
14
|
+
content: Array<{
|
|
15
|
+
type: string;
|
|
16
|
+
text: string;
|
|
17
|
+
}>;
|
|
18
|
+
};
|
|
19
|
+
export declare function error(data: unknown): {
|
|
20
|
+
content: Array<{
|
|
21
|
+
type: string;
|
|
22
|
+
text: string;
|
|
23
|
+
}>;
|
|
24
|
+
isError: true;
|
|
25
|
+
};
|
|
26
|
+
export declare function extensionRequired(feature: string): {
|
|
27
|
+
content: Array<{
|
|
28
|
+
type: string;
|
|
29
|
+
text: string;
|
|
30
|
+
}>;
|
|
31
|
+
isError: true;
|
|
32
|
+
};
|
|
33
|
+
export declare function requireInt(args: Record<string, unknown>, key: string, min?: number, max?: number): number;
|
|
34
|
+
export declare function toFileUri(absPath: string): string;
|
|
35
|
+
export declare function truncateOutput(str: string, maxBytes: number): {
|
|
36
|
+
text: string;
|
|
37
|
+
truncated: boolean;
|
|
38
|
+
};
|
|
39
|
+
export interface ExecSafeResult {
|
|
40
|
+
stdout: string;
|
|
41
|
+
stderr: string;
|
|
42
|
+
exitCode: number;
|
|
43
|
+
timedOut: boolean;
|
|
44
|
+
durationMs: number;
|
|
45
|
+
}
|
|
46
|
+
export declare function execSafe(cmd: string, args: string[], opts?: {
|
|
47
|
+
cwd?: string;
|
|
48
|
+
timeout?: number;
|
|
49
|
+
maxBuffer?: number;
|
|
50
|
+
signal?: AbortSignal;
|
|
51
|
+
stdin?: string;
|
|
52
|
+
}): Promise<ExecSafeResult>;
|
|
53
|
+
export declare function makeRelative(absPath: string, workspace: string): string;
|
|
54
|
+
export declare function languageIdFromPath(filePath: string): string;
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
const execFileAsync = promisify(execFile);
|
|
6
|
+
export function requireString(args, key, maxLength = 4096) {
|
|
7
|
+
const value = args[key];
|
|
8
|
+
if (typeof value !== "string") {
|
|
9
|
+
throw new Error(`${key} must be a string`);
|
|
10
|
+
}
|
|
11
|
+
if (value.length > maxLength) {
|
|
12
|
+
throw new Error(`${key} exceeds maximum length of ${maxLength}`);
|
|
13
|
+
}
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
export function optionalString(args, key, maxLength = 4096) {
|
|
17
|
+
const value = args[key];
|
|
18
|
+
if (value === undefined || value === null)
|
|
19
|
+
return undefined;
|
|
20
|
+
if (typeof value !== "string") {
|
|
21
|
+
throw new Error(`${key} must be a string`);
|
|
22
|
+
}
|
|
23
|
+
if (value.length > maxLength) {
|
|
24
|
+
throw new Error(`${key} exceeds maximum length of ${maxLength}`);
|
|
25
|
+
}
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
export function optionalInt(args, key, min = 1, max = 10_000_000) {
|
|
29
|
+
const value = args[key];
|
|
30
|
+
if (value === undefined || value === null)
|
|
31
|
+
return undefined;
|
|
32
|
+
if (typeof value !== "number" ||
|
|
33
|
+
!Number.isInteger(value) ||
|
|
34
|
+
value < min ||
|
|
35
|
+
value > max) {
|
|
36
|
+
throw new Error(`${key} must be an integer between ${min} and ${max}`);
|
|
37
|
+
}
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
export function optionalBool(args, key) {
|
|
41
|
+
const value = args[key];
|
|
42
|
+
if (value === undefined || value === null)
|
|
43
|
+
return undefined;
|
|
44
|
+
if (typeof value !== "boolean") {
|
|
45
|
+
throw new Error(`${key} must be a boolean`);
|
|
46
|
+
}
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
/** Require args[key] to be a non-null object. Throws on failure. */
|
|
50
|
+
export function requireObject(args, key) {
|
|
51
|
+
const val = args[key];
|
|
52
|
+
if (val === null || typeof val !== "object" || Array.isArray(val)) {
|
|
53
|
+
throw new Error(`${key} must be an object`);
|
|
54
|
+
}
|
|
55
|
+
return val;
|
|
56
|
+
}
|
|
57
|
+
/** Require args[key] to be an array. Throws on failure. */
|
|
58
|
+
export function requireArray(args, key) {
|
|
59
|
+
const val = args[key];
|
|
60
|
+
if (!Array.isArray(val)) {
|
|
61
|
+
throw new Error(`${key} must be an array`);
|
|
62
|
+
}
|
|
63
|
+
return val;
|
|
64
|
+
}
|
|
65
|
+
/** Return args[key] if it is an array, undefined if absent, throw if wrong type. */
|
|
66
|
+
export function optionalArray(args, key) {
|
|
67
|
+
const val = args[key];
|
|
68
|
+
if (val === undefined)
|
|
69
|
+
return undefined;
|
|
70
|
+
if (!Array.isArray(val)) {
|
|
71
|
+
throw new Error(`${key} must be an array`);
|
|
72
|
+
}
|
|
73
|
+
return val;
|
|
74
|
+
}
|
|
75
|
+
// Cache for workspace realpath — workspace root never changes during a session
|
|
76
|
+
const realpathCache = new Map();
|
|
77
|
+
function cachedRealpathSync(p) {
|
|
78
|
+
let cached = realpathCache.get(p);
|
|
79
|
+
if (cached === undefined) {
|
|
80
|
+
cached = fs.realpathSync(p);
|
|
81
|
+
realpathCache.set(p, cached);
|
|
82
|
+
}
|
|
83
|
+
return cached;
|
|
84
|
+
}
|
|
85
|
+
export function resolveFilePath(filePath, workspace) {
|
|
86
|
+
if (typeof filePath !== "string") {
|
|
87
|
+
throw new Error("filePath must be a string");
|
|
88
|
+
}
|
|
89
|
+
if (filePath.includes("\x00")) {
|
|
90
|
+
throw new Error("filePath must not contain null bytes");
|
|
91
|
+
}
|
|
92
|
+
const resolved = path.isAbsolute(filePath)
|
|
93
|
+
? path.resolve(filePath)
|
|
94
|
+
: path.resolve(workspace, filePath);
|
|
95
|
+
const normalizedWorkspace = path.resolve(workspace);
|
|
96
|
+
if (resolved !== normalizedWorkspace &&
|
|
97
|
+
!resolved.startsWith(normalizedWorkspace + path.sep)) {
|
|
98
|
+
throw new Error(`Path "${filePath}" escapes workspace "${workspace}". All paths must be within the workspace.`);
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
const realWorkspace = cachedRealpathSync(normalizedWorkspace);
|
|
102
|
+
// For symlink resolution, try the file first, then its parent
|
|
103
|
+
let realTarget;
|
|
104
|
+
try {
|
|
105
|
+
realTarget = fs.realpathSync(resolved);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// File doesn't exist yet — resolve parent directory
|
|
109
|
+
const parentDir = path.dirname(resolved);
|
|
110
|
+
try {
|
|
111
|
+
realTarget = path.join(fs.realpathSync(parentDir), path.basename(resolved));
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Parent doesn't exist either — trust the path.resolve check above
|
|
115
|
+
return resolved;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (realTarget !== realWorkspace &&
|
|
119
|
+
!realTarget.startsWith(realWorkspace + path.sep)) {
|
|
120
|
+
throw new Error(`Path "${filePath}" escapes workspace via symlink`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
if (err instanceof Error && err.message.includes("escapes workspace"))
|
|
125
|
+
throw err;
|
|
126
|
+
// Deny by default when symlink resolution fails unexpectedly (ELOOP, EACCES, etc.)
|
|
127
|
+
// to prevent symlink-based workspace escape
|
|
128
|
+
throw new Error(`Cannot verify path "${filePath}" is within workspace: ${err instanceof Error ? err.message : String(err)}`);
|
|
129
|
+
}
|
|
130
|
+
return resolved;
|
|
131
|
+
}
|
|
132
|
+
export async function findLineNumber(filePath, text) {
|
|
133
|
+
try {
|
|
134
|
+
const content = await fs.promises.readFile(filePath, "utf-8");
|
|
135
|
+
const lines = content.split("\n");
|
|
136
|
+
for (let i = 0; i < lines.length; i++) {
|
|
137
|
+
if (lines[i]?.includes(text))
|
|
138
|
+
return i + 1;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// file not readable
|
|
143
|
+
}
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
export function success(data) {
|
|
147
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
148
|
+
}
|
|
149
|
+
export function error(data) {
|
|
150
|
+
return {
|
|
151
|
+
content: [{ type: "text", text: JSON.stringify(data) }],
|
|
152
|
+
isError: true,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
export function extensionRequired(feature) {
|
|
156
|
+
return error(`VS Code extension not connected — ${feature} requires the extension`);
|
|
157
|
+
}
|
|
158
|
+
export function requireInt(args, key, min = 1, max = 10_000_000) {
|
|
159
|
+
const value = args[key];
|
|
160
|
+
if (value === undefined ||
|
|
161
|
+
value === null ||
|
|
162
|
+
typeof value !== "number" ||
|
|
163
|
+
!Number.isInteger(value) ||
|
|
164
|
+
value < min ||
|
|
165
|
+
value > max) {
|
|
166
|
+
throw new Error(`${key} must be an integer between ${min} and ${max}`);
|
|
167
|
+
}
|
|
168
|
+
return value;
|
|
169
|
+
}
|
|
170
|
+
export function toFileUri(absPath) {
|
|
171
|
+
return new URL(`file://${absPath}`).href;
|
|
172
|
+
}
|
|
173
|
+
export function truncateOutput(str, maxBytes) {
|
|
174
|
+
const buf = Buffer.from(str, "utf-8");
|
|
175
|
+
if (buf.length <= maxBytes)
|
|
176
|
+
return { text: str, truncated: false };
|
|
177
|
+
// Walk back from the cut point to avoid splitting a multi-byte character.
|
|
178
|
+
// UTF-8 continuation bytes have the form 10xxxxxx (0x80–0xBF); skip them.
|
|
179
|
+
let end = maxBytes;
|
|
180
|
+
while (end > 0 && (buf[end] & 0xc0) === 0x80)
|
|
181
|
+
end--;
|
|
182
|
+
const sliced = buf.subarray(0, end).toString("utf-8");
|
|
183
|
+
return { text: sliced, truncated: true };
|
|
184
|
+
}
|
|
185
|
+
export async function execSafe(cmd, args, opts = {}) {
|
|
186
|
+
const timeout = opts.timeout ?? 30_000;
|
|
187
|
+
const maxBuffer = opts.maxBuffer ?? 512 * 1024;
|
|
188
|
+
const start = Date.now();
|
|
189
|
+
try {
|
|
190
|
+
const { stdout, stderr } = await execFileAsync(cmd, args, {
|
|
191
|
+
cwd: opts.cwd,
|
|
192
|
+
timeout,
|
|
193
|
+
maxBuffer,
|
|
194
|
+
signal: opts.signal,
|
|
195
|
+
...(opts.stdin !== undefined ? { input: opts.stdin } : {}),
|
|
196
|
+
});
|
|
197
|
+
return {
|
|
198
|
+
stdout,
|
|
199
|
+
stderr,
|
|
200
|
+
exitCode: 0,
|
|
201
|
+
timedOut: false,
|
|
202
|
+
durationMs: Date.now() - start,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
const durationMs = Date.now() - start;
|
|
207
|
+
const e = err;
|
|
208
|
+
const isMaxBuffer = e.code === "ERR_CHILD_PROCESS_STDIO_MAXBUFFER";
|
|
209
|
+
const timedOut = !isMaxBuffer &&
|
|
210
|
+
(e.code === "ABORT_ERR" ||
|
|
211
|
+
(e.killed === true && durationMs >= timeout * 0.9));
|
|
212
|
+
return {
|
|
213
|
+
stdout: e.stdout ?? "",
|
|
214
|
+
stderr: e.stderr ?? (err instanceof Error ? err.message : String(err)),
|
|
215
|
+
exitCode: e.status ?? 1,
|
|
216
|
+
timedOut,
|
|
217
|
+
durationMs,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const LANGUAGE_ID_MAP = {
|
|
222
|
+
".ts": "typescript",
|
|
223
|
+
".tsx": "typescriptreact",
|
|
224
|
+
".js": "javascript",
|
|
225
|
+
".jsx": "javascriptreact",
|
|
226
|
+
".py": "python",
|
|
227
|
+
".rs": "rust",
|
|
228
|
+
".go": "go",
|
|
229
|
+
".java": "java",
|
|
230
|
+
".c": "c",
|
|
231
|
+
".cpp": "cpp",
|
|
232
|
+
".h": "c",
|
|
233
|
+
".hpp": "cpp",
|
|
234
|
+
".cs": "csharp",
|
|
235
|
+
".rb": "ruby",
|
|
236
|
+
".php": "php",
|
|
237
|
+
".swift": "swift",
|
|
238
|
+
".kt": "kotlin",
|
|
239
|
+
".scala": "scala",
|
|
240
|
+
".lua": "lua",
|
|
241
|
+
".sh": "shellscript",
|
|
242
|
+
".bash": "shellscript",
|
|
243
|
+
".json": "json",
|
|
244
|
+
".yaml": "yaml",
|
|
245
|
+
".yml": "yaml",
|
|
246
|
+
".xml": "xml",
|
|
247
|
+
".html": "html",
|
|
248
|
+
".css": "css",
|
|
249
|
+
".scss": "scss",
|
|
250
|
+
".less": "less",
|
|
251
|
+
".md": "markdown",
|
|
252
|
+
".sql": "sql",
|
|
253
|
+
".graphql": "graphql",
|
|
254
|
+
".vue": "vue",
|
|
255
|
+
".svelte": "svelte",
|
|
256
|
+
".toml": "toml",
|
|
257
|
+
};
|
|
258
|
+
export function makeRelative(absPath, workspace) {
|
|
259
|
+
return absPath.startsWith(workspace + path.sep)
|
|
260
|
+
? absPath.slice(workspace.length + 1)
|
|
261
|
+
: absPath;
|
|
262
|
+
}
|
|
263
|
+
export function languageIdFromPath(filePath) {
|
|
264
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
265
|
+
return LANGUAGE_ID_MAP[ext] || "plaintext";
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Config } from "../config.js";
|
|
2
|
+
import { type ExtensionClient } from "../extensionClient.js";
|
|
3
|
+
export declare function createExecuteVSCodeCommandTool(extensionClient: ExtensionClient, config: Config): {
|
|
4
|
+
schema: {
|
|
5
|
+
name: string;
|
|
6
|
+
extensionRequired: boolean;
|
|
7
|
+
description: string;
|
|
8
|
+
inputSchema: {
|
|
9
|
+
$schema: string;
|
|
10
|
+
type: "object";
|
|
11
|
+
required: string[];
|
|
12
|
+
properties: {
|
|
13
|
+
command: {
|
|
14
|
+
type: "string";
|
|
15
|
+
description: string;
|
|
16
|
+
};
|
|
17
|
+
args: {
|
|
18
|
+
type: "array";
|
|
19
|
+
description: string;
|
|
20
|
+
items: {};
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
additionalProperties: false;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
handler(args: Record<string, unknown>): Promise<{
|
|
27
|
+
content: Array<{
|
|
28
|
+
type: string;
|
|
29
|
+
text: string;
|
|
30
|
+
}>;
|
|
31
|
+
}>;
|
|
32
|
+
};
|
|
33
|
+
export declare function createListVSCodeCommandsTool(extensionClient: ExtensionClient): {
|
|
34
|
+
schema: {
|
|
35
|
+
name: string;
|
|
36
|
+
extensionRequired: boolean;
|
|
37
|
+
description: string;
|
|
38
|
+
annotations: {
|
|
39
|
+
readOnlyHint: boolean;
|
|
40
|
+
};
|
|
41
|
+
inputSchema: {
|
|
42
|
+
$schema: string;
|
|
43
|
+
type: "object";
|
|
44
|
+
properties: {
|
|
45
|
+
filter: {
|
|
46
|
+
type: "string";
|
|
47
|
+
description: string;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
additionalProperties: false;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
handler(args: Record<string, unknown>): Promise<{
|
|
54
|
+
content: Array<{
|
|
55
|
+
type: string;
|
|
56
|
+
text: string;
|
|
57
|
+
}>;
|
|
58
|
+
}>;
|
|
59
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { ExtensionTimeoutError, } from "../extensionClient.js";
|
|
2
|
+
import { error, extensionRequired, success } from "./utils.js";
|
|
3
|
+
export function createExecuteVSCodeCommandTool(extensionClient, config) {
|
|
4
|
+
return {
|
|
5
|
+
schema: {
|
|
6
|
+
name: "executeVSCodeCommand",
|
|
7
|
+
extensionRequired: true,
|
|
8
|
+
description: "Execute any registered VS Code command by ID. " +
|
|
9
|
+
"Examples: 'editor.action.formatDocument', 'workbench.action.showAllSymbols', " +
|
|
10
|
+
"'testing.runAll'. Use listVSCodeCommands to discover available commands. " +
|
|
11
|
+
"If --vscode-allow-command flags are set, only those commands are permitted. " +
|
|
12
|
+
"Requires the VS Code extension.",
|
|
13
|
+
inputSchema: {
|
|
14
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
15
|
+
type: "object",
|
|
16
|
+
required: ["command"],
|
|
17
|
+
properties: {
|
|
18
|
+
command: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "VS Code command ID to execute",
|
|
21
|
+
},
|
|
22
|
+
args: {
|
|
23
|
+
type: "array",
|
|
24
|
+
description: "Optional arguments to pass to the command",
|
|
25
|
+
items: {},
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
additionalProperties: false,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
async handler(args) {
|
|
32
|
+
if (!extensionClient.isConnected()) {
|
|
33
|
+
return extensionRequired("executeVSCodeCommand");
|
|
34
|
+
}
|
|
35
|
+
const command = args.command;
|
|
36
|
+
if (typeof command !== "string" || command.length === 0) {
|
|
37
|
+
return error("command is required");
|
|
38
|
+
}
|
|
39
|
+
// Allowlist enforcement (bridge-side) — default-deny when no allowlist is configured.
|
|
40
|
+
// VS Code commands are a broad attack surface; require explicit opt-in for each command.
|
|
41
|
+
if (config.vscodeCommandAllowlist.length === 0) {
|
|
42
|
+
return error("executeVSCodeCommand requires an explicit allowlist. " +
|
|
43
|
+
"Use --vscode-allow-command <command-id> to permit specific commands. " +
|
|
44
|
+
"Run listVSCodeCommands to discover available command IDs.");
|
|
45
|
+
}
|
|
46
|
+
if (!config.vscodeCommandAllowlist.includes(command)) {
|
|
47
|
+
return error(`Command "${command}" is not in the vscodeCommandAllowlist. ` +
|
|
48
|
+
`Allowed: ${config.vscodeCommandAllowlist.join(", ")}. ` +
|
|
49
|
+
`Use --vscode-allow-command ${command} to add it.`);
|
|
50
|
+
}
|
|
51
|
+
const cmdArgs = Array.isArray(args.args) ? args.args : [];
|
|
52
|
+
try {
|
|
53
|
+
const result = await extensionClient.executeVSCodeCommand(command, cmdArgs);
|
|
54
|
+
if (result === null)
|
|
55
|
+
return error(`Command "${command}" returned null or failed`);
|
|
56
|
+
return success(result);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (err instanceof ExtensionTimeoutError) {
|
|
60
|
+
return error(`Extension timed out executing "${command}"`);
|
|
61
|
+
}
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function createListVSCodeCommandsTool(extensionClient) {
|
|
68
|
+
return {
|
|
69
|
+
schema: {
|
|
70
|
+
name: "listVSCodeCommands",
|
|
71
|
+
extensionRequired: true,
|
|
72
|
+
description: "List all registered VS Code commands. Optionally filter by substring. " +
|
|
73
|
+
"Returns up to 2000 commands. Use this to discover command IDs for executeVSCodeCommand. " +
|
|
74
|
+
"Requires the VS Code extension.",
|
|
75
|
+
annotations: { readOnlyHint: true },
|
|
76
|
+
inputSchema: {
|
|
77
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
78
|
+
type: "object",
|
|
79
|
+
properties: {
|
|
80
|
+
filter: {
|
|
81
|
+
type: "string",
|
|
82
|
+
description: "Optional substring filter on command IDs",
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
additionalProperties: false,
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
async handler(args) {
|
|
89
|
+
if (!extensionClient.isConnected()) {
|
|
90
|
+
return extensionRequired("listVSCodeCommands");
|
|
91
|
+
}
|
|
92
|
+
const filter = typeof args.filter === "string" ? args.filter : undefined;
|
|
93
|
+
try {
|
|
94
|
+
const result = await extensionClient.listVSCodeCommands(filter);
|
|
95
|
+
if (result === null)
|
|
96
|
+
return error("Failed to list VS Code commands");
|
|
97
|
+
return success(result);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
if (err instanceof ExtensionTimeoutError) {
|
|
101
|
+
return error("Extension timed out listing commands");
|
|
102
|
+
}
|
|
103
|
+
throw err;
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=vscodeCommands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vscodeCommands.js","sourceRoot":"","sources":["../../src/tools/vscodeCommands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ExtensionClient } from "../extensionClient.js";
|
|
2
|
+
import type { ToolHandler } from "../transport.js";
|
|
3
|
+
export declare function createWatchDiagnosticsTool(workspace: string, extensionClient: ExtensionClient): {
|
|
4
|
+
schema: {
|
|
5
|
+
name: string;
|
|
6
|
+
extensionRequired: boolean;
|
|
7
|
+
description: string;
|
|
8
|
+
annotations: {
|
|
9
|
+
readOnlyHint: boolean;
|
|
10
|
+
};
|
|
11
|
+
inputSchema: {
|
|
12
|
+
type: "object";
|
|
13
|
+
properties: {
|
|
14
|
+
filePath: {
|
|
15
|
+
type: "string";
|
|
16
|
+
description: string;
|
|
17
|
+
};
|
|
18
|
+
timeoutMs: {
|
|
19
|
+
type: "integer";
|
|
20
|
+
description: string;
|
|
21
|
+
};
|
|
22
|
+
sinceTimestamp: {
|
|
23
|
+
type: "integer";
|
|
24
|
+
description: string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
additionalProperties: false;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
timeoutMs: number;
|
|
31
|
+
handler: ToolHandler;
|
|
32
|
+
};
|