diff --git a/dashboard/src/components/chat/ProjectDialog.vue b/dashboard/src/components/chat/ProjectDialog.vue index 3a00d5451..c08069fc9 100644 --- a/dashboard/src/components/chat/ProjectDialog.vue +++ b/dashboard/src/components/chat/ProjectDialog.vue @@ -13,7 +13,20 @@ + :label="tm('project.workspace.path')" variant="outlined" hide-details class="mb-1"> + + import { computed, ref, watch } from 'vue'; import { useI18n, useModuleI18n } from '@/i18n/composables'; +import { getDesktopRuntimeInfo } from '@/utils/desktopRuntime'; export type WorkspaceType = 'session' | 'project' | 'custom'; @@ -83,6 +97,8 @@ const { tm } = useModuleI18n('features/chat'); const isOpen = ref(props.modelValue); const isEditing = ref(false); +const canPickWorkspaceDirectory = ref(false); +const pickingWorkspaceDirectory = ref(false); const form = ref({ emoji: '📁', title: '', @@ -101,8 +117,9 @@ const canSave = computed(() => { return form.value.workspace_path.trim().length > 0; }); -watch(() => props.modelValue, (newVal) => { +watch(() => props.modelValue, async (newVal) => { isOpen.value = newVal; + canPickWorkspaceDirectory.value = false; if (newVal) { if (props.project) { isEditing.value = true; @@ -123,6 +140,10 @@ watch(() => props.modelValue, (newVal) => { workspace_path: '' }; } + + const runtimeInfo = await getDesktopRuntimeInfo(); + canPickWorkspaceDirectory.value = runtimeInfo.isDesktopRuntime && + typeof runtimeInfo.bridge?.pickDirectory === 'function'; } }); @@ -141,6 +162,25 @@ function handleCancel() { emit('update:modelValue', false); } +async function handlePickWorkspaceDirectory() { + const pickDirectory = window.astrbotDesktop?.pickDirectory; + if (!canPickWorkspaceDirectory.value || !pickDirectory || pickingWorkspaceDirectory.value) { + return; + } + + pickingWorkspaceDirectory.value = true; + try { + const selectedPath = await pickDirectory(form.value.workspace_path || null); + if (selectedPath) { + form.value.workspace_path = selectedPath; + } + } catch (error) { + console.warn('[chat-project] Failed to pick workspace directory.', error); + } finally { + pickingWorkspaceDirectory.value = false; + } +} + function handleSave() { if (!canSave.value) { return; diff --git a/dashboard/src/i18n/locales/en-US/features/chat.json b/dashboard/src/i18n/locales/en-US/features/chat.json index 2929fee73..d20c7e6e2 100644 --- a/dashboard/src/i18n/locales/en-US/features/chat.json +++ b/dashboard/src/i18n/locales/en-US/features/chat.json @@ -170,7 +170,8 @@ "session": "Per-session workspace", "project": "Shared project workspace", "custom": "Custom path", - "path": "Workspace path" + "path": "Workspace path", + "selectPath": "Select folder" }, "loadingSessions": "Loading conversations...", "noSessions": "No conversations in this project", diff --git a/dashboard/src/i18n/locales/ja-JP/features/chat.json b/dashboard/src/i18n/locales/ja-JP/features/chat.json index f694ee822..f5f3e6462 100644 --- a/dashboard/src/i18n/locales/ja-JP/features/chat.json +++ b/dashboard/src/i18n/locales/ja-JP/features/chat.json @@ -170,7 +170,8 @@ "session": "セッションごとに分離", "project": "プロジェクト共有ワークスペース", "custom": "カスタムパス", - "path": "ワークスペースのパス" + "path": "ワークスペースのパス", + "selectPath": "フォルダーを選択" }, "loadingSessions": "会話を読み込み中…", "noSessions": "このプロジェクトには会話がありません", diff --git a/dashboard/src/i18n/locales/ru-RU/features/chat.json b/dashboard/src/i18n/locales/ru-RU/features/chat.json index 3dc959104..b5a33ea67 100644 --- a/dashboard/src/i18n/locales/ru-RU/features/chat.json +++ b/dashboard/src/i18n/locales/ru-RU/features/chat.json @@ -170,7 +170,8 @@ "session": "Отдельно для каждого чата", "project": "Общая область проекта", "custom": "Пользовательский путь", - "path": "Путь рабочей области" + "path": "Путь рабочей области", + "selectPath": "Выбрать папку" }, "loadingSessions": "Загрузка диалогов...", "noSessions": "В этом проекте пока нет диалогов", diff --git a/dashboard/src/i18n/locales/zh-CN/features/chat.json b/dashboard/src/i18n/locales/zh-CN/features/chat.json index aefedad1f..e0af88943 100644 --- a/dashboard/src/i18n/locales/zh-CN/features/chat.json +++ b/dashboard/src/i18n/locales/zh-CN/features/chat.json @@ -170,7 +170,8 @@ "session": "按会话分开", "project": "项目共享工作区", "custom": "自定义路径", - "path": "工作区路径" + "path": "工作区路径", + "selectPath": "选择文件夹" }, "loadingSessions": "加载对话中...", "noSessions": "该项目暂无对话", diff --git a/dashboard/src/types/desktop-bridge.d.ts b/dashboard/src/types/desktop-bridge.d.ts index 234da42ec..15db9d786 100644 --- a/dashboard/src/types/desktop-bridge.d.ts +++ b/dashboard/src/types/desktop-bridge.d.ts @@ -46,6 +46,7 @@ declare global { ok: boolean; reason: string | null; }>; + pickDirectory?: (defaultPath?: string | null) => Promise; onTrayRestartBackend?: (callback: () => void) => () => void; }; }