Skip to content

Commit b420d6b

Browse files
committed
feat: enhance settings import functionality for remote workspaces
- Added options for importing settings from either remote or local JSON files in remote workspaces. - Implemented a file picker in the webview for selecting local JSON files. - Introduced a new message type 'requestLocalSettingsFile' to facilitate local file selection. - Updated the import logic to handle local file content and clean up temporary files after import. This improves user experience by providing flexibility in settings management across different environments.
1 parent 195f4eb commit b420d6b

File tree

4 files changed

+83
-6
lines changed

4 files changed

+83
-6
lines changed

src/core/webview/webviewMessageHandler.ts

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -680,13 +680,67 @@ export const webviewMessageHandler = async (
680680
provider.exportTaskWithId(message.text!)
681681
break
682682
case "importSettings": {
683-
await importSettingsWithFeedback({
684-
providerSettingsManager: provider.providerSettingsManager,
685-
contextProxy: provider.contextProxy,
686-
customModesManager: provider.customModesManager,
687-
provider: provider,
688-
})
683+
// In remote workspaces, offer two options:
684+
// 1) Pick a JSON file from the remote/workspace filesystem (VS Code Open Dialog)
685+
// 2) Pick a JSON file from the local machine via the webview (browser file picker)
686+
const isRemote = !!vscode.env.remoteName
687+
if (!isRemote) {
688+
await importSettingsWithFeedback({
689+
providerSettingsManager: provider.providerSettingsManager,
690+
contextProxy: provider.contextProxy,
691+
customModesManager: provider.customModesManager,
692+
provider: provider,
693+
})
694+
} else {
695+
const selection = await vscode.window.showQuickPick(
696+
[
697+
{
698+
label: "Import from remote file (JSON)",
699+
description: "Pick from remote/workspace filesystem",
700+
id: "remote",
701+
},
702+
{
703+
label: "Import from local file (JSON)",
704+
description: "Pick on this machine via webview",
705+
id: "local",
706+
},
707+
],
708+
{ placeHolder: "Choose import source" },
709+
)
710+
if (!selection) break
689711

712+
if (selection.id === "remote") {
713+
await importSettingsWithFeedback({
714+
providerSettingsManager: provider.providerSettingsManager,
715+
contextProxy: provider.contextProxy,
716+
customModesManager: provider.customModesManager,
717+
provider: provider,
718+
})
719+
} else {
720+
// Ask the webview to trigger a local file picker
721+
await provider.postMessageToWebview({ type: "requestLocalSettingsFile" })
722+
}
723+
}
724+
break
725+
}
726+
case "importSettingsFromLocal": {
727+
const content = message.text || ""
728+
if (!content) {
729+
vscode.window.showErrorMessage("No local settings file content received")
730+
break
731+
}
732+
const tmpPath = path.join(os.tmpdir(), `roo-code-settings-local-import-${Date.now()}.json`)
733+
await fs.writeFile(tmpPath, content, "utf-8")
734+
await importSettingsWithFeedback(
735+
{
736+
providerSettingsManager: provider.providerSettingsManager,
737+
contextProxy: provider.contextProxy,
738+
customModesManager: provider.customModesManager,
739+
provider: provider,
740+
},
741+
tmpPath,
742+
)
743+
await fs.unlink(tmpPath)
690744
break
691745
}
692746
case "exportSettings":

src/shared/ExtensionMessage.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ export interface ExtensionMessage {
123123
| "showEditMessageDialog"
124124
| "commands"
125125
| "insertTextIntoTextarea"
126+
| "requestLocalSettingsFile"
126127
text?: string
127128
payload?: any // Add a generic payload for now, can refine later
128129
action?:

src/shared/WebviewMessage.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ export interface WebviewMessage {
6262
| "deleteTaskWithId"
6363
| "exportTaskWithId"
6464
| "importSettings"
65+
| "importSettingsFromLocal"
6566
| "exportSettings"
6667
| "resetState"
6768
| "flushRouterModels"

webview-ui/src/App.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,27 @@ const App = () => {
185185
if (message.type === "acceptInput") {
186186
chatViewRef.current?.acceptInput()
187187
}
188+
189+
// Handle extension request to pick a local settings file
190+
if (message.type === "requestLocalSettingsFile") {
191+
const input = document.createElement("input")
192+
input.type = "file"
193+
input.accept = ".json,application/json"
194+
input.onchange = () => {
195+
const file = input.files?.[0]
196+
if (!file) return
197+
const reader = new FileReader()
198+
reader.onload = () => {
199+
const text = typeof reader.result === "string" ? reader.result : ""
200+
if (text) {
201+
vscode.postMessage({ type: "importSettingsFromLocal", text })
202+
}
203+
}
204+
reader.readAsText(file)
205+
}
206+
// Trigger the native file picker in the webview context
207+
input.click()
208+
}
188209
},
189210
[switchTab],
190211
)

0 commit comments

Comments
 (0)