mirror of
https://github.com/RooVetGit/Roo-Code.git
synced 2026-08-28 05:27:24 +00:00
fix: prevent extension hang when Claude Code is installed
- Add detection for Claude Code extension during activation - Implement 30-second timeout protection to prevent hanging - Add graceful error handling with user-friendly messages - Add small delay when Claude Code is detected to prevent race conditions - Refactor activation logic into separate performActivation function Fixes #6548
This commit is contained in:
parent
305a5da369
commit
b2437a7112
1 changed files with 45 additions and 1 deletions
|
|
@ -59,6 +59,44 @@ export async function activate(context: vscode.ExtensionContext) {
|
|||
context.subscriptions.push(outputChannel)
|
||||
outputChannel.appendLine(`${Package.name} extension activated - ${JSON.stringify(Package)}`)
|
||||
|
||||
// Check for potential extension conflicts
|
||||
const claudeCodeExtension = vscode.extensions.getExtension("anthropic.claude-code")
|
||||
if (claudeCodeExtension) {
|
||||
outputChannel.appendLine(`[Warning] Claude Code extension detected. Implementing conflict prevention measures.`)
|
||||
|
||||
// Add a small delay to prevent race conditions during activation
|
||||
await new Promise((resolve) => setTimeout(resolve, 100))
|
||||
}
|
||||
|
||||
// Wrap the activation process with a timeout to prevent hanging
|
||||
const ACTIVATION_TIMEOUT = 30000 // 30 seconds
|
||||
const activationPromise = performActivation(context, outputChannel)
|
||||
|
||||
try {
|
||||
await Promise.race([
|
||||
activationPromise,
|
||||
new Promise((_, reject) => setTimeout(() => reject(new Error("Activation timeout")), ACTIVATION_TIMEOUT)),
|
||||
])
|
||||
} catch (error) {
|
||||
outputChannel.appendLine(`[Error] Extension activation failed: ${error}`)
|
||||
// Show a user-friendly error message
|
||||
vscode.window
|
||||
.showErrorMessage(
|
||||
`Roo Code activation failed. ${claudeCodeExtension ? "This may be due to a conflict with Claude Code extension. " : ""}Please try reloading the window.`,
|
||||
"Reload Window",
|
||||
)
|
||||
.then((selection) => {
|
||||
if (selection === "Reload Window") {
|
||||
vscode.commands.executeCommand("workbench.action.reloadWindow")
|
||||
}
|
||||
})
|
||||
throw error
|
||||
}
|
||||
|
||||
return activationPromise
|
||||
}
|
||||
|
||||
async function performActivation(context: vscode.ExtensionContext, outputChannel: vscode.OutputChannel) {
|
||||
// Migrate old settings to new
|
||||
await migrateSettings(context, outputChannel)
|
||||
|
||||
|
|
@ -180,7 +218,13 @@ export async function activate(context: vscode.ExtensionContext) {
|
|||
registerTerminalActions(context)
|
||||
|
||||
// Allows other extensions to activate once Roo is ready.
|
||||
vscode.commands.executeCommand(`${Package.name}.activationCompleted`)
|
||||
// Use a try-catch to prevent activation completion from blocking
|
||||
try {
|
||||
await vscode.commands.executeCommand(`${Package.name}.activationCompleted`)
|
||||
} catch (error) {
|
||||
outputChannel.appendLine(`[Warning] Failed to execute activationCompleted command: ${error}`)
|
||||
// Continue activation even if this fails
|
||||
}
|
||||
|
||||
// Implements the `RooCodeAPI` interface.
|
||||
const socketPath = process.env.ROO_CODE_IPC_SOCKET_PATH
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue