fix(k1): harden BLE discovery and bridge recovery

This commit is contained in:
DCCONSTRUCTIONS
2026-08-06 12:43:00 +03:00
parent be50144ca8
commit 52da9b75b7
14 changed files with 1010 additions and 48 deletions
@@ -118,7 +118,7 @@ export function K1ProvisioningPipeline({
phaseLabel: string;
phaseTone: StatusTone;
}) {
const { state, pendingAction, scan, connect } = controller;
const { state, pendingAction, scan, connect, verifyConnection } = controller;
const [powerConfirmed, setPowerConfirmed] = useState(false);
const [selectedDeviceId, setSelectedDeviceId] = useState("");
const [ssid, setSsid] = useState("");
@@ -160,6 +160,11 @@ export function K1ProvisioningPipeline({
() => devices.find((device) => device.device_id === selectedDeviceId),
[devices, selectedDeviceId],
);
const canAdoptExistingBridge = connectionMode === "bridge"
&& powerConfirmed
&& selectedDeviceId.length > 0
&& deviceSummary !== undefined
&& !isBusy;
const resetProvisioningIntent = () => {
provisioningIntentRef.current = null;
@@ -190,6 +195,14 @@ export function K1ProvisioningPipeline({
}
};
const submitExistingBridgeAdoption = async () => {
if (!canAdoptExistingBridge) return;
await verifyConnection({
device_id: selectedDeviceId,
compatibility_attestation: profileSelectionForConnectionMode("bridge"),
});
};
return (
<GlassSurface className="connection-panel" padding="lg">
<header className="panel-heading">
@@ -275,6 +288,24 @@ export function K1ProvisioningPipeline({
? connectionMode === "quick-connect" ? "Включаем точку и подключаем…" : "Подключаем…"
: modeCopy.buttonLabel}
</Button>
{connectionMode === "bridge" ? (
<>
<Button
width="full"
variant="secondary"
icon={<Icon name="refresh" />}
disabled={!canAdoptExistingBridge}
onClick={() => void submitExistingBridgeAdoption()}
>
{pendingAction === "verify"
? "Проверяем существующее подключение…"
: "Подхватить существующее подключение"}
</Button>
<p className="safety-note">
Если K1 уже подключён к этой сети другим способом, Mission Core проверит и примет существующее подключение без изменения настроек Wi‑Fi.
</p>
</>
) : null}
<p className="safety-note">
{modeCopy.safetyNote}
{connectionMode === "quick-connect" ? " Это лабораторный путь для уже подготовленного хоста: credential provider должен существовать в системном хранилище заранее. На чистом Mac операция завершится до BLE-записи; браузер, API, журналы и evidence секрета не получают." : " Пароль передаётся только локальному сервису, не сохраняется в браузере и удаляется из формы после успеха."}