diff --git a/text13.txt b/text13.txt index b378769..147f3c6 100644 --- a/text13.txt +++ b/text13.txt @@ -1857,3 +1857,94 @@ host_wasm_opfs_browser_smokes=ok `createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel()` 或等价 helper,把 embedding mount workflow result 压缩成 stable `title`、`statusText`、`detailText` 与 rows,便于外部 shell 直接显示 mount 结果;仍保持只读,不新增控制按钮,不解析 G-code。 + +十八、2026-06-15 继续执行记录:INI panel workflow overview embedding mount display view-model + +本轮按 `text13.txt` 执行,不扩展 `text12.txt`。继续推进 browser/UI workflow,新增只读 +workflow-overview embedding mount display view-model,把 embedding mount workflow result 压缩成 +stable `title`、`statusText`、`detailText` 与 rows,便于外部 shell 直接显示 mount 结果。 + +完成内容: + +- `ui-shell.js` 新增 + `createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel()`; +- display view-model 输出: + - `phase: "ready" | "blocked"`; + - `title: "Workflow overview embedding mount"`; + - `statusText: "Ready" | "Blocked"`; + - `detailText`; + - `rows`; +- rows 覆盖: + - mount readiness; + - DOM readiness; + - missing DOM; + - render state; + - render result; + - render row count; + - error; +- `createIniPanelLaunchApiManifest().methods` 新增 + `getWorkflowOverviewEmbeddingMountDisplayViewModel`; +- `createIniPanelShellViewModel()` 暴露 + `createWorkflowOverviewEmbeddingMountDisplayViewModel`; +- `launch.html` 的 `window.linuxCncIniPanelLaunchApi` 新增真实 browser 入口 + `getWorkflowOverviewEmbeddingMountDisplayViewModel()`; +- `workflow-overview.html` 的 `window.linuxCncIniPanelWorkflowOverviewApi` 新增真实 browser + 入口 `getWorkflowOverviewEmbeddingMountDisplayViewModel()`; +- `verify_ini_panel_ui_shell.mjs` 覆盖 mount display view-model 的 blocked rows 与 missing DOM row; +- `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 iframe 自身 mount display view-model; +- `ini_panel_shell_integration_workflow_smoke.html` 校验外部 shell 从自定义 embedding DOM mount result + 生成 mount display view-model; +- `ini_panel_launch_smoke.html` 校验 launch API 与 workflow overview iframe API 暴露新 display helper; +- 未新增控制按钮; +- 未执行 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。下一批建议新增只读 +`createIniPanelShellWorkflowOverviewEmbeddingMountRenderState()` 或等价 helper,把 mount display +view-model 压缩成 stable `statusLine`、`dataset` 与 rows,作为后续共享 DOM renderer 的输入;仍保持只读, +不新增控制按钮,不解析 G-code。 diff --git a/wasm-port/docs/panel-entry.md b/wasm-port/docs/panel-entry.md index bfff05d..fa9a8a2 100644 --- a/wasm-port/docs/panel-entry.md +++ b/wasm-port/docs/panel-entry.md @@ -49,6 +49,7 @@ import { mountIniPanelShellWorkflowOverviewEmbedding, renderIniPanelShellWorkflowOverviewEmbeddingState, mountIniPanelShellWorkflowOverviewEmbeddingState, + createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, renderIniPanelShellSessionHandoffMountState, @@ -351,6 +352,12 @@ shell needs a non-throwing workflow result that combines embedding DOM readiness, render-state, render result, and any render error as structured data. The workflow overview page also exposes `linuxCncIniPanelWorkflowOverviewApi.mountWorkflowOverviewEmbeddingState()`. +Use `createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel()` or +`linuxCncIniPanelLaunchApi.getWorkflowOverviewEmbeddingMountDisplayViewModel()` +when an outer shell needs that mount workflow result compressed into stable +`title`, `statusText`, `detailText`, and read-only label/value rows. The +workflow overview page also exposes +`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingMountDisplayViewModel()`. 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 860441a..da5865d 100644 --- a/wasm-port/runtime/ui/ini-panel/launch.html +++ b/wasm-port/runtime/ui/ini-panel/launch.html @@ -302,6 +302,9 @@ documentRef: document, }) ), + getWorkflowOverviewEmbeddingMountDisplayViewModel: (mountResult) => ( + shellViewModel.createWorkflowOverviewEmbeddingMountDisplayViewModel(mountResult) + ), 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 c1e3dd3..0600508 100644 --- a/wasm-port/runtime/ui/ini-panel/ui-shell.js +++ b/wasm-port/runtime/ui/ini-panel/ui-shell.js @@ -166,6 +166,7 @@ export function createIniPanelLaunchApiManifest(entries = getVisibleIniPanelEntr "getWorkflowOverviewEmbeddingDomReadiness", "renderWorkflowOverviewEmbeddingState", "mountWorkflowOverviewEmbeddingState", + "getWorkflowOverviewEmbeddingMountDisplayViewModel", "isSupportedShellSessionHandoffPackage", "getLauncherLinks", "getControlPageApiMethods", @@ -2127,6 +2128,71 @@ export function mountIniPanelShellWorkflowOverviewEmbeddingState({ } } +export function createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel( + mountResult = mountIniPanelShellWorkflowOverviewEmbeddingState(), +) { + const domMissing = Array.isArray(mountResult?.domReadiness?.missing) + ? mountResult.domReadiness.missing + : []; + const renderResult = mountResult?.renderResult && typeof mountResult.renderResult === "object" + ? mountResult.renderResult + : {}; + const renderState = mountResult?.renderState && typeof mountResult.renderState === "object" + ? mountResult.renderState + : {}; + const error = mountResult?.error ?? null; + const ready = mountResult?.ready === true; + const problems = [ + ...(ready ? [] : [`mount:${mountResult?.phase ?? "blocked"}`]), + ...domMissing.map((name) => `dom:${name}`), + ...(error ? [`error:${error}`] : []), + ]; + + return { + phase: ready ? "ready" : "blocked", + title: "Workflow overview embedding mount", + statusText: ready ? "Ready" : "Blocked", + detailText: problems.length === 0 ? "No blocking reasons" : problems.join(", "), + rows: [ + { + id: "mount-ready", + label: "Mount readiness", + value: ready ? "ready" : "blocked", + }, + { + id: "dom-readiness", + label: "DOM readiness", + value: mountResult?.domReadiness?.ready ? "ready" : "blocked", + }, + { + id: "missing-dom", + label: "Missing DOM", + value: domMissing.length === 0 ? "none" : domMissing.join(", "), + }, + { + id: "render-state", + label: "Render state", + value: renderState.statusLine ?? "missing", + }, + { + id: "render-result", + label: "Render result", + value: renderResult.rendered ? "rendered" : "missing", + }, + { + id: "render-row-count", + label: "Render row count", + value: Number.isFinite(renderResult.rowCount) ? String(renderResult.rowCount) : "0", + }, + { + id: "error", + label: "Error", + value: error ?? "none", + }, + ], + }; +} + export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries()) { const shellIntegrationManifest = createIniPanelShellIntegrationManifest(entries); const shellIntegrationReadiness = createIniPanelShellIntegrationReadiness(shellIntegrationManifest); @@ -2292,6 +2358,8 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries createWorkflowOverviewEmbeddingDomReadiness: createIniPanelShellWorkflowOverviewEmbeddingDomReadiness, renderWorkflowOverviewEmbeddingState: renderIniPanelShellWorkflowOverviewEmbeddingState, mountWorkflowOverviewEmbeddingState: mountIniPanelShellWorkflowOverviewEmbeddingState, + createWorkflowOverviewEmbeddingMountDisplayViewModel: + createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, 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 aa1360e..42c7023 100644 --- a/wasm-port/runtime/ui/ini-panel/workflow-overview.html +++ b/wasm-port/runtime/ui/ini-panel/workflow-overview.html @@ -97,6 +97,7 @@ mountIniPanelShellWorkflowOverviewEmbedding, renderIniPanelShellWorkflowOverviewEmbeddingState, mountIniPanelShellWorkflowOverviewEmbeddingState, + createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, } from "./ui-shell.js"; @@ -161,6 +162,9 @@ documentRef: document, }) ), + getWorkflowOverviewEmbeddingMountDisplayViewModel: (mountResult) => ( + createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel(mountResult) + ), }; diff --git a/wasm-port/tests/browser/ini_panel_launch_smoke.html b/wasm-port/tests/browser/ini_panel_launch_smoke.html index 8906450..14f3c09 100644 --- a/wasm-port/tests/browser/ini_panel_launch_smoke.html +++ b/wasm-port/tests/browser/ini_panel_launch_smoke.html @@ -110,6 +110,7 @@ !launchApi?.getWorkflowOverviewEmbeddingDomReadiness || !launchApi?.renderWorkflowOverviewEmbeddingState || !launchApi?.mountWorkflowOverviewEmbeddingState || + !launchApi?.getWorkflowOverviewEmbeddingMountDisplayViewModel || !launchApi?.isSupportedShellSessionHandoffPackage || !launchApi?.getLauncherLinks || !launchApi?.getControlPageApiMethods @@ -641,7 +642,8 @@ !workflowOverviewApi?.getWorkflowOverviewEmbeddingDomContract || !workflowOverviewApi?.getWorkflowOverviewEmbeddingDomReadiness || !workflowOverviewApi?.renderWorkflowOverviewEmbeddingState || - !workflowOverviewApi?.mountWorkflowOverviewEmbeddingState + !workflowOverviewApi?.mountWorkflowOverviewEmbeddingState || + !workflowOverviewApi?.getWorkflowOverviewEmbeddingMountDisplayViewModel ) { 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 cf237a8..5f34dae 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 @@ -116,6 +116,7 @@ TOOL_TABLE = browser-shell-tool.tbl !launchApi?.getWorkflowOverviewEmbeddingDomReadiness || !launchApi?.renderWorkflowOverviewEmbeddingState || !launchApi?.mountWorkflowOverviewEmbeddingState || + !launchApi?.getWorkflowOverviewEmbeddingMountDisplayViewModel || !launchApi?.isSupportedShellSessionHandoffPackage ) { throw new Error("launch API namespace did not expose shell integration helpers"); @@ -332,6 +333,9 @@ TOOL_TABLE = browser-shell-tool.tbl contract: workflowOverviewEmbeddingDomContract, documentRef: document, }); + const workflowOverviewEmbeddingMountDisplay = launchApi.getWorkflowOverviewEmbeddingMountDisplayViewModel( + workflowOverviewEmbeddingMountState, + ); assertEqual(workflowOverviewReadiness.ready, true, "shell workflow overview iframe readiness"); assertEqual(workflowOverviewReadiness.missing.join(","), "", "shell workflow overview iframe missing methods"); assertEqual(workflowOverviewEmbedding.apiName, "ini-panel-shell-workflow-overview-embedding", "shell workflow overview embedding API"); @@ -361,6 +365,9 @@ TOOL_TABLE = browser-shell-tool.tbl assertEqual(workflowOverviewEmbeddingMountState.apiName, "ini-panel-shell-workflow-overview-embedding-dom-mount", "shell workflow overview embedding mount API"); assertEqual(workflowOverviewEmbeddingMountState.ready, false, "shell workflow overview embedding mount readiness"); assertEqual(workflowOverviewEmbeddingMountState.renderResult.rowCount, 6, "shell workflow overview embedding mount rows"); + assertEqual(workflowOverviewEmbeddingMountDisplay.title, "Workflow overview embedding mount", "shell workflow overview embedding mount display title"); + assertEqual(workflowOverviewEmbeddingMountDisplay.rows.length, 7, "shell workflow overview embedding mount display rows"); + assertEqual(workflowOverviewEmbeddingMountDisplay.detailText, "mount:blocked", "shell workflow overview embedding mount display detail"); const controlDoc = await loadFrame(`../../runtime/ui/ini-panel/${controlTarget.href.slice(2)}`); const controlPageApi = controlDoc.defaultView.linuxCncIniPanelControlPageApi; 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 a0a4ed5..ef3f149 100644 --- a/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html +++ b/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html @@ -42,7 +42,8 @@ !workflowApi?.getWorkflowOverviewEmbeddingDomContract || !workflowApi?.getWorkflowOverviewEmbeddingDomReadiness || !workflowApi?.renderWorkflowOverviewEmbeddingState || - !workflowApi?.mountWorkflowOverviewEmbeddingState + !workflowApi?.mountWorkflowOverviewEmbeddingState || + !workflowApi?.getWorkflowOverviewEmbeddingMountDisplayViewModel ) { throw new Error("workflow overview API namespace did not expose overview helpers"); } @@ -106,6 +107,9 @@ const embeddingMountState = workflowApi.mountWorkflowOverviewEmbeddingState({ renderState: embeddingRenderState, }); + const embeddingMountDisplay = workflowApi.getWorkflowOverviewEmbeddingMountDisplayViewModel( + embeddingMountState, + ); assertEqual(embeddingRenderResult.rendered, true, "workflow overview embedding render result"); assertEqual(embeddingRenderResult.rowCount, 6, "workflow overview embedding render row count"); assertEqual(embeddingRenderResult.dataset.handoffScope, "workflow-overview-embedding", "workflow overview embedding render scope"); @@ -113,6 +117,8 @@ assertEqual(embeddingMountState.apiName, "ini-panel-shell-workflow-overview-embedding-dom-mount", "workflow overview embedding mount API"); assertEqual(embeddingMountState.ready, false, "workflow overview embedding mount readiness"); assertEqual(embeddingMountState.renderResult.rowCount, 6, "workflow overview embedding mount row count"); + assertEqual(embeddingMountDisplay.statusText, "Blocked", "workflow overview embedding mount display status"); + assertEqual(embeddingMountDisplay.rows.length, 7, "workflow overview embedding mount display rows"); 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 a811c28..84cb789 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 @@ -47,6 +47,7 @@ import { mountIniPanelShellWorkflowOverviewEmbedding, renderIniPanelShellWorkflowOverviewEmbeddingState, mountIniPanelShellWorkflowOverviewEmbeddingState, + createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, renderIniPanelShellSessionHandoffMountState, @@ -135,6 +136,7 @@ const requiredShellExports = [ "mountIniPanelShellWorkflowOverviewEmbedding", "renderIniPanelShellWorkflowOverviewEmbeddingState", "mountIniPanelShellWorkflowOverviewEmbeddingState", + "createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel", "renderIniPanelShellSessionHandoffWorkflowState", "mountIniPanelShellSessionHandoffWorkflow", "renderIniPanelShellSessionHandoffMountState", @@ -441,6 +443,7 @@ assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEm assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingDomReadiness\b/); assert.match(shellText, /\bexport function renderIniPanelShellWorkflowOverviewEmbeddingState\b/); assert.match(shellText, /\bexport function mountIniPanelShellWorkflowOverviewEmbeddingState\b/); +assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel\b/); assert.match(shellText, /\bexport function isSupportedIniPanelControlPageApiManifest\b/); assert.match(shellText, /\bexport function isSupportedIniPanelLaunchApiManifest\b/); assert.match(shellText, /\bexport function isSupportedIniPanelShellIntegrationManifest\b/); @@ -476,6 +479,7 @@ assert.match(launchText, /\bgetWorkflowOverviewEmbeddingDomContract\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingDomReadiness\b/); assert.match(launchText, /\brenderWorkflowOverviewEmbeddingState\b/); assert.match(launchText, /\bmountWorkflowOverviewEmbeddingState\b/); +assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountDisplayViewModel\b/); assert.match(launchText, /\bisSupportedShellSessionHandoffPackage\b/); assert.match(launchText, /\bdata-handoff-shell\b/); assert.match(launchText, /\bdata-handoff-status\b/); @@ -516,6 +520,7 @@ assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingDomContract assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingDomReadiness\b/); assert.match(docText, /\brenderIniPanelShellWorkflowOverviewEmbeddingState\b/); assert.match(docText, /\bmountIniPanelShellWorkflowOverviewEmbeddingState\b/); +assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel\b/); assert.match(docText, /\bisSupportedIniPanelControlPageApiManifest\b/); assert.match(docText, /\bisSupportedIniPanelLaunchApiManifest\b/); assert.match(docText, /\bisSupportedIniPanelShellIntegrationManifest\b/); @@ -546,6 +551,7 @@ assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getWorkflowOverviewEmbedding assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getWorkflowOverviewEmbeddingDomReadiness\b/); assert.match(docText, /\blinuxCncIniPanelLaunchApi\.renderWorkflowOverviewEmbeddingState\b/); assert.match(docText, /\blinuxCncIniPanelLaunchApi\.mountWorkflowOverviewEmbeddingState\b/); +assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getWorkflowOverviewEmbeddingMountDisplayViewModel\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 9f7c424..efaec30 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 @@ -86,6 +86,7 @@ assert.deepEqual(manifest, { "getWorkflowOverviewEmbeddingDomReadiness", "renderWorkflowOverviewEmbeddingState", "mountWorkflowOverviewEmbeddingState", + "getWorkflowOverviewEmbeddingMountDisplayViewModel", "isSupportedShellSessionHandoffPackage", "getLauncherLinks", "getControlPageApiMethods", @@ -236,6 +237,7 @@ assert.match(launchText, /\bgetWorkflowOverviewEmbeddingDomContract\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingDomReadiness\b/); assert.match(launchText, /\brenderWorkflowOverviewEmbeddingState\b/); assert.match(launchText, /\bmountWorkflowOverviewEmbeddingState\b/); +assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountDisplayViewModel\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 c87fa49..c912f58 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 @@ -43,6 +43,7 @@ import { mountIniPanelShellWorkflowOverviewEmbedding, renderIniPanelShellWorkflowOverviewEmbeddingState, mountIniPanelShellWorkflowOverviewEmbeddingState, + createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, createIniPanelShellSessionHandoffPackageReport, @@ -171,7 +172,7 @@ assert.deepEqual(readiness, { counts: { pages: 3, launcherLinks: 3, - launchMethods: 49, + launchMethods: 50, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -233,7 +234,7 @@ assert.deepEqual(handoffSummary, { counts: { pages: 3, launcherLinks: 3, - launchMethods: 49, + launchMethods: 50, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -796,6 +797,7 @@ assert.equal( assert.equal(createIniPanelShellWorkflowOverviewEmbeddingDomReadiness().ready, false); assert.equal(typeof renderIniPanelShellWorkflowOverviewEmbeddingState, "function"); assert.equal(typeof mountIniPanelShellWorkflowOverviewEmbeddingState, "function"); +assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, "function"); assert.deepEqual( createIniPanelShellWorkflowOverviewReadiness({ overviewApi: { @@ -1224,7 +1226,7 @@ assert.deepEqual(createIniPanelShellIntegrationReadiness(blockedManifest), { counts: { pages: 3, launcherLinks: 3, - launchMethods: 49, + launchMethods: 50, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -1413,6 +1415,7 @@ assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEm assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingDomReadiness\b/); assert.match(shellText, /\bexport function renderIniPanelShellWorkflowOverviewEmbeddingState\b/); assert.match(shellText, /\bexport function mountIniPanelShellWorkflowOverviewEmbeddingState\b/); +assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageRenderState\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageSchema\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffRenderState\b/); @@ -1457,6 +1460,7 @@ assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingDomContract assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingDomReadiness\b/); assert.match(docText, /\brenderIniPanelShellWorkflowOverviewEmbeddingState\b/); assert.match(docText, /\bmountIniPanelShellWorkflowOverviewEmbeddingState\b/); +assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel\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 224b4fa..a5387fa 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 @@ -43,6 +43,7 @@ import { mountIniPanelShellWorkflowOverviewEmbedding, renderIniPanelShellWorkflowOverviewEmbeddingState, mountIniPanelShellWorkflowOverviewEmbeddingState, + createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, renderIniPanelShellSessionHandoffMountState, @@ -136,6 +137,7 @@ assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingDomReadiness, "f assert.equal(typeof mountIniPanelShellWorkflowOverviewEmbedding, "function"); assert.equal(typeof renderIniPanelShellWorkflowOverviewEmbeddingState, "function"); assert.equal(typeof mountIniPanelShellWorkflowOverviewEmbeddingState, "function"); +assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, "function"); assert.equal(typeof renderIniPanelShellSessionHandoffWorkflowState, "function"); assert.equal(typeof mountIniPanelShellSessionHandoffWorkflow, "function"); assert.equal(typeof renderIniPanelShellSessionHandoffMountState, "function"); @@ -829,6 +831,10 @@ assert.equal( shellViewModel.mountWorkflowOverviewEmbeddingState, mountIniPanelShellWorkflowOverviewEmbeddingState, ); +assert.equal( + shellViewModel.createWorkflowOverviewEmbeddingMountDisplayViewModel, + createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, +); assert.equal(shellViewModel.createShellSessionHandoffPackageReport, createIniPanelShellSessionHandoffPackageReport); assert.equal(shellViewModel.createShellSessionHandoffPackageSchema, createIniPanelShellSessionHandoffPackageSchema); assert.equal(shellViewModel.isSupportedShellSessionHandoffPackage, isSupportedIniPanelShellSessionHandoffPackage); @@ -1422,6 +1428,62 @@ assert.deepEqual( mountIniPanelShellWorkflowOverviewEmbeddingState({ documentRef: null }).domReadiness.missing, ["document", "mount", "status", "rows"], ); +assert.deepEqual( + createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel(workflowOverviewEmbeddingMountResult), + { + phase: "blocked", + title: "Workflow overview embedding mount", + statusText: "Blocked", + detailText: "mount:blocked", + rows: [ + { + id: "mount-ready", + label: "Mount readiness", + value: "blocked", + }, + { + id: "dom-readiness", + label: "DOM readiness", + value: "ready", + }, + { + id: "missing-dom", + label: "Missing DOM", + value: "none", + }, + { + id: "render-state", + label: "Render state", + value: "Blocked: embedding:blocked, mount:blocked", + }, + { + id: "render-result", + label: "Render result", + value: "rendered", + }, + { + id: "render-row-count", + label: "Render row count", + value: "6", + }, + { + id: "error", + label: "Error", + value: "none", + }, + ], + }, +); +assert.deepEqual( + createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel( + mountIniPanelShellWorkflowOverviewEmbeddingState({ documentRef: null }), + ).rows[2], + { + id: "missing-dom", + label: "Missing DOM", + value: "document, mount, status, rows", + }, +); assert.deepEqual( mountIniPanelShellWorkflowOverviewEmbedding({ overviewApi: null }).readiness.missing, shellViewModel.shellWorkflowOverviewContract.methodNames,