feat: refine vehicle console and self-repair workflow
This commit is contained in:
+230
-10
@@ -21,7 +21,9 @@
|
||||
controlMode: sessionStorage.getItem("cognitive-agent.control-mode") === "gesture"
|
||||
? "gesture"
|
||||
: "natural",
|
||||
activeModule: storedModule === "self-extension"
|
||||
activeModule: storedModule === "self-evolution"
|
||||
? "self-evolution"
|
||||
: storedModule === "self-extension"
|
||||
? "self-extension"
|
||||
: storedModule === "self-calibration"
|
||||
? "self-calibration"
|
||||
@@ -392,11 +394,11 @@
|
||||
|
||||
const naturalPanel = $("#v2NaturalPanel");
|
||||
if (panelHeading) {
|
||||
panelHeading.classList.add("v2-operation-heading");
|
||||
panelHeading.classList.add("v2-operation-heading", "v2-module-heading");
|
||||
const kicker = $(".section-kicker", panelHeading);
|
||||
const title = $("h2", panelHeading);
|
||||
const intro = $(".panel-intro", panelHeading);
|
||||
if (kicker) kicker.textContent = "自然语言控制";
|
||||
if (kicker) kicker.textContent = "SELF-ORCHESTRATION";
|
||||
if (title) title.textContent = "一句话,调好整车";
|
||||
if (intro) intro.textContent = "座椅、空调、天幕与氛围灯,一句话联动完成";
|
||||
naturalPanel.append(panelHeading);
|
||||
@@ -417,8 +419,8 @@
|
||||
}
|
||||
|
||||
const gesturePanel = $("#v2GesturePanel");
|
||||
const gestureHeading = make("header", "v2-operation-heading v2-gesture-operation-heading", `
|
||||
<span class="section-kicker">手势控制</span>
|
||||
const gestureHeading = make("header", "v2-operation-heading v2-module-heading v2-gesture-operation-heading", `
|
||||
<span class="section-kicker">SELF-ORCHESTRATION</span>
|
||||
<h2>抬抬手,控制整车</h2>
|
||||
<p class="panel-intro">通过摄像头识别手势,直观控制车舱功能</p>`);
|
||||
gesturePanel.append(gestureHeading);
|
||||
@@ -464,13 +466,13 @@
|
||||
|
||||
function buildModuleSwitcher(mainPanel) {
|
||||
const modules = [
|
||||
{ id: "self-orchestration", label: "自编排", available: true },
|
||||
{
|
||||
id: "self-calibration",
|
||||
label: "自标定",
|
||||
available: true,
|
||||
adminOnly: true,
|
||||
},
|
||||
{ id: "self-orchestration", label: "自编排", available: true },
|
||||
{ id: "self-extension", label: "自扩展", available: true },
|
||||
{
|
||||
id: "self-repair",
|
||||
@@ -478,6 +480,7 @@
|
||||
available: true,
|
||||
adminOnly: true,
|
||||
},
|
||||
{ id: "self-evolution", label: "自进化", available: true },
|
||||
];
|
||||
const switcher = make("nav", "v2-module-switcher", "");
|
||||
switcher.id = "v2ModuleSwitcher";
|
||||
@@ -501,6 +504,216 @@
|
||||
mainPanel.prepend(switcher);
|
||||
}
|
||||
|
||||
function buildEvolutionJournal(mainPanel) {
|
||||
const evolutionEntries = [
|
||||
{
|
||||
version: "v0.5",
|
||||
date: "2026.08.12",
|
||||
status: "当前版本",
|
||||
title: "统一主题与权限体验",
|
||||
summary: "把权限、主题与核心交互收束到同一套体验规则,让不同模块看起来、用起来都属于同一个系统。",
|
||||
changes: [
|
||||
["主题统一", "自扩展固定使用 user 绿色主题,避免权限语义混用。"],
|
||||
["孪生同步", "3D 模型渲染、玩具动作和车端动作统一跟随当前主题。"],
|
||||
["能力扩充", "新增自进化入口,让 user 与 admin 共同查看演进过程。"],
|
||||
],
|
||||
modules: ["自扩展", "数字孪生", "权限体系"],
|
||||
metrics: [
|
||||
["主题一致性", "72%", "100%", 100],
|
||||
["可见能力模块", "4 个", "5 个", 92],
|
||||
["待修正视觉项", "4 项", "0 项", 100],
|
||||
],
|
||||
userValidation: "核心板块已完成主题复核,权限色与交互反馈保持一致。",
|
||||
adminValidation: "前端契约 11/11 · 自标定/自修复检查 8/8",
|
||||
},
|
||||
{
|
||||
version: "v0.4",
|
||||
date: "2026.08.11",
|
||||
status: "稳定版本",
|
||||
title: "自修复闭环增强",
|
||||
summary: "从发现异常走向诊断、修复与验证闭环,同时补齐离线场景的默认内容,确保功能状态始终可见。",
|
||||
changes: [
|
||||
["故障覆盖", "补充六类量产故障用例,覆盖更真实的车端异常。"],
|
||||
["修复闭环", "形成发现、定位、决策、执行、验证五阶段流程。"],
|
||||
["离线韧性", "服务暂时离线时仍保留默认案例和演示路径。"],
|
||||
],
|
||||
modules: ["自修复", "故障诊断", "离线体验"],
|
||||
metrics: [
|
||||
["故障用例", "2 类", "6 类", 86],
|
||||
["修复阶段", "3 阶段", "5 阶段", 92],
|
||||
["离线可用性", "空白", "可演示", 100],
|
||||
],
|
||||
userValidation: "断开服务后仍可理解自修复能力,并可继续浏览默认案例。",
|
||||
adminValidation: "默认数据回退、流程状态与接口异常路径均已验证。",
|
||||
},
|
||||
{
|
||||
version: "v0.3",
|
||||
date: "2026.08.10",
|
||||
status: "能力升级",
|
||||
title: "外设与车端统一编排",
|
||||
summary: "将玩具动作、车端设备动作与数字孪生放进同一个控制流程,减少跨区域理解和操作成本。",
|
||||
changes: [
|
||||
["动作融合", "玩具动作与车端设备动作进入统一动作界面。"],
|
||||
["布局优化", "孪生界面位于左侧,动作界面固定在右侧。"],
|
||||
["映射精简", "移除重复外框,让实时映射关系更直接。"],
|
||||
],
|
||||
modules: ["自扩展", "外设学习", "整车控制"],
|
||||
metrics: [
|
||||
["动作入口", "2 处", "1 处", 100],
|
||||
["映射层级", "3 层", "2 层", 88],
|
||||
["协同对象", "玩具", "玩具 + 车端", 94],
|
||||
],
|
||||
userValidation: "动作与孪生左右分区清晰,学习结果可以直接用于统一控制。",
|
||||
adminValidation: "外设连接状态、动作映射与车端执行链路保持独立可追踪。",
|
||||
},
|
||||
{
|
||||
version: "v0.2",
|
||||
date: "2026.08.09",
|
||||
status: "体系建立",
|
||||
title: "多权限主题体系",
|
||||
summary: "建立 user 与 admin 的视觉身份,使权限差异不只体现在可用功能,也能被用户直观感知。",
|
||||
changes: [
|
||||
["角色主题", "user 使用绿色,admin 使用蓝色,形成稳定的权限认知。"],
|
||||
["能力边界", "按角色控制模块入口,同时保留清晰的切换反馈。"],
|
||||
["模型联动", "数字孪生模型与界面主题保持同色语义。"],
|
||||
],
|
||||
modules: ["权限体系", "主题系统", "数字孪生"],
|
||||
metrics: [
|
||||
["角色主题", "1 套", "2 套", 100],
|
||||
["权限反馈", "文字", "视觉 + 文字", 90],
|
||||
["主题联动", "界面", "界面 + 模型", 96],
|
||||
],
|
||||
userValidation: "绿色主题贯穿 user 可用能力,角色身份更加明确。",
|
||||
adminValidation: "角色切换事件可同步驱动界面变量与模型渲染参数。",
|
||||
},
|
||||
{
|
||||
version: "v0.1",
|
||||
date: "2026.08.08",
|
||||
status: "起点版本",
|
||||
title: "整车认知控制台诞生",
|
||||
summary: "完成从自然语言意图到整车状态回读的第一条闭环,建立后续能力持续进化的共同底座。",
|
||||
changes: [
|
||||
["自然语言控制", "用贴近日常表达的指令控制座舱功能。"],
|
||||
["整车孪生", "把座椅、空调、车窗等状态集中映射到一个界面。"],
|
||||
["执行回读", "串联 CAN 计划、设备执行与状态反馈。"],
|
||||
],
|
||||
modules: ["自编排", "数字孪生", "CAN 执行"],
|
||||
metrics: [
|
||||
["能力模块", "0 个", "1 个", 100],
|
||||
["控制链路", "分散", "闭环", 92],
|
||||
["状态视图", "单设备", "整车", 96],
|
||||
],
|
||||
userValidation: "自然语言、执行过程与结果反馈首次形成连续体验。",
|
||||
adminValidation: "意图解析、CAN 编译计划与硬件回读具备完整追踪链路。",
|
||||
},
|
||||
];
|
||||
|
||||
const versionButtons = evolutionEntries.map((entry, index) => `
|
||||
<button type="button" class="v2-evolution-version${index === 0 ? " active" : ""}"
|
||||
data-evolution-index="${index}" aria-pressed="${index === 0 ? "true" : "false"}">
|
||||
<span><strong>${entry.version}</strong><time datetime="${entry.date.replaceAll(".", "-")}">${entry.date.slice(5)}</time></span>
|
||||
<b>${entry.title}</b>
|
||||
<small>${entry.status}</small>
|
||||
</button>`).join("");
|
||||
|
||||
const evolution = make("section", "v2-self-evolution", `
|
||||
<div class="v2-evolution-shell">
|
||||
<header class="v2-evolution-overview">
|
||||
<div class="v2-evolution-heading v2-module-heading">
|
||||
<span class="section-kicker">SELF-EVOLUTION</span>
|
||||
<h1>能力进化日志</h1>
|
||||
<p>记录每次问题发现、能力升级与验证结果,见证系统持续进化。</p>
|
||||
</div>
|
||||
<dl class="v2-evolution-summary" aria-label="当前进化概览">
|
||||
<div class="v2-evolution-current"><dt>当前版本</dt><dd>v0.5</dd><small>能力融合期</small></div>
|
||||
<div><dt>累计迭代</dt><dd>5</dd><small>个版本</small></div>
|
||||
<div><dt>能力改进</dt><dd>12</dd><small>项记录</small></div>
|
||||
<div><dt>最近更新</dt><dd>08.12</dd><small>2026</small></div>
|
||||
</dl>
|
||||
</header>
|
||||
|
||||
<div class="v2-evolution-workspace">
|
||||
<aside class="v2-evolution-timeline" aria-label="版本进化时间轴">
|
||||
<div class="v2-evolution-timeline-heading">
|
||||
<span>EVOLUTION PATH</span>
|
||||
<strong>从起点到现在</strong>
|
||||
</div>
|
||||
<div class="v2-evolution-version-list">${versionButtons}</div>
|
||||
</aside>
|
||||
|
||||
<article class="v2-evolution-detail" id="v2EvolutionDetail" aria-live="polite">
|
||||
<header class="v2-evolution-detail-heading">
|
||||
<div>
|
||||
<span class="v2-evolution-status" id="v2EvolutionStatus"></span>
|
||||
<span class="v2-evolution-detail-version" id="v2EvolutionVersion"></span>
|
||||
</div>
|
||||
<time id="v2EvolutionDate"></time>
|
||||
</header>
|
||||
<h2 id="v2EvolutionTitle"></h2>
|
||||
<p class="v2-evolution-lead" id="v2EvolutionLead"></p>
|
||||
<div class="v2-evolution-detail-grid">
|
||||
<section class="v2-evolution-changes" aria-labelledby="v2EvolutionChangesTitle">
|
||||
<h3 id="v2EvolutionChangesTitle"><i data-lucide="git-commit-horizontal"></i> 本次进化</h3>
|
||||
<div id="v2EvolutionChangeList"></div>
|
||||
</section>
|
||||
<section class="v2-evolution-evidence" aria-labelledby="v2EvolutionEvidenceTitle">
|
||||
<h3 id="v2EvolutionEvidenceTitle"><i data-lucide="trending-up"></i> 变好的证据</h3>
|
||||
<div id="v2EvolutionMetrics"></div>
|
||||
</section>
|
||||
</div>
|
||||
<footer class="v2-evolution-validation">
|
||||
<div class="v2-evolution-module-tags" id="v2EvolutionModules" aria-label="关联模块"></div>
|
||||
<p><i data-lucide="badge-check"></i><span data-evolution-scope="user" id="v2EvolutionUserValidation"></span><span data-evolution-scope="admin" id="v2EvolutionAdminValidation"></span></p>
|
||||
</footer>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<footer class="v2-evolution-next">
|
||||
<span class="v2-evolution-next-icon"><i data-lucide="flag"></i></span>
|
||||
<div><small>NEXT EVOLUTION · v0.6</small><strong>自主评估闭环</strong><p>让系统主动发现能力退化,对比历史基线,并形成下一轮优化建议。</p></div>
|
||||
<div class="v2-evolution-next-steps" aria-label="下一版本计划"><span>自动复盘</span><i data-lucide="arrow-right"></i><span>对比基线</span><i data-lucide="arrow-right"></i><span>形成建议</span></div>
|
||||
</footer>
|
||||
</div>`);
|
||||
evolution.id = "v2SelfEvolution";
|
||||
evolution.setAttribute("aria-label", "自进化能力日志");
|
||||
mainPanel.append(evolution);
|
||||
|
||||
const renderEntry = (index) => {
|
||||
const entry = evolutionEntries[index];
|
||||
if (!entry) return;
|
||||
$("#v2EvolutionStatus", evolution).textContent = entry.status;
|
||||
$("#v2EvolutionVersion", evolution).textContent = entry.version;
|
||||
const date = $("#v2EvolutionDate", evolution);
|
||||
date.textContent = entry.date;
|
||||
date.dateTime = entry.date.replaceAll(".", "-");
|
||||
$("#v2EvolutionTitle", evolution).textContent = entry.title;
|
||||
$("#v2EvolutionLead", evolution).textContent = entry.summary;
|
||||
$("#v2EvolutionChangeList", evolution).innerHTML = entry.changes.map(([label, copy]) => `
|
||||
<div><i data-lucide="check"></i><p><strong>${label}</strong><span>${copy}</span></p></div>`).join("");
|
||||
$("#v2EvolutionMetrics", evolution).innerHTML = entry.metrics.map(([label, before, after, progress]) => `
|
||||
<div class="v2-evolution-metric">
|
||||
<div><span>${label}</span><p><del>${before}</del><i data-lucide="arrow-right"></i><strong>${after}</strong></p></div>
|
||||
<span class="v2-evolution-progress" style="--evolution-progress: ${progress}%"><i></i></span>
|
||||
</div>`).join("");
|
||||
$("#v2EvolutionModules", evolution).innerHTML = entry.modules
|
||||
.map((module) => `<span>${module}</span>`).join("");
|
||||
$("#v2EvolutionUserValidation", evolution).textContent = entry.userValidation;
|
||||
$("#v2EvolutionAdminValidation", evolution).textContent = entry.adminValidation;
|
||||
$$("[data-evolution-index]", evolution).forEach((button, buttonIndex) => {
|
||||
const active = buttonIndex === index;
|
||||
button.classList.toggle("active", active);
|
||||
button.setAttribute("aria-pressed", String(active));
|
||||
});
|
||||
window.lucide?.createIcons({ attrs: { "aria-hidden": "true" } });
|
||||
};
|
||||
|
||||
$(".v2-evolution-version-list", evolution)?.addEventListener("click", (event) => {
|
||||
const button = event.target.closest("[data-evolution-index]");
|
||||
if (button) renderEntry(Number(button.dataset.evolutionIndex));
|
||||
});
|
||||
renderEntry(0);
|
||||
}
|
||||
|
||||
function buildOutput(mainPanel) {
|
||||
const output = make("section", "v2-output-shell", `
|
||||
<header class="v2-output-heading">
|
||||
@@ -652,14 +865,17 @@
|
||||
|
||||
function setModule(module, { persist = true } = {}) {
|
||||
if (["self-calibration", "self-repair"].includes(module) && ui.role !== "admin") {
|
||||
setRole("admin");
|
||||
setRole("admin", { allowModuleTransition: true });
|
||||
}
|
||||
const allowed = new Set(["self-orchestration", "self-extension"]);
|
||||
const allowed = new Set(["self-orchestration", "self-extension", "self-evolution"]);
|
||||
if (ui.role === "admin") {
|
||||
allowed.add("self-calibration");
|
||||
allowed.add("self-repair");
|
||||
}
|
||||
ui.activeModule = allowed.has(module) ? module : "self-orchestration";
|
||||
if (ui.activeModule === "self-extension" && ui.role !== "user") {
|
||||
setRole("user");
|
||||
}
|
||||
if (persist) {
|
||||
sessionStorage.setItem("cognitive-agent.active-module", ui.activeModule);
|
||||
}
|
||||
@@ -675,7 +891,7 @@
|
||||
button.setAttribute("aria-selected", String(active));
|
||||
button.tabIndex = active ? 0 : -1;
|
||||
});
|
||||
if (["self-extension", "self-calibration", "self-repair"].includes(ui.activeModule)) {
|
||||
if (["self-extension", "self-calibration", "self-repair", "self-evolution"].includes(ui.activeModule)) {
|
||||
const drawer = $("#gestureDrawer");
|
||||
if (drawer?.classList.contains("open")) $("#gestureCloseButton")?.click();
|
||||
} else {
|
||||
@@ -687,7 +903,10 @@
|
||||
window.setTimeout(() => window.dispatchEvent(new Event("resize")), 120);
|
||||
}
|
||||
|
||||
function setRole(role) {
|
||||
function setRole(role, { allowModuleTransition = false } = {}) {
|
||||
if (ui.activeModule === "self-extension" && role !== "user" && !allowModuleTransition) {
|
||||
role = "user";
|
||||
}
|
||||
if (ui.activeModule === "self-repair" && role !== "admin") {
|
||||
const roleSelect = $("#v2RoleSelect");
|
||||
if (roleSelect) {
|
||||
@@ -946,6 +1165,7 @@
|
||||
gestureDrawer,
|
||||
);
|
||||
buildModuleSwitcher(mainPanel);
|
||||
buildEvolutionJournal(mainPanel);
|
||||
|
||||
$(".pipeline", mainPanel)?.classList.add("v2-legacy-hidden");
|
||||
$(".topbar")?.classList.add("v2-legacy-hidden");
|
||||
|
||||
Reference in New Issue
Block a user