github yuzeguitarist/Deck v1.4.3
v1.4.3 | herculean

latest releases: v1.4.5, v1.4.4
one month ago

Deck


Release Notes v1.4.3

优化 / Improvements

  • SQLite 数据库 P0 写放大与安全模式维护优化
    Deck 对剪贴板历史数据库做了一轮最小侵入的 P0 优化:FTS 全文索引现在只会在 search_text、来源 App 名称、自定义标题或加密状态真正变化时更新,给历史记录打标签、切换临时状态等轻量操作不再触发全文索引删除与重建,减少 SQLite WAL 写放大、分词开销和后台 checkpoint 压力。安全模式下,Deck 不再维护无法直接搜索的密文 FTS 索引,全文索引重建也会跳过加密记录;批量插入路径去掉了逐条 SELECT count 的额外查询,降低导入、同步和恢复时的数据库负载。与此同时,安全模式开启/关闭时的语义向量缓存迁移改为静默探测加密状态,不再把预期中的明文探测失败误报为 authenticationFailure 错误刷屏。
    Deck received a minimal P0 SQLite optimization pass for clipboard history. FTS now updates only when search_text, source app name, custom title, or encryption state actually changes, so lightweight operations such as tagging items or toggling temporary state no longer delete and rebuild full-text index entries. This reduces SQLite WAL write amplification, tokenizer work, and checkpoint pressure. In secure mode, Deck also stops maintaining unusable ciphertext FTS entries, and FTS rebuilds skip encrypted rows. Batch insert paths no longer run a per-item SELECT count, reducing database load during imports, sync, and restore flows. The secure-mode semantic-vector cache migration now probes encryption state silently as well, preventing expected plaintext-probe misses from being logged repeatedly as authenticationFailure errors.

  • Trace 驱动的规则搜索与 SwiftUI 氛围栏性能优化
    基于 8 份 Instruments Trace,Deck 优先处理了最重的规则搜索、代码语言规则搜索、加密数据库规则搜索与 SwiftUI 更新风暴热点:语言规则过滤现在会先用类型、App、日期、大小等低成本条件缩小候选范围,再只对真正可能命中的文本条目预热代码语言检测缓存,避免对会被其它规则淘汰的历史记录反复执行 detectCodeLanguage;底部氛围栏也减少了每帧字符串分配,并把装饰性动画刷新率降到更克制的 10fps,在不改变交互和功能的前提下降低 SwiftUI 文本排版与 AttributeGraph 更新压力。后台复制/纯后台 Trace 中主要耗时来自 MultipeerConnectivity 系统发送/等待线程,这次保持不改,避免为了不可控系统栈引入回归风险。
    Based on eight Instruments traces, Deck prioritizes the heaviest rule-search, code-language rule-search, encrypted-database rule-search, and SwiftUI update-storm hotspots. Language-rule filtering now narrows candidates with cheaper type, app, date, and size checks before warming the code-language detection cache only for text-like items that can still match, avoiding repeated detectCodeLanguage work for records that other rules will discard anyway. The bottom ambient bar also reduces per-frame string allocation and lowers its decorative animation cadence to a more conservative 10fps, cutting SwiftUI text-layout and AttributeGraph update pressure without changing behavior or functionality. The background-copy / pure-background traces were dominated by MultipeerConnectivity system send/wait threads, so those paths were intentionally left untouched to avoid regression risk in an OS-owned stack.

  • 冷启动面板查询、CPU 与内存占用优化
    根据冷启动面板查询与内存 Trace,Deck 现在会优先提交更小的首屏历史快照,并把总数统计延后到首屏显示之后,避免 COUNT(*) 与首屏列表查询在打开面板瞬间争抢 SQLite 队列;历史列表的类型/标签过滤也补充了与 timestamp DESC, id DESC 排序匹配的复合索引,减少过滤分页时的额外扫描和排序。与此同时,横板卡片的缩略图缓存容量进一步收紧,图片文件大小、Base64 图片探测、智能文本分析与链接元数据加载都改为更靠后的低优先级路径,避免面板刚打开就同时触发解码、字符串扫描、网络元数据解析和 SwiftUI 布局压力,让冷启动面板更快出现、CPU 峰值更平滑,内存峰值也更可控。
    Based on cold-start panel query and memory traces, Deck now commits a smaller first-screen history snapshot first and defers total-count calculation until after the panel has rendered, preventing COUNT(*) from competing with the initial SQLite list query during panel open. Type/tag-filtered history pages also gain composite indexes matching the timestamp DESC, id DESC ordering to reduce extra scans and sorting during filtered pagination. At the same time, horizontal-card thumbnail cache limits have been tightened, while image file-size lookup, Base64 image detection, smart-text analysis, and link metadata loading now run later at lower priority. This avoids triggering image decoding, string scanning, network metadata parsing, and SwiftUI layout pressure all at once, making the cold-start panel appear faster with smoother CPU peaks and more bounded memory usage.

  • Swift 6 Strict Concurrency Complete 级别并发大扫除
    Deck 这次完成了一轮大规模 Swift 6 并发治理:在 SWIFT_STRICT_CONCURRENCY = complete、默认 MainActor 隔离的最高检查强度下,系统性清掉了 300+ 条 Swift Concurrency 编译诊断,把主线程隔离、Sendable 边界、@Sendable 闭包捕获、SQLite 后台队列、Socket / LAN / iOS Sync / OCR / Script Plugin / Orbit Bridge 等高风险路径逐一收敛。大量过去“能跑但编译器已经报警”的隐性数据竞争点,现在都改成了更明确的 actor 边界、不可变快照、队列所有权或受控的后台安全入口;最终 clean build 的并发诊断已经归零。
    Deck has gone through a major Swift 6 concurrency cleanup pass: under SWIFT_STRICT_CONCURRENCY = complete with default MainActor isolation, more than 300 Swift Concurrency compiler diagnostics were eliminated across main-actor isolation, Sendable boundaries, @Sendable closure captures, SQLite background queues, Socket / LAN / iOS Sync / OCR / Script Plugin / Orbit Bridge paths, and other high-risk async code. Many places that previously “worked” but were already flagged by the compiler as potential data-race boundaries have been tightened with clearer actor ownership, immutable snapshots, queue-owned state, or controlled background-safe entry points; the final clean build now reports zero concurrency diagnostics.

  • Swift 6 运行时隔离崩溃迁移补齐
    在完成 Swift 6 语言模式切换后,Deck 又针对默认 MainActor 隔离下的运行时断言做了一轮专项迁移:剪贴板轮询、DeckClip socket、SQLite 写入与统计查询、语义向量表恢复、代码高亮、OCR、NSItemProvider 拖拽/分享、iOS Sync、AI OAuth 回调服务、CloudKit 同步、DirectConnect 与 Multipeer 局域网收发等后台队列入口,现在都避免在主 actor 词法环境里直接创建会被 libdispatch / Network.framework / CloudKit 在后台队列执行的闭包。相关路径改为非隔离闭包工厂、不可变快照、显式 Task { @MainActor ... } 回跳,或由队列自身持有状态的非隔离 helper 执行,修复 _dispatch_assert_queue_fail / _swift_task_checkIsolatedSwift 这类 Swift 6 runtime 崩溃;同时修正 DeckClip socket 读事件从异步回跳导致的重复触发与内存暴涨风险。Debug 与 Release 主 target 均已在 Swift 6 下构建通过。
    After switching the main target to Swift 6, Deck received an additional runtime-isolation hardening pass for default MainActor isolation. Background entry points such as clipboard polling, DeckClip sockets, SQLite inserts and statistics queries, semantic-vector table recovery, code highlighting, OCR, NSItemProvider drag/share representations, iOS Sync, the AI OAuth callback server, CloudKit sync, DirectConnect, and Multipeer LAN transfer now avoid creating actor-isolated closures that libdispatch, Network.framework, or CloudKit later execute on background queues. These paths now use nonisolated closure factories, immutable snapshots, explicit Task { @MainActor ... } hops, or queue-owned nonisolated helpers, fixing Swift 6 runtime crashes such as _dispatch_assert_queue_fail / _swift_task_checkIsolatedSwift; the DeckClip socket path also avoids the read-event storm and memory blow-up that could happen when the socket callback returned before consuming data. Both Debug and Release main-target builds now pass under Swift 6.

  • 编译警告清理与底层类型转换收敛
    继续收敛一批低风险编译警告:Accessibility 相关的 AXUIElement / AXValue / CFArray 类型转换从通用 unsafeBitCast 改为更明确的 unsafeDowncast,覆盖剪贴板、上下文感知排序、光标助手与 IDE Anchor 路径;同时把进程路径、硬件型号、LAN 地址等固定 C 字符缓冲区的字符串解析改为先按空字符截断、再使用 UTF-8 decoding,替代已废弃的数组版 String(cString:)。这些调整不改变功能行为,但能让 Xcode 26 / Swift 编译输出更干净,也让底层桥接边界更清晰。
    Continued cleaning up low-risk compiler warnings: Accessibility-related AXUIElement / AXValue / CFArray casts now use the more explicit unsafeDowncast instead of generic unsafeBitCast across clipboard, context-aware ranking, cursor assistant, and IDE Anchor paths. Fixed-size C character buffers for process paths, hardware model names, and LAN addresses are now truncated at the null terminator and decoded as UTF-8 instead of using the deprecated array-based String(cString:). These changes preserve behavior while keeping Xcode 26 / Swift build output cleaner and making low-level bridging boundaries clearer.

  • 智能文本识别准确率与能耗优化
    Deck 的智能文本识别现在会优先通过标题、列表、任务列表、表格与代码围栏等结构化信号确认 Markdown,避免 Release Notes 这类 Markdown 文档被英文说明里的 sourceasdonefi 等弱关键词误判为 Shell 或 TypeScript;同时收紧 Shell 与 TypeScript 的语言判定,只有出现 shebang、命令行结构、interface {}type =: string; 等更明确的代码证据时才会进入对应语言。长文本识别也改为更稳定的采样与缓存策略,并在 Markdown 正则检测前加入轻量前置判断,减少滚动、预览与后台分析时的重复字符串扫描、CPU 抖动和能耗。
    Deck’s smart text detection now prioritizes structured Markdown signals such as headings, lists, task lists, tables, and fenced code blocks, preventing Release Notes-style Markdown documents from being misclassified as Shell or TypeScript because of weak English words like source, as, done, or fi. Shell and TypeScript detection has also been tightened so those languages require clearer code evidence such as shebangs, command-line structure, interface {}, type =, or : string;. Long-text detection now uses a more stable sampling and cache strategy, with lightweight prechecks before Markdown regex work to reduce repeated string scanning, CPU spikes, and energy usage while scrolling, previewing, and analyzing content in the background.

  • 智能分析缓存与代码识别路径再优化
    智能内容分析缓存现在会绑定内容版本、类型与即时计算开关,而不是只按剪贴板条目 ID 复用结果,避免 OCR、规则处理或内容更新后继续显示旧的 Markdown / 代码语言 / 计算结果;分析 Markdown 状态时也会复用同一次代码语言识别结果,减少重复扫描。HTML / XML 识别也增加了结构化标签与属性校验,短片段、Markdown 文档和被尖括号包住的 URL 不再容易被弱 HTML 特征误判,滚动、预览和后台分析时的准确率与 CPU 表现都更稳。
    Smart-content analysis cache entries are now tied to the content version, item type, and instant-calculation setting instead of only the clipboard item ID, preventing stale Markdown / code-language / calculation results after OCR, rule processing, or content updates. Markdown checks also reuse the code-language result from the same analysis pass to avoid duplicate scans. HTML / XML detection now requires stronger structural tag and attribute evidence, so short snippets, Markdown documents, and angle-bracket-wrapped URLs are less likely to be misclassified by weak HTML signals, improving both accuracy and CPU behavior while scrolling, previewing, and analyzing in the background.

  • Markdown 预览与横板卡片渲染升级
    Markdown 空格键预览现在改为更高效的 TextKit 渲染路径,保留原始换行,并补齐标题、分割线、列表、引用、代码块以及加粗/斜体/链接等常见语法;其中引用段落会以灰色斜体正文展示,不再额外显示左侧引用线或引用标记,避免窄预览中自动折行后出现断裂、重复的视觉噪音。预览区也采用与文本/代码预览一致的铺满布局和底部渐变浮层。横板模式下的 Markdown 卡片会直接渲染 Markdown 内容,不再把 ** 等语法符号原样露出,同时移除额外的 MD 标签、保留底部字符数信息,让正文位置更靠上、可读区域更多;底部预览栏新增“拷贝纯文本”快捷按钮,并补齐多语言与悬停提示,方便把 Markdown 转成更易读的纯文本再复制。
    Markdown space-bar previews now use a more efficient TextKit rendering path that preserves original line breaks and supports common syntax such as headings, dividers, lists, blockquotes, code blocks, bold / italic text, and links. Blockquotes are rendered as gray italic body text without an extra left quote bar or marker, avoiding broken or repeated visual noise when narrow previews wrap lines automatically. The preview area also matches the edge-to-edge layout and bottom gradient overlay used by text and code previews. In horizontal mode, Markdown cards render their Markdown content directly instead of exposing raw markers like **, remove the extra MD badge, and keep the bottom character-count metadata so the body starts higher with more readable space; the preview footer also adds a localized “Copy Plain Text” action with a tooltip so Markdown can be copied in a more readable plain-text form.

  • Markdown 表格渲染与预览排版优化
    Markdown 预览现在可以识别并渲染 GitHub 风格表格,支持表头、分隔行、左右/居中对齐、转义竖线以及代码片段里的竖线,并为大表格增加轻量截断保护,隐藏行数与隐藏列数提示也已补齐多语言文案;空格键预览中表格会以更清晰的行列网格、横向滚动和底部滚动留白展示,横板卡片则继续保留原有 Markdown 卡片渲染,不再额外渲染成横排表格卡片,避免列表内容被错误改写。与此同时,分割线渲染改为真正的一行视觉线,修复 --- 被换行成多行长横线的问题,并微调表格与分割线的上下间距;表格行高也改为按单行内容量自适应,短行保持紧凑、长行适度增高,同时缓存一次表格布局结果,避免重复计算列宽、行高和纯文本回退内容导致预览时 CPU 飙高。
    Markdown previews can now detect and render GitHub-style tables, including headers, separator rows, left / center / right alignment, escaped pipes, and pipes inside inline code, with lightweight truncation guards for large tables and localized labels for hidden rows and columns. Space-bar previews show tables as readable grids with horizontal scrolling and bottom scroll padding, while horizontal cards keep their existing Markdown card rendering instead of being converted into table cards, preventing list content from being rewritten incorrectly. Divider rendering has also been changed to a true single-line visual rule, fixing cases where --- wrapped into several long lines, and spacing around tables and dividers has been tuned; table rows now adapt their height based on per-row content so short rows stay compact and longer rows can grow modestly, while the table layout is calculated once to avoid repeated column-width, row-height, and plain-text fallback work that could spike CPU during preview.

  • Markdown 转纯文本 CPU 与入库路径优化
    Markdown 预览底栏的“拷贝纯文本”现在不再为了得到纯文本而重新走完整的富文本渲染链路,而是使用轻量 Markdown 文本解析路径直接生成可读纯文本,减少字体、段落样式、AttributedString 与表格回退渲染带来的 CPU 抖动。转换结果写入系统剪贴板时会标记为 Deck 内部派生内容,避免剪贴板轮询器再次把它当作外部复制重新做类型识别、智能文本分析和语义向量生成;同时 Deck 会主动把这条纯文本写入历史记录,确保系统剪贴板与 Deck 历史保持一致。
    The Markdown preview footer’s “Copy Plain Text” action now uses a lightweight Markdown-to-text path instead of rerendering the document through the full rich-text pipeline just to extract plain text, reducing CPU churn from fonts, paragraph styles, AttributedString conversion, and table fallback rendering. The converted text is marked as Deck-derived when written to the system pasteboard so the clipboard poller does not reprocess it as an external copy and rerun type detection, smart-text analysis, or semantic-vector generation; Deck also inserts the derived plain-text item directly into history so the system pasteboard and Deck’s history stay in sync.

  • 浅色模式悬浮提示描边增强
    右上角按钮组和竖版底部按钮组共用的自定义悬浮提示,现在在浅色模式下会增加更明显的灰色描边;当 App 停靠在最顶部、弹窗背景接近纯白时,这个描边能让 tooltip 更有对比度和层次感。深色模式保持原有观感不变。
    The shared custom hover tooltip used by the top-right button group and the vertical bottom button group now gets a stronger gray outline in Light Mode. When the app is docked at the top and the popup background is close to pure white, the outline improves contrast and visual separation. Dark Mode keeps the existing appearance unchanged.

  • DeckClip CLI 登录与聊天配置流程优化
    DeckClip 终端登录界面的 Provider 配置输入框现在支持 Ctrl+U、Command+Delete / Command+Backspace 快速清空当前行,粘贴错 API Key 或 Base URL 时不再需要逐字删除;同时 AI Chat 的 slash 命令新增 /login,可直接从聊天界面进入登录配置,完成或退出后会自动回到 AI Chat 并刷新当前 Provider 状态。
    DeckClip’s terminal login form now supports Ctrl+U and Command+Delete / Command+Backspace to clear the current input line instantly, so pasted API keys or base URLs no longer need to be deleted character by character; AI Chat also adds a new /login slash command that opens the login setup directly from chat, then returns to AI Chat and refreshes the current provider state when the login flow finishes or exits.

  • Deck MCP 结构化剪贴板工具
    Deck MCP 新增 deck_list_clipboard_itemsdeck_search_clipboard_items,可以直接返回结构化 items,方便 AI 客户端继续引用 item_id、类型、来源 App、时间戳、标签与文本片段等元数据;deck_read_latest_clipboard 也升级为增强版,读取最新剪贴板时会一并返回完整元数据,而不只是纯文本。相关只读调用统一走轻量列表/搜索路径,并限制返回文本长度,避免大图、大文本或异常 JSON 回包影响 App 稳定性。
    Deck MCP now adds deck_list_clipboard_items and deck_search_clipboard_items, returning structured items so AI clients can continue working with metadata such as item_id, type, source app, timestamp, tag, and text snippets. deck_read_latest_clipboard has also been upgraded to include full metadata for the latest item instead of text only. These read-only calls use lightweight list/search paths and bounded text payloads to keep large images, long text, and malformed JSON responses from affecting app stability.

  • Deck MCP 脚本插件自动化工具
    Deck MCP 新增 deck_list_script_pluginsdeck_read_script_plugindeck_run_script_transform,外部 Agent 现在可以先列出 Deck 里已安装的脚本插件,读取某个插件的 manifest.json 与主要文件内容,再安全地调用现有脚本插件对文本做固定转换、清洗、格式化或模板处理。插件读取沿用 Deck 原有的文件数量、大小与总字符上限保护;脚本执行走异步转换路径,不阻塞主线程;未授权的网络插件不会被静默放行,而是返回明确的权限提示,方便 Agent 在可控边界内复用 Deck 的本地自动化能力。
    Deck MCP now adds deck_list_script_plugins, deck_read_script_plugin, and deck_run_script_transform, allowing external agents to discover installed Deck script plugins, inspect a plugin’s manifest.json and primary files, then safely run existing script plugins for deterministic text transforms, cleanup, formatting, and templating. Plugin reads reuse Deck’s existing file-count, file-size, and total-character guards; script execution uses the async transform path so it does not block the main thread; unauthorized network plugins are refused with an explicit permission response instead of being silently authorized, keeping Deck’s local automation capabilities reusable within controlled boundaries.

  • DeckClip AI Chat Agent / YOLO 模式切换
    DeckClip AI Chat 现在支持通过 Shift+Tab 在默认 Agent 审批模式与 YOLO 自动审批模式之间切换;顶部会持续显示当前模式,YOLO 模式下工具执行仍沿用普通工具状态展示,只在旋转状态旁标注 “YOLO mode”,避免额外打断对话。
    DeckClip AI Chat now lets you press Shift+Tab to switch between the default Agent approval mode and YOLO auto-approval mode; the current mode stays visible in the header, and tool execution keeps the normal status flow in YOLO mode with an inline “YOLO mode” marker instead of extra approval messages.

  • 上下文感知排序更聪明了
    Deck 的上下文感知排序不再只根据前台 App 做简单的类型偏好重排,而是会先扩大候选范围,再结合内容类型、时间新鲜度、代码语言、来源 App / IDE、source anchor,以及当前活动窗口标题里的任务关键词做加权排序,让更贴近你当前任务的内容更容易被顶到前面。现在面板打开前还会先捕获一次上下文快照,历史列表与 Quick Paste 复用同一份快照,避免 Deck 抢到焦点后窗口标题漂移造成首帧跳序或快捷粘贴顺序不一致;排序中的代码语言加权也改为轻量采样路径,不再为了小幅加分触发完整智能文本分析链路。
    Deck’s context-aware ranking is now smarter than a simple frontmost-app type preference pass: it expands the candidate window first, then applies weighted ranking using content type, freshness, detected code language, source app / IDE, source anchors, and task keywords extracted from the active window title so items that better match your current work are more likely to surface first. Deck now captures a context snapshot before the panel takes focus, and both the history list and Quick Paste reuse that same snapshot to avoid first-frame reorder jumps or mismatched paste order after the active window title drifts; code-language weighting in ranking also uses a lightweight sampled path instead of triggering the full smart-text analysis pipeline for a small scoring bonus.

  • 列表滚动与智能文本分析能耗优化
    针对真实采样中暴露出的列表滚动与文本识别热点,Deck 现在会避免为大段文本反复计算任务 key,改用更稳定的内容版本标记;同时为代码语言检测增加缓存、将代码片段判断改为复用预编译正则,并把长文本的代码判断收敛到采样片段内,减少滚动、预览与快速浏览历史时的重复字符串扫描与 CPU 抖动。
    Based on real profiling of list scrolling and text-analysis hotspots, Deck now avoids repeatedly hashing large text blocks for task keys by using a stable content-version token instead; it also caches code-language detection, reuses precompiled regexes for code-snippet checks, and limits long-text code classification to sampled content, reducing repeated string scanning and CPU churn while scrolling, previewing, and quickly browsing history.

  • 快捷键监听能耗优化
    Deck 优化了复制监听、队列粘贴与 Typing Paste 的全局快捷键监听链路:普通打字时不再让 Deck 为每个按键持续唤醒,而是先监听修饰键变化,只在命中可能触发 Deck 操作的组合键期间临时挂载 keyDown 监听,并带有当前修饰键状态重建与自动回收保护。App 启动时会打印 InputMonitoringStartup 日志,明确当前复制监听和 Deck 快捷键监听策略,方便排查与确认。
    Deck now reduces wakeups in global shortcut monitoring for copy detection, paste queue shortcuts, and Typing Paste. Normal typing no longer keeps Deck awake for every key press; instead, Deck first watches modifier changes and temporarily arms keyDown monitoring only while a Deck-relevant chord is possible, with current-modifier reconciliation and automatic cleanup as guardrails. On launch, Deck logs an InputMonitoringStartup line describing the active copy and Deck-shortcut monitoring strategy for easier verification.

  • 大图预览内存与解码优化
    针对 Instruments Allocations 中暴露出的大图预览内存尖峰,Deck 现在会避免在主线程提前读取完整图片数据:文件图片与外置 blob 图片会优先在后台按路径或受控的 blob 读取入口生成降采样预览,并收紧 ImageIO 源缓存、预览解码像素上限与全局图片预览缓存容量,减少 CGImage、CG raster、CoreAnimation 与 IOSurface 的瞬时内存占用。这样在查看、缩放或切换大图时,内存增长更可控,预览仍保持清晰,同时降低重复解码带来的 CPU 与能耗抖动。
    Based on Instruments Allocations traces for large-image previews, Deck now avoids eagerly loading full image payloads on the main thread. File-based images and blob-backed images prefer background path/blob downsampling through controlled loading paths, while ImageIO source caching, maximum preview decode size, and the global image-preview cache have all been tightened to reduce transient CGImage, CG raster, CoreAnimation, and IOSurface memory. Viewing, zooming, and switching large images should now keep memory growth more bounded while preserving clear previews and reducing repeated decode-related CPU and energy spikes.

  • 局域网文件传输 CPU 与能耗优化
    根据 WLAN 文件传输 CPU Trace,Deck 现在在通过局域网发送文件 URL 时不会再提前调用完整数据解析路径读取文件内容,而是只快照文件路径并交给后续资源传输链路处理,避免发送前额外触发大文件 IO、内存占用和 CPU 抖动;同时,局域网接收到的文件类记录入库后会跳过语义向量生成,避免把文件路径类内容送进 NLEmbedding / CoreNLP 做低收益的后台计算。这样大文件接收完成后的 CPU 峰值和能耗更可控,文件名/路径仍然保留普通关键词搜索能力。
    Based on a WLAN file-transfer CPU trace, Deck no longer resolves full payload data before sending file URLs over LAN sharing. It now snapshots only the file paths and lets the resource-transfer path handle the actual payload, avoiding extra large-file IO, memory pressure, and CPU churn before transfer starts. LAN-received file items also skip semantic-vector generation after being saved, preventing low-value NLEmbedding / CoreNLP work on file-path content while keeping regular filename/path keyword search available. This makes post-transfer CPU spikes and energy usage more controlled for large file transfers.

  • 搜索候选物化与 FTS / LIKE 过滤优化
    普通关键词、模糊搜索与混合搜索现在会优先用轻量数据库行和搜索快照完成候选排序,只在确定命中顺序后再物化真正需要展示的 ClipboardItem,避免为会被 fuzzy scorer 淘汰的候选提前创建完整对象、触发类型/智能分析相关开销。FTS 与 SQL LIKE 查询也会把类型过滤和 Tag 过滤尽量下推到数据库层,并补齐自定义标题的空值处理;搜索解密缓存增加总成本上限,fuzzy lowercased 文本缓存也减少了每次搜索的临时字典分配,让搜索、翻页与快速输入时的内存分配和 CPU 抖动更可控。
    Regular keyword, fuzzy, and mixed search now rank candidates using lightweight database rows and search snapshots first, only materializing the ClipboardItem objects that are actually needed after the final hit order is known. This avoids building full clipboard-item graphs, type checks, and smart-analysis-related work for candidates that the fuzzy scorer will discard. FTS and SQL LIKE queries also push type and Tag filters down into SQLite where possible, with safer null handling for custom titles; the decrypted search cache now has a total-cost limit, and fuzzy lowercased-text lookup avoids per-search temporary dictionaries, keeping allocation and CPU churn more controlled during search, pagination, and fast typing.

  • 加密模式混合搜索与卡片渲染性能优化
    根据 Xcode Instruments 中的加密模式混合搜索 Trace,Deck 现在会在历史列表和搜索结果物化时直接复用数据库中已持久化的内容类型,不再为每条记录重复触发代码语言检测、URL 判断和智能文本扫描;安全模式搜索也减少了重复读取偏好与解密分支判断。横板图片卡片不再为了显示尺寸而在 SwiftUI body 中读取或解密完整大图,而是随后台降采样顺手读取像素尺寸,并为图片缩略图解码和智能文本分析增加更保守的并发闸门,降低搜索、滚动和打开面板时的主线程卡顿、内存峰值与能耗抖动。
    Based on Xcode Instruments traces for encrypted mixed search, Deck now reuses the persisted content type from the database when materializing history and search results, instead of rerunning code-language detection, URL classification, and smart-text scans for every row. Secure-mode search also avoids repeated preference checks and redundant decrypt-branch work. Horizontal image cards no longer read or decrypt full-size images from SwiftUI body just to show dimensions; pixel size is collected during background downsampling instead, and both thumbnail decoding and smart-text analysis now use more conservative concurrency gates to reduce main-thread stalls, memory spikes, and energy churn while searching, scrolling, and opening the panel.

  • 记录导出、加密迁移与统计页性能优化
    根据 Instruments Trace 中暴露出的导出、数据库加解密与统计页热点,Deck 现在会在导出历史记录时直接使用数据库中已经持久化的元数据与完整 payload,不再为每条记录重新构造完整剪贴板对象并触发类型识别、代码语言检测等重复分析;开启或关闭安全模式时,加解密迁移会只处理状态真正需要变化的记录,并复用同一次获取的加密密钥与预编译数据库更新语句,减少 Keychain 访问、SQL 编译与重复检测开销;统计页也改为用更少的聚合 SQL 直接计算总数、今日/本周数量与最近 7 天活动分布,并缓存来源 App 名称解析,减少打开统计页时的数据库扫描、Bundle IO、内存分配与 CPU 抖动。
    Based on Instruments traces for record export, database encryption/decryption, and the statistics page, Deck now exports clipboard history directly from persisted database metadata and full payloads instead of rebuilding full clipboard-item objects and rerunning type detection or code-language analysis for every row. Security-mode migration now only touches rows whose encryption state actually needs to change, while reusing a single resolved encryption key and prepared database update statement to reduce Keychain access, SQL compilation, and duplicate detection work. The statistics page also uses fewer aggregate SQL queries to compute total / today / week counts and the last-7-days activity distribution, with cached source-app name resolution to reduce database scanning, Bundle IO, allocations, and CPU churn when opening statistics.

  • AI 聊天流式回复性能优化
    根据 AI 聊天 SwiftUI Trace 中暴露出的流式回复热点,Deck 现在会降低流式文本刷新与自动滚动触发频率,避免每个小片段都带动画滚到底部,从而减少 LazyVStack、根视图几何与 SwiftUI Transaction 的重复布局压力;流式文本累积器也改为增量追加,避免长回复过程中反复 joined() 重建整段字符串,并且流式消息视图不再为每次刷新创建临时 AIMessage。ChatGPT 订阅模式的 SSE 读取路径也改为边读边解析工具调用,不再完整缓存响应体后再二次解析,让长回复时的内存占用、CPU 抖动和能耗更可控。
    Based on SwiftUI traces of AI Chat streaming replies, Deck now reduces the refresh and auto-scroll frequency for streamed text and avoids animating every small bottom-scroll update, cutting repeated LazyVStack, root-geometry, and SwiftUI transaction layout pressure. The streaming text accumulator now appends incrementally instead of rebuilding the full response with repeated joined() work, and the streaming message view no longer creates temporary AIMessage values for every refresh. The ChatGPT subscription SSE path also parses tool calls while reading the stream instead of caching the full response body and parsing it again at the end, keeping memory usage, CPU churn, and energy impact more controlled during long replies.

  • 启动路径轻量化
    Deck 现在会把部分非首帧必需的准备工作延后到真正用到时再初始化,并移除重复的启动清理与冗余事件分发启动,让整体启动过程更轻、更稳。
    Deck now defers parts of its non-first-frame setup until they are actually needed, while also removing duplicate launch cleanup and redundant event-dispatch startup work for a lighter and more stable startup path.

  • 安装包图标显示更稳定
    Deck 的 DMG 安装包现在会为最终安装包文件写入自定义图标,并默认使用浅色安装包图标,避免打包机器处于暗黑模式时把深色安装包外壳发布给所有用户。
    Deck’s DMG installer now applies a custom icon to the final installer file and defaults to the light installer icon, avoiding dark installer shells being shipped to all users when the packaging machine is in Dark Mode.

  • 竖版模式链接行图标升级
    竖版列表中的链接类型条目,现在会先显示复制来源 App 的图标;网站 favicon 加载完成后自动替换为网站图标,加载失败则保留 App 图标。
    In the vertical list, URL items now show the source app's icon by default; once the site's favicon loads it replaces the app icon automatically, and falls back gracefully if the favicon cannot be fetched.

  • 链接预览占位图标统一
    当网站 favicon 没有提取到时,横板卡片中的链接预览现在会使用与预览顶部一致的灰白地球图标,不再显示突兀的蓝色链接占位图,让链接卡片在列表里更统一、更干净。
    URL preview cards now use the same subtle gray globe placeholder as the preview header when a site favicon cannot be fetched, replacing the bright blue link icon for a cleaner and more consistent card grid.

  • 竖版面板顶部与底部层次感优化
    竖版模式下,顶部搜索与标签区域已改为覆盖式三层结构:底层历史记录连续延伸到顶部,中层使用更重的渐变模糊材质做柔和过渡,顶层保留搜索与标签交互;同时底部工具栏也升级为更重的渐变模糊层,并优化队列模式栏的左右对齐、文案密度与按钮 hover 厚度,让整块面板上下更统一、更有连续性。
    In vertical mode, the search-and-tag area now uses the same layered overlay structure as the bottom toolbar: the history list continues underneath, a stronger gradient blur material creates a soft transition in the middle, and the interactive search/tag controls stay on top; the bottom toolbar also gets a heavier gradient blur, cleaner queue-bar alignment, lighter copy density, and slimmer hover states for a more unified top-to-bottom experience.

  • ASCII 氛围栏动画焕新
    Deck 底部的 ASCII 氛围栏已升级为更细腻的 braille 动画风格,并在不同状态下使用不同的动态效果,让整体观感更灵动、更有层次。
    Deck’s bottom ambient bar has been upgraded from ASCII to a more refined braille-style animation, using different motion effects in each state to create a more fluid and layered visual experience.

  • 文本预览底部模糊效果统一
    纯文本预览现在也采用与代码预览一致的底部模糊浮层布局,让预览区的整体视觉风格更统一、更干净。
    Plain-text previews now use the same bottom blurred overlay layout as code previews, creating a more unified and cleaner visual style across the preview area.

  • 横板卡片头部信息层级微调
    横板模式下,历史卡片头部左侧的来源 App 图标已适度放大,同时 App 名称与时间两行文字的上下间距也略微收紧,让卡片头部的识别性与视觉重心更舒服、更协调。
    Refined the header hierarchy of horizontal cards: the source app icon on the left is now slightly larger, while the spacing between the app name and timestamp has been tightened a bit to make the card header feel clearer, more balanced, and more comfortable to scan.

  • Tag 右键面板对齐与重命名手感优化
    右键点击 Tag 后弹出的操作面板中,底部颜色选择器现在采用更收敛的内边距、间距与按钮尺寸,整体左右边界会与上方菜单项更一致;同时编辑 Tag 标题时,除了按回车保存外,点击输入框外部区域也会自动提交重命名,而按 Esc 仍会直接取消,让这组交互更自然、更精致。
    Refined the Tag context menu alignment and rename flow: the bottom color picker now uses tighter insets, spacing, and dot sizing so its left and right edges align more cleanly with the menu items above; when renaming a Tag, clicking outside the inline text field now commits the edit in addition to Return, while Esc still cancels, making the interaction feel more natural and polished.

  • 历史条目重命名输入体验优化
    历史条目的自定义标题输入框现在支持更长的标题内容,并补齐了编辑时常用的 Command+A / C / V / X 快捷键;同时统一修复了占位文案居中、首次进入重命名时中文输入法首个拼音偶发不可见,以及长标题后输入区域水平偏移的问题,让标题重命名在英文与中文输入法下都更稳定、更自然。
    Improved the rename experience for history-item titles: the custom-title editor now supports longer names and restores standard editing shortcuts such as Command+A / C / V / X; it also fixes placeholder centering, the occasional invisible first pinyin keystroke when entering rename mode with a Chinese IME, and horizontal offset issues after editing long titles, making title editing feel more stable and natural in both Latin and CJK input methods.

修复 / Fixes

  • 模拟键盘输入粘贴失控止损
    模拟键盘输入粘贴现在改为可取消的安全会话,并加入多重“失控止损”保护:输入过程中按 Esc、Ctrl+C / Ctrl+X、Command+C / Command+X、Command+.,再次触发模拟输入快捷键,或按下 Deck 主面板 / AI Chat 快捷键,都会立即停止正在进行的模拟输入;鼠标点击、滚轮、锁屏、屏幕睡眠、系统睡眠和会话切换也会触发硬停止。Deck 自己发送的合成输入事件会被标记并排除,避免误把自动输入识别成用户打断;同时超大文本会在启动前被安全拦截,不再因为误触快捷键把系统拖入长时间不可操作状态。
    Typing Paste is now a cancellable safety session with multiple panic-stop protections. While simulated typing is running, pressing Esc, Ctrl+C / Ctrl+X, Command+C / Command+X, Command+., triggering the Typing Paste shortcut again, or pressing Deck’s main-panel / AI Chat hotkeys immediately stops the active simulated input. Mouse clicks, scrolling, screen lock, display sleep, system sleep, and session switching also hard-stop the session. Deck marks and ignores its own synthetic input events so automated keystrokes do not cancel themselves, and oversized text is blocked before starting so an accidental shortcut no longer leaves the system stuck in a long, uncontrollable typing run.

  • 本地自动化协议与剪贴板访问安全加固
    DeckClip 的剪贴板历史读取现在会在安全模式下走系统身份验证弹窗,readclipboard.latestclipboard.listclipboard.search 等只读入口都不再能绕过用户验证直接读取历史内容,相关提示已补齐多语言文案。deck://paste 深链粘贴也改为强制身份验证,并修复验证通过后可能回退到旧的前台 App、导致乱跳或粘贴到错误窗口的问题:现在带 targetBundleId 时只会粘贴到明确目标 App,目标 App 未运行会返回清晰错误;不带目标的 deck://paste 只会把内容复制到系统剪贴板,不再擅自模拟 Cmd+V。与此同时,后台加密密钥读取改为 Keychain 失败时 fail-closed,只有明确不存在时才创建新密钥;上下文感知排序会截断异常超长窗口标题;DeckClip socket 的读写、鉴权与 HMAC 校验也从主线程挪到 socket 队列,避免本地 CLI 高频请求拖慢 Deck UI。DeckClip AI Chat 的流式会话状态也纳入锁保护,断连、写失败、取消与聊天 open/send/close 并发发生时,不再跨队列裸读写当前会话 ID,避免漏关会话或触发并发读写崩溃。
    DeckClip history reads now require the system authentication prompt in secure mode, so read, clipboard.latest, clipboard.list, and clipboard.search can no longer bypass user verification before accessing clipboard history; the new prompts are localized. deck://paste deep-link paste now also requires authentication and fixes a case where, after successful verification, Deck could fall back to a stale previous app and jump to or paste into the wrong window. With targetBundleId, Deck now pastes only into that explicit running target app and returns a clear error if it is unavailable; without a target, deck://paste safely copies the item to the system pasteboard instead of injecting Cmd+V. In parallel, background crypto now fails closed on Keychain errors and creates a key only when it is definitely missing; context-aware ranking clamps abnormal window-title lengths; DeckClip socket I/O, auth, and HMAC validation have moved off the main thread to keep high-frequency local CLI traffic from stalling the Deck UI. DeckClip AI Chat streaming-session state is now lock-protected as well, so disconnects, write failures, cancellation, and chat open/send/close commands no longer read or mutate the current session ID across queues unsafely, preventing leaked chat sessions and possible concurrent String access crashes.

  • Markdown 超长链接与大文件预览卡死修复
    修复 Markdown 文件或 Markdown 文本中包含超长连续链接、超长单词或异常大内容时,预览窗口可能在 CoreText / TextKit 排版阶段长时间占满 CPU、甚至看起来卡死的问题。Markdown 文件预览、横板卡片预览和“拷贝纯文本”现在都使用有上限的文件读取路径;内联链接解析限制标签和 URL 扫描长度;渲染阶段会把超长连续 token 以“头部 + … + 尾部”的形式做显示级截断,避免把几十万字符的 URL 原样交给系统排版。大 Markdown 文档的 TextKit 预览也不再强制主线程全量 layout,而是只预热可见前段并估算滚动高度,让异常 Markdown 仍能打开、滚动和关闭,不再拖垮主界面。
    Fixed a CPU hang where Markdown files or Markdown text containing extremely long continuous URLs, long unbroken tokens, or unusually large content could keep CoreText / TextKit busy during preview layout and make the preview window appear frozen. Markdown file preview, horizontal-card preview, and “Copy Plain Text” now all use bounded file reads; inline-link parsing limits label and URL scanning; rendering now display-truncates long unbroken tokens as “head + … + tail” instead of handing hundreds of thousands of characters directly to the system text layout engine. Large Markdown documents also avoid forced full TextKit layout on the main thread, warming only the visible leading range and estimating scroll height so pathological Markdown can still be opened, scrolled, and closed without stalling the UI.

  • 复制后立即打开面板的实时刷新修复
    修复复制内容后立刻打开面板,或复制保存完成时面板仍在打开动画中,最新记录可能不会实时出现在列表顶部的问题。Deck 现在会在面板开始展示时就把数据层标记为可见状态;保存完成的新剪贴板记录会立即插入当前 UI,并同步合并到首屏预备快照中,避免动画结束后旧快照覆盖刚复制的新内容。音效触发时序保持不变。
    Fixed an issue where a newly copied item might not appear at the top of the panel when the panel was opened immediately after copying, or while the panel was still animating in. Deck now treats the data layer as visible as soon as presentation begins; newly saved clipboard items are inserted into the live UI immediately and merged into the prepared first-screen snapshot so the animation-completion commit cannot overwrite fresh content. The sound feedback timing is unchanged.

  • 设置页开机自启动抖动与 CPU 占用异常修复
    修复替换 /Applications/Deck.app、刷新版本号或系统短暂同步登录项状态后,设置页“开机自启动”开关可能左右抖动并伴随 CPU 占用升高的问题。Deck 现在会把开关点击与系统状态同步分离:只有用户主动切换时才调用 SMAppService 注册/取消注册,程序化刷新只读取并反映真实登录项状态,避免 SwiftUI onChange 反复触发注册/反注册闭环;同时对启动时的辅助功能权限提示增加二次确认,减少 App 刚替换或 LaunchServices / TCC 刷新期间误报“权限丢失”的情况。
    Fixed an issue where the “Launch at Login” switch in Settings could jitter back and forth and drive high CPU usage after replacing /Applications/Deck.app, changing the version metadata, or while macOS was briefly refreshing login-item state. Deck now separates user-initiated switch changes from system-state synchronization: SMAppService register / unregister is called only when the user toggles the switch, while programmatic refreshes simply reflect the actual login-item status, preventing a SwiftUI onChange feedback loop. Startup Accessibility permission prompts also get an additional confirmation pass to reduce false “permission lost” alerts while LaunchServices / TCC is catching up after an app replacement.

  • DeckClip 流式回复时回车误清空输入修复
    修复了 AI 正在流式回复时按 Enter 会误清空输入框草稿的问题;现在只有在非斜杠命令且聊天状态为 Ready 时才允许发送,流式回复未完成时按 Enter 会提示"回复尚未完成,请先等待或按 ESC 停止",输入内容不再丢失。
    Fixed an issue where pressing Enter during an AI streaming reply would accidentally clear the input draft; now messages are only sent when the input is not a slash command and the chat is in Ready state. If the reply is still streaming, pressing Enter shows a warning instead of clearing the input.

  • DeckClip 客户端连接异常重置与超时控制
    DeckClip 客户端现在会在命令执行遇到连接异常(响应 ID 不匹配、读取失败等)时主动重置坏连接,避免后续命令继续使用已损坏的传输通道;同时为普通命令增加了 10 秒快速超时和 30 秒默认超时,防止无限等待无响应的连接,AI 流式回复命令则保持无超时以适配长回复场景。
    The DeckClip client now proactively resets broken connections when command execution encounters transport errors (response ID mismatch, read failure, etc.), preventing subsequent commands from reusing a damaged channel; quick commands get a 10-second timeout and regular commands a 30-second timeout to avoid hanging on unresponsive connections, while AI streaming commands remain un-timed to accommodate long replies.

  • DeckClip 传输层缓冲区上限防护
    传输层接收缓冲区现在增加了 16 MB + 6 字节协议头的最大长度限制,防止异常或恶意超大帧导致内存无限膨胀;超出限制时会返回明确的协议错误并关闭连接。App 端发送帧也同步增加了 16 MB 载荷上限检查,避免发出超出协议定义的帧。
    The transport layer now enforces a maximum receive buffer size of 16 MB + 6 bytes (protocol header), preventing unbounded memory growth from abnormally large or malicious frames; exceeding the limit returns a clear protocol error and closes the connection. The App-side send path also adds a matching 16 MB payload-size check so it never sends a frame that exceeds the protocol definition.

  • DeckClip 错误信息本地化补齐
    为"接收缓冲区过大"等新增协议错误补齐了中英日韩等多语言文案,避免用户看到硬编码中文错误提示。
    Added localized strings for new protocol errors such as "receive buffer too large" across Chinese (Simplified / Traditional), English, Japanese, Korean, and other supported languages, preventing hardcoded Chinese error messages from appearing to non-Chinese users.

  • DeckClip 配置目录 fallback 修复
    app_support_dir 函数现在会在 HOME 环境变量缺失时回退到 /tmp/deckclip,避免在特殊环境下因路径为空而崩溃。
    The app_support_dir function now falls back to /tmp/deckclip when the HOME environment variable is missing, preventing a crash from an empty path in unusual environments.

  • AI 与插件网络安全防护收紧
    收紧 AI 网页抓取、脚本插件 fetch 与 DeckClip 本地协议的安全边界:插件 ID 不再允许通过 . / .. 归一化逃逸脚本目录,DeckClip 请求签名现在覆盖完整 args 参数,AI web_fetch 与插件 fetch 会阻断 localhost、内网、link-local、.local 等本机/局域网地址;相关拒绝提示也补齐了多语言文案。
    Tightened the security boundaries for AI web fetch, script-plugin fetch, and the DeckClip local protocol: plugin IDs can no longer escape the scripts directory through . / .. normalization, DeckClip request signatures now cover the full args payload, and AI web_fetch plus plugin fetch now block localhost, private-network, link-local, and .local targets. The related rejection messages are also localized.

  • 预览窗口随面板高度实时重定位
    现在在横板或竖版模式下调整主面板高度后,已打开的预览窗口会立即跟随新的面板位置重新对齐,不再停留在旧高度导致被面板遮住;如果先关闭再重新打开预览,也会继续保持正确位置。
    The preview window now repositions immediately when the main panel height changes in horizontal or vertical mode, instead of staying anchored to the old height and getting covered by the panel; reopening the preview still lands in the correct position as before.

  • 置顶面板下聚焦卡片拖拽预览裁切修复
    当启用“面板始终置顶”并拖拽当前聚焦的剪贴板卡片时,拖拽预览现在会按卡片最外层轮廓完整生成,不再把选中光环错误裁掉,也不会再在四个圆角位置出现多余的边缘残影。
    Fixed a drag-preview cropping issue for the always-on-top panel: when dragging the currently focused clipboard card, Deck now captures the full outer shape of the card instead of clipping the selection halo, eliminating the extra edge artifacts that could appear around the four rounded corners.

  • 置顶面板下拖拽卡片层级修复
    当启用“面板始终置顶”后,拖拽卡片时面板现在会只在拖拽进行期间临时放宽窗口层级,让系统拖拽卡片可以正确显示在面板上方;拖拽结束后会立即恢复原本的置顶层级,因此平时仍然保持 Deck 压住 Dock 与普通窗口的现有行为。
    Fixed a layering issue when dragging cards with the always-on-top panel enabled: Deck now temporarily relaxes the panel window level only during the drag so the system drag card can appear above the panel, then immediately restores the original always-on-top level afterward, preserving the normal behavior of staying above the Dock and regular windows.

  • 卡片拖拽起始与回弹闪烁修复
    修复了历史卡片在开始拖拽时偶发闪一下,以及拖到一半取消后系统将卡片飞回原位时,源卡片区域还会再做一次亮度过渡的问题。Deck 现已移除这层多余的本地透明度变化,让横板卡片与竖版列表项在拖拽预览、取消回弹和最终落位时都更稳定、更自然。
    Fixed a visual flicker affecting clipboard items both when a drag begins and when a cancelled drag animates back into place. Deck now removes the extra local opacity transition on the source item, making drag previews, cancel-return animations, and final settle states feel more stable and natural in both the card grid and vertical list layouts.

  • 预览底栏高度与快捷操作悬停反馈统一
    当预览底部出现“在 IDE 中打开”或“显示二维码”等快捷操作时,底栏高度现在会保持一致,不再因为附加控件出现而把整个底部撑开;这些快捷操作也补上了与面板其他按钮一致的 hover 高亮反馈。
    When quick actions such as “Open in IDE” or “Show QR Code” appear in the preview footer, the footer now keeps a consistent height instead of expanding the bottom area; these actions also now get the same hover highlight feedback as the rest of the panel controls.

  • 预览底栏信息进一步精简,并补充复制时间
    预览底栏不再显示链接、代码等内容的类型信息,非图片内容也不再显示大小;现在只有图片预览会保留大小显示,同时底栏会按系统当前地区与时间偏好显示复制时间,并移除“空格关闭”提示,让整体信息更干净。
    The preview footer no longer shows type information for links, code, and other content, and non-image previews no longer show size; only image previews keep the size indicator, while the footer now shows the copied time using the system’s current regional and time preferences and removes the “Space to close” hint for a cleaner overall layout.

  • 空格键链接预览与图片预览底部连续性优化
    空格键打开的链接预览现在改为与代码/文本预览一致的底部渐变覆盖层,不再使用灰色硬切底栏;同时图片预览也重构为三层结构:最底层是灰白棋盘格透明背景,中间层显示图片正文,最上层覆盖底部渐变与右上角放大按钮。这样在图片向下滚动或内容贴近底部时,底部露出的区域也会保持连续、柔和,并能更直观地表达透明区域。
    The space-bar link preview now uses the same bottom gradient overlay pattern as the code/text previews instead of a gray hard-cut footer; the image preview has also been restructured into three layers: a gray checkerboard transparency background at the bottom, the image content in the middle, and the bottom gradient with the top-right zoom controls on top. This keeps the exposed area visually continuous and softer when the image is scrolled downward or sits close to the footer, while also making transparent regions easier to read.

  • 预览尺寸切换稳定性修复
    当预览在图片、文本等不同尺寸内容之间切换时,现在会统一采用更稳定的直接切换方式,避免出现错误的缩放、位移或残留过渡效果。
    When switching previews between differently sized content such as images and text, Deck now uses a more stable direct transition to avoid incorrect scaling, drifting, or leftover transition artifacts.

  • 图片切换到文本时的底部遮挡修复
    修复了从图片预览切换到纯文本预览时,底部信息栏偶发覆盖最后几行文本的问题。现在文本预览会在首帧和后续几何更新中稳定保留底部滚动留白,确保长文本末尾始终可以完整滚动到可视区域。
    Fixed an issue where switching from an image preview to a plain-text preview could cause the footer bar to overlap the last few lines of text. The text preview now preserves its bottom scrolling inset consistently through the first frame and subsequent geometry updates, ensuring the end of long text remains fully reachable and visible.

  • 竖版模式搜索框展开时界面偏移修复
    在竖版模式下(左侧或右侧停靠),点击搜索按钮展开后,搜索框不再把整个面板内容横向撑开,屏幕边缘区域也不会再被裁切到可视范围外。
    In vertical mode (left or right docked), expanding the search field no longer pushes the entire panel content horizontally, and content near the screen edge is no longer clipped out of the visible area.

  • 滚动与导航回归修复
    修复了布局调整后出现的多个滚动与导航问题:Ctrl+A / Ctrl+E 现在能正确滚动到列表首尾并完全可见;重新打开面板时会自动导航回首项;点击历史项后的自动居中滚动现已改为延迟触发,避免第一下点击立刻位移影响双击手感;横板与竖版模式下的滚轮导航也恢复正常。
    Fixed several scrolling and navigation regressions introduced by layout changes: Ctrl+A / Ctrl+E now correctly scroll to the list head/tail with full visibility; reopening the panel automatically navigates back to the first item; the automatic centering scroll after clicking a history item is now delayed so the first click no longer shifts the target under your cursor and interferes with double-clicking; scroll wheel navigation in both horizontal and vertical modes has been restored.

  • 布局模式切换后快捷键失效回归修复
    修复了切换横板与竖板模式后面板内快捷键失效的问题(例如 Command + , 打开设置)。根因是新旧视图实例在切换时共享同一个事件处理器 key,导致旧实例误删新实例的监听器;现已改为实例级唯一 key 以避免冲突。
    Fixed a regression where panel shortcuts (such as Command + , to open settings) stopped working after switching between horizontal and vertical layouts. The root cause was that old and new view instances shared the same handler key during the transition, causing the old instance to accidentally remove the new instance’s listener; this is now resolved by using instance-unique keys.

  • AI 发送崩溃修复
    修复了所有 AI 模式(助手、订阅、API、一键配置)在发送消息后立即崩溃的问题。根因是在 AIService.sendUserMessage 中,provider.sendMessage(...) 返回的 AsyncThrowingStream 被包裹在 TaskLocal.withValue 作用域内创建,导致任务生命周期交错引发 swift_task_dealloc 崩溃;现已移除这层不必要的 withExecutionContext 包装,同时保留真正工具执行时的执行上下文设置。
    Fixed a crash that occurred immediately after sending messages in all AI modes (assistant, subscription, API, and one-click configuration). The root cause was that the AsyncThrowingStream returned by provider.sendMessage(...) was created within a TaskLocal.withValue scope in AIService.sendUserMessage, causing task lifecycle interleaving and a swift_task_dealloc crash; this unnecessary withExecutionContext wrapper has been removed while preserving the execution context setup for actual tool execution.

  • AI 面板、预览窗口与局域网提示并发稳定性修复
    修复了 AI 聊天浮窗、预览窗口以及局域网分享验证提示中的一组主线程隔离与计时器边界问题,减少了相关 Swift 并发构建告警,并让界面尺寸变化、滚动观察与倒计时更新更稳定。
    Fixed a set of main-thread isolation and timer-boundary issues across the AI chat panel, preview window, and LAN sharing verification alerts, reducing related Swift concurrency build warnings and making panel resizing, scroll observation, and countdown updates more stable.

  • 剪贴板、AI OAuth 与规则导入导出并发稳定性修复
    继续修复了一批低风险的 Swift 并发边界问题:收紧了剪贴板服务中的电源状态监听、暂停恢复定时器与提示音播放路径,避免非主线程边界访问;同时移除了 AI 会话存储与 OAuth 持久化中共享 ISO8601DateFormatter 的并发风险,并将规则导入导出路径调整为更纯粹的编解码工具边界,减少相关构建告警并提升整体稳定性。
    Continued addressing a batch of low-risk Swift concurrency boundary issues: tightened the clipboard service’s power-state observation, pause-resume timer, and feedback sound paths to avoid crossing non-main-thread boundaries; removed shared ISO8601DateFormatter concurrency risks from AI conversation storage and OAuth persistence; and moved smart rule import/export onto a cleaner codec-only boundary, reducing related build warnings and improving overall stability.

  • IDE 路径识别逻辑收紧修复
    收紧了 IDE 路径识别逻辑,不再将根目录或目录路径误识别为有效文件锚点,避免点击"在 IDE 中打开"时意外打开 Macintosh HD 根目录。
    Tightened the IDE path recognition logic to no longer treat the root directory or directory paths as valid file anchors, preventing clicks on "Open in IDE" from unexpectedly opening the Macintosh HD root directory.

  • 置顶面板下按钮 Tooltip 被遮挡修复
    当启用"面板始终置顶"时,主面板按钮上的系统原生 .help(...) Tooltip 会被高层级面板窗口遮挡而完全不可见。现已将面板内的操作按钮与预览浮窗快捷按钮的 Tooltip 替换为独立的边框浮层窗口,其窗口层级始终比当前面板高一层,因此不会再被裁切或遮挡;Tooltip 默认显示在按钮正上方并自动避让屏幕边缘,短文案按自然宽度单行展示、长文案自动换行。圆角气泡移除了多余的阴影,去掉了四个角落的灰色直角残留,整体贴边更紧凑。同时补齐了"支持 Deck 开发"等 Tooltip 的多语言词条,使其在英文界面下也能正确显示。
    Fixed button tooltips being invisible under the always-on-top panel: when the panel is set above other apps, the native system .help(...) tooltips on panel buttons were rendered below the panel window and completely hidden. Deck now replaces these with an independent borderless floating window that is always ordered one level above the panel, so it can never be clipped or obscured; the tooltip defaults to showing directly above the button and automatically avoids screen edges. Short labels display in a single line at natural width, while long labels wrap automatically. The rounded bubble has its excess shadow removed and the gray square corners that leaked outside the rounded shape have been eliminated, giving the tooltip a cleaner, tighter edge. Missing localization entries such as "支持 Deck 开发" have also been added so tooltips display correctly in the English interface as well.

Don't miss a new Deck release

NewReleases is sending notifications on new releases.