Proma v0.13.4
对比基准:v0.13.0
这一版以稳定性修复为主线,同步带来界面风格与定时任务两项体验提升。稳定性方面解决了生产环境中并发 Agent 会话导致的同步写风暴(主进程 UI 阶段性冻结)、适配了 v0.13.0 升级 SDK 0.3.185 后每会话 2 秒的 drain timeout、修复了长任务网络断连后上下文丢失从零重做的严重缺陷。功能侧新增「经典 / 现代」界面风格一键切换,以及定时任务 once 一次性调度与 maxRuns 运行次数上限——让"未来某时间点跑一次 / 跑有限几次就停"的延时任务也能纳入 Proma 自动化体系。
新功能
- 经典 / 现代界面风格切换 — 外观设置新增「界面风格」分段控制器,提供「经典」与「现代」两档选择(默认「现代」)。经典风完整保留旧版视觉:
rounded-2xl+shadow-xl侧栏、bg-muted按钮底色、--radius: 0.625rem全局圆角基准;现代风重新校准全局圆角为--radius: 0.375rem(6px),侧栏去除圆角与投影改为纯色--sidebar-surface,TabBar、输入框等区域引入独立分区底色 token(--tabbar-surface/--input-surface/--tab-surface),折叠按钮改用border+bg-primary/5的轻量 hover 态,整体质感更扁平统一。设置项通过interfaceVariantAtom持久化到 localStorage 与主进程,跨窗口实时同步。(#915) - 定时任务 once 一次性调度 + maxRuns 运行次数上限 — 为定时任务补充两个正交能力:
once调度类型通过scheduledAt绝对时间戳在指定时刻只跑一次,computeNextRunAt直接返回该时间戳不做前进推算,跑完自动停用(重启后过期任务补跑一次);maxRuns正交于所有调度类型,按实际执行次数计(成功 + 失败,不含 skipped),达到上限自动停用;completedAt标记自动完成态,重新启用时重置计数器相当于再跑一轮配额。UI 新增频率下拉「仅运行一次」+ datetime 选择器、运行次数上限输入、「已完成」分组与状态展示。同步修订 SKILL.md 与工具描述层,纠正原先一刀切排除一次性任务的矛盾。(#914)
Bug 修复
- 并发会话同步写风暴修复 — 生产构建中多个 Agent 并发时(委派或手动),
onSessionId回调每条 SDK 消息都触发(SDK v2 几乎每条消息带session_id),但守卫误用「初始快照后永不更新」的existingSdkSessionId作比较——回调里实际更新的是另一个变量capturedSdkSessionId。新会话的existingSdkSessionId为undefined,导致守卫恒为真,每条消息都全量readIndex+ 原子写 + 备份会话索引,再叠加一次读回验证。历史会话越多索引越大、并发越多,同步 fsync 风暴越严重,wedge 主进程事件循环;渲染进程因等待同步 IPC 一并冻结(彩虹条、悬浮预览延迟)。dev 环境索引近乎空故无法复现,仅生产暴露。修复后仅在session_id真正变化时持久化一次,并删除不必要的调试读回。顺带修复file:resolve-path对目录路径调用registerPromaFilePath抛「不是文件」未捕获异常的问题。(#910) - SDK 0.3.185 iterator 终止语义适配 — v0.13.0 升级 SDK 后每个会话都触发 orchestrator 的「drain timeout: SDK iterator 在 result 后 2000ms 内未关闭,强制退出」,白白浪费 2 秒。根因:SDK 0.3.185 把会话终止逻辑全部挪进
Query.cleanup(),而cleanup()只在iterator.return()被调用时触发(Transport.close 注释明确 "eliminating need for endInput",旧的 stdin-EOF 自然结束路径已废弃)。adapter 收到 result 后只调channel.close()、不再有人调.return(),输出流不会 yield done,orchestrator 的 while 循环挂在next()上,只能靠 2s drain timeout 兜底调queryIterator.return()——安全网退化成了主路径。修复:关闭 SDKpromptSuggestions(它在每轮 result 之后才到达,是"收到 result 后仍需等尾部消息"的根源),adapter 收到非 keep-open 的 terminal result 后在 yield 该消息后主动 break for-await 循环触发iterator.return()→cleanup()。drain timeout 退化为真正永不触发的安全网。(#913) - 长任务断连后上下文保留 — 长任务运行中网络断连后,编排层终止分支用
shouldClearSession = !apiError || statusCode >= 500判断是否清除sdkSessionId。普通断连从 stderr 解析不出 HTTP 状态码(apiError = null),于是!apiError命中,把指向 SDK 磁盘完整历史 JSONL 的 resume 指针清空——但 SDK 的 JSONL 仍在磁盘上本可 resume。指针丢失后下一轮退化为仅 ~50K 的buildContextPrompt冷启动,模型从零重新执行;"Interrupt + Continue" 也无法恢复,只能新建会话手动救回。修复:终止分支不再清除sdkSessionId(网络断连 / 5xx / 未知错误都不代表会话失效),扩展TRANSIENT_NETWORK_PATTERN覆盖更多断连错误模式(ECONNABORTED / connection closed / AbortError / timed out 等),冷启动兜底升级为强指令要求模型先读取完整 JSONL 历史。同时将sdkSessionId的主动清除收敛为仅 thinking-signature 跨模型不兼容这一处——此前 session-not-found 等场景也会误清。(#903) - 推荐消息保留草稿 — 点击 Agent 推荐条发送建议后,
setInputContent('')会无条件清空用户正在编辑的草稿。修复后仅在无overrideText时清空,与handleSend内部overrideText ?? inputContent的取值语义保持一致。(#904) - 有序列表 Shift+Enter 续项修复 — Agent 输入框有序列表中 Shift+Enter 无法正确续项,修复后续项行为恢复正常。(#908)
- 附件 chip 支持点击预览 — 已发送消息中的附件 chip 支持点击打开预览。(#906)
- 轻量主题下代码选区对比度优化 (#911);预览面板切换时保留 AskUserQuestion 草稿 (#912);移除 auto preview toggle (#909)
下载
- macOS Apple Silicon —
Proma-0.13.4-arm64.dmg - macOS Intel —
Proma-0.13.4.dmg - Windows —
Proma-Setup-0.13.4.exe