新增 INI 面板 shell API surface inventory

This commit is contained in:
2026-06-16 07:19:49 +08:00
parent 2615e5bc57
commit 65e95327b3
17 changed files with 286 additions and 7 deletions

View File

@@ -9,7 +9,7 @@ turn-by-turn continuation notes and next-batch execution records.
## Current Status ## Current Status
- Active continuation file: `text14.txt` - 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 - Latest relevant commit: use `git log -1 --oneline` after each committed batch
- Working tree at tracker creation: clean - Working tree at tracker creation: clean
- Required policy: LinuxCNC remains the only CNC semantic source - 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 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`. | | 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. | | 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. | | 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. | | 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. | | 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. |

View File

@@ -2057,3 +2057,81 @@ host_wasm_opfs_browser_smokes=ok
继续以实质能力推进为主。下一批可为 session readiness workflow report 增加更高层的 release/API 继续以实质能力推进为主。下一批可为 session readiness workflow report 增加更高层的 release/API
inventory row 或 browser-visible summary row方便验收页面和外部 shell 快速列出当前稳定 API仍保持只读 inventory row 或 browser-visible summary row方便验收页面和外部 shell 快速列出当前稳定 API仍保持只读
不新增控制按钮,不解析 G-code不扩大 LinuxCNC 语义边界。 不新增控制按钮,不解析 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 语义边界。

View File

@@ -42,6 +42,7 @@ import {
mountIniPanelShellSessionHandoffFromControlPage, mountIniPanelShellSessionHandoffFromControlPage,
createIniPanelShellSessionHandoffWorkflowSummary, createIniPanelShellSessionHandoffWorkflowSummary,
createIniPanelShellSessionReadinessWorkflowReport, createIniPanelShellSessionReadinessWorkflowReport,
createIniPanelShellApiSurfaceInventory,
createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowDisplayViewModel,
createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellSessionHandoffWorkflowRenderState,
createIniPanelShellSessionHandoffWorkflowDomContract, 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 phase, missing reasons, and stable rows. The workflow overview page exposes
the same report through the same report through
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewSessionReadinessReport()`. `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 Use
`createIniPanelShellSessionHandoffWorkflowDisplayViewModel()` or `createIniPanelShellSessionHandoffWorkflowDisplayViewModel()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffWorkflowDisplayViewModel()` `linuxCncIniPanelLaunchApi.getShellSessionHandoffWorkflowDisplayViewModel()`

View File

@@ -30,8 +30,9 @@ continuation records are in `../text14.txt`.
`docs/panel-entry.md`, including workflow overview embedding mount DOM `docs/panel-entry.md`, including workflow overview embedding mount DOM
contract/readiness/renderer/wrapper helpers. contract/readiness/renderer/wrapper helpers.
- SDK callers should import stable helpers from `runtime/sdk/src/index.js`, - SDK callers should import stable helpers from `runtime/sdk/src/index.js`,
including `createIniPanelShellSessionReadinessWorkflowReport()` when they including `createIniPanelShellApiSurfaceInventory()` for API discovery and
need machine-readable session readiness phase and missing reasons. `createIniPanelShellSessionReadinessWorkflowReport()` when they need
machine-readable session readiness phase and missing reasons.
- OPFS/session persistence is host-side storage glue. Parameter and tool-table - OPFS/session persistence is host-side storage glue. Parameter and tool-table
behavior still comes from the LinuxCNC-backed interpreter SDK calls. behavior still comes from the LinuxCNC-backed interpreter SDK calls.
- Sim-config inventory promotion remains evidence-driven and must keep - Sim-config inventory promotion remains evidence-driven and must keep

View File

@@ -25,6 +25,7 @@ Use `src/index.js` for stable imports:
import { import {
analyzeIniRuntimeBoundaries, analyzeIniRuntimeBoundaries,
createIniPanelLaunchApiManifest, createIniPanelLaunchApiManifest,
createIniPanelShellApiSurfaceInventory,
createIniPanelShellSessionReadinessWorkflowReport, createIniPanelShellSessionReadinessWorkflowReport,
createIniPanelShellViewModel, createIniPanelShellViewModel,
createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, createIniPanelShellWorkflowOverviewEmbeddingMountDomContract,
@@ -192,6 +193,9 @@ for external browser shells:
`isSupportedIniPanelLaunchApiManifest()` for launch API negotiation. `isSupportedIniPanelLaunchApiManifest()` for launch API negotiation.
- `createIniPanelShellViewModel()` for a complete read-only shell integration - `createIniPanelShellViewModel()` for a complete read-only shell integration
bundle. 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 - `createIniPanelShellSessionReadinessWorkflowReport()` for a machine-readable
session readiness workflow report with phase, missing reasons, status line, session readiness workflow report with phase, missing reasons, status line,
and stable rows. and stable rows.

View File

@@ -69,6 +69,7 @@ export {
createIniPanelShellSessionHandoffPackageRenderState, createIniPanelShellSessionHandoffPackageRenderState,
createIniPanelShellSessionHandoffPackageSchema, createIniPanelShellSessionHandoffPackageSchema,
createIniPanelShellSessionReadinessWorkflowReport, createIniPanelShellSessionReadinessWorkflowReport,
createIniPanelShellApiSurfaceInventory,
createIniPanelShellSessionHandoffSummary, createIniPanelShellSessionHandoffSummary,
createIniPanelShellSessionHandoffSummarySchema, createIniPanelShellSessionHandoffSummarySchema,
createIniPanelShellViewModel, createIniPanelShellViewModel,

View File

@@ -251,6 +251,14 @@
workflowSummary: shellViewModel.shellSessionHandoffWorkflowSummary, workflowSummary: shellViewModel.shellSessionHandoffWorkflowSummary,
}) })
), ),
getShellApiSurfaceInventory: (options) => (
shellViewModel.createShellApiSurfaceInventory(options ?? {
launchApiManifest: shellViewModel.launchApiManifest,
controlPageApiManifest: shellViewModel.controlPage.browserApiManifest,
workflowOverviewContract: shellViewModel.shellWorkflowOverviewContract,
sessionReadinessWorkflowReport: shellViewModel.shellSessionReadinessWorkflowReport,
})
),
getShellSessionHandoffWorkflowDisplayViewModel: (options) => ( getShellSessionHandoffWorkflowDisplayViewModel: (options) => (
createIniPanelShellSessionHandoffWorkflowDisplayViewModel( createIniPanelShellSessionHandoffWorkflowDisplayViewModel(
options ?? shellViewModel.shellSessionHandoffWorkflowSummary, options ?? shellViewModel.shellSessionHandoffWorkflowSummary,

View File

@@ -161,6 +161,7 @@ export function createIniPanelLaunchApiManifest(entries = getVisibleIniPanelEntr
"readShellSessionHandoffStatusFromControlPage", "readShellSessionHandoffStatusFromControlPage",
"getShellSessionHandoffWorkflowSummary", "getShellSessionHandoffWorkflowSummary",
"getShellSessionReadinessWorkflowReport", "getShellSessionReadinessWorkflowReport",
"getShellApiSurfaceInventory",
"getShellSessionHandoffWorkflowDisplayViewModel", "getShellSessionHandoffWorkflowDisplayViewModel",
"getShellSessionHandoffWorkflowRenderState", "getShellSessionHandoffWorkflowRenderState",
"getShellSessionHandoffWorkflowDomContract", "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( export function createIniPanelShellSessionHandoffWorkflowRenderState(
displayViewModel = createIniPanelShellSessionHandoffWorkflowDisplayViewModel(), displayViewModel = createIniPanelShellSessionHandoffWorkflowDisplayViewModel(),
) { ) {
@@ -1671,6 +1776,7 @@ export function createIniPanelShellWorkflowOverviewContract() {
"getWorkflowOverviewDisplayViewModel", "getWorkflowOverviewDisplayViewModel",
"getWorkflowOverviewSummary", "getWorkflowOverviewSummary",
"getWorkflowOverviewSessionReadinessReport", "getWorkflowOverviewSessionReadinessReport",
"getWorkflowOverviewApiSurfaceInventory",
"getWorkflowOverviewDomContract", "getWorkflowOverviewDomContract",
"getWorkflowOverviewDomReadiness", "getWorkflowOverviewDomReadiness",
"renderWorkflowOverview", "renderWorkflowOverview",
@@ -2588,6 +2694,12 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries
); );
const shellSessionHandoffWorkflowDomContract = createIniPanelShellSessionHandoffWorkflowDomContract(); const shellSessionHandoffWorkflowDomContract = createIniPanelShellSessionHandoffWorkflowDomContract();
const shellWorkflowOverviewContract = createIniPanelShellWorkflowOverviewContract(); const shellWorkflowOverviewContract = createIniPanelShellWorkflowOverviewContract();
const shellApiSurfaceInventory = createIniPanelShellApiSurfaceInventory({
launchApiManifest: shellIntegrationManifest.launchApiManifest,
controlPageApiManifest: shellIntegrationManifest.controlPageApiManifest,
workflowOverviewContract: shellWorkflowOverviewContract,
sessionReadinessWorkflowReport: shellSessionReadinessWorkflowReport,
});
return { return {
pages: entries.map(({ id, href, title }) => ({ pages: entries.map(({ id, href, title }) => ({
id, id,
@@ -2622,6 +2734,7 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries
shellSessionHandoffWorkflowRenderState, shellSessionHandoffWorkflowRenderState,
shellSessionHandoffWorkflowDomContract, shellSessionHandoffWorkflowDomContract,
shellWorkflowOverviewContract, shellWorkflowOverviewContract,
shellApiSurfaceInventory,
launchApiSchema: createIniPanelLaunchApiSchema(), launchApiSchema: createIniPanelLaunchApiSchema(),
launchApiManifest: createIniPanelLaunchApiManifest(entries), launchApiManifest: createIniPanelLaunchApiManifest(entries),
isSupportedShellIntegrationManifest: isSupportedIniPanelShellIntegrationManifest, isSupportedShellIntegrationManifest: isSupportedIniPanelShellIntegrationManifest,
@@ -2652,6 +2765,7 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries
readShellSessionHandoffStatusFromControlPage: readIniPanelShellSessionHandoffStatusFromControlPage, readShellSessionHandoffStatusFromControlPage: readIniPanelShellSessionHandoffStatusFromControlPage,
createShellSessionHandoffWorkflowSummary: createIniPanelShellSessionHandoffWorkflowSummary, createShellSessionHandoffWorkflowSummary: createIniPanelShellSessionHandoffWorkflowSummary,
createShellSessionReadinessWorkflowReport: createIniPanelShellSessionReadinessWorkflowReport, createShellSessionReadinessWorkflowReport: createIniPanelShellSessionReadinessWorkflowReport,
createShellApiSurfaceInventory: createIniPanelShellApiSurfaceInventory,
createShellSessionHandoffWorkflowDisplayViewModel: createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createShellSessionHandoffWorkflowDisplayViewModel: createIniPanelShellSessionHandoffWorkflowDisplayViewModel,
createShellSessionHandoffWorkflowRenderState: createIniPanelShellSessionHandoffWorkflowRenderState, createShellSessionHandoffWorkflowRenderState: createIniPanelShellSessionHandoffWorkflowRenderState,
createShellSessionHandoffWorkflowDomContract: createIniPanelShellSessionHandoffWorkflowDomContract, createShellSessionHandoffWorkflowDomContract: createIniPanelShellSessionHandoffWorkflowDomContract,

View File

@@ -121,6 +121,14 @@
workflowSummary: shellViewModel.shellSessionHandoffWorkflowSummary, workflowSummary: shellViewModel.shellSessionHandoffWorkflowSummary,
}) })
), ),
getWorkflowOverviewApiSurfaceInventory: (options) => (
shellViewModel.createShellApiSurfaceInventory(options ?? {
launchApiManifest: shellViewModel.launchApiManifest,
controlPageApiManifest: shellViewModel.controlPage.browserApiManifest,
workflowOverviewContract: shellViewModel.shellWorkflowOverviewContract,
sessionReadinessWorkflowReport: shellViewModel.shellSessionReadinessWorkflowReport,
})
),
getWorkflowOverviewDomContract: (options) => ( getWorkflowOverviewDomContract: (options) => (
createIniPanelShellSessionHandoffWorkflowDomContract(options) createIniPanelShellSessionHandoffWorkflowDomContract(options)
), ),

View File

@@ -100,6 +100,7 @@
!launchApi?.getShellSessionHandoffPackageMountDisplayViewModel || !launchApi?.getShellSessionHandoffPackageMountDisplayViewModel ||
!launchApi?.getShellSessionHandoffPackageMountRenderState || !launchApi?.getShellSessionHandoffPackageMountRenderState ||
!launchApi?.getShellSessionReadinessWorkflowReport || !launchApi?.getShellSessionReadinessWorkflowReport ||
!launchApi?.getShellApiSurfaceInventory ||
!launchApi?.renderShellSessionHandoffMountState || !launchApi?.renderShellSessionHandoffMountState ||
!launchApi?.getWorkflowOverviewContract || !launchApi?.getWorkflowOverviewContract ||
!launchApi?.getWorkflowOverviewReadiness || !launchApi?.getWorkflowOverviewReadiness ||
@@ -180,6 +181,7 @@
const shellSessionHandoffPackageMountDisplayViewModel = launchApi.getShellSessionHandoffPackageMountDisplayViewModel(); const shellSessionHandoffPackageMountDisplayViewModel = launchApi.getShellSessionHandoffPackageMountDisplayViewModel();
const shellSessionHandoffPackageMountRenderState = launchApi.getShellSessionHandoffPackageMountRenderState(); const shellSessionHandoffPackageMountRenderState = launchApi.getShellSessionHandoffPackageMountRenderState();
const shellSessionReadinessWorkflowReport = launchApi.getShellSessionReadinessWorkflowReport(); const shellSessionReadinessWorkflowReport = launchApi.getShellSessionReadinessWorkflowReport();
const shellApiSurfaceInventory = launchApi.getShellApiSurfaceInventory();
const workflowOverviewContract = launchApi.getWorkflowOverviewContract(); const workflowOverviewContract = launchApi.getWorkflowOverviewContract();
assertEqual( assertEqual(
shellIntegrationSchema.manifestVersion, shellIntegrationSchema.manifestVersion,
@@ -436,6 +438,16 @@
3, 3,
"shell session readiness workflow report rows", "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( assertEqual(
workflowOverviewContract.pageHref, workflowOverviewContract.pageHref,
"./workflow-overview.html", "./workflow-overview.html",

View File

@@ -101,6 +101,7 @@ TOOL_TABLE = browser-shell-tool.tbl
!launchApi?.readShellSessionHandoffStatusFromControlPage || !launchApi?.readShellSessionHandoffStatusFromControlPage ||
!launchApi?.getShellSessionHandoffWorkflowSummary || !launchApi?.getShellSessionHandoffWorkflowSummary ||
!launchApi?.getShellSessionReadinessWorkflowReport || !launchApi?.getShellSessionReadinessWorkflowReport ||
!launchApi?.getShellApiSurfaceInventory ||
!launchApi?.getShellSessionHandoffWorkflowDisplayViewModel || !launchApi?.getShellSessionHandoffWorkflowDisplayViewModel ||
!launchApi?.getShellSessionHandoffWorkflowRenderState || !launchApi?.getShellSessionHandoffWorkflowRenderState ||
!launchApi?.getShellSessionHandoffWorkflowDomContract || !launchApi?.getShellSessionHandoffWorkflowDomContract ||
@@ -515,6 +516,9 @@ TOOL_TABLE = browser-shell-tool.tbl
const sessionReadinessWorkflowReport = launchApi.getShellSessionReadinessWorkflowReport({ const sessionReadinessWorkflowReport = launchApi.getShellSessionReadinessWorkflowReport({
workflowSummary: workflowSummaryResult, workflowSummary: workflowSummaryResult,
}); });
const shellApiSurfaceInventory = launchApi.getShellApiSurfaceInventory({
sessionReadinessWorkflowReport,
});
const workflowDisplayResult = launchApi.getShellSessionHandoffWorkflowDisplayViewModel( const workflowDisplayResult = launchApi.getShellSessionHandoffWorkflowDisplayViewModel(
workflowSummaryResult, workflowSummaryResult,
); );
@@ -562,6 +566,16 @@ TOOL_TABLE = browser-shell-tool.tbl
3, 3,
"shell handoff session readiness workflow report rows", "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( assertEqual(
workflowSummaryResult.sessionReadiness.ready, workflowSummaryResult.sessionReadiness.ready,
true, true,

View File

@@ -32,6 +32,7 @@
!workflowApi?.getWorkflowOverviewDisplayViewModel || !workflowApi?.getWorkflowOverviewDisplayViewModel ||
!workflowApi?.getWorkflowOverviewSummary || !workflowApi?.getWorkflowOverviewSummary ||
!workflowApi?.getWorkflowOverviewSessionReadinessReport || !workflowApi?.getWorkflowOverviewSessionReadinessReport ||
!workflowApi?.getWorkflowOverviewApiSurfaceInventory ||
!workflowApi?.getWorkflowOverviewDomContract || !workflowApi?.getWorkflowOverviewDomContract ||
!workflowApi?.getWorkflowOverviewDomReadiness || !workflowApi?.getWorkflowOverviewDomReadiness ||
!workflowApi?.renderWorkflowOverview || !workflowApi?.renderWorkflowOverview ||
@@ -58,6 +59,7 @@
const displayViewModel = workflowApi.getWorkflowOverviewDisplayViewModel(); const displayViewModel = workflowApi.getWorkflowOverviewDisplayViewModel();
const summary = workflowApi.getWorkflowOverviewSummary(); const summary = workflowApi.getWorkflowOverviewSummary();
const sessionReadinessReport = workflowApi.getWorkflowOverviewSessionReadinessReport(); const sessionReadinessReport = workflowApi.getWorkflowOverviewSessionReadinessReport();
const apiSurfaceInventory = workflowApi.getWorkflowOverviewApiSurfaceInventory();
const domContract = workflowApi.getWorkflowOverviewDomContract(); const domContract = workflowApi.getWorkflowOverviewDomContract();
const domReadiness = workflowApi.getWorkflowOverviewDomReadiness(); const domReadiness = workflowApi.getWorkflowOverviewDomReadiness();
const renderResult = workflowApi.renderWorkflowOverview(); const renderResult = workflowApi.renderWorkflowOverview();
@@ -86,6 +88,12 @@
"workflow overview session readiness report API name", "workflow overview session readiness report API name",
); );
assertEqual(sessionReadinessReport.rows.length, 3, "workflow overview session readiness report rows"); 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(displayViewModel.title, "Shell handoff workflow", "workflow overview display title");
assertEqual(renderState.renderStateVersion, 1, "workflow overview render-state version"); assertEqual(renderState.renderStateVersion, 1, "workflow overview render-state version");
assertEqual(renderState.dataset.handoffScope, "workflow", "workflow overview render-state scope"); assertEqual(renderState.dataset.handoffScope, "workflow", "workflow overview render-state scope");

View File

@@ -31,6 +31,7 @@ for (const phrase of [
"docs/drift-report.md", "docs/drift-report.md",
"PROJECT_COMPLETION_TRACKER.md", "PROJECT_COMPLETION_TRACKER.md",
"runtime/sdk/src/index.js", "runtime/sdk/src/index.js",
"createIniPanelShellApiSurfaceInventory()",
"createIniPanelShellSessionReadinessWorkflowReport()", "createIniPanelShellSessionReadinessWorkflowReport()",
"workflow overview embedding mount DOM", "workflow overview embedding mount DOM",
"verify_no_standalone_cnc_semantics.sh", "verify_no_standalone_cnc_semantics.sh",
@@ -81,6 +82,7 @@ for (const phrase of [
for (const phrase of [ for (const phrase of [
"OPFS/session persistence exports", "OPFS/session persistence exports",
"INI panel shell handoff exports", "INI panel shell handoff exports",
"createIniPanelShellApiSurfaceInventory()",
"createIniPanelShellSessionReadinessWorkflowReport()", "createIniPanelShellSessionReadinessWorkflowReport()",
]) { ]) {
assert.match(sdkReadmeText, literalRegExp(phrase)); assert.match(sdkReadmeText, literalRegExp(phrase));

View File

@@ -6,6 +6,7 @@ import { fileURLToPath } from "node:url";
import { import {
analyzeIniRuntimeBoundaries, analyzeIniRuntimeBoundaries,
createIniPanelLaunchApiManifest, createIniPanelLaunchApiManifest,
createIniPanelShellApiSurfaceInventory,
createIniPanelShellSessionReadinessWorkflowReport, createIniPanelShellSessionReadinessWorkflowReport,
createIniPanelShellViewModel, createIniPanelShellViewModel,
createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, createIniPanelShellWorkflowOverviewEmbeddingMountDomContract,
@@ -82,6 +83,7 @@ const requiredExports = [
["createIniPanelLaunchApiManifest", createIniPanelLaunchApiManifest], ["createIniPanelLaunchApiManifest", createIniPanelLaunchApiManifest],
["isSupportedIniPanelLaunchApiManifest", isSupportedIniPanelLaunchApiManifest], ["isSupportedIniPanelLaunchApiManifest", isSupportedIniPanelLaunchApiManifest],
["createIniPanelShellViewModel", createIniPanelShellViewModel], ["createIniPanelShellViewModel", createIniPanelShellViewModel],
["createIniPanelShellApiSurfaceInventory", createIniPanelShellApiSurfaceInventory],
["createIniPanelShellSessionReadinessWorkflowReport", createIniPanelShellSessionReadinessWorkflowReport], ["createIniPanelShellSessionReadinessWorkflowReport", createIniPanelShellSessionReadinessWorkflowReport],
[ [
"createIniPanelShellWorkflowOverviewEmbeddingMountDomContract", "createIniPanelShellWorkflowOverviewEmbeddingMountDomContract",
@@ -134,6 +136,10 @@ assert.equal(
createIniPanelShellSessionReadinessWorkflowReport().apiName, createIniPanelShellSessionReadinessWorkflowReport().apiName,
"ini-panel-shell-session-readiness-workflow-report", "ini-panel-shell-session-readiness-workflow-report",
); );
assert.equal(
createIniPanelShellApiSurfaceInventory().apiName,
"ini-panel-shell-api-surface-inventory",
);
assert.equal( assert.equal(
shellViewModel.mountWorkflowOverviewEmbeddingMountState, shellViewModel.mountWorkflowOverviewEmbeddingMountState,
mountIniPanelShellWorkflowOverviewEmbeddingMountState, mountIniPanelShellWorkflowOverviewEmbeddingMountState,

View File

@@ -71,6 +71,7 @@ assert.deepEqual(manifest, {
"readShellSessionHandoffStatusFromControlPage", "readShellSessionHandoffStatusFromControlPage",
"getShellSessionHandoffWorkflowSummary", "getShellSessionHandoffWorkflowSummary",
"getShellSessionReadinessWorkflowReport", "getShellSessionReadinessWorkflowReport",
"getShellApiSurfaceInventory",
"getShellSessionHandoffWorkflowDisplayViewModel", "getShellSessionHandoffWorkflowDisplayViewModel",
"getShellSessionHandoffWorkflowRenderState", "getShellSessionHandoffWorkflowRenderState",
"getShellSessionHandoffWorkflowDomContract", "getShellSessionHandoffWorkflowDomContract",
@@ -228,6 +229,7 @@ assert.match(launchText, /\bmountShellSessionHandoffFromControlPage\b/);
assert.match(launchText, /\breadShellSessionHandoffStatusFromControlPage\b/); assert.match(launchText, /\breadShellSessionHandoffStatusFromControlPage\b/);
assert.match(launchText, /\bgetShellSessionHandoffWorkflowSummary\b/); assert.match(launchText, /\bgetShellSessionHandoffWorkflowSummary\b/);
assert.match(launchText, /\bgetShellSessionReadinessWorkflowReport\b/); assert.match(launchText, /\bgetShellSessionReadinessWorkflowReport\b/);
assert.match(launchText, /\bgetShellApiSurfaceInventory\b/);
assert.match(launchText, /\bgetShellSessionHandoffWorkflowDisplayViewModel\b/); assert.match(launchText, /\bgetShellSessionHandoffWorkflowDisplayViewModel\b/);
assert.match(launchText, /\bgetShellSessionHandoffWorkflowRenderState\b/); assert.match(launchText, /\bgetShellSessionHandoffWorkflowRenderState\b/);
assert.match(launchText, /\bgetShellSessionHandoffWorkflowDomContract\b/); assert.match(launchText, /\bgetShellSessionHandoffWorkflowDomContract\b/);

View File

@@ -30,6 +30,7 @@ import {
readIniPanelShellSessionHandoffStatusFromControlPage, readIniPanelShellSessionHandoffStatusFromControlPage,
createIniPanelShellSessionHandoffWorkflowSummary, createIniPanelShellSessionHandoffWorkflowSummary,
createIniPanelShellSessionReadinessWorkflowReport, createIniPanelShellSessionReadinessWorkflowReport,
createIniPanelShellApiSurfaceInventory,
createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowDisplayViewModel,
createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellSessionHandoffWorkflowRenderState,
createIniPanelShellSessionHandoffWorkflowDomContract, createIniPanelShellSessionHandoffWorkflowDomContract,
@@ -178,7 +179,7 @@ assert.deepEqual(readiness, {
counts: { counts: {
pages: 3, pages: 3,
launcherLinks: 3, launcherLinks: 3,
launchMethods: 56, launchMethods: 57,
controlPageMethods: 11, controlPageMethods: 11,
persistenceCapabilities: 3, persistenceCapabilities: 3,
}, },
@@ -241,7 +242,7 @@ assert.deepEqual(handoffSummary, {
counts: { counts: {
pages: 3, pages: 3,
launcherLinks: 3, launcherLinks: 3,
launchMethods: 56, launchMethods: 57,
controlPageMethods: 11, controlPageMethods: 11,
persistenceCapabilities: 3, persistenceCapabilities: 3,
}, },
@@ -747,6 +748,7 @@ assert.equal(
"blocked", "blocked",
); );
assert.equal(createIniPanelShellSessionReadinessWorkflowReport().phase, "blocked"); assert.equal(createIniPanelShellSessionReadinessWorkflowReport().phase, "blocked");
assert.equal(createIniPanelShellApiSurfaceInventory().phase, "ready");
assert.equal( assert.equal(
createIniPanelShellSessionHandoffWorkflowDisplayViewModel().phase, createIniPanelShellSessionHandoffWorkflowDisplayViewModel().phase,
"blocked", "blocked",
@@ -776,6 +778,7 @@ assert.deepEqual(createIniPanelShellWorkflowOverviewContract(), {
"getWorkflowOverviewDisplayViewModel", "getWorkflowOverviewDisplayViewModel",
"getWorkflowOverviewSummary", "getWorkflowOverviewSummary",
"getWorkflowOverviewSessionReadinessReport", "getWorkflowOverviewSessionReadinessReport",
"getWorkflowOverviewApiSurfaceInventory",
"getWorkflowOverviewDomContract", "getWorkflowOverviewDomContract",
"getWorkflowOverviewDomReadiness", "getWorkflowOverviewDomReadiness",
"renderWorkflowOverview", "renderWorkflowOverview",
@@ -818,6 +821,7 @@ assert.deepEqual(
overviewApi: { overviewApi: {
getWorkflowOverviewRenderState: () => handoffPackageRenderState, getWorkflowOverviewRenderState: () => handoffPackageRenderState,
getWorkflowOverviewSessionReadinessReport: () => createIniPanelShellSessionReadinessWorkflowReport(), getWorkflowOverviewSessionReadinessReport: () => createIniPanelShellSessionReadinessWorkflowReport(),
getWorkflowOverviewApiSurfaceInventory: () => createIniPanelShellApiSurfaceInventory(),
}, },
}).missing, }).missing,
[ [
@@ -1242,7 +1246,7 @@ assert.deepEqual(createIniPanelShellIntegrationReadiness(blockedManifest), {
counts: { counts: {
pages: 3, pages: 3,
launcherLinks: 3, launcherLinks: 3,
launchMethods: 56, launchMethods: 57,
controlPageMethods: 11, controlPageMethods: 11,
persistenceCapabilities: 3, persistenceCapabilities: 3,
}, },
@@ -1418,6 +1422,7 @@ assert.match(shellText, /\bexport function mountIniPanelShellSessionHandoffFromC
assert.match(shellText, /\bexport function readIniPanelShellSessionHandoffStatusFromControlPage\b/); assert.match(shellText, /\bexport function readIniPanelShellSessionHandoffStatusFromControlPage\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowSummary\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowSummary\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionReadinessWorkflowReport\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 createIniPanelShellSessionHandoffWorkflowDisplayViewModel\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowRenderState\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowRenderState\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowDomContract\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowDomContract\b/);

View File

@@ -30,6 +30,7 @@ import {
readIniPanelShellSessionHandoffStatusFromControlPage, readIniPanelShellSessionHandoffStatusFromControlPage,
createIniPanelShellSessionHandoffWorkflowSummary, createIniPanelShellSessionHandoffWorkflowSummary,
createIniPanelShellSessionReadinessWorkflowReport, createIniPanelShellSessionReadinessWorkflowReport,
createIniPanelShellApiSurfaceInventory,
createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowDisplayViewModel,
createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellSessionHandoffWorkflowRenderState,
createIniPanelShellSessionHandoffWorkflowDomContract, createIniPanelShellSessionHandoffWorkflowDomContract,
@@ -118,6 +119,7 @@ assert.equal(typeof createIniPanelShellIntegrationWorkflowPlan, "function");
assert.equal(typeof createIniPanelShellSessionHandoffActionPlan, "function"); assert.equal(typeof createIniPanelShellSessionHandoffActionPlan, "function");
assert.equal(typeof createIniPanelShellSessionHandoffChecklist, "function"); assert.equal(typeof createIniPanelShellSessionHandoffChecklist, "function");
assert.equal(typeof createIniPanelShellSessionHandoffCompatibilityReport, "function"); assert.equal(typeof createIniPanelShellSessionHandoffCompatibilityReport, "function");
assert.equal(typeof createIniPanelShellApiSurfaceInventory, "function");
assert.equal(typeof createIniPanelShellSessionHandoffDisplayViewModel, "function"); assert.equal(typeof createIniPanelShellSessionHandoffDisplayViewModel, "function");
assert.equal(typeof createIniPanelShellSessionHandoffPackage, "function"); assert.equal(typeof createIniPanelShellSessionHandoffPackage, "function");
assert.equal(typeof createIniPanelShellSessionHandoffPackageDisplayViewModel, "function"); assert.equal(typeof createIniPanelShellSessionHandoffPackageDisplayViewModel, "function");
@@ -664,6 +666,7 @@ assert.deepEqual(shellViewModel.shellWorkflowOverviewContract, {
"getWorkflowOverviewDisplayViewModel", "getWorkflowOverviewDisplayViewModel",
"getWorkflowOverviewSummary", "getWorkflowOverviewSummary",
"getWorkflowOverviewSessionReadinessReport", "getWorkflowOverviewSessionReadinessReport",
"getWorkflowOverviewApiSurfaceInventory",
"getWorkflowOverviewDomContract", "getWorkflowOverviewDomContract",
"getWorkflowOverviewDomReadiness", "getWorkflowOverviewDomReadiness",
"renderWorkflowOverview", "renderWorkflowOverview",
@@ -796,6 +799,7 @@ assert.equal(
shellViewModel.createShellSessionReadinessWorkflowReport, shellViewModel.createShellSessionReadinessWorkflowReport,
createIniPanelShellSessionReadinessWorkflowReport, createIniPanelShellSessionReadinessWorkflowReport,
); );
assert.equal(shellViewModel.createShellApiSurfaceInventory, createIniPanelShellApiSurfaceInventory);
assert.equal( assert.equal(
shellViewModel.createShellSessionHandoffWorkflowDisplayViewModel, shellViewModel.createShellSessionHandoffWorkflowDisplayViewModel,
createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowDisplayViewModel,
@@ -1130,6 +1134,10 @@ assert.equal(sessionReadinessWorkflowReport.rows.length, 3);
assert.equal(sessionReadinessWorkflowReport.rows[0].value, "ready"); assert.equal(sessionReadinessWorkflowReport.rows[0].value, "ready");
assert.equal(shellViewModel.shellSessionReadinessWorkflowReport.ready, false); assert.equal(shellViewModel.shellSessionReadinessWorkflowReport.ready, false);
assert.equal(shellViewModel.shellSessionReadinessWorkflowReport.rows.length, 3); 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({ const readyWorkflowSummaryResult = createIniPanelShellSessionHandoffWorkflowSummary({
mountWorkflow: { mountWorkflow: {
phase: "ready", phase: "ready",
@@ -1250,6 +1258,7 @@ const workflowOverviewApi = {
getWorkflowOverviewDisplayViewModel: () => workflowDisplayViewModel, getWorkflowOverviewDisplayViewModel: () => workflowDisplayViewModel,
getWorkflowOverviewSummary: () => workflowSummaryResult, getWorkflowOverviewSummary: () => workflowSummaryResult,
getWorkflowOverviewSessionReadinessReport: () => sessionReadinessWorkflowReport, getWorkflowOverviewSessionReadinessReport: () => sessionReadinessWorkflowReport,
getWorkflowOverviewApiSurfaceInventory: () => shellViewModel.shellApiSurfaceInventory,
getWorkflowOverviewDomContract: createIniPanelShellSessionHandoffWorkflowDomContract, getWorkflowOverviewDomContract: createIniPanelShellSessionHandoffWorkflowDomContract,
getWorkflowOverviewDomReadiness: createIniPanelShellSessionHandoffWorkflowDomReadiness, getWorkflowOverviewDomReadiness: createIniPanelShellSessionHandoffWorkflowDomReadiness,
renderWorkflowOverview: renderIniPanelShellSessionHandoffWorkflowState, renderWorkflowOverview: renderIniPanelShellSessionHandoffWorkflowState,