feat(aiwork): add AiWork GUI and CLI/TUI support - #336
Open
x4vierli wants to merge 1 commit into
Open
Conversation
新增第 16 个工具支持:AiWork,GUI 与 CLI/TUI 都覆盖。本期是只读可视化 —— 状态完整进刘海,但授权 / 计划确认 / 作答这些交互动作仍需回到 AiWork 侧操作。 刘海里可以看到:会话标题、工作目录、来源徽章、实时运行状态、正在执行的工具, 以及回复正文与思考过程的流式增量。需要授权、确认计划或被反问时会亮起对应的 等待状态并显示请求内容,但面板不提供按钮和输入框。完成 / 失败 / 中断各有结果 文案(新增「回复失败」「回复已中断」两条,覆盖 7 种语言),完成与失败各有一次 提示音,中断静默。点会话卡片把 AiWork 窗口拉到前台,按工作目录匹配项目窗口。 启动或打开开关时会回填已经在跑的会话;空闲会话在最后一次活动后约 60 秒自动 离开面板。GUI 与 CLI 是两个独立开关,共用一个 AiWorkBot 像素风吉祥物。 iOS / Watch companion 能看到会话与形象(远程授权不适用)。 与现有 15 个工具不同,AiWork 不需要往配置里装 hook 或插件:CodeIsland 主动 读取 AiWork 自身暴露的运行时状态,装好即可识别。两个开关沿用现有 cli_enabled_* 语义,未显式关闭时默认为开;本机没有 AiWork 时探测空转退出。 顺带修一处既有缺陷(本次改动使其暴露):refreshClaudeUsageIfStale 的 usageScanInFlight 是每实例标志,构造多个 AppState 时会同时发起 N 次冷扫描, 在共享的 .utility 协作线程池上互相饿死。改为进程级去重 —— 该扫描读的是同一份 ~/.claude 历史,两次并发永远是重复劳动。测试套件因此从 2 个失败 / 13.4 秒 变成 0 失败 / 6.0 秒,并消除了包内最后一条 Swift 6 并发警告。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
x4vierli
force-pushed
the
feat/aiwork-gui-tui-task-status
branch
from
September 3, 2026 09:40
58f2469 to
16a838e
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
这个 PR 做什么
新增第 16 个工具支持:AiWork,GUI 与 CLI/TUI 都覆盖。
本期是只读可视化:AiWork 的会话状态完整进刘海,但授权 / 计划确认 / 作答这些交互动作本期不支持在刘海里完成,仍需回到 AiWork 侧操作。展示层与现有工具对齐,交互层不对齐。
支持了哪些功能
界面与设置:
aiwork.png,会话列表与来源徽章都能显示AIWORK/AIWORK CLI标签);远程授权不适用,因为本期不产生可操作的授权请求一个与其他工具不同的点
现有 15 个工具都要往它们自己的配置里装 hook 或插件,AiWork 不需要 —— CodeIsland 主动读取 AiWork 自身暴露的运行时状态,装好 AiWork 就能识别,用户侧零配置。
两个开关沿用现有
cli_enabled_*的语义:未显式关闭时默认为开。所以升级后本机若装有 AiWork(GUI 或 CLI),无需任何操作就会开始显示;本机没有 AiWork 时探测空转退出,不起计时器也不建连接。要完全关闭请在 Hooks 设置里分别关掉这两项。顺带修掉一个既有缺陷
接手时
swift test有 2 个失败(AppStateGitBranchTests,断言读到nil)。查下来是既有缺陷,与本功能无关,本 PR 一并修掉:refreshClaudeUsageIfStale()的usageScanInFlight是每实例标志。生产环境只有一个AppState,所以从未暴露;但测试进程里每个AppState()各起一次冷扫描去扫真实~/.claude(我这台机器 153 MB / 698 个.jsonl),把共享的 8 个.utility协作线程池线程全部打满,而 git 分支探测同样跑在.utility上,于是分不到线程、超过 2 秒预算读到nil。证据:
sample活进程显示 8 个线程 340/340 采样全部停在同一个扫描函数里;把CLAUDE_CONFIG_DIR指向空目录后两个失败同时消失;其中testBranchRefreshesOnStopAfterSwitch在干净 main 的 worktree 上同样失败。修法是一行语义修正:
usageScanInFlight改为进程级。这个扫描读的是同一份共享历史,两次并发永远是重复劳动,去重本就该是进程级的。生产行为不变,测试套件从2 failures / 13.4s变成0 failures / 6.0s。我没有去抬轮询预算 —— 那只是掩盖问题且仍然依赖负载。验证
构建:
swift build与swift build -c release均干净通过,全包 0 条编译警告。测试:
swift test裸跑(不需要任何环境变量)—— 973 tests, 3 skipped, 0 failures,6.0 秒,连跑三次一致。仓库用例数从 933 增至 973,新增 40 个用例,覆盖连接读写、状态映射、GUI/TUI 归属判定、空闲清扫判定、占位文案本地化等。一项未经编译验证,如实说明
iOS / Watch 端的改动我无法在本机编译验证 —— 本机 Xcode 26.6 没有装 iOS 平台 SDK(
iOS 26.5 is not installed),xcodegen也未安装。我做了力所能及的静态验证:AiWorkView.swift只import SwiftUI,零 AppKit /NS*用法,与已在 iOS target 正常编译的ClineView.swift同构project.pbxproj通过plutil -lint校验ClineView.swift的现有条目逐字段镜像:1 个PBXFileReference+ 4 个PBXBuildFile+ group 条目 + 4 个 target 的 Sources 阶段project.yml也同步加了(4 个 target),xcodegen generate可复现同样结果如果 CI 或你本地编译报错,我立刻跟进修。
兼容性
Package.swift零改动)usageScanInFlight改进程级、AgentStatus增加Equatable一致性、enqueueCompletion放宽可见性、SessionSnapshot新增一个字段与几个 source 别名、Hooks 页开关回调统一入口,以及刘海文字动画新增一个默认关闭的内部参数(只对 AiWork 打开,其余工具动画逐像素不变)