github ErlichLiu/Proma v0.9.40
0.9.40

6 hours ago

Proma v0.9.40

对比基准:v0.9.39

本次版本聚焦在长会话流畅度和启动稳定性:跨 session 的并发流式不再相互拖累,编辑器/Tab/输入框在流式期间的卡顿被系统性削掉一轮;同时补强了 v0.9.39 暴露出来的启动卡死边界场景。

长会话流畅度优化

  • AgentView 流式订阅按 sessionId 切片 — 流式状态、草稿和 HTML 三个 atom 改用 atomFamily 按 sessionId 派生订阅;任意一个 session 的流式 token 或任意输入框按键不再让所有会话的 AgentView 整树重渲染,跨 session 的并发流式互不干扰
  • 跨 turn 任务标题提升到顶层缓存buildHistoricalTaskSubjects 从每个 AssistantTurnRendereruseMemo 上移到 AgentMessages 顶层,长会话流式期间不再 O(T × M) 全量扫描所有 turn 的 TaskCreate 结果,每条 token 到达时的雪崩重算被消除
  • Tab 切换让出主线程TabContent 改用 useDeferredValue(activeTabId),TabBar 立即响应高亮,右侧 DiffTabContent mount 等昂贵渲染降级为非紧急任务;切 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 回退到 smStickyUserMessage 的模糊半径从 backdrop-blur-md 回退到 sm,shadow 与 opacity 也回到 v0.9.39 之前的取值;流式期间 GPU 不再被大半径 backdrop-blur 反复重采样模糊源图层
  • Skill 资源文件面板无限重渲染修复SkillFilesPanelrefreshTreeuseCallback 不再依赖 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 过滤 .gitnode_modules.DS_Storedist 等噪声目录,根治 EACCES 与 node_modules 文件爆炸;seedDefaultSkills 同样应用该护栏,单 Skill 失败不连累其他
  • 新会话默认权限模式回到完全自动PROMA_DEFAULT_PERMISSION_MODEauto 改回 bypassPermissions,避免第三方模型(DeepSeek / Kimi / MiniMax 等)无法响应 SDK 的 auto 内部安全分类调用,进而绕过 canUseTool 直接发出 permission_denied、UI 看不到审批弹窗只显示"自动审批已拒绝此命令"的问题;已有 session 的持久化值不受影响,仍可通过 PermissionModeSelector 切换至 auto / plan

开发与文档

  • 默认 Skills 版本契约写入文档 — 在 CLAUDE.md 的版本管理节增加默认 Skills 版本契约:修改 default-skills/<skill>/ 内容时必须同步递增 SKILL.mdversion 字段(patch +1),否则老用户走 semver-gated 升级时拿不到新内容
  • 版本更新@proma/electron0.9.39 升级到 0.9.40

使用提示

  • 如果你之前在 v0.9.39 遇到过启动后窗口或托盘不出现的情况,本版升级后会带兜底护栏;若启动仍异常请把出现的 dialog 提示一并反馈
  • 长会话与多会话并发流式的体感卡顿会有明显改善,特别是同时打开 Diff 预览、SkillFilesPanel 资源文件面板、或在预览中拖拽选区时
  • 默认权限模式回到"完全自动";使用第三方模型也能正常走完整审批流程,需要更严格策略的用户可手动切到"自动审批"

下载

  • macOS Apple SiliconProma-0.9.40-arm64.dmg
  • macOS IntelProma-0.9.40.dmg
  • WindowsProma-Setup-0.9.40.exe

Don't miss a new Proma release

NewReleases is sending notifications on new releases.