Release Notes v1.3.7
TL;DR
- Homebrew Cask
brew tap yuzeguitarist/deck && brew install --cask deckclip— 两行命令安装,版本随 GitHub Release 自动更新。
brew tap yuzeguitarist/deck && brew install --cask deckclip— two commands to install, versions auto-sync from GitHub Releases. - ⌃A / ⌃E
历史列表支持 Emacs 风格快捷键,一键跳到数据库意义上的最新一页或最旧一页。
History supports Emacs-style shortcuts to jump to the true newest or oldest page from the database. - 更干净的尾跳
跳到末尾时单次定向拉取,避免在中间逐页加载;超大库下搜索尾跳会收紧候选上限。
Tail jumps use one targeted fetch instead of paging through the middle; search tail jumps cap candidates on very large libraries. - 可靠性
修复 ⌃E 连用失效,以及 ⌃E 后 ⌃A 困在尾页、较新记录需重开面板才出现的问题。
Fixes ⌃E stopping on repeat use and ⌃A after ⌃E leaving you stuck on the tail until reopening the panel. - 暂停录制
恢复录制后不会再把暂停期间复制的内容自动写进历史。
Paused recording no longer ingests clipboard changes that happened during pause when you resume. - 设置内反馈弹窗
从「关于 > 更新与反馈 > 提交反馈」打开的「选择反馈方式」面板中,取消与选项按钮可正常使用(与快捷键入口一致)。
The feedback destination sheet opened from Settings › About works for Cancel and both options, matching the keyboard shortcut entry. - 关于页支持作者
「关于」中新增支持区块:官网入口使用 Deck 图标并直达定价页「支持开发」;另提供 GitHub 入口(随应用语言打开中文或英文站点)。
About adds a Support section: the Deck icon opens the pricing page at Support Development, plus GitHub; the website locale follows app language (Chinese vs English site). - 数据与安全(数据库 / 模板库 / iCloud / AI)
数据库初始化状态更可靠;模板条目改为落盘存储并支持从旧版 UserDefaults 正确迁移与补救;iCloud 同步在加密、fileURL、元数据与崩溃恢复上更一致;Smart Rule 不再静默授权需网络的脚本插件;AI 认证文件与 Keychain 写入更安全。
Stricter DB init semantics; template items stored on disk with legacy migration/repair; iCloud sync improvements for encryption, file URLs, metadata, and crash recovery; Smart Rule no longer auto-authorizes networked script plugins; tighter permissions and safer Keychain updates for AI auth. - 网络工具与局域网直连
网页抓取/搜索在较大响应体下组包更快;移除局域网手动节点时同步清理出站连接调度状态,避免长期增删节点后无用条目占用内存。
Web fetch/search assembles large bodies more efficiently; removing a LAN manual peer clears outbound scheduling state for that IP so stale map entries do not accumulate.
新增 / Added
- Homebrew Cask 安装
现在可以通过 Homebrew 安装 Deck:先brew tap yuzeguitarist/deck,再brew install --cask deckclip。后续版本随 GitHub Release 自动同步。
Deck is now available via Homebrew:brew tap yuzeguitarist/deckthenbrew install --cask deckclip. Future releases auto-sync from GitHub Releases. - 右键「系统分享」子菜单
卡片右键菜单新增「系统分享」二级子菜单,列出隔空投送、信息、邮件等所有 macOS 系统级分享服务,无需先拖到访达再操作。横版与竖版模式均支持。
Card context menu adds a "System Share" submenu listing AirDrop, Messages, Mail, and all macOS sharing services — no need to drag to Finder first. Supported in both horizontal and vertical layout modes. - 历史列表 ⌃A / ⌃E(Emacs)
在面板历史列表聚焦时,⌃A 从数据库重新加载「最新一页」并选中其中时间上最新的一条;⌃E 单次拉取「最旧一页」并选中时间上最旧的一条,与上下文排序下的视觉顺序解耦。
With history focus, ⌃A reloads the newest page from the database and selects the chronologically newest item; ⌃E fetches the oldest page in one query and selects the chronologically oldest item, independent of context-aware visual order. - 关于页「支持作者」
设置「关于」新增「支持作者」:一行使用应用图标打开官网定价页并定位到「支持开发」区块;另一行打开 GitHub 仓库页面。应用语言为中文时打开中文站,否则打开英文站。
Settings › About adds Support the Author: one row with the app icon opens the pricing page at the Support Development section; another opens the GitHub repository. Chinese app language uses the Chinese site; otherwise the English site.
优化 / Improvements
- 尾页跳转更省路径
跳到列表末尾时直接按时间升序取末段,避免为凑齐末尾而一页页从中间往后翻。
Jumping to the list end reads the oldest slice directly by sort order instead of paging forward from the middle. - 大库下搜索跳转更克制
在记录量很大时,为搜索结果的尾跳收紧单次候选上限,降低无谓扫描。
When the library is very large, tail jumps in search mode use a tighter one-shot candidate cap to avoid excessive work. - 关于页支持入口展示
支持区块内图标尺寸与左侧对齐统一,GitHub 标识更易辨认、边缘更顺滑。
Support-section icons share consistent sizing and alignment, with a clearer, smoother GitHub mark. - 模板库持久化
模板条目正文与预览写入 Application Support(UserDefaults 仅存索引);开启安全模式时对模板文件加密;删除/移动库或条目时仅更新索引,避免每次操作全量重写所有 payload。
Template payloads live under Application Support with metadata indices in UserDefaults; security mode encrypts template files; remove/move operations update indices only instead of rewriting every payload. - iCloud 拉取结束时间
lastSyncDate在每次拉取流程结束时更新(含失败提前返回),与serverChangeToken是否前进解耦,便于展示「最近一次拉取结束」。
lastSyncDateupdates whenever a fetch attempt finishes (including early error exits), decoupled from whether the server change token advanced. - Web 工具大响应流式读取
对URLSession异步字节流采用分块缓冲再合并到Data,降低多 MB 响应下的 CPU 与分配开销(仍保留 5 MB 上限与超限语义)。
Async response bytes are buffered in chunks before appending toData, reducing CPU and allocation work for multi-megabyte bodies while keeping the 5 MB cap and overflow behavior.
修复 / Fixes
- ⌃E 可反复使用
不再与「加载更多」共用的加载标志误挡后续 ⌃E;分页任务只在异步块内标记加载中,避免长时间占住状态。
Subsequent ⌃E presses are no longer blocked by the shared loading flag used for “load more”; pagination marks loading only inside its async work. - ⌃E 后再按 ⌃A 回到真实最新
先前仅在当前内存列表中选「第一项」,在尾页场景下并非全局最新,且向左/向新方向看不到更早加载过的记录;现改为与 ⌃E 对称的「真·首屏」重载。
After ⌃E, ⌃A previously selected the first item of the in-memory tail slice, not the global newest, and newer items seemed missing until reopening; it now reloads the true head page symmetrically to ⌃E. - 暂停期间复制不再在恢复时被记录
暂停后若在系统里复制过内容,恢复录制时不会再把当时剪贴板里的那一条当作新事件写入历史;只有恢复之后的新复制才会进入记录。
Clipboard captures made while recording is paused are no longer saved the moment you resume; only copies after resuming are recorded. - 设置中打开的反馈选择面板
将反馈对话框推迟到下一轮主循环再进入 AppKit 模态会话,避免从设置页 SwiftUI 按钮同步弹出时内容区无法点击(仅标题栏关闭可用)的问题。
Feedback destination dialog is presented on the next main-loop turn so AppKit modal sessions started from Settings SwiftUI actions receive clicks in the content area, not only the title-bar close control. - 数据库初始化
仅在完整性检查通过且自定义函数、建表、迁移均就绪后置isInitialized;完整性无法恢复时不再误标为已初始化,避免半初始化卡死。
isInitializedflips true only after integrity, custom SQL functions, table creation, and migrations succeed; failed integrity recovery no longer leaves a false “ready” flag. - 模板库迁移
仅在实际解码成功并落盘后才升级存储版本;解码失败会保留旧数据并重试。若曾错误升级版本导致「只剩库壳」,启动时会尝试从遗留的templateItemsJSON 自动补救。
Storage version advances only after a successful legacy decode and payload write; decode failures keep legacy data for retry. Orphan legacy blobs are repaired when indices are empty but old JSON remains. - 模板 fileURL 图片
保存到模板库时,若已从文件物化为图片字节,剪贴板类型会改为具体图片类型,与 payload 一致。
When a file-URL image is materialized to bytes for the template library, the stored pasteboard type matches the image payload. - iCloud:fileURL 同步
仅当本地能解析出与路径字符串不同的实际内容时才上传;图片类会以具体图片类型写入记录;无法物化时跳过上传并记日志,避免跨设备只剩路径串。
fileURL items upload only when local resolution yields real content (not just the path string); images use concrete image types; unresolvable items are skipped with logging. - iCloud:加密元数据
开启端侧加密时,appPath/appName与预览、搜索文案等一致:加密失败则置空并记录警告,不再静默明文上云;encryptAppMeta语义与接收端解密对齐。
With iCloud encryption, app path/name follow the same rules as other fields: encrypt-or-omit with warnings, no silent plaintext;encryptAppMetamatches receiver decryption. - iCloud:上传崩溃恢复
批量上传完成后,仅从持久化「进行中」列表里移除已成功或已取消的条目;失败并重入队的记录名保留,避免在下次 flush 前崩溃后无法被启动恢复逻辑发现。
Persisted in-flight upload names are cleared only for succeeded or cancelled records; failed records pending re-queue stay listed until the next successful completion path. - iCloud:Server change token
解码失败时清除损坏的 UserDefaults 数据,避免长期反复失败。
Corrupt server change token data in UserDefaults is removed after a decode failure. - Smart Rule 与网络脚本插件
Smart Rule 下需要网络且未授权的脚本插件不再自动授权,需用户在插件设置中手动授权。
Smart Rule no longer auto-authorizes script plugins that require network access; users must approve in plugin settings. - ChatGPT / AI 认证文件与 Keychain
auth.json目录与文件权限收紧(700 / 600);API Key 优先SecItemUpdate,避免先删后加导致更新失败时旧密钥丢失。
Tighter POSIX permissions onauth.json(700/600); API keys preferSecItemUpdateover delete-then-add to avoid losing the previous secret on add failure. - 直连:移除手动节点后的出站状态
删除节点时从出站连接世代映射中移除对应 IP(不再仅自增计数保留键),在反复添加/删除不同设备时减少无用字典条目。
Removing a manual peer drops the outbound-connect epoch entry for that IP instead of retaining the key with an incremented counter, trimming stale entries when peers are added and removed over time.
兼容性与行为说明 / Compatibility & Behavior Notes
- 快捷键环境
需在 macOS 上使用 Control 组合键;历史区域需处于列表焦点(非搜索框内编辑等)。
Shortcuts use the Control modifier on macOS; the history list must have focus (not while typing in search, etc.). - 尾跳后的列表范围
执行 ⌃E 后,当前可见列表仅为该次拉取的末尾一页,直到 ⌃A 拉回最新一页或关闭再开面板等重新加载首屏的操作。
After ⌃E, the visible list is that tail page until ⌃A reloads the newest page or another action reloads the head (e.g. reopening the panel). - 模板库数据位置
首次从旧版本升级时,模板条目会从 UserDefaults 大包迁移至~/Library/Application Support/Deck/TemplateItems/;若曾遇迁移异常,新版会尽量从遗留 JSON 自动修复。
On first launch after upgrade, template items migrate from the legacy UserDefaults blob to~/Library/Application Support/Deck/TemplateItems/; a repair pass may recover from a partially migrated state.