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` 全绿。
这个提交包含在:
+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
|
||||
|
||||
围绕「机器人为什么走不动」做了一轮系统排查,并给破坏性操作加上护栏。
|
||||
|
||||
在新工单中引用
屏蔽一个用户