feat: 1.7.0 落地 TODO 全部待办(地面修正 / 手动执行器 / 自救 / 回城 / 租约 / 通知)

按 TODO.md 的优先级把待办全部落地为代码,详见 CHANGELOG 的 [1.7.0]。

- 「走不动」攻关:地面状态修正(syncGroundToPhysics / trustSetbackOnGround)、
  出站包类型分布、备选执行器 manualMover(只借 A* 规划、自己按键执行)
- 原点自救分两轮并统计成败;回城前评估「原地是否更差」并记录前后坐标
- 新增目标区块租约表(targetLease)避免多机器人撞同一块
- 定时消息支持 cron 与「期望回复」确认;新增人工介入 Webhook 通知(notifier)
- 大地图后台预热与视野裁剪;控制台日志按帧批量写入、配置面板支持搜索

顺带修掉两个影响部署的细节:
- 部署脚本(deploy.js / ssh-helper.js)改为也能从 .env 读 SSH 凭据 ——
  在命令行传密码会留在 shell 历史与进程列表里,写进已被忽略的 .env 更安全;
  显式环境变量仍然优先。.env.example 补上占位符并说明这些只在本机用。
- package.json / package-lock.json 版本对齐到 1.7.0(此前停留在 1.1.0,
  与 CHANGELOG 的语义化版本声明脱节)。

测试:368 → 436 个用例,`npm test` 与 `npm run check` 全绿。
这个提交包含在:
lyizai
2026-09-28 22:46:39 +08:00
父节点 8d1b8d5122
当前提交 51664c55b6
共修改 31 个文件,包含 3535 行新增和 251 行删除
+55
查看文件
@@ -2,6 +2,61 @@
本项目遵循 [约定式提交](https://www.conventionalcommits.org/zh-hans/) 与 [语义化版本](https://semver.org/lang/zh-CN/)。
## [1.7.0] - 2026-09-29
按 `TODO.md` 的优先级把待办全部落地:先是「走不动」的攻关与备选方案,
然后是自救 / 回城 / 大地图 / 控制台 / 多机器人 / 定时消息 / 登录提醒。
### 新增
- **地面状态修正(TODO 问题 1 · 假设 2 的方案 A / B)**:
- 方案 A(`grim.syncGroundToPhysics`):每个物理 tick 在「物理引擎算完、位置包发出之前」
用世界数据复核脚下是否有实体方块,是则强制把 `bot.entity.onGround` 同步为 true,
让移动回到地面分支(此前一直被服务端位置包置为 false,物理引擎长期按空中处理);
- 方案 B(`grim.trustSetbackOnGround` + `grim.setbackSyncEpsilon`):服务端下发的目标位置
与本地几乎一致(例行同步)时只采纳坐标、保留我们自己的 `onGround`,不采纳它的 false;
- 两者都与 `grim.enabled` 无关;控制台「Grim 合规」卡片显示
`物理对齐 / 保住 / 最近同步差` 三个计数,便于判断修正是否真的生效。
- **备选移动执行器 `manualMover.js`**(`pathing.executor: 'manual'`):
只借用 mineflayer-pathfinder 的 A* **算路径**,执行改为自己按键 ——
朝路径点转向、朝向对上才按前进、遇一格坎跳一下、长时间无位移重新规划。
控制键时序与「移动测试」的手动按键完全一致,便于逐 tick 对照排查。
- **出站包类型分布**(`packetStats.outboundTypes`):用于与旧模组抓包逐项对照(假设 4)。
- **原点自救升级**(TODO 问题 2):分两轮(左右 → 前后 + 跳),每轮结束后等传送落地再判定
「位置是否恢复」;统计 `attempts / successes / lastResult`(暴露在 `/api/status` 与控制台),
两轮都失败时升级为明确提示(点明可能是登录服,需要人工发验证码)。
- **回城改进**(TODO 问题 3):
- 回城前用 `pathing.diagnostics().neighborCount` 评估「原地是否真的更差」:
还能走就放弃回城、改为跳过目标(回城只会白白丢掉玩家摆好的位置);
- 回城完成后记录前后坐标与直线距离,日志与控制台展示「回城把机器人从 A 挪到了 B」,
位置几乎没变时明确提示回城没有帮助。
- **大地图后台预热 + 视野裁剪**(TODO 4.1):机器人移动超过阈值(或距上次超过 10 分钟)时,
用低并发把周边高层级瓦片补下来(已缓存只做一次 `statSync`,批量爬取在途时让路);
领土多边形按包围盒裁剪,全世界视角不再全量绘制。
- **控制台**(TODO 4.2):日志按帧批量写入(一次布局、一次滚动),
并用 `content-visibility` 让浏览器跳过视口外行的渲染;配置面板新增搜索框
(按名称 / 字段名 / 说明过滤,隐藏不删除,保存不受影响)。
- **目标区块租约表**(TODO 4.3,`src/core/targetLease.js`):
多机器人抢同一区块时谁先抢到谁去,其余机器人跳过;持有者持续续租,
掉线 / 卡死后租约到期自动失效;候选区块全被预定时等 15 秒再规划,而不是提前判「没有可用区块」。
- **定时消息支持 cron 与发送结果确认**(TODO 4.4):
5 段 cron 表达式(支持步长 / 区间 / 列表 / 星期范围,非法表达式会说明原因并按间隔发送);
可填「期望回复」(正则)确认发送是否真的生效,超时未回复记 `⚠ 未确认` 并写警告。
- **人工介入提醒(Webhook)**(TODO 4.5,`src/core/notifier.js`):
等待验证码(120 秒时限)与原点自救失败时推送到飞书 / Lark 自定义机器人;
支持 `NOTIFY_WEBHOOK_URL` 兜底、按问题去重(默认 60 秒)、快照只暴露域名不泄露完整地址。
### 变更
- `ExpansionController` 挑选目标、跳过目标、停止任务、完成任务时统一维护租约;
- `WebConsole` 增加低频(1 分钟)大地图预热检查,停止时一并清理定时器;
- 定时消息列表与配置面板同步支持 cron / 期望回复字段。
### 测试
新增 68 个用例(368 → 436),覆盖地面状态修正、手动执行器、原点自救判定、
回城评估与前后坐标、目标租约、cron 解析与确认、通知器、大地图预热。
## [1.6.0] - 2026-09-29
围绕「机器人为什么走不动」做了一轮系统排查,并给破坏性操作加上护栏。