bo2themax/Siriously
GitHub: bo2themax/Siriously
该项目修复了在 macOS 27 上启用全新 Siri 后 Apple Intelligence 写作工具弹窗消失的问题,允许用户在不关闭 Siri 的情况下继续使用原生校对和改写等功能。
Stars: 0 | Forks: 0
# Siriously — 在启用全新 Siri 后,恢复 macOS 27 上的 Writing Tools
**你是否在开启全新 Siri 后发现 Apple Intelligence 的 Writing Tools 不见了?**
当你在 macOS 27 上启用全新的 Siri / Apple Intelligence 助手("NewSiri")时,**Writing Tools** 弹窗(Proofread、Rewrite、Summarize 以及语气工具)将会消失:菜单项不复存在,且 `Edit → Writing Tools` / 右键点击**只会直接打开 Siri**。**Siriously 可恢复经典的 Writing Tools 弹窗**,让你能够继续对选中的文本使用 Proofread 和 Rewrite —— **而无需禁用全新的 Siri**。
关键词:_macOS 26–27 上 Writing Tools 缺失 / 消失 / 不显示 / 灰色不可用,启用 Siri 后 Apple Intelligence Writing Tools 消失,如何恢复 Writing Tools,恢复 Proofread 和 Rewrite,NewSiri,macOS Tahoe。_
它作为一个基于工具的 macOS **服务(Services)**代理运行:在任意应用中选择文本 → **右键点击 → 服务 → Proofread / Rewrite / Siriously** → 真正的 Writing Tools UI 将在你的选区上运行,并将结果直接原地写回。
## 要求
Siriously 仅在**支持 Apple Intelligence 且已启用全新 Siri / Apple Intelligence 助手("NewSiri")**的 Mac 上有效:
- **支持并已设置 Apple Intelligence** — Apple 芯片、受支持的区域/语言,以及已下载的设备端模型。Writing Tools _本质上就是_ Apple Intelligence;若缺少它,`WritingToolsViewService.xpc` 背后的引擎将无法响应请求,Siriously 也无法产生任何结果。
- **已启用 NewSiri** — 这正是问题的关键所在:启用 NewSiri 会移除/劫持内置的 Writing Tools 入口,而 Siriously 能将弹窗重新带回。在_没有_ NewSiri 的 Mac 上,系统自带的 Writing Tools 依然有效,因此你不需要此工具。
- **macOS 27**(在 27.0,build 26A5368g,arm64 上构建并验证)— 它依赖于系统更新可能会更改的私有框架细节。
- **辅助功能权限(Accessibility permission)**(用于读取选中文本并将结果原地写回)。
如果设备上未提供/未启用 Apple Intelligence,Siriously 只会呈现一个空白/无功能的弹窗 —— 因为没有可供其交互的底层引擎。
## 为什么在全新 Siri 下 Writing Tools 会消失(macOS 27.0,build 26A5368g,arm64)
- 在启用 NewSiri 的情况下,Writing Tools 框架依然完整存在且功能正常:`/System/Library/PrivateFrameworks/WritingTools.framework`(`WTSession`)以及 `WritingToolsUI.framework`(`WTWritingToolsViewController`、`WTWritingToolsConfiguration`、`WTWritingToolsPanel`、进程外的 `WritingToolsViewService.xpc` 等)。
- `+[WTWritingToolsViewController isAvailable] == isEnabled == 1` 且 `isEnhancedSiriAvailable == 1` —— 即底层引擎仍然在处理请求;NewSiri 只是更改了**客户端入口点**:
- 公开的 `-[NSResponder showWritingTools:]` action 被**劫持 → 转而打开 Siri**。
- 由 `NSWritingToolsCoordinator` 提供的浮窗/菜单项被隐藏。
- 因此,我们直接驱动**私有**类 `WTWritingToolsViewController`,它仍然会与拥有相应权限的 `WritingToolsViewService.xpc` 通信并返回真实结果。
## 工作原理
1. **触发(Trigger)** — 一个 macOS _服务(Service)_(`NSApp.servicesProvider`),每个工具对应一个菜单项。
2. **捕获(Capture)** — 调用时,通过**辅助功能 API(Accessibility API)**(`AXContext`)读取宿主应用的聚焦元素、选中文本以及选区在屏幕上的矩形区域。
3. **呈现(Present)** — 将文本填入一个进程内的 `NSTextView`(作为 WT 的_客户端_,保持透明/离屏),并在一个 `NSPopover` 中呈现 `WTWritingToolsViewController`。该弹窗的锚点是一个**覆盖在宿主选区上**的透明悬浮窗口(弹窗的锚点视图与 WT 的客户端视图是独立的配置字段,因此当 WT 在我们的视图上操作时,弹窗会悬浮在宿主应用上方)。
4. **写回(Write back)** — 一旦用户接受结果(通过 `-[WTWritingToolsRemoteViewController replaceSelectionWithText:]` 进行挂钩拦截),立即恢复原始选区范围,并通过 AX(`AXUIElementSetAttributeValue`)设置宿主元素的选中文本,随后迅速重新激活宿主应用,以便用户继续输入。对于 AX 无法写入的应用(如 VSCode 等 Electron/Qt 应用 —— 没有聚焦的 AX 元素),则会弹出一个带有结果和**复制(Copy)**按钮的警告框。
已处理的可靠性细节:视图服务会被**预热**,且呈现过程**受限于预热完成**(不会出现空白弹窗);在写回前会**恢复原始的选区范围**(修复了“追加而非替换”的问题);弹窗使用 `.applicationDefined`(进程外的视图在首次点击时会导致 `.transient` 弹窗关闭);**`WTWritingToolsViewController` 被设为弹窗的 delegate**,因此在菜单中选择某个工具时(这会触发一个_临时的_ `closePopoverTransientlyToShowTool:` 关闭动作),视图控制器(VC)会**重新打开**弹窗并显示该工具,而不是直接销毁 —— 会话结束通过轮询来检测(如果弹窗保持关闭的时间超过了临时“关闭→重开”间隔的宽限期,即判定为结束)。
## 安装
```
./install.sh # build → /Applications, register Services
./install.sh --resident # also install a login LaunchAgent (keeps the WT service warm)
```
接着:
1. **系统设置 → 隐私与安全性 → 辅助功能** → 启用 _Siriously_(这是读取选区并原地写回结果所必需的)。
2. **系统设置 → 键盘 → 键盘快捷键 → 服务 → 文本** → 勾选你想要的 Siriously 项目。所有工具都作为独立项提供,因此只需挑选你实际使用的几个即可 —— 例如 **Proofread** 和 **Siriously**(完整菜单):
使用方法:选中文本 → **右键点击 → 服务 → Proofread / Rewrite / Siriously**,或者使用应用菜单中的**服务**子菜单:
使用方法:选中文本 → **右键点击 → 服务 → Proofread / Rewrite / Siriously**,或者使用应用菜单中的**服务**子菜单:
标签:Apple Intelligence, 快捷服务, 系统修复, 系统工具, 辅助功能