Commit daa45829c716afd3f1c5c3764c27f272b94c034b

Authored by yibo
1 parent 950edbab

docs(lifelog): CLAUDE.md 同步 v0.8 全相册自动索引

- 项目表 + 节标题 v0.7→v0.8
- 架构骨架加「相册 tab = 全相册自动索引(Tier-0 人脸/Tier-1 VL + 搜图)」
- vision/ 文件清单更新(PhotoWorker→PhotoFaceWorker/PhotoVlWorker,
  补 PhotoVlState/GalleryScanner/EmbedClient)
- 新增「全相册自动索引/分层管线(v0.8)」段;✅ 列表补 存储 TTL + v0.8;
  剩余摘要换成「语义搜图落地(待配 embed 模型)」

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Showing 1 changed file with 9 additions and 7 deletions
CLAUDE.md
... ... @@ -10,7 +10,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
10 10 |---|---|---|---|
11 11 | **lemonPCRM** | `server/` + `frontend/` + `packages/` | Node.js + Express 后端 + 静态前端 | 主线 |
12 12 | **wechat_plain** | `wechat_plain/` | Android Xposed/A11y 模块 + Pixel 部署脚本 | 主线 |
13   -| **lifelog-recorder** | `lifelog-recorder/` | Pixel 原生 Android 应用(Kotlin + Compose) | v0.7 (2026-06) |
  13 +| **lifelog-recorder** | `lifelog-recorder/` | Pixel 原生 Android 应用(Kotlin + Compose) | v0.8 (2026-06) |
14 14  
15 15 **lemonPCRM** — lemonAI 出品的 Local-First AI 个人人脉管理系统(Personal CRM)。以人为中心、以对话为链接,通过知识图谱管理微信、LinkedIn、X 等多平台社交关系,将每个联系人与其社媒动态、会议纪要、文件、照片全面关联。
16 16  
... ... @@ -163,7 +163,7 @@ Launcher (ProcessLauncher spawn / NoneLauncher 无操作)
163 163  
164 164 详见 `server/services/wechat/README.md`。
165 165  
166   -## lifelog-recorder(Pixel 8 Pro 24/7 录音 + 本地中文 ASR + 本地 LLM,v0.7)
  166 +## lifelog-recorder(Pixel 8 Pro 24/7 录音 + 本地中文 ASR + 本地 LLM,v0.8)
167 167  
168 168 > 完整接手地图、踩坑清单、命令速查见 `lifelog-recorder/HANDOFF.md`。本节只勒住整个项目的**架构骨架 + 关键决策来源**,不重复细节。
169 169  
... ... @@ -191,6 +191,7 @@ Foreground Service (foregroundServiceType=microphone, WAKE_LOCK partial)
191 191 ├ ChatScreen:本地 2B/4B(llama-swap 8080) + Hermes(8642→Kimi) 多端点对话
192 192 └ photolog/CRM 层 (PhotologScreen/PersonProfileScreen/PhotologViewModel + vision/)
193 193 人物 tab = 「我管理的人物」;通讯录(微信+手机两源合并)是池子(勾选纳入);相册人脸标注/绑声纹自动入库
  194 + 相册 tab = 全相册自动索引(MediaStore 全量):Tier-0 人脸/时间秒级铺 + Tier-1 VL 场景描述充电补 + 搜图(关键词/语义)
194 195 ```
195 196  
196 197 **声纹纠偏 L1+L2**(`SpeakerClusterer`):L1 = reclusterAll 和 assign 都**冻结人工命名 anchor 不漂移**(止住「秦子琛吸宜博→质心漂→吞更多」雪球);L2 = 重命名/合并时 `rebuildAnchor` 用该人**全部段均值**重建质心(多 anchor,取代单段注册)。用户流程:听一段 → 命名/合并 → 「重新聚类」。阈值默认 0.45(设置页 0.35–0.65)。CAMPPlus 在短中文段上区分度有天花板,详见 memory `lifelog-block-diarization-pipeline.md`。
... ... @@ -199,7 +200,9 @@ Foreground Service (foregroundServiceType=microphone, WAKE_LOCK partial)
199 200  
200 201 **本地 LLM 栈(v0.6,零云端)**:Termux 自编 llama.cpp HEAD + llama-swap v223 监听 `127.0.0.1:8080`,按 model 名(`2b`/`4b`)热切换 Qwen3.5-{2B,4B}-Q4_K_M。纪要 worker + App 对话都打 8080;Magisk `service.d` 开机自启。完整部署/坑见 memory `pixel-local-llm-stack.md` + HANDOFF.md。
201 202  
202   -**photolog / 人脉 CRM 层(v0.7 新增)**:在录音之外把 lifelog 长成端上 mini-CRM。`PhotologScreen`(人物 tab + 相册 tab)、`PersonProfileScreen`(联系人档案:tab 式 + 记录搜索 + 微信聊天/朋友圈/AI 印象 + 「🎤 录一段绑定 TA」当场录声纹)、`PhotologViewModel` 统管。**两个人物池分离**:「我管理的人物」(CRM 关心的人,人物 tab 显示)vs「通讯录全部联系人」(池子,选人页里勾选纳入)。池子有**两个来源**:微信(Mac 推的 enroll 数据)+ 手机系统通讯录(`READ_CONTACTS` → `ContactsContract`,contactRef `phone:<id>`,按手机号/姓名跨源自动合并);`Person` 还存手填 `realName`(真名)/`resume`(简历),档案页可编辑。`vision/`(`FaceEngine`/`FaceMatcher`/`PhotoProcessor`/`PhotoScheduler`/`PhotoWorker`/`WeChatEnrollWorker`/`VisionClient`)做相册扫描 + 人脸聚类 + 微信头像锚点入库;微信头像配方与「锚点 embedding 必须端上算」见 memory `wechat-avatar-face-enrollment.md`。声纹绑人 ↔ 人脸标注 ↔ 微信联系人三者打通到同一 `Person`。
  203 +**photolog / 人脉 CRM 层(v0.7 新增)**:在录音之外把 lifelog 长成端上 mini-CRM。`PhotologScreen`(人物 tab + 相册 tab)、`PersonProfileScreen`(联系人档案:tab 式 + 记录搜索 + 微信聊天/朋友圈/AI 印象 + 「🎤 录一段绑定 TA」当场录声纹)、`PhotologViewModel` 统管。**两个人物池分离**:「我管理的人物」(CRM 关心的人,人物 tab 显示)vs「通讯录全部联系人」(池子,选人页里勾选纳入)。池子有**两个来源**:微信(Mac 推的 enroll 数据)+ 手机系统通讯录(`READ_CONTACTS` → `ContactsContract`,contactRef `phone:<id>`,按手机号/姓名跨源自动合并);`Person` 还存手填 `realName`(真名)/`resume`(简历),档案页可编辑。`vision/`(`FaceEngine`/`FaceMatcher`/`PhotoProcessor`/`PhotoScheduler`/`PhotoFaceWorker`/`PhotoVlWorker`/`PhotoVlState`/`GalleryScanner`/`VisionClient`/`EmbedClient`/`WeChatEnrollWorker`)做相册扫描 + 人脸聚类 + 微信头像锚点入库;微信头像配方与「锚点 embedding 必须端上算」见 memory `wechat-avatar-face-enrollment.md`。声纹绑人 ↔ 人脸标注 ↔ 微信联系人三者打通到同一 `Person`。
  204 +
  205 +**全相册自动索引 / 分层管线(v0.8 新增)**:把手机**整个相册**自动跑成可搜索内容。核心矛盾:本地 VL(Qwen2.5-VL-3B)真机 **~30-40s/张**,几千张全量 VL 按天计 → **分层**。`GalleryScanner` 游标遍历 MediaStore 全量,**只存 `content://` uri 不拷文件**(拷一份撑爆私有目录),`mediaId` 去重增量;`photos` 加 `source`/`mediaId`/`scanState`/`captionEmbedding`(Room **v14**)。**Tier-0 `PhotoFaceWorker`**(15min,battery-not-low):扫描 + ML Kit 人脸 + 512d emb + GPS,秒级全量铺好,立刻按人/时间搜;**Tier-1 `PhotoVlWorker`**(15min,**+charging**):Qwen-VL 场景描述 + caption 语义向量,优先级队列(有人脸>近期),慢慢补。`scanState`:`0 待索引→1 人脸已铺→2 已出描述`;imported 源(手动导入)走同管线,只是 `decode` 走 file path。**搜图**:关键词(caption+人名 LIKE,中文子串比 FTS4 靠谱)+ 语义(`EmbedClient` 打 llama-swap `embed` 模型出 query 向量 → 全库 caption 向量余弦 top-K;没配 embed 模型则优雅降级,只用关键词)。**VL 控制 `PhotoVlState`**(singleton,paused 持久化):相册页运行中显「暂停/停止」、空闲显「立即理解/继续」,正在 VL 的格子转圈,格子角标 待索引/待理解/已描述;暂停连充电时的周期 worker 也尊重。详见 `HANDOFF.md` §四 photolog 段。
203 206  
204 207 技术栈:Kotlin 2.1 + Compose BOM 2024.12.01 + Room 2.6.1 + WorkManager 2.10 + OkHttp 4.12,AGP 8.7.3,minSdk 30 / targetSdk 35(Android 14 强制 `foregroundServiceType` 起步),arm64-v8a 单 ABI。
205 208  
... ... @@ -266,12 +269,11 @@ Foreground Service (foregroundServiceType=microphone, WAKE_LOCK partial)
266 269  
267 270 完整待办、估时、技术路线见 `lifelog-recorder/HANDOFF.md` §五。
268 271  
269   -✅ **v0.2–v0.7 已完成**:Opus 编码 / BOOT 自启 + 电池白名单 / FTS4 中文搜索 / 段播放 / **声纹在线聚类** / **会话级纪要(按时间间隔切会话)** / **底部 4-tab + 子 tab UI** / **App 内对话(本地 2B/4B + Hermes)** / **本地 LLM 栈(llama-swap)** / **Room 迁移(去 destructive)** / **block-based diarization-first 录音管线(v0.7,攒块→整块分轮→逐 turn 转写)** / **声纹纠偏 L1 冻结 anchor + L2 多 anchor 重建** / **设置页(`SettingsScreen`:纪要模型后端 / 聚类阈值 / llama-swap 端点 / 电池豁免)** / **photolog 人脉 CRM 层(人物档案 + 相册人脸 + 微信通讯录/朋友圈/AI 印象)**。
  272 +✅ **v0.2–v0.8 已完成**:Opus 编码 / BOOT 自启 + 电池白名单 / FTS4 中文搜索 / 段播放 / **声纹在线聚类** / **会话级纪要(按时间间隔切会话)** / **底部 4-tab + 子 tab UI** / **App 内对话(本地 2B/4B + Hermes)** / **本地 LLM 栈(llama-swap)** / **Room 迁移(去 destructive)** / **block-based diarization-first 录音管线(v0.7,攒块→整块分轮→逐 turn 转写)** / **声纹纠偏 L1 冻结 anchor + L2 多 anchor 重建** / **设置页(`SettingsScreen`:纪要模型后端 / 聚类阈值 / llama-swap 端点 / 电池豁免)** / **photolog 人脉 CRM 层(人物档案 + 相册人脸 + 微信通讯录/朋友圈/AI 印象)** / **存储 TTL(超期删 .opus,文字永留)** / **全相册自动索引(v0.8:MediaStore 全量扫描 + Tier-0 人脸/Tier-1 VL 分层管线 + 关键词/语义搜图 + VL 暂停/停止控制,Room v14)**。
270 273  
271 274 剩余摘要:
272   -- ⭐ **存储 TTL**(删超 N 天 .opus,文字永留)——设置页尚无「存储用量 / 暂停时段」
273   -- ⭐ **多 anchor 平均**(连选多段标同一人提高匹配率)
274   -- ⭐ **回链 lemonPCRM**(Transcript 实体 → GraphStore `MENTIONED_IN`,v2)
  275 +- ⭐ **语义搜图落地**(v0.8 已接 `EmbedClient`,但需在 Pixel llama-swap 配 `embed` 模型才生效;中文 embedding GGUF)
  276 +- ⭐ **回链 lemonPCRM**(Transcript / 照片 caption 实体 → GraphStore `MENTIONED_IN`,v2)
275 277  
276 278 ### 与 lemonPCRM 的关系
277 279  
... ...