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,539 @@
|
|
|
1
|
+
import { ExtensionTimeoutError, } from "../extensionClient.js";
|
|
2
|
+
import { error, extensionRequired, optionalBool, optionalInt, optionalString, requireString, resolveFilePath, success, } from "./utils.js";
|
|
3
|
+
/** Environment variable names that could enable privilege escalation */
|
|
4
|
+
const DANGEROUS_ENV_VARS = new Set([
|
|
5
|
+
"PATH",
|
|
6
|
+
"LD_PRELOAD",
|
|
7
|
+
"LD_LIBRARY_PATH",
|
|
8
|
+
"DYLD_INSERT_LIBRARIES",
|
|
9
|
+
"DYLD_LIBRARY_PATH",
|
|
10
|
+
"DYLD_FRAMEWORK_PATH",
|
|
11
|
+
"NODE_OPTIONS",
|
|
12
|
+
"NODE_PATH",
|
|
13
|
+
"PYTHONSTARTUP",
|
|
14
|
+
"PYTHONPATH",
|
|
15
|
+
"PYTHONHOME",
|
|
16
|
+
"RUBYOPT",
|
|
17
|
+
"RUBYLIB",
|
|
18
|
+
"PERL5OPT",
|
|
19
|
+
"PERL5LIB",
|
|
20
|
+
"CLASSPATH",
|
|
21
|
+
"BASH_ENV",
|
|
22
|
+
"ENV",
|
|
23
|
+
"ZDOTDIR",
|
|
24
|
+
"EDITOR",
|
|
25
|
+
"VISUAL",
|
|
26
|
+
"SHELL",
|
|
27
|
+
"HOME",
|
|
28
|
+
"XDG_CONFIG_HOME",
|
|
29
|
+
"XDG_DATA_HOME",
|
|
30
|
+
"GIT_SSH_COMMAND",
|
|
31
|
+
"GIT_EXEC_PATH",
|
|
32
|
+
"NPM_CONFIG_SCRIPT_SHELL",
|
|
33
|
+
"CARGO_HOME",
|
|
34
|
+
]);
|
|
35
|
+
/** Apply prefix to a terminal name (no-op when prefix is empty).
|
|
36
|
+
* When prefix is set and name is undefined, generates a unique prefixed default name
|
|
37
|
+
* so the terminal remains discoverable by listTerminals for this session. */
|
|
38
|
+
function prefixName(name, prefix) {
|
|
39
|
+
if (!prefix)
|
|
40
|
+
return name;
|
|
41
|
+
if (name === undefined) {
|
|
42
|
+
// Generate a unique default so unnamed terminals are still session-scoped
|
|
43
|
+
return `${prefix}terminal-${Date.now().toString(36)}`;
|
|
44
|
+
}
|
|
45
|
+
return `${prefix}${name}`;
|
|
46
|
+
}
|
|
47
|
+
/** Strip prefix from a terminal name (no-op when prefix is empty). */
|
|
48
|
+
function stripPrefix(name, prefix) {
|
|
49
|
+
if (!prefix)
|
|
50
|
+
return name;
|
|
51
|
+
return name.startsWith(prefix) ? name.slice(prefix.length) : name;
|
|
52
|
+
}
|
|
53
|
+
/** In multi-session mode, index-based terminal lookup is unsafe because the
|
|
54
|
+
* global index does not correspond to the session-scoped index shown by listTerminals.
|
|
55
|
+
* Returns an error string when this case is detected, or null if the call is safe. */
|
|
56
|
+
function checkIndexWithPrefix(name, index, prefix) {
|
|
57
|
+
if (prefix && name === undefined && index !== undefined) {
|
|
58
|
+
return ("Terminal index-based lookup is not supported when multiple agent sessions are active. " +
|
|
59
|
+
"Use terminal name instead (from listTerminals). " +
|
|
60
|
+
"Index 0 in your session refers to a different global index than in VS Code.");
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
export function createListTerminalsTool(extensionClient, terminalPrefix = "") {
|
|
65
|
+
return {
|
|
66
|
+
schema: {
|
|
67
|
+
name: "listTerminals",
|
|
68
|
+
extensionRequired: true,
|
|
69
|
+
description: "List all active VS Code integrated terminals. Returns terminal names, indices, and whether output capture is available. Requires the VS Code extension.",
|
|
70
|
+
annotations: { readOnlyHint: true },
|
|
71
|
+
inputSchema: {
|
|
72
|
+
type: "object",
|
|
73
|
+
properties: {},
|
|
74
|
+
additionalProperties: false,
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
handler: async () => {
|
|
78
|
+
if (!extensionClient.isConnected()) {
|
|
79
|
+
return extensionRequired("terminal features");
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const result = await extensionClient.listTerminals();
|
|
83
|
+
if (result === null) {
|
|
84
|
+
return success({ terminals: [] });
|
|
85
|
+
}
|
|
86
|
+
if (!terminalPrefix) {
|
|
87
|
+
return success(result);
|
|
88
|
+
}
|
|
89
|
+
// Filter to this session's terminals and strip prefix from names
|
|
90
|
+
const r = result;
|
|
91
|
+
const filtered = {
|
|
92
|
+
...result,
|
|
93
|
+
terminals: (r.terminals ?? [])
|
|
94
|
+
.filter((t) => typeof t.name === "string" && t.name.startsWith(terminalPrefix))
|
|
95
|
+
.map((t) => ({
|
|
96
|
+
...t,
|
|
97
|
+
name: typeof t.name === "string" ? stripPrefix(t.name, terminalPrefix) : t.name,
|
|
98
|
+
})),
|
|
99
|
+
};
|
|
100
|
+
return success(filtered);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
if (err instanceof ExtensionTimeoutError) {
|
|
104
|
+
return error("Extension timed out — terminal features may be unavailable");
|
|
105
|
+
}
|
|
106
|
+
throw err;
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export function createGetTerminalOutputTool(extensionClient, terminalPrefix = "") {
|
|
112
|
+
return {
|
|
113
|
+
schema: {
|
|
114
|
+
name: "getTerminalOutput",
|
|
115
|
+
extensionRequired: true,
|
|
116
|
+
description: "Get recent output from a VS Code integrated terminal. Identify the terminal by name or index (from listTerminals). Returns the last N lines of output. Requires the VS Code extension with terminal output capture enabled.",
|
|
117
|
+
annotations: { readOnlyHint: true },
|
|
118
|
+
inputSchema: {
|
|
119
|
+
type: "object",
|
|
120
|
+
properties: {
|
|
121
|
+
name: {
|
|
122
|
+
type: "string",
|
|
123
|
+
description: "Terminal name to retrieve output from",
|
|
124
|
+
},
|
|
125
|
+
index: {
|
|
126
|
+
type: "integer",
|
|
127
|
+
description: "Terminal index (0-based) from listTerminals",
|
|
128
|
+
},
|
|
129
|
+
lines: {
|
|
130
|
+
type: "integer",
|
|
131
|
+
description: "Number of recent lines to retrieve (default 100, max 5000)",
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
additionalProperties: false,
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
handler: async (args) => {
|
|
138
|
+
if (!extensionClient.isConnected()) {
|
|
139
|
+
return extensionRequired("terminal output");
|
|
140
|
+
}
|
|
141
|
+
const name = optionalString(args, "name", 256);
|
|
142
|
+
const index = optionalInt(args, "index", 0, 100);
|
|
143
|
+
const lines = optionalInt(args, "lines", 1, 5000);
|
|
144
|
+
if (name === undefined && index === undefined) {
|
|
145
|
+
return error("At least one of 'name' or 'index' must be provided to identify the terminal");
|
|
146
|
+
}
|
|
147
|
+
const indexErr = checkIndexWithPrefix(name, index, terminalPrefix);
|
|
148
|
+
if (indexErr)
|
|
149
|
+
return error(indexErr);
|
|
150
|
+
try {
|
|
151
|
+
const result = await extensionClient.getTerminalOutput(prefixName(name, terminalPrefix), index, lines);
|
|
152
|
+
if (result === null) {
|
|
153
|
+
return error("Terminal not found");
|
|
154
|
+
}
|
|
155
|
+
return success(result);
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
if (err instanceof ExtensionTimeoutError) {
|
|
159
|
+
return error("Extension timed out — terminal features may be unavailable");
|
|
160
|
+
}
|
|
161
|
+
throw err;
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export function createCreateTerminalTool(workspace, extensionClient, terminalPrefix = "") {
|
|
167
|
+
return {
|
|
168
|
+
schema: {
|
|
169
|
+
name: "createTerminal",
|
|
170
|
+
extensionRequired: true,
|
|
171
|
+
description: "Create a new VS Code integrated terminal. Optionally set a name, working directory, environment variables, and shell. Requires the VS Code extension.",
|
|
172
|
+
inputSchema: {
|
|
173
|
+
type: "object",
|
|
174
|
+
properties: {
|
|
175
|
+
name: {
|
|
176
|
+
type: "string",
|
|
177
|
+
description: "Display name for the terminal",
|
|
178
|
+
},
|
|
179
|
+
cwd: {
|
|
180
|
+
type: "string",
|
|
181
|
+
description: "Working directory for the terminal (must be within workspace)",
|
|
182
|
+
},
|
|
183
|
+
env: {
|
|
184
|
+
type: "object",
|
|
185
|
+
description: "Additional environment variables (key-value pairs, max 50 entries)",
|
|
186
|
+
additionalProperties: { type: "string" },
|
|
187
|
+
},
|
|
188
|
+
show: {
|
|
189
|
+
type: "boolean",
|
|
190
|
+
description: "Show the terminal panel after creation (default: true)",
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
additionalProperties: false,
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
handler: async (args) => {
|
|
197
|
+
if (!extensionClient.isConnected()) {
|
|
198
|
+
return extensionRequired("createTerminal");
|
|
199
|
+
}
|
|
200
|
+
const name = optionalString(args, "name", 256);
|
|
201
|
+
const rawCwd = optionalString(args, "cwd");
|
|
202
|
+
const resolvedCwd = rawCwd
|
|
203
|
+
? resolveFilePath(rawCwd, workspace)
|
|
204
|
+
: undefined;
|
|
205
|
+
const rawEnv = args.env;
|
|
206
|
+
let env;
|
|
207
|
+
if (rawEnv !== undefined) {
|
|
208
|
+
if (typeof rawEnv !== "object" ||
|
|
209
|
+
rawEnv === null ||
|
|
210
|
+
Array.isArray(rawEnv)) {
|
|
211
|
+
return error("'env' must be an object with string key-value pairs");
|
|
212
|
+
}
|
|
213
|
+
const keys = Object.keys(rawEnv);
|
|
214
|
+
if (keys.length > 50) {
|
|
215
|
+
return error("'env' must have at most 50 entries");
|
|
216
|
+
}
|
|
217
|
+
env = {};
|
|
218
|
+
for (const [k, v] of Object.entries(rawEnv)) {
|
|
219
|
+
if (typeof v !== "string") {
|
|
220
|
+
return error(`env["${k}"] must be a string`);
|
|
221
|
+
}
|
|
222
|
+
if (DANGEROUS_ENV_VARS.has(k.toUpperCase())) {
|
|
223
|
+
return error(`Environment variable "${k}" is blocked for security — it can redirect command execution`);
|
|
224
|
+
}
|
|
225
|
+
env[k] = v;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const show = optionalBool(args, "show") ?? true;
|
|
229
|
+
try {
|
|
230
|
+
const result = await extensionClient.createTerminal(prefixName(name, terminalPrefix), resolvedCwd, env, show);
|
|
231
|
+
if (result === null) {
|
|
232
|
+
return error("Failed to create terminal");
|
|
233
|
+
}
|
|
234
|
+
// Strip prefix from returned name so the agent sees its logical name
|
|
235
|
+
const resultWithName = result;
|
|
236
|
+
const stripped = terminalPrefix && resultWithName.name
|
|
237
|
+
? { ...result, name: stripPrefix(resultWithName.name, terminalPrefix) }
|
|
238
|
+
: result;
|
|
239
|
+
return success(stripped);
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
if (err instanceof ExtensionTimeoutError) {
|
|
243
|
+
return error("Extension timed out — terminal features may be unavailable");
|
|
244
|
+
}
|
|
245
|
+
throw err;
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
export function createWaitForTerminalOutputTool(extensionClient, terminalPrefix = "") {
|
|
251
|
+
return {
|
|
252
|
+
schema: {
|
|
253
|
+
name: "waitForTerminalOutput",
|
|
254
|
+
extensionRequired: true,
|
|
255
|
+
description: "Block until a regex pattern appears in a VS Code terminal's output, then return the matching line. " +
|
|
256
|
+
"Use this after sendTerminalCommand to detect when a background process is ready " +
|
|
257
|
+
"(e.g. wait for 'ready|listening|compiled' after starting a dev server). " +
|
|
258
|
+
"Requires terminal output capture (VS Code proposed API). " +
|
|
259
|
+
"Returns {matched, matchedLine, elapsed} on success or {matched: false, timedOut: true} on timeout.",
|
|
260
|
+
annotations: { readOnlyHint: true },
|
|
261
|
+
inputSchema: {
|
|
262
|
+
type: "object",
|
|
263
|
+
required: ["pattern"],
|
|
264
|
+
properties: {
|
|
265
|
+
pattern: {
|
|
266
|
+
type: "string",
|
|
267
|
+
description: "JavaScript regex pattern to match against terminal output lines",
|
|
268
|
+
},
|
|
269
|
+
name: {
|
|
270
|
+
type: "string",
|
|
271
|
+
description: "Terminal name to watch (from listTerminals). Uses active terminal if omitted.",
|
|
272
|
+
},
|
|
273
|
+
index: {
|
|
274
|
+
type: "integer",
|
|
275
|
+
description: "Terminal index (0-based) from listTerminals. Used if name is not specified.",
|
|
276
|
+
},
|
|
277
|
+
timeout: {
|
|
278
|
+
type: "integer",
|
|
279
|
+
description: "Seconds to wait before giving up (default: 30, max: 300)",
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
additionalProperties: false,
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
timeoutMs: 300_000,
|
|
286
|
+
handler: async (args) => {
|
|
287
|
+
if (!extensionClient.isConnected()) {
|
|
288
|
+
return extensionRequired("waitForTerminalOutput");
|
|
289
|
+
}
|
|
290
|
+
const pattern = requireString(args, "pattern", 1_000);
|
|
291
|
+
const name = optionalString(args, "name", 256);
|
|
292
|
+
const index = optionalInt(args, "index", 0, 100);
|
|
293
|
+
const timeoutSec = optionalInt(args, "timeout", 1, 300) ?? 30;
|
|
294
|
+
const timeoutMs = timeoutSec * 1_000;
|
|
295
|
+
const indexErr = checkIndexWithPrefix(name, index, terminalPrefix);
|
|
296
|
+
if (indexErr)
|
|
297
|
+
return error(indexErr);
|
|
298
|
+
// Validate the regex on the bridge side to give a fast, clear error
|
|
299
|
+
try {
|
|
300
|
+
new RegExp(pattern);
|
|
301
|
+
}
|
|
302
|
+
catch (e) {
|
|
303
|
+
return error(`Invalid regex pattern: ${e instanceof Error ? e.message : String(e)}`);
|
|
304
|
+
}
|
|
305
|
+
// Reject patterns with nested quantifiers — these can cause catastrophic backtracking (ReDoS)
|
|
306
|
+
// when tested repeatedly against terminal output lines over a long polling window.
|
|
307
|
+
if (/\([^)]*[+*]\)[+*?]/.test(pattern) ||
|
|
308
|
+
/\([^)]*\{[^}]+\}\)[+*{?]/.test(pattern) ||
|
|
309
|
+
/[+*][+*]|\{[^}]+\}[+*]/.test(pattern)) {
|
|
310
|
+
return error("Pattern contains nested quantifiers (e.g. (a+)+) which can cause catastrophic backtracking. " +
|
|
311
|
+
"Simplify the regex — use a literal string match or a non-nested quantifier.");
|
|
312
|
+
}
|
|
313
|
+
try {
|
|
314
|
+
const result = await extensionClient.waitForTerminalOutput(pattern, prefixName(name, terminalPrefix), index, timeoutMs);
|
|
315
|
+
if (result === null) {
|
|
316
|
+
return error("Extension did not respond — ensure the VS Code extension is running");
|
|
317
|
+
}
|
|
318
|
+
return success(result);
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
if (err instanceof ExtensionTimeoutError) {
|
|
322
|
+
return error("Extension connection timed out waiting for terminal output");
|
|
323
|
+
}
|
|
324
|
+
throw err;
|
|
325
|
+
}
|
|
326
|
+
},
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
export function createRunInTerminalTool(extensionClient, commandAllowlist, terminalPrefix = "") {
|
|
330
|
+
return {
|
|
331
|
+
schema: {
|
|
332
|
+
name: "runInTerminal",
|
|
333
|
+
extensionRequired: true,
|
|
334
|
+
description: "Execute a command in a VS Code integrated terminal and wait for it to complete. " +
|
|
335
|
+
"Returns the exit code and full output — unlike sendTerminalCommand (fire-and-forget), " +
|
|
336
|
+
"this is synchronous. Unlike runCommand, execution is visible in the VS Code terminal panel. " +
|
|
337
|
+
"Requires VS Code 1.93+ with Shell Integration enabled (bash, zsh, fish, or PowerShell). " +
|
|
338
|
+
"Use listTerminals to pick a terminal; if none specified, uses the active terminal.",
|
|
339
|
+
inputSchema: {
|
|
340
|
+
type: "object",
|
|
341
|
+
required: ["command"],
|
|
342
|
+
properties: {
|
|
343
|
+
command: {
|
|
344
|
+
type: "string",
|
|
345
|
+
description: "The shell command to execute (no shell metacharacters or newlines)",
|
|
346
|
+
},
|
|
347
|
+
name: {
|
|
348
|
+
type: "string",
|
|
349
|
+
description: "Terminal name to run in (from listTerminals). Uses active terminal if omitted.",
|
|
350
|
+
},
|
|
351
|
+
index: {
|
|
352
|
+
type: "integer",
|
|
353
|
+
description: "Terminal index (0-based) from listTerminals. Used if name is not specified.",
|
|
354
|
+
},
|
|
355
|
+
timeout: {
|
|
356
|
+
type: "integer",
|
|
357
|
+
description: "Seconds to wait for command completion (default: 30, max: 300)",
|
|
358
|
+
},
|
|
359
|
+
show: {
|
|
360
|
+
type: "boolean",
|
|
361
|
+
description: "Focus the terminal panel while running (default: true)",
|
|
362
|
+
},
|
|
363
|
+
},
|
|
364
|
+
additionalProperties: false,
|
|
365
|
+
},
|
|
366
|
+
},
|
|
367
|
+
timeoutMs: 300_000,
|
|
368
|
+
handler: async (args) => {
|
|
369
|
+
if (!extensionClient.isConnected()) {
|
|
370
|
+
return extensionRequired("runInTerminal");
|
|
371
|
+
}
|
|
372
|
+
const command = requireString(args, "command", 10_000);
|
|
373
|
+
const name = optionalString(args, "name", 256);
|
|
374
|
+
const index = optionalInt(args, "index", 0, 100);
|
|
375
|
+
const timeoutSec = optionalInt(args, "timeout", 1, 300) ?? 30;
|
|
376
|
+
const show = optionalBool(args, "show") ?? true;
|
|
377
|
+
const timeoutMs = timeoutSec * 1_000;
|
|
378
|
+
const indexErr = checkIndexWithPrefix(name, index, terminalPrefix);
|
|
379
|
+
if (indexErr)
|
|
380
|
+
return error(indexErr);
|
|
381
|
+
if (/[\n\r]/.test(command)) {
|
|
382
|
+
return error("Command must not contain newlines. Send one command at a time.");
|
|
383
|
+
}
|
|
384
|
+
if (/[;&|`$()<>{}!\\~]/.test(command)) {
|
|
385
|
+
return error("Command must not contain shell metacharacters (;&|`$()<>{}!\\~). " +
|
|
386
|
+
"These could chain additional commands beyond the allowlist.");
|
|
387
|
+
}
|
|
388
|
+
const firstWord = command.trim().split(/\s+/)[0];
|
|
389
|
+
if (firstWord && !commandAllowlist.includes(firstWord)) {
|
|
390
|
+
return error(`Command "${firstWord}" is not in the allowlist. ` +
|
|
391
|
+
`Allowed commands: ${commandAllowlist.join(", ")}. ` +
|
|
392
|
+
`Use --allow-command ${firstWord} to add it.`);
|
|
393
|
+
}
|
|
394
|
+
try {
|
|
395
|
+
const result = await extensionClient.executeInTerminal(command, prefixName(name, terminalPrefix), index, timeoutMs, show);
|
|
396
|
+
if (result === null) {
|
|
397
|
+
return error("Extension did not respond — ensure the VS Code extension is running");
|
|
398
|
+
}
|
|
399
|
+
return success(result);
|
|
400
|
+
}
|
|
401
|
+
catch (err) {
|
|
402
|
+
if (err instanceof ExtensionTimeoutError) {
|
|
403
|
+
return error("Extension connection timed out waiting for the command to complete");
|
|
404
|
+
}
|
|
405
|
+
throw err;
|
|
406
|
+
}
|
|
407
|
+
},
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
export function createDisposeTerminalTool(extensionClient, terminalPrefix = "") {
|
|
411
|
+
return {
|
|
412
|
+
schema: {
|
|
413
|
+
name: "disposeTerminal",
|
|
414
|
+
extensionRequired: true,
|
|
415
|
+
description: "Close and dispose a VS Code integrated terminal. Identify the terminal by name or index (from listTerminals). Requires the VS Code extension.",
|
|
416
|
+
annotations: { destructiveHint: true },
|
|
417
|
+
inputSchema: {
|
|
418
|
+
type: "object",
|
|
419
|
+
properties: {
|
|
420
|
+
name: {
|
|
421
|
+
type: "string",
|
|
422
|
+
description: "Terminal name to dispose",
|
|
423
|
+
},
|
|
424
|
+
index: {
|
|
425
|
+
type: "integer",
|
|
426
|
+
description: "Terminal index (0-based) from listTerminals",
|
|
427
|
+
},
|
|
428
|
+
},
|
|
429
|
+
additionalProperties: false,
|
|
430
|
+
},
|
|
431
|
+
},
|
|
432
|
+
handler: async (args) => {
|
|
433
|
+
if (!extensionClient.isConnected()) {
|
|
434
|
+
return extensionRequired("disposeTerminal");
|
|
435
|
+
}
|
|
436
|
+
const name = optionalString(args, "name", 256);
|
|
437
|
+
const index = optionalInt(args, "index", 0, 100);
|
|
438
|
+
if (name === undefined && index === undefined) {
|
|
439
|
+
return error("At least one of 'name' or 'index' must be provided to identify the terminal");
|
|
440
|
+
}
|
|
441
|
+
const indexErr = checkIndexWithPrefix(name, index, terminalPrefix);
|
|
442
|
+
if (indexErr)
|
|
443
|
+
return error(indexErr);
|
|
444
|
+
try {
|
|
445
|
+
const result = await extensionClient.disposeTerminal(prefixName(name, terminalPrefix), index);
|
|
446
|
+
if (result === null) {
|
|
447
|
+
return error("Terminal not found");
|
|
448
|
+
}
|
|
449
|
+
return success(result);
|
|
450
|
+
}
|
|
451
|
+
catch (err) {
|
|
452
|
+
if (err instanceof ExtensionTimeoutError) {
|
|
453
|
+
return error("Extension timed out — terminal features may be unavailable");
|
|
454
|
+
}
|
|
455
|
+
throw err;
|
|
456
|
+
}
|
|
457
|
+
},
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
export function createSendTerminalCommandTool(extensionClient, commandAllowlist, terminalPrefix = "") {
|
|
461
|
+
return {
|
|
462
|
+
schema: {
|
|
463
|
+
name: "sendTerminalCommand",
|
|
464
|
+
extensionRequired: true,
|
|
465
|
+
description: "Send text or a command to a VS Code integrated terminal. " +
|
|
466
|
+
"Identify the terminal by name or index (from listTerminals). " +
|
|
467
|
+
"Note: sendText is fire-and-forget — use getTerminalOutput afterward to check results. " +
|
|
468
|
+
"Requires the VS Code extension.",
|
|
469
|
+
inputSchema: {
|
|
470
|
+
type: "object",
|
|
471
|
+
required: ["text"],
|
|
472
|
+
properties: {
|
|
473
|
+
text: {
|
|
474
|
+
type: "string",
|
|
475
|
+
description: "Text or command to send to the terminal",
|
|
476
|
+
},
|
|
477
|
+
name: {
|
|
478
|
+
type: "string",
|
|
479
|
+
description: "Terminal name to send to",
|
|
480
|
+
},
|
|
481
|
+
index: {
|
|
482
|
+
type: "integer",
|
|
483
|
+
description: "Terminal index (0-based) from listTerminals",
|
|
484
|
+
},
|
|
485
|
+
addNewline: {
|
|
486
|
+
type: "boolean",
|
|
487
|
+
description: "Append newline to execute as command (default: true)",
|
|
488
|
+
},
|
|
489
|
+
},
|
|
490
|
+
additionalProperties: false,
|
|
491
|
+
},
|
|
492
|
+
},
|
|
493
|
+
handler: async (args) => {
|
|
494
|
+
if (!extensionClient.isConnected()) {
|
|
495
|
+
return extensionRequired("sendTerminalCommand");
|
|
496
|
+
}
|
|
497
|
+
const text = requireString(args, "text", 10_000);
|
|
498
|
+
const name = optionalString(args, "name", 256);
|
|
499
|
+
const index = optionalInt(args, "index", 0, 100);
|
|
500
|
+
const addNewline = optionalBool(args, "addNewline") ?? true;
|
|
501
|
+
if (name === undefined && index === undefined) {
|
|
502
|
+
return error("At least one of 'name' or 'index' must be provided to identify the terminal");
|
|
503
|
+
}
|
|
504
|
+
const indexErr = checkIndexWithPrefix(name, index, terminalPrefix);
|
|
505
|
+
if (indexErr)
|
|
506
|
+
return error(indexErr);
|
|
507
|
+
// Block newlines — they would split into multiple independent commands in the terminal
|
|
508
|
+
if (/[\n\r]/.test(text)) {
|
|
509
|
+
return error("Terminal command must not contain newlines. Send one command at a time.");
|
|
510
|
+
}
|
|
511
|
+
// Block shell metacharacters — terminal runs in a shell, so these bypass the allowlist
|
|
512
|
+
if (/[;&|`$()<>{}!\\~]/.test(text)) {
|
|
513
|
+
return error("Terminal command must not contain shell metacharacters (;&|`$()<>{}!\\~). " +
|
|
514
|
+
"Use runCommand for safer execution without a shell.");
|
|
515
|
+
}
|
|
516
|
+
// Validate the first word of the command against the allowlist
|
|
517
|
+
const firstWord = text.trim().split(/\s+/)[0];
|
|
518
|
+
if (firstWord && !commandAllowlist.includes(firstWord)) {
|
|
519
|
+
return error(`Command "${firstWord}" is not in the allowlist. ` +
|
|
520
|
+
`Allowed commands: ${commandAllowlist.join(", ")}. ` +
|
|
521
|
+
`Use --allow-command ${firstWord} to add it.`);
|
|
522
|
+
}
|
|
523
|
+
try {
|
|
524
|
+
const result = await extensionClient.sendTerminalCommand(text, prefixName(name, terminalPrefix), index, addNewline);
|
|
525
|
+
if (result === null) {
|
|
526
|
+
return error("Failed to send command to terminal");
|
|
527
|
+
}
|
|
528
|
+
return success(result);
|
|
529
|
+
}
|
|
530
|
+
catch (err) {
|
|
531
|
+
if (err instanceof ExtensionTimeoutError) {
|
|
532
|
+
return error("Extension timed out — terminal features may be unavailable");
|
|
533
|
+
}
|
|
534
|
+
throw err;
|
|
535
|
+
}
|
|
536
|
+
},
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/tools/terminal.ts"],"names":[],"mappings":"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"}
|