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` 全绿。
这个提交包含在:
+18
-1
@@ -33,7 +33,8 @@ test('timingSafeEqual 只接受等长且完全相同的字符串', () => {
|
||||
});
|
||||
|
||||
/** 搭建一个使用桩依赖的控制台实例 */
|
||||
function setupConsole() {
|
||||
function setupConsole(options) {
|
||||
const opts = options || {};
|
||||
const map = new Map([[
|
||||
'A',
|
||||
{
|
||||
@@ -73,6 +74,8 @@ function setupConsole() {
|
||||
controller,
|
||||
dataService,
|
||||
logger,
|
||||
bigMap: opts.bigMap,
|
||||
notifier: opts.notifier,
|
||||
getConfig: () => config,
|
||||
applyConfig: (next) => next
|
||||
}, { host: '127.0.0.1', port: 0 });
|
||||
@@ -116,6 +119,20 @@ test('statusPayload 汇总 bot / 任务 / 数据源状态', () => {
|
||||
assert.strictEqual(payload.data.stateCount, 1);
|
||||
assert.strictEqual(payload.claimTime.start, 11);
|
||||
assert.strictEqual(payload.claimTime.end, 22);
|
||||
assert.strictEqual(payload.notify, null, '未注入通知器时为 null(状态接口不应报错)');
|
||||
});
|
||||
|
||||
test('注入通知器时状态接口只暴露域名,不泄露完整 Webhook 地址', () => {
|
||||
const { Notifier } = require('../src/core/notifier');
|
||||
const config = defaultConfig();
|
||||
config.notify.enabled = true;
|
||||
config.notify.webhookUrl = 'https://open.feishu.cn/open-apis/bot/v2/hook/secret-token';
|
||||
const notifier = new Notifier(config, null, { fetchImpl: async () => ({ ok: true, status: 200 }) });
|
||||
const { webConsole } = setupConsole({ notifier });
|
||||
const payload = webConsole.statusPayload();
|
||||
assert.strictEqual(payload.notify.enabled, true);
|
||||
assert.strictEqual(payload.notify.host, 'open.feishu.cn');
|
||||
assert.ok(!JSON.stringify(payload).includes('secret-token'), '完整地址不能出现在状态响应里');
|
||||
});
|
||||
|
||||
test('HTTP 接口:/api/status、/api/config、/api/map 可访问', async () => {
|
||||
|
||||
在新工单中引用
屏蔽一个用户