From 709569086902489b74012384966edb4cfc204446 Mon Sep 17 00:00:00 2001 From: wangdequan Date: Mon, 15 Jun 2026 17:59:16 +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=20report?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- text13.txt | 106 ++++++++++++++++++ wasm-port/docs/panel-entry.md | 10 +- wasm-port/runtime/ui/ini-panel/launch.html | 3 + wasm-port/runtime/ui/ini-panel/ui-shell.js | 82 ++++++++++++++ .../ui/ini-panel/workflow-overview.html | 4 + .../tests/browser/ini_panel_launch_smoke.html | 17 ++- ...anel_shell_integration_workflow_smoke.html | 8 ++ .../ini_panel_workflow_overview_smoke.html | 19 +++- .../ui/node/verify_ini_panel_entry_docs.mjs | 7 ++ .../verify_ini_panel_launch_api_manifest.mjs | 2 + ...y_ini_panel_shell_integration_manifest.mjs | 11 +- .../ui/node/verify_ini_panel_ui_shell.mjs | 62 +++++++++- 12 files changed, 323 insertions(+), 8 deletions(-) diff --git a/text13.txt b/text13.txt index fb5f0cd..2f8ec15 100644 --- a/text13.txt +++ b/text13.txt @@ -1205,3 +1205,109 @@ host_wasm_opfs_browser_smokes=ok `createIniPanelShellWorkflowOverviewEmbeddingReport()` 或等价 helper,把 overview iframe readiness、missing methods、mount phase、render row count 和 error 合并成 display-ready report, 便于外部 shell 在不能嵌入 overview 时直接显示原因;仍保持只读,不新增控制按钮,不解析 G-code。 + +十一、2026-06-15 继续执行记录:INI panel workflow overview embedding report + +本轮按 `text13.txt` 执行,不扩展 `text12.txt`。继续推进 browser/UI workflow 与可执行 +gate,新增只读 workflow-overview embedding report,把 iframe API readiness、缺失方法、 +mount phase、render row count 和 error 合并成外部 shell 可直接显示的诊断。 + +完成内容: + +- `ui-shell.js` 新增 `createIniPanelShellWorkflowOverviewEmbeddingReport()`; +- embedding report 输出: + - `apiName: "ini-panel-shell-workflow-overview-embedding-report"`; + - `reportVersion: 1`; + - `phase`; + - `ready`; + - `overviewReady`; + - `embeddingReady`; + - `mountReady`; + - `statusLine`; + - `pageHref`; + - `contract`; + - `missingMethods`; + - `mountPhase`; + - `renderRowCount`; + - `error`; + - `blockingReasons`; + - `rows`; +- report rows 固定覆盖: + - `overview-api`; + - `missing-methods`; + - `embedding-ready`; + - `mount-phase`; + - `render-row-count`; + - `error`; +- `createIniPanelLaunchApiManifest().methods` 新增 + `getWorkflowOverviewEmbeddingReport`; +- `launch.html` 的 `window.linuxCncIniPanelLaunchApi` 新增真实 browser 入口 + `getWorkflowOverviewEmbeddingReport()`; +- `workflow-overview.html` 的 `window.linuxCncIniPanelWorkflowOverviewApi` 新增 + `getWorkflowOverviewEmbeddingReport()`; +- `verify_ini_panel_ui_shell.mjs` 覆盖: + - blocked embedding report 完整 shape; + - missing methods report; + - thrown mount error report; +- `verify_ini_panel_launch_api_manifest.mjs` 覆盖 launch manifest 与 launch 页面真实 API; +- `verify_ini_panel_shell_integration_manifest.mjs` 覆盖 helper export、默认 blocked report、 + launch method count 与文档记录; +- `verify_ini_panel_entry_docs.mjs` 与 `docs/panel-entry.md` 同步记录新 helper/API; +- `ini_panel_workflow_overview_smoke.html` 校验 workflow overview iframe 自身 report API; +- `ini_panel_launch_smoke.html` 校验真实 launch iframe 读取真实 workflow overview iframe 的 + embedding report; +- `ini_panel_shell_integration_workflow_smoke.html` 校验外部 shell workflow 读取同一 report; +- 未新增控制按钮; +- 未执行 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。下一批建议新增一个只读 +`createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel()` 或等价 helper,把 embedding +report 压成稳定 `title/statusText/detailText/rows`,供 launch 页面、workflow overview 页面或外部 +shell 直接渲染该 report;仍保持只读,不新增控制按钮,不解析 G-code。 diff --git a/wasm-port/docs/panel-entry.md b/wasm-port/docs/panel-entry.md index 0d6957a..0bf17d2 100644 --- a/wasm-port/docs/panel-entry.md +++ b/wasm-port/docs/panel-entry.md @@ -41,6 +41,7 @@ import { createIniPanelShellSessionHandoffWorkflowDomReadiness, createIniPanelShellWorkflowOverviewContract, createIniPanelShellWorkflowOverviewReadiness, + createIniPanelShellWorkflowOverviewEmbeddingReport, mountIniPanelShellWorkflowOverviewEmbedding, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, @@ -302,7 +303,14 @@ shell needs one structured embedding result containing contract readiness, render-state, workflow overview mount result, and any mount error as data. The workflow overview page also exposes `linuxCncIniPanelWorkflowOverviewApi.mountWorkflowOverviewEmbedding()` for the -same read-only embedding path from inside the iframe. +same read-only embedding path from inside the iframe. Use +`createIniPanelShellWorkflowOverviewEmbeddingReport()` or +`linuxCncIniPanelLaunchApi.getWorkflowOverviewEmbeddingReport()` when an outer +shell needs display-ready diagnostics for overview API readiness, missing +methods, embedding readiness, mount phase, render row count, and embedding +errors. The workflow overview page also exposes +`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingReport()` for +the same report shape. 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 db853c0..a293862 100644 --- a/wasm-port/runtime/ui/ini-panel/launch.html +++ b/wasm-port/runtime/ui/ini-panel/launch.html @@ -279,6 +279,9 @@ mountWorkflowOverviewEmbedding: (options) => ( shellViewModel.mountWorkflowOverviewEmbedding(options) ), + getWorkflowOverviewEmbeddingReport: (embeddingResult, contract) => ( + shellViewModel.createWorkflowOverviewEmbeddingReport(embeddingResult, contract) + ), 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 82d0d0f..be13cd7 100644 --- a/wasm-port/runtime/ui/ini-panel/ui-shell.js +++ b/wasm-port/runtime/ui/ini-panel/ui-shell.js @@ -159,6 +159,7 @@ export function createIniPanelLaunchApiManifest(entries = getVisibleIniPanelEntr "getWorkflowOverviewContract", "getWorkflowOverviewReadiness", "mountWorkflowOverviewEmbedding", + "getWorkflowOverviewEmbeddingReport", "isSupportedShellSessionHandoffPackage", "getLauncherLinks", "getControlPageApiMethods", @@ -1807,6 +1808,86 @@ export function mountIniPanelShellWorkflowOverviewEmbedding({ } } +export function createIniPanelShellWorkflowOverviewEmbeddingReport( + embeddingResult = mountIniPanelShellWorkflowOverviewEmbedding(), + contract = createIniPanelShellWorkflowOverviewContract(), +) { + const result = embeddingResult && typeof embeddingResult === "object" ? embeddingResult : {}; + const readiness = result.readiness && typeof result.readiness === "object" ? result.readiness : {}; + const resultContract = result.contract && typeof result.contract === "object" ? result.contract : contract; + const mountResult = result.mountResult && typeof result.mountResult === "object" ? result.mountResult : {}; + const renderResult = mountResult.renderResult && typeof mountResult.renderResult === "object" + ? mountResult.renderResult + : {}; + const missingMethods = Array.isArray(readiness.missing) ? [...readiness.missing] : []; + const error = result.error ?? mountResult.error ?? null; + const overviewReady = readiness.ready === true; + const embeddingReady = result.ready === true; + const mountPhase = mountResult.phase ?? null; + const mountReady = mountResult.ready === true; + const renderRowCount = Number.isFinite(renderResult.rowCount) ? renderResult.rowCount : 0; + const blockingReasons = [ + ...missingMethods.map((methodName) => `missing:${methodName}`), + ...(embeddingReady ? [] : [`embedding:${result.phase ?? "blocked"}`]), + ...(mountPhase && !mountReady ? [`mount:${mountPhase}`] : []), + ...(error ? [`error:${error}`] : []), + ]; + const ready = overviewReady && embeddingReady && mountReady && !error && blockingReasons.length === 0; + const statusLine = ready + ? "Ready: No blocking reasons" + : `Blocked: ${blockingReasons.length > 0 ? blockingReasons.join(", ") : "workflow overview embedding unavailable"}`; + + return { + apiName: "ini-panel-shell-workflow-overview-embedding-report", + reportVersion: 1, + phase: ready ? "ready" : "blocked", + ready, + overviewReady, + embeddingReady, + mountReady, + statusLine, + pageHref: result.pageHref ?? resultContract.pageHref ?? null, + contract: resultContract, + missingMethods, + mountPhase, + renderRowCount, + error, + blockingReasons, + rows: [ + { + id: "overview-api", + label: "Overview API", + value: overviewReady ? "ready" : "blocked", + }, + { + id: "missing-methods", + label: "Missing methods", + value: missingMethods.length === 0 ? "none" : missingMethods.join(", "), + }, + { + id: "embedding-ready", + label: "Embedding readiness", + value: embeddingReady ? "ready" : "blocked", + }, + { + id: "mount-phase", + label: "Mount phase", + value: mountPhase ?? "missing", + }, + { + id: "render-row-count", + label: "Render row count", + value: String(renderRowCount), + }, + { + id: "error", + label: "Error", + value: error ?? "none", + }, + ], + }; +} + export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries()) { const shellIntegrationManifest = createIniPanelShellIntegrationManifest(entries); const shellIntegrationReadiness = createIniPanelShellIntegrationReadiness(shellIntegrationManifest); @@ -1965,6 +2046,7 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries createWorkflowOverviewContract: createIniPanelShellWorkflowOverviewContract, createWorkflowOverviewReadiness: createIniPanelShellWorkflowOverviewReadiness, mountWorkflowOverviewEmbedding: mountIniPanelShellWorkflowOverviewEmbedding, + createWorkflowOverviewEmbeddingReport: createIniPanelShellWorkflowOverviewEmbeddingReport, 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 facc163..ad131d2 100644 --- a/wasm-port/runtime/ui/ini-panel/workflow-overview.html +++ b/wasm-port/runtime/ui/ini-panel/workflow-overview.html @@ -89,6 +89,7 @@ createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellWorkflowOverviewContract, createIniPanelShellWorkflowOverviewReadiness, + createIniPanelShellWorkflowOverviewEmbeddingReport, mountIniPanelShellWorkflowOverviewEmbedding, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, @@ -131,6 +132,9 @@ ...(options ?? {}), }) ), + getWorkflowOverviewEmbeddingReport: (embeddingResult, contract) => ( + createIniPanelShellWorkflowOverviewEmbeddingReport(embeddingResult, contract) + ), }; diff --git a/wasm-port/tests/browser/ini_panel_launch_smoke.html b/wasm-port/tests/browser/ini_panel_launch_smoke.html index 549db6e..835fef8 100644 --- a/wasm-port/tests/browser/ini_panel_launch_smoke.html +++ b/wasm-port/tests/browser/ini_panel_launch_smoke.html @@ -103,6 +103,7 @@ !launchApi?.getWorkflowOverviewContract || !launchApi?.getWorkflowOverviewReadiness || !launchApi?.mountWorkflowOverviewEmbedding || + !launchApi?.getWorkflowOverviewEmbeddingReport || !launchApi?.isSupportedShellSessionHandoffPackage || !launchApi?.getLauncherLinks || !launchApi?.getControlPageApiMethods @@ -627,7 +628,8 @@ !workflowOverviewApi?.getWorkflowOverviewRenderState || !workflowOverviewApi?.getWorkflowOverviewContract || !workflowOverviewApi?.getWorkflowOverviewReadinessFromApi || - !workflowOverviewApi?.mountWorkflowOverviewEmbedding + !workflowOverviewApi?.mountWorkflowOverviewEmbedding || + !workflowOverviewApi?.getWorkflowOverviewEmbeddingReport ) { throw new Error("workflow overview API namespace did not expose shell helpers"); } @@ -637,6 +639,9 @@ const workflowOverviewEmbedding = launchApi.mountWorkflowOverviewEmbedding({ overviewApi: workflowOverviewApi, }); + const workflowOverviewEmbeddingReport = launchApi.getWorkflowOverviewEmbeddingReport( + workflowOverviewEmbedding, + ); 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"); @@ -647,6 +652,16 @@ assertEqual(workflowOverviewEmbedding.renderState.dataset.handoffScope, "workflow", "workflow overview embedding scope"); assertEqual(workflowOverviewEmbedding.mountResult.renderResult.rowCount, 5, "workflow overview embedding rows"); assertEqual(workflowOverviewEmbedding.error, null, "workflow overview embedding error"); + assertEqual(workflowOverviewEmbeddingReport.apiName, "ini-panel-shell-workflow-overview-embedding-report", "workflow overview embedding report API name"); + assertEqual(workflowOverviewEmbeddingReport.ready, false, "workflow overview embedding report readiness"); + assertEqual(workflowOverviewEmbeddingReport.missingMethods.join(","), "", "workflow overview embedding report missing methods"); + assertEqual(workflowOverviewEmbeddingReport.renderRowCount, 5, "workflow overview embedding report row count"); + assertEqual(workflowOverviewEmbeddingReport.rows.length, 6, "workflow overview embedding report rows"); + assertEqual( + workflowOverviewApi.getWorkflowOverviewEmbeddingReport(workflowOverviewEmbedding).renderRowCount, + workflowOverviewEmbeddingReport.renderRowCount, + "workflow overview self embedding report", + ); status.textContent = "browser_ini_launch_smoke=ok"; console.log("browser_ini_launch_smoke=ok"); } catch (error) { 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 ae50596..e36890d 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 @@ -105,6 +105,7 @@ TOOL_TABLE = browser-shell-tool.tbl !launchApi?.getWorkflowOverviewContract || !launchApi?.getWorkflowOverviewReadiness || !launchApi?.mountWorkflowOverviewEmbedding || + !launchApi?.getWorkflowOverviewEmbeddingReport || !launchApi?.isSupportedShellSessionHandoffPackage ) { throw new Error("launch API namespace did not expose shell integration helpers"); @@ -288,12 +289,19 @@ TOOL_TABLE = browser-shell-tool.tbl const workflowOverviewEmbedding = launchApi.mountWorkflowOverviewEmbedding({ overviewApi: workflowOverviewApi, }); + const workflowOverviewEmbeddingReport = launchApi.getWorkflowOverviewEmbeddingReport( + workflowOverviewEmbedding, + ); 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"); assertEqual(workflowOverviewEmbedding.renderState.dataset.handoffScope, "workflow", "shell workflow overview embedding scope"); assertEqual(workflowOverviewEmbedding.mountResult.renderResult.rowCount, 5, "shell workflow overview embedding rows"); assertEqual(workflowOverviewEmbedding.error, null, "shell workflow overview embedding error"); + assertEqual(workflowOverviewEmbeddingReport.ready, false, "shell workflow overview embedding report readiness"); + assertEqual(workflowOverviewEmbeddingReport.rows.length, 6, "shell workflow overview embedding report rows"); + assertEqual(workflowOverviewEmbeddingReport.renderRowCount, 5, "shell workflow overview embedding report row count"); + assertEqual(workflowOverviewEmbeddingReport.error, null, "shell workflow overview embedding report error"); 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 a12856d..94a697c 100644 --- a/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html +++ b/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html @@ -35,7 +35,8 @@ !workflowApi?.getWorkflowOverviewDomReadiness || !workflowApi?.renderWorkflowOverview || !workflowApi?.mountWorkflowOverview || - !workflowApi?.createWorkflowOverviewRenderState + !workflowApi?.createWorkflowOverviewRenderState || + !workflowApi?.getWorkflowOverviewEmbeddingReport ) { throw new Error("workflow overview API namespace did not expose overview helpers"); } @@ -47,6 +48,18 @@ const domReadiness = workflowApi.getWorkflowOverviewDomReadiness(); const renderResult = workflowApi.renderWorkflowOverview(); const mountResult = workflowApi.mountWorkflowOverview(); + const embeddingReport = workflowApi.getWorkflowOverviewEmbeddingReport({ + phase: mountResult.phase, + ready: mountResult.ready, + pageHref: "./workflow-overview.html", + readiness: { + ready: true, + missing: [], + }, + renderState, + mountResult, + error: null, + }); assertEqual(summary.summaryVersion, 1, "workflow overview summary version"); assertEqual(displayViewModel.title, "Shell handoff workflow", "workflow overview display title"); @@ -58,6 +71,10 @@ assertEqual(renderResult.rowCount, 5, "workflow overview render row count"); assertEqual(mountResult.ready, false, "workflow overview mount result readiness"); assertEqual(mountResult.renderResult.rendered, true, "workflow overview mount result rendered"); + assertEqual(embeddingReport.apiName, "ini-panel-shell-workflow-overview-embedding-report", "workflow overview embedding report API name"); + assertEqual(embeddingReport.ready, false, "workflow overview embedding report readiness"); + assertEqual(embeddingReport.renderRowCount, 5, "workflow overview embedding report row count"); + assertEqual(embeddingReport.rows.length, 6, "workflow overview embedding report 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 9945ee5..6e45516 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 @@ -39,6 +39,7 @@ import { createIniPanelShellSessionHandoffWorkflowDomReadiness, createIniPanelShellWorkflowOverviewContract, createIniPanelShellWorkflowOverviewReadiness, + createIniPanelShellWorkflowOverviewEmbeddingReport, mountIniPanelShellWorkflowOverviewEmbedding, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, @@ -120,6 +121,7 @@ const requiredShellExports = [ "createIniPanelShellSessionHandoffWorkflowDomReadiness", "createIniPanelShellWorkflowOverviewContract", "createIniPanelShellWorkflowOverviewReadiness", + "createIniPanelShellWorkflowOverviewEmbeddingReport", "mountIniPanelShellWorkflowOverviewEmbedding", "renderIniPanelShellSessionHandoffWorkflowState", "mountIniPanelShellSessionHandoffWorkflow", @@ -420,6 +422,7 @@ assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffRend assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffSnapshot\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffSummary\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffSummarySchema\b/); +assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingReport\b/); assert.match(shellText, /\bexport function isSupportedIniPanelControlPageApiManifest\b/); assert.match(shellText, /\bexport function isSupportedIniPanelLaunchApiManifest\b/); assert.match(shellText, /\bexport function isSupportedIniPanelShellIntegrationManifest\b/); @@ -448,6 +451,7 @@ assert.match(launchText, /\bgetShellSessionHandoffChecklist\b/); assert.match(launchText, /\bgetShellSessionHandoffPackageSchema\b/); assert.match(launchText, /\bgetShellSessionHandoffPackage\b/); assert.match(launchText, /\bgetShellSessionHandoffPackageReport\b/); +assert.match(launchText, /\bgetWorkflowOverviewEmbeddingReport\b/); assert.match(launchText, /\bisSupportedShellSessionHandoffPackage\b/); assert.match(launchText, /\bdata-handoff-shell\b/); assert.match(launchText, /\bdata-handoff-status\b/); @@ -481,6 +485,7 @@ assert.match(docText, /\bcreateIniPanelShellSessionHandoffRenderState\b/); assert.match(docText, /\bcreateIniPanelShellSessionHandoffSnapshot\b/); assert.match(docText, /\bcreateIniPanelShellSessionHandoffSummary\b/); assert.match(docText, /\bcreateIniPanelShellSessionHandoffSummarySchema\b/); +assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingReport\b/); assert.match(docText, /\bisSupportedIniPanelControlPageApiManifest\b/); assert.match(docText, /\bisSupportedIniPanelLaunchApiManifest\b/); assert.match(docText, /\bisSupportedIniPanelShellIntegrationManifest\b/); @@ -504,6 +509,7 @@ assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getShellSessionHandoffCheckl assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getShellSessionHandoffPackageSchema\b/); assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getShellSessionHandoffPackage\b/); assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getShellSessionHandoffPackageReport\b/); +assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getWorkflowOverviewEmbeddingReport\b/); assert.match(docText, /\blinuxCncIniPanelLaunchApi\.isSupportedShellSessionHandoffPackage\b/); assert.match(docText, /\bdata-handoff-shell\b/); assert.match(docText, /\bdata-handoff-status\b/); @@ -551,6 +557,7 @@ assert.match(shellIntegrationWorkflowSmokeText, /\bgetShellSessionHandoffWorkflo assert.match(shellIntegrationWorkflowSmokeText, /\bgetShellSessionHandoffWorkflowDomReadiness\b/); assert.match(shellIntegrationWorkflowSmokeText, /\brenderShellSessionHandoffWorkflowState\b/); assert.match(shellIntegrationWorkflowSmokeText, /\bmountShellSessionHandoffWorkflow\b/); +assert.match(shellIntegrationWorkflowSmokeText, /\bgetWorkflowOverviewEmbeddingReport\b/); assert.match(shellIntegrationWorkflowSmokeText, /\brenderShellSessionHandoffMountState\b/); assert.match(shellIntegrationWorkflowSmokeText, /\bdata-external-shell-mount\b/); assert.match(shellIntegrationWorkflowSmokeText, /\bdata-external-mount-value\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 5f47864..2bc4a5c 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 @@ -79,6 +79,7 @@ assert.deepEqual(manifest, { "getWorkflowOverviewContract", "getWorkflowOverviewReadiness", "mountWorkflowOverviewEmbedding", + "getWorkflowOverviewEmbeddingReport", "isSupportedShellSessionHandoffPackage", "getLauncherLinks", "getControlPageApiMethods", @@ -222,6 +223,7 @@ assert.match(launchText, /\bmountShellSessionHandoffWorkflow\b/); assert.match(launchText, /\bgetWorkflowOverviewContract\b/); assert.match(launchText, /\bgetWorkflowOverviewReadiness\b/); assert.match(launchText, /\bmountWorkflowOverviewEmbedding\b/); +assert.match(launchText, /\bgetWorkflowOverviewEmbeddingReport\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 6ae7eb8..b6ab6a5 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 @@ -35,6 +35,7 @@ import { createIniPanelShellSessionHandoffWorkflowDomReadiness, createIniPanelShellWorkflowOverviewContract, createIniPanelShellWorkflowOverviewReadiness, + createIniPanelShellWorkflowOverviewEmbeddingReport, mountIniPanelShellWorkflowOverviewEmbedding, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, @@ -164,7 +165,7 @@ assert.deepEqual(readiness, { counts: { pages: 3, launcherLinks: 3, - launchMethods: 42, + launchMethods: 43, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -226,7 +227,7 @@ assert.deepEqual(handoffSummary, { counts: { pages: 3, launcherLinks: 3, - launchMethods: 42, + launchMethods: 43, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -766,6 +767,8 @@ assert.deepEqual(createIniPanelShellWorkflowOverviewContract(), { ], }); assert.equal(createIniPanelShellWorkflowOverviewReadiness().ready, false); +assert.equal(createIniPanelShellWorkflowOverviewEmbeddingReport().ready, false); +assert.equal(createIniPanelShellWorkflowOverviewEmbeddingReport().rows.length, 6); assert.deepEqual( createIniPanelShellWorkflowOverviewReadiness({ overviewApi: { @@ -1194,7 +1197,7 @@ assert.deepEqual(createIniPanelShellIntegrationReadiness(blockedManifest), { counts: { pages: 3, launcherLinks: 3, - launchMethods: 42, + launchMethods: 43, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -1376,6 +1379,7 @@ assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWork assert.match(shellText, /\bexport function renderIniPanelShellSessionHandoffWorkflowState\b/); assert.match(shellText, /\bexport function mountIniPanelShellSessionHandoffWorkflow\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageReport\b/); +assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingReport\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageRenderState\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageSchema\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffRenderState\b/); @@ -1413,6 +1417,7 @@ assert.match(docText, /\bcreateIniPanelShellSessionHandoffWorkflowDomReadiness\b assert.match(docText, /\brenderIniPanelShellSessionHandoffWorkflowState\b/); assert.match(docText, /\bmountIniPanelShellSessionHandoffWorkflow\b/); assert.match(docText, /\bcreateIniPanelShellSessionHandoffPackageReport\b/); +assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingReport\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 80abdb4..4cd09f3 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 @@ -35,6 +35,7 @@ import { createIniPanelShellSessionHandoffWorkflowDomReadiness, createIniPanelShellWorkflowOverviewContract, createIniPanelShellWorkflowOverviewReadiness, + createIniPanelShellWorkflowOverviewEmbeddingReport, mountIniPanelShellWorkflowOverviewEmbedding, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, @@ -121,6 +122,7 @@ assert.equal(typeof createIniPanelShellSessionHandoffWorkflowDomContract, "funct assert.equal(typeof createIniPanelShellSessionHandoffWorkflowDomReadiness, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewContract, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewReadiness, "function"); +assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingReport, "function"); assert.equal(typeof mountIniPanelShellWorkflowOverviewEmbedding, "function"); assert.equal(typeof renderIniPanelShellSessionHandoffWorkflowState, "function"); assert.equal(typeof mountIniPanelShellSessionHandoffWorkflow, "function"); @@ -790,6 +792,7 @@ assert.equal( assert.equal(shellViewModel.createWorkflowOverviewContract, createIniPanelShellWorkflowOverviewContract); assert.equal(shellViewModel.createWorkflowOverviewReadiness, createIniPanelShellWorkflowOverviewReadiness); assert.equal(shellViewModel.mountWorkflowOverviewEmbedding, mountIniPanelShellWorkflowOverviewEmbedding); +assert.equal(shellViewModel.createWorkflowOverviewEmbeddingReport, createIniPanelShellWorkflowOverviewEmbeddingReport); assert.equal(shellViewModel.createShellSessionHandoffPackageReport, createIniPanelShellSessionHandoffPackageReport); assert.equal(shellViewModel.createShellSessionHandoffPackageSchema, createIniPanelShellSessionHandoffPackageSchema); assert.equal(shellViewModel.isSupportedShellSessionHandoffPackage, isSupportedIniPanelShellSessionHandoffPackage); @@ -1176,19 +1179,74 @@ assert.equal(workflowOverviewEmbedding.ready, false); assert.equal(workflowOverviewEmbedding.renderState.statusLine, "Blocked: mount:blocked"); assert.equal(workflowOverviewEmbedding.mountResult.renderResult.rowCount, 5); assert.equal(workflowOverviewEmbedding.error, null); +assert.deepEqual(createIniPanelShellWorkflowOverviewEmbeddingReport(workflowOverviewEmbedding), { + apiName: "ini-panel-shell-workflow-overview-embedding-report", + reportVersion: 1, + phase: "blocked", + ready: false, + overviewReady: true, + embeddingReady: false, + mountReady: false, + statusLine: "Blocked: embedding:blocked, mount:blocked", + pageHref: "./workflow-overview.html", + contract: shellViewModel.shellWorkflowOverviewContract, + missingMethods: [], + mountPhase: "blocked", + renderRowCount: 5, + error: null, + blockingReasons: ["embedding:blocked", "mount:blocked"], + rows: [ + { + id: "overview-api", + label: "Overview API", + value: "ready", + }, + { + id: "missing-methods", + label: "Missing methods", + value: "none", + }, + { + id: "embedding-ready", + label: "Embedding readiness", + value: "blocked", + }, + { + id: "mount-phase", + label: "Mount phase", + value: "blocked", + }, + { + id: "render-row-count", + label: "Render row count", + value: "5", + }, + { + id: "error", + label: "Error", + value: "none", + }, + ], +}); assert.deepEqual( mountIniPanelShellWorkflowOverviewEmbedding({ overviewApi: null }).readiness.missing, shellViewModel.shellWorkflowOverviewContract.methodNames, ); +assert.deepEqual( + createIniPanelShellWorkflowOverviewEmbeddingReport( + mountIniPanelShellWorkflowOverviewEmbedding({ overviewApi: null }), + ).missingMethods, + shellViewModel.shellWorkflowOverviewContract.methodNames, +); assert.equal( - mountIniPanelShellWorkflowOverviewEmbedding({ + createIniPanelShellWorkflowOverviewEmbeddingReport(mountIniPanelShellWorkflowOverviewEmbedding({ overviewApi: { ...workflowOverviewApi, mountWorkflowOverview: () => { throw new Error("mount failed"); }, }, - }).error, + })).error, "mount failed", ); assert.equal(