From ce3d08ef6188126a5c0ee14f8d41dd60a22d1805 Mon Sep 17 00:00:00 2001 From: wangdequan Date: Tue, 16 Jun 2026 07:04:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20INI=20=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=20session=20readiness=20workflow=20report?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROJECT_COMPLETION_TRACKER.md | 4 +- text14.txt | 78 +++++++++++++++++++ wasm-port/docs/panel-entry.md | 8 ++ wasm-port/runtime/ui/ini-panel/launch.html | 6 ++ wasm-port/runtime/ui/ini-panel/ui-shell.js | 61 +++++++++++++++ .../ui/ini-panel/workflow-overview.html | 6 ++ .../tests/browser/ini_panel_launch_smoke.html | 12 +++ ...anel_shell_integration_workflow_smoke.html | 14 ++++ .../ini_panel_workflow_overview_smoke.html | 8 ++ .../verify_ini_panel_launch_api_manifest.mjs | 2 + ...y_ini_panel_shell_integration_manifest.mjs | 11 ++- .../ui/node/verify_ini_panel_ui_shell.mjs | 20 +++++ 12 files changed, 225 insertions(+), 5 deletions(-) diff --git a/PROJECT_COMPLETION_TRACKER.md b/PROJECT_COMPLETION_TRACKER.md index c5647d3..3aba484 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: INI panel shell workflow session readiness display +- Latest completed batch: INI panel session readiness workflow report - 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 | Native sim configs baseline | Stable | Last recorded Layer 2: `total 159`, `pass 151`, `expected_fail 8`, `unexpected_fail 0`. | | OPFS/session persistence | Stable for current scope | Browser smoke passes, SDK re-exports OPFS/session helpers including `readMachineSessionReadiness()`, and `docs/opfs-session-persistence.md` defines the project-level release gate. | | SDK/API surface | Stable for current scope | SDK re-exports core, OPFS/session readiness/load helpers, sim-config staging, and INI panel shell/workflow overview helpers with a Node surface smoke. | -| Browser/UI workflow | Stable for current scope | Workflow overview embedding mount DOM closure is complete, and INI panel session workflows plus read-only control/shell handoff expose and render OPFS/session readiness before loading or reading WASM session state. | +| Browser/UI workflow | Stable for current scope | Workflow overview embedding mount DOM closure is complete, and INI panel session workflows plus read-only control/shell handoff expose, render, and report OPFS/session readiness before loading or reading WASM session state. | | Workflow overview embedding | Stable for current scope | Report/display/render, DOM contract/readiness/renderer, mount result/display/render, mount DOM contract/readiness/renderer/wrapper exist. | | Host/runtime boundary proof | Stable blocked state | Host smoke passes; runtime families remain blocked and `docs/host-runtime-boundary-handoff.md` records host readiness, promotion blockers, dispatch, and evidence gates. | | Documentation/release gate | Stable for current scope | `docs/project-release-handoff.md` links README, panel entry, SDK, OPFS/session, sim-config, host/runtime, source reuse, drift, and tracker acceptance paths. | diff --git a/text14.txt b/text14.txt index 0c4219a..4c70216 100644 --- a/text14.txt +++ b/text14.txt @@ -1908,3 +1908,81 @@ host_wasm_opfs_browser_smokes=ok 继续以实质能力推进为主。下一批可为 `sessionReadiness` display row 增加独立 machine-readable workflow report/helper,或者把同一展示能力接入 workflow overview 页面自身;仍保持只读,不新增控制按钮, 不解析 G-code,不扩大 LinuxCNC 语义边界。 + +二十四、2026-06-16 继续执行记录:INI panel session readiness workflow report + +本轮继续以功能实质性推进为主,为上一批 `sessionReadiness` display row 增加独立 machine-readable +workflow report/helper,并暴露到 launch API 与 workflow overview 页面 API。外部 shell 现在可以直接读取 +session readiness phase、missing reasons 和稳定 rows,不需要解析 display row 文本。 + +完成内容: + +- `wasm-port/runtime/ui/ini-panel/ui-shell.js` 新增 + `createIniPanelShellSessionReadinessWorkflowReport()`; +- report 返回: + - `apiName`; + - `reportVersion`; + - `phase`; + - `ready`; + - `statusLine`; + - `sessionReadiness`; + - `missing`; + - `rows`; +- report 支持从 `workflowSummary.sessionReadiness` 或 + `readonlyStatusResult.readonlyStatus.sessionReadiness` 抽取 ready/blocked 状态; +- `createIniPanelShellViewModel()` 暴露: + - `shellSessionReadinessWorkflowReport`; + - `createShellSessionReadinessWorkflowReport`; +- `createIniPanelLaunchApiManifest().methods` 新增 + `getShellSessionReadinessWorkflowReport`; +- `runtime/ui/ini-panel/launch.html` 暴露 + `linuxCncIniPanelLaunchApi.getShellSessionReadinessWorkflowReport()`; +- `createIniPanelShellWorkflowOverviewContract().methodNames` 新增 + `getWorkflowOverviewSessionReadinessReport`; +- `runtime/ui/ini-panel/workflow-overview.html` 暴露 + `linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewSessionReadinessReport()`; +- `docs/panel-entry.md` 记录新 helper 与两个 browser API 入口; +- Node 测试覆盖 ui-shell helper、launch manifest、shell integration manifest 和 docs drift; +- Browser smoke 覆盖 launch API、workflow overview iframe API、shell integration workflow API; +- 未新增控制按钮; +- 未执行 action-plan; +- 未解析 G-code; +- 未解释 canonical events; +- 未新增 JS CNC 语义; +- 未运行 opt-in runtime probes; +- 未 promotion blocked runtime family; +- 未改变 LinuxCNC interpreter、tool、parameter、planner、kinematics、remap 或 LinuxCNC-owned + runtime semantics。 + +验证已通过: + +```bash +git diff --check +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/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/tests/host/verify_host_smokes.sh +``` + +关键输出: + +```text +ui_node_smokes=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_unexpected_fail=0 +host_wasm_opfs_browser_smokes=ok +``` + +下一步工作计划: + +继续以实质能力推进为主。下一批可把 session readiness workflow report 纳入 SDK surface 或 release +handoff docs 的 API surface 表,方便外部调用者从 SDK/文档直接发现;仍保持只读,不新增控制按钮, +不解析 G-code,不扩大 LinuxCNC 语义边界。 diff --git a/wasm-port/docs/panel-entry.md b/wasm-port/docs/panel-entry.md index 2702886..f256a33 100644 --- a/wasm-port/docs/panel-entry.md +++ b/wasm-port/docs/panel-entry.md @@ -41,6 +41,7 @@ import { mountIniPanelShellSessionHandoff, mountIniPanelShellSessionHandoffFromControlPage, createIniPanelShellSessionHandoffWorkflowSummary, + createIniPanelShellSessionReadinessWorkflowReport, createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellSessionHandoffWorkflowDomContract, @@ -295,6 +296,13 @@ the expected handoff status fields as a structured ready/blocked result. Use outer shell needs one stable end-to-end summary that combines mount workflow, control-page mount workflow, readonly status result, machine-session ready/blocked state, and current blocking reasons into display rows. Use +`createIniPanelShellSessionReadinessWorkflowReport()` or +`linuxCncIniPanelLaunchApi.getShellSessionReadinessWorkflowReport()` when an +outer shell needs a machine-readable report for just the session readiness +phase, missing reasons, and stable rows. The workflow overview page exposes +the same report through +`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewSessionReadinessReport()`. +Use `createIniPanelShellSessionHandoffWorkflowDisplayViewModel()` or `linuxCncIniPanelLaunchApi.getShellSessionHandoffWorkflowDisplayViewModel()` when an outer shell needs that end-to-end summary compressed into stable diff --git a/wasm-port/runtime/ui/ini-panel/launch.html b/wasm-port/runtime/ui/ini-panel/launch.html index f005729..12d6942 100644 --- a/wasm-port/runtime/ui/ini-panel/launch.html +++ b/wasm-port/runtime/ui/ini-panel/launch.html @@ -117,6 +117,7 @@ mountIniPanelShellSessionHandoffFromControlPage, readIniPanelShellSessionHandoffStatusFromControlPage, createIniPanelShellSessionHandoffWorkflowSummary, + createIniPanelShellSessionReadinessWorkflowReport, createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellSessionHandoffWorkflowDomContract, @@ -245,6 +246,11 @@ }), }) ), + getShellSessionReadinessWorkflowReport: (options) => ( + createIniPanelShellSessionReadinessWorkflowReport(options ?? { + workflowSummary: shellViewModel.shellSessionHandoffWorkflowSummary, + }) + ), getShellSessionHandoffWorkflowDisplayViewModel: (options) => ( createIniPanelShellSessionHandoffWorkflowDisplayViewModel( options ?? shellViewModel.shellSessionHandoffWorkflowSummary, diff --git a/wasm-port/runtime/ui/ini-panel/ui-shell.js b/wasm-port/runtime/ui/ini-panel/ui-shell.js index 84dd3c2..9ea810e 100644 --- a/wasm-port/runtime/ui/ini-panel/ui-shell.js +++ b/wasm-port/runtime/ui/ini-panel/ui-shell.js @@ -160,6 +160,7 @@ export function createIniPanelLaunchApiManifest(entries = getVisibleIniPanelEntr "mountShellSessionHandoffFromControlPage", "readShellSessionHandoffStatusFromControlPage", "getShellSessionHandoffWorkflowSummary", + "getShellSessionReadinessWorkflowReport", "getShellSessionHandoffWorkflowDisplayViewModel", "getShellSessionHandoffWorkflowRenderState", "getShellSessionHandoffWorkflowDomContract", @@ -1548,6 +1549,60 @@ export function createIniPanelShellSessionHandoffWorkflowDisplayViewModel( }; } +export function createIniPanelShellSessionReadinessWorkflowReport({ + workflowSummary = null, + readonlyStatusResult = null, +} = {}) { + const sessionReadiness = workflowSummary?.sessionReadiness + ?? readonlyStatusResult?.readonlyStatus?.sessionReadiness + ?? null; + const missing = Array.isArray(sessionReadiness?.missing) + ? [...sessionReadiness.missing] + : []; + const ready = sessionReadiness?.ready === true; + const phase = sessionReadiness ? (ready ? "ready" : "blocked") : "blocked"; + const statusLine = sessionReadiness + ? ( + ready + ? "Ready: session readiness available" + : `Blocked: ${missing.length > 0 ? missing.join(", ") : "session readiness blocked"}` + ) + : "Blocked: session readiness unavailable"; + + return { + apiName: "ini-panel-shell-session-readiness-workflow-report", + reportVersion: 1, + phase, + ready, + statusLine, + sessionReadiness: sessionReadiness + ? { + phase: sessionReadiness.phase ?? phase, + ready, + missing, + } + : null, + missing, + rows: [ + { + id: "session-readiness", + label: "Session readiness", + value: sessionReadiness ? (ready ? "ready" : "blocked") : "missing", + }, + { + id: "session-readiness-phase", + label: "Session readiness phase", + value: sessionReadiness?.phase ?? "missing", + }, + { + id: "session-readiness-missing", + label: "Session readiness missing", + value: missing.length > 0 ? missing.join(", ") : "none", + }, + ], + }; +} + export function createIniPanelShellSessionHandoffWorkflowRenderState( displayViewModel = createIniPanelShellSessionHandoffWorkflowDisplayViewModel(), ) { @@ -1615,6 +1670,7 @@ export function createIniPanelShellWorkflowOverviewContract() { "getWorkflowOverviewRenderState", "getWorkflowOverviewDisplayViewModel", "getWorkflowOverviewSummary", + "getWorkflowOverviewSessionReadinessReport", "getWorkflowOverviewDomContract", "getWorkflowOverviewDomReadiness", "renderWorkflowOverview", @@ -2521,6 +2577,9 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries handoffSummary: shellSessionHandoffSummary, }), }); + const shellSessionReadinessWorkflowReport = createIniPanelShellSessionReadinessWorkflowReport({ + workflowSummary: shellSessionHandoffWorkflowSummary, + }); const shellSessionHandoffWorkflowDisplayViewModel = createIniPanelShellSessionHandoffWorkflowDisplayViewModel( shellSessionHandoffWorkflowSummary, ); @@ -2558,6 +2617,7 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries shellSessionHandoffPackageMountRenderState, shellSessionHandoffMountDomContract, shellSessionHandoffWorkflowSummary, + shellSessionReadinessWorkflowReport, shellSessionHandoffWorkflowDisplayViewModel, shellSessionHandoffWorkflowRenderState, shellSessionHandoffWorkflowDomContract, @@ -2591,6 +2651,7 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries mountShellSessionHandoffFromControlPage: mountIniPanelShellSessionHandoffFromControlPage, readShellSessionHandoffStatusFromControlPage: readIniPanelShellSessionHandoffStatusFromControlPage, createShellSessionHandoffWorkflowSummary: createIniPanelShellSessionHandoffWorkflowSummary, + createShellSessionReadinessWorkflowReport: createIniPanelShellSessionReadinessWorkflowReport, createShellSessionHandoffWorkflowDisplayViewModel: createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createShellSessionHandoffWorkflowRenderState: createIniPanelShellSessionHandoffWorkflowRenderState, createShellSessionHandoffWorkflowDomContract: createIniPanelShellSessionHandoffWorkflowDomContract, diff --git a/wasm-port/runtime/ui/ini-panel/workflow-overview.html b/wasm-port/runtime/ui/ini-panel/workflow-overview.html index e72e8e1..c0b064d 100644 --- a/wasm-port/runtime/ui/ini-panel/workflow-overview.html +++ b/wasm-port/runtime/ui/ini-panel/workflow-overview.html @@ -87,6 +87,7 @@ createIniPanelShellSessionHandoffWorkflowDomContract, createIniPanelShellSessionHandoffWorkflowDomReadiness, createIniPanelShellSessionHandoffWorkflowRenderState, + createIniPanelShellSessionReadinessWorkflowReport, createIniPanelShellWorkflowOverviewContract, createIniPanelShellWorkflowOverviewReadiness, createIniPanelShellWorkflowOverviewEmbeddingReport, @@ -115,6 +116,11 @@ getWorkflowOverviewRenderState: () => shellViewModel.shellSessionHandoffWorkflowRenderState, getWorkflowOverviewDisplayViewModel: () => shellViewModel.shellSessionHandoffWorkflowDisplayViewModel, getWorkflowOverviewSummary: () => shellViewModel.shellSessionHandoffWorkflowSummary, + getWorkflowOverviewSessionReadinessReport: (options) => ( + createIniPanelShellSessionReadinessWorkflowReport(options ?? { + workflowSummary: shellViewModel.shellSessionHandoffWorkflowSummary, + }) + ), getWorkflowOverviewDomContract: (options) => ( createIniPanelShellSessionHandoffWorkflowDomContract(options) ), diff --git a/wasm-port/tests/browser/ini_panel_launch_smoke.html b/wasm-port/tests/browser/ini_panel_launch_smoke.html index e47e529..f0da904 100644 --- a/wasm-port/tests/browser/ini_panel_launch_smoke.html +++ b/wasm-port/tests/browser/ini_panel_launch_smoke.html @@ -99,6 +99,7 @@ !launchApi?.getShellSessionHandoffPackageMountState || !launchApi?.getShellSessionHandoffPackageMountDisplayViewModel || !launchApi?.getShellSessionHandoffPackageMountRenderState || + !launchApi?.getShellSessionReadinessWorkflowReport || !launchApi?.renderShellSessionHandoffMountState || !launchApi?.getWorkflowOverviewContract || !launchApi?.getWorkflowOverviewReadiness || @@ -178,6 +179,7 @@ const shellSessionHandoffPackageMountState = launchApi.getShellSessionHandoffPackageMountState(); const shellSessionHandoffPackageMountDisplayViewModel = launchApi.getShellSessionHandoffPackageMountDisplayViewModel(); const shellSessionHandoffPackageMountRenderState = launchApi.getShellSessionHandoffPackageMountRenderState(); + const shellSessionReadinessWorkflowReport = launchApi.getShellSessionReadinessWorkflowReport(); const workflowOverviewContract = launchApi.getWorkflowOverviewContract(); assertEqual( shellIntegrationSchema.manifestVersion, @@ -424,6 +426,16 @@ "Blocked: session-load-state", "shell session handoff package mount render-state status", ); + assertEqual( + shellSessionReadinessWorkflowReport.apiName, + "ini-panel-shell-session-readiness-workflow-report", + "shell session readiness workflow report API", + ); + assertEqual( + shellSessionReadinessWorkflowReport.rows.length, + 3, + "shell session readiness workflow report rows", + ); assertEqual( workflowOverviewContract.pageHref, "./workflow-overview.html", 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 1f4f40f..eaf4018 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 @@ -100,6 +100,7 @@ TOOL_TABLE = browser-shell-tool.tbl !launchApi?.mountShellSessionHandoffFromControlPage || !launchApi?.readShellSessionHandoffStatusFromControlPage || !launchApi?.getShellSessionHandoffWorkflowSummary || + !launchApi?.getShellSessionReadinessWorkflowReport || !launchApi?.getShellSessionHandoffWorkflowDisplayViewModel || !launchApi?.getShellSessionHandoffWorkflowRenderState || !launchApi?.getShellSessionHandoffWorkflowDomContract || @@ -511,6 +512,9 @@ TOOL_TABLE = browser-shell-tool.tbl controlPageMountWorkflow: readyControlPageMountWorkflow, readonlyStatusResult, }); + const sessionReadinessWorkflowReport = launchApi.getShellSessionReadinessWorkflowReport({ + workflowSummary: workflowSummaryResult, + }); const workflowDisplayResult = launchApi.getShellSessionHandoffWorkflowDisplayViewModel( workflowSummaryResult, ); @@ -548,6 +552,16 @@ TOOL_TABLE = browser-shell-tool.tbl ); assertEqual(workflowSummaryResult.phase, "ready", "shell handoff workflow summary phase"); assertEqual(workflowSummaryResult.ready, true, "shell handoff workflow summary readiness"); + assertEqual( + sessionReadinessWorkflowReport.ready, + true, + "shell handoff session readiness workflow report", + ); + assertEqual( + sessionReadinessWorkflowReport.rows.length, + 3, + "shell handoff session readiness workflow report rows", + ); assertEqual( workflowSummaryResult.sessionReadiness.ready, true, 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 dbfe944..02417f4 100644 --- a/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html +++ b/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html @@ -31,6 +31,7 @@ !workflowApi?.getWorkflowOverviewRenderState || !workflowApi?.getWorkflowOverviewDisplayViewModel || !workflowApi?.getWorkflowOverviewSummary || + !workflowApi?.getWorkflowOverviewSessionReadinessReport || !workflowApi?.getWorkflowOverviewDomContract || !workflowApi?.getWorkflowOverviewDomReadiness || !workflowApi?.renderWorkflowOverview || @@ -56,6 +57,7 @@ const renderState = workflowApi.getWorkflowOverviewRenderState(); const displayViewModel = workflowApi.getWorkflowOverviewDisplayViewModel(); const summary = workflowApi.getWorkflowOverviewSummary(); + const sessionReadinessReport = workflowApi.getWorkflowOverviewSessionReadinessReport(); const domContract = workflowApi.getWorkflowOverviewDomContract(); const domReadiness = workflowApi.getWorkflowOverviewDomReadiness(); const renderResult = workflowApi.renderWorkflowOverview(); @@ -78,6 +80,12 @@ const embeddingDomReadiness = workflowApi.getWorkflowOverviewEmbeddingDomReadiness(); assertEqual(summary.summaryVersion, 1, "workflow overview summary version"); + assertEqual( + sessionReadinessReport.apiName, + "ini-panel-shell-session-readiness-workflow-report", + "workflow overview session readiness report API name", + ); + assertEqual(sessionReadinessReport.rows.length, 3, "workflow overview session readiness report rows"); assertEqual(displayViewModel.title, "Shell handoff workflow", "workflow overview display title"); assertEqual(renderState.renderStateVersion, 1, "workflow overview render-state version"); assertEqual(renderState.dataset.handoffScope, "workflow", "workflow overview render-state scope"); 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 0e2b03a..6929c3c 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 @@ -70,6 +70,7 @@ assert.deepEqual(manifest, { "mountShellSessionHandoffFromControlPage", "readShellSessionHandoffStatusFromControlPage", "getShellSessionHandoffWorkflowSummary", + "getShellSessionReadinessWorkflowReport", "getShellSessionHandoffWorkflowDisplayViewModel", "getShellSessionHandoffWorkflowRenderState", "getShellSessionHandoffWorkflowDomContract", @@ -226,6 +227,7 @@ assert.match(launchText, /\bmountShellSessionHandoff\b/); assert.match(launchText, /\bmountShellSessionHandoffFromControlPage\b/); assert.match(launchText, /\breadShellSessionHandoffStatusFromControlPage\b/); assert.match(launchText, /\bgetShellSessionHandoffWorkflowSummary\b/); +assert.match(launchText, /\bgetShellSessionReadinessWorkflowReport\b/); assert.match(launchText, /\bgetShellSessionHandoffWorkflowDisplayViewModel\b/); assert.match(launchText, /\bgetShellSessionHandoffWorkflowRenderState\b/); assert.match(launchText, /\bgetShellSessionHandoffWorkflowDomContract\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 378dd1b..0236a59 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 @@ -29,6 +29,7 @@ import { mountIniPanelShellSessionHandoffFromControlPage, readIniPanelShellSessionHandoffStatusFromControlPage, createIniPanelShellSessionHandoffWorkflowSummary, + createIniPanelShellSessionReadinessWorkflowReport, createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellSessionHandoffWorkflowDomContract, @@ -177,7 +178,7 @@ assert.deepEqual(readiness, { counts: { pages: 3, launcherLinks: 3, - launchMethods: 55, + launchMethods: 56, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -240,7 +241,7 @@ assert.deepEqual(handoffSummary, { counts: { pages: 3, launcherLinks: 3, - launchMethods: 55, + launchMethods: 56, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -745,6 +746,7 @@ assert.equal( createIniPanelShellSessionHandoffWorkflowSummary().phase, "blocked", ); +assert.equal(createIniPanelShellSessionReadinessWorkflowReport().phase, "blocked"); assert.equal( createIniPanelShellSessionHandoffWorkflowDisplayViewModel().phase, "blocked", @@ -773,6 +775,7 @@ assert.deepEqual(createIniPanelShellWorkflowOverviewContract(), { "getWorkflowOverviewRenderState", "getWorkflowOverviewDisplayViewModel", "getWorkflowOverviewSummary", + "getWorkflowOverviewSessionReadinessReport", "getWorkflowOverviewDomContract", "getWorkflowOverviewDomReadiness", "renderWorkflowOverview", @@ -814,6 +817,7 @@ assert.deepEqual( createIniPanelShellWorkflowOverviewReadiness({ overviewApi: { getWorkflowOverviewRenderState: () => handoffPackageRenderState, + getWorkflowOverviewSessionReadinessReport: () => createIniPanelShellSessionReadinessWorkflowReport(), }, }).missing, [ @@ -1238,7 +1242,7 @@ assert.deepEqual(createIniPanelShellIntegrationReadiness(blockedManifest), { counts: { pages: 3, launcherLinks: 3, - launchMethods: 55, + launchMethods: 56, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -1413,6 +1417,7 @@ assert.match(shellText, /\bexport function mountIniPanelShellSessionHandoff\b/); assert.match(shellText, /\bexport function mountIniPanelShellSessionHandoffFromControlPage\b/); assert.match(shellText, /\bexport function readIniPanelShellSessionHandoffStatusFromControlPage\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowSummary\b/); +assert.match(shellText, /\bexport function createIniPanelShellSessionReadinessWorkflowReport\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowDisplayViewModel\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowRenderState\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowDomContract\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 23d9167..2ffb5c4 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 @@ -29,6 +29,7 @@ import { mountIniPanelShellSessionHandoffFromControlPage, readIniPanelShellSessionHandoffStatusFromControlPage, createIniPanelShellSessionHandoffWorkflowSummary, + createIniPanelShellSessionReadinessWorkflowReport, createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellSessionHandoffWorkflowDomContract, @@ -662,6 +663,7 @@ assert.deepEqual(shellViewModel.shellWorkflowOverviewContract, { "getWorkflowOverviewRenderState", "getWorkflowOverviewDisplayViewModel", "getWorkflowOverviewSummary", + "getWorkflowOverviewSessionReadinessReport", "getWorkflowOverviewDomContract", "getWorkflowOverviewDomReadiness", "renderWorkflowOverview", @@ -790,6 +792,10 @@ assert.equal( shellViewModel.createShellSessionHandoffWorkflowSummary, createIniPanelShellSessionHandoffWorkflowSummary, ); +assert.equal( + shellViewModel.createShellSessionReadinessWorkflowReport, + createIniPanelShellSessionReadinessWorkflowReport, +); assert.equal( shellViewModel.createShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowDisplayViewModel, @@ -1111,6 +1117,19 @@ assert.deepEqual(workflowSummaryResult.sessionReadiness, { assert.equal(workflowSummaryResult.rows.find(({ id }) => id === "session-readiness")?.value, "ready"); assert.equal(workflowSummaryResult.rows.length, 6); assert.equal(workflowSummaryResult.blockingReasons[0], "mount:blocked"); +const sessionReadinessWorkflowReport = createIniPanelShellSessionReadinessWorkflowReport({ + workflowSummary: workflowSummaryResult, +}); +assert.equal(sessionReadinessWorkflowReport.apiName, "ini-panel-shell-session-readiness-workflow-report"); +assert.equal(sessionReadinessWorkflowReport.reportVersion, 1); +assert.equal(sessionReadinessWorkflowReport.phase, "ready"); +assert.equal(sessionReadinessWorkflowReport.ready, true); +assert.equal(sessionReadinessWorkflowReport.statusLine, "Ready: session readiness available"); +assert.deepEqual(sessionReadinessWorkflowReport.missing, []); +assert.equal(sessionReadinessWorkflowReport.rows.length, 3); +assert.equal(sessionReadinessWorkflowReport.rows[0].value, "ready"); +assert.equal(shellViewModel.shellSessionReadinessWorkflowReport.ready, false); +assert.equal(shellViewModel.shellSessionReadinessWorkflowReport.rows.length, 3); const readyWorkflowSummaryResult = createIniPanelShellSessionHandoffWorkflowSummary({ mountWorkflow: { phase: "ready", @@ -1230,6 +1249,7 @@ const workflowOverviewApi = { getWorkflowOverviewRenderState: () => workflowRenderState, getWorkflowOverviewDisplayViewModel: () => workflowDisplayViewModel, getWorkflowOverviewSummary: () => workflowSummaryResult, + getWorkflowOverviewSessionReadinessReport: () => sessionReadinessWorkflowReport, getWorkflowOverviewDomContract: createIniPanelShellSessionHandoffWorkflowDomContract, getWorkflowOverviewDomReadiness: createIniPanelShellSessionHandoffWorkflowDomReadiness, renderWorkflowOverview: renderIniPanelShellSessionHandoffWorkflowState,