From 5cd5cb686993f73cd8a52393b2ed62106cc435c8 Mon Sep 17 00:00:00 2001 From: wangdequan Date: Sun, 14 Jun 2026 16:28:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A8=E8=BF=9B=20INI=20=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E5=BF=AB=E7=85=A7=20metadata=20=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- text10.txt | 58 ++++++++++++++++++++ wasm-port/runtime/ui/ini-panel/app.js | 11 +++- wasm-port/tests/browser/ini_panel_smoke.html | 21 +++++++ 3 files changed, 89 insertions(+), 1 deletion(-) diff --git a/text10.txt b/text10.txt index b8901cc..81e968f 100644 --- a/text10.txt +++ b/text10.txt @@ -854,3 +854,61 @@ host_wasm_opfs_browser_smokes=ok 同一个 `UI_SESSION` descriptor 生成,例如补充 snapshot label、default G-code OPFS path 和 UI workflow source,方便后续恢复/审计用户会话;并在 browser smoke 中验证 metadata 可从 saved snapshot round trip 读回。仍不解析或改写任何 CNC 语义。 + +十一、2026-06-14 继续执行记录:INI panel snapshot metadata descriptor + +本轮继续沿 OPFS/session/UI boundary 推进,让 `Save Session Snapshot` 的 metadata +由 `UI_SESSION` descriptor 统一生成,并补 browser round-trip 覆盖。 + +完成内容: + +- 在 `wasm-port/runtime/ui/ini-panel/app.js` 新增 `sessionSnapshotMetadata()`; +- metadata 现在包含: + - `source: "ini-panel"`; + - `workflow: "save-session-snapshot"`; + - `snapshotLabel: "ui-machine-session/ui-machine-session.json"`; + - `defaultGcodeOpfsPath: "linuxcnc/gcode/ui-session.ngc"`; +- `saveMachineSessionSnapshot(...)` 调用改为使用 `sessionSnapshotMetadata()`; +- browser INI panel smoke 在 UI 保存 snapshot 后,调用 + `loadMachineSessionSnapshot("ui-machine-session", "xyzab-tdr", ...)` 读回 snapshot; +- browser smoke 验证 source、workflow、snapshot label 和默认 G-code OPFS path metadata + 均可 round trip; +- 未改变 snapshot envelope 格式、payload 文件清单、OPFS path model、G-code 文本内容、 + interpreter run API 或 LinuxCNC-owned runtime semantics。 + +验证已通过: + +```bash +git diff --check +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh +wasm-port/tests/opfs/node/verify_file_service.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 +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 +browser_ini_opfs_smoke=ok +opfs_file_service_node_smoke=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 +browser_interp_smoke=ok +host_wasm_opfs_browser_smokes=ok +``` + +下一步建议: + +继续沿 OPFS/session/UI boundary 推进。优先把 saved/restored snapshot metadata 的关键信息 +显示到 INI panel 日志,例如 `Workflow` 与 `Default G-code`,让用户不用打开 JSON 也能审计 +保存/恢复的会话来源;并在 browser smoke 中验证日志包含这些 metadata。仍不解析或改写 +任何 CNC 语义。 diff --git a/wasm-port/runtime/ui/ini-panel/app.js b/wasm-port/runtime/ui/ini-panel/app.js index 2a8a57b..01a392f 100644 --- a/wasm-port/runtime/ui/ini-panel/app.js +++ b/wasm-port/runtime/ui/ini-panel/app.js @@ -325,6 +325,15 @@ function defaultGcodeOpfsPath() { return `linuxcnc/gcode/${UI_SESSION.defaultGcodeFilename}`; } +function sessionSnapshotMetadata() { + return { + source: "ini-panel", + workflow: "save-session-snapshot", + snapshotLabel: sessionSnapshotLabel(UI_SESSION), + defaultGcodeOpfsPath: defaultGcodeOpfsPath(), + }; +} + async function loadSelectedGcodeProgram() { const opfsPath = restoredSessionSnapshot?.payload?.files?.gcode; let filename = UI_SESSION.defaultGcodeFilename; @@ -508,7 +517,7 @@ document.getElementById("save-session-snapshot").addEventListener("click", async { filename: UI_SESSION.snapshotFilename, gcodeFilename: UI_SESSION.defaultGcodeFilename, - metadata: { source: "ini-panel" }, + metadata: sessionSnapshotMetadata(), }, ); setField("sessionIni", snapshot.payload.files.ini); diff --git a/wasm-port/tests/browser/ini_panel_smoke.html b/wasm-port/tests/browser/ini_panel_smoke.html index a931a00..2435242 100644 --- a/wasm-port/tests/browser/ini_panel_smoke.html +++ b/wasm-port/tests/browser/ini_panel_smoke.html @@ -428,6 +428,27 @@ TOOL_TABLE = browser-tool.tbl "linuxcnc/gcode/ui-session.ngc", "UI snapshot G-code OPFS path", ); + const savedUiSnapshot = await loadMachineSessionSnapshot( + "ui-machine-session", + "xyzab-tdr", + { filename: "ui-machine-session.json" }, + ); + assertEqual(savedUiSnapshot.metadata.source, "ini-panel", "UI snapshot metadata source"); + assertEqual( + savedUiSnapshot.metadata.workflow, + "save-session-snapshot", + "UI snapshot metadata workflow", + ); + assertEqual( + savedUiSnapshot.metadata.snapshotLabel, + "ui-machine-session/ui-machine-session.json", + "UI snapshot metadata label", + ); + assertEqual( + savedUiSnapshot.metadata.defaultGcodeOpfsPath, + "linuxcnc/gcode/ui-session.ngc", + "UI snapshot metadata default G-code path", + ); uiDocument.getElementById("ini-editor").value = ""; uiDocument.getElementById("restore-session-snapshot").click(); await waitFor(