-
- key 纯端上推导 MD5("1234567890ABCDEF"+uin)[:7](imei 用默认值,uin 从 shared_prefs) - SQLCipher 参数 cipher_compatibility=1/page_size=1024 + postKey hook + 候选 key 试开 - su 拷库 → 读 message 表 type=1 → wechat_messages;单人/批量接线 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-
- §七 踩坑清单加两行:app 申请的 su 默认在本 app 挂载命名空间(读不到别 app /data)→ --mount-master; app-su 的 PATH 为空(ls/cp/find 全失败)→ export PATH - §四 加「微信朋友圈:端上 root 直读」小节:SnsMicroMsg.db(明文)+sns 缓存图(snsb_)路径、 WeChatSnsImporter 读取流程(media id 子串归属/正文提取)、按条存 moments/<wxid>/ 不进相册、幂等 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-
- 主线改为 lifelog-recorder(纯端上 Personal CRM),lemonPCRM(server/frontend/packages) 标已废弃, 删掉 CLAUDE.md 里所有服务端章节(ACP/Master-Sub-Agent/GraphStore/server 微信链路) - 加「App 即 Personal CRM:与旧 lemonPCRM 能力对比」+ 6 项差距 + 「Transcript→内部 Person」方向 - HANDOFF §五:存储 TTL/设置页标✅;「回链 lemonPCRM」→「内部 Transcript→Person」; 新增「端上 CRM 补齐 TODO」P0–P3 清单 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-
把整个手机相册自动跑成可搜索内容(v0.8)。本地 VL ~30-40s/张, 全量是按天计的长任务 → 分层:快的全量先铺,慢的 VL 排队慢慢补。 - GalleryScanner:MediaStore 游标扫全量,content:// uri 原地登记不拷文件, mediaId 去重增量;photos 加 source/mediaId/scanState/captionEmbedding(Room v14) - Tier-0 PhotoFaceWorker:扫描 + ML Kit 人脸 + 512d emb + GPS,秒级全量铺, battery-not-low;Tier-1 PhotoVlWorker:VL 场景描述 + caption 语义向量, 优先级队列(有人脸>近期),充电时跑,尊重暂停标志 - 搜图:关键词(caption+人名 LIKE) + 语义(caption 向量余弦,EmbedClient 打 llama-swap embed 模型;未配置优雅降级) - VL 控制(PhotoVlState):运行中「暂停/停止」、空闲「立即理解/继续」切换, 正在处理的格子转圈,格子角标 待索引/待理解/已描述 - 修 ImageUtil.decodeUri:bounds 预解码 decodeStream 在 inJustDecodeBounds 下按设计返回 null,原 `?:` 误判致每张提前 return(人脸全跑空) 迁移 13→14 纯增量:老的已处理照片直接标 scanState=2 不重跑。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-
更新录音管线描述(07f3d22 的架构改动): - §一/概述:一句话管线改为「攒块→整块 pyannote 分轮→逐 turn 转写+认人」,标注无实时字幕 - §四 架构链路:RecorderService 攒块 + BlockBuffer/BlockProcessor + Channel 解耦 + 崩溃 listPending; 补块边界参数(SILENCE_MS=5min / MAX_MS=10min);标注旧 DiarizationWorker 已删 + WM 10min 上限 - 文件地图:加 BlockBuffer/BlockProcessor/DiarizationEngine;SpeakerClusterer 标 L1/L2 - 接口表:VAD→BlockBuffer→BlockProcessor→DiarizationEngine→逐 turn 入库 - 声纹纠偏 L1 冻结 anchor + L2 多 anchor 重建;阈值默认 0.45 - changelog 加 v0.7;多 anchor 待办标完成;logcat tag 加 BlockBuffer/BlockProcessor - 版本号 v0.6 → v0.7 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-
- §六 加最易混淆点:纪要 WorkManager periodic 每 15min(Android 硬下限, 改间隔须 UPDATE 策略)自动扫已结束会话;UI「会话间隔 10min」是切分规则, 与跑纪要频率无关。附 502 并发坑的解法(AtomicBoolean + 7min 预算 + 不 retry)。 - 文件清单:SummaryScheduler/Worker 描述同步(互斥/预算/15min)+ 补 SummaryProgress。 - 纪要后端接线改为「UI 可选 2B/4B/Hermes,经 ChatConfig 解析」。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-
- CLAUDE.md:版本表 v0.1→v0.6;架构骨架补 SpeakerClusterer 在线聚类、 5-tab UI、会话级 SummaryWorker、ChatScreen 多端点;新增「本地 LLM 栈」段 (llama.cpp HEAD + llama-swap 8080 跑 Qwen3.5 2b/4b);未来计划标注已完成项。 - HANDOFF.md:§一 现状改写;§二 文件清单补 chat/ summary/ SpeakerClusterer/ HermesClient,AppDatabase 改 v3+迁移;§五 加 v0.6 已完成项; 新增「§六 本地 LLM 栈」接手要点(部署/接线/thinking 坑/G3 实测速度)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-
记录 2026-06-04 打通的 lifelog 纪要端到端链路与两项优化: - HERMES_AGENT_PIXEL_SETUP.md 新增 §3「作为 lifelog 纪要后端」: 开 api_server(API_SERVER_* env,key 与 lifelog 一致)、精简 token (platform_toolsets.api_server=[] + skills.platform_disabled → 12,500→399)、 Magisk service.d 自启(su 在 /system_ext/bin/su 的坑、动态 uid)、端到端验证 - HANDOFF.md §五:第5项 gateway 自启标记完成(service.d,非 Termux:Boot), 补 token 精简必做项、Kimi provider 配置交叉引用、api_server 出口被掐排错 API key 用占位符,未写真实凭证。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-
设备侧 hermes api_server platform 配置(HANDOFF §五新增详细步骤): - ~/.hermes/.env 加 API_SERVER_ENABLED + HOST + PORT + KEY + MODEL_NAME - pip install anthropic(kimi-for-coding 走 Anthropic-compat 协议层) - setsid + disown 启动避免 adb shell 退出时 SIGTERM 杀掉 gateway App 侧: - BuildConfig 增加 HERMES_API_URL / HERMES_API_KEY / HERMES_MODEL - keys.properties.example 同步样本 - HermesClient.kt: minimal OkHttp 客户端,POST /v1/chat/completions + Bearer auth;JSONObject 拼请求 / 解 choices[0].message.content - SummaryWorker.kt (CoroutineWorker): - 滑动 1h 时间窗;speech < 60s 直接 skip - 拉 Transcript + speaker name 拼用户提示 - system prompt 要求 markdown 出「主题概括 / 关键要点 / 人物 / 地点 / 待办」 - 写 Summary 表(windowStartTs, windowEndTs, markdown, model) - SummaryScheduler.kt: enqueueUniquePeriodicWork 每小时(KEEP)+ OneTimeWorkRequest(按钮触发) - LifelogApp.onCreate 启动时 schedulePeriodic - MainActivity: 新「纪要」section + 「现在跑一次」按钮 + SummaryCard 列表 - AndroidManifest android:networkSecurityConfig 开 127.0.0.1 + localhost cleartext 豁免(OkHttp 默认禁 HTTP,loopback 也禁) 实测:60min 窗 / 172 段 / 709s 语音 / Kimi 14.3k prompt token / 649 completion → 一份 markdown 纪要正确分辨出「电影解说 + 修仙网文」两段 内容,按要求列出主题/要点/人物/地点/待办 5 个 section。 HANDOFF.md §五 LLM 纪要 worker 移到「已完成」;下一档是存储 TTL / 设置页 / 多 anchor 平均 / lemonPCRM 回链 / hermes 自启。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
-
闭环 v0.3 的两个自然延伸: - SegmentPlayer.kt: MediaPlayer 包装,Opus 段原音播放 Android API 21+ MediaPlayer 原生解码 Ogg-Opus,验证 logcat 见 「MetaDataBase: OpusHead.. mime: audio/opus brte: 16000 #chn: 1」 音频属性设 USAGE_MEDIA + CONTENT_TYPE_SPEECH,单实例复用 - SpeakerMatcher.kt: backfillAll() 遍历所有有 embedding 的段,重算 最近邻 profile + cosine 距离;threshold 0.5 复用 RecorderService 里的逻辑;只更新变化的行(避免 Room 全表写) enroll 落库后 MainActivity 自动 launch 调用 - MainActivity: 时间轴 tap row 不再直接弹 enroll dialog,改为 ModalBottomSheet 出「▶ 播放原音 / 记为说话人」二选一 TimelineRow 加 isPlaying 状态指示,正在播放的段前缀 "▶ " DisposableEffect 在 onDispose 调 player.stop() 防泄漏 HANDOFF.md §五 更新(v0.4 移到「已完成」),加 SegmentPlayer.kt + SpeakerMatcher.kt 到文件清单。 实测(Pixel 8 Pro,电影 audio 输入): - 段 #11-14 显示 "未匹配 (0.09-0.13)" — 电影角色声纹与 Me anchor cosine 远低于 0.5 → 正确拒绝匹配 - 段 #13 19s opus 文件 MediaPlayer 立刻播放,文件 ~38 KB Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
-
声纹(用户语音里提了 3 次的 feature): - SpeakerEmbedder.kt: sherpa-onnx SpeakerEmbeddingExtractor 包装 3dspeaker CAMPPlus 16k zh-cn 模型(28 MB int8 ONNX),192 维 embedding - ModelDownloader.ensureSpeakerModel(): 首次启动从 hf-mirror.com 自动下 - Segment 实体加 embedding/speakerId/speakerSim 三列 - SpeakerProfile 实体(id/name/embedding/sampleCount/createdAt)+ SpeakerDao - RecorderService.handleSegment 每段算 embedding + 与已注册 profiles 算 cosine,threshold ≥0.5 才 assign - RecorderService 通过 speakers.observeAll() 实时 reload profile 缓存 - MainActivity 点时间轴段 → AlertDialog 输入名字 → 创建 SpeakerProfile - TimelineRow 显示 "name (sim=0.xx)" 或 "—" / "未匹配 (0.xx)" FTS4 全文搜索: - TranscriptFts 实体用 @Fts4(contentEntity=Transcript, tokenizer="unicode61") Room 自动建虚表 + 同步触发器,unicode61 把中文字当 token - searchTimeline DAO 查询 JOIN transcript_fts MATCH :query - MainActivity 顶部 OutlinedTextField 实时切换 timelineFlow - sanitizeFtsQuery 给每 token 加 * 做前缀匹配,剥掉 FTS metachars Schema: - AppDatabase v1 → v2 + fallbackToDestructiveMigration(v0.3 dev 数据可丢) - 新增 SpeakerProfile + TranscriptFts 虚表 + Segment 三列 HANDOFF.md §五 更新:声纹 + 搜索移到「已完成」,下一档变成 LLM 纪要 worker / 存储 TTL / 段播放 / 多 anchor 平均 / lemonPCRM 回链。 实测(Pixel 8 Pro Tensor G3,Android 16): - speaker model load: 441 ms - embedding 计算开销 ~10-30 ms/段,跟 paraformer 同期完成 - enroll "Me" anchor → 后续段在 logcat 见 "speaker=Me sim=0.xx" Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
-
让 v1 真能脱离开发环境 24/7 跑的最后三公里: - SegmentWriter 改 Opus(MediaCodec audio/opus encoder + MediaMuxer OGG) ~17× 压缩,~2 KB/s 实测(vs WAV 32 KB/s) 存储预算:8h 语音/天 → ~57 MB/天,~1.7 GB/月(vs WAV 51 GB/月) ffprobe 验证 codec_name=opus, channels=1, OggS magic OK - BootReceiver 监听 BOOT_COMPLETED / LOCKED_BOOT_COMPLETED / QUICKBOOT_POWERON,try-catch 兜底 Android 14+ FG service 限制 - MainActivity 加电池豁免行:dumpsys deviceidle whitelist 实时检测, 未豁免时给「申请豁免」按钮,触发系统 RequestIgnoreBatteryOptimizations 对话框;ON_RESUME 生命周期观察让从设置页回来 UI 自动刷新 - AndroidManifest: + REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 权限 + BootReceiver 注册(含 3 个 boot 相关 action) HANDOFF.md §五 更新待办(v0.2 三项移到「已完成」),加存储预算 + Android 14 BOOT_COMPLETED caveat 段落(Pixel 8 Pro 实测能自动续上, 前提 app 至少开过一次 + RECORD_AUDIO 已授)。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
-
§零 环境铁律:whisper 别当默认 STT、模型别提交、asset 不走 mmap、 线程甜点是 4、AID_INET 必须传、keys.properties gitignored。 §二 核心文件清单:bot 实跑只看 RecorderService.kt + ParaformerEngine.kt + MainActivity.kt,sherpa-onnx Kotlin 绑定整目录原样塞别动。 §三 开发内循环、§四 pipeline 链路图、§五§六 优先级排序的 7 项待办、 §七 踩过的坑清单(VAD 资产 mmap SIGSEGV / silero_vad.onnx LFS 拦截 / paraformer t=8 反慢 / hf-mirror 截断 / am 启动非 exported 服务 / su 切 uid 丢 AID_INET)、§九 接手 prompt。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>