github yuzeguitarist/Deck v1.2.2
v1.2.2 | Orchestrated

latest releases: v1.4.5, v1.4.4, v1.4.3...
5 months ago

Deck

Deck

A modern, native, privacy-first clipboard OS for macOS


Release Notes v1.2.2

新增 / Added

  • 新增多语言:法语 / 韩语 / 日语
    Deck 增加法语、韩语、日语的多语言支持。
    Deck adds French, Korean, and Japanese localization support.

  • 新增反馈邮件撰写入口(关于设置 + 剪贴板面板顶部)
    在“关于”设置页新增「提交反馈」,并在剪贴板面板顶部栏加入反馈按钮;使用内置 HTML 模板并注入系统/应用诊断信息与本地化标签。
    Added a feedback email composer and wired it into About settings and the clipboard panel top bar, using a bundled HTML template with live system/app diagnostics and localized labels.
    FeedbackEmailService.swift · SettingsView.swift · TopBarView.swift · feedback.html · Localizable.xcstrings

  • 新增反馈邮件多语言模板 + 工单号
    反馈邮件会根据 Locale.preferredLanguages 选择 feedback_en / feedback_de / feedback_kr / feedback_fr / feedback_ja / feedback_zh_hant / feedback 模板,并且每次生成随机 UUID 工单号。
    Feedback email now selects a localized HTML template based on Locale.preferredLanguages and generates a random UUID ticket ID each time.
    FeedbackEmailService.swift · feedback_en.html · feedback_de.html · feedback_kr.html · feedback_fr.html · feedback_ja.html · feedback_zh_hant.html

  • 设置侧边栏 Tab/Shift+Tab 循环切换
    在设置窗口中支持 Tab/Shift+Tab 在左侧侧边栏标签间循环切换(含 wrap-around),且仅在无 Command/Control/Option 修饰键时生效。
    Added Tab/Shift+Tab cycling with wrap-around for the settings sidebar, scoped to the settings window and only when no Command/Control/Option modifiers are held.
    SettingsView.swift

  • 新增 Cmd+Option+V「键盘逐字输入粘贴」
    新增全局 Cmd+Option+V:从系统剪贴板读取 string/rtf/rtfd/html 文本并用 CGEvent 逐字符输入(带轻微延迟以提升远程会话稳定性),适合 VNC 等不支持普通粘贴的场景;无辅助功能权限时不拦截按键。
    Added global Cmd+Option+V “typing paste”: reads string/rtf/rtfd/html from the system pasteboard and types characters via CGEvent with a slight delay for remote-session stability (e.g., VNC); does not intercept the shortcut without Accessibility permission.
    PasteQueueService.swift

  • 修复键盘逐字输入的参数标签编译错误
    keyboardSetUnicodeString 调用补上 stringLength: 标签,消除编译错误。
    Fixed a compile error by adding the stringLength: label to keyboardSetUnicodeString calls.
    PasteQueueService.swift

  • Orbit 设置页与独立 Orbit 窗口集成
    新增 Orbit 设置页(引导/已安装/安装中等阶段)、Option 键交互、Orbit 窗口显示/隐藏与安装进度流;并将独立 Orbit 应用代码整合到 Deck/Deck/Orbit,使用其 window controller 管理独立环形窗口。
    Added the Orbit settings tab UI (intro/guide/installed stages), option-key handling, Orbit window show/hide, and install progress flow; integrated standalone Orbit app code under Deck/Deck/Orbit and used its window controller for the separate ring window.
    OrbitSettingsView.swift · OrbitWindow.swift · Deck/Deck/Orbit/

  • Orbit 安装器与资源加载
    实现内置图标/zip 资源的安装器与加载器,并支持安装检测;补充 Orbit 资源与纹理加载 fallback。
    Implemented installer + resource loader for bundled icon/zip and install detection; added Orbit assets/resources and improved texture loading fallbacks.
    OrbitInstaller.swift · OrbitResources.swift · OrbitIcon.png · OrbitApp.zip · black_hole_texture.png · BlackHoleView.swift

  • 空间预览:多文件浏览
    支持在空间预览面板中浏览一个剪贴板项的多个文件(chips + 上一/下一项),并在文件之间平滑淡入淡出;每个文件可选择 PDF/Markdown/Office/Image 或不支持时的 fallback。
    Implemented a multi-file preview flow in the space preview panel so a clipboard item with multiple files can be browsed in order, with per-file preview selection and a smooth fade between files.
    PreviewWindowController.swift

Deck × Orbit

  • Orbit 组件移植与模型冲突修正
    移植 Magic Keyboard 片段组件,调整 Option 键视觉,并解决剪贴板模型命名冲突;完善 ring 相关 view model 与分享/卡片等联动。
    Ported the Magic Keyboard snippet component, adjusted Option key visuals, and resolved clipboard model name conflicts across ring-related models/services/views.
    OrbitMagicKeyboardView.swift · OrbitClipboardModels.swift · ClipboardRingViewModel.swift · ClipboardShareService.swift · ClipboardCardView.swift

  • Orbit CLI Bridge 服务线程模型与保护
    Orbit CLI Bridge 请求处理不再整段 @MainActor;仅在必须操作(如 paste)切主线程,JSON 编码与响应在后台完成;增加高阈值速率限制与响应体上限(20MB)防止极端负载拖慢 UI。
    Orbit CLI Bridge service avoids running the whole request pipeline on @MainActor; only switches to main for required UI operations (e.g. paste), keeps JSON encoding/responses off-main, and adds rate limiting plus a 20MB response cap to protect UI smoothness under load.
    OrbitCLIBridgeService.swift

优化 / Improvements

  • CLI Bridge 代码块悬停复制按钮
    CLI Bridge 代码块右上角新增悬停态复制图标;仅当鼠标进入代码块时显示,点击使用 NSPasteboard 复制命令。
    Added a hover-only copy icon in CLI Bridge code blocks (top-right overlay) and copy via NSPasteboard so it only shows when the cursor is inside the code block.
    CLIBridgeSettingsView.swift

  • 脚本插件创建代码块支持悬停复制
    在“创建脚本插件”的代码块右上角加入与 CLI Bridge 相同的复制按钮(悬停显示、点击线条动画变对勾);新增 CodeBlockView 并替换两处代码片段为可复制样式,同时引入 AppKit 以使用剪贴板。
    Added the same hover-copy button used in CLI Bridge to the “Create Script Plugin” code blocks (hover-only, line animation to checkmark); introduced CodeBlockView, replaced two code snippets with copyable blocks, and imported AppKit for pasteboard access.
    ScriptPluginsSettingsView.swift

  • 局域网 IP 复制按钮采用 CLI Bridge 动画样式
    Local Network IP 的复制按钮改为复用 CopyIconButton,并使用 CLI Bridge 同款 doc→check 动画与时序,同时保留原有强调色。
    Updated the Local Network IP copy button to use the CLI Bridge–style animated doc→check icon with the same timing while keeping the accent color, by replacing the inline button with a reusable CopyIconButton.
    LANSharingSettingsView.swift

  • “添加设备”按钮改为明确 CTA 样式
    “添加设备”按钮改为全宽强调填充、半粗体标签,并完善禁用态样式,使其不再像输入框。
    Updated the “Add Device” button to read as a real CTA (full-width accented fill, semibold label, and disabled styling) so it no longer resembles an input field.
    LANSharingSettingsView.swift

  • 已连接设备空态优化
    移除“已连接设备”的加载提示与圈圈,空态改为多语言文案「暂无已连接的 Deck 设备」。
    Removed the loading text/spinner from the “Connected Devices” section and replaced the empty state with a localized “No connected Deck devices” message.
    LANSharingSettingsView.swift

  • 面板动画更顺滑:延后重载与保留热缓存
    将数据 reload 延后到面板滑入动画完成后执行;关闭时不再完全清空列表而是保留少量 warm cache,避免动画与 DB/SwiftUI 重建竞争(UI 文件保持不改动)。
    Moved data reload to run after the panel slide animation finishes, and changed close behavior to keep a small warm cache instead of fully purging, so animation doesn’t compete with heavy DB + SwiftUI rebuilds (UI files left untouched).
    MainWindowController.swift · DeckDataStore.swift

  • 面板动画与 Reduce Motion 细节打磨
    Reduce Motion 下强制动画时长为 0;hide 使用 easeIn、show 保持 easeOut;动画结束后移除残留动画状态。
    Reduce Motion now forces duration 0; hide uses easeIn while show stays easeOut, and the slide animation is removed on completion to avoid residual state.
    MainViewController.swift

  • 弹出面板视觉统一
    增加弹出面板圆角、减少顶部间距,使整体观感更和谐统一。
    Added popup panel corner radius and reduced top spacing for a more cohesive visual appearance.

  • 弹出动画路径优化与旧系统 blur 降负担
    将重活移出 present 动画;简化 Spaces 行为;present easing 调整为更柔和的 easeInEaseOut;在较旧的 macOS 上移除多余的 behind-window blur(避免双层 blur)。
    Optimized popup animation by moving heavy work out of the present animation, simplifying Spaces behavior, using gentler easeInEaseOut easing, and removing extra behind-window blur on older macOS to avoid double-blur work.
    MainWindowController.swift · MainViewController.swift · DeckContentView.swift

  • 数据准备更早提交,减少动画后抖动
    将“提交 UI”的时机提前到准备好就提交,让更新可发生在动画过程中;同时避免 setPanelActive 用缓存覆盖刚提交结果。
    Submits UI updates as soon as data is ready (during animation) and prevents setPanelActive from overwriting freshly committed results via cache.
    DeckDataStore.swift · MainWindowController.swift

  • 历史列表初始选择更稳定,减少末尾闪动
    resetInitialSelection(force:) 增加 force 参数;上下文感知开启时切换应用后在 refreshDisplayItems(...) 后强制重置选择;并通过 guard selectedId == nil 避免后续提交/重排反复触发选中导致“末尾闪两下”。
    Improved initial selection stability by adding resetInitialSelection(force:), forcing selection reset after app switches when context-aware mode is on, and guarding on selectedId == nil to prevent repeated selection during commits/reorders.
    HistoryListView.swift

  • 搜索/粘贴/写入路径性能优化(UX 不变)
    大图 blob 写入改为异步存储以避免 UI 相关流程同步 IO;搜索 lowercasing 做上限并避免额外分配;粘贴板字符串只取一次,银行卡检测单次扫描并尽早退出。
    Applied UX-neutral performance optimizations: large image blob writes now store asynchronously to avoid sync IO on UI-driven flows; search lowercasing is capped and avoids extra allocations; pasteboard string fetched once and bank-card detection is single-pass with early exit.
    DeckSQLManager.swift · SearchService.swift · ClipboardService.swift

  • 热路径最小化优化(保持交互与行为一致)
    SearchService 增加跨击键的 prepareLowercasedText 有界缓存与安全 range 转换、在安全模式/会话退到后台时失效缓存,并暴露 clearPreparedTextCache() 供内存压力清理;SmartContentCache 增加 inflight 去重、将 CPU 工作移到 detached task、避免竞态覆盖缓存,并在失效/清理/内存压力时取消 inflight;Cursor Assistant 将数字键映射提升为静态以减少每次事件分配;内存压力处理联动清理 SearchService 缓存。
    Applied minimal, interaction-neutral optimizations across hot paths: SearchService adds a bounded cross-keystroke cache for prepareLowercasedText, safe range conversion, security-mode/session-resign cache invalidation, and exposes clearPreparedTextCache() for memory pressure; SmartContentCache adds inflight dedupe, moves CPU work to a detached task, avoids cache overwrites on races, and cancels inflight tasks on invalidation/clear/memory pressure; Cursor Assistant lifts the numeric key map to static; memory pressure now clears SearchService cache.
    SearchService.swift · SmartContentCache.swift · CursorAssistantService.swift · DeckDataStore.swift

  • 剪贴板检查合并与 OCR 读取优化
    合并重叠的剪贴板检测,nil item 也会消费 changeCount;为 CLI 预热 recent cache;OCR 避免全量 blob 读取。
    Coalesced overlapping clipboard checks, consumed changeCount on nil items, warmed recent cache for CLI, and avoided full blob reads for OCR.
    ClipboardService.swift · DeckDataStore.swift · OCRService.swift

  • 设置窗口 Auto Layout 循环缓解
    通过在普通容器视图中承载 SwiftUI,缓解设置窗口的 Auto Layout loop。
    Mitigated the settings window Auto Layout loop by hosting SwiftUI in a plain container view.
    SettingsWindowController.swift

变更 / Changes

  • 反馈邮件撰写:不再走 mailto,优先系统邮件撰写器
    反馈邮件流程不再使用会拉起浏览器的 mailto;始终优先用 NSSharingService 打开系统邮件撰写器;模板读取失败时也会打开邮件并填入纯文本占位,避免空页面;仅当服务不可用时才尝试打开 Mail 应用本身。
    Feedback email no longer uses mailto (browser-triggering); it now prefers composing via NSSharingService and falls back to plain-text content if template loading fails to avoid a blank email; only tries opening the Mail app itself when the service is unavailable.
    FeedbackEmailService.swift

  • 设置布局重整与侧边栏顺序调整
    隐私相关项仅保留在「隐私」,通用行为开关集中到「通用」;同时调整侧边栏标签顺序(将隐私/安全/存储/统计置于功能标签之前,并按“上下文感知 > 智能规则 > Cursor Assistant > … > 统计 > Orbit > 关于”排序)。
    Reorganized settings so privacy items live only under Privacy and general behavior toggles live under General, and reordered the sidebar tabs to a more logical grouping/order (context-aware before smart rules, Cursor Assistant under it, Statistics near the bottom with Orbit below, About last).
    SettingsView.swift · PrivacySettingsView.swift

  • 设置侧边栏顺序微调(Smart Rules / Cursor Assistant)
    侧边栏顺序更新为 Smart Rules 紧跟 Context Aware;同时让 Cursor Assistant 与 Template Library 相邻;顺序由 SettingsTab 的声明顺序与 SettingsTab.allCases 驱动。
    Moved the settings sidebar order so Smart Rules now sits directly under Context Aware, and Cursor Assistant is adjacent to Template Library; order is driven by SettingsTab declaration order and SettingsTab.allCases.
    SettingsView.swift

  • 标准快捷键卡片新增 ⌘⌥V 说明与本地化
    在标准快捷键卡片新增 ⌘⌥V 行,并增加“模拟键盘逐字输入粘贴”的提示文案;补齐德/英/法及其他已有语言的翻译。
    Added the ⌘⌥V row and a hint about simulated keyboard-typing paste in the Standard Shortcuts card, with full localization coverage (DE/EN/FR and existing locales).
    SettingsView.swift · Localizable.xcstrings

  • 移除 Focus 监测/恢复逻辑与相关依赖
    移除 Focus 轮询/监测相关定时器与恢复逻辑,并清理 Focus 状态权限/查询的辅助方法与 Intents 依赖。
    Removed Focus polling/monitor timers and restore logic, and cleaned up Focus status helpers and Intents dependencies.
    AppDelegate.swift · DeckIntents.swift

  • 默认脚本插件更新与清理策略调整
    默认脚本逻辑为“先清理旧的默认插件,再写入新的默认插件(保留字数统计)”,且只会删除/覆盖作者为 Deck 的默认脚本以避免误伤用户自定义脚本;启动时清理旧默认目录(base64-encode/base64-decode/url-encode/url-decode/json-format);新默认包含「字数统计 / 去除表情符号 / 去除 Markdown / 去空行 / 提取 URL / 提取邮箱 / 行号前缀」;新增 JSContext 桥接 Deck.detectEmails,内部调用 SmartTextService.shared 识别逻辑;去表情符号使用 Unicode emoji 匹配(含变体选择符/ZWJ),去 Markdown 移除常见语法与 HTML 标签并保留纯文本。
    Default scripts now clean old defaults before writing new ones (keeping Word Count) and only delete/overwrite Deck-authored defaults to avoid touching user scripts; startup clears old default directories (base64-encode/base64-decode/url-encode/url-decode/json-format). The new defaults include Word Count, Remove Emoji, Remove Markdown, Remove Empty Lines, Extract URL, Extract Emails, and Line Number Prefix. Added a JSContext bridge Deck.detectEmails that calls SmartTextService.shared detection; emoji removal uses Unicode emoji matching (including variation selectors/ZWJ), and Markdown removal strips common syntax + HTML tags while keeping plain text.
    ScriptPluginService.swift

  • Deck × Orbit 文案全面本地化
    Deck × Orbit 页面所有可见文案改为 NSLocalizedString,并补齐缺失词条「欢迎使用」的多语言翻译。
    All visible strings on the Deck × Orbit page are now localized via NSLocalizedString, and the missing “Welcome” entry has been added to the string catalog.
    OrbitSettingsView.swift · Localizable.xcstrings

  • 设置项归属移动(保持原 UI 样式与逻辑)
    将“辅助功能权限”从隐私移到通用(并迁移权限刷新计时逻辑到 SettingsView.swift);将“隐写密钥”从隐私移到安全并明确“用于文本隐写”,位置在安全信息之前;将“历史保留”从通用移到存储并放在存储信息之后。
    Moved “Accessibility permission” from Privacy to General (including permission refresh timing logic), moved “Steganography key” from Privacy to Security with clearer “for text steganography” wording (before Security info), and moved “History retention” from General to Storage (after Storage info), keeping the original UI style and behavior.
    SettingsView.swift

  • 隐私页副标题更新并补齐多语言
    隐私页副标题更新为「隐私保护设置」,并补齐/同步英/德/法/日/韩/繁中翻译与新增文案。
    Updated the Privacy page subtitle (“隐私保护设置”) and completed/synced translations for EN/DE/FR/JA/KR/zh-Hant for new/changed strings.
    Localizable.xcstrings

  • 字符串目录告警消除(保留翻译)
    通过将 7 条陈旧条目的 extractionState 设为 manual,清除 “no references” 警告且不删除翻译。
    Cleared 7 “no references” string-catalog warnings without deleting translations by setting stale entries’ extractionState to manual.
    Localizable.xcstrings

  • 移除 3 条陈旧字符串键以清理 Xcode 警告
    删除 3 条已废弃的字符串键,避免 Xcode 报 “References to this key could not be found in source code.”:插件清单 JSON 模板、transform(input) { return input.toUpperCase(); } 示例片段,以及「正在搜索附近的 Deck 设备...」。
    Removed three stale string entries to stop Xcode “References to this key could not be found in source code” warnings: the plugin manifest JSON template string, the transform(input) { return input.toUpperCase(); } snippet, and “正在搜索附近的 Deck 设备...”.
    Localizable.xcstrings

  • Mail 启动方式切换到现代 NSWorkspace API
    launchApplication("Mail") 替换为通过 Mail bundle ID 的 openApplication(at:configuration:completionHandler:)
    Switched Mail launching to the modern NSWorkspace API (openApplication(at:configuration:completionHandler:)) via Mail’s bundle ID.
    FeedbackEmailService.swift

  • Cursor Assistant「触发键」显示改为静态 Shift 键帽
    将“触发键”行改为静态 Shift keycap badge(不再用分段选择),匹配当前没有可选项的事实。
    Updated the Cursor Assistant “Trigger key” row to show a static Shift keycap badge instead of a segmented selection, matching the fact there’s no choice right now.
    SettingsView.swift

  • 标签 Tab 循环顺序覆盖系统 + 用户标签
    Tab 切换改为按“系统标签 + 用户自定义标签”的完整顺序循环,越过「重要」后若存在用户标签则继续,否则回到系统标签起点;cycleSystemTags 现遍历 vm.tags 的整体顺序以支持前后循环。
    Tab cycling now follows the full order of system + user tags, continuing to user tags after “Important” when present (otherwise wraps back to system tags); cycleSystemTags now iterates the overall vm.tags order to support forward/backward cycling.
    HistoryListView.swift

修复 / Fixes

  • 剪贴板分类误判降低(URL/电话/邮箱)与线程安全缓存
    更新剪贴板分类与识别逻辑,降低 URL/电话/邮箱的误判;收紧 URL 归一化并使分析缓存线程安全;同时补充 URL 边界用例测试。
    Updated clipboard classification to reduce URL/phone/email false positives, tighten URL normalization, and make analysis caching thread-safe; added URL edge-case tests.
    Extensions.swift · SmartTextService.swift · ClipboardItem.swift · SmartContentCache.swift · ExtensionsTests.swift · SmartTextServiceTests.swift

  • SmartTextService.swift 编译错误修复(保持改动收敛在单文件)
    将所有编译修复限定在 SmartTextService.swift:移除 resourceSpecifier 用法、修正 Substring trimming,并用本地 URL 归一化逻辑替换对 asCompleteURL() 的调用,避免在 nonisolated 上下文触发 MainActor 隔离问题。
    Fixed compile errors while keeping all fixes inside SmartTextService.swift: removed resourceSpecifier usage, fixed Substring trimming, and replaced asCompleteURL() calls with a local URL normalizer to avoid main-actor isolation in nonisolated contexts.
    SmartTextService.swift

  • 测试修复:URL/@mention 去重与短 Swift 片段识别
    修复测试失败:收紧 URL/@mention 去重逻辑(URL 去重额外规范化 percent-encoding,mention 正则避开 email),改进短代码片段的 Swift 识别阈值/模式,并将假名(kana)用例改为明确断言 false 以避免 unused locals;同时将手机号去重对 +86 等变体做归一化。
    Fixed test failures by tightening URL/@mention dedup (URL dedup now normalizes percent-encoding and mention regex avoids emails), improving Swift detection for short snippets, making the kana test explicitly assert false (avoids unused locals), and collapsing CN phone dedup for +86 variants.
    SmartTextService.swift · ExtensionsTests.swift

  • 修正裸域名 URL 正则:避免在带 scheme 的 URL 内部再次匹配
    调整 bare-domain URL 正则,避免在 http/https/ftp 等已带 scheme 的 URL 内部再次命中导致重复。
    Adjusted the bare-domain URL regex to avoid matching inside http/https/ftp URLs, which was causing duplicates.
    SmartTextService.swift

  • URL 识别去重:NSDataDetector 命中时跳过额外正则扫描
    NSDataDetector 已识别出 URL 时,URL 检测将跳过后续正则 pass,减少重复计数与重复命中。
    Changed URL detection to skip regex passes if NSDataDetector already found URLs, which should stop duplicate counts.
    SmartTextService.swift

  • 修复 XML/邮件识别去重:更少误判与重复计数
    将 XML 视为 data-like 内容,因此不再要求 structureScore ≥ 2;同时对 email 正则结果先做 percent-decoding 再去重,避免 mailto 场景重复计数。
    XML is now treated as data-like (no longer requires structureScore ≥ 2), and email regex results are percent-decoded before dedup to prevent double-counting in mailto cases.
    SmartTextService.swift

  • 不支持的剪贴板兜底:避免条目被丢弃
    当剪贴板解析失败时构建兜底 ClipboardItem(使用自定义 pasteboard type 并写入本地化占位文本),历史卡片会居中显示「Deck 无法解析本剪贴板内容」。
    Added an “unsupported clipboard” fallback so items aren’t dropped: builds a fallback ClipboardItem on parse failure (custom pasteboard type + localized placeholder text), and history cards render a centered “Deck 无法解析本剪贴板内容” message.
    ClipboardService.swift · ClipboardItem.swift · ClipItemCardView.swift · Localizable.xcstrings

  • DirectConnect 与导入链路加固
    修复 DirectConnect 随机生成与接收清理;加强导入大小限制、后台插入与流式对象上限。
    Fixed DirectConnect random generation and receive cleanup; hardened import sizing, background inserts, and streaming object limits.
    DirectConnectService.swift · DataExportService.swift

  • 迁移适配器 SQLite 句柄与表名查找保护
    为 sqlite 句柄/statement 增加 guard,并安全绑定表名查找以避免异常访问。
    Guarded sqlite handles/statements and bound table-name lookups safely to prevent invalid access.
    PasteNowMigrationAdapter.swift · PasteBarMigrationAdapter.swift · MaccyMigrationAdapter.swift

  • 迁移适配器补齐 SQLITE_TRANSIENT 兼容 shim
    在使用 sqlite3_bind_text 的迁移适配器中加入本地 SQLITE_TRANSIENT shim,保持与 PasteMigrationAdapter 的用法一致,修复 “Cannot find SQLITE_TRANSIENT” 编译错误且不改变行为。
    Added a local SQLITE_TRANSIENT shim in migration adapters that use sqlite3_bind_text, matching the pattern in PasteMigrationAdapter to fix the “Cannot find SQLITE_TRANSIENT” compile error without changing behavior.
    PasteNowMigrationAdapter.swift · PasteBarMigrationAdapter.swift

  • Cloud Sync 数值解码规范化与插件发布线程修正
    统一 Cloud Sync 的数值解码;保留 group payload 的时间戳与应用名;插件列表发布切回主线程。
    Normalized CloudSync numeric decoding, preserved group payload timestamps/app names, and moved plugin list publishing to main.
    CloudSyncService.swift · MultipeerService.swift · ScriptPluginService.swift

  • 多端接收元信息补齐:timestamp/appName 贯穿解码与投递
    扩展 DecodedItemPayload 包含 timestamp 与 appName,并在解码与投递路径贯通;MultipeerService 为 group items 写入这两项、单条使用默认值,并用其构建 ClipboardItem
    Extended DecodedItemPayload to include timestamp and appName, wiring them through decode and delivery; MultipeerService now sets these for group items, defaults them for single items, and uses the fields when building ClipboardItem.
    MultipeerService.swift

  • 生物识别类型检测更安全与 Application Support 路径兜底
    加强生物识别类型检测的安全性,并为 Application Support 路径增加 fallback。
    Safer biometric type detection and an Application Support path fallback.
    SecurityService.swift · DeckSQLManager.swift

  • 持久化/迁移健壮性加固(不改交互体验)
    ManualPeer 持久化补写 psk;Multipeer ifa_addr 判空;ClipboardService 的 isPaused 过期恢复限定主线程;PasteMigrationAdapter openDatabase 针对 db == nil 提供更明确错误与关闭流程。导出改为 throwing 写入 API;加密迁移改为 id 游标分页;embedding 迁移采用批量事务;大 ID 集合查询分块以避开 SQLite 变量上限。
    Hardened persistence/migration paths without UX changes: backfilled ManualPeer psk; guarded ifa_addr in Multipeer; ensured isPaused expiry restore runs on main; improved openDatabase error/close flow when db == nil; export writes now throw; encrypted migration uses id cursor paging; embedding migration batches in transactions; large ID queries are chunked to avoid SQLite variable limits.
    DirectConnectService.swift · MultipeerService.swift · ClipboardService.swift · PasteMigrationAdapter.swift · DataExportService.swift · DeckSQLManager.swift

  • 加密失败通知调用显式捕获
    notifyEncryptionFailureIfNeeded() 的调用改为显式捕获 self,修复相关编译/并发告警。
    Made the notifyEncryptionFailureIfNeeded() call use an explicit self capture to fix the related compile/concurrency warning.
    DeckSQLManager.swift

  • IDE 锚点发现更健壮(Cursor/VS Code)
    扩展 IDE anchor 发现逻辑:Cursor/VS Code 在缺失 AXDocument 时不再 hard-fail;AX 遍历更深并更适配 Electron 风格树;多属性提取带 proxy/title/value fallback,并对 file:// 值做更宽松的 URL/path 归一化;集中路径校验(存在性 + 可选 :line:col 去除)减少误判。
    Expanded IDE anchor discovery so Cursor/VS Code no longer hard-fails on missing AXDocument; AX traversal is deeper and more robust to Electron-style trees; added multi-attribute extraction with proxy/title/value fallbacks plus lenient URL/path normalization, and centralized file-path validation to avoid false positives.
    IDEAnchorService.swift

  • 替换不可用 AX 常量,避免 SDK 符号依赖导致编译失败
    将不可用的 AX 常量替换为基于字符串的 attribute,保留 navigation-order 遍历尝试且不再触发编译错误。
    Swapped an unavailable AX constant for a string-based attribute so the build no longer depends on that SDK symbol, while keeping the navigation-order traversal attempt.
    IDEAnchorService.swift

  • 统计页存储信息计算修正
    存储大小改为统计 Deck.sqlite3 及其 -wal/-shm 的真实文件大小,平均记录大小随之修正。
    Fixed storage calculations in Statistics by measuring the real file sizes of Deck.sqlite3 and its -wal/-shm siblings, and updating average record size accordingly.
    StatisticsView.swift

  • 历史预览复制按钮改为对勾动画反馈
    代码区复制按钮改为与 CLI Bridge 同款对勾动画;点击代码复制不再弹绿色“已复制”,其他复制项仍保留原提示。
    Updated the history preview code copy button to use the same checkmark animation as CLI Bridge; copying code no longer shows the green “Copied” toast, while other copy actions keep their existing feedback.
    SmartContentView.swift

  • 空间预览状态重置,避免重开面板复现旧预览
    面板激活/失活/消失时统一重置预览状态(state + task cancel + window hide),避免预览在重新打开后“自动浮现”。
    Reset preview state on panel activation/deactivation/disappear (state + task cancel + window hide) so previews no longer resurface after reopening.
    HistoryListView.swift

  • 预览与 Orbit 相关 Swift 6 警告/错误清理
    FilePreviewRules 常量/函数标为 nonisolated 以适配 MainActor 默认隔离;fallback icon 调用切换为正确 API;并在 Orbit jump model 中显式捕获 saveDebounce 以避免 actor hop。
    Cleaned up Swift 6 warnings/errors in preview/controller code and Orbit jump model by making FilePreviewRules constants/functions nonisolated under MainActor default isolation, fixing fallback icon API usage, and explicitly capturing saveDebounce to avoid actor hops.
    PreviewWindowController.swift · OrbitJumpModel.swift

  • 修正 NSWorkspace 图标 API 参数标签,消除 forContentType: 编译错误
    将 fallback icon 调用改为 NSWorkspace.shared.icon(for: .data) 以匹配当前 SDK 的 icon(for:) 签名。
    Fixed NSWorkspace icon API parameter labels by switching the fallback icon call to NSWorkspace.shared.icon(for: .data), eliminating the forContentType: compile error.
    PreviewWindowController.swift

  • 避免 RTF/RTFD 路径触发 Obj‑C decode warning(保留富文本粘贴)
    ClipboardItem 中优先缓存 plain-text 候选;当 plain text 非空时短路 RTF/RTFD 解码以避免 NSAttributedString 解码告警;同时保留原富文本 payload 作为粘贴与无 plain text 情况的 fallback。
    Traced the Obj‑C decode warning to the RTF/RTFD path and added a plain-text short-circuit when a clean string already exists, avoiding NSAttributedString decoding warnings while preserving the original rich-text payload for pasting and fallback.
    ClipboardItem.swift

  • 输入过大/无效保护:防崩溃与竞态
    保持正常流程 UX 不变,仅对超大/无效输入做提前拒绝与日志记录,避免 crash 与 race:Cloud Sync/脚本插件/隐写/语义搜索/剪贴板等路径加入大小上限、锁与安全读取。
    Kept normal UX unchanged, but now rejects oversized/invalid inputs early (with logs) to prevent crashes and races by adding caps/locks/safe reads across Cloud Sync, script plugins, steganography, semantic search, and clipboard paths.
    CloudSyncService.swift · ScriptPluginService.swift · ClipboardItem.swift · SteganographyService.swift · SemanticSearchService.swift

  • Steganography Swift 6 隔离修复
    loadCarrierImageData(from:) 标注为 nonisolated 与调用方一致;并将 maxCarrierFileBytes 标为 nonisolated,修复静态属性在非隔离上下文访问的编译报错。
    Fixed Swift 6 isolation compile errors by marking loadCarrierImageData(from:) nonisolated to match call sites and making maxCarrierFileBytes nonisolated to allow static access from nonisolated contexts.
    SteganographyService.swift

  • Cloud Sync 同名遮蔽修复
    避免 if let previewData 同名遮蔽导致块内变为 let;改用局部 previewBytes 后可正常 previewData = nil
    Fixed a same-name shadowing bug (if let previewData) that made the value immutable inside the block; switching to a local previewBytes restores correct previewData = nil behavior.
    CloudSyncService.swift

  • 数据库/同步/可访问性/热键/导入导出等稳定性修复(保持行为一致)
    FTS 查询使用显式 bm25 alias;历史遗留空 unique_id 安全回填;blob items 遵循 loadFullData;batch fetch 按 SQLite 限制分块;引入 cursor-based fetching 稳定分页并用于 Cloud Sync;修复 AX 强制解包/坐标换算与 window title cast;热键更新失败时回滚;粘贴队列加入可取消自动退出调度;Multipeer TOTP nil 安全处理;导出改用 cursor paging、导入重 IO 移出主线程、支持 JSON fragments、URL 编码收紧;并用 typeID 校验 helper 消除 CFTypeRef cast warnings。
    Applied UX-neutral stability fixes: explicit bm25 alias for FTS, safe backfill for legacy empty unique_id, blob items honor loadFullData, chunked batch fetch under SQLite limits, cursor-based paging used by Cloud Sync, safer AX handling and multi-monitor caret positioning, hotkey update rollback on failure, cancellable auto-exit for paste queue, nil-safe TOTP generation, export via cursor paging with import IO off-main, JSON fragments support, tighter URL encoding, and typeID-checked unwrap helpers to eliminate CFTypeRef cast warnings.
    DeckSQLManager.swift · CloudSyncService.swift · CursorAssistantService.swift · ClipboardService.swift · HotKeyManager.swift · PasteQueueService.swift · MultipeerService.swift · DataExportService.swift · TextTransformer.swift · SourceAnchor.swift

  • Swift 6 编译错误修复(导出/导入与类型推断)
    修正 append 类型推断与未使用结果;将 export DTO 标为 nonisolated + Sendable,新增 @MainActor insert helper,并 await 主线程日志;为跨 Task 的 source-anchor 值类型补充 Sendable;并通过显式 rows: [Row] 修复 append(contentsOf:) 的剩余错误。
    Resolved Swift 6 compile errors by tightening type inference and silencing unused results, making export DTOs nonisolated + Sendable, adding a @MainActor insert helper and awaiting main-actor logging, adding Sendable conformances for source-anchor value types used across tasks, and explicitly typing rows: [Row] to fix the remaining append(contentsOf:) error.
    DeckSQLManager.swift · DataExportService.swift · SourceAnchor.swift

  • 长网址导致卡片被拉长与二维码生成卡死问题
    弹窗卡片固定宽度 320;展示用 URL 改为去掉 http(s):// 后最多 20 个字符并追加省略号(悬停可看完整链接);二维码生成失败时显示「链接过长,无法生成二维码」而非一直“生成中...”;超过 600 字节阈值时右键菜单不再显示「显示二维码」以避免生成无法扫码的二维码。
    Fixed long-URL UI issues by fixing popup card width to 320, truncating displayed URLs (strip http(s)://, show up to 20 chars + ellipsis with full link on hover), showing a clear “link too long” message when QR generation fails (instead of spinning), and hiding “Show QR code” in the context menu when URL length exceeds 600 bytes.
    PreviewWindowController.swift · ClipItemCardView.swift

  • 翻译补齐至 100%
    Localizable.xcstrings 中那 25 个空/未翻译条目已补齐,翻译覆盖率恢复到 100%。
    Filled the 25 empty/missing translation entries in Localizable.xcstrings, restoring 100% translation coverage.
    Localizable.xcstrings

  • 拖拽导出:单文件 suggestedName 去掉最后一个扩展名
    单文件拖拽导出时将 suggestedName 改为去掉最后一个扩展名的基名,避免 Finder 根据 UTType 再次追加后缀导致 .py.py / .json.json
    Updated single-file drag-export suggestedName to strip the last extension so Finder doesn’t append another one based on UTType (avoids .py.py / .json.json).
    ClipboardItem.swift

说明 / Notes

  • 反馈邮件文案与翻译覆盖
    新增并翻译「提交反馈」「告诉我们您的想法」与「Deck 反馈」邮件主题;并更新/补齐既有模板中的 subject/question/hint 行与缺失语言文件。
    Added translations for “提交反馈”, “告诉我们您的想法”, and the “Deck 反馈” email subject; updated subject/question/hint lines in existing templates and added missing language template files.
    Localizable.xcstrings · feedback_en.html · feedback_de.html · feedback_kr.html · feedback_fr.html · feedback_ja.html · feedback_zh_hant.html

兼容性与行为说明 / Compatibility & Behavior Notes

  • 反馈邮件撰写依赖系统邮件服务可用性
    反馈邮件优先通过 NSSharingService 打开系统邮件撰写器;仅当该服务不可用时才尝试直接打开 Mail 应用。
    Feedback email prefers composing via NSSharingService and only attempts to open the Mail app directly when the service is unavailable.
    FeedbackEmailService.swift

升级建议 / Upgrade Notes

  • 建议所有用户升级至 v1.2.2
    本版本包含反馈邮件流程完善、多语言补齐、预览与设置交互增强、稳定性/性能与安全防护的集中改进。
    Recommended for all users: v1.2.2 includes improvements to feedback email flow, localization coverage, preview/settings interaction, and broad stability/performance/safety hardening.

Don't miss a new Deck release

NewReleases is sending notifications on new releases.