devagent-ignition 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- devagent_hmi.py +471 -0
- devagent_ignition-0.1.0.dist-info/METADATA +204 -0
- devagent_ignition-0.1.0.dist-info/RECORD +133 -0
- devagent_ignition-0.1.0.dist-info/WHEEL +4 -0
- devagent_ignition-0.1.0.dist-info/entry_points.txt +2 -0
- devagent_spatial/__init__.py +1 -0
- devagent_spatial/_resources/README.md +187 -0
- devagent_spatial/_resources/RELEASE_MANIFEST.json +312 -0
- devagent_spatial/_resources/SHA256SUMS.txt +270 -0
- devagent_spatial/_resources/SOURCE_PROVENANCE.json +186 -0
- devagent_spatial/_resources/assets/agent.js +102 -0
- devagent_spatial/_resources/assets/creator.css +247 -0
- devagent_spatial/_resources/assets/creator_2d.mjs +16 -0
- devagent_spatial/_resources/assets/creator_original_r9.mjs +58 -0
- devagent_spatial/_resources/assets/creator_original_v8.mjs +120 -0
- devagent_spatial/_resources/assets/creator_r9_diagnostics.mjs +53 -0
- devagent_spatial/_resources/assets/creator_scene.mjs +128 -0
- devagent_spatial/_resources/assets/creator_ui.mjs +60 -0
- devagent_spatial/_resources/assets/customer_documents.js +110 -0
- devagent_spatial/_resources/assets/equipment_controls.mjs +27 -0
- devagent_spatial/_resources/assets/facility2d.css +24 -0
- devagent_spatial/_resources/assets/facility2d_app.mjs +45 -0
- devagent_spatial/_resources/assets/facility2d_core.mjs +114 -0
- devagent_spatial/_resources/assets/facility2d_simulation.mjs +167 -0
- devagent_spatial/_resources/assets/facility2d_viewer.html +7 -0
- devagent_spatial/_resources/assets/fallback_scene.js +17 -0
- devagent_spatial/_resources/assets/flow_geometry.mjs +218 -0
- devagent_spatial/_resources/assets/harness.js +78 -0
- devagent_spatial/_resources/assets/live_design_review.js +129 -0
- devagent_spatial/_resources/assets/operations_ui.js +305 -0
- devagent_spatial/_resources/assets/operator_viewer.html +64 -0
- devagent_spatial/_resources/assets/project_package.js +52 -0
- devagent_spatial/_resources/assets/r9_transport.mjs +70 -0
- devagent_spatial/_resources/assets/runtime_feed.js +30 -0
- devagent_spatial/_resources/assets/studio.html +139 -0
- devagent_spatial/_resources/assets/style.css +191 -0
- devagent_spatial/_resources/assets/test_workspace.html +195 -0
- devagent_spatial/_resources/assets/three_scene.js +442 -0
- devagent_spatial/_resources/assets/unified_engineer.js +101 -0
- devagent_spatial/_resources/assets/v076_fat_ui.js +40 -0
- devagent_spatial/_resources/assets/v078_command_ui.js +44 -0
- devagent_spatial/_resources/assets/viewer.html +45 -0
- devagent_spatial/_resources/assets/viewer.js +112 -0
- devagent_spatial/_resources/design-system.json +130 -0
- devagent_spatial/_resources/examples/CV101-command-contract-PENDING.json +30 -0
- devagent_spatial/_resources/examples/cv101_guided.json +272 -0
- devagent_spatial/_resources/examples/make_examples.py +36 -0
- devagent_spatial/_resources/examples/single_floor.json +444 -0
- devagent_spatial/_resources/examples/v0771_training_wizard.json +11 -0
- devagent_spatial/_resources/examples/warehouse-3floor-standard-2d.json +708 -0
- devagent_spatial/_resources/examples/warehouse-operations-synthetic.json +1186 -0
- devagent_spatial/_resources/examples/warehouse-v07-lab-bindings-PENDING.json +372 -0
- devagent_spatial/_resources/examples/warehouse.json +708 -0
- devagent_spatial/_resources/examples/water.json +288 -0
- devagent_spatial/_resources/reference/r9-golden/REFERENCE_SHA256.json +13 -0
- devagent_spatial/_resources/reference/r9-golden/web/app.mjs +745 -0
- devagent_spatial/_resources/reference/r9-golden/web/index.html +213 -0
- devagent_spatial/_resources/reference/r9-golden/web/lab_panel.mjs +53 -0
- devagent_spatial/_resources/reference/r9-golden/web/model.mjs +367 -0
- devagent_spatial/_resources/reference/r9-golden/web/state_adapter.mjs +78 -0
- devagent_spatial/_resources/reference/r9-golden/web/styles.css +76 -0
- devagent_spatial/_resources/reference/r9-original/README_R9.md +27 -0
- devagent_spatial/_resources/reference/r9-original/SHA256SUMS.txt +63 -0
- devagent_spatial/_resources/reference/r9-original/SNAPSHOT_SHA256SUMS.txt +16 -0
- devagent_spatial/_resources/reference/r9-original/flow_routes.json +527 -0
- devagent_spatial/_resources/reference/r9-original/flow_sim.py +117 -0
- devagent_spatial/_resources/reference/r9-original/lab_control.py +73 -0
- devagent_spatial/_resources/reference/r9-original/web/app.mjs +745 -0
- devagent_spatial/_resources/reference/r9-original/web/index.html +213 -0
- devagent_spatial/_resources/reference/r9-original/web/lab_panel.mjs +53 -0
- devagent_spatial/_resources/reference/r9-original/web/model.mjs +367 -0
- devagent_spatial/_resources/reference/r9-original/web/state_adapter.mjs +78 -0
- devagent_spatial/_resources/reference/r9-original/web/styles.css +76 -0
- devagent_spatial/_resources/reference/r9-original/web/vendor/LICENSE-three.txt +21 -0
- devagent_spatial/_resources/reference/r9-original/web/vendor/SHA256SUMS.txt +4 -0
- devagent_spatial/_resources/reference/r9-original/web/vendor/addons/controls/OrbitControls.js +1860 -0
- devagent_spatial/_resources/reference/r9-original/web/vendor/three.core.js +58773 -0
- devagent_spatial/_resources/reference/r9-original/web/vendor/three.module.js +18251 -0
- devagent_spatial/_resources/reference/v8-original/README.md +36 -0
- devagent_spatial/_resources/reference/v8-original/SHA256SUMS.txt +12 -0
- devagent_spatial/_resources/reference/v8-original/model.py +124 -0
- devagent_spatial/_resources/reference/v8-original/run_demo.sh +4 -0
- devagent_spatial/_resources/reference/v8-original/server.py +100 -0
- devagent_spatial/_resources/reference/v8-original/tests/browser_smoke.py +50 -0
- devagent_spatial/_resources/reference/v8-original/tests/test_v8.py +144 -0
- devagent_spatial/_resources/reference/v8-original/topology.json +24 -0
- devagent_spatial/_resources/reference/v8-original/web/app.js +114 -0
- devagent_spatial/_resources/reference/v8-original/web/index.html +22 -0
- devagent_spatial/_resources/reference/v8-original/web/simulator.html +1 -0
- devagent_spatial/_resources/reference/v8-original/web/simulator.js +6 -0
- devagent_spatial/_resources/reference/v8-original/web/style.css +16 -0
- devagent_spatial/_resources/sample_customer_inputs/Plant_Equipment_Register.csv +4 -0
- devagent_spatial/_resources/sample_customer_inputs/Plant_Flow_Requirements.txt +5 -0
- devagent_spatial/_resources/sample_customer_inputs/Raw_PLC_Tag_Export.csv +4 -0
- devagent_spatial/_resources/templates/warehouse_connections.csv +12 -0
- devagent_spatial/_resources/templates/warehouse_equipment.csv +21 -0
- devagent_spatial/_resources/templates/warehouse_signals.csv +34 -0
- devagent_spatial/_resources/templates/water_connections.csv +7 -0
- devagent_spatial/_resources/templates/water_equipment.csv +10 -0
- devagent_spatial/_resources/templates/water_signals.csv +12 -0
- devagent_spatial/agent_harness.py +299 -0
- devagent_spatial/agent_runtime.py +314 -0
- devagent_spatial/contract_opc_fat.py +216 -0
- devagent_spatial/contract_opc_source.py +265 -0
- devagent_spatial/control_intents.py +38 -0
- devagent_spatial/customer_intake.py +235 -0
- devagent_spatial/engineering_expertise.py +114 -0
- devagent_spatial/generator.py +201 -0
- devagent_spatial/ignition_native.py +234 -0
- devagent_spatial/ignition_project.py +144 -0
- devagent_spatial/live_lab_binding.py +128 -0
- devagent_spatial/model.py +297 -0
- devagent_spatial/native_reference.py +69 -0
- devagent_spatial/opc_snapshot.py +87 -0
- devagent_spatial/operations.py +284 -0
- devagent_spatial/operations_capture.py +47 -0
- devagent_spatial/operations_lab.py +64 -0
- devagent_spatial/original_r9.py +169 -0
- devagent_spatial/original_v8.py +81 -0
- devagent_spatial/preflight.py +140 -0
- devagent_spatial/preview_simulation.py +189 -0
- devagent_spatial/project_package.py +101 -0
- devagent_spatial/qualification.py +152 -0
- devagent_spatial/strict_json.py +29 -0
- devagent_spatial/studio.py +894 -0
- devagent_spatial/studio_workflow.py +277 -0
- devagent_spatial/test_reporting.py +87 -0
- devagent_spatial/v076_opc_fat.py +180 -0
- devagent_spatial/v078_commands.py +277 -0
- devagent_spatial/v078_native_commands.py +161 -0
- devagent_spatial/v07_fat.py +110 -0
- devagent_spatial/v07_native.py +318 -0
- devagent_spatial/v083_native.py +349 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<meta name="theme-color" content="#07121f" />
|
|
7
|
+
<title>DevAgent V1J | Live Photoeyes & Scanner Simulation</title>
|
|
8
|
+
<link rel="stylesheet" href="/styles.css" />
|
|
9
|
+
<!-- R9 UI-only: compact command bar; status remains screen-reader accessible. -->
|
|
10
|
+
<style id="devagent-r9-buttons-only">
|
|
11
|
+
/* Keep original R9 stylesheet, visuals, lab command DOM, and logic intact. */
|
|
12
|
+
.lab-console { justify-content: center; padding: 8px 15px; min-height: 56px; }
|
|
13
|
+
.lab-console .lab-buttons { width: 100%; justify-content: flex-end; }
|
|
14
|
+
.lab-console .lab-label, .lab-console .lab-message {
|
|
15
|
+
position: absolute !important;
|
|
16
|
+
width: 1px !important;
|
|
17
|
+
height: 1px !important;
|
|
18
|
+
padding: 0 !important;
|
|
19
|
+
margin: -1px !important;
|
|
20
|
+
overflow: hidden !important;
|
|
21
|
+
clip: rect(0, 0, 0, 0) !important;
|
|
22
|
+
white-space: nowrap !important;
|
|
23
|
+
border: 0 !important;
|
|
24
|
+
}
|
|
25
|
+
</style>
|
|
26
|
+
<!-- End R9 UI-only command bar. -->
|
|
27
|
+
<!-- R9: constrain inspector height to the unchanged 3D viewer, so the next section follows without an empty stretched area. -->
|
|
28
|
+
<style id="devagent-r9-compact-panel-height">
|
|
29
|
+
@media (min-width: 1101px) {
|
|
30
|
+
.content-grid { align-items: start; }
|
|
31
|
+
.content-grid > .inspector {
|
|
32
|
+
max-height: calc(clamp(425px, 50vw, 666px) + 175px);
|
|
33
|
+
overflow-y: auto;
|
|
34
|
+
overscroll-behavior-y: contain;
|
|
35
|
+
scrollbar-width: thin;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
@media (min-width: 1101px) and (max-width: 1400px) {
|
|
39
|
+
.content-grid > .inspector { max-height: 725px; }
|
|
40
|
+
}
|
|
41
|
+
</style>
|
|
42
|
+
<!-- End R9 compact panel height. -->
|
|
43
|
+
<script type="importmap">
|
|
44
|
+
{"imports":{
|
|
45
|
+
"three":"/vendor/three.module.js",
|
|
46
|
+
"three/addons/":"/vendor/addons/"
|
|
47
|
+
}}
|
|
48
|
+
</script>
|
|
49
|
+
<!-- R9 R5: larger 3D in Ignition only; standalone viewer stays unchanged. -->
|
|
50
|
+
<style id="devagent-r9-large-3d-r5">
|
|
51
|
+
html.ignition-embedded.native-operator .content-grid {align-items:start!important;}
|
|
52
|
+
html.ignition-embedded.native-operator .viewer-card {align-self:start!important;}
|
|
53
|
+
html.ignition-embedded.native-operator .stage {height:590px!important;min-height:0!important;}
|
|
54
|
+
html.ignition-embedded.native-operator .inspector {max-height:770px!important;overflow-y:auto!important;align-self:start!important;}
|
|
55
|
+
</style>
|
|
56
|
+
</head>
|
|
57
|
+
<body>
|
|
58
|
+
<div class="app-shell">
|
|
59
|
+
<aside class="rail" aria-label="App navigation">
|
|
60
|
+
<div class="brand">D<span>›</span></div>
|
|
61
|
+
<span class="rail-sep"></span>
|
|
62
|
+
<button class="rail-btn active" aria-label="Spatial operations" title="Spatial operations">▦</button>
|
|
63
|
+
<button class="rail-btn" id="rail-overview" aria-label="Fit warehouse" title="Fit warehouse">◇</button>
|
|
64
|
+
<button class="rail-btn" id="rail-faults" aria-label="Find faults" title="Find faults">⚡</button>
|
|
65
|
+
<div class="rail-spacer"></div>
|
|
66
|
+
<div class="rail-footer">V1J<br><small>LAB</small></div>
|
|
67
|
+
</aside>
|
|
68
|
+
<div class="workarea">
|
|
69
|
+
<header class="topbar">
|
|
70
|
+
<div class="eyebrow">DEVAGENT <span class="slash">/</span> DIGITAL TWIN <span class="slash">/</span> SPATIAL OPERATIONS</div>
|
|
71
|
+
<div class="topbar-bottom">
|
|
72
|
+
<div><h1>Facility command center <span class="build-tag">V1J R3 · SENSOR LAB</span></h1>
|
|
73
|
+
<p class="lede">A connected system, viewed at every elevation.</p></div>
|
|
74
|
+
<div class="top-actions"><div class="time-chip"><span class="pulse"></span><span id="render-status">RENDER INITIALIZING</span></div><button class="outline-button" id="reset-view">⌖ RESET CAMERA</button></div>
|
|
75
|
+
</div>
|
|
76
|
+
</header>
|
|
77
|
+
<section class="metrics" aria-label="Facility overview">
|
|
78
|
+
<div class="metric"><span>DEVICES RUNNING</span><div class="metric-value"><b id="metric-online">22</b><small>/ 22</small></div><em id="online-caption">Illustrative equipment</em></div>
|
|
79
|
+
<div class="metric"><span>PARCELS IN TRANSIT</span><div class="metric-value"><b id="metric-parcels">8</b><small id="parcel-unit">simulated</small></div><em id="parcel-caption">Flowing through 3 levels</em></div>
|
|
80
|
+
<div class="metric"><span>ACTIVE FAULTS</span><div class="metric-value"><b id="metric-faults">0</b><small>equipment</small></div><em id="fault-caption">No simulated exceptions</em></div>
|
|
81
|
+
<div class="metric"><span>CONNECTED FLOORS</span><div class="metric-value"><b>03</b><small>vertical zones</small></div><em>Incline + spiral transfers</em></div>
|
|
82
|
+
<div class="metric metric-source"><span>DATA SOURCE</span><div class="source-value"><i id="source-led"></i><b id="data-source">SIMULATION</b></div><em id="source-caption">Demo until verified mapping</em></div>
|
|
83
|
+
</section>
|
|
84
|
+
<section class="lab-console" aria-label="Isolated simulator operator console">
|
|
85
|
+
<div class="lab-label"><div class="panel-index">SIMULATOR OPERATOR STATION · LAB ONLY</div><div class="lab-state-row"><strong id="lab-state" data-state="OFFLINE">CONNECTING</strong><span id="lab-revision">REV —</span><span id="lab-alarm">NO ACTIVE ALARM</span></div></div>
|
|
86
|
+
<div class="lab-buttons" role="group" aria-label="Local simulator commands">
|
|
87
|
+
<button type="button" data-lab-command="start" class="lab-btn lab-start" disabled>▶ START</button>
|
|
88
|
+
<button type="button" data-lab-command="stop" class="lab-btn lab-stop" disabled>■ STOP</button>
|
|
89
|
+
<button type="button" data-lab-command="reset" class="lab-btn lab-reset" disabled>↺ RESET</button>
|
|
90
|
+
<button type="button" data-lab-command="ack" class="lab-btn lab-ack" disabled>✓ ACK</button>
|
|
91
|
+
<button type="button" data-lab-command="inject_jam" class="lab-btn lab-test" disabled>⚠ JAM TEST</button>
|
|
92
|
+
</div>
|
|
93
|
+
<div class="lab-message" id="lab-message" role="status" aria-live="polite">SIMULATOR CONTROLLER INITIALIZING</div>
|
|
94
|
+
</section>
|
|
95
|
+
<main class="content-grid">
|
|
96
|
+
<section class="viewer-card" aria-label="3D warehouse model">
|
|
97
|
+
<div class="panel-head">
|
|
98
|
+
<div><div class="panel-index">01 / SPATIAL FACILITY MAP <span>—</span> WAREHOUSE V1J</div><h2>Spatial material flow</h2><p>Original warehouse intact · R9 compact in-floor sorter: 4 discharge chutes → 4 powered spirals → Floor 02 takeaways → metered merge</p></div>
|
|
99
|
+
<div class="panel-utilities"><button id="btn-connect" class="outline-button">↗ CONNECT V1C</button><button id="btn-demo-wave" class="accent-button">▶ RESTART DEMO FLOW</button></div>
|
|
100
|
+
</div>
|
|
101
|
+
<div class="view-toolbar" role="toolbar" aria-label="3D viewing modes">
|
|
102
|
+
<span class="toolbar-title">VIEW MODE</span>
|
|
103
|
+
<button class="view-mode active" data-mode="stacked" aria-pressed="true">3D OVERVIEW</button>
|
|
104
|
+
<button class="view-mode" data-mode="exploded" aria-pressed="false">EXPLODED</button>
|
|
105
|
+
<button class="view-mode" data-mode="xray" aria-pressed="false">X-RAY</button>
|
|
106
|
+
<button class="view-mode" data-mode="incline" aria-pressed="false">↗ INCLINE VIEW</button>
|
|
107
|
+
<button class="view-mode" data-mode="docks" aria-pressed="false">DOCKS</button>
|
|
108
|
+
<button class="view-mode" data-mode="sorter" aria-pressed="false">▰ 4 CHUTES · 4 SPIRALS</button>
|
|
109
|
+
<span class="toolbar-divider"></span>
|
|
110
|
+
<button class="view-mode" data-mode="floor1" aria-pressed="false">FLOOR 01</button>
|
|
111
|
+
<button class="view-mode" data-mode="floor2" aria-pressed="false">FLOOR 02</button>
|
|
112
|
+
<button class="view-mode" data-mode="floor3" aria-pressed="false">FLOOR 03</button>
|
|
113
|
+
<div class="toolbar-grow"></div><button class="icon-button" id="toggle-sensors" aria-label="Show PE labels when zoomed in; always show the selected conveyor" title="PE labels (close-up only)" aria-pressed="false">PE</button><button class="icon-button" id="toggle-labels" aria-label="Toggle equipment labels" title="Toggle labels">Aa</button>
|
|
114
|
+
</div>
|
|
115
|
+
<div class="stage" id="stage">
|
|
116
|
+
<div class="stage-grid"></div><div id="canvas-mount"></div>
|
|
117
|
+
<div class="scene-loading" id="scene-loading"><div class="spinner"></div><b>BUILDING SPATIAL MODEL</b><span>Initializing Three.js WebGL renderer...</span></div>
|
|
118
|
+
<div class="stage-hud top-left"><div class="hud-kicker">OPERATIONAL DIGITAL TWIN</div><div class="hud-title" id="mode-description">PARCEL HUB · 3 LEVELS</div><div class="hud-note" id="mode-note">Isometric / navigable</div></div>
|
|
119
|
+
<div class="stage-hud top-right"><span class="live-indicator"><span class="pulsedot"></span><span id="viewport-mode">SIMULATED / READ ONLY</span></span><div class="fps" id="fps-indicator">WEBGL · -- FPS</div></div>
|
|
120
|
+
<div class="camera-hint">LEFT DRAG <strong>ORBIT</strong><i>·</i> RIGHT DRAG <strong>PAN</strong><i>·</i> SCROLL <strong>ZOOM</strong><i>·</i> CLICK <strong>INSPECT</strong></div>
|
|
121
|
+
<div class="floor-key"><div class="floor-key-heading">3D LAYER INDEX</div>
|
|
122
|
+
<button data-floor="3"><span class="floor-icon floor-three"></span><span>03 <small>OUTBOUND DISTRIBUTION</small></span><b id="floor3-count">16</b></button>
|
|
123
|
+
<button data-floor="2"><span class="floor-icon floor-two"></span><span>02 <small>MAIN SORTATION</small></span><b id="floor2-count">11</b></button>
|
|
124
|
+
<button data-floor="1"><span class="floor-icon floor-one"></span><span>01 <small>RECEIVING HANDOFF</small></span><b id="floor1-count">7</b></button>
|
|
125
|
+
</div>
|
|
126
|
+
<div class="stage-legend"><span><i class="swatch ok"></i> Running</span><span><i class="swatch warning"></i> Blocked</span><span><i class="swatch error"></i> Fault</span><span><i class="swatch muted"></i> Unknown</span><span><i class="swatch parcel"></i> Parcel</span><span><i class="swatch ok"></i> PE CLEAR</span><span><i class="swatch warning"></i> PE BLOCKED (YELLOW)</span></div>
|
|
127
|
+
</div>
|
|
128
|
+
<div class="status-strip"><div><span class="status-square"></span><span id="status-summary">22 original assets preserved · new compact in-floor sorter · 2 inbound / 3 outbound docks</span></div><span id="render-note">ILLUSTRATIVE GEOMETRY • NOT A VERIFIED PHYSICAL DESIGN</span></div>
|
|
129
|
+
</section>
|
|
130
|
+
<aside class="inspector" aria-label="Equipment inspector">
|
|
131
|
+
<div class="inspector-head"><div class="panel-index">02 / EQUIPMENT INSPECTOR</div><h2>Asset intelligence</h2><p>Select any conveyor in the 3D facility.</p></div>
|
|
132
|
+
<div class="selected-asset"><div class="asset-heading"><div><span class="asset-category" id="asset-category">VERTICAL TRANSFER</span><h3 id="asset-name">SPIRAL01</h3><span class="asset-location" id="asset-location">Floor 02 → Floor 03 · Transfer</span></div><span class="run-badge" id="asset-badge">RUNNING</span></div>
|
|
133
|
+
<div class="asset-stats"><div><span>RUN FEEDBACK</span><strong id="asset-run">TRUE</strong></div><div><span>MOTOR SPEED</span><strong id="asset-speed">1.20 m/s</strong></div><div><span>FAULT</span><strong id="asset-fault">NONE</strong></div><div><span>PHOTOEYE IN</span><strong id="asset-pe-in">CLEAR</strong></div><div><span>PHOTOEYE OUT</span><strong id="asset-pe-out">CLEAR</strong></div><div><span>STATE QUALITY</span><strong id="asset-quality">DEMO</strong></div></div>
|
|
134
|
+
<div class="transfer-details" id="transfer-details" hidden>
|
|
135
|
+
<div class="detail-heading" id="transfer-title">INTER-FLOOR TRANSFER</div>
|
|
136
|
+
<div class="transfer-measures"><div><span>ASCENT</span><strong id="transfer-grade">—</strong></div><div><span>VERTICAL RISE</span><strong id="transfer-rise">—</strong></div></div>
|
|
137
|
+
<small id="transfer-note">Representative spatial profile</small>
|
|
138
|
+
</div>
|
|
139
|
+
<div class="sensor-io" aria-label="Virtual sensor diagnostics">
|
|
140
|
+
<div class="detail-heading">PHOTOEYE EVENTS • SIMULATED</div>
|
|
141
|
+
<div class="asset-stats"><div><span>PE IN EVENTS</span><strong id="asset-pe-in-count">—</strong></div><div><span>PE OUT EVENTS</span><strong id="asset-pe-out-count">—</strong></div></div>
|
|
142
|
+
<div class="detail-heading">DWS / DESTINATION SCAN • SIMULATED</div>
|
|
143
|
+
<div class="asset-stats"><div><span>DWS READS</span><strong id="scan-dws-count">0</strong></div><div><span>DWS LAST</span><strong id="scan-dws-result">NO_SCAN</strong></div><div><span>DEST READS</span><strong id="scan-dest-count">0</strong></div><div><span>DEST LAST</span><strong id="scan-dest-result">NO_SCAN</strong></div><div><span>LAST PARCEL</span><strong id="scan-last-id">—</strong></div><div><span>NO-READ TOTAL</span><strong id="scan-no-read">0</strong></div></div>
|
|
144
|
+
<div id="sensor-summary" class="sensor-summary">PE SIGNALS WAITING FOR SIMULATOR</div>
|
|
145
|
+
<div id="sensor-event" class="sensor-event" role="status">NO SENSOR EVENT YET</div>
|
|
146
|
+
</div><div class="detail-divider"></div><div class="detail-heading">MATERIAL PATH</div><div class="route-chip" id="asset-route">CV208 → SPIRAL01 → CV301</div>
|
|
147
|
+
<div class="detail-heading">EQUIPMENT NAVIGATION</div><div class="asset-neighbors"><button id="nav-upstream" class="neighbor-btn">← UPSTREAM <strong>CV208</strong></button><button id="nav-downstream" class="neighbor-btn">DOWNSTREAM → <strong>CV301</strong></button></div>
|
|
148
|
+
<div class="detail-divider"></div><div class="detail-heading">ASSET SEARCH</div><div class="search-row"><input type="search" id="asset-search" placeholder="CV208, SPIRAL01..." aria-label="Find equipment"/><button id="search-go">FIND</button></div><div id="search-error" class="search-error" role="status"></div>
|
|
149
|
+
<div class="inspector-foot"><span class="inspector-dot"></span><span id="quality-note">Simulation mode. Equipment states are illustrative.</span></div></div>
|
|
150
|
+
</aside>
|
|
151
|
+
<section class="bottom-card"><div class="section-mark">03 / END-TO-END PARCEL JOURNEY</div><div class="bottom-flow"><div class="flow-step"><span>01</span><strong>RECEIVING</strong><small>2 dock doors · induction</small></div><b class="flow-arrow">→</b><div class="flow-step"><span>↗</span><strong>INCLINE</strong><small>F1 → F2</small></div><b class="flow-arrow">→</b><div class="flow-step"><span>02</span><strong>SORTATION</strong><small>SORT201</small></div><b class="flow-arrow">→</b><div class="flow-step"><span>↗</span><strong>SPIRAL</strong><small>F2 → F3</small></div><b class="flow-arrow">→</b><div class="flow-step"><span>03</span><strong>DESTINATION SORT</strong><small>SORT301</small></div><b class="flow-arrow">→</b><div class="flow-step"><span>↘</span><strong>3 CHUTES</strong><small>Powered decline</small></div><b class="flow-arrow">→</b><div class="flow-step"><span>⇥</span><strong>SHIP DOCKS</strong><small>OUT 01–03</small></div></div><div class="activity" id="activity" aria-live="polite">SYSTEM · 3D spatial viewer loading…</div></section>
|
|
152
|
+
</main>
|
|
153
|
+
<footer class="footer">DEVAGENT V1J R9 · COMPACT FOUR-SPIRAL PREVIEW · ISOLATED LAB <span>·</span> NO PLC WRITES <span>·</span> NEW CONCEPT ASSETS = VIRTUAL ONLY <span>·</span> WAREHOUSE V11 UNCHANGED <span class="footer-right">OPERATOR EXPLORATION / NOT CERTIFIED FOR CONTROL</span></footer>
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
<script>
|
|
157
|
+
// Static imports fail before app.mjs starts, so use an explicit, instrumented
|
|
158
|
+
// module bootstrap. This distinguishes dependency failure from scene failures.
|
|
159
|
+
(function () {
|
|
160
|
+
var loading = document.getElementById('scene-loading');
|
|
161
|
+
var busy = true;
|
|
162
|
+
function showFailure(heading, message) {
|
|
163
|
+
if (!busy) return;
|
|
164
|
+
busy = false;
|
|
165
|
+
loading.querySelector('b').textContent = heading;
|
|
166
|
+
loading.querySelector('span').textContent = message;
|
|
167
|
+
loading.classList.add('engine-error');
|
|
168
|
+
document.getElementById('render-status').textContent = 'ENGINE UNAVAILABLE';
|
|
169
|
+
document.getElementById('activity').textContent = 'RENDER ERROR · ' + message;
|
|
170
|
+
}
|
|
171
|
+
window.addEventListener('error', function (e) {
|
|
172
|
+
if (loading && !loading.classList.contains('hidden')) {
|
|
173
|
+
showFailure('3D RENDER ERROR', 'Browser error: ' + (e.message || 'Script failed') + '. Check Firefox Console (F12).');
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
window.addEventListener('unhandledrejection', function (e) {
|
|
177
|
+
if (loading && !loading.classList.contains('hidden')) {
|
|
178
|
+
showFailure('3D RENDER ERROR', 'Module failure: ' + String(e.reason || 'Unknown') + '. Check Firefox Console (F12).');
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
window.addEventListener('devagent-engine-failure', function (e) {
|
|
182
|
+
showFailure(e.detail.heading, e.detail.message);
|
|
183
|
+
});
|
|
184
|
+
setTimeout(function () {
|
|
185
|
+
if (busy && loading && !loading.classList.contains('hidden')) {
|
|
186
|
+
showFailure('3D ENGINE TIMEOUT', 'Three.js did not initialize. Run python3 install_existing_three.py ../devagent-v1f-parcel-hub-r2, then check F12 Console.');
|
|
187
|
+
}
|
|
188
|
+
}, 15000);
|
|
189
|
+
window.devagentEngineLoaded = function () { busy = false; };
|
|
190
|
+
})();
|
|
191
|
+
</script>
|
|
192
|
+
<script type="module">
|
|
193
|
+
try {
|
|
194
|
+
await import('/app.mjs');
|
|
195
|
+
} catch (error) {
|
|
196
|
+
let offline = false;
|
|
197
|
+
try {
|
|
198
|
+
const response = await fetch('/api/engine/status', {cache: 'no-store'});
|
|
199
|
+
const status = await response.json();
|
|
200
|
+
offline = !status.offline_ready;
|
|
201
|
+
} catch (_) {}
|
|
202
|
+
const message = offline
|
|
203
|
+
? 'Three.js is not available locally and the browser could not load it. Run python3 install_existing_three.py in the V1F-R2 folder, then reload.'
|
|
204
|
+
: 'Local engine exists but initialization failed: ' + String(error && error.message || error) + '. Check F12 Console.';
|
|
205
|
+
window.dispatchEvent(new CustomEvent('devagent-engine-failure', {
|
|
206
|
+
detail: {heading: offline ? '3D DEPENDENCY MISSING' : '3D APPLICATION ERROR', message: message}
|
|
207
|
+
}));
|
|
208
|
+
console.error('[DevAgent V1G] Render initialization failed', error);
|
|
209
|
+
}
|
|
210
|
+
</script>
|
|
211
|
+
<script type="module" src="/lab_panel.mjs"></script>
|
|
212
|
+
</body>
|
|
213
|
+
</html>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Isolated lab controller. This module is intentionally independent of Three.js;
|
|
2
|
+
// browser commands never write to V1C, Ignition tags, or OPC UA.
|
|
3
|
+
const $=id=>document.getElementById(id);
|
|
4
|
+
const buttons=[...document.querySelectorAll('[data-lab-command]')];
|
|
5
|
+
let token=null, state=null, busy=false, connected=false;
|
|
6
|
+
window.devagentLabState=null;
|
|
7
|
+
function status(msg, bad=false){$('lab-message').textContent=msg;$('lab-message').classList.toggle('lab-bad',bad);}
|
|
8
|
+
function display(s){
|
|
9
|
+
state=s;window.devagentLabState=s;
|
|
10
|
+
const running=s.run_state==='RUNNING',fault=s.run_state==='FAULT';
|
|
11
|
+
const tag=$('lab-state');tag.textContent=s.enabled?s.run_state:'DISABLED';
|
|
12
|
+
tag.dataset.state=s.enabled?s.run_state:'DISABLED';
|
|
13
|
+
const source=window.devagentSourceMode||'SIMULATION';
|
|
14
|
+
const canControl=s.enabled&&!busy&&source==='SIMULATION';
|
|
15
|
+
const allowed={start:s.run_state==='STOPPED'&&!s.fault,stop:running,
|
|
16
|
+
reset:!running&&(!s.fault||s.alarm_acknowledged),ack:!!s.fault&&!s.alarm_acknowledged,inject_jam:running};
|
|
17
|
+
for(const b of buttons)b.disabled=!canControl||!allowed[b.dataset.labCommand];
|
|
18
|
+
// The old visual-only restart bypasses the formal RESET sequence; lock it
|
|
19
|
+
// whenever the local command state machine is active.
|
|
20
|
+
if($('btn-demo-wave')){
|
|
21
|
+
$('btn-demo-wave').disabled=!!s.enabled;
|
|
22
|
+
$('btn-demo-wave').title=s.enabled?'Use STOP / ACK / RESET in the lab operator station':'Restart illustrative demo wave';
|
|
23
|
+
}
|
|
24
|
+
$('lab-revision').textContent=`REV ${s.revision} · WAVE ${s.wave}`;
|
|
25
|
+
$('lab-alarm').textContent=s.fault?(s.alarm_acknowledged?'JAM ACKNOWLEDGED · RESET REQUIRED':'JAM CV208 · ACK REQUIRED'):'NO ACTIVE ALARM';
|
|
26
|
+
if(!s.enabled)status('READ-ONLY LOCKED · enable isolated lab commands at launch');
|
|
27
|
+
else if(source!=='SIMULATION')status('V1C read-only feed active. Switch to DEMO to control the isolated simulator.');
|
|
28
|
+
else if(fault)status('Fault stops demo parcel transport. ACK, then RESET before START.',true);
|
|
29
|
+
else status('LOCAL SIMULATOR ONLY · no V1C, PLC, or Ignition tag writes');
|
|
30
|
+
window.dispatchEvent(new CustomEvent('devagent:lab-state',{detail:s}));
|
|
31
|
+
}
|
|
32
|
+
async function getJson(url){const r=await fetch(url,{cache:'no-store',signal:AbortSignal.timeout(3500)});if(!r.ok)throw Error('HTTP '+r.status);return r.json()}
|
|
33
|
+
let pollInFlight=false;
|
|
34
|
+
async function poll(){
|
|
35
|
+
if(pollInFlight)return;pollInFlight=true;
|
|
36
|
+
try{const s=await getJson('/api/lab/state');connected=true;display(s)}
|
|
37
|
+
catch(e){connected=false;for(const b of buttons)b.disabled=true;$('lab-state').textContent='OFFLINE';status('Lab controller unavailable · '+e.message,true)}
|
|
38
|
+
finally{pollInFlight=false;}
|
|
39
|
+
}
|
|
40
|
+
async function command(name){
|
|
41
|
+
if(busy||!state?.enabled||!token||window.devagentSourceMode!=='SIMULATION')return;
|
|
42
|
+
busy=true;for(const b of buttons)b.disabled=true;status('COMMAND · '+name.toUpperCase()+' …');
|
|
43
|
+
try{
|
|
44
|
+
const r=await fetch('/api/lab/command',{method:'POST',cache:'no-store',headers:{'Content-Type':'application/json','X-DevAgent-Lab-Token':token},body:JSON.stringify({command:name,request_id:crypto.randomUUID()})});
|
|
45
|
+
const result=await r.json();if(!r.ok)throw Error(result.detail||result.error||'HTTP '+r.status);
|
|
46
|
+
status('ACKNOWLEDGED · '+name.toUpperCase()+' · LAB ONLY');display(result);
|
|
47
|
+
}catch(e){status('COMMAND REJECTED · '+e.message,true);await poll()}
|
|
48
|
+
finally{busy=false; if(state)display(state)}
|
|
49
|
+
}
|
|
50
|
+
for(const b of buttons)b.addEventListener('click',()=>command(b.dataset.labCommand));
|
|
51
|
+
window.addEventListener('devagent:source',()=>{if(state)display(state)});
|
|
52
|
+
async function init(){try{const ses=await getJson('/api/lab/session');token=ses.csrf_token||null}catch(e){status('Could not request local session: '+e.message,true)}await poll();setInterval(poll,250)}
|
|
53
|
+
init();
|