From 65e95327b3320284195da0edefe5e36f3e24725a Mon Sep 17 00:00:00 2001 From: wangdequan Date: Tue, 16 Jun 2026 07:19:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20INI=20=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=20shell=20API=20surface=20inventory?= 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 | 7 ++ wasm-port/docs/project-release-handoff.md | 5 +- wasm-port/runtime/sdk/README.md | 4 + wasm-port/runtime/sdk/src/index.js | 1 + wasm-port/runtime/ui/ini-panel/launch.html | 8 ++ wasm-port/runtime/ui/ini-panel/ui-shell.js | 114 ++++++++++++++++++ .../ui/ini-panel/workflow-overview.html | 8 ++ .../tests/browser/ini_panel_launch_smoke.html | 12 ++ ...anel_shell_integration_workflow_smoke.html | 14 +++ .../ini_panel_workflow_overview_smoke.html | 8 ++ .../verify_project_release_handoff_docs.mjs | 2 + .../tests/sdk/node/verify_sdk_surface.mjs | 6 + .../verify_ini_panel_launch_api_manifest.mjs | 2 + ...y_ini_panel_shell_integration_manifest.mjs | 11 +- .../ui/node/verify_ini_panel_ui_shell.mjs | 9 ++ 17 files changed, 286 insertions(+), 7 deletions(-) diff --git a/PROJECT_COMPLETION_TRACKER.md b/PROJECT_COMPLETION_TRACKER.md index 29c2260..1a01676 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 session readiness workflow report SDK surface +- Latest completed batch: INI panel shell API surface inventory - 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 @@ -43,7 +43,7 @@ The project is complete for the current scope when all of the following are true | Native nc_files baseline | Stable | Last recorded Layer 1: `total 107`, `pass 101`, `expected_fail 6`, `unexpected_fail 0`. | | 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, INI panel shell/workflow overview helpers, and the session readiness workflow report with a Node surface smoke. | +| SDK/API surface | Stable for current scope | SDK re-exports core, OPFS/session readiness/load helpers, sim-config staging, INI panel shell/workflow overview helpers, the session readiness workflow report, and the shell API surface inventory 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, 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. | diff --git a/text14.txt b/text14.txt index f14ea77..53fd925 100644 --- a/text14.txt +++ b/text14.txt @@ -2057,3 +2057,81 @@ host_wasm_opfs_browser_smokes=ok 继续以实质能力推进为主。下一批可为 session readiness workflow report 增加更高层的 release/API inventory row 或 browser-visible summary row,方便验收页面和外部 shell 快速列出当前稳定 API;仍保持只读, 不新增控制按钮,不解析 G-code,不扩大 LinuxCNC 语义边界。 + +二十六、2026-06-16 继续执行记录:INI panel shell API surface inventory + +本轮继续以功能实质性推进为主,为 INI panel shell 增加更高层的 read-only API surface inventory。 +外部 shell、workflow overview iframe 和 SDK 调用者现在可以一次读取 launch API、control-page API、 +workflow overview API、persistence capabilities 与 session readiness report 的稳定计数和 rows。 + +完成内容: + +- `wasm-port/runtime/ui/ini-panel/ui-shell.js` 新增 `createIniPanelShellApiSurfaceInventory()`; +- inventory 返回: + - `apiName`; + - `inventoryVersion`; + - `phase`; + - `ready`; + - `counts`; + - `apiNames`; + - `entries`; + - `rows`; +- `createIniPanelLaunchApiManifest().methods` 新增 `getShellApiSurfaceInventory`; +- `createIniPanelShellWorkflowOverviewContract().methodNames` 新增 + `getWorkflowOverviewApiSurfaceInventory`; +- `createIniPanelShellViewModel()` 暴露: + - `shellApiSurfaceInventory`; + - `createShellApiSurfaceInventory`; +- `runtime/ui/ini-panel/launch.html` 暴露 + `linuxCncIniPanelLaunchApi.getShellApiSurfaceInventory()`; +- `runtime/ui/ini-panel/workflow-overview.html` 暴露 + `linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewApiSurfaceInventory()`; +- `wasm-port/runtime/sdk/src/index.js` re-export `createIniPanelShellApiSurfaceInventory()`; +- `wasm-port/runtime/sdk/README.md`、`docs/panel-entry.md`、`docs/project-release-handoff.md` + 记录该 inventory 能力; +- Node 测试覆盖 ui-shell、launch manifest、shell integration manifest、SDK surface、release handoff docs; +- 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/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 +ui_node_smokes=ok +browser_ini_launch_smoke=ok +browser_ini_workflow_overview_smoke=ok +browser_ini_shell_integration_workflow_smoke=ok +sdk_surface_node_smoke=ok +project_release_handoff_docs_node_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 +``` + +下一步工作计划: + +继续以实质能力推进为主。下一批可把 shell API surface inventory 渲染为 browser-visible summary +row 或挂载到 workflow overview embedding report,方便验收页面直接显示 API surface 覆盖;仍保持只读, +不新增控制按钮,不解析 G-code,不扩大 LinuxCNC 语义边界。 diff --git a/wasm-port/docs/panel-entry.md b/wasm-port/docs/panel-entry.md index f256a33..3d7174d 100644 --- a/wasm-port/docs/panel-entry.md +++ b/wasm-port/docs/panel-entry.md @@ -42,6 +42,7 @@ import { mountIniPanelShellSessionHandoffFromControlPage, createIniPanelShellSessionHandoffWorkflowSummary, createIniPanelShellSessionReadinessWorkflowReport, + createIniPanelShellApiSurfaceInventory, createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellSessionHandoffWorkflowDomContract, @@ -302,6 +303,12 @@ 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 `createIniPanelShellApiSurfaceInventory()` or +`linuxCncIniPanelLaunchApi.getShellApiSurfaceInventory()` when an outer shell +needs a machine-readable inventory of launch, control-page, workflow overview, +persistence, and session readiness report API counts. The workflow overview +page exposes the same inventory through +`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewApiSurfaceInventory()`. Use `createIniPanelShellSessionHandoffWorkflowDisplayViewModel()` or `linuxCncIniPanelLaunchApi.getShellSessionHandoffWorkflowDisplayViewModel()` diff --git a/wasm-port/docs/project-release-handoff.md b/wasm-port/docs/project-release-handoff.md index 0a9a5dc..8c27a10 100644 --- a/wasm-port/docs/project-release-handoff.md +++ b/wasm-port/docs/project-release-handoff.md @@ -30,8 +30,9 @@ continuation records are in `../text14.txt`. `docs/panel-entry.md`, including workflow overview embedding mount DOM contract/readiness/renderer/wrapper helpers. - SDK callers should import stable helpers from `runtime/sdk/src/index.js`, - including `createIniPanelShellSessionReadinessWorkflowReport()` when they - need machine-readable session readiness phase and missing reasons. + including `createIniPanelShellApiSurfaceInventory()` for API discovery and + `createIniPanelShellSessionReadinessWorkflowReport()` when they need + machine-readable session readiness phase and missing reasons. - OPFS/session persistence is host-side storage glue. Parameter and tool-table behavior still comes from the LinuxCNC-backed interpreter SDK calls. - Sim-config inventory promotion remains evidence-driven and must keep diff --git a/wasm-port/runtime/sdk/README.md b/wasm-port/runtime/sdk/README.md index 1c78bae..549fa3a 100644 --- a/wasm-port/runtime/sdk/README.md +++ b/wasm-port/runtime/sdk/README.md @@ -25,6 +25,7 @@ Use `src/index.js` for stable imports: import { analyzeIniRuntimeBoundaries, createIniPanelLaunchApiManifest, + createIniPanelShellApiSurfaceInventory, createIniPanelShellSessionReadinessWorkflowReport, createIniPanelShellViewModel, createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, @@ -192,6 +193,9 @@ for external browser shells: `isSupportedIniPanelLaunchApiManifest()` for launch API negotiation. - `createIniPanelShellViewModel()` for a complete read-only shell integration bundle. +- `createIniPanelShellApiSurfaceInventory()` for a machine-readable inventory + of launch, control-page, workflow overview, persistence, and session + readiness report API counts. - `createIniPanelShellSessionReadinessWorkflowReport()` for a machine-readable session readiness workflow report with phase, missing reasons, status line, and stable rows. diff --git a/wasm-port/runtime/sdk/src/index.js b/wasm-port/runtime/sdk/src/index.js index 440b3d7..2926985 100644 --- a/wasm-port/runtime/sdk/src/index.js +++ b/wasm-port/runtime/sdk/src/index.js @@ -69,6 +69,7 @@ export { createIniPanelShellSessionHandoffPackageRenderState, createIniPanelShellSessionHandoffPackageSchema, createIniPanelShellSessionReadinessWorkflowReport, + createIniPanelShellApiSurfaceInventory, createIniPanelShellSessionHandoffSummary, createIniPanelShellSessionHandoffSummarySchema, createIniPanelShellViewModel, diff --git a/wasm-port/runtime/ui/ini-panel/launch.html b/wasm-port/runtime/ui/ini-panel/launch.html index 12d6942..f99d7b7 100644 --- a/wasm-port/runtime/ui/ini-panel/launch.html +++ b/wasm-port/runtime/ui/ini-panel/launch.html @@ -251,6 +251,14 @@ workflowSummary: shellViewModel.shellSessionHandoffWorkflowSummary, }) ), + getShellApiSurfaceInventory: (options) => ( + shellViewModel.createShellApiSurfaceInventory(options ?? { + launchApiManifest: shellViewModel.launchApiManifest, + controlPageApiManifest: shellViewModel.controlPage.browserApiManifest, + workflowOverviewContract: shellViewModel.shellWorkflowOverviewContract, + sessionReadinessWorkflowReport: shellViewModel.shellSessionReadinessWorkflowReport, + }) + ), 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 9ea810e..53d9f38 100644 --- a/wasm-port/runtime/ui/ini-panel/ui-shell.js +++ b/wasm-port/runtime/ui/ini-panel/ui-shell.js @@ -161,6 +161,7 @@ export function createIniPanelLaunchApiManifest(entries = getVisibleIniPanelEntr "readShellSessionHandoffStatusFromControlPage", "getShellSessionHandoffWorkflowSummary", "getShellSessionReadinessWorkflowReport", + "getShellApiSurfaceInventory", "getShellSessionHandoffWorkflowDisplayViewModel", "getShellSessionHandoffWorkflowRenderState", "getShellSessionHandoffWorkflowDomContract", @@ -1603,6 +1604,110 @@ export function createIniPanelShellSessionReadinessWorkflowReport({ }; } +export function createIniPanelShellApiSurfaceInventory({ + launchApiManifest = createIniPanelLaunchApiManifest(), + controlPageApiManifest = createControlPageBrowserApiManifest(), + workflowOverviewContract = createIniPanelShellWorkflowOverviewContract(), + sessionReadinessWorkflowReport = createIniPanelShellSessionReadinessWorkflowReport(), +} = {}) { + const launchMethods = Array.isArray(launchApiManifest?.methods) ? launchApiManifest.methods : []; + const controlPageMethods = Array.isArray(controlPageApiManifest?.methods) ? controlPageApiManifest.methods : []; + const workflowOverviewMethods = Array.isArray(workflowOverviewContract?.methodNames) + ? workflowOverviewContract.methodNames + : []; + const persistenceCapabilities = Array.isArray(launchApiManifest?.persistenceCapabilities) + ? launchApiManifest.persistenceCapabilities + : []; + const sessionReadinessRows = Array.isArray(sessionReadinessWorkflowReport?.rows) + ? sessionReadinessWorkflowReport.rows + : []; + const ready = Boolean( + launchApiManifest?.apiName + && controlPageApiManifest?.apiName + && workflowOverviewContract?.apiName + && sessionReadinessWorkflowReport?.apiName, + ); + + return { + apiName: "ini-panel-shell-api-surface-inventory", + inventoryVersion: 1, + phase: ready ? "ready" : "blocked", + ready, + counts: { + launchMethods: launchMethods.length, + controlPageMethods: controlPageMethods.length, + workflowOverviewMethods: workflowOverviewMethods.length, + persistenceCapabilities: persistenceCapabilities.length, + sessionReadinessRows: sessionReadinessRows.length, + }, + apiNames: { + launch: launchApiManifest?.apiName ?? null, + controlPage: controlPageApiManifest?.apiName ?? null, + workflowOverview: workflowOverviewContract?.apiName ?? null, + sessionReadinessReport: sessionReadinessWorkflowReport?.apiName ?? null, + }, + entries: [ + { + id: "launch-api", + label: "Launch API", + apiName: launchApiManifest?.apiName ?? null, + count: launchMethods.length, + }, + { + id: "control-page-api", + label: "Control-page API", + apiName: controlPageApiManifest?.apiName ?? null, + count: controlPageMethods.length, + }, + { + id: "workflow-overview-api", + label: "Workflow overview API", + apiName: workflowOverviewContract?.apiName ?? null, + count: workflowOverviewMethods.length, + }, + { + id: "session-readiness-report", + label: "Session readiness report", + apiName: sessionReadinessWorkflowReport?.apiName ?? null, + count: sessionReadinessRows.length, + }, + { + id: "persistence-capabilities", + label: "Persistence capabilities", + apiName: launchApiManifest?.apiName ?? null, + count: persistenceCapabilities.length, + }, + ], + rows: [ + { + id: "launch-methods", + label: "Launch methods", + value: String(launchMethods.length), + }, + { + id: "control-page-methods", + label: "Control-page methods", + value: String(controlPageMethods.length), + }, + { + id: "workflow-overview-methods", + label: "Workflow overview methods", + value: String(workflowOverviewMethods.length), + }, + { + id: "session-readiness-report", + label: "Session readiness report", + value: sessionReadinessWorkflowReport?.apiName ?? "missing", + }, + { + id: "persistence-capabilities", + label: "Persistence capabilities", + value: String(persistenceCapabilities.length), + }, + ], + }; +} + export function createIniPanelShellSessionHandoffWorkflowRenderState( displayViewModel = createIniPanelShellSessionHandoffWorkflowDisplayViewModel(), ) { @@ -1671,6 +1776,7 @@ export function createIniPanelShellWorkflowOverviewContract() { "getWorkflowOverviewDisplayViewModel", "getWorkflowOverviewSummary", "getWorkflowOverviewSessionReadinessReport", + "getWorkflowOverviewApiSurfaceInventory", "getWorkflowOverviewDomContract", "getWorkflowOverviewDomReadiness", "renderWorkflowOverview", @@ -2588,6 +2694,12 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries ); const shellSessionHandoffWorkflowDomContract = createIniPanelShellSessionHandoffWorkflowDomContract(); const shellWorkflowOverviewContract = createIniPanelShellWorkflowOverviewContract(); + const shellApiSurfaceInventory = createIniPanelShellApiSurfaceInventory({ + launchApiManifest: shellIntegrationManifest.launchApiManifest, + controlPageApiManifest: shellIntegrationManifest.controlPageApiManifest, + workflowOverviewContract: shellWorkflowOverviewContract, + sessionReadinessWorkflowReport: shellSessionReadinessWorkflowReport, + }); return { pages: entries.map(({ id, href, title }) => ({ id, @@ -2622,6 +2734,7 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries shellSessionHandoffWorkflowRenderState, shellSessionHandoffWorkflowDomContract, shellWorkflowOverviewContract, + shellApiSurfaceInventory, launchApiSchema: createIniPanelLaunchApiSchema(), launchApiManifest: createIniPanelLaunchApiManifest(entries), isSupportedShellIntegrationManifest: isSupportedIniPanelShellIntegrationManifest, @@ -2652,6 +2765,7 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries readShellSessionHandoffStatusFromControlPage: readIniPanelShellSessionHandoffStatusFromControlPage, createShellSessionHandoffWorkflowSummary: createIniPanelShellSessionHandoffWorkflowSummary, createShellSessionReadinessWorkflowReport: createIniPanelShellSessionReadinessWorkflowReport, + createShellApiSurfaceInventory: createIniPanelShellApiSurfaceInventory, 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 c0b064d..9c17076 100644 --- a/wasm-port/runtime/ui/ini-panel/workflow-overview.html +++ b/wasm-port/runtime/ui/ini-panel/workflow-overview.html @@ -121,6 +121,14 @@ workflowSummary: shellViewModel.shellSessionHandoffWorkflowSummary, }) ), + getWorkflowOverviewApiSurfaceInventory: (options) => ( + shellViewModel.createShellApiSurfaceInventory(options ?? { + launchApiManifest: shellViewModel.launchApiManifest, + controlPageApiManifest: shellViewModel.controlPage.browserApiManifest, + workflowOverviewContract: shellViewModel.shellWorkflowOverviewContract, + sessionReadinessWorkflowReport: shellViewModel.shellSessionReadinessWorkflowReport, + }) + ), 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 f0da904..13c46c6 100644 --- a/wasm-port/tests/browser/ini_panel_launch_smoke.html +++ b/wasm-port/tests/browser/ini_panel_launch_smoke.html @@ -100,6 +100,7 @@ !launchApi?.getShellSessionHandoffPackageMountDisplayViewModel || !launchApi?.getShellSessionHandoffPackageMountRenderState || !launchApi?.getShellSessionReadinessWorkflowReport || + !launchApi?.getShellApiSurfaceInventory || !launchApi?.renderShellSessionHandoffMountState || !launchApi?.getWorkflowOverviewContract || !launchApi?.getWorkflowOverviewReadiness || @@ -180,6 +181,7 @@ const shellSessionHandoffPackageMountDisplayViewModel = launchApi.getShellSessionHandoffPackageMountDisplayViewModel(); const shellSessionHandoffPackageMountRenderState = launchApi.getShellSessionHandoffPackageMountRenderState(); const shellSessionReadinessWorkflowReport = launchApi.getShellSessionReadinessWorkflowReport(); + const shellApiSurfaceInventory = launchApi.getShellApiSurfaceInventory(); const workflowOverviewContract = launchApi.getWorkflowOverviewContract(); assertEqual( shellIntegrationSchema.manifestVersion, @@ -436,6 +438,16 @@ 3, "shell session readiness workflow report rows", ); + assertEqual( + shellApiSurfaceInventory.apiName, + "ini-panel-shell-api-surface-inventory", + "shell API surface inventory API", + ); + assertEqual( + shellApiSurfaceInventory.counts.sessionReadinessRows, + 3, + "shell API surface inventory session readiness 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 eaf4018..1c238c3 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 @@ -101,6 +101,7 @@ TOOL_TABLE = browser-shell-tool.tbl !launchApi?.readShellSessionHandoffStatusFromControlPage || !launchApi?.getShellSessionHandoffWorkflowSummary || !launchApi?.getShellSessionReadinessWorkflowReport || + !launchApi?.getShellApiSurfaceInventory || !launchApi?.getShellSessionHandoffWorkflowDisplayViewModel || !launchApi?.getShellSessionHandoffWorkflowRenderState || !launchApi?.getShellSessionHandoffWorkflowDomContract || @@ -515,6 +516,9 @@ TOOL_TABLE = browser-shell-tool.tbl const sessionReadinessWorkflowReport = launchApi.getShellSessionReadinessWorkflowReport({ workflowSummary: workflowSummaryResult, }); + const shellApiSurfaceInventory = launchApi.getShellApiSurfaceInventory({ + sessionReadinessWorkflowReport, + }); const workflowDisplayResult = launchApi.getShellSessionHandoffWorkflowDisplayViewModel( workflowSummaryResult, ); @@ -562,6 +566,16 @@ TOOL_TABLE = browser-shell-tool.tbl 3, "shell handoff session readiness workflow report rows", ); + assertEqual( + shellApiSurfaceInventory.ready, + true, + "shell handoff API surface inventory readiness", + ); + assertEqual( + shellApiSurfaceInventory.counts.sessionReadinessRows, + 3, + "shell handoff API surface inventory session readiness 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 02417f4..fbf2ce4 100644 --- a/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html +++ b/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html @@ -32,6 +32,7 @@ !workflowApi?.getWorkflowOverviewDisplayViewModel || !workflowApi?.getWorkflowOverviewSummary || !workflowApi?.getWorkflowOverviewSessionReadinessReport || + !workflowApi?.getWorkflowOverviewApiSurfaceInventory || !workflowApi?.getWorkflowOverviewDomContract || !workflowApi?.getWorkflowOverviewDomReadiness || !workflowApi?.renderWorkflowOverview || @@ -58,6 +59,7 @@ const displayViewModel = workflowApi.getWorkflowOverviewDisplayViewModel(); const summary = workflowApi.getWorkflowOverviewSummary(); const sessionReadinessReport = workflowApi.getWorkflowOverviewSessionReadinessReport(); + const apiSurfaceInventory = workflowApi.getWorkflowOverviewApiSurfaceInventory(); const domContract = workflowApi.getWorkflowOverviewDomContract(); const domReadiness = workflowApi.getWorkflowOverviewDomReadiness(); const renderResult = workflowApi.renderWorkflowOverview(); @@ -86,6 +88,12 @@ "workflow overview session readiness report API name", ); assertEqual(sessionReadinessReport.rows.length, 3, "workflow overview session readiness report rows"); + assertEqual( + apiSurfaceInventory.apiName, + "ini-panel-shell-api-surface-inventory", + "workflow overview API surface inventory API name", + ); + assertEqual(apiSurfaceInventory.rows.length, 5, "workflow overview API surface inventory 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/docs/node/verify_project_release_handoff_docs.mjs b/wasm-port/tests/docs/node/verify_project_release_handoff_docs.mjs index 285547a..ea89f1d 100644 --- a/wasm-port/tests/docs/node/verify_project_release_handoff_docs.mjs +++ b/wasm-port/tests/docs/node/verify_project_release_handoff_docs.mjs @@ -31,6 +31,7 @@ for (const phrase of [ "docs/drift-report.md", "PROJECT_COMPLETION_TRACKER.md", "runtime/sdk/src/index.js", + "createIniPanelShellApiSurfaceInventory()", "createIniPanelShellSessionReadinessWorkflowReport()", "workflow overview embedding mount DOM", "verify_no_standalone_cnc_semantics.sh", @@ -81,6 +82,7 @@ for (const phrase of [ for (const phrase of [ "OPFS/session persistence exports", "INI panel shell handoff exports", + "createIniPanelShellApiSurfaceInventory()", "createIniPanelShellSessionReadinessWorkflowReport()", ]) { assert.match(sdkReadmeText, literalRegExp(phrase)); diff --git a/wasm-port/tests/sdk/node/verify_sdk_surface.mjs b/wasm-port/tests/sdk/node/verify_sdk_surface.mjs index 85cea2a..59abb0b 100644 --- a/wasm-port/tests/sdk/node/verify_sdk_surface.mjs +++ b/wasm-port/tests/sdk/node/verify_sdk_surface.mjs @@ -6,6 +6,7 @@ import { fileURLToPath } from "node:url"; import { analyzeIniRuntimeBoundaries, createIniPanelLaunchApiManifest, + createIniPanelShellApiSurfaceInventory, createIniPanelShellSessionReadinessWorkflowReport, createIniPanelShellViewModel, createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, @@ -82,6 +83,7 @@ const requiredExports = [ ["createIniPanelLaunchApiManifest", createIniPanelLaunchApiManifest], ["isSupportedIniPanelLaunchApiManifest", isSupportedIniPanelLaunchApiManifest], ["createIniPanelShellViewModel", createIniPanelShellViewModel], + ["createIniPanelShellApiSurfaceInventory", createIniPanelShellApiSurfaceInventory], ["createIniPanelShellSessionReadinessWorkflowReport", createIniPanelShellSessionReadinessWorkflowReport], [ "createIniPanelShellWorkflowOverviewEmbeddingMountDomContract", @@ -134,6 +136,10 @@ assert.equal( createIniPanelShellSessionReadinessWorkflowReport().apiName, "ini-panel-shell-session-readiness-workflow-report", ); +assert.equal( + createIniPanelShellApiSurfaceInventory().apiName, + "ini-panel-shell-api-surface-inventory", +); assert.equal( shellViewModel.mountWorkflowOverviewEmbeddingMountState, mountIniPanelShellWorkflowOverviewEmbeddingMountState, 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 6929c3c..d2fc723 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 @@ -71,6 +71,7 @@ assert.deepEqual(manifest, { "readShellSessionHandoffStatusFromControlPage", "getShellSessionHandoffWorkflowSummary", "getShellSessionReadinessWorkflowReport", + "getShellApiSurfaceInventory", "getShellSessionHandoffWorkflowDisplayViewModel", "getShellSessionHandoffWorkflowRenderState", "getShellSessionHandoffWorkflowDomContract", @@ -228,6 +229,7 @@ assert.match(launchText, /\bmountShellSessionHandoffFromControlPage\b/); assert.match(launchText, /\breadShellSessionHandoffStatusFromControlPage\b/); assert.match(launchText, /\bgetShellSessionHandoffWorkflowSummary\b/); assert.match(launchText, /\bgetShellSessionReadinessWorkflowReport\b/); +assert.match(launchText, /\bgetShellApiSurfaceInventory\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 0236a59..fec00e2 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 @@ -30,6 +30,7 @@ import { readIniPanelShellSessionHandoffStatusFromControlPage, createIniPanelShellSessionHandoffWorkflowSummary, createIniPanelShellSessionReadinessWorkflowReport, + createIniPanelShellApiSurfaceInventory, createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellSessionHandoffWorkflowDomContract, @@ -178,7 +179,7 @@ assert.deepEqual(readiness, { counts: { pages: 3, launcherLinks: 3, - launchMethods: 56, + launchMethods: 57, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -241,7 +242,7 @@ assert.deepEqual(handoffSummary, { counts: { pages: 3, launcherLinks: 3, - launchMethods: 56, + launchMethods: 57, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -747,6 +748,7 @@ assert.equal( "blocked", ); assert.equal(createIniPanelShellSessionReadinessWorkflowReport().phase, "blocked"); +assert.equal(createIniPanelShellApiSurfaceInventory().phase, "ready"); assert.equal( createIniPanelShellSessionHandoffWorkflowDisplayViewModel().phase, "blocked", @@ -776,6 +778,7 @@ assert.deepEqual(createIniPanelShellWorkflowOverviewContract(), { "getWorkflowOverviewDisplayViewModel", "getWorkflowOverviewSummary", "getWorkflowOverviewSessionReadinessReport", + "getWorkflowOverviewApiSurfaceInventory", "getWorkflowOverviewDomContract", "getWorkflowOverviewDomReadiness", "renderWorkflowOverview", @@ -818,6 +821,7 @@ assert.deepEqual( overviewApi: { getWorkflowOverviewRenderState: () => handoffPackageRenderState, getWorkflowOverviewSessionReadinessReport: () => createIniPanelShellSessionReadinessWorkflowReport(), + getWorkflowOverviewApiSurfaceInventory: () => createIniPanelShellApiSurfaceInventory(), }, }).missing, [ @@ -1242,7 +1246,7 @@ assert.deepEqual(createIniPanelShellIntegrationReadiness(blockedManifest), { counts: { pages: 3, launcherLinks: 3, - launchMethods: 56, + launchMethods: 57, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -1418,6 +1422,7 @@ assert.match(shellText, /\bexport function mountIniPanelShellSessionHandoffFromC 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 createIniPanelShellApiSurfaceInventory\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 2ffb5c4..44f9c59 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 @@ -30,6 +30,7 @@ import { readIniPanelShellSessionHandoffStatusFromControlPage, createIniPanelShellSessionHandoffWorkflowSummary, createIniPanelShellSessionReadinessWorkflowReport, + createIniPanelShellApiSurfaceInventory, createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellSessionHandoffWorkflowDomContract, @@ -118,6 +119,7 @@ assert.equal(typeof createIniPanelShellIntegrationWorkflowPlan, "function"); assert.equal(typeof createIniPanelShellSessionHandoffActionPlan, "function"); assert.equal(typeof createIniPanelShellSessionHandoffChecklist, "function"); assert.equal(typeof createIniPanelShellSessionHandoffCompatibilityReport, "function"); +assert.equal(typeof createIniPanelShellApiSurfaceInventory, "function"); assert.equal(typeof createIniPanelShellSessionHandoffDisplayViewModel, "function"); assert.equal(typeof createIniPanelShellSessionHandoffPackage, "function"); assert.equal(typeof createIniPanelShellSessionHandoffPackageDisplayViewModel, "function"); @@ -664,6 +666,7 @@ assert.deepEqual(shellViewModel.shellWorkflowOverviewContract, { "getWorkflowOverviewDisplayViewModel", "getWorkflowOverviewSummary", "getWorkflowOverviewSessionReadinessReport", + "getWorkflowOverviewApiSurfaceInventory", "getWorkflowOverviewDomContract", "getWorkflowOverviewDomReadiness", "renderWorkflowOverview", @@ -796,6 +799,7 @@ assert.equal( shellViewModel.createShellSessionReadinessWorkflowReport, createIniPanelShellSessionReadinessWorkflowReport, ); +assert.equal(shellViewModel.createShellApiSurfaceInventory, createIniPanelShellApiSurfaceInventory); assert.equal( shellViewModel.createShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowDisplayViewModel, @@ -1130,6 +1134,10 @@ 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); +assert.equal(shellViewModel.shellApiSurfaceInventory.apiName, "ini-panel-shell-api-surface-inventory"); +assert.equal(shellViewModel.shellApiSurfaceInventory.ready, true); +assert.equal(shellViewModel.shellApiSurfaceInventory.counts.sessionReadinessRows, 3); +assert.equal(shellViewModel.shellApiSurfaceInventory.rows.length, 5); const readyWorkflowSummaryResult = createIniPanelShellSessionHandoffWorkflowSummary({ mountWorkflow: { phase: "ready", @@ -1250,6 +1258,7 @@ const workflowOverviewApi = { getWorkflowOverviewDisplayViewModel: () => workflowDisplayViewModel, getWorkflowOverviewSummary: () => workflowSummaryResult, getWorkflowOverviewSessionReadinessReport: () => sessionReadinessWorkflowReport, + getWorkflowOverviewApiSurfaceInventory: () => shellViewModel.shellApiSurfaceInventory, getWorkflowOverviewDomContract: createIniPanelShellSessionHandoffWorkflowDomContract, getWorkflowOverviewDomReadiness: createIniPanelShellSessionHandoffWorkflowDomReadiness, renderWorkflowOverview: renderIniPanelShellSessionHandoffWorkflowState,