• - app 名称:Lifelog → Life OS(strings.xml + AndroidManifest 硬编码修正)
    - 图标:红色关系网络 → 深紫渐变轨道设计(人物居中 + 双同心环 + 卫星节点)
    - 新增 TimelineScreen:录音/微信/朋友圈/照片四源按时间混排,日期分隔头,来源过滤 chip
    - 底部导航加「时间轴」tab(第三位:对话/人物/时间轴/录音/相册/设置)
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
    yibo authored
     
    Browse File »
  • Adaptive Icon:ic_launcher_background(#1A0A3C→#7C3AED 135° 渐变)
    + ic_launcher_foreground(白色麦克风胶囊体 + 3条声波纹路 + 弧形支架
    + 右上角红色录制圆点)。minSdk=30 只需 mipmap-anydpi-v26,无需 PNG。
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
    yibo authored
     
    Browse File »

  • 把整个手机相册自动跑成可搜索内容(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>
    yibo authored
     
    Browse File »

  • - Person 加 realName/resume,档案页可编辑(PersonProfileScreen);DB 迁移 12→13
    - 通讯录池新增手机系统通讯录来源(READ_CONTACTS / ContactsContract,contactRef phone:<id>),
      按手机号/姓名跨源自动合并去重(PersonDao getByPhone/getByExactName/setPhone/updatePhoneInfo/updateProfile)
    - PhotologScreen/PhotologViewModel 支持两源池子
    - AndroidManifest 加 READ_CONTACTS 权限;同步 CLAUDE.md
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
    yibo authored
     
    Browse File »

  • - LifelogRetriever:「lifelog 模式」开关下,发送前本地检索纪要 + 转写拼成
      system context 注入(本地 2B/4B 和 Hermes 通用,不落库)。中文用 bigram +
      重叠打分召回(FTS4 unicode61 对中文短语不命中),命中多者优先、抑制单 bigram 噪声
    - Daos:加 timelineList / searchTextLike / summaries.recentList 三个 suspend 检索方法
    - ChatViewModel:会话状态搬进 VM(随 Activity 存活)。修复切 tab 回来:
      流式请求被取消(viewModelScope 不取消) / 变成新会话 / lifelog 开关重置——
      currentConvId / selectedTargetId / lifelogMode 均持久化到 prefs,重启也记住
    - 键盘 inset:Activity setDecorFitsSystemWindows(false) + manifest adjustResize
      + Scaffold imePadding,键盘弹出时整个界面(含底部 tab)抬到键盘上方、可见
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
    yibo authored
     
    Browse File »

  • 设备侧 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>
    yibo authored
     
    Browse File »

  • 让 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>
    yibo authored
     
    Browse File »
  • Pixel 8 Pro 上的本地 lifelog 应用,v1 核心闭环:
    
    - 前台服务 (foregroundServiceType=microphone) + AudioRecord 16k mono PCM
    - Silero VAD on-device 切段(500ms 静音切、300ms 最短、30s 强切)
    - sherpa-onnx + paraformer-zh int8 本地 ASR
      Tensor G3 实测 ~25× realtime,<200ms 处理 1-10s 段
      whisper-small 0.6× 跑不动,paraformer 是甜点选型
    - Room (Segment + Transcript + Summary) + Compose 时间轴 LazyColumn UI
    - 232 MB 模型首次启动从 hf-mirror.com 下载到 app filesDir
    - 讯飞 中文识别大模型 WebSocket 客户端备用(云复核 fallback)
    
    依赖:
    - sherpa-onnx v1.13.2 Android jniLibs (arm64-v8a, ~34 MB)
    - Silero VAD ONNX (~629 KB),sample.wav (3 MB) 内嵌资源
    - AGP 8.7.3 / Kotlin 2.1 / Compose BOM 2024.12.01 / Room 2.6.1
    
    后续待办(按用户语音里提到的优先级):声纹识别 / Opus 编码 /
    FTS5 中文搜索 / hermes-Kimi 纪要 worker。
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    yibo authored
     
    Browse File »