# 设备录音状态列表

录音日历的导入历史音频按钮下方展示当前账号的设备录音状态；本机直接录音控制和上传反馈继续显示在列表下方。该列表不受选中历史日期影响，不包含远程启停，也不负责采集端状态上报。

## 数据链路

`ArkmeRecordingPresence` → `recordings.presence` → `RecordingService.recordingPresence` → 当前账号鉴权的 `POST /api/v1/audio/recording-presence/list`（空请求体、绕过缓存）。后端返回值投影为仅供展示的字段，不透传写入凭证或任意扩展字段。

Audio 已合入 master 的合同是轮询，不是 SSE。按 `poll_interval_ms` 查询，页面隐藏/离开时暂停，恢复前台立即查询；账号或环境改变时清空列表并取消旧请求。请求有30秒截止时间，轮询请求不重叠。

## 展示规则

- 按开始时间、录音 ID 稳定排序，每个录音实例单独显示设备名称、模式、状态和时长；长名称省略并提供完整 title。
- fresh + recording 时，以 `elapsed_ms`、`duration_anchor_at`、`server_now` 和本机单调时钟推算时长；不使用两端墙上时钟之差。
- 暂停、中断、异常时不继续计时。达到 `expires_at` 或后端标记 stale 时显示“状态待确认”，回到最后确认的累计时长，不推断为停止。
- stopped、达到 `visible_until`，或下一次成功快照中已不存在的实例移除。
- 空快照、初次加载、网络失败、能力未启用分别展示。失败保留仍可见的旧记录及同步异常提示；业务码1201显示未启用，等待重试或恢复前台。
- 保留现有本机录音控制；本机采集已接入上报，设备列表保留服务端返回的同 ID 唯一条目。正常录音时以实际本机 PCM 时长校准该条目的计时，不覆盖服务端失联状态。
- 实际停止采集后立即记录当前账号的已停止 ID，并过滤缓存与后续滞后响应中的对应条目；该记录跨页面保留，账号或环境切换时清空，避免停止后短暂闪现。

## 验证

新增合同/鉴权分发和组件测试覆盖计时、过期、暂停、多设备、停止移除、断网、超时、恢复前台、能力开关、账号与环境切换。已用实际组件的模拟数据截图检查425px、360px中文列表及300px英文列表。

本地测试不代表生产环境开关已开启或手机已经上报。发布前需在目标环境验证：真实设备开始/停止、双设备并行、断网恢复和账号切换。Audio master 默认开关与部署配置需单独确认。

本轮验证：8个相关测试文件共184项通过，TypeScript检查及diff空白检查通过。另运行 `arkme-service.test.ts` 时有1项既有失败：`maps remote record, scene, and recording search contracts`。其录音搜索fixture缺少当前解析器要求的 `match` 片段。已通过在未修改的739c1a46源码快照上单独执行同一测试复现，未更改无关搜索逻辑或fixture。

独立审查发现并修复宽屏左栏不可滚动的问题。浏览器实测六行月历和多设备列表，在600px高容器中左栏可视568px、内容922px，滚动354px后列表底部与容器底部对齐，未被裁切。

## 最近录音记录

改用 Audio recording-presence/history 的永久采集记录，不再查询上传会话。每页 20 条，按 started_at/recording_id 降序游标分页。表格展示开始时间、设备和平台、长录音/全天候模式、最后确认时长与采集状态。停止或失联记录不消失；失联显示状态待确认，时长不外推。停止时间提示为服务端确认时间。先部署测试后端，再重启 Arkme Dev 服务。
