Skip to content
Merged
90 changes: 55 additions & 35 deletions src/core/config/importExport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { ContextProxy } from "./ContextProxy"
import { CustomModesManager } from "./CustomModesManager"
import { t } from "../../i18n"

type ImportOptions = {
export type ImportOptions = {
providerSettingsManager: ProviderSettingsManager
contextProxy: ContextProxy
customModesManager: CustomModesManager
Expand All @@ -24,7 +24,6 @@ type ExportOptions = {
providerSettingsManager: ProviderSettingsManager
contextProxy: ContextProxy
}

type ImportWithProviderOptions = ImportOptions & {
provider: {
settingsImportedAt?: number
Expand All @@ -33,33 +32,14 @@ type ImportWithProviderOptions = ImportOptions & {
}

/**
* Import settings from a file using a file dialog
* @param options - Import options containing managers and proxy
* @returns Promise resolving to import result
* Imports configuration from a specific file path
* Shares base functionality for import settings for both the manual
* and automatic settings importing
*/
export const importSettings = async ({ providerSettingsManager, contextProxy, customModesManager }: ImportOptions) => {
const uris = await vscode.window.showOpenDialog({
filters: { JSON: ["json"] },
canSelectMany: false,
})

if (!uris) {
return { success: false, error: "User cancelled file selection" }
}

return await importSettingsFromFile({ providerSettingsManager, contextProxy, customModesManager }, uris[0])
}

/**
* Import settings from a specific file
* @param options - Import options containing managers and proxy
* @param fileUri - URI of the file to import from
* @returns Promise resolving to import result
*/
export const importSettingsFromFile = async (
export async function importSettingsFromPath(
filePath: string,
{ providerSettingsManager, contextProxy, customModesManager }: ImportOptions,
fileUri: vscode.Uri,
) => {
) {
const schema = z.object({
providerProfiles: providerProfilesSchema,
globalSettings: globalSettingsSchema.optional(),
Expand All @@ -68,8 +48,9 @@ export const importSettingsFromFile = async (
try {
const previousProviderProfiles = await providerSettingsManager.export()

const data = JSON.parse(await fs.readFile(fileUri.fsPath, "utf-8"))
const { providerProfiles: newProviderProfiles, globalSettings = {} } = schema.parse(data)
const { providerProfiles: newProviderProfiles, globalSettings = {} } = schema.parse(
JSON.parse(await fs.readFile(filePath, "utf-8")),
)

const providerProfiles = {
currentApiConfigName: newProviderProfiles.currentApiConfigName,
Expand Down Expand Up @@ -119,6 +100,45 @@ export const importSettingsFromFile = async (
}
}

/**
* Import settings from a file using a file dialog
* @param options - Import options containing managers and proxy
* @returns Promise resolving to import result
*/
export const importSettings = async ({ providerSettingsManager, contextProxy, customModesManager }: ImportOptions) => {
const uris = await vscode.window.showOpenDialog({
filters: { JSON: ["json"] },
canSelectMany: false,
})

if (!uris) {
return { success: false, error: "User cancelled file selection" }
}

return importSettingsFromPath(uris[0].fsPath, {
providerSettingsManager,
contextProxy,
customModesManager,
})
}

/**
* Import settings from a specific file
* @param options - Import options containing managers and proxy
* @param fileUri - URI of the file to import from
* @returns Promise resolving to import result
*/
export const importSettingsFromFile = async (
{ providerSettingsManager, contextProxy, customModesManager }: ImportOptions,
fileUri: vscode.Uri,
) => {
return importSettingsFromPath(fileUri.fsPath, {
providerSettingsManager,
contextProxy,
customModesManager,
})
}

export const exportSettings = async ({ providerSettingsManager, contextProxy }: ExportOptions) => {
const uri = await vscode.window.showSaveDialog({
filters: { JSON: ["json"] },
Expand Down Expand Up @@ -162,13 +182,13 @@ export const importSettingsWithFeedback = async (
if (filePath) {
// Validate file path and check if file exists
try {
const fileUri = vscode.Uri.file(filePath)
// Check if file exists and is readable
await fs.access(fileUri.fsPath, fs.constants.F_OK | fs.constants.R_OK)
result = await importSettingsFromFile(
{ providerSettingsManager, contextProxy, customModesManager },
fileUri,
)
await fs.access(filePath, fs.constants.F_OK | fs.constants.R_OK)
result = await importSettingsFromPath(filePath, {
providerSettingsManager,
contextProxy,
customModesManager,
})
} catch (error) {
result = {
success: false,
Expand Down
14 changes: 14 additions & 0 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import { McpServerManager } from "./services/mcp/McpServerManager"
import { CodeIndexManager } from "./services/code-index/manager"
import { MdmService } from "./services/mdm/MdmService"
import { migrateSettings } from "./utils/migrateSettings"
import { autoImportSettings } from "./utils/autoImportSettings"
import { API } from "./extension/api"

import {
Expand Down Expand Up @@ -120,6 +121,19 @@ export async function activate(context: vscode.ExtensionContext) {
}),
)

// Auto-import configuration if specified in settings
try {
await autoImportSettings(outputChannel, {
providerSettingsManager: provider.providerSettingsManager,
contextProxy: provider.contextProxy,
customModesManager: provider.customModesManager,
})
} catch (error) {
outputChannel.appendLine(
`[AutoImport] Error during auto-import: ${error instanceof Error ? error.message : String(error)}`,
)
}

registerCommands({ context, outputChannel, provider })

/**
Expand Down
4 changes: 3 additions & 1 deletion src/i18n/locales/ca/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@
},
"warnings": {
"no_terminal_content": "No s'ha seleccionat contingut de terminal",
"missing_task_files": "Els fitxers d'aquesta tasca falten. Vols eliminar-la de la llista de tasques?"
"missing_task_files": "Els fitxers d'aquesta tasca falten. Vols eliminar-la de la llista de tasques?",
"auto_import_failed": "Ha fallat la importació automàtica de la configuració de RooCode: {{error}}"
},
"info": {
"no_changes": "No s'han trobat canvis.",
Expand All @@ -86,6 +87,7 @@
"custom_storage_path_set": "Ruta d'emmagatzematge personalitzada establerta: {{path}}",
"default_storage_path": "S'ha reprès l'ús de la ruta d'emmagatzematge predeterminada",
"settings_imported": "Configuració importada correctament.",
"auto_import_success": "Configuració de RooCode importada automàticament des de {{filename}}",
"share_link_copied": "Enllaç de compartició copiat al portapapers",
"image_copied_to_clipboard": "URI de dades de la imatge copiada al portapapers",
"image_saved": "Imatge desada a {{path}}",
Expand Down
4 changes: 3 additions & 1 deletion src/i18n/locales/de/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@
},
"warnings": {
"no_terminal_content": "Kein Terminal-Inhalt ausgewählt",
"missing_task_files": "Die Dateien dieser Aufgabe fehlen. Möchtest du sie aus der Aufgabenliste entfernen?"
"missing_task_files": "Die Dateien dieser Aufgabe fehlen. Möchtest du sie aus der Aufgabenliste entfernen?",
"auto_import_failed": "Fehler beim automatischen Import der RooCode-Einstellungen: {{error}}"
},
"info": {
"no_changes": "Keine Änderungen gefunden.",
Expand All @@ -82,6 +83,7 @@
"custom_storage_path_set": "Benutzerdefinierter Speicherpfad festgelegt: {{path}}",
"default_storage_path": "Auf Standardspeicherpfad zurückgesetzt",
"settings_imported": "Einstellungen erfolgreich importiert.",
"auto_import_success": "RooCode-Einstellungen automatisch importiert aus {{filename}}",
"share_link_copied": "Share-Link in die Zwischenablage kopiert",
"image_copied_to_clipboard": "Bild-Daten-URI in die Zwischenablage kopiert",
"image_saved": "Bild gespeichert unter {{path}}",
Expand Down
4 changes: 3 additions & 1 deletion src/i18n/locales/en/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@
},
"warnings": {
"no_terminal_content": "No terminal content selected",
"missing_task_files": "This task's files are missing. Would you like to remove it from the task list?"
"missing_task_files": "This task's files are missing. Would you like to remove it from the task list?",
"auto_import_failed": "Failed to auto-import RooCode settings: {{error}}"
},
"info": {
"no_changes": "No changes found.",
Expand All @@ -82,6 +83,7 @@
"custom_storage_path_set": "Custom storage path set: {{path}}",
"default_storage_path": "Reverted to using default storage path",
"settings_imported": "Settings imported successfully.",
"auto_import_success": "RooCode settings automatically imported from {{filename}}",
"share_link_copied": "Share link copied to clipboard",
"organization_share_link_copied": "Organization share link copied to clipboard!",
"public_share_link_copied": "Public share link copied to clipboard!",
Expand Down
4 changes: 3 additions & 1 deletion src/i18n/locales/es/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@
},
"warnings": {
"no_terminal_content": "No hay contenido de terminal seleccionado",
"missing_task_files": "Los archivos de esta tarea faltan. ¿Deseas eliminarla de la lista de tareas?"
"missing_task_files": "Los archivos de esta tarea faltan. ¿Deseas eliminarla de la lista de tareas?",
"auto_import_failed": "Error al importar automáticamente la configuración de RooCode: {{error}}"
},
"info": {
"no_changes": "No se encontraron cambios.",
Expand All @@ -82,6 +83,7 @@
"custom_storage_path_set": "Ruta de almacenamiento personalizada establecida: {{path}}",
"default_storage_path": "Se ha vuelto a usar la ruta de almacenamiento predeterminada",
"settings_imported": "Configuración importada correctamente.",
"auto_import_success": "Configuración de RooCode importada automáticamente desde {{filename}}",
"share_link_copied": "Enlace de compartir copiado al portapapeles",
"image_copied_to_clipboard": "URI de datos de imagen copiada al portapapeles",
"image_saved": "Imagen guardada en {{path}}",
Expand Down
4 changes: 3 additions & 1 deletion src/i18n/locales/fr/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@
},
"warnings": {
"no_terminal_content": "Aucun contenu de terminal sélectionné",
"missing_task_files": "Les fichiers de cette tâche sont introuvables. Souhaitez-vous la supprimer de la liste des tâches ?"
"missing_task_files": "Les fichiers de cette tâche sont introuvables. Souhaitez-vous la supprimer de la liste des tâches ?",
"auto_import_failed": "Échec de l'importation automatique des paramètres RooCode : {{error}}"
},
"info": {
"no_changes": "Aucun changement trouvé.",
Expand All @@ -82,6 +83,7 @@
"custom_storage_path_set": "Chemin de stockage personnalisé défini : {{path}}",
"default_storage_path": "Retour au chemin de stockage par défaut",
"settings_imported": "Paramètres importés avec succès.",
"auto_import_success": "Paramètres RooCode importés automatiquement depuis {{filename}}",
"share_link_copied": "Lien de partage copié dans le presse-papiers",
"image_copied_to_clipboard": "URI de données d'image copiée dans le presse-papiers",
"image_saved": "Image enregistrée dans {{path}}",
Expand Down
4 changes: 3 additions & 1 deletion src/i18n/locales/hi/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@
},
"warnings": {
"no_terminal_content": "कोई टर्मिनल सामग्री चयनित नहीं",
"missing_task_files": "इस टास्क की फाइलें गायब हैं। क्या आप इसे टास्क सूची से हटाना चाहते हैं?"
"missing_task_files": "इस टास्क की फाइलें गायब हैं। क्या आप इसे टास्क सूची से हटाना चाहते हैं?",
"auto_import_failed": "RooCode सेटिंग्स का स्वचालित आयात विफल: {{error}}"
},
"info": {
"no_changes": "कोई परिवर्तन नहीं मिला।",
Expand All @@ -82,6 +83,7 @@
"custom_storage_path_set": "कस्टम स्टोरेज पाथ सेट किया गया: {{path}}",
"default_storage_path": "डिफ़ॉल्ट स्टोरेज पाथ का उपयोग पुनः शुरू किया गया",
"settings_imported": "सेटिंग्स सफलतापूर्वक इम्पोर्ट की गईं।",
"auto_import_success": "RooCode सेटिंग्स {{filename}} से स्वचालित रूप से आयात की गईं",
"share_link_copied": "साझा लिंक क्लिपबोर्ड पर कॉपी किया गया",
"image_copied_to_clipboard": "छवि डेटा URI क्लिपबोर्ड में कॉपी की गई",
"image_saved": "छवि {{path}} में सहेजी गई",
Expand Down
4 changes: 3 additions & 1 deletion src/i18n/locales/id/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@
},
"warnings": {
"no_terminal_content": "Tidak ada konten terminal yang dipilih",
"missing_task_files": "File tugas ini hilang. Apakah kamu ingin menghapusnya dari daftar tugas?"
"missing_task_files": "File tugas ini hilang. Apakah kamu ingin menghapusnya dari daftar tugas?",
"auto_import_failed": "Gagal mengimpor pengaturan RooCode secara otomatis: {{error}}"
},
"info": {
"no_changes": "Tidak ada perubahan ditemukan.",
Expand All @@ -82,6 +83,7 @@
"custom_storage_path_set": "Path penyimpanan kustom diatur: {{path}}",
"default_storage_path": "Kembali menggunakan path penyimpanan default",
"settings_imported": "Pengaturan berhasil diimpor.",
"auto_import_success": "Pengaturan RooCode berhasil diimpor secara otomatis dari {{filename}}",
"share_link_copied": "Link bagikan disalin ke clipboard",
"image_copied_to_clipboard": "Data URI gambar disalin ke clipboard",
"image_saved": "Gambar disimpan ke {{path}}",
Expand Down
4 changes: 3 additions & 1 deletion src/i18n/locales/it/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@
},
"warnings": {
"no_terminal_content": "Nessun contenuto del terminale selezionato",
"missing_task_files": "I file di questa attività sono mancanti. Vuoi rimuoverla dall'elenco delle attività?"
"missing_task_files": "I file di questa attività sono mancanti. Vuoi rimuoverla dall'elenco delle attività?",
"auto_import_failed": "Importazione automatica delle impostazioni RooCode fallita: {{error}}"
},
"info": {
"no_changes": "Nessuna modifica trovata.",
Expand All @@ -82,6 +83,7 @@
"custom_storage_path_set": "Percorso di archiviazione personalizzato impostato: {{path}}",
"default_storage_path": "Tornato al percorso di archiviazione predefinito",
"settings_imported": "Impostazioni importate con successo.",
"auto_import_success": "Impostazioni RooCode importate automaticamente da {{filename}}",
"share_link_copied": "Link di condivisione copiato negli appunti",
"image_copied_to_clipboard": "URI dati dell'immagine copiato negli appunti",
"image_saved": "Immagine salvata in {{path}}",
Expand Down
4 changes: 3 additions & 1 deletion src/i18n/locales/ja/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@
},
"warnings": {
"no_terminal_content": "選択されたターミナルコンテンツがありません",
"missing_task_files": "このタスクのファイルが見つかりません。タスクリストから削除しますか?"
"missing_task_files": "このタスクのファイルが見つかりません。タスクリストから削除しますか?",
"auto_import_failed": "RooCode設定の自動インポートに失敗しました:{{error}}"
},
"info": {
"no_changes": "変更は見つかりませんでした。",
Expand All @@ -82,6 +83,7 @@
"custom_storage_path_set": "カスタムストレージパスが設定されました:{{path}}",
"default_storage_path": "デフォルトのストレージパスに戻りました",
"settings_imported": "設定が正常にインポートされました。",
"auto_import_success": "RooCode設定が{{filename}}から自動インポートされました",
"share_link_copied": "共有リンクがクリップボードにコピーされました",
"image_copied_to_clipboard": "画像データURIがクリップボードにコピーされました",
"image_saved": "画像を{{path}}に保存しました",
Expand Down
4 changes: 3 additions & 1 deletion src/i18n/locales/ko/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@
},
"warnings": {
"no_terminal_content": "선택된 터미널 내용이 없습니다",
"missing_task_files": "이 작업의 파일이 누락되었습니다. 작업 목록에서 제거하시겠습니까?"
"missing_task_files": "이 작업의 파일이 누락되었습니다. 작업 목록에서 제거하시겠습니까?",
"auto_import_failed": "RooCode 설정 자동 가져오기 실패: {{error}}"
},
"info": {
"no_changes": "변경 사항이 없습니다.",
Expand All @@ -82,6 +83,7 @@
"custom_storage_path_set": "사용자 지정 저장 경로 설정됨: {{path}}",
"default_storage_path": "기본 저장 경로로 되돌아갔습니다",
"settings_imported": "설정이 성공적으로 가져와졌습니다.",
"auto_import_success": "{{filename}}에서 RooCode 설정을 자동으로 가져왔습니다",
"share_link_copied": "공유 링크가 클립보드에 복사되었습니다",
"image_copied_to_clipboard": "이미지 데이터 URI가 클립보드에 복사되었습니다",
"image_saved": "이미지가 {{path}}에 저장되었습니다",
Expand Down
4 changes: 3 additions & 1 deletion src/i18n/locales/nl/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@
},
"warnings": {
"no_terminal_content": "Geen terminalinhoud geselecteerd",
"missing_task_files": "De bestanden van deze taak ontbreken. Wil je deze uit de takenlijst verwijderen?"
"missing_task_files": "De bestanden van deze taak ontbreken. Wil je deze uit de takenlijst verwijderen?",
"auto_import_failed": "Automatisch importeren van RooCode-instellingen mislukt: {{error}}"
},
"info": {
"no_changes": "Geen wijzigingen gevonden.",
Expand All @@ -82,6 +83,7 @@
"custom_storage_path_set": "Aangepast opslagpad ingesteld: {{path}}",
"default_storage_path": "Terug naar standaard opslagpad",
"settings_imported": "Instellingen succesvol geïmporteerd.",
"auto_import_success": "RooCode-instellingen automatisch geïmporteerd van {{filename}}",
"share_link_copied": "Deellink gekopieerd naar klembord",
"image_copied_to_clipboard": "Afbeelding data-URI gekopieerd naar klembord",
"image_saved": "Afbeelding opgeslagen naar {{path}}",
Expand Down
4 changes: 3 additions & 1 deletion src/i18n/locales/pl/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@
},
"warnings": {
"no_terminal_content": "Nie wybrano zawartości terminala",
"missing_task_files": "Pliki tego zadania są brakujące. Czy chcesz usunąć je z listy zadań?"
"missing_task_files": "Pliki tego zadania są brakujące. Czy chcesz usunąć je z listy zadań?",
"auto_import_failed": "Nie udało się automatycznie zaimportować ustawień RooCode: {{error}}"
},
"info": {
"no_changes": "Nie znaleziono zmian.",
Expand All @@ -82,6 +83,7 @@
"custom_storage_path_set": "Ustawiono niestandardową ścieżkę przechowywania: {{path}}",
"default_storage_path": "Wznowiono używanie domyślnej ścieżki przechowywania",
"settings_imported": "Ustawienia zaimportowane pomyślnie.",
"auto_import_success": "Ustawienia RooCode zostały automatycznie zaimportowane z {{filename}}",
"share_link_copied": "Link udostępniania skopiowany do schowka",
"image_copied_to_clipboard": "URI danych obrazu skopiowane do schowka",
"image_saved": "Obraz zapisany w {{path}}",
Expand Down
4 changes: 3 additions & 1 deletion src/i18n/locales/pt-BR/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@
},
"warnings": {
"no_terminal_content": "Nenhum conteúdo do terminal selecionado",
"missing_task_files": "Os arquivos desta tarefa estão faltando. Deseja removê-la da lista de tarefas?"
"missing_task_files": "Os arquivos desta tarefa estão faltando. Deseja removê-la da lista de tarefas?",
"auto_import_failed": "Falha ao importar automaticamente as configurações do RooCode: {{error}}"
},
"info": {
"no_changes": "Nenhuma alteração encontrada.",
Expand All @@ -86,6 +87,7 @@
"custom_storage_path_set": "Caminho de armazenamento personalizado definido: {{path}}",
"default_storage_path": "Retornado ao caminho de armazenamento padrão",
"settings_imported": "Configurações importadas com sucesso.",
"auto_import_success": "Configurações do RooCode importadas automaticamente de {{filename}}",
"share_link_copied": "Link de compartilhamento copiado para a área de transferência",
"image_copied_to_clipboard": "URI de dados da imagem copiada para a área de transferência",
"image_saved": "Imagem salva em {{path}}",
Expand Down
Loading
Loading