-
Notifications
You must be signed in to change notification settings - Fork 2
Changelog zh
LeonXu edited this page Apr 20, 2026
·
28 revisions
省心模式体验打磨。
-
Hard Allow 漏判引号里的 pipe —
_isDefinitelySafe按|;&切命令不懂 shell 引号,grep "A\|B\|C" file被切成破碎段、降级走 LLM。新增 shell-aware 预处理:遇到$(...)/ 反引号直接 bail-out;否则先剥"..."/'...'再 split。常见带 regex alternation 的 grep 重回第 2 层瞬时放过,不弹通知、不等 LLM。 -
Auto-allow 后面板残影 1–2 秒 — 省心模式下 LLM 出
allow后,_autoAllowRequest写响应文件 + 删请求文件,但原生 Beacon 面板要等BeaconService下一次 scan 周期(~2s)才收。新 publicBeaconService.dismissById(reqId):同步清 active id + 推进队列 + 发 native dismiss。Lark 先响应路径同步调用。 - 展开态 Beacon 面板挡住背后内容 — 点面板空白区域之前不响应;现在点非按钮区域就收缩回小圆点,方便看被遮住的代码;窗口 title 变化时自动重新展开。"Open in Memora" 保留在按钮上。
Risk Engine + Channel 抽象 + 两种操作模式。Memora 从"被动通知层"演进为"有判断力的代理层"。
-
Channel 抽象 —
ChannelRegistry把每个请求 fan-out 到所有启用 channel(本地 Beacon / 飞书 Lark),first-response-wins,其他自动 dismiss。 -
Risk Engine 三层决策 — Hard Deny(
rm -rf、凭据路径、git push --force...) / Hard Allow(项目内编辑、只读命令、构建测试、日常 git) / 灰色地带 → LLM advisor(DeepSeek / Claude / OpenAI),静态 + raw 两层 fallback。 - 新 Approval UI — 语义动词、AI 建议、关键参数高亮,替代 raw shell 显示。
-
两种操作模式 — 正常(默认):deny/hard-allow 之外都弹通知,LLM verdict 作为参考。省心(手动开):LLM 判
level != high && rec != deny全部 auto-approve。 -
自动刷新 — FSEvents 监听
~/.memora/raw/+ 60s 兜底轮询。sessions 自动更新无需点刷新。
- 项目误匹配(case-insensitive + longest-prefix)。
- Accessibility 权限被 adhoc 签名撤销(CLAUDE.md 禁止
flutter build + cp,必须走./build.sh)。 - Hook 协议:
toolInput缺失时从requestDetail回退;路径正则修复空格。 - Deny-list 收紧:基于 13005 条真实命令评估,FP -86%(
docs/risk-evaluation-report.md)。
完整细节见 release v0.4.0 和仓库内 CHANGELOG.md。
-
Hook adhoc 签名 → Developer ID(
build.sh):v0.3.0 发出去的memora-hook是 cargo 默认的 ad-hoc 签名。macOS 14+ Gatekeeper 在执行时会直接 SIGKILL ad-hoc 签名的 CLI 二进制(exit 137),导致所有 PreToolUse / PostToolUse hook 在用户机器上静默失败——Memora 捕获不到任何 hook 事件。v0.3.1 在include_bytes!把 hook 字节冻结进 .app 之前用 Developer ID Application 重签。Hook 的 CDHash 经 Apple 公证传播到 .app 公证记录里,用户首次跑 hook 时 Gatekeeper 在线查 CDHash 命中通过。已经在跑 v0.3.0 的用户必须升级。
-
Settings 中的 Hook 版本检查:Settings → Hooks 显示已安装的
memora-hook版本和期望版本,不一致时显示琥珀色警告 banner + 重装说明。memora-hook新增--versionflag。 - Beacon 通知声音可配置:Settings → General 可选 14 种系统声音(或无声),每个选项有预览按钮。
- 设置界面重构:760×560 双栏布局,macOS 风格左侧边栏(General / LLM / Personas / Hooks / About),替代原来的单栏滚动。
-
Beacon 展开面板文字残留:
updateState多次调用累积了过期的NSTextField子视图。现在用dynamicContainer模式,每次 transition 时清空所有动态子视图。 - Beacon 点击意图:之前点击展开面板任何位置都会跳到主程序。现在只有明确的 "Open ↗" hit rect 会触发跳转。
-
显示器热插拔后下拉框过期:Swift 通过
beacon:displaysChanged主动通知 Dart,加上PopupMenuButton.onOpened打开时再 fetch 一次。 -
Beacon sentinel 存活检查:PreToolUse 不再依赖过期的 sentinel PID(加
kill(0)校验),避免匹配的 Beacon 进程崩溃后还在放行请求。 -
Hook 协议——空 stdout ≠ allow:hook 始终显式写
permissionDecisionJSON,不依赖 Claude Code 的隐式默认。
- 新增 Rust API
hook_version_status(),通过 flutter_rust_bridge 暴露为check_hook_version()。 -
build.sh --no-bumpflag 用于精确版本号的 release build。 -
NSScreen.didChangeScreenParametersNotification触发 Swift→Dart method channel callback,让 Flutter 不用轮询就能刷新显示器列表。
-
基于文件的授权通信:Hook 轮询
~/.memora/beacon-responses/<toolUseId>.json最多 30 秒,超时后回退到终端确认。完全替代脆弱的按键模拟——跨 macOS Space、跨多窗口终端、任何焦点状态都可靠。 -
AXDocument 项目检测:直接读
kAXDocumentAttribute(OSC 7 cwd),不依赖窗口标题。Ghostty / Terminal / iTerm2 / Warp 开箱可用。 - 首选显示器设置:可将 Beacon(项目信息 + 通知)固定到指定显示器。对多屏用户尤其关键(如竖屏副屏上 Beacon 看不到时通知会被错过)。
-
per-request resolved 追踪:PostToolUse 写
toolUseId(不是时间戳)→ 通知队列也能精确匹配 dismiss。 - 通知队列:多个 PreToolUse 请求依次显示,不会丢失。
- 快速切换项目时 UI 不更新(
transitionTo在 state 未变时早返回,导致旧数据残留)。 - 通知面板在外接屏(无 notch)上按钮被裁切(高度算式没用统一的 topArea)。
- Hook 超时后通知卡住——hook 超时时主动删除请求文件,让 Dart 自动 dismiss。
- 响应文件孤儿堆积——Dart 启动时清理
~/.memora/beacon-responses/中超过 30 秒的旧文件。 -
flutter build macos产生 ad-hoc 签名 → 必须用build.sh才能拿到正确的 Developer ID 签名(否则辅助功能权限会被撤销)。
- 删除所有按键模拟代码(
sendKeystrokeToTerminal、findAndRaiseTerminalWindow、raiseWindowContaining、sendKeyCodeToPid、keystrokeForAction)—— ~100 行脆弱的 AX/CGEvent 代码被文件通信完全替代。
- 菜单栏上方的浮动面板,像素螃蟹吉祥物
- 授权双通道:Beacon 和终端同时显示 Allow/Deny
- 按键转发
CGEvent.postToPid()— 不切换焦点 - 可配置的权限规则(按来源+工具)
- 凹弧形状 — 面板从屏幕边缘"生长"
- 上下文感知状态机(收缩/展开/通知)
- 点击展开态 → 在 Memora 中打开项目
- Continue V2:跨工具工作区创建——git clone + MEMORA_CONTEXT.md,包含完整对话历史、git log 和项目文件
- Drift Awareness:Blackboard 中的计划与实际工作对比面板,带用户裁决按钮
- Context-Linked Commits:Hook 检测 AI session 期间的 commit 并关联到对话
- 新手引导:6 步交互式引导,带聚光灯覆盖层
- 国际化:英文 + 中文语言支持
- 自动 Git 保护:每次同步时自动提交 ~/.memora/ 数据
- 设置:Hook 重装按钮
- Blackboard 视图切换:Insights | vs Plan
- 前进/后退 commit 导航按钮
- 搜索:关键词高亮、摘要片段、结果计数
- Session 时间线:右键 commit 可 Recall/Branch
- Branch 对话框:Clone 模式添加浏览按钮
- Drift 读取策略文件全文;Continue 上下文扩展到 50 commits + 10 sessions
- 响应式 Blackboard 卡片,fullSizeContentView 标题栏
- 通知自动消失竞态条件
- 启动时清理残留请求文件
- AXObserver 即时窗口切换检测
- commit-link 处理移到 git sync 之后(防止关联丢失)
- Drift 裁决取消正确持久化到 DB
- 分支过滤器显示空状态而非静默回退
- 从 Git 保护中排除 *.db(之前导致磁盘膨胀)
- flutter analyze 0 issues, flutter test 52/52 pass
- 双轨时间线(对话 + Git commit)
- Blackboard(AI 驱动的项目分析)
- History Branching(Worktree 和 Clone 模式)
- 消息级 Continue(导出为 Markdown)
- 六层知识模型(L1-L6)
- 多提供商 LLM 支持(12+ 提供商)
- 跨对话和 commit 的全文搜索
- 代码签名 + DMG 打包
- 首次发布
- Flutter + Rust 架构
- Hook 驱动的对话捕获
- Claude Code、Codex、OpenCode、Cursor 支持