feat(n7web): enhance control workflows and status feedback

This commit is contained in:
Miayui
2026-09-16 12:52:07 +08:00
parent 84a3cd73bb
commit 0e4328f548
45 changed files with 7317 additions and 1001 deletions
+48 -16
View File
@@ -6136,6 +6136,7 @@ function ensureModeActionPopover() {
const header = document.createElement("header");
const headingCopy = document.createElement("span");
const eyebrow = document.createElement("small");
eyebrow.dataset.modeActionEyebrow = "true";
eyebrow.textContent = "执行动作预览";
const title = document.createElement("strong");
title.dataset.modeActionTitle = "true";
@@ -6153,7 +6154,12 @@ function ensureModeActionPopover() {
function renderModeActionPopover(mode) {
const popover = ensureModeActionPopover();
const actions = modeExecutionActionViews(mode);
const commandFlow = modeEditorReadableCommands(mode?.command_flow);
const usesLatestCommandFlow = commandFlow.length > 0;
const actions = usesLatestCommandFlow ? commandFlow : modeExecutionActionViews(mode);
$(`[data-mode-action-eyebrow]`, popover).textContent = usesLatestCommandFlow
? "最新控制指令流"
: "执行动作预览";
$("[data-mode-action-title]", popover).textContent = mode?.name || mode?.id || "功能模式";
$("[data-mode-action-count]", popover).textContent = actions.length
? `${actions.length} 步`
@@ -6163,7 +6169,7 @@ function renderModeActionPopover(mode) {
if (!actions.length) {
const empty = document.createElement("li");
empty.className = "mode-chip-action-empty";
empty.textContent = "执行动作明细暂未加载,请刷新后重试。";
empty.textContent = "控制指令流暂未加载,请刷新后重试。";
list.append(empty);
return popover;
}
@@ -6175,18 +6181,28 @@ function renderModeActionPopover(mode) {
const copy = document.createElement("span");
copy.className = "mode-chip-action-copy";
const actionName = document.createElement("strong");
actionName.textContent = action.action;
actionName.textContent = usesLatestCommandFlow
? String(action.category || "控制指令")
: action.action;
const metadata = document.createElement("small");
const device = document.createElement("span");
device.innerHTML = "<b>设备</b>";
device.append(document.createTextNode(action.device));
const target = document.createElement("span");
target.innerHTML = "<b>目标</b>";
target.append(document.createTextNode(action.target));
const parameters = document.createElement("span");
parameters.innerHTML = "<b>参数</b>";
parameters.append(document.createTextNode(action.parameters));
metadata.append(device, target, parameters);
const appendMetadata = (label, value) => {
const text = String(value || "").trim();
if (!text) return;
const item = document.createElement("span");
const key = document.createElement("b");
key.textContent = label;
item.append(key, document.createTextNode(text));
metadata.append(item);
};
if (usesLatestCommandFlow) {
appendMetadata("语义", action.semantic || action.operation_ref);
appendMetadata("实际", action.command);
appendMetadata("通道", action.channel);
} else {
appendMetadata("设备", action.device);
appendMetadata("目标", action.target);
appendMetadata("参数", action.parameters);
}
copy.append(actionName, metadata);
item.append(step, copy);
list.append(item);
@@ -6642,10 +6658,13 @@ async function executeSavedModeProfile(mode, { command = "" } = {}) {
closeModeGallery({ restoreFocus: false });
const runButton = $("#runButton");
const input = $("#utterance");
const assistantModeHandle = assistant?.beginModeExecution?.(mode, {
command: modeCommand,
}) || null;
runButton.disabled = true;
setModeChipsDisabled(true);
setModeExecutionState(mode.id, "running");
assistant?.open?.();
if (!assistantModeHandle) assistant?.open?.();
input.value = modeCommand;
input.dispatchEvent(new Event("input", { bubbles: true }));
setRunStatus("processing", "MODE COMMAND FLOW");
@@ -6677,7 +6696,13 @@ async function executeSavedModeProfile(mode, { command = "" } = {}) {
? `${mode.name}执行完成`
: `${mode.name}执行未完成`;
setModeExecutionState(mode.id, completed ? "succeeded" : "failed");
assistant?.announceModeExecution?.(mode, payload, { command: modeCommand });
if (assistantModeHandle && assistant?.completeModeExecution) {
assistant.completeModeExecution(assistantModeHandle, mode, payload, {
command: modeCommand,
});
} else {
assistant?.announceModeExecution?.(mode, payload, { command: modeCommand });
}
if (state.executionMode === "hardware") await synchronizePhysicalSeatState();
showToast(completed
? `${mode.name}已直接执行保存的控制指令流`
@@ -6686,7 +6711,14 @@ async function executeSavedModeProfile(mode, { command = "" } = {}) {
setModeExecutionState(mode.id, "failed");
setRunStatus("failed", "MODE FAILED");
$("#resultTitle").textContent = `${mode.name}执行失败`;
assistant?.announceModeExecution?.(mode, null, { command: modeCommand, error });
if (assistantModeHandle && assistant?.completeModeExecution) {
assistant.completeModeExecution(assistantModeHandle, mode, null, {
command: modeCommand,
error,
});
} else {
assistant?.announceModeExecution?.(mode, null, { command: modeCommand, error });
}
showToast(error.message || "模式执行失败");
} finally {
if (input.value === modeCommand) {