diff --git a/text10.txt b/text10.txt index 3ad6363..b8901cc 100644 --- a/text10.txt +++ b/text10.txt @@ -793,3 +793,64 @@ host_wasm_opfs_browser_smokes=ok `SESSION_SNAPSHOT_ID`、`SESSION_SNAPSHOT_FILENAME` 与 G-code fallback metadata 整理成 一个小的 UI session descriptor/helper,减少按钮 handler 间重复拼接 snapshot label、 G-code OPFS path 和默认 program source 的逻辑。仍不解析或改写任何 CNC 语义。 + +十、2026-06-14 继续执行记录:INI panel UI session descriptor helper + +本轮继续沿 OPFS/session/UI boundary 推进,把 INI panel 内部的 session snapshot 常量与 +默认 G-code metadata 收敛成一个小的 UI session descriptor/helper,减少按钮 handler +之间重复拼接。 + +完成内容: + +- 在 `wasm-port/runtime/ui/ini-panel/app.js` 新增 `UI_SESSION` descriptor: + - `snapshotId`; + - `snapshotFilename`; + - `defaultGcodeFilename`; + - `gcodeWasmPath`; +- 新增 `sessionSnapshotLabel(...)`,统一生成 + `ui-machine-session/ui-machine-session.json` 形式的 UI label; +- 新增 `defaultGcodeOpfsPath()`,统一生成默认 G-code OPFS path; +- `save-session-snapshot`、`restore-session-snapshot`、`restore-load-session` 的日志与 + 字段回填改为复用 descriptor/helper; +- `Run G-code` 的 default fallback 与 WASM target path 改为复用 descriptor; +- 保持现有 UI 文本、按钮行为、snapshot id/filename、G-code filename、WASM path 和 + OPFS path 不变; +- 未改变 G-code 文本内容、OPFS file-service、machine-session bridge、interpreter run + API、canonical-event 解析或 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 推进。优先让 `Save Session Snapshot` 的 metadata 使用 +同一个 `UI_SESSION` descriptor 生成,例如补充 snapshot label、default G-code OPFS path +和 UI workflow source,方便后续恢复/审计用户会话;并在 browser smoke 中验证 metadata +可从 saved snapshot round trip 读回。仍不解析或改写任何 CNC 语义。 diff --git a/wasm-port/runtime/ui/ini-panel/app.js b/wasm-port/runtime/ui/ini-panel/app.js index 0be8fd3..2a8a57b 100644 --- a/wasm-port/runtime/ui/ini-panel/app.js +++ b/wasm-port/runtime/ui/ini-panel/app.js @@ -49,8 +49,12 @@ const SESSION_WASM_FILES = { }; const GCODE_FILENAME = "ui-session.ngc"; const GCODE_WASM_FILE = "/work/ui-session.ngc"; -const SESSION_SNAPSHOT_ID = "ui-machine-session"; -const SESSION_SNAPSHOT_FILENAME = "ui-machine-session.json"; +const UI_SESSION = { + snapshotId: "ui-machine-session", + snapshotFilename: "ui-machine-session.json", + defaultGcodeFilename: GCODE_FILENAME, + gcodeWasmPath: GCODE_WASM_FILE, +}; const DEFAULT_TOOL_TABLE = "T2 P7 Z3.125 D1.5 I12 J34 Q4 ;ui session tool\n"; const DEFAULT_PARAMETERS = [ "5161 0.0", @@ -312,10 +316,19 @@ function syncEditorToWasmFs() { requireIniSdk().writeTextFile(WASM_FILE, editor.value); } +function sessionSnapshotLabel(snapshot = UI_SESSION) { + const sessionId = typeof snapshot === "string" ? snapshot : snapshot.snapshotId ?? snapshot.sessionId; + return `${sessionId}/${UI_SESSION.snapshotFilename}`; +} + +function defaultGcodeOpfsPath() { + return `linuxcnc/gcode/${UI_SESSION.defaultGcodeFilename}`; +} + async function loadSelectedGcodeProgram() { const opfsPath = restoredSessionSnapshot?.payload?.files?.gcode; - let filename = GCODE_FILENAME; - let selectedOpfsPath = `linuxcnc/gcode/${GCODE_FILENAME}`; + let filename = UI_SESSION.defaultGcodeFilename; + let selectedOpfsPath = defaultGcodeOpfsPath(); let source = "default"; if (typeof opfsPath === "string") { try { @@ -323,23 +336,23 @@ async function loadSelectedGcodeProgram() { selectedOpfsPath = opfsPath; source = "snapshot"; } catch { - filename = GCODE_FILENAME; + filename = UI_SESSION.defaultGcodeFilename; } } return { filename, opfsPath: selectedOpfsPath, source, - wasmPath: GCODE_WASM_FILE, + wasmPath: UI_SESSION.gcodeWasmPath, text: await loadGcodeProgram(filename), }; } async function restoreSessionSnapshotToEditor() { const snapshot = await loadMachineSessionSnapshot( - SESSION_SNAPSHOT_ID, + UI_SESSION.snapshotId, MACHINE_ID, - { filename: SESSION_SNAPSHOT_FILENAME }, + { filename: UI_SESSION.snapshotFilename }, ); const files = await loadMachineTextFiles(MACHINE_ID); editor.value = files.ini; @@ -347,7 +360,7 @@ async function restoreSessionSnapshotToEditor() { setField("sessionParameters", snapshot.payload.files.parameters); setField("sessionToolTable", snapshot.payload.files.toolTable); setField("sessionGcode", snapshot.payload.files.gcode); - setField("sessionSnapshot", `${snapshot.sessionId}/${SESSION_SNAPSHOT_FILENAME}`); + setField("sessionSnapshot", sessionSnapshotLabel(snapshot.sessionId)); restoredSessionSnapshot = snapshot; return snapshot; } @@ -466,7 +479,7 @@ document.getElementById("save-machine-files").addEventListener("click", async () toolTable: DEFAULT_TOOL_TABLE, parameters: DEFAULT_PARAMETERS, }); - const gcodePath = await saveGcodeProgram(GCODE_FILENAME, DEFAULT_GCODE); + const gcodePath = await saveGcodeProgram(UI_SESSION.defaultGcodeFilename, DEFAULT_GCODE); setLog( [ "Saved machine text files to OPFS.", @@ -488,13 +501,13 @@ document.getElementById("save-session-snapshot").addEventListener("click", async toolTable: DEFAULT_TOOL_TABLE, parameters: DEFAULT_PARAMETERS, }); - await saveGcodeProgram(GCODE_FILENAME, DEFAULT_GCODE); + await saveGcodeProgram(UI_SESSION.defaultGcodeFilename, DEFAULT_GCODE); const snapshot = await saveMachineSessionSnapshot( - SESSION_SNAPSHOT_ID, + UI_SESSION.snapshotId, MACHINE_ID, { - filename: SESSION_SNAPSHOT_FILENAME, - gcodeFilename: GCODE_FILENAME, + filename: UI_SESSION.snapshotFilename, + gcodeFilename: UI_SESSION.defaultGcodeFilename, metadata: { source: "ini-panel" }, }, ); @@ -502,11 +515,11 @@ document.getElementById("save-session-snapshot").addEventListener("click", async setField("sessionParameters", snapshot.payload.files.parameters); setField("sessionToolTable", snapshot.payload.files.toolTable); setField("sessionGcode", snapshot.payload.files.gcode); - setField("sessionSnapshot", `${SESSION_SNAPSHOT_ID}/${SESSION_SNAPSHOT_FILENAME}`); + setField("sessionSnapshot", sessionSnapshotLabel(UI_SESSION)); setLog( [ "Saved machine session snapshot to OPFS.", - `Snapshot: ${SESSION_SNAPSHOT_ID}/${SESSION_SNAPSHOT_FILENAME}`, + `Snapshot: ${sessionSnapshotLabel(UI_SESSION)}`, `INI: ${snapshot.payload.files.ini}`, `Parameter file: ${snapshot.payload.files.parameters}`, `Tool table file: ${snapshot.payload.files.toolTable}`, @@ -524,7 +537,7 @@ document.getElementById("restore-session-snapshot").addEventListener("click", as setLog( [ "Restored machine session snapshot from OPFS.", - `Snapshot: ${snapshot.sessionId}/${SESSION_SNAPSHOT_FILENAME}`, + `Snapshot: ${sessionSnapshotLabel(snapshot.sessionId)}`, `INI: ${snapshot.payload.files.ini}`, `Parameter file: ${snapshot.payload.files.parameters}`, `Tool table file: ${snapshot.payload.files.toolTable}`, @@ -562,7 +575,7 @@ document.getElementById("restore-load-session").addEventListener("click", async setLog( [ "Restored and loaded machine session snapshot.", - `Snapshot: ${snapshot.sessionId}/${SESSION_SNAPSHOT_FILENAME}`, + `Snapshot: ${sessionSnapshotLabel(snapshot.sessionId)}`, `INI: ${loadedSession.ini.opfsPath} -> ${loadedSession.ini.wasmPath}`, `Parameter file: ${loadedSession.parameters.opfsPath} -> ${loadedSession.parameters.wasmPath}`, `Parameters: ${loadedSession.parameters.result.trim()}`,