Add packaged Insta360 X4 integration and recover paired Node channels
Discover independent camera instances and prepare their versioned runtime from Node or remote Core. Add isolated SDK workers, camera controls, raw dual-fisheye WebRTC preview, and shared action/region loading states. Recover existing Node bindings over known Tailscale addresses after a Core LAN address change. Preserve identities and trust, pin both peers, migrate endpoints with revision checks, and require real heartbeats for online status. Fix the Python client certificate profile for Go X509 verification. Pin Design Guideline 8c53f73 and retain installer/build/acceptance history. Node 0.8.19 is installed; X4 0.1.3-3 is bundled but hardware activation is pending. Validation: qualified DG/Node builds and Go race tests; 31 fleet tests; Python-to-Go certificate interoperability and live tailnet recovery with five fresh heartbeats; prior 38 X4 tests and bounded remote WebRTC acceptance. Clean-OS, replug/power autonomy, local X4 video and long-run stability remain open.
This commit is contained in:
@@ -2856,8 +2856,9 @@ test("compact connection error can expose only its contextual recovery path", ()
|
||||
}));
|
||||
|
||||
assert.match(markup, /Подключение не завершено/);
|
||||
assert.match(markup, />Подключить новый K1<\/button>/);
|
||||
assert.doesNotMatch(markup, /Проверить состояние|>Закрыть<\/button>/);
|
||||
assert.equal(buttonMarkupWithText(markup, "Подключить новый K1").length, 1);
|
||||
assert.doesNotMatch(markup, /Проверить состояние/);
|
||||
assert.equal(buttonMarkupWithText(markup, "Закрыть").length, 0);
|
||||
});
|
||||
|
||||
test("connection attempt network phase copy distinguishes absent, applied and unknown outcomes", () => {
|
||||
@@ -4356,16 +4357,16 @@ test("fresh Scan keeps retired audit rows selectable without recovery I/O", () =
|
||||
assert.match(markup, /Повторить поиск Bluetooth/);
|
||||
assert.doesNotMatch(markup, /old-stop-operation/);
|
||||
const priorAction = deviceRowActionButton(markup, "ble-k1-001");
|
||||
assert.match(priorAction, />Выбрать<\/button>/);
|
||||
assert.equal(priorAction.replace(/<[^>]+>/g, ""), "Выбрать");
|
||||
assert.doesNotMatch(priorAction, /\bdisabled(?:=|\s|>)/);
|
||||
const replacementAction = deviceRowActionButton(markup, "ble-k1-new");
|
||||
assert.match(replacementAction, />Выбрать<\/button>/);
|
||||
assert.equal(replacementAction.replace(/<[^>]+>/g, ""), "Выбрать");
|
||||
assert.doesNotMatch(replacementAction, /\bdisabled(?:=|\s|>)/);
|
||||
assert.equal(
|
||||
buttonMarkupWithText(markup, "Подключить новый K1").length,
|
||||
0,
|
||||
);
|
||||
assert.doesNotMatch(markup, /<button[^>]*disabled[^>]*>Недоступно<\/button>/);
|
||||
assert.equal(buttonMarkupWithText(markup, "Недоступно").filter(button => /<button[^>]*disabled/.test(button)).length, 0);
|
||||
assert.doesNotMatch(
|
||||
markup,
|
||||
/Попытка настройки завершена|Проверить подключение без изменения сети|Управление не подтверждено/,
|
||||
@@ -4388,7 +4389,7 @@ test("fresh Scan keeps retired audit rows selectable without recovery I/O", () =
|
||||
/Подходящих K1 не найдено\. Повторите поиск\./,
|
||||
);
|
||||
const onlyPriorAction = deviceRowActionButton(onlyPriorMarkup, "ble-k1-001");
|
||||
assert.match(onlyPriorAction, />Выбрать<\/button>/);
|
||||
assert.equal(onlyPriorAction.replace(/<[^>]+>/g, ""), "Выбрать");
|
||||
assert.doesNotMatch(onlyPriorAction, /\bdisabled(?:=|\s|>)/);
|
||||
assert.match(onlyPriorMarkup, /Результатов: 1/);
|
||||
assert.doesNotMatch(onlyPriorMarkup, />Недоступно|Переподключиться/);
|
||||
@@ -4415,7 +4416,7 @@ test("fresh Scan keeps retired audit rows selectable without recovery I/O", () =
|
||||
historicalAuditMarkup,
|
||||
"ble-k1-001",
|
||||
);
|
||||
assert.match(historicallyRetiredAction, />Выбрать<\/button>/);
|
||||
assert.equal(historicallyRetiredAction.replace(/<[^>]+>/g, ""), "Выбрать");
|
||||
assert.doesNotMatch(
|
||||
historicallyRetiredAction,
|
||||
/\bdisabled(?:=|\s|>)/,
|
||||
@@ -4505,7 +4506,7 @@ test("an exact prior CoreBluetooth UUID remains a normal fresh selection across
|
||||
markup,
|
||||
"f89438fa-55ed-85ad-eed7-734ac84746d8",
|
||||
);
|
||||
assert.match(priorDeviceAction, />Выбрать<\/button>/);
|
||||
assert.equal(priorDeviceAction.replace(/<[^>]+>/g, ""), "Выбрать");
|
||||
assert.doesNotMatch(priorDeviceAction, /\bdisabled(?:=|\s|>)/);
|
||||
assert.equal(buttonMarkupWithText(markup, "Переподключиться").length, 0);
|
||||
assertCanonicalConnectionCopy(markup);
|
||||
@@ -6112,7 +6113,7 @@ test("an explicit network action keeps one disabled Step-2 form with an in-place
|
||||
assert.match(markup, /Пароль передан/);
|
||||
assert.doesNotMatch(markup, /secret/);
|
||||
assert.equal((markup.match(/<input[^>]*disabled=""/g) ?? []).length, 2);
|
||||
assert.doesNotMatch(markup, />Применить<\/button>/);
|
||||
assert.equal(buttonMarkupWithText(markup, "Применить").length, 0);
|
||||
assertCanonicalConnectionCopy(markup);
|
||||
});
|
||||
|
||||
@@ -6297,8 +6298,8 @@ test("current Bridge bootstrap stays visible over an older unresolved STOP check
|
||||
assert.match(markup, /<span>02<\/span>/);
|
||||
assert.match(markup, /nodedc-activity-indicator/);
|
||||
assert.doesNotMatch(markup, /Прежнее подключение не подтверждено/);
|
||||
assert.doesNotMatch(markup, />Переподключиться<\/button>/);
|
||||
assert.doesNotMatch(markup, />Подключить новый K1<\/button>/);
|
||||
assert.equal(buttonMarkupWithText(markup, "Переподключиться").length, 0);
|
||||
assert.equal(buttonMarkupWithText(markup, "Подключить новый K1").length, 0);
|
||||
|
||||
assert.equal(isConnectionControlBootstrapSettling({
|
||||
...state,
|
||||
@@ -6454,7 +6455,8 @@ test("correlated terminal recovery resets before exposing a separate clean Scan"
|
||||
buttonMarkupWithText(markup, "Проверить прежнее подключение").length,
|
||||
0,
|
||||
);
|
||||
assert.doesNotMatch(markup, /Проверить состояние|>Закрыть<\/button>/);
|
||||
assert.doesNotMatch(markup, /Проверить состояние/);
|
||||
assert.equal(buttonMarkupWithText(markup, "Закрыть").length, 0);
|
||||
assert.doesNotMatch(markup, /Выбрать другое|Пароль Wi‑Fi|Пароль передан|>Применить</);
|
||||
assert.doesNotMatch(markup, /<span>02<\/span>|private transport exception/);
|
||||
|
||||
@@ -7138,7 +7140,7 @@ test("a stale reopen settlement cannot own the current wizard surface", () => {
|
||||
assert.match(markup, /<span>01<\/span>/);
|
||||
assert.doesNotMatch(markup, /Подключение…|aria-busy="true"/);
|
||||
assert.doesNotMatch(markup, /<span>02<\/span>|<span>03<\/span>/);
|
||||
assert.match(markup, />Найти по Bluetooth<\/button>/);
|
||||
assert.equal(buttonMarkupWithText(markup, "Найти по Bluetooth").length, 1);
|
||||
const modeToggle = markup.match(
|
||||
/<button[^>]*aria-label="Способ подключения"[^>]*>/,
|
||||
)?.[0];
|
||||
@@ -7258,7 +7260,7 @@ test("stale raw Bluetooth results stay hidden until an explicit search", () => {
|
||||
|
||||
assert.match(markup, /<span>01<\/span>/);
|
||||
assert.doesNotMatch(markup, /Replacement K1/);
|
||||
assert.match(markup, />Найти по Bluetooth<\/button>/);
|
||||
assert.equal(buttonMarkupWithText(markup, "Найти по Bluetooth").length, 1);
|
||||
assert.doesNotMatch(markup, /aria-busy="true"/);
|
||||
assert.doesNotMatch(markup, /<span>02<\/span>|<span>03<\/span>/);
|
||||
assert.doesNotMatch(markup, /Завершаем предыдущее действие|Завершаем ранее начатое действие/);
|
||||
|
||||
Reference in New Issue
Block a user