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-07beta 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 视图保持一致(绿色 + 行前缀 + 深色背景)
-
输入框列表交互优化 — 空列表项按
Enter或Backspace退出列表回到普通段落;换行改用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做一次性迁移;抽取useSyncActiveTabSideEffectshook 统一关闭活跃 Tab 后同步appMode/currentXxxId/workspace/ 未查看已完成标记的副作用,顺带修复GlobalShortcuts漏清除已完成标记的问题 -
启动 / 主题切换全屏闪烁 — 根因为
applyThemeToDOM非幂等 + useEffect 冗余触发,叠加 vibrancy +backdrop-blur-xl导致 Chromium 重建合成层。applyThemeToDOM改为幂等(计算目标 class 与当前<html>对比一致则直接 return),ThemeInitializer用useMemo计算影响 DOM 的签名作为 effect 依赖 -
苍穹暮色侧边栏对比度 —
--background从 11% 调整至 13%,提升与--content-area(8%)的明度差距,--card保持 11% 不变 -
飞书 / 微信 / 钉钉 Bridge 并发保护 — 所有 IM Bridge 在
handleUserMessage入口处增加isAgentSessionActive检查,Agent 仍在运行时直接拒绝新消息并返回错误卡片,避免覆写sessionBuffer导致正在运行任务的结果丢失 -
DingTalk Bridge 重连保留 chatBindings —
startBot()重连时改为复用现有DingTalkBridge实例(调用stop()+updateConfig()+start())而非 delete + new,避免BridgeCommandHandler中的chatBindings被清空导致/stop返回"当前没有绑定的会话" -
remarkMentions 并发正则污染 —
MENTION_PATTERN从模块级共享/g正则改为函数内局部变量,避免并发 remark pipeline 间lastIndex互相干扰导致 mention chip 间歇性丢失 -
settings 日志脱敏 —
settings-service.tsupdateSettings日志从JSON.stringify(全量设置)改为只记录变更的 key 名,防止 API key / session ID 等敏感数据泄漏到控制台 -
AskUserBanner 自动跳转定时器清理 — 单选题选完后跳转下一问题的
setTimeout在组件卸载 / 请求切换时未清理、150ms 内连续点击会排多个定时器导致越过应停留 tab,用useRef保存 timer id 并在点击前 / 卸载时 / 切换时 clear -
Agent 流式中 prompt_suggestion 显示 —
useGlobalAgentListeners跳过prompt_suggestion写入liveMessagesMapAtom,SDKMessageRenderer的groupMessages显式排除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在开发模式(__dirname为apps/electron/dist)解析到不存在的apps/default-skills,导致~/.proma-dev/下所有工作区都没有复制 skills。修正为../default-skills -
Windows 下 bun dev 启动崩溃 — 修复 Windows 平台开发模式启动环境变量构建问题
-
标签页持久化竞态 — 增加
restoredRef守卫防止自动保存在异步恢复完成前覆写已持久化状态;beforeunload阶段使用新增的同步 IPC 确保 tab 状态落盘;用运行时类型守卫替换as断言,处理 panelactiveTabId可能为 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-auto与max-h-[60vh]解决 Skill 列表过长无法滚动;line-clamp-3限制描述文本行数避免卡片高度不齐;移除多余ScrollArea -
带状态指示会话误掉入下方列表 —
working-atoms中indicatorMap.has(id)检查过于宽泛,completed 状态会话被误跳过导致不属于任何 working 组、掉进日期分组列表;改为仅跳过 running/blocked
依赖升级
- Claude Agent SDK 从
0.2.71升级至0.2.111(对应 Claude Code2.1.111),关键能力:- 新增
query.interrupt()API,支持软中断并在同一 Query 生命周期内续跑,Agent 流式中打断发送体验依赖此能力 - 延续长会话稳定性、UI 渲染性能、内存泄漏、流式错误处理等方向的大量累积修复
- 新增
下载
- macOS Apple Silicon —
Proma-0.9.6-arm64.dmg - macOS Intel —
Proma-0.9.6.dmg - Windows —
Proma-Setup-0.9.6.exe