源码模块与修改入口地图
本页将目录、关键文件、跨模块依赖和验证入口对应起来,便于定位变更边界。路径均相对其所属仓库,不代表公开源码下载授权。App 仓库含 iOS、Android、聊天和加密核心;Account 另有当前维护的主仓库,App 工作树附带的 identity/ 是历史快照。二者不能以目录同名认定版本相同,更不能把旧副本整体覆盖到共享服务。
从需求定位负责层
| 需求或故障 | 首要入口 | 继续追踪的依赖 |
|---|---|---|
| 启动页、导航、默认页面 | iOS App/Home,Android MainActivity/StarlineDesign | 本机偏好、页面状态与生命周期 |
| 登录、取消、回跳与重开 | ChatNativeAuth/ChatAuthenticator,Android NativeAuth | ChatAPI/ServiceApi、聊天授权路由、当前 Account OIDC |
| 好友、群、消息、已读与删除 | ChatStore/AppState、聊天 server/database | 关系权限、个人历史边界、事件刷新 |
| 新事、评论、可见性与视频 | MomentsStore/MomentsScreens、moments-repository | 聊天身份、独立媒体与成员关系 |
| 本机任务、收藏与最近访问 | LocalWorkspaceStore/WorkScreens、LocalData | 本机文件/偏好,非企业服务 |
| 记忆、模板与附件 | MemoryStore/MemoryTemplates、MemoryScreens | 设备密钥、格式兼容、本机识别与搜索 |
| 定位、城市与实时共享 | 城市 resolver/ChatLocation/LiveLocationService | 系统权限、目录、IP 城市及显式共享状态 |
| 通话与来电 | ChatCallCoordinator/CallScreen、calls 仓储 | LiveKit、APNs、系统能力、有效 session |
| MLS 独立协议 | ChatEncryptedTransport/chat-crypto/e2ee-delivery | 密钥包、设备身份固定、checkpoint、成员状态机 |
优先沿现有领域入口修改,不直接在视图里另建网络客户端、会话或持久化。页面隐藏只影响展示,服务端授权仍须在资源入口检查;双端使用同一业务服务也不代表本机实现和数据格式一致。
iOS 文件职责
| 相对路径 | 职责与修改注意事项 |
|---|---|
ios-app/project.yml、StarlineWorkbench.xcodeproj |
XcodeGen 配置与实际工程;新增文件、资源和能力后核对二者 |
Sources/App/StarlineWorkbenchApp.swift |
Store 创建、系统来电桥、前后台与 URL 回调分发 |
Sources/Features/Home/HomeView.swift |
根页面组织、本机工作台入口与偏好;不要混入服务端企业权限 |
Sources/Features/Chat/ChatAPI.swift、ChatModels.swift |
HTTP、解码、错误与 Debug base URL;服务字段改动需同步模型 |
ChatNativeAuth.swift、ChatAuthenticator.swift、ChatKeychain.swift |
PKCE/pending、系统授权会话与安全存储;检查取消、进程恢复和提交顺序 |
ChatStore.swift |
账号、关系、消息、pending、已读、事件与位置业务协调;异步操作核对当前账号和范围 |
ChatComposer.swift、ChatThreadView.swift、GroupThreadView.swift |
输入、附件、消息展示及目标会话;文件上传与消息引用是两步 |
ChatCallCoordinator.swift、ChatCallView.swift、CallSystemBridge.swift |
媒体与系统通话桥接;信令 active 不等于轨道可用 |
CityStickerSelection.swift、CityStickerDeviceLocator.swift |
设备城市、IP/手选优先级、缓存与迟到响应保护 |
ChatCryptoDevice.swift、ChatCryptoTrustStore.swift、ChatEncryptedTransport.swift |
独立 MLS 核心包装、设备公钥固定和加密投递;不等于主消息全部接入 |
Sources/Features/Moments/ |
新事模型、Store、发布、详情和媒体;与普通聊天媒体契约分开 |
Sources/Data/MemoryStore.swift、MemoryVaultCrypto.swift |
加密索引、附件、迁移、写入顺序与损坏保护 |
MemoryLocalRecognizer.swift、MemoryLocalSearch.swift |
本机推荐与搜索;系统模型可用性与本机回退 |
Sources/Domain/MemoryTemplate.swift、MemoryGeneratedSchema.swift |
固定模板、字段、长度与生成结构兼容 |
Sources/Features/Profile/MemoryExportDocument.swift |
额外授权后的本机明文输出与临时文件清理 |
Sources/Data/LocalWorkspaceStore.swift |
本机任务、收藏、最近访问的原子快照 |
Sources/Features/Scanner/、Browser/ |
相机/相册识别、网页、账号确认浏览会话 |
除完整路径的表项外,Chat 文件均位于 ios-app/Sources/Features/Chat/,Data 文件位于 ios-app/Sources/Data/。界面改动检查真实视口、键盘、大字号与辅助技术语义;资源名称存在不代表已放进当前 target。当前主设备族是 iPhone,没有 watchOS target,iPad 审核仍需独立验收。
Android 文件职责
下表文件位于 android-app/app/src/main/java/cn/thestarline/workbench/。
| 文件 | 职责与联动范围 |
|---|---|
MainActivity.kt、StarlineDesign.kt |
Activity、Intent、根 Compose 布局、导航与系统 inset |
AppState.kt |
当前账号、页面、事件循环、业务请求、通话与位置协调;注意协程取消和迟到结果 |
AppData.kt |
ServiceApi、错误、SecureFile、LocalData;任务偏好与加密会话/记忆分类不同 |
NativeAuth.kt |
verifier、state、目标 URL、回调与 pending;没有 Debug 本地 Account 例外 |
MessageSendIdCoordinator.kt |
未确认发送的 clientId 复用;确认、换账号和换范围要保持隔离 |
ChatScreens.kt、ChatManagementScreens.kt、ChatMediaBubble.kt |
消息、群、关系菜单、附件读取;引用权限来自服务端 |
MomentsScreens.kt |
新事流、评论、通知、图片/视频发布与播放 |
CallScreen.kt、CallMediaControls.kt |
运行时权限、LiveKit 控件与输出轨道;绑定当前通话 generation |
LiveLocationService.kt、LiveLocationPanel.kt、ChatLocation.kt |
显式共享、前台服务、地图与更新时间;停止采集和删除共享要协调 |
CitySticker.kt、CityStickerLocation.kt、CityStickerSheet.kt |
城市匹配、短时定位、IP 回退、手选、缓存与发送目标检查 |
MemoryTemplates.kt、MemoryScreens.kt |
固定主题、关键词、编辑、搜索和旧字段保留 |
MemoryExport.kt、MemoryExportDocument.kt |
一次性授权、生成输出、系统保存位置与取消清理 |
WorkScreens.kt、ProfileScreens.kt、AccountExtras.kt |
工作台、本机任务/收藏、设置与账号展示 |
ScannerScreen.kt、ScanCameraPreview.kt |
CameraX、ML Kit、图片与手动输入 |
配置还分布在 app/build.gradle.kts、主/Debug AndroidManifest.xml 与资源目录。主清单关闭自动备份并禁止明文网络,Debug 另允许本地 API;这一网络例外不改变原生授权 URL 信任。当前 Kotlin、AGP、Gradle 和 JDK 组合应实际验证,不能把工具链声明直接当作可构建保证。
聊天与加密服务
| 相对路径 | 职责 |
|---|---|
chat-service/src/main.mjs |
环境变量、生产启动条件、监听和信号退出 |
src/server.mjs |
HTTP 解析、授权、资源路由、长轮询、模型桥接与定时协调 |
src/database.mjs |
SQLite 表、启动迁移、事务、关系、消息、媒体、事件与设备会话 |
src/moments-repository.mjs |
新事可见范围、互动、通知、媒体与孤立资源清理 |
src/call-repository.mjs、call-media.mjs |
通话状态与参与者、媒体 token、房间和成员清理 |
src/apns-voip.mjs、voip-devices.mjs |
APNs 签名发送、设备与 session 关联;提供商接受不等于设备到达 |
src/city-location.mjs、city-stickers.mjs |
可信来源与离线城市、白名单素材和媒体去重 |
src/memory-recognition.mjs |
配置模型的结构生成与固定补充;请求文字会离开设备 |
src/e2ee-verifier.mjs、e2ee-delivery.mjs |
WASM 结构校验与设备密钥包、范围、密文、ack 状态 |
src/enterprise-*、src/enterprise/ |
共享后台的独立星企领域;不构成星线 App 个人前台功能 |
chat-crypto/src/、include/、scripts/ |
Rust OpenMLS、C ABI、平台与 WASM 构建;状态快照与设备私钥由端侧保护 |
表中 src/ 均相对 chat-service/。媒体 BLOB 与消息元数据存于同一 SQLite 数据集;数据库构造会迁移,不能为了检查 schema 随意用新服务打开真实旧库。恢复测试使用副本和配套密钥,见故障手册。
Account 权威源与历史副本
Account 的当前 server/config.ts、store.ts、notify.ts、captcha.ts、oidc.ts、admin-policy.ts 与 main.ts 分别定义配置、MySQL/PII、投递、人机验证、协议、管理策略与启动。现行代码还包含资料、扫码/手机授权、小程序、实名与开放接口等模块;这些不能凭 App 历史副本的文件清单推断缺失。
目前可确认的差异有:主迁移为 001–007 并有 PII 加密审批;生产邮件为腾讯 SES、短信为阿里云;管理员通行密钥开关由环境精确值读取;开发注册也有 captcha 门禁。App 副本中的本地聊天客户端登记脚本在当前 Account 主仓库不存在,旧注册 fixture 也没有新的 captcha 请求字段。应先修订隔离夹具并验证,不能称为现成一键联调。记忆转出 redeem 契约在当前主源码缺失,不能用旧副本证明跨服务可用。
修改共享身份时,应在当前 Account 仓库执行其类型与测试检查;修改 App 侧协议时同时核对目标部署的实际契约。两个仓库的版本和授权是独立边界,文档发布不等于身份服务升级,文件拷贝也不是协议迁移方案。
修改入口与验证命令
| 修改类型 | 最少关联入口 | 进一步验证 |
|---|---|---|
| 原生授权 | iOS ChatNativeAuthTests、Android NativeAuthTest、服务端 native-auth |
系统浏览器、取消、冷启动、401/断网与真实目标平台 |
| 发送与关系 | chat、group、management、media 测试;双端发送状态 | 丢响应重试、三账号拒绝、删除历史和双端已读 |
| 新事 | moments 测试与两端发布/媒体界面 | 可见范围、屏蔽、视频 Range、取消与孤立资源 |
| 本机记忆 | MemoryLocal/MemoryStore、MemoryTemplates/MedicalMemory | 损坏库、丢密钥、旧字段、多行、附件与重开 |
| 城市/位置 | city-location、city-stickers、live-location 及原生 resolver | 权限拒绝、缓存、换账号/会话、停止、前后台 |
| 通话 | calls、call-media、apns-voip、voip-devices | 两台真机音画、跨网、后台、锁屏与多设备 |
真实命令入口示例,本次未执行:
node --test chat-service/tests/native-auth.test.mjs
node --test chat-service/tests/group.test.mjs chat-service/tests/management.test.mjs
node --test chat-service/tests/memory.test.mjs chat-service/tests/moments.test.mjs
zsh ios-app/scripts/test-native-auth.sh
cd android-app
./gradlew :app:testDebugUnitTest --max-workers=1
cd identity
npm run typecheck
npm test
npm --prefix client run typecheck
最后一组必须在当前 Account 源码上下文执行。文档统一构建入口位于 technical-docs/build.mjs、technical-docs/check.mjs;App 的内容与导航继续从 app-download/docs/ 读取,作为全产品文档站的一个产品目录。构建只处理公开静态资料,不运行产品后台。它们的通过只能说明文档产物,不能成为业务验收。完整模块×故障矩阵见测试矩阵,配置与发行门禁见配置参考和发行清单。