# PRPNet 统一客户端 0.2

统一终端管理器：为 GFPS、GSRPS、GFPPS 和后续使用已注册引擎的项目提供项目开关、设置面板、单任务调度、进度与日志。

**打开界面不会自动运行。默认三个项目全部 OFF，调度停止。** 本机配置沿用原来的用户名、机器名、服务器地址、程序路径和任务目录，不复制、删除或重置已有任务。

完整包包含 Windows/Linux x86-64 的 GFPS、GSRPS、GFPPS 四组 CUDA 架构版本（sm_86 / 89 / 100 / 120），以及 PRST CPU。默认开启硬件自动选择；启动界面会读取公开 Queued 状态和检测本机硬件，但不会领取任务。

## 启动

Windows 双击 `start.cmd`，或在 Windows Terminal / CMD 中执行它。已安装依赖的本机可直接使用；首次在其他电脑安装时运行 `setup_windows.cmd`。

建议窗口至少 100 列 × 32 行，80 列窄终端仍可操作，表格和设置区可以滚动。支持鼠标点击、Tab、方向键及快捷键。

Linux / WSL / SSH：

```bash
sh setup_linux.sh
sh start.sh
```

Windows 与 Linux 使用独立配置和虚拟环境。Linux 虚拟环境默认放在 `~/.cache/prpnet-console/venv`，避免 WSL 的 `/mnt/d`、`/mnt/e` 文件系统不支持符号链接的问题，可用 `PRPNET_VENV` 指定其他 Linux 路径。完整包会自动选择 `bin/windows-x64` 或 `bin/linux-x64` 中的程序，安装脚本会设置 Linux 执行权限。关闭自动选择后，可以自行指定现有程序路径。

若系统 Python 缺少 ensurepip/venv，请先激活已有 Conda 环境，或设置 `PRPNET_PYTHON=/路径/python` 再运行安装脚本；也可自行安装系统的 python3-venv 包。安装脚本不会擅自修改系统软件包。

## 常用操作

| 按键 | 功能 |
| --- | --- |
| 方向键 / 鼠标 | 选择项目 |
| Space | 开启/关闭所选项目接取 |
| E | 编辑项目设置，Ctrl+S 保存，Esc 取消 |
| A | 新增项目 |
| R | 启动调度 |
| P | 停止调度并请求当前任务安全中断、保留断点 |
| D | 停止领取新任务，让当前任务完成并提交 |
| C | 检查所选项目本地程序和参数，不联网、不计算 |
| F5 | 立即刷新全部项目的服务器 Queued 数量 |
| T | 清除所选项目的错误/等待状态，允许再次尝试 |
| Q / Ctrl+C | 请求保存断点，等待所管理子进程退出后关闭 |

关闭项目开关只影响**下一次任务领取**，不会强杀当前任务。立即停下请用 P。关闭全部项目不会删掉它们的设置、断点和待提交结果。

## 三页设置

**项目与身份**：项目 ID、名称、引擎、开关、轮询权重、服务器地址、用户名、机器名、任务目录。

**计算与断点**：GPU/CPU 后端、各自程序路径、CPU 线程、GPU duty、NTT blocks、窗口位、断点/anchor/进度间隔。

**网络与保留**：队列刷新间隔、心跳、租约、失败重试、无任务等待、提交确认后的缓存清理。

设置按引擎能力显示：GFPPS GPU 不能设置 duty 降载，但现在支持 PRST CPU 后端；窗口位仅 GSRPS 支持；anchor 仅 GFPS 支持；现有 GSRPS GPU 驱动不能配置进度打印间隔。CPU 最大 16 线程，默认 8 线程。

## Queued 实时统计

默认每 5 秒向每个项目配置的 `server_url/api/status` 发起一次公开 GET 请求，可在“网络与保留”中调整为 1–3600 秒。关闭项目接取或暂停计算不会关闭队列查看。F5 可手动刷新。

Queued 为 `0` 表示服务器明确返回空队列；`—` 表示尚未成功获取。连接失败时保留上次值并加 `*`，详情中显示错误与最近成功更新时间，不把断线当作空队列。错误自动退避，并参考服务器 Retry-After。最多三个并发查询，不发送用户名、任务令牌或管理密码，不领取或提交任务。

如果旧域名仍指向被冻结的 Worker，会显示 HTTP 503；DNS/HTTPS 未配置好时会显示连接错误。请先完成域名配置，不要绕过证书校验。C 键本地检查本身不发任务请求，后台队列查询仍可继续。

## 自动选择与 CPU 回退

默认开启“自动选择 GPU / CPU 回退”。检测 NVIDIA 显卡计算能力、驱动和程序启动兼容性，从 sm_86、89、100、120 中选取同一主架构内最合适的兼容版本，不把显卡型号名称当作依据。包内程序启动前核对 SHA-256。

没有 NVIDIA GPU、架构不在支持范围、驱动不可用或所选 GPU 程序无法启动时，会弹出警告并使用 PRST CPU。可在设置中选择 CPU 后端或关闭自动选择，使用自定义程序路径。自动模式下也可以调整回退后的 CPU 线程数。

GPU 初始化类故障可以触发本次会话的 CPU 回退；数值校验失败不会被当作合数或自动忽略。CPU/GPU 的断点格式不同：切换后通常从头计算当前候选，各自的断点目录保留，直到结果被服务器确认。GFPPS CPU 使用 PRST 的 base-2 Fermat 测试并严格核对表达式与完成结果。

Linux 包需要兼容的系统运行库；若 GPU 和 PRST 都因系统/CPU 架构不兼容而不能运行，客户端会报错停止该项目，不会伪造回退成功。请安装兼容构建或从源代码构建。

运行中的任务继续使用启动时参数，新参数在下一任务周期或暂停后恢复时生效。存在未完成任务时，禁止直接修改服务器、身份、工作目录、后端和程序路径，以免错用任务令牌或断点。需要迁移这些字段时，应先处理待提交状态或进行专门迁移，不能删 current_task.json 来绕过保护。

## 调度与保护

- 全局同时只运行一个任务，避免三个 GPU 程序争抢显存。CPU 任务目前也占用同一个调度槽。
- 轮询权重按**任务周期**分配，不是 GPU 时间百分比；开启多个项目不会同时启动多个计算程序。
- 暂时无任务或网络出错的项目退避等待，其他启用的项目可继续参与调度。
- 计算、配置等本地错误会把该项目标为“需检查”，不会无限重复跑失败任务。检查后按 T 重试。
- 内存不足时不启动新计算；已有 GFPPS 待提交结果不要求 GPU 程序存在。
- 使用操作系统进程锁，并检查同类独立客户端。仍须先关闭原来的独立客户端，再用统一管理器，避免外部进程竞争。
- 暂停只向自己启动的进程组发送 Ctrl+Break / SIGINT，由原客户端继续转发给 GPU 程序。不会自动强杀，也不会改写异常为合数结果。若引擎不响应，界面保持等待，需人工检查。
- 日志保留有界内存缓冲，不无限积累；本次提交计数不是服务器的历史积分。

## 命令行方式

以下修改命令应在终端界面/调度器关闭后执行（Windows 使用 start.cmd；Linux 使用 sh start.sh）：

```bash
start.cmd --status
start.cmd --enable gfps
start.cmd --disable gfpps
start.cmd --set gsrps duty_percent=70
start.cmd --set gfps share=200
start.cmd --run
```

无界面运行与 TUI 共用配置和调度核心，但这一版没有常驻服务 IPC；不能同时开第二个 TUI 修改正在无界面运行的管理器。

## 后续项目和统一域名

新增项目可以复用已注册的引擎，并设置不同服务地址、程序路径和独立任务目录。现有 GFPS 网络适配器仍固定为 GFN16；新增不同数学类型或协议需要编写并验证新的本地适配器，不能仅改名字就获得新算法。

默认服务地址为 `https://prpnet.astralprisma.top/gfps`、`https://prpnet.astralprisma.top/gsrps`、`https://prpnet.astralprisma.top/gfpps`，域名根路径是 PRPNet 总览；个人主页继续使用 `https://astralprisma.top/`。服务器按项目路径隔离任务与积分。DNS 和 HTTPS 配置完成后才可连接；不要绕过证书验证。

旧配置不会因安装新包而自动改写。已有待提交任务需要保留任务 ID、令牌、结果和工作目录，由迁移工具完整核验后再更换服务器绑定；不能删除任务状态来强行切换。

核心分层：`settings.py` 配置校验与保存，`core.py` 调度和进程生命周期，`bridge.py` 引擎/协议适配，`tui.py` 终端视图。`vendor` 保留已验证的原客户端和队列驱动；没有改动 CUDA 数值程序。未来 GUI 可以复用这些非界面模块。

## 文件与恢复

`settings.json` 为本机私密配置，保存时保留一份 `settings.json.bak`；`runtime/` 是自动生成的单次运行配置。实际任务和 GPU 日志仍在各项目设置中的工作目录。不要把这些私密配置、任务令牌和工作目录上传 GitHub。

原 GFPS/GSRPS/GFPPS 目录及客户端没有被覆盖。恢复独立客户端前，先退出本管理器；任务目录保持原协议格式，可由原客户端继续处理。

统一客户端中的 GFPPS 适配器兼容此前 MiscWork→GFPPS 迁移留下的旧所有权标记：只在完整核对旧/新域名、用户、机器、任务 ID/UID、候选和待提交结果后，于显式运行时补建新标记。配置检查只读，不转换标记。这个修正仅包含在本管理器的适配器中，未覆盖独立 GFPPS 客户端。
