From 6856721695bed0bddba0e5ee1b8f5d7f38678e2d Mon Sep 17 00:00:00 2001 From: wangdequan Date: Mon, 15 Jun 2026 18:28:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A8=E8=BF=9B=20INI=20=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=20workflow=20overview=20embedding=20DOM=20readiness?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- text13.txt | 94 +++++++++++++++++++ wasm-port/docs/panel-entry.md | 6 ++ wasm-port/runtime/ui/ini-panel/launch.html | 3 + wasm-port/runtime/ui/ini-panel/ui-shell.js | 33 +++++++ .../ui/ini-panel/workflow-overview.html | 4 + .../tests/browser/ini_panel_launch_smoke.html | 16 +++- ...anel_shell_integration_workflow_smoke.html | 18 +++- .../ini_panel_workflow_overview_smoke.html | 6 +- .../ui/node/verify_ini_panel_entry_docs.mjs | 6 ++ .../verify_ini_panel_launch_api_manifest.mjs | 2 + ...y_ini_panel_shell_integration_manifest.mjs | 10 +- .../ui/node/verify_ini_panel_ui_shell.mjs | 47 ++++++++++ 12 files changed, 236 insertions(+), 9 deletions(-) diff --git a/text13.txt b/text13.txt index a911845..4adccbc 100644 --- a/text13.txt +++ b/text13.txt @@ -1585,3 +1585,97 @@ host_wasm_opfs_browser_smokes=ok `createIniPanelShellWorkflowOverviewEmbeddingDomReadiness()` 或等价 helper,检查 embedding report DOM contract 需要的 document/mount/status/rows 节点是否存在,输出 missing/checks, 为真实 DOM renderer 做最后前置 gate;仍保持只读,不新增控制按钮,不解析 G-code。 + +十五、2026-06-15 继续执行记录:INI panel workflow overview embedding DOM readiness + +本轮按 `text13.txt` 执行,不扩展 `text12.txt`。继续推进 browser/UI workflow,新增只读 +workflow-overview embedding DOM readiness,检查 embedding report DOM contract 所需的 +document/mount/status/rows 节点是否存在,输出 missing/checks,为真实 DOM renderer 做最后 +前置 gate。 + +完成内容: + +- `ui-shell.js` 新增 `createIniPanelShellWorkflowOverviewEmbeddingDomReadiness()`; +- DOM readiness 输出: + - `apiName: "ini-panel-shell-workflow-overview-embedding-dom-readiness"`; + - `readinessVersion: 1`; + - `phase: "ready" | "blocked"`; + - `ready`; + - `missing`; + - `checks.document`; + - `checks.mount`; + - `checks.status`; + - `checks.rows`; + - `checks.rowDatasetPrefix`; + - `contract`; +- 支持传入自定义 contract、documentRef、mountNode、statusNode、rowsNode; +- `createIniPanelLaunchApiManifest().methods` 新增 + `getWorkflowOverviewEmbeddingDomReadiness`; +- `launch.html` 的 `window.linuxCncIniPanelLaunchApi` 新增真实 browser 入口 + `getWorkflowOverviewEmbeddingDomReadiness()`; +- `workflow-overview.html` 的 `window.linuxCncIniPanelWorkflowOverviewApi` 新增 + `getWorkflowOverviewEmbeddingDomReadiness()`; +- `verify_ini_panel_ui_shell.mjs` 覆盖 missing document/nodes 与 ready nodes 两种 shape; +- `verify_ini_panel_launch_api_manifest.mjs` 覆盖 launch manifest 与 launch 页面真实 API; +- `verify_ini_panel_shell_integration_manifest.mjs` 覆盖 helper export、默认 readiness、 + launch method count 与文档记录; +- `verify_ini_panel_entry_docs.mjs` 与 `docs/panel-entry.md` 同步记录新 helper/API; +- `ini_panel_workflow_overview_smoke.html` 校验 workflow overview iframe 自身 DOM readiness API; +- `ini_panel_launch_smoke.html` 校验真实 launch iframe 读取真实 workflow overview iframe 的 + embedding DOM readiness; +- `ini_panel_shell_integration_workflow_smoke.html` 校验外部 shell workflow 使用自定义 DOM + contract 与已有外部节点得到 ready readiness; +- 未新增控制按钮; +- 未执行 action-plan; +- 未解析 G-code; +- 未解释 canonical events; +- 未新增 JS CNC 语义; +- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或 + LinuxCNC-owned runtime semantics。 + +验证已通过: + +```bash +git diff --check +wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh +wasm-port/tests/ui/node/verify_ini_panel_launch_api_manifest.sh +wasm-port/tests/ui/node/verify_ini_panel_shell_integration_manifest.sh +wasm-port/tests/ui/node/verify_ini_panel_entry_docs.sh +wasm-port/tests/ui/node/verify_ui_node_smokes.sh +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.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/host/verify_host_smokes.sh +``` + +关键输出: + +```text +ini_panel_ui_shell_node_smoke=ok +ini_panel_launch_api_manifest_node_smoke=ok +ini_panel_shell_integration_manifest_node_smoke=ok +ini_panel_entry_docs_node_smoke=ok +ui_node_smokes=ok +browser_ini_opfs_smoke=ok +browser_ini_control_page_smoke=ok +browser_ini_launch_smoke=ok +browser_ini_workflow_overview_smoke=ok +browser_ini_shell_integration_workflow_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 +host_wasm_opfs_browser_smokes=ok +``` + +下一步建议: + +继续推进 browser/UI workflow。下一批建议新增只读 +`renderIniPanelShellWorkflowOverviewEmbeddingState()` 或等价 helper,使用 embedding render-state +与 DOM readiness/contract 渲染 status 与 rows,并返回结构化 render result;仍保持只读, +不新增控制按钮,不解析 G-code。 diff --git a/wasm-port/docs/panel-entry.md b/wasm-port/docs/panel-entry.md index 35c9b0d..9665ee3 100644 --- a/wasm-port/docs/panel-entry.md +++ b/wasm-port/docs/panel-entry.md @@ -45,6 +45,7 @@ import { createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel, createIniPanelShellWorkflowOverviewEmbeddingRenderState, createIniPanelShellWorkflowOverviewEmbeddingDomContract, + createIniPanelShellWorkflowOverviewEmbeddingDomReadiness, mountIniPanelShellWorkflowOverviewEmbedding, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, @@ -331,6 +332,11 @@ outer shell needs the required embedding report mount/status/rows selectors, mount dataset keys, row dataset keys, and render-result fields before adding a DOM renderer. The workflow overview page also exposes `linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingDomContract()`. +Use `createIniPanelShellWorkflowOverviewEmbeddingDomReadiness()` or +`linuxCncIniPanelLaunchApi.getWorkflowOverviewEmbeddingDomReadiness()` to check +that the required document and embedding report DOM nodes exist before calling +a renderer. The workflow overview page also exposes +`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingDomReadiness()`. Use `renderIniPanelShellSessionHandoffMountState()` or `linuxCncIniPanelLaunchApi.renderShellSessionHandoffMountState()` when an outer diff --git a/wasm-port/runtime/ui/ini-panel/launch.html b/wasm-port/runtime/ui/ini-panel/launch.html index e3a1d80..c5aa495 100644 --- a/wasm-port/runtime/ui/ini-panel/launch.html +++ b/wasm-port/runtime/ui/ini-panel/launch.html @@ -291,6 +291,9 @@ getWorkflowOverviewEmbeddingDomContract: (options) => ( shellViewModel.createWorkflowOverviewEmbeddingDomContract(options) ), + getWorkflowOverviewEmbeddingDomReadiness: (options) => ( + shellViewModel.createWorkflowOverviewEmbeddingDomReadiness(options) + ), isSupportedShellSessionHandoffPackage: shellViewModel.isSupportedShellSessionHandoffPackage, getLauncherLinks: () => shellViewModel.launcherLinks, getControlPageApiMethods: () => shellViewModel.controlPage.browserApiMethods, diff --git a/wasm-port/runtime/ui/ini-panel/ui-shell.js b/wasm-port/runtime/ui/ini-panel/ui-shell.js index 4eac8ab..2dc8cef 100644 --- a/wasm-port/runtime/ui/ini-panel/ui-shell.js +++ b/wasm-port/runtime/ui/ini-panel/ui-shell.js @@ -163,6 +163,7 @@ export function createIniPanelLaunchApiManifest(entries = getVisibleIniPanelEntr "getWorkflowOverviewEmbeddingDisplayViewModel", "getWorkflowOverviewEmbeddingRenderState", "getWorkflowOverviewEmbeddingDomContract", + "getWorkflowOverviewEmbeddingDomReadiness", "isSupportedShellSessionHandoffPackage", "getLauncherLinks", "getControlPageApiMethods", @@ -1969,6 +1970,37 @@ export function createIniPanelShellWorkflowOverviewEmbeddingDomContract({ }; } +export function createIniPanelShellWorkflowOverviewEmbeddingDomReadiness({ + rowDatasetPrefix = "workflowOverviewEmbedding", + contract = createIniPanelShellWorkflowOverviewEmbeddingDomContract({ rowDatasetPrefix }), + documentRef = globalThis.document, + mountNode = documentRef?.querySelector?.(contract.selectors.mount), + statusNode = documentRef?.querySelector?.(contract.selectors.status), + rowsNode = documentRef?.querySelector?.(contract.selectors.rows), +} = {}) { + const checks = { + document: Boolean(documentRef?.createElement), + mount: Boolean(mountNode), + status: Boolean(statusNode), + rows: Boolean(rowsNode), + rowDatasetPrefix: Boolean(contract.rowDatasetPrefix), + }; + const missing = Object.entries(checks) + .filter(([, passed]) => !passed) + .map(([name]) => name); + const ready = missing.length === 0; + + return { + apiName: "ini-panel-shell-workflow-overview-embedding-dom-readiness", + readinessVersion: 1, + phase: ready ? "ready" : "blocked", + ready, + missing, + checks, + contract, + }; +} + export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries()) { const shellIntegrationManifest = createIniPanelShellIntegrationManifest(entries); const shellIntegrationReadiness = createIniPanelShellIntegrationReadiness(shellIntegrationManifest); @@ -2131,6 +2163,7 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries createWorkflowOverviewEmbeddingDisplayViewModel: createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel, createWorkflowOverviewEmbeddingRenderState: createIniPanelShellWorkflowOverviewEmbeddingRenderState, createWorkflowOverviewEmbeddingDomContract: createIniPanelShellWorkflowOverviewEmbeddingDomContract, + createWorkflowOverviewEmbeddingDomReadiness: createIniPanelShellWorkflowOverviewEmbeddingDomReadiness, isSupportedShellSessionHandoffPackage: isSupportedIniPanelShellSessionHandoffPackage, controlPage: { browserApiSchema: createControlPageBrowserApiSchema(), diff --git a/wasm-port/runtime/ui/ini-panel/workflow-overview.html b/wasm-port/runtime/ui/ini-panel/workflow-overview.html index 07233df..d1e1a01 100644 --- a/wasm-port/runtime/ui/ini-panel/workflow-overview.html +++ b/wasm-port/runtime/ui/ini-panel/workflow-overview.html @@ -93,6 +93,7 @@ createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel, createIniPanelShellWorkflowOverviewEmbeddingRenderState, createIniPanelShellWorkflowOverviewEmbeddingDomContract, + createIniPanelShellWorkflowOverviewEmbeddingDomReadiness, mountIniPanelShellWorkflowOverviewEmbedding, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, @@ -147,6 +148,9 @@ getWorkflowOverviewEmbeddingDomContract: (options) => ( createIniPanelShellWorkflowOverviewEmbeddingDomContract(options) ), + getWorkflowOverviewEmbeddingDomReadiness: (options) => ( + createIniPanelShellWorkflowOverviewEmbeddingDomReadiness(options ?? { documentRef: document }) + ), }; diff --git a/wasm-port/tests/browser/ini_panel_launch_smoke.html b/wasm-port/tests/browser/ini_panel_launch_smoke.html index 832e110..465c2f0 100644 --- a/wasm-port/tests/browser/ini_panel_launch_smoke.html +++ b/wasm-port/tests/browser/ini_panel_launch_smoke.html @@ -107,6 +107,7 @@ !launchApi?.getWorkflowOverviewEmbeddingDisplayViewModel || !launchApi?.getWorkflowOverviewEmbeddingRenderState || !launchApi?.getWorkflowOverviewEmbeddingDomContract || + !launchApi?.getWorkflowOverviewEmbeddingDomReadiness || !launchApi?.isSupportedShellSessionHandoffPackage || !launchApi?.getLauncherLinks || !launchApi?.getControlPageApiMethods @@ -635,7 +636,8 @@ !workflowOverviewApi?.getWorkflowOverviewEmbeddingReport || !workflowOverviewApi?.getWorkflowOverviewEmbeddingDisplayViewModel || !workflowOverviewApi?.getWorkflowOverviewEmbeddingRenderState || - !workflowOverviewApi?.getWorkflowOverviewEmbeddingDomContract + !workflowOverviewApi?.getWorkflowOverviewEmbeddingDomContract || + !workflowOverviewApi?.getWorkflowOverviewEmbeddingDomReadiness ) { throw new Error("workflow overview API namespace did not expose shell helpers"); } @@ -655,6 +657,10 @@ workflowOverviewEmbeddingDisplay, ); const workflowOverviewEmbeddingDomContract = launchApi.getWorkflowOverviewEmbeddingDomContract(); + const workflowOverviewEmbeddingDomReadiness = launchApi.getWorkflowOverviewEmbeddingDomReadiness({ + documentRef: workflowOverviewDoc, + contract: workflowOverviewEmbeddingDomContract, + }); assertEqual(workflowOverviewApi.getWorkflowOverviewContract().pageHref, "./workflow-overview.html", "workflow overview page contract"); assertEqual(workflowOverviewReadiness.ready, true, "workflow overview readiness"); assertEqual(workflowOverviewReadiness.missing.join(","), "", "workflow overview readiness missing"); @@ -677,10 +683,12 @@ assertEqual(workflowOverviewEmbeddingRenderState.dataset.handoffScope, "workflow-overview-embedding", "workflow overview embedding render-state scope"); assertEqual(workflowOverviewEmbeddingDomContract.selectors.mount, "[data-workflow-overview-embedding]", "workflow overview embedding DOM contract mount"); assertEqual(workflowOverviewEmbeddingDomContract.rowDatasetKeys.detail[0], "workflowOverviewEmbeddingValue", "workflow overview embedding DOM contract row key"); + assertEqual(workflowOverviewEmbeddingDomReadiness.ready, false, "workflow overview embedding DOM readiness"); + assertEqual(workflowOverviewEmbeddingDomReadiness.missing.join(","), "mount,status,rows", "workflow overview embedding DOM readiness missing"); assertEqual( - workflowOverviewApi.getWorkflowOverviewEmbeddingDomContract().selectors.mount, - workflowOverviewEmbeddingDomContract.selectors.mount, - "workflow overview self embedding DOM contract", + workflowOverviewApi.getWorkflowOverviewEmbeddingDomReadiness().ready, + false, + "workflow overview self embedding DOM readiness", ); status.textContent = "browser_ini_launch_smoke=ok"; console.log("browser_ini_launch_smoke=ok"); diff --git a/wasm-port/tests/browser/ini_panel_shell_integration_workflow_smoke.html b/wasm-port/tests/browser/ini_panel_shell_integration_workflow_smoke.html index 5b026a3..ec16a71 100644 --- a/wasm-port/tests/browser/ini_panel_shell_integration_workflow_smoke.html +++ b/wasm-port/tests/browser/ini_panel_shell_integration_workflow_smoke.html @@ -14,6 +14,10 @@

waiting

+
+

waiting

+
+