- .gitea/workflows/build.yml:打 tag 触发构建。代码取当前 ref,素材目录单独从 full-assets 分支叠加 (main 保持 ~8MB 不追踪 assets_hq/assets_small/assets_net,缺它们构建出来的包宠物是空白的)。 用 secret 注入的固定 keystore 签 release 包,构建后发布 APK + version.json 到 Gitea Release。 - app/build.gradle.kts:签名改为从环境变量读取(KEYSTORE_PATH / KEYSTORE_PASSWORD / KEY_ALIAS / KEY_PASSWORD),本地无 keystore 时回退 debug 签名;versionCode 支持 CI 注入,保证单调递增 (更新机制要求新包 versionCode 严格大于已装版本,否则系统拒绝覆盖安装)。 - UpdateChecker.kt:读 Gitea Release API 按 versionCode 判版本 → 下载并校验 SHA256 → 经自带 ApkProvider(content://)拉起系统安装器。项目零第三方依赖,用不了 androidx FileProvider, 故自带一个只读 ContentProvider(只暴露 cacheDir/update 下的 .apk,路径取 basename 防穿越)。 - MainActivity 设置页新增「关于 / 检查更新」入口,下载前先检查「安装未知来源应用」授权。 - AndroidManifest 新增 REQUEST_INSTALL_PACKAGES 与 ApkProvider 声明。 - .gitignore 增加 *.jks / *.keystore / keystore.properties,防止签名文件误入库。
旧实现 consolidate() 用「相似→内容取更长」,实测会把「主人喜欢咖啡」与「主人不喝咖啡了」合并后保留旧内容(新事实被吞)。根因不是相似度阈值,是缺少「矛盾」与「冗余」的语义分类。 - 新增 ReconcileEngine:ADD/SUPERSEDE/UPDATE/NOOP 四动作,纯 JVM 可测 - 新增 MemoryPersistence:三态读(Ok/Absent/Corrupt)、损坏即只读、主键与备份同 Editor 原子提交、独立文件备份(atomic move) - 新增 DeterministicExtractor / MemoryModel:结构化五元组抽取,抽取失败一律降级为「不可比」 - MemoryStore:consolidate 换核、add/applyOps 走 reconcile、审计 200->1024、MAX_CARDS 300->600 - FloatingPetService:写入被拒时不推进 seed_memory_v,否则 8 条种子卡会静默覆盖用户记忆 - MainActivity:整理移出主线程、列表分片渲染、失败可见(Log.e + FAILED 审计)、损坏态显示「读取失败」 - 新增 60 条单测(44 引擎 + 16 持久化) 本提交同时修复:合并正文被 token 重组改坏(数据损失)、supersededBy 写成字符串 "null" 导致遗忘分支从未生效、R4 合并逐次累加导致 600 卡场景 JSON 膨胀至 35MB 并整理失败、存储解析失败被当作空导致记忆静默重置为 8 条种子卡。
- 106 动画 + 2366 表情包 + 语义标签 - 三层记忆 / 心情系统 / 9 可配置插件 / 10 技能 - DeepSeek 对话直连 + MCP/HTTP 接入 + 接入文档 - 动画随机链 + 物理引擎 + 贴边碰撞校准 - 大资源(动画webp/表情图)由 scripts/ 再生成,不入库