diff --git a/README.md b/README.md
index 5b57c7a..f69c18a 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@
-
+
@@ -256,7 +256,7 @@ npm start
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm run dist
```
-产出:`release/Metona Ollama Setup v0.12.5.exe`
+产出:`release/Metona Ollama Setup v0.12.9.exe`
## 🛠️ 常用命令
@@ -507,7 +507,7 @@ npm start
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm run dist
```
-Output: `release/Metona Ollama Setup v0.12.5.exe`
+Output: `release/Metona Ollama Setup v0.12.9.exe`
## 🛠️ Common Commands
diff --git a/package-lock.json b/package-lock.json
index 68094e7..a263547 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "metona-ollama-desktop",
- "version": "0.12.5",
+ "version": "0.12.9",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "metona-ollama-desktop",
- "version": "0.12.5",
+ "version": "0.12.9",
"license": "MIT",
"dependencies": {
"ffmpeg-static": "^5.2.0",
diff --git a/package.json b/package.json
index b7ece6d..d13d3fc 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "metona-ollama-desktop",
- "version": "0.12.5",
+ "version": "0.12.9",
"description": "Metona Ollama - TypeScript + Electron \u684c\u9762 AI \u804a\u5929\u5ba2\u6237\u7aef",
"main": "dist/main/main.js",
"author": "thzxx",
diff --git a/src/main/ipc.ts b/src/main/ipc.ts
index 68cb9cd..dfabb34 100644
--- a/src/main/ipc.ts
+++ b/src/main/ipc.ts
@@ -130,6 +130,14 @@ export async function setupIPC(): Promise {
return result.filePath;
});
+ ipcMain.handle('dialog:openDirectory', async () => {
+ const result = await dialog.showOpenDialog(mainWindow!, {
+ properties: ['openDirectory']
+ });
+ if (result.canceled) return null;
+ return result.filePaths;
+ });
+
ipcMain.handle('fs:readFile', async (_, filePath: string) => {
try {
const check = checkPathAllowed(path.resolve(filePath), 'read');
diff --git a/src/main/menu.ts b/src/main/menu.ts
index 39a6c8c..b707874 100644
--- a/src/main/menu.ts
+++ b/src/main/menu.ts
@@ -101,7 +101,7 @@ export function createMenu(): void {
dialog.showMessageBox(mainWindow!, {
type: 'info',
title: '关于 Metona Ollama',
- message: 'Metona Ollama Desktop v0.12.5',
+ message: 'Metona Ollama Desktop v0.12.9',
detail: 'TypeScript + Electron Ollama AI 聊天客户端\n\nhttps://gitee.com/thzxx/metona-ollama',
icon: getIconPath()
});
diff --git a/src/main/preload.ts b/src/main/preload.ts
index 35bb05b..0211920 100644
--- a/src/main/preload.ts
+++ b/src/main/preload.ts
@@ -19,7 +19,8 @@ contextBridge.exposeInMainWorld('metonaDesktop', {
},
dialog: {
openFile: (options?: unknown) => ipcRenderer.invoke('dialog:openFile', options),
- saveFile: (options?: unknown) => ipcRenderer.invoke('dialog:saveFile', options)
+ saveFile: (options?: unknown) => ipcRenderer.invoke('dialog:saveFile', options),
+ openDirectory: () => ipcRenderer.invoke('dialog:openDirectory')
},
fs: {
readFile: (filePath: string) => ipcRenderer.invoke('fs:readFile', filePath),
diff --git a/src/renderer/components/settings-modal.ts b/src/renderer/components/settings-modal.ts
index 007e18c..ea241e8 100644
--- a/src/renderer/components/settings-modal.ts
+++ b/src/renderer/components/settings-modal.ts
@@ -267,12 +267,11 @@ export function initSettingsModal(): void {
btnBrowseWorkspace.addEventListener('click', async () => {
const bridge = window.metonaDesktop;
if (!bridge?.isDesktop) return;
- const paths = await bridge.dialog.openFile({
- filters: [{ name: '文件夹', extensions: ['*'] }]
- });
- // Electron openFile 对话框不能直接选文件夹,这里用 saveFile 代替
- // 或者让用户手动输入路径
- showToast('请在输入框中直接修改路径', 'info');
+ const paths = await bridge.dialog.openDirectory();
+ if (paths && paths.length > 0) {
+ inputWorkspaceDir.value = paths[0];
+ inputWorkspaceDir.dispatchEvent(new Event('blur'));
+ }
});
// 双击输入框解锁编辑
inputWorkspaceDir.addEventListener('dblclick', () => {
diff --git a/src/renderer/index.html b/src/renderer/index.html
index 6002790..99e035f 100644
--- a/src/renderer/index.html
+++ b/src/renderer/index.html
@@ -28,7 +28,7 @@