From 861c854309e40997e567359d6a5a8867e1efefb7 Mon Sep 17 00:00:00 2001 From: wangdequan Date: Mon, 15 Jun 2026 21:23:53 +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=20contract?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- text14.txt | 89 +++++++++++++++++++ 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 | 29 ++++++ .../ui/ini-panel/workflow-overview.html | 4 + .../tests/browser/ini_panel_launch_smoke.html | 4 +- ...anel_shell_integration_workflow_smoke.html | 11 +++ .../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 | 34 +++++++ 12 files changed, 200 insertions(+), 5 deletions(-) diff --git a/text14.txt b/text14.txt index 99fe711..27950a9 100644 --- a/text14.txt +++ b/text14.txt @@ -529,3 +529,92 @@ wasm-port/tests/native/verify_sim_configs.sh - host 聚合输出 `host_wasm_opfs_browser_smokes=ok`; - blocked runtime family 明确保留 blocked,不误 promotion; - 文档中下一步建议只剩真实外部依赖或明确 scope 外事项。 + +八、2026-06-15 继续执行记录:INI panel workflow overview embedding mount DOM contract + +本轮按 `text14.txt` 执行,从 Browser/UI workflow 收口批次开始快速推进。新增只读 +workflow-overview embedding mount DOM contract,为 mount render-state 定义 mount/status/rows +selectors、dataset keys 与 render-result fields,给后续 DOM readiness 和 renderer 提供稳定契约。 + +完成内容: + +- `ui-shell.js` 新增 + `createIniPanelShellWorkflowOverviewEmbeddingMountDomContract()`; +- mount DOM contract 输出: + - `apiName: "ini-panel-shell-workflow-overview-embedding-mount-dom-contract"`; + - `contractVersion: 1`; + - `requiredNodeIds: ["mount", "status", "rows"]`; + - 默认 selectors: + - `[data-workflow-overview-embedding-mount]`; + - `[data-workflow-overview-embedding-mount-status]`; + - `[data-workflow-overview-embedding-mount-rows]`; + - `mountDatasetKeys`; + - `rowDatasetPrefix: "workflowOverviewEmbeddingMount"`; + - `rowDatasetKeys`; + - `renderResultFields`; +- 支持自定义 `rowDatasetPrefix` 与 selectors; +- `createIniPanelLaunchApiManifest().methods` 新增 + `getWorkflowOverviewEmbeddingMountDomContract`; +- `createIniPanelShellViewModel()` 暴露 + `createWorkflowOverviewEmbeddingMountDomContract`; +- `launch.html` 的 `window.linuxCncIniPanelLaunchApi` 新增真实 browser 入口 + `getWorkflowOverviewEmbeddingMountDomContract()`; +- `workflow-overview.html` 的 `window.linuxCncIniPanelWorkflowOverviewApi` 新增真实 browser + 入口 `getWorkflowOverviewEmbeddingMountDomContract()`; +- `verify_ini_panel_ui_shell.mjs` 覆盖默认 contract 与自定义 prefix/selectors; +- `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 DOM contract; +- `ini_panel_shell_integration_workflow_smoke.html` 校验外部 shell 自定义 mount DOM contract; +- `ini_panel_launch_smoke.html` 校验 launch API 与 workflow overview iframe API 暴露新 contract 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 收口批次。下一批建议新增只读 +`createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness()` 或等价 helper,检查 mount +render-state contract 所需 document/mount/status/rows 节点是否存在,输出 missing/checks, +为后续 renderer 和 mount workflow 提供稳定前置 gate;仍保持只读,不新增控制按钮,不解析 G-code。 diff --git a/wasm-port/docs/panel-entry.md b/wasm-port/docs/panel-entry.md index e788775..4978439 100644 --- a/wasm-port/docs/panel-entry.md +++ b/wasm-port/docs/panel-entry.md @@ -51,6 +51,7 @@ import { mountIniPanelShellWorkflowOverviewEmbeddingState, createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, + createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, renderIniPanelShellSessionHandoffMountState, @@ -365,6 +366,12 @@ an outer shell needs that mount display view-model compressed into stable `statusLine`, `dataset`, and rows for a shared DOM renderer. The workflow overview page also exposes `linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingMountRenderState()`. +Use `createIniPanelShellWorkflowOverviewEmbeddingMountDomContract()` or +`linuxCncIniPanelLaunchApi.getWorkflowOverviewEmbeddingMountDomContract()` when +an outer shell needs the required mount/status/rows selectors, mount dataset +keys, row dataset keys, and render-result fields before rendering the mount +render-state. The workflow overview page also exposes +`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingMountDomContract()`. 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 16cbf93..aa2e7f6 100644 --- a/wasm-port/runtime/ui/ini-panel/launch.html +++ b/wasm-port/runtime/ui/ini-panel/launch.html @@ -308,6 +308,9 @@ getWorkflowOverviewEmbeddingMountRenderState: (displayViewModel) => ( shellViewModel.createWorkflowOverviewEmbeddingMountRenderState(displayViewModel) ), + getWorkflowOverviewEmbeddingMountDomContract: (options) => ( + shellViewModel.createWorkflowOverviewEmbeddingMountDomContract(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 6ff4061..5f940ee 100644 --- a/wasm-port/runtime/ui/ini-panel/ui-shell.js +++ b/wasm-port/runtime/ui/ini-panel/ui-shell.js @@ -168,6 +168,7 @@ export function createIniPanelLaunchApiManifest(entries = getVisibleIniPanelEntr "mountWorkflowOverviewEmbeddingState", "getWorkflowOverviewEmbeddingMountDisplayViewModel", "getWorkflowOverviewEmbeddingMountRenderState", + "getWorkflowOverviewEmbeddingMountDomContract", "isSupportedShellSessionHandoffPackage", "getLauncherLinks", "getControlPageApiMethods", @@ -2226,6 +2227,32 @@ export function createIniPanelShellWorkflowOverviewEmbeddingMountRenderState( }; } +export function createIniPanelShellWorkflowOverviewEmbeddingMountDomContract({ + rowDatasetPrefix = "workflowOverviewEmbeddingMount", + selectors = {}, +} = {}) { + const mountSelector = selectors.mount ?? "[data-workflow-overview-embedding-mount]"; + const statusSelector = selectors.status ?? "[data-workflow-overview-embedding-mount-status]"; + const rowsSelector = selectors.rows ?? "[data-workflow-overview-embedding-mount-rows]"; + return { + apiName: "ini-panel-shell-workflow-overview-embedding-mount-dom-contract", + contractVersion: 1, + requiredNodeIds: ["mount", "status", "rows"], + selectors: { + mount: mountSelector, + status: statusSelector, + rows: rowsSelector, + }, + mountDatasetKeys: ["handoffPhase", "handoffReady", "handoffScope"], + rowDatasetPrefix, + rowDatasetKeys: { + term: [`${rowDatasetPrefix}Row`, `${rowDatasetPrefix}Status`], + detail: [`${rowDatasetPrefix}Value`, `${rowDatasetPrefix}Status`], + }, + renderResultFields: ["rendered", "statusLine", "rowCount", "rowIds", "dataset"], + }; +} + export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries()) { const shellIntegrationManifest = createIniPanelShellIntegrationManifest(entries); const shellIntegrationReadiness = createIniPanelShellIntegrationReadiness(shellIntegrationManifest); @@ -2395,6 +2422,8 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, createWorkflowOverviewEmbeddingMountRenderState: createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, + createWorkflowOverviewEmbeddingMountDomContract: + createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, 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 681541e..79e8005 100644 --- a/wasm-port/runtime/ui/ini-panel/workflow-overview.html +++ b/wasm-port/runtime/ui/ini-panel/workflow-overview.html @@ -99,6 +99,7 @@ mountIniPanelShellWorkflowOverviewEmbeddingState, createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, + createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, } from "./ui-shell.js"; @@ -169,6 +170,9 @@ getWorkflowOverviewEmbeddingMountRenderState: (displayViewModel) => ( createIniPanelShellWorkflowOverviewEmbeddingMountRenderState(displayViewModel) ), + getWorkflowOverviewEmbeddingMountDomContract: (options) => ( + createIniPanelShellWorkflowOverviewEmbeddingMountDomContract(options) + ), }; diff --git a/wasm-port/tests/browser/ini_panel_launch_smoke.html b/wasm-port/tests/browser/ini_panel_launch_smoke.html index 2e05040..311a6c5 100644 --- a/wasm-port/tests/browser/ini_panel_launch_smoke.html +++ b/wasm-port/tests/browser/ini_panel_launch_smoke.html @@ -112,6 +112,7 @@ !launchApi?.mountWorkflowOverviewEmbeddingState || !launchApi?.getWorkflowOverviewEmbeddingMountDisplayViewModel || !launchApi?.getWorkflowOverviewEmbeddingMountRenderState || + !launchApi?.getWorkflowOverviewEmbeddingMountDomContract || !launchApi?.isSupportedShellSessionHandoffPackage || !launchApi?.getLauncherLinks || !launchApi?.getControlPageApiMethods @@ -645,7 +646,8 @@ !workflowOverviewApi?.renderWorkflowOverviewEmbeddingState || !workflowOverviewApi?.mountWorkflowOverviewEmbeddingState || !workflowOverviewApi?.getWorkflowOverviewEmbeddingMountDisplayViewModel || - !workflowOverviewApi?.getWorkflowOverviewEmbeddingMountRenderState + !workflowOverviewApi?.getWorkflowOverviewEmbeddingMountRenderState || + !workflowOverviewApi?.getWorkflowOverviewEmbeddingMountDomContract ) { 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 0500437..c112adf 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 @@ -118,6 +118,7 @@ TOOL_TABLE = browser-shell-tool.tbl !launchApi?.mountWorkflowOverviewEmbeddingState || !launchApi?.getWorkflowOverviewEmbeddingMountDisplayViewModel || !launchApi?.getWorkflowOverviewEmbeddingMountRenderState || + !launchApi?.getWorkflowOverviewEmbeddingMountDomContract || !launchApi?.isSupportedShellSessionHandoffPackage ) { throw new Error("launch API namespace did not expose shell integration helpers"); @@ -340,6 +341,14 @@ TOOL_TABLE = browser-shell-tool.tbl const workflowOverviewEmbeddingMountRenderState = launchApi.getWorkflowOverviewEmbeddingMountRenderState( workflowOverviewEmbeddingMountDisplay, ); + const workflowOverviewEmbeddingMountDomContract = launchApi.getWorkflowOverviewEmbeddingMountDomContract({ + rowDatasetPrefix: "externalOverviewEmbeddingMount", + selectors: { + mount: "[data-external-overview-embedding-mount]", + status: "[data-external-overview-embedding-mount-status]", + rows: "[data-external-overview-embedding-mount-rows]", + }, + }); 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"); @@ -374,6 +383,8 @@ TOOL_TABLE = browser-shell-tool.tbl assertEqual(workflowOverviewEmbeddingMountDisplay.detailText, "mount:blocked", "shell workflow overview embedding mount display detail"); assertEqual(workflowOverviewEmbeddingMountRenderState.statusLine, "Blocked: mount:blocked", "shell workflow overview embedding mount render status"); assertEqual(workflowOverviewEmbeddingMountRenderState.dataset.handoffScope, "workflow-overview-embedding-mount", "shell workflow overview embedding mount render scope"); + assertEqual(workflowOverviewEmbeddingMountDomContract.selectors.rows, "[data-external-overview-embedding-mount-rows]", "shell workflow overview embedding mount DOM rows selector"); + assertEqual(workflowOverviewEmbeddingMountDomContract.rowDatasetKeys.detail[0], "externalOverviewEmbeddingMountValue", "shell workflow overview embedding mount DOM detail key"); 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 e913b3a..303dc74 100644 --- a/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html +++ b/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html @@ -44,7 +44,8 @@ !workflowApi?.renderWorkflowOverviewEmbeddingState || !workflowApi?.mountWorkflowOverviewEmbeddingState || !workflowApi?.getWorkflowOverviewEmbeddingMountDisplayViewModel || - !workflowApi?.getWorkflowOverviewEmbeddingMountRenderState + !workflowApi?.getWorkflowOverviewEmbeddingMountRenderState || + !workflowApi?.getWorkflowOverviewEmbeddingMountDomContract ) { throw new Error("workflow overview API namespace did not expose overview helpers"); } @@ -114,6 +115,7 @@ const embeddingMountRenderState = workflowApi.getWorkflowOverviewEmbeddingMountRenderState( embeddingMountDisplay, ); + const embeddingMountDomContract = workflowApi.getWorkflowOverviewEmbeddingMountDomContract(); 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"); @@ -125,6 +127,8 @@ assertEqual(embeddingMountDisplay.rows.length, 7, "workflow overview embedding mount display rows"); assertEqual(embeddingMountRenderState.statusLine, "Blocked: mount:blocked", "workflow overview embedding mount render status"); assertEqual(embeddingMountRenderState.rows.length, 7, "workflow overview embedding mount render rows"); + assertEqual(embeddingMountDomContract.selectors.mount, "[data-workflow-overview-embedding-mount]", "workflow overview embedding mount DOM selector"); + assertEqual(embeddingMountDomContract.rowDatasetKeys.term[0], "workflowOverviewEmbeddingMountRow", "workflow overview embedding mount row key"); 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 a2f1591..44ea4f2 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 @@ -49,6 +49,7 @@ import { mountIniPanelShellWorkflowOverviewEmbeddingState, createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, + createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, renderIniPanelShellSessionHandoffMountState, @@ -139,6 +140,7 @@ const requiredShellExports = [ "mountIniPanelShellWorkflowOverviewEmbeddingState", "createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel", "createIniPanelShellWorkflowOverviewEmbeddingMountRenderState", + "createIniPanelShellWorkflowOverviewEmbeddingMountDomContract", "renderIniPanelShellSessionHandoffWorkflowState", "mountIniPanelShellSessionHandoffWorkflow", "renderIniPanelShellSessionHandoffMountState", @@ -447,6 +449,7 @@ assert.match(shellText, /\bexport function renderIniPanelShellWorkflowOverviewEm assert.match(shellText, /\bexport function mountIniPanelShellWorkflowOverviewEmbeddingState\b/); assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel\b/); assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingMountRenderState\b/); +assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingMountDomContract\b/); assert.match(shellText, /\bexport function isSupportedIniPanelControlPageApiManifest\b/); assert.match(shellText, /\bexport function isSupportedIniPanelLaunchApiManifest\b/); assert.match(shellText, /\bexport function isSupportedIniPanelShellIntegrationManifest\b/); @@ -484,6 +487,7 @@ assert.match(launchText, /\brenderWorkflowOverviewEmbeddingState\b/); assert.match(launchText, /\bmountWorkflowOverviewEmbeddingState\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountDisplayViewModel\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountRenderState\b/); +assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountDomContract\b/); assert.match(launchText, /\bisSupportedShellSessionHandoffPackage\b/); assert.match(launchText, /\bdata-handoff-shell\b/); assert.match(launchText, /\bdata-handoff-status\b/); @@ -526,6 +530,7 @@ assert.match(docText, /\brenderIniPanelShellWorkflowOverviewEmbeddingState\b/); assert.match(docText, /\bmountIniPanelShellWorkflowOverviewEmbeddingState\b/); assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel\b/); assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountRenderState\b/); +assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountDomContract\b/); assert.match(docText, /\bisSupportedIniPanelControlPageApiManifest\b/); assert.match(docText, /\bisSupportedIniPanelLaunchApiManifest\b/); assert.match(docText, /\bisSupportedIniPanelShellIntegrationManifest\b/); @@ -558,6 +563,7 @@ assert.match(docText, /\blinuxCncIniPanelLaunchApi\.renderWorkflowOverviewEmbedd assert.match(docText, /\blinuxCncIniPanelLaunchApi\.mountWorkflowOverviewEmbeddingState\b/); assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getWorkflowOverviewEmbeddingMountDisplayViewModel\b/); assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getWorkflowOverviewEmbeddingMountRenderState\b/); +assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getWorkflowOverviewEmbeddingMountDomContract\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 080c615..58881e8 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 @@ -88,6 +88,7 @@ assert.deepEqual(manifest, { "mountWorkflowOverviewEmbeddingState", "getWorkflowOverviewEmbeddingMountDisplayViewModel", "getWorkflowOverviewEmbeddingMountRenderState", + "getWorkflowOverviewEmbeddingMountDomContract", "isSupportedShellSessionHandoffPackage", "getLauncherLinks", "getControlPageApiMethods", @@ -240,6 +241,7 @@ assert.match(launchText, /\brenderWorkflowOverviewEmbeddingState\b/); assert.match(launchText, /\bmountWorkflowOverviewEmbeddingState\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountDisplayViewModel\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountRenderState\b/); +assert.match(launchText, /\bgetWorkflowOverviewEmbeddingMountDomContract\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 8cadb88..25bdfcc 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 @@ -45,6 +45,7 @@ import { mountIniPanelShellWorkflowOverviewEmbeddingState, createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, + createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, createIniPanelShellSessionHandoffPackageReport, @@ -173,7 +174,7 @@ assert.deepEqual(readiness, { counts: { pages: 3, launcherLinks: 3, - launchMethods: 51, + launchMethods: 52, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -235,7 +236,7 @@ assert.deepEqual(handoffSummary, { counts: { pages: 3, launcherLinks: 3, - launchMethods: 51, + launchMethods: 52, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -800,6 +801,7 @@ assert.equal(typeof renderIniPanelShellWorkflowOverviewEmbeddingState, "function assert.equal(typeof mountIniPanelShellWorkflowOverviewEmbeddingState, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, "function"); +assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, "function"); assert.deepEqual( createIniPanelShellWorkflowOverviewReadiness({ overviewApi: { @@ -1228,7 +1230,7 @@ assert.deepEqual(createIniPanelShellIntegrationReadiness(blockedManifest), { counts: { pages: 3, launcherLinks: 3, - launchMethods: 51, + launchMethods: 52, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -1419,6 +1421,7 @@ assert.match(shellText, /\bexport function renderIniPanelShellWorkflowOverviewEm assert.match(shellText, /\bexport function mountIniPanelShellWorkflowOverviewEmbeddingState\b/); assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel\b/); assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingMountRenderState\b/); +assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingMountDomContract\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageRenderState\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageSchema\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffRenderState\b/); @@ -1465,6 +1468,7 @@ assert.match(docText, /\brenderIniPanelShellWorkflowOverviewEmbeddingState\b/); assert.match(docText, /\bmountIniPanelShellWorkflowOverviewEmbeddingState\b/); assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel\b/); assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountRenderState\b/); +assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingMountDomContract\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 d9a308b..e4062bc 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 @@ -45,6 +45,7 @@ import { mountIniPanelShellWorkflowOverviewEmbeddingState, createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, + createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, renderIniPanelShellSessionHandoffMountState, @@ -140,6 +141,7 @@ assert.equal(typeof renderIniPanelShellWorkflowOverviewEmbeddingState, "function assert.equal(typeof mountIniPanelShellWorkflowOverviewEmbeddingState, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, "function"); +assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, "function"); assert.equal(typeof renderIniPanelShellSessionHandoffWorkflowState, "function"); assert.equal(typeof mountIniPanelShellSessionHandoffWorkflow, "function"); assert.equal(typeof renderIniPanelShellSessionHandoffMountState, "function"); @@ -841,6 +843,10 @@ assert.equal( shellViewModel.createWorkflowOverviewEmbeddingMountRenderState, createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, ); +assert.equal( + shellViewModel.createWorkflowOverviewEmbeddingMountDomContract, + createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, +); assert.equal(shellViewModel.createShellSessionHandoffPackageReport, createIniPanelShellSessionHandoffPackageReport); assert.equal(shellViewModel.createShellSessionHandoffPackageSchema, createIniPanelShellSessionHandoffPackageSchema); assert.equal(shellViewModel.isSupportedShellSessionHandoffPackage, isSupportedIniPanelShellSessionHandoffPackage); @@ -1547,6 +1553,34 @@ assert.deepEqual( }, }, ); +assert.deepEqual(createIniPanelShellWorkflowOverviewEmbeddingMountDomContract(), { + apiName: "ini-panel-shell-workflow-overview-embedding-mount-dom-contract", + contractVersion: 1, + requiredNodeIds: ["mount", "status", "rows"], + selectors: { + mount: "[data-workflow-overview-embedding-mount]", + status: "[data-workflow-overview-embedding-mount-status]", + rows: "[data-workflow-overview-embedding-mount-rows]", + }, + mountDatasetKeys: ["handoffPhase", "handoffReady", "handoffScope"], + rowDatasetPrefix: "workflowOverviewEmbeddingMount", + rowDatasetKeys: { + term: ["workflowOverviewEmbeddingMountRow", "workflowOverviewEmbeddingMountStatus"], + detail: ["workflowOverviewEmbeddingMountValue", "workflowOverviewEmbeddingMountStatus"], + }, + renderResultFields: ["rendered", "statusLine", "rowCount", "rowIds", "dataset"], +}); +assert.deepEqual( + createIniPanelShellWorkflowOverviewEmbeddingMountDomContract({ + rowDatasetPrefix: "externalEmbeddingMount", + selectors: { + mount: "[data-external-embedding-mount]", + status: "[data-external-embedding-mount-status]", + rows: "[data-external-embedding-mount-rows]", + }, + }).rowDatasetKeys.detail, + ["externalEmbeddingMountValue", "externalEmbeddingMountStatus"], +); assert.deepEqual( mountIniPanelShellWorkflowOverviewEmbedding({ overviewApi: null }).readiness.missing, shellViewModel.shellWorkflowOverviewContract.methodNames,