From 7a5aa23dbc6e233a8d704e72a36d979564103c8c Mon Sep 17 00:00:00 2001 From: wangdequan Date: Mon, 15 Jun 2026 22:05:05 +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=20mount=20DOM=20renderer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROJECT_COMPLETION_TRACKER.md | 6 +- text14.txt | 90 +++++++++++++++++++ wasm-port/docs/panel-entry.md | 7 ++ wasm-port/runtime/ui/ini-panel/launch.html | 3 + wasm-port/runtime/ui/ini-panel/ui-shell.js | 60 +++++++++++++ .../ui/ini-panel/workflow-overview.html | 4 + .../tests/browser/ini_panel_launch_smoke.html | 4 +- ...anel_shell_integration_workflow_smoke.html | 1 + .../ini_panel_workflow_overview_smoke.html | 10 ++- .../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 | 41 +++++++++ 13 files changed, 236 insertions(+), 8 deletions(-) diff --git a/PROJECT_COMPLETION_TRACKER.md b/PROJECT_COMPLETION_TRACKER.md index d8aad2a..aefd6ef 100644 --- a/PROJECT_COMPLETION_TRACKER.md +++ b/PROJECT_COMPLETION_TRACKER.md @@ -9,7 +9,7 @@ turn-by-turn continuation notes and next-batch execution records. ## Current Status - Active continuation file: `text14.txt` -- Latest completed batch: workflow overview embedding mount DOM readiness +- Latest completed batch: workflow overview embedding mount DOM renderer - Latest relevant commit: use `git log -1 --oneline` after each committed batch - Working tree at tracker creation: clean - Required policy: LinuxCNC remains the only CNC semantic source @@ -44,7 +44,7 @@ The project is complete for the current scope when all of the following are true | OPFS/session persistence | In progress | Browser smoke passes; final project needs explicit project-level summary/report. | | SDK/API surface | In progress | Many UI helpers exist; final project needs SDK export/readme consolidation. | | Browser/UI workflow | In progress | Current focus: workflow overview embedding mount DOM readiness/renderer/mount closure. | -| Workflow overview embedding | In progress | Report/display/render, DOM contract/readiness/renderer, mount result/display/render, mount DOM contract/readiness exist. | +| Workflow overview embedding | In progress | Report/display/render, DOM contract/readiness/renderer, mount result/display/render, mount DOM contract/readiness/renderer exist. | | Host/runtime boundary proof | In progress | Host smoke passes; runtime families below remain blocked. | | Documentation/release gate | In progress | `text14.txt` has roadmap; README/docs final pass still pending. | @@ -74,7 +74,7 @@ Execute these in order unless a later user request explicitly changes priority. Current next task: -- Add mount render-state DOM renderer. +- Add non-throwing mount workflow wrapper for mount render-state DOM rendering. Then complete the closure: diff --git a/text14.txt b/text14.txt index 88d7177..e575d91 100644 --- a/text14.txt +++ b/text14.txt @@ -709,3 +709,93 @@ host_wasm_opfs_browser_smokes=ok `renderIniPanelShellWorkflowOverviewEmbeddingMountState()` 或等价 helper,使用 mount render-state 与 mount DOM readiness/contract 渲染 status 与 rows,并返回结构化 render result;仍保持只读, 不新增控制按钮,不解析 G-code。 + +十、2026-06-15 继续执行记录:INI panel workflow overview embedding mount DOM renderer + +本轮按 `text14.txt` 执行,继续推进 Browser/UI workflow 收口批次。新增只读 +workflow-overview embedding mount DOM renderer,使用 mount render-state 与 mount DOM +readiness/contract 渲染 status 与 rows,并返回结构化 render result。 + +完成内容: + +- `ui-shell.js` 新增 + `renderIniPanelShellWorkflowOverviewEmbeddingMountState()`; +- renderer 在 DOM readiness ready 时写入: + - mount dataset: + `handoffPhase`、`handoffReady`、`handoffScope`; + - status text; + - rows `
/
` 与 contract 定义的 row dataset keys; +- renderer 返回结构化 render result: + - `rendered`; + - `statusLine`; + - `rowCount`; + - `rowIds`; + - `dataset`; +- DOM readiness blocked 时保持抛错行为,与既有 workflow/embedding renderer 模式一致; +- `createIniPanelLaunchApiManifest().methods` 新增 + `renderWorkflowOverviewEmbeddingMountState`; +- `createIniPanelShellViewModel()` 暴露 + `renderWorkflowOverviewEmbeddingMountState`; +- `launch.html` 的 `window.linuxCncIniPanelLaunchApi` 新增真实 browser 入口 + `renderWorkflowOverviewEmbeddingMountState()`; +- `workflow-overview.html` 的 `window.linuxCncIniPanelWorkflowOverviewApi` 新增真实 browser + 入口 `renderWorkflowOverviewEmbeddingMountState()`; +- `verify_ini_panel_ui_shell.mjs` 覆盖 renderer 返回 shape、dataset 写入与 rows dataset; +- `verify_ini_panel_launch_api_manifest.mjs` 覆盖 launch manifest 与 launch 页面真实 API; +- `verify_ini_panel_shell_integration_manifest.mjs` 覆盖 helper export、launch method count 与文档记录; +- `verify_ini_panel_entry_docs.mjs` 与 `docs/panel-entry.md` 同步记录新 helper/API; +- `ini_panel_workflow_overview_smoke.html` 在真实 workflow overview browser 页面中执行 mount + render-state DOM 渲染并校验 render result、row count、dataset 与 status text; +- `ini_panel_launch_smoke.html` 校验 launch API 与 workflow overview iframe API 暴露新 renderer; +- `ini_panel_shell_integration_workflow_smoke.html` 校验外部 shell launch API 暴露新 renderer; +- `PROJECT_COMPLETION_TRACKER.md` 同步当前完成批次与下一步任务; +- 未新增控制按钮; +- 未执行 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_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 收口批次。下一批建议新增只读 +`mountIniPanelShellWorkflowOverviewEmbeddingMountState()` 或等价非抛错 wrapper,将 mount DOM +readiness、render-state、renderer 与 render-result 聚合成稳定 mount workflow result,供外部 shell +直接调用;仍保持只读,不新增控制按钮,不解析 G-code。 diff --git a/wasm-port/docs/panel-entry.md b/wasm-port/docs/panel-entry.md index 0e71791..5299f0e 100644 --- a/wasm-port/docs/panel-entry.md +++ b/wasm-port/docs/panel-entry.md @@ -53,6 +53,7 @@ import { createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, + renderIniPanelShellWorkflowOverviewEmbeddingMountState, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, renderIniPanelShellSessionHandoffMountState, @@ -378,6 +379,12 @@ Use `createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness()` or check that the required document and mount render-state DOM nodes exist before calling a renderer. The workflow overview page also exposes `linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingMountDomReadiness()`. +Use `renderIniPanelShellWorkflowOverviewEmbeddingMountState()` or +`linuxCncIniPanelLaunchApi.renderWorkflowOverviewEmbeddingMountState()` when an +outer shell needs to render a mount render-state into existing mount/status/rows +nodes and receive a structured read-only render result. The workflow overview +page also exposes +`linuxCncIniPanelWorkflowOverviewApi.renderWorkflowOverviewEmbeddingMountState()`. 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 df3bda7..621b34f 100644 --- a/wasm-port/runtime/ui/ini-panel/launch.html +++ b/wasm-port/runtime/ui/ini-panel/launch.html @@ -314,6 +314,9 @@ getWorkflowOverviewEmbeddingMountDomReadiness: (options) => ( shellViewModel.createWorkflowOverviewEmbeddingMountDomReadiness(options) ), + renderWorkflowOverviewEmbeddingMountState: (renderState, options) => ( + shellViewModel.renderWorkflowOverviewEmbeddingMountState(renderState, options ?? { documentRef: document }) + ), 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 b17964c..c307733 100644 --- a/wasm-port/runtime/ui/ini-panel/ui-shell.js +++ b/wasm-port/runtime/ui/ini-panel/ui-shell.js @@ -170,6 +170,7 @@ export function createIniPanelLaunchApiManifest(entries = getVisibleIniPanelEntr "getWorkflowOverviewEmbeddingMountRenderState", "getWorkflowOverviewEmbeddingMountDomContract", "getWorkflowOverviewEmbeddingMountDomReadiness", + "renderWorkflowOverviewEmbeddingMountState", "isSupportedShellSessionHandoffPackage", "getLauncherLinks", "getControlPageApiMethods", @@ -2285,6 +2286,63 @@ export function createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness({ }; } +export function renderIniPanelShellWorkflowOverviewEmbeddingMountState( + renderState = createIniPanelShellWorkflowOverviewEmbeddingMountRenderState(), + { + rowDatasetPrefix = "workflowOverviewEmbeddingMount", + contract = createIniPanelShellWorkflowOverviewEmbeddingMountDomContract({ rowDatasetPrefix }), + documentRef = globalThis.document, + mountNode = documentRef?.querySelector?.(contract.selectors.mount), + statusNode = documentRef?.querySelector?.(contract.selectors.status), + rowsNode = documentRef?.querySelector?.(contract.selectors.rows), + } = {}, +) { + const readiness = createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness({ + contract, + documentRef, + mountNode, + statusNode, + rowsNode, + }); + if (!readiness.ready) { + throw new Error( + `Workflow overview embedding mount DOM is not ready: ${readiness.missing.join(", ")}`, + ); + } + + mountNode.dataset.handoffPhase = renderState?.dataset?.handoffPhase ?? "blocked"; + mountNode.dataset.handoffReady = renderState?.dataset?.handoffReady ?? "false"; + mountNode.dataset.handoffScope = renderState?.dataset?.handoffScope ?? "workflow-overview-embedding-mount"; + statusNode.textContent = renderState?.statusLine ?? "Blocked: No workflow overview embedding mount render state"; + rowsNode.replaceChildren(); + + const rows = Array.isArray(renderState?.rows) ? renderState.rows : []; + const effectiveRowDatasetPrefix = contract.rowDatasetPrefix; + for (const row of rows) { + const term = documentRef.createElement("dt"); + term.dataset[`${effectiveRowDatasetPrefix}Row`] = row.id; + term.dataset[`${effectiveRowDatasetPrefix}Status`] = renderState?.ready ? "pass" : "blocked"; + term.textContent = row.label; + const detail = documentRef.createElement("dd"); + detail.dataset[`${effectiveRowDatasetPrefix}Value`] = row.id; + detail.dataset[`${effectiveRowDatasetPrefix}Status`] = renderState?.ready ? "pass" : "blocked"; + detail.textContent = row.value; + rowsNode.append(term, detail); + } + + return { + rendered: true, + statusLine: statusNode.textContent, + rowCount: rows.length, + rowIds: rows.map(({ id }) => id), + dataset: { + handoffPhase: mountNode.dataset.handoffPhase, + handoffReady: mountNode.dataset.handoffReady, + handoffScope: mountNode.dataset.handoffScope, + }, + }; +} + export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries()) { const shellIntegrationManifest = createIniPanelShellIntegrationManifest(entries); const shellIntegrationReadiness = createIniPanelShellIntegrationReadiness(shellIntegrationManifest); @@ -2458,6 +2516,8 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, createWorkflowOverviewEmbeddingMountDomReadiness: createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, + renderWorkflowOverviewEmbeddingMountState: + renderIniPanelShellWorkflowOverviewEmbeddingMountState, 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 7379885..a8cfb14 100644 --- a/wasm-port/runtime/ui/ini-panel/workflow-overview.html +++ b/wasm-port/runtime/ui/ini-panel/workflow-overview.html @@ -101,6 +101,7 @@ createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, + renderIniPanelShellWorkflowOverviewEmbeddingMountState, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, } from "./ui-shell.js"; @@ -177,6 +178,9 @@ getWorkflowOverviewEmbeddingMountDomReadiness: (options) => ( createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness(options ?? { documentRef: document }) ), + renderWorkflowOverviewEmbeddingMountState: (renderState, options) => ( + renderIniPanelShellWorkflowOverviewEmbeddingMountState(renderState, 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 2c4c790..faacf42 100644 --- a/wasm-port/tests/browser/ini_panel_launch_smoke.html +++ b/wasm-port/tests/browser/ini_panel_launch_smoke.html @@ -114,6 +114,7 @@ !launchApi?.getWorkflowOverviewEmbeddingMountRenderState || !launchApi?.getWorkflowOverviewEmbeddingMountDomContract || !launchApi?.getWorkflowOverviewEmbeddingMountDomReadiness || + !launchApi?.renderWorkflowOverviewEmbeddingMountState || !launchApi?.isSupportedShellSessionHandoffPackage || !launchApi?.getLauncherLinks || !launchApi?.getControlPageApiMethods @@ -649,7 +650,8 @@ !workflowOverviewApi?.getWorkflowOverviewEmbeddingMountDisplayViewModel || !workflowOverviewApi?.getWorkflowOverviewEmbeddingMountRenderState || !workflowOverviewApi?.getWorkflowOverviewEmbeddingMountDomContract || - !workflowOverviewApi?.getWorkflowOverviewEmbeddingMountDomReadiness + !workflowOverviewApi?.getWorkflowOverviewEmbeddingMountDomReadiness || + !workflowOverviewApi?.renderWorkflowOverviewEmbeddingMountState ) { throw new Error("workflow overview API namespace did not expose shell helpers"); } 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 1dc1382..d35af2d 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 @@ -120,6 +120,7 @@ TOOL_TABLE = browser-shell-tool.tbl !launchApi?.getWorkflowOverviewEmbeddingMountRenderState || !launchApi?.getWorkflowOverviewEmbeddingMountDomContract || !launchApi?.getWorkflowOverviewEmbeddingMountDomReadiness || + !launchApi?.renderWorkflowOverviewEmbeddingMountState || !launchApi?.isSupportedShellSessionHandoffPackage ) { throw new Error("launch API namespace did not expose shell integration helpers"); diff --git a/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html b/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html index 5849351..cd2536c 100644 --- a/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html +++ b/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html @@ -46,7 +46,8 @@ !workflowApi?.getWorkflowOverviewEmbeddingMountDisplayViewModel || !workflowApi?.getWorkflowOverviewEmbeddingMountRenderState || !workflowApi?.getWorkflowOverviewEmbeddingMountDomContract || - !workflowApi?.getWorkflowOverviewEmbeddingMountDomReadiness + !workflowApi?.getWorkflowOverviewEmbeddingMountDomReadiness || + !workflowApi?.renderWorkflowOverviewEmbeddingMountState ) { throw new Error("workflow overview API namespace did not expose overview helpers"); } @@ -142,8 +143,15 @@ embeddingMountStateNode.append(embeddingMountStatus, embeddingMountRows); workflowDoc.body.append(embeddingMountStateNode); const embeddingMountDomReadinessReady = workflowApi.getWorkflowOverviewEmbeddingMountDomReadiness(); + const embeddingMountRenderResult = workflowApi.renderWorkflowOverviewEmbeddingMountState( + embeddingMountRenderState, + ); assertEqual(embeddingMountDomReadinessReady.ready, true, "workflow overview embedding mount ready DOM readiness"); assertEqual(embeddingMountDomReadinessReady.missing.join(","), "", "workflow overview embedding mount ready DOM missing"); + assertEqual(embeddingMountRenderResult.rendered, true, "workflow overview embedding mount render result"); + assertEqual(embeddingMountRenderResult.rowCount, 7, "workflow overview embedding mount render row count"); + assertEqual(embeddingMountRenderResult.dataset.handoffScope, "workflow-overview-embedding-mount", "workflow overview embedding mount render scope"); + assertEqual(embeddingMountStatus.textContent, embeddingMountRenderState.statusLine, "workflow overview embedding mount rendered status"); assertEqual( workflowDoc.querySelector("[data-handoff-workflow]").dataset.handoffScope, "workflow", diff --git a/wasm-port/tests/ui/node/verify_ini_panel_entry_docs.mjs b/wasm-port/tests/ui/node/verify_ini_panel_entry_docs.mjs index 34dabe4..0d510dc 100644 --- a/wasm-port/tests/ui/node/verify_ini_panel_entry_docs.mjs +++ b/wasm-port/tests/ui/node/verify_ini_panel_entry_docs.mjs @@ -51,6 +51,7 @@ import { createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, + renderIniPanelShellWorkflowOverviewEmbeddingMountState, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, renderIniPanelShellSessionHandoffMountState, @@ -143,6 +144,7 @@ const requiredShellExports = [ "createIniPanelShellWorkflowOverviewEmbeddingMountRenderState", "createIniPanelShellWorkflowOverviewEmbeddingMountDomContract", "createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness", + "renderIniPanelShellWorkflowOverviewEmbeddingMountState", "renderIniPanelShellSessionHandoffWorkflowState", "mountIniPanelShellSessionHandoffWorkflow", "renderIniPanelShellSessionHandoffMountState", @@ -453,6 +455,7 @@ assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEm assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingMountRenderState\b/); assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingMountDomContract\b/); assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness\b/); +assert.match(shellText, /\bexport function renderIniPanelShellWorkflowOverviewEmbeddingMountState\b/); assert.match(shellText, /\bexport function isSupportedIniPanelControlPageApiManifest\b/); assert.match(shellText, /\bexport function isSupportedIniPanelLaunchApiManifest\b/); assert.match(shellText, /\bexport function isSupportedIniPanelShellIntegrationManifest\b/); @@ -492,6 +495,7 @@ assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountDisplayViewModel\b/ assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountRenderState\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountDomContract\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountDomReadiness\b/); +assert.match(launchText, /\brenderWorkflowOverviewEmbeddingMountState\b/); assert.match(launchText, /\bisSupportedShellSessionHandoffPackage\b/); assert.match(launchText, /\bdata-handoff-shell\b/); assert.match(launchText, /\bdata-handoff-status\b/); @@ -536,6 +540,7 @@ assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountDispla assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountRenderState\b/); assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountDomContract\b/); assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness\b/); +assert.match(docText, /\brenderIniPanelShellWorkflowOverviewEmbeddingMountState\b/); assert.match(docText, /\bisSupportedIniPanelControlPageApiManifest\b/); assert.match(docText, /\bisSupportedIniPanelLaunchApiManifest\b/); assert.match(docText, /\bisSupportedIniPanelShellIntegrationManifest\b/); @@ -570,6 +575,7 @@ assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getWorkflowOverviewEmbedding assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getWorkflowOverviewEmbeddingMountRenderState\b/); assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getWorkflowOverviewEmbeddingMountDomContract\b/); assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getWorkflowOverviewEmbeddingMountDomReadiness\b/); +assert.match(docText, /\blinuxCncIniPanelLaunchApi\.renderWorkflowOverviewEmbeddingMountState\b/); assert.match(docText, /\blinuxCncIniPanelLaunchApi\.isSupportedShellSessionHandoffPackage\b/); assert.match(docText, /\bdata-handoff-shell\b/); assert.match(docText, /\bdata-handoff-status\b/); diff --git a/wasm-port/tests/ui/node/verify_ini_panel_launch_api_manifest.mjs b/wasm-port/tests/ui/node/verify_ini_panel_launch_api_manifest.mjs index 20c86bf..f3a4675 100644 --- a/wasm-port/tests/ui/node/verify_ini_panel_launch_api_manifest.mjs +++ b/wasm-port/tests/ui/node/verify_ini_panel_launch_api_manifest.mjs @@ -90,6 +90,7 @@ assert.deepEqual(manifest, { "getWorkflowOverviewEmbeddingMountRenderState", "getWorkflowOverviewEmbeddingMountDomContract", "getWorkflowOverviewEmbeddingMountDomReadiness", + "renderWorkflowOverviewEmbeddingMountState", "isSupportedShellSessionHandoffPackage", "getLauncherLinks", "getControlPageApiMethods", @@ -244,6 +245,7 @@ assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountDisplayViewModel\b/ assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountRenderState\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountDomContract\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountDomReadiness\b/); +assert.match(launchText, /\brenderWorkflowOverviewEmbeddingMountState\b/); assert.match(launchText, /\bisSupportedShellSessionHandoffPackage\b/); assert.match(launchText, /\bdata-handoff-workflow\b/); assert.match(launchText, /\bdata-handoff-workflow-status\b/); diff --git a/wasm-port/tests/ui/node/verify_ini_panel_shell_integration_manifest.mjs b/wasm-port/tests/ui/node/verify_ini_panel_shell_integration_manifest.mjs index 94cd641..91a2254 100644 --- a/wasm-port/tests/ui/node/verify_ini_panel_shell_integration_manifest.mjs +++ b/wasm-port/tests/ui/node/verify_ini_panel_shell_integration_manifest.mjs @@ -47,6 +47,7 @@ import { createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, + renderIniPanelShellWorkflowOverviewEmbeddingMountState, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, createIniPanelShellSessionHandoffPackageReport, @@ -175,7 +176,7 @@ assert.deepEqual(readiness, { counts: { pages: 3, launcherLinks: 3, - launchMethods: 53, + launchMethods: 54, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -237,7 +238,7 @@ assert.deepEqual(handoffSummary, { counts: { pages: 3, launcherLinks: 3, - launchMethods: 53, + launchMethods: 54, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -804,6 +805,7 @@ assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountDisplayView assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, "function"); +assert.equal(typeof renderIniPanelShellWorkflowOverviewEmbeddingMountState, "function"); assert.deepEqual( createIniPanelShellWorkflowOverviewReadiness({ overviewApi: { @@ -1232,7 +1234,7 @@ assert.deepEqual(createIniPanelShellIntegrationReadiness(blockedManifest), { counts: { pages: 3, launcherLinks: 3, - launchMethods: 53, + launchMethods: 54, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -1425,6 +1427,7 @@ assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEm assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingMountRenderState\b/); assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingMountDomContract\b/); assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness\b/); +assert.match(shellText, /\bexport function renderIniPanelShellWorkflowOverviewEmbeddingMountState\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageRenderState\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageSchema\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffRenderState\b/); @@ -1473,6 +1476,7 @@ assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountDispla assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountRenderState\b/); assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountDomContract\b/); assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness\b/); +assert.match(docText, /\brenderIniPanelShellWorkflowOverviewEmbeddingMountState\b/); assert.match(docText, /\bcreateIniPanelShellSessionHandoffPackageRenderState\b/); assert.match(docText, /\bcreateIniPanelShellSessionHandoffPackageSchema\b/); assert.match(docText, /\bcreateIniPanelShellSessionHandoffRenderState\b/); diff --git a/wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs b/wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs index 3cd3a11..1740c26 100644 --- a/wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs +++ b/wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs @@ -47,6 +47,7 @@ import { createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, + renderIniPanelShellWorkflowOverviewEmbeddingMountState, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, renderIniPanelShellSessionHandoffMountState, @@ -144,6 +145,7 @@ assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountDisplayView assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, "function"); +assert.equal(typeof renderIniPanelShellWorkflowOverviewEmbeddingMountState, "function"); assert.equal(typeof renderIniPanelShellSessionHandoffWorkflowState, "function"); assert.equal(typeof mountIniPanelShellSessionHandoffWorkflow, "function"); assert.equal(typeof renderIniPanelShellSessionHandoffMountState, "function"); @@ -853,6 +855,10 @@ assert.equal( shellViewModel.createWorkflowOverviewEmbeddingMountDomReadiness, createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, ); +assert.equal( + shellViewModel.renderWorkflowOverviewEmbeddingMountState, + renderIniPanelShellWorkflowOverviewEmbeddingMountState, +); assert.equal(shellViewModel.createShellSessionHandoffPackageReport, createIniPanelShellSessionHandoffPackageReport); assert.equal(shellViewModel.createShellSessionHandoffPackageSchema, createIniPanelShellSessionHandoffPackageSchema); assert.equal(shellViewModel.isSupportedShellSessionHandoffPackage, isSupportedIniPanelShellSessionHandoffPackage); @@ -1628,6 +1634,41 @@ assert.deepEqual( contract: createIniPanelShellWorkflowOverviewEmbeddingMountDomContract(), }, ); +assert.deepEqual( + renderIniPanelShellWorkflowOverviewEmbeddingMountState( + createIniPanelShellWorkflowOverviewEmbeddingMountRenderState( + createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel(workflowOverviewEmbeddingMountResult), + ), + { + documentRef: mountDocument, + mountNode, + statusNode: mountStatusNode, + rowsNode: mountRowsNode, + }, + ), + { + rendered: true, + statusLine: "Blocked: mount:blocked", + rowCount: 7, + rowIds: [ + "mount-ready", + "dom-readiness", + "missing-dom", + "render-state", + "render-result", + "render-row-count", + "error", + ], + dataset: { + handoffPhase: "blocked", + handoffReady: "false", + handoffScope: "workflow-overview-embedding-mount", + }, + }, +); +assert.equal(mountRowsNode.children[0].dataset.workflowOverviewEmbeddingMountRow, "mount-ready"); +assert.equal(mountRowsNode.children[1].dataset.workflowOverviewEmbeddingMountValue, "mount-ready"); +assert.equal(mountRowsNode.children[1].dataset.workflowOverviewEmbeddingMountStatus, "blocked"); assert.deepEqual( mountIniPanelShellWorkflowOverviewEmbedding({ overviewApi: null }).readiness.missing, shellViewModel.shellWorkflowOverviewContract.methodNames,