+569
-383
File diff suppressed because it is too large
Load Diff
+186
-252
@@ -3,287 +3,221 @@
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>HWLAB DEV Console</title>
|
||||
<title>HWLAB Cloud Workbench</title>
|
||||
<link rel="stylesheet" href="./styles.css" />
|
||||
<script type="module" src="./app.mjs"></script>
|
||||
</head>
|
||||
<body>
|
||||
<main class="shell" data-app-shell>
|
||||
<header class="masthead">
|
||||
<div class="identity">
|
||||
<p class="eyebrow">HWLAB Cloud Web / DEV</p>
|
||||
<h1>M3 Diagnostics Console</h1>
|
||||
<p class="lede">Read-only runtime observation for cloud-api health, M3 topology contracts, route, patch-panel blockers, and evidence summaries.</p>
|
||||
</div>
|
||||
<div class="live-card" aria-live="polite">
|
||||
<span class="label">Live API</span>
|
||||
<strong id="live-status">probing</strong>
|
||||
<small id="live-detail">Checking /v1 and /json-rpc from this origin.</small>
|
||||
</div>
|
||||
</header>
|
||||
<main class="workbench-shell" data-app-shell>
|
||||
<aside class="activity-rail" aria-label="Workbench activity">
|
||||
<button class="rail-button active" type="button" data-route="workspace" title="Workbench" aria-label="Workbench">WB</button>
|
||||
<button class="rail-button" type="button" data-side-tab-jump="records" title="Trusted records" aria-label="Trusted records">TR</button>
|
||||
<button class="rail-button" type="button" data-route="gate" title="Gate diagnostics" aria-label="Gate diagnostics">DG</button>
|
||||
<span class="rail-spacer" aria-hidden="true"></span>
|
||||
<button class="rail-button" id="explorer-toggle" type="button" title="Toggle explorer" aria-label="Toggle explorer">EX</button>
|
||||
</aside>
|
||||
|
||||
<nav class="module-nav" aria-label="HWLAB console modules">
|
||||
<a href="#overview" data-route="overview">Overview</a>
|
||||
<a href="#topology" data-route="topology">Topology / Patch Panel</a>
|
||||
<a href="#hardware" data-route="hardware">M3 Evidence</a>
|
||||
<a href="#agents" data-route="agents">Agent Sessions</a>
|
||||
<a href="#evidence" data-route="evidence">Evidence / Audit</a>
|
||||
<a href="#gate" data-route="gate">Gate / Diagnostics</a>
|
||||
</nav>
|
||||
|
||||
<section class="view" id="overview" data-view="overview" aria-labelledby="overview-title">
|
||||
<div class="section-head">
|
||||
<aside class="explorer" aria-label="Explorer and resource tree">
|
||||
<header class="explorer-head">
|
||||
<div>
|
||||
<p class="eyebrow">Overview</p>
|
||||
<h2 id="overview-title">Read-Only Surface</h2>
|
||||
<p class="eyebrow">HWLAB Cloud</p>
|
||||
<h1>Workbench</h1>
|
||||
</div>
|
||||
<p>Live rows are populated only from same-origin read APIs. Checked-in gate records are labeled separately.</p>
|
||||
</div>
|
||||
<div class="metrics six" id="overview-metrics"></div>
|
||||
<div class="split">
|
||||
<section class="panel">
|
||||
<div class="panel-head">
|
||||
<h3>Live Method Registry</h3>
|
||||
<p id="method-detail">Waiting for cloud-api adapter description.</p>
|
||||
</div>
|
||||
<div class="method-grid" id="method-grid"></div>
|
||||
</section>
|
||||
<section class="panel">
|
||||
<div class="panel-head">
|
||||
<h3>Runtime Summary</h3>
|
||||
<p id="runtime-detail">Waiting for cloud-api runtime summary.</p>
|
||||
</div>
|
||||
<div class="metrics two" id="runtime-metrics"></div>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
<span class="status-dot tone-blocked" id="explorer-status">blocked</span>
|
||||
</header>
|
||||
<section class="source-strip" id="source-strip" aria-label="Source state">
|
||||
<span class="state-tag tone-source">SOURCE loading</span>
|
||||
<span class="state-tag tone-dry-run">DRY-RUN loading</span>
|
||||
<span class="state-tag tone-dev-live">DEV-LIVE probing</span>
|
||||
<span class="state-tag tone-blocked">BLOCKED pending</span>
|
||||
</section>
|
||||
<section class="tree-panel">
|
||||
<div class="panel-title-row">
|
||||
<h2>Resource Tree</h2>
|
||||
<span id="tree-count">0</span>
|
||||
</div>
|
||||
<nav id="resource-tree" class="resource-tree" aria-label="HWLAB resources"></nav>
|
||||
</section>
|
||||
<section class="tree-panel blockers-panel">
|
||||
<div class="panel-title-row">
|
||||
<h2>Current Blockers</h2>
|
||||
<span id="blocker-count">0</span>
|
||||
</div>
|
||||
<div id="explorer-blockers" class="compact-list"></div>
|
||||
</section>
|
||||
</aside>
|
||||
|
||||
<section class="view" id="topology" data-view="topology" aria-labelledby="topology-title" hidden>
|
||||
<div class="section-head">
|
||||
<div>
|
||||
<p class="eyebrow">Topology / Patch Panel</p>
|
||||
<h2 id="topology-title">Gateway, Box, and Patch Contract</h2>
|
||||
<section class="center-workspace">
|
||||
<header class="topbar">
|
||||
<div class="topbar-main">
|
||||
<p class="eyebrow">M3 Trusted Loop User Surface</p>
|
||||
<h2>Agent Conversation / Trace Workspace</h2>
|
||||
<p id="route-path" class="route-path">browser/CLI/gateway -> cloud-web/cloud-api</p>
|
||||
</div>
|
||||
<p>Live runtime counts come from cloud-api. The detailed wiring below is the checked-in DEV gate contract.</p>
|
||||
</div>
|
||||
<div class="metrics four" id="topology-live-metrics"></div>
|
||||
<div class="split">
|
||||
<section class="panel">
|
||||
<div class="panel-head">
|
||||
<h3>Gateway and Box Resources</h3>
|
||||
<p>Checked-in M5 topology snapshot.</p>
|
||||
<div class="probe-card" aria-live="polite">
|
||||
<span class="metric-label">Same-Origin Read Probe</span>
|
||||
<strong id="live-status" class="tone-probing">probing</strong>
|
||||
<small id="live-detail">Checking /health/live, /v1, and read-only /json-rpc.</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 Workspace</p>
|
||||
<h2 id="workspace-title">Conversation</h2>
|
||||
</div>
|
||||
<span class="state-tag tone-blocked">BLOCKED surfaced</span>
|
||||
</div>
|
||||
<div class="conversation-list" id="conversation-list" aria-live="polite"></div>
|
||||
</div>
|
||||
|
||||
<div class="workspace-panel trace-panel">
|
||||
<div class="panel-title-row">
|
||||
<div>
|
||||
<p class="eyebrow">Trace</p>
|
||||
<h2>M0-M5 Plan Trace</h2>
|
||||
</div>
|
||||
<span class="state-tag tone-dry-run">DRY-RUN plan</span>
|
||||
</div>
|
||||
<div id="trace-list" class="trace-list"></div>
|
||||
</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">Secondary Entry</p>
|
||||
<h2 id="gate-title">Gate / Diagnostics</h2>
|
||||
</div>
|
||||
<span class="state-tag tone-source">SOURCE report</span>
|
||||
</div>
|
||||
<p class="panel-copy">
|
||||
Gate data remains available for diagnostics and acceptance review. The default route stays on the user workbench.
|
||||
</p>
|
||||
</div>
|
||||
<div class="gate-grid" id="gate-metadata"></div>
|
||||
<div class="workspace-panel">
|
||||
<div class="panel-title-row">
|
||||
<h2>M0-M5 Gates</h2>
|
||||
<span class="state-tag tone-blocked">BLOCKED if live prerequisites fail</span>
|
||||
</div>
|
||||
<div class="milestone-grid" id="milestone-grid"></div>
|
||||
</div>
|
||||
<div class="workspace-panel">
|
||||
<div class="panel-title-row">
|
||||
<h2>DEV Health Contract</h2>
|
||||
<span class="state-tag tone-source">SOURCE fixture</span>
|
||||
</div>
|
||||
<div class="table-wrap">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Type</th>
|
||||
<th>ID</th>
|
||||
<th>Service / Gateway</th>
|
||||
<th>Status</th>
|
||||
<th>Endpoint / Resource</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="topology-body"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
<section class="panel">
|
||||
<div class="panel-head">
|
||||
<h3>Patch Panel</h3>
|
||||
<p>Active wiring from the checked-in gate report.</p>
|
||||
</div>
|
||||
<div class="metrics two" id="patch-metrics"></div>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="view" id="hardware" data-view="hardware" aria-labelledby="hardware-title" hidden>
|
||||
<div class="section-head">
|
||||
<div>
|
||||
<p class="eyebrow">M3 Evidence</p>
|
||||
<h2 id="hardware-title">M3 Evidence Ledger</h2>
|
||||
</div>
|
||||
<p>The console does not issue mutating hardware requests. It shows live operation counts plus checked-in operation evidence.</p>
|
||||
</div>
|
||||
<div class="metrics four" id="hardware-live-metrics"></div>
|
||||
<section class="panel">
|
||||
<div class="panel-head">
|
||||
<h3>Checked-In Evidence</h3>
|
||||
<p>Fixture-bound M5 dry-run operations; not live dispatch proof.</p>
|
||||
</div>
|
||||
<div class="table-wrap">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Operation</th>
|
||||
<th>Requested by</th>
|
||||
<th>Status</th>
|
||||
<th>Resource</th>
|
||||
<th>Agent / Worker</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="operation-body"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section class="view" id="agents" data-view="agents" aria-labelledby="agents-title" hidden>
|
||||
<div class="section-head">
|
||||
<div>
|
||||
<p class="eyebrow">Agent Sessions</p>
|
||||
<h2 id="agents-title">Agent and Worker Runtime</h2>
|
||||
</div>
|
||||
<p>Agent session detail is from the gate contract until cloud-api exposes a read-only session query.</p>
|
||||
</div>
|
||||
<div class="split">
|
||||
<section class="panel">
|
||||
<div class="panel-head">
|
||||
<h3>Session Summary</h3>
|
||||
<p>Checked-in agent and worker evidence.</p>
|
||||
</div>
|
||||
<div class="metrics two" id="agent-metrics"></div>
|
||||
</section>
|
||||
<section class="panel">
|
||||
<div class="panel-head">
|
||||
<h3>Trace, Audit, Cleanup</h3>
|
||||
<p>Gate contract counts tied to the M5 dry-run plan.</p>
|
||||
</div>
|
||||
<div class="metrics two" id="agent-evidence-metrics"></div>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="view" id="evidence" data-view="evidence" aria-labelledby="evidence-title" hidden>
|
||||
<div class="section-head">
|
||||
<div>
|
||||
<p class="eyebrow">Evidence / Audit</p>
|
||||
<h2 id="evidence-title">Evidence Chain</h2>
|
||||
</div>
|
||||
<p>Live audit/evidence query results are shown only when cloud-api returns them. The fixture records remain labeled as checked-in evidence.</p>
|
||||
</div>
|
||||
<div class="split">
|
||||
<section class="panel">
|
||||
<div class="panel-head">
|
||||
<h3>Live Audit Query</h3>
|
||||
<p id="audit-detail">Waiting for audit.event.query.</p>
|
||||
</div>
|
||||
<div class="table-wrap compact-table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Audit</th>
|
||||
<th>Action</th>
|
||||
<th>Target</th>
|
||||
<th>Outcome</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="audit-body"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
<section class="panel">
|
||||
<div class="panel-head">
|
||||
<h3>Live Evidence Query</h3>
|
||||
<p id="evidence-query-detail">Waiting for evidence.record.query.</p>
|
||||
</div>
|
||||
<div class="table-wrap compact-table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Evidence</th>
|
||||
<th>Operation</th>
|
||||
<th>Kind</th>
|
||||
<th>Component</th>
|
||||
<th>Service</th>
|
||||
<th>Status</th>
|
||||
<th>Observed</th>
|
||||
<th>Endpoint</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="live-evidence-body"></tbody>
|
||||
<tbody id="health-body"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
<section class="panel">
|
||||
<div class="panel-head">
|
||||
<h3>Checked-In Evidence Records</h3>
|
||||
<p>Direct and agent hardware operation evidence from the M5 dry-run plan.</p>
|
||||
</div>
|
||||
<div class="table-wrap">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Evidence</th>
|
||||
<th>Operation</th>
|
||||
<th>Service</th>
|
||||
<th>URI</th>
|
||||
<th>SHA-256</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="evidence-body"></tbody>
|
||||
</table>
|
||||
<div class="gate-split">
|
||||
<div class="workspace-panel danger">
|
||||
<div class="panel-title-row">
|
||||
<h2>Open Blockers</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>Light Validation</h2>
|
||||
<span class="state-tag tone-source">SOURCE checks</span>
|
||||
</div>
|
||||
<ol id="validation-list" class="command-list"></ol>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<form class="command-bar" id="command-form" aria-label="Agent input">
|
||||
<div class="input-shell">
|
||||
<span class="prompt-mark">hwlab</span>
|
||||
<input
|
||||
id="command-input"
|
||||
autocomplete="off"
|
||||
type="text"
|
||||
placeholder="Draft an agent instruction locally; this web shell does not dispatch hardware changes."
|
||||
/>
|
||||
</div>
|
||||
<button class="command-button" type="submit">Add Draft</button>
|
||||
<button class="command-button secondary" id="command-clear" type="button">Clear</button>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<section class="view" id="gate" data-view="gate" aria-labelledby="gate-title" hidden>
|
||||
<div class="section-head">
|
||||
<div>
|
||||
<p class="eyebrow">Gate / Diagnostics</p>
|
||||
<h2 id="gate-title">DEV MVP Gate Report</h2>
|
||||
</div>
|
||||
<p>Gate data remains available here for read-only diagnostics and acceptance review.</p>
|
||||
</div>
|
||||
<section class="panel compact">
|
||||
<div class="panel-head">
|
||||
<h3>Acceptance Source</h3>
|
||||
<p>Contract-driven view of the checked-in M0-M5 gate report and M5 dry-run plan.</p>
|
||||
</div>
|
||||
<div class="metrics six" id="meta-grid"></div>
|
||||
</section>
|
||||
<section class="panel compact">
|
||||
<div class="panel-head">
|
||||
<h3>M0-M5 Gates</h3>
|
||||
<p>Local contract and dry-run status. Live DEV remains separate from fixture evidence.</p>
|
||||
</div>
|
||||
<div class="milestones" id="milestone-grid"></div>
|
||||
</section>
|
||||
<section class="panel">
|
||||
<div class="panel-head">
|
||||
<h3>DEV Health Contract</h3>
|
||||
<p>Read from the M5 gate fixture; live health is not claimed while blockers are open.</p>
|
||||
</div>
|
||||
<div class="table-wrap">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Component</th>
|
||||
<th>Service</th>
|
||||
<th>Status</th>
|
||||
<th>Observed</th>
|
||||
<th>Endpoint</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="health-body"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
<section class="split">
|
||||
<section class="panel compact danger">
|
||||
<div class="panel-head">
|
||||
<h3>Blocked Evidence</h3>
|
||||
<p>Open blocker evidence that prevents live DEV acceptance.</p>
|
||||
<aside class="right-sidebar" aria-label="Runtime status and records">
|
||||
<section class="hardware-status">
|
||||
<div class="panel-title-row">
|
||||
<div>
|
||||
<p class="eyebrow">Runtime Surface</p>
|
||||
<h2>BOX-SIMU / Gateway-SIMU / Patch Panel</h2>
|
||||
</div>
|
||||
<ul class="blockers" id="blocker-list"></ul>
|
||||
<span class="state-tag tone-dev-live">DEV-LIVE probes</span>
|
||||
</div>
|
||||
<div id="hardware-list" class="hardware-list"></div>
|
||||
</section>
|
||||
|
||||
<section class="side-workspace">
|
||||
<div class="side-tabs" role="tablist" aria-label="Workbench side panels">
|
||||
<button class="side-tab active" id="tab-control" type="button" role="tab" aria-selected="true" data-side-tab="control">Control</button>
|
||||
<button class="side-tab" id="tab-wiring" type="button" role="tab" aria-selected="false" data-side-tab="wiring">Wiring</button>
|
||||
<button class="side-tab" id="tab-records" type="button" role="tab" aria-selected="false" data-side-tab="records">Trusted Records</button>
|
||||
<button class="side-tab" id="tab-diagnostics" type="button" role="tab" aria-selected="false" data-side-tab="diagnostics">Diagnostics</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>Control Drafts</h2>
|
||||
<span class="state-tag tone-dry-run">DRY-RUN only</span>
|
||||
</div>
|
||||
<div id="control-list" class="compact-list"></div>
|
||||
</section>
|
||||
<section class="panel compact">
|
||||
<div class="panel-head">
|
||||
<h3>Validation Commands</h3>
|
||||
<p>Read-only local checks for acceptance review.</p>
|
||||
|
||||
<section class="side-panel" id="panel-wiring" role="tabpanel" aria-labelledby="tab-wiring" data-side-panel="wiring" hidden>
|
||||
<div class="panel-title-row">
|
||||
<h2>Patch Panel</h2>
|
||||
<span class="state-tag tone-source">SOURCE wiring</span>
|
||||
</div>
|
||||
<div id="wiring-list" class="compact-list"></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>Trusted Records</h2>
|
||||
<span class="state-tag tone-source">SOURCE + read query</span>
|
||||
</div>
|
||||
<div id="records-list" class="compact-list"></div>
|
||||
</section>
|
||||
|
||||
<section class="side-panel" id="panel-diagnostics" role="tabpanel" aria-labelledby="tab-diagnostics" data-side-panel="diagnostics" hidden>
|
||||
<div class="panel-title-row">
|
||||
<h2>Diagnostics</h2>
|
||||
<span class="state-tag tone-dev-live">DEV-LIVE read probes</span>
|
||||
</div>
|
||||
<div id="diagnostics-list" class="compact-list"></div>
|
||||
<div class="readonly-rpc">
|
||||
<h3>Allowed Read RPC</h3>
|
||||
<div id="method-list" class="rpc-chip-list"></div>
|
||||
</div>
|
||||
<ol class="commands" id="command-list"></ol>
|
||||
</section>
|
||||
</section>
|
||||
</section>
|
||||
</aside>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -22,29 +22,39 @@ const app = fs.readFileSync(path.resolve(rootDir, "app.mjs"), "utf8");
|
||||
const artifactPublisher = fs.readFileSync(path.resolve(repoRoot, "scripts/dev-artifact-publish.mjs"), "utf8");
|
||||
const frontendSource = `${html}\n${app}\n${artifactPublisher}`;
|
||||
|
||||
assert.match(html, /HWLAB DEV Console/);
|
||||
assert.match(html, /M3 Diagnostics Console/);
|
||||
assert.match(html, /Read-only runtime observation/);
|
||||
for (const moduleName of [
|
||||
"Overview",
|
||||
"Topology / Patch Panel",
|
||||
"M3 Evidence",
|
||||
"Agent Sessions",
|
||||
"Evidence / Audit",
|
||||
"Gate / Diagnostics"
|
||||
assert.match(html, /HWLAB Cloud Workbench/);
|
||||
assert.match(html, /Agent Conversation \/ Trace Workspace/);
|
||||
assert.match(html, /BOX-SIMU \/ Gateway-SIMU \/ Patch Panel/);
|
||||
assert.match(html, /Gate \/ Diagnostics/);
|
||||
for (const workbenchElement of [
|
||||
"activity-rail",
|
||||
"explorer",
|
||||
"resource-tree",
|
||||
"conversation-list",
|
||||
"trace-list",
|
||||
"right-sidebar",
|
||||
"command-form",
|
||||
"hardware-list",
|
||||
"control-list",
|
||||
"wiring-list",
|
||||
"records-list",
|
||||
"diagnostics-list"
|
||||
]) {
|
||||
assert.match(html, new RegExp(moduleName.replaceAll("/", "\\/")));
|
||||
assert.match(html, new RegExp(workbenchElement));
|
||||
}
|
||||
for (const viewId of ["overview", "topology", "hardware", "agents", "evidence", "gate"]) {
|
||||
for (const viewId of ["workspace", "gate"]) {
|
||||
assert.match(html, new RegExp(`data-view="${viewId}"`));
|
||||
}
|
||||
assert.match(html, /live-status/);
|
||||
assert.match(html, /method-grid/);
|
||||
assert.match(html, /runtime-metrics/);
|
||||
assert.match(html, /operation-body/);
|
||||
assert.match(html, /audit-body/);
|
||||
assert.match(html, /evidence-body/);
|
||||
assert.match(html, /method-list/);
|
||||
assert.match(html, /source-strip/);
|
||||
assert.match(html, /SOURCE loading/);
|
||||
assert.match(html, /DRY-RUN loading/);
|
||||
assert.match(html, /DEV-LIVE probing/);
|
||||
assert.match(html, /BLOCKED pending/);
|
||||
assert.doesNotMatch(html, /M3 Diagnostics Console/);
|
||||
assert.match(app, /fetchJson\("\/v1"\)/);
|
||||
assert.match(app, /fetchJson\("\/health\/live"\)/);
|
||||
assert.match(app, /callRpc\("system\.health"\)/);
|
||||
assert.match(app, /callRpc\("cloud\.adapter\.describe"\)/);
|
||||
assert.match(app, /callRpc\("audit\.event\.query"/);
|
||||
@@ -90,4 +100,4 @@ assert.equal(gateSummary.safety.allowNetwork, false);
|
||||
|
||||
runCloudWebM3ReadonlyContract();
|
||||
|
||||
console.log("hwlab-cloud-web check ok: read-only M3 diagnostics contract is present");
|
||||
console.log("hwlab-cloud-web check ok: workbench shell is present and read-only diagnostics contract is preserved");
|
||||
|
||||
+739
-333
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user