-
Notifications
You must be signed in to change notification settings - Fork 2
Changelog zh
v1.1.0 设计大版本后的修复与打磨。
- ✨ 主题模式手动配置:设置 → 通用 → 主题,可在「跟随系统 / 浅色 / 深色」间选择,自动记住。
- 🗂️ 临时会话归一:一次性 review / worktree 的临时对话不再堆积成大量空壳项目,统一收进「临时会话」,项目列表更清晰;同时修复合并建议偶发的「路径重叠」误报。
- 🔒 自动更新加固:安装前校验官方发布身份(签名 + 公证)。
- 🐛 合并路由修复:合并子项目后「续接 / 分支 / 打开 commit」用对仓库;含路径转义。
全新设计语言「黑曜石中的琥珀光」+ Light 模式。从 AI 随手定的紫色样式重做为「档案琥珀 × 黑曜石」时光机界面,首页重构为「稳定流」时间轴,新增跟随 macOS 系统外观的 light / dark 双模式。
- 🎨 新设计语言:主色档案琥珀
#D6A24A(被封存的时间 = 唯一的「光」)+ 黑曜石分层中性 + 暖白纸感文字;SF Pro + SF Mono;发丝线分层 + 琥珀辉光(克制阴影)。建立语义 token 体系。 - 🌓 Light / Dark 双模式:新增「暖纸」light 模式(暖米底 + 暖墨字 + 加深琥珀墨),自动跟随系统外观切换。
- 🗂️ 信息架构重构:审批中心提到一级导航(原埋设置 4 层深);sidebar 分「全局 / 项目」。
- 📜 稳定流时间轴(首页重构):会话按开始时间锚定、按天分组(永不重排,靠位置找回);记录中 / 时长 / 并行标;commit 按归属嵌套进对话(Context-Linked);详情去左右分屏;悬浮「回到顶部」。
- 🧠 Blackboard 瘦头:「项目此刻」瘦成可折叠条,默认只展示「未落地想法」。
Dashboard 模型分布跟随全局指标 + Token 口径统一 + 分享卡片加入模型分布;修复 Cursor 消息重复数据 bug(与 v1.0.1 的 Codex 同因,影响 Cursor 用户)。
- 🔥 Cursor 消息重复修复:Cursor 此前用随机 UUID 当 message id,源更新(
lastUpdatedAt)时重新入库导致消息反复累积。改确定性cursor-<composer>-<bubble_id>,升级自动清理 + 全量重建。 - 🆕 模型分布跟随上方指标切换器(对话/消息/Token),分享卡片也加入该板块。
- 🆕 模型分布 Token 统一为 billed 按模型摊分(与核心数字/工具分布一致),并标注「不含缓存 X」实际产出,能看出哪些模型缓存重读占比高。
修复 Codex 消息重复的严重数据 bug(实测约 5x 虚高)——所有 Codex 用户的会话/消息/Token 统计都受影响,升级时自动清理回填。
- 🔥 Codex 此前用随机 UUID 当 message id + 增量入库,active session 每增长就重新入库导致消息反复累积(28507 vs 真实 4862)。改确定性
codex-<session>-<seq>,升级自动清理 + 重建 FTS + per-message token 回填。 - 🆕 模型分布跟随全局指标切换器(对话/消息/提交/Token)。
首个 1.0 里程碑:Beacon 审批中心 + 等待超时统一为全局配置 + 一轮深度审批安全加固。
- 🆕 Beacon 审批中心:审批从「瞬时单卡」升级为「持久队列 + 历史 + 搜索 + 孤儿清理」。错过卡片也能补处理;来源会话已退出的请求自动标记清理。
- 🆕 等待超时统一为全局配置:去掉 Beacon 硬编码 30 秒,与飞书托管共用「等待超时」(5min/30min/2h/24h,默认 30min)。
- 🔒 安全加固:交叉 review B1-B7 + codex 6 轮独立验证,堵住约 48 个 hard-allow 绕过/边角变体 + IPC 数据丢失 + Rust 数据完整性。
auto-save 数据保护重大修复(静默失败 2 个月的 bug)+ Beacon / Risk / Dashboard / 项目分组多项修复。
- 🔥 auto-save 三层修复:孤儿锁自愈 + 互斥锁串行化 git 段 + gitignore 收紧(本机清理 25G→2.7G,.git 6.2G→743M)。
- 🐛 Beacon commit 数封顶 999 修复 / Risk
.envfalse positive / Dashboard 跨天分天 / 项目分组 display_path。
Dashboard 4 个增强(借鉴 Claude / Codex 监控工具)+ Codex 模型解析修复。
小版本:v0.9.1 dogfood 后 3 个 UI bug 修复。
维护版本:双 arch 包发行基建(aarch64 + x86_64,修 Intel 用户下错包)+ 3 类数据问题根因修复 + session 详情 copy 修复 + 版本号管理走业界标准。无功能性新增,但发版基础设施大改造。
两大新功能 + 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 修法。
解决两类典型场景: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/config读remote.origin.url(ssh/https/.git 后缀归一化),按 remote 分组生成 pending suggestion。规则 2: 同 root 同 remote (monorepo) / 规则 3: 不同 root 同 remote (clone 副本)。Banner UI 在 sidebar 顶部,三按钮:合并 / 详情 / 忽略。详情 dialog 底部 [关闭] [忽略] [合并] 闭环决策。不联网,纯本地.git/config
主 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(中英)
替代开发者每条 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.jsonschema 含来源标记(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等)永不能被用户反馈覆盖
- 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
/tmpWrite hard-allow + macOS TMPDIR/var/foldershard-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 调用
-
FTS5 search 连字符 keyword 报错:搜
sing-box-for-apple0 结果,根因 FTS5 把-当 NOT/column 操作符。phrase 包装每个 token 修 -
multi-member sessions 排序按 endedAt:之前按 startedAt 让长 session(CC 早起开当晚仍在续)排到中间。跟 Rust SQL
ORDER BY COALESCE(ended_at, started_at) DESC+ UI 显示对齐 -
工具分布百分比 1491% bug:
clamp(1, 1 << 30)把 total 上限截到 1.07B,16B tokens 除错。批量1 << 30→1 << 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 静默丢失
-
commandSampleredact:feedback.jsonl + 发给 LLM 前过滤 secret(API key/token) - events.jsonl 补 feedbackLabel + setCachedForTesting 走 RulesStore + replaceTrustPatterns dedupe by id
-
GitHub URL 修正:之前编造的
eastworld-ltd/memora改成真实4over7/Memora
- 项目维度 token 显示从
input + cache_creation + output(工作量)切到+ cache_read(API 计费总量),跟 Dashboard 一致 - Sidebar 项目列表从 cwd basename 维度切到 canonical group 维度
- AI 工具分布从按 session 数算改成按 message 数(公平:5 message 与 500 message 的 session 不再等量)
- Rust:
crates/memora-core/src/{db.rs,suggestion.rs}加 4 张表(project_groups / project_membership / project_suggestions / usage_events)+ 7 个 dashboard 聚合 SQL + streak 算法。crates/memora-ingestshell 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 多轮重跑同步
-
dashboard 历史空白:
usage_events表是 v0.9.0 才加的埋点,前 30 天图大部分是空(从今往后才有数据) -
没 git remote 的本地 repo(
git init未 push)SuggestionEngine 命中不了,走右键手动合并 - 跨机器同步未支持
- Continue 向导多 member group 仍按 primaryProject 单 cwd 拉 branches(语义不清,留 follow-up)
🔌 Codex 接入 + 一天 dogfood 后的大规模 risk engine 改进。v0.7.0 飞书托管上线后一天的集中 dogfood 暴露一批 v0.4 实现 bug、安全设计漏洞和 UX 问题。23 commits 跨 Codex PreToolUse 完整链路、规则收紧(audit 报告 ~1700 LLM 调用浪费 + 安全 timeout 漏洞)、信任脚本机制 v2、LLM 性能调优。
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 normalize:
apply_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 详细设计章节。
用户自管 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 改完立即生效
默认 86400s (24 小时),可在 Settings → 通知渠道 → 飞书托管 → "飞书等待超时" chip 行选 5min / 30min / 2h / 24h。从 v0.7.0 的 1800s(Phase 1 保守值)升级。
-
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
基于 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-allow:
ssh [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 命中之前只是弹 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)。
- 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
-
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 兜底
- 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
留 6 个 task 待后续:Codex Trust UX 提示文案 / hooks 版本检测改 schema 对比 / Lark 测试 mock 重写 / app.dart 拆审批 orchestrator / ~/.memora 自动 git Settings toggle / review_tests stale 处理。
🔒 飞书托管模式上线。开关打开后,AI 工具的工具调用审批走飞书私信:90% 由 AI 自动批静默放过,剩下 10% 真需要决策时双通道同时弹(Beacon + 飞书私信),任一通道响应即放行。出差 / 离开电脑也能完整跑 AI 工作流,hook 等响应可长达 30 分钟(Phase 1 保守值,Phase 2 会拉到 24 小时)。39 commits 含一大批 v0.4 留下的实现 bug 修复。
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。
- 风险评估模式 radio 三态(替代原"风险引擎 + 省心模式"两 toggle):不启用 / AI 辅助(默认)/ AI 自动批,单一线性的心智模型
- Lark channel toggle = 飞书托管 toggle 合并:UI 一个开关同时控制 channel 启用 + 托管 config
- Beacon tab 合并到"通知渠道":Beacon 和飞书托管都是通知输出,归到一个 tab 下
- "项目角色" 改名 "AI 编程设置":标签更易理解
LLM 输出 90+ 条目时不再撑爆页面:默认显示前 8 条,超出部分"展开剩余 N 条"按钮按需展示。
项目页 commit chip 显示真实总数(之前用 fetch list 长度,limit 50 时显示 "50" 误导)。折叠区底部加"显示更多 50 条"按钮按需 fetch。
新增 lastError 字段 + ~/.memora/logs/lark-*.log 日志,UI 显示真实错误(不再笼统报"未安装")。
- 审批模式三选一:原本有 A(Beacon-only)/ B(开飞书但不开托管)/ C(飞书托管)三种,B 模式用户群微到可忽略,本次合并到 C
- dispatch 非托管模式不参与 Lark fan-out:避免飞书刷屏。Lark 只在托管模式 LLM 判 high / ask 时单独发卡
-
_isDefinitelySafeshell 解析剥离 redirect:ls 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 等来源填具体原因
修复了一批 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
- 新增
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.jsonPreToolUse.timeout60s → 86400s
-
flutter test282 passed / 15 skipped(v2 stale 标 skip,等待 mock 架构重写) -
cargo test --workspace全过 -
flutter analyze0 issue
✨ 项目页 token 统计从单数字升级成"总数 + 4 类细分悬停",配套数据层把 4 类 token 分别落库;导出对话时自动复制路径到剪贴板,文件名也从毫秒时间戳换成易读格式。
之前 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.md → MerchantAI_recall_2026-05-06_18-21-02.md。无 :、文件系统/工具友好、字母排序 = 时间排序。
-
数据层:session token 拆 4 列存储:
SessionStats新增input_tokens / cache_creation_tokens / cache_read_tokens / output_tokens4 个字段,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 类细分给 Flutter:
ProjectInfo/SessionInfo各加 4 个字段,flutter_rust_bridge重新生成。
-
flutter test297/297 +cargo test --workspace全通过 +flutter analyze0 issue - 本地 dogfood:reingest 后 chip 显示项目级汇总数字,Tooltip 4 类细分展示正常
🛠️ 修两个潜伏 bug:① 长 session token 数 O(N²) 严重虚高(一次 215.7M tokens 的 session 真实只有几 M);② 大项目(10K+ 消息)点 Blackboard 60s 撞 timeout。再附两个小修。
crates/memora-ingest/src/claude_code.rs::RawUsage::total_input 把 cache_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 数会陆续从虚高值降到真实值。
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 - 新增
_postWithRetry:TimeoutException/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。
-
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 摘要设计草案,⏸ 待立项)
-
crates/memora-ingest/src/claude_code.rs:60-72:RawUsage::total_input()公式收紧 -
crates/memora-core/src/db.rs:117-138:pragma user_version数据迁移机制 -
lib/src/llm_service.dart:223-380:complete(timeout)+_postWithRetry+_appendLlmLog -
lib/src/spark_service.dart:Blackboard / Drift / Spark / SessionSummary 显式声明 timeout -
lib/src/app.dart:_blackboardRefreshError+ UI 红条 +_pickSessionpreviousView 守卫 - 测试:
flutter test297/297 +cargo test --workspace1/1 +flutter analyze0 issue
⚠️ 修一个潜伏所有版本的 db corruption 根因:FTS5 全文索引 segment 失控膨胀导致~/.memora/memora.db涨到 6 GB,最终磁盘满 → SQLite "database disk image is malformed" → 所有 ingest 失败 → UI 数据冻结。所有用户都建议升级(你的 db 可能也在膨胀)。
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 不变)。
- 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
自动更新上线 + Beacon 焦点窗口优先 + 黑板带 session 回顾摘要 + 代码 0 warning。从此版本起,你不再需要手动下载 DMG。
-
自动更新(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: 静默不显示该行
-
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 时优先恢复快照值。
-
代码 0 warning:
flutter analyze之前 20 个 issue + Swift 编译 1 个 unused var,本版全部清完。flutter test: 297/297 全过。 - 新增
lib/src/update_service.dart(精简自 speakout,~230 行)。
Beacon 展开态多 session 聚合 + 项目级 agent 配置对比。
-
Beacon 展开态多 session 聚合 — 之前只描述单 session,忽略了 Memora 相对 CC recap 的独占价值(CC 看不见别的窗口)。现在 top 3 活跃 session 并列输出,每行一个 session,标
(当前)区分用户焦点,可选最后一行"待你决定:..."。 -
精准识别"用户当前在哪个 session" — hook 写
ppid(=claude进程 PID);Dart 端维护_sessionByPid映射;前台终端 PIDpgrep -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前加_lastMatchedProjectIdguard。 -
hot session 把僵尸拉进来 — 三层滤:mtime < 2h +
_sessionByPid已知死的剔除 + 按本项目活 claude 数封顶。 -
LLM 输出字面
\n被当文本 — prompt 用真换行 + 兜底replaceAll(r'\\[nN]', '\n')。 - Summary 字数上限 — 80 → 140/180(对齐 tweet 心智模型)。
修 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 只 matchuser/assistant,两种都被丢 → UI 里看不到用户这条 prompt,只见 AI "凭空回答"。修法:claude_code.rs加RawAttachmentstruct +queued_command独立分支;queue-operation保持丢弃(attachment 已覆盖,避免重复入库)。2 个新单元测试。 -
历史 session 自动回填 —
~/.memora/raw/claude-code/中含 queued_command 的 session 会在下次 sync 时自动重新 parse,补回之前丢失的用户气泡。无需用户操作。
修 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 提示。最小实现:不复制、不持久化;parseMessageSegmentspure-Dart 拆段 +SelectableText.rich+TapGestureRecognizer;9 个边界测试。
省心模式体验打磨。
-
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 支持