Files
pikasTech-HWLAB/web/hwlab-cloud-web/index.html
T
2026-05-23 06:00:58 +00:00

349 lines
16 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>HWLAB 云工作台</title>
<link rel="stylesheet" href="/styles.css" />
<script type="module" src="/app.mjs"></script>
</head>
<body>
<main class="workbench-shell" data-app-shell data-help-route-policy="non-default-internal-help" data-internal-help-path="/help.md">
<aside class="activity-rail" aria-label="工作台活动栏">
<button class="rail-button active" type="button" data-route="workspace" title="工作台" aria-label="工作台">工作台</button>
<button class="rail-button" type="button" data-route="gate" title="内部复核" aria-label="内部复核">内部复核</button>
<button class="rail-button" type="button" data-route="help" title="使用说明" aria-label="使用说明">使用说明</button>
<span class="rail-spacer" aria-hidden="true"></span>
<button class="rail-button" id="explorer-toggle" type="button" title="展开或收起资源树" aria-label="展开或收起资源树" aria-controls="resource-explorer" aria-expanded="true">资源树</button>
</aside>
<aside class="explorer" id="resource-explorer" aria-label="资源浏览与硬件资源树">
<header class="explorer-head">
<div>
<p class="eyebrow">HWLAB Cloud</p>
<h1>云工作台</h1>
</div>
<span class="status-dot tone-source" id="explorer-status">只读工作区</span>
</header>
<section class="quick-actions" aria-label="常用工作入口">
<button type="button" data-focus-command>编写任务</button>
<button type="button" data-side-tab-jump="wiring">查看接线</button>
<button type="button" data-side-tab-jump="control">查看状态</button>
</section>
<section class="tree-panel">
<div class="panel-title-row">
<h2>硬件资源</h2>
<span id="tree-count">0</span>
</div>
<nav id="resource-tree" class="resource-tree" aria-label="HWLAB 硬件资源"></nav>
</section>
<section class="tree-panel blockers-panel">
<div class="panel-title-row">
<h2>常用能力</h2>
<span id="capability-count">0</span>
</div>
<div id="explorer-capabilities" class="compact-list"></div>
</section>
</aside>
<section class="center-workspace">
<header class="topbar">
<div class="topbar-main">
<p class="eyebrow">用户工作台</p>
<h2>Agent 对话与硬件资源面板</h2>
<p id="route-path" class="route-path">当前浏览器会话只保存任务草稿,硬件动作需通过受控后端流程。</p>
</div>
<div class="probe-card user-card" aria-live="polite">
<span class="metric-label">工作区状态</span>
<strong id="live-status" class="tone-source">只读模式</strong>
<small id="live-detail">可整理任务、查看资源、核对接线和可信记录;不会触发硬件变更。</small>
</div>
</header>
<section class="view workbench-view" id="workspace" data-view="workspace" aria-labelledby="workspace-title">
<div class="conversation-column">
<div class="workspace-panel conversation-panel">
<div class="panel-title-row">
<div>
<p class="eyebrow">Agent 工作区</p>
<h2 id="workspace-title">Agent 对话</h2>
</div>
<span class="state-tag tone-source" id="agent-chat-status">等待输入</span>
</div>
<div class="conversation-list" id="conversation-list" aria-live="polite"></div>
</div>
<div class="workspace-panel task-panel">
<div class="panel-title-row">
<div>
<p class="eyebrow">工作清单</p>
<h2>下一步任务草稿</h2>
</div>
<span class="state-tag tone-source">浏览器本地</span>
</div>
<div id="task-list" class="task-list"></div>
</div>
</div>
</section>
<section class="view help-view" id="help" data-view="help" aria-labelledby="help-title" hidden>
<div class="workspace-panel help-panel">
<div class="panel-title-row">
<div>
<p class="eyebrow">内部说明</p>
<h2 id="help-title">使用说明</h2>
</div>
<span class="state-tag tone-dry-run" id="help-status">加载中</span>
</div>
<div id="help-content" class="help-content" aria-live="polite"></div>
</div>
</section>
<section class="view gate-view" id="gate" data-view="gate" aria-labelledby="gate-title" hidden>
<div class="workspace-panel">
<div class="panel-title-row">
<div>
<p class="eyebrow">内部二级入口</p>
<h2 id="gate-title">Gate / 诊断 / 验收</h2>
</div>
<span class="state-tag tone-source">来源 SOURCE 报告</span>
</div>
<p class="panel-copy">
Gate、诊断、验收、BLOCKED 与 M0-M5 执行轨迹仅在此内部页面展示;默认入口保持用户工作台。
</p>
</div>
<div class="workspace-panel danger">
<div class="panel-title-row">
<div>
<p class="eyebrow">解阻路径</p>
<h2>DB live 与 patch-panel 闭环</h2>
</div>
<span class="state-tag tone-blocked">阻塞 BLOCKED</span>
</div>
<div id="unblock-list" class="compact-list"></div>
</div>
<div class="gate-grid" id="gate-metadata"></div>
<div class="workspace-panel">
<div class="panel-title-row">
<h2>M0-M5 Gate 状态</h2>
<span class="state-tag tone-blocked">阻塞 BLOCKED 实况前置失败时</span>
</div>
<div class="milestone-grid" id="milestone-grid"></div>
</div>
<div class="workspace-panel">
<div class="panel-title-row">
<h2>M0-M5 执行轨迹</h2>
<span class="state-tag tone-dry-run">演练 DRY-RUN 计划</span>
</div>
<div id="trace-list" class="trace-list"></div>
</div>
<div class="workspace-panel">
<div class="panel-title-row">
<h2>DEV 健康契约</h2>
<span class="state-tag tone-source">来源 SOURCE fixture</span>
</div>
<div class="table-wrap">
<table>
<thead>
<tr>
<th>组件</th>
<th>服务</th>
<th>状态</th>
<th>观测来源</th>
<th>端点</th>
</tr>
</thead>
<tbody id="health-body"></tbody>
</table>
</div>
</div>
<div class="gate-split">
<div class="workspace-panel danger">
<div class="panel-title-row">
<h2>未关闭阻塞</h2>
<span class="state-tag tone-blocked">阻塞 BLOCKED</span>
</div>
<div id="gate-blockers" class="compact-list"></div>
</div>
<div class="workspace-panel">
<div class="panel-title-row">
<h2>轻量验证</h2>
<span class="state-tag tone-source">来源 SOURCE 检查</span>
</div>
<ol id="validation-list" class="command-list"></ol>
</div>
</div>
<div class="workspace-panel">
<div class="panel-title-row">
<div>
<p class="eyebrow">同源只读</p>
<h2>诊断探测</h2>
</div>
<span class="state-tag tone-dev-live">开发实况 DEV-LIVE 只读探测</span>
</div>
<div id="diagnostics-list" class="compact-list"></div>
<div class="readonly-rpc">
<h3>允许的只读 RPC</h3>
<div id="method-list" class="rpc-chip-list"></div>
</div>
</div>
</section>
<form class="command-bar" id="command-form" aria-label="Agent 输入">
<div class="input-shell">
<span class="prompt-mark">hwlab</span>
<input
id="command-input"
autocomplete="off"
type="text"
placeholder="输入要发送给 Code Agent 的消息;不会直接触发硬件变更。"
/>
</div>
<button class="command-button" id="command-send" type="submit">发送</button>
<button class="command-button secondary" id="command-clear" type="button">清空</button>
</form>
</section>
<aside class="right-sidebar" aria-label="运行状态与可信记录">
<section class="hardware-status">
<div class="panel-title-row">
<div>
<p class="eyebrow">运行界面</p>
<h2>硬件状态:BOX-SIMU / Gateway-SIMU / hwlab-patch-panel</h2>
</div>
<span class="state-tag tone-source" id="hardware-source-status">SOURCE</span>
</div>
<div id="hardware-list" class="hardware-list" data-static-source-fallback="SOURCE">
<article class="hardware-section">
<span class="hardware-section-title">SOURCE 兜底状态</span>
<div class="hardware-rows">
<div class="hardware-row tone-border-source" data-source-kind="SOURCE">
<div class="hardware-row-head">
<span class="hardware-row-label">Gateway/Box SOURCE fixture</span>
<span class="state-tag tone-source">SOURCE</span>
</div>
<span class="hardware-row-value">离线查看</span>
<span class="hardware-row-detail">等待 app.mjs 或同源只读 counts 覆盖;当前仅展示 SOURCE 拓扑摘要。</span>
</div>
<div class="hardware-row tone-border-source" data-source-kind="SOURCE">
<div class="hardware-row-head">
<span class="hardware-row-label">hwlab-patch-panel</span>
<span class="state-tag tone-source">SOURCE</span>
</div>
<span class="hardware-row-value">来源拓扑</span>
<span class="hardware-row-detail">res_boxsimu_1:DO1 -> hwlab-patch-panel -> res_boxsimu_2:DI1 仅为源码兜底显示。</span>
</div>
<div class="hardware-row tone-border-blocked" data-source-kind="BLOCKED">
<div class="hardware-row-head">
<span class="hardware-row-label">DO1 -> patch-panel -> DI1</span>
<span class="state-tag tone-blocked">BLOCKED</span>
</div>
<span class="hardware-row-value">等待可信记录</span>
<span class="hardware-row-detail">缺少 patch-panel live report 与 operation/trace/audit/evidence IDs,不能标为 DEV-LIVE。</span>
</div>
</div>
</article>
</div>
</section>
<section class="side-workspace">
<div class="side-tabs" role="tablist" aria-label="工作台右侧面板">
<button class="side-tab active" id="tab-control" type="button" role="tab" aria-selected="true" data-side-tab="control">控制</button>
<button class="side-tab" id="tab-wiring" type="button" role="tab" aria-selected="false" data-side-tab="wiring">接线</button>
<button class="side-tab" id="tab-records" type="button" role="tab" aria-selected="false" data-side-tab="records">可信记录</button>
</div>
<section class="side-panel active" id="panel-control" role="tabpanel" aria-labelledby="tab-control" data-side-panel="control">
<div class="panel-title-row">
<h2>M3 基本 IO 控制</h2>
<span class="state-tag tone-blocked" id="m3-control-status">探测中</span>
</div>
<form class="m3-control-form" id="m3-control-form" aria-label="M3 DO1 写入">
<div class="m3-control-grid">
<label>
<span>Gateway</span>
<select id="m3-gateway-select">
<option value="gwsimu_1">gateway-simu-1</option>
</select>
</label>
<label>
<span>BOX</span>
<select id="m3-box-select">
<option value="res_boxsimu_1">box-simu-1 / res_boxsimu_1</option>
</select>
</label>
<label>
<span>端口</span>
<select id="m3-port-select">
<option value="DO1">DO1</option>
</select>
</label>
<label>
<span></span>
<select id="m3-value-select">
<option value="true">true</option>
<option value="false">false</option>
</select>
</label>
</div>
<div class="m3-control-actions">
<button class="command-button" id="m3-write-do" type="submit">写入 DO1</button>
<button class="command-button secondary" id="m3-read-di" type="button">读取 DI1</button>
</div>
</form>
<div id="control-list" class="compact-list"></div>
</section>
<section class="side-panel" id="panel-wiring" role="tabpanel" aria-labelledby="tab-wiring" data-side-panel="wiring" hidden>
<div class="panel-title-row">
<h2>接线:hwlab-patch-panel</h2>
<span class="state-tag tone-source">来源 SOURCE 接线</span>
</div>
<div class="table-wrap wiring-table-wrap">
<table class="wiring-table">
<thead>
<tr>
<th>源设备</th>
<th>源端口</th>
<th>接线盘</th>
<th>目标设备</th>
<th>目标端口</th>
<th>状态</th>
<th>证据来源</th>
<th>trace/evidence</th>
</tr>
</thead>
<tbody id="wiring-body">
<tr data-source-kind="SOURCE">
<td class="mono wrap">res_boxsimu_1</td>
<td class="mono">DO1</td>
<td class="mono wrap">hwlab-patch-panel</td>
<td class="mono wrap">res_boxsimu_2</td>
<td class="mono">DI1</td>
<td><span class="state-tag tone-blocked">阻塞 BLOCKED</span></td>
<td class="wrap">来源拓扑 / required M3 route</td>
<td class="mono wrap">等待可信记录(m3-route-required / waiting-for-dev-live</td>
</tr>
</tbody>
</table>
</div>
</section>
<section class="side-panel" id="panel-records" role="tabpanel" aria-labelledby="tab-records" data-side-panel="records" hidden>
<div class="panel-title-row">
<h2>可信记录</h2>
<span class="state-tag tone-source">来源 SOURCE + 只读查询</span>
</div>
<div id="records-list" class="compact-list"></div>
</section>
<div class="readonly-rpc sidebar-note">
<h3>复核入口</h3>
<p class="panel-copy">技术复核已移至二级页面,不作为默认工作区内容。</p>
</div>
</section>
</aside>
</main>
</body>
</html>