github ErlichLiu/Proma v0.9.6
0.9.6

7 hours ago

Proma v0.9.6

新功能

  • Ctrl+Tab 标签快速切换器 — Chrome 风格的键盘切换体验:快速按放 Ctrl+Tab 切回上一个标签(MRU 顺序),长按 Ctrl 连按 Tab 弹出选择器循环选中、松开 Ctrl 确认,Ctrl+Shift+Tab 反向循环;窗口失焦自动确认当前选择。切换器面板包含 Header、快捷键标注与 Tips 提示,并同步显示 Agent/Chat 状态指示线(Agent 运行中 / Chat 流式 / 等待用户输入 / 已完成未查看)

  • 标签页状态持久化 — 标签页(tabs + activeTabId)在应用重启后自动恢复;运行时状态持续写入 settings.json,关闭窗口前通过新增的同步 IPC(settings:update-sync)兜底落盘,避免在 beforeunload 阶段被异步写入截断。兼容旧版 splitLayout 结构一次性迁移上次激活标签

  • Agent 侧边栏 Working 区 — Agent 模式侧边栏置顶区新增「Working」分组,按状态聚合所有活跃会话:Todo(等待用户决策,橙色)、Running(执行中,蓝色)、Done(已完成,绿色,关闭标签即移除)。Working 跨工作区展示,一眼看到所有后台运行中的 Agent;置顶(Pinned)与 Working 合并为双 Tab 区域,各自带 badge 计数

  • Agent 侧边栏 Working/置顶区可拖拽高度 — Working/置顶区瘦身并改造为可拖拽双区,支持用 1px splitter(hover 扩为 4px 热区)自由调整上下比例,避免覆盖下方"最近会话"列表;高度持久化到 localStorage,约束在 [80px, 侧栏高度×70%]

  • 标签页状态指示统一为线条 — Tab / 侧边栏 / 切换器的状态显示全面改为线条语言:侧边栏 Agent Tab 切换与 Working 子分组改用左侧 accent 竖线,Chat 列表项从呼吸圆点改为 emerald 竖线,TabBar 顶部 Tab 从圆点改为底部横线条,Ctrl+Tab 切换器也对齐该语言;窄 Tab(<72px)状态指示降级为图标右上角小徽章保持可见

  • 文件浏览器写入联动 — Agent 调用 Write/Edit/MultiEdit/NotebookEdit/Update 工具时,右侧文件浏览器自动展开父目录链、平滑滚动到目标文件行并做 0.8s 高亮脉冲;行左侧额外保留 60s 的小圆点长效标记(跟随行缩进定位),错过瞬间动画仍能看到 Agent 最近修改了哪些文件。多根场景(会话目录、附加目录、workspace files)下各实例按 rootPath 前缀自治响应,不影响用户已选中的文件

  • 文件预览支持编辑与快捷键关闭 — 预览窗口支持 Esc / Cmd+W / Ctrl+W 关闭;纯文本/代码类文件(ts/tsx/py/go/rs/yaml 等 20+ 种)可点击「编辑」进入 Monaco,Markdown 使用 Vditor WYSIWYG;Cmd/Ctrl+S 原子写入保存,未保存关窗弹出「保存/放弃/取消」对话框,fs.watch 监听外部修改做无脏自动重载 / 有脏弹询问。UI 采用 Typora 风格(暖白 / 深灰配色、毛玻璃工具栏、macOS hiddenInset 标题栏融合 traffic light、880×920 纵向阅读尺寸、PingFang SC + SF Pro / JetBrains Mono 字体)

  • 文件预览语言识别加强 — 代码高亮覆盖 20+ 种常见语言并对齐 Monaco 映射;新增 .gitignore / Dockerfile / Makefile / bun.lock / pnpm-lock.yaml / .editorconfig / .npmrc 等按完整文件名识别;highlight.js 主包缺失的语言(dockerfile/swift/kotlin/diff/fish 等)改为按需动态注册子包,失败降级为无高亮

  • Markdown 预览样式优化 — 引用块改用 accent 粗左边框 + 淡背景、去除 italic 以提升中文可读性;表格改为圆角容器 + 斑马纹;代码块 / 内联代码补边框;GFM 任务列表自定义方形勾选;补充 kbd / mark / del / strong 等内联元素样式;h4/h5/h6 用次级文字色区分层级

  • 用户消息气泡 Markdown 渲染 — 复用 MessageResponse 组件为用户消息启用完整 Markdown 渲染(GFM 表格、代码高亮、KaTeX 公式);新增 remarkMentions 插件在 AST 层面将 @file: / /skill: / #mcp: 转为 mention:// 链接节点渲染为彩色 chip,解决 Markdown 化后 mention 丢失的问题;新增 remarkPreserveBreaks 插件用 break 节点替代全局字符串替换,避免代码块内出现多余尾随空格;悬浮置顶条用 stripCodeBlocks 将 fenced code 显示为 [code] 占位符

  • 为支持的 Claude 模型自动启用 1M context — Opus 4.6/4.7 与 Sonnet 4 系列自动注入 context-1m-2025-08-07 beta header,突破 Agent SDK 默认 200K 上下文在 ~150K 触发压缩的限制,充分利用长上下文;Haiku 与非 Claude 模型保持 200K 行为不变

  • 通用设置新增「消息悬浮置顶条」开关 — Agent 对话区顶部的用户消息悬浮置顶条现在可在「设置 → 通用设置」中一键关闭,默认开启,持久化到 ~/.proma/settings.json;关闭状态下组件完全不渲染,同时跳过 scroll/ResizeObserver 监听与 DOM 查询,降低空转开销

  • /compact 体验优化与 ContextUsageBadge 重设计 — 点击手动压缩立即注入合成 /compact 用户气泡并乐观置 isCompacting,提供即时反馈,失败自动回滚;新增 compactInFlight 贯穿整个压缩 stream 抑制 compact_boundary 切换期间的指示器闪烁;CompactingIndicator 改为与 compact_boundary 分隔线同款横线 + pill 无缝过渡;ContextUsageBadge 重构为 36×36 圆环按钮 + Popover,圆环按占用比例渲染、hover 弹出 token 明细与手动压缩按钮,按模型家族推断 contextWindow 作为流式 fallback 避免进度环无分母

  • Agent 流式中打断发送 — 流式输出过程中发送新消息从"FIFO 追加"改为基于 SDK 0.2.111 query.interrupt() 的软中断:先中断当前 turn 再注入消息,收到 aborted_streaming / aborted_tools 结果时保留活跃 Query 让下一轮续跑;AssistantTurnRenderer 自检 turn 内 aborted 结果强制显示"已被用户中断"徽章

  • Agent 模式对瞬时网络错误自动重试 — 上游 API 偶发流式中断(terminated / ECONNRESET / socket hang up / EPIPE / ETIMEDOUT / ENOTFOUND / EAI_AGAIN / ECONNREFUSED / fetch failed / premature close 等)不再直接报错给用户;应用层新增 TRANSIENT_NETWORK_PATTERN 兜底匹配 stderr,SDK 标记为 unknown 但消息匹配网络错误的情形也映射为 network_error;最大自动重试从 3 提升至 8,单次延迟上限 8s → 10s,叠加 ±20% jitter 防惊群,最坏累计 ≈55s;共享正则抽到 error-patterns.ts 避免两份副本偏差

  • 开发 / 生产配置目录隔离 — 开发模式(bun run dev)自动使用 ~/.proma-dev/ 目录存储配置,打包发布版保持 ~/.proma/,避免开发调试污染正式版配置文件

  • JSON 索引原子写入 + 备份轮转 — 会话 / 工作区 / 对话三类 JSON 索引改用安全写入模式:新增 safe-file.ts 提供 writeJsonFileAtomic(temp+rename)与 readJsonFileSafe(main → .tmp → .bak 三级回退),每次写入前先落 .bak 备份,强杀 / 崩溃下显著降低数据丢失风险

  • Write 工具详情改为内容视图 — 展开 Write 工具调用详情时,由原来仅显示"已写入 N 行"改为展示实际写入内容,样式与 Edit 工具的 diff 视图保持一致(绿色 + 行前缀 + 深色背景)

  • 输入框列表交互优化 — 空列表项按 EnterBackspace 退出列表回到普通段落;换行改用 splitBlock 创建新段落修复换行后列表 inputRules 失效;htmlToMarkdown 块级元素末尾统一为单换行修复发送多余空行;复制时写入纯文本到剪贴板修复粘贴到外部应用出现大量空行;CSS 清除 p/ul/ol/li 默认 margin 保持视觉间距一致

  • nano-banana 批量生成参数 — MCP 工具新增 numberOfImages 参数(1-4,默认 1)为未来 API 支持预留;过滤 Flash 模型的 thought 推理图像不再混入生成结果

Bug 修复

  • 移除 Agent 模式分屏功能 — 分屏实际使用率低且带来多余的状态管理复杂度,完整移除 SplitContainer / SplitPanel / SplitModeToggle / MainContentPanel 与相关 atoms / 类型,保留浏览器风格多标签页作为唯一多视图范式;PersistedTabState 扁平化为 { tabs, activeTabId },对旧版 splitLayout 做一次性迁移;抽取 useSyncActiveTabSideEffects hook 统一关闭活跃 Tab 后同步 appMode / currentXxxId / workspace / 未查看已完成标记的副作用,顺带修复 GlobalShortcuts 漏清除已完成标记的问题

  • 启动 / 主题切换全屏闪烁 — 根因为 applyThemeToDOM 非幂等 + useEffect 冗余触发,叠加 vibrancy + backdrop-blur-xl 导致 Chromium 重建合成层。applyThemeToDOM 改为幂等(计算目标 class 与当前 <html> 对比一致则直接 return),ThemeInitializeruseMemo 计算影响 DOM 的签名作为 effect 依赖

  • 苍穹暮色侧边栏对比度--background 从 11% 调整至 13%,提升与 --content-area(8%)的明度差距,--card 保持 11% 不变

  • 飞书 / 微信 / 钉钉 Bridge 并发保护 — 所有 IM Bridge 在 handleUserMessage 入口处增加 isAgentSessionActive 检查,Agent 仍在运行时直接拒绝新消息并返回错误卡片,避免覆写 sessionBuffer 导致正在运行任务的结果丢失

  • DingTalk Bridge 重连保留 chatBindingsstartBot() 重连时改为复用现有 DingTalkBridge 实例(调用 stop() + updateConfig() + start())而非 delete + new,避免 BridgeCommandHandler 中的 chatBindings 被清空导致 /stop 返回"当前没有绑定的会话"

  • remarkMentions 并发正则污染MENTION_PATTERN 从模块级共享 /g 正则改为函数内局部变量,避免并发 remark pipeline 间 lastIndex 互相干扰导致 mention chip 间歇性丢失

  • settings 日志脱敏settings-service.ts updateSettings 日志从 JSON.stringify(全量设置) 改为只记录变更的 key 名,防止 API key / session ID 等敏感数据泄漏到控制台

  • AskUserBanner 自动跳转定时器清理 — 单选题选完后跳转下一问题的 setTimeout 在组件卸载 / 请求切换时未清理、150ms 内连续点击会排多个定时器导致越过应停留 tab,用 useRef 保存 timer id 并在点击前 / 卸载时 / 切换时 clear

  • Agent 流式中 prompt_suggestion 显示useGlobalAgentListeners 跳过 prompt_suggestion 写入 liveMessagesMapAtomSDKMessageRenderergroupMessages 显式排除 prompt_suggestion 入 turn,修复其被错误追加到最后一条助手消息的问题

  • fork 跨 session UUID 错误 — 会话经历 session-not-found 恢复后 sdkSessionId 会被替换,但旧消息 UUID 仍绑定在旧 SDK session 的 JSONL 中。Fork 旧消息时改从 Proma JSONL 查找消息实际所属的 session_id,用消息真实归属的 SDK session 调用 sdk.forkSession,修复 "Message not found in session" 错误

  • .bak 自毁恢复路径readJsonFileSafe 回退到 .bak 恢复主文件时,writeJsonFileAtomic 会先把(已损坏的)主文件拷到 .bak——覆盖了仅存的完好备份。新增 skipBackup 参数,.bak 恢复路径上禁用备份写入保留干净副本

  • 开发模式 default-skills 路径错误seedDefaultSkills()../../default-skills 在开发模式(__dirnameapps/electron/dist)解析到不存在的 apps/default-skills,导致 ~/.proma-dev/ 下所有工作区都没有复制 skills。修正为 ../default-skills

  • Windows 下 bun dev 启动崩溃 — 修复 Windows 平台开发模式启动环境变量构建问题

  • 标签页持久化竞态 — 增加 restoredRef 守卫防止自动保存在异步恢复完成前覆写已持久化状态;beforeunload 阶段使用新增的同步 IPC 确保 tab 状态落盘;用运行时类型守卫替换 as 断言,处理 panel activeTabId 可能为 null 的情况并过滤无效 panel,focusedPanelIndex 夹到合法范围

  • MainArea activeTabId 为空循环更新tabs 非空但 activeTabId 为空的异常分支原先渲染 WelcomeView,会触发 openTab 反复设置 tabs/activeTabId 导致状态循环。改为 useEffect 自动将 activeTabId 设为 tabs[0].id,该分支直接返回 null

  • 设置页若干 UI 问题 — 外观设置补充应用图标区块与主题设置的合理间距(space-y-6);飞书机器人设置页打开时主动同步最新 Bot 状态,解决启动时序导致的颜色一直显示黄色;Agent 配置高级设置展开箭头移至标题右侧使标题左对齐;Agent 配置内置工具列表补充「联网搜索」工具(web-search);模型 icon 匹配规则新增 seed(豆包),seedgemini 的具体规则排在前面不受影响;Tab 预览面板关闭延迟从 40ms 延长到 200ms 避免鼠标移动意外消失

  • 导入 Skill 弹窗滚动与对齐 — 给弹窗内容区添加 overflow-y-automax-h-[60vh] 解决 Skill 列表过长无法滚动;line-clamp-3 限制描述文本行数避免卡片高度不齐;移除多余 ScrollArea

  • 带状态指示会话误掉入下方列表working-atomsindicatorMap.has(id) 检查过于宽泛,completed 状态会话被误跳过导致不属于任何 working 组、掉进日期分组列表;改为仅跳过 running/blocked

依赖升级

  • Claude Agent SDK0.2.71 升级至 0.2.111(对应 Claude Code 2.1.111),关键能力:
    • 新增 query.interrupt() API,支持软中断并在同一 Query 生命周期内续跑,Agent 流式中打断发送体验依赖此能力
    • 延续长会话稳定性、UI 渲染性能、内存泄漏、流式错误处理等方向的大量累积修复

下载

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

Don't miss a new Proma release

NewReleases is sending notifications on new releases.