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;
};
}