fix(k1): use neutral process copy
This commit is contained in:
@@ -1877,7 +1877,7 @@ test("observed SCANNING recovery is a successful STOP-only connection outcome",
|
||||
);
|
||||
assert.match(
|
||||
acquisitionSource,
|
||||
/physicalStopInFlight\s*\? "Останавливаем устройство…"/,
|
||||
/physicalStopInFlight\s*\? "Остановка устройства…"/,
|
||||
);
|
||||
assert.match(
|
||||
acquisitionSource,
|
||||
|
||||
@@ -700,7 +700,7 @@ test("spatial force-finish pending owns the surface without a second action", ()
|
||||
}),
|
||||
{ pendingAction: "force-finish" },
|
||||
);
|
||||
assert.match(markup, /Завершаем локальный приём/);
|
||||
assert.match(markup, /Завершение локального приёма/);
|
||||
assert.match(markup, /data-recovery-state="force-finishing"/);
|
||||
assert.match(markup, /Команда STOP устройству не отправляется/);
|
||||
assert.equal(buttonsWithText(markup, "Прервать соединение").length, 0);
|
||||
@@ -836,7 +836,7 @@ test("force-finishing shows one local-only pending owner and no second action",
|
||||
camera_recovery: "inactive",
|
||||
});
|
||||
const markup = renderPipeline(state, { pendingAction: "force-finish" });
|
||||
assert.match(markup, /Завершаем локальный приём/);
|
||||
assert.match(markup, /Завершение локального приёма/);
|
||||
assert.match(markup, /Команда STOP устройству не отправляется/);
|
||||
assert.match(markup, /class="nodedc-activity-indicator/);
|
||||
assert.equal(buttonsWithText(markup, "Прервать соединение").length, 0);
|
||||
|
||||
@@ -3433,8 +3433,8 @@ test("physical STOP is fail-closed and both acquisition surfaces fall back to lo
|
||||
activateAutomaticSpatialSource() {},
|
||||
},
|
||||
));
|
||||
assert.match(localCleanupPendingMarkup, /Завершаем локальный приём…/);
|
||||
assert.doesNotMatch(localCleanupPendingMarkup, /Останавливаем устройство…/);
|
||||
assert.match(localCleanupPendingMarkup, /Завершение локального приёма…/);
|
||||
assert.doesNotMatch(localCleanupPendingMarkup, /Остановка устройства…/);
|
||||
|
||||
const physicalStopPendingMarkup = renderToStaticMarkup(createElement(
|
||||
K1AcquisitionPipeline,
|
||||
@@ -3450,8 +3450,8 @@ test("physical STOP is fail-closed and both acquisition surfaces fall back to lo
|
||||
activateAutomaticSpatialSource() {},
|
||||
},
|
||||
));
|
||||
assert.match(physicalStopPendingMarkup, /Останавливаем устройство…/);
|
||||
assert.doesNotMatch(physicalStopPendingMarkup, /Завершаем локальный приём…/);
|
||||
assert.match(physicalStopPendingMarkup, /Остановка устройства…/);
|
||||
assert.doesNotMatch(physicalStopPendingMarkup, /Завершение локального приёма…/);
|
||||
|
||||
const terminalDeniedState = structuredClone(state);
|
||||
terminalDeniedState.phase = "error";
|
||||
@@ -3534,7 +3534,7 @@ test("physical STOP is fail-closed and both acquisition surfaces fall back to lo
|
||||
));
|
||||
assert.match(terminalInFlightMarkup, /ВОССТАНОВЛЕНИЕ · КОМАНДА ОТПРАВЛЕНА/);
|
||||
assert.match(terminalInFlightMarkup, /Команда остановки устройства уже отправлена/);
|
||||
assert.match(terminalInFlightMarkup, /Останавливаем устройство…/);
|
||||
assert.match(terminalInFlightMarkup, /Остановка устройства…/);
|
||||
assert.doesNotMatch(
|
||||
terminalInFlightMarkup,
|
||||
/требуется явный STOP|Нажмите «Остановить сканирование»/,
|
||||
@@ -3848,7 +3848,7 @@ for (const pendingAction of ["connect", "verify"]) {
|
||||
assert.match(markup, /Настройка сети…/);
|
||||
} else {
|
||||
assert.match(markup, /<h3>Сеть<\/h3>/);
|
||||
assert.match(markup, /Проверяем подключение без изменения сети…/);
|
||||
assert.match(markup, /Проверка подключения без изменения сети…/);
|
||||
assert.match(markup, /<span>02<\/span>/);
|
||||
}
|
||||
assertCanonicalConnectionCopy(markup);
|
||||
@@ -5232,7 +5232,7 @@ test("an unresolved physical command has one explicit server-bound read-only rec
|
||||
}, { publicSearch: false });
|
||||
const pendingReconnect = buttonMarkupWithText(
|
||||
pendingMarkup,
|
||||
"Переподключаемся…",
|
||||
"Переподключение…",
|
||||
);
|
||||
assert.equal(pendingReconnect.length, 1);
|
||||
assert.match(pendingReconnect[0], /disabled/);
|
||||
@@ -5457,7 +5457,7 @@ test("unavailable physical replacement stays CAS-protected behind the simple new
|
||||
}, { publicSearch: false });
|
||||
const bothPendingReconnect = buttonMarkupWithText(
|
||||
bothPendingMarkup,
|
||||
"Переподключаемся…",
|
||||
"Переподключение…",
|
||||
);
|
||||
assert.equal(bothPendingReconnect.length, 1);
|
||||
assert.match(bothPendingReconnect[0], /disabled/);
|
||||
@@ -5676,7 +5676,7 @@ test("an explicit network action keeps one disabled Step-2 form with an in-place
|
||||
assert.match(markup, /Устройство выбрано/);
|
||||
assert.match(markup, /XGR-A46BE7/);
|
||||
assert.match(markup, /<span>02<\/span>/);
|
||||
assert.match(markup, /Применяем настройки…/);
|
||||
assert.match(markup, /Применение настроек…/);
|
||||
assert.match(markup, /FIELD-NET/);
|
||||
assert.match(markup, /Пароль передан/);
|
||||
assert.doesNotMatch(markup, /secret/);
|
||||
@@ -6204,7 +6204,7 @@ test("read-only reconnect keeps its card and loader across a transient projectio
|
||||
const pendingMarkup = renderToStaticMarkup(tree);
|
||||
const pendingReconnect = buttonMarkupWithText(
|
||||
pendingMarkup,
|
||||
"Переподключаемся…",
|
||||
"Переподключение…",
|
||||
);
|
||||
assert.equal(pendingReconnect.length, 1);
|
||||
assert.match(pendingReconnect[0], /disabled/);
|
||||
@@ -6845,7 +6845,7 @@ test("applied-network recovery spends the old intent and admits only explicit se
|
||||
/onClick=\{\(\) => void repeatDeviceScan\(\{\s*appliedRecoveryEscape: true/,
|
||||
);
|
||||
assert.match(source, /Начать новый поиск Bluetooth/);
|
||||
assert.match(source, /Подтверждаем управляющее подключение/);
|
||||
assert.match(source, /Подтверждение управляющего подключения/);
|
||||
assert.match(source, /BLE-команда не повторяется/);
|
||||
assert.match(
|
||||
source,
|
||||
@@ -6886,7 +6886,7 @@ test("applied-network recovery spends the old intent and admits only explicit se
|
||||
controller: provisioningController(settlingState),
|
||||
desiredMode: "bridge",
|
||||
});
|
||||
assert.match(settlingMarkup, /Подтверждаем управляющее подключение/);
|
||||
assert.match(settlingMarkup, /Подтверждение управляющего подключения/);
|
||||
assert.match(settlingMarkup, /BLE-команда не повторяется/);
|
||||
assert.doesNotMatch(settlingMarkup, /Сеть (?:готова|настроена)|Сетевые настройки уже применены/);
|
||||
assert.equal(
|
||||
|
||||
@@ -212,7 +212,7 @@ export function activeStreamRecoveryPresentation(
|
||||
title: "Восстанавливаем соединение",
|
||||
statusLabel: "Восстановление связи",
|
||||
tone: "neutral",
|
||||
detail: "Проверяем прежний активный контур только для чтения. START, STOP и настройки сети не отправляются.",
|
||||
detail: "Проверка прежнего активного контура только для чтения. START, STOP и настройки сети не отправляются.",
|
||||
progressLabel: recoveryProgressLabel(recovery),
|
||||
showSpinner: true,
|
||||
forceFinishAvailable: activeStreamForceFinishAuthority(state) !== null,
|
||||
|
||||
@@ -38,14 +38,14 @@ function surfaceCopy({
|
||||
? "СВЯЗЬ · ЛОКАЛЬНОЕ ЗАВЕРШЕНИЕ"
|
||||
: presentation?.eyebrow ?? "СВЯЗЬ · АКТИВНЫЙ ПРИЁМ",
|
||||
title: forceFinishing
|
||||
? "Завершаем локальный приём"
|
||||
? "Завершение локального приёма"
|
||||
: presentation?.title ?? "Восстанавливаем соединение",
|
||||
statusLabel: forceFinishing
|
||||
? "Локальное завершение"
|
||||
: presentation?.statusLabel ?? "Восстановление связи",
|
||||
detail: forceFinishing
|
||||
? "Закрываем только локальный приём и сохранение. Команда STOP устройству не отправляется."
|
||||
: presentation?.detail ?? "Проверяем состояние активного приёма.",
|
||||
: presentation?.detail ?? "Проверка состояния активного приёма.",
|
||||
showSpinner: forceFinishing || presentation?.showSpinner === true,
|
||||
forceFinishAvailable:
|
||||
!forceFinishing && presentation?.forceFinishAvailable === true,
|
||||
|
||||
@@ -372,7 +372,7 @@ export function K1AcquisitionPipeline({
|
||||
<header className="panel-heading">
|
||||
<div>
|
||||
<span className="section-eyebrow">{terminalPhysicalStopPending ? "ВОССТАНОВЛЕНИЕ · КОМАНДА ОТПРАВЛЕНА" : recoveredPhysicalStop ? "ВОССТАНОВЛЕНИЕ · ОСТАНОВКА" : terminalLocalRecovery ? "ВОССТАНОВЛЕНИЕ · ЛОКАЛЬНЫЙ КОНТУР" : terminalReadOnlyRecovery ? "ВОССТАНОВЛЕНИЕ · ТОЛЬКО ЧТЕНИЕ" : recoveredActiveSession ? "СВЯЗЬ ВОССТАНОВЛЕНА · АКТИВНЫЙ ПРИЁМ" : effectiveSessionIntent === "live" ? "ШАГИ 04–05 · ПРОЕКТ И ПРИЁМ" : "СЛУЖЕБНЫЙ РЕЖИМ"}</span>
|
||||
<h2>{terminalPhysicalStopPending ? "Ожидаем подтверждение устройства" : recoveredPhysicalStop ? "Сканирование продолжается" : terminalLocalRecovery ? "Завершите локальный приём" : terminalReadOnlyRecovery ? "Ожидайте подтверждённое состояние" : recoveredActiveSession ? "Связь восстановлена · приём продолжается" : effectiveSessionIntent === "live" ? "Назовите проект и запустите приём" : "Повторите запись"}</h2>
|
||||
<h2>{terminalPhysicalStopPending ? "Ожидание подтверждения устройства" : recoveredPhysicalStop ? "Сканирование продолжается" : terminalLocalRecovery ? "Завершите локальный приём" : terminalReadOnlyRecovery ? "Ожидайте подтверждённое состояние" : recoveredActiveSession ? "Связь восстановлена · приём продолжается" : effectiveSessionIntent === "live" ? "Назовите проект и запустите приём" : "Повторите запись"}</h2>
|
||||
</div>
|
||||
<StatusBadge tone={sourceTone}>{sourceLabel}</StatusBadge>
|
||||
</header>
|
||||
@@ -495,12 +495,12 @@ export function K1AcquisitionPipeline({
|
||||
? controlPhase === "connecting"
|
||||
? "Синхронизация…"
|
||||
: controlPhase === "workspace-requested"
|
||||
? "Входим в рабочее пространство…"
|
||||
? "Переход в рабочее пространство…"
|
||||
: controlPhase === "project-requested"
|
||||
? "Готовим проект и локальный приём…"
|
||||
? "Подготовка проекта и локального приёма…"
|
||||
: controlPhase === "start-requested" || controlPhase === "initializing"
|
||||
? "Запускаем приём…"
|
||||
: "Подготавливаем проект и локальный приём…"
|
||||
? "Запуск приёма…"
|
||||
: "Подготовка проекта и локального приёма…"
|
||||
: finalStartTarget
|
||||
? "Запустить приём"
|
||||
: preparedCanonicalLaunch
|
||||
@@ -550,7 +550,7 @@ export function K1AcquisitionPipeline({
|
||||
<Checker checked={replayLoop} label="Повторять по кругу" onChange={setReplayLoop} />
|
||||
</div>
|
||||
<Button variant="primary" icon={<Icon name="video" />} disabled={isBusy || sessionLocked || replayPath.trim().length === 0} onClick={() => void submitReplay()}>
|
||||
{pendingAction === "replay" ? "Запускаем повтор…" : "Запустить повтор записи"}
|
||||
{pendingAction === "replay" ? "Запуск повтора…" : "Запустить повтор записи"}
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
@@ -591,9 +591,9 @@ export function K1AcquisitionPipeline({
|
||||
}}
|
||||
>
|
||||
{physicalStopInFlight
|
||||
? "Останавливаем устройство…"
|
||||
? "Остановка устройства…"
|
||||
: pendingAction === "stop"
|
||||
? physicalStopPresented ? "Останавливаем устройство…" : state?.source_mode === "replay" ? "Останавливаем повтор…" : "Завершаем локальный приём…"
|
||||
? physicalStopPresented ? "Остановка устройства…" : state?.source_mode === "replay" ? "Остановка повтора…" : "Завершение локального приёма…"
|
||||
: physicalStopPresented ? recoveredPhysicalStop ? "Остановить сканирование" : "Остановить устройство и запись" : state?.source_mode === "replay" ? "Остановить повтор" : preparedAcquisition ? "Завершить подготовленный приём" : "Завершить локальный приём"}
|
||||
</Button>
|
||||
) : null}
|
||||
|
||||
@@ -2953,8 +2953,8 @@ export function K1ProvisioningPipeline({
|
||||
});
|
||||
};
|
||||
const attemptButtonLabel = connectionAttemptPresentation?.localPhase === "submitting"
|
||||
? "Применяем настройки…"
|
||||
: "Подтверждаем подключение…";
|
||||
? "Применение настроек…"
|
||||
: "Подтверждение подключения…";
|
||||
const applyAction = connectionAttemptSettling ? (
|
||||
<Button
|
||||
width="full"
|
||||
@@ -2996,7 +2996,7 @@ export function K1ProvisioningPipeline({
|
||||
<span>{modeCopy.stepTitle}</span>
|
||||
<strong>
|
||||
{connectionAttemptSettling
|
||||
? "Ожидаем подтверждение подключения"
|
||||
? "Ожидание подтверждения подключения"
|
||||
: connectionAttemptFailed
|
||||
? "Подключение не подтверждено"
|
||||
: "Готово к продолжению"}
|
||||
@@ -3099,7 +3099,7 @@ export function K1ProvisioningPipeline({
|
||||
onClick={() => void verifyConnectionRecoveryTarget()}
|
||||
>
|
||||
{connectionReconnectPending
|
||||
? "Переподключаемся…"
|
||||
? "Переподключение…"
|
||||
: "Переподключиться"}
|
||||
</Button>
|
||||
) : null}
|
||||
@@ -3139,7 +3139,7 @@ export function K1ProvisioningPipeline({
|
||||
/>
|
||||
{modeResetInFlight ? (
|
||||
<p className="safety-note" role="status">
|
||||
Завершаем прежнюю локальную границу. Новый поиск не начнётся автоматически.
|
||||
Завершение прежней локальной границы. Новый поиск не начнётся автоматически.
|
||||
</p>
|
||||
) : null}
|
||||
{activeScenarioReset ? (
|
||||
@@ -3163,15 +3163,15 @@ export function K1ProvisioningPipeline({
|
||||
? "Устройство выбрано"
|
||||
: presentedPhysicalRecoveryRequired
|
||||
? verificationActionPending
|
||||
? "Переподключаемся…"
|
||||
? "Переподключение…"
|
||||
: "Нужно выбрать действие"
|
||||
: networkRecoveryRequired
|
||||
? appliedControlSettlementPending
|
||||
? "Подтверждаем управление"
|
||||
? "Подтверждение управления"
|
||||
: "Управление не подтверждено · выбор заблокирован"
|
||||
: presentedConnectionRecoveryRequired
|
||||
? connectionReconnectPending
|
||||
? "Переподключаемся…"
|
||||
? "Переподключение…"
|
||||
: connectionRecoveryTarget
|
||||
? "Нужна проверка"
|
||||
: "Нужен новый поиск"
|
||||
@@ -3261,7 +3261,7 @@ export function K1ProvisioningPipeline({
|
||||
onClick={() => void verifyPhysicalRecovery()}
|
||||
>
|
||||
{physicalReconnectPending
|
||||
? "Переподключаемся…"
|
||||
? "Переподключение…"
|
||||
: "Переподключиться"}
|
||||
</Button>
|
||||
) : null}
|
||||
@@ -3430,15 +3430,15 @@ export function K1ProvisioningPipeline({
|
||||
status={
|
||||
connectionAttemptSettling
|
||||
? connectionAttemptPresentation?.localPhase === "submitting"
|
||||
? "Применяем настройки…"
|
||||
: "Подтверждаем подключение…"
|
||||
? "Применение настроек…"
|
||||
: "Подтверждение подключения…"
|
||||
: connectionAttemptFailed && !networkRecoveryRequired
|
||||
? "Подключение не подтверждено"
|
||||
: verificationActionPending
|
||||
? "Проверка…"
|
||||
: networkRecoveryRequired
|
||||
? appliedControlSettlementPending
|
||||
? "Подтверждаем управление"
|
||||
? "Подтверждение управления"
|
||||
: "Управление не подтверждено"
|
||||
: networkActionPending
|
||||
? "Настройка…"
|
||||
@@ -3474,7 +3474,7 @@ export function K1ProvisioningPipeline({
|
||||
aria-busy="true"
|
||||
>
|
||||
<ActivityIndicator />
|
||||
<strong>Проверяем подключение без изменения сети…</strong>
|
||||
<strong>Проверка подключения без изменения сети…</strong>
|
||||
</div>
|
||||
) : networkRecoveryRequired && appliedControlSettlementPending ? (
|
||||
<div
|
||||
@@ -3485,7 +3485,7 @@ export function K1ProvisioningPipeline({
|
||||
>
|
||||
<ActivityIndicator />
|
||||
<div>
|
||||
<strong>Подтверждаем управляющее подключение</strong>
|
||||
<strong>Подтверждение управляющего подключения</strong>
|
||||
<p className="safety-note">
|
||||
BLE-команда не повторяется. Дождитесь результата одной
|
||||
сервисной проверки состояния без изменений.
|
||||
|
||||
@@ -71,7 +71,7 @@ export function k1SpatialPhasePresentation(
|
||||
const presentations: Record<AcquisitionState, PhasePresentation> = {
|
||||
preparing: {
|
||||
label: "Подготовка локального приёма",
|
||||
detail: "Проверяем контур и создаём сессию записи.",
|
||||
detail: "Проверка контура и создание сессии записи.",
|
||||
busy: true,
|
||||
},
|
||||
prepared: {
|
||||
@@ -114,14 +114,14 @@ export function k1SpatialPhasePresentation(
|
||||
busy: true,
|
||||
},
|
||||
stopping: {
|
||||
label: softwareCommanded ? "Останавливаем K1 и запись" : "Останавливаем локальный приём",
|
||||
label: softwareCommanded ? "Остановка K1 и записи" : "Остановка локального приёма",
|
||||
detail: softwareCommanded
|
||||
? "Команда отправлена; ожидаем подтверждённое состояние устройства."
|
||||
: "Физическое состояние K1 остаётся неизвестным.",
|
||||
busy: true,
|
||||
},
|
||||
finalizing: {
|
||||
label: "Сохраняем локальную запись",
|
||||
label: "Сохранение локальной записи",
|
||||
detail: "Не закрывайте Mission Core до завершения финализации.",
|
||||
busy: true,
|
||||
},
|
||||
@@ -247,7 +247,7 @@ export function K1SpatialControlsView({
|
||||
? "Связь с потоком K1 потеряна"
|
||||
: dataPlaneState === "stalled"
|
||||
? "Поток K1 нестабилен"
|
||||
: "Ожидаем подтверждённый поток K1",
|
||||
: "Ожидание подтверждённого потока K1",
|
||||
detail: !controlAuthoritative
|
||||
? "Состояние acquisition сохранено как последнее известное; команды устройству не отправляются."
|
||||
: "Управляющая сессия подтверждена, но живые данные пока не получили авторитетный статус.",
|
||||
@@ -318,11 +318,11 @@ export function K1SpatialControlsView({
|
||||
>
|
||||
<span className="xgrids-k1-spatial-controls__action-label">
|
||||
{physicalStopInFlight
|
||||
? "Останавливаем устройство…"
|
||||
? "Остановка устройства…"
|
||||
: pendingAction === "stop"
|
||||
? terminalPhysicalStopRequired ? "Останавливаем K1…" : softwareCommanded ? "Останавливаем устройство…" : "Останавливаем приём…"
|
||||
? terminalPhysicalStopRequired ? "Остановка K1…" : softwareCommanded ? "Остановка устройства…" : "Остановка приёма…"
|
||||
: stopping
|
||||
? acquisition.state === "finalizing" ? "Сохраняем запись…" : "Остановка выполняется…"
|
||||
? acquisition.state === "finalizing" ? "Сохранение записи…" : "Остановка выполняется…"
|
||||
: terminalPhysicalStopRequired ? "Остановить K1" : "Остановить устройство и запись"}
|
||||
</span>
|
||||
</Button>
|
||||
@@ -336,7 +336,7 @@ export function K1SpatialControlsView({
|
||||
>
|
||||
<span className="xgrids-k1-spatial-controls__action-label xgrids-k1-spatial-controls__action-label--local">
|
||||
{pendingAction === "stop"
|
||||
? "Завершаем локальный приём…"
|
||||
? "Завершение локального приёма…"
|
||||
: "Завершить локальный приём"}
|
||||
</span>
|
||||
</Button>
|
||||
|
||||
Reference in New Issue
Block a user