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.
Files changed (273) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +263 -0
  3. package/dist/activityLog.d.ts +26 -0
  4. package/dist/activityLog.js +76 -0
  5. package/dist/activityLog.js.map +1 -0
  6. package/dist/bridge.d.ts +19 -0
  7. package/dist/bridge.js +277 -0
  8. package/dist/bridge.js.map +1 -0
  9. package/dist/config.d.ts +22 -0
  10. package/dist/config.js +221 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/errors.d.ts +16 -0
  13. package/dist/errors.js +20 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/extensionClient.d.ts +193 -0
  16. package/dist/extensionClient.js +698 -0
  17. package/dist/extensionClient.js.map +1 -0
  18. package/dist/fileLock.d.ts +12 -0
  19. package/dist/fileLock.js +30 -0
  20. package/dist/fileLock.js.map +1 -0
  21. package/dist/index.d.ts +2 -0
  22. package/dist/index.js +38 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/lockfile.d.ts +12 -0
  25. package/dist/lockfile.js +127 -0
  26. package/dist/lockfile.js.map +1 -0
  27. package/dist/logger.d.ts +16 -0
  28. package/dist/logger.js +68 -0
  29. package/dist/logger.js.map +1 -0
  30. package/dist/probe.d.ts +22 -0
  31. package/dist/probe.js +45 -0
  32. package/dist/probe.js.map +1 -0
  33. package/dist/server.d.ts +25 -0
  34. package/dist/server.js +265 -0
  35. package/dist/server.js.map +1 -0
  36. package/dist/tools/activityLog.d.ts +39 -0
  37. package/dist/tools/activityLog.js +49 -0
  38. package/dist/tools/activityLog.js.map +1 -0
  39. package/dist/tools/aiComments.d.ts +26 -0
  40. package/dist/tools/aiComments.js +196 -0
  41. package/dist/tools/aiComments.js.map +1 -0
  42. package/dist/tools/bridgeStatus.d.ts +21 -0
  43. package/dist/tools/bridgeStatus.js +41 -0
  44. package/dist/tools/bridgeStatus.js.map +1 -0
  45. package/dist/tools/checkDocumentDirty.d.ts +28 -0
  46. package/dist/tools/checkDocumentDirty.js +61 -0
  47. package/dist/tools/checkDocumentDirty.js.map +1 -0
  48. package/dist/tools/clipboard.d.ts +50 -0
  49. package/dist/tools/clipboard.js +82 -0
  50. package/dist/tools/clipboard.js.map +1 -0
  51. package/dist/tools/closeTabs.d.ts +49 -0
  52. package/dist/tools/closeTabs.js +77 -0
  53. package/dist/tools/closeTabs.js.map +1 -0
  54. package/dist/tools/debug.d.ts +154 -0
  55. package/dist/tools/debug.js +248 -0
  56. package/dist/tools/debug.js.map +1 -0
  57. package/dist/tools/decorations.d.ts +92 -0
  58. package/dist/tools/decorations.js +150 -0
  59. package/dist/tools/decorations.js.map +1 -0
  60. package/dist/tools/diffDebugger.d.ts +62 -0
  61. package/dist/tools/diffDebugger.js +245 -0
  62. package/dist/tools/diffDebugger.js.map +1 -0
  63. package/dist/tools/editText.d.ts +80 -0
  64. package/dist/tools/editText.js +274 -0
  65. package/dist/tools/editText.js.map +1 -0
  66. package/dist/tools/fileOperations.d.ts +111 -0
  67. package/dist/tools/fileOperations.js +280 -0
  68. package/dist/tools/fileOperations.js.map +1 -0
  69. package/dist/tools/fileWatcher.d.ts +54 -0
  70. package/dist/tools/fileWatcher.js +100 -0
  71. package/dist/tools/fileWatcher.js.map +1 -0
  72. package/dist/tools/findFiles.d.ts +31 -0
  73. package/dist/tools/findFiles.js +119 -0
  74. package/dist/tools/findFiles.js.map +1 -0
  75. package/dist/tools/fixAllLintErrors.d.ts +29 -0
  76. package/dist/tools/fixAllLintErrors.js +114 -0
  77. package/dist/tools/fixAllLintErrors.js.map +1 -0
  78. package/dist/tools/flowGuardian.d.ts +61 -0
  79. package/dist/tools/flowGuardian.js +311 -0
  80. package/dist/tools/flowGuardian.js.map +1 -0
  81. package/dist/tools/formatDocument.d.ts +30 -0
  82. package/dist/tools/formatDocument.js +132 -0
  83. package/dist/tools/formatDocument.js.map +1 -0
  84. package/dist/tools/formatFile.d.ts +28 -0
  85. package/dist/tools/formatFile.js +110 -0
  86. package/dist/tools/formatFile.js.map +1 -0
  87. package/dist/tools/getBufferContent.d.ts +38 -0
  88. package/dist/tools/getBufferContent.js +100 -0
  89. package/dist/tools/getBufferContent.js.map +1 -0
  90. package/dist/tools/getCurrentSelection.d.ts +43 -0
  91. package/dist/tools/getCurrentSelection.js +75 -0
  92. package/dist/tools/getCurrentSelection.js.map +1 -0
  93. package/dist/tools/getDiagnostics.d.ts +38 -0
  94. package/dist/tools/getDiagnostics.js +204 -0
  95. package/dist/tools/getDiagnostics.js.map +1 -0
  96. package/dist/tools/getDocumentSymbols.d.ts +27 -0
  97. package/dist/tools/getDocumentSymbols.js +133 -0
  98. package/dist/tools/getDocumentSymbols.js.map +1 -0
  99. package/dist/tools/getFileTree.d.ts +36 -0
  100. package/dist/tools/getFileTree.js +111 -0
  101. package/dist/tools/getFileTree.js.map +1 -0
  102. package/dist/tools/getGitDiff.d.ts +34 -0
  103. package/dist/tools/getGitDiff.js +57 -0
  104. package/dist/tools/getGitDiff.js.map +1 -0
  105. package/dist/tools/getGitLog.d.ts +30 -0
  106. package/dist/tools/getGitLog.js +65 -0
  107. package/dist/tools/getGitLog.js.map +1 -0
  108. package/dist/tools/getGitStatus.d.ts +26 -0
  109. package/dist/tools/getGitStatus.js +95 -0
  110. package/dist/tools/getGitStatus.js.map +1 -0
  111. package/dist/tools/getOpenEditors.d.ts +21 -0
  112. package/dist/tools/getOpenEditors.js +84 -0
  113. package/dist/tools/getOpenEditors.js.map +1 -0
  114. package/dist/tools/getProjectInfo.d.ts +20 -0
  115. package/dist/tools/getProjectInfo.js +315 -0
  116. package/dist/tools/getProjectInfo.js.map +1 -0
  117. package/dist/tools/getToolCapabilities.d.ts +23 -0
  118. package/dist/tools/getToolCapabilities.js +249 -0
  119. package/dist/tools/getToolCapabilities.js.map +1 -0
  120. package/dist/tools/getWorkspaceFolders.d.ts +21 -0
  121. package/dist/tools/getWorkspaceFolders.js +47 -0
  122. package/dist/tools/getWorkspaceFolders.js.map +1 -0
  123. package/dist/tools/gitHistory.d.ts +78 -0
  124. package/dist/tools/gitHistory.js +151 -0
  125. package/dist/tools/gitHistory.js.map +1 -0
  126. package/dist/tools/gitWrite.d.ts +335 -0
  127. package/dist/tools/gitWrite.js +859 -0
  128. package/dist/tools/gitWrite.js.map +1 -0
  129. package/dist/tools/github/actions.d.ts +67 -0
  130. package/dist/tools/github/actions.js +155 -0
  131. package/dist/tools/github/actions.js.map +1 -0
  132. package/dist/tools/github/index.d.ts +4 -0
  133. package/dist/tools/github/index.js +5 -0
  134. package/dist/tools/github/index.js.map +1 -0
  135. package/dist/tools/github/issues.d.ts +140 -0
  136. package/dist/tools/github/issues.js +279 -0
  137. package/dist/tools/github/issues.js.map +1 -0
  138. package/dist/tools/github/pr.d.ts +101 -0
  139. package/dist/tools/github/pr.js +215 -0
  140. package/dist/tools/github/pr.js.map +1 -0
  141. package/dist/tools/github/review.d.ts +101 -0
  142. package/dist/tools/github/review.js +292 -0
  143. package/dist/tools/github/review.js.map +1 -0
  144. package/dist/tools/github/shared.d.ts +4 -0
  145. package/dist/tools/github/shared.js +12 -0
  146. package/dist/tools/github/shared.js.map +1 -0
  147. package/dist/tools/github.d.ts +308 -0
  148. package/dist/tools/github.js +656 -0
  149. package/dist/tools/github.js.map +1 -0
  150. package/dist/tools/hoverAtCursor.d.ts +22 -0
  151. package/dist/tools/hoverAtCursor.js +51 -0
  152. package/dist/tools/hoverAtCursor.js.map +1 -0
  153. package/dist/tools/httpClient.d.ts +83 -0
  154. package/dist/tools/httpClient.js +335 -0
  155. package/dist/tools/httpClient.js.map +1 -0
  156. package/dist/tools/index.d.ts +7 -0
  157. package/dist/tools/index.js +246 -0
  158. package/dist/tools/index.js.map +1 -0
  159. package/dist/tools/inlayHints.d.ts +38 -0
  160. package/dist/tools/inlayHints.js +56 -0
  161. package/dist/tools/inlayHints.js.map +1 -0
  162. package/dist/tools/linters/biome.d.ts +2 -0
  163. package/dist/tools/linters/biome.js +44 -0
  164. package/dist/tools/linters/biome.js.map +1 -0
  165. package/dist/tools/linters/cargo.d.ts +2 -0
  166. package/dist/tools/linters/cargo.js +45 -0
  167. package/dist/tools/linters/cargo.js.map +1 -0
  168. package/dist/tools/linters/eslint.d.ts +2 -0
  169. package/dist/tools/linters/eslint.js +59 -0
  170. package/dist/tools/linters/eslint.js.map +1 -0
  171. package/dist/tools/linters/govet.d.ts +2 -0
  172. package/dist/tools/linters/govet.js +37 -0
  173. package/dist/tools/linters/govet.js.map +1 -0
  174. package/dist/tools/linters/pyright.d.ts +2 -0
  175. package/dist/tools/linters/pyright.js +34 -0
  176. package/dist/tools/linters/pyright.js.map +1 -0
  177. package/dist/tools/linters/ruff.d.ts +2 -0
  178. package/dist/tools/linters/ruff.js +30 -0
  179. package/dist/tools/linters/ruff.js.map +1 -0
  180. package/dist/tools/linters/types.d.ts +16 -0
  181. package/dist/tools/linters/types.js +2 -0
  182. package/dist/tools/linters/types.js.map +1 -0
  183. package/dist/tools/linters/typescript.d.ts +2 -0
  184. package/dist/tools/linters/typescript.js +38 -0
  185. package/dist/tools/linters/typescript.js.map +1 -0
  186. package/dist/tools/lsp.d.ts +310 -0
  187. package/dist/tools/lsp.js +684 -0
  188. package/dist/tools/lsp.js.map +1 -0
  189. package/dist/tools/notebook.d.ts +95 -0
  190. package/dist/tools/notebook.js +144 -0
  191. package/dist/tools/notebook.js.map +1 -0
  192. package/dist/tools/openDiff.d.ts +41 -0
  193. package/dist/tools/openDiff.js +116 -0
  194. package/dist/tools/openDiff.js.map +1 -0
  195. package/dist/tools/openFile.d.ts +34 -0
  196. package/dist/tools/openFile.js +102 -0
  197. package/dist/tools/openFile.js.map +1 -0
  198. package/dist/tools/organizeImports.d.ts +29 -0
  199. package/dist/tools/organizeImports.js +64 -0
  200. package/dist/tools/organizeImports.js.map +1 -0
  201. package/dist/tools/planPersistence.d.ts +196 -0
  202. package/dist/tools/planPersistence.js +437 -0
  203. package/dist/tools/planPersistence.js.map +1 -0
  204. package/dist/tools/replaceBlock.d.ts +40 -0
  205. package/dist/tools/replaceBlock.js +105 -0
  206. package/dist/tools/replaceBlock.js.map +1 -0
  207. package/dist/tools/runCommand.d.ts +43 -0
  208. package/dist/tools/runCommand.js +141 -0
  209. package/dist/tools/runCommand.js.map +1 -0
  210. package/dist/tools/runTests.d.ts +32 -0
  211. package/dist/tools/runTests.js +160 -0
  212. package/dist/tools/runTests.js.map +1 -0
  213. package/dist/tools/saveDocument.d.ts +28 -0
  214. package/dist/tools/saveDocument.js +58 -0
  215. package/dist/tools/saveDocument.js.map +1 -0
  216. package/dist/tools/searchAndReplace.d.ts +50 -0
  217. package/dist/tools/searchAndReplace.js +203 -0
  218. package/dist/tools/searchAndReplace.js.map +1 -0
  219. package/dist/tools/searchWorkspace.d.ts +52 -0
  220. package/dist/tools/searchWorkspace.js +159 -0
  221. package/dist/tools/searchWorkspace.js.map +1 -0
  222. package/dist/tools/setActiveWorkspaceFolder.d.ts +28 -0
  223. package/dist/tools/setActiveWorkspaceFolder.js +32 -0
  224. package/dist/tools/setActiveWorkspaceFolder.js.map +1 -0
  225. package/dist/tools/tasks.d.ts +56 -0
  226. package/dist/tools/tasks.js +89 -0
  227. package/dist/tools/tasks.js.map +1 -0
  228. package/dist/tools/terminal.d.ts +241 -0
  229. package/dist/tools/terminal.js +539 -0
  230. package/dist/tools/terminal.js.map +1 -0
  231. package/dist/tools/testRunners/cargoTest.d.ts +2 -0
  232. package/dist/tools/testRunners/cargoTest.js +123 -0
  233. package/dist/tools/testRunners/cargoTest.js.map +1 -0
  234. package/dist/tools/testRunners/goTest.d.ts +2 -0
  235. package/dist/tools/testRunners/goTest.js +106 -0
  236. package/dist/tools/testRunners/goTest.js.map +1 -0
  237. package/dist/tools/testRunners/pytest.d.ts +2 -0
  238. package/dist/tools/testRunners/pytest.js +133 -0
  239. package/dist/tools/testRunners/pytest.js.map +1 -0
  240. package/dist/tools/testRunners/types.d.ts +18 -0
  241. package/dist/tools/testRunners/types.js +2 -0
  242. package/dist/tools/testRunners/types.js.map +1 -0
  243. package/dist/tools/testRunners/vitestJest.d.ts +3 -0
  244. package/dist/tools/testRunners/vitestJest.js +178 -0
  245. package/dist/tools/testRunners/vitestJest.js.map +1 -0
  246. package/dist/tools/typeHierarchy.d.ts +45 -0
  247. package/dist/tools/typeHierarchy.js +65 -0
  248. package/dist/tools/typeHierarchy.js.map +1 -0
  249. package/dist/tools/utils.d.ts +54 -0
  250. package/dist/tools/utils.js +267 -0
  251. package/dist/tools/utils.js.map +1 -0
  252. package/dist/tools/vscodeCommands.d.ts +59 -0
  253. package/dist/tools/vscodeCommands.js +108 -0
  254. package/dist/tools/vscodeCommands.js.map +1 -0
  255. package/dist/tools/watchDiagnostics.d.ts +32 -0
  256. package/dist/tools/watchDiagnostics.js +87 -0
  257. package/dist/tools/watchDiagnostics.js.map +1 -0
  258. package/dist/tools/workspaceSettings.d.ts +67 -0
  259. package/dist/tools/workspaceSettings.js +102 -0
  260. package/dist/tools/workspaceSettings.js.map +1 -0
  261. package/dist/tools/workspaceSnapshots.d.ts +174 -0
  262. package/dist/tools/workspaceSnapshots.js +474 -0
  263. package/dist/tools/workspaceSnapshots.js.map +1 -0
  264. package/dist/transport.d.ts +57 -0
  265. package/dist/transport.js +417 -0
  266. package/dist/transport.js.map +1 -0
  267. package/dist/version.d.ts +2 -0
  268. package/dist/version.js +3 -0
  269. package/dist/version.js.map +1 -0
  270. package/dist/wsUtils.d.ts +9 -0
  271. package/dist/wsUtils.js +54 -0
  272. package/dist/wsUtils.js.map +1 -0
  273. package/package.json +69 -0
@@ -0,0 +1,111 @@
1
+ import { type ExtensionClient } from "../extensionClient.js";
2
+ export declare function createCreateFileTool(workspace: string, extensionClient: ExtensionClient): {
3
+ schema: {
4
+ name: string;
5
+ description: string;
6
+ annotations: {
7
+ destructiveHint: boolean;
8
+ };
9
+ inputSchema: {
10
+ type: "object";
11
+ required: string[];
12
+ properties: {
13
+ filePath: {
14
+ type: "string";
15
+ description: string;
16
+ };
17
+ content: {
18
+ type: "string";
19
+ description: string;
20
+ };
21
+ isDirectory: {
22
+ type: "boolean";
23
+ description: string;
24
+ };
25
+ overwrite: {
26
+ type: "boolean";
27
+ description: string;
28
+ };
29
+ openAfterCreate: {
30
+ type: "boolean";
31
+ description: string;
32
+ };
33
+ };
34
+ additionalProperties: false;
35
+ };
36
+ };
37
+ handler: (args: Record<string, unknown>, signal?: AbortSignal) => Promise<{
38
+ content: Array<{
39
+ type: string;
40
+ text: string;
41
+ }>;
42
+ }>;
43
+ };
44
+ export declare function createDeleteFileTool(workspace: string, extensionClient: ExtensionClient): {
45
+ schema: {
46
+ name: string;
47
+ description: string;
48
+ annotations: {
49
+ destructiveHint: boolean;
50
+ };
51
+ inputSchema: {
52
+ type: "object";
53
+ required: string[];
54
+ properties: {
55
+ filePath: {
56
+ type: "string";
57
+ description: string;
58
+ };
59
+ recursive: {
60
+ type: "boolean";
61
+ description: string;
62
+ };
63
+ useTrash: {
64
+ type: "boolean";
65
+ description: string;
66
+ };
67
+ };
68
+ additionalProperties: false;
69
+ };
70
+ };
71
+ handler: (args: Record<string, unknown>, signal?: AbortSignal) => Promise<{
72
+ content: Array<{
73
+ type: string;
74
+ text: string;
75
+ }>;
76
+ }>;
77
+ };
78
+ export declare function createRenameFileTool(workspace: string, extensionClient: ExtensionClient): {
79
+ schema: {
80
+ name: string;
81
+ description: string;
82
+ annotations: {
83
+ destructiveHint: boolean;
84
+ };
85
+ inputSchema: {
86
+ type: "object";
87
+ required: string[];
88
+ properties: {
89
+ oldPath: {
90
+ type: "string";
91
+ description: string;
92
+ };
93
+ newPath: {
94
+ type: "string";
95
+ description: string;
96
+ };
97
+ overwrite: {
98
+ type: "boolean";
99
+ description: string;
100
+ };
101
+ };
102
+ additionalProperties: false;
103
+ };
104
+ };
105
+ handler: (args: Record<string, unknown>, signal?: AbortSignal) => Promise<{
106
+ content: Array<{
107
+ type: string;
108
+ text: string;
109
+ }>;
110
+ }>;
111
+ };
@@ -0,0 +1,280 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { ExtensionTimeoutError, } from "../extensionClient.js";
4
+ import { error, optionalBool, optionalString, requireString, resolveFilePath, success, } from "./utils.js";
5
+ export function createCreateFileTool(workspace, extensionClient) {
6
+ return {
7
+ schema: {
8
+ name: "createFile",
9
+ description: "Create a new file or directory in the workspace. Uses VS Code when connected, falls back to native fs otherwise (openAfterCreate ignored in fallback mode).",
10
+ annotations: { destructiveHint: true },
11
+ inputSchema: {
12
+ type: "object",
13
+ required: ["filePath"],
14
+ properties: {
15
+ filePath: {
16
+ type: "string",
17
+ description: "Absolute or workspace-relative path for the new file or directory",
18
+ },
19
+ content: {
20
+ type: "string",
21
+ description: "Initial file content (default: empty)",
22
+ },
23
+ isDirectory: {
24
+ type: "boolean",
25
+ description: "Create a directory instead of a file (default: false)",
26
+ },
27
+ overwrite: {
28
+ type: "boolean",
29
+ description: "Overwrite if file already exists (default: false)",
30
+ },
31
+ openAfterCreate: {
32
+ type: "boolean",
33
+ description: "Open the file in editor after creation (default: true)",
34
+ },
35
+ },
36
+ additionalProperties: false,
37
+ },
38
+ },
39
+ handler: async (args, signal) => {
40
+ const rawPath = requireString(args, "filePath");
41
+ const content = optionalString(args, "content", 1_048_576) ?? "";
42
+ const isDirectory = optionalBool(args, "isDirectory") ?? false;
43
+ const overwrite = optionalBool(args, "overwrite") ?? false;
44
+ const openAfterCreate = optionalBool(args, "openAfterCreate") ?? true;
45
+ const filePath = resolveFilePath(rawPath, workspace);
46
+ // Try extension first (can also open the file in editor)
47
+ if (extensionClient.isConnected()) {
48
+ try {
49
+ const result = await extensionClient.createFile(filePath, content, isDirectory, overwrite, openAfterCreate);
50
+ if (result !== null) {
51
+ return success(result);
52
+ }
53
+ }
54
+ catch (err) {
55
+ if (!(err instanceof ExtensionTimeoutError))
56
+ throw err;
57
+ // Timeout — fall through to native fs fallback
58
+ }
59
+ }
60
+ // Bail out before touching the filesystem if the call was already cancelled
61
+ if (signal?.aborted)
62
+ throw new Error("Request aborted");
63
+ // Native fs fallback
64
+ try {
65
+ if (isDirectory) {
66
+ await fs.promises.mkdir(filePath, { recursive: true });
67
+ }
68
+ else {
69
+ // Ensure parent directory exists
70
+ await fs.promises.mkdir(path.dirname(filePath), { recursive: true });
71
+ if (!overwrite) {
72
+ // Atomic exclusive-create: fails with EEXIST if file already exists (no TOCTOU race)
73
+ try {
74
+ await fs.promises.writeFile(filePath, content, {
75
+ encoding: "utf-8",
76
+ flag: "wx",
77
+ signal,
78
+ });
79
+ }
80
+ catch (err) {
81
+ if (err instanceof Error &&
82
+ err.code === "EEXIST") {
83
+ return error(`File already exists: ${filePath} (set overwrite: true to replace)`);
84
+ }
85
+ throw err;
86
+ }
87
+ }
88
+ else {
89
+ await fs.promises.writeFile(filePath, content, {
90
+ encoding: "utf-8",
91
+ signal,
92
+ });
93
+ }
94
+ }
95
+ return success({
96
+ created: true,
97
+ filePath,
98
+ isDirectory,
99
+ source: extensionClient.isConnected()
100
+ ? "native-fs (extension timed out)"
101
+ : "native-fs",
102
+ });
103
+ }
104
+ catch (err) {
105
+ return error(`Failed to create ${isDirectory ? "directory" : "file"}: ${err instanceof Error ? err.message : String(err)}`);
106
+ }
107
+ },
108
+ };
109
+ }
110
+ export function createDeleteFileTool(workspace, extensionClient) {
111
+ return {
112
+ schema: {
113
+ name: "deleteFile",
114
+ description: "Delete a file or directory in the workspace. Uses VS Code when connected (supports trash), falls back to native fs for permanent deletion.",
115
+ annotations: { destructiveHint: true },
116
+ inputSchema: {
117
+ type: "object",
118
+ required: ["filePath"],
119
+ properties: {
120
+ filePath: {
121
+ type: "string",
122
+ description: "Absolute or workspace-relative path to delete",
123
+ },
124
+ recursive: {
125
+ type: "boolean",
126
+ description: "Delete directory contents recursively (default: false)",
127
+ },
128
+ useTrash: {
129
+ type: "boolean",
130
+ description: "Move to trash instead of permanent delete (default: true)",
131
+ },
132
+ },
133
+ additionalProperties: false,
134
+ },
135
+ },
136
+ handler: async (args, signal) => {
137
+ const rawPath = requireString(args, "filePath");
138
+ const recursive = optionalBool(args, "recursive") ?? false;
139
+ const useTrash = optionalBool(args, "useTrash") ?? true;
140
+ const filePath = resolveFilePath(rawPath, workspace);
141
+ // Try extension first (supports trash)
142
+ if (extensionClient.isConnected()) {
143
+ try {
144
+ const result = await extensionClient.deleteFile(filePath, recursive, useTrash);
145
+ if (result !== null) {
146
+ return success(result);
147
+ }
148
+ }
149
+ catch (err) {
150
+ if (!(err instanceof ExtensionTimeoutError))
151
+ throw err;
152
+ // Timeout — fall through to native fs fallback
153
+ }
154
+ }
155
+ if (signal?.aborted)
156
+ throw new Error("Request aborted");
157
+ // Native fs fallback (no trash support — permanent delete only)
158
+ try {
159
+ const stat = await fs.promises.stat(filePath);
160
+ if (stat.isDirectory() && !recursive) {
161
+ return error("Cannot delete directory without recursive: true");
162
+ }
163
+ if (useTrash) {
164
+ // Cannot move to trash without the extension — warn the user
165
+ return error("VS Code extension not connected — native fallback cannot move to trash. " +
166
+ "Set useTrash: false for permanent deletion, or reconnect the extension.");
167
+ }
168
+ await fs.promises.rm(filePath, { recursive, force: false });
169
+ return success({
170
+ deleted: true,
171
+ filePath,
172
+ source: extensionClient.isConnected()
173
+ ? "native-fs (extension timed out)"
174
+ : "native-fs",
175
+ warning: "Permanently deleted (not moved to trash)",
176
+ });
177
+ }
178
+ catch (err) {
179
+ return error(`Failed to delete: ${err instanceof Error ? err.message : String(err)}`);
180
+ }
181
+ },
182
+ };
183
+ }
184
+ export function createRenameFileTool(workspace, extensionClient) {
185
+ return {
186
+ schema: {
187
+ name: "renameFile",
188
+ description: "Rename or move a file or directory within the workspace. Uses VS Code when connected, falls back to native fs otherwise.",
189
+ annotations: { destructiveHint: true },
190
+ inputSchema: {
191
+ type: "object",
192
+ required: ["oldPath", "newPath"],
193
+ properties: {
194
+ oldPath: {
195
+ type: "string",
196
+ description: "Current absolute or workspace-relative path",
197
+ },
198
+ newPath: {
199
+ type: "string",
200
+ description: "New absolute or workspace-relative path",
201
+ },
202
+ overwrite: {
203
+ type: "boolean",
204
+ description: "Overwrite if target already exists (default: false)",
205
+ },
206
+ },
207
+ additionalProperties: false,
208
+ },
209
+ },
210
+ handler: async (args, signal) => {
211
+ const rawOld = requireString(args, "oldPath");
212
+ const rawNew = requireString(args, "newPath");
213
+ const overwrite = optionalBool(args, "overwrite") ?? false;
214
+ const oldPath = resolveFilePath(rawOld, workspace);
215
+ const newPath = resolveFilePath(rawNew, workspace);
216
+ // Try extension first
217
+ if (extensionClient.isConnected()) {
218
+ try {
219
+ const result = await extensionClient.renameFile(oldPath, newPath, overwrite);
220
+ if (result !== null) {
221
+ return success(result);
222
+ }
223
+ }
224
+ catch (err) {
225
+ if (!(err instanceof ExtensionTimeoutError))
226
+ throw err;
227
+ // Timeout — fall through to native fs fallback
228
+ }
229
+ }
230
+ if (signal?.aborted)
231
+ throw new Error("Request aborted");
232
+ // Native fs fallback
233
+ try {
234
+ // Ensure target parent directory exists before any move attempt
235
+ await fs.promises.mkdir(path.dirname(newPath), { recursive: true });
236
+ if (!overwrite) {
237
+ // Use link(2) + unlink(2) for an atomic "move only if dest does not exist"
238
+ // when both paths are on the same filesystem. link(2) fails with EEXIST
239
+ // atomically, eliminating the TOCTOU window of a separate access() check.
240
+ try {
241
+ await fs.promises.link(oldPath, newPath);
242
+ await fs.promises.unlink(oldPath);
243
+ }
244
+ catch (linkErr) {
245
+ const code = linkErr.code;
246
+ if (code === "EEXIST") {
247
+ return error(`Target already exists: ${newPath} (set overwrite: true to replace)`);
248
+ }
249
+ // Cross-device link not permitted — fall back to best-effort check + rename
250
+ if (code !== "EXDEV")
251
+ throw linkErr;
252
+ try {
253
+ await fs.promises.access(newPath);
254
+ return error(`Target already exists: ${newPath} (set overwrite: true to replace)`);
255
+ }
256
+ catch {
257
+ // Target doesn't exist — proceed (best-effort on cross-device moves)
258
+ }
259
+ await fs.promises.rename(oldPath, newPath);
260
+ }
261
+ }
262
+ else {
263
+ await fs.promises.rename(oldPath, newPath);
264
+ }
265
+ return success({
266
+ renamed: true,
267
+ oldPath,
268
+ newPath,
269
+ source: extensionClient.isConnected()
270
+ ? "native-fs (extension timed out)"
271
+ : "native-fs",
272
+ });
273
+ }
274
+ catch (err) {
275
+ return error(`Failed to rename: ${err instanceof Error ? err.message : String(err)}`);
276
+ }
277
+ },
278
+ };
279
+ }
280
+ //# sourceMappingURL=fileOperations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileOperations.js","sourceRoot":"","sources":["../../src/tools/fileOperations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { type ExtensionClient } from "../extensionClient.js";
2
+ export declare function createWatchFilesTool(extensionClient: ExtensionClient): {
3
+ schema: {
4
+ name: string;
5
+ description: string;
6
+ annotations: {
7
+ readOnlyHint: boolean;
8
+ };
9
+ inputSchema: {
10
+ type: "object";
11
+ properties: {
12
+ id: {
13
+ type: "string";
14
+ description: string;
15
+ };
16
+ pattern: {
17
+ type: "string";
18
+ description: string;
19
+ };
20
+ };
21
+ required: string[];
22
+ additionalProperties: false;
23
+ };
24
+ };
25
+ handler: (args: Record<string, unknown>) => Promise<{
26
+ content: Array<{
27
+ type: string;
28
+ text: string;
29
+ }>;
30
+ }>;
31
+ };
32
+ export declare function createUnwatchFilesTool(extensionClient: ExtensionClient): {
33
+ schema: {
34
+ name: string;
35
+ description: string;
36
+ inputSchema: {
37
+ type: "object";
38
+ properties: {
39
+ id: {
40
+ type: "string";
41
+ description: string;
42
+ };
43
+ };
44
+ required: string[];
45
+ additionalProperties: false;
46
+ };
47
+ };
48
+ handler: (args: Record<string, unknown>) => Promise<{
49
+ content: Array<{
50
+ type: string;
51
+ text: string;
52
+ }>;
53
+ }>;
54
+ };
@@ -0,0 +1,100 @@
1
+ import { ExtensionTimeoutError, } from "../extensionClient.js";
2
+ import { error, requireString, success } from "./utils.js";
3
+ export function createWatchFilesTool(extensionClient) {
4
+ return {
5
+ schema: {
6
+ name: "watchFiles",
7
+ description: "Watch files matching a glob pattern for changes (created, modified, deleted). Notifications are pushed when matching files change. Use unwatchFiles to stop watching. Requires the VS Code extension.",
8
+ annotations: { readOnlyHint: true },
9
+ inputSchema: {
10
+ type: "object",
11
+ properties: {
12
+ id: {
13
+ type: "string",
14
+ description: "Unique ID for this watcher (used to unwatch later)",
15
+ },
16
+ pattern: {
17
+ type: "string",
18
+ description: "Glob pattern to watch (e.g., '**/*.ts', 'src/**/*.{js,jsx}')",
19
+ },
20
+ },
21
+ required: ["id", "pattern"],
22
+ additionalProperties: false,
23
+ },
24
+ },
25
+ handler: async (args) => {
26
+ if (!extensionClient.isConnected()) {
27
+ return success({
28
+ available: false,
29
+ error: "VS Code extension not connected — file watching requires the extension",
30
+ });
31
+ }
32
+ const id = requireString(args, "id", 100);
33
+ const pattern = requireString(args, "pattern", 500);
34
+ if (/[\x00-\x1f]/.test(id) || /[\x00-\x1f]/.test(pattern)) {
35
+ return error("id and pattern must not contain control characters");
36
+ }
37
+ // Reject patterns that could escape the workspace
38
+ if (pattern.startsWith("/") ||
39
+ pattern.startsWith("\\") ||
40
+ pattern.includes("..")) {
41
+ return error("pattern must be relative to the workspace (no absolute paths or '..')");
42
+ }
43
+ try {
44
+ const result = await extensionClient.watchFiles(id, pattern);
45
+ if (result === null) {
46
+ return error("Failed to register file watcher");
47
+ }
48
+ return success(result);
49
+ }
50
+ catch (err) {
51
+ if (err instanceof ExtensionTimeoutError) {
52
+ return error("Extension timed out — file watching may be unavailable");
53
+ }
54
+ throw err;
55
+ }
56
+ },
57
+ };
58
+ }
59
+ export function createUnwatchFilesTool(extensionClient) {
60
+ return {
61
+ schema: {
62
+ name: "unwatchFiles",
63
+ description: "Stop watching files for a previously registered watcher by ID.",
64
+ inputSchema: {
65
+ type: "object",
66
+ properties: {
67
+ id: {
68
+ type: "string",
69
+ description: "ID of the watcher to remove",
70
+ },
71
+ },
72
+ required: ["id"],
73
+ additionalProperties: false,
74
+ },
75
+ },
76
+ handler: async (args) => {
77
+ if (!extensionClient.isConnected()) {
78
+ return success({
79
+ available: false,
80
+ error: "VS Code extension not connected — file watching requires the extension",
81
+ });
82
+ }
83
+ const id = requireString(args, "id", 100);
84
+ try {
85
+ const result = await extensionClient.unwatchFiles(id);
86
+ if (result === null) {
87
+ return error("Failed to unregister file watcher");
88
+ }
89
+ return success(result);
90
+ }
91
+ catch (err) {
92
+ if (err instanceof ExtensionTimeoutError) {
93
+ return error("Extension timed out — file watching may be unavailable");
94
+ }
95
+ throw err;
96
+ }
97
+ },
98
+ };
99
+ }
100
+ //# sourceMappingURL=fileWatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileWatcher.js","sourceRoot":"","sources":["../../src/tools/fileWatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ProbeResults } from "../probe.js";
2
+ export declare function createFindFilesTool(workspace: string, probes: ProbeResults): {
3
+ schema: {
4
+ name: string;
5
+ description: string;
6
+ annotations: {
7
+ readOnlyHint: boolean;
8
+ };
9
+ inputSchema: {
10
+ type: "object";
11
+ properties: {
12
+ pattern: {
13
+ type: string;
14
+ description: string;
15
+ };
16
+ directory: {
17
+ type: string;
18
+ description: string;
19
+ };
20
+ };
21
+ required: string[];
22
+ additionalProperties: false;
23
+ };
24
+ };
25
+ handler: (args: Record<string, unknown>, signal?: AbortSignal) => Promise<{
26
+ content: Array<{
27
+ type: string;
28
+ text: string;
29
+ }>;
30
+ }>;
31
+ };