# 任务列表、空间统计与清理

## 查看本地任务

从保存接收文件的目录开始扫描：

    ./bin/moonrelay tasks ./results

JSON 列出 SSH 接收任务、HTTP CLI 下载任务及目录传输清单。每个文件任务包含长度、已保存偏移、是否持锁、最终文件字节数、恢复文件占用和可回收字节数；总计在最外层。统计为文件逻辑字节数，不等于文件系统的实际分配块数。无法读取或不完整的状态列在 issues 中，不计入已确认总量。目录清单单独计数，其有效载荷由子文件任务统计，避免重复计数。

完整任务的最终 SHA-256 会被重新核对，因此大文件列表可能需要时间。active 表示当前持有任务文件锁；SSH 单个协议请求之间的任务可能显示为 partial。清理无论是否 active 都拒绝未完成任务。扫描不会跟随符号链接，也不会查询远端服务。

## 回收已完成任务的重复内容

指定一个最终文件，或一个由 MoonRelay 接收完成的目录：

    ./bin/moonrelay clean ./results/model.bin
    ./bin/moonrelay clean ./results

SSH 任务会先验证最终文件，再删除分块副本和临时拼接文件；最终文件保持原样。保留少量 identity、cleaned 标记和锁文件，以便 status、重复 push/pull 和目录清单仍能识别已完成内容。中途退出后可重跑 clean 完成剩余清理。目录整体由清单预检，每个文件独立持锁清理；回执给出实际回收的逻辑字节数。外部修改或权限错误可能使目录清理中途停止，重跑可继续。

HTTP 下载只删除已完成任务旁的 .part.json 及空临时文件，不删除最终下载文件。未完成、持锁、损坏或身份不明的任务均拒绝清理。没有自动过期删除或全盘批量清扫。

## 管理 HTTP 服务端上传仓库

    ./bin/moonrelay store-tasks ./data

HTTP 上传的内容本身存放在分块中，删除它会让资源不可再下载；它没有另一份可保留的最终文件。停止使用该仓库的 HTTP 服务后，显式指定资源 ID 并携带删除数据选项：

    ./bin/moonrelay store-delete ./data 12 --delete-data

运行中的服务持有仓库锁，删除会被拒绝。删除保留很小的 deleted.json 标记；旧资源随后返回 404，ID 不再复用。store-tasks 中 active 表示整个仓库正由服务持锁，不表示每个资源此刻都在传输。stored 表示上传偏移已达到声明长度，不是外部可信哈希认证。

## 版本兼容

SSH 两端使用 0.4.0 或支持相同能力握手的版本。传输前会检查协议及目录、完成清理能力；不兼容时明确停止。0.3.0 接收端需要升级。清理标记属于持久恢复状态，请不要手工删除后仍期待旧状态可用于断点续传。

删除或清理中途退出时，可重跑同一条命令。删除标记已落盘、分块尚未清完的 HTTP 资源仍返回 404，不会影响新上传分配新 ID；停服后重跑 store-delete 释放其剩余内容。

任务命令会把相对路径、点目录和尾分隔符解析为绝对路径，确保恢复目录始终位于目标旁边。任务路径不接受父目录穿越或盘符相对路径；Unix 上也不接受反斜杠文件名。目录传输同样使用这一规则。
