# 桌面录音页：直接录音

## 入口与行为

- 日历下方新增“开始录音”；保留“导入历史音频”和“全天候录音”（手机功能介绍）。
- 仅用户点击后申请麦克风权限并开始；不采集系统音频、摄像头或屏幕。
- 录音开始时间取实际时间，日历切换至今天。切换到其他插件页面不停止录音，显示浮动状态和“结束并保存”。
- 第一栏录音入口在实际采集期间显示 7px 红点及“录音中”，不改变导航尺寸。悬浮或键盘聚焦显示“本机正在录音”、实际采集时长和查看提示；移开、失焦、Escape、点击或停止录音立即关闭提示。点击仍进入录音页，不会停止录音。
- 录音入口红点和淡红底晕、开始按钮的麦克风图标、页面状态红点、浮动状态红点及导航悬浮提示采用同一 2 秒呼吸节拍。仅图形亮度/缩放变化，文字、时长和布局不参与动画；后打开的提示按本次录音开始时间对齐节拍。系统“减少动态效果”开启时保留静态标识，关闭后重新同步。
- 导航提示只读取当前账号、当前环境、当前 Web 窗口的真实录音状态。准备、保存、上传阶段不显示录音红点；账号切换、隐藏或锁定导航时不泄漏旧状态。尚未接入手机或其他设备的录音状态，详见 `recording-presence-handoff.md`。
- 免费版 5 分钟、VIP 1 小时、SVIP 2 小时，与 Flutter `AudioLongRecordingManager` 一致。会员信息无法确认时不录制；达到上限自动停止并保留待提交录音。
- 结束后自动提交到现有录音导入队列，后续上传、声纹识别、转写沿用现有 Audio 服务。接收成功不代表转写完成，可通过“查看处理进度”进入任务列表。

## 数据与故障边界

- AudioWorklet 采集单声道 PCM；每秒保存到当前 origin 的 IndexedDB，结束时补齐最后不足一秒的数据，生成 PCM16 WAV。未使用不受现有导入合同支持的 WebM，也未把短背景音录音器的内存缓存当作长录音。
- 本机记录按环境和账号分区。录音开始不写入云端；结束提交使用实际用户 ID，禁止使用含糊的 `0` 归属。
- 上传失败保留本机记录，可重试上传或下载备份。确认插件主机已接收并持久保存上传任务后才删除浏览器副本。重试使用稳定的文件名和开始时间，复用导入队列的恢复/去重逻辑。
- 麦克风断开、处理器故障、系统中断或本地写入积压会停止录制；已有内容保留待用户处理。磁盘配额失败时暂存未写入的尾段，提示不要关闭页面，并提供下载备份。
- 同一 origin 的多个预览窗口通过 Web Locks 互斥，防止同时录制或提交另一窗口尚在写入的录音。
- 切换账号/环境或退出登录会停止旧录音并中止未完成上传；旧记录仍归旧账号，不能在新账号界面读取/提交。

## Web 与原生录音的区别

- 仅在当前浏览器/预览 origin 保存。更换浏览器、清理网站数据或浏览器存储被回收会影响恢复；重要录音应下载备份。
- 录音期间申请屏幕唤醒锁（浏览器允许时），并设置关闭/刷新提醒；不保证系统休眠、浏览器崩溃或强制退出后继续录音。意外退出后恢复的是已提交的本地片段，最近不足一秒的尾段可能无法保留。
- 桌面本轮复用既有 WAV 导入链路，未改移动端、原生 Arkme 客户端或 Audio 后端。当前提交在导入任务中呈现，不冒充移动端原生录音会话来源。
- 固定预览端口为 3098，不更换 Keychain 服务或使用客户端的运行目录。

## 验证

- `tests/direct-recording.test.ts`：权限/会员失败、单次启停、限时、本地恢复、上传失败重试、账号切换、尾段保留、WAV 格式及 AudioWorklet 分段。
- Chromium 隔离验证使用 `--use-fake-device-for-media-stream` 模拟音源；真实 AudioWorklet + IndexedDB + Web Locks，覆盖跨页面、双窗口、刷新、下载、权限拒绝和明暗/窄屏。
- 模拟音源及拦截上传不等于真实账号云端转写验收；实际账号上传、转写及长时间稳定性需要单独验收。

本轮结果（2026-09-19）：构建和类型检查通过；录音相关 661 项通过、1 项既有跳过。固定 3098 的真实登录页面已验证入口位置、真实会员状态读取、模拟麦克风录制、切换到 DSH 对话后操作浮动状态条、停止保存和失败后保留下载；测试音频上传全部拦截，没有写入用户的云端音频。扩大聊天回归 327 项通过，另外 2 项既有 `mention-read-status.tsx` 空上下文失败与修改前基线一致，未在本轮改动。

后续导航状态验收（2026-09-19 09:35）：新增导航状态、原有导航入口、录音和主题配色共 7 个测试文件 96 项通过；构建、类型检查和 diff 检查通过。固定 3098 已登录页面通过真实采集链路＋模拟麦克风验证红点/文案、悬浮时长、明暗模式、导航尺寸不变、跨页面保持、键盘聚焦/Escape、停止后清除及上传失败本机保留。测试音频上传全部拦截，没有真实麦克风采集或云端音频写入。浏览器仍复现既有 DSH 页面切换的空 `defaultView.Event` 异常，已记录在桌面回归文档；不属于本次录音状态修改，未宣称全站无异常。

呼吸动效验收（2026-09-19）：8 个相关测试文件 101 项通过，类型检查、构建和 diff 检查通过。固定 3098 的已登录页面在明暗主题各采样 6 帧，确认五处可见视觉层按 2 秒周期变化、文字不动、导航尺寸不变；切换页面后的浮动提示同频，动态切换“减少动态效果”后正确静止/恢复同步，停止后全部动效移除。模拟音源和上传拦截边界不变，未采集真实麦克风或写入云端音频。既有 DSH 切页 `defaultView.Event` 异常仍存在，不属于本次动画验证通过的范围。
