feat(n7web): enhance control workflows and status feedback
This commit is contained in:
+48
-16
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user