Proma v0.9.40
对比基准:v0.9.39
本次版本聚焦在长会话流畅度和启动稳定性:跨 session 的并发流式不再相互拖累,编辑器/Tab/输入框在流式期间的卡顿被系统性削掉一轮;同时补强了 v0.9.39 暴露出来的启动卡死边界场景。
长会话流畅度优化
- AgentView 流式订阅按 sessionId 切片 — 流式状态、草稿和 HTML 三个 atom 改用
atomFamily按 sessionId 派生订阅;任意一个 session 的流式 token 或任意输入框按键不再让所有会话的AgentView整树重渲染,跨 session 的并发流式互不干扰 - 跨 turn 任务标题提升到顶层缓存 —
buildHistoricalTaskSubjects从每个AssistantTurnRenderer的useMemo上移到AgentMessages顶层,长会话流式期间不再 O(T × M) 全量扫描所有 turn 的TaskCreate结果,每条 token 到达时的雪崩重算被消除 - Tab 切换让出主线程 —
TabContent改用useDeferredValue(activeTabId),TabBar 立即响应高亮,右侧DiffTabContentmount 等昂贵渲染降级为非紧急任务;切 Tab 时不再被 Diff 编辑器的同步 Shiki tokenize 挡住 - Shiki 代码高亮装饰异步化 + 节流 — ProseMirror Shiki 插件
init钩子返回空 DecorationSet,首装通过setTimeout(0)异步触发;按键事务走 mapping 路径让旧装饰跟随光标位置,docChanged改用 120ms debounce 重算;选区移动不再触发重建 - 预览引用选区写入去重 — 在预览面板拖拽选区时,
handleSelectionCapture写入quotedSelectionMap前先比较 text/filePath,相同则保持原引用;与流式输出叠加时不再产生持续重渲染 - RichTextInput 行数检查走 rAF 节流 —
onUpdate改用requestAnimationFrame调度行数检查,连续按键合并为单帧执行;用isExpandedRef持有当前状态,仅在值真变化时才setState,组件卸载时取消未触发的 rAF - 悬浮置顶条 backdrop-blur 回退到 sm —
StickyUserMessage的模糊半径从backdrop-blur-md回退到sm,shadow 与 opacity 也回到 v0.9.39 之前的取值;流式期间 GPU 不再被大半径 backdrop-blur 反复重采样模糊源图层 - Skill 资源文件面板无限重渲染修复 —
SkillFilesPanel中refreshTree的useCallback不再依赖onFileCountChange,改用 ref 持有最新 callback;切到 Skill 详情"资源文件"标签页时不再因父组件 callback 引用变化触发 IPC + 磁盘读写循环
启动稳定性与兼容性
- 启动卡死边界场景兜底 — 集中处理"启动后窗口/托盘永不出现"故障的多个独立根因:
fs.watch主 watcher / 附加目录 watcher / chat-tools-watcher 全部加'error'监听并按需自愈重启(主 watcher 失败退避 5s,附加目录失败移除该 watcher),避免 iCloud 抖动、外接磁盘断开、目录被删等场景触发未捕获异常终止主进程 - whenReady 顶层 catch + 降级窗口 —
app.whenReady启动钩子用safeRun/safeAwait包裹,单点失败不再阻断后续步骤;顶层catch在意外异常时弹 dialog 提示常见排查方向并强制创建降级窗口,用户最坏情况下也能看到界面、日志和反馈入口 - SingletonLock 失败友好处理 — 旧版进程未退出导致 SingletonLock 失败时不再
process.exit(0)静默退出,改为留下console.warn排查线索(提示killall Proma)并调用app.quit(),让 second-instance 事件能接管显示窗口 - 默认 Skill 升级 cpSync 加护栏 —
safeReplaceSkillDir用 try/catch 隔离单 Skill 失败,rmSync能删 0444 只读文件;新增skillCopyFilter/defaultSkillCopyFilter过滤.git、node_modules、.DS_Store、dist等噪声目录,根治 EACCES 与 node_modules 文件爆炸;seedDefaultSkills同样应用该护栏,单 Skill 失败不连累其他 - 新会话默认权限模式回到完全自动 —
PROMA_DEFAULT_PERMISSION_MODE从auto改回bypassPermissions,避免第三方模型(DeepSeek / Kimi / MiniMax 等)无法响应 SDK 的 auto 内部安全分类调用,进而绕过canUseTool直接发出permission_denied、UI 看不到审批弹窗只显示"自动审批已拒绝此命令"的问题;已有 session 的持久化值不受影响,仍可通过PermissionModeSelector切换至 auto / plan
开发与文档
- 默认 Skills 版本契约写入文档 — 在 CLAUDE.md 的版本管理节增加默认 Skills 版本契约:修改
default-skills/<skill>/内容时必须同步递增SKILL.md的version字段(patch +1),否则老用户走 semver-gated 升级时拿不到新内容 - 版本更新 —
@proma/electron从0.9.39升级到0.9.40
使用提示
- 如果你之前在 v0.9.39 遇到过启动后窗口或托盘不出现的情况,本版升级后会带兜底护栏;若启动仍异常请把出现的 dialog 提示一并反馈
- 长会话与多会话并发流式的体感卡顿会有明显改善,特别是同时打开 Diff 预览、
SkillFilesPanel资源文件面板、或在预览中拖拽选区时 - 默认权限模式回到"完全自动";使用第三方模型也能正常走完整审批流程,需要更严格策略的用户可手动切到"自动审批"
下载
- macOS Apple Silicon —
Proma-0.9.40-arm64.dmg - macOS Intel —
Proma-0.9.40.dmg - Windows —
Proma-Setup-0.9.40.exe