Skip to content

Pulse 32.0.0

Latest

Choose a tag to compare

@github-actions github-actions released this 18 Oct 06:07
af8943d

32.0.0 — Proof(证)

一次求证的版本:修掉会让灯卡住的问题,删掉靠猜的提示,并且第一次让 hook → 灯这条真实链路在 CI 里整条跑起来。
事件日志仍是 v8,升级不会清空日志。

灯不再卡住

  • Claude 子代理请求权限后,主界面紧跟的那条通知不再把阻塞抢成主代理的:你批准后灯会熄,不会再红几分钟。
  • 主代理的一步不再清掉子代理的阻塞;只有那个子代理自己、你的新提示、回合结束、停下或会话结束能答它。
  • 回合结束后后台子代理才提出的阻塞,答完回到「轮到你」,不再一直「运行中」。
  • OpenCode:两个并行的询问要各自答完才熄(一个工具的结束不再替它答);被中止的回合留下的询问在回合结束时
    忘掉,不再挡住之后的回答。
  • 同时在跑的几个工具各自到自己结束为止:短的先结束,不会让还在跑的构建变橙;「当前:…」说最近开始、还没结束的那个。
  • Pi 退出时丢掉排队中的事件、立刻发出结束,不再出现「结束之后又冒出一步」把会话救活;结束之前盖章的回合、
    提示、步骤都不会让已结束的会话复活。
  • 日志压缩与重放对「什么时候算答了」完全一致:压缩改为把日志在 SessionBook 里重放一遍,保留它说要保留的行,
    不再另写一份规则。最新的提示锚点保留说了话的那一行。

只说事实

  • 只有会报告「工具开始」的 Agent 会停滞(橙):Pi、OpenCode。Claude、Codex、Cursor、Copilot 不报工具开始,
    长命令和卡住分不开,它们的行从不变橙,只陈述事实。
  • 删掉 Codex「还没信任 hook」的提示:它是根据进程启动时间推测的。
  • 「装好以来什么也没听到」只在日志保留了每一行时才说;压缩过的日志证明不了沉默,就不说。
  • 删掉设置里的「能力」行:每个版本都是同一句话。只留真正有用的一句——不报告等待的 Agent 写「这个 Agent
    不报告等待」。复制报告同样只写这一句。
  • 菜单栏提示回到灯的那一句规则,不再点名等得最久的会话(和弹窗内容重复)。

证明真实链路(都不随 app 发布)

  • 录制的事件样本:每个已安装的 hook 事件至少一份(PulseBar/Tests/Fixtures/hooks/,共 95 份),catalog_check
    拦下没有样本的事件;每份样本都要变成 expected.json 写明的那一行。没有一手来源的 Cursor 字段标为「未验证」。
  • 端到端(scripts/e2e.sh,CI 与发布都跑):在临时 HOME 里用真实安装器装好 hook,把样本送进安装好的
    pulse-hook → 打包好的 PulseBar --hook,再按 ScanEngine 的方式重放:Claude 与 Pi 各自 变红 + 一条横幅 →
    回答后运行中、横幅撤回 → 结束后没有活的行;所有样本过一遍打包的 app。
  • 在 Node 里真的跑 JS(scripts/js_adapters_test.mjs):Pi 扩展和 OpenCode 插件(1.x、2.x)对着各自 API 的替身
    回放一轮工具、一次提问与回答、并行提问、子代理、退出,逐条比对发给 pulse-hook 的调用;CI 里比对 Python 与
    编译后代码渲染的模块,两者必须一字不差。
  • 真机冒烟脚本(scripts/smoke.sh):约 10 分钟,检查隔离属性、签名、已装的 hook(只读),再引导你触发一次
    真实的 Claude 权限请求和一次 Pi 提问、回答、点击落地,每一步对照 events.tsv 新增的行确认,最后输出一份中文报告。

更精简

  • 一个会话的事实只存一份(SessionFacts 不再复制 14 个字段),只留最后一步。
  • 时间线的「一步」只有一种写法,它的文字、色调和报告用词都放在它自己身上。
  • HooksSupport.Status 只说连接状态说不了的;各 Agent 装没装、失败在哪由 Connection 得出。
    缺了启动器的 Agent 显示为「需要更新」。
  • 意思相同的文案合并;OpenCode 插件的工具阶段并成一张表;测试改成表驱动(删掉与 SessionBookTests 重复的
    真值表),QA 截图从 29 张减到 27 张。
  • 行数:PulseKit 11.3k → 11.1k,测试 10.0k → 9.7k(新加的证明脚本与样本另计)。

已知限制

  • 仍没有在真机上验证过:端到端测试跑的是真的安装器、启动器和打包的 app,但 hook 事件是重建的样本,不是
    真实 Agent 发出来的。scripts/smoke.sh 是第一次真机验收的入口。
  • 弹窗的键盘焦点与无障碍树无法在 CI 里验证(SwiftUI 只在有辅助工具时才建无障碍树),已删掉这项检查。
  • Pi 退出那一刻已经在跑的那个子进程,仍可能和结束事件抢先后;下一次进程扫描会纠正。
  • Cursor 的部分字段、OpenCode 2.x 仍未经真实运行确认。

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

5b6af7dbc03697331516591bf53dcbba1b180202f9f7c20e41658cada8856b56  pulse-32.0.0-macos-PulseBar.dmg

In the download folder:

shasum -a 256 -c pulse-32.0.0-macos-PulseBar.dmg.sha256
gh attestation verify pulse-32.0.0-macos-PulseBar.dmg -R hxddh/Pulse

The second line checks the build provenance: this DMG was built by
this repository's Release workflow from af8943d.