Skip to content

Pulse 27.0.0

Choose a tag to compare

@github-actions github-actions released this 30 Sep 09:59
1b06e75

27.0.0 — Craft(匠)

这一版把 Pulse 做成一个像 Mac 应用的 Mac 应用,同时把它读错的地方一一修好、把不再需要的东西删掉:
八个会让托盘说错话的问题各有一个钉住它的测试;再打开 Pulse 就是打开托盘,登录项交给 macOS,菜单栏的灯
清楚、跟着菜单栏着色;设置里能一键卸载 Pulse。它是一个大版本:hook 接收器不再接受协议词
(permission、turn、done… 作为事件名,或纯文本载荷)——只读每个 Agent 自己的厂商事件;事件日志的
kind 只认 v5 的十个词、不认别名;tool 列的 status 成为保留值;托盘上的「终端自动化」提议没有了,
改为设置里的一个开关。

这一版先以 GitHub 预发布发出,随后按维护者的决定直接转为正式版(Latest),没有等真机冒烟。

读对(修复)

  1. 一行只应用一次。 一次读取落地前又被要求读一次时,两次读到的同一批行不会被应用两遍(工具步骤
    不再重复、回合时钟不再被第二遍推后);落地时只应用游标之后的行,来自旧一代日志的读取什么都不应用。
  2. 忽略就是忽略。 在 Pulse 里忽略一个等待后,Claude 约 6 秒后对同一次提问补发的
    Notification permission_prompt 不再让它重新变红、再发横幅(同一种阻塞、离那次提问 20 秒内、
    忽略之后没有提示或工具行、话没说出新东西)。
  3. 压缩不丢标题。 日志压缩时,每个会话总留下它第一条不是阻塞的行、标题出自的那条提示与最新的
    一条提示——重放之后标题、开始时间与本回合时长都不变。
  4. 解析不了的 payload 一行都不写。 被截断(1 MiB 上限)或坏掉的 JSON 不再变成一个把原始 JSON
    当问题的幽灵等待。
  5. 上一回合的错误不留到下一回合。 新的提示(或回合结束后的工具行)清掉上一回合的错误。
  6. 状态行从不回答等待。 Copilot 的可恢复 errorOccurred、OpenCode 的 session.status
    忙碌 / 重试写成 tool 行、工具列为保留值 status:它让会话保持在跑,但不是一步、也不熄灭红灯。
  7. 先脱敏、再截断。 凭据从整段值里抹掉之后才截到行的长度——一个跨在截断处的 token 不会留下开头几位。
  8. 重写后的日志按位置认行。 以最后应用的那一行为锚:锚之后的都是新的,即便文本和之前的某行相同;
    压缩没留下锚时,才逐行对上下一个同文的已应用行。
  • 从 hook 到横幅的端到端测试:七个 Agent 各自的厂商载荷 → pulse-hook 写行 → 引擎按游标读入 →
    灯 → 欠的横幅 → 厂商的回答 → 灯熄、横幅撤回;Codex 与 Cursor 的「像授权的」事件从不让它们变红。

像 Mac 应用(新的)

  • 再打开一次就是打开托盘。 在访达或 Spotlight 里再打开 Pulse、或启动第二份副本:托盘打开并选中
    最久的等待,不造窗口;第二份副本只发一个不带内容的分布式通知就退出。
  • 登录项交给 macOS。 「登录时打开」是 SMAppService.mainApp,出现在系统设置 → 登录项;开关显示
    macOS 的回答(待批准时给「打开登录项」)。旧版本自己写的 LaunchAgent 启动时卸掉,并改为向 macOS
    注册,你的选择保留。设置卡多一个「登录时打开」复选框,默认不勾。
  • 菜单栏的灯清楚了。 按按钮自己的尺寸绘制(不再先画 16 再缩到 15 发虚);灰灯是 template、跟着
    菜单栏着色,红 / 绿 / 橙保留颜色;托盘开着时按钮保持按下;按下鼠标就打开;右键是「打开 Pulse ·
    设置… · 退出 Pulse」。
  • 隐藏的主菜单:⌘W 关设置、⌘C / ⌘A 作用于可选文字、⌘, 与 ⌘Q。
  • 整行都能点。 托盘行整行是一个按钮;Agent 名挪进悬停提示与 VoiceOver。
  • VoiceOver 只报新的等待,并把时间说全(「4 minutes」「4 分钟」),不念画出来的「4m」。
  • 跟随区域。 详情页的时刻用区域自己的格式(「3:04 PM」/「15:04」);带数量的话分单复数;英文用
    「Gray」;语言选择器照实写「简体中文」。
  • 横幅按会话成线程。 标题「Agent · 项目」、副标题是会话的任务;每个会话一个通知中心线程;只有
    macOS 说可以时才标为时间敏感。
  • 逐个 Agent 安装 / 移除 hook。 设置 → Hooks 每行有自己的「安装」或「移除」,只动那一个 Agent。
  • 终端自动化是设置 → 通用里的一个开关(默认关);行上不再有提议。
  • 卸载 Pulse。 设置底部「卸载 Pulse…」先确认、逐条说出要移除的:装着 Pulse hook 的 Agent(经安装器
    逐字节还原)、登录项、~/Library/Application Support/Pulse;确认后先移除全部 hook,一个都不剩才注销
    登录项、删文件夹、退出,并在访达里显示 Pulse.app 由你拖进废纸篓。有 hook 移除失败就停下,别的都不删。
    README 新增「卸载」一节。
  • 右键菜单写着按键。 托盘底部那行静态的按键说明删了;行的右键菜单每一项旁边写着同一件事的键
    (↩ 前往、→ 详情、⌘D 忽略、⌘M 静音)。

分发

  • 首次打开的说明改了。 macOS 15 起按住 Control 点「打开」不再能放行未公证的 App:DMG 里的说明、
    Release 说明与 README 先写「系统设置 → 隐私与安全性 →『仍要打开』」,终端里的
    xattr -dr com.apple.quarantine /Applications/Pulse.app 作为另一种方式。
  • 每个 Release 附 DMG 的 .sha256 文件,shasum -a 256 -c 即可校验。
  • 预发布闸门。 提交标题带 [release] [prerelease](scripts/release.sh X.Y.Z --commit --prerelease)
    时,CI 构建同一个 DMG、同一份说明,但在 GitHub 上发成 pre-release、不设为 Latest;维护者真机验证后在
    GitHub 上把它转为正式版。
  • 更新检查只读一个地址:GitHub 的 /releases/latest。列表 feed、「预览版也看预发布」的分支都删了,
    所以预发布对应用内检查不可见——这正是闸门要的。
  • 分发通道两态:没有公证的构建都是 preview,公证并 staple 成功才是 stable;CI 从来产不出的
    signed 一档删掉了。未公证的包永远不会自称 stable。

删掉的

  • 协议词输入:pulse-hook <agent> permission|question|turn|done|… 与纯文本载荷不再被接受,只有每个
    Agent 的适配器读它自己的厂商事件;事件日志的读取也不再认 stop、idle_prompt、agent-turn-complete
    这类别名。docs/samples/attention-bridge/ 与「手动上报」一节一并删除。
  • 托盘底部两行:「N 个较早的会话未显示」(连同 staleHidden 计数与它的单复数文案)和静态按键说明。
  • 没人加载的资源:pulse-app-icon-1024.png、pulse-idle / pulse-running / pulse-waiting(PNG、@2x、SVG)、
    openai 图标、所有 SVG 副本;Agent 图标只读 PNG(make_agent_icons --check 保证每个 Agent 都有),
    字母标的退路与 AgentSpec.monogram 删掉。App 图标 AppIcon.icns 移出资源包,只拷进 Contents/Resources。
  • 出厂 App 里的 QA 开关:--appearance= / --language= 挪进 PulseQA;package_check.py 在出厂
    二进制里发现它们就失败。
  • 两个截图脚本合成一个 scripts/qa_captures.sh(surfaces / status 两种模式);CI 只把截图上传为
    这次运行的产物,从不写进仓库或 Release。
  • script/build_and_run.sh(重复 package.sh、带一段失效的 os_log 遥测)与指向它的 .codex 环境。
  • 文档:每个 Agent 的事实只在 docs/vendor-formats.md(与 vendor-formats.json)里写一遍,其余文档
    链接过去;docs/architecture.md 缩成几段英文,数据流只在 AGENTS.md;attention-bridge.md 改为英文;
    17.0.0 及以前的 CHANGELOG 段落移到 docs/changelog-archive.md。

已知限制 / 注意

  • 这一版没有在真机上验证过。 代码只在 CI(macos-26)上编译和测试:再打开、登录项、菜单栏的灯、
    右键菜单、VoiceOver、横幅线程、卸载,都没有在一台真的 Mac 上和真的 Agent 一起跑过;维护者决定
    不等真机冒烟,直接作为正式版发布。
  • 仍是 ad-hoc 签名、未公证的 preview 包。 Developer ID 还没到位:公证、Sparkle 自动更新、时间敏感
    通知需要的 entitlement、跨更新稳定的隐私授权(每次更新 macOS 可能重新询问),都要等它。
  • 繁体中文系统显示简体。 只有一张中文表,语言选择器照实写「简体中文」。
  • 一个真叫 status 的厂商工具会被当成状态行读:它不算一步、也不熄灭红灯。
  • 从旧版本升级:旧日志里用别名写的行(只有外部脚本会这样写)不再被读;Pulse 自己写的行不受影响。

Gatekeeper

This build is ad-hoc / unnotarized (no Apple Developer ID in CI).
About stays preview — it is not Gatekeeper-ready and must not be
described as notarized stable. First open: drag Pulse to Applications and
open it once; when macOS blocks it, go to System Settings → Privacy &
Security
, scroll to Security and click Open Anyway. Or, in Terminal:
xattr -dr com.apple.quarantine /Applications/Pulse.app.
(macOS 15 removed the Control-click → Open shortcut.)

Download verification

dc4bd2caaf2b70b4e45f3cf274c3ef4604b6cb14c047971932a07fa7599f0bc6  pulse-27.0.0-macos-PulseBar.dmg