Skip to content

Changelog zh

LeonXu edited this page Aug 13, 2026 · 28 revisions

更新日志

[1.2.1] — 2026-08-13

让「审批网关」这个承诺经得起查:网关会不会悄悄失效、命令看不看得全、事后查不查得清。

  • 🔒 网关不再会「悄悄失效」:hook 挂在配置里但已经拦不住了(二进制被删、别的工具重写了 settings.json、Codex 总开关被关掉),界面照样一切正常,而每条命令都在无人审批地跑过去。现在启动时与每轮同步(60 秒)各体检一次,坏了在主界面顶部挂播报条。判据也从「配置里出现过 memora-hook 这个词」收紧到「证明得了它会拦截」—— memora-hook --version 也满足旧那个形状,却什么都不审批。
  • 🔒 区分「没装过」与「装过又坏了」:从没装过的工具不再被误报成故障;而升级时就已经坏掉的网关——最该收到警告的那种——不再被永久静音。用 memora-hook uninstall 主动卸载会留凭据,播报条随之消失。
  • 👁 命令不再被掐掉尾巴:Beacon 与审批中心过去都截断末尾,而尾巴恰恰是追加破坏性后缀最常见的位置(… && rm -rf ~/)。实测本机近三万条真实命令:中位数约 300 字符、65% 超出可见区。现在改成省略中间、头尾都留,并写明「已省略 N 字符」;审批中心显示完整命令,可滚动可选中。
  • 👁 删掉 Allow All 按钮:hook 协议没有「持久授权」这回事,那个按钮到边界会塌成普通「允许」、不产生任何规则——却让人以为授权了「以后都这样」。真正的持久授权是 Allow Forever,它走 Memora 自己的指令授权记忆(你在 Agent 页确认后才写成规则);规则留在 Memora 而不写进 Claude Code 的权限表,所以每次自动放行仍然有记录、可审计、可撤销。
  • 📋 审批历史三分之二的记录看不到命令:命令的可读形式存在一个字段里,历史却只读了另一个,抽不到就显示成 {}——你知道自己批过,却不知道批的是哪条。已修,实测 66% → 0%。审计单条命令上限也从 500 提到 2000 字符,完整保留率 66% → 96%。
  • 🐛 回执文件的路径不再用宿主给的 ID 拼接(含 ../ 的 ID 曾能把回执写到 ~/.memora/ 之外);「同一条请求只许一个决定」的闸改为跨进程跨重启有效,App 重启后不会再把已拍板的请求重新弹出、也不会用第二个决定覆盖第一个;三个决定入口(Beacon / 飞书 / 审批中心)共用同一道闸,且写决定前会确认请求还挂着。
  • 🐛 Codex 侧超时后收到迟到的「允许」不再落进超时拒绝;安装卸载改为原子写并保留原权限与软链接;Continue 从历史检查点开分支不再混入检查点之后的消息与提交;monorepo 子目录项目能看到自己的 commit 与提交数。

[1.2.0] — 2026-08-11

审批从「问不问你」升级成「你在不在」;同步耗时降到原来的四分之一。

  • 🆕 在场感知审批(双活通道):需要你拍板的请求先在 Beacon 弹出,本地在宽限期(默认 45 秒)内没人理才镜像到飞书。你在电脑前批掉的请求根本不会发到手机上——不刷屏也省额度。发卡后 Beacon 与飞书同时有效,先点哪个算哪个。宽限期可在「设置 → 通知渠道 → 飞书」里调(不等 / 15 秒 / 45 秒 / 2 分钟)。
  • 🆕 事后补标误判:审批中心 →「历史」→ 点任一条,详情底部可标「不该问我」/「早该拦住」;标记进入 Agent 页等你确认 pattern,确认后才写成规则。
  • ⚠️ 行为变更:命中 deny-list 的命令不再自动拒绝,改为弹给你决定(默认倾向拒绝)。最该由人判断的一类不该是唯一不给人看的一类。等待超时后 Claude Code 交还终端二次确认、Codex 直接拒绝,都不会静默放过。
  • 同步耗时 3.4–4.5 秒 → 0.9 秒:commit 关联不再每轮重读整个事件日志(2 秒 → 1 毫秒);一批 transcript 因水位记错对象而每轮重复解析(163 MB → 0);事件日志改为按天分片,快照不再为几十 KB 新增重写整个文件。
  • 🐛 Token 统计虚高:会话压缩时被重放的消息其用量会重复累加,实测某会话真实 22.1M 被记成 34.7M(+57%)。
  • 🐛 一批审批时序问题:回执双写覆盖、引用旧飞书卡片的决定被套用到不相干请求、已执行完的命令过一会儿又弹出来、飞书通道关掉再打开后决定被丢弃。
  • 🔒 URL 里的账号密码不再外泄https://user:password@host 此前未被脱敏,会进入发给 LLM 供应商的请求以及本地反馈/规则文件。
  • 🌍 项目分组、信任脚本、Agent 页等约 150 处文案补齐英文。

[1.1.5] — 2026-07-21

搜索与审批体验增强,并完成两轮安全、凭据和数据完整性加固。

  • 🆕 审批历史可查看完整命令:点任一条弹详情——完整命令 / 参数(JSON 美化、可滚动可选中)、元数据、一键复制。
  • 🆕 审批历史标注发起 agent(Claude Code / Codex),判别取自事件流的 source 字段而非 tool_name。
  • 🆕 搜索结果排序:按相关性 / 最新 / 最旧。
  • 🔒 LLM API Key 改存 macOS Keychain,不再写入明文偏好设置;已有明文字段自动迁移。
  • 🔒 Hard Allow 收紧敏感读取:读真实 .env、SSH / 云凭据、私钥、完整环境变量或 Keychain 密码不再无提示放行;.env.example 等模板仍可读。
  • 🐛 SQLite 错误不再伪装成空数据;compact 归档不再重复采集;会话 id 角标点击复制修复。

[1.1.4] — 2026-06-22

v1.1.3 数据保护瘦身的收尾与加固。

  • 🐛 数据保护快照更瘦.gitignore 进一步排除可再生的开发样本 / 评估数据(tool-use-samples / risk-annotated-bash / deepseek-eval-results)与 beacon 运行态缓存;存量仓库下次同步自动收敛。核心数据(事件、会话摘要、反馈、规则)保护不变。
  • 🐛 时钟回拨健壮性:系统时钟回拨时自动保存不再被误判阻断。
  • 🛠 重建/瘦身脚本加固(运行中检测、Ctrl-C 回滚、备份防碰撞);修复 x86_64 打包偶发 pub.dev socket error。

[1.1.3] — 2026-06-22

数据保护仓库瘦身:~/.memora/.git 单台从 10GB+ 降到 12MB。

  • 🐛 ~/.memora/.git 无限膨胀根治:自管 git 快照仓库原先每分钟全量提交、永不 gc、且只排除数据库,导致原始对话副本(约 2GB)、事件流、各类日志被反复快照,.git 撑到 10GB+(单日约 +400MB)。
    • 提交频率每分钟 → 每小时;每次提交后自动 git gc
    • .gitignore 排除 raw/、所有 *.log、备份目录;存量仓库升级后下次同步自动收敛。
    • 内置一次性瘦身脚本;核心数据(事件、会话摘要、规则、反馈)保护不变,工作区数据库不受影响。

📦 提供 Apple Silicon (aarch64) 与 Intel (x86_64) 两个架构包。


[1.1.2] — 2026-06-14

飞书 API 用量优化 + 自动更新安全 / 健壮性加固。

  • 🔒 飞书托管 API 用量大幅降低:审批轮询改为按卡龄退避 + 卡片自动清理,避免长时间挂起的卡片持续消耗飞书 API 额度。
  • 🔒 自动更新加固:安装前校验官方发布身份 + 防版本回放降级;下载加超时与大小上限;安装失败可见、可恢复。
  • 🐛 自动更新在「当前架构无匹配安装包 / 下载卡住 / 安装中断」等情况下的处理与提示。

[1.1.1] — 2026-06-13

v1.1.0 设计大版本后的修复与打磨。

  • 主题模式手动配置:设置 → 通用 → 主题,可在「跟随系统 / 浅色 / 深色」间选择,自动记住。
  • 🗂️ 临时会话归一:一次性 review / worktree 的临时对话不再堆积成大量空壳项目,统一收进「临时会话」,项目列表更清晰;同时修复合并建议偶发的「路径重叠」误报。
  • 🔒 自动更新加固:安装前校验官方发布身份(签名 + 公证)。
  • 🐛 合并路由修复:合并子项目后「续接 / 分支 / 打开 commit」用对仓库;含路径转义。

[1.1.0] — 2026-06-12

全新设计语言「黑曜石中的琥珀光」+ Light 模式。从 AI 随手定的紫色样式重做为「档案琥珀 × 黑曜石」时光机界面,首页重构为「稳定流」时间轴,新增跟随 macOS 系统外观的 light / dark 双模式。

  • 🎨 新设计语言:主色档案琥珀 #D6A24A(被封存的时间 = 唯一的「光」)+ 黑曜石分层中性 + 暖白纸感文字;SF Pro + SF Mono;发丝线分层 + 琥珀辉光(克制阴影)。建立语义 token 体系。
  • 🌓 Light / Dark 双模式:新增「暖纸」light 模式(暖米底 + 暖墨字 + 加深琥珀墨),自动跟随系统外观切换。
  • 🗂️ 信息架构重构:审批中心提到一级导航(原埋设置 4 层深);sidebar 分「全局 / 项目」。
  • 📜 稳定流时间轴(首页重构):会话按开始时间锚定、按天分组(永不重排,靠位置找回);记录中 / 时长 / 并行标;commit 按归属嵌套进对话(Context-Linked);详情去左右分屏;悬浮「回到顶部」。
  • 🧠 Blackboard 瘦头:「项目此刻」瘦成可折叠条,默认只展示「未落地想法」。

[1.0.2] — 2026-06-11

Dashboard 模型分布跟随全局指标 + Token 口径统一 + 分享卡片加入模型分布;修复 Cursor 消息重复数据 bug(与 v1.0.1 的 Codex 同因,影响 Cursor 用户)。

  • 🔥 Cursor 消息重复修复:Cursor 此前用随机 UUID 当 message id,源更新(lastUpdatedAt)时重新入库导致消息反复累积。改确定性 cursor-<composer>-<bubble_id>,升级自动清理 + 全量重建。
  • 🆕 模型分布跟随上方指标切换器(对话/消息/Token),分享卡片也加入该板块。
  • 🆕 模型分布 Token 统一为 billed 按模型摊分(与核心数字/工具分布一致),并标注「不含缓存 X」实际产出,能看出哪些模型缓存重读占比高。

[1.0.1] — 2026-06-11

修复 Codex 消息重复的严重数据 bug(实测约 5x 虚高)——所有 Codex 用户的会话/消息/Token 统计都受影响,升级时自动清理回填。

  • 🔥 Codex 此前用随机 UUID 当 message id + 增量入库,active session 每增长就重新入库导致消息反复累积(28507 vs 真实 4862)。改确定性 codex-<session>-<seq>,升级自动清理 + 重建 FTS + per-message token 回填。
  • 🆕 模型分布跟随全局指标切换器(对话/消息/提交/Token)。

[1.0.0] — 2026-06-11

首个 1.0 里程碑:Beacon 审批中心 + 等待超时统一为全局配置 + 一轮深度审批安全加固。

  • 🆕 Beacon 审批中心:审批从「瞬时单卡」升级为「持久队列 + 历史 + 搜索 + 孤儿清理」。错过卡片也能补处理;来源会话已退出的请求自动标记清理。
  • 🆕 等待超时统一为全局配置:去掉 Beacon 硬编码 30 秒,与飞书托管共用「等待超时」(5min/30min/2h/24h,默认 30min)。
  • 🔒 安全加固:交叉 review B1-B7 + codex 6 轮独立验证,堵住约 48 个 hard-allow 绕过/边角变体 + IPC 数据丢失 + Rust 数据完整性。

[0.9.4] — 2026-06-09

auto-save 数据保护重大修复(静默失败 2 个月的 bug)+ Beacon / Risk / Dashboard / 项目分组多项修复。

  • 🔥 auto-save 三层修复:孤儿锁自愈 + 互斥锁串行化 git 段 + gitignore 收紧(本机清理 25G→2.7G,.git 6.2G→743M)。
  • 🐛 Beacon commit 数封顶 999 修复 / Risk .env false positive / Dashboard 跨天分天 / 项目分组 display_path。

[0.9.3] — 2026-05-24

Dashboard 4 个增强(借鉴 Claude / Codex 监控工具)+ Codex 模型解析修复


[0.9.2] — 2026-05-22

小版本:v0.9.1 dogfood 后 3 个 UI bug 修复。


[0.9.1] — 2026-05-22

维护版本:双 arch 包发行基建(aarch64 + x86_64,修 Intel 用户下错包)+ 3 类数据问题根因修复 + session 详情 copy 修复 + 版本号管理走业界标准。无功能性新增,但发版基础设施大改造。


[0.9.0] — 2026-05-21

两大新功能 + 9 天 dogfood 大量收敛。覆盖 v0.8.0 → v0.9.0 期间 444 个 commit。 新功能:Project Grouping(解决 monorepo 子目录 + 平行副本散落)+ Dashboard 与分享卡片(看见自己 AI Coding 状态 + 一键生成游戏存档式分享图传播)。 收敛:用户反馈机制(Phase A-E)+ Risk Engine shell-aware lexer 重写 + 11 类 false positive 修复 + Codex round-3~8 review 修法。


🆕 Project Grouping — canonical project + membership 两层模型

解决两类典型场景:MerchantAI monorepo 8+ 子目录被散到 N 个项目;LingoBuddy 4 平行实验副本(clone 自同 origin)也散开。session 数据零搬迁,合并完全可逆。详见 docs/wiki/project-grouping-design.md

  • 数据模型:新加 project_groups(用户面向的"项目")+ project_membership(cwd → group 一对一 + sub_label)+ project_suggestions(合并建议)三张表。原 projects 表保持不动作为 cwd 级 membership,sessions/commits 的 FK 引用零改动
  • migration v4:每个现有 project 自动建同 id 的 auto group + membership,每次启动跑"愈合"逻辑补建漏掉的
  • Sidebar 右键菜单:改名 / 合并到... / 拆分 / 设置子标签。合并 dialog 列出现有 group + "+ 创建新项目"选项
  • 多 member group 详情聚合:sessions / commits / 黑板 LLM context / 项目文件树状都按所有 member 聚合(之前单 cwd)。每行 session 显示来源 chip(sub_label 或项目名)
  • SuggestionEngine 自动推荐:每次 sync 扫所有 cwd 的 .git/configremote.origin.url(ssh/https/.git 后缀归一化),按 remote 分组生成 pending suggestion。规则 2: 同 root 同 remote (monorepo) / 规则 3: 不同 root 同 remote (clone 副本)。Banner UI 在 sidebar 顶部,三按钮:合并 / 详情 / 忽略。详情 dialog 底部 [关闭] [忽略] [合并] 闭环决策。不联网,纯本地 .git/config

🆕 Dashboard 总览面板 + 分享卡片

主 nav 左侧加 📊 Dashboard 入口(在 Agent 上方),点击进入 AI Coding 全景。设计文档:docs/wiki/dashboard-design.md

  • 5 个核心数字:项目 / 对话 / 消息 / 提交 / Tokens(API 计费总量含 cache_read)。Tokens 卡 tooltip 显示工作量 token 对照
  • 🔥 Streak:连续 AI Coding 天数 + 历史最长。算法:每天有 session 或 commit +1,中断重置
  • 时间序列柱图:按当前 metric 单柱显示(4 个 metric 各自配色)
  • AI 工具分布:CC / Codex / OpenCode / Antigravity stacked bar + 占比。按 message 数公平(非 session 数)
  • 24h × 7day 活跃热力图:反映工作节奏
  • Top 5 项目排行:本地按当前 metric 重排序,详情行 4 维「N 对话 · M 消息 · X 提交 · Y tokens」全列
  • 动作统计:11 种 event_type(archive/star/continue/merge/split/rename/...)累计 + 近 7 天。usage_events 表为基础设施
  • 全局 metric 切换 chip:对话 / 消息 / 提交 / Token 一键切,热力图 / Top / 工具分布 / 柱图全部同步重新渲染。零重新加载(后端一次拉齐 4 维数据)
  • 时间窗切换:7d / 30d / 90d / All

分享卡片:Dashboard 右上 [Share] 按钮 → 弹左右分栏 dialog

  • 左侧 8 个 section checkbox(核心数字 / Streak / 时间序列 / 工具分布 / 热力图 / 项目排行 / 动作统计 / 自定义文字)+ 5 个 Core sub-toggle(项目/对话/消息/提交/Tokens 独立勾选)+ 自定义文字 100 字限
  • 右侧 800px 实时预览
  • 强制项目匿名(dashboard 显示真名,分享时 A/B/C/D/E)
  • 始终包含品牌 footer:Memora 忆码 logo + GitHub QR (github.com/4over7/Memora) + tagline「给 AI 编程加上存档点 / Checkpoint your AI coding」
  • RepaintBoundary.toImage(pixelRatio: 3.0) 高清 PNG,FilePicker.saveFile 用户自选保存位置
  • 全套 i18n 跟随 S.locale(中英)

🆕 用户反馈机制(治本 over 治标)

替代开发者每条 false positive 手 patch 的不可持续模式。Phase A-E 全实现。详见 docs/wiki/user-feedback-loop-design.md

  • Beacon Allow forever / Deny forever 按钮:弹窗多一行决策按钮 + 写 FeedbackStore
  • LLM-assisted PatternExtractor:把命令样本 + Memora 判定 + 用户选择给 LLM,生成 trust pattern / deny rule 候选
  • RulesStore 统一数据层~/.memora/rules.json schema 含来源标记(builtin / user / feedback),启动 migration 老 trusted-scripts.json
  • Agent tab UI(主 nav 入口):pending feedback 列表 + 可编辑 pattern + [LLM 优化] 按钮 + [Confirm 写入 rules];已生效规则列表 + 删除。LLM 永远是 advisor,用户是 decider(关键产品决策)
  • 安全红线:内置 deny-list(rm -rf / push --force 等)永不能被用户反馈覆盖

🆕 Risk Engine 大量收敛(自 v0.8.0 起)

  • Shell-aware lexer:从字符串扫描换成 AST,正确处理 quote / heredoc / 命令替换 / subshell / 重定向。修一批字面词 false positive
  • hard_allow.dart 单独抽出:59 个单测覆盖 readonly 命令、git read/write、build/test、lark-cli read、SSH 只读探活、cmd substitution、Edit/Write 路径等
  • ApprovalOrchestrator 抽出:从 UI state 解耦,独立单测
  • F11 v2 信任脚本命令模式:pattern 含空格时走完整命令含 args glob 匹配。~ 路径展开
  • C 修法多段命令:长链命令每段独立评估,所有段都安全才 hard-allow
  • A 修法 deny-list grace timer:deny-list 命中加 25s grace deny 显式写 response,防 hook timeout 静默放过(之前 timeout = 空 stdout = 放过,对 rm -rf 是漏洞)。也移除自动拒兜底改用 audit event
  • #23 SSH 远程 sudo+readonly+非 secret 路径 hard-allow(B 方案治本)
  • #27 _stripShellRedirect 剥 subshell 括号 / #28 lark-cli pipeline trust 多行 split + 安全 $(...) 剥
  • #26 /tmp Write hard-allow + macOS TMPDIR /var/folders hard-allow
  • Codex round-3~8 review 多轮修:user deny glob anchor 到 cmd boundary / shell wrapper path 剥(含绝对路径 /bin/bash)/ bash -c 边界 / heredoc unquoted body 含 $() 标 unsafe / multi heredoc 保守 bail / npm/cargo publish 加命令头限定防字面词 FP
  • SQL deny rule 加 SQL 客户端 context 限定 + #17 grace deny 补 audit event
  • trust pattern UI 校验放宽~/ 开头、空格命令模式都支持
  • #19 isTrusted 识别 bash/sh/zsh wrapper 调用

Fixed

  • FTS5 search 连字符 keyword 报错:搜 sing-box-for-apple 0 结果,根因 FTS5 把 - 当 NOT/column 操作符。phrase 包装每个 token 修
  • multi-member sessions 排序按 endedAt:之前按 startedAt 让长 session(CC 早起开当晚仍在续)排到中间。跟 Rust SQL ORDER BY COALESCE(ended_at, started_at) DESC + UI 显示对齐
  • 工具分布百分比 1491% bugclamp(1, 1 << 30) 把 total 上限截到 1.07B,16B tokens 除错。批量 1 << 301 << 62
  • 分享卡片导出 ENTITLEMENT_REQUIRED_WRITE:build.sh codesign 没传 --entitlements,加 --entitlements macos/Runner/Release.entitlements + plist 加 user-selected.read-write
  • Streak badge 居中 + 柱图渲染 width=0 修复(Column crossAxis=start 不 stretch,显式 SizedBox(width) + CustomPaint(size))
  • Beacon Allow forever security 反转 bug (Codex round-1 critical)denyForever 被 hook 当成 allow 放过,但 audit log 写 "deny"。normalize action 修
  • rules.json 写盘原子化:之前崩溃后 trust list 静默丢失
  • commandSample redact:feedback.jsonl + 发给 LLM 前过滤 secret(API key/token)
  • events.jsonl 补 feedbackLabel + setCachedForTesting 走 RulesStore + replaceTrustPatterns dedupe by id
  • GitHub URL 修正:之前编造的 eastworld-ltd/memora 改成真实 4over7/Memora

Changed

  • 项目维度 token 显示从 input + cache_creation + output(工作量)切到 + cache_read(API 计费总量),跟 Dashboard 一致
  • Sidebar 项目列表从 cwd basename 维度切到 canonical group 维度
  • AI 工具分布从按 session 数算改成按 message 数(公平:5 message 与 500 message 的 session 不再等量)

Internal

  • Rust:crates/memora-core/src/{db.rs,suggestion.rs} 加 4 张表(project_groups / project_membership / project_suggestions / usage_events)+ 7 个 dashboard 聚合 SQL + streak 算法。crates/memora-ingest shell parser AST
  • Dart:app.dart inline 加 dashboard / share card / project grouping 全套 widget(~2000 行);l10n.dart i18n keys 翻倍
  • 测试:cargo test 全过;flutter test 617 通过(自 v0.8.0 加了几十个 dashboard / grouping / shell lexer 单测)
  • 依赖新增:qr_flutter ^4.1.0 + path_provider ^2.1.4(分享卡片 QR + 保存路径)
  • frb codegen 多轮重跑同步

Known limitations

  • dashboard 历史空白usage_events 表是 v0.9.0 才加的埋点,前 30 天图大部分是空(从今往后才有数据)
  • 没 git remote 的本地 repogit init 未 push)SuggestionEngine 命中不了,走右键手动合并
  • 跨机器同步未支持
  • Continue 向导多 member group 仍按 primaryProject 单 cwd 拉 branches(语义不清,留 follow-up)

[0.8.0] — 2026-05-12

🔌 Codex 接入 + 一天 dogfood 后的大规模 risk engine 改进。v0.7.0 飞书托管上线后一天的集中 dogfood 暴露一批 v0.4 实现 bug、安全设计漏洞和 UX 问题。23 commits 跨 Codex PreToolUse 完整链路、规则收紧(audit 报告 ~1700 LLM 调用浪费 + 安全 timeout 漏洞)、信任脚本机制 v2、LLM 性能调优。

Added

🆕 Codex PreToolUse hook 接入

Memora 现在能拦截 Codex 的工具调用,跟 Claude Code 共享同一套审批路径(deny-list / hard-allow / Risk Engine / 飞书托管):

  • schema 探测 Phase 1:先用 dump 模式抓真实 Codex hook payload,确认字段名跟 CC 一致(tool_name 直接是 "Bash" / "apply_patch"),几乎 1:1 复用 CC 处理代码
  • Phase 2 normalizeapply_patch 自定义 V4A 格式 parser,单文件 Add → 等同 Write、Update → 等同 Edit、Delete/多文件 → Bash fallback 走 LLM 灰色(防 Delete 静默放过)
  • 响应协议适配:Codex 只接 permissionDecision:deny(不接 allow/ask),timeout/allow 空 stdout 等同放过
  • hook_installer 加 Codex PreToolUse entry:timeout 86400s 跟 CC 对齐

详见 docs/wiki/hooks-expansion-plan.md Phase 3 详细设计章节。

🆕 信任脚本机制(F11 v1 + v2)

用户自管 hard-allow 白名单 ~/.memora/trusted-scripts.json,跳过 LLM + Beacon 直接放过。

  • v1 路径模式(pattern 不含空格):例 /Users/x/proj/build.sh/Users/x/proj/scripts/*.sh
  • v2 命令模式(pattern 含空格触发):例 lark-cli im +messages-send --chat-id oc_xxx*curl https://api.internal.example.com/*psql -h prod-db.internal,支持 glob */ 匹配 args
  • 多段判定(C 修法):长链命令(cd && git status && lark-cli msgs-send)每段独立评估,所有段都安全(命中 readonly / git / build-test / trust 任一)才整条 hard-allow
  • Settings UI:风险引擎 → 已信任的脚本,列表 + 添加 + 删除
  • cache 即时同步:每次 hook 来重新 load 文件,UI 改完立即生效

🆕 飞书托管 hook 超时可配

默认 86400s (24 小时),可在 Settings → 通知渠道 → 飞书托管 → "飞书等待超时" chip 行选 5min / 30min / 2h / 24h。从 v0.7.0 的 1800s(Phase 1 保守值)升级。

🆕 LLM provider 升级

  • DeepSeek V4 Flash 上线:default model 升 deepseek-v4-flash,加 chip UI 让用户在 v4-flash / v4-pro 之间一键切换
  • DeepSeek V4 默认关 reasoning:RiskEngine 调用从 5-30s 降回 2-3s,本地审批 JSON 决策不需要 reasoning trace
  • chip 候选 model UI:Add/Edit dialog 在 model TextField 下方显示候选 chip
  • 静默 migration:旧 deepseek-chat / deepseek-reasoner 自动升级到 deepseek-v4-flash

Changed

🛡️ Audit 后规则收紧

基于 30 天 18418 条 risk-verdict 审计(详见 docs/review/historical-audit-2026-05-11.md),发现约 1700 条 LLM 调用浪费 + 一批边界 case 漏判,逐条修:

  • git push --force-with-lease 不再被误伤 deny-list(协作场景推荐用法),改走 LLM 灰色让用户明确批一次(rewrite history 不该静默放过)
  • pnpm / yarn 白名单扩:补 build/test/dev/start/lint/typecheck/tsc/format/check/preview/jest/vitest/playwright 等,cd 前缀剥离支持多层链
  • $(...) bail-out 放宽:先剥单引号 + quoted HEREDOC 后再判 bail(约 500 条 LLM 调用省掉)
  • readonly 白名单扩:补 xargs / awk / sed -n / python3 -m json.tool / PlistBuddy print / od / xxd / who / sar / free / ss / ifconfig
  • SSH 只读探活 hard-allowssh [safe-flags] <host> "<readonly inner>" 拆开判定,禁止隧道/转发 flag,inner 全 readonly → hard-allow
  • lark-cli 只读 sub 加白名单:chat-messages-list / messages-get / messages-mget / messages-reactions-list / chat-search / docs +fetch/search
  • deny-list -m "..." 不再误命中 commit message body:扩 stripShellLiterals-m/--message 后的双引号字符串
  • 多段 git push hard-allow 漏判修:grep && git push origin docs/... 这类不再弹 Beacon

🛡️ Deny-list 安全门槛硬化(A 修法)

非托管模式下 deny-list 命中之前只是弹 Beacon 让用户决定,用户超时未点 → Codex 路径 hook timeout 空 stdout = Codex 放过 → 危险命令(rm -rf 等)能跑。

修法:deny-list 命中时弹 Beacon + schedule 25s grace window,过后用户没响应 → Memora 写 deny response → hook 立即输出 deny → Codex 拦。用户在 25s 内点 Beacon Allow 仍可主动覆盖(保留人工 final say)。

Fixed

F5/F6/F7 一批 follow-up

  • F5 hook reconcile:install 改"清除老条目重写",timeout 等字段升级会自动同步(v0.7 把 PreToolUse timeout 60→86400 时老用户 settings.json 不更新的根因)
  • F5 marker 严格判定:基于命令首 token basename 严格匹配,防 echo memora-hook-failed 类误判
  • F6 飞书多卡片歧义保护:多张 active 卡片时用户回 y/n,refuse 擅自匹配,发独立 P2P 提示"请用 👍/👎 reaction 到具体卡片"
  • F7 Beacon SHOW 同步最新 risk state:队列中的 request 收到 risk update 后等 SHOW 时显示最新建议,不再卡"AI 分析中"
  • F7 pending cache 泄漏修:4 个 terminal 路径全部 evict 不再泄漏
  • F1 hook reason 按场景区分:不再硬编码 "Beacon: user denied",按 Memora / Beacon / 飞书 / deny-list 等填具体原因
  • F2 缓存命中 Beacon 不闪过:Future race + 30ms timeout 防同步早返回 1ms 闪
  • F3 风险评估 radio 三态:替代旧"风险引擎 + 省心模式"两 toggle
  • F4 飞书自己响应卡片下加 reply 反馈:除了 🆗 表情还显示"✓ 已批准 / ✗ 已拒绝" thread reply

UX + 第三方 review 修复

  • pnpm --filter <pkg> build 类工作流不再走 LLM 等审批
  • DeepSeek V4 慢导致 Beacon 卡"分析中"修复
  • Open in Ghostty 两个问题:cd 不再被当 program 名传给 login;不再 split 所有已有窗口
  • CLI installer 同步:memora-hook install 子命令的 PreToolUse timeout 60→86400 + reconcile(团队用 CLI 装会卡 60s 的隐患修复)
  • export JSON 默认剔除 credentials:分享导出 / 跨机迁移不再泄 API Key
  • should_skip_project 改白名单:原一刀切 .xxx 会误伤 dotfiles 项目
  • README 同步频率描述事实化:从 "Background sync every 15 seconds" 改成事件驱动 + 60s 兜底

Tests

  • flutter test: 320 passed / 15 skipped(Lark v2 stale 测试待 mock 架构重写)
  • cargo test workspace: 全过(hook_installer 9 + Codex normalize 8 + deny_list 80 + trusted_scripts 22 等)
  • flutter analyze: 0 issue

Follow-up

留 6 个 task 待后续:Codex Trust UX 提示文案 / hooks 版本检测改 schema 对比 / Lark 测试 mock 重写 / app.dart 拆审批 orchestrator / ~/.memora 自动 git Settings toggle / review_tests stale 处理。


[0.7.0] — 2026-05-11

🔒 飞书托管模式上线。开关打开后,AI 工具的工具调用审批走飞书私信:90% 由 AI 自动批静默放过,剩下 10% 真需要决策时双通道同时弹(Beacon + 飞书私信),任一通道响应即放行。出差 / 离开电脑也能完整跑 AI 工作流,hook 等响应可长达 30 分钟(Phase 1 保守值,Phase 2 会拉到 24 小时)。39 commits 含一大批 v0.4 留下的实现 bug 修复。

Added

① 飞书托管模式(核心新功能)

Settings → 通知渠道 → 飞书托管,开关一打开,所有 PreToolUse 审批走飞书 P2P 私信。设计要点:

  • AI 优先决策:deny-list 命中直接拒(沉默不通知);Risk Engine 判 low / medium 自动批准(飞书完全静默);只有 LLM 判定 high 或 ask 时才发卡等待用户
  • Beacon 立即 / 飞书延后(v2 时序):用户在电脑前时 Beacon 0 延迟立即弹(v2 设计原则——本地通道不被 LLM 阻塞);离开电脑后 5-10 秒 LLM 跑完才决定要不要也发飞书。任一通道响应即放行(first-response-wins)
  • 飞书审批 UX:用户在飞书回 y / n,或对卡片加 👍 / 👎 reaction → Memora 在 reply 上加 🆗 表情回执 + 在卡片下发 ✓ 已批准 / ✗ 已拒绝 thread reply,让你知道这条审批已被处理
  • 卡片初始就带 AI 建议:不再先"分析中..."再后续 reply,减少飞书消息数 3:1
  • Hook 端 timeout:1800 秒(Phase 1 保守值)/ 86400 秒(Phase 2 准备好的 24 小时上限)

详细设计文档:docs/wiki/approval-modes-design.md v2 + docs/wiki/lark-managed-mode.md

② Settings UI 整理

  • 风险评估模式 radio 三态(替代原"风险引擎 + 省心模式"两 toggle):不启用 / AI 辅助(默认)/ AI 自动批,单一线性的心智模型
  • Lark channel toggle = 飞书托管 toggle 合并:UI 一个开关同时控制 channel 启用 + 托管 config
  • Beacon tab 合并到"通知渠道":Beacon 和飞书托管都是通知输出,归到一个 tab 下
  • "项目角色" 改名 "AI 编程设置":标签更易理解

③ Blackboard 三栏长内容支持折叠

LLM 输出 90+ 条目时不再撑爆页面:默认显示前 8 条,超出部分"展开剩余 N 条"按钮按需展示。

④ Commit 时间线分页加载

项目页 commit chip 显示真实总数(之前用 fetch list 长度,limit 50 时显示 "50" 误导)。折叠区底部加"显示更多 50 条"按钮按需 fetch。

⑤ LarkChannel 失败诊断

新增 lastError 字段 + ~/.memora/logs/lark-*.log 日志,UI 显示真实错误(不再笼统报"未安装")。

Changed

  • 审批模式三选一:原本有 A(Beacon-only)/ B(开飞书但不开托管)/ C(飞书托管)三种,B 模式用户群微到可忽略,本次合并到 C
  • dispatch 非托管模式不参与 Lark fan-out:避免飞书刷屏。Lark 只在托管模式 LLM 判 high / ask 时单独发卡
  • _isDefinitelySafe shell 解析剥离 redirectls 2>&1 | head 等 readonly 命令不再因 & 字符被切分误判为灰色地带
  • 省心模式 rec=ask 不再自动批:LLM 明确要求人工判断时不该被悄悄放(之前漏判)
  • Codex token 解析(之前一直 0):Codex jsonl 里 event_msg.token_count 事件,按 OpenAI 协议反向语义映射到 Memora 内部 4 类字段
  • Archived 对话折叠:默认主列表只显示未存档,末尾加"📦 N 个已存档"折叠节
  • Hook reason 按 source 区分:CC 看到的 permissionDecisionReason 不再硬编码 "Beacon: user denied",按 Memora / Beacon / 飞书 / deny-list 等来源填具体原因

Fixed

修复了一批 v0.4 上线后陆续发现的实现 bug:

  • Beacon 67% 通知 1ms 闪过onRequestParsed 是 async 但 _scanRequestFiles 没 await,BeaconService 抢先 SHOW 然后被 hard-allow 路径 dismiss。修法:await callback 让 callback 决定完再加 queue
  • 双 Memora 实例 race:build.sh osascript quit 只杀 LSDatabase 注册的 /Applications 实例,build 目录直接启动的不管;pkill -x Memora 也大小写错了(实际进程名 memora 小写)。修:build.sh 加 pkill -x memora
  • 缓存命中场景 Beacon 仍然 67ms 闪过:托管模式 callback 走 Future race + 30ms timeout 防同步早返回前 SHOW
  • 飞书回复 y / n 完全无效:LarkChannel.pollOnce v0.4 只拉 reactions 不拉 text reply,托管模式实际不可用。加 +chat-messages-list --user-id 拉 P2P 私信
  • Blackboard / Drift / Spark JSON 截断:Anthropic max_tokens 写死 2048 不够长 JSON 输出。加 maxTokens 可选参数,长任务显式传 8192
  • Lark cli 在 macOS .app 找不到:PATH 不全 + lark-cli shebang env node 找不到 node。改用绝对路径 + 给子进程显式增强 PATH
  • Lark cli --receive-id 已废:改 --user-id(私信)/ --chat-id(群聊)
  • 飞书卡片 V2 schema tag:action 已废:改用 div + lark_md 纯文本提示行
  • kDefaultLarkReceiver 硬编码 Leon 的 open_id:改为空字符串 + 空 receiver 守卫(之前任何人开 Lark 都默认发到 Leon 飞书,安全隐患)
  • Lark channel toggle 点了不响应:v0.4 onChanged 漏调 LarkChannel.setEnabled(v)
  • 托管模式自己响应卡片下没 reply 反馈:用户回 y / n 后只有 🆗 表情,缺"已批准 / 已拒绝"文字。加 LarkChannel.handleInboundEvent 主动发反馈 reply

Technical

  • 新增 lib/src/managed_mode_service.dart — 托管 config IPC(~/.memora/managed-mode.json
  • 重构 lib/src/channels/lark_channel.dart — 路径解析 + 环境注入 + lastError + reply 拉取 + 表情回执 + 自己响应 reply 反馈
  • 新增 lib/src/channels/channel_registry.dart::dispatch(channels:) + attachLateChannel() — 支持选择性 fan-out + 后期 attach
  • crates/memora-hook/src/main.rs — 读托管 config 动态 timeout + response reason 透传
  • crates/memora-core/src/hook_installer.rs — CC settings.json PreToolUse.timeout 60s → 86400s

Test

  • flutter test 282 passed / 15 skipped(v2 stale 标 skip,等待 mock 架构重写)
  • cargo test --workspace 全过
  • flutter analyze 0 issue

[0.6.0] — 2026-05-06

✨ 项目页 token 统计从单数字升级成"总数 + 4 类细分悬停",配套数据层把 4 类 token 分别落库;导出对话时自动复制路径到剪贴板,文件名也从毫秒时间戳换成易读格式。

Added

① 项目页加 token 统计 chip + Tooltip 4 类细分

之前 chip 行只有"对话/消息/提交"三项,token 数据其实在 session 卡片显示了("2.5M tokens"),但项目级没汇总。

改动:chip 行新增紫色 token chip 显示全项目 total(用 K/M/B 格式化),鼠标悬停展开 4 类——新输入 / 写缓存 / 输出(这三项加起来等于 total)+ 缓存命中(标注"不计入总数:同一份上下文反复读取",避免再次困惑 v0.5.8 修过的 cache_read 累加问题)。

② 导出对话保存后自动复制文件路径到剪贴板

常见后续动作是把路径贴回 AI 对话里继续讨论历史,省一次手动复制。SnackBar 文案改成"已保存到 X · 路径已复制到剪贴板"。

③ 导出对话默认文件名换成易读时间格式

MerchantAI_recall_1778059262327.mdMerchantAI_recall_2026-05-06_18-21-02.md。无 :、文件系统/工具友好、字母排序 = 时间排序。

Changed

  • 数据层:session token 拆 4 列存储SessionStats 新增 input_tokens / cache_creation_tokens / cache_read_tokens / output_tokens 4 个字段,total_tokens 派生为 input + cache_creation + output(仍保持 cache_read 不进 total 的口径)。sessions 表 ALTER 加 4 列;pragma user_version=2 触发一次性全量 reingest,让旧 session 行回填 4 类细分(跟 v0.5.8 同样套路)。升级后第一次 sync 会重新 ingest 所有历史 session
  • Rust API 暴露 4 类细分给 FlutterProjectInfo / SessionInfo 各加 4 个字段,flutter_rust_bridge 重新生成。

Test

  • flutter test 297/297 + cargo test --workspace 全通过 + flutter analyze 0 issue
  • 本地 dogfood:reingest 后 chip 显示项目级汇总数字,Tooltip 4 类细分展示正常

[0.5.8] — 2026-05-02

🛠️ 修两个潜伏 bug:① 长 session token 数 O(N²) 严重虚高(一次 215.7M tokens 的 session 真实只有几 M);② 大项目(10K+ 消息)点 Blackboard 60s 撞 timeout。再附两个小修。

Fixed

① Token 数 O(N²) 严重虚高(影响所有用户)

crates/memora-ingest/src/claude_code.rs::RawUsage::total_inputcache_read_input_tokens 也累加到 session.total_tokens。但 cache_read 是"这次 LLM 推理读了多少缓存"——一个对话里前面所有消息都会进 prompt cache,第 N 条 assistant 推理时把整段历史从缓存读出来一次。跨整 session 累加 cache_read = 把同一份内容数 N 次(O(N²))

实测 410 条消息的 session 跑出 215.7M tokens 就是这样来的(真实独立内容总量约 1/40)。

修法total_input = input_tokens + cache_creation_input_tokens,不再加 cache_read。配套数据迁移(pragma user_version=1 控制只跑一次):所有 sessions.raw_size 设 -1,下次 sync 触发全量 reingest,session.token_count 用新公式覆盖。升级后第一次 sync 会重新 ingest 所有历史 session,期间 UI 上的 token 数会陆续从虚高值降到真实值。

② BiggerLadder 等大项目点 Blackboard 60s 撞 timeout

lib/src/llm_service.dart::_callOpenAI 写死 60s。BiggerLadder(50 commits / 14 sessions / 10269 msgs)点 Blackboard 报 TimeoutException after 0:01:00: Future not completed

修法

  • complete() 加可选 timeout 参数,Anthropic 默认 30s→60s、OpenAI 60s→120s;Blackboard / Drift / Spark 长任务显式传 180s
  • 新增 _postWithRetryTimeoutException / SocketException / ClientException 自动重试 1 次(隔 2s)
  • 失败时 UI 不再清空黑板——保留上次结果,顶部红条提示"刷新失败,显示历史结果"+ 重试按钮,没有历史结果才弹错误框

附带小修

  • session → session 切换后返回按钮失效_pickSession 的 setState 无条件覆盖 _previousView,session→session 切换时被覆盖成 _View.session,点返回时 view 没变化看起来"按钮失效"。修:只有从非 session view 进入时才更新 _previousView
  • Beacon 焦点切到非编程 app 不收回checkAndNotifyWindow 守卫多拦了 !isMouseOver,但鼠标 hover 是悬停态、不是激活态。修:守卫只保留 .notification(审批弹出不能被打扰),focus 切走立即 collapse。

Added

  • LLM 调用本地日志文件 ~/.memora/logs/llm-YYYY-MM-DD.log:release build 下 debugPrint 被 macOS unified log 吞掉。_postWithRetry 现在同步写文件,按日切分自然滚动,失败 silently catch。一行一条记录,方便后续 grep/awk 统计真实耗时与 input/output 大小关系。
  • 设计文档 docs/wiki/blackboard-timeout-fix.md(本次方案)+ docs/wiki/session-summary-multilayer.md(多层 session 摘要设计草案,⏸ 待立项)

Technical

  • crates/memora-ingest/src/claude_code.rs:60-72RawUsage::total_input() 公式收紧
  • crates/memora-core/src/db.rs:117-138pragma user_version 数据迁移机制
  • lib/src/llm_service.dart:223-380complete(timeout) + _postWithRetry + _appendLlmLog
  • lib/src/spark_service.dart:Blackboard / Drift / Spark / SessionSummary 显式声明 timeout
  • lib/src/app.dart_blackboardRefreshError + UI 红条 + _pickSession previousView 守卫
  • 测试:flutter test 297/297 + cargo test --workspace 1/1 + flutter analyze 0 issue

[0.5.7] — 2026-04-26

⚠️ 修一个潜伏所有版本的 db corruption 根因:FTS5 全文索引 segment 失控膨胀导致 ~/.memora/memora.db 涨到 6 GB,最终磁盘满 → SQLite "database disk image is malformed" → 所有 ingest 失败 → UI 数据冻结。所有用户都建议升级(你的 db 可能也在膨胀)。

Critical Fixed

crates/memora-core/src/db.rs::ingest_session 之前是"全量替换"模式——每次 raw 文件 size 变化(FSEvents 每次 jsonl append 都触发),就 DELETE FROM messages WHERE session_id = ? + INSERT all。FTS5 contentless 模式下 DELETE 写 tombstone segment、INSERT 写新 segment,auto-merge 跟不上 churn → segments 累积到 94 万(messages 才 4.5 万行,21 倍异常)→ fts_data 涨到 3.6 GB → db 涨到 6 GB → 磁盘满 → wal 写 ENOSPC → 半写 frame → database disk image is malformed

修法ingest_session 改增量——先 SELECT existing message id 集合,只 INSERT 不在集合里的(CC append-only + parse_session 已 dedup → 安全)。effect: sync 一个长了 3 条的 jsonl 只产生 3 个 FTS segment(之前是 500 个)。

老用户升级路径

自更新拿到 v0.5.7 之后,老 db 还是膨胀状态——可以手动跑一次 hot fix 缩 db:

pkill -f "Memora.app/Contents/MacOS/memora"
sqlite3 ~/.memora/memora.db "INSERT INTO messages_fts(messages_fts) VALUES('rebuild'); VACUUM;"
open /Applications/Memora.app

本机实测 6.35 GB → 34 MB(缩 99.5%),耗时 ~2 秒,数据零丢失(108 sessions, 45216 messages 不变)。

自 v0.5.0 以来累积变化(中间 v0.5.1~v0.5.6 dogfood,未单独 release)

  • windowID ↔ session 映射:私有 AX API 拿 focused window CGWindowID,hook 触发时绑定,同 ghostty 多窗口能精准识别"焦点哪个标哪个 session"
  • 摘要 cross-source 综合:LLM 注入 git branch + 关联 commits + prompt 硬约束保留版本号/hash/数字
  • 同 app 多窗口切换 Beacon 重新计算:Swift fromAX 不 dedupe + Dart 去掉 project.id 去重
  • iTerm2 BFS:4 层穿透 iTerm2 → iTermServer → login → zsh 找 shell
  • 自更新 helper 自动清 quarantine:飞书/AirDrop 等渠道传播也能直接启动
  • build.sh 在打 DMG 前先 staple .app:之前只 staple DMG,从 DMG 拖出来的 .app 没 ticket,离线/VPN 异常时无法首次启动
  • 终端类窗口用 PID → cwd 反查项目:Codex CLI / 普通 cd 终端也能展开 Beacon

[0.5.0] — 2026-04-22

自动更新上线 + Beacon 焦点窗口优先 + 黑板带 session 回顾摘要 + 代码 0 warning。从此版本起,你不再需要手动下载 DMG。

Added

  • 自动更新(Auto-Update): 启动时静默查 GitHub Releases API,有新版本立刻后台下载 DMG 到 systemTemp。下载完主界面顶部出现紫色 banner "Memora vX.Y.Z 已下载 · 重启完成更新"。用户点 "立即重启" 后,主进程写一段 helper bash(hdiutil attach → cp .app → detach → relaunch)然后 exit(0),helper 静默完成替换并拉起新版本。Settings → About 区也有 "检查更新" 入口,可看进度/重试。不做自动重启——用户可能正在调试,强行重启会丢上下文。

  • Session 回顾摘要: 项目详情页每张 session 卡片下方新增一段 LLM 生成的会话摘要,跟着 UI 语言。Prompt 不写 commit message 风格的"做了什么",而是覆盖三个维度:

    • 起因: 用户为什么发起这次对话
    • 过程: 讨论了什么、走了哪些方向、试过什么
    • 阶段性进展: 完成 / 决定 / 待办 / 还在讨论 / 卡住

    目的:让用户日后翻 session 列表时能瞄一眼判断"这个会话跟我想找的东西相关吗"。

    • 触发: 点"黑板"按钮时顺带触发,按钮上显示进度 "总结对话 12/33"
    • 缓存: ~/.memora/session-summaries/<session_id>.json,messageCount 不变就跳过 LLM
    • 并发: 3 路并行
    • 无 LLM: 静默不显示该行

Fixed

  • Beacon 后台 hook 抢走焦点窗口的项目展示: 用户在 Memora 窗口编辑代码时,speakout 后台的 claude session 触发 Hard Allow hook,Beacon 突然切到 speakout。修法:notifyActiveProject 简化成只记录 _lastHookProjectPath(供 window title 为空时回退),不再写 _lastMatchedProjectId、不再触发 expanded 推送。窗口聚焦成为 Beacon 项目上下文的唯一来源
  • 审批弹出后 dismiss 不恢复用户原始意图: 之前 dismissNotification 写死"前台 app 是编程类 → expanded",违背"用户在审批弹出前手动收缩了 → 审批结束应该回到 collapsed"的常识。新加 stateBeforeNotification 快照,dismiss 时优先恢复快照值。

Technical

  • 代码 0 warning: flutter analyze 之前 20 个 issue + Swift 编译 1 个 unused var,本版全部清完。flutter test: 297/297 全过。
  • 新增 lib/src/update_service.dart(精简自 speakout,~230 行)。

[0.4.19] — 2026-04-21

Beacon 展开态多 session 聚合 + 项目级 agent 配置对比。

新增

  • Beacon 展开态多 session 聚合 — 之前只描述单 session,忽略了 Memora 相对 CC recap 的独占价值(CC 看不见别的窗口)。现在 top 3 活跃 session 并列输出,每行一个 session,标 (当前) 区分用户焦点,可选最后一行"待你决定:..."。
  • 精准识别"用户当前在哪个 session" — hook 写 ppid(= claude 进程 PID);Dart 端维护 _sessionByPid 映射;前台终端 PID pgrep -P 递归找 CC 后代;pgrep -x claude + lsof -p <pid> -a -d cwd 给出"本项目活着的 claude 数"作为上限。失败 fallback 到 jsonl mtime。
  • Beacon 展开态动态高度 — 用 NSString.boundingRect 实测文本高度,clamp 到 3-6 行(51-102pt)。140/180 字的长 summary 不再被硬 48pt × 3 行上限吞掉尾巴。
  • 项目级 agent 配置对比 — 项目详情页出现 2+ agent 配置(CLAUDE.md / AGENTS.md / AGENTS.override.md / .cursorrules / .claude/CLAUDE.md / .codex/AGENTS.md)时,L2 section 标题右侧出现"对比 & 同步"按钮,双列 LCS 行级 diff,列头文件名可点击用默认编辑器打开自行修改。

修复

  • LLM 看不到真对话乱凑总结file-history-snapshot 之类的元数据记录单条 5KB,把 2000 字节 tail 窗口塞满,真对话被挤出。新 transcript 预过滤器只留 User/AI 文本;tail 从 2000 字节扩到 12000 字节 → 过滤后 1800 字/session。
  • 异步 race 导致显示错项目_sendExpandedData 长 async,用户快速切窗口时旧请求可能覆盖新请求。_pushExpandedData 前加 _lastMatchedProjectId guard。
  • hot session 把僵尸拉进来 — 三层滤:mtime < 2h + _sessionByPid 已知死的剔除 + 按本项目活 claude 数封顶。
  • LLM 输出字面 \n 被当文本 — prompt 用真换行 + 兜底 replaceAll(r'\\[nN]', '\n')
  • Summary 字数上限 — 80 → 140/180(对齐 tweet 心智模型)。

[0.4.4] — 2026-04-21

修 CC v2.1.114+ queued prompt 在 Memora 里不显示的问题。

修复

  • CC v2.1.114+ 的 queued prompt 在 UI 里缺失 — CC 更新后,用户在工具跑完前输入的 prompt 会被 queue。transcript 里新出两种记录:type:"queue-operation"(enqueue 瞬间 transient)和 type:"attachment" + attachment.type:"queued_command"(CC 真正处理时写入,含 prompt)。Memora ingest 只 match user / assistant,两种都被丢 → UI 里看不到用户这条 prompt,只见 AI "凭空回答"。修法:claude_code.rsRawAttachment struct + queued_command 独立分支;queue-operation 保持丢弃(attachment 已覆盖,避免重复入库)。2 个新单元测试。
  • 历史 session 自动回填~/.memora/raw/claude-code/ 中含 queued_command 的 session 会在下次 sync 时自动重新 parse,补回之前丢失的用户气泡。无需用户操作。

[0.4.3] — 2026-04-20

git -C <path> 绕过 deny-list 的安全漏洞 + 对话历史图片可点击查看。

修复

  • git -C /path ... 绕过 deny-list(安全问题) — CC 常用 git -C /abs/path <subcmd> 在指定目录跑 git,但 deny-list 的 7 条 git 规则全都是 ^git\s+push\s+... 形式,遇到 git -C /victim push --force 正则不匹配,直接放行进入 LLM 层 —— LLM 有概率判 allow,是真实 bypass。hard-allow 的 _gitReadCmd / _gitWriteCmd 同样漏判,导致 git -C /path log ... 白白等 7–8 秒。修法:helpers.dart 新加 kGitCmdPrefix 正则片段(覆盖 -C <dir>-c <k=v>--git-dir[=|空格]<path>--work-tree[=|空格]<path>,可重复可缺省),hard-allow 两条正则 + deny_list 全部 7 条 git 规则一起加前缀。5 个 prefix-bypass 回归测试。

新增

  • 对话历史图片引用可点击查看 — 消息正文里的 [Image: source: /abs/path.png](CC 附件元数据)现在渲染成紫色可点击"📎 图片"链接,点击用系统 open 拉起默认看图 app。[Image #N] 无路径占位符渲染成灰色标签。文件不在时 SnackBar 提示。最小实现:不复制、不持久化;parseMessageSegments pure-Dart 拆段 + SelectableText.rich + TapGestureRecognizer;9 个边界测试。

[0.4.1] — 2026-04-20

省心模式体验打磨。

修复

  • 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)才收。新 public BeaconService.dismissById(reqId):同步清 active id + 推进队列 + 发 native dismiss。Lark 先响应路径同步调用。
  • 展开态 Beacon 面板挡住背后内容 — 点面板空白区域之前不响应;现在点非按钮区域就收缩回小圆点,方便看被遮住的代码;窗口 title 变化时自动重新展开。"Open in Memora" 保留在按钮上。

[0.4.0] — 2026-04-18

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

[0.3.1] — 2026-04-08

关键修复

  • Hook adhoc 签名 → Developer IDbuild.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 新增 --version flag。
  • 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 始终显式写 permissionDecision JSON,不依赖 Claude Code 的隐式默认。

技术

  • 新增 Rust API hook_version_status(),通过 flutter_rust_bridge 暴露为 check_hook_version()
  • build.sh --no-bump flag 用于精确版本号的 release build。
  • NSScreen.didChangeScreenParametersNotification 触发 Swift→Dart method channel callback,让 Flutter 不用轮询就能刷新显示器列表。

[0.3.0] — 2026-04-07

新增 — Beacon V3

  • 基于文件的授权通信: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 签名(否则辅助功能权限会被撤销)。

移除

  • 删除所有按键模拟代码(sendKeystrokeToTerminalfindAndRaiseTerminalWindowraiseWindowContainingsendKeyCodeToPidkeystrokeForAction)—— ~100 行脆弱的 AX/CGEvent 代码被文件通信完全替代。

[0.2.22] — 2026-04-06

新增 — Beacon(AI 编程的灵动岛)

  • 菜单栏上方的浮动面板,像素螃蟹吉祥物
  • 授权双通道: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

[0.1.2] — 2026-03-31

新增

  • 双轨时间线(对话 + Git commit)
  • Blackboard(AI 驱动的项目分析)
  • History Branching(Worktree 和 Clone 模式)
  • 消息级 Continue(导出为 Markdown)
  • 六层知识模型(L1-L6)
  • 多提供商 LLM 支持(12+ 提供商)
  • 跨对话和 commit 的全文搜索
  • 代码签名 + DMG 打包

[0.1.0] — 2026-03-29

新增

  • 首次发布
  • Flutter + Rust 架构
  • Hook 驱动的对话捕获
  • Claude Code、Codex、OpenCode、Cursor 支持

Clone this wiki locally