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
package/dist/bridge.js ADDED
@@ -0,0 +1,277 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { WebSocket } from "ws";
3
+ import { ActivityLog } from "./activityLog.js";
4
+ import { ExtensionClient } from "./extensionClient.js";
5
+ import { FileLock } from "./fileLock.js";
6
+ import { LockFileManager } from "./lockfile.js";
7
+ import { Logger } from "./logger.js";
8
+ import { probeAll } from "./probe.js";
9
+ import { Server } from "./server.js";
10
+ import { registerAllTools } from "./tools/index.js";
11
+ import { cleanupTempDirs } from "./tools/openDiff.js";
12
+ import { McpTransport } from "./transport.js";
13
+ const SHUTDOWN_TIMEOUT_MS = 5000;
14
+ const CLAUDE_RECONNECT_GRACE_MS = 30_000;
15
+ const MAX_SESSIONS = 5;
16
+ let globalHandlersRegistered = false;
17
+ export class Bridge {
18
+ config;
19
+ logger;
20
+ lockFile;
21
+ server;
22
+ extensionClient;
23
+ activityLog;
24
+ authToken;
25
+ sessions = new Map();
26
+ fileLock = new FileLock();
27
+ probes = null;
28
+ stopped = false;
29
+ listChangedTimer = null;
30
+ constructor(config) {
31
+ this.config = config;
32
+ this.logger = new Logger(config.verbose, config.jsonl);
33
+ this.lockFile = new LockFileManager(this.logger);
34
+ this.authToken = randomUUID();
35
+ this.server = new Server(this.authToken, this.logger);
36
+ this.activityLog = new ActivityLog();
37
+ this.extensionClient = new ExtensionClient(this.logger);
38
+ // Handle new Claude Code connections
39
+ this.server.on("connection", (ws) => {
40
+ // Reject connections beyond capacity
41
+ if (this.sessions.size >= MAX_SESSIONS) {
42
+ this.logger.warn(`Session capacity reached (${MAX_SESSIONS}). Rejecting connection.`);
43
+ ws.close(1013, "Bridge at capacity");
44
+ return;
45
+ }
46
+ const sessionId = randomUUID();
47
+ const transport = new McpTransport(this.logger);
48
+ transport.setActivityLog(this.activityLog);
49
+ transport.setExtensionConnectedFn(() => this.extensionClient.isConnected());
50
+ const session = {
51
+ id: sessionId,
52
+ ws,
53
+ transport,
54
+ openedFiles: new Set(),
55
+ terminalPrefix: `s${sessionId.slice(0, 8)}-`,
56
+ graceTimer: null,
57
+ connectedAt: Date.now(),
58
+ };
59
+ // Register tools for this session using probes stored at start() time
60
+ if (this.probes) {
61
+ registerAllTools(transport, this.config, session.openedFiles, this.probes, this.extensionClient, this.activityLog, session.terminalPrefix, this.fileLock, this.sessions);
62
+ }
63
+ transport.attach(ws);
64
+ this.sessions.set(sessionId, session);
65
+ this.logger.event("claude_connected", {
66
+ sessionId,
67
+ activeSessions: this.sessions.size,
68
+ });
69
+ // Only notify on the first active session — subsequent agents don't need to re-signal
70
+ if (this.sessions.size === 1) {
71
+ this.extensionClient.notifyClaudeConnectionState(true);
72
+ }
73
+ ws.on("close", () => {
74
+ this.logger.info(`Claude Code disconnected (session ${sessionId.slice(0, 8)})`);
75
+ this.logger.event("claude_disconnected", { sessionId });
76
+ const s = this.sessions.get(sessionId);
77
+ if (s && !s.graceTimer) {
78
+ s.graceTimer = setTimeout(() => {
79
+ this.cleanupSession(sessionId);
80
+ }, CLAUDE_RECONNECT_GRACE_MS);
81
+ this.logger.info(`Grace period started for session ${sessionId.slice(0, 8)} (${CLAUDE_RECONNECT_GRACE_MS / 1000}s)`);
82
+ }
83
+ });
84
+ ws.on("error", (err) => {
85
+ this.logger.error(`WebSocket error (session ${sessionId.slice(0, 8)}): ${err.message}`);
86
+ const s = this.sessions.get(sessionId);
87
+ if (s && !s.graceTimer) {
88
+ s.graceTimer = setTimeout(() => {
89
+ this.cleanupSession(sessionId);
90
+ }, CLAUDE_RECONNECT_GRACE_MS);
91
+ }
92
+ });
93
+ });
94
+ // Debounced tools/list_changed notification — max one per 2 seconds
95
+ const sendListChanged = () => {
96
+ if (this.listChangedTimer)
97
+ return; // Already scheduled
98
+ this.listChangedTimer = setTimeout(() => {
99
+ this.listChangedTimer = null;
100
+ for (const session of this.sessions.values()) {
101
+ if (session.ws.readyState === WebSocket.OPEN) {
102
+ McpTransport.sendNotification(session.ws, "notifications/tools/list_changed", undefined, this.logger);
103
+ }
104
+ }
105
+ }, 2000);
106
+ };
107
+ // Handle VS Code extension connections — notify Claude immediately (no debounce)
108
+ // so it re-queries capabilities and discovers LSP/terminal/selection are now available.
109
+ this.server.on("extension", (ws) => {
110
+ this.logger.info("VS Code extension connected");
111
+ this.logger.event("extension_connected");
112
+ this.extensionClient.handleExtensionConnection(ws);
113
+ // Refresh workspace folders from extension (multi-root workspace support)
114
+ this.extensionClient
115
+ .getWorkspaceFolders()
116
+ .then((folders) => {
117
+ if (folders && folders.length > 0) {
118
+ this.config.workspaceFolders = folders.map((f) => f.path);
119
+ this.logger.info(`Workspace folders: ${this.config.workspaceFolders.join(", ")}`);
120
+ // Broadcast to all active sessions
121
+ for (const session of this.sessions.values()) {
122
+ if (session.ws.readyState === WebSocket.OPEN) {
123
+ McpTransport.sendNotification(session.ws, "notifications/tools/list_changed", undefined, this.logger);
124
+ }
125
+ }
126
+ }
127
+ })
128
+ .catch((err) => {
129
+ this.logger.warn(`getWorkspaceFolders failed: ${err instanceof Error ? err.message : String(err)}`);
130
+ });
131
+ // Immediate list_changed to all active sessions
132
+ for (const session of this.sessions.values()) {
133
+ if (session.ws.readyState === WebSocket.OPEN) {
134
+ McpTransport.sendNotification(session.ws, "notifications/tools/list_changed", undefined, this.logger);
135
+ }
136
+ }
137
+ });
138
+ // Notify Claude when extension disconnects so it knows to fall back to CLI/grep mode
139
+ this.extensionClient.onExtensionDisconnected = () => {
140
+ this.logger.event("extension_disconnected_notify");
141
+ sendListChanged();
142
+ };
143
+ // Forward diagnostics changes from extension to Claude Code
144
+ this.extensionClient.onDiagnosticsChanged = (_file) => {
145
+ this.logger.event("diagnostics_changed", { file: _file });
146
+ sendListChanged();
147
+ };
148
+ // Forward AI comment changes from extension to Claude Code
149
+ this.extensionClient.onAICommentsChanged = (_comments) => {
150
+ this.logger.event("ai_comments_changed", { count: _comments.length });
151
+ sendListChanged();
152
+ };
153
+ // Forward file change notifications from extension to Claude Code
154
+ this.extensionClient.onFileChanged = (id, type, file) => {
155
+ this.logger.event("file_changed", { id, type, file });
156
+ sendListChanged();
157
+ };
158
+ // Forward debug session changes from extension to Claude Code
159
+ this.extensionClient.onDebugSessionChanged = (_state) => {
160
+ this.logger.event("debug_session_changed");
161
+ sendListChanged();
162
+ };
163
+ }
164
+ cleanupSession(id) {
165
+ const session = this.sessions.get(id);
166
+ if (!session)
167
+ return;
168
+ if (session.graceTimer) {
169
+ clearTimeout(session.graceTimer);
170
+ }
171
+ session.transport.detach();
172
+ session.openedFiles.clear();
173
+ this.sessions.delete(id);
174
+ this.logger.info(`Session ${id.slice(0, 8)} cleaned up. Active sessions: ${this.sessions.size}`);
175
+ if (this.sessions.size === 0) {
176
+ this.extensionClient.notifyClaudeConnectionState(false);
177
+ }
178
+ }
179
+ async start() {
180
+ // 1. Probe available CLI tools
181
+ this.probes = await probeAll();
182
+ const probes = this.probes;
183
+ const probeList = (keys) => Object.entries(probes)
184
+ .filter(([k, v]) => v && (!keys || keys.includes(k)))
185
+ .map(([k]) => k)
186
+ .join(", ") || "none";
187
+ this.logger.info(`Probed tools: ${probeList()}`);
188
+ this.logger.info(`Available linters: ${probeList(["tsc", "eslint", "pyright", "ruff", "cargo", "go", "biome"])}`);
189
+ this.logger.info(`Available test runners: ${probeList(["vitest", "jest", "pytest", "cargo", "go"])}`);
190
+ // 2. Wire up /health endpoint data and /metrics
191
+ this.server.healthDataFn = () => ({
192
+ claudeCode: this.sessions.size > 0,
193
+ activeSessions: this.sessions.size,
194
+ extension: this.extensionClient.isConnected(),
195
+ extensionCircuitBreaker: this.extensionClient.getCircuitBreakerState(),
196
+ });
197
+ this.server.metricsFn = () => this.activityLog.toPrometheus();
198
+ // 3. Check for stale lock files
199
+ this.lockFile.cleanStale();
200
+ // 4. Find port and start server
201
+ const port = await this.server.findAndListen(this.config.port, this.config.bindAddress);
202
+ // 5. Write lock file
203
+ const lockPath = this.lockFile.write(port, this.authToken, [this.config.workspace], this.config.ideName);
204
+ // Register shutdown handlers
205
+ let shuttingDown = false;
206
+ const shutdown = async (signal, exitCode) => {
207
+ if (shuttingDown)
208
+ return;
209
+ shuttingDown = true;
210
+ this.logger.info(`Shutdown initiated by ${signal}`);
211
+ const forceTimer = setTimeout(() => {
212
+ process.exit(1);
213
+ }, SHUTDOWN_TIMEOUT_MS);
214
+ forceTimer.unref();
215
+ await this.stop();
216
+ process.exit(exitCode);
217
+ };
218
+ process.once("SIGINT", () => shutdown("SIGINT", 130));
219
+ process.once("SIGTERM", () => shutdown("SIGTERM", 143));
220
+ process.once("SIGHUP", () => shutdown("SIGHUP", 143));
221
+ // Catch unhandled rejections and exceptions to prevent silent crashes
222
+ // Guard against accumulating handlers across multiple start() calls.
223
+ if (!globalHandlersRegistered) {
224
+ globalHandlersRegistered = true;
225
+ process.once("unhandledRejection", (reason) => {
226
+ this.logger.error(`Unhandled rejection: ${reason instanceof Error ? (reason.stack ?? reason.message) : String(reason)}`);
227
+ });
228
+ process.once("uncaughtException", (err) => {
229
+ this.logger.error(`Uncaught exception: ${err.stack ?? err.message}`);
230
+ shutdown("uncaughtException", 1);
231
+ });
232
+ }
233
+ // Startup banner to stderr (not stdout) to avoid capture by parent processes
234
+ this.logger.info("claude-ide-bridge running");
235
+ this.logger.info(` Port: ${port}`);
236
+ this.logger.info(` Workspace: ${this.config.workspace}`);
237
+ this.logger.info(` Editor: ${this.config.editorCommand || "none"}`);
238
+ this.logger.info(` Lock file: ${lockPath}`);
239
+ this.logger.info(" To connect: CLAUDE_CODE_IDE_SKIP_VALID_CHECK=true claude");
240
+ this.logger.info(` Then type "/ide" in the Claude Code session.`);
241
+ this.logger.info(' For Remote Control: run "npm run remote" from the claude-ide-bridge directory (auto-restarts on disconnect)');
242
+ this.logger.event("bridge_started", {
243
+ port,
244
+ workspace: this.config.workspace,
245
+ editor: this.config.editorCommand,
246
+ });
247
+ if (this.config.verbose) {
248
+ this.logger.debug(`Resolved config: ${JSON.stringify({
249
+ workspace: this.config.workspace,
250
+ editor: this.config.editorCommand,
251
+ linters: this.config.linters,
252
+ commandTimeout: this.config.commandTimeout,
253
+ maxResultSize: this.config.maxResultSize,
254
+ commandAllowlist: this.config.commandAllowlist,
255
+ })}`);
256
+ }
257
+ }
258
+ async stop() {
259
+ if (this.stopped)
260
+ return;
261
+ this.stopped = true;
262
+ this.logger.info("Shutting down...");
263
+ if (this.listChangedTimer) {
264
+ clearTimeout(this.listChangedTimer);
265
+ this.listChangedTimer = null;
266
+ }
267
+ // Clean up all active sessions
268
+ for (const id of [...this.sessions.keys()]) {
269
+ this.cleanupSession(id);
270
+ }
271
+ this.extensionClient.disconnect();
272
+ await this.server.close();
273
+ this.lockFile.delete();
274
+ cleanupTempDirs();
275
+ }
276
+ }
277
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface Config {
2
+ workspace: string;
3
+ workspaceFolders: string[];
4
+ ideName: string;
5
+ editorCommand: string | null;
6
+ port: number | null;
7
+ bindAddress: string;
8
+ verbose: boolean;
9
+ jsonl: boolean;
10
+ linters: string[];
11
+ commandAllowlist: string[];
12
+ commandTimeout: number;
13
+ maxResultSize: number;
14
+ vscodeCommandAllowlist: string[];
15
+ activeWorkspaceFolder: string;
16
+ }
17
+ /** Commands that can execute arbitrary code via flags like -e, -c, --eval.
18
+ * These are blocked from the default allowlist but can be added via --allow-command. */
19
+ export declare const INTERPRETER_COMMANDS: Set<string>;
20
+ export declare function findEditor(): string | null;
21
+ export declare function ideNameFromEditor(editorCommand: string): string;
22
+ export declare function parseConfig(argv: string[]): Config;
package/dist/config.js ADDED
@@ -0,0 +1,221 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import path from "node:path";
3
+ const DEFAULT_ALLOWLIST = [
4
+ "npm",
5
+ "cargo",
6
+ "go",
7
+ "pytest",
8
+ "jest",
9
+ "vitest",
10
+ "tsc",
11
+ "eslint",
12
+ "biome",
13
+ ];
14
+ /** Commands that can execute arbitrary code via flags like -e, -c, --eval.
15
+ * These are blocked from the default allowlist but can be added via --allow-command. */
16
+ export const INTERPRETER_COMMANDS = new Set([
17
+ "node",
18
+ "python",
19
+ "python3",
20
+ "make",
21
+ "bash",
22
+ "sh",
23
+ "zsh",
24
+ "dash",
25
+ "fish",
26
+ "ksh",
27
+ "csh",
28
+ "tcsh",
29
+ "ruby",
30
+ "perl",
31
+ "lua",
32
+ "php",
33
+ ]);
34
+ const EDITOR_IDE_NAMES = {
35
+ windsurf: "Windsurf",
36
+ cursor: "Cursor",
37
+ antigravity: "Antigravity",
38
+ ag: "Antigravity",
39
+ code: "VS Code",
40
+ };
41
+ export function findEditor() {
42
+ const whichCmd = process.platform === "win32" ? "where" : "which";
43
+ for (const cmd of ["windsurf", "cursor", "antigravity", "ag", "code"]) {
44
+ try {
45
+ execFileSync(whichCmd, [cmd], { stdio: "ignore", timeout: 3000 });
46
+ return cmd;
47
+ }
48
+ catch {
49
+ // not found
50
+ }
51
+ }
52
+ return null;
53
+ }
54
+ export function ideNameFromEditor(editorCommand) {
55
+ return EDITOR_IDE_NAMES[editorCommand] ?? editorCommand;
56
+ }
57
+ function requireArg(args, i, flag) {
58
+ const value = args[i];
59
+ if (value === undefined || value.startsWith("--")) {
60
+ throw new Error(`Missing value for ${flag}`);
61
+ }
62
+ return value;
63
+ }
64
+ export function parseConfig(argv) {
65
+ const args = argv.slice(2);
66
+ let workspace = process.cwd();
67
+ let ideName = "External";
68
+ let editorCommand = null;
69
+ let port = null;
70
+ let verbose = false;
71
+ let jsonl = false;
72
+ let linters = [];
73
+ const commandAllowlist = [...DEFAULT_ALLOWLIST];
74
+ const vscodeCommandAllowlist = [];
75
+ let bindAddress = process.env.BRIDGE_BIND_ADDRESS ?? "127.0.0.1";
76
+ let commandTimeout = 30_000;
77
+ let maxResultSize = 512;
78
+ for (let i = 0; i < args.length; i++) {
79
+ switch (args[i]) {
80
+ case "--workspace":
81
+ workspace = path.resolve(requireArg(args, ++i, "--workspace"));
82
+ break;
83
+ case "--ide-name":
84
+ ideName = requireArg(args, ++i, "--ide-name");
85
+ break;
86
+ case "--editor":
87
+ editorCommand = requireArg(args, ++i, "--editor");
88
+ break;
89
+ case "--bind":
90
+ bindAddress = requireArg(args, ++i, "--bind");
91
+ break;
92
+ case "--port": {
93
+ const portStr = requireArg(args, ++i, "--port");
94
+ port = Number.parseInt(portStr, 10);
95
+ if (!Number.isInteger(port) || port < 1024 || port > 65535) {
96
+ throw new Error(`Invalid port: ${portStr}. Must be an integer between 1024 and 65535.`);
97
+ }
98
+ break;
99
+ }
100
+ case "--verbose":
101
+ verbose = true;
102
+ break;
103
+ case "--jsonl":
104
+ jsonl = true;
105
+ break;
106
+ case "--linter":
107
+ linters.push(requireArg(args, ++i, "--linter"));
108
+ break;
109
+ case "--allow-command":
110
+ commandAllowlist.push(requireArg(args, ++i, "--allow-command"));
111
+ break;
112
+ case "--vscode-allow-command":
113
+ vscodeCommandAllowlist.push(requireArg(args, ++i, "--vscode-allow-command"));
114
+ break;
115
+ case "--timeout": {
116
+ const tStr = requireArg(args, ++i, "--timeout");
117
+ commandTimeout = Number.parseInt(tStr, 10);
118
+ if (!Number.isInteger(commandTimeout) ||
119
+ commandTimeout < 1000 ||
120
+ commandTimeout > 120_000) {
121
+ throw new Error(`Invalid timeout: ${tStr}. Must be between 1000 and 120000 ms.`);
122
+ }
123
+ break;
124
+ }
125
+ case "--max-result-size": {
126
+ const mStr = requireArg(args, ++i, "--max-result-size");
127
+ maxResultSize = Number.parseInt(mStr, 10);
128
+ if (!Number.isInteger(maxResultSize) ||
129
+ maxResultSize < 1 ||
130
+ maxResultSize > 4096) {
131
+ throw new Error(`Invalid max-result-size: ${mStr}. Must be between 1 and 4096 KB.`);
132
+ }
133
+ break;
134
+ }
135
+ case "--help": {
136
+ console.log(`claude-ide-bridge - Standalone MCP bridge for Claude Code IDE integration
137
+
138
+ Usage: claude-ide-bridge [options]
139
+
140
+ Options:
141
+ --workspace <path> Workspace folder (default: cwd)
142
+ --ide-name <name> IDE name shown to Claude (default: "External")
143
+ --editor <cmd> Editor CLI command (default: auto-detect windsurf/cursor/antigravity/code)
144
+ --port <number> Force specific port (default: random)
145
+ --bind <addr> Bind address (default: 127.0.0.1, env: BRIDGE_BIND_ADDRESS)
146
+ --linter <name> Enable specific linter (repeatable; default: auto-detect)
147
+ --allow-command <cmd> Add command to execution allowlist (repeatable)
148
+ --vscode-allow-command <cmd> Add VS Code command to invocation allowlist (repeatable)
149
+ --timeout <ms> Command timeout in ms (default: 30000, max: 120000)
150
+ --max-result-size <KB> Max output size in KB (default: 512, max: 4096)
151
+ --verbose Enable debug logging
152
+ --jsonl Emit structured JSONL events to stderr
153
+ --help Show this help
154
+
155
+ Environment Variables:
156
+ CLAUDE_IDE_BRIDGE_EDITOR Editor command override
157
+ CLAUDE_IDE_BRIDGE_LINTERS Comma-separated linter list
158
+ CLAUDE_IDE_BRIDGE_TIMEOUT Command timeout in ms
159
+ CLAUDE_IDE_BRIDGE_MAX_RESULT_SIZE Max output size in KB
160
+ CLAUDE_CONFIG_DIR Override ~/.claude directory`);
161
+ return process.exit(0);
162
+ }
163
+ default: {
164
+ const arg = args[i];
165
+ if (arg?.startsWith("--")) {
166
+ throw new Error(`Unknown option: ${arg}. Run with --help for usage.`);
167
+ }
168
+ }
169
+ }
170
+ }
171
+ // Auto-detect editor
172
+ editorCommand =
173
+ editorCommand || process.env.CLAUDE_IDE_BRIDGE_EDITOR || findEditor();
174
+ // Auto-derive ideName from editor if not explicitly provided
175
+ if (ideName === "External" && editorCommand) {
176
+ ideName = ideNameFromEditor(editorCommand);
177
+ }
178
+ // Env var overrides
179
+ if (process.env.CLAUDE_IDE_BRIDGE_LINTERS) {
180
+ linters = process.env.CLAUDE_IDE_BRIDGE_LINTERS.split(",").map((s) => s.trim());
181
+ }
182
+ if (process.env.CLAUDE_IDE_BRIDGE_TIMEOUT) {
183
+ const envTimeout = Number.parseInt(process.env.CLAUDE_IDE_BRIDGE_TIMEOUT, 10);
184
+ if (Number.isInteger(envTimeout) &&
185
+ envTimeout >= 1000 &&
186
+ envTimeout <= 120_000) {
187
+ commandTimeout = envTimeout;
188
+ }
189
+ else {
190
+ // console.warn rather than logger — Logger is constructed after parseConfig() returns
191
+ console.warn(`Warning: CLAUDE_IDE_BRIDGE_TIMEOUT=${process.env.CLAUDE_IDE_BRIDGE_TIMEOUT} is invalid (must be 1000-120000). Using default ${commandTimeout}.`);
192
+ }
193
+ }
194
+ if (process.env.CLAUDE_IDE_BRIDGE_MAX_RESULT_SIZE) {
195
+ const envSize = Number.parseInt(process.env.CLAUDE_IDE_BRIDGE_MAX_RESULT_SIZE, 10);
196
+ if (Number.isInteger(envSize) && envSize >= 1 && envSize <= 4096) {
197
+ maxResultSize = envSize;
198
+ }
199
+ else {
200
+ // console.warn rather than logger — Logger is constructed after parseConfig() returns
201
+ console.warn(`Warning: CLAUDE_IDE_BRIDGE_MAX_RESULT_SIZE=${process.env.CLAUDE_IDE_BRIDGE_MAX_RESULT_SIZE} is invalid (must be 1-4096). Using default ${maxResultSize}.`);
202
+ }
203
+ }
204
+ return {
205
+ workspace,
206
+ workspaceFolders: [workspace],
207
+ ideName,
208
+ editorCommand,
209
+ port,
210
+ bindAddress,
211
+ verbose,
212
+ jsonl,
213
+ linters,
214
+ commandAllowlist,
215
+ commandTimeout,
216
+ maxResultSize,
217
+ vscodeCommandAllowlist,
218
+ activeWorkspaceFolder: workspace,
219
+ };
220
+ }
221
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /** Structured JSON-RPC error codes for the bridge.
2
+ * Standard codes: https://spec.modelcontextprotocol.io/specification/2025-11-25/basic/transports/#error-handling
3
+ */
4
+ export declare const ErrorCodes: {
5
+ readonly PARSE_ERROR: -32700;
6
+ readonly INVALID_REQUEST: -32600;
7
+ readonly METHOD_NOT_FOUND: -32601;
8
+ readonly INVALID_PARAMS: -32602;
9
+ readonly INTERNAL_ERROR: -32603;
10
+ readonly REQUEST_CANCELLED: -32800;
11
+ readonly CONTENT_TOO_LARGE: -32801;
12
+ readonly TOOL_EXECUTION_FAILED: -32000;
13
+ readonly EXTENSION_DISCONNECTED: -32001;
14
+ readonly REQUEST_TIMEOUT: -32002;
15
+ readonly TOOL_NOT_FOUND: -32003;
16
+ };
package/dist/errors.js ADDED
@@ -0,0 +1,20 @@
1
+ /** Structured JSON-RPC error codes for the bridge.
2
+ * Standard codes: https://spec.modelcontextprotocol.io/specification/2025-11-25/basic/transports/#error-handling
3
+ */
4
+ export const ErrorCodes = {
5
+ // JSON-RPC 2.0 standard codes
6
+ PARSE_ERROR: -32700,
7
+ INVALID_REQUEST: -32600,
8
+ METHOD_NOT_FOUND: -32601,
9
+ INVALID_PARAMS: -32602,
10
+ INTERNAL_ERROR: -32603,
11
+ // MCP-defined codes
12
+ REQUEST_CANCELLED: -32800,
13
+ CONTENT_TOO_LARGE: -32801,
14
+ // Bridge-specific server codes (within reserved -32000 to -32099 range)
15
+ TOOL_EXECUTION_FAILED: -32000,
16
+ EXTENSION_DISCONNECTED: -32001,
17
+ REQUEST_TIMEOUT: -32002,
18
+ TOOL_NOT_FOUND: -32003,
19
+ };
20
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,8BAA8B;IAC9B,WAAW,EAAE,CAAC,KAAK;IACnB,eAAe,EAAE,CAAC,KAAK;IACvB,gBAAgB,EAAE,CAAC,KAAK;IACxB,cAAc,EAAE,CAAC,KAAK;IACtB,cAAc,EAAE,CAAC,KAAK;IACtB,oBAAoB;IACpB,iBAAiB,EAAE,CAAC,KAAK;IACzB,iBAAiB,EAAE,CAAC,KAAK;IACzB,wEAAwE;IACxE,qBAAqB,EAAE,CAAC,KAAK;IAC7B,sBAAsB,EAAE,CAAC,KAAK;IAC9B,eAAe,EAAE,CAAC,KAAK;IACvB,cAAc,EAAE,CAAC,KAAK;CACd,CAAC"}