feat: add "Roo Code: Open in This Tab" command

- Add new command openInThisTab to package.json
- Implement openClineInThisTab function that opens in current tab
- Add command to types and localization
- Closes #5457
This commit is contained in:
Roo Code 2025-08-13 17:18:32 +00:00
parent 962df868bd
commit 2fef294c22
4 changed files with 73 additions and 0 deletions

View file

@ -39,6 +39,7 @@ export const commandIds = [
"settingsButtonClicked",
"openInNewTab",
"openInThisTab",
"showHumanRelayDialog",
"registerHumanRelayCallback",

View file

@ -129,6 +129,7 @@ const getCommandsMap = ({ context, outputChannel, provider }: RegisterCommandOpt
return openClineInNewTab({ context, outputChannel })
},
openInNewTab: () => openClineInNewTab({ context, outputChannel }),
openInThisTab: () => openClineInThisTab({ context, outputChannel }),
settingsButtonClicked: () => {
const visibleProvider = getVisibleProviderOrLog(outputChannel)
@ -298,3 +299,68 @@ export const openClineInNewTab = async ({ context, outputChannel }: Omit<Registe
return tabProvider
}
export const openClineInThisTab = async ({ context, outputChannel }: Omit<RegisterCommandOptions, "provider">) => {
const contextProxy = await ContextProxy.getInstance(context)
const codeIndexManager = CodeIndexManager.getInstance(context)
// Get the existing MDM service instance to ensure consistent policy enforcement
let mdmService: MdmService | undefined
try {
mdmService = MdmService.getInstance()
} catch (error) {
// MDM service not initialized, which is fine - extension can work without it
mdmService = undefined
}
const tabProvider = new ClineProvider(context, outputChannel, "editor", contextProxy, mdmService)
// Get the active text editor's view column, or use the first column if no editor is active
const activeColumn = vscode.window.activeTextEditor?.viewColumn || vscode.ViewColumn.One
// Create the webview panel in the current tab/column
const newPanel = vscode.window.createWebviewPanel(
ClineProvider.tabPanelId,
"Roo Code",
{ viewColumn: activeColumn, preserveFocus: false },
{
enableScripts: true,
retainContextWhenHidden: true,
localResourceRoots: [context.extensionUri],
},
)
// Save as tab type panel
setPanel(newPanel, "tab")
// Set the icon
newPanel.iconPath = {
light: vscode.Uri.joinPath(context.extensionUri, "assets", "icons", "panel_light.png"),
dark: vscode.Uri.joinPath(context.extensionUri, "assets", "icons", "panel_dark.png"),
}
await tabProvider.resolveWebviewView(newPanel)
// Add listener for visibility changes to notify webview
newPanel.onDidChangeViewState(
(e) => {
const panel = e.webviewPanel
if (panel.visible) {
panel.webview.postMessage({ type: "action", action: "didBecomeVisible" })
}
},
null,
context.subscriptions,
)
// Handle panel closing events
newPanel.onDidDispose(
() => {
setPanel(undefined, "tab")
},
null,
context.subscriptions,
)
return tabProvider
}

View file

@ -115,6 +115,11 @@
"title": "%command.openInNewTab.title%",
"category": "%configuration.title%"
},
{
"command": "roo-cline.openInThisTab",
"title": "%command.openInThisTab.title%",
"category": "%configuration.title%"
},
{
"command": "roo-cline.explainCode",
"title": "%command.explainCode.title%",

View file

@ -15,6 +15,7 @@
"command.settings.title": "Settings",
"command.documentation.title": "Documentation",
"command.openInNewTab.title": "Open In New Tab",
"command.openInThisTab.title": "Open In This Tab",
"command.explainCode.title": "Explain Code",
"command.fixCode.title": "Fix Code",
"command.improveCode.title": "Improve Code",