CHANGELOG

更新日志

每个版本的详细变更记录,包含新功能、缺陷修复与体验优化。

版本索引

  • v2.1.13 — JSON 格式化全面修复(MD 代码块树形 + 模式切换不失效 + processJsonCodeBlocks 统一)
  • v2.1.12 — JSON 树形三处渲染路径统一 + setMode 跳过非 Markdown 渲染
  • v2.1.11 — 小文档 BOM 检测修复(BOM 移到 UTF-8 纯解码之前)
  • v2.1.10 — JSON 预览实时更新修复(setPreviewVisible + renderCurrentPreviewAsync)
  • v2.1.9 — JSON 宽松解析 + 录屏 captureStream 修复
  • v2.1.8 — JSON 格式化预览新增 + 小文件编辑器同步修复
  • v2.1.7 — 版本自升级修复(check_update + 更新对话框)
  • v2.1.6 — 录屏鼠标可操作性修复(click-through + Alt+M 停止)
  • v2.1.4 — 版本自升级缺陷修复(后端 version.json + 前端更新对话框)
  • v2.1.3 — 录屏功能稳定性加固(多次录制失败 + 默认桌面捕获 + 保存清理)
  • v2.1.2 — 截图保存后再次截图失败修复 + 文字大小可调
  • v2.1.1 — 截图选区边界约束(选区框越界难以选中)
  • v2.1.0 — 录屏功能稳定性加固(多次录制失败 + 桌面选择器 + 状态清理)
  • v2.0.9 — 知识库智能管理故障排查与稳定性增强
  • v2.0.8 — AI 忠实性强约束 + 反幻觉机制
  • v2.0.7 — 启动授权弹窗修复(WMI 缓存预热 + 超时放宽)
  • v2.0.6 — 截图/录屏健壮性加固(黑窗 + 遮罩挡鼠标 + 录屏选择器)
  • v2.0.5 — 截图核心缺陷彻底修复(多次截图失败 + 保存后卡死)
  • v2.0.3 — 截图架构重构 + 防卡死保障 + 图表修复
  • v2.0.2 — 截图标注 + 录屏 + OCR + 独立窗口无感触发
  • v2.0.1 — 图谱修复 + 轻量绘图 + AI增强 + 代码高亮 + 导出优化 + DeepSeek接入
  • v1.8.107 — 阅读模式不弹AI菜单 + 工作区外部新增文件自动刷新 + .key文件正常显示 + 代码语法高亮
  • v1.8.106 — 文档切换编辑位置保留 + 外部编辑器异步编辑冲突检测 + 重新加载强制读磁盘
  • v1.8.105 — 全局搜索中文 MD「打不开/没内容」空白屏·三重修复
  • v1.8.104 — 安装后启动失败(前端资源缺失)紧急修复·双重保险
  • v1.8.103 — 原生另存为 + 路径查看 + DOCX/RTF/ODT 正文提取
  • v1.8.102 — 其他电脑安装后 HTTP 404 白屏紧急修复
  • v1.8.101 — 全格式导出质量升级 & Frontmatter 不再外漏
  • v1.8.100 — 启动红屏 SyntaxError 紧急修复
  • v1.8.99 — 阅读栏/阅读模式公式/图表全面修复
  • v1.8.98 — PDF 导出大升级
  • v1.8.97 — 编辑器字体优化 + 字号快捷键修复
  • v1.8.96 — 代码文件保存最终修复 + 工作区视图
  • v1.8.95 — 工作区视图重写 + 基础保存修复
  • v1.8.94 — 工作区与编辑器增强
  • v1.8.93 — 界面与体验升级 + 性能优化

v2.1.13 · JSON 格式化全面修复

  • MD 中 JSON 代码块自动渲染树形视图:renderMarkdown 新增 JSON 代码块分支,生成带 data-json-raw 属性的容器;processJsonCodeBlocks 统一后处理函数在阅读模式、编辑模式预览、chunked 分片渲染三个路径都调用,遍历 .json-code-block 调用 renderJsonTree 替换为可折叠树形视图。
  • 编辑/阅读模式切换格式化不再失效:renderCurrentPreviewNow(同步渲染)新增 JSON 分支:canPreviewAsJson() 时直接调 renderJsonTree 渲染树形,不再走 cachedRenderMarkdown 把 JSON 当 Markdown 渲染。
  • renderJsonTree 三级宽松解析:严格 JSON.parse → repairJson(去注释/补引号/去尾逗号)→ extractFirstJsonObject(从混合文本提取 JSON 并自动补全缺失括号)。
  • looksLikeJson 正则修复:s* 修正为 \s*,修复 txt/log 文件 JSON 内容检测。
  • chunked 渲染路径 JSON 后处理:renderReaderContentChunked 单片和多片路径都增加 processJsonCodeBlocks 调用。

v2.1.12 · JSON 树形三处渲染路径统一 + setMode 跳过非 Markdown 渲染

  • openDoc 同时渲染到 preview + markdownView:JSON 树形原本只渲染到 els.preview(编辑模式可见),阅读模式切换后看不到内容。修复后同步渲染到 els.markdownView,保证两个模式都能看到。
  • JSON 降级路径和其他代码文件也同步到 markdownView:renderCodePreview 降级路径和其他非 Markdown 文件都额外渲染到 els.markdownView。
  • setMode('view') 跳过非 Markdown 的 renderReaderContent:非 Markdown 文件 + markdownView 已有内容时只恢复滚动位置,不再走 renderReaderContent 把 JSON 当 Markdown 解析输出纯 <pre><code>。
  • MD 中 JSON 代码块新增特殊标记:renderMarkdown 的 else if (normalizedLang === "json") 分支生成 <div class="code-block json-code-block" data-json-raw="..."> 容器。

v2.1.11 · 小文档 BOM 检测修复

  • BOM 检测顺序修复(app.rs decode_bytes_smart):原代码 UTF-8 纯解码(std::str::from_utf8)排在 BOM 检测之前,UTF-8 BOM(EF BB BF)是合法 UTF-8 字节序列所以解码成功,但 U+FEFF 字符被当作内容开头保留,导致 looksLikeJson 检测失败和 JSON.parse 失败。修复:BOM 5 种检测(UTF-8/16LE/16BE/32LE/32BE)全部移到 UTF-8 纯解码之前,先剥离 BOM 字节再解码 body。
  • 影响范围:中文 Windows 记事本、WPS 等编辑器保存小文件时默认写入 UTF-8 BOM,修复后 encoding: utf-8-bom,首字节 123 = {(BOM 已剥离)。

v2.1.10 · JSON 预览实时更新修复

  • setPreviewVisible 不再强制禁用 JSON 文件:原代码 !state.currentIsMarkdown 就强制隐藏预览面板,修复为 !state.currentIsMarkdown && !canPreviewAsJson()。
  • 预览按钮不再禁用 JSON 文件:previewToggleBtn.disabled 条件增加 !canPreviewAsJson()。
  • renderCurrentPreviewAsync 增加 JSON 分支:编辑器输入时实时更新树形视图,不再只走 cachedRenderMarkdown。
  • 新增 canPreviewAsJson 辅助函数:检测 .json/.jsonc/.json5 扩展名,以及 .txt/.log 文件内容疑似 JSON(looksLikeJson)。

v2.1.9 · JSON 宽松解析 + 录屏 captureStream 修复

  • parseJsonLenient 三级解析策略:严格 JSON.parse → repairJson(未加引号 key、单引号字符串、尾随逗号、JS 注释)→ extractFirstJsonObject(从混合文本如 HTTP 日志中自动提取 JSON 对象,自动补全缺失括号)。
  • .txt/.log 文件自动检测 JSON 内容:通过 looksLikeJson 判断内容是否包含 JSON 结构,是则尝试树形渲染。
  • 宽松解析提示条:内容经过修复/提取时显示橙色提示。
  • 录屏 captureStream 修复(recorder.html):outCanvas 加入 DOM(position:absolute; left:-99999px),确保 WebView2 中 captureStream 稳定产生帧,解决录制黑屏/无画面问题。
  • 录屏提示条 3 秒后自动淡出:避免被 xcap 捕获进录屏画面,用户仍可通过 Alt+M 停止录制。

v2.1.8 · JSON 格式化预览新增 + 小文件编辑器同步修复

  • JSON 树形视图新增(app.js + styles.css):renderJsonTree + renderJsonNode 实现 bejson 风格可折叠树形视图,类型颜色标记(紫色 key、绿色 string、蓝色 number、红色 boolean、灰色 null)。亮/暗主题自动适配。
  • 小文件编辑器内容同步修复:打开大文件后立即打开小文件时编辑器有时显示大文件内容。修复:requestAnimationFrame 中调 els.editor.view.dispatch 强制刷新 CodeMirror 内容。
  • JSON 解析失败降级:renderJsonTree 返回 null 时自动降级到 renderCodePreview 普通代码高亮。
  • 代码预览重构:提取 renderCodePreview 可复用函数。

v2.1.7 · 版本自升级修复

  • 后端 check_update 使用本地 version.json(handlers.rs + ipc.rs):原代码使用编译时 CARGO_PKG_VERSION,与关于页显示版本不一致。修复:新增 read_local_version_json 和 read_local_version_string 辅助函数,check_update 读取本地 version.json 的版本号。
  • 前端更新对话框(app.js + index.html + styles.css):checkUpdateBtn 重写,捕获 check_update 响应:upToDate=false 弹出更新对话框("立即下载"通过 /api/open-url 打开浏览器下载 + "稍后提醒"按钮);upToDate=true 提示"已是最新版本"。

v2.1.6 · 录屏鼠标可操作性修复

  • 录屏窗口 click-through(global_capture.rs + recorder.html):新增 IPC 命令 recorder_set_ignore_cursor,录制时让录屏窗口鼠标穿透(click-through),用户可正常操作底层软件。停止录制弹出保存对话框时恢复交互。
  • 停止录制改为 Alt+M 热键:click-through 后停止按钮不可点击,改用 Alt+M 全局热键停止录制。
  • Browse 文件夹按钮修复:PowerShell FolderBrowserDialog 替换为 Tauri dialog 插件的 pick_folder,通过新 IPC 命令 recorder_browse_folder 调用。
  • 默认保存路径:确认工作区根目录的 Videos 目录(如 C:\Users\fshby\dos\Videos)。

v2.1.4 · 版本自升级缺陷修复

  • 后端 check_update 读取 version.json(handlers.rs):原 check_update 使用编译时 CARGO_PKG_VERSION 作为当前版本号,与关于页显示的版本号不一致(关于页读 version.json)。修复:改为读取本地 version.json 的版本号,与关于页保持一致。
  • 新增 read_local_version_json / read_local_version_string(ipc.rs):辅助函数读取并解析 version.json。
  • 前端捕获 check_update 响应(app.js):checkUpdateBtn 重写:upToDate=false 弹出更新对话框,提供"立即下载"(通过 /api/open-url 打开浏览器下载)和"稍后提醒"按钮;upToDate=true 提示"已是最新版本"。
  • 更新对话框 UI(index.html + styles.css):新增 .update-dialog 模态框和样式。

v2.1.3 · 录屏功能稳定性加固

  • 缺陷1修复(录制源未默认桌面):startRecording() 调用 api_start_native_record 前先调用 api_stop_native_record 确保上次录屏状态完全释放,防止 RecordState 残留导致 start_native_record 返回"录屏已在进行中" → 前端降级到 getDisplayMedia 弹出桌面选择器。
  • 缺陷2修复(多次录制失败):
    • 后端 start_native_record 新增 3 次重试 + DXGI 恢复延迟(每次等待 300/600ms):DXGI Desktop Duplication 在上次录屏停止后可能需要短暂恢复时间,第一次 video_recorder() 或 recorder.start() 可能失败,重试后即可成功。
    • 前端 startRecording() 调用 api_start_native_record 失败后等待 1 秒再重试一次,两次都失败才降级到 getDisplayMedia。
    • start_native_record 入口检测 RecordState 残留时强制清理 + 等待 500ms 让 DXGI 资源释放,而不是直接报错。
  • 缺陷3修复(保存与清理):stopRecording 中 FileReader 添加 10s 超时保护,超时走 closeRecorderWindow 兜底释放窗口和锁。handle_recorder_result 保存成功后已清理背景帧临时文件 + 释放锁 + 停止原生录屏。
  • 健壮性增强:
    • stop_native_record 用 catch_unwind 防止 recorder.stop() panic 卡住锁。
    • close_recorder_window 兜底调用 stop_native_record 释放 RecordState。
    • handle_recorder_result 保存失败也释放锁和状态,防止卡住。
  • 不影响其他功能:仅修改 global_capture.rs 和 recorder.html。截图、AI、知识库管理不受影响。无遮罩干扰。

v2.1.2 · 截图保存后再次截图失败修复 + 文字大小可调

  • 缺陷修复(screenshot.html confirmEdit):截图保存后再次截图失败。
  • 根因:confirmEdit 中 bgImg/tagCounter/currentTool/currentWidth 等关键变量未重置;FileReader.onload 为异步回调,若 readAsDataURL 卡住或失败,窗口和截图锁永不释放,导致下次截图被锁阻塞。
  • 修复:
    • confirmEdit 完整重置所有全局变量(bgImg/scaleX/scaleY/bgImgWidth/bgImgHeight/tagCounter/currentTool/currentColor/currentWidth/currentFontSize)。
    • toBlob 添加 5s 超时保护:Promise.race 竞争 toBlob 和 setTimeout,防止 Canvas 污染导致 toBlob 永不回调。
    • FileReader 添加 5s 超时保护 + onerror 回调:超时或出错时走 closeWindow 兜底释放锁和窗口。
    • drawImage 添加 try-catch:防止 bgImg/annoCanvas 异常时抛错导致后续清理代码不执行。
    • 健壮性检查:confirmEdit 入口检查 region/bgImg/annoCanvas/scaleX/scaleY 是否有效,无效时直接 cleanupAndClose。
    • cleanupAndClose 也完整重置所有变量(含 bgImg/scaleX/scaleY/tagCounter/currentFontSize 等)。
  • 新功能(文字大小可调):
    • 新增 FONT_SIZES = [14, 18, 24, 32] 四档字体大小。
    • 工具栏新增字体大小按钮区域,点击切换字体大小,选中高亮。
    • showTextInput 使用 currentFontSize 替代硬编码 16px。
    • 文字标注创建使用 currentFontSize 替代硬编码 18。
    • 编辑文字时切换字体大小可实时同步到输入框。
  • 不影响其他功能:仅修改 screenshot.html。录屏功能、AI 功能、知识库管理不受影响。无遮罩干扰。

v2.1.1 · 截图选区边界约束(选区框越界难以选中)

  • 缺陷修复(screenshot.html):自定义截图区域过大靠近屏幕边界时选区框出现在边界外难以选中。
  • 根因:startRegionSelection 的 onDown 直接 startX = curX = e.clientX、onMove 直接 curX = e.clientX,鼠标坐标未经任何边界约束。当用户拖拽到屏幕边缘/外时,选区框坐标超出视口范围(负值或超过 innerWidth/innerHeight),选区框部分或全部跑到屏幕外,用户难以选中框边缘进行操作。
  • 修复:
    • onDown:startX/curX 用 Math.max(0, Math.min(e.clientX, window.innerWidth)) 约束;startY/curY 同理。
    • onMove:curX/curY 用同样的 clamp 约束,确保拖拽过程中选区框始终在视口内。
    • onUp:最终 region 对象也 clamp(x 不超过 innerWidth-w,y 不超过 innerHeight-h)作为防御性保底。
    • 工具提示(tooltip)位置也 clamp 到视口内(left 不超过 innerWidth-120,top 不超过 innerHeight-30)。
  • 健壮性增强:三层边界约束(onDown + onMove + onUp),任一层失效也有下一层保底。工具提示不会跑到屏幕外不可见。
  • 不影响其他功能:仅修改 screenshot.html 的 startRegionSelection 函数内 onDown/onMove/onUp 和 draw 的 tooltip 位置逻辑。录屏功能、AI 功能、知识库管理不受影响。无遮罩干扰(截图窗口已有 always_on_top + 透明 + 全屏覆盖,选区框在 canvas 内绘制不会遮挡鼠标)。

v2.1.0 · 录屏功能稳定性加固(多次录制失败 + 桌面选择器 + 状态清理)

  • 第二次及后续录制失败修复(global_capture.rs + recorder.html):根因为 show_recorder_window 复用已有录屏窗口时仅 set_always_on_top + unminimize + show,不 reload 页面。前端 recording/recorder/chunks/region 等变量残留上次录屏状态,DOM 已被 document.body.innerHTML='' 清空,init() 不再执行 → 用户看到空白窗口无法操作;或 api_start_native_record 因前端状态错乱失败 → 降级到 getDisplayMedia 弹出桌面/窗口选择器。修复:复用窗口时 eval window.location.href='recorder.html?_t=时间戳' 重新加载页面,确保 init() 重新执行、所有 JS 变量重置。
  • 录屏默认录桌面不弹选择器修复:根因同上。RecordState 残留为 Some 导致 start_native_record 返回「录屏已在进行中」→ 前端降级到 getDisplayMedia 弹出选择器。修复后窗口 reload 确保前端状态干净,api_start_native_record 成功走 xcap DXGI 桌面捕获(无选择器)。close_recorder_window 已有的 stop_native_record 兜底 + 新增页面 reload 双重保险确保 RecordState 不残留。
  • stop_native_record 健壮性增强(global_capture.rs):原代码 state.recorder.stop() 可能阻塞或 panic,如果 panic 会卡住 Mutex 锁导致后续所有录屏操作死锁。修复:用 std::panic::catch_unwind(AssertUnwindSafe) 包裹 recorder.stop(),即使 panic 也确保 guard.take() 已移除 RecordState,锁正常释放。
  • handle_recorder_result 保存后清理 + 健壮性:保存成功后执行 stop_native_record + release_record_lock + 清理 pending_record_bg 临时文件 + emit recorder-saved 事件(含 path/filename/size)。保存失败也释放锁和状态防止卡住。新增空内容校验:bytes.is_empty() 时跳过保存返回错误。
  • close_recorder_window 页面重置:关闭窗口后 eval 导航到 about:blank,下次 show_recorder_window 复用时 reload 到 recorder.html 获得干净状态。
  • 前端状态完整重置(recorder.html):cleanupAndClose 完整重置 recording/timerInterval/recorder(MediaRecorder.stop)/chunks/overlay/canvas/ctx/outCanvas/outCtx/frameImg/bgImg/region/elapsed 全部变量。stopRecording 保存 recorder/chunks 到临时变量 savedRecorder/savedChunks,保存完成后 recorder=null/chunks=[] 清理引用;FileReader.onerror 也走 cleanupAndClose 防止卡住。等待最后一帧从 200ms 增加到 300ms 确保数据完整性。
  • 不影响其他功能:仅修改 show_recorder_window/close_recorder_window/stop_native_record/handle_recorder_result 后端函数和 recorder.html 前端 cleanupAndClose/stopRecording 函数。截图功能、AI 功能、知识库管理不受影响。无遮罩干扰(已有 always_on_top(false) + minimize + hide + 移出屏幕 多重保险)。

v2.0.9 · 知识库智能管理故障排查与稳定性增强

  • ai_reindex 内存浪费修复(handlers.rs):原代码在更新 state.chunks 时执行 *chunks_ref = all_chunks.clone(),万级 chunk 场景下 clone 全量拷贝几十 MB 堆数据后再丢弃原 vec,造成无谓内存峰值。修复:改为 std::mem::take(&mut all_chunks) 零拷贝转移所有权。
  • ai_reindex 静默吞错修复(handlers.rs):原代码 read_file_force 失败时 Err(_) => continue,既不记日志也不计数,用户无法知道哪些文件被跳过。修复:改为 Err(e) => log::warn 记录失败文件路径和错误 + skipped += 1;同时新增内容为空检查,空文件也跳过并计数。响应新增 skipped 和 totalFiles 字段,前端 Toast 显示「X/Y 文件跳过」。
  • ai_reindex 进度反馈修复(handlers.rs):原代码 progress 字段在全量重建过程中从未更新(status() 返回的 progress 始终为 0,0),前端无法获知进度。修复:重建开始时设 (0, total_files),逐文件递增 done,每 10 文件 log::info 输出进度,完成后设 (total, total)。
  • DeepSeek/Ollama 错误响应切片 panic 修复(rag.rs):原代码 &text[..text.len().min(500)] 在错误响应包含多字节 UTF-8 字符时,500 字节位置可能落在字符中间导致 panic(与之前中文切片 bug 同类)。修复:chat_with_deepseek 和 chat_with_ollama 均改为 text.chars().take(500).collect::<String>(),按字符边界安全截断。
  • lexical_search 性能优化(rag.rs):原代码在 O(chunks × unique_tokens) 双重循环中,每个 token 对每个 chunk 反复调用 chunk.title.to_lowercase() / heading / text,导致同一 chunk 被重复 lowercase 多次。修复:预计算 title_lower / heading_lower / text_lower 一次,循环内直接 contains 查找,降低 String 分配次数从 O(chunks × tokens) 到 O(chunks)。
  • 并发安全(handlers.rs):ai_reindex 入口新增 progress 检查:若 total > 0 && done < total,直接返回 { ok: false, error: '索引重建正在进行中' },防止用户快速点击或前端重试导致并发重建。
  • 前端改进(app.js):aiReindexBtn 点击处理器增强:检测 result.ok === false 显示并发拒绝提示;正常路径 Toast 显示分块数、文档数、跳过数。
  • 不影响其他功能:仅修改 ai_reindex / lexical_search / chat_with_deepseek / chat_with_ollama 和前端 aiReindexBtn 处理器,不改变 API 路由结构、请求格式、响应基本结构(仅新增可选字段)。其他功能(截图/录屏/授权/AI 文本加工)不受影响。

v2.0.8 · AI 忠实性强约束 + 反幻觉机制

  • 选中文本加工忠实性约束(新增 AI_FAITHFULNESS_RULE):适用模式 polish/rewrite/summary/keypoints/terms/comment。五重约束:① 严格基于原文:禁止编造/臆测/补充原文中不存在的事实、数据、引用、人名、日期、结论;禁止引入训练数据中的「常识」填补原文未提及的内容;信息不足时标注「【注意】原文中缺少XXX信息,已跳过」。② 不得篡改核心语义:可调整措辞与语序,但不得改变事实判断/观点立场/因果关系/数量关系(原文「可能」不得改「必然」,「A导致B」不得改「B导致A」)。③ 不得删减关键信息:可精简冗余表述,但不得删除关键事实/数据/条件/前提/限定词。④ 反幻觉自检:输出前逐句自问「这句话的信息是否直接来自原文?」若否则删除或替换为忠实转述。⑤ 用户自定义要求即硬边界。
  • 翻译模式忠实性强化:新增 4 条忠实性约束(译文不得擅自增加原文没有的信息;不得删减原文关键信息——每段每句每个术语必须有对应译文;不得篡改原文条件/因果/程度/时态等限定关系;逐句对照自检——原文几句译文几句)。自检提示从「有没有非目标语言字」扩展为「① 有没有非目标语言字 ② 有没有增删原文信息」。
  • 用户自定义要求硬边界化:所有模式的用户 instruction 从「用户额外要求:...」升级为「【用户自定义要求 — 硬边界,必须严格执行,不得偏离】」。inline-chat 新增「用户指令即硬边界」system prompt:用户设定的风格/字数/格式/视角/禁用词必须严格执行,不得以「更好」为由偏离;用户请求与文档上下文矛盾时以用户请求为准。
  • RAG 知识库反幻觉强化:新增 4 条反幻觉强约束:只能基于检索到的文档片段回答,不得引入训练数据外部信息;无相关信息时必须如实说明「检索到的文档中未包含相关内容」,不得编造;不得将碎片信息拼接臆测为完整结论;回答引用来源编号 [n] 可溯源验证。
  • 不影响其他功能:仅修改 AI system/user prompt 构造逻辑,不改变 API 路由/请求格式/响应结构/前端 UI。

v2.0.7 · 启动授权弹窗修复(WMI 缓存预热 + 超时放宽)

  • 启动未授权弹窗几秒后自动消失(缺陷修复):软件每次启动后弹出「未授权」窗口,等待几秒后自动消失。根因:首次调用 /api/license/check 时,后端 verify_license 需通过 PowerShell 查询 WMI 获取硬件标识(Win32_Processor.ProcessorId、Win32_DiskDrive.SerialNumber、Win32_BaseBoard.SerialNumber、Win32_ComputerSystemProduct.UUID)和操作系统安装时间(Win32_OperatingSystem.InstallDate),单次查询耗时 2~5 秒。这些值虽有进程内缓存,但进程启动时缓存为空。前端 LICENSE_NET_TIMEOUT_MS=1500ms 超时导致 Promise.race 先返回 timeout,误判为未授权并弹出窗口;随后后台请求完成、缓存就绪,下一次 1.5s 轮询命中缓存才清除弹窗。
  • 后端预热缓存:license.rs 新增 pub fn prewarm_caches(),调用 get_machine_code()(触发 WMI 查询,写入 HARDWARE_CACHE + MACHINE_CODE_CACHE)和 get_system_reference_time()(触发 OS 安装时间查询,写入 SYSTEM_REF_TIME_CACHE)。lib.rs::run() 在 env_logger::init() 之后立即 std::thread::spawn 专用 OS 线程调用 prewarm_caches(),不阻塞启动流程。前端发起授权检查时缓存已就绪,verify_license 走缓存路径微秒级返回。
  • 前端超时放宽:LICENSE_NET_TIMEOUT_MS 从 1500ms 调整为 3000ms,为慢机器/首次冷启动留足余量(正常响应 <100ms,3s 仅为极端兜底)。
  • 不影响其他功能:prewarm_caches 仅在后台线程执行,不阻塞启动流程;超时放宽只影响授权检查,不改变其他 API 行为。

v2.0.6 · 截图/录屏健壮性加固(黑窗 + 遮罩挡鼠标 + 录屏选择器)

  • 截图勾选✓弹黑色命令窗口(缺陷修复):截图区域勾选✓确认后屏幕闪现黑色 PowerShell/CMD 控制台窗口。根因:copy_image_to_clipboard 与 OCR 识别使用 std::process::Command::new("powershell") 启动子进程,未设置 CREATE_NO_WINDOW 标志,Windows 默认为控制台程序分配可见窗口。修复:两处 PowerShell 调用统一补 .creation_flags(0x08000000)(CREATE_NO_WINDOW),子进程不再弹黑窗。
  • 录屏后遮罩残留挡住鼠标(缺陷修复):录屏结束/取消后录屏遮罩窗口仍覆盖屏幕,鼠标无法点击桌面与其他软件。根因:recorder.html 的 closeRecorderWindow() 调用 /api/screenshot/close,该端点执行 close_screenshot_window 只关闭截图窗口;录屏窗口(label=recorder)保持 always_on_top 可见,导致鼠标被遮挡。修复:新增独立 HTTP 端点 POST /api/recorder/close,执行 close_recorder_window 真正关闭录屏窗口(取消置顶→最小化→隐藏→移出屏幕);recorder.html 改用 /api/recorder/close + IPC recorder_window_close 双重关闭。
  • 录屏默认不录系统桌面弹选择器(缺陷修复):录屏时不默认录制系统桌面,而是弹出 getDisplayMedia 桌面/窗口选择器让用户选择。根因:取消/异常退出录屏时 cleanupAndClose() 未调用 api_stop_native_record,RecordState 残留为 Some;下一次 start_native_record 返回"录屏已在进行中"错误,前端降级到 navigator.mediaDevices.getDisplayMedia 弹出选择器。修复:close_recorder_window 兜底调用 stop_native_record 释放 RecordState;cleanupAndClose 显式调用 api_stop_native_record;确保任何关闭路径都释放原生录屏状态,下次直接走 xcap DXGI 桌面捕获(无选择器)。
  • 健壮性增强:新增 POST /api/recorder/result HTTP 降级端点(先关窗口再 spawn_blocking 后台保存),IPC 失败时录屏文件不丢失;recorder.html 停止录屏结果保存走 IPC recorder_result,失败降级 HTTP /api/recorder/result;close_recorder_window 统一兜底停止原生录屏 + 释放锁 + 多重保险隐藏窗口。

v2.0.5 · 截图核心缺陷彻底修复(多次截图失败 + 保存后卡死)

  • 多次截图失败根因修复:resetScreenshotUI() 中 const overlay = document.getElementById('screenshotOverlay') 声明了局部常量,遮蔽了全局 let overlay。随后 overlay = null 尝试给 const 赋值,在 ES Module 严格模式下抛出 TypeError,导致 loadAndShow 中断、isActive 卡在 true、轮询永久停止。修复:局部变量重命名为 oldOverlay/oldOcrModal,不再遮蔽全局。
  • 保存后卡死根因修复:screenshot_result IPC 处理函数同步调用 handle_screenshot_result,其中 PowerShell 剪贴板操作阻塞 async runtime 1-3 秒。修复:改用 tauri::async_runtime::spawn_blocking 在独立线程执行保存/剪贴板操作,IPC 立即返回。
  • 新增 HTTP 降级端点:新增 POST /api/screenshot/result,接收 {image, action} JSON,先关窗口再 spawn_blocking 保存。前端 confirmEdit 中 IPC 失败时自动降级走 HTTP,截图不丢失。
  • 移除 window.close() 调用:该调用会销毁 WebView 页面上下文,导致窗口复用时页面空白。移除后窗口由后端 hide() 控制,复用更稳定。
  • 全局变量完整重置:confirmEdit 中重置 overlay/canvas/ctx/annoCanvas/annoCtx/toolbar/tooltip/hint/annotations/redoStack/isDrawing/brushPath/startPos/curPos/textInputEl/mosaicCanvas 全部全局变量。resetScreenshotUI 中释放上一次截图的 blob URL,防止内存泄漏。
  • 错误恢复机制:loadAndShow 的 catch 和 img.onerror 分支中重置 isActive=false,确保错误后轮询不中断,下一次截图仍可正常触发。
  • 剪贴板临时文件唯一化:copy_image_to_clipboard 临时文件从 mt_clip_{pid}.png 改为 mt_clip_{uuid}.png,避免并发截图时文件冲突。

v2.0.3 · 截图架构重构 + 防卡死保障 + 图表修复

  • 截图架构重构(最稳定方案):去掉 fullscreen 模式,改用无边框窗口+手动设置尺寸覆盖屏幕,避免透明+全屏组合在集显上的驱动兼容性问题(Intel 集显尤其严重)。
  • 窗口预创建 + 毫秒级响应:应用启动后 500ms 后台预创建截图/录屏窗口并预加载页面,用户按 Alt+A/Alt+M 时只做"截图 + show 窗口",毫秒级响应,对标微信体验。
  • 纯 HTTP 通信架构:截图窗口与后端通信完全走 HTTP fetch,不依赖 Tauri IPC,避开 External URL 页面 IPC 桥不注入、IPC 消息大小限制等问题,通信最稳定可靠。
  • 九重防卡死保障:① Alt+A/Alt+M 切换关闭(再按一次立即退出)② 前端 ESC 关闭 ③ 前端三重关闭保险(HTTP+IPC+window.close)④ 后端四重关闭保险(取消置顶+最小化+隐藏+移出屏幕)⑤ visibilitychange 立即检测 ⑥ 心跳监控强制关闭(前端每2秒心跳,后端每5秒检测,15秒无心跳则强制关闭)⑦ 原子锁 30 秒超时自动释放 ⑧ 5 分钟超时自动关闭 ⑨ 窗口移出屏幕终极兜底。
  • 临时文件传递方案:xcap 截图写入临时 PNG 文件,通过版本号轮询通知前端,HTTP GET 获取二进制字节 → Blob URL 加载,避免大 base64 字符串通过 IPC 导致消息丢失。
  • 图表显示修复:Mermaid SVG 渲染后移除固定 width/height 属性,完全由 CSS 控制缩放,集显上更可靠;容器顶部对齐确保图表不被裁;高度超出时显示滚动提示。
  • 首页精简优化:核心能力从 10 条竖排长列表改为 5x2 图标卡片网格布局,更简洁整洁,hover 有上浮动效。
  • 文档导入状态修复:导入按钮"导入中..."状态在打开/关闭弹窗、渲染文件列表时三处重置,避免状态残留导致用户以为"一直在导入中"。
  • RTF 导入修复:新增完整 RTF 解析器,处理控制字/参数、跳过 fonttbl/colortbl/pict 等非文本 destination、支持 \uNNNN Unicode 字符、\'XX 十六进制字节、转义字符、表格单元格。
  • DOCX/ODT 导入改进:检测 Heading1-6 标题样式生成 Markdown 标题,检测表格结构用 | 分隔单元格,ODT 修复只从 text:span 提取文本的缺陷。
  • 导出保存性能修复:saveBlobWithDialog 从 btoa 逐字节拼接改为 FileReader.readAsDataURL 方案,避免大文件时性能崩溃。

v2.0.2 · 截图标注 + 录屏 + OCR + 独立窗口无感触发

  • 独立截图窗口:Alt+A 触发截图时不再调起主程序界面,创建独立透明全屏窗口,系统任意位置无感触发。窗口无边框、透明、置顶、全屏、跳过任务栏,前端加载完成后才显示避免白屏闪烁。
  • 截图标注编辑器:对标微信截图,支持矩形框、箭头、画笔、文字、马赛克、序号标签 6 种标注工具,6 色调色板(红/黄/绿/蓝/白/黑)+ 3 档线宽(2/4/8px)+ 撤销重做(Ctrl+Z / Ctrl+Y)+ 确认/取消。
  • OCR 文字识别:截图后点击 OCR 按钮调用 Windows 内置 OCR API,支持中文/英文自动识别,弹窗显示识别结果可复制。
  • 独立录屏窗口:Alt+M 同样独立透明窗口,背景帧 + 区域选择 + 原生 xcap DXGI 帧捕获 + WebM 保存。选区遮罩与截图一致(红色虚线选区 + 像素 tooltip + 开始/取消工具栏 + 录屏提示条)。
  • 遮罩不消失致命缺陷修复:窗口销毁从 hide 改为 destroy;前端先清空 document.body 再调 IPC;三层降级保障(DOM 清空 → window.destroy() → window.close())。
  • 前端 Alt+A/Alt+M 改为 IPC 触发:调用 api_trigger_screenshot / api_trigger_record IPC 命令(和全局快捷键走同一路径),不再走 HTTP 调起主窗口。HTTP 降级路径也不再调起主窗口。
  • 快捷键面板全面更新:设置面板快捷键栏分为全局快捷键、编辑器快捷键、AI 快捷键三个分区。修复多处快捷键显示与实际不一致问题(Ctrl+E→Alt+E、Ctrl+W→Alt+W、Ctrl+Shift+F 描述等)。欢迎页快捷键更新为实际生效的 8 个核心快捷键。

v2.0.1 · 图谱修复 + 轻量绘图 + AI增强 + 代码高亮 + 导出优化 + DeepSeek接入

  • 图谱界面无文档节点修复:FileEntry.content 懒加载后为 None,get_graph 得空字符串无 wikilink 边,前端过滤掉所有 doc 节点;修复为对 content=None 的文件调 read_file_force 触发磁盘读取并回填缓存。
  • 内置轻量 Canvas 绘图编辑器:新建 draw-editor.js(30KB 零依赖 100% 离线),7 种工具(选择/矩形/圆形/菱形/箭头/直线/文字/自由画笔)+ 样式(边框/填充/线宽/字号)+ 撤销重做(最多 50 步)+ 键盘快捷键(1-8 切换工具),保存为 Excalidraw 兼容 JSON。
  • AI 生成 HTML 图表/动画正确显示:过滤 AI 输出控制字符防 JSON 解析失败、iframe sandbox 补 allow-scripts、AI 内容包裹为 html-inline fence 块在隔离 iframe 中渲染。
  • DeepSeek API 接入:API Key 输入隐藏 + 跨升级持久化 + 连接测试按钮 + Ollama 失败自动切换 DeepSeek + 关键词 AI 搜索降级。
  • AI 二次优化上下文增强:Ctrl+I 行内 AI 上下文提取为 4 维度叠加(光标所在 fence + 上方最近 fence + 光标所在段落 + 前后短上下文),确保 AI 能看到完整原作。
  • 配置丢失修复:移除 deepseek_api_key 的 skip_serializing 属性 + 统一配置保存/加载路径。
  • 代码语法高亮 CSS 全覆盖:styles.css 补齐 30+ 种 hljs span class 映射到 CSS 变量,亮/暗主题自动切换。
  • 代码块语言选择器:编辑工具栏新增 40+ 语言下拉面板(常用/编程/Web/数据库/数据配置 5 组)。
  • 内嵌 HTML 导出优化:导出时轮询 iframe srcdoc 内容高度并写入内联 style,消除固定 min-height 裁剪和滚动条。

v1.8.107 · 阅读模式不弹AI菜单 + 工作区外部新增文件自动刷新 + .key文件正常显示 + 代码语法高亮

  • 阅读栏/阅读模式选中文字不再弹AI提示框:refreshAiSelectionMenu 函数开头判断 state.mode==='view' 时直接隐藏AI菜单并 return,仅编辑模式保留 AI 选区菜单,阅读模式下选中文本可自由复制不被打断。
  • 外部保存新文件到工作区目录后文件树自动刷新:新增 refreshTreeThrottled 节流函数(15s 内不重复刷)调 bootstrap(true) 触发后端 refresh_cache() 全量扫描,visibilitychange 页面恢复可见 + window.focus 窗口聚焦两个回调触发刷新,startTreeRefreshInterval 60s 低频定时兜底,document.hidden 时跳过避免无谓 IO。
  • .key结尾文件正常显示:is_binary_ext 移除 'key',.key 文件被扫描进文件树 + 全文搜索 + read_file 能读内容(agent_policy deny **/*.key 保留确保 AI 不自动读密钥内容但用户能手动打开看)。
  • 代码语法高亮引入 highlight.js:下载 highlight.min.js(11.9.0,121KB,35+ 常用语言)到 public/vendor/highlight/ 离线打包,styles.css 新增 .hljs-* 到 --syn-* CSS 变量映射适配亮/暗主题切换,app.js 新增 highlightCodeBlocks 函数 + requestIdleCallback 分批每批 8 个 + dataset.highlighted 防重复 + hljs 未加载静默降级,调用点 5 处全覆盖。

v1.8.106 · 文档切换编辑位置保留 + 外部编辑器异步编辑冲突检测 + 重新加载强制读磁盘

  • 临时区多文档切换保留编辑位置:扩展草稿机制新增 saveDraftState/restoreDraftState,按文档路径在 localStorage 持久化光标 selectionStart/End + 编辑器 scrollTop + 阅读器 scrollTop,openDoc 切换时 restoreDraft 回填文本后立即恢复光标和双滚动位置(包在 requestAnimationFrame 中等待 DOM 布局完成避免 scrollTop 被钳制为 0),关闭文档时 removeItem 清理。
  • 外部编辑器异步同时编辑同一文档不再静默覆盖:后端 save_file 新增 base_hash 参数保存前 sha256 比对磁盘文件不一致拒绝保存返回 __CONFLICT__:disk_hash,前端 saveCurrentDoc 收到 conflict:true 弹窗确认覆盖或取消;新增 /api/doc-check 端点前端每 5s 轮询当前文档哈希,与打开时记录的 currentVersion 不同则 Toast 提示「重新加载/忽略」,重新加载前若有未保存编辑二次确认丢弃。
  • 点击「重新加载」强制读磁盘绕过 cache:read_file L1 cache 命中时直接返回内存旧 content,导致 check_file 检出外部修改后点重新加载仍看到旧内容;新增 read_file_force 方法跳过 cache 从磁盘重读 + decode + 写回 cache,/api/doc 新增 force=1 参数,前端两处重新加载按钮均带 forceReload=true。

v1.8.105 · 全局搜索中文 MD「打不开/没内容」空白屏·三重修复

  • NFC 路径全链路归一:Mac HFS+ NFD / Win NTFS NFC / NAS 短名/UNC 中文路径搜索结果点不开的根因是字符串 == 字节序列不同漏查;引入 unicode-normalization crate,全链路 ref_path NFC 归一。
  • basename 三级弱匹配兜底:主路径 cache==/NFC 都 miss 后,按 basename NFC 精确相等+同 workspace 唯一、去尾缀再唯一、全局 workspace 内 basename 全局唯一三级匹配。
  • 空内容/空白屏不再静默:右侧阅读栏渲染灰底虚线卡片提示「WPS/Word/江西电信导出 MD 请记事本另存为 UTF-8 覆盖原文件」,左侧编辑器设置多行空内容占位符,Worker 抛错 catch 分支顶部 prepend 红色异常 banner。
  • BOM + GBK/UTF16/UTF32 智能编码解码兜底:引入 encoding_rs,scan_workspace 和 read_file 都从 read_to_string UTF-8 改为 read bytes → BOM → GB18030/GBK/BIG5/SHIFT_JIS/EUC_KR 序列候选,识别出的非 UTF-8 编码写入 FileEntry.encoding 前端状态栏可见。

v1.8.104 · 安装后启动失败(前端资源缺失)紧急修复·双重保险

  • 打包侧强制目标映射:tauri.conf.json 的 bundle.resources 从字符串数组改为 Tauri 2.x 对象映射,强制写死安装目的地 {src:../public,target:resources/public} + {src:WebView2Loader.dll,target:""},消除 NSIS 字符串资源解包路径歧义。
  • 运行时 10 级候选 + 404 页完整枚举:resolve_public_root 从返回 PathBuf 升级为返回 (PathBuf, Vec<PathBuf>),候选从 5 条扩充到 10 条,内置 404 友好页打印编号后的全部候选。
  • 端口占用自动回退:bind_first_available 按 7321..=7420 顺序扫描返回第一个空闲端口,轮询 axum / splash 加载 / 首页导航 / 30s 超时提示全部使用真实端口。
  • 前端资源缺失内置中文错误页:如果 10 级候选都找不到 public/index.html,Rust 端直接返回内置最小 HTML 错误页(深色主题 + 当前尝试路径列表 + 3 步解决操作提示)。

v1.8.103 · 原生另存为 + 路径查看 + DOCX/RTF/ODT 正文提取

  • 7 项导出统一接入系统原生「另存为」:新增 Rust Tauri 命令(save file dialog + 真写磁盘 + 返回绝对路径 + 打开文件 / 在文件夹中查看),保存成功后 Toast 显示完整绝对路径 + 两按钮;取消对话框静默不报错;非 Tauri / 插件失败自动降级 Blob 下载。
  • 导入 DOCX/RTF/ODT 正文自动提取:Rust 新增 3 个正文提取 helper(ZIP + 控制字剥离 + strip_inner_tags),不再生成 pandoc 占位文档。
  • 导入弹窗原生系统按钮:importModal 按钮区新增「系统文件对话框」(Tauri 环境下自动显示),accept 与 Rust 过滤器同步 11 类文件。
  • 全链路兼容与健壮:所有 invoke 双重兼容 window.__TAURI__.core.invoke 与 window.__TAURI__.invoke,base64 编解码统一。

v1.8.102 · 其他电脑安装后 HTTP 404 白屏紧急修复

  • 致命根因:tauri.conf.json bundle.resources 原本只有 WebView2Loader.dll,前端 public/ 目录完全没有进入 NSIS 安装包,用户电脑安装后 axum 的 resolve_public_root 用编译期 CARGO_MANIFEST_DIR/../public 指向开发机目录(其他电脑不存在),请求全部返回 HTTP ERROR 404。
  • 打包侧修复:bundle.resources 追加 "../public",NSIS 安装器会把 public 整个目录解包到安装目录/resources/public/。
  • 运行时 5 级候选 + index.html 真校验:优先级环境变量 > exe_dir/resources/public > exe_dir/public > CARGO_MANIFEST_DIR/../public > ./public,候选目录必须同时"是目录 + 含 index.html 文件"才会被选中。
  • 端口占用自动回退:bind_first_available 按 7321..=7420 顺序扫描返回第一个空闲端口。
  • 前端资源缺失内置中文错误页 & 30s 超时中文引导:Rust 端直接返回内置最小 HTML 错误页。

v1.8.101 · 全格式导出质量升级 & Frontmatter 不再外漏

  • Frontmatter YAML 不再出现在任何导出文件:菜单 7 项导出在写入前统一使用 stripFrontmatter() 或 Rust split_frontmatter().body 剥离 frontmatter 块;原 MD 文件写入磁盘时仍 100% 保留 frontmatter。
  • HTML 导出:从 HTTP 400 升级为高品质离线文档:前端 buildExportableHtml() 离屏 900px 容器渲染 → KaTeX DOM + Mermaid SVG → 本地图片全部转 data URI → 内联 PRINT_STYLES + KATEX_PRINT_CSS → 文末品牌推荐卡片 → Blob 下载。生成文件离线双击也能显示公式/Mermaid/中文/图片。
  • Word DOCX 导出:从 HTTP 400 升级为 Word/WPS 可直接打开的兼容格式:使用 HTML 导出的全链路内联结果 + 写入 UTF-8 BOM + application/msword MIME → 文件名后缀 .doc。
  • TXT 导出:语法糖剥离 + 中文编码防乱码:Rust strip_markdown_for_txt() 删除 fenced 包裹行 / ATX 前缀 / Setext 下划线 / 引用块前缀 / 加粗 / 斜体 / 删除线 / 代码 / 图片 → alt / 链接 → text / HTML 注释;前端兜底写入 UTF-8 BOM 防中文乱码。
  • 保存成功率统一修复:所有 Blob 下载改用 triggerBlobDownload:<a> 入 DOM 后 setTimeout 50ms 再触发 click,3000ms 后 remove 节点 + revokeObjectURL。

v1.8.100 · 启动红屏 SyntaxError 紧急修复

  • 致命语法错误修复:app.js 第 1872 行 KATEX_PRINT_CSS 中 IE10 老 Hack box-sizing:content-box \10 在模板字符串内被 WebView2/Chromium 解析为八进制转义序列,严格模式直接抛 Uncaught SyntaxError,app.js 文件级解析失败 → 启动红屏。删除无用 IE10 hack 后模板字符串语法合法,红屏立消。
  • 保持 v1.8.99 三项阅读栏/阅读模式修复完整:Worker 三分支补齐 renderMathInPreview + renderChartsInPreview、markdown-worker.js 侧 mermaid/excalidraw chart-block 容器结构生成、renderMarkdown 与 Worker 双处「跨行 $$...$$ 占位符保护 + 还原」三条核心修复继续生效。
  • 缓存强失效:MARKDOWN_WORKER_URL query 升级、MARKDOWN_RENDER_VERSION 升级,编辑预览/阅读栏/阅读模式三路缓存全部强制重算。

v1.8.99 · 阅读栏/阅读模式公式/图表全面修复

  • 阅读栏/阅读模式渲染调用补齐:renderReaderContent 主路径、catch 回退路径、renderReaderContentChunked 单 slice 分支三处全部在写入 markdownView.innerHTML 后立即调用 renderMathInPreview + renderChartsInPreview,解决常见文档下公式、Mermaid、Excalidraw 永远不渲染的主因。
  • Worker 端 Mermaid / Excalidraw 占位生成补齐:markdown-worker.js 渲染主路径 fenced 代码块闭合分支与主线程 renderMarkdown 严格对齐:mermaid 输出 .chart-block.mermaid-block + pre.mermaid-source + div.mermaid-container(空占位);excalidraw 输出 .chart-block.excalidraw-block + pre.excalidraw-source + div.excalidraw-container(空占位)。
  • 跨行块级公式 $$...$$ 修复:markdown-worker.js 与 app.js:renderMarkdown 都新增「先保护后还原」占位符机制:按 fence 分段 → 非 fence 段用占位符把整段 $$...$$ 替换为一行 token → HTML 生成完成后还原为 <span class="math-block" data-math="...">;彻底解决旧逐行切割跨行公式的问题。
  • 缓存与脚本版本强制失效:MARKDOWN_RENDER_VERSION 和 MARKDOWN_WORKER_URL query 升级,保证 cachedRenderMarkdown LRU + Worker 脚本 + 前端静态资源浏览器缓存全部强制走新解析。

v1.8.98 · PDF 导出大升级

  • 图表导出:Mermaid 代码块在打印前异步调用 mermaid.render 生成 SVG → 逐节点 getComputedStyle 把 fill/stroke/stroke-width/opacity 写入 inline style → XMLSerializer 转 data:image/svg+xml → 独立 <img> 替代;脱离外部 CSS 后 PDF 内仍能完整显示。Excalidraw 块无运行时则降级为等宽源码显示。
  • 公式导出:.math-block 与 .math-inline 在打印前使用 katex.render() 真实渲染 DOM;同时 PRINT_STYLES 内联注入约 90 条 KaTeX 关键布局类,about:blank iframe 无需再请求 CDN CSS;\frac、\sqrt、上下标、矩阵、\sum 均正确输出。
  • 品牌推荐语:文末默认追加独立品牌推荐卡片(流式文档流、page-break-inside:avoid,非 fixed/watermark,绝不会遮挡正文):紫蓝渐变圆形徽章 M + 标题 + slogan + 官网下载超链接;多页 PDF 仅末页显示。
  • 图片内联:容器内相对路径 <img> 再次 fetch → blob → readAsDataURL 内联,PDF 离线打开图片仍完整显示;打印样式 @page size:A4;margin:18mm 14mm;图表块与品牌卡片用 page-break-inside:avoid 防跨页切裂。

v1.8.97 · 编辑器字体优化 + 字号快捷键修复

  • Ctrl+/- 编辑器字号快捷键最终修复:事件监听同时注册在编辑器宿主和 document 全局两重,编辑区焦点、工具栏焦点、目录焦点三种上下文都能稳定放大/缩小字号;Ctrl+0 立即重置。
  • 重启保留用户习惯字号:loadSettings → applySettings 末尾主动 applyEditorFontSizeToDom,把 localStorage 的 docContentFontSize 同步到 #editor 及 CodeMirror 多节点。
  • 编辑模式字体全面优化:等宽字体栈 Cascadia Mono / Cascadia Code / JetBrains Mono / Fira Code → 中文 Sarasa Mono SC / Source Han Mono SC / PingFang SC / Microsoft YaHei UI → Consolas 兜底;font-feature-settings liga/calt/cv11/ss01 开启等宽连字与数字替代;行距与留白优化。
  • 兼容保障:字号调整会对 .cm-editor/.cm-scroller/.cm-content/.cm-line/.cm-gutters/selection/cursor/activeLine 层以及 #cursor-overlay 全部显式 setProperty(important),并调用 requestMeasure 强制 CodeMirror 重绘避免滚动条错位。

v1.8.96 · 代码文件保存最终修复 + 工作区视图

  • UI 拒绝文案彻底清除:打开代码/文本文件时 saveBtn.disabled=false、清除旧 title、强制替换为「保存 (Ctrl+S)」、移除 readonly/disabled/unsupported class。
  • 底部 lastSaveText 正确显示:非 Markdown 不再出现「不可保存」。openDoc 末尾按编辑器与原内容一致性判断:有草稿且不同→未保存+scheduleAutoSave,其余→保存。
  • 保存链路再确认:非 md 文档打开即自动 setMode('edit') → runAutoSave gate 通过 → saveCurrentDoc → /api/save(后端 save_file 已对任意文本后缀放行 v1.8.94)。
  • 工作区视图:折叠态整个工作区扁平 Top10 按 modified 倒序 + 当前打开文档兜底可见;展开态 renderTree 递归完整目录树(文件夹独立展开/收起 + 每层文件按 modified 倒序)。

v1.8.95 · 工作区视图重写 + 基础保存修复

  • 基础保存修复:代码后缀打开默认进入编辑态,避免 runAutoSave 被 view 模式短路。
  • 工作区折叠态:收起时整个工作区全部文件按 modified 倒序取前 10 个 + 保证当前打开文档可见;尾部「共 X 项,展开查看全部」。
  • 工作区展开态:渲染真正目录树结构;所有文件夹独立展开/收起;每层文件按 modified 倒序;尾部「收起」按钮返回折叠视图。

v1.8.94 · 工作区与编辑器增强

  • 非 MD 文件显示:工作区目录 mdOnly=false 时显示 bat/vbs/js/py/ini/txt/sh/code 等文本/代码文件(二进制黑名单+10MB 上限)。
  • 展开全部修复:工作区目录「展开全部」时无数量限制显示全部文件,收起时保持简洁。
  • 代码文件支持:代码后缀可正常打开编辑保存;非 MD 预览使用等宽字体+换行样式。
  • 文件排序:工作区目录文件按修改时间倒序排列(最新在前)。
  • 字体快捷键:Ctrl+= 增大编辑器字体,Ctrl+- 减小,Ctrl+0 重置(10~32px,localStorage 持久化)。

v1.8.93 · 界面与体验升级 + 性能优化

  • 界面与体验升级:工作区添加对话框 UI 修复(z-index+遮罩层级);搜索支持多关键词 AND + 精确短语 + 评分排序;快捷键调整(Ctrl+W → Alt+W / 新增 Alt+E / Alt+O);自升级真实 fetch 远程版本语义化比较;窗口启动默认最大化。
  • 功能无损性能优化:状态栏 DOM 引用缓存(_statusFieldCache),每秒避免 4+ 次 querySelectorAll;页面隐藏时暂停系统时间 setInterval;合并编辑器 3 个 scroll 监听器为 1 个 passive;5 个 resize 监听器统一 100ms 去抖。
  • 沉浸+轻量模式整合:一个按钮(⚡ 沉浸)同时实现沉浸写作与轻量编辑——进入时终止 Markdown Worker、禁用语法高亮 CSS、隐藏预览/大纲面板,退出时自动重建 Worker 并刷新预览。
  • 文档安全加固:渲染序号竞态防护(readerRenderSeq)、Worker 失败后 5 秒冷却可重建、openDoc 被覆盖时回滚清理、切换文档前同步保存草稿、保存接口返回 contentSha256 支持乐观锁。
  • 内存/GPU 优化:contentStore LRU 缓存(最多 50 热文档)、知识文档上限 300、轻度 trim 250MB/激进 320MB;图谱模拟间隔拉长 30%、shadowBlur 降级、backdrop-filter blur 缩小。

← 返回首页