WebSocket TTL cleanup 最小骨架

这页先把 revoke 记录的 expires_at 推进到可执行的最小 cleanup 动作。

当前最小 cleanup 语义

先把 TTL、cleanup 动作和清理范围说清楚。

GET /api/coach/token-cleanup:查看当前 revoked token 与 storeRuntime
POST /api/coach/token-cleanup:执行最小 TTL cleanup
cleanup.cleanedCount:返回本次清掉了多少过期 revoke 记录
revoked token:当前按 expires_at 判断是否该回收
当前先只清 revoke 记录,不清 session family

执行边界

这层已经开始能 cleanup,但仍不是正式调度系统。

这层是最小 TTL 清理 / 过期回收骨架,不是正式 cron、队列任务或分布式清理系统。
先把 expires_at 和 cleanup 行为接起来,让 TTL 不再只是说明字段,而是开始有最小执行动作。
后面如果继续推进,再补定时任务、跨节点 cleanup 和 family 历史归档。