diff --git a/README.md b/README.md
index f69c18a..9701e0d 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.9.exe`
+产出:`release/Metona Ollama Setup v0.12.10.exe`
## 🛠️ 常用命令
@@ -507,7 +507,7 @@ npm start
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm run dist
```
-Output: `release/Metona Ollama Setup v0.12.9.exe`
+Output: `release/Metona Ollama Setup v0.12.10.exe`
## 🛠️ Common Commands
diff --git a/package-lock.json b/package-lock.json
index a263547..8590911 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "metona-ollama-desktop",
- "version": "0.12.9",
+ "version": "0.12.10",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "metona-ollama-desktop",
- "version": "0.12.9",
+ "version": "0.12.10",
"license": "MIT",
"dependencies": {
"ffmpeg-static": "^5.2.0",
diff --git a/package.json b/package.json
index d13d3fc..81a73dc 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "metona-ollama-desktop",
- "version": "0.12.9",
- "description": "Metona Ollama - TypeScript + Electron \u684c\u9762 AI \u804a\u5929\u5ba2\u6237\u7aef",
+ "version": "0.12.10",
+ "description": "Metona Ollama - TypeScript + Electron 桌面 AI 聊天客户端",
"main": "dist/main/main.js",
"author": "thzxx",
"license": "MIT",
@@ -73,5 +73,10 @@
"dependencies": {
"ffmpeg-static": "^5.2.0",
"sql.js": "^1.11.0"
+ },
+ "allowScripts": {
+ "electron@33.4.11": true,
+ "esbuild@0.21.5": true,
+ "ffmpeg-static@5.3.0": true
}
}
diff --git a/src/main/ipc.ts b/src/main/ipc.ts
index dfabb34..8e3daf0 100644
--- a/src/main/ipc.ts
+++ b/src/main/ipc.ts
@@ -279,12 +279,14 @@ export async function setupIPC(): Promise {
return { dir: getWorkspaceDir(), defaultDir: getWorkspaceDir() };
});
- // 设置工作空间目录
- ipcMain.handle('workspace:setDir', (_, dir: string) => {
- try {
- setWorkspaceDir(dir);
- return { success: true, dir: getWorkspaceDir() };
- } catch (err) {
+ // 设置工作空间目录
+ ipcMain.handle('workspace:setDir', (_, dir: string) => {
+ try {
+ setWorkspaceDir(dir);
+ // ── 持久化到 SQLite,重启后恢复 ──
+ saveSetting('workspaceDir', getWorkspaceDir());
+ return { success: true, dir: getWorkspaceDir() };
+ } catch (err) {
return { success: false, error: (err as Error).message };
}
});
@@ -344,6 +346,15 @@ export async function setupIPC(): Promise {
await initDatabase();
sendLog('success', '📦 SQLite 数据库已初始化');
+ // ── 恢复工作空间目录 ──
+ try {
+ const savedWsDir = getSetting('workspaceDir', '');
+ if (savedWsDir) {
+ setWorkspaceDir(savedWsDir);
+ sendLog('info', '📁 恢复工作空间目录', savedWsDir);
+ }
+ } catch { /* ignore */ }
+
// Sessions
ipcMain.handle('db:saveSession', (_, session) => {
try { return { success: true, id: saveSession(session) }; }
diff --git a/src/main/menu.ts b/src/main/menu.ts
index b707874..756692c 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.9',
+ message: 'Metona Ollama Desktop v0.12.10',
detail: 'TypeScript + Electron Ollama AI 聊天客户端\n\nhttps://gitee.com/thzxx/metona-ollama',
icon: getIconPath()
});
diff --git a/src/renderer/components/settings-modal.ts b/src/renderer/components/settings-modal.ts
index ea241e8..67bd1c1 100644
--- a/src/renderer/components/settings-modal.ts
+++ b/src/renderer/components/settings-modal.ts
@@ -288,6 +288,8 @@ export function initSettingsModal(): void {
if (result.success) {
showToast('工作空间目录已更新', 'success');
logSetting('工作空间目录', result.dir!);
+ // ── 通知工作空间面板刷新目录 ──
+ window.dispatchEvent(new CustomEvent('workspaceDirChanged', { detail: { dir: result.dir } }));
} else {
showToast(`设置失败: ${result.error!}`, 'error');
// 恢复原值
@@ -308,6 +310,16 @@ export function openSettingsModal(): void {
updateMemoryVectorStatus();
loadTimeoutSettings();
loadWatchdogSetting();
+ // 刷新工作空间目录显示
+ const bridge = window.metonaDesktop;
+ if (bridge?.isDesktop) {
+ const wsInput = document.querySelector('#inputWorkspaceDir') as HTMLInputElement;
+ if (wsInput) {
+ bridge.workspace.getDir().then((info: { dir: string }) => {
+ wsInput.value = info.dir;
+ }).catch(() => {});
+ }
+ }
}
/** 加载看门狗设置到输入框 */
diff --git a/src/renderer/components/workspace-panel.ts b/src/renderer/components/workspace-panel.ts
index 4916a4c..abba186 100644
--- a/src/renderer/components/workspace-panel.ts
+++ b/src/renderer/components/workspace-panel.ts
@@ -237,6 +237,26 @@ export async function initWorkspacePanel(): Promise {
// 绑定 UI 事件
bindEvents();
+ // ── 监听工作空间目录变更(来自设置面板)──
+ window.addEventListener('workspaceDirChanged', ((e: CustomEvent) => {
+ const newDir = e.detail?.dir;
+ if (newDir && newDir !== workspaceDir) {
+ workspaceDir = newDir;
+ currentFileDir = newDir;
+ logInfo('工作空间目录已刷新', newDir);
+ // 如果当前在文件页签,立即重新加载
+ if (activeTab === 'files') {
+ loadFiles(newDir);
+ }
+ // 刷新终端空闲状态中的目录显示
+ if (activeTab === 'terminal') {
+ renderTerminal();
+ }
+ // 刷新文件页签(即使不在当前 tab,下次切过去就是新路径)
+ renderPanel();
+ }
+ }) as EventListener);
+
// 创建唯一终端
terminal = {
id: genId(),
diff --git a/src/renderer/index.html b/src/renderer/index.html
index 99e035f..61b0914 100644
--- a/src/renderer/index.html
+++ b/src/renderer/index.html
@@ -28,7 +28,7 @@