docs(release): consolidate 1.8 notes and demos

Present the skipped 1.7 work as one user-focused 1.8 update and record the real keyboard UI for AI, clipboard, and skills walkthroughs.
This commit is contained in:
Rocky
2026-08-15 09:07:24 +08:00
parent 13214e6601
commit 46f6d818b8
10 changed files with 133 additions and 239 deletions
+20 -90
View File
@@ -26,6 +26,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **Save to Notes skill**: the Skills tab opens a ready-made companion Shortcut named `OSGSaveToNotes` on the system Add page (one new Apple Note with an explicit title and body). After you tap Add, copying text and tapping Notes asks the LLM for a short title from the time and content; the body stays the original clipboard. / **存入备忘录技能**:技能页会打开已做好的配套捷径 `OSGSaveToNotes` 的系统添加页(新建一条带标题和正文的苹果备忘录)。点添加后,复制文字并点「备忘录」会按时间和内容生成短标题;正文保持剪贴板原文。 - **Save to Notes skill**: the Skills tab opens a ready-made companion Shortcut named `OSGSaveToNotes` on the system Add page (one new Apple Note with an explicit title and body). After you tap Add, copying text and tapping Notes asks the LLM for a short title from the time and content; the body stays the original clipboard. / **存入备忘录技能**:技能页会打开已做好的配套捷径 `OSGSaveToNotes` 的系统添加页(新建一条带标题和正文的苹果备忘录)。点添加后,复制文字并点「备忘录」会按时间和内容生成短标题;正文保持剪贴板原文。
- **Skills clipboard guide**: when Clipboard History is off, the Skills tab shows a card that jumps to in-app Clipboard settings and to iOS Settings for paste authorization. / **技能页剪贴板指引**:未开启剪贴板历史时,技能页展示可点击卡片,分别跳转 App 内剪贴板设置和系统设置以完成粘贴授权。 - **Skills clipboard guide**: when Clipboard History is off, the Skills tab shows a card that jumps to in-app Clipboard settings and to iOS Settings for paste authorization. / **技能页剪贴板指引**:未开启剪贴板历史时,技能页展示可点击卡片,分别跳转 App 内剪贴板设置和系统设置以完成粘贴授权。
- **Custom skills**: Skills tab `+` adds a user skill (name, about, SF Symbol, prompt, optional iCloud Shortcut link with name lookup, independent Shortcut name, thinking off by default). Without a link, the model result is reviewed and inserted directly; with a link, it keeps the Shortcut export flow. Built-in thinking stays off and disabled. No cap on how many custom skills you can save; the keyboard still holds at most 8. / **自定义技能**:技能页右上角 `+` 可添加用户技能(名称、介绍、SF Symbol、提示词、可选 iCloud 捷径链接并自动读取名称、可与技能名分开的捷径名、思考默认关)。不填链接时,模型结果经确认后直接插入;填写链接时继续走捷径导出流程。内置技能思考固定关闭且不可开。自定义数量不设上限,键盘仍最多启用 8 个。 - **Custom skills**: Skills tab `+` adds a user skill (name, about, SF Symbol, prompt, optional iCloud Shortcut link with name lookup, independent Shortcut name, thinking off by default). Without a link, the model result is reviewed and inserted directly; with a link, it keeps the Shortcut export flow. Built-in thinking stays off and disabled. No cap on how many custom skills you can save; the keyboard still holds at most 8. / **自定义技能**:技能页右上角 `+` 可添加用户技能(名称、介绍、SF Symbol、提示词、可选 iCloud 捷径链接并自动读取名称、可与技能名分开的捷径名、思考默认关)。不填链接时,模型结果经确认后直接插入;填写链接时继续走捷径导出流程。内置技能思考固定关闭且不可开。自定义数量不设上限,键盘仍最多启用 8 个。
- **AI keyboard mode**: ask the configured LLM by voice, watch answers stream into the keyboard, then review, Insert, and optionally Send; supported providers can search the web with automatic fallback. / **AI 键盘模式**:通过语音向已配置模型提问,回答会实时显示在键盘中,确认后可插入并按需发送;支持的服务商可联网搜索,失败时自动回退。
- **AI idle suggestions and response length**: the empty AI surface rotates tappable evergreen and current-topic prompts; Settings → AI Agent chooses Short, Medium, or Detailed answers. / **AI 空闲建议与回复篇幅**:AI 空状态轮播可点按的常用问题与热点建议;设置 → AI Agent 可选择简短、中等或详细回答。
- **AI setup guidance**: Home and the keyboard microphone line show a clear prompt when the user-owned AI key is missing; dictation can still insert the raw on-device transcript. / **AI 配置引导**:未配置用户自备 AI Key 时,首页与键盘麦克风上方会明确提示;听写仍可插入设备端原始识别结果。
- **Clipboard history and suggestion strip**: optionally keep the latest 15 plain-text copies on device, open them from the keyboard top bar, and show the newest copy above Voice, Typing, and AI for one-tap insertion. / **剪贴板历史与建议条**:可选在本机保存最近 15 条纯文本,从键盘顶栏打开历史,并在语音、打字与 AI 界面上方显示最新复制内容以便一键插入。
- **Edit last input**: hold the microphone after an OSGKeyboard insertion, describe the change, compare the original and edited text, then replace or append without exposing unrelated field content. / **编辑上次输入**OSGKeyboard 输入后长按麦克风口述修改要求,对比原文与结果后可替换或追加,且不会读取无关输入框内容。
- **iPad keyboard workspace**: voice and typing surfaces fill the available width in portrait and landscape; the bottom row adds comma, period, and the native globe key, while typing gains undo, redo, copy, and cut. / **iPad 键盘工作区**:语音与打字界面在横竖屏均铺满可用宽度;底行加入逗号、句号与原生地球键,打字顶栏提供撤销、重做、复制和剪切。
### Changed ### Changed
- **Privacy and third-party disclosures**: align the bundled and web privacy policies with AI Agent skills, Shortcuts/maps handoff, OSGKeyboard web endpoints, Keychain/iCloud behavior, clipboard retention, local typing learning, and Mac model downloads; expand the iOS/macOS license catalog with complete upstream notices. / **隐私与第三方披露**:统一 App 内与网页隐私政策,补充 AI Agent 技能、快捷指令/地图交接、OSGKeyboard 网页端点、Keychain/iCloud、剪贴板保留、本地输入学习与 Mac 模型下载,并为 iOS/macOS 许可目录补齐上游声明。 - **Privacy and third-party disclosures**: align the bundled and web privacy policies with AI Agent skills, Shortcuts/maps handoff, OSGKeyboard web endpoints, Keychain/iCloud behavior, clipboard retention, local typing learning, and Mac model downloads; expand the iOS/macOS license catalog with complete upstream notices. / **隐私与第三方披露**:统一 App 内与网页隐私政策,补充 AI Agent 技能、快捷指令/地图交接、OSGKeyboard 网页端点、Keychain/iCloud、剪贴板保留、本地输入学习与 Mac 模型下载,并为 iOS/macOS 许可目录补齐上游声明。
@@ -34,15 +40,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **English lexicon mmap**: the 40k-word English table loads only in English and stays file-mapped; Chinese typing no longer pulls it in on keyboard appear. / **英文词表 mmap**:4 万词英文表仅在英文加载且走文件映射;中文打字不再在唤起键盘时一并灌入。 - **English lexicon mmap**: the 40k-word English table loads only in English and stays file-mapped; Chinese typing no longer pulls it in on keyboard appear. / **英文词表 mmap**:4 万词英文表仅在英文加载且走文件映射;中文打字不再在唤起键盘时一并灌入。
- **English autocorrect conservatism**: Title Case / short / ALL CAPS tokens are not replaced, except same-length transpositions (`Teh``The`). Machine-applied corrections no longer boost the replacement; rejecting them learns the original. / **英文自动更正更克制**Title Case / 短词 / 全大写默认不改,仅保留同长换位(`Teh``The`)。机器改写不再给新词加分;拒绝纠错会学会原文。 - **English autocorrect conservatism**: Title Case / short / ALL CAPS tokens are not replaced, except same-length transpositions (`Teh``The`). Machine-applied corrections no longer boost the replacement; rejecting them learns the original. / **英文自动更正更克制**Title Case / 短词 / 全大写默认不改,仅保留同长换位(`Teh``The`)。机器改写不再给新词加分;拒绝纠错会学会原文。
- **Chinese user-dict flush**: leaving the typing surface finalizes librime so user-frequency ticks persist; secure fields insert Latin and skip Rime so passwords are not learned. / **中文用户词落盘**:离开打字表面时 finalize librime,使用频度得以保存;安全输入框改为直接插入拉丁字母、不进 Rime,避免把密码写入用户词库。 - **Chinese user-dict flush**: leaving the typing surface finalizes librime so user-frequency ticks persist; secure fields insert Latin and skip Rime so passwords are not learned. / **中文用户词落盘**:离开打字表面时 finalize librime,使用频度得以保存;安全输入框改为直接插入拉丁字母、不进 Rime,避免把密码写入用户词库。
### Fixed
- **Keyboard switch crash**: `requestSupplementaryLexicon` completion hops to the main actor before writing session state, so switching to OSG Keyboard no longer traps on `com.apple.TextInput.lexicon-request`. / **切换键盘崩溃**`requestSupplementaryLexicon` 回调先回到主线程再写会话状态,切换到 OSG Keyboard 不再在 `com.apple.TextInput.lexicon-request` 上触发隔离断言。
- **Save to Notes Shortcut**: bind the combined first-line title and clipboard body through iPhone Create Notes real `WFCreateNoteInput` field. The previous `contents` binding was ignored and left an enter-content sheet or a title-only note. / **存入备忘录捷径**:通过 iPhone「创建备忘录」真正的 `WFCreateNoteInput` 字段绑定首行标题与剪贴板正文;旧版 `contents` 绑定会被忽略,导致弹出内容填写框或只生成标题。
- **Extract tasks Shortcut**: receive Shortcut Input as Text, then split lines and add each title to Reminders — the previous recipe could finish successfully without creating items. / **提取待办捷径**:先把快捷指令输入收成文本,再按行写入提醒;旧配方会成功跑完但不创建条目。
- **Skill reorder feedback**: long-press lifts a skill card and the grid slides live under the finger, matching Home Screen rearrange. / **技能拖动排序**:长按拎起技能卡片,网格随手指实时让位,接近主屏幕图标重排。
- **Skill drag preview corners**: the lift preview clips to the cards continuous rounded rect so square white corners no longer show. / **技能拖动圆角**:拖起预览按卡片连续圆角裁剪,去掉圆角外的直角白底。
### Changed
- **Bundled Shortcut names**: Tasks and Events now install their signed in-app resources as `OSGExtractTodos` and `OSGExtractEvents`, matching `OSGSaveToNotes`; existing Chinese-named copies must be replaced from the Skills tab. / **内置捷径名称**:待办与日程改为安装 App 内签名资源 `OSGExtractTodos``OSGExtractEvents`,与 `OSGSaveToNotes` 保持一致;已有中文名称版本需从技能页重新安装。 - **Bundled Shortcut names**: Tasks and Events now install their signed in-app resources as `OSGExtractTodos` and `OSGExtractEvents`, matching `OSGSaveToNotes`; existing Chinese-named copies must be replaced from the Skills tab. / **内置捷径名称**:待办与日程改为安装 App 内签名资源 `OSGExtractTodos``OSGExtractEvents`,与 `OSGSaveToNotes` 保持一致;已有中文名称版本需从技能页重新安装。
- **Navigation icons**: Skills uses a wand; Styles uses a dial. The phone dock and iPad sidebar (except Home) use outline when idle and fill when selected. Mac Styles / Settings follow the same pairing. iPad and Mac Home stay the house icon. / **导航图标**:技能改为魔杖,风格改为旋钮。手机 Dock 与 iPad 侧栏(除首页外)未选中描边、选中填充;Mac 的风格 / 设置同样切换。iPad / Mac 首页仍用房子图标。 - **Navigation icons**: Skills uses a wand; Styles uses a dial. The phone dock and iPad sidebar (except Home) use outline when idle and fill when selected. Mac Styles / Settings follow the same pairing. iPad and Mac Home stay the house icon. / **导航图标**:技能改为魔杖,风格改为旋钮。手机 Dock 与 iPad 侧栏(除首页外)未选中描边、选中填充;Mac 的风格 / 设置同样切换。iPad / Mac 首页仍用房子图标。
- **Phone dock size**: slightly smaller — 22 pt icons, 46 pt rows, 8 pt glass padding. / **手机 Dock 尺寸**:略缩小,图标 22 pt、行高 46 pt、玻璃内边距 8 pt。 - **Phone dock size**: slightly smaller — 22 pt icons, 46 pt rows, 8 pt glass padding. / **手机 Dock 尺寸**:略缩小,图标 22 pt、行高 46 pt、玻璃内边距 8 pt。
@@ -59,95 +56,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **Clipboard skill circles**: Reply / Summarize / Translate idle buttons match the same 52 pt circle. / **剪贴板技能圆钮**:回复 / 总结 / 翻译空闲按钮与语音侧键同为 52 pt 圆。 - **Clipboard skill circles**: Reply / Summarize / Translate idle buttons match the same 52 pt circle. / **剪贴板技能圆钮**:回复 / 总结 / 翻译空闲按钮与语音侧键同为 52 pt 圆。
- **Home tab selection**: the dock stays Liquid Glass at its original height; the selected tab is a wider green fill capsule with a 5 pt inset, not a second glass chip. Dock items are 24 pt icons with Home / Skills / Styles / Settings labels. / **首页 Tab 选中态**dock 仍是原高度 Liquid Glass;选中项改为更宽的绿色填充胶囊,距栏边 5 pt,不再套第二层玻璃。dock 为 24 pt 图标加「首页 / 技能 / 风格 / 设置」文字。 - **Home tab selection**: the dock stays Liquid Glass at its original height; the selected tab is a wider green fill capsule with a 5 pt inset, not a second glass chip. Dock items are 24 pt icons with Home / Skills / Styles / Settings labels. / **首页 Tab 选中态**dock 仍是原高度 Liquid Glass;选中项改为更宽的绿色填充胶囊,距栏边 5 pt,不再套第二层玻璃。dock 为 24 pt 图标加「首页 / 技能 / 风格 / 设置」文字。
- **Home library card titles**: History and Personal dictionary headers use a 16 pt icon and 13 pt label. / **首页资料卡标题**:历史与个性词库标题改为 16 pt 图标、13 pt 文字。 - **Home library card titles**: History and Personal dictionary headers use a 16 pt icon and 13 pt label. / **首页资料卡标题**:历史与个性词库标题改为 16 pt 图标、13 pt 文字。
- **App navigation redesign**: Home becomes the overview with statistics, History, and Personal Dictionary cards; iPhone uses a four-destination Liquid Glass dock, while iPad uses an aligned sidebar + detail workspace. / **App 导航重构**:首页成为统计、历史与个性词库资料卡的总览;iPhone 使用四入口 Liquid Glass DockiPad 使用对齐的侧栏 + 内容区工作台。
- **Unified Undo and keyboard chrome**: one Undo action covers dictation, AI answers, edits, and clipboard pastes; Translation moves beside the voice microphone while the top-bar slot becomes Clipboard. / **统一撤销与键盘界面**:同一个撤销操作覆盖听写、AI 回答、编辑与剪贴板粘贴;翻译移到语音麦克风旁,顶栏原位置改为剪贴板入口。
- **User-owned AI keys**: remove the built-in DeepSeek fallback; polish and AI mode use the provider and API key configured by the user. / **用户自备 AI Key**:移除内置 DeepSeek 回退;润色与 AI 模式统一使用用户配置的服务商和 API Key。
### Removed
- **Hold-to-command clipboard flow**: long-pressing the microphone now edits the last verified OSGKeyboard input; Clipboard History, spoken AI clipboard requests, and quick skills replace the previous one-shot clipboard voice-command path. / **长按剪贴板语音流程**:长按麦克风现用于编辑最近一次经验证的 OSGKeyboard 输入;剪贴板历史、AI 口述剪贴板请求与快捷技能取代原来的一次性剪贴板语音指令。
### Fixed ### Fixed
- **Keyboard switch crash**: `requestSupplementaryLexicon` completion hops to the main actor before writing session state, so switching to OSG Keyboard no longer traps on `com.apple.TextInput.lexicon-request`. / **切换键盘崩溃**`requestSupplementaryLexicon` 回调先回到主线程再写会话状态,切换到 OSG Keyboard 不再在 `com.apple.TextInput.lexicon-request` 上触发隔离断言。
- **Save to Notes Shortcut**: bind the combined first-line title and clipboard body through iPhone Create Notes real `WFCreateNoteInput` field. The previous `contents` binding was ignored and left an enter-content sheet or a title-only note. / **存入备忘录捷径**:通过 iPhone「创建备忘录」真正的 `WFCreateNoteInput` 字段绑定首行标题与剪贴板正文;旧版 `contents` 绑定会被忽略,导致弹出内容填写框或只生成标题。
- **Extract tasks Shortcut**: receive Shortcut Input as Text, then split lines and add each title to Reminders — the previous recipe could finish successfully without creating items. / **提取待办捷径**:先把快捷指令输入收成文本,再按行写入提醒;旧配方会成功跑完但不创建条目。
- **Skill reorder feedback**: long-press lifts a skill card and the grid slides live under the finger, matching Home Screen rearrange. / **技能拖动排序**:长按拎起技能卡片,网格随手指实时让位,接近主屏幕图标重排。
- **Skill drag preview corners**: the lift preview clips to the cards continuous rounded rect so square white corners no longer show. / **技能拖动圆角**:拖起预览按卡片连续圆角裁剪,去掉圆角外的直角白底。
- **Clipboard skills jumped to a sentence chip**: copying no longer swaps the three skill buttons for a leftover carousel card such as “translate the clipboard”. Clipboard sentence cards stay out of the idle rotation. / **剪贴板技能跳成句子芯片**:复制后不再把三个技能按钮换成「把剪贴板翻译成…」这类旧轮播卡片;剪贴板句子不再进入空闲轮播。 - **Clipboard skills jumped to a sentence chip**: copying no longer swaps the three skill buttons for a leftover carousel card such as “translate the clipboard”. Clipboard sentence cards stay out of the idle rotation. / **剪贴板技能跳成句子芯片**:复制后不再把三个技能按钮换成「把剪贴板翻译成…」这类旧轮播卡片;剪贴板句子不再进入空闲轮播。
- **Clipboard skill status XML**: tapping Reply / Summarize / Translate no longer flashes the internal `<clipboard_request>` envelope above the mic. / **剪贴板技能状态 XML**:点回复 / 总结 / 翻译不再把内部 `<clipboard_request>` 信封闪现在麦克风上方。 - **Clipboard skill status XML**: tapping Reply / Summarize / Translate no longer flashes the internal `<clipboard_request>` envelope above the mic. / **剪贴板技能状态 XML**:点回复 / 总结 / 翻译不再把内部 `<clipboard_request>` 信封闪现在麦克风上方。
- **Idle keyboard re-adopted recognition**: aborting a session now remembers that utterance id, so a lagging host `processing` snapshot cannot reopen the voice keyboard in 「识别中」. / **空闲打开误进识别中**:中止会话会记住该句 id,滞后的主机 processing 快照不会在下次打开语音键盘时显示「识别中」。 - **Idle keyboard re-adopted recognition**: aborting a session now remembers that utterance id, so a lagging host `processing` snapshot cannot reopen the voice keyboard in 「识别中」. / **空闲打开误进识别中**:中止会话会记住该句 id,滞后的主机 processing 快照不会在下次打开语音键盘时显示「识别中」。
- **Voice cancel chrome until result**: Cancel (X) stays up through ASR/polish and through abort wait after leaving AI Agent, so the voice mic no longer looks ready while the host is still busy. / **语音取消直到出结果**:X 一直保留到识别/润色结束,以及离开 AI Agent 后的中断收尾;语音麦克风不再在宿主仍忙时显示为可用。 - **Voice cancel chrome until result**: Cancel (X) stays up through ASR/polish and through abort wait after leaving AI Agent, so the voice mic no longer looks ready while the host is still busy. / **语音取消直到出结果**:X 一直保留到识别/润色结束,以及离开 AI Agent 后的中断收尾;语音麦克风不再在宿主仍忙时显示为可用。
- **Empty double-tap skip**: a mic press shorter than 300 ms with near-silence (or no samples) is discarded before ASR, so accidental double taps no longer wait on a no-speech error. / **空连点跳过**:按下短于 300ms 且接近静音(或尚无样本)的录音在进入识别前丢弃,避免误触后长时间等待「没听清」。 - **Empty double-tap skip**: a mic press shorter than 300 ms with near-silence (or no samples) is discarded before ASR, so accidental double taps no longer wait on a no-speech error. / **空连点跳过**:按下短于 300ms 且接近静音(或尚无样本)的录音在进入识别前丢弃,避免误触后长时间等待「没听清」。
- **AI hint left the mic stuck**: prefilled AI questions now drop the host processing gate after the answer or error; consuming an ack for the live utterance also heals a leaked gate. Reopening the keyboard only aborts when App Group already acked that utterance and the result is gone — a live LLM/ASR wait with no result yet is left running. Cancel during generate no longer delivers the answer afterwards. / **AI 建议卡住麦克风**:预填 AI 问题在出答案或失败后会关掉宿主 processing 闸门;若键盘已 ack 当前句而闸门仍开着,宿主消费 ack 时一并放闸。再次打开键盘仅在 App Group 已 ack 且结果已空时才中断残留闸门;LLM/ASR 仍在跑、尚无结果时继续等待。生成中取消后不再把答案写回来。 - **AI hint left the mic stuck**: prefilled AI questions now drop the host processing gate after the answer or error; consuming an ack for the live utterance also heals a leaked gate. Reopening the keyboard only aborts when App Group already acked that utterance and the result is gone — a live LLM/ASR wait with no result yet is left running. Cancel during generate no longer delivers the answer afterwards. / **AI 建议卡住麦克风**:预填 AI 问题在出答案或失败后会关掉宿主 processing 闸门;若键盘已 ack 当前句而闸门仍开着,宿主消费 ack 时一并放闸。再次打开键盘仅在 App Group 已 ack 且结果已空时才中断残留闸门;LLM/ASR 仍在跑、尚无结果时继续等待。生成中取消后不再把答案写回来。
- **Chinese input setup and recovery**: Rime deploys deterministically during onboarding and host-app startup; an already-open keyboard retries automatically after deployment instead of remaining stuck on the setup error. / **中文输入初始化与恢复**:Rime 在引导和主 App 启动时确定性部署;部署完成后已打开的键盘会自动重试,不再长期停留在初始化错误。
## [1.7.5] - 2026-08-13 - **Universal Clipboard and presentation stability**: pasteboard reads move off the main thread and start after presentation, preventing cross-device copies from freezing or blanking the keyboard. / **通用剪贴板与呈现稳定性**:剪贴板读取移出主线程并延后到键盘呈现完成后,避免跨设备复制使键盘卡住或空白。
- **Question-preserving polish**: all built-in and custom styles keep question drafts as questions, with deterministic fallback when a model attempts to answer the user instead. / **保留问句的润色**:全部内置与自定义风格都会保留问句;模型若试图替用户回答,会确定性回退到用户原意。
### Added
- **AI idle hint carousel**: AI mode empty state rotates one-line suggestions (local evergreen + optional remote hot topics); tap sends the card prompt to the LLM without the mic. Coexists with the clipboard suggestion strip in the top bar. / **AI 空闲建议轮播**:AI 模式空状态轮播单行建议(内置常驻 + 可选远程热点);点按即跳过麦克风把卡片 prompt 发给模型。与顶栏剪贴板建议条并存。
- **Hint feed refresh**: main app silently fetches `https://key.osglab.com/hints` about every 12 hours, compresses titles with the users polish LLM, and writes App Group ready packs for the keyboard. / **建议源刷新**:主 App 约每 12 小时静默拉取 `https://key.osglab.com/hints`,用用户润色 LLM 压缩标题,写入 App Group 供键盘只读。
- **Clipboard history**: optional keyboard clipboard history (latest 15 plain-text items, App Group local), top-bar clipboard entry, history panel with whitespace token chips, and a suggestion strip across voice / typing / AI when enabled. Within ~30s of a copy, AI idle hints can prefer clipboard-related cards. / **剪贴板历史**:可选的键盘剪贴板历史(最近 15 条纯文本、App Group 本地),顶栏剪贴板入口、带空白分词芯片的历史面板,以及开启后在语音 / 打字 / AI 面显示的建议条;复制后约 30 秒内 AI 空闲建议可偏向剪贴板相关卡片。
- **Clipboard settings**: Settings home adds a Clipboard page under AI Agent with History and Suggestion-strip toggles (both default off); keyboard deep-links open that page. / **剪贴板设置**:设置首页在 AI Agent 下方新增「剪贴板」页,含历史记录与候选栏展示开关(均默认关闭);键盘可深链打开该页。
- **Paste permission guidance**: the Clipboard settings page explains iOS's durable “Paste from Other Apps” permission and opens iOS Settings directly, so users can set it to Allow once and stop the per-copy paste prompt. / **粘贴授权引导**:剪贴板设置页说明 iOS 的「从其他 App 粘贴」持久授权并可直接跳转系统设置,用户设为「允许」一次即不再每次复制都弹窗。
- **Clipboard settings copy**: shorten history, suggestion-strip, and paste-permission wording to brief user-facing lines. / **剪贴板设置文案**:精简历史、建议条与粘贴授权说明,改为简短面向用户的表述。
- **Settings summary placement**: navigation-row summaries (AI Agent, Clipboard, etc.) sit trailing before the chevron, matching the Version row. / **设置摘要位置**:导航行摘要(AI Agent、剪贴板等)移到右侧 chevron 前,与「版本」行一致。
- **AI answer streaming**: AI mode streams visible answer text into the keyboard as the model writes (all AI-mode transports), with throttled App Group updates, search-fallback draft restart, and a “thinking” status before the first token; dictation polish stays non-streaming. / **AI 回答流式输出**:AI 模式在模型开始写正文后将可见答案增量推送到键盘(覆盖全部 AI 传输路径),经 App Group 节流更新;搜索失败回退会清空半截草稿;首 token 前显示「思考中」;听写润色仍为整段返回。
- **Spoken clipboard requests**: in AI mode, naming the clipboard out loud (“reply to the clipboard”, “translate my clipboard”) now attaches the stored clipboard text to that question. Naming it is the authorization, so no second confirmation appears; every other AI question is still sent without clipboard text, and with Clipboard History off the request fails with a clear reason instead of guessing. / **口述剪贴板指令**:AI 模式中说出「回复剪贴板」「把剪贴板翻译成英文」等,会把已保存的剪贴板正文附加到该问题。说出即视为授权,不再二次确认;其余 AI 提问一律不附带剪贴板;未开启剪贴板历史时会给出明确原因而非自行猜测。
- **AI Agent settings**: Settings home adds an AI Agent row under General, with a Response length preference (Short / Medium / Detailed, default Medium). AI mode injects soft length guidance into the system prompt and syncs the choice via iCloud settings. / **AI Agent 设置**:设置首页在「通用」下方新增 AI Agent 入口,支持「回复篇幅」(简短 / 中等 / 详细,默认中等)。AI 模式将篇幅作为软约束写入 system prompt,并纳入 iCloud 设置同步。
### Changed
- **Home library cards**: History and Personal dictionary leave the bottom dock; Home shows two self-sizing preview cards — transcripts split by hairlines (two lines each) and dictionary terms with their source/usage detail line — that push the existing pages with a standard back button. / **首页资料卡片**:历史记录与个性词库移出底部 Dock;首页改为两张按内容自适应高度的预览卡——历史条目用细线分隔(每条最多两行),词库显示词条与来源/使用次数小字——点按后以标准返回按钮进入原页面。
- **Home scroll status**: engine and session status scroll with the page at the bottom (dock clearance via tab-bar padding) instead of a pinned footer. / **首页滚动状态**:引擎与会话状态随页面滚到底部(Dock 留白与设置页一致),不再钉在底部。
- **Clipboard AI prompt contract**: clipboard text now reaches the model as a separate escaped `clipboard_text` block beside the instruction, and the AI system prompt treats that block as untrusted content instead of instructions. Hint cards carry only the instruction. / **剪贴板 AI 提示词契约**:剪贴板正文改为与指令并列的独立转义 `clipboard_text` 块,AI system prompt 明确将该块视为不可信内容而非指令;建议卡片只保留指令本身。
- **Hint feed freshness**: refresh tracks success per locale (a Chinese success no longer masks an English failure), a manifest failure no longer aborts the packs, and a pack past its `expiresAt` — or older than 48 hours without one — falls back to the built-in evergreen catalog instead of showing stale hot topics. / **建议源新鲜度**:刷新按语言分别记录成功(中文成功不再掩盖英文失败),manifest 失败不再中断整轮;超过 `expiresAt`(或无该字段且超过 48 小时)的建议包回退到内置常驻卡片,不再展示陈旧热点。
- **Privacy policy**: document AI idle suggestions, opt-in clipboard history (panel, suggestion strip, and AI hint use), and when clipboard text is sent to your AI provider. / **隐私政策**:补充 AI 空闲建议、可选剪贴板历史(面板、建议条与 AI 提示用途),以及剪贴板正文在何种情况下会发送给 AI 服务商。
- **Clipboard history row opacity**: history panel entry cards use 50% surface opacity so the keyboard chrome shows through. / **剪贴板历史条目透明度**:历史面板每条记录背景改为 50% 透明度,键盘底色可透出。
- **Translation button chrome**: voice mic-row translation control matches the adjacent undo key (44×44 rounded rectangle) instead of a circular chip. / **翻译按钮样式**:语音麦克风行的翻译控件改为与相邻撤销键一致的 44×44 圆角矩形,不再使用圆形芯片。
- **Undo covers clipboard pastes**: the undo key now rolls back text inserted from the clipboard suggestion strip or history panel, in one step regardless of length. Pasted text stays out of dictation history and is never offered for last-input editing. / **撤销支持剪贴板粘贴**:撤销键现在可回滚从剪贴板建议条或历史面板插入的文字,无论长度都一次撤销到底。粘贴内容不进入听写历史,也不会成为「编辑上次输入」的对象。
- **Undo key label**: rename the accessibility label from “Undo last dictation” to “Undo last input” now that it covers dictation, AI answers, edits and pastes. / **撤销键文案**:无障碍标签由「撤销上次听写」改为「撤销上次输入」,因其现已覆盖听写、AI 答案、编辑与粘贴。
- **Translation chip placement**: move the top-bar translation control onto the voice mic row, mirrored with Undo; the top-bar slot becomes the clipboard button. / **翻译入口位置**:顶栏翻译控件移到语音麦克风行并与撤销对称;原顶栏位置改为剪贴板按钮。
- **AI empty-state tip**: center “Tap the microphone to ask AI” in the answer area (horizontal + vertical); idle state now rotates hint cards there. / **AI 空状态指引**:答案区域水平与垂直居中展示空闲建议轮播(替代静态「点击麦克风」文案)。
### Fixed
- **Clipboard hints missed a fresh copy**: the AI idle carousel now refreshes from the clipboard store as soon as a copy is captured, instead of waiting for the next 4-second rotation or a re-entry into AI mode — the reason clipboard suggestions often never appeared inside their 30-second window. / **新复制无剪贴板建议**:AI 空闲轮播在采集到新复制时立即依据剪贴板刷新,不再等待下一次 4 秒轮换或重新进入 AI 模式——这正是 30 秒窗口内常常看不到剪贴板建议的原因。
- **Reduce Motion froze hint data**: Reduce Motion now only stops the fade rotation. Cards still refresh, so a new copy appears and a card whose clipboard window closed leaves the carousel. / **Reduce Motion 冻结建议数据**:辅助功能「减弱动态效果」现在只停止渐隐轮换,数据仍会刷新:新复制会出现,剪贴板窗口关闭的卡片会退出轮播。
- **Expired clipboard hint tap**: tapping a clipboard card after its 30-second window fails closed with a “copy the text again” message instead of sending the instruction with empty material. / **过期剪贴板建议点击**:超过 30 秒窗口后点击剪贴板卡片会明确提示重新复制,而不是把缺少材料的指令发出去。
- **Blank keyboard on cross-device clipboard**: clipboard-history capture no longer reads `UIPasteboard` on the main thread or during the appear sequence — a Universal Clipboard item still being fetched from another device blocked the main thread for seconds, freezing the keyboard mid-presentation. Reads now run on a background queue, start on the first poll tick after the slide-in, and never overlap. / **跨设备剪贴板导致键盘空白**:剪贴板历史采集不再在主线程、也不再在键盘出现流程中读取 `UIPasteboard`——待从其他设备拉取的通用剪贴板内容会同步阻塞主线程数秒,使键盘卡在呈现过程中。读取改到后台队列、延后到滑入完成后的首次轮询,且不会重叠执行。
- **Keyboard presentation height**: drop the `target system encapsulated height` priming trick. It read the pre-presentation full-screen height (874 pt on an iPhone) rather than the keyboard slot, clamped our constraint to 0, and lost to the system's required constraint anyway; the surface is now bottom-anchored so a transient over-tall container can never park it above the visible slot. / **键盘呈现高度**:移除「目标高度 − 系统封装高度」的预置技巧。它读到的是呈现前的整屏高度(iPhone 上 874pt)而非键盘槽,把约束夹成 0,且本来就压不过系统的 required 约束;键盘内容改为底部锚定,容器临时过高时不会再被顶到可见区域之外。
- **Undo of long insertions**: caret verification now compares the tail of the inserted text's last line instead of the whole string, so long or multi-line insertions no longer lose undo the moment the host returns a truncated context. / **长文本撤销**:光标校验改为比对插入文本最后一行的尾部而非整段,长文本或多行插入不再因宿主返回截断上下文而立刻失去撤销能力。
- **Undo after editing last input**: a newer insertion now clears the pending edit transaction, so undo rolls back that insertion instead of deleting it and restoring the older edit's original text. / **编辑上次输入后的撤销**:新的插入会清除待撤销的编辑事务,撤销将回滚该次插入,而不再是删除它并还原上一次编辑前的旧文本。
- **AI waiting spinner duplicate**: remove the mini ProgressView beside the AI status caption; the mic button spinner remains the sole loading indicator while recognizing or generating. / **AI 等待转圈重复**:去掉 AI 状态文案旁的迷你 ProgressView;识别/生成中仅保留麦克风按钮上的 loading。
- **AI stream UTF-8 mojibake**: SSE framing now accumulates raw bytes and decodes each line as UTF-8, so Chinese AI answers (e.g. weather) no longer appear as Latin-1 garbage like `今天…`. / **AI 流式 UTF-8 乱码**:SSE 行缓冲改为累积原始字节并以 UTF-8 解码,中文 AI 回答(如天气)不再显示为 `今天…` 一类 Latin-1 乱码。
- **Local ASR dictionary correction**: apply deterministic personal-dictionary alias correction before iOS Flow branches into dictation polish or AI question handling, so AI mode keeps local transcript optimization while still skipping cloud LLM polish. / **本地 ASR 词库纠错**:在 iOS Flow 分流到听写润色或 AI 问答前统一应用个人词库别名确定性纠错,使 AI 模式保留本地转写优化,同时继续跳过云端 LLM 润色。
## [1.7.0] - 2026-08-10
### Added
- **AI keyboard mode**: add a temporary multi-turn AI surface that sends raw ASR questions to the configured LLM, keeps the latest scrollable answer for review, and uses a two-step white Insert then green Send action in messaging fields; only inserted answers enter history and AI character statistics. / **AI 键盘模式**:新增临时多轮 AI 输入面,将原始 ASR 问题直接交给已配置模型,滚动展示最新答案,并在即时通信输入框中采用先点白色「插入」、再点绿色「发送」的两步操作;只有真正插入的答案会进入历史与 AI 字数统计。
- **AI mode web search**: AI questions use a dedicated transport that enables provider-side search when available (DeepSeek/OpenAI/xAI Responses `web_search`, Qwen `enable_search`, Zhipu/Anthropic/Moonshot tools), forces thinking on, and silently retries without search on failure — polish stays on plain Chat Completions. / **AI 模式联网搜索**:AI 问答走独立传输层,在服务商支持时启用服务端搜索(DeepSeek/OpenAI/xAI Responses `web_search`、通义 `enable_search`、智谱/Anthropic/Moonshot tools),强制开启 thinking,失败则静默无搜索重试;润色仍走普通 Chat Completions。
- **API key setup guidance**: Home shows a tip when the polish LLM key is missing; the keyboard mic line warns above the microphone. Without a key, dictation still inserts raw ASR text. / **API Key 引导**:未填写润色 API Key 时首页显示提示,键盘麦克风上方同步提醒;无 Key 时听写仍插入原始识别结果。
### Changed
- **User-owned polish keys only**: remove the built-in DeepSeek `PreconfiguredKeys` fallback. Local and cloud polish (and AI mode) require a user-filled API key; AI question timeout is 60s. / **仅使用用户 API Key**:移除内置 DeepSeek `PreconfiguredKeys` 回退。本地/云端润色与 AI 模式均需用户自行填写 API Key;AI 问答超时为 60 秒。
- **OpenAI default model**: preset default is now `gpt-5.4-mini` (Responses `web_search` capable). Existing saved model names are unchanged. / **OpenAI 默认模型**:预设改为 `gpt-5.4-mini`(支持 Responses 联网搜索);用户已保存的模型名不受影响。
- **LLM preset defaults refreshed**: update defaults for Qwen (`qwen-plus-latest`), Zhipu (`glm-4.7-flash`), Moonshot (`kimi-k2.5`), xAI (`grok-4-fast-reasoning`), Gemini (`gemini-3.1-flash-lite`), MiniMax (`MiniMax-M2.7`), SiliconFlow / OpenRouter / CometAPI / CodingPlanX; Anthropic stays on `claude-sonnet-4-6`. Polish and AI mode both resolve the Settings provider/model via the same endpoint helper. / **LLM 预设默认值更新**:通义 / 智谱 / Moonshot / xAI / Gemini / MiniMax 及部分聚合预设已换新默认模型;Anthropic 仍为 `claude-sonnet-4-6`。润色与 AI 模式共用同一套设置中的服务商与模型解析。
- **Privacy policy**: document user-owned LLM keys, AI-mode optional provider web search, and remove built-in DeepSeek wording (in-app + GitHub Pages). / **隐私政策**:说明用户自备 LLM Key、AI 模式可选服务商联网搜索,并移除内置 DeepSeek 表述(App 内 + GitHub Pages)。
- **iPad system globe key**: add the system 🌐 key on both iPad voice and typing surfaces — tap to switch to the next keyboard, long-press to open the system input-mode picker. The key uses UIKit's standard all-touch-events input-mode action and the same SwiftUI chrome as adjacent action keys; iPhone relies on its system-provided switch below the keyboard. / **iPad 系统地球键**:在 iPad 语音面与打字面均新增系统 🌐 键——轻点切换下一个键盘,长按打开系统键盘列表。按键采用 UIKit 标准全触摸事件输入模式动作,并与相邻功能键共用同一套 SwiftUI 键面;iPhone 则使用键盘下方由系统提供的切换入口。
- **iPad typing layout**: the typing keyboard now adapts to iPad — taller 54 pt key rows, a second-row inset that widens in landscape (40 pt) vs portrait (30 pt), a small grey number overlay (10) on the top letter row mirroring iOS, and a content-driven height (≈300 pt on iPad vs 281 pt on iPhone) so the bottom row is never clipped. Metrics live in `TypingLayoutMetrics` and are selected from one controller-owned device-idiom + horizontal-size-class decision. / **iPad 打字布局**:打字键盘现已适配 iPad——键行加高至 54pt,第二行缩进在横屏(40pt)比竖屏(30pt)更宽,首字母行叠加 1–0 小号灰数字(对齐 iOS),并改为内容驱动高度(iPad 约 300ptiPhone 281pt),底部行不再被裁切。尺寸由控制器统一结合设备类型与水平尺寸类判定。
- **Editing toolbar (iPad)**: the typing top bar gains an iOS-style undo / redo / copy / cut cluster on iPad. Undo/redo track the last voice insertion (redo re-applies it); copy/cut read the host selection. Availability is refreshed from `textDidChange` / `selectionDidChange`. / **编辑工具栏(iPad**:打字面顶栏在 iPad 上新增类 iOS 的撤销/重做/拷贝/剪切簇。撤销/重做跟踪上次听写插入(重做可复原),拷贝/剪切读取宿主选区;可用性随 `textDidChange` / `selectionDidChange` 刷新。
- **Edit last input**: long-press the microphone to describe changes to the last verified OSGKeyboard insertion, then preview and replace or append the validated result without exposing unrelated field text. / **编辑上次输入**:长按麦克风口述对最近一次已验证 OSGKeyboard 输入的修改,预览后可替换原文或追加结果,且不暴露无关输入框内容。
### Removed
- **Clipboard voice commands**: remove the iOS keyboard's long-press clipboard capture, persisted resume state, clipboard prompt pipeline, and related pasteboard access; normal dictation, last-input editing, main-app/macOS copy features, and keyboard copy/cut remain available. / **剪贴板语音指令**:移除 iOS 键盘长按读取剪贴板、持久化恢复状态、剪贴板提示词链路及相关粘贴板访问;普通听写、编辑上次输入、主 App/macOS 独立复制功能与键盘拷贝/剪切继续保留。
### Fixed
- **Focused recording chrome and cancellation**: edit mode now aligns its logo and close button to the same outer inset as the normal voice surface. During normal voice startup, recording, and processing, the capsule tabs and translation button are replaced by a high-visibility cancel button; cancelling aborts ASR and polish and discards any late result. Disabled undo and bottom action keys stay hidden so the live microphone remains the unambiguous focus. / **聚焦录音界面与取消入口**:编辑模式的 Logo 与关闭按钮现与普通语音界面使用相同外边距。普通语音从启动、录音到处理期间,胶囊标签与翻译按钮会替换为高可见度取消按钮;取消会终止 ASR 与润色,并丢弃任何迟到结果。不可用的撤销键和底部操作键保持隐藏,让正在工作的麦克风成为明确焦点。
- **Repeat edit sessions**: completed edits no longer re-adopt stale recording snapshots and enter an eight-second busy quarantine, so the next long-press starts ASR immediately with the latest applied text. The edit surface enlarges its comparison swipe area, shows live ASR text and an audio-level waveform instead of status copy, widens the centred edit microphone into a three-times-wide capsule, and keeps the green “hold to edit” hint visible for ten seconds. / **连续编辑会话**:已完成的编辑不再重新接管过期录音快照并进入八秒忙碌隔离,下一次长按会立即基于最新已应用文本启动 ASR。编辑界面同时扩大对比滑动热区,以实时 ASR 文本与音量波形替代状态文案,将居中的编辑麦克风加宽为原宽度三倍的胶囊按钮,并将绿色“长按编辑”提示延长至十秒。
- **Faster first mic and stable edit review**: each host process performs one bounded post-PiP audio health check (real first-frame proof, one soft-dead rebuild, then release), while touching the main mic primes the same single-flight capture for the imminent tap/hold utterance. Edit review now keeps its Flow identity until confirm/close, deduplicates final results by utterance+revision, and uses native horizontal paging; a simulator XCUITest verifies left/right swipes over the text area. / **更快首录与稳定编辑预览**:每个宿主进程在 PiP 就绪后执行一次有界音频健康检查(真实首帧证明、软死时最多重建一次、随后释放),手指按下主麦克风时则预热同一个单飞 capture,供即将成立的短按/长按 utterance 直接接管。编辑预览在确认/关闭前持续保留 Flow 身份,按 utterance+revision 去重结果,并改用原生横向分页;模拟器 XCUITest 已验证文字区域左右滑动。
- **Unified edit-mode recording**: dictation and last-input editing now share one `FlowUtteranceRequest` start transaction for host handoff, microphone activation, recording confirmation, stop, timeout, and ASR; edit mode no longer pre-allocates a ghost utterance or runs its own confirmation polling. The initiating long press is consumed before switching views, preventing a replayed finger-up from sending `stopRecording`. / **统一编辑模式录音**:普通听写与编辑上次输入现共用同一个 `FlowUtteranceRequest` 启动事务,统一处理宿主交接、麦克风激活、录音确认、停止、超时与 ASR;编辑模式不再预创建幽灵 utterance,也不再维护独立确认轮询。切换界面前先消费发起编辑的长按,避免抬手被重放为 `stopRecording`
- **iPad keyboard width**: the typing keyboard was clamped to a 700 pt centred column on every device, leaving 67 pt of dead space per side on an 11" iPad in portrait and 247 pt in landscape (51% of the screen on a 13" in landscape), so no key sat where the system keyboard puts it. The cap was a voice-surface ergonomics constraint (`contentMaxWidth`) that the key grid had inherited; it is now voice-only (`voiceContentMaxWidth`) and the typing grid spans the full host width. Letter keys grow from 61 pt to 75 pt wide on an 11" iPad in portrait. / **iPad 键盘宽度**:打字键盘此前在所有设备上都被钳制为 700pt 居中列,11 寸 iPad 竖屏每侧留白 67pt、横屏 247pt(13 寸横屏占屏幕 51%),导致没有一个按键落在系统键盘的位置上。该上限原是语音面的可达性约束(`contentMaxWidth`),却被键盘网格一并继承;现已改为语音面专用(`voiceContentMaxWidth`),打字网格铺满宿主宽度。11 寸 iPad 竖屏字母键宽由 61pt 增至 75pt。
- **iPad keyboard height ignored orientation**: `contentHeight` hardcoded `isLandscape: true` while orientation only fed the second-row inset, so portrait and landscape resolved to an identical 300 pt. Height is now driven by available width (394 pt at iPad landscape widths vs 300 pt in portrait, against roughly 398 pt / 313 pt for the system keyboard), which also fixes `traitCollectionDidChange` never firing on iPad rotation — both orientations are `regular`, so the resize is now picked up in `viewDidLayoutSubviews`. / **iPad 键盘高度不随方向变化**`contentHeight` 硬编码 `isLandscape: true`,而方向仅用于第二行缩进,横竖屏因此解析出完全相同的 300pt。现改由可用宽度驱动(iPad 横屏宽度下 394pt、竖屏 300pt,系统键盘约为 398pt / 313pt),同时修复 iPad 旋转不触发 `traitCollectionDidChange` 的问题——横竖屏同为 `regular`,改在 `viewDidLayoutSubviews` 捕获尺寸变化。
- **Second-row indent no longer a fixed constant**: the ASDF row used a hardcoded 30 / 40 pt inset tuned for a 700 pt column, which stops reading as a deliberate indent once the grid fills an iPad. It is now derived so second-row keys are exactly as wide as first-row keys, leaving a half key at each end — the system keyboard's own rule, and correct at any width. / **第二行缩进不再是固定常量**ASDF 行原用为 700pt 列调校的 30 / 40pt 硬编码缩进,网格铺满 iPad 后已无法读作有意的缩进。现改为推导值,使第二行键宽与第一行完全一致、两端各留半个键——即系统键盘自身的规则,在任意宽度下都成立。
- **iPad bottom row gains comma / period**: filling the width turned the phone row's 50% centre fraction into a 663 pt space bar on a 13" iPad in landscape. iPad now uses a six-slot row `[globe · 123 · , · space · . · return]` (9/13/9/38/9/22), spending the extra width on keys the way the system keyboard does; space settles at 432 pt on an 11" in landscape against roughly 430 pt for the system. Punctuation routes through the engine, so a pending composition commits first. / **iPad 底行新增逗号/句号**:铺满宽度后,手机版 50% 的中央比例会使 13 寸 iPad 横屏空格键达到 663pt。iPad 现采用六槽底行 `[globe · 123 · , · space · . · return]`9/13/9/38/9/22),像系统键盘那样把多出的宽度用于增加按键;11 寸横屏空格为 432pt,系统约为 430pt。标点经由引擎提交,未上屏的编码会先行确认。
- **Voice surface matches the typing surface**: the voice surface also fills the host width, and both surfaces now resolve to one content-driven height, so switching between them no longer resizes the keyboard (a 113 pt jump on an iPad in landscape). Surplus height is parked above the action cluster, keeping its keys on the typing bottom row's baseline. Its bottom row uses a flatter iPad split (10/24/40/26), widening the primary return key without letting the phone's 50% centre fraction hand it ~577 pt at full width. / **语音面与打字面对齐**:语音面同样铺满宿主宽度,且两面现在解析出同一个内容驱动的高度,互相切换不再改变键盘尺寸(iPad 横屏原有 113pt 跳变)。多余高度置于操作簇上方,使其按键与打字面底行保持同一基线;底行在 iPad 上采用更平缓的比例(10/24/40/26),加宽主要回车键,同时避免手机版 50% 的中央比例让其在铺满时达到约 577pt。
- **Layout metrics are now testable**: typing size decisions moved from `TypingRootView` (extension target) into `TypingSurfaceMetrics` (shared), so the UIKit height constraint and the SwiftUI grid provably read the same source and unit tests can cover them without the extension. / **布局尺寸可测**:打字面尺寸决策由 `TypingRootView`(扩展 target)移至 `TypingSurfaceMetrics`(共享层),UIKit 高度约束与 SwiftUI 网格可证明地读取同一数据源,且单测无需依赖扩展即可覆盖。
- **Chinese input never initializes**: the keyboard could show 「请先打开 OSGKeyboard 完成输入法初始化」 indefinitely even after opening the app, because Rime deployment was scheduled only as opportunistic warmup — a 45 s delay that additionally required the app to stay foregrounded and to clear a memory gate, and silently dropped the work otherwise. Deployment is now also run deterministically at the moments the user is actually waiting on it: during the onboarding "Add Keyboard" step (with an inline progress / retry status row), immediately on onboarding completion, and on demand via a new `osgkeyboard://deployrime` deeplink. / **中文输入始终无法初始化**:即使已打开主 App,键盘仍可能长期显示「请先打开 OSGKeyboard 完成输入法初始化」——因为 Rime 部署只作为机会性预热调度:延迟 45 秒,且要求 App 保持前台并通过内存闸门,否则静默放弃。现在在用户真正等待结果的时机改为确定性执行:引导「添加键盘」步骤内(附行内进度 / 重试状态)、引导完成时立即执行,以及通过新增的 `osgkeyboard://deployrime` deeplink 按需触发。
- **Keyboard recovers without a restart**: a keyboard already showing the setup error now retries engine preparation when the host posts its post-deployment App Group notification, and the error text itself became a tappable jump into the host app (only for failures host deployment can actually fix). Previously the error persisted until the user switched surfaces or relaunched the keyboard. / **键盘无需重启即可恢复**:已显示初始化错误的键盘,会在宿主发出部署完成的 App Group 通知后自动重试引擎准备;错误文案本身也变为可点击跳转(仅对确实能由宿主部署修复的故障开放)。此前该错误会一直保留,直到用户切换面板或重新拉起键盘。
- **Rime deployment stays in the host app**: the shared installer now rejects every `.appex` process, and personal-dictionary callbacks skip deployment when invoked by the keyboard extension. Returning users trigger idempotent deployment immediately when the host opens instead of waiting for a 45-second opportunistic warmup. The host now clears its heavy-work flag before notifying the keyboard, so the extension's automatic retry cannot lose the only completion event to stale busy state. / **Rime 部署仅限主 App**:共享安装器现会拒绝所有 `.appex` 进程,个人词库回调若来自键盘扩展也会跳过部署。老用户打开主 App 时立即触发幂等部署,不再等待 45 秒的机会性预热;宿主还会先清除重任务标记再通知键盘,避免扩展自动重试因读到过期忙碌状态而错失唯一完成事件。
- **iPad globe key at bottom-left**: the system 🌐 key now lives at the bottom-left of both iPad surfaces — voice (`KeyboardRootView.micActionRow`) and typing (`TypingRootView.typingKeySurface`) — while iPhone removes the duplicate custom key and redistributes its three remaining actions across the row. UIKit owns the iPad key's complete native tap / long-press event chain, and its visible chrome matches adjacent keys. / **iPad 地球键移至左下角**:系统 🌐 键现位于 iPad 语音面与打字面的最左下角;iPhone 删除重复的自定义地球键,并将剩余三个操作键重新铺满底行。iPad 地球键由 UIKit 完整接管原生轻点/长按事件链,可见键面与相邻按键保持一致。
- **iPad typing height**: `TypingRootView.totalHeight` is now a function `totalHeight(isIPad:)`; `KeyboardViewController` resolves one layout mode from device idiom plus horizontal size class and publishes it to SwiftUI, keeping compact iPad multitasking on phone metrics and wide iPhones off iPad metrics. Trait changes refresh the height constraint so UIKit and SwiftUI stay aligned. / **iPad 打字高度**`TypingRootView.totalHeight` 改为函数 `totalHeight(isIPad:)``KeyboardViewController` 结合设备类型与水平尺寸类统一解析布局模式并发布给 SwiftUI,使 iPad 紧凑分屏使用手机尺寸、宽屏 iPhone 不误用 iPad 尺寸;尺寸类变化时同步刷新高度约束,确保 UIKit 与 SwiftUI 始终一致。
- **iPad sidebar breathing room**: on the iPad / regular-width sidebar, the gap between the brand logo and the first menu item is roughly doubled (brand header bottom padding `Spacing.md``Spacing.xxxl`), and each sidebar row is taller with larger text (font 13 → 15, vertical padding 7 → 12) so rows hit the Apple HIG 44pt touch target. / **iPad 侧栏留白**:iPad / 横屏规则宽度侧栏里,logo 与首个菜单项之间的间距大约翻倍(`brandHeader.bottom``Spacing.md` 改为 `Spacing.xxxl`),每行菜单项更高、字号更大(字号 13 → 15、垂直内边距 7 → 12),行高达到 Apple HIG 44pt 触摸目标。
- **iPad sidebar row alignment**: sidebar titles started at a different x on every row because `Label`'s default style sizes the icon to each SF Symbol's intrinsic width, which ranges from 13 pt (`character.book.closed`) to 17.5 pt (`house`) across this menu — pushing 「键盘」 5.2 pt right of 「词库」. A `LabelStyle` now reserves a uniform 22 pt icon column (the alignment `List` provides for free and this hand-rolled `VStack` sidebar lacked), and the selected row's corner radius moves off a stray hardcoded 7 pt onto the design scale at `Radius.medium` (12 pt). / **iPad 侧栏行对齐**:侧栏各行文字起点不一致——`Label` 默认样式按每个 SF Symbol 的固有宽度排布图标,本菜单内该宽度从 13pt(`character.book.closed`)到 17.5pt`house`)不等,使「键盘」比「词库」右移 5.2pt。现由 `LabelStyle` 预留统一的 22pt 图标列(`List` 自带、而手写 `VStack` 侧栏缺失的对齐),选中行圆角也从游离的硬编码 7pt 收回设计标度 `Radius.medium`12pt)。
- **iPad Home hint position**: the keyboard-setup hint (and other flow-session extras) on the iPad / regular-width home view used to render below the usage-stats cards, burying the most actionable guidance beneath the stats. The hint now sits right after the hero header and above the stats, matching the phone layout, so it is the first thing a user notices at the top of the page. / **iPad 首页提示位置**:iPad / 横屏规则宽度首页的「去系统设置添加键盘」提示(以及其他 Flow 会话附注)原本位于使用统计卡片之下,最关键的引导被压在统计之下。现已将其移到 hero 标题与统计卡片之间,与手机端布局一致,使其位于页面顶部最显眼处。
- **Polish never answers a question draft**: dictating 「你能听到我说话吗?」 could come back as 「能听到,你说。」. The never-answer boundary and the question guard now ship with every style, every intensity, and custom packs (heavy fun styles previously bypassed both), question detection covers A-not-A forms such as 「你在不在」, and a deterministic validator rejects any result that stops asking the draft's question and falls back to a local clean of the user's own words. A 800-request live matrix across 10 styles × 2 intensities × 20 short-to-long phrasings now delivers zero answers. / **润色不再代答问句**:口述「你能听到我说话吗?」可能被润色成「能听到,你说。」。现在「不可协商边界」与问句守卫覆盖全部风格、全部强度与自定义风格包(此前重度趣味风格会绕过两者),问句识别补齐「你在不在」等正反问句式,并新增确定性校验:结果若不再是问句则丢弃,回退为用户原话的本地清理。10 风格 × 2 强度 × 20 种长短句式、共 800 次真实模型压测下代答为 0。
- **Polish diagnostics**: `polish.config` now records style, intensity, sampling temperature, and which safeguard layers reached the model, and `polish.skippedLLM` records locally short-circuited utterances. / **润色诊断**`polish.config` 记录风格、强度、采样温度以及本次真正发给模型的防线层级,`polish.skippedLLM` 记录本地短路的语句。
## [1.6.6] - 2026-08-08 ## [1.6.6] - 2026-08-08
+5 -1
View File
@@ -95,7 +95,7 @@ struct OSGKeyboardApp: App {
forKey: AppGroupConfiguration.Keys.uiLanguage forKey: AppGroupConfiguration.Keys.uiLanguage
) )
// Clipboard demo needs history + suggestion strip flags on. // Clipboard demo needs history + suggestion strip flags on.
if scenario == .clipboard { if scenario == .clipboard || scenario == .clipboardSkills {
defaults.set(true, forKey: AppGroupConfiguration.Keys.clipboardHistoryEnabled) defaults.set(true, forKey: AppGroupConfiguration.Keys.clipboardHistoryEnabled)
defaults.set( defaults.set(
true, true,
@@ -176,6 +176,10 @@ struct OSGKeyboardApp: App {
return "待办:" return "待办:"
case (.clipboard, .en): case (.clipboard, .en):
return "Todo: " return "Todo: "
case (.clipboardSkills, .zh):
return "待办:"
case (.clipboardSkills, .en):
return "Todo: "
} }
} }
#endif #endif
+2 -2
View File
@@ -20,8 +20,8 @@ struct NotesHostDemoView: View {
switch (scenario, language) { switch (scenario, language) {
case (.ai, .en): return "Messages" case (.ai, .en): return "Messages"
case (.ai, .zh): return "信息" case (.ai, .zh): return "信息"
case (.edit, .en), (.clipboard, .en): return "Notes" case (.edit, .en), (.clipboard, .en), (.clipboardSkills, .en): return "Notes"
case (.edit, .zh), (.clipboard, .zh): return "备忘录" case (.edit, .zh), (.clipboard, .zh), (.clipboardSkills, .zh): return "备忘录"
} }
} }
@@ -54,6 +54,7 @@ enum WhatsNewDemoDriver {
"WhatsNewDemo start scenario=\(armed.scenario.rawValue) lang=\(armed.language.rawValue)", "WhatsNewDemo start scenario=\(armed.scenario.rawValue) lang=\(armed.language.rawValue)",
category: "boot" category: "boot"
) )
AIKeyboardView.debugPreviewSkills = nil
polishDemoChrome(state) polishDemoChrome(state)
switch armed.scenario { switch armed.scenario {
case .edit: case .edit:
@@ -66,7 +67,19 @@ enum WhatsNewDemoDriver {
case .ai: case .ai:
await runAI(state: state, host: host, language: armed.language) await runAI(state: state, host: host, language: armed.language)
case .clipboard: case .clipboard:
await runClipboard(state: state, host: host, language: armed.language) await runClipboard(
state: state,
host: host,
language: armed.language,
showsSkills: false
)
case .clipboardSkills:
await runClipboard(
state: state,
host: host,
language: armed.language,
showsSkills: true
)
} }
if !Task.isCancelled { if !Task.isCancelled {
WhatsNewDemoScenario.finishPlaying() WhatsNewDemoScenario.finishPlaying()
@@ -215,7 +228,8 @@ enum WhatsNewDemoDriver {
private static func runClipboard( private static func runClipboard(
state: KeyboardState, state: KeyboardState,
host: HostHooks, host: HostHooks,
language: WhatsNewDemoScenario.Language language: WhatsNewDemoScenario.Language,
showsSkills: Bool
) async { ) async {
let samples = language == .en let samples = language == .en
? [ ? [
@@ -273,6 +287,18 @@ enum WhatsNewDemoDriver {
polishDemoChrome(state) polishDemoChrome(state)
try? await sleep(0.2) try? await sleep(0.2)
} }
guard showsSkills else { return }
// The 1.8.0 clip continues from clipboard history into the real AI
// quick-skill row while the freshly copied item is still actionable.
clearClipboardChrome(state)
state.surface = .ai
state.aiServiceAvailable = true
AIKeyboardView.debugPreviewSkills = Array(AIClipboardSkillCatalog.catalog.prefix(5))
state.aiSession.enter()
polishDemoChrome(state)
try? await sleep(2.8)
} }
// MARK: - Host helpers // MARK: - Host helpers
@@ -11,6 +11,7 @@ public enum WhatsNewDemoScenario: String, Sendable {
case edit case edit
case ai case ai
case clipboard case clipboard
case clipboardSkills
public enum Keys { public enum Keys {
public static let scenario = "debug.whatsNew.demoScenario" public static let scenario = "debug.whatsNew.demoScenario"
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+77 -144
View File
@@ -186,58 +186,65 @@
<div class="group"> <div class="group">
<p class="group-title">AI 与语音助手</p> <p class="group-title">AI 与语音助手</p>
<div class="wn-media wide">
<video src="assets/whats-new/ai-voice-assistant-zh.mp4" autoplay muted loop playsinline preload="metadata"></video>
</div>
<ul> <ul>
<li><strong>AI 键盘模式</strong>新增独立 AI 输入面,可通过语音提问、查看回答,并在确认后插入或发送</li> <li>键盘可切换到 <strong>AI</strong>对着麦克风提问,回答会在键盘中实时出现,方便查看后再写入</li>
<li><strong>AI 联网搜索</strong>:支持服务商侧联网搜索,可回答天气、新闻等需要最新资料的问题,搜索失败时自动重试</li> <li>在即时通信等输入框中,先点白色<strong>「插入」</strong>,再点绿色<strong>「发送」</strong>;只有真正插入的内容会进入历史与字数统计</li>
<li><strong>AI 流式回答</strong>:模型生成内容时,回答会实时显示在键盘中,无需等待整段完成</li> <li>AI 空闲时会轮播常用提问和热点建议,点一下即可生成回答;需要天气、新闻等最新资料时会联网查找,失败会自动换方式重试</li>
<li><strong>AI 空闲建议</strong>:AI 面板会轮播常用提问和热点建议,点选后可直接生成回答</li> <li>设置 → <strong>AI Agent</strong> 可调节<strong>「回复篇幅」</strong>:简短 / 中等 / 详细</li>
<li><strong>回复篇幅设置</strong>:新增简短、中等、详细三档 AI 回复长度,并支持随设置同步</li> <li>刚输入过内容时,<strong>长按麦克风</strong>说出修改要求,可预览后替换原文或追加新内容</li>
<li><strong>编辑上次输入</strong>:长按麦克风即可口述修改要求,预览后替换上次输入或追加新内容</li> <li>润色会保留原本的提问语气,不再把「你能听到吗」等问句改写成回答</li>
<li><strong>问句保护</strong>:润色会保留用户原本的提问语气,不再把「你能听到吗」等问句改写成回答</li>
</ul> </ul>
</div> </div>
<div class="group"> <div class="group">
<p class="group-title">剪贴板与技能</p> <p class="group-title">剪贴板与技能</p>
<div class="wn-media wide">
<video src="assets/whats-new/clipboard-skills-zh.mp4" autoplay muted loop playsinline preload="metadata"></video>
</div>
<ul> <ul>
<li><strong>剪贴板历史</strong>:可选保存最近 15 条纯文本,支持查看、插入和单独清空,默认关闭且仅保存在本机</li> <li>在设置 → <strong>剪贴板</strong>开启<strong>「历史记录」</strong>(默认关闭),可在本机保存最近 15 条纯文本;页面也可直接前往系统设置,将「从其他 App 粘贴」设为允许</li>
<li><strong>剪贴板建议条</strong>:开启后,最新复制内容会显示在键盘上方,可一键插入</li> <li>键盘顶栏的<strong>剪贴板</strong>按钮可打开历史,点一条即可插入;开启<strong>建议条</strong>后,最新复制内容会显示在键盘上方</li>
<li><strong>粘贴权限引导</strong>:剪贴板设置页可直接打开系统设置,方便将「从其他 App 粘贴」设为允许</li> <li>复制文字后约 30 秒内切到 AI,可直接选择<strong>回复、总结或翻译</strong>;也可以说出「回复剪贴板」或「翻译剪贴板」</li>
<li><strong>口述剪贴板请求</strong>:在 AI 模式中说出「回复剪贴板」或「翻译剪贴板」,即可处理已保存的复制内容</li> <li>App 新增<strong>技能</strong>页,可管理最多 8 个键盘技能,并通过长按拖动调整顺序</li>
<li><strong>剪贴板快捷技能</strong>:复制后可直接选择回复、总结或翻译,无需先粘贴到输入框</li> <li>右上角 <strong>+</strong> 可自定义技能名称、图标和提示词,也可连接自己的 iCloud 快捷指令</li>
<li><strong>技能中心</strong>:首页新增技能页,可管理最多 8 个键盘技能,并通过长按拖动调整顺序</li> <li>内置技能可从复制内容<strong>提取待办、写入日历、存入备忘录</strong>,或识别地址后打开高德、百度与 Apple 地图导航</li>
<li><strong>自定义技能</strong>:可自定义名称、图标和提示词,也可连接自己的 iCloud 快捷指令</li>
<li><strong>提取待办</strong>:可从复制内容识别待办事项,并通过快捷指令写入提醒事项</li>
<li><strong>提取日程</strong>:可识别日期、时间、地点和结束时间,并写入系统日历</li>
<li><strong>存入备忘录</strong>:可根据复制内容生成简短标题,并将原文保存到 Apple 备忘录</li>
<li><strong>地址导航</strong>:可识别地址或起点终点,并直接打开高德、百度或 Apple 地图开始驾车导航</li>
</ul> </ul>
</div> </div>
</section> </section>
<section class="section"> <section class="section">
<h2>中英文输入</h2> <h2>全新 App 界面</h2>
<ul> <ul>
<li><strong>英文 QuickType 候选栏</strong>:输入英文时同时显示原词、纠错和补全,提交后自动清空</li> <li>首页改为信息总览:使用统计、听写历史和个性词库集中显示为资料卡,点按后使用标准返回按钮进入完整列表</li>
<li><strong>英文词汇覆盖扩充</strong>:加入约 4 万词的离线词表,并结合系统词库、通讯录名称和文本替换提供建议</li> <li>iPhone 底部导航重做为 <strong>首页 / 技能 / 风格 / 设置</strong>四栏 Liquid Glass Dock,绿色胶囊清楚标示当前页面</li>
<li><strong>英文邻键纠错</strong>:按错相邻按键时,会优先推荐更符合真实键盘位置的单词</li> <li>技能与润色风格统一为卡片式管理:点按选择、右上角编辑、右下角显示启用状态;技能支持像主屏幕图标一样长按拖动排序</li>
<li><strong>英文自动更正更克制</strong>:减少对专名、短词和全大写词的误改;拒绝纠错后会学习保留原词</li> <li>设置入口重新整理,AI Agent、剪贴板、语音与文字输入等页面更容易找到,当前设置摘要直接显示在导航行右侧</li>
<li><strong>拼音简拼改进</strong>:优化 <code>wom</code> 等混合简拼排序,并支持 <code>zh</code><code>ch</code><code>sh</code> 两键简拼</li> <li>iPad 改为侧栏 + 内容区布局,增大导航触控区域并统一图标对齐;翻译移到麦克风旁与撤销对称,顶栏原位置改为剪贴板入口</li>
<li><strong>输入习惯学习</strong>:中文候选频率和英文选择偏好会保存在本机,设置中可单独清除,不影响个性词库</li>
<li><strong>叠指连打</strong>:支持上一键尚未抬起时按下下一键,并按按下顺序输出文字</li>
<li><strong>双空格句号</strong>:英文单词后连续按两次空格,会自动转换为句号和空格,并开启句首大写</li>
<li><strong>回车键场景文案</strong>:回车键会根据当前输入框显示前往、搜索、发送、完成、下一项等系统文案</li>
<li><strong>iPad 键盘适配</strong>:键盘横竖屏均铺满可用宽度,底行加入逗号、句号和系统地球键,并提供撤销、重做、复制和剪切</li>
</ul> </ul>
</section> </section>
<section class="section"> <section class="section">
<h2>界面、稳定性与隐私</h2> <h2>中英文输入全面升级</h2>
<ul> <ul>
<li><strong>统一撤销上次输入</strong>:听写、AI 回答、编辑结果和剪贴板粘贴均可一次撤销</li> <li>英文键盘新增类 QuickType 候选栏,同时显示原词、纠错和补全;约 4 万词离线词表会结合系统词库、通讯录名称与文本替换提供建议</li>
<li><strong>首页与导航调整</strong>:历史记录和个性词库改为首页资料卡;技能、风格和设置入口重新整理</li> <li>英文邻键纠错更贴合真实键盘位置,并减少对专名、短词和全大写词的误改;拒绝纠错后会学习保留原词</li>
<li><strong>输入稳定性改进</strong>:修复中文输入初始化失败、跨设备剪贴板导致键盘卡住、切换键盘崩溃、录音取消不及时及 AI 会话结束后麦克风不可用等问题</li> <li>拼音优化 <code>wom</code> 等混合简拼排序,并支持 <code>zh</code><code>ch</code><code>sh</code> 两键简拼;中文候选频率和英文选择偏好会保存在本机</li>
<li><strong>数据控制更新</strong>:默认使用设备端语音识别;AI 使用用户自己的 API Key;剪贴板功能默认关闭,内容仅在用户主动触发时交给所配置的服务商</li> <li>支持叠指连打、英文双空格句号,以及根据输入框显示前往、搜索、发送、完成、下一项等回车键文案</li>
<li>iPad 键盘横竖屏均铺满可用宽度,底行加入逗号、句号和系统地球键,并提供撤销、重做、复制和剪切</li>
</ul>
</section>
<section class="section">
<h2>更稳定、更可控</h2>
<ul>
<li>听写、AI 回答、编辑结果和剪贴板粘贴现在都可通过同一个撤销键一次回滚</li>
<li>长按麦克风现在用于<strong>编辑上次输入</strong>;旧的长按剪贴板语音流程已由剪贴板历史和快捷技能替代</li>
<li>中文输入资源会在 App 中自动完成初始化,部署完成后已打开的键盘也会自行恢复,无需反复重启</li>
<li>修复跨设备剪贴板导致键盘卡住、切换键盘崩溃、录音取消不及时,以及 AI 会话结束后麦克风不可用等问题</li>
<li>默认继续使用设备端语音识别;AI 使用你自己的 API Key,未配置时首页和麦克风上方会提示;剪贴板默认关闭,内容只在你主动操作后交给所配置的服务商</li>
</ul> </ul>
</section> </section>
</div> </div>
@@ -248,139 +255,65 @@
<div class="group"> <div class="group">
<p class="group-title">AI and voice assistant</p> <p class="group-title">AI and voice assistant</p>
<div class="wn-media wide">
<video src="assets/whats-new/ai-voice-assistant-en.mp4" autoplay muted loop playsinline preload="metadata"></video>
</div>
<ul> <ul>
<li><strong>AI keyboard mode</strong>: ask by voice, review the answer on the keyboard, then insert or send it when ready</li> <li>Switch the keyboard to <strong>AI</strong>, ask with the microphone, and watch the answer appear on the keyboard before writing it into the current app</li>
<li><strong>AI web search</strong>: supported providers can search for current information such as weather and news, with automatic fallback when search fails</li> <li>In messaging fields, tap white <strong>Insert</strong>, then green <strong>Send</strong>; only inserted answers count toward history and character statistics</li>
<li><strong>Streaming AI answers</strong>: answers appear on the keyboard as the model writes instead of waiting for the full response</li> <li>Idle AI rotates useful prompts and current topics that can be sent with one tap; questions that need weather, news, or other current information use web search with automatic fallback</li>
<li><strong>AI idle suggestions</strong>: the AI panel rotates useful prompts and current topics that can be sent with one tap</li> <li>In Settings → <strong>AI Agent</strong>, choose <strong>Response length</strong>: Short / Medium / Detailed</li>
<li><strong>Response length</strong>: choose Short, Medium, or Detailed AI answers and sync the preference with settings</li> <li>Right after entering text, <strong>hold the microphone</strong>, describe the change, then preview and replace the original or append the result</li>
<li><strong>Edit last input</strong>: hold the microphone, describe the change, preview it, then replace the last input or append the result</li> <li>Polish preserves your original question instead of rewriting prompts such as “Can you hear me?” into answers</li>
<li><strong>Question protection</strong>: polish preserves the user's question instead of rewriting prompts such as “Can you hear me?” into answers</li>
</ul> </ul>
</div> </div>
<div class="group"> <div class="group">
<p class="group-title">Clipboard and Skills</p> <p class="group-title">Clipboard and Skills</p>
<div class="wn-media wide">
<video src="assets/whats-new/clipboard-skills-en.mp4" autoplay muted loop playsinline preload="metadata"></video>
</div>
<ul> <ul>
<li><strong>Clipboard history</strong>: optionally keep the latest 15 plain-text copies on this device, with separate view, insert, and clear controls</li> <li>Turn on <strong>History</strong> in Settings → <strong>Clipboard</strong> (off by default) to keep the latest 15 plain-text copies on this device; the same page opens system Settings for Paste from Other Apps permission</li>
<li><strong>Clipboard suggestion strip</strong>: show the newest copy above the keyboard for one-tap insertion</li> <li>Open history from the keyboard's top-bar <strong>Clipboard</strong> button and tap an item to insert it; the optional <strong>Suggestion strip</strong> keeps the newest copy above the keyboard</li>
<li><strong>Paste permission guide</strong>: open system Settings directly to set Paste from Other Apps to Allow</li> <li>Within about 30 seconds of copying text, switch to AI and choose <strong>Reply, Summarize, or Translate</strong>, or say “reply to the clipboard” or “translate my clipboard”</li>
<li><strong>Spoken clipboard requests</strong>: say “reply to the clipboard” or “translate my clipboard” in AI mode to use the saved copy</li> <li>The new <strong>Skills</strong> page manages up to eight keyboard skills and reorders them with a long-press drag</li>
<li><strong>Clipboard quick skills</strong>: choose Reply, Summarize, or Translate after copying without first pasting into a field</li> <li>Use the top-right <strong>+</strong> to create a skill with your own name, icon, and prompt, with an optional iCloud Shortcut connection</li>
<li><strong>Skills center</strong>: manage up to eight keyboard skills and reorder them with a long-press drag</li> <li>Built-in skills can <strong>extract to-dos, add calendar events, save to Notes</strong>, or recognize an address and open Amap, Baidu Maps, or Apple Maps</li>
<li><strong>Custom skills</strong>: create a name, icon, and prompt, with an optional iCloud Shortcut connection</li>
<li><strong>Extract to-dos</strong>: recognize tasks in copied text and add them to Reminders through a companion Shortcut</li>
<li><strong>Extract events</strong>: recognize dates, times, locations, and end times, then add them to Calendar</li>
<li><strong>Save to Notes</strong>: generate a short title and save the original copied text to Apple Notes</li>
<li><strong>Navigate to an address</strong>: recognize an address or route and open driving directions in Amap, Baidu Maps, or Apple Maps</li>
</ul> </ul>
</div> </div>
</section> </section>
<section class="section"> <section class="section">
<h2>Chinese and English Typing</h2> <h2>A New App Interface</h2>
<ul> <ul>
<li><strong>English QuickType bar</strong>: see the typed word, correction, and completion together; the bar clears after commit</li> <li>Home becomes a true overview: usage statistics, dictation history, and Personal Dictionary appear together as preview cards that open full lists with standard back navigation</li>
<li><strong>Broader English vocabulary</strong>: an offline list of about 40,000 words works with the system lexicon, contact names, and text replacements</li> <li>The iPhone dock is rebuilt around four Liquid Glass destinations — <strong>Home / Skills / Styles / Settings</strong> — with a green capsule marking the current page</li>
<li><strong>Neighbor-key correction</strong>: mistypes on nearby keys prioritize words that match the physical keyboard layout</li> <li>Skills and polish styles share one card-based interaction: tap to select, edit from the top-right, and see enabled status at the bottom-right; skills reorder with a Home Screen-style long-press drag</li>
<li><strong>More conservative autocorrect</strong>: fewer unwanted changes to names, short words, and all-caps text; rejecting a correction teaches the original</li> <li>Settings navigation is reorganized so AI Agent, Clipboard, Speech, and Text Input are easier to find, with current summaries shown directly beside each row</li>
<li><strong>Pinyin abbreviation improvements</strong>: mixed forms such as <code>wom</code> rank better, with two-key <code>zh</code>, <code>ch</code>, and <code>sh</code> abbreviations</li> <li>iPad uses a sidebar + detail layout with larger, aligned navigation rows; Translation moves beside the microphone opposite Undo, and its former top-bar slot becomes Clipboard</li>
<li><strong>Typing habit learning</strong>: Chinese candidate frequency and English boosts stay on device and can be cleared without deleting the personal dictionary</li>
<li><strong>Overlapping key presses</strong>: press the next key before lifting the previous finger while characters still commit in press order</li>
<li><strong>Double-space period</strong>: a second Space after an English word becomes a period and space, then enables sentence capitalization</li>
<li><strong>Contextual Return labels</strong>: the action key shows Go, Search, Send, Done, Next, and other system labels for the current field</li>
<li><strong>iPad keyboard layout</strong>: fills portrait and landscape width, adds comma, period, and the system globe key, plus undo, redo, copy, and cut</li>
</ul> </ul>
</section> </section>
<section class="section"> <section class="section">
<h2>Interface, Stability &amp; Privacy</h2> <h2>Chinese and English Typing, Rebuilt</h2>
<ul> <ul>
<li><strong>Unified undo</strong>: roll back dictation, AI answers, edit results, and clipboard pastes in one step</li> <li>The English keyboard adds a QuickType-style bar for the typed word, correction, and completion; an offline list of about 40,000 words works with the system lexicon, contact names, and text replacements</li>
<li><strong>Home and navigation updates</strong>: History and Personal Dictionary become Home cards, with reorganized Skills, Styles, and Settings navigation</li> <li>Neighbor-key correction follows the physical keyboard while autocorrect makes fewer unwanted changes to names, short words, and all-caps text; rejecting a correction teaches the original</li>
<li><strong>Input stability</strong>: fixes Chinese setup failures, Universal Clipboard keyboard freezes, keyboard-switch crashes, delayed recording cancellation, and a stuck microphone after AI sessions</li> <li>Pinyin improves mixed abbreviations such as <code>wom</code> and supports two-key <code>zh</code>, <code>ch</code>, and <code>sh</code>; Chinese candidate frequency and English choices learn locally</li>
<li><strong>Data controls</strong>: on-device speech recognition remains the default; AI uses your own API key; Clipboard features stay off until enabled and send text only after your action</li> <li>Overlapping key presses, the English double-space period, and contextual Go / Search / Send / Done / Next Return labels make typing feel closer to the system keyboard</li>
<li>On iPad, the keyboard fills portrait and landscape width, adds comma, period, and the system globe key, plus undo, redo, copy, and cut</li>
</ul> </ul>
</section> </section>
</div>
</article>
<!-- ========== 1.7.5 ========== -->
<article class="version-block" data-version="1.7.5">
<div class="version-chip">1.7.5</div>
<div class="lang-block" data-lang="zh">
<section class="section">
<h2>新功能</h2>
<div class="group">
<p class="group-title">AI 模式</p>
<div class="wn-media wide">
<video src="assets/whats-new/ai-keyboard-zh.mp4" autoplay muted loop playsinline preload="metadata"></video>
</div>
<ul>
<li>键盘可切换到 <strong>AI</strong>:对着麦克风提问,答案显示在键盘上,方便查看后再写入</li>
<li>在即时通信等输入框中,先点白色<strong>「插入」</strong>,再点绿色<strong>「发送」</strong>;只有真正插入的内容会进入历史与字数统计</li>
<li>需要时会联网查资料;失败时会自动换方式重试</li>
<li>设置 → <strong>AI Agent</strong> 可调节<strong>「回复篇幅」</strong>:简短 / 中等 / 详细</li>
</ul>
</div>
<div class="group">
<p class="group-title">剪贴板历史</p>
<div class="wn-media wide">
<video src="assets/whats-new/clipboard-history-zh.mp4" autoplay muted loop playsinline preload="metadata"></video>
</div>
<ul>
<li>在设置 → <strong>剪贴板</strong> 开启<strong>「历史记录」</strong>(默认关闭);本机保存最近 15 条纯文本</li>
<li>顶栏<strong>剪贴板</strong>按钮打开历史,点一条即可插入;也可开启<strong>「建议条」</strong>,最新复制显示在键盘上方,点一下就能用</li>
<li>建议在系统设置里把<strong>「从其他 App 粘贴」</strong>设为<strong>「允许」</strong>,减少每次复制的弹窗</li>
</ul>
</div>
</section>
<section class="section"> <section class="section">
<h2>变更</h2> <h2>More Stable, More Controllable</h2>
<ul> <ul>
<li><strong>翻译</strong>入口移到语音键盘麦克风旁(与撤销对称);原顶栏位置改为剪贴板按钮</li> <li>One Undo key now rolls back dictation, AI answers, edit results, and clipboard pastes</li>
</ul> <li>Holding the microphone now <strong>edits the last input</strong>; Clipboard History and quick skills replace the previous hold-to-command clipboard flow</li>
</section> <li>Chinese input resources initialize automatically in the app, and an already-open keyboard recovers after deployment without repeated restarts</li>
</div> <li>Fixes Universal Clipboard freezes, keyboard-switch crashes, delayed recording cancellation, and a microphone that could remain unavailable after AI sessions</li>
<li>On-device speech recognition remains the default; AI uses your own API key, with setup tips on Home and above the microphone when missing; Clipboard stays off until enabled and sends text only after your action</li>
<div class="lang-block" data-lang="en">
<section class="section">
<h2>New Features</h2>
<div class="group">
<p class="group-title">AI mode</p>
<div class="wn-media wide">
<video src="assets/whats-new/ai-keyboard-en.mp4" autoplay muted loop playsinline preload="metadata"></video>
</div>
<ul>
<li>Switch the keyboard to <strong>AI</strong>, ask with the microphone, and review the answer on the keyboard before inserting it</li>
<li>In messaging fields, tap white <strong>Insert</strong>, then green <strong>Send</strong>; only inserted answers count toward history and character stats</li>
<li>Looks up online info when needed, and retries another way if that fails</li>
<li>In Settings → <strong>AI Agent</strong>, choose <strong>Response length</strong>: Short / Medium / Detailed</li>
</ul>
</div>
<div class="group">
<p class="group-title">Clipboard history</p>
<div class="wn-media wide">
<video src="assets/whats-new/clipboard-history-en.mp4" autoplay muted loop playsinline preload="metadata"></video>
</div>
<ul>
<li>Turn on <strong>History</strong> in Settings → <strong>Clipboard</strong> (off by default); keeps the latest 15 plain-text copies on this device</li>
<li>Open history from the top-bar <strong>Clipboard</strong> button and tap an item to insert; optional <strong>Suggestion strip</strong> shows the newest copy above the keys for one-tap use</li>
<li>Set system <strong>Paste from Other Apps</strong> to <strong>Allow</strong> to reduce paste prompts after each copy</li>
</ul>
</div>
</section>
<section class="section">
<h2>Changes</h2>
<ul>
<li><strong>Translation</strong> moves to the voice keyboard beside the mic (mirrored with Undo); the former top-bar slot is now the Clipboard button</li>
</ul> </ul>
</section> </section>
</div> </div>