# 架构与数据

## 分层

`Sources/Mimi.swift` 管理 NSPanel、WebKit 桥接、菜单栏、快捷键和 AVAudioPlayer。`Sources/PackageStore.swift` 负责教材模型、完整性校验和导入。`web/index.html` 包含界面与纯 JavaScript 自评逻辑。

教材内容不可执行脚本，只通过转义后的文本和本地音频进入界面。应用导航限制在随工具提供的页面内。

## 本地存储

`~/Library/Application Support/Mimi/Packs/<pack-id>` 存放教材。`progress.json` 保存学习记录。窗口位置和当前教材由 UserDefaults 保存。

记录键为 `pack-id--lesson-id--contentRevision`。文字排版更新可保留修订号；改变音轨学习内容应增加修订号。包版本不直接参与学习记录键。删除教材不删除记录。

## 自评与进度

无提示听懂、借助提示理解分别记录。进度按唯一音轨统计，有过无提示理解者归入“曾无提示理解”，否则有辅助理解记录者归入“仅借助提示理解”。两类互斥，总和为已自评段数。播放、跳过、关闭不自动记完成。进度不是客观掌握率。

## 事件边界

小猫点击只展开；拖动消费完整鼠标手势，不触发点击。确认后自动播放是显式设置。音频输出设备改变时暂停，避免自动切到扬声器。

## 发布边界

源码与课程分发独立。软件包不含课程、个人记录或服务端密钥。当前下载版仅实机检查过 Apple Silicon；Intel 源码构建、多屏、全屏和设备切换仍需持续验证。
