From aeb290b8850d74abe0647618af226a25cdfe1761 Mon Sep 17 00:00:00 2001 From: wangdequan Date: Sun, 14 Jun 2026 18:22:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A8=E8=BF=9B=20INI=20=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=20session=20summary=20helper?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- text10.txt | 68 +++++++++++++++++ wasm-port/runtime/ui/ini-panel/app.js | 40 +++++----- .../runtime/ui/ini-panel/session-summary.js | 28 +++++++ .../node/verify_ini_panel_session_summary.mjs | 74 +++++++++++++++++++ .../node/verify_ini_panel_session_summary.sh | 6 ++ .../tests/ui/node/verify_ui_node_smokes.sh | 1 + 6 files changed, 198 insertions(+), 19 deletions(-) create mode 100644 wasm-port/runtime/ui/ini-panel/session-summary.js create mode 100644 wasm-port/tests/ui/node/verify_ini_panel_session_summary.mjs create mode 100755 wasm-port/tests/ui/node/verify_ini_panel_session_summary.sh diff --git a/text10.txt b/text10.txt index 7eecf44..bcd4ae1 100644 --- a/text10.txt +++ b/text10.txt @@ -1471,3 +1471,71 @@ host_wasm_opfs_browser_smokes=ok “日志文本/DOM 状态/机器可读状态”三份并行维护的 host-boundary 数据,如果有,选择一个 小型候选提取为纯 helper 并接入 `verify_ui_node_smokes.sh`;仍不触碰 interpreter、OPFS bridge 或 LinuxCNC-owned runtime semantics。 + +二十一、2026-06-14 继续执行记录:INI panel session summary helper + +本轮继续沿 OPFS/session/UI boundary 推进,把 INI panel 的 session snapshot 日志构造 +收敛为纯 helper,并把它纳入 UI Node smoke wrapper。 + +完成内容: + +- 新增 `wasm-port/runtime/ui/ini-panel/session-summary.js`; +- 导出: + - `createSessionSnapshotSummary(snapshot, fallbackLabel)`; + - `sessionSnapshotSummaryLogLines(summary)`; + - `sessionSnapshotMetadataLogLines(summary)`; +- helper 只聚合 session snapshot boundary facts: + - snapshot label; + - workflow; + - default G-code OPFS path; + - ini/parameter/tool/gcode OPFS paths; +- `wasm-port/runtime/ui/ini-panel/app.js` 的保存、恢复、restore-load 日志改为复用纯 helper; +- `wasm-port/tests/ui/node/verify_ini_panel_session_summary.mjs` 覆盖: + - 正常 session snapshot summary; + - runtime label override; + - 空 snapshot 默认值; + - log lines 输出; +- `wasm-port/tests/ui/node/verify_ui_node_smokes.sh` 现在同时覆盖 run summary 与 session summary helper; +- 未改变 UI runtime、OPFS bridge、interpreter run API、G-code 文本、canonical-event 输出 + 或 LinuxCNC-owned runtime semantics。 + +验证已通过: + +```bash +git diff --check +wasm-port/tests/ui/node/verify_ui_node_smokes.sh +wasm-port/tools/verify_vendor_sync.sh +wasm-port/tools/verify_no_standalone_cnc_semantics.sh +SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh +SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh +wasm-port/tests/opfs/node/verify_file_service.sh +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh +wasm-port/tests/host/verify_host_smokes.sh +``` + +关键输出: + +```text +ini_panel_run_summary_node_smoke=ok +ini_panel_session_summary_node_smoke=ok +ui_node_smokes=ok +host_wasm_opfs_browser_smokes=ok +vendor sync up to date +standalone CNC semantics guard complete +interp_wasm_node_smoke=ok +sim_configs_wasm_node_inventory_executed=28 +sim_configs_wasm_node_inventory_passed=28 +sim_configs_wasm_node_inventory_skipped=131 +sim_configs_wasm_node_inventory_unexpected_fail=0 +opfs_file_service_node_smoke=ok +browser_ini_opfs_smoke=ok +browser_interp_smoke=ok +``` + +下一步建议: + +继续沿 OPFS/session/UI boundary 推进。优先扫描 INI panel 中是否还有类似 +“日志文本 / DOM 状态 / 机器可读状态”三份并行维护的 host-boundary 数据,如果有,继续 +抽取为纯 helper 并接入 `verify_ui_node_smokes.sh`;保持 helper 只描述 host/runtime 边界, +不扩展 CNC 语义。 diff --git a/wasm-port/runtime/ui/ini-panel/app.js b/wasm-port/runtime/ui/ini-panel/app.js index 6b8bb6b..d51f8ad 100644 --- a/wasm-port/runtime/ui/ini-panel/app.js +++ b/wasm-port/runtime/ui/ini-panel/app.js @@ -26,6 +26,11 @@ import { createRunSummary, summarizeRunResult, } from "./run-summary.js"; +import { + createSessionSnapshotSummary, + sessionSnapshotMetadataLogLines, + sessionSnapshotSummaryLogLines, +} from "./session-summary.js"; const SAMPLE_PATH = "../../../vendor/linuxcnc/configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini"; @@ -343,10 +348,7 @@ function sessionSnapshotMetadata() { } function sessionMetadataLogLines(metadata = {}) { - return [ - `Workflow: ${metadata.workflow ?? "-"}`, - `Default G-code: ${metadata.defaultGcodeOpfsPath ?? "-"}`, - ]; + return sessionSnapshotMetadataLogLines(createSessionSnapshotSummary({ metadata })); } function runSessionContextLogLines(program, snapshot = restoredSessionSnapshot) { @@ -576,15 +578,15 @@ document.getElementById("save-session-snapshot").addEventListener("click", async setField("sessionToolTable", snapshot.payload.files.toolTable); setField("sessionGcode", snapshot.payload.files.gcode); setField("sessionSnapshot", sessionSnapshotLabel(UI_SESSION)); + const summary = createSessionSnapshotSummary(snapshot, sessionSnapshotLabel(UI_SESSION)); setLog( [ "Saved machine session snapshot to OPFS.", - `Snapshot: ${sessionSnapshotLabel(UI_SESSION)}`, - ...sessionMetadataLogLines(snapshot.metadata), - `INI: ${snapshot.payload.files.ini}`, - `Parameter file: ${snapshot.payload.files.parameters}`, - `Tool table file: ${snapshot.payload.files.toolTable}`, - `G-code: ${snapshot.payload.files.gcode}`, + ...sessionSnapshotSummaryLogLines(summary), + `INI: ${summary.iniOpfsPath}`, + `Parameter file: ${summary.parameterOpfsPath}`, + `Tool table file: ${summary.toolTableOpfsPath}`, + `G-code: ${summary.gcodeOpfsPath}`, ].join("\n"), ); } catch (error) { @@ -595,15 +597,15 @@ document.getElementById("save-session-snapshot").addEventListener("click", async document.getElementById("restore-session-snapshot").addEventListener("click", async () => { try { const snapshot = await restoreSessionSnapshotToEditor(); + const summary = createSessionSnapshotSummary(snapshot, sessionSnapshotLabel(snapshot.sessionId)); setLog( [ "Restored machine session snapshot from OPFS.", - `Snapshot: ${sessionSnapshotLabel(snapshot.sessionId)}`, - ...sessionMetadataLogLines(snapshot.metadata), - `INI: ${snapshot.payload.files.ini}`, - `Parameter file: ${snapshot.payload.files.parameters}`, - `Tool table file: ${snapshot.payload.files.toolTable}`, - `G-code: ${snapshot.payload.files.gcode ?? "-"}`, + ...sessionSnapshotSummaryLogLines(summary), + `INI: ${summary.iniOpfsPath}`, + `Parameter file: ${summary.parameterOpfsPath}`, + `Tool table file: ${summary.toolTableOpfsPath}`, + `G-code: ${summary.gcodeOpfsPath ?? "-"}`, ].join("\n"), ); } catch (error) { @@ -634,17 +636,17 @@ document.getElementById("restore-load-session").addEventListener("click", async const snapshot = await restoreSessionSnapshotToEditor(); await loadMachineSessionIntoWasm(); setField("sessionGcode", snapshot.payload.files.gcode); + const summary = createSessionSnapshotSummary(snapshot, sessionSnapshotLabel(snapshot.sessionId)); setLog( [ "Restored and loaded machine session snapshot.", - `Snapshot: ${sessionSnapshotLabel(snapshot.sessionId)}`, - ...sessionMetadataLogLines(snapshot.metadata), + ...sessionSnapshotSummaryLogLines(summary), `INI: ${loadedSession.ini.opfsPath} -> ${loadedSession.ini.wasmPath}`, `Parameter file: ${loadedSession.parameters.opfsPath} -> ${loadedSession.parameters.wasmPath}`, `Parameters: ${loadedSession.parameters.result.trim()}`, `Tool table file: ${loadedSession.toolTable.opfsPath} -> ${loadedSession.toolTable.wasmPath}`, `Tool table: ${loadedSession.toolTable.result.trim()}`, - `G-code: ${snapshot.payload.files.gcode ?? "-"}`, + `G-code: ${summary.gcodeOpfsPath ?? "-"}`, ].join("\n"), ); } catch (error) { diff --git a/wasm-port/runtime/ui/ini-panel/session-summary.js b/wasm-port/runtime/ui/ini-panel/session-summary.js new file mode 100644 index 0000000..1317b4c --- /dev/null +++ b/wasm-port/runtime/ui/ini-panel/session-summary.js @@ -0,0 +1,28 @@ +export function createSessionSnapshotSummary(snapshot, fallbackLabel = null) { + const metadata = snapshot?.metadata ?? {}; + const files = snapshot?.payload?.files ?? {}; + return { + snapshotLabel: fallbackLabel ?? metadata.snapshotLabel ?? null, + workflow: metadata.workflow ?? null, + defaultGcodeOpfsPath: metadata.defaultGcodeOpfsPath ?? null, + iniOpfsPath: files.ini ?? null, + parameterOpfsPath: files.parameters ?? null, + toolTableOpfsPath: files.toolTable ?? null, + gcodeOpfsPath: files.gcode ?? null, + }; +} + +export function sessionSnapshotSummaryLogLines(summary) { + return [ + `Snapshot: ${summary.snapshotLabel ?? "-"}`, + `Workflow: ${summary.workflow ?? "-"}`, + `Default G-code: ${summary.defaultGcodeOpfsPath ?? "-"}`, + ]; +} + +export function sessionSnapshotMetadataLogLines(summary) { + return [ + `Workflow: ${summary.workflow ?? "-"}`, + `Default G-code: ${summary.defaultGcodeOpfsPath ?? "-"}`, + ]; +} diff --git a/wasm-port/tests/ui/node/verify_ini_panel_session_summary.mjs b/wasm-port/tests/ui/node/verify_ini_panel_session_summary.mjs new file mode 100644 index 0000000..09f2690 --- /dev/null +++ b/wasm-port/tests/ui/node/verify_ini_panel_session_summary.mjs @@ -0,0 +1,74 @@ +import assert from "node:assert/strict"; + +import { + createSessionSnapshotSummary, + sessionSnapshotMetadataLogLines, + sessionSnapshotSummaryLogLines, +} from "../../../runtime/ui/ini-panel/session-summary.js"; + +const snapshot = { + metadata: { + workflow: "save-session-snapshot", + snapshotLabel: "ui-machine-session/ui-machine-session.json", + defaultGcodeOpfsPath: "linuxcnc/gcode/ui-session.ngc", + }, + payload: { + files: { + ini: "linuxcnc/machines/xyzab-tdr/machine.ini", + parameters: "linuxcnc/machines/xyzab-tdr/linuxcnc.var", + toolTable: "linuxcnc/machines/xyzab-tdr/tool.tbl", + gcode: "linuxcnc/gcode/ui-session.ngc", + }, + }, +}; + +const summary = createSessionSnapshotSummary(snapshot); +assert.deepEqual(summary, { + snapshotLabel: "ui-machine-session/ui-machine-session.json", + workflow: "save-session-snapshot", + defaultGcodeOpfsPath: "linuxcnc/gcode/ui-session.ngc", + iniOpfsPath: "linuxcnc/machines/xyzab-tdr/machine.ini", + parameterOpfsPath: "linuxcnc/machines/xyzab-tdr/linuxcnc.var", + toolTableOpfsPath: "linuxcnc/machines/xyzab-tdr/tool.tbl", + gcodeOpfsPath: "linuxcnc/gcode/ui-session.ngc", +}); + +assert.deepEqual( + createSessionSnapshotSummary(snapshot, "override-session/override.json"), + { + ...summary, + snapshotLabel: "override-session/override.json", + }, +); + +assert.deepEqual( + sessionSnapshotSummaryLogLines(summary), + [ + "Snapshot: ui-machine-session/ui-machine-session.json", + "Workflow: save-session-snapshot", + "Default G-code: linuxcnc/gcode/ui-session.ngc", + ], +); + +assert.deepEqual( + sessionSnapshotMetadataLogLines(summary), + [ + "Workflow: save-session-snapshot", + "Default G-code: linuxcnc/gcode/ui-session.ngc", + ], +); + +assert.deepEqual( + createSessionSnapshotSummary(null), + { + snapshotLabel: null, + workflow: null, + defaultGcodeOpfsPath: null, + iniOpfsPath: null, + parameterOpfsPath: null, + toolTableOpfsPath: null, + gcodeOpfsPath: null, + }, +); + +console.log("ini_panel_session_summary_node_smoke=ok"); diff --git a/wasm-port/tests/ui/node/verify_ini_panel_session_summary.sh b/wasm-port/tests/ui/node/verify_ini_panel_session_summary.sh new file mode 100755 index 0000000..6c8933f --- /dev/null +++ b/wasm-port/tests/ui/node/verify_ini_panel_session_summary.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "$0")/../../.." && pwd)" + +node "$ROOT_DIR/tests/ui/node/verify_ini_panel_session_summary.mjs" diff --git a/wasm-port/tests/ui/node/verify_ui_node_smokes.sh b/wasm-port/tests/ui/node/verify_ui_node_smokes.sh index 436cd8c..7ae84f9 100755 --- a/wasm-port/tests/ui/node/verify_ui_node_smokes.sh +++ b/wasm-port/tests/ui/node/verify_ui_node_smokes.sh @@ -4,5 +4,6 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "$0")/../../.." && pwd)" "$ROOT_DIR/tests/ui/node/verify_ini_panel_run_summary.sh" +"$ROOT_DIR/tests/ui/node/verify_ini_panel_session_summary.sh" echo "ui_node_smokes=ok"